示例#1
0
CZoneInPacket::CZoneInPacket(CCharEntity * PChar, int16 csid) 
{
	this->type = 0x0A;
	this->size = 0x82;

    // необходимо для работы manaklipper
	// последние 8 байт похожи на время
	//unsigned char packet [] = {
	//0x0D, 0x3A, 0x0C, 0x00, 0x11, 0x00, 0x19, 0x00, 0x02, 0xE4, 0x93, 0x10, 0x91, 0xE5, 0x93, 0x10}; // 0x2a = 0x10 
    //0x89, 0x39, 0x0C, 0x00, 0x19, 0x00, 0x07, 0x00, 0x5C, 0xE1, 0x93, 0x10, 0x81, 0xE3, 0x93, 0x10}; // 0x2a = 0x08
	//memcpy(data + 0x70, &packet, 16);

    //data[0x2A] = 0x08;//data[0x2A] = 0x80;  // в зоне 3 управляет путями следования транспорта 0x10 и 0x08

	WBUFL(data,(0x04)) = PChar->id;
	WBUFW(data,(0x08)) = PChar->targid;

	memcpy(data+(0x84), PChar->GetName(), PChar->name.size());   

	WBUFB(data,(0x0B)) = PChar->loc.p.rotation;		
	WBUFF(data,(0x0C)) = PChar->loc.p.x;				
	WBUFF(data,(0x10)) = PChar->loc.p.y;				
	WBUFF(data,(0x14)) = PChar->loc.p.z;

	WBUFB(data,(0x1C)) = PChar->GetSpeed();
	WBUFB(data,(0x1D)) = PChar->speedsub;
	WBUFB(data,(0x1E)) = PChar->GetHPP();
	WBUFB(data,(0x1F)) = PChar->animation;
    WBUFB(data,(0x21)) = PChar->GetGender() * 128 + (1 << PChar->look.size);

    look_t *look = (PChar->getStyleLocked() ? &PChar->mainlook : &PChar->look);
	WBUFB(data,(0x44)) = look->face;
	WBUFB(data,(0x45)) = look->race;
	WBUFW(data,(0x46)) = look->head   + 0x1000;
	WBUFW(data,(0x48)) = look->body   + 0x2000;
	WBUFW(data,(0x4A)) = look->hands  + 0x3000;
	WBUFW(data,(0x4C)) = look->legs   + 0x4000;
	WBUFW(data,(0x4E)) = look->feet   + 0x5000;
	WBUFW(data,(0x50)) = look->main   + 0x6000;
	WBUFW(data,(0x52)) = look->sub    + 0x7000;
	WBUFW(data,(0x54)) = look->ranged + 0x8000;

	if (PChar->m_Monstrosity != 0)
	{
		WBUFW(data, (0x44) ) = PChar->m_Monstrosity;
		WBUFW(data, (0x54) ) = 0xFFFF;
	}

	WBUFB(data,(0x56)) = PChar->loc.zone->GetBackgroundMusicDay();
	WBUFB(data,(0x58)) = PChar->loc.zone->GetBackgroundMusicNight();
	WBUFB(data,(0x5A)) = PChar->loc.zone->GetSoloBattleMusic();
	WBUFB(data,(0x5C)) = PChar->loc.zone->GetPartyBattleMusic();
    WBUFB(data,(0x5E)) = 0xD4; //default chocobo music for all zones

	WBUFW(data,(0x60)) = PChar->loc.boundary;
    WBUFW(data,(0x68)) = PChar->loc.zone->GetWeather();
    WBUFL(data,(0x6A)) = PChar->loc.zone->GetWeatherChangeTime();
  //WBUFL(data,(0x6C)) = PChar->loc.zone->GetWeather();
  //WBUFL(data,(0x70)) = PChar->loc.zone->GetWeatherChangeTime();

	if(csid != -1) 
	{
	  //WBUFB(data,(0x1F)) = 4;								// предположительно animation
	  //WBUFB(data,(0x20)) = 2;

		WBUFW(data,(0x40)) = PChar->getZone();
		WBUFW(data,(0x62)) = PChar->getZone();
		WBUFW(data,(0x64)) = csid;
	}

    WBUFW(data, (0x30) ) = PChar->getZone();
    WBUFW(data, (0x42) ) = PChar->getZone();

	if (PChar->m_moghouseID != 0) 
	{
		WBUFB(data,(0x80)) = 1;
	    WBUFW(data,(0xAA)) = GetMogHouseID(PChar);            // Mog House id
		WBUFB(data,(0xAE)) = GetMosHouseFlag(PChar);          // Mog House leaving flag
	} else {
		WBUFB(data,(0x80)) = 2;
	    WBUFW(data,(0xAA)) = 0x01FF;
        WBUFB(data,(0xAC)) = csid > 0 ? 0x01 : 0x00;          //if 0x01 then pause between zone
		WBUFB(data,(0xAF)) = PChar->loc.zone->CanUseMisc(MISC_MOGMENU);	// флаг, позволяет использовать mog menu за пределами mog house
	}

	WBUFL(data,(0xA0)) = PChar->GetPlayTime();				// время, проведенное персонажем в игре с момента создания

    uint32 pktTime = CVanaTime::getInstance()->getVanaTime();

    WBUFL(data,(0x38)) = pktTime + VTIME_BASEDATE;
    WBUFL(data,(0x3C)) = pktTime;

    // 60min starts at 0x03A020 (66 min) and ventures down to 0x5460 (6 min)
    if (PChar->m_DeathCounter < 3600 && PChar->isDead())
        WBUFL(data,(0xA4)) = 0x03A020 - (60 * PChar->m_DeathCounter);

	memcpy(data+(0xCC), &PChar->stats, 14);

    WBUFL(data,(0xE8)) = PChar->GetMaxHP();
    WBUFL(data,(0xEC)) = PChar->GetMaxMP();

    WBUFB(data, (0x100)) = 0x01;
}
示例#2
0
CZoneInPacket::CZoneInPacket(CCharEntity * PChar, int16 csid)
{
    this->type = 0x0A;
    this->size = 0x82;

    // необходимо для работы manaklipper
    // последние 8 байт похожи на время
    //unsigned char packet [] = {
    //0x0D, 0x3A, 0x0C, 0x00, 0x11, 0x00, 0x19, 0x00, 0x02, 0xE4, 0x93, 0x10, 0x91, 0xE5, 0x93, 0x10}; // 0x2a = 0x10
    //0x89, 0x39, 0x0C, 0x00, 0x19, 0x00, 0x07, 0x00, 0x5C, 0xE1, 0x93, 0x10, 0x81, 0xE3, 0x93, 0x10}; // 0x2a = 0x08
    //memcpy(data + 0x70-4, &packet, 16);

    //data[0x2A-4] = 0x08;//data[0x2A-4] = 0x80;  // в зоне 3 управляет путями следования транспорта 0x10 и 0x08

    WBUFL(data,(0x04)-4) = PChar->id;
    WBUFW(data,(0x08)-4) = PChar->targid;

    memcpy(data+(0x84)-4, PChar->GetName(), PChar->name.size());

    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;

    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,(0x38)-4) = CVanaTime::getInstance()->getSysTime();
    WBUFL(data,(0x3C)-4) = CVanaTime::getInstance()->getVanaTime();

    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;

    WBUFB(data,(0x56)-4) = PChar->loc.zone->GetBackgroundMusic();
    WBUFB(data,(0x58)-4) = PChar->loc.zone->GetBackgroundMusic();
    WBUFB(data,(0x5A)-4) = PChar->loc.zone->GetSoloBattleMusic();
    WBUFB(data,(0x5C)-4) = PChar->loc.zone->GetPartyBattleMusic();

    WBUFW(data,(0x60)-4) = PChar->loc.boundary;
    WBUFW(data,(0x68)-4) = PChar->loc.zone->GetWeather();
    WBUFL(data,(0x6A)-4) = PChar->loc.zone->GetWeatherChangeTime();
    //WBUFL(data,(0x6C)-4) = PChar->loc.zone->GetWeather();
    //WBUFL(data,(0x70)-4) = PChar->loc.zone->GetWeatherChangeTime();

    if(csid != -1)
    {
        //WBUFB(data,(0x1F)-4) = 4;								// предположительно animation
        //WBUFB(data,(0x20)-4) = 2;

        WBUFW(data,(0x40)-4) = PChar->getZone();
        WBUFW(data,(0x62)-4) = PChar->getZone();
        WBUFW(data,(0x64)-4) = csid;
    }

    if (PChar->getZone() == 0)
    {
        WBUFB(data,(0x80)-4) = 1;
        WBUFW(data,(0x30)-4) = PChar->loc.prevzone;             // form zone
        WBUFW(data,(0x42)-4) = PChar->loc.prevzone;             // from zone
        WBUFW(data,(0xAA)-4) = GetMogHouseID(PChar);            // Mog House id
        WBUFB(data,(0xAE)-4) = GetMosHouseFlag(PChar);          // Mog House leaving flag
    } else {
        WBUFB(data,(0x80)-4) = 2;
        WBUFW(data,(0x30)-4) = PChar->getZone();                // to zone
        WBUFW(data,(0x42)-4) = PChar->getZone();                // to zone
        WBUFW(data,(0xAA)-4) = 0x01FF;
        WBUFB(data,(0xAC)-4) = csid > 0 ? 0x01 : 0x00;          //if 0x01 then pause between zone
        WBUFB(data,(0xAF)-4) = PChar->loc.zone->CanUseMisc(MISC_MOGMENU);	// флаг, позволяет использовать mog menu за пределами mog house
    }

    WBUFL(data,(0xA0)-4) = 0x00000000;							// время, проведенное персонажем в игре с момента создания

    // current death timestamp is less than an hour ago and the player is dead.
    if (PChar->m_DeathTimestamp > 0 && ((time(NULL)-PChar->m_DeathTimestamp) < (60*60)) && PChar->isDead())
    {
        // 60min starts at 0x03A020 (66 min) and ventures down to 0x5460 (6 min)
        WBUFL(data,(0xA4)-4) = (0x03A020 - (60*(time(NULL) - PChar->m_DeathTimestamp)));
    }

    memcpy(data+(0xCC)-4, &PChar->stats, 14);

    WBUFL(data,(0xE8)-4) = PChar->GetMaxHP();
    WBUFL(data,(0xEB)-4) = PChar->GetMaxMP();

    WBUFB(data,(0x100)-4) = 0x01;
}
示例#3
0
CZoneInPacket::CZoneInPacket(CCharEntity * PChar, int16 csid) 
{
	this->type = 0x0A;
	this->size = 0x82;

	WBUFL(data,(0x04)-4) = PChar->id;
	WBUFW(data,(0x08)-4) = PChar->targid;

	memcpy(data+(0x84)-4, PChar->GetName(), PChar->name.size());   

	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;

	WBUFB(data,(0x1C)-4) = PChar->speed * (100 + PChar->getMod(MOD_MOVE)) / 100;
	WBUFB(data,(0x1D)-4) = PChar->speedsub;
	WBUFB(data,(0x1E)-4) = PChar->GetHPP();
	WBUFB(data,(0x1F)-4) = PChar->animation;

	uint32 time  = CVanaTime::getInstance()->getSysTime(); 

	WBUFL(data,(0x38)-4) = time;
	WBUFL(data,(0x3C)-4) = time - 1009810800;

	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;

	WBUFB(data,(0x56)-4) = PChar->loc.zone->GetBackgroundMusic();
	WBUFB(data,(0x58)-4) = PChar->loc.zone->GetBackgroundMusic();
	WBUFB(data,(0x5A)-4) = PChar->loc.zone->GetSoloBattleMusic();
	WBUFB(data,(0x5C)-4) = PChar->loc.zone->GetPartyBattleMusic();

	WBUFW(data,(0x60)-4) = PChar->loc.boundary;

	if(csid != -1) 
	{
	  //WBUFB(data,(0x1F)-4) = 4;								// animation
	  //WBUFB(data,(0x20)-4) = 2;

		WBUFB(data,(0x40)-4) = PChar->getZone();
		WBUFB(data,(0x62)-4) = PChar->getZone();
		WBUFW(data,(0x64)-4) = csid;
	}

	if (PChar->getZone() == 0) 
	{
		WBUFB(data,(0x80)-4) = 1;
		WBUFB(data,(0x30)-4) = PChar->loc.prevzone;				// form zone
		WBUFB(data,(0x42)-4) = PChar->loc.prevzone;				// from zone
	    WBUFW(data,(0xAA)-4) = GetMogHouseID(PChar);			// Mog House id
		WBUFB(data,(0xAE)-4) = PChar->profile.mhflag;			// Mog House leaving flag
	} else {
		WBUFB(data,(0x80)-4) = 2;										
		WBUFB(data,(0x30)-4) = PChar->getZone();				// to zone
		WBUFB(data,(0x42)-4) = PChar->getZone();				// to zone
	    WBUFW(data,(0xAA)-4) = 0x01FF;
	    WBUFB(data,(0xAC)-4) = 0x01;							// сообщаем клиенту, что он должен начать отправлять 0x15-ые пакеты лишь после полной загрузки
		WBUFB(data,(0xAF)-4) = PChar->loc.zone->CanUseMisc(MISC_MOGMENU);	// флаг, позволяет использовать mog menu за пределами mog house
	}

  //WBUFL(data,(0x98)-4) = PChar->clientip;

	WBUFL(data,(0xA0)-4) = 0x00000000;							// время, проведенное персонажем в игре с момента создания
	WBUFL(data,(0xA4)-4) = 0x00000000;							// оставшееся время до возрождения после смерти (формат времени неизвестен)

	memcpy(data+(0xCC)-4, &PChar->stats, 14);

    WBUFL(data,(0xE8)-4) = PChar->GetMaxHP();
    WBUFL(data,(0xEB)-4) = PChar->GetMaxMP();

	WBUFB(data,(0x100)-4) = 0x01;
}