package com.thebrokenrail.twine.mixin; import com.thebrokenrail.twine.component.StageDataComponent; import com.thebrokenrail.twine.entity.FollowPassiveEntityGoal; import com.thebrokenrail.twine.entity.StandOnGlowingObsidian; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.FollowTargetGoal; import net.minecraft.entity.ai.goal.GoalSelector; import net.minecraft.entity.mob.*; import net.minecraft.entity.passive.IronGolemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @SuppressWarnings("ConstantConditions") @Mixin(MobEntity.class) public class MixinMobEntity { @Shadow @Final protected GoalSelector targetSelector; @Shadow @Final protected GoalSelector goalSelector; @Inject(at = @At("RETURN"), method = "") public void initGoals(EntityType entityType, World world, CallbackInfo info) { if (world != null && !world.isClient()) { if (this instanceof Monster) { if ((Object) this instanceof MobEntityWithAi) { goalSelector.add(1, new StandOnGlowingObsidian((MobEntityWithAi) (Object) this)); } targetSelector.add(2, new FollowPassiveEntityGoal((MobEntity) (Object) this)); } else if ((Object) this instanceof IronGolemEntity) { targetSelector.add(3, new FollowTargetGoal<>((IronGolemEntity) (Object) this, PlayerEntity.class, 10, true, false, entity -> { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((IronGolemEntity) (Object) this).getEntityWorld()); ChunkPos chunkPos = new ChunkPos(((IronGolemEntity) (Object) this).getBlockPos()); int stage = component.findStageOfChunk(chunkPos); return stage >= 3 && !((IronGolemEntity) (Object) this).isPlayerCreated(); })); } } } }