Search in sources :

Example 1 with Session

use of com.github.steveice10.packetlib.Session in project DragonProxy by DragonetMC.

the class EntityMetaTranslator method translateToPE.

public static EntityMetaData translateToPE(UpstreamSession session, EntityMetadata[] pcMeta, EntityType type) {
    /*
     * Following format was fetched from http://wiki.vg/Entities#Entity_meta_Format
         */
    EntityMetaData peMeta = EntityMetaData.createDefault();
    // try (Timing timing = Timings.getEntityTiming(type.name())) {
    if (pcMeta == null || type == EntityType.NONE) {
        // timing.stopTiming();
        return peMeta;
    }
    // System.out.println("Entity + " + type);
    for (EntityMetadata m : pcMeta) {
        // System.out.println(m);
        boolean handle = true;
        try {
            if (m == null)
                continue;
            switch(m.getId()) {
                case // Flags
                0:
                    byte pcFlags = ((byte) m.getValue());
                    // System.out.println("PC flag: " + pcFlags);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_ONFIRE, (pcFlags & 0x01) > 0);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SNEAKING, (pcFlags & 0x02) > 0);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_RIDING, (pcFlags & 0x04) > 0);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SPRINTING, (pcFlags & 0x08) > 0);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_ACTION, (pcFlags & 0x10) > 0);
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_INVISIBLE, (pcFlags & 0x20) > 0);
                    // peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_GLOWING, (pcFlags & 0x40) > 0); //Not implemented (possible with potions)
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_GLIDING, (pcFlags & 0x80) > 0);
                    break;
                case // Air
                1:
                    peMeta.set(EntityMetaData.Constants.DATA_AIR, new ShortMeta(((Integer) m.getValue()).shortValue()));
                    break;
                case // Name tag
                2:
                    if (!m.getValue().equals("")) {
                        peMeta.set(EntityMetaData.Constants.DATA_NAMETAG, new ByteArrayMeta((String) m.getValue()));
                    }
                    break;
                case // Always show name tag
                3:
                    byte data;
                    if (m.getType() == MetadataType.BYTE) {
                        data = (byte) m.getValue();
                    } else if (m.getType() == MetadataType.INT) {
                        data = (byte) (((int) m.getValue()) & 0xFF);
                    } else {
                        data = 1;
                    }
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_CAN_SHOW_NAMETAG, data > 0);
                    break;
                case // Boolean : Is silent
                4:
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SILENT, ((boolean) m.getValue()));
                    break;
                case // Boolean : No gravity
                5:
                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_AFFECTED_BY_GRAVITY, (!((boolean) m.getValue())));
                    break;
                case 6:
                    switch(type) {
                        case // VarInt : Shaking power
                        MINECART:
                            peMeta.set(EntityMetaData.Constants.DATA_HURT_TIME, new IntegerMeta((int) m.getValue()));
                            break;
                        case // VarInt : Fuse time
                        PRIMED_TNT:
                            peMeta.set(EntityMetaData.Constants.DATA_FUSE_LENGTH, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Slot : Potion which is thrown
                        POTION:
                            peMeta.set(EntityMetaData.Constants.DATA_TYPE_SLOT, new SlotMeta(ItemBlockTranslator.translateSlotToPE((ItemStack) m.getValue())));
                            break;
                        case // Position : spawn position
                        FALLING_BLOCK:
                            peMeta.set(EntityMetaData.Constants.DATA_BLOCK_TARGET, new BlockPositionMeta(new BlockPosition((Position) m.getValue())));
                            break;
                        case // Float : Radius
                        AREA_EFFECT_CLOUD:
                            peMeta.set(EntityMetaData.Constants.DATA_AREA_EFFECT_CLOUD_RADIUS, new FloatMeta((float) m.getValue()));
                            break;
                        case // VarInt : Hooked entity id + 1, or 0 if there is no hooked entity
                        FISHING_HOOK:
                            break;
                        case // Byte : is critical
                        ARROW:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_CRITICAL, ((byte) m.getValue() & 0x01) > 0);
                            break;
                        // case TIPPED_ARROW: //VarInt : Color (-1 for no particles)
                        case // VarInt : Time since last hit
                        BOAT:
                            peMeta.set(EntityMetaData.Constants.DATA_HURT_TIME, new IntegerMeta((int) m.getValue()));
                            break;
                        case // OptPosition : Beam target
                        ENDER_CRYSTAL:
                            if (m.getValue() != null) {
                                peMeta.set(EntityMetaData.Constants.DATA_BLOCK_TARGET, new BlockPositionMeta(new BlockPosition((Position) m.getValue())));
                            }
                            break;
                        case // Boolean Invulnerable
                        WITHER_SKULL:
                            peMeta.set(EntityMetaData.Constants.DATA_WITHER_INVULNERABLE_TICKS, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Slot : Firework info
                        FIREWORKS_ROCKET:
                            peMeta.set(EntityMetaData.Constants.DATA_TYPE_SLOT, new SlotMeta(ItemBlockTranslator.translateSlotToPE((ItemStack) m.getValue())));
                            break;
                        // case ITEM_FRAME: //Slot : Item
                        case // Slot : Item
                        ITEM:
                            peMeta.set(EntityMetaData.Constants.DATA_TYPE_SLOT, new SlotMeta(ItemBlockTranslator.translateSlotToPE((ItemStack) m.getValue())));
                            break;
                        default:
                            // (all LIVING) Byte : Hand states, used to trigger blocking/eating/drinking animation.
                            if (m.getValue() instanceof Byte) {
                                peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_ACTION, ((byte) m.getValue() & 0x01) > 0);
                            } else
                                handle = false;
                            // System.out.println("case 6 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 7:
                    switch(type) {
                        // VarInt : Forward direction
                        case BOAT:
                        case // VarInt : Shaking direction
                        MINECART:
                            peMeta.set(EntityMetaData.Constants.DATA_HURT_DIRECTION, new IntegerMeta((int) m.getValue()));
                            break;
                        case // VarInt : Color (only for mob spell particle)
                        AREA_EFFECT_CLOUD:
                            peMeta.set(EntityMetaData.Constants.DATA_AREA_EFFECT_CLOUD_WAITING, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Boolean : Show bottom
                        ENDER_CRYSTAL:
                            break;
                        case // VarInt : Entity ID of entity which used firework (for elytra boosting)
                        FIREWORKS_ROCKET:
                            peMeta.set(EntityMetaData.Constants.DATA_OWNER_EID, new IntegerMeta((int) m.getValue()));
                            break;
                        case ARROW:
                            break;
                        // break;
                        default:
                            // (all LIVING) Float : Health
                            if (m.getValue() instanceof Float) {
                                peMeta.set(EntityMetaData.Constants.DATA_HEALTH, new IntegerMeta((int) ((float) m.getValue())));
                            } else
                                handle = false;
                            // System.out.println("case 7 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 8:
                    switch(type) {
                        case // Boolean : Ignore radius and show effect as single point, not area
                        AREA_EFFECT_CLOUD:
                            break;
                        // Float : Shaking multiplier
                        case MINECART:
                        case // Float : Damage taken
                        BOAT:
                            break;
                        default:
                            // (all LIVING) VarInt : Potion effect color (or 0 if there is no effect)
                            peMeta.set(EntityMetaData.Constants.DATA_POTION_COLOR, new ByteMeta((byte) ((int) m.getValue() & 0xFF)));
                            // System.out.println("case 8 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 9:
                    switch(type) {
                        case // VarInt : Custom block ID and damage
                        MINECART:
                            peMeta.set(EntityMetaData.Constants.DATA_MINECART_DISPLAY_BLOCK, new IntegerMeta((int) m.getValue()));
                            break;
                        case // VarInt : Particle ID
                        AREA_EFFECT_CLOUD:
                            peMeta.set(EntityMetaData.Constants.DATA_AREA_EFFECT_CLOUD_PARTICLE_ID, new IntegerMeta((int) m.getValue()));
                            break;
                        case // VarInt : Type (0=oak, 1=spruce, 2=birch, 3=jungle, 4=acacia, 5=dark oak)
                        BOAT:
                            peMeta.set(20, /* woodID */
                            new ByteMeta((byte) ((Integer) m.getValue()).byteValue()));
                            break;
                        default:
                            // (all LIVING) Boolean : Is potion effect ambient: reduces the number of particles generated by potions to 1/5 the normal amount
                            peMeta.set(EntityMetaData.Constants.DATA_POTION_AMBIENT, new ByteMeta((byte) (((boolean) m.getValue()) ? 0x01 : 0x00)));
                            // System.out.println("case 9 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 10:
                    switch(type) {
                        case // VarInt : Custom block Y position (in 16ths of a block)
                        MINECART:
                            peMeta.set(EntityMetaData.Constants.DATA_MINECART_DISPLAY_OFFSET, new IntegerMeta((int) m.getValue()));
                            break;
                        case // VarInt : Particle parameter 1
                        AREA_EFFECT_CLOUD:
                            break;
                        case // Boolean : Right paddle turning
                        BOAT:
                            peMeta.set(EntityMetaData.Constants.DATA_PADDLE_TIME_RIGHT, new IntegerMeta(20));
                            break;
                        default:
                            // Not supported yet
                            break;
                    }
                    break;
                case 11:
                    switch(type) {
                        case // Boolean : Show custom block
                        MINECART:
                            peMeta.set(EntityMetaData.Constants.DATA_MINECART_HAS_DISPLAY, new ByteMeta((byte) (((boolean) m.getValue()) ? 0x01 : 0x00)));
                            break;
                        case // VarInt : Particle parameter 2
                        AREA_EFFECT_CLOUD:
                            break;
                        case // Boolean : Left paddle turning
                        BOAT:
                            peMeta.set(EntityMetaData.Constants.DATA_PADDLE_TIME_LEFT, new IntegerMeta(20));
                            break;
                        case // Byte : see http://wiki.vg/Entity_metadata#ArmorStand
                        ARMOR_STAND:
                            break;
                        case // Float : Additional Hearts
                        PLAYER:
                            // Not supported yet
                            break;
                        default:
                            // System.out.println("case 11 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 12:
                    switch(type) {
                        case MINECART:
                            if (m.getValue() instanceof Boolean) {
                                // Boolean : Is powered
                                peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_POWERED, ((boolean) m.getValue()));
                            }
                            if (m.getValue() instanceof String) {
                            // String : Command
                            // 
                            }
                            break;
                        case // Rotation : Head rotation
                        ARMOR_STAND:
                            break;
                        case // Byte : Is hanging
                        BAT:
                            // peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SITTING, (((byte) m.getValue()) ? 0x01 : 0x00)); //wrong data
                            break;
                        // Byte : Is player-created
                        case IRON_GOLEM:
                        // Byte : has no pumpkin hat
                        case SNOWMAN:
                        case // Direction : Facing direction
                        SHULKER:
                            break;
                        case // Byte : 0x01 = Is on fire
                        BLAZE:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_ONFIRE, ((byte) m.getValue()) == 0x01);
                            break;
                        // VarInt	State (-1 = idle, 1 = fuse)
                        case CREEPER:
                        // Byte	Spell (0: none, 1: summon vex, 2: attack, 3: wololo)
                        case EVOCATION_ILLAGER:
                        // Byte : 0x01 = Is in attack mode
                        case VEX:
                        // Byte : 0x01 = Has target (aggressive state)
                        case VINDICATOR:
                        case // Boolean : Is swinging arms
                        SKELETON:
                            break;
                        case // Byte : 0x01 = Is climbing
                        SPIDER:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_WALLCLIMBING, ((byte) m.getValue()) == 0x01);
                            break;
                        // Boolean : Is drinking potion
                        case WITCH:
                        // VarInt : Center head's target (entity ID, or 0 if no target)
                        case WITHER:
                        // Opt BlockID : Carried block
                        case ENDERMAN:
                        // VarInt : Dragon phase
                        case ENDER_DRAGON:
                        case // Boolean : Is attacking
                        GHAST:
                            break;
                        // VarInt : Size
                        case SLIME:
                        case // VarInt : Size
                        MAGMA_CUBE:
                            peMeta.set(EntityMetaData.Constants.DATA_SCALE, new FloatMeta((int) m.getValue()));
                            break;
                        case // VarInt : Score
                        PLAYER:
                            // Not supported yet
                            break;
                        default:
                            // ZOMBIE, AGEABLE //Boolean Is baby
                            {
                                if (m.getValue() instanceof Boolean) {
                                    peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_BABY, ((boolean) m.getValue()));
                                    if ((boolean) m.getValue()) {
                                        peMeta.set(EntityMetaData.Constants.DATA_SCALE, new FloatMeta(0.5f));
                                    }
                                } else
                                    handle = false;
                                break;
                            }
                    }
                    break;
                case 13:
                    switch(type) {
                        case // Chat : Last output
                        MINECART:
                            if (m.getValue() instanceof String) {
                            // 
                            }
                        case // Rotation : Body rotation
                        ARMOR_STAND:
                            break;
                        case // Byte : see http://wiki.vg/Entity_metadata#AbstractHorse
                        HORSE:
                            break;
                        case // Byte 0x0F Color (matches dye damage values) //0x10 Is sheared
                        SHEEP:
                            if (((byte) (m.getValue()) & 0x10) == 0) {
                                peMeta.set(EntityMetaData.Constants.DATA_COLOR, new ByteMeta((byte) (m.getValue())));
                            } else {
                                peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SHEARED, true);
                            }
                            break;
                        case // VarInt : Type
                        RABBIT:
                            peMeta.set(EntityMetaData.Constants.DATA_VARIANT, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Boolean : Has saddle
                        PIG:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_SADDLED, ((boolean) m.getValue()));
                            break;
                        // Boolean : Standing up
                        case POLAR_BEAR:
                        // VarInt : Profession (Farmer = 0, Librarian = 1, Priest = 2, Blacksmith = 3, Butcher = 4, Nitwit = 5)
                        case VILLAGER:
                        case // OptPosition : Attachment position
                        SHULKER:
                            break;
                        case // Boolean : Is charged
                        CREEPER:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_CHARGED, ((boolean) m.getValue()));
                            break;
                        // VarInt : Left(?) head's target (entity ID, or 0 if no target)
                        case WITHER:
                        // VarInt : Unused (previously type)
                        case ZOMBIE:
                        case // Boolean : Is screaming
                        ENDERMAN:
                            break;
                        case // Byte : The Displayed Skin Parts bit mask that is sent in Client Settings
                        PLAYER:
                            // Not supported yet
                            break;
                        default:
                            // System.out.println("case 13 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 14:
                    switch(type) {
                        // Rotation : Left arm rotation
                        case ARMOR_STAND:
                        // OptUUID : Owner
                        case HORSE:
                        // VarInt : Total time to "boost" with a carrot on a stick for
                        case PIG:
                        case // Byte : Shield height
                        SHULKER:
                            break;
                        case // Boolean : Is ignited
                        CREEPER:
                            peMeta.setGenericFlag(EntityMetaData.Constants.DATA_FLAG_IGNITED, ((boolean) m.getValue()));
                            break;
                        // VarInt : Right(?) head's target (entity ID, or 0 if no target)
                        case WITHER:
                        case // Boolean : Are hands held up
                        ZOMBIE:
                            break;
                        case // Byte : Main hand (0 : Left, 1 : Right)
                        PLAYER:
                            // Not supported yet
                            break;
                        default:
                            // System.out.println("case 14 " + type.name() + " " + m.getValue());
                            break;
                    }
                    break;
                case 15:
                    switch(type) {
                        case // Rotation : Right arm rotation
                        ARMOR_STAND:
                            break;
                        case HORSE:
                            if (m.getValue() instanceof Integer) {
                                // VarInt : Variant (Color & Style)
                                peMeta.set(EntityMetaData.Constants.DATA_VARIANT, new IntegerMeta((int) m.getValue()));
                            }
                            if (m.getValue() instanceof Boolean) {
                            // Boolean : Has Chest
                            // 
                            }
                            break;
                        case // VarInt	Type (0 = untamed, 1 = tuxedo, 2 = tabby, 3 = siamese). Used to render regardless as to whether it is tamed or not.
                        OCELOT:
                            peMeta.set(EntityMetaData.Constants.DATA_VARIANT, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Float : Damage taken (used for tail rotation)
                        WOLF:
                            break;
                        case // VarInt	Variant (0: red/blue, 1: blue, 2: green, 3: yellow/blue, 4: silver)
                        PARROT:
                            peMeta.set(EntityMetaData.Constants.DATA_VARIANT, new IntegerMeta((int) m.getValue()));
                            break;
                        case // Byte : Color (dye color)
                        SHULKER:
                            peMeta.set(EntityMetaData.Constants.DATA_VARIANT, new ByteMeta((byte) m.getValue()));
                            break;
                        case // VarInt : Invulnerable time
                        WITHER:
                            // case ZOMBIE_VILLAGER: //Boolean : Is converting
                            break;
                        case // NBT Tag : Left shoulder entity data (for occupying parrot)
                        PLAYER:
                            // Not supported yet
                            break;
                    }
                    break;
                case 16:
                    switch(type) {
                        // Rotation : Left leg rotation
                        case ARMOR_STAND:
                        // VarInt : Armor (0: none, 1: iron, 2: gold, 3: diamond)
                        case HORSE:
                        // Boolean : Is begging
                        case WOLF:
                        // case ZOMBIE_VILLAGER: //VarInt : Profession
                        case // NBT Tag : Right shoulder entity data (for occupying parrot)
                        PLAYER:
                            // Not supported yet
                            break;
                    }
                case 17:
                    switch(type) {
                        // Rotation : Right leg rotation
                        case ARMOR_STAND:
                        case // VarInt : Collar color (values are those used with dyes)
                        WOLF:
                            break;
                    }
                    break;
            }
            if (type == EntityType.GIANT_ZOMBIE) {
                peMeta.set(EntityMetaData.Constants.DATA_SCALE, new FloatMeta(6));
            }
            if (!handle)
                DragonProxy.getInstance().getLogger().debug("Not supported entity meta (" + type.name() + ") : " + m.toString());
        } catch (Exception p_Ex) {
            // timing.stopTiming();
            p_Ex.printStackTrace();
        }
    }
    // }
    return peMeta;
}
Also used : IntegerMeta(org.dragonet.common.data.entity.meta.type.IntegerMeta) BlockPosition(org.dragonet.common.maths.BlockPosition) ByteMeta(org.dragonet.common.data.entity.meta.type.ByteMeta) EntityMetaData(org.dragonet.common.data.entity.meta.EntityMetaData) BlockPositionMeta(org.dragonet.common.data.entity.meta.type.BlockPositionMeta) ShortMeta(org.dragonet.common.data.entity.meta.type.ShortMeta) ByteArrayMeta(org.dragonet.common.data.entity.meta.type.ByteArrayMeta) SlotMeta(org.dragonet.common.data.entity.meta.type.SlotMeta) EntityMetadata(com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata) FloatMeta(org.dragonet.common.data.entity.meta.type.FloatMeta)

Example 2 with Session

use of com.github.steveice10.packetlib.Session 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;
}
Also used : ArrayList(java.util.ArrayList) PlayerListEntry(com.github.steveice10.mc.protocol.data.game.PlayerListEntry) ClientSettingsPacket(com.github.steveice10.mc.protocol.packet.ingame.client.ClientSettingsPacket) Vector3F(org.dragonet.common.maths.Vector3F) ChunkPos(org.dragonet.common.maths.ChunkPos) HashSet(java.util.HashSet) CachedEntity(org.dragonet.proxy.network.cache.CachedEntity) BlockPosition(org.dragonet.common.maths.BlockPosition) ServerJoinGamePacket(com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket) BinaryStream(org.dragonet.common.utilities.BinaryStream) ClientTeleportConfirmPacket(com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket) ClientPluginMessagePacket(com.github.steveice10.mc.protocol.packet.ingame.client.ClientPluginMessagePacket) ByteArrayDataOutput(com.google.common.io.ByteArrayDataOutput) PCDownstreamSession(org.dragonet.proxy.network.PCDownstreamSession)

Example 3 with Session

use of com.github.steveice10.packetlib.Session in project DragonProxy by DragonetMC.

the class CachedEntity method spawn.

public void spawn(UpstreamSession session) {
    if (this.peType == EntityType.PLAYER) {
        PlayerListEntry playerListEntry = session.getPlayerInfoCache().get(this.playerUniqueId);
        AddPlayerPacket pk = new AddPlayerPacket();
        pk.eid = this.proxyEid;
        pk.rtid = this.proxyEid;
        pk.uuid = this.playerUniqueId;
        pk.position = new Vector3F((float) this.x, (float) this.y, (float) this.z);
        pk.motion = Vector3F.ZERO;
        pk.yaw = this.yaw;
        pk.pitch = this.pitch;
        pk.username = playerListEntry.getProfile().getName();
        pk.meta = EntityMetaTranslator.translateToPE(session, this.pcMeta, this.peType);
        // hacky for now
        pk.meta.set(EntityMetaData.Constants.DATA_NAMETAG, new ByteArrayMeta(playerListEntry.getProfile().getName()));
        this.spawned = true;
        session.sendPacket(pk);
    } else if (this.peType == EntityType.ITEM) {
        AddItemEntityPacket pk = new AddItemEntityPacket();
        pk.rtid = this.proxyEid;
        pk.eid = this.proxyEid;
        pk.metadata = EntityMetaTranslator.translateToPE(session, this.pcMeta, this.peType);
        pk.item = ((SlotMeta) pk.metadata.map.get(EntityMetaData.Constants.DATA_TYPE_SLOT)).slot;
        pk.position = new Vector3F((float) this.x, (float) this.y + this.peType.getOffset(), (float) this.z);
        pk.motion = new Vector3F((float) this.motionX, (float) this.motionY, (float) this.motionZ);
        this.spawned = true;
        session.sendPacket(pk);
    } else if (this.peType == EntityType.PAINTING) {
        AddPaintingPacket pk = new AddPaintingPacket();
        pk.rtid = this.proxyEid;
        pk.eid = this.proxyEid;
        pk.pos = new BlockPosition((int) this.x, (int) this.y, (int) this.z);
        pk.direction = 1;
        pk.title = "Kebab";
        this.spawned = true;
    // session.sendPacket(pk); //BUGGY
    } else if (this.peType != null) {
        AddEntityPacket pk = new AddEntityPacket();
        pk.rtid = this.proxyEid;
        pk.eid = this.proxyEid;
        pk.type = this.peType.getPeType();
        pk.position = new Vector3F((float) this.x, (float) this.y - this.peType.getOffset(), (float) this.z);
        pk.motion = new Vector3F((float) this.motionX, (float) this.motionY, (float) this.motionZ);
        pk.yaw = this.yaw;
        pk.pitch = this.pitch;
        pk.meta = EntityMetaTranslator.translateToPE(session, this.pcMeta, this.peType);
        // TODO: Hack for now. ;P
        pk.attributes = this.attributes.values();
        this.spawned = true;
        session.sendPacket(pk);
    }
    this.updateLinks(session);
    // Process equipments
    this.updateEquipment(session);
}
Also used : SlotMeta(org.dragonet.common.data.entity.meta.type.SlotMeta) Vector3F(org.dragonet.common.maths.Vector3F) BlockPosition(org.dragonet.common.maths.BlockPosition) PlayerListEntry(com.github.steveice10.mc.protocol.data.game.PlayerListEntry) ByteArrayMeta(org.dragonet.common.data.entity.meta.type.ByteArrayMeta)

Example 4 with Session

use of com.github.steveice10.packetlib.Session 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;
}
Also used : ClientWindowActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket) ClientPlayerUseItemPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket) ClientPlayerInteractEntityPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket) AddEntityPacket(org.dragonet.protocol.packets.AddEntityPacket) ClientPlayerSwingArmPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket) InventoryTransactionPacket(org.dragonet.protocol.packets.InventoryTransactionPacket) ClientPlayerActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket) Packet(com.github.steveice10.packetlib.packet.Packet) ClientWindowActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket) ClientPlayerPlaceBlockPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket) Position(com.github.steveice10.mc.protocol.data.game.entity.metadata.Position) BlockPosition(org.dragonet.common.maths.BlockPosition) ClientPlayerSwingArmPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket) AddEntityPacket(org.dragonet.protocol.packets.AddEntityPacket) BlockPosition(org.dragonet.common.maths.BlockPosition) CachedEntity(org.dragonet.proxy.network.cache.CachedEntity) ReleaseItemData(org.dragonet.protocol.type.transaction.data.ReleaseItemData) UseItemData(org.dragonet.protocol.type.transaction.data.UseItemData) ClientPlayerInteractEntityPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket) UseItemOnEntityData(org.dragonet.protocol.type.transaction.data.UseItemOnEntityData) InteractAction(com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction) ClientPlayerUseItemPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket) Slot(org.dragonet.common.data.inventory.Slot) ClientPlayerActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket) ClientPlayerPlaceBlockPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket)

Example 5 with Session

use of com.github.steveice10.packetlib.Session 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;
}
Also used : ClientPlayerActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket) ClientRequestPacket(com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket) ClientPlayerStatePacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerStatePacket) PlayerActionPacket(org.dragonet.protocol.packets.PlayerActionPacket) Packet(com.github.steveice10.packetlib.packet.Packet) Position(com.github.steveice10.mc.protocol.data.game.entity.metadata.Position) BlockFace(com.github.steveice10.mc.protocol.data.game.world.block.BlockFace) ClientRequestPacket(com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket) ClientPlayerActionPacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket) ClientPlayerStatePacket(com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerStatePacket)

Aggregations

BlockPosition (org.dragonet.common.maths.BlockPosition)7 PEPacket (org.dragonet.protocol.PEPacket)6 CachedEntity (org.dragonet.proxy.network.cache.CachedEntity)5 PlayerListEntry (com.github.steveice10.mc.protocol.data.game.PlayerListEntry)3 Position (com.github.steveice10.mc.protocol.data.game.entity.metadata.Position)3 ClientCloseWindowPacket (com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCloseWindowPacket)3 Packet (com.github.steveice10.packetlib.packet.Packet)3 Vector3F (org.dragonet.common.maths.Vector3F)3 CachedWindow (org.dragonet.proxy.network.cache.CachedWindow)3 IInventoryTranslator (org.dragonet.proxy.network.translator.IInventoryTranslator)3 ItemStack (com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack)2 ClientSettingsPacket (com.github.steveice10.mc.protocol.packet.ingame.client.ClientSettingsPacket)2 ClientPlayerActionPacket (com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket)2 HashSet (java.util.HashSet)2 ByteArrayMeta (org.dragonet.common.data.entity.meta.type.ByteArrayMeta)2 SlotMeta (org.dragonet.common.data.entity.meta.type.SlotMeta)2 MinecraftConstants (com.github.steveice10.mc.protocol.MinecraftConstants)1 MinecraftProtocol (com.github.steveice10.mc.protocol.MinecraftProtocol)1 SubProtocol (com.github.steveice10.mc.protocol.data.SubProtocol)1 Attribute (com.github.steveice10.mc.protocol.data.game.entity.attribute.Attribute)1