use of com.github.steveice10.mc.protocol.data.game.entity.metadata.Position in project DragonProxy by DragonetMC.
the class ChunkCache method getBlock.
public final ItemStack getBlock(Position position) {
ChunkPos columnPos = new ChunkPos(position.getX() >> 4, position.getZ() >> 4);
if (chunkCache.containsKey(columnPos))
try {
Column column = chunkCache.get(columnPos);
BlockPosition blockPos = columnPos.getBlockInChunk(position.getX(), position.getY(), position.getZ());
Chunk chunk = column.getChunks()[position.getY() >> 4];
if (chunk != null) {
BlockState block = chunk.getBlocks().get(blockPos.x, blockPos.y, blockPos.z);
return new ItemStack(block.getId(), 1, block.getData());
}
} catch (java.lang.ArrayIndexOutOfBoundsException ex) {
this.session.getProxy().getLogger().severe("(getBlock(" + position.toString() + ")) fail to get chunk " + (position.getX() >> 4) + "/" + (position.getY() >> 4) + "/" + (position.getZ() >> 4));
ex.printStackTrace();
}
return null;
}
use of com.github.steveice10.mc.protocol.data.game.entity.metadata.Position in project DragonProxy by DragonetMC.
the class PEInventoryTransactionPacketTranslator method translate.
@Override
public Packet[] translate(UpstreamSession session, InventoryTransactionPacket packet) {
// /!\ THIS IS A SIMPLE HANDLING WITHOUT JAVA DENY TRANSACTION
switch(packet.transactionType) {
case // 0 INVENTORY & CHEST
InventoryTransactionPacket.TYPE_NORMAL:
// System.out.println("TYPE_NORMAL");
Slot cursor = null;
if (// main inventory
packet.actions.length <= 2 && packet.actions[0].sourceType == InventoryTransactionAction.SOURCE_WORLD && packet.actions[1].containerId == ContainerId.INVENTORY.getId()) {
// drop item
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.DROP_ITEM, new Position(0, 0, 0), BlockFace.DOWN);
return new Packet[] { act };
}
// System.out.println("packet.actions[1].containerId " + packet.actions[1].containerId);
if (packet.actions.length == 2 && packet.actions[0].sourceType == InventoryTransactionAction.SOURCE_CONTAINER && packet.actions[1].containerId == ContainerId.CURSOR.getId()) {
// desktop version: click on an item (maybe pick/place/merge/swap)
// System.out.println("packet.actions[0].oldItem " + packet.actions[0].oldItem);
// System.out.println("packet.actions[0].newItem " + packet.actions[0].newItem);
// System.out.println("packet.actions[1].oldItem " + packet.actions[1].oldItem);
// System.out.println("packet.actions[1].newItem " + packet.actions[1].newItem);
// set the cursor
cursor = packet.actions[0].oldItem;
int windowID = 0;
if (session.getDataCache().containsKey(CacheKey.CURRENT_WINDOW_ID))
windowID = (int) session.getDataCache().get(CacheKey.CURRENT_WINDOW_ID);
int size = 0;
if (session.getDataCache().containsKey(CacheKey.CURRENT_WINDOW_SIZE))
size = (int) session.getDataCache().get(CacheKey.CURRENT_WINDOW_SIZE);
int slot = packet.actions[0].slotId;
int slotBE = packet.actions[0].slotId;
if (windowID == 0) {
// Player inventory, no window
if (// Main Inventory
packet.actions[0].containerId == ContainerId.INVENTORY.getId())
if (// hotbar
slot < 9)
slot += size;
if (packet.actions[0].containerId == ContainerId.ARMOR.getId())
slot += 5;
if (// Crafting grid, not sure why 2 ids
packet.actions[0].containerId == -2 || packet.actions[0].containerId == -3)
slot += 1;
} else {
if (packet.actions[0].containerId == ContainerId.INVENTORY.getId()) {
// if 0, source is player inv
if (// Top Inventory
slot >= 9)
slot -= 9;
else
// Hotbar offset
slot += size + 27;
}
}
// System.out.println("interact in chest (" + packet.actions[0].containerId + ") slot JE: " + slot + " BE:" + slotBE);
// send action to server
ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(// window id
windowID, // transaction id
session.getWindowCache().currentTransactionId.incrementAndGet(), // slot
slot, ItemBlockTranslator.translateToPC(cursor), WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK);
// System.out.println("WINDOWACTIONPACKET \n" + DebugTools.getAllFields(windowActionPacket));
session.getDownstream().send(windowActionPacket);
// after the previous one, we can detect SHIFT click or move items on mobile devices
// if (packet.actions.length == 2 && packet.actions[0].sourceType == InventoryTransactionAction.SOURCE_CONTAINER && packet.actions[1].sourceType == InventoryTransactionAction.SOURCE_CONTAINER)
// mobile version: move item
// desktop version: SHIFT-click item
// System.out.println("Move item from " + packet.actions[0].containerId + " slot " + packet.actions[0].slotId
// + " to " + packet.actions[1].containerId + " slot " + packet.actions[1].slotId);
}
// it's okay to return null
return null;
case // 1
InventoryTransactionPacket.TYPE_MISMATCH:
// System.out.println("TYPE_MISMATCH");
break;
case // 2
InventoryTransactionPacket.TYPE_USE_ITEM:
// System.out.println("TYPE_USE_ITEM");
UseItemData useItemData = (UseItemData) packet.transactionData;
if (useItemData.itemInHand.id == 346) {
AddEntityPacket pk = new AddEntityPacket();
return new Packet[] { new ClientPlayerUseItemPacket(Hand.MAIN_HAND) };
}
if (useItemData.blockPos.equals(new BlockPosition(0, 0, 0)))
return new Packet[] { new ClientPlayerUseItemPacket(Hand.MAIN_HAND) };
switch(useItemData.actionType) {
case // 2
InventoryTransactionPacket.USE_ITEM_ACTION_BREAK_BLOCK:
{
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.START_DIGGING, new Position(useItemData.blockPos.x, useItemData.blockPos.y, useItemData.blockPos.z), MagicValues.key(BlockFace.class, useItemData.face));
session.getDataCache().put(CacheKey.BLOCK_BREAKING_POSITION, act.getPosition());
return new Packet[] { act };
}
// 0
case InventoryTransactionPacket.USE_ITEM_ACTION_CLICK_BLOCK:
case // 1
InventoryTransactionPacket.USE_ITEM_ACTION_CLICK_AIR:
{
ClientPlayerPlaceBlockPacket placePacket = new ClientPlayerPlaceBlockPacket(new Position(useItemData.blockPos.x, useItemData.blockPos.y, useItemData.blockPos.z), ItemBlockTranslator.translateToPC(useItemData.face), Hand.MAIN_HAND, useItemData.clickPos.x, useItemData.clickPos.y, useItemData.clickPos.z);
return new Packet[] { placePacket, new ClientPlayerSwingArmPacket(Hand.MAIN_HAND) };
}
}
case // 3
InventoryTransactionPacket.TYPE_USE_ITEM_ON_ENTITY:
// System.out.println("TYPE_USE_ITEM_ON_ENTITY");
UseItemOnEntityData useItemOnEntityData = (UseItemOnEntityData) packet.transactionData;
CachedEntity cachedEntity = session.getEntityCache().getByLocalEID(useItemOnEntityData.entityRuntimeId);
if (cachedEntity == null)
return null;
InteractAction interractAction = InteractAction.INTERACT;
if (useItemOnEntityData.actionType == InventoryTransactionPacket.USE_ITEM_ON_ENTITY_ACTION_ATTACK)
interractAction = InteractAction.ATTACK;
ClientPlayerInteractEntityPacket interractPacket = new ClientPlayerInteractEntityPacket((int) cachedEntity.eid, interractAction);
return new Packet[] { interractPacket };
case // 4
InventoryTransactionPacket.TYPE_RELEASE_ITEM:
// System.out.println("TYPE_RELEASE_ITEM");
if (((ReleaseItemData) packet.transactionData).actionType == 0)
return new Packet[] { new ClientPlayerUseItemPacket(Hand.MAIN_HAND), new ClientPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM, new Position(0, 0, 0), BlockFace.DOWN) };
ReleaseItemData releaseItemData = (ReleaseItemData) packet.transactionData;
}
return null;
}
use of com.github.steveice10.mc.protocol.data.game.entity.metadata.Position in project DragonProxy by DragonetMC.
the class PEPlayerActionPacketTranslator method translate.
public Packet[] translate(UpstreamSession session, PlayerActionPacket packet) {
if (packet.action == PlayerActionPacket.ACTION_RESPAWN) {
return new Packet[] { new ClientRequestPacket(ClientRequest.RESPAWN) };
}
if (packet.action == PlayerActionPacket.ACTION_START_SPRINT) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.START_SPRINTING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_STOP_SPRINT) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.STOP_SPRINTING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_START_GLIDE) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.START_ELYTRA_FLYING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_STOP_GLIDE) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.START_ELYTRA_FLYING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_START_SNEAK) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.START_SNEAKING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_STOP_SNEAK) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.STOP_SNEAKING);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_STOP_SLEEPING) {
ClientPlayerStatePacket stat = new ClientPlayerStatePacket((int) session.getDataCache().get(CacheKey.PLAYER_EID), PlayerState.LEAVE_BED);
return new Packet[] { stat };
}
if (packet.action == PlayerActionPacket.ACTION_DROP_ITEM) {
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.DROP_ITEM, new Position(0, 0, 0), BlockFace.UP);
return new Packet[] { act };
}
if (packet.action == PlayerActionPacket.ACTION_START_BREAK) {
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.START_DIGGING, new Position(packet.position.x, packet.position.y, packet.position.z), MagicValues.key(BlockFace.class, packet.face));
session.getDataCache().put(CacheKey.BLOCK_BREAKING_POSITION, act.getPosition());
return new Packet[] { act };
}
if (session.getDataCache().containsKey(CacheKey.BLOCK_BREAKING_POSITION)) {
if (packet.action == PlayerActionPacket.ACTION_STOP_BREAK) {
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.FINISH_DIGGING, (Position) session.getDataCache().remove(CacheKey.BLOCK_BREAKING_POSITION), MagicValues.key(BlockFace.class, packet.face));
return new Packet[] { act };
}
if (packet.action == PlayerActionPacket.ACTION_ABORT_BREAK) {
ClientPlayerActionPacket act = new ClientPlayerActionPacket(com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction.CANCEL_DIGGING, (Position) session.getDataCache().remove(CacheKey.BLOCK_BREAKING_POSITION), MagicValues.key(BlockFace.class, packet.face));
return new Packet[] { act };
}
}
return null;
}
use of com.github.steveice10.mc.protocol.data.game.entity.metadata.Position in project DragonProxy by DragonetMC.
the class PEBlockPickRequestPacketTranslator method translate.
@Override
public Packet[] translate(UpstreamSession session, BlockPickRequestPacket packet) {
ItemStack item = session.getChunkCache().getBlock(new Position(packet.x, packet.y, packet.z));
int selectedSlot = (int) session.getDataCache().getOrDefault(CacheKey.PLAYER_SELECTED_SLOT, 36);
ClientCreativeInventoryActionPacket backPacket = new ClientCreativeInventoryActionPacket(selectedSlot + 36, item);
// System.out.println("BlockPickRequestPacket " + DebugTools.getAllFields(packet));
// System.out.println("ItemStack " + DebugTools.getAllFields(item));
session.getChunkCache().getDebugGrid();
return new Packet[] { backPacket };
}
use of com.github.steveice10.mc.protocol.data.game.entity.metadata.Position in project DragonProxy by DragonetMC.
the class PEMovePlayerPacketTranslator method translate.
public Packet[] translate(UpstreamSession session, MovePlayerPacket packet) {
CachedEntity entity = session.getEntityCache().getClientEntity();
if (entity.riding != 0 && packet.ridingRuntimeId != 0) {
// Riding case
ClientVehicleMovePacket pk = new ClientVehicleMovePacket(packet.position.x, packet.position.y - EntityType.PLAYER.getOffset(), packet.position.z, packet.yaw, packet.pitch);
session.getDownstream().send(pk);
} else {
// not riding
ClientPlayerPositionRotationPacket pk = new ClientPlayerPositionRotationPacket(packet.onGround, packet.position.x, // To simplify the movements
ceilToHalf(packet.position.y - EntityType.PLAYER.getOffset()), packet.position.z, packet.yaw, packet.pitch);
// Special blocks handling
boolean isColliding = false;
BlockPosition blockPos = new BlockPosition(NukkitMath.floorDouble(packet.position.x), NukkitMath.floorDouble(packet.position.y), NukkitMath.floorDouble(packet.position.z));
// System.out.println("block " + blockPos.toString());
try {
ItemEntry PEBlock = session.getChunkCache().translateBlock(blockPos.asPosition());
if (PEBlock != null) {
Block b = Block.get(PEBlock.getId(), PEBlock.getPEDamage(), blockPos);
if (b != null && b.collidesWithBB(session.getEntityCache().getClientEntity().boundingBox.clone())) {
DragonProxy.getInstance().getLogger().info("Player position : " + entity.x + ", " + entity.y + ", " + entity.z + " collide with " + b.getClass().getSimpleName() + " on " + blockPos.toString());
isColliding = true;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
entity.absoluteMove(pk.getX(), pk.getY(), pk.getZ(), (float) pk.getYaw(), (float) pk.getPitch());
if (!isColliding) {
session.getDownstream().send(pk);
session.getChunkCache().sendOrderedChunks();
}
}
return null;
}
Aggregations