修复部分情况下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 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 控制载具伤害免疫
|
* 控制载具伤害免疫
|
||||||
*
|
*
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue