Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.lazaro.rt5e.network.protocol.world;
- import org.lazaro.rt5e.Context;
- import org.lazaro.rt5e.logic.Entity;
- import org.lazaro.rt5e.logic.mask.Hit;
- import org.lazaro.rt5e.logic.mask.Mask;
- import org.lazaro.rt5e.logic.npc.NPC;
- import org.lazaro.rt5e.logic.player.Player;
- import org.lazaro.rt5e.logic.utility.WorldUpdater;
- import org.lazaro.rt5e.network.Packet;
- import org.lazaro.rt5e.network.PacketBuilder;
- import java.util.Iterator;
- /**
- * @author Lazaro
- */
- public class GNP613 implements WorldUpdater {
- private void doAnimation(NPC npc, PacketBuilder pb) {
- pb.putLEShort(npc.getMasks().getAnimationId()).putByteA(npc.getMasks().getAnimationDelay());
- }
- private void doChat(NPC npc, PacketBuilder pb) {
- pb.putString(npc.getMasks().getChat().getText());
- }
- private void doFaceEntity(NPC npc, PacketBuilder pb) {
- pb.putShortA(npc.getMasks().getFaceEntity().getId());
- }
- private void doGraphics(NPC npc, PacketBuilder pb) {
- pb.putShortA(npc.getMasks().getGraphicsId()).putInt1(npc.getMasks().getGraphicsDelay()).putByteA(npc.getMasks().getGraphicsHeight());
- }
- private void doGraphics2(NPC npc, PacketBuilder pb) {
- pb.putShort(npc.getMasks().getGraphicsId2()).putInt1(npc.getMasks().getGraphicsDelay2()).putByteC(npc.getMasks().getGraphicsHeight2());
- }
- private void doHit(NPC npc, PacketBuilder pb) {
- Hit hit = npc.getMasks().getHit();
- int hpRatio = npc.getHP() * 255 / npc.getMaxHP();
- pb.putSmart(hit.getDamage()).putByteA(hit.getType()).putByteA(hpRatio);
- }
- private void doHit2(NPC npc, PacketBuilder pb) {
- Hit hit = npc.getMasks().getHit2();
- pb.putSmart(hit.getDamage()).putByte(hit.getType());
- }
- public Packet doMaskBlock(Entity entity) {
- NPC npc = (NPC) entity;
- PacketBuilder pb = new PacketBuilder();
- int mask = 0;
- if (npc.getMasks().requiresUpdate(Mask.MaskType.ANIMATION)) {
- mask |= 0x4;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.HIT)) {
- mask |= 0x8;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.FACE_ENTITY)) {
- mask |= 0x20;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.HIT2)) {
- mask |= 0x400;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS)) {
- mask |= 0x10;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS2)) {
- mask |= 0x2000;
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.CHAT)) {
- mask |= 0x80;
- }
- if (mask >= 0x100) {
- mask |= 0x1;
- pb.putByte(mask & 0xff).putByte(mask >> 8);
- } else {
- pb.putByte(mask);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.ANIMATION)) {
- doAnimation(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.HIT)) {
- doHit(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.FACE_ENTITY)) {
- doFaceEntity(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.HIT2)) {
- doHit2(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS)) {
- doGraphics(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.GRAPHICS2)) {
- doGraphics2(npc, pb);
- }
- if (npc.getMasks().requiresUpdate(Mask.MaskType.CHAT)) {
- doChat(npc, pb);
- }
- return pb.toPacket();
- }
- private void registerNPC(Player player, NPC npc, PacketBuilder pb) {
- int x = npc.getLocation().getX() - player.getLocation().getX();
- int y = npc.getLocation().getY() - player.getLocation().getY();
- if (x < 0)
- x += 32;
- if (y < 0)
- y += 32;
- pb.putBits(15, npc.getIndex());
- pb.putBits(14, npc.getType());
- pb.putBits(1, 1);
- pb.putBits(5, y);
- pb.putBits(5, x);
- pb.putBits(1, npc.getMasks().requiresUpdate() ? 1 : 0);
- pb.putBits(2, npc.getLocation().getZ());
- pb.putBits(3, npc.getFaceDirection());
- player.getLocalNPCs().add(npc);
- }
- public void update(Player player) {
- PacketBuilder pb = new PacketBuilder(6, Packet.Type.VAR_SHORT);
- pb.putBits(8, player.getLocalNPCs().size());
- for (Iterator<NPC> it = player.getLocalNPCs().iterator(); it.hasNext();) {
- NPC npc = it.next();
- if (!npc.exists() || npc.isTeleporting() || !player.getLocation().withinRange(npc.getLocation())) {
- pb.putBits(1, 1);
- pb.putBits(2, 3);
- it.remove();
- } else {
- updateNPC(npc, pb);
- }
- }
- for (NPC npc : Context.getWorld().getLocalNPCs(player.getLocation())) {
- if (player.getLocalNPCs().size() >= 255) {
- break;
- }
- if (player.getLocalNPCs().contains(npc) || !npc.exists() || player.isTeleporting() || npc.isTeleporting()) {
- continue;
- }
- registerNPC(player, npc, pb);
- }
- pb.putBits(15, 32767);
- for (NPC npc : player.getLocalNPCs()) {
- if (npc.getMasks().requiresUpdate()) {
- pb.put(npc.getCachedMaskBlock().getBytes());
- }
- }
- player.getConnection().write(pb.toPacket());
- }
- private void updateNPC(NPC npc, PacketBuilder pb) {
- if (npc.getDirection().getDirection() == null) {
- if (npc.getMasks().requiresUpdate()) {
- pb.putBits(1, 1);
- pb.putBits(2, 0);
- } else {
- pb.putBits(1, 0);
- }
- } else {
- pb.putBits(1, 1);
- if (npc.getDirection().getSecondDirection() == null) {
- pb.putBits(2, 1);
- pb.putBits(3, npc.getDirection().getDirection().npcIntValue());
- } else {
- pb.putBits(2, 1);
- pb.putBits(1, 1);
- pb.putBits(3, npc.getDirection().getDirection().npcIntValue());
- pb.putBits(3, npc.getDirection().getSecondDirection().npcIntValue());
- }
- pb.putBits(1, npc.getMasks().requiresUpdate() ? 1 : 0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement