Proper phantoms spawn hook

This commit is contained in:
DBotThePony 2023-02-10 21:23:45 +07:00
parent 3a82981341
commit faa64a47c3
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 40 additions and 1 deletions

View File

@ -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);

View File

@ -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()) {

View File

@ -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',
[