152 lines
4.6 KiB
Java
152 lines
4.6 KiB
Java
package com.legacy.aether.entities.util;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityCreature;
|
|
import net.minecraft.entity.EntityLiving;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.boss.IBossDisplayData;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.util.Direction;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.WorldServer;
|
|
import net.minecraftforge.common.IExtendedEntityProperties;
|
|
|
|
import com.legacy.aether.AetherConfig;
|
|
import com.legacy.aether.api.player.util.IAetherBoss;
|
|
import com.legacy.aether.items.ItemsAether;
|
|
import com.legacy.aether.player.PlayerAether;
|
|
import com.legacy.aether.world.TeleporterAether;
|
|
|
|
import cpw.mods.fml.common.FMLCommonHandler;
|
|
|
|
public class EntityHook implements IExtendedEntityProperties {
|
|
|
|
private Entity entity;
|
|
|
|
private boolean inPortal;
|
|
|
|
public int teleportDirection;
|
|
|
|
@Override
|
|
public void init(Entity entity, World world) {
|
|
this.entity = entity;
|
|
}
|
|
|
|
@Override
|
|
public void saveNBTData(NBTTagCompound compound) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void loadNBTData(NBTTagCompound compound) {
|
|
|
|
}
|
|
|
|
public void onUpdate() {
|
|
this.entity.worldObj.theProfiler.startSection("portal");
|
|
|
|
if (this.entity.dimension == AetherConfig.getAetherDimensionID()) {
|
|
if (this.entity.posY < -2 && this.entity.riddenByEntity == null && this.entity.ridingEntity == null) {
|
|
if (!this.entity.worldObj.isRemote) {
|
|
this.teleportEntity(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.inPortal) {
|
|
if (this.entity.ridingEntity == null) {
|
|
this.entity.timeUntilPortal = this.entity.getPortalCooldown();
|
|
|
|
if (!this.entity.worldObj.isRemote) {
|
|
this.teleportEntity(true);
|
|
}
|
|
}
|
|
|
|
this.inPortal = false;
|
|
}
|
|
|
|
if (this.entity.timeUntilPortal > 0) {
|
|
--this.entity.timeUntilPortal;
|
|
}
|
|
|
|
this.entity.worldObj.theProfiler.endSection();
|
|
|
|
if (this.entity instanceof EntityLiving) {
|
|
EntityLiving livingEntity = (EntityLiving) this.entity;
|
|
|
|
if (livingEntity.getAttackTarget() instanceof EntityPlayer) {
|
|
PlayerAether playerAether = PlayerAether.get((EntityPlayer) livingEntity.getAttackTarget());
|
|
|
|
if (playerAether.getAccessoryInventory().wearingAccessory(new ItemStack(ItemsAether.invisibility_cape))) {
|
|
livingEntity.setAttackTarget(null);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.entity instanceof EntityCreature) {
|
|
EntityCreature creature = (EntityCreature) this.entity;
|
|
|
|
if (creature.getEntityToAttack() instanceof EntityPlayer) {
|
|
PlayerAether playerAether = PlayerAether.get((EntityPlayer) creature.getEntityToAttack());
|
|
|
|
if (playerAether.getAccessoryInventory().wearingAccessory(new ItemStack(ItemsAether.invisibility_cape))) {
|
|
creature.setTarget(null);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.entity instanceof EntityLivingBase)
|
|
{
|
|
EntityLivingBase living = (EntityLivingBase) this.entity;
|
|
|
|
if (living.getAITarget() instanceof EntityPlayer) {
|
|
PlayerAether playerAether = PlayerAether.get((EntityPlayer) living.getAITarget());
|
|
|
|
if (playerAether.getAccessoryInventory().wearingAccessory(new ItemStack(ItemsAether.invisibility_cape))) {
|
|
living.setRevengeTarget(null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setInPortal() {
|
|
if (this.entity instanceof IAetherBoss || this.entity instanceof IBossDisplayData) {
|
|
return;
|
|
}
|
|
|
|
if (this.entity.timeUntilPortal > 0) {
|
|
this.entity.timeUntilPortal = this.entity.getPortalCooldown();
|
|
} else {
|
|
double d0 = this.entity.prevPosX - this.entity.posX;
|
|
double d1 = this.entity.prevPosZ - this.entity.posZ;
|
|
|
|
if (!this.entity.worldObj.isRemote && !this.inPortal) {
|
|
this.teleportDirection = Direction.getMovementDirection(d0, d1);
|
|
}
|
|
|
|
this.inPortal = true;
|
|
}
|
|
}
|
|
|
|
private void teleportEntity(boolean shouldSpawnPortal) {
|
|
try {
|
|
int previousDimension = this.entity.dimension;
|
|
int transferDimension = previousDimension == AetherConfig.getAetherDimensionID() ? AetherConfig.getTravelDimensionID() : AetherConfig.getAetherDimensionID();
|
|
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
|
|
WorldServer previousWorldIn = server.worldServerForDimension(previousDimension);
|
|
WorldServer newWorldIn = server.worldServerForDimension(transferDimension);
|
|
|
|
this.entity.dimension = newWorldIn.provider.dimensionId;
|
|
previousWorldIn.removePlayerEntityDangerously(this.entity);
|
|
this.entity.isDead = false;
|
|
|
|
server.getConfigurationManager().transferEntityToWorld(this.entity, previousWorldIn.provider.dimensionId, previousWorldIn, newWorldIn, new TeleporterAether(shouldSpawnPortal, newWorldIn));
|
|
} catch (Exception e) {
|
|
|
|
}
|
|
}
|
|
|
|
} |