跳到主要内容

服务端与客户端的同步

参考Sides - Forge Community Wiki


  • LogicalSide:逻辑端
    • CLIENT:逻辑客户端
    • SERVER:逻辑服务端
  • Dist:硬件端
    • CLIENT:硬件客户端,同时包含逻辑客户端和逻辑服务端
    • DEDICATED_SERVER:硬件服务端,只有逻辑服务端

tips:
level.isClientSide 是逻辑端
DistExecutor在指定的端上运行提供的Runnable

网络

自定义网络包

tips:Unknown custom packet identifier这个错误
是由于没有在handler的最后写context.setPacketHandled(true)导致的

并且不要在enqueueWork中写context.setPacketHandled(true)
上面两种情况都会导致重新调用handler
由于handlerClientPacketListener->handleCustomPayload第一行onCustomPayload调用
需要立刻获得handled布尔值进行判断

handleCustomPayload第一行onCustomPayload会post包处理事件到网络事件总线
然后返回Optional.of(...handled...).orElse(false),为true则直接return,如果返回不为true,到下一行
第二行ensureRunningOnSameThread检测:如果不在同一线程,切换到主线程触发包处理(相当于递归handleCustomPayload);如果在同一线程,就跳过
切换到主线程后网络事件总线应该是阻塞执行代码的(也有可能是之前enqueueWork执行完了,待求证...)
所以在enqueueWork中写context.setPacketHandled(true)不会报错,但仍会重新调用handler

杂项

PacketListener

描述了数据包的处理方式。针对每种可能的协议(例如PLAY,CLIENTBOUND;PLAY,SERVERBOUND等),该类都有不同的实现。