/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.blocks.tracks; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; import net.minecraft.util.AxisAlignedBB; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.boss.EntityDragon; import net.minecraft.entity.boss.EntityWither; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.monster.EntityBlaze; import net.minecraft.entity.monster.EntityMagmaCube; import net.minecraft.entity.monster.EntitySlime; import net.minecraft.entity.passive.EntityBat; import net.minecraft.entity.passive.EntitySquid; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; import mods.railcraft.api.core.items.IToolCrowbar; import mods.railcraft.api.tracks.ITrackPowered; import mods.railcraft.common.gui.EnumGui; import mods.railcraft.common.gui.GuiHandler; import mods.railcraft.common.util.effects.EffectManager; import mods.railcraft.common.util.misc.MiscTools; import mods.railcraft.common.util.network.IGuiReturnHandler; import net.minecraft.entity.EntityLivingBase; public class TrackEmbarking extends TrackBaseRailcraft implements ITrackPowered, IGuiReturnHandler { public static final Set<Class> excludedEntities = new HashSet<Class>(); public static final byte MIN_AREA = 1; public static final byte MAX_AREA = 5; private boolean powered = false; private byte area = 2; static { excludedEntities.add(EntityIronGolem.class); excludedEntities.add(EntityDragon.class); excludedEntities.add(EntityWither.class); excludedEntities.add(EntityBlaze.class); excludedEntities.add(EntityMagmaCube.class); excludedEntities.add(EntitySquid.class); excludedEntities.add(EntityBat.class); } @Override public EnumTrack getTrackType() { return EnumTrack.EMBARKING; } @Override public IIcon getIcon() { if (isPowered()) { return getIcon(0); } return getIcon(1); } @Override public boolean blockActivated(EntityPlayer player) { ItemStack current = player.getCurrentEquippedItem(); if (current != null && current.getItem() instanceof IToolCrowbar) { IToolCrowbar crowbar = (IToolCrowbar) current.getItem(); GuiHandler.openGui(EnumGui.TRACK_EMBARKING, player, getWorld(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); crowbar.onWhack(player, current, getX(), getY(), getZ()); return true; } return false; } @Override public void onMinecartPass(EntityMinecart cart) { if (powered && cart.canBeRidden() && cart.riddenByEntity == null && cart.getEntityData().getInteger("MountPrevention") <= 0) { int a = area; AxisAlignedBB box = AxisAlignedBB.getBoundingBox(getX(), getY(), getZ(), getX() + 1, getY() + 1, getZ() + 1); box = box.expand(a, a, a); List entities = getWorld().getEntitiesWithinAABB(EntityLivingBase.class, box); if (entities.size() > 0) { EntityLivingBase entity = (EntityLivingBase) entities.get(MiscTools.getRand().nextInt(entities.size())); if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; if (player.isSneaking()) { return; } ItemStack current = player.getCurrentEquippedItem(); if (current != null && current.getItem() instanceof IToolCrowbar) { return; } } else if (excludedEntities.contains(entity.getClass())) { return; } else if (entity instanceof EntitySlime) { EntitySlime slime = (EntitySlime) entity; if (slime.getSlimeSize() >= 100) return; } if (entity.ridingEntity == null) { EffectManager.instance.teleportEffect(entity, cart.posX, cart.posY, cart.posZ); entity.mountEntity(cart); } } } } @Override public boolean isPowered() { return powered; } @Override public void setPowered(boolean powered) { this.powered = powered; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("powered", powered); data.setByte("area", area); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); powered = data.getBoolean("powered"); area = data.getByte("area"); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeBoolean(powered); data.writeByte(area); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); boolean p = data.readBoolean(); setArea(data.readByte()); if (p != powered) { powered = p; markBlockNeedsUpdate(); } } @Override public void writeGuiData(DataOutputStream data) throws IOException { data.writeByte(area); } @Override public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException { byte a = data.readByte(); if (area != a) { setArea(a); sendUpdateToClient(); } } public void setArea(byte radius) { radius = (byte) Math.max(MIN_AREA, radius); radius = (byte) Math.min(MAX_AREA, radius); area = radius; } public byte getArea() { return area; } }