Here is the PHP verison if you wanna copy and paste that into the original post to make it easier for people.
My PacketHelper.java
Search
PHP Code:
if ((item.getPosition() <= -5000) && (item.getPosition() >= -5002)) {
to
if ((item.getPosition() <= -5000) && (item.getPosition() >= -5003)) {
My addCharLook
PHP Code:
public static void addCharLook(MaplePacketLittleEndianWriter mplew, MapleCharacterLook chr, boolean mega, boolean second) {
mplew.write(second ? chr.getSecondGender() : chr.getGender());
mplew.write(second ? chr.getSecondSkinColor() : chr.getSkinColor());
mplew.writeInt(second ? chr.getSecondFace() : chr.getFace());
mplew.writeInt(chr.getJob());
mplew.write(mega ? 0 : 1);
mplew.writeInt(second ? chr.getSecondHair() : chr.getHair());
final Map<Byte, Integer> myEquip = new LinkedHashMap<>();
final Map<Byte, Integer> maskedEquip = new LinkedHashMap<>();
final Map<Byte, Integer> totemEquip = new LinkedHashMap<>();
final Map<Byte, Integer> equip = second ? chr.getSecondEquips(true) : chr.getEquips(true);
for (final Entry<Byte, Integer> item : equip.entrySet()) {
if ((item.getKey()).byteValue() < -127) {
continue;
}
byte pos = (byte) ((item.getKey()).byteValue() * -1);
if ((pos < 100) && (myEquip.get(Byte.valueOf(pos)) == null)) {
myEquip.put(Byte.valueOf(pos), item.getValue());
} else if ((pos > 100) && (pos != 111)) {
pos = (byte) (pos - 100);
if (myEquip.get(Byte.valueOf(pos)) != null) {
maskedEquip.put(Byte.valueOf(pos), myEquip.get(Byte.valueOf(pos)));
totemEquip.put(Byte.valueOf(pos), item.getValue());
}
myEquip.put(Byte.valueOf(pos), item.getValue());
totemEquip.put(Byte.valueOf(pos), item.getValue());
} else if (myEquip.get(Byte.valueOf(pos)) != null) {
maskedEquip.put(Byte.valueOf(pos), item.getValue());
totemEquip.put(Byte.valueOf(pos), item.getValue());
}
}
for (final Entry<Byte, Integer> totem : chr.getTotems().entrySet()) {
byte pos = (byte) ((totem.getKey()).byteValue() * -1);
if (pos < 0 || pos > 2) { //3 totem slots
continue;
}
if (totem.getValue() < 1200000 || totem.getValue() >= 1210000) {
continue;
}
System.out.println(pos);
System.out.println(totem.getValue());
totemEquip.put(Byte.valueOf(pos), totem.getValue());
}
for (Map.Entry entry : myEquip.entrySet()) {
int weapon = ((Integer) entry.getValue()).intValue();
if (GameConstants.getWeaponType(weapon) == (second ? MapleWeaponType.LONG_SWORD : MapleWeaponType.BIG_SWORD)) {
continue;
}
mplew.write(((Byte) entry.getKey()).byteValue());
mplew.writeInt(((Integer) entry.getValue()).intValue());
}
mplew.write(255);
for (Map.Entry entry : maskedEquip.entrySet()) {
mplew.write(((Byte) entry.getKey()).byteValue());
mplew.writeInt(((Integer) entry.getValue()).intValue());
}
mplew.write(255);
for (Map.Entry entry : totemEquip.entrySet()) {
mplew.write(((Byte) entry.getKey()).byteValue());
mplew.writeInt(((Integer) entry.getValue()).intValue());
}
mplew.write(255); //new v140
Integer cWeapon = equip.get(Byte.valueOf((byte) -111));
mplew.writeInt(cWeapon != null ? cWeapon.intValue() : 0);
Integer Weapon = equip.get(Byte.valueOf((byte) -11));
mplew.writeInt(Weapon != null ? Weapon.intValue() : 0); //new v139
boolean zero = GameConstants.isZero(chr.getJob());
Integer Shield = equip.get(Byte.valueOf((byte) -10));
mplew.writeInt(!zero && Shield != null ? Shield.intValue() : 0); //new v139
mplew.write(/*GameConstants.isMercedes(chr.getJob()) ? 1 : */0); // Mercedes/Elf Ears
mplew.writeZeroBytes(12);
if (GameConstants.isDemonSlayer(chr.getJob()) || GameConstants.isXenon(chr.getJob()) || GameConstants.isDemonAvenger(chr.getJob())) {
mplew.writeInt(chr.getFaceMarking());
} else if (GameConstants.isZero(chr.getJob())) {
mplew.write(1);
}
}
public static void addInventoryInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
mplew.writeInt(0);
addPotionPotInfo(mplew, chr);
//RED stuff:
PHP Code:
mplew.writeInt(0);
mplew.writeInt(chr.getId());
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(0);
mplew.write(0);
mplew.write(0);
mplew.write(chr.getInventory(MapleInventoryType.EQUIP).getSlotLimit());
mplew.write(chr.getInventory(MapleInventoryType.USE).getSlotLimit());
mplew.write(chr.getInventory(MapleInventoryType.SETUP).getSlotLimit());
mplew.write(chr.getInventory(MapleInventoryType.ETC).getSlotLimit());
mplew.write(chr.getInventory(MapleInventoryType.CASH).getSlotLimit());
MapleQuestStatus
PHP Code:
stat = chr.getQuestNoAdd(MapleQuest.getInstance(122700));
if ((stat != null) && (stat.getCustomData() != null) && (Long.parseLong(stat.getCustomData()) > System.currentTimeMillis())) {
mplew.writeLong(getTime(Long.parseLong(stat.getCustomData())));
} else {
mplew.writeLong(getTime(-2L));
}
MapleInventory
PHP Code:
iv = chr.getInventory(MapleInventoryType.EQUIPPED);
final List<Item> equipped = iv.newList();
Collections.sort(equipped);
for (Item item : equipped) {
if ((item.getPosition() < 0) && (item.getPosition() > -100)) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
for (Item item : equipped) {
if ((item.getPosition() <= -100) && (item.getPosition() > -1000)) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
iv = chr.getInventory(MapleInventoryType.EQUIP);
for (Item item : iv.list()) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
mplew.writeShort(0);
for (Item item : equipped) {
if ((item.getPosition() <= -1000) && (item.getPosition() > -1100)) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
for (Item item : equipped) {
if ((item.getPosition() <= -1100) && (item.getPosition() > -1200)) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
mplew.writeShort(0);
for (Item item : equipped) {
if (item.getPosition() <= -1200) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.writeShort(0);
for (Item item : equipped) {
if ((item.getPosition() <= -5000) && (item.getPosition() >= -5003)) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.writeShort(0);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.writeShort(0);
iv = chr.getInventory(MapleInventoryType.USE);
for (Item item : iv.list()) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
mplew.write(0);
iv = chr.getInventory(MapleInventoryType.SETUP);
for (Item item : iv.list()) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
mplew.write(0);
iv = chr.getInventory(MapleInventoryType.ETC);
for (Item item : iv.list()) {
if (item.getPosition() < 100) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
}
mplew.write(0);
iv = chr.getInventory(MapleInventoryType.CASH);
for (Item item : iv.list()) {
addItemPosition(mplew, item, false, false);
addItemInfo(mplew, item, chr);
}
mplew.write(0);
// for (int i = 0; i < chr.getExtendedSlots().size(); i++) {
// mplew.writeInt(i);
// mplew.writeInt(chr.getExtendedSlot(i));
// for (Item item : chr.getInventory(MapleInventoryType.ETC).list()) {
// if ((item.getPosition() > i * 100 + 100) && (item.getPosition() < i * 100 + 200)) {
// addItemPosition(mplew, item, false, true);
// addItemInfo(mplew, item, chr);
// }
// }
// mplew.writeInt(-1);
// }
mplew.writeZeroBytes(17);//was17
}