superb-warfare/src/main/java/com/atsuishio/superbwarfare/tools/Ammo.java
2025-07-08 00:13:46 +08:00

155 lines
4.1 KiB
Java

package com.atsuishio.superbwarfare.tools;
import com.atsuishio.superbwarfare.capability.player.PlayerVariable;
import com.atsuishio.superbwarfare.init.ModAttachments;
import net.minecraft.ChatFormatting;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.registries.DeferredHolder;
import java.util.Locale;
public enum Ammo {
HANDGUN(ChatFormatting.GREEN),
RIFLE(ChatFormatting.AQUA),
SHOTGUN(ChatFormatting.RED),
SNIPER(ChatFormatting.GOLD),
HEAVY(ChatFormatting.LIGHT_PURPLE);
/**
* 翻译字段名称,如 item.superbwarfare.ammo.rifle
*/
public final String translationKey;
/**
* 大驼峰格式命名的序列化字段名称,如 RifleAmmo
*/
public final String serializationName;
/**
* 下划线格式命名的小写名称,如 rifle
*/
public final String name;
/**
* 大驼峰格式命名的显示名称,如 Rifle Ammo
*/
public final String displayName;
public final ChatFormatting color;
public DeferredHolder<DataComponentType<?>, DataComponentType<Integer>> dataComponent;
Ammo(ChatFormatting color) {
this.color = color;
var name = name().toLowerCase(Locale.ENGLISH);
this.name = name;
this.translationKey = "item.superbwarfare.ammo." + name;
var builder = new StringBuilder();
var useUpperCase = true;
for (char c : name.toCharArray()) {
if (c == '_') {
useUpperCase = true;
} else if (useUpperCase) {
builder.append(String.valueOf(c).toUpperCase(Locale.ENGLISH));
useUpperCase = false;
} else {
builder.append(c);
}
}
this.displayName = builder + " Ammo";
this.serializationName = builder + "Ammo";
}
public static Ammo getType(String name) {
for (Ammo type : values()) {
if (type.serializationName.equals(name)) {
return type;
}
}
return null;
}
// ItemStack
public int get(ItemStack stack) {
var count = stack.get(this.dataComponent);
return count == null ? 0 : count;
}
public void set(ItemStack stack, int count) {
stack.set(this.dataComponent, count);
}
public void add(ItemStack stack, int count) {
set(stack, safeAdd(get(stack), count));
}
// NBTTag
public int get(CompoundTag tag) {
return tag.getInt(this.serializationName);
}
public void set(CompoundTag tag, int count) {
if (count < 0) count = 0;
tag.putInt(this.serializationName, count);
}
public void add(CompoundTag tag, int count) {
set(tag, safeAdd(get(tag), count));
}
// PlayerVariables
public int get(PlayerVariable variable) {
return variable.ammo.getOrDefault(this, 0);
}
public void set(PlayerVariable variable, int count) {
if (count < 0) count = 0;
variable.ammo.put(this, count);
}
public void add(PlayerVariable variable, int count) {
set(variable, safeAdd(get(variable), count));
}
// Entity
public int get(Entity entity) {
return get(entity.getData(ModAttachments.PLAYER_VARIABLE));
}
public void set(Entity entity, int count) {
if (entity.level().isClientSide) return;
var cap = entity.getData(ModAttachments.PLAYER_VARIABLE).watch();
set(cap, count);
entity.setData(ModAttachments.PLAYER_VARIABLE, cap);
cap.sync(entity);
}
public void add(Entity entity, int count) {
set(entity, safeAdd(get(entity), count));
}
private int safeAdd(int a, int b) {
var newCount = (long) a + (long) b;
if (newCount > Integer.MAX_VALUE) {
newCount = Integer.MAX_VALUE;
} else if (newCount < 0) {
newCount = 0;
}
return (int) newCount;
}
@Override
public String toString() {
return this.serializationName;
}
}