修复部分情况下DamageModifier未正确初始化的问题,优化初始数据同步方法

This commit is contained in:
Light_Quanta 2025-05-24 20:13:49 +08:00
parent 966a63b1b5
commit 5a31860b59
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
5 changed files with 52 additions and 27 deletions

View file

@ -13,11 +13,13 @@ import org.jetbrains.annotations.NotNull;
public class VehicleData { public class VehicleData {
public final String id; public final String id;
private final DefaultVehicleData data; public final DefaultVehicleData data;
public final VehicleEntity vehicle;
private VehicleData(VehicleEntity entity) { private VehicleData(VehicleEntity entity) {
this.id = EntityType.getKey(entity.getType()).toString(); this.id = EntityType.getKey(entity.getType()).toString();
this.data = VehicleDataTool.vehicleData.getOrDefault(id, new DefaultVehicleData()); this.data = VehicleDataTool.vehicleData.getOrDefault(id, new DefaultVehicleData());
this.vehicle = entity;
} }
public static final LoadingCache<VehicleEntity, VehicleData> dataCache = CacheBuilder.newBuilder() public static final LoadingCache<VehicleEntity, VehicleData> dataCache = CacheBuilder.newBuilder()
@ -60,21 +62,29 @@ public class VehicleData {
return data.mass; return data.mass;
} }
public static final LoadingCache<String, DamageModifier> 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() { public DamageModifier damageModifier() {
var modifier = new DamageModifier(); return damageModifiers.getUnchecked(id);
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);
} }
} }

View file

@ -24,6 +24,7 @@ public class VehicleDataTool {
public static void initJsonData(ResourceManager manager) { public static void initJsonData(ResourceManager manager) {
vehicleData.clear(); vehicleData.clear();
VehicleData.dataCache.invalidateAll(); VehicleData.dataCache.invalidateAll();
VehicleData.damageModifiers.invalidateAll();
for (var entry : manager.listResources(VEHICLE_DATA_FOLDER, file -> file.getPath().endsWith(".json")).entrySet()) { for (var entry : manager.listResources(VEHICLE_DATA_FOLDER, file -> file.getPath().endsWith(".json")).entrySet()) {
var attribute = entry.getValue(); var attribute = entry.getValue();
@ -53,6 +54,11 @@ public class VehicleDataTool {
@SubscribeEvent @SubscribeEvent
public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof ServerPlayer player) { if (event.getEntity() instanceof ServerPlayer player) {
var server = player.getServer();
if (server != null && server.isSingleplayer()) {
return;
}
PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create()); PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create());
} }
} }
@ -66,6 +72,10 @@ public class VehicleDataTool {
public static void onDataPackSync(OnDatapackSyncEvent event) { public static void onDataPackSync(OnDatapackSyncEvent event) {
initJsonData(event.getPlayerList().getServer().getResourceManager()); initJsonData(event.getPlayerList().getServer().getResourceManager());
if (event.getPlayerList().getServer().isSingleplayer()) {
return;
}
event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create())); event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, VehiclesDataMessage.create()));
} }
} }

View file

@ -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)) if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.IN_WALL))
return false; return false;
// 计算减伤后的伤害 // 计算减伤后的伤害
float computedAmount = damageModifier.compute(source, amount); float computedAmount = getDamageModifier().compute(source, amount);
this.crash = source.is(ModDamageTypes.VEHICLE_STRIKE); this.crash = source.is(ModDamageTypes.VEHICLE_STRIKE);
if (source.getEntity() != null) { if (source.getEntity() != null) {
@ -444,8 +444,6 @@ public abstract class VehicleEntity extends Entity {
return true; return true;
} }
protected final DamageModifier damageModifier = this.getDamageModifier();
/** /**
* 控制载具伤害免疫 * 控制载具伤害免疫
* *

View file

@ -218,8 +218,6 @@ public class DamageModifier {
return this; return this;
} }
private final List<DamageModify> combinedList = new ArrayList<>();
/** /**
* 计算减伤后的伤害值 * 计算减伤后的伤害值
* *
@ -228,14 +226,14 @@ public class DamageModifier {
* @return 减伤后的伤害值 * @return 减伤后的伤害值
*/ */
public float compute(DamageSource source, float damage) { public float compute(DamageSource source, float damage) {
if (combinedList.isEmpty()) { var list = new ArrayList<DamageModify>();
// 计算优先级 免疫 > 固定减伤 >
combinedList.addAll(immuneList);
combinedList.addAll(reduceList);
combinedList.addAll(multiplyList);
}
for (DamageModify damageModify : combinedList) { // 计算优先级 免疫 > 固定减伤 >
list.addAll(immuneList);
list.addAll(reduceList);
list.addAll(multiplyList);
for (DamageModify damageModify : list) {
if (damageModify.match(source)) { if (damageModify.match(source)) {
damage = damageModify.compute(damage); damage = damageModify.compute(damage);

View file

@ -62,6 +62,11 @@ public class GunsTool {
@SubscribeEvent @SubscribeEvent
public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof ServerPlayer player) { if (event.getEntity() instanceof ServerPlayer player) {
var server = player.getServer();
if (server != null && server.isSingleplayer()) {
return;
}
PacketDistributor.sendToPlayer(player, GunsDataMessage.create()); PacketDistributor.sendToPlayer(player, GunsDataMessage.create());
} }
} }
@ -75,6 +80,10 @@ public class GunsTool {
public static void onDataPackSync(OnDatapackSyncEvent event) { public static void onDataPackSync(OnDatapackSyncEvent event) {
initJsonData(event.getPlayerList().getServer().getResourceManager()); initJsonData(event.getPlayerList().getServer().getResourceManager());
if (event.getPlayerList().getServer().isSingleplayer()) {
return;
}
event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, GunsDataMessage.create())); event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, GunsDataMessage.create()));
} }