package net.CyanWool.network.handlers; import net.CyanWool.CyanServer; import net.CyanWool.api.block.Block; import net.CyanWool.api.entity.component.InventoryComponent; import net.CyanWool.api.entity.component.MovementComponent; import net.CyanWool.api.entity.player.Player; import net.CyanWool.api.inventory.ItemStack; import net.CyanWool.api.utils.ChatColors; import net.CyanWool.entity.meta.ClientSettings; import net.CyanWool.entity.player.CyanPlayer; import org.spacehq.mc.auth.GameProfile; import org.spacehq.mc.protocol.ProtocolConstants; import org.spacehq.mc.protocol.data.game.values.ClientRequest; import org.spacehq.mc.protocol.data.game.values.entity.player.PlayerAction; import org.spacehq.mc.protocol.packet.ingame.client.ClientChatPacket; import org.spacehq.mc.protocol.packet.ingame.client.ClientRequestPacket; import org.spacehq.mc.protocol.packet.ingame.client.ClientSettingsPacket; import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket; import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionPacket; import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerRotationPacket; import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerStatePacket; import org.spacehq.packetlib.event.session.PacketReceivedEvent; import org.spacehq.packetlib.event.session.SessionAdapter; public class PlaySessionAdapter extends SessionAdapter { private CyanServer server; public PlaySessionAdapter(CyanServer server) { this.server = server; } @Override public void packetReceived(PacketReceivedEvent event) { if (event.getPacket() instanceof ClientSettingsPacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientSettingsPacket packet = event.getPacket(); ClientSettings settings = new ClientSettings(packet); ((CyanPlayer) player).setSettings(settings); } else if (event.getPacket() instanceof ClientChatPacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientChatPacket packet = event.getPacket(); String message = ChatColors.translateAlternateColorCodes('&', packet.getMessage()); if (packet.getMessage().startsWith("/")) { String cmd = packet.getMessage().substring(1); server.getCommandManager().dispatchCommand(player, cmd); } else { player.chat(message); } } else if (event.getPacket() instanceof ClientPlayerStatePacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientPlayerStatePacket packet = event.getPacket(); switch (packet.getState()) { case START_SNEAKING: if (player.getComponentManager().hasComponent("movement")) { MovementComponent component = (MovementComponent) player.getComponentManager().getComponent("movement"); component.setSneaking(true); } break; case STOP_SNEAKING: if (player.getComponentManager().hasComponent("movement")) { MovementComponent component = (MovementComponent) player.getComponentManager().getComponent("movement"); component.setSneaking(false); } break; case START_SPRINTING: if (player.getComponentManager().hasComponent("movement")) { MovementComponent component = (MovementComponent) player.getComponentManager().getComponent("movement"); component.setSprinting(true); } break; case STOP_SPRINTING: if (player.getComponentManager().hasComponent("movement")) { MovementComponent component = (MovementComponent) player.getComponentManager().getComponent("movement"); component.setSprinting(false); } break; case RIDING_JUMP: if (player.getComponentManager().hasComponent("movement")) { MovementComponent component = (MovementComponent) player.getComponentManager().getComponent("movement"); component.setJumping(true); } break; case OPEN_INVENTORY: break; case LEAVE_BED: player.wakeUp(); break; } } else if (event.getPacket() instanceof ClientPlayerPositionPacket) { // TODO GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientPlayerPositionPacket pack = event.getPacket(); if (player == null || !player.isMoveable()) return; player.getLocation().setX(pack.getX()); player.getLocation().setY(pack.getY()); player.getLocation().setZ(pack.getZ()); } else if (event.getPacket() instanceof ClientPlayerRotationPacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientPlayerRotationPacket pack = event.getPacket(); if (player == null || !player.isMoveable()) return; player.getLocation().setPitch((float) pack.getPitch()); player.getLocation().setYaw((float) pack.getYaw()); } else if (event.getPacket() instanceof ClientPlayerPositionRotationPacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientPlayerPositionRotationPacket pack = event.getPacket(); if (player == null || !player.isMoveable()) return; player.getLocation().setX(pack.getX()); player.getLocation().setY(pack.getY()); player.getLocation().setZ(pack.getZ()); player.getLocation().setPitch((float) pack.getPitch()); player.getLocation().setYaw((float) pack.getYaw()); } else if (event.getPacket() instanceof ClientPlayerActionPacket) { GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); ClientPlayerActionPacket packet = event.getPacket(); if (packet.getAction() == PlayerAction.START_DIGGING) { Block block = player.getChunk().getBlock(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()); block.getBlockType().onBlockLeftInteract(player); block.getBlockType().onPlayerBreaking(player); // Item if (player.getComponentManager().hasComponent("inventory")) { InventoryComponent component = (InventoryComponent) player.getComponentManager().getComponent("inventory"); ItemStack item = component.getInventory().getItemInHand(); item.getItemType().onItemLeftClick(item, player); } } else if (packet.getAction() == PlayerAction.FINISH_DIGGING) { Block block = player.getChunk().getBlock(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()); block.breakBlock(); // Item if (player.getComponentManager().hasComponent("inventory")) { InventoryComponent component = (InventoryComponent) player.getComponentManager().getComponent("inventory"); ItemStack item = component.getInventory().getItemInHand(); item.getItemType().onBlockDestroyed(item, block, player); } } else if (packet.getAction() == PlayerAction.RELEASE_USE_ITEM) { if (player.getComponentManager().hasComponent("inventory")) { InventoryComponent component = (InventoryComponent) player.getComponentManager().getComponent("inventory"); ItemStack item = component.getInventory().getItemInHand(); item.getItemType().onItemRightClick(item, player); } Block block = player.getChunk().getBlock(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()); block.getBlockType().onBlockRightInteract(player); } } else if (event.getPacket() instanceof ClientRequestPacket) { ClientRequestPacket packet = event.getPacket(); GameProfile profile = event.getSession().getFlag(ProtocolConstants.PROFILE_KEY); Player player = server.getPlayer(profile.getName()); if (packet.getRequest() == ClientRequest.RESPAWN) { player.respawn(); } } } }