package com.fredtargaryen.floocraft.network.messages;
import com.fredtargaryen.floocraft.FloocraftBase;
import com.fredtargaryen.floocraft.block.GreenFlamesBase;
import com.fredtargaryen.floocraft.block.GreenFlamesBusy;
import com.fredtargaryen.floocraft.block.GreenFlamesTemp;
import com.fredtargaryen.floocraft.network.PacketHandler;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.IThreadListener;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
public class MessageTeleportEntity implements IMessage, IMessageHandler<MessageTeleportEntity, IMessage>
{
public int initX, initY, initZ, destX, destY, destZ;
@Override
public IMessage onMessage(final MessageTeleportEntity message, MessageContext ctx)
{
final EntityPlayerMP player = ctx.getServerHandler().playerEntity;
final IThreadListener serverListener = player.getServerWorld();
serverListener.addScheduledTask(new Runnable() {
@Override
public void run() {
int initX = message.initX;
int initY = message.initY;
int initZ = message.initZ;
int destX = message.destX;
int destY = message.destY;
int destZ = message.destZ;
boolean validDest = false;
WorldServer world = (WorldServer)serverListener;
BlockPos dest = new BlockPos(destX, destY, destZ);
Block destBlock = world.getBlockState(dest).getBlock();
//Checks whether the destination is fire
if(destBlock == Blocks.FIRE)
{
validDest = ((GreenFlamesBase) FloocraftBase.greenFlamesTemp).isInFireplace(world, dest);
}
//Checks whether the destination is busy or idle green flames
else if(destBlock == FloocraftBase.greenFlamesBusy || destBlock == FloocraftBase.greenFlamesIdle)
{
validDest = true;
}
Block initBlock = world.getBlockState(new BlockPos(initX, initY, initZ)).getBlock();
//Checks whether the player is currently in busy or idle green flames
if(validDest && (initBlock == FloocraftBase.greenFlamesBusy || initBlock == FloocraftBase.greenFlamesIdle))
{
//Get the fire ready...
if(destBlock == Blocks.FIRE)
{
world.setBlockState(dest, FloocraftBase.greenFlamesTemp.getDefaultState());
}
//...then do the teleport
PacketHandler.INSTANCE.sendTo(new MessageDoGreenFlash(), player);
if(player.isRiding())
{
player.dismountRidingEntity();
}
player.connection.setPlayerLocation(destX + 0.5D, destY, destZ + 0.5D, player.getRNG().nextFloat() * 360, player.rotationPitch);
player.fallDistance = 0.0F;
BlockPos init = new BlockPos(initX, initY, initZ);
int m = (Integer)world.getBlockState(init).getValue(GreenFlamesBusy.AGE);
if(m < 2)
{
world.setBlockState(init, Blocks.FIRE.getDefaultState());
}
else
{
world.setBlockState(init, FloocraftBase.greenFlamesBusy.getDefaultState().withProperty(GreenFlamesBusy.AGE, m == 9 ? 9 : m - 1), 2);
}
}
}
});
return null;
}
@Override
public void fromBytes(ByteBuf buf)
{
this.initX = buf.readInt();
this.initY = buf.readInt();
this.initZ = buf.readInt();
this.destX = buf.readInt();
this.destY = buf.readInt();
this.destZ = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf)
{
buf.writeInt(initX);
buf.writeInt(initY);
buf.writeInt(initZ);
buf.writeInt(destX);
buf.writeInt(destY);
buf.writeInt(destZ);
}
}