diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchManager.kt index 00a1570ab..c61ba9e47 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchManager.kt @@ -134,7 +134,7 @@ object AndroidResearchManager : SimpleJsonResourceReloadListener(GsonBuilder().s } context.enqueueWork { - minecraft.player?.matteryPlayer?.reloadResearch(MINECRAFT_SERVER.registryAccess()) + context.player().matteryPlayer.reloadResearch(context.player().registryAccess()) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt index 8a094febe..8bea45cf9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt @@ -101,6 +101,7 @@ import ru.dbotthepony.mc.otm.core.writeComponent import ru.dbotthepony.mc.otm.core.writeItemType import ru.dbotthepony.mc.otm.matter.MatterManager.Finder import ru.dbotthepony.mc.otm.milliTime +import ru.dbotthepony.mc.otm.onceServer import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.RegistryDelegate import ru.dbotthepony.mc.otm.secondTime @@ -1771,8 +1772,16 @@ object MatterManager { LOGGER.debug("Encoding matter registry packets took ${time.millis}ms, (${totalSize} bytes total, $compressedSize bytes compressed)") - for (chunk in chunks) { - distributor.invoke(chunk) + /** + * Delay sending by one server tick; + * this way client is guaranteed to be in "PLAY" state, with local player present. + * This hack is required because we manually compressing and splitting packet between multiple payloads, + * hence it is impossible to "read" parsed data from network directly, using provided RegistryFriendlyByteBuf. + */ + onceServer { + for (chunk in chunks) { + distributor.invoke(chunk) + } } }