void CLinkshell::RemoveMemberByName(int8* MemberName) { PROFILE_FUNC(); for (uint32 i = 0; i < members.size(); ++i) { if (strcmp(MemberName, members.at(i)->GetName()) == 0) { CCharEntity* PMember = (CCharEntity*)members.at(i); CItemLinkshell* PItemLinkshell = (CItemLinkshell*)PMember->getStorage(LOC_INVENTORY)->GetItem(PMember->equip[SLOT_LINK]); if (PItemLinkshell != NULL && PItemLinkshell->isType(ITEM_LINKSHELL)) { linkshell::DelOnlineMember(PMember, PItemLinkshell); PItemLinkshell->setSubType(ITEM_UNLOCKED); PMember->equip[SLOT_LINK] = 0; PMember->nameflags.flags &= ~FLAG_LINKSHELL; PMember->pushPacket(new CInventoryAssignPacket(PItemLinkshell, INV_NORMAL)); PMember->pushPacket(new CLinkshellEquipPacket(PMember)); } CItemContainer* Inventory = PMember->getStorage(LOC_INVENTORY); for (uint8 SlotID = 0; SlotID < Inventory->GetSize(); ++SlotID) { CItemLinkshell* PItemLinkshell = (CItemLinkshell*)Inventory->GetItem(SlotID); if (PItemLinkshell != NULL && PItemLinkshell->isType(ITEM_LINKSHELL) && PItemLinkshell->GetLSID() == m_id) { const int8* Query = "UPDATE char_inventory SET itemid = (itemid+2) WHERE charid = %u AND location = %u AND slot = %u LIMIT 1"; Sql_Query(SqlHandle, Query, PMember->id, LOC_INVENTORY, SlotID); PItemLinkshell->SetLSID(0); PItemLinkshell->setID(PItemLinkshell->getID() + 2); PMember->pushPacket(new CInventoryItemPacket(PItemLinkshell, LOC_INVENTORY, SlotID)); } } charutils::SaveCharStats(PMember); charutils::SaveCharEquip(PMember); if (PMember->status == STATUS_NORMAL) PMember->status = STATUS_UPDATE; PMember->pushPacket(new CInventoryFinishPacket()); PMember->pushPacket(new CCharUpdatePacket(PMember)); PMember->pushPacket(new CMessageSystemPacket(0,0,109)); return; } } }
void CLinkshell::ChangeMemberRank(int8* MemberName, uint8 toSack) { PROFILE_FUNC(); //topearl = 3 //tosack = 2 int newId = 512 + toSack; if (newId == 514 || newId == 515) { for (uint32 i = 0; i < members.size(); ++i) { if (strcmp(MemberName, members.at(i)->GetName()) == 0) { CCharEntity* PMember = (CCharEntity*)members.at(i); CItemLinkshell* PItemLinkshell = (CItemLinkshell*)PMember->getStorage(LOC_INVENTORY)->GetItem(PMember->equip[SLOT_LINK]); if (PItemLinkshell != NULL && PItemLinkshell->isType(ITEM_LINKSHELL)) { PItemLinkshell->setID(newId); PMember->pushPacket(new CInventoryAssignPacket(PItemLinkshell, INV_NORMAL)); PMember->pushPacket(new CLinkshellEquipPacket(PMember)); } CItemContainer* Inventory = PMember->getStorage(LOC_INVENTORY); for (uint8 SlotID = 0; SlotID < Inventory->GetSize(); ++SlotID) { CItemLinkshell* PItemLinkshell = (CItemLinkshell*)Inventory->GetItem(SlotID); if (PItemLinkshell != NULL && PItemLinkshell->isType(ITEM_LINKSHELL) && PItemLinkshell->GetLSID() == m_id) { const int8* Query = "UPDATE char_inventory SET itemid = %u WHERE charid = %u AND location = %u AND slot = %u LIMIT 1"; Sql_Query(SqlHandle, Query, PItemLinkshell->getID(),PMember->id, LOC_INVENTORY, SlotID); Sql_Query(SqlHandle,"UPDATE accounts_sessions SET linkshellid = %u , linkshellrank = %u WHERE charid = %u", m_id,PItemLinkshell->GetLSType(), PMember->id); PMember->pushPacket(new CInventoryItemPacket(PItemLinkshell, LOC_INVENTORY, SlotID)); } } charutils::SaveCharStats(PMember); charutils::SaveCharEquip(PMember); if (PMember->status == STATUS_NORMAL) PMember->status = STATUS_UPDATE; PMember->pushPacket(new CInventoryFinishPacket()); PMember->pushPacket(new CCharUpdatePacket(PMember)); return; } } } }
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; } }
CCheckPacket::CCheckPacket(CCharEntity* PChar, CCharEntity* PTarget) { this->type = 0xC9; this->size = 0x06; WBUFL(data,(0x04)) = PTarget->id; WBUFW(data,(0x08)) = PTarget->targid; WBUFB(data,(0x0A)) = 0x03; uint8 count = 0; for (int32 i = 0; i < 16; ++i) { CItem* PItem = PTarget->getEquip((SLOTTYPE)i); if (PItem != nullptr) { WBUFW(data,(size*2+0x00)) = PItem->getID(); WBUFB(data,(size*2+0x02)) = i; if (PItem->isSubType(ITEM_CHARGED)) { uint32 currentTime = CVanaTime::getInstance()->getVanaTime(); uint32 nextUseTime = ((CItemUsable*)PItem)->getLastUseTime() + ((CItemUsable*)PItem)->getReuseDelay(); WBUFB(data,(size*2+0x04)) = 0x01; WBUFB(data,(size*2+0x05)) = ((CItemUsable*)PItem)->getCurrentCharges(); WBUFB(data,(size*2+0x07)) = (nextUseTime > currentTime ? 0x90 : 0xD0); WBUFL(data,(size*2+0x08)) = nextUseTime; WBUFL(data,(size*2+0x0C)) = ((CItemUsable*)PItem)->getUseDelay() + currentTime; } if (PItem->isSubType(ITEM_AUGMENTED)) { WBUFB(data,(size*2+0x04)) = 0x02; WBUFW(data,(size*2+0x06)) = ((CItemArmor*)PItem)->getAugment(0); WBUFW(data,(size*2+0x08)) = ((CItemArmor*)PItem)->getAugment(1); WBUFW(data,(size*2+0x0A)) = ((CItemArmor*)PItem)->getAugment(2); WBUFW(data,(size*2+0x0C)) = ((CItemArmor*)PItem)->getAugment(3); } memcpy(data+(size*2+0x10), PItem->getSignature(), dsp_cap(strlen(PItem->getSignature()), 0, 12)); this->size += 0x0E; count++; if (count == 8) { WBUFB(data,(0x0B)) = count; PChar->pushPacket(new CBasicPacket(*this)); this->size = 0x06; memset(data+(0x0B), 0, PACKET_SIZE - 11); } } } if (count == 0) { this->size = 0x14; PChar->pushPacket(new CBasicPacket(*this)); } else if (count != 8) { WBUFB(data,(0x0B)) = (count > 8 ? count - 8 : count); PChar->pushPacket(new CBasicPacket(*this)); } this->size = 0x28; memset(data+(0x0B), 0, PACKET_SIZE - 11); WBUFB(data,(0x0A)) = 0x01; CItemLinkshell* PLinkshell = (CItemLinkshell*)PTarget->getEquip(SLOT_LINK1); if ((PLinkshell != nullptr) && PLinkshell->isType(ITEM_LINKSHELL)) { //WBUFW(data,(0x0C)) = PLinkshell->GetLSID(); WBUFW(data,(0x0E)) = PLinkshell->getID(); WBUFW(data,(0x10)) = PLinkshell->GetLSRawColor(); memcpy(data+(0x14), PLinkshell->getSignature(), dsp_cap(strlen(PLinkshell->getSignature()), 0, 15)); } if ((PChar->nameflags.flags & FLAG_GM) || !(PTarget->nameflags.flags & FLAG_ANON)) { WBUFB(data,(0x12)) = PTarget->GetMJob(); WBUFB(data,(0x13)) = PTarget->GetSJob(); WBUFB(data,(0x24)) = PTarget->GetMLevel(); WBUFB(data,(0x25)) = PTarget->GetSLevel(); } //Chevron 32 bit Big Endean, starting at 0x2B //WBUFB(data,(0x2C)) = 0x00; //Ballista Star next to Chevron count }