- 12
- 0
Доброго времени суток друзья!
я столкнулся с непонятной для меня ситуацией, я внедряю РПГ систему в мод, и мне необходимо использовать множество CAPABILITY
я подключил к моду одну тестовую переменную, она работала стабильно, значение менялось/сохранялось/читалось без сбоев
но как только я подрубил вторую переменную все к чертям полетело, при смерти игрока, при перезаходе на сервер, значения переменных обнуляются
к слову в сингл плеере работает все стабильно
посмотрите пожалуйста код и помогите решить проблему
я столкнулся с непонятной для меня ситуацией, я внедряю РПГ систему в мод, и мне необходимо использовать множество CAPABILITY
я подключил к моду одну тестовую переменную, она работала стабильно, значение менялось/сохранялось/читалось без сбоев
но как только я подрубил вторую переменную все к чертям полетело, при смерти игрока, при перезаходе на сервер, значения переменных обнуляются
к слову в сингл плеере работает все стабильно
посмотрите пожалуйста код и помогите решить проблему
CODE:
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class GwModVariables {
@SubscribeEvent
public static void init(FMLCommonSetupEvent event) {
GwMod.addNetworkMessage(PlayerVariablesSyncMessage.class, PlayerVariablesSyncMessage::buffer, PlayerVariablesSyncMessage::new,
PlayerVariablesSyncMessage::handler);
}
@SubscribeEvent
public static void init(RegisterCapabilitiesEvent event) {
event.register(PlayerVariables.class);
}
@Mod.EventBusSubscriber
public static class EventBusVariableHandlers {
@SubscribeEvent
public static void onPlayerLoggedInSyncPlayerVariables(PlayerEvent.PlayerLoggedInEvent event) {
if (!event.getPlayer().level.isClientSide())
((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()))
.syncPlayerVariables(event.getPlayer());
}
@SubscribeEvent
public static void onPlayerRespawnedSyncPlayerVariables(PlayerEvent.PlayerRespawnEvent event) {
if (!event.getPlayer().level.isClientSide())
((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()))
.syncPlayerVariables(event.getPlayer());
}
@SubscribeEvent
public static void onPlayerChangedDimensionSyncPlayerVariables(PlayerEvent.PlayerChangedDimensionEvent event) {
if (!event.getPlayer().level.isClientSide())
((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()))
.syncPlayerVariables(event.getPlayer());
}
@SubscribeEvent
public static void clonePlayer(PlayerEvent.Clone event) {
event.getOriginal().revive();
PlayerVariables original = ((PlayerVariables) event.getOriginal().getCapability(PLAYER_VARIABLES_CAPABILITY, null)
.orElse(new PlayerVariables()));
PlayerVariables clone = ((PlayerVariables) event.getEntity().getCapability(PLAYER_VARIABLES_CAPABILITY, null)
.orElse(new PlayerVariables()));
clone.test = original.test;
clone.daren_dialog_1 = original.daren_dialog_1;
if (!event.isWasDeath()) {
}
}
}
public static final Capability<PlayerVariables> PLAYER_VARIABLES_CAPABILITY = CapabilityManager.get(new CapabilityToken<PlayerVariables>() {
});
@Mod.EventBusSubscriber
private static class PlayerVariablesProvider implements ICapabilitySerializable<Tag> {
@SubscribeEvent
public static void onAttachCapabilities(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof Player && !(event.getObject() instanceof FakePlayer))
event.addCapability(new ResourceLocation("gw", "player_variables"), new PlayerVariablesProvider());
}
private final PlayerVariables playerVariables = new PlayerVariables();
private final LazyOptional<PlayerVariables> instance = LazyOptional.of(() -> playerVariables);
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
return cap == PLAYER_VARIABLES_CAPABILITY ? instance.cast() : LazyOptional.empty();
}
@Override
public Tag serializeNBT() {
return playerVariables.writeNBT();
}
@Override
public void deserializeNBT(Tag nbt) {
playerVariables.readNBT(nbt);
}
}
public static class PlayerVariables {
public double test = 0;
public double daren_dialog_1 = 0;
public void syncPlayerVariables(Entity entity) {
if (entity instanceof ServerPlayer serverPlayer)
GwMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new PlayerVariablesSyncMessage(this));
}
public Tag writeNBT() {
CompoundTag nbt = new CompoundTag();
nbt.putDouble("test", test);
nbt.putDouble("daren_dialog_1", daren_dialog_1);
return nbt;
}
public void readNBT(Tag Tag) {
CompoundTag nbt = (CompoundTag) Tag;
test = nbt.getDouble("test");
daren_dialog_1 = nbt.getDouble("daren_dialog_1");
}
}
public static class PlayerVariablesSyncMessage {
public PlayerVariables data;
public PlayerVariablesSyncMessage(FriendlyByteBuf buffer) {
this.data = new PlayerVariables();
this.data.readNBT(buffer.readNbt());
}
public PlayerVariablesSyncMessage(PlayerVariables data) {
this.data = data;
}
public static void buffer(PlayerVariablesSyncMessage message, FriendlyByteBuf buffer) {
buffer.writeNbt((CompoundTag) message.data.writeNBT());
}
public static void handler(PlayerVariablesSyncMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get();
context.enqueueWork(() -> {
if (!context.getDirection().getReceptionSide().isServer()) {
PlayerVariables variables = ((PlayerVariables) Minecraft.getInstance().player.getCapability(PLAYER_VARIABLES_CAPABILITY, null)
.orElse(new PlayerVariables()));
variables.test = message.data.test;
variables.daren_dialog_1 = message.data.daren_dialog_1;
}
});
context.setPacketHandled(true);
}
}
}