Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 24.90 KB | None | 0 0
  1. package org.lazaro.rt5e.network.protocol.world;
  2.  
  3. import org.lazaro.rt5e.Constants;
  4. import org.lazaro.rt5e.Context;
  5. import org.lazaro.rt5e.logic.Entity;
  6. import org.lazaro.rt5e.logic.item.Item;
  7. import org.lazaro.rt5e.logic.map.Directions;
  8. import org.lazaro.rt5e.logic.mask.ChatMessage;
  9. import org.lazaro.rt5e.logic.mask.Hit;
  10. import org.lazaro.rt5e.logic.mask.Mask;
  11. import org.lazaro.rt5e.logic.npc.NPCDefinition;
  12. import org.lazaro.rt5e.logic.player.Appearance;
  13. import org.lazaro.rt5e.logic.player.Player;
  14. import org.lazaro.rt5e.logic.utility.PlayerUpdater;
  15. import org.lazaro.rt5e.network.Packet;
  16. import org.lazaro.rt5e.network.PacketBuilder;
  17. import org.lazaro.rt5e.utility.TextUtilities;
  18.  
  19. /**
  20.  * @author Lazaro
  21.  */
  22. public class GPP613 implements PlayerUpdater {
  23.     private int[] playerHashLoc = new int[2048];
  24.  
  25.     private void doAnimation(Player player, PacketBuilder pb) {
  26.         pb.putShortA(player.getMasks().getAnimationId()).putByteS(player.getMasks().getAnimationDelay());
  27.     }
  28.  
  29.     private void doAppearance(Player player, PacketBuilder pb) {
  30.         Packet appearanceBlock = player.getCachedAppearanceBlock();
  31.         pb.putS((byte) (appearanceBlock.getLength() & 0xFF));
  32.         byte[] payload = appearanceBlock.getBytes();
  33.         pb.putA(payload);
  34.     }
  35.  
  36.     public Packet doApperanceBlock(Player player) {
  37.         PacketBuilder appearanceBlock = new PacketBuilder();
  38.         Appearance app = player.getAppearance();
  39.         int hash = 0;
  40.         // hash |= 0 << 6; // something to do with the chat bar
  41.         // hash |= 0 << 3; // player size (example: if the player turns into an
  42.         // npc and it is bigger than 1 tile)
  43.         // hash |= 0x2; if the player has a display name
  44.         // hash |= 0x4; //??
  45.         hash |= player.getAppearance().getGender().intValue() & 0x1;
  46.         appearanceBlock.putByte(hash);
  47.         appearanceBlock.putByte(0 /* 1-mob status */).putByte(app.getPKIcon()).putByte(app.getPrayerIcon());
  48.         if (!app.isNPC()) {
  49.             for (int i = 0; i < 4; i++) {
  50.                 Item item = player.getEquipment().get(i);
  51.                 if (item != null) {
  52.                     appearanceBlock.putShort(32768 + item.getDefinition().getEquipmentId());
  53.                 } else {
  54.                     appearanceBlock.putByte(0);
  55.                 }
  56.             }
  57.             Item chestItem = player.getEquipment().get(Constants.Equipment.CHEST_SLOT);
  58.             if (chestItem != null) {
  59.                 appearanceBlock.putShort(32768 + chestItem.getDefinition().getEquipmentId());
  60.             } else {
  61.                 appearanceBlock.putShort(0x100 + app.getLook(2));
  62.             }
  63.             Item shieldItem = player.getEquipment().get(Constants.Equipment.SHIELD_SLOT);
  64.             if (shieldItem != null) {
  65.                 appearanceBlock.putShort(32768 + shieldItem.getDefinition().getEquipmentId());
  66.             } else {
  67.                 appearanceBlock.putByte(0);
  68.             }
  69.             if (chestItem != null && chestItem.getDefinition().isFullBody()) {
  70.                 appearanceBlock.putByte(0);
  71.             } else {
  72.                 appearanceBlock.putShort(0x100 + app.getLook(3));
  73.             }
  74.             Item bottomItem = player.getEquipment().get(Constants.Equipment.BOTTOMS_SLOT);
  75.             if (bottomItem != null) {
  76.                 appearanceBlock.putShort(32768 + bottomItem.getDefinition().getEquipmentId());
  77.             } else {
  78.                 appearanceBlock.putShort(0x100 + app.getLook(5));
  79.             }
  80.             Item helmItem = player.getEquipment().get(Constants.Equipment.HELM_SLOT);
  81.             if (helmItem != null && (helmItem.getDefinition().isHat() || helmItem.getDefinition().isMask())) {
  82.                 appearanceBlock.putByte(0);
  83.             } else {
  84.                 appearanceBlock.putShort(0x100 + app.getLook(0));
  85.             }
  86.             Item glovesItem = player.getEquipment().get(Constants.Equipment.GLOVES_SLOT);
  87.             if (glovesItem != null) {
  88.                 appearanceBlock.putShort(32768 + glovesItem.getDefinition().getEquipmentId());
  89.             } else {
  90.                 appearanceBlock.putShort(0x100 + app.getLook(4));
  91.             }
  92.             Item bootsItem = player.getEquipment().get(Constants.Equipment.BOOTS_SLOT);
  93.             if (bootsItem != null) {
  94.                 appearanceBlock.putShort(32768 + bootsItem.getDefinition().getEquipmentId());
  95.             } else {
  96.                 appearanceBlock.putShort(0x100 + app.getLook(6));
  97.             }
  98.             if (helmItem != null && helmItem.getDefinition().isMask()) {
  99.                 appearanceBlock.putByte(0);
  100.             } else {
  101.                 appearanceBlock.putShort(0x100 + app.getLook(1));
  102.             }
  103.         } else {
  104.             appearanceBlock.putShort(-1);
  105.             appearanceBlock.putShort(app.getNPCType());
  106.             appearanceBlock.putByte(0);
  107.         }
  108.         for (int i = 0; i < 5; i++) {
  109.             appearanceBlock.put(app.getColor(i));
  110.         }
  111.         Item weapon = player.getEquipment().get(Constants.Equipment.WEAPON_SLOT);
  112.         appearanceBlock.putShort(!app.isNPC() ? (weapon != null ? weapon.getDefinition().getRenderId() : 1426) : NPCDefinition.forType(app.getNPCType()).getRenderId());
  113.         appearanceBlock.putString(player.getName());
  114.         // extra string if the player has a display name
  115.         appearanceBlock.put((byte) player.getSkills().getCombatLevel()); // combat
  116.         // level
  117.         appearanceBlock.putShort(0);
  118.         appearanceBlock.putByte(0);
  119.         return appearanceBlock.toPacket();
  120.     }
  121.  
  122.     private void doChat(Player player, PacketBuilder pb) {
  123.         ChatMessage msg = player.getMasks().getChat();
  124.         int effects = msg.getColor() << 8 | msg.getEffect();
  125.         if (false) {
  126.             effects |= 0x8000; // flags something
  127.         }
  128.         byte[] textBuffer = new byte[256];
  129.         textBuffer[0] = (byte) msg.getText().length();
  130.         int length = TextUtilities.huffmanCompress(msg.getText(), textBuffer, 1);
  131.         pb.putShort(effects).putByteS(player.getRights().intValue()).put(textBuffer, 0, length + 1);
  132.     }
  133.  
  134.     private void doFaceDirection(Player player, PacketBuilder pb) {
  135.         int dX = player.getLocation().getX() - player.getMasks().getFaceDirection().getX();
  136.         int dY = player.getLocation().getY() - player.getMasks().getFaceDirection().getY();
  137.         pb.putLEShort(((int) (Math.atan2(dX, dY) * 2607.5945876176133)) & 0x3fff);
  138.     }
  139.  
  140.     private void doFaceEntity(Player player, PacketBuilder pb) {
  141.         pb.putShortA(player.getMasks().getFaceEntity().getId());
  142.     }
  143.  
  144.     private void doForcedMovementMode(Player player, PacketBuilder pb) {
  145.         pb.putByteC(player.getMasks().getForcedMovementMode());
  146.     }
  147.  
  148.     private void doGraphics(Player player, PacketBuilder pb) {
  149.         pb.putLEShortA(player.getMasks().getGraphicsId()).putInt1(player.getMasks().getGraphicsDelay()).putByteS(player.getMasks().getGraphicsHeight());
  150.     }
  151.  
  152.     private void doGraphics2(Player player, PacketBuilder pb) {
  153.         pb.putShortA(player.getMasks().getGraphicsId2()).putInt(player.getMasks().getGraphicsDelay2()).putByte(player.getMasks().getGraphicsHeight2());
  154.     }
  155.  
  156.     private void doHit(Player player, PacketBuilder pb) {
  157.         Hit hit = player.getMasks().getHit();
  158.         int hpRatio = player.getHP() * 255 / player.getMaxHP();
  159.         pb.putSmart(hit.getDamage()).putByte(hit.getType()).putByte(hpRatio);
  160.     }
  161.  
  162.     private void doHit2(Player player, PacketBuilder pb) {
  163.         Hit hit = player.getMasks().getHit2();
  164.         pb.putSmart(hit.getDamage()).putByteS(hit.getType());
  165.     }
  166.  
  167.     public Packet doMaskBlock(Entity entity) {
  168.         return doMaskBlock((Player) entity, false);
  169.     }
  170.  
  171.     private Packet doMaskBlock(Player player, boolean newPlayer) {
  172.         PacketBuilder pb = new PacketBuilder();
  173.         int mask = 0;
  174.         if (player.getMasks().requiresUpdate(Mask.MaskType.HIT2)) {
  175.             mask |= 0x10000;
  176.         }
  177.         if (player.getMasks().requiresUpdate(Mask.MaskType.ANIMATION)) {
  178.             mask |= 0x80;
  179.         }
  180.         if (player.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS2)) {
  181.             mask |= 0x1000;
  182.         }
  183.         if (player.getMasks().requiresUpdate(Mask.MaskType.MOVEMENT_MODE) || newPlayer) {
  184.             mask |= 0x10;
  185.         }
  186.         if (player.getMasks().requiresUpdate(Mask.MaskType.FORCED_CHAT)) {
  187.             mask |= 0x400;
  188.         }
  189.         if (player.getMasks().requiresUpdate(Mask.MaskType.FACE_ENTITY) || (newPlayer && player.getMasks().getFaceEntity() != null)) {
  190.             mask |= 0x2;
  191.         }
  192.         if (player.getMasks().requiresUpdate(Mask.MaskType.APPEARANCE) || newPlayer) {
  193.             mask |= 0x20;
  194.         }
  195.         if (player.getMasks().requiresUpdate(Mask.MaskType.FORCED_MOVEMENT_MODE)) {
  196.             mask |= 0x2000;
  197.         }
  198.         if (player.getMasks().requiresUpdate(Mask.MaskType.HIT)) {
  199.             mask |= 0x40;
  200.         }
  201.         if (player.getMasks().requiresUpdate(Mask.MaskType.FACE_DIRECTION) || (newPlayer && player.getMasks().getFaceDirection() != null)) {
  202.             mask |= 0x4;
  203.         }
  204.         if (player.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS)) {
  205.             mask |= 0x8;
  206.         }
  207.         if (mask >= 0x100) {
  208.             mask |= 0x1;
  209.             if (mask >= 0x10000) {
  210.                 mask |= 0x800;
  211.                 pb.putByte(mask & 0xff).putByte(mask >> 8 & 0xffff).putByte(mask >> 16);
  212.             } else {
  213.                 pb.putByte(mask & 0xff).putByte(mask >> 8);
  214.             }
  215.         } else {
  216.             pb.putByte(mask & 0xff);
  217.         }
  218.         if (player.getMasks().requiresUpdate(Mask.MaskType.HIT2)) {
  219.             doHit2(player, pb);
  220.         }
  221.         if (player.getMasks().requiresUpdate(Mask.MaskType.ANIMATION)) {
  222.             doAnimation(player, pb);
  223.         }
  224.         if (player.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS2)) {
  225.             doGraphics2(player, pb);
  226.         }
  227.         if (player.getMasks().requiresUpdate(Mask.MaskType.MOVEMENT_MODE) || newPlayer) {
  228.             doMovementMode(player, pb);
  229.         }
  230.         if (player.getMasks().requiresUpdate(Mask.MaskType.FORCED_CHAT)) {
  231.             doForcedChat(player, pb);
  232.         }
  233.         if (player.getMasks().requiresUpdate(Mask.MaskType.FACE_ENTITY) || (newPlayer && player.getMasks().getFaceEntity() != null)) {
  234.             doFaceEntity(player, pb);
  235.         }
  236.         if (player.getMasks().requiresUpdate(Mask.MaskType.APPEARANCE) || newPlayer) {
  237.             doAppearance(player, pb);
  238.         }
  239.         if (player.getMasks().requiresUpdate(Mask.MaskType.FORCED_MOVEMENT_MODE)) {
  240.             doForcedMovementMode(player, pb);
  241.         }
  242.         if (player.getMasks().requiresUpdate(Mask.MaskType.HIT)) {
  243.             doHit(player, pb);
  244.         }
  245.         if (player.getMasks().requiresUpdate(Mask.MaskType.FACE_DIRECTION) || (newPlayer && player.getMasks().getFaceDirection() != null)) {
  246.             doFaceDirection(player, pb);
  247.         }
  248.         if (player.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS)) {
  249.             doGraphics(player, pb);
  250.         }
  251.         return pb.toPacket();
  252.     }
  253.  
  254.     private void doForcedChat(Player player, PacketBuilder pb) {
  255.         pb.putString(player.getMasks().getForcedChat().getText());
  256.     }
  257.  
  258.     private void doMovementMode(Player player, PacketBuilder pb) {
  259.         pb.putByteC(player.getMovementMode());
  260.     }
  261.  
  262.     public int getPlayerHashLoc(int index) {
  263.         return playerHashLoc[index];
  264.     }
  265.  
  266.     private void masks(Player player, PacketBuilder pb, boolean newPlayer) {
  267.         if (!newPlayer) {
  268.             pb.put(player.getCachedMaskBlock().getBytes());
  269.         } else {
  270.             pb.put(doMaskBlock(player, newPlayer).getBytes());
  271.         }
  272.     }
  273.  
  274.     public void setPlayerHashLoc(int index, int value) {
  275.         playerHashLoc[index] = value;
  276.     }
  277.  
  278.     public void update(Player player) {
  279.         PacketBuilder pb = new PacketBuilder(53, Packet.Type.VAR_SHORT);
  280.         /**
  281.          * NSN0
  282.          */
  283.         pb.recalculateBitPosition();
  284.         int skip = -1;
  285.         for (int i = 1; i < 2048; i++) {
  286.             if (player.isInViewport(i)) {
  287.                 if (!player.skippedLastCycle(i)) {
  288.                     Player local = Context.getWorld().getGlobalPlayers().get(i);
  289.                     if (!updateLocalPlayer(player, local, i, pb, skip)) {
  290.                         player.setSkippedThisCycle(local.getIndex(), true);
  291.                         skip++;
  292.                     } else {
  293.                         skip = -1;
  294.                     }
  295.                 }
  296.             }
  297.         }
  298.         writeSkip(skip, pb);
  299.         /**
  300.          * NSN1
  301.          */
  302.         pb.recalculateBitPosition();
  303.         skip = -1;
  304.         for (int i = 1; i < 2048; i++) {
  305.             if (player.isInViewport(i)) {
  306.                 if (player.skippedLastCycle(i)) {
  307.                     Player local = Context.getWorld().getGlobalPlayers().get(i);
  308.                     if (!updateLocalPlayer(player, local, i, pb, skip)) {
  309.                         player.setSkippedThisCycle(local.getIndex(), true);
  310.                         skip++;
  311.                     } else {
  312.                         skip = -1;
  313.                     }
  314.                 }
  315.             }
  316.         }
  317.         writeSkip(skip, pb);
  318.         int newPlayerCount = 0;
  319.         /**
  320.          * NSN2
  321.          */
  322.         pb.recalculateBitPosition();
  323.         skip = -1;
  324.         for (int i = 1; i < 2048; i++) {
  325.             if (player.skippedLastCycle(i)) {
  326.                 Player p2 = Context.getWorld().getGlobalPlayers().get(i);
  327.                 if (player.isInViewport(i) || player.justLeftViewport(i)) {
  328.                     continue;
  329.                 } else if (p2 == null || p2.isOnLogin()) {
  330.                     player.setSkippedThisCycle(i, true);
  331.                     skip++;
  332.                     continue;
  333.                 }
  334.                 if (player.getLocation().withinRange(p2.getLocation()) && newPlayerCount < 64) {
  335.                     writeSkip(skip, pb);
  336.                     skip = -1;
  337.                     updateGlobalPlayer(player, p2, 0, pb, false);
  338.                     newPlayerCount++;
  339.                 } else if (p2.isTeleporting() || p2.loggedInThisCycle()) {
  340.                     writeSkip(skip, pb);
  341.                     skip = -1;
  342.                     updateGlobalPlayer(player, p2, 3, pb, false);
  343.                 } else if (p2.getMapRegionDirection() != null) {
  344.                     writeSkip(skip, pb);
  345.                     skip = -1;
  346.                     updateGlobalPlayer(player, p2, 2, pb, false);
  347.                 } else if (p2.isHeightUpdate()) {
  348.                     writeSkip(skip, pb);
  349.                     skip = -1;
  350.                     updateGlobalPlayer(player, p2, 1, pb, false);
  351.                 } else {
  352.                     player.setSkippedThisCycle(i, true);
  353.                     skip++;
  354.                 }
  355.             }
  356.         }
  357.         writeSkip(skip, pb);
  358.         /**
  359.          * NSN3
  360.          */
  361.         pb.recalculateBitPosition();
  362.         skip = -1;
  363.         for (int i = 1; i < 2048; i++) {
  364.             if (!player.skippedLastCycle(i)) {
  365.                 Player p2 = Context.getWorld().getGlobalPlayers().get(i);
  366.                 if (player.isInViewport(i) || player.justLeftViewport(i)) {
  367.                     continue;
  368.                 } else if (p2 == null || p2.isOnLogin()) {
  369.                     player.setSkippedThisCycle(i, true);
  370.                     skip++;
  371.                     continue;
  372.                 }
  373.                 if (player.getLocation().withinRange(p2.getLocation()) && newPlayerCount < 64) {
  374.                     writeSkip(skip, pb);
  375.                     skip = -1;
  376.                     updateGlobalPlayer(player, p2, 0, pb, false);
  377.                     newPlayerCount++;
  378.                 } else if (p2.isTeleporting() || p2.loggedInThisCycle()) {
  379.                     writeSkip(skip, pb);
  380.                     skip = -1;
  381.                     updateGlobalPlayer(player, p2, 3, pb, false);
  382.                 } else if (p2.getMapRegionDirection() != null) {
  383.                     writeSkip(skip, pb);
  384.                     skip = -1;
  385.                     updateGlobalPlayer(player, p2, 2, pb, false);
  386.                 } else if (p2.isHeightUpdate()) {
  387.                     writeSkip(skip, pb);
  388.                     skip = -1;
  389.                     updateGlobalPlayer(player, p2, 1, pb, false);
  390.                 } else {
  391.                     player.setSkippedThisCycle(i, true);
  392.                     skip++;
  393.                 }
  394.             }
  395.         }
  396.         writeSkip(skip, pb);
  397.         /**
  398.          * Masks
  399.          */
  400.         pb.recalculateBitPosition();
  401.         for (int i : player.getUpdateRequiredList()) {
  402.             Player local = Context.getWorld().getGlobalPlayers().get(i);
  403.             boolean justEnteredViewport = player.justEnteredViewport(i);
  404.             if (local.getMasks().requiresUpdate() || justEnteredViewport) {
  405.                 masks(local, pb, justEnteredViewport);
  406.             }
  407.         }
  408.         player.getConnection().write(pb.toPacket());
  409.     }
  410.  
  411.     private void updateGlobalPlayer(Player owner, Player player, int stage, PacketBuilder pb, boolean repeated) {
  412.         if (!repeated) {
  413.             pb.putBits(1, 1);
  414.         }
  415.         pb.putBits(2, stage);
  416.         switch (stage) {
  417.             case 0:
  418.                 if (player.isTeleporting() || player.loggedInThisCycle()) {
  419.                     pb.putBits(1, 1);
  420.                     updateGlobalPlayer(owner, player, 3, pb, true);
  421.                 } else if (player.getMapRegionDirection() != null) {
  422.                     pb.putBits(1, 1);
  423.                     updateGlobalPlayer(owner, player, 2, pb, true);
  424.                 } else if (player.isHeightUpdate()) {
  425.                     pb.putBits(1, 1);
  426.                     updateGlobalPlayer(owner, player, 1, pb, true);
  427.                 } else {
  428.                     pb.putBits(1, 0);
  429.                 }
  430.                 int x = player.getLocation().getX() - (player.getLocation().getRegionX() << 6);
  431.                 int y = player.getLocation().getY() - (player.getLocation().getRegionY() << 6);
  432.                 pb.putBits(6, x);
  433.                 pb.putBits(6, y);
  434.                 pb.putBits(1, 1); // requires update, TODO: we could disable this
  435.                 // and make the client use it's cached
  436.                 // appearance block if the player hasn't changed
  437.                 // appearance yet
  438.                 owner.setInViewport(player.getIndex(), true);
  439.                 owner.setJustEnteredViewport(player.getIndex(), true);
  440.                 owner.setSkippedThisCycle(player.getIndex(), true);
  441.                 owner.getUpdateRequiredList().addLast(player.getIndex());
  442.                 break;
  443.             case 1:
  444.                 int hashLoc = playerHashLoc[player.getIndex()];
  445.                 int z = (hashLoc >> 16) & 0x3;
  446.                 z = player.getLocation().getZ() - z & 0x3;
  447.                 pb.putBits(2, z);
  448.                 break;
  449.             case 2:
  450.                 hashLoc = playerHashLoc[player.getIndex()];
  451.                 z = (hashLoc >> 16) & 0x3;
  452.                 z = player.getLocation().getZ() - z & 0x3;
  453.                 pb.putBits(5, z << 3 | (player.getMapRegionDirection().intValue() & 0x7));
  454.                 break;
  455.             case 3:
  456.                 hashLoc = playerHashLoc[player.getIndex()];
  457.                 z = (hashLoc >> 16) & 0x3;
  458.                 x = (hashLoc >> 8) & 0xff;
  459.                 y = hashLoc & 0xff;
  460.                 x = player.getLocation().getRegionX() - x & 0xff;
  461.                 y = player.getLocation().getRegionY() - y & 0xff;
  462.                 z = player.getLocation().getZ() - z & 0x3;
  463.                 pb.putBits(18, z << 16 | x << 8 | y);
  464.                 break;
  465.         }
  466.     }
  467.  
  468.     private void updateLocalPlayer(Player owner, Player player, int index, int stage, boolean remove, PacketBuilder pb) {
  469.         pb.putBits(1, 1);
  470.         pb.putBits(1, remove ? 0 : (player.getMasks().requiresUpdate() ? 1 : 0));
  471.         pb.putBits(2, stage);
  472.         switch (stage) {
  473.             case 0:
  474.                 if (remove) {
  475.                     if (player != null) {
  476.                         if (player.isTeleporting()) {
  477.                             pb.putBits(1, 1);
  478.                             updateGlobalPlayer(owner, player, 3, pb, true);
  479.                         } else if (player.getMapRegionDirection() != null) {
  480.                             pb.putBits(1, 1);
  481.                             updateGlobalPlayer(owner, player, 2, pb, true);
  482.                         } else if (player.isHeightUpdate()) {
  483.                             pb.putBits(1, 1);
  484.                             updateGlobalPlayer(owner, player, 1, pb, true);
  485.                         } else {
  486.                             pb.putBits(1, 0);
  487.                         }
  488.                     } else {
  489.                         pb.putBits(1, 0);
  490.                     }
  491.                     owner.setInViewport(index, false);
  492.                     owner.setJustLeftViewport(index, true);
  493.                 }
  494.                 break;
  495.             case 1:
  496.                 pb.putBits(3, player.getDirection().getDirection().intValue());
  497.                 break;
  498.             case 2:
  499.                 pb.putBits(4, player.getDirection().getDirection().intValue());
  500.                 break;
  501.             case 3:
  502.                 pb.putBits(1, owner != player ? 0 : 1);
  503.                 if (owner != player) {
  504.                     int x = player.getLocation().getX() - player.getOldLocation().getX() & 0x1f;
  505.                     int y = player.getLocation().getY() - player.getOldLocation().getY() & 0x1f;
  506.                     int z = player.getLocation().getZ() - player.getOldLocation().getZ() & 0x3;
  507.                     pb.putBits(12, z << 10 | x << 5 | y);
  508.                 } else {
  509.                     int x = player.getLocation().getX() - player.getOldLocation().getX() & 0x3fff;
  510.                     int y = player.getLocation().getY() - player.getOldLocation().getY() & 0x3fff;
  511.                     int z = player.getLocation().getZ() - player.getOldLocation().getZ() & 0x3;
  512.                     pb.putBits(30, z << 28 | x << 14 | y);
  513.                 }
  514.                 break;
  515.         }
  516.     }
  517.  
  518.     /**
  519.      * For updating a local player.
  520.      * <p/>
  521.      * Used int NSN0 and NSN1.
  522.      *
  523.      * @param owner  The player we are updating.
  524.      * @param player A local player.
  525.      * @param pb     The message factory to write with.
  526.      * @return If the block was written.
  527.      */
  528.     private boolean updateLocalPlayer(Player owner, Player player, int index, PacketBuilder pb, int skip) {
  529.         if (player == null || (owner != player && (!player.isValid() || player.isDestroyed() || (owner.isTeleporting() && player.isTeleporting()) || !owner.getLocation().withinRange(player.getLocation())))) {
  530.             writeSkip(skip, pb);
  531.             updateLocalPlayer(owner, player, index, 0, true, pb);
  532.         } else {
  533.             if (player.isTeleporting() && (!player.isForcedTeleporting() || owner == player)) {
  534.                 writeSkip(skip, pb);
  535.                 updateLocalPlayer(owner, player, index, 3, false, pb);
  536.             } else if (player.getDirection().getDirection() != null) {
  537.                 writeSkip(skip, pb);
  538.                 if (player.getDirection().getDirection() instanceof Directions.RunningDirection) {
  539.                     updateLocalPlayer(owner, player, index, 2, false, pb);
  540.                 } else {
  541.                     updateLocalPlayer(owner, player, index, 1, false, pb);
  542.                 }
  543.             } else {
  544.                 if (player.getMasks().requiresUpdate()) {
  545.                     writeSkip(skip, pb);
  546.                     updateLocalPlayer(owner, player, index, 0, false, pb);
  547.                 } else {
  548.                     return false;
  549.                 }
  550.             }
  551.             if (player.getMasks().requiresUpdate()) {
  552.                 owner.getUpdateRequiredList().addLast(player.getIndex());
  553.             }
  554.         }
  555.         return true;
  556.     }
  557.  
  558.     /**
  559.      * Writes an amount of loops to skip.
  560.      *
  561.      * @param skip The amount of loops to skip.
  562.      * @param pb   The message factory to write with.
  563.      */
  564.     private void writeSkip(int skip, PacketBuilder pb) {
  565.         if (skip > -1) {
  566.             int type = 0;
  567.             if (skip != 0) {
  568.                 if (skip < 32) {
  569.                     type = 1;
  570.                 } else if (skip < 256) {
  571.                     type = 2;
  572.                 } else if (skip < 2048) {
  573.                     type = 3;
  574.                 } else {
  575.                     throw new IllegalArgumentException("Skip count cannot be over 2047!");
  576.                 }
  577.             }
  578.             pb.putBits(1, 0);
  579.             pb.putBits(2, type);
  580.             switch (type) {
  581.                 case 1:
  582.                     pb.putBits(5, skip);
  583.                     break;
  584.                 case 2:
  585.                     pb.putBits(8, skip);
  586.                     break;
  587.                 case 3:
  588.                     pb.putBits(11, skip);
  589.                     break;
  590.             }
  591.         }
  592.     }
  593. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement