예제 #1
0
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;
		} 
	}
}
예제 #2
0
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;
		    } 
	    }
    }
}
예제 #3
0
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
}