修复部分情况下DamageModifier未正确初始化的问题,优化初始数据同步方法
This commit is contained in:
parent
966a63b1b5
commit
5a31860b59
5 changed files with 52 additions and 27 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
||||
/**
|
||||
* 控制载具伤害免疫
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue