/* * 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.util.List; import mods.railcraft.common.blocks.machine.epsilon.EnumMachineEpsilon; import mods.railcraft.common.blocks.machine.epsilon.TileForceTrackEmitter; import mods.railcraft.common.plugins.forge.WorldPlugin; import mods.railcraft.common.util.misc.Game; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public class TrackForce extends TrackUnsupported { public TileForceTrackEmitter emitter; @Override public EnumTrack getTrackType() { return EnumTrack.FORCE; } @Override public List<ItemStack> getDrops(int fortune) { return null; } @Override public void onNeighborBlockChange(Block block) { super.onNeighborBlockChange(block); if (Game.isHost(getWorld())) checkForEmitter(); } public void checkForEmitter() { EnumTrackMeta meta = EnumTrackMeta.fromMeta(tileEntity.getBlockMetadata()); int y = getY() - 1; Block emitterBlock = EnumMachineEpsilon.FORCE_TRACK_EMITTER.getBlock(); if (meta == EnumTrackMeta.NORTH_SOUTH) { if (isValidEmitterTile(emitter, ForgeDirection.NORTH, ForgeDirection.SOUTH)) return; else setEmitter(null); for (int i = 1; i <= TileForceTrackEmitter.MAX_TRACKS; i++) { int x = getX() + i * ForgeDirection.NORTH.offsetX; int z = getZ() + i * ForgeDirection.NORTH.offsetZ; if (isValidEmitter(x, y, z, emitterBlock, ForgeDirection.SOUTH)) return; } for (int i = 1; i <= TileForceTrackEmitter.MAX_TRACKS; i++) { int x = getX() + i * ForgeDirection.SOUTH.offsetX; int z = getZ() + i * ForgeDirection.SOUTH.offsetZ; if (isValidEmitter(x, y, z, emitterBlock, ForgeDirection.NORTH)) return; } } else { if (isValidEmitterTile(emitter, ForgeDirection.EAST, ForgeDirection.WEST)) return; else setEmitter(null); for (int i = 1; i <= TileForceTrackEmitter.MAX_TRACKS; i++) { int x = getX() + i * ForgeDirection.EAST.offsetX; int z = getZ() + i * ForgeDirection.EAST.offsetZ; if (isValidEmitter(x, y, z, emitterBlock, ForgeDirection.WEST)) return; } for (int i = 1; i <= TileForceTrackEmitter.MAX_TRACKS; i++) { int x = getX() + i * ForgeDirection.WEST.offsetX; int z = getZ() + i * ForgeDirection.WEST.offsetZ; if (isValidEmitter(x, y, z, emitterBlock, ForgeDirection.EAST)) return; } } WorldPlugin.setBlockToAir(getWorld(), getX(), getY(), getZ()); } public TileForceTrackEmitter getEmitter() { return emitter; } public void setEmitter(TileForceTrackEmitter emitter) { this.emitter = emitter; } private boolean isValidEmitter(int x, int y, int z, Block emitterBlock, ForgeDirection facing) { if (WorldPlugin.getBlock(getWorld(), x, y, z) != emitterBlock) return false; TileEntity tile = WorldPlugin.getBlockTile(getWorld(), x, y, z); if (tile instanceof TileForceTrackEmitter && isValidEmitterTile((TileForceTrackEmitter) tile, facing)) { setEmitter(emitter); return true; } return false; } private boolean isValidEmitterTile(TileForceTrackEmitter tile, ForgeDirection... facing) { if (tile == null || tile.isInvalid()) return false; if (getY() - 1 != tile.yCoord) return false; if (getX() != tile.xCoord && getZ() != tile.zCoord) return false; ForgeDirection emitterFacing = tile.getFacing(); for (ForgeDirection f : facing) { if (f == emitterFacing) return true; } return false; } @Override public float getHardness() { return -1; } @Override public float getExplosionResistance(double srcX, double srcY, double srcZ, Entity exploder) { return 6000000.0F; } }