Exemplo n.º 1
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;
        }
    }
}
Exemplo n.º 2
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;
	}
}