Exemple #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;
		} 
	}
}
Exemple #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;
		    } 
	    }
    }
}
Exemple #3
0
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;
        }
    }
}
Exemple #4
0
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;
	}
}
Exemple #5
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
}