diff options
author | XTZGZoReX <none@none> | 2010-01-15 19:50:27 +0100 |
---|---|---|
committer | XTZGZoReX <none@none> | 2010-01-15 19:50:27 +0100 |
commit | 26e11448dddc870c848f26462339ffdffd19c078 (patch) | |
tree | efbdc5026969743a7a57bd1849d53a483bcb2da5 | |
parent | 0451e45e06a820e8ab769a11495c134c50cf1164 (diff) |
* Update structure for SMSG_ADDON_INFO and add some sort of basic handling for incorrect addon CRCs (anti-cheating).
* Fix CRLF in MovementHandler.cpp.
* Move some handlers/senders to correct place.
--HG--
branch : trunk
-rw-r--r-- | src/game/MiscHandler.cpp | 24 | ||||
-rw-r--r-- | src/game/MovementHandler.cpp | 42 | ||||
-rw-r--r-- | src/game/ObjectMgr.cpp | 6 | ||||
-rw-r--r-- | src/game/WorldSession.cpp | 95 | ||||
-rw-r--r-- | src/game/WorldSession.h | 8 |
5 files changed, 92 insertions, 83 deletions
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index bdaa3c2f91c..e5d605e678a 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -773,6 +773,23 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket & recv_data) GetPlayer()->ResurectUsingRequestData(); } +void WorldSession::SendAreaTriggerMessage(const char* Text, ...) +{ + va_list ap; + char szStr [1024]; + szStr[0] = '\0'; + + va_start(ap, Text); + vsnprintf( szStr, 1024, Text, ap ); + va_end(ap); + + uint32 length = strlen(szStr)+1; + WorldPacket data(SMSG_AREA_TRIGGER_MESSAGE, 4+length); + data << length; + data << szStr; + SendPacket(&data); +} + void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data) { sLog.outDebug("WORLD: Received CMSG_AREATRIGGER"); @@ -1628,3 +1645,10 @@ void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& recv_data) data << uint32(time(NULL)); SendPacket(&data); } + +void WorldSession::SendSetPhaseShift(uint32 PhaseShift) +{ + WorldPacket data(SMSG_SET_PHASE_SHIFT, 4); + data << uint32(PhaseShift); + SendPacket(&data); +} diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 7bf669c35d4..3219237043a 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -608,17 +608,49 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) int8 seatId; recv_data >> seatId; - if(!accessory)
- GetPlayer()->ChangeSeat(-1, seatId > 0); // prev/next
- else if(Unit *vehUnit = ObjectAccessor::GetUnit(*GetPlayer(), accessory))
- if(Vehicle *vehicle = vehUnit->GetVehicleKit())
- if(vehicle->HasEmptySeat(seatId))
+ if(!accessory) + GetPlayer()->ChangeSeat(-1, seatId > 0); // prev/next + else if(Unit *vehUnit = ObjectAccessor::GetUnit(*GetPlayer(), accessory)) + if(Vehicle *vehicle = vehUnit->GetVehicleKit()) + if(vehicle->HasEmptySeat(seatId)) GetPlayer()->EnterVehicle(vehicle, seatId); } break; } } +void WorldSession::HandleEnterPlayerVehicle(WorldPacket &data) +{ + // Read guid + uint64 guid; + data >> guid; + + if(Player* pl=ObjectAccessor::FindPlayer(guid)) + { + if (!pl->GetVehicleKit()) + return; + if (!pl->IsInRaidWith(_player)) + return; + if(!pl->IsWithinDistInMap(_player,INTERACTION_DISTANCE)) + return; + _player->EnterVehicle(pl); + } +} + +void WorldSession::HandleEjectPasenger(WorldPacket &data) +{ + if(data.GetOpcode()==CMSG_EJECT_PASSENGER) + { + if(Vehicle* Vv= _player->GetVehicleKit()) + { + uint64 guid; + data >> guid; + if(Player* Pl=ObjectAccessor::FindPlayer(guid)) + Pl->ExitVehicle(); + } + } +} + void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data) { sLog.outDebug("WORLD: Recvd CMSG_REQUEST_VEHICLE_EXIT"); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 83fbc7891e7..0611329ce12 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -8941,11 +8941,11 @@ void ObjectMgr::LoadCreatureClassLevelStats() stats.BaseMana = fields[5].GetUInt32(); stats.BaseArmor = fields[6].GetUInt32(); - if (stats.Level > MAX_LEVEL) + if (stats.Level > STRONG_MAX_LEVEL) { sLog.outErrorDb("Creature base stats for class %u has invalid level %u (max is %u) - set to %u", - stats.Class, stats.Level, MAX_LEVEL, DEFAULT_MAX_LEVEL); - stats.Level = DEFAULT_MAX_LEVEL; + stats.Class, stats.Level, STRONG_MAX_LEVEL, STRONG_MAX_LEVEL); + stats.Level = STRONG_MAX_LEVEL; } if (!stats.Class || ((1 << (stats.Class - 1)) & CLASSMASK_ALL_CREATURES) == 0) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index d442d4c359e..c55aa3e2a7e 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -472,25 +472,6 @@ void WorldSession::KickPlayer() m_Socket->CloseSocket (); } -/// Cancel channeling handler - -void WorldSession::SendAreaTriggerMessage(const char* Text, ...) -{ - va_list ap; - char szStr [1024]; - szStr[0] = '\0'; - - va_start(ap, Text); - vsnprintf( szStr, 1024, Text, ap ); - va_end(ap); - - uint32 length = strlen(szStr)+1; - WorldPacket data(SMSG_AREA_TRIGGER_MESSAGE, 4+length); - data << length; - data << szStr; - SendPacket(&data); -} - void WorldSession::SendNotification(const char *format,...) { if(format) @@ -526,13 +507,6 @@ void WorldSession::SendNotification(int32 string_id,...) } } -void WorldSession::SendSetPhaseShift(uint32 PhaseShift) -{ - WorldPacket data(SMSG_SET_PHASE_SHIFT, 4); - data << uint32(PhaseShift); - SendPacket(&data); -} - const char * WorldSession::GetTrinityString( int32 entry ) const { return objmgr.GetTrinityString(entry,GetSessionDbLocaleIndex()); @@ -860,11 +834,13 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data) sLog.outDebug("ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1); - m_addonsList.push_back(AddonInfo(addonName, enabled, crc)); + // TODO: Find out when to not use CRC/pubkey, and other possible states. + m_addonsList.push_back(AddonInfo(addonName, enabled, crc, 2, true)); } - uint32 unk2; - addonInfo >> unk2; + uint32 currentTime; + addonInfo >> currentTime; + sLog.outDebug("ADDON: CurrentTime: %u", currentTime); if(addonInfo.rpos() != addonInfo.size()) sLog.outDebug("packet under read!"); @@ -875,7 +851,7 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data) void WorldSession::SendAddonsInfo() { - unsigned char tdata[256] = + unsigned char addonPublicKey[256] = { 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54, 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75, @@ -899,26 +875,30 @@ void WorldSession::SendAddonsInfo() for (AddonsList::iterator itr = m_addonsList.begin(); itr != m_addonsList.end(); ++itr) { - uint8 state = 2; // 2 is sent here - data << uint8(state); + data << uint8(itr->State); - uint8 unk1 = 1; // 1 is sent here - data << uint8(unk1); - if (unk1) + uint8 crcpub = itr->UsePublicKeyOrCRC; + data << uint8(crcpub); + if (crcpub) { - uint8 unk2 = (itr->CRC != 0x4c1c776d); // If addon is Standard addon CRC - data << uint8(unk2); - if (unk2) // if CRC is wrong, add public key (client need it) - data.append(tdata, sizeof(tdata)); + uint8 usepk = (itr->CRC != STANDARD_ADDON_CRC); // If addon is Standard addon CRC + data << uint8(usepk); + if (usepk) // if CRC is wrong, add public key (client need it) + { + sLog.outError("ADDON: CRC (0x%x) for addon %s is wrong (does not match expected %x), sending pubkey", + itr->Name, itr->CRC, STANDARD_ADDON_CRC); - data << uint32(0); + data.append(addonPublicKey, sizeof(addonPublicKey)); + } + + data << uint32(/*itr->CRC*/ 0); // TODO: Find out the meaning of this. } uint8 unk3 = 0; // 0 is sent here data << uint8(unk3); if (unk3) { - // String, 256 (null terminated?) + // String, length 256 (null terminated) data << uint8(0); } } @@ -938,39 +918,6 @@ void WorldSession::SendAddonsInfo() SendPacket(&data); } - -void WorldSession::HandleEnterPlayerVehicle(WorldPacket &data) -{ - // Read guid - uint64 guid; - data >> guid; - - if(Player* pl=ObjectAccessor::FindPlayer(guid)) - { - if (!pl->GetVehicleKit()) - return; - if (!pl->IsInRaidWith(_player)) - return; - if(!pl->IsWithinDistInMap(_player,INTERACTION_DISTANCE)) - return; - _player->EnterVehicle(pl); - } -} - -void WorldSession::HandleEjectPasenger(WorldPacket &data) -{ - if(data.GetOpcode()==CMSG_EJECT_PASSENGER) - { - if(Vehicle* Vv= _player->GetVehicleKit()) - { - uint64 guid; - data >> guid; - if(Player* Pl=ObjectAccessor::FindPlayer(guid)) - Pl->ExitVehicle(); - } - } - } - void WorldSession::SetPlayer( Player *plr ) { _player = plr; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 93c5529eddb..577b3ae321a 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -73,20 +73,26 @@ struct AccountData struct AddonInfo { - AddonInfo(const std::string& name, uint8 enabled, uint32 crc) + AddonInfo(const std::string& name, uint8 enabled, uint32 crc, uint8 state, bool crcOrPubKey) { Name = name; Enabled = enabled; CRC = crc; + State = state; + UsePublicKeyOrCRC = crcOrPubKey; } std::string Name; uint8 Enabled; uint32 CRC; + uint8 State; + bool UsePublicKeyOrCRC; }; typedef std::list<AddonInfo> AddonsList; +#define STANDARD_ADDON_CRC 0x4c1c776d + enum PartyOperation { PARTY_OP_INVITE = 0, |