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 05c431d45..c01b919b1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -55,6 +55,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.stream import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap +import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.nonEmpty import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.minus @@ -79,6 +80,7 @@ import ru.dbotthepony.mc.otm.triggers.BecomeAndroidTrigger import ru.dbotthepony.mc.otm.triggers.BecomeHumaneTrigger import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger import java.util.* +import java.util.function.Predicate import java.util.stream.Stream import kotlin.collections.ArrayDeque import kotlin.collections.ArrayList @@ -1248,13 +1250,15 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial * 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 + fun phantomSpawnHook(iterator: Iterator): Iterator { + return iterator.filter { + if (it.matteryPlayer?.isAndroid == true) { + val feature = it.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature? + feature?.isActive == true + } else { + true + } } - - return true } fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) { diff --git a/src/main/resources/coremods/code_injector.js b/src/main/resources/coremods/code_injector.js index 5de443d1f..040e5eacf 100644 --- a/src/main/resources/coremods/code_injector.js +++ b/src/main/resources/coremods/code_injector.js @@ -577,23 +577,19 @@ 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_') + var players = ASMAPI.mapMethod('m_6907_') 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"]), + if (instr.getOpcode() == opcodesRemapped.invokevirtual && instr.name == players) { + putInstructions(node, node.instructions.get(i + 1), [ new MethodInsnNode( opcodesRemapped.invokestatic, 'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability', 'phantomSpawnHook', - '(Lnet/minecraft/world/entity/player/Player;)Z' + '(Ljava/util/Iterator;)Ljava/util/Iterator;' ), - new InsnNode(opcodesRemapped.iand) ]) return node