修复部分情况下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 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<VehicleEntity, VehicleData> dataCache = CacheBuilder.newBuilder()
@ -60,7 +62,10 @@ public class VehicleData {
return data.mass;
}
public DamageModifier damageModifier() {
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) {
@ -76,5 +81,10 @@ public class VehicleData {
return modifier.addAll(data.damageModifiers);
}
});
public DamageModifier damageModifier() {
return damageModifiers.getUnchecked(id);
}
}

View file

@ -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()));
}
}

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))
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();
/**
* 控制载具伤害免疫
*

View file

@ -218,8 +218,6 @@ public class DamageModifier {
return this;
}
private final List<DamageModify> 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<DamageModify>();
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);

View file

@ -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()));
}