/*
* 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.speedcontroller;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.api.tracks.ITrackInstance;
import mods.railcraft.common.blocks.tracks.TrackSpeed;
import mods.railcraft.common.blocks.tracks.TrackTools;
import mods.railcraft.common.core.RailcraftConfig;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.block.Block;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public class SpeedControllerHighSpeed extends SpeedController {
private static final int LOOK_AHEAD_DIST = 2;
private static final float SPEED_SLOPE = 0.45f;
private static SpeedController instance;
public static SpeedController getInstance() {
if (instance == null)
instance = new SpeedControllerHighSpeed();
return instance;
}
@Override
public float getMaxSpeed(ITrackInstance track, EntityMinecart cart) {
Float speed = null;
if (track instanceof TrackSpeed)
speed = ((TrackSpeed) track).maxSpeed;
if (speed == null)
speed = speedForCurrentTrack(track);
if (track instanceof TrackSpeed)
((TrackSpeed) track).maxSpeed = speed;
return speed;
}
public static float speedForCurrentTrack(ITrackInstance track) {
World world = track.getWorld();
int x = track.getX();
int y = track.getY();
int z = track.getZ();
Block block = WorldPlugin.getBlock(world, x, y, z);
if (TrackTools.isRailBlock(block)) {
int meta = TrackTools.getTrackMeta(world, block, null, x, y, z);
if (meta > 1 && meta < 6)
return SPEED_SLOPE;
}
return speedForNextTrack(world, x, y, z, 0);
}
private static float speedForNextTrack(World world, int x, int y, int z, int dist) {
float maxSpeed = RailcraftConfig.getMaxHighSpeed();
if (dist < LOOK_AHEAD_DIST)
for (int side = 2; side < 6; side++) {
ForgeDirection dir = ForgeDirection.getOrientation(side);
int xx = MiscTools.getXOnSide(x, dir);
int yy = y;
int zz = MiscTools.getZOnSide(z, dir);
Block block = WorldPlugin.getBlock(world, xx, yy, zz);
if (!TrackTools.isRailBlock(block)) {
block = WorldPlugin.getBlock(world, xx, yy + 1, zz);
if (TrackTools.isRailBlock(block))
yy = yy + 1;
else {
block = WorldPlugin.getBlock(world, xx, yy - 1, zz);
if (TrackTools.isRailBlock(block))
yy = yy - 1;
}
}
if (TrackTools.isRailBlock(block)) {
int meta = TrackTools.getTrackMeta(world, block, null, xx, yy, zz);
if (meta > 1 && meta < 6)
return SPEED_SLOPE;
maxSpeed = speedForNextTrack(world, xx, yy, zz, dist + 1);
if (maxSpeed == SPEED_SLOPE)
return SPEED_SLOPE;
}
}
return maxSpeed;
}
}