You can find why the totems aren't loaded when you changing channel or relogin inside addInventoryInfo
Printable View
You can find why the totems aren't loaded when you changing channel or relogin inside addInventoryInfo
if somebody mean NOT LOADED is:the totem disappear when change channel
then the packet addInventoryInfo was wrong (or just disable to load totem)
my addInventoryInfo v146
the red code i highlight maybe not for v144 but i think they have some similar
Code:public static void addInventoryInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
mplew.writeInt(0);
addPotionPotInfo(mplew, chr);
//RED stuff:
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 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 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
}
Taiwanese? So cool....
I fix the totem without using "totemfix" in v142
Here is a video:P:
https://www.youtube.com/watch?v=xl3UmgUAIBg
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
My addCharLookPHP Code:if ((item.getPosition() <= -5000) && (item.getPosition() >= -5002)) {
to
if ((item.getPosition() <= -5000) && (item.getPosition() >= -5003)) {
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
MapleInventoryPHP 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));
}
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
}