Thread: Netty Issue?

Results 1 to 7 of 7
  1. #1 Netty Issue? 
    Banned

    Join Date
    Mar 2011
    Posts
    4,062
    Thanks given
    194
    Thanks received
    689
    Rep Power
    0
    Edit:
    Quote Originally Posted by relex lawl View Post
    Well managed to fix some things, but still end up with this:

    Error: T2 - 81,73,249 - 3,0,0 - -128,31,-4,

    Spoiler for new PlayerUpdating:
    Code:
    package org.niobe.world.util;
    
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    import org.niobe.model.Appearance.Gender;
    import org.niobe.model.Attributes.Attribute;
    import org.niobe.model.UpdateFlag.Flag;
    import org.niobe.model.container.ItemContainer;
    import org.niobe.model.container.impl.Equipment;
    import org.niobe.model.definitions.ItemDefinition;
    import org.niobe.model.Appearance;
    import org.niobe.model.MovementQueue;
    import org.niobe.net.packet.Packet.Type;
    import org.niobe.net.packet.Packet;
    import org.niobe.net.packet.PacketBuilder;
    import org.niobe.util.NameUtils;
    import org.niobe.world.Player;
    
    public class PlayerUpdating {
    	
    	private List<Player> localPlayers = new LinkedList<Player>();
    	
    	public PlayerUpdating update() {
    		if (player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			player.getPacketSender().sendMapRegion();
    		}
    		PacketBuilder update = new PacketBuilder();
    		PacketBuilder packet = new PacketBuilder(81, Type.SHORT);
    		packet.initializeBitAccess();
    		updateMovement(packet).appendUpdates(update, player, false, true);
    		packet.writeBits(8, localPlayers.size());
    		for (Iterator<Player> playerIterator = localPlayers.iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (player.getRegion().getArea().getPlayers().contains(otherPlayer) && !otherPlayer.getAttributes().containsKey(Attribute.TELEPORTING)) {
    				updateOtherPlayerMovement(packet, otherPlayer);
    				if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    					appendUpdates(update, otherPlayer, false, false);
    				}
    			} else {
    				localPlayers.remove(otherPlayer);
    				playerIterator.remove();
    				packet.writeBits(1, 1).writeBits(2, 3);
    			}
    		}
    		for (Iterator<Player> playerIterator = player.getRegion().getArea().getPlayers().iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (localPlayers.size() >= 255)
    				break;
    			if (otherPlayer == player || localPlayers.contains(otherPlayer))
    				continue;
    			localPlayers.add(otherPlayer);
    			addPlayer(otherPlayer, packet);
    			appendUpdates(update, otherPlayer, false, false);
    		}
    		if (!update.isEmpty()) {
    			packet.writeBits(11, 2047);
    			packet.finalizeBitAccess();
    			packet.writeBuffer(update.toPacket().getBuffer());
    		} else {
    			packet.finalizeBitAccess();
    		}
    		player.write(packet.toPacket());
    		return this;
    	}
    	
    	public PlayerUpdating addPlayer(Player otherPlayer, PacketBuilder builder) {
    		builder.writeBits(11, otherPlayer.getIndex());
    		builder.writeBits(1, 1);
    		builder.writeBits(1, 1);
    		builder.writeBits(5, otherPlayer.getPosition().getY() - player.getPosition().getY());
    		builder.writeBits(5, otherPlayer.getPosition().getX() - player.getPosition().getX());
    		return this;
    	}
    	
    	private PlayerUpdating appendUpdates(PacketBuilder builder, Player player, boolean updateAppearance, boolean noChat) {
    		if (!player.getUpdateFlag().isUpdateRequired() && !updateAppearance)
    			return this;
    		int mask = 0;
    
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE) || updateAppearance) {
    			mask |= 0x10;
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			mask |= 0x80;
    		}
    
    		if (mask >= 0x100) {
    			mask |= 0x40;
    			builder.writeByte(mask & 0xFF);
    			builder.writeByte(mask >> 8);
    		} else {
    			builder.writeByte(mask);
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE) || updateAppearance) {
    			updateAppearance(builder, player);
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			updateChat(builder, player);
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateMovement(PacketBuilder builder) {
    		if (player.getAttributes().containsKey(Attribute.TELEPORTING) || player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			builder.writeBits(1, 1);
    			builder.writeBits(2, 3);
    			builder.writeBits(2, player.getPosition().getZ());
    			builder.writeBits(1, player.getTeleportTarget() != null ? 1 : 0);
    			builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    			builder.writeBits(7, player.getPosition().getLocalY());
    			builder.writeBits(7, player.getPosition().getLocalX());
    		} else {
    			if (!player.getMovementQueue().updateRequired()) {
    				if (player.getUpdateFlag().isUpdateRequired()) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 0);
    				} else {
    					builder.writeBits(1, 0);
    				}
    			} else {
    				if (player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 1);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				} else {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 2);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				}
    			}
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateChat(PacketBuilder builder, Player otherPlayer) {
    		int effects = ((otherPlayer.getPlayerUpdating().chatColor & 0xff) << 8) + (otherPlayer.getPlayerUpdating().chatEffect & 0xff);
    		builder.writeLEShort(effects);
    		builder.writeByte(/*player.getRights().ordinal()*/0);
    		builder.writeByteC((byte) otherPlayer.getPlayerUpdating().chat.length);
    		builder.writeBytes(otherPlayer.getPlayerUpdating().chat);
    		return this;
    	}
    	
    	private PlayerUpdating updateAppearance(PacketBuilder builder, Player otherPlayer) {
    		Appearance appearance = otherPlayer.getAppearance();
    		ItemContainer equipment = otherPlayer.getEquipment();
    		
    		PacketBuilder properties = new PacketBuilder();
    		
    		properties.writeByte((byte) appearance.getGender().getId());
    		properties.writeByte((byte) appearance.getHeadIcon().getId());
    		properties.writeByte((byte) appearance.getSkullHint().getId());
    		
    		int[] equip = new int[equipment.getCapacity()];
    		for (int i = 0; i < equipment.getCapacity(); i++) {
    			equip[i] = equipment.getItems()[i].getId();
    		}
    
    		if (equip[Equipment.HAT_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HAT_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.CAPE_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.CAPE_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.AMULET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.AMULET_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.WEAPON_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.WEAPON_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.BODY_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.BODY_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.CHEST]);
    		}
    
    		if (equip[Equipment.SHIELD_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.SHIELD_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.BODY_SLOT]).isFullBody()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.ARMS]);
    		}
    
    		if (equip[Equipment.LEGS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.LEGS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.LEGS]);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.HAT_SLOT]).isFullHelm()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HEAD]);
    		}
    
    		if (equip[Equipment.HANDS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HANDS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HANDS]);
    		}
    
    		if (equip[Equipment.FEET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.FEET_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.FEET]);
    		}
    		
    		if (appearance.getLook()[Appearance.BEARD] <= 0 || appearance.getGender().equals(Gender.FEMALE)) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.BEARD]);
    		}
    		
    		properties.writeByte(appearance.getLook()[Appearance.HAIR_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.TORSO_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.LEG_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.FEET_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.SKIN_COLOUR]);
    		
    		properties.writeShort(0x328); // TODO: standAnimIndex
    		properties.writeShort(0x337); // TODO: standTurnAnimIndex
    		properties.writeShort(0x333); // TODO: walkAnimIndex
    		properties.writeShort(0x334); // TODO: turn180AnimIndex
    		properties.writeShort(0x335); // TODO: turn90CWAnimIndex
    		properties.writeShort(0x336); // TODO: turn90CCWAnimIndex
    		properties.writeShort(0x338); // TODO: runAnimIndex
    		
    		properties.writeLong(NameUtils.nameToLong(player.getUsername()));
    		
    		properties.writeByte(otherPlayer.getSkills().getCombatLevel());
    		properties.writeShort(otherPlayer.getSkills().getTotalLevel());
    		
    		Packet packet = properties.toPacket();
    		
    		builder.writeByteC((byte) packet.getLength());
    		builder.writeBuffer(packet.getBuffer());
    		return this;
    	}
    	
    	private PlayerUpdating updateOtherPlayerMovement(PacketBuilder packetBuilder, Player otherPlayer) {
    		if (!otherPlayer.getMovementQueue().updateRequired()) {
    			if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    				packetBuilder.writeBits(1, 1);
    				packetBuilder.writeBits(2, 0);
    			} else {
    				packetBuilder.writeBits(1, 0);
    			}
    		} else if (otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 1);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		} else {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 2);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]); // Walking
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]); // Running
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		}
    		return this;
    	}
    	
    	public PlayerUpdating resetFlags() {
    		chat = new byte[256];
    		chatColor = chatEffect = 0;
    		player.getUpdateFlag().set(Flag.NONE);
    		player.getMovementQueue().setDirections(-1, -1);
    		return this;
    	}
    
    	public PlayerUpdating(Player player) {
    		this.player = player;
    	}
    	
    	private Player player;
    	
    	private byte[] chat = new byte[256];
    	
    	private int chatColor = 0, chatEffect = 0;
    }


    I've never been able to make a framework with netty...I always end up getting stuck on login, never wants to successfully show the map region, I honestly do not know what's wrong....It just gets stuck at loading - please wait. I mean it should work:

    Nov 26, 2012 5:32:57 PM org.niobe.Server main
    INFO: Launching Niobe, please be patient while configurations are being loaded...
    Loading npc definitions...
    Loaded 11257 npc definitions in 1495ms
    Loading object definitions...
    Loaded 20461 object definitions in 2221ms
    Loading item definitions...
    Loaded 20694 item definitions in 1310ms
    Loading shop definitions...
    Loaded 2 shop definitions in 3ms.
    Nov 26, 2012 5:33:03 PM org.niobe.Server main
    INFO: Port 43594 has been binded.
    sending raw packet with size: 256
    sending raw packet with size: 256
    Registered player: Dddd
    sending finalized Packet - [opcode, size] : [249, 256]
    sending finalized Packet - [opcode, size] : [73, 256]
    sending map region for position: Position values: [x, y, z] - [3222, 3222, 0].
    setting session's player

    received packet message: Packet - [opcode, size] : [3, 1] <-- This is from me clicking outside the client.

    This is the message received method from my ChanneHandler (extends SimpleChannelHandler)

    Spoiler for messageReceived:
    Code:
    @Override
    	public void messageReceived(ChannelHandlerContext context, MessageEvent event) {
    		if (event.getMessage() instanceof Player) {
    			Player player = (Player) event.getMessage();
    			session.setPlayer(player);
    			System.out.println("setting session's player");
    		} else if (event.getMessage() instanceof Packet) {
    			if (session.getPlayer() != null) {
    				Packet packet = (Packet) event.getMessage();
    				PacketExecutor.parse(session.getPlayer(), packet);
    				System.out.println("received packet message: " + packet.toString());
    			}
    		} else {
    			System.out.println("received unhandled message: " + event.getMessage().toString());
    		}
    	}



    Spoiler for sendLogin:
    Code:
    public PacketSender sendLogin() {
    		player.write(new PacketBuilder(249).writeByteA((byte) 1).writeLEShortA(player.getIndex()).toPacket());
    
    		sendMapRegion();	
    		
    		/*sendSidebarInterface(0, 2423); // attack tab
    		sendSidebarInterface(1, 3917); // skills tab
    		sendSidebarInterface(2, 638); // quest tab
    		sendSidebarInterface(3, 3213); // backpack tab
    		sendSidebarInterface(4, 1644); // items wearing tab
    		sendSidebarInterface(5, 5608); // pray tab
    		sendSidebarInterface(6, 1151); // magic tab
    		sendSidebarInterface(7, -1); // clan chat
    		sendSidebarInterface(8, 5065); // friend
    		sendSidebarInterface(9, 5715); // ignore
    		sendSidebarInterface(10, 2449); // logout tab
    		sendSidebarInterface(11, 904); // wrench tab
    		sendSidebarInterface(12, 147); // run tab
    		sendSidebarInterface(13, -1); // harp tab
    		
    		sendInteractionOption("Attack", 2, false);
    		sendInteractionOption("Follow", 3, false);
    		sendInteractionOption("Trade With", 4, false);*/
    		
    		//sendMessage("Welcome to RuneScape.");
    		return this;
    	}


    Spoiler for PacketEncoder extends OneToOneEncoder:
    Code:
    @Override
    	protected Object encode(ChannelHandlerContext context, Channel channel, Object message) throws Exception {
    		Packet packet = (Packet) message;
    		if (packet.getOpcode() == -1) {
    			System.out.println("sending raw packet with size: " + packet.getLength());
    			return packet.getBuffer();
    		}
    		int opcode = packet.getOpcode();
    		Type type = packet.getType();
    		int length = packet.getLength();
    		/*
    		 * Encrypts the packet's opcode.
    		 */
    		opcode += algorithm.getNextValue();
    		
    		int totalLength = length + 1;
    		switch (type) {
    		case BYTE:
    			totalLength += 1;
    			break;
    		case SHORT:
    			totalLength += 2;
    			break;
    		}
    		ChannelBuffer buffer = ChannelBuffers.buffer(totalLength);
    		buffer.writeByte(opcode);
    		switch (type) {
    		case BYTE:
    			buffer.writeByte(length);
    			break;
    		case SHORT:
    			buffer.writeShort(length);
    			break;
    		}
    		System.out.println("sending finalized " + packet.toString());
    		buffer.writeBytes(packet.getBuffer());
    		return buffer;
    	}


    Those are the 3 methods that should be causing the problem, but I still don't get it, also these:

    Spoiler for sendMapRegion:
    Code:
    public PacketSender sendMapRegion() {
    		player.setLastKnownRegion(player.getPosition());
    		player.write(new PacketBuilder(73).writeShortA(player.getPosition().getRegionX() + 6).writeShort(player.getPosition().getRegionY() + 6).toPacket());
    		player.getAttributes().remove("changing_region");
    		System.out.println("sending map region for position: " + player.getPosition().toString());
    		return this;
    	}


    Spoiler for Packet:
    Code:
    package org.niobe.net.packet;
    
    import org.jboss.netty.buffer.ChannelBuffer;
    
    public class Packet {
    	
    	public Packet(int opcode, Type type, ChannelBuffer buffer) {
    		this.opcode = opcode;
    		this.type = type;
    		this.buffer = buffer;
    	}
    	
    	private final int opcode;
    	
    	public int getOpcode() {
    		return opcode;
    	}
    	
    	private Type type;
    	
    	public Type getType() {
    		return type;
    	}
    	
    	private ChannelBuffer buffer;
    	
    	public ChannelBuffer getBuffer() {
    		return buffer;
    	}
    	
    	public int getLength() {
    		return buffer.capacity();
    	}
    	
    	public byte readByte() {
    		return buffer.readByte();
    	}
    	
    	public byte readByteA() {
    		return (byte) (readByte() - 128);
    	}
    	
    	public byte readByteC() {
    		return (byte) (-readByte());
    	}
    	
    	public byte readByteS() {
    		return (byte) (128 - readByte());
    	}
    	
    	public Packet readBytes(byte[] bytes) {
    		buffer.readBytes(bytes);
    		return this;
    	}
    	
    	public Packet readReversedBytes(byte[] bytes, int offset, int length) {
    		for (int i = (offset + length - 1); i >= offset; i--)
    			bytes[i] = readByte();
    		return this;
    	}
    	
    	public Packet readReversedBytesA(byte[] bytes, int offset, int length) {
    		for (int i = (offset + length - 1); i >= offset; i--)
    			bytes[i] = readByteA();
    		return this;
    	}
    	
    	public Packet readBytes(byte[] bytes, int offset, int length) {
    		for (int i = 0; i < length; i++)
    			bytes[offset + i] = readByte();
    		return this;
    	}
    	
    	public int readUnsignedByte() {
    		return readByte() & 0xff;
    	}
    	
    	public short readShort() {
    		return buffer.readShort();
    	}
    	
    	public short readShortA() {
    		int value = ((readByte() & 0xFF) << 8) | (readByte() - 128 & 0xFF);
    		return (short) (value > 32767 ? value - 0x10000 : value);
    	}
    	
    	public short readLEShort() {
    		int value = (readByte() & 0xFF) | (readByte() & 0xFF) << 8;
    		return (short) (value > 32767 ? value - 0x10000 : value);
    	}
    	
    	public short readLEShortA() {
    		int value = (readByte() - 128 & 0xFF) | (readByte() & 0xFF) << 8;
    		return (short) (value > 32767 ? value - 0x10000 : value);
    	}
    	
    	public int readUnsignedShort() {
    		int valuealue = 0;
    		valuealue |= readUnsignedByte() << 8;
    		valuealue |= readUnsignedByte();
    		return valuealue;
    	}
    	
    	public int readUnsignedShortA() {
    		int value = 0;
    		value |= readUnsignedByte() << 8;
    		value |= (readByte() - 128) & 0xff;
    		return value;
    	}
    	
    	public int readInt() {
    		return buffer.readInt();
    	}
    	
    	public int readSingleInt() {
    		byte firstByte = readByte(), secondByte = readByte(), thirdByte = readByte(), fourthByte = readByte();
    		return ((thirdByte << 24) & 0xFF) | ((fourthByte << 16) & 0xFF) | ((firstByte << 8) & 0xFF) | (secondByte & 0xFF);
    	}
    	
    	public int readDuoInt() {
    		int firstByte = readByte() & 0xFF, secondByte = readByte() & 0xFF, thirdByte = readByte() & 0xFF, fourthByte = readByte() & 0xFF;
    		return ((secondByte << 24) & 0xFF) | ((firstByte << 16) & 0xFF) | ((fourthByte << 8) & 0xFF) | (thirdByte & 0xFF);
    	}
    	
    	public int readTriInt() {
    		return ((readByte() << 16) & 0xFF) | ((readByte() << 8) & 0xFF) | (readByte() & 0xFF);
    	}
    	
    	public long readLong() {
    		return buffer.readLong();
    	}
    	
    	public String readString() {
    		StringBuilder builder = new StringBuilder();
    		byte value;
    		while (buffer.readable() && (value = buffer.readByte()) != 10) {
    			builder.append((char) value);
    		}
    		return builder.toString();
    	}
    	
    	public int readSmart() {
    		return buffer.getByte(buffer.readerIndex()) < 128 ? readByte() & 0xFF : (readShort() & 0xFFFF) - 32768;
    	}
    
    	public int readSignedSmart() {
    		return buffer.getByte(buffer.readerIndex()) < 128 ? (readByte() & 0xFF) - 64 : (readShort() & 0xFFFF) - 49152;
    	}
    	
    	@Override
    	public String toString() {
    		return "Packet - [opcode, size] : [" + getOpcode() + ", " + getLength() + "]";
    	}
    	
    	public enum Type {
    		FIXED,
    		BYTE,
    		SHORT;
    	}
    }


    Spoiler for PacketBuilder:
    Code:
    package org.niobe.net.packet;
    
    import org.jboss.netty.buffer.ChannelBuffer;
    import org.jboss.netty.buffer.ChannelBuffers;
    import org.niobe.net.packet.Packet.Type;
    
    public class PacketBuilder {
    	
    	public PacketBuilder(int opcode, Type type) {
    		this.opcode = opcode;
    		this.type = type;
    	}
    	
    	public PacketBuilder(int opcode) {
    		this(opcode, Type.FIXED);
    	}
    	
    	public PacketBuilder() {
    		this(-1);
    	}
    	
    	private final int opcode;
    	
    	private final Type type;
    	
    	private int bitPosition;
    	
    	private final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
    	
    	public boolean isEmpty() {
    		return buffer.writerIndex() == 0;
    	}
    	
    	public PacketBuilder writeByte(byte value) {
    		buffer.writeByte(value);
    		return this;
    	}
    	
    	public PacketBuilder writeByte(int value) {
    		writeByte((byte) value);
    		return this;
    	}
    	
    	public PacketBuilder writeByteA(byte value) {
    		writeByte((byte) (value + 128));
    		return this;
    	}
    	
    	public PacketBuilder writeByteC(byte value) {
    		writeByte((byte) (-value));
    		return this;
    	}
    	
    	public PacketBuilder writeByteS(byte value) {
    		writeByte((byte) (128 - value));
    		return this;
    	}
    	
    	public PacketBuilder writeBytes(byte[] bytes) {
    		buffer.writeBytes(bytes);
    		return this;
    	}
    	
    	public PacketBuilder writeBytes(byte[] bytes, int offset, int length) {
    		writeBytes(bytes, offset, length);
    		return this;
    	}
    	
    	public PacketBuilder writeBytes(int value, int amount) {
    		for (; amount > 0; amount--) {
    			buffer.writeByte((byte) value);
    		}
    		return this;
    	}
    	
    	public PacketBuilder writeReversedBytes(byte[] bytes, int offset, int length) {
    		for (int i = (offset + length - 1); i >= offset; i--)
    			writeByte(bytes[i]);
    		return this;
    	}
    	
    	public PacketBuilder putReverseA(final byte[] bytes, final int offset, final int length) {
    		for (int i = (offset + length - 1); i >= offset; i--)
    			writeByteA(bytes[i]);
    		return this;
    	}
    	
    	public PacketBuilder writeShort(int value) {
    		buffer.writeShort((short) value);
    		return this;
    	}
    	
    	public PacketBuilder writeInt(int value) {
    		buffer.writeInt(value);
    		return this;
    	}
    	
    	public PacketBuilder writeSingleInt(int value) {
    		writeByte((byte) (value >> 8)).writeByte((byte) value).writeByte((byte) (value >> 24)).writeByte((byte) (value >> 16));
    		return this;
    	}
    	
    	public PacketBuilder writeDuoInt(int value) {
    		writeByte((byte) (value >> 16)).writeByte((byte) (value >> 24)).writeByte((byte) value).writeByte((byte) (value >> 8));
    		return this;
    	}
    	
    	public PacketBuilder writeTriInt(int value) {
    		writeByte((byte) (value >> 16)).writeByte((byte) (value >> 8)).writeByte((byte) value);
    		return this;
    	}
    	
    	public PacketBuilder writeLEInt(int value) {
    		writeByte((byte) (value)).writeByte((byte) (value >> 8)).writeByte((byte) (value >> 16)).writeByte((byte) (value >> 24));
    		return this;
    	}
    	
    	public PacketBuilder writeLong(long value) {
    		buffer.writeLong(value);
    		return this;
    	}
    	
    	public PacketBuilder writeString(String string) {
    		buffer.writeBytes(string.getBytes());
    		writeByte((byte) 10);
    		return this;
    	}
    	
    	public PacketBuilder writeShortA(int value) {
    		writeByte((byte) (value >> 8)).writeByte((byte) (value + 128));
    		return this;
    	}
    	
    	public PacketBuilder writeLEShort(int value) {
    		writeByte((byte) (value)).writeByte((byte) (value >> 8));
    		return this;
    	}
    	
    	public PacketBuilder writeLEShortA(int value) {
    		writeByte((byte) (value + 128)).writeByte((byte) (value >> 8));
    		return this;
    	}
    	
    	public PacketBuilder writeSmart(int value) {
    		if (value < 128)
    			writeByte((byte)value);
    		else
    			writeShort((value + 32768));
    		return this;
    	}
    	
    	public PacketBuilder writeSignedSmart(int value) {
    		if (value < 128)
    			writeByte((byte) (value + 64));
    		else
    			writeShort((value + 49152));
    		return this;
    	}
    	
    	public PacketBuilder writeBuffer(ChannelBuffer buffer) {
    		buffer.writeBytes(buffer);
    		return this;
    	}
    	
    	public PacketBuilder initializeBitAccess() {
    		bitPosition = buffer.writerIndex() * 8;
    		return this;
    	}
    	
    	public PacketBuilder finalizeBitAccess() {
    		buffer.writerIndex((bitPosition + 7) / 8);
    		return this;
    	}
    	
    	public PacketBuilder writeBits(int numBits, final int value) {
    		if (!buffer.hasArray())
    			throw new UnsupportedOperationException("The ChannelBuffer implementation must support array() for bit usage.");
    
    		final int bytes = (int) Math.ceil(numBits / 8D) + 1;
    		buffer.ensureWritableBytes((bitPosition + 7) / 8 + bytes);
    
    		final byte[] buffer = this.buffer.array();
    
    		int bytePos = bitPosition >> 3;
    		int bitOffset = 8 - (bitPosition & 7);
    		bitPosition += numBits;
    
    		for (; numBits > bitOffset; bitOffset = 8) {
    			buffer[bytePos] &= ~BIT_MASK[bitOffset];
    			buffer[bytePos++] |= (value >> (numBits - bitOffset)) & BIT_MASK[bitOffset];
    			numBits -= bitOffset;
    		}
    		if (numBits == bitOffset) {
    			buffer[bytePos] &= ~BIT_MASK[bitOffset];
    			buffer[bytePos] |= value & BIT_MASK[bitOffset];
    		} else {
    			buffer[bytePos] &= ~(BIT_MASK[numBits] << (bitOffset - numBits));
    			buffer[bytePos] |= (value & BIT_MASK[numBits]) << (bitOffset - numBits);
    		}
    		return this;
    	}
    	
    	public Packet toPacket() {
    		return new Packet(opcode, type, buffer);
    	}
    
    	public static final int[] BIT_MASK = new int[32];
    	
    	static {
    		for (int i = 0; i < BIT_MASK.length; i++) {
    			BIT_MASK[i] = (1 << i) - 1;
    		}
    	}
    }
    Reply With Quote  
     

  2. #2  
    Registered Member

    Join Date
    Apr 2012
    Posts
    762
    Thanks given
    0
    Thanks received
    276
    Rep Power
    213
    Player updating is needed to show the actual map.
    Reply With Quote  
     

  3. Thankful user:


  4. #3  
    Donator

    Netty's Avatar
    Join Date
    Jul 2011
    Posts
    176
    Thanks given
    189
    Thanks received
    62
    Rep Power
    115
    notice how the size of all your packets is 256. that's netty's default buffer capacity.

    the getLength method is returning the capacity of the buffer, not the size (writerIndex) of it. to fix, either

    a) change
    Code:
    public int getLength() {
        return buffer.capacity();
    }
    to
    Code:
    public int getLength() {
        return buffer.writerIndex();
    }
    or

    b) get the slice of the buffer in your encoder and then get the capacity of the slice, which would be the preffered way, but your encoder's code might not look as pretty as you don't use getLength anymore. i'll let you figure out how to do it this way.
    Reply With Quote  
     

  5. Thankful user:


  6. #4  
    Banned

    Join Date
    Mar 2011
    Posts
    4,062
    Thanks given
    194
    Thanks received
    689
    Rep Power
    0
    Quote Originally Posted by Netty View Post
    notice how the size of all your packets is 256. that's netty's default buffer capacity.

    the getLength method is returning the capacity of the buffer, not the size (writerIndex) of it. to fix, either

    a) change
    Code:
    public int getLength() {
        return buffer.capacity();
    }
    to
    Code:
    public int getLength() {
        return buffer.writerIndex();
    }
    or

    b) get the slice of the buffer in your encoder and then get the capacity of the slice, which would be the preffered way, but your encoder's code might not look as pretty as you don't use getLength anymore. i'll let you figure out how to do it this way.
    Pretty sure that solved one issue, but now I need to fix my player updating to see if it will log in now.
    Reply With Quote  
     

  7. #5  
    Banned

    Join Date
    Mar 2011
    Posts
    4,062
    Thanks given
    194
    Thanks received
    689
    Rep Power
    0
    Well wrote player updating, just a base atm, but it's giving me this:

    Error: Error packet size mismatch in getplayer pos:3 psize:2
    Error: T2 - 81,249,-1 - 2,0,0 - -128,0,

    Not entirely sure what's causing it though...This is my PlayerUpdating:

    Spoiler for PlayerUpdating:
    Code:
    package org.niobe.world.util;
    
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    import org.niobe.model.Appearance.Gender;
    import org.niobe.model.Attributes.Attribute;
    import org.niobe.model.UpdateFlag.Flag;
    import org.niobe.model.container.ItemContainer;
    import org.niobe.model.container.impl.Equipment;
    import org.niobe.model.definitions.ItemDefinition;
    import org.niobe.model.Appearance;
    import org.niobe.model.MovementQueue;
    import org.niobe.net.packet.Packet.Type;
    import org.niobe.net.packet.Packet;
    import org.niobe.net.packet.PacketBuilder;
    import org.niobe.util.NameUtils;
    import org.niobe.world.Player;
    import org.niobe.world.World;
    
    public class PlayerUpdating {
    	
    	private List<Player> localPlayers = new LinkedList<Player>();
    	
    	public PlayerUpdating update() {
    		if (player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			player.getPacketSender().sendMapRegion();
    		}
    		PacketBuilder update = new PacketBuilder();
    		PacketBuilder packet = new PacketBuilder(81, Type.SHORT);
    		packet.initializeBitAccess();
    		updateMovement(packet).appendUpdates(update, player, false, true);
    		packet.writeBits(8, localPlayers.size());
    		System.out.println("Current local players: ");
    		for (Player player : localPlayers) {
    			System.out.println("Player: " + player.getUsername());
    		}
    		for (Iterator<Player> playerIterator = localPlayers.iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (player.getRegion().getArea().getPlayers().contains(otherPlayer) && !otherPlayer.getAttributes().containsKey(Attribute.TELEPORTING)) {
    				updateOtherPlayerMovement(packet, otherPlayer);
    				if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    					appendUpdates(update, otherPlayer, false, false);
    				}
    			} else {
    				localPlayers.remove(otherPlayer);
    				playerIterator.remove();
    				packet.writeBits(1, 1).writeBits(2, 3);
    			}
    		}
    		for (Iterator<Player> playerIterator = player.getRegion().getArea().getPlayers().iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (localPlayers.size() >= 255)
    				break;
    			if (otherPlayer == player || localPlayers.contains(otherPlayer))
    				continue;
    			localPlayers.add(otherPlayer);
    			addPlayer(otherPlayer, packet);
    			appendUpdates(update, otherPlayer, false, false);
    		}
    		if (!update.isEmpty()) {
    			packet.writeBits(11, 2047);
    			packet.finalizeBitAccess();
    			packet.writeBuffer(update.toPacket().getBuffer());
    			System.out.println("builder is not empty.");
    		} else {
    			packet.finalizeBitAccess();
    			System.out.println("builder is empty");
    		}
    		System.out.println("writing update.toPacket()");
    		player.write(packet.toPacket());
    		return this;
    	}
    	
    	public PlayerUpdating addPlayer(Player otherPlayer, PacketBuilder builder) {
    		builder.writeBits(11, otherPlayer.getIndex());
    		builder.writeBits(1, 1);
    		builder.writeBits(1, 1);
    		builder.writeBits(5, otherPlayer.getPosition().getY() - otherPlayer.getPosition().getY());
    		builder.writeBits(5, otherPlayer.getPosition().getX() - otherPlayer.getPosition().getX());
    		appendUpdates(builder, otherPlayer, true, false);
    		return this;
    	}
    	
    	private PlayerUpdating appendUpdates(PacketBuilder builder, Player player, boolean updateAppearance, boolean noChat) {
    		if (!player.getUpdateFlag().isUpdateRequired() && !updateAppearance)
    			return this;
    		PacketBuilder block = new PacketBuilder();
    		int mask = 0;
    		
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE) || updateAppearance) {
    			mask |= 0x10;
    		}
    		
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			mask |= 0x80;
    		}
    		
    		if (mask >= 0x100) {
    			mask |= 0x40;
    			 block.writeByte((byte) (mask & 0xFF));
                 block.writeByte((byte) (mask >> 8));
    		} else {
    			block.writeByte((byte) mask);
    		}
    		
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE)) {
    			updateAppearance(block, player);
    		}
    		
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			updateChat(block, player);
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateMovement(PacketBuilder builder) {
    		if (player.getAttributes().containsKey(Attribute.TELEPORTING) || player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			builder.writeBits(1, 1);
    			builder.writeBits(2, 3);
    			builder.writeBits(2, player.getPosition().getZ());
    			builder.writeBits(1, player.getTeleportTarget() != null ? 1 : 0);
    			builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    			builder.writeBits(7, player.getPosition().getLocalY());
    			builder.writeBits(7, player.getPosition().getLocalX());
    		} else {
    			if (!player.getMovementQueue().updateRequired()) {
    				if (player.getUpdateFlag().isUpdateRequired()) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 0);
    				} else {
    					builder.writeBits(1, 0);
    				}
    			} else {
    				if (player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 1);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				} else {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 2);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				}
    			}
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateChat(PacketBuilder builder, Player otherPlayer) {
    		int effects = ((otherPlayer.getPlayerUpdating().chatColor & 0xff) << 8) + (otherPlayer.getPlayerUpdating().chatEffect & 0xff);
    		builder.writeLEShort(effects);
    		builder.writeByte(/*player.getRights().ordinal()*/0);
    		builder.writeByteC((byte) otherPlayer.getPlayerUpdating().chat.length);
    		builder.writeBytes(otherPlayer.getPlayerUpdating().chat);
    		return this;
    	}
    	
    	private PlayerUpdating updateAppearance(PacketBuilder builder, Player otherPlayer) {
    		Appearance appearance = otherPlayer.getAppearance();
    		ItemContainer equipment = otherPlayer.getEquipment();
    		
    		PacketBuilder properties = new PacketBuilder();
    		
    		properties.writeByte((byte) appearance.getGender().getId());
    		properties.writeByte((byte) appearance.getHeadIcon().getId());
    		properties.writeByte((byte) appearance.getSkullHint().getId());
    		
    		int[] equip = new int[equipment.getCapacity()];
    		for (int i = 0; i < equipment.getCapacity(); i++) {
    			equip[i] = equipment.getItems()[i].getId();
    		}
    
    		if (equip[Equipment.HAT_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HAT_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.CAPE_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.CAPE_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.AMULET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.AMULET_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.WEAPON_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.WEAPON_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.BODY_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.BODY_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.CHEST]);
    		}
    
    		if (equip[Equipment.SHIELD_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.SHIELD_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.BODY_SLOT]).isFullBody()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.ARMS]);
    		}
    
    		if (equip[Equipment.LEGS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.LEGS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.LEGS]);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.HAT_SLOT]).isFullHelm()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HEAD]);
    		}
    
    		if (equip[Equipment.HANDS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HANDS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HANDS]);
    		}
    
    		if (equip[Equipment.FEET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.FEET_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.FEET]);
    		}
    		
    		if (appearance.getLook()[Appearance.BEARD] <= 0 || appearance.getGender().equals(Gender.FEMALE)) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.BEARD]);
    		}
    		
    		properties.writeByte(appearance.getLook()[Appearance.HAIR_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.TORSO_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.LEG_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.FEET_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.SKIN_COLOUR]);
    		
    		properties.writeShort(0x328); // TODO: standAnimIndex
    		properties.writeShort(0x337); // TODO: standTurnAnimIndex
    		properties.writeShort(0x333); // TODO: walkAnimIndex
    		properties.writeShort(0x334); // TODO: turn180AnimIndex
    		properties.writeShort(0x335); // TODO: turn90CWAnimIndex
    		properties.writeShort(0x336); // TODO: turn90CCWAnimIndex
    		properties.writeShort(0x338); // TODO: runAnimIndex
    		
    		properties.writeLong(NameUtils.nameToLong(player.getUsername()));
    		
    		properties.writeByte(otherPlayer.getSkills().getCombatLevel());
    		properties.writeShort(otherPlayer.getSkills().getTotalLevel());
    		
    		Packet packet = properties.toPacket();
    		
    		builder.writeByteC((byte) packet.getLength());
    		builder.writeBuffer(packet.getBuffer());
    		return this;
    	}
    	
    	private PlayerUpdating updateOtherPlayerMovement(PacketBuilder packetBuilder, Player otherPlayer) {
    		if (!otherPlayer.getMovementQueue().updateRequired()) {
    			if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    				packetBuilder.writeBits(1, 1);
    				packetBuilder.writeBits(2, 0);
    			} else {
    				packetBuilder.writeBits(1, 0);
    			}
    		} else if (otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 1);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		} else {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 2);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]); // Walking
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]); // Running
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		}
    		return this;
    	}
    	
    	public PlayerUpdating resetFlags() {
    		chat = new byte[256];
    		chatColor = chatEffect = 0;
    		player.getUpdateFlag().set(Flag.NONE);
    		player.getMovementQueue().setDirections(-1, -1);
    		return this;
    	}
    
    	public PlayerUpdating(Player player) {
    		this.player = player;
    	}
    	
    	private Player player;
    	
    	private byte[] chat = new byte[256];
    	
    	private int chatColor = 0, chatEffect = 0;
    }


    Might be the isEmpty boolean for PacketBuilder:

    public boolean isEmpty() {
    return buffer.writerIndex() == 0;
    }

    ^ nvm that's correct.

    I wasn't sure it that was right in the first place.
    Reply With Quote  
     

  8. #6  
    Banned

    Join Date
    Mar 2011
    Posts
    4,062
    Thanks given
    194
    Thanks received
    689
    Rep Power
    0
    Well managed to fix some things, but still end up with this:

    Error: T2 - 81,73,249 - 3,0,0 - -128,31,-4,

    Spoiler for new PlayerUpdating:
    Code:
    package org.niobe.world.util;
    
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    import org.niobe.model.Appearance.Gender;
    import org.niobe.model.Attributes.Attribute;
    import org.niobe.model.UpdateFlag.Flag;
    import org.niobe.model.container.ItemContainer;
    import org.niobe.model.container.impl.Equipment;
    import org.niobe.model.definitions.ItemDefinition;
    import org.niobe.model.Appearance;
    import org.niobe.model.MovementQueue;
    import org.niobe.net.packet.Packet.Type;
    import org.niobe.net.packet.Packet;
    import org.niobe.net.packet.PacketBuilder;
    import org.niobe.util.NameUtils;
    import org.niobe.world.Player;
    
    public class PlayerUpdating {
    	
    	private List<Player> localPlayers = new LinkedList<Player>();
    	
    	public PlayerUpdating update() {
    		if (player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			player.getPacketSender().sendMapRegion();
    		}
    		PacketBuilder update = new PacketBuilder();
    		PacketBuilder packet = new PacketBuilder(81, Type.SHORT);
    		packet.initializeBitAccess();
    		updateMovement(packet).appendUpdates(update, player, false, true);
    		packet.writeBits(8, localPlayers.size());
    		for (Iterator<Player> playerIterator = localPlayers.iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (player.getRegion().getArea().getPlayers().contains(otherPlayer) && !otherPlayer.getAttributes().containsKey(Attribute.TELEPORTING)) {
    				updateOtherPlayerMovement(packet, otherPlayer);
    				if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    					appendUpdates(update, otherPlayer, false, false);
    				}
    			} else {
    				localPlayers.remove(otherPlayer);
    				playerIterator.remove();
    				packet.writeBits(1, 1).writeBits(2, 3);
    			}
    		}
    		for (Iterator<Player> playerIterator = player.getRegion().getArea().getPlayers().iterator(); playerIterator.hasNext();) {
    			Player otherPlayer = (Player) playerIterator.next();
    			if (localPlayers.size() >= 255)
    				break;
    			if (otherPlayer == player || localPlayers.contains(otherPlayer))
    				continue;
    			localPlayers.add(otherPlayer);
    			addPlayer(otherPlayer, packet);
    			appendUpdates(update, otherPlayer, false, false);
    		}
    		if (!update.isEmpty()) {
    			packet.writeBits(11, 2047);
    			packet.finalizeBitAccess();
    			packet.writeBuffer(update.toPacket().getBuffer());
    		} else {
    			packet.finalizeBitAccess();
    		}
    		player.write(packet.toPacket());
    		return this;
    	}
    	
    	public PlayerUpdating addPlayer(Player otherPlayer, PacketBuilder builder) {
    		builder.writeBits(11, otherPlayer.getIndex());
    		builder.writeBits(1, 1);
    		builder.writeBits(1, 1);
    		builder.writeBits(5, otherPlayer.getPosition().getY() - player.getPosition().getY());
    		builder.writeBits(5, otherPlayer.getPosition().getX() - player.getPosition().getX());
    		return this;
    	}
    	
    	private PlayerUpdating appendUpdates(PacketBuilder builder, Player player, boolean updateAppearance, boolean noChat) {
    		if (!player.getUpdateFlag().isUpdateRequired() && !updateAppearance)
    			return this;
    		int mask = 0;
    
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE) || updateAppearance) {
    			mask |= 0x10;
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			mask |= 0x80;
    		}
    
    		if (mask >= 0x100) {
    			mask |= 0x40;
    			builder.writeByte(mask & 0xFF);
    			builder.writeByte(mask >> 8);
    		} else {
    			builder.writeByte(mask);
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.APPEARANCE) || updateAppearance) {
    			updateAppearance(builder, player);
    		}
    
    		if (player.getUpdateFlag().flagged(Flag.CHAT) && !noChat) {
    			updateChat(builder, player);
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateMovement(PacketBuilder builder) {
    		if (player.getAttributes().containsKey(Attribute.TELEPORTING) || player.getAttributes().containsKey(Attribute.CHANGING_REGION)) {
    			builder.writeBits(1, 1);
    			builder.writeBits(2, 3);
    			builder.writeBits(2, player.getPosition().getZ());
    			builder.writeBits(1, player.getTeleportTarget() != null ? 1 : 0);
    			builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    			builder.writeBits(7, player.getPosition().getLocalY());
    			builder.writeBits(7, player.getPosition().getLocalX());
    		} else {
    			if (!player.getMovementQueue().updateRequired()) {
    				if (player.getUpdateFlag().isUpdateRequired()) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 0);
    				} else {
    					builder.writeBits(1, 0);
    				}
    			} else {
    				if (player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 1);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				} else {
    					builder.writeBits(1, 1);
    					builder.writeBits(2, 2);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    					builder.writeBits(3, player.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]);
    					builder.writeBits(1, player.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    				}
    			}
    		}
    		return this;
    	}
    	
    	private PlayerUpdating updateChat(PacketBuilder builder, Player otherPlayer) {
    		int effects = ((otherPlayer.getPlayerUpdating().chatColor & 0xff) << 8) + (otherPlayer.getPlayerUpdating().chatEffect & 0xff);
    		builder.writeLEShort(effects);
    		builder.writeByte(/*player.getRights().ordinal()*/0);
    		builder.writeByteC((byte) otherPlayer.getPlayerUpdating().chat.length);
    		builder.writeBytes(otherPlayer.getPlayerUpdating().chat);
    		return this;
    	}
    	
    	private PlayerUpdating updateAppearance(PacketBuilder builder, Player otherPlayer) {
    		Appearance appearance = otherPlayer.getAppearance();
    		ItemContainer equipment = otherPlayer.getEquipment();
    		
    		PacketBuilder properties = new PacketBuilder();
    		
    		properties.writeByte((byte) appearance.getGender().getId());
    		properties.writeByte((byte) appearance.getHeadIcon().getId());
    		properties.writeByte((byte) appearance.getSkullHint().getId());
    		
    		int[] equip = new int[equipment.getCapacity()];
    		for (int i = 0; i < equipment.getCapacity(); i++) {
    			equip[i] = equipment.getItems()[i].getId();
    		}
    
    		if (equip[Equipment.HAT_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HAT_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.CAPE_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.CAPE_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.AMULET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.AMULET_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.WEAPON_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.WEAPON_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (equip[Equipment.BODY_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.BODY_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.CHEST]);
    		}
    
    		if (equip[Equipment.SHIELD_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.SHIELD_SLOT]);
    		} else {
    			properties.writeByte(0);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.BODY_SLOT]).isFullBody()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.ARMS]);
    		}
    
    		if (equip[Equipment.LEGS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.LEGS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.LEGS]);
    		}
    
    		if (ItemDefinition.forId(equip[Equipment.HAT_SLOT]).isFullHelm()) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HEAD]);
    		}
    
    		if (equip[Equipment.HANDS_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.HANDS_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.HANDS]);
    		}
    
    		if (equip[Equipment.FEET_SLOT] > -1) {
    			properties.writeShort(0x200 + equip[Equipment.FEET_SLOT]);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.FEET]);
    		}
    		
    		if (appearance.getLook()[Appearance.BEARD] <= 0 || appearance.getGender().equals(Gender.FEMALE)) {
    			properties.writeByte(0);
    		} else {
    			properties.writeShort(0x100 + appearance.getLook()[Appearance.BEARD]);
    		}
    		
    		properties.writeByte(appearance.getLook()[Appearance.HAIR_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.TORSO_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.LEG_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.FEET_COLOUR]);
    		properties.writeByte(appearance.getLook()[Appearance.SKIN_COLOUR]);
    		
    		properties.writeShort(0x328); // TODO: standAnimIndex
    		properties.writeShort(0x337); // TODO: standTurnAnimIndex
    		properties.writeShort(0x333); // TODO: walkAnimIndex
    		properties.writeShort(0x334); // TODO: turn180AnimIndex
    		properties.writeShort(0x335); // TODO: turn90CWAnimIndex
    		properties.writeShort(0x336); // TODO: turn90CCWAnimIndex
    		properties.writeShort(0x338); // TODO: runAnimIndex
    		
    		properties.writeLong(NameUtils.nameToLong(player.getUsername()));
    		
    		properties.writeByte(otherPlayer.getSkills().getCombatLevel());
    		properties.writeShort(otherPlayer.getSkills().getTotalLevel());
    		
    		Packet packet = properties.toPacket();
    		
    		builder.writeByteC((byte) packet.getLength());
    		builder.writeBuffer(packet.getBuffer());
    		return this;
    	}
    	
    	private PlayerUpdating updateOtherPlayerMovement(PacketBuilder packetBuilder, Player otherPlayer) {
    		if (!otherPlayer.getMovementQueue().updateRequired()) {
    			if (otherPlayer.getUpdateFlag().isUpdateRequired()) {
    				packetBuilder.writeBits(1, 1);
    				packetBuilder.writeBits(2, 0);
    			} else {
    				packetBuilder.writeBits(1, 0);
    			}
    		} else if (otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION] == -1) {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 1);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]);
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		} else {
    			packetBuilder.writeBits(1, 1);
    			packetBuilder.writeBits(2, 2);
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.WALKING_DIRECTION]); // Walking
    			packetBuilder.writeBits(3, otherPlayer.getMovementQueue().getDirections()[MovementQueue.RUNNING_DIRECTION]); // Running
    			packetBuilder.writeBits(1, otherPlayer.getUpdateFlag().isUpdateRequired() ? 1 : 0);
    		}
    		return this;
    	}
    	
    	public PlayerUpdating resetFlags() {
    		chat = new byte[256];
    		chatColor = chatEffect = 0;
    		player.getUpdateFlag().set(Flag.NONE);
    		player.getMovementQueue().setDirections(-1, -1);
    		return this;
    	}
    
    	public PlayerUpdating(Player player) {
    		this.player = player;
    	}
    	
    	private Player player;
    	
    	private byte[] chat = new byte[256];
    	
    	private int chatColor = 0, chatEffect = 0;
    }
    Reply With Quote  
     

  9. #7  
    Banned

    Join Date
    Mar 2011
    Posts
    4,062
    Thanks given
    194
    Thanks received
    689
    Rep Power
    0
    bump still need help with this
    Reply With Quote  
     


Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. Client issue maybe Server side issue?
    By Shawn_ in forum Help
    Replies: 7
    Last Post: 06-05-2012, 05:03 PM
  2. Netty Issue
    By Daniel in forum Application Development
    Replies: 3
    Last Post: 05-28-2012, 12:52 AM
  3. Replies: 3
    Last Post: 11-02-2011, 03:37 PM
  4. [Netty]RSN(Runescape Netty) scratch.
    By Discardedx2 in forum Projects
    Replies: 28
    Last Post: 05-20-2010, 02:30 AM
  5. Jar issue & Cache Issue
    By Chachi in forum Help
    Replies: 0
    Last Post: 06-19-2009, 02:40 PM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •