package mods.railcraft.common.carts;
import java.util.HashSet;
import java.util.Set;
import mods.railcraft.api.carts.CartTools;
import mods.railcraft.api.core.WorldCoordinate;
import mods.railcraft.common.blocks.tracks.EnumTrackMeta;
import mods.railcraft.common.blocks.tracks.TrackForce;
import mods.railcraft.common.blocks.tracks.TrackTools;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.block.Block;
import net.minecraft.world.World;
public class EntityCartTrackRemover extends CartMaintenanceBase {
private final Set<WorldCoordinate> tracksBehind = new HashSet<WorldCoordinate>();
private final Set<WorldCoordinate> tracksRemoved = new HashSet<WorldCoordinate>();
public EntityCartTrackRemover(World world) {
super(world);
}
public EntityCartTrackRemover(World world, double d, double d1, double d2) {
this(world);
setPosition(d, d1 + (double) yOffset, d2);
motionX = 0.0D;
motionY = 0.0D;
motionZ = 0.0D;
prevPosX = d;
prevPosY = d1;
prevPosZ = d2;
}
@Override
public ICartType getCartType() {
return EnumCart.TRACK_REMOVER;
}
@Override
protected void func_145821_a(int trackX, int trackY, int trackZ, double maxSpeed, double slopeAdjustment, Block trackBlock, int trackMeta) {
super.func_145821_a(trackX, trackY, trackZ, maxSpeed, slopeAdjustment, trackBlock, trackMeta);
if (Game.isNotHost(worldObj))
return;
for (WorldCoordinate track : tracksBehind) {
if (track.isEqual(worldObj.provider.dimensionId, trackX, trackY, trackZ))
continue;
removeTrack(track);
}
tracksBehind.removeAll(tracksRemoved);
tracksRemoved.clear();
addTravelledTrack(trackX, trackY, trackZ);
}
private void addTravelledTrack(int trackX, int trackY, int trackZ) {
tracksBehind.add(new WorldCoordinate(worldObj.provider.dimensionId, trackX, trackY, trackZ));
}
private void removeTrack(WorldCoordinate track) {
if (WorldPlugin.getDistanceSq(track, posX, posY, posZ) >= 9)
tracksRemoved.add(track);
else if (!TrackTools.isRailBlockAt(worldObj, track.x, track.y, track.z))
tracksRemoved.add(track);
else if ((TrackTools.getTrackInstanceAt(worldObj, track.x, track.y, track.z) instanceof TrackForce))
tracksRemoved.add(track);
else if (!CartTools.isMinecartAt(worldObj, track.x, track.y, track.z, -0.2f)) {
Block block = WorldPlugin.getBlock(worldObj, track.x, track.y, track.z);
removeOldTrack(track.x, track.y, track.z, block);
blink();
tracksRemoved.add(track);
}
}
}