use of com.github.steveice10.mc.protocol.data.game.chunk.Chunk in project DragonProxy by DragonetMC.
the class PCPlayerPositionRotationPacketTranslator method translate.
@Override
public PEPacket[] translate(UpstreamSession session, ServerPlayerPositionRotationPacket packet) {
CachedEntity entityPlayer = session.getEntityCache().getClientEntity();
if (entityPlayer == null) {
// disconnect (important missing data)
}
if (!session.isSpawned()) {
if (session.getDataCache().get(CacheKey.PACKET_JOIN_GAME_PACKET) == null) {
session.disconnect(session.getProxy().getLang().get(Lang.MESSAGE_REMOTE_ERROR));
return null;
}
ServerJoinGamePacket restored = (ServerJoinGamePacket) session.getDataCache().remove(CacheKey.PACKET_JOIN_GAME_PACKET);
if (!session.getProxy().getAuthMode().equalsIgnoreCase("online")) {
StartGamePacket ret = new StartGamePacket();
ret.rtid = entityPlayer.proxyEid;
ret.eid = entityPlayer.proxyEid;
ret.dimension = entityPlayer.dimention;
ret.seed = 0;
ret.generator = 1;
ret.gamemode = restored.getGameMode() == GameMode.CREATIVE ? 1 : 0;
ret.spawnPosition = new BlockPosition((int) packet.getX(), (int) packet.getY(), (int) packet.getZ());
ret.position = new Vector3F((float) packet.getX(), (float) packet.getY() + EntityType.PLAYER.getOffset() + 0.1f, (float) packet.getZ());
ret.yaw = packet.getYaw();
ret.pitch = packet.getPitch();
ret.levelId = "";
ret.worldName = "World";
ret.commandsEnabled = true;
ret.defaultPlayerPermission = 2;
ret.premiumWorldTemplateId = "";
ret.difficulty = restored.getDifficulty();
session.sendPacket(ret, true);
}
entityPlayer.absoluteMove(packet.getX(), packet.getY() + entityPlayer.peType.getOffset() + 0.1f, packet.getZ(), packet.getYaw(), packet.getPitch());
session.getChunkCache().sendOrderedChunks();
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("DragonProxy");
ClientPluginMessagePacket clientPluginMessagePacket = new ClientPluginMessagePacket("MC|Brand", out.toByteArray());
((PCDownstreamSession) session.getDownstream()).send(clientPluginMessagePacket);
LoginPacket loginpacket = (LoginPacket) session.getDataCache().remove(CacheKey.PACKET_LOGIN_PACKET);
String clientLanguage = loginpacket.decoded.clientData.has("LanguageCode") ? loginpacket.decoded.clientData.get("LanguageCode").getAsString() : "en_US";
session.getDataCache().put(CacheKey.PLAYER_LANGUAGE, clientLanguage);
ClientSettingsPacket clientSettingsPacket = new ClientSettingsPacket(clientLanguage, (int) session.getDataCache().getOrDefault(CacheKey.PLAYER_REQUESTED_CHUNK_RADIUS, 5), ChatVisibility.FULL, false, new SkinPart[] {}, Hand.OFF_HAND);
((PCDownstreamSession) session.getDownstream()).send(clientSettingsPacket);
UpdateAttributesPacket attr = new UpdateAttributesPacket();
attr.rtid = entityPlayer.proxyEid;
if (entityPlayer.attributes.isEmpty()) {
attr.entries = new ArrayList();
attr.entries.addAll(PEEntityAttribute.getDefault());
} else
attr.entries = entityPlayer.attributes.values();
session.sendPacket(attr, true);
AdventureSettingsPacket adv = new AdventureSettingsPacket();
// flags
adv.setFlag(AdventureSettingsPacket.WORLD_IMMUTABLE, restored.getGameMode().equals(GameMode.ADVENTURE));
// adv.setFlag(AdventureSettingsPacket.NO_PVP, true);
// adv.setFlag(AdventureSettingsPacket.AUTO_JUMP, true);
adv.setFlag(AdventureSettingsPacket.ALLOW_FLIGHT, restored.getGameMode().equals(GameMode.CREATIVE) || restored.getGameMode().equals(GameMode.SPECTATOR));
adv.setFlag(AdventureSettingsPacket.NO_CLIP, restored.getGameMode().equals(GameMode.SPECTATOR));
adv.setFlag(AdventureSettingsPacket.WORLD_BUILDER, !restored.getGameMode().equals(GameMode.SPECTATOR) || !restored.getGameMode().equals(GameMode.ADVENTURE));
adv.setFlag(AdventureSettingsPacket.FLYING, restored.getGameMode().equals(GameMode.SPECTATOR));
adv.setFlag(AdventureSettingsPacket.MUTED, false);
// custom permission flags (not necessary for now when using LEVEL_PERMISSION setting)
// adv.setFlag(AdventureSettingsPacket.BUILD_AND_MINE, true);adv.setFlag(AdventureSettingsPacket.BUILD_AND_MINE, true);
// adv.setFlag(AdventureSettingsPacket.DOORS_AND_SWITCHES, true);
// adv.setFlag(AdventureSettingsPacket.OPEN_CONTAINERS, true);
// adv.setFlag(AdventureSettingsPacket.ATTACK_PLAYERS, true);
// adv.setFlag(AdventureSettingsPacket.ATTACK_MOBS, true);
// adv.setFlag(AdventureSettingsPacket.OPERATOR, true);
// adv.setFlag(AdventureSettingsPacket.TELEPORT, true);
adv.eid = entityPlayer.proxyEid;
// TODO update this with server configiration
adv.commandsPermission = AdventureSettingsPacket.PERMISSION_NORMAL;
// TODO update this with server configiration
adv.playerPermission = AdventureSettingsPacket.LEVEL_PERMISSION_MEMBER;
session.sendPacket(adv, true);
SetEntityDataPacket entityData = new SetEntityDataPacket();
entityData.rtid = entityPlayer.proxyEid;
entityData.meta = EntityMetaData.createDefault();
session.sendPacket(entityData, true);
if (restored.getGameMode().equals(GameMode.CREATIVE))
session.sendCreativeInventory();
if (session.getProxy().getAuthMode().equalsIgnoreCase("online")) {
MovePlayerPacket pk = new MovePlayerPacket();
pk.rtid = entityPlayer.proxyEid;
pk.mode = MovePlayerPacket.MODE_TELEPORT;
pk.position = new Vector3F((float) packet.getX(), (float) packet.getY() + EntityType.PLAYER.getOffset() + 0.1f, (float) packet.getZ());
pk.yaw = packet.getYaw();
pk.pitch = packet.getPitch();
pk.headYaw = packet.getYaw();
if (entityPlayer.riding != 0) {
CachedEntity vehicle = session.getEntityCache().getByLocalEID(entityPlayer.riding);
if (vehicle != null)
pk.ridingRuntimeId = vehicle.eid;
}
session.sendPacket(pk, true);
}
// Notify the server
BinaryStream bis = new BinaryStream();
// command
bis.putString("Notification");
ClientPluginMessagePacket pluginMessage = new ClientPluginMessagePacket("DragonProxy", bis.get());
session.getDownstream().send(pluginMessage);
session.setSpawned();
DragonProxy.getInstance().getLogger().info("Spawning " + session.getUsername() + " in world " + entityPlayer.dimention + " at " + entityPlayer.x + "/" + entityPlayer.y + "/" + entityPlayer.z);
// send the confirmation
ClientTeleportConfirmPacket confirm = new ClientTeleportConfirmPacket(packet.getTeleportId());
((PCDownstreamSession) session.getDownstream()).send(confirm);
PlayerListPacket playerListPacket = new PlayerListPacket();
Set<org.dragonet.protocol.type.PlayerListEntry> peEntries = new HashSet();
for (CachedEntity entity : session.getEntityCache().getEntities().values()) {
if (entity.peType == EntityType.PLAYER) {
PlayerListEntry playerListEntry = session.getPlayerInfoCache().get(entity.playerUniqueId);
org.dragonet.protocol.type.PlayerListEntry peEntry = new org.dragonet.protocol.type.PlayerListEntry();
peEntry.uuid = entity.playerUniqueId;
peEntry.eid = entity.eid;
peEntry.username = playerListEntry.getProfile().getName();
peEntry.skin = Skin.DEFAULT_SKIN_STEVE;
peEntry.xboxUserId = "null";
peEntries.add(peEntry);
}
entity.spawn(session);
}
playerListPacket.type = PlayerListPacket.TYPE_ADD;
playerListPacket.entries = peEntries.toArray(new org.dragonet.protocol.type.PlayerListEntry[peEntries.size()]);
session.sendPacket(playerListPacket);
entityPlayer.spawned = true;
return null;
}
entityPlayer.absoluteMove(packet.getX(), packet.getY() + entityPlayer.peType.getOffset() + 0.1f, packet.getZ(), packet.getYaw(), packet.getPitch());
session.getChunkCache().sendOrderedChunks();
float offset = 0.01f;
byte mode = MovePlayerPacket.MODE_NORMAL;
ChunkPos chunk = new ChunkPos(NukkitMath.ceilDouble(packet.getX()) >> 4, NukkitMath.ceilDouble(packet.getZ()) >> 4);
// check if destination is out of range
if (!session.getChunkCache().getLoadedChunks().contains(chunk)) {
mode = MovePlayerPacket.MODE_TELEPORT;
offset = 0.2f;
// System.out.println(packet.getX() + " " + packet.getZ());
// System.out.println("out of range !" + chunk.toString());
session.getChunkCache().sendOrderedChunks();
// session.getChunkCache().getDebugGrid();
}
MovePlayerPacket pk = new MovePlayerPacket();
pk.rtid = entityPlayer.proxyEid;
pk.mode = mode;
pk.position = new Vector3F((float) packet.getX(), (float) packet.getY() + EntityType.PLAYER.getOffset() + offset, (float) packet.getZ());
pk.yaw = packet.getYaw();
pk.pitch = packet.getPitch();
pk.headYaw = packet.getYaw();
if (entityPlayer.riding != 0) {
CachedEntity vehicle = session.getEntityCache().getByLocalEID(entityPlayer.riding);
if (vehicle != null)
pk.ridingRuntimeId = vehicle.eid;
}
// System.out.println("From server " + packet.getX() + " " + packet.getY() + " " + packet.getZ() + " ");
// System.out.println("Entity position " + entityPlayer.x + " " + (entityPlayer.y - EntityType.PLAYER.getOffset()) + " " + entityPlayer.z + " ");
session.sendPacket(pk);
// send the confirmation
ClientTeleportConfirmPacket confirm = new ClientTeleportConfirmPacket(packet.getTeleportId());
((PCDownstreamSession) session.getDownstream()).send(confirm);
return null;
}
use of com.github.steveice10.mc.protocol.data.game.chunk.Chunk in project DragonProxy by DragonetMC.
the class ChunkCache method update.
public void update(Position position, BlockState block) {
ChunkPos columnPos = new ChunkPos(position.getX() >> 4, position.getZ() >> 4);
// System.out.println("translateBlock Position " + position.toString());
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)
chunk.getBlocks().set(blockPos.x, blockPos.y, blockPos.z, block);
} catch (java.lang.ArrayIndexOutOfBoundsException ex) {
this.session.getProxy().getLogger().info("update(" + position.toString() + ", " + block.toString() + ")) fail to get chunk " + (position.getX() >> 4) + "/" + (position.getY() >> 4) + "/" + (position.getZ() >> 4));
ex.printStackTrace();
}
// enqueue block update
}
use of com.github.steveice10.mc.protocol.data.game.chunk.Chunk 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.chunk.Chunk in project DragonProxy by DragonetMC.
the class ChunkCache method translateChunk.
public final ChunkData translateChunk(int columnX, int columnZ) {
ChunkPos columnPos = new ChunkPos(columnX, columnZ);
if (chunkCache.containsKey(columnPos)) {
Column column = chunkCache.get(columnPos);
ChunkData chunk = new ChunkData();
chunk.sections = new Section[16];
for (int i = 0; i < 16; i++) chunk.sections[i] = new Section();
// Blocks
for (int y = 0; y < 256; y++) {
int cy = y >> 4;
Chunk c = null;
try {
c = column.getChunks()[cy];
} catch (Exception ex) {
DragonProxy.getInstance().getLogger().info("Chunk " + columnX + ", " + cy + ", " + columnZ + " not exist !");
}
if (c == null || c.isEmpty())
continue;
BlockStorage blocks = c.getBlocks();
for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) {
BlockState block = blocks.get(x, y & 0xF, z);
ItemEntry entry = ItemBlockTranslator.translateToPE(block.getId(), block.getData());
Section section = chunk.sections[cy];
// Block id
section.blockIds[index(x, y, z)] = (byte) (entry.getId() & 0xFF);
// Data value
int i = dataIndex(x, y, z);
byte data = section.blockMetas[i];
int newValue = entry.getPEDamage().byteValue();
if ((y & 1) == 0)
data = (byte) ((data & 0xf0) | (newValue & 0x0f));
else
data = (byte) (((newValue & 0x0f) << 4) | (data & 0x0f));
section.blockMetas[i] = data;
}
}
// Blocks entities
try {
List<CompoundTag> blockEntities = new ArrayList<>();
for (int i = 0; i < column.getTileEntities().length; i++) {
CompoundTag peTag = ItemBlockTranslator.translateBlockEntityToPE(column.getTileEntities()[i]);
if (// filter non handled blocks entities
peTag != null)
blockEntities.add(peTag);
// else // debug
// DragonProxy.getInstance().getLogger().debug("NBT null for " + pc.getTileEntities()[i].toString());
}
chunk.blockEntities = NBTIO.write(blockEntities, ByteOrder.LITTLE_ENDIAN, true);
} catch (IOException ex) {
ex.printStackTrace();
}
chunk.encode();
return chunk;
}
// System.out.println("Chunk " + columnX + ", " + columnZ + " not in cache !!!!!!!!!!!!!");
return null;
}
use of com.github.steveice10.mc.protocol.data.game.chunk.Chunk in project DragonProxy by DragonetMC.
the class ChunkCache method translateBlock.
public final ItemEntry translateBlock(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 ItemBlockTranslator.translateToPE(block.getId(), block.getData());
}
} catch (java.lang.ArrayIndexOutOfBoundsException ex) {
this.session.getProxy().getLogger().info("getBlock(" + position.toString() + ")) fail to get chunk " + (position.getX() >> 4) + "/" + (position.getY() >> 4) + "/" + (position.getZ() >> 4));
ex.printStackTrace();
}
return null;
}
Aggregations