/* * To change this template, choose Tools | Templates and open the template in * the editor. */ package javastory.tools.packets; import java.util.Map; import java.util.Map.Entry; import javastory.client.GameCharacter; import javastory.game.Inventory; import javastory.game.Item; import javastory.game.Jobs; import javastory.io.PacketBuilder; import com.google.common.collect.Maps; /** * * @author shoftee */ public final class GameCharacterPacket { private GameCharacterPacket() { } public static void addCharStats(final PacketBuilder builder, final GameCharacter chr) { builder.writeInt(chr.getId()); // character id builder.writePaddedString(chr.getName(), 13); builder.writeAsByte(chr.getGender().asNumber()); // gender (0 = male, 1 = female) builder.writeAsByte(chr.getSkinColorId()); // skin color builder.writeInt(chr.getFaceId()); // face builder.writeInt(chr.getHairId()); // hair builder.writeZeroBytes(24); builder.writeAsByte(chr.getLevel()); // level builder.writeAsShort(chr.getJobId()); // job chr.getStats().writeTo(builder); builder.writeAsShort(chr.getRemainingAp()); // remaining ap if (Jobs.isEvan(chr.getJobId())) { final int size = chr.getRemainingSpSize(); builder.writeAsByte(size); for (int i = 0; i < chr.getRemainingSps().length; i++) { if (chr.getRemainingSp(i) > 0) { builder.writeAsByte(i + 1); builder.writeAsByte(chr.getRemainingSp(i)); } } } else { builder.writeAsShort(chr.getRemainingSp()); // remaining sp } builder.writeInt(chr.getExp()); // exp builder.writeAsShort(chr.getFame()); // fame builder.writeInt(0); // Gachapon exp builder.writeLong(0); // This must be something, just leave it lol builder.writeInt(chr.getMapId()); // current map id builder.writeAsByte(chr.getInitialSpawnPoint()); // spawnpoint builder.writeAsShort(chr.getSubcategory()); // 1 = Dual Blade } public static void addCharLook(final PacketBuilder builder, final GameCharacter chr, final boolean mega) { builder.writeAsByte(chr.getGender().asNumber()); builder.writeAsByte(chr.getSkinColorId()); builder.writeInt(chr.getFaceId()); builder.writeAsByte(mega ? 0 : 1); builder.writeInt(chr.getHairId()); final Map<Byte, Integer> myEquip = Maps.newLinkedHashMap(); final Map<Byte, Integer> maskedEquip = Maps.newLinkedHashMap(); final Inventory equip = chr.getEquippedItemsInventory(); // masking items for (final Item item : equip) { byte pos = (byte) (item.getPosition() * -1); if (pos < 100 && myEquip.get(pos) == null) { myEquip.put(pos, item.getItemId()); } else if (pos > 100 && pos != 111) { pos -= 100; if (myEquip.get(pos) != null) { maskedEquip.put(pos, myEquip.get(pos)); } myEquip.put(pos, item.getItemId()); } else if (myEquip.get(pos) != null) { maskedEquip.put(pos, item.getItemId()); } } for (final Entry<Byte, Integer> entry : myEquip.entrySet()) { builder.writeByte(entry.getKey()); builder.writeInt(entry.getValue()); } // end of masking items builder.writeAsByte(0xFF); // regular items for (final Entry<Byte, Integer> entry : maskedEquip.entrySet()) { builder.writeByte(entry.getKey()); builder.writeInt(entry.getValue()); } // ending regular items builder.writeAsByte(0xFF); final Item cWeapon = equip.getItem((byte) -111); builder.writeInt(cWeapon != null ? cWeapon.getItemId() : 0); builder.writeInt(0); builder.writeLong(0); } }