继我之前的问题 Capability系统的nbt数据同步问题 的后续
首先描述一下我遇到的问题:我自定义了一个Capability,将他的Provider绑定在了玩家身上,通过发包的方式同步了服务端和客户端的Capability里面的值。上述过程都很正常,接下来是我发现的问题:
下面是我对这个问题的一些想法:
注:1、数据同步的过程一切正常,我已经进行了充分的测试,下面是网络包的handle:
复制代码2、客户端能力的调用方式为:
复制代码
首先描述一下我遇到的问题:我自定义了一个Capability,将他的Provider绑定在了玩家身上,通过发包的方式同步了服务端和客户端的Capability里面的值。上述过程都很正常,接下来是我发现的问题:
- 重启游戏或者重进地图后,客户端的能力值都会初始化为Provider里面的初始值,而服务端的数据则表现正常。
下面是我对这个问题的一些想法:
- 之所以客户端数据被重置,而服务端正常,是因为游戏存档保存的能力值是服务端的数据;重进地图后,服务端读取了数据,客户端没有,因此客户端是初始值。
- 如果上述猜想正确,那么解决问题的方法就是在进地图之后,立即将服务端的能力值发包给客户端,进行同步,这个步骤我不知道怎么做,请前辈们指导。
- 如果我的猜想错误,请前辈们指出问题所在,并且提出可行的解决方法,感谢!!!
注:1、数据同步的过程一切正常,我已经进行了充分的测试,下面是网络包的handle:
- public static void handle(MSGMindCapabilitySync msg, Supplier<NetworkEvent.Context> ctx) {
- ctx.get().enqueueWork(() -> {
- ServerPlayerEntity clientPlayer = ctx.get().getSender();
- if (clientPlayer != null) {
- clientPlayer.getCapability(LibCapabilities.MIND_CAPABILITY).ifPresent((capability -> {
- capability.setMindStrength(msg.mindStrength);
- }));
- }
- DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
- if (Minecraft.getInstance().player == null) return;
- Minecraft.getInstance().player.getCapability(LibCapabilities.MIND_CAPABILITY).ifPresent((capability -> {
- capability.setMindStrength(msg.mindStrength);
- }));
- });
- });
- ctx.get().setPacketHandled(true);
- }
- Minecraft.getInstance().player.getCapability(LibCapabilities.MIND_CAPABILITY).ifPresent(capability -> {
- SaintChapter.LOGGER.info(String.valueOf(capability.getMindStrength()));
- });
好叭,把事件系统翻了个底朝天之后终于找到了,PlayerEvent#PlayerLoggedInEvent,这里可以进行服务端初始化
MCBBS有你更精彩!