服务端与客户端的同步
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
由于handler在ClientPacketListener->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等),该类都有不同的实现。