CCharPacket::CCharPacket(CCharEntity * PChar, ENTITYUPDATE type, uint8 updatemask) { this->type = 0x0D; this->size = 0x3A; ref<uint32>(0x04) = PChar->id; ref<uint16>(0x08) = PChar->targid; switch (type) { case ENTITY_DESPAWN: { ref<uint8>(0x0A) = 0x20; } break; case ENTITY_SPAWN: updatemask = 0x1F; case ENTITY_UPDATE: { ref<uint8>(0x0A) = updatemask; if (updatemask & UPDATE_POS) { ref<uint8>(0x0B) = PChar->loc.p.rotation; ref<float>(0x0C) = PChar->loc.p.x; ref<float>(0x10) = PChar->loc.p.y; ref<float>(0x14) = PChar->loc.p.z; ref<uint16>(0x18) = PChar->loc.p.moving; ref<uint16>(0x1A) = PChar->m_TargID << 1; ref<uint8>(0x1C) = PChar->GetSpeed(); ref<uint8>(0x1D) = PChar->speedsub; } if (updatemask & UPDATE_HP) { ref<uint8>(0x1E) = PChar->GetHPP(); ref<uint8>(0x1F) = PChar->animation; ref<uint32>(0x20) = PChar->nameflags.flags; ref<uint8>(0x21) |= PChar->GetGender() * 128 + (1 << PChar->look.size); //if (PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SNEAK)) //{ // ref<uint8>(data,(0x22)) = 0x20; //} if (PChar->StatusEffectContainer->HasStatusEffectByFlag(EFFECTFLAG_INVISIBLE)) { ref<uint8>(0x23) = 0x20; } if (PChar->equip[SLOT_LINK1] != 0) { CItemLinkshell* linkshell = (CItemLinkshell*)PChar->getEquip(SLOT_LINK1); if ((linkshell != nullptr) && linkshell->isType(ITEM_LINKSHELL)) { lscolor_t LSColor = linkshell->GetLSColor(); ref<uint8>(0x24) = (LSColor.R << 4) + 15; ref<uint8>(0x25) = (LSColor.G << 4) + 15; ref<uint8>(0x26) = (LSColor.B << 4) + 15; } } ref<uint8>(0x27) = (PChar->isCharmed ? 0x08 : 0x00); ref<uint8>(0x29) = PChar->allegiance; // Mentor flag.. if (PChar->menuConfigFlags.flags & NFLAG_MENTOR) ref<uint8>(0x2B) = 0x01; else ref<uint8>(0x2B) = 0x00; // New Player Flag.. if (PChar->isNewPlayer()) ref<uint8>(0x2A) |= 0x80; ref<uint16>(0x30) = PChar->m_Costum; ref<uint32>(0x34) = 0x010CA248; // black chocobo } if (PChar->PPet != nullptr) { ref<uint16>(0x3C) = PChar->PPet->targid; } ref<uint8>(0x43) = 0x04; if (updatemask & UPDATE_LOOK) { look_t *look = (PChar->getStyleLocked() ? &PChar->mainlook : &PChar->look); ref<uint8>(0x48) = look->face; ref<uint8>(0x49) = look->race; ref<uint16>(0x4A) = PChar->menuConfigFlags.flags & NFLAG_DISPLAY_HEAD ? 0 : look->head + 0x1000; ref<uint16>(0x4C) = look->body + 0x2000; ref<uint16>(0x4E) = look->hands + 0x3000; ref<uint16>(0x50) = look->legs + 0x4000; ref<uint16>(0x52) = look->feet + 0x5000; ref<uint16>(0x54) = look->main + 0x6000; ref<uint16>(0x56) = look->sub + 0x7000; ref<uint16>(0x58) = look->ranged + 0x8000; if (PChar->m_Monstrosity != 0) { ref<uint16>(0x48) = PChar->m_Monstrosity; ref<uint16>(0x58) = 0xFFFF; } } if (updatemask & UPDATE_NAME) { memcpy(data + (0x5A), PChar->GetName(), PChar->name.size()); } } break; default: { break; } } }
CCharPacket::CCharPacket(CCharEntity * PChar, ENTITYUPDATE type) { this->type = 0x0D; this->size = 0x36; WBUFL(data,(0x04)-4) = PChar->id; WBUFW(data,(0x08)-4) = PChar->targid; switch(type) { case ENTITY_DESPAWN: { WBUFB(data,(0x0A)-4) = 0x20; } break; case ENTITY_SPAWN: case ENTITY_UPDATE: { WBUFB(data,(0x0A)-4) = 0x1F; WBUFB(data,(0x0B)-4) = PChar->loc.p.rotation; WBUFF(data,(0x0C)-4) = PChar->loc.p.x; WBUFF(data,(0x10)-4) = PChar->loc.p.y; WBUFF(data,(0x14)-4) = PChar->loc.p.z; WBUFW(data,(0x18)-4) = PChar->loc.p.moving; WBUFW(data,(0x1A)-4) = PChar->m_TargID << 1; WBUFB(data,(0x1C)-4) = PChar->GetSpeed(); WBUFB(data,(0x1D)-4) = PChar->speedsub; WBUFB(data,(0x1E)-4) = PChar->GetHPP(); WBUFB(data,(0x1F)-4) = PChar->animation; WBUFL(data,(0x20)-4) = PChar->nameflags.flags; WBUFB(data,(0x21)-4)|= PChar->GetGender() * 128 + (1 << PChar->look.size); //if (PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SNEAK)) //{ // WBUFB(data,(0x22)-4) = 0x20; //} if (PChar->StatusEffectContainer->HasStatusEffectByFlag(EFFECTFLAG_INVISIBLE)) { WBUFB(data,(0x23)-4) = 0x20; } if (PChar->equip[SLOT_LINK] != 0) { CItemLinkshell* linkshell = (CItemLinkshell*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_LINK]); if ((linkshell != NULL) && linkshell->isType(ITEM_LINKSHELL)) { lscolor_t LSColor = linkshell->GetLSColor(); WBUFB(data,(0x24)-4) = (LSColor.R << 4) + 15; WBUFB(data,(0x25)-4) = (LSColor.G << 4) + 15; WBUFB(data,(0x26)-4) = (LSColor.B << 4) + 15; } } WBUFB(data,(0x27)-4) = PChar->m_PVPFlag; // Mentor flag.. if (PChar->m_isMentor) WBUFB(data, (0x2B) - 4) = 0x01; else WBUFB(data, (0x2B) - 4) = 0x00; // New Player Flag.. if (PChar->m_isNewPlayer) WBUFB(data, (0x2A) - 4) |= 0x80; WBUFW(data,(0x30)-4) = PChar->m_Costum; WBUFL(data,(0x34)-4) = 0x010CA248; // black chocobo if (PChar->PPet != NULL) { WBUFW(data,(0x3C)-4) = PChar->PPet->targid << 3; } WBUFB(data,(0x44)-4) = PChar->look.face; WBUFB(data,(0x45)-4) = PChar->look.race; WBUFW(data,(0x46)-4) = PChar->look.head + 0x1000; WBUFW(data,(0x48)-4) = PChar->look.body + 0x2000; WBUFW(data,(0x4A)-4) = PChar->look.hands + 0x3000; WBUFW(data,(0x4C)-4) = PChar->look.legs + 0x4000; WBUFW(data,(0x4E)-4) = PChar->look.feet + 0x5000; WBUFW(data,(0x50)-4) = PChar->look.main + 0x6000; WBUFW(data,(0x52)-4) = PChar->look.sub + 0x7000; WBUFW(data,(0x54)-4) = PChar->look.ranged + 0x8000; memcpy(data+(0x56)-4, PChar->GetName(), PChar->name.size()); } break; } }