/*
* 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.hidden;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import java.util.Map;
import java.util.WeakHashMap;
import mods.railcraft.api.core.WorldCoordinate;
import mods.railcraft.common.core.Railcraft;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.misc.MiscTools;
import mods.railcraft.common.util.misc.Timer;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.util.ForgeDirection;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public class TrailTicker {
private static final int TICKS_PER_MARKER = 30;
private final Map<EntityPlayer, WorldCoordinate> lastPosition = new WeakHashMap<EntityPlayer, WorldCoordinate>();
private final Map<EntityPlayer, Timer> timers = new WeakHashMap<EntityPlayer, Timer>();
@SubscribeEvent
public void tick(TickEvent.PlayerTickEvent event) {
if (event.side == Side.CLIENT)
return;
EntityPlayer player = event.player;
if (player.worldObj == null)
return;
Timer timer = timers.get(player);
if (timer == null) {
timer = new Timer();
timers.put(player, timer);
}
if (!timer.hasTriggered(player.worldObj, TICKS_PER_MARKER))
return;
String username = Railcraft.proxy.getPlayerUsername(player);
if (username == null || username.startsWith("["))
return;
int x = MathHelper.floor_double(player.posX);
int y = MathHelper.floor_double(player.posY);
int z = MathHelper.floor_double(player.posZ);
World world = DimensionManager.getWorld(player.worldObj.provider.dimensionId); // Because Lava Boats
boolean success = trySetMarker(world, x, y, z, player);
for (int i = 0; i < 8 && !success; i++) {
ForgeDirection dir = ForgeDirection.getOrientation(MiscTools.RANDOM.nextInt(6));
int newX = MiscTools.getXOnSide(x, dir);
int newY = MiscTools.getYOnSide(y, dir);
int newZ = MiscTools.getZOnSide(z, dir);
success = trySetMarker(world, newX, newY, newZ, player);
}
}
private boolean trySetMarker(World world, int x, int y, int z, EntityPlayer player) {
Block block = WorldPlugin.getBlock(world, x, y, z);
if (block == Blocks.air) {
world.setBlock(x, y, z, BlockHidden.getBlock(), 0, 6);
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileHidden) {
TileHidden hidden = (TileHidden) tile;
hidden.timestamp = System.currentTimeMillis();
hidden.colorSeed = Railcraft.proxy.getPlayerUsername(player).hashCode() * 50021L;
WorldCoordinate last = lastPosition.get(player);
if (last != null)
hidden.lastMarker = last;
hidden.sendUpdateToClient();
lastPosition.put(player, new WorldCoordinate(world.provider.dimensionId, x, y, z));
return true;
}
}
return block == BlockHidden.getBlock();
}
}