Remove the most useless mob in the game from ever spawning when not asked to

This commit is contained in:
DBotThePony 2023-03-18 16:20:23 +07:00
parent 4068444e63
commit ce224d6fe7
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 14 additions and 14 deletions

View File

@ -55,6 +55,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.container.stream import ru.dbotthepony.mc.otm.container.stream
import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.*
import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap 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.collect.nonEmpty
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.math.minus 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.BecomeHumaneTrigger
import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger
import java.util.* import java.util.*
import java.util.function.Predicate
import java.util.stream.Stream import java.util.stream.Stream
import kotlin.collections.ArrayDeque import kotlin.collections.ArrayDeque
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -1248,13 +1250,15 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
* hooked into PhantomSpawner through coremod script * hooked into PhantomSpawner through coremod script
*/ */
@JvmStatic @JvmStatic
fun phantomSpawnHook(player: Player): Boolean { fun phantomSpawnHook(iterator: Iterator<Player>): Iterator<Player> {
if (player.matteryPlayer?.isAndroid == true) { return iterator.filter {
val feature = player.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature? if (it.matteryPlayer?.isAndroid == true) {
return feature?.isActive == true val feature = it.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature?
feature?.isActive == true
} else {
true
}
} }
return true
} }
fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) { fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) {

View File

@ -577,23 +577,19 @@ function backtrack(instructions, from, opcode, skipAmount) {
function initializeCoreMod() { function initializeCoreMod() {
return { return {
'PhantomSpawner block spawns as android': method('net.minecraft.world.level.levelgen.PhantomSpawner.m_7995_(Lnet/minecraft/server/level/ServerLevel;ZZ)I', function(node) { '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++) { for (var i = 0; i < node.instructions.size(); i++) {
var instr = node.instructions.get(i) var instr = node.instructions.get(i)
if (instr.getOpcode() == opcodesRemapped.invokevirtual && instr.name == isSpectator) { if (instr.getOpcode() == opcodesRemapped.invokevirtual && instr.name == players) {
var aload = backtrack(node.instructions, i, opcodesRemapped.aload) putInstructions(node, node.instructions.get(i + 1), [
putInstructions(node, instr, [
new VarInsnNode(opcodesRemapped.aload, aload["var"]),
new MethodInsnNode( new MethodInsnNode(
opcodesRemapped.invokestatic, opcodesRemapped.invokestatic,
'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability', 'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability',
'phantomSpawnHook', 'phantomSpawnHook',
'(Lnet/minecraft/world/entity/player/Player;)Z' '(Ljava/util/Iterator;)Ljava/util/Iterator;'
), ),
new InsnNode(opcodesRemapped.iand)
]) ])
return node return node