diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java index e6e74bfd6..e64e53e13 100644 --- a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java @@ -13,11 +13,13 @@ import org.jetbrains.annotations.NotNull; public class VehicleData { public final String id; - private final DefaultVehicleData data; + public final DefaultVehicleData data; + public final VehicleEntity vehicle; private VehicleData(VehicleEntity entity) { this.id = EntityType.getKey(entity.getType()).toString(); this.data = VehicleDataTool.vehicleData.getOrDefault(id, new DefaultVehicleData()); + this.vehicle = entity; } public static final LoadingCache dataCache = CacheBuilder.newBuilder() @@ -60,21 +62,29 @@ public class VehicleData { return data.mass; } + public static final LoadingCache damageModifiers = CacheBuilder.newBuilder() + .build(new CacheLoader<>() { + public @NotNull DamageModifier load(@NotNull String id) { + var data = VehicleDataTool.vehicleData.getOrDefault(id, new DefaultVehicleData()); + var modifier = new DamageModifier(); + + if (data.applyDefaultDamageModifiers) { + modifier.immuneTo(EntityType.POTION) + .immuneTo(EntityType.AREA_EFFECT_CLOUD) + .immuneTo(DamageTypes.FALL) + .immuneTo(DamageTypes.DROWN) + .immuneTo(DamageTypes.DRAGON_BREATH) + .immuneTo(DamageTypes.WITHER) + .immuneTo(DamageTypes.WITHER_SKULL) + .reduce(5, ModDamageTypes.VEHICLE_STRIKE); + } + + return modifier.addAll(data.damageModifiers); + } + }); + public DamageModifier damageModifier() { - var modifier = new DamageModifier(); - - if (data.applyDefaultDamageModifiers) { - modifier.immuneTo(EntityType.POTION) - .immuneTo(EntityType.AREA_EFFECT_CLOUD) - .immuneTo(DamageTypes.FALL) - .immuneTo(DamageTypes.DROWN) - .immuneTo(DamageTypes.DRAGON_BREATH) - .immuneTo(DamageTypes.WITHER) - .immuneTo(DamageTypes.WITHER_SKULL) - .reduce(5, ModDamageTypes.VEHICLE_STRIKE); - } - - return modifier.addAll(data.damageModifiers); + return damageModifiers.getUnchecked(id); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java index 6c1ace7a3..4c6dbb6f6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleDataTool.java @@ -24,6 +24,7 @@ public class VehicleDataTool { public static void initJsonData(ResourceManager manager) { vehicleData.clear(); VehicleData.dataCache.invalidateAll(); + VehicleData.damageModifiers.invalidateAll(); for (var entry : manager.listResources(VEHICLE_DATA_FOLDER, file -> file.getPath().endsWith(".json")).entrySet()) { var attribute = entry.getValue(); @@ -53,6 +54,11 @@ public class VehicleDataTool { @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player) { + var server = player.getServer(); + if (server != null && server.isSingleplayer()) { + return; + } + PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create()); } } @@ -66,6 +72,10 @@ public class VehicleDataTool { public static void onDataPackSync(OnDatapackSyncEvent event) { initJsonData(event.getPlayerList().getServer().getResourceManager()); + if (event.getPlayerList().getServer().isSingleplayer()) { + return; + } + event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create())); } } \ No newline at end of file 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 3a3333ce1..7daf07c47 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 @@ -403,7 +403,7 @@ public abstract class VehicleEntity extends Entity { if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.IN_WALL)) return false; // 计算减伤后的伤害 - float computedAmount = damageModifier.compute(source, amount); + float computedAmount = getDamageModifier().compute(source, amount); this.crash = source.is(ModDamageTypes.VEHICLE_STRIKE); if (source.getEntity() != null) { @@ -444,8 +444,6 @@ public abstract class VehicleEntity extends Entity { return true; } - protected final DamageModifier damageModifier = this.getDamageModifier(); - /** * 控制载具伤害免疫 * diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModifier.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModifier.java index 7d866139f..a6c95deb1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModifier.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/damage/DamageModifier.java @@ -218,8 +218,6 @@ public class DamageModifier { return this; } - private final List combinedList = new ArrayList<>(); - /** * 计算减伤后的伤害值 * @@ -228,14 +226,14 @@ public class DamageModifier { * @return 减伤后的伤害值 */ public float compute(DamageSource source, float damage) { - if (combinedList.isEmpty()) { - // 计算优先级 免疫 > 固定减伤 > 乘 - combinedList.addAll(immuneList); - combinedList.addAll(reduceList); - combinedList.addAll(multiplyList); - } + var list = new ArrayList(); - for (DamageModify damageModify : combinedList) { + // 计算优先级 免疫 > 固定减伤 > 乘 + list.addAll(immuneList); + list.addAll(reduceList); + list.addAll(multiplyList); + + for (DamageModify damageModify : list) { if (damageModify.match(source)) { damage = damageModify.compute(damage); diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java index 33d41c6e1..f713a2bd1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java @@ -62,6 +62,11 @@ public class GunsTool { @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player) { + var server = player.getServer(); + if (server != null && server.isSingleplayer()) { + return; + } + PacketDistributor.sendToPlayer(player, GunsDataMessage.create()); } } @@ -75,6 +80,10 @@ public class GunsTool { public static void onDataPackSync(OnDatapackSyncEvent event) { initJsonData(event.getPlayerList().getServer().getResourceManager()); + if (event.getPlayerList().getServer().isSingleplayer()) { + return; + } + event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, GunsDataMessage.create())); }