diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java new file mode 100644 index 000000000..9d7284fea --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java @@ -0,0 +1,25 @@ +package com.atsuishio.superbwarfare.data.vehicle; + +import com.atsuishio.superbwarfare.config.server.VehicleConfig; +import com.google.gson.annotations.SerializedName; + +public class DefaultVehicleData { + @SerializedName("ID") + public String id = ""; + + @SerializedName("MaxHealth") + public float maxHealth = 50; + + @SerializedName("RepairCooldown") + public int repairCooldown = VehicleConfig.REPAIR_COOLDOWN.get(); + + @SerializedName("RepairAmount") + public float repairAmount = VehicleConfig.REPAIR_AMOUNT.get().floatValue(); + + @SerializedName("MaxEnergy") + public int maxEnergy = 100000; + + // TODO damage modifier +// @SerializedName("DamageModifier") +// private List damageModifier; +} diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java new file mode 100644 index 000000000..795704d8c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java @@ -0,0 +1,50 @@ +package com.atsuishio.superbwarfare.data.vehicle; + +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.minecraft.world.entity.EntityType; +import org.jetbrains.annotations.NotNull; + +public class VehicleData { + + public final String id; + private final DefaultVehicleData data; + + private VehicleData(VehicleEntity entity) { + this.id = EntityType.getKey(entity.getType()).toString(); + this.data = VehicleDataTool.vehicleData.getOrDefault(id, new DefaultVehicleData()); + + System.out.println(111); + } + + private static final LoadingCache dataCache = CacheBuilder.newBuilder() + .weakKeys() + .build(new CacheLoader<>() { + public @NotNull VehicleData load(@NotNull VehicleEntity entity) { + return new VehicleData(entity); + } + }); + + public static VehicleData from(VehicleEntity entity) { + return dataCache.getUnchecked(entity); + } + + public float maxHealth() { + return data.maxHealth; + } + + public int repairCooldown() { + return data.repairCooldown; + } + + public float repairAmount() { + return data.repairAmount; + } + + public int maxEnergy() { + return data.maxEnergy; + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java new file mode 100644 index 000000000..045508126 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.data.vehicle; + +import com.atsuishio.superbwarfare.Mod; +import com.google.gson.Gson; +import net.minecraft.server.packs.resources.ResourceManager; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.OnDatapackSyncEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; + +import java.io.InputStreamReader; +import java.util.HashMap; + +@EventBusSubscriber(modid = Mod.MODID) +public class VehicleDataTool { + public static HashMap vehicleData = new HashMap<>(); + + public static final String VEHICLE_DATA_FOLDER = "vehicles"; + + public static void initJsonData(ResourceManager manager) { + vehicleData.clear(); + for (var entry : manager.listResources(VEHICLE_DATA_FOLDER, file -> file.getPath().endsWith(".json")).entrySet()) { + var attribute = entry.getValue(); + + try { + Gson gson = new Gson(); + var data = gson.fromJson(new InputStreamReader(attribute.open()), DefaultVehicleData.class); + + if (!vehicleData.containsKey(data.id)) { + vehicleData.put(data.id, data); + } + } catch (Exception e) { + Mod.LOGGER.error(e.getMessage()); + } + } + } + + @SubscribeEvent + public static void serverStarted(ServerStartedEvent event) { + initJsonData(event.getServer().getResourceManager()); + } + + @SubscribeEvent + public static void onDataPackSync(OnDatapackSyncEvent event) { + initJsonData(event.getPlayerList().getServer().getResourceManager()); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java index 3f7f33b03..fb32c3270 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -353,16 +353,6 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { return this.cache; } - @Override - public float getMaxHealth() { - return VehicleConfig.TOM_6_HP.get(); - } - - @Override - public int getMaxEnergy() { - return VehicleConfig.TOM_6_MAX_ENERGY.get(); - } - @Override public ResourceLocation getVehicleIcon() { return Mod.loc("textures/vehicle_icon/tom_6_icon.png"); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java index 8971a9369..6373cc2e8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; import com.atsuishio.superbwarfare.capability.energy.SyncedEntityEnergyStorage; +import com.atsuishio.superbwarfare.data.vehicle.VehicleData; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -75,7 +76,7 @@ public abstract class EnergyVehicleEntity extends VehicleEntity { } public int getMaxEnergy() { - return 100000; + return VehicleData.from(this).maxEnergy(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index d14541676..6e50e3e19 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.config.server.VehicleConfig; +import com.atsuishio.superbwarfare.data.vehicle.VehicleData; import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity; import com.atsuishio.superbwarfare.entity.vehicle.damage.DamageModifier; import com.atsuishio.superbwarfare.entity.vehicle.weapon.VehicleWeapon; @@ -501,7 +501,7 @@ public abstract class VehicleEntity extends Entity { } public float getMaxHealth() { - return 50; + return VehicleData.from(this).maxHealth(); } @Override @@ -546,14 +546,14 @@ public abstract class VehicleEntity extends Entity { * 呼吸回血冷却时长(单位:tick),设为小于0的值以禁用呼吸回血 */ public int maxRepairCoolDown() { - return VehicleConfig.REPAIR_COOLDOWN.get(); + return VehicleData.from(this).repairCooldown(); } /** * 呼吸回血回血量 */ public float repairAmount() { - return VehicleConfig.REPAIR_AMOUNT.get().floatValue(); + return VehicleData.from(this).repairAmount(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModify.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModify.java index 76538d051..b883c61cb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModify.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModify.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.entity.vehicle.damage; +import com.google.gson.annotations.SerializedName; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.damagesource.DamageSource; @@ -9,17 +10,25 @@ import java.util.function.Function; public class DamageModify { public enum ModifyType { + @SerializedName("Immunity") IMMUNITY, // 完全免疫 + @SerializedName("Reduce") REDUCE, // 固定数值减伤 + @SerializedName("Multiply") MULTIPLY, // 乘以指定倍数 } - private final float value; - private final ModifyType type; + @SerializedName("Value") + private float value; + @SerializedName("Type") + private ModifyType type; - private TagKey sourceTagKey = null; - private ResourceKey sourceKey = null; - private Function condition = null; + @SerializedName("Source") + private String source; + + private transient TagKey sourceTagKey = null; + private transient ResourceKey sourceKey = null; + private transient Function condition = null; public DamageModify(ModifyType type, float value) { this.type = type; diff --git a/src/main/resources/data/superbwarfare/vehicles/tom_6.json b/src/main/resources/data/superbwarfare/vehicles/tom_6.json new file mode 100644 index 000000000..206b6d643 --- /dev/null +++ b/src/main/resources/data/superbwarfare/vehicles/tom_6.json @@ -0,0 +1,5 @@ +{ + "ID": "superbwarfare:tom_6", + "MaxHealth": 40, + "MaxEnergy": 100000 +} \ No newline at end of file