package com.fredtargaryen.floocraft.network.messages; import com.fredtargaryen.floocraft.DataReference; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.IThreadListener; 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; import java.util.ArrayList; import java.util.List; import static com.fredtargaryen.floocraft.FloocraftBase.flick; public class MessageFlooTorchTeleport implements IMessage, IMessageHandler<MessageFlooTorchTeleport, IMessage> { public int torchX, torchY, torchZ; @Override public IMessage onMessage(final MessageFlooTorchTeleport message, MessageContext ctx) { final EntityPlayerMP player = ctx.getServerHandler().playerEntity; final IThreadListener serverListener = player.getServerWorld(); serverListener.addScheduledTask(new Runnable() { @Override public void run() { int torchX = message.torchX; int torchY = message.torchY; int torchZ = message.torchZ; WorldServer world = (WorldServer) serverListener; int minx = torchX - 3; int maxx = torchX + 3; int minz = torchZ - 3; int maxz = torchZ + 3; int blocky = torchY; List<BlockPos> coords = new ArrayList<BlockPos>(); for (int x = minx; x <= maxx; x++) { for (int z = minz; z <= maxz; z++) { BlockPos nextPos = new BlockPos(x, blocky, z); if (world.isAirBlock(nextPos) && world.isAirBlock(nextPos.up())) { coords.add(nextPos); } } } if(coords.size() > 0) { BlockPos chosenCoord = coords.get(world.rand.nextInt(coords.size())); double x = chosenCoord.getX(); if(x < torchX) { x += 0.5; } else if(x > torchX) { x -= 0.5; } double y = chosenCoord.getY(); double z = chosenCoord.getZ(); if(z < torchZ) { z += 0.5; } else if(z > torchZ) { z -= 0.5; } if(player.isRiding()) { player.dismountRidingEntity(); } player.connection.setPlayerLocation(x, y, z, player.rotationYaw, player.rotationPitch); player.fallDistance = 0.0F; world.playSound(null, new BlockPos(torchX, torchY, torchZ), flick, SoundCategory.BLOCKS, 1.0F, 1.0F); } } }); return null; } @Override public void fromBytes(ByteBuf buf) { this.torchX = buf.readInt(); this.torchY = buf.readInt(); this.torchZ = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(this.torchX); buf.writeInt(this.torchY); buf.writeInt(this.torchZ); } }