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