From faa64a47c3815d7ab3df7963f8ecdbc78dc58250 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 10 Feb 2023 21:23:45 +0700 Subject: [PATCH] Proper phantoms spawn hook --- .../mc/otm/OverdriveThatMatters.java | 1 - .../otm/capability/MatteryPlayerCapability.kt | 13 +++++++++ src/main/resources/coremods/code_injector.js | 27 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index dc2768d39..6e92cacc6 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -154,7 +154,6 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayerCapability.Companion::onPlayerChangeDimensionEvent); EVENT_BUS.addListener(EventPriority.LOWEST, MatteryPlayerCapability.Companion::onPlayerDeath); EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayerCapability.Companion::onPlayerCloneEvent); - EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayerCapability.Companion::canEntitySpawn); EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayerCapability.Companion::onStartTracking); EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayerCapability.Companion::onStopTracking); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index c71ac169e..c73cc4d96 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -1015,6 +1015,19 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial private val LOGGER = LogManager.getLogger() + /** + * hooked into PhantomSpawner through coremod script + */ + @JvmStatic + fun phantomSpawnHook(player: Player): Boolean { + if (player.matteryPlayer?.isAndroid == true) { + val feature = player.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature? + return feature?.isActive == true + } + + return true + } + fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) { if (event.spawnReason == MobSpawnType.NATURAL && event.entity is Phantom) { for (ply in event.entity.level.players()) { diff --git a/src/main/resources/coremods/code_injector.js b/src/main/resources/coremods/code_injector.js index 884576aad..f733d2489 100644 --- a/src/main/resources/coremods/code_injector.js +++ b/src/main/resources/coremods/code_injector.js @@ -616,6 +616,33 @@ function backtrack(instructions, from, opcode, skipAmount) { function initializeCoreMod() { return { + 'PhantomSpawner block spawns as android': method('net.minecraft.world.level.levelgen.PhantomSpawner.m_7995_(Lnet/minecraft/server/level/ServerLevel;ZZ)I', function(node) { + var isSpectator = ASMAPI.mapMethod('m_5833_') + + for (var i = 0; i < node.instructions.size(); i++) { + var instr = node.instructions.get(i) + + if (instr.getOpcode() == opcodesRemapped.invokevirtual && instr.name == isSpectator) { + var aload = backtrack(node.instructions, i, opcodesRemapped.aload) + + putInstructions(node, instr, [ + new VarInsnNode(opcodesRemapped.aload, aload["var"]), + new MethodInsnNode( + opcodesRemapped.invokestatic, + 'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability', + 'phantomSpawnHook', + '(Lnet/minecraft/world/entity/player/Player;)Z' + ), + new InsnNode(opcodesRemapped.iand) + ]) + + return node + } + } + + return node + }), + 'Inventory#dropAll': injectAtTail( 'net.minecraft.world.entity.player.Inventory.m_36071_()V', [