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; } } } }
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 }