Using TC structure allowing easier patches importing
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
#include "PacketLog.h"
|
||||
#include "Config.h"
|
||||
#include "ByteBuffer.h"
|
||||
#include "WorldPacket.h"
|
||||
|
||||
PacketLog::PacketLog() : _file(NULL)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
PacketLog::~PacketLog()
|
||||
{
|
||||
if (_file)
|
||||
fclose(_file);
|
||||
|
||||
_file = NULL;
|
||||
}
|
||||
|
||||
void PacketLog::Initialize()
|
||||
{
|
||||
std::string logsDir = sConfigMgr->GetStringDefault("LogsDir", "");
|
||||
|
||||
if (!logsDir.empty())
|
||||
if ((logsDir.at(logsDir.length()-1) != '/') && (logsDir.at(logsDir.length()-1) != '\\'))
|
||||
logsDir.push_back('/');
|
||||
|
||||
std::string logname = sConfigMgr->GetStringDefault("PacketLogFile", "");
|
||||
if (!logname.empty())
|
||||
_file = fopen((logsDir + logname).c_str(), "wb");
|
||||
}
|
||||
|
||||
void PacketLog::LogPacket(WorldPacket const& packet, Direction direction)
|
||||
{
|
||||
ByteBuffer data(4+4+4+1+packet.size());
|
||||
data << int32(packet.GetOpcode());
|
||||
data << int32(packet.size());
|
||||
data << uint32(time(NULL));
|
||||
data << uint8(direction);
|
||||
|
||||
for (uint32 i = 0; i < packet.size(); i++)
|
||||
data << packet[i];
|
||||
|
||||
fwrite(data.contents(), 1, data.size(), _file);
|
||||
fflush(_file);
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
#ifndef TRINITY_PACKETLOG_H
|
||||
#define TRINITY_PACKETLOG_H
|
||||
|
||||
#include "Common.h"
|
||||
#include <ace/Singleton.h>
|
||||
|
||||
enum Direction
|
||||
{
|
||||
CLIENT_TO_SERVER,
|
||||
SERVER_TO_CLIENT
|
||||
};
|
||||
|
||||
class WorldPacket;
|
||||
|
||||
class PacketLog
|
||||
{
|
||||
friend class ACE_Singleton<PacketLog, ACE_Thread_Mutex>;
|
||||
|
||||
private:
|
||||
PacketLog();
|
||||
~PacketLog();
|
||||
|
||||
public:
|
||||
void Initialize();
|
||||
bool CanLogPacket() const { return (_file != NULL); }
|
||||
void LogPacket(WorldPacket const& packet, Direction direction);
|
||||
|
||||
private:
|
||||
FILE* _file;
|
||||
};
|
||||
|
||||
#define sPacketLog ACE_Singleton<PacketLog, ACE_Thread_Mutex>::instance()
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,996 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/// \addtogroup u2w
|
||||
/// @{
|
||||
/// \file
|
||||
|
||||
#ifndef __WORLDSESSION_H
|
||||
#define __WORLDSESSION_H
|
||||
|
||||
#include "Common.h"
|
||||
#include "SharedDefines.h"
|
||||
#include "AddonMgr.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "World.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "GossipDef.h"
|
||||
#include "Cryptography/BigNumber.h"
|
||||
|
||||
class Creature;
|
||||
class GameObject;
|
||||
class InstanceSave;
|
||||
class Item;
|
||||
class LoginQueryHolder;
|
||||
class LoadPetFromDBQueryHolder;
|
||||
class Object;
|
||||
class Pet;
|
||||
class Player;
|
||||
class Quest;
|
||||
class SpellCastTargets;
|
||||
class Unit;
|
||||
class Warden;
|
||||
class WorldPacket;
|
||||
class WorldSocket;
|
||||
class AsynchPetSummon;
|
||||
struct AreaTableEntry;
|
||||
struct AuctionEntry;
|
||||
struct DeclinedName;
|
||||
struct ItemTemplate;
|
||||
struct MovementInfo;
|
||||
|
||||
namespace lfg
|
||||
{
|
||||
struct LfgJoinResultData;
|
||||
struct LfgPlayerBoot;
|
||||
struct LfgProposal;
|
||||
struct LfgQueueStatusData;
|
||||
struct LfgPlayerRewardData;
|
||||
struct LfgRoleCheck;
|
||||
struct LfgUpdateData;
|
||||
}
|
||||
|
||||
enum AccountDataType
|
||||
{
|
||||
GLOBAL_CONFIG_CACHE = 0, // 0x01 g
|
||||
PER_CHARACTER_CONFIG_CACHE = 1, // 0x02 p
|
||||
GLOBAL_BINDINGS_CACHE = 2, // 0x04 g
|
||||
PER_CHARACTER_BINDINGS_CACHE = 3, // 0x08 p
|
||||
GLOBAL_MACROS_CACHE = 4, // 0x10 g
|
||||
PER_CHARACTER_MACROS_CACHE = 5, // 0x20 p
|
||||
PER_CHARACTER_LAYOUT_CACHE = 6, // 0x40 p
|
||||
PER_CHARACTER_CHAT_CACHE = 7, // 0x80 p
|
||||
};
|
||||
|
||||
#define NUM_ACCOUNT_DATA_TYPES 8
|
||||
|
||||
#define GLOBAL_CACHE_MASK 0x15
|
||||
#define PER_CHARACTER_CACHE_MASK 0xEA
|
||||
|
||||
struct AccountData
|
||||
{
|
||||
AccountData() : Time(0), Data("") {}
|
||||
|
||||
time_t Time;
|
||||
std::string Data;
|
||||
};
|
||||
|
||||
enum PartyOperation
|
||||
{
|
||||
PARTY_OP_INVITE = 0,
|
||||
PARTY_OP_UNINVITE = 1,
|
||||
PARTY_OP_LEAVE = 2,
|
||||
PARTY_OP_SWAP = 4
|
||||
};
|
||||
|
||||
enum BFLeaveReason
|
||||
{
|
||||
BF_LEAVE_REASON_CLOSE = 0x00000001,
|
||||
//BF_LEAVE_REASON_UNK1 = 0x00000002, (not used)
|
||||
//BF_LEAVE_REASON_UNK2 = 0x00000004, (not used)
|
||||
BF_LEAVE_REASON_EXITED = 0x00000008,
|
||||
BF_LEAVE_REASON_LOW_LEVEL = 0x00000010,
|
||||
};
|
||||
|
||||
enum ChatRestrictionType
|
||||
{
|
||||
ERR_CHAT_RESTRICTED = 0,
|
||||
ERR_CHAT_THROTTLED = 1,
|
||||
ERR_USER_SQUELCHED = 2,
|
||||
ERR_YELL_RESTRICTED = 3
|
||||
};
|
||||
|
||||
enum CharterTypes
|
||||
{
|
||||
GUILD_CHARTER_TYPE = 9,
|
||||
ARENA_TEAM_CHARTER_2v2_TYPE = 2,
|
||||
ARENA_TEAM_CHARTER_3v3_TYPE = 3,
|
||||
ARENA_TEAM_CHARTER_5v5_TYPE = 5
|
||||
};
|
||||
|
||||
//class to deal with packet processing
|
||||
//allows to determine if next packet is safe to be processed
|
||||
class PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit PacketFilter(WorldSession* pSession) : m_pSession(pSession) {}
|
||||
virtual ~PacketFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* /*packet*/) { return true; }
|
||||
virtual bool ProcessLogout() const { return true; }
|
||||
|
||||
protected:
|
||||
WorldSession* const m_pSession;
|
||||
};
|
||||
//process only thread-safe packets in Map::Update()
|
||||
class MapSessionFilter : public PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit MapSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {}
|
||||
~MapSessionFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* packet);
|
||||
//in Map::Update() we do not process player logout!
|
||||
virtual bool ProcessLogout() const { return false; }
|
||||
};
|
||||
|
||||
//class used to filer only thread-unsafe packets from queue
|
||||
//in order to update only be used in World::UpdateSessions()
|
||||
class WorldSessionFilter : public PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit WorldSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {}
|
||||
~WorldSessionFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* packet);
|
||||
};
|
||||
|
||||
// Proxy structure to contain data passed to callback function,
|
||||
// only to prevent bloating the parameter list
|
||||
class CharacterCreateInfo
|
||||
{
|
||||
friend class WorldSession;
|
||||
friend class Player;
|
||||
|
||||
protected:
|
||||
CharacterCreateInfo(std::string const& name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId,
|
||||
WorldPacket& data) : Name(name), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair),
|
||||
OutfitId(outfitId), Data(data), CharCount(0)
|
||||
{}
|
||||
|
||||
/// User specified variables
|
||||
std::string Name;
|
||||
uint8 Race;
|
||||
uint8 Class;
|
||||
uint8 Gender;
|
||||
uint8 Skin;
|
||||
uint8 Face;
|
||||
uint8 HairStyle;
|
||||
uint8 HairColor;
|
||||
uint8 FacialHair;
|
||||
uint8 OutfitId;
|
||||
WorldPacket Data;
|
||||
|
||||
/// Server side data
|
||||
uint8 CharCount;
|
||||
|
||||
private:
|
||||
virtual ~CharacterCreateInfo(){};
|
||||
};
|
||||
|
||||
/// Player session in the World
|
||||
class WorldSession
|
||||
{
|
||||
public:
|
||||
WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter, bool skipQueue);
|
||||
~WorldSession();
|
||||
|
||||
bool PlayerLoading() const { return m_playerLoading; }
|
||||
bool PlayerLogout() const { return m_playerLogout; }
|
||||
bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; }
|
||||
|
||||
void ReadAddonsInfo(WorldPacket& data);
|
||||
void SendAddonsInfo();
|
||||
|
||||
void ReadMovementInfo(WorldPacket& data, MovementInfo* mi);
|
||||
void WriteMovementInfo(WorldPacket* data, MovementInfo* mi);
|
||||
|
||||
void SendPacket(WorldPacket const* packet);
|
||||
void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3);
|
||||
void SendNotification(uint32 string_id, ...);
|
||||
void SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName *declinedName);
|
||||
void SendPartyResult(PartyOperation operation, std::string const& member, PartyResult res, uint32 val = 0);
|
||||
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2, 3);
|
||||
void SendSetPhaseShift(uint32 phaseShift);
|
||||
void SendQueryTimeResponse();
|
||||
|
||||
void SendAuthResponse(uint8 code, bool shortForm, uint32 queuePos = 0);
|
||||
void SendClientCacheVersion(uint32 version);
|
||||
|
||||
AccountTypes GetSecurity() const { return _security; }
|
||||
bool CanSkipQueue() const { return _skipQueue; }
|
||||
uint32 GetAccountId() const { return _accountId; }
|
||||
Player* GetPlayer() const { return _player; }
|
||||
std::string const& GetPlayerName() const;
|
||||
std::string GetPlayerInfo() const;
|
||||
|
||||
uint32 GetGuidLow() const;
|
||||
void SetSecurity(AccountTypes security) { _security = security; }
|
||||
std::string const& GetRemoteAddress() { return m_Address; }
|
||||
void SetPlayer(Player* player);
|
||||
uint8 Expansion() const { return m_expansion; }
|
||||
|
||||
void InitWarden(BigNumber* k, std::string const& os);
|
||||
|
||||
/// Session in auth.queue currently
|
||||
void SetInQueue(bool state) { m_inQueue = state; }
|
||||
|
||||
/// Is the user engaged in a log out process?
|
||||
bool isLogingOut() const { return _logoutTime || m_playerLogout; }
|
||||
|
||||
/// Engage the logout process for the user
|
||||
void LogoutRequest(time_t requestTime)
|
||||
{
|
||||
_logoutTime = requestTime;
|
||||
}
|
||||
|
||||
/// Is logout cooldown expired?
|
||||
bool ShouldLogOut(time_t currTime) const
|
||||
{
|
||||
return (_logoutTime > 0 && currTime >= _logoutTime + 20);
|
||||
}
|
||||
|
||||
void LogoutPlayer(bool save);
|
||||
void KickPlayer(bool setKicked = true);
|
||||
|
||||
void QueuePacket(WorldPacket* new_packet);
|
||||
bool Update(uint32 diff, PacketFilter& updater);
|
||||
|
||||
/// Handle the authentication waiting queue (to be completed)
|
||||
void SendAuthWaitQue(uint32 position);
|
||||
|
||||
//void SendTestCreatureQueryOpcode(uint32 entry, uint64 guid, uint32 testvalue);
|
||||
void SendNameQueryOpcode(uint64 guid);
|
||||
|
||||
void SendTrainerList(uint64 guid);
|
||||
void SendTrainerList(uint64 guid, std::string const& strTitle);
|
||||
void SendListInventory(uint64 guid);
|
||||
void SendShowBank(uint64 guid);
|
||||
bool CanOpenMailBox(uint64 guid);
|
||||
void SendShowMailBox(uint64 guid);
|
||||
void SendTabardVendorActivate(uint64 guid);
|
||||
void SendSpiritResurrect();
|
||||
void SendBindPoint(Creature* npc);
|
||||
|
||||
void SendAttackStop(Unit const* enemy);
|
||||
|
||||
void SendBattleGroundList(uint64 guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB);
|
||||
|
||||
void SendTradeStatus(TradeStatus status);
|
||||
void SendUpdateTrade(bool trader_data = true);
|
||||
void SendCancelTrade();
|
||||
|
||||
void SendPetitionQueryOpcode(uint64 petitionguid);
|
||||
|
||||
// Spell
|
||||
void HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets & targets);
|
||||
|
||||
// Pet
|
||||
void SendPetNameQuery(uint64 guid, uint32 petnumber);
|
||||
void SendStablePet(uint64 guid);
|
||||
void SendStablePetCallback(PreparedQueryResult result, uint64 guid);
|
||||
void SendStableResult(uint8 guid);
|
||||
bool CheckStableMaster(uint64 guid);
|
||||
|
||||
// Account Data
|
||||
AccountData* GetAccountData(AccountDataType type) { return &m_accountData[type]; }
|
||||
void SetAccountData(AccountDataType type, time_t tm, std::string const& data);
|
||||
void SendAccountDataTimes(uint32 mask);
|
||||
void LoadGlobalAccountData();
|
||||
void LoadAccountData(PreparedQueryResult result, uint32 mask);
|
||||
|
||||
void LoadTutorialsData();
|
||||
void SendTutorialsData();
|
||||
void SaveTutorialsData(SQLTransaction& trans);
|
||||
uint32 GetTutorialInt(uint8 index) const { return m_Tutorials[index]; }
|
||||
void SetTutorialInt(uint8 index, uint32 value)
|
||||
{
|
||||
if (m_Tutorials[index] != value)
|
||||
{
|
||||
m_Tutorials[index] = value;
|
||||
m_TutorialsChanged = true;
|
||||
}
|
||||
}
|
||||
//used with item_page table
|
||||
bool SendItemInfo(uint32 itemid, WorldPacket data);
|
||||
//auction
|
||||
void SendAuctionHello(uint64 guid, Creature* unit);
|
||||
void SendAuctionCommandResult(uint32 auctionId, uint32 Action, uint32 ErrorCode, uint32 bidError = 0);
|
||||
void SendAuctionBidderNotification(uint32 location, uint32 auctionId, uint64 bidder, uint32 bidSum, uint32 diff, uint32 item_template);
|
||||
void SendAuctionOwnerNotification(AuctionEntry* auction);
|
||||
|
||||
//Item Enchantment
|
||||
void SendEnchantmentLog(uint64 target, uint64 caster, uint32 itemId, uint32 enchantId);
|
||||
void SendItemEnchantTimeUpdate(uint64 Playerguid, uint64 Itemguid, uint32 slot, uint32 Duration);
|
||||
|
||||
//Taxi
|
||||
void SendTaxiStatus(uint64 guid);
|
||||
void SendTaxiMenu(Creature* unit);
|
||||
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode = 0);
|
||||
bool SendLearnNewTaxiNode(Creature* unit);
|
||||
void SendDiscoverNewTaxiNode(uint32 nodeid);
|
||||
|
||||
// Guild/Arena Team
|
||||
void SendArenaTeamCommandResult(uint32 team_action, std::string const& team, std::string const& player, uint32 error_id = 0);
|
||||
void SendNotInArenaTeamPacket(uint8 type);
|
||||
void SendPetitionShowList(uint64 guid);
|
||||
|
||||
void BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data);
|
||||
|
||||
void DoLootRelease(uint64 lguid);
|
||||
|
||||
// Account mute time
|
||||
time_t m_muteTime;
|
||||
|
||||
// Locales
|
||||
LocaleConstant GetSessionDbcLocale() const { return m_sessionDbcLocale; }
|
||||
LocaleConstant GetSessionDbLocaleIndex() const { return m_sessionDbLocaleIndex; }
|
||||
const char *GetTrinityString(int32 entry) const;
|
||||
|
||||
uint32 GetLatency() const { return m_latency; }
|
||||
void SetLatency(uint32 latency) { m_latency = latency; }
|
||||
void ResetClientTimeDelay() { m_clientTimeDelay = 0; }
|
||||
|
||||
std::atomic<time_t> m_timeOutTime;
|
||||
void UpdateTimeOutTime(uint32 diff)
|
||||
{
|
||||
if (time_t(diff) > m_timeOutTime)
|
||||
m_timeOutTime = 0;
|
||||
else
|
||||
m_timeOutTime -= diff;
|
||||
}
|
||||
void ResetTimeOutTime()
|
||||
{
|
||||
m_timeOutTime = sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME);
|
||||
}
|
||||
bool IsConnectionIdle() const
|
||||
{
|
||||
return (m_timeOutTime <= 0 && !m_inQueue);
|
||||
}
|
||||
|
||||
// Recruit-A-Friend Handling
|
||||
uint32 GetRecruiterId() const { return recruiterId; }
|
||||
bool IsARecruiter() const { return isRecruiter; }
|
||||
|
||||
public: // opcodes handlers
|
||||
|
||||
void Handle_NULL(WorldPacket& recvPacket); // not used
|
||||
void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead
|
||||
void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client
|
||||
void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client
|
||||
|
||||
void HandleCharEnumOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharDeleteOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharCreateCallback(PreparedQueryResult result, CharacterCreateInfo* createInfo);
|
||||
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharEnum(PreparedQueryResult result);
|
||||
void HandlePlayerLoginFromDB(LoginQueryHolder * holder);
|
||||
void HandlePlayerLoginToCharInWorld(Player* pCurrChar);
|
||||
void HandlePlayerLoginToCharOutOfWorld(Player* pCurrChar);
|
||||
void HandleCharFactionOrRaceChange(WorldPacket& recvData);
|
||||
|
||||
// played time
|
||||
void HandlePlayedTime(WorldPacket& recvPacket);
|
||||
|
||||
// new
|
||||
void HandleMoveUnRootAck(WorldPacket& recvPacket);
|
||||
void HandleMoveRootAck(WorldPacket& recvPacket);
|
||||
void HandleLookingForGroup(WorldPacket& recvPacket);
|
||||
|
||||
// new inspect
|
||||
void HandleInspectOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// new party stats
|
||||
void HandleInspectHonorStatsOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMoveWaterWalkAck(WorldPacket& recvPacket);
|
||||
void HandleFeatherFallAck(WorldPacket& recvData);
|
||||
|
||||
void HandleMoveHoverAck(WorldPacket& recvData);
|
||||
|
||||
void HandleMountSpecialAnimOpcode(WorldPacket& recvdata);
|
||||
|
||||
// character view
|
||||
void HandleShowingHelmOpcode(WorldPacket& recvData);
|
||||
void HandleShowingCloakOpcode(WorldPacket& recvData);
|
||||
|
||||
// repair
|
||||
void HandleRepairItemOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// Knockback
|
||||
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMoveTeleportAck(WorldPacket& recvPacket);
|
||||
void HandleForceSpeedChangeAck(WorldPacket& recvData);
|
||||
|
||||
void HandlePingOpcode(WorldPacket& recvPacket);
|
||||
void HandleAuthSessionOpcode(WorldPacket& recvPacket);
|
||||
void HandleRepopRequestOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutostoreLootItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootMoneyOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootReleaseOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootMasterGiveOpcode(WorldPacket& recvPacket);
|
||||
void HandleWhoOpcode(WorldPacket& recvPacket);
|
||||
void HandleLogoutRequestOpcode(WorldPacket& recvPacket);
|
||||
void HandlePlayerLogoutOpcode(WorldPacket& recvPacket);
|
||||
void HandleLogoutCancelOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// GM Ticket opcodes
|
||||
void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketUpdateOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketDeleteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketGetTicketOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketSystemStatusOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMSurveySubmit(WorldPacket& recvPacket);
|
||||
void HandleReportLag(WorldPacket& recvPacket);
|
||||
void HandleGMResponseResolve(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTogglePvP(WorldPacket& recvPacket);
|
||||
|
||||
void HandleZoneUpdateOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetSelectionOpcode(WorldPacket& recvPacket);
|
||||
void HandleStandStateChangeOpcode(WorldPacket& recvPacket);
|
||||
void HandleEmoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleContactListOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddFriendOpcode(WorldPacket& recvPacket);
|
||||
void HandleDelFriendOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
|
||||
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
|
||||
void HandleBugOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetAmmoOpcode(WorldPacket& recvPacket);
|
||||
void HandleItemNameQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAreaTriggerOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleSetFactionAtWar(WorldPacket& recvData);
|
||||
void HandleSetFactionCheat(WorldPacket& recvData);
|
||||
void HandleSetWatchedFactionOpcode(WorldPacket& recvData);
|
||||
void HandleSetFactionInactiveOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleUpdateAccountData(WorldPacket& recvPacket);
|
||||
void HandleRequestAccountData(WorldPacket& recvPacket);
|
||||
void HandleSetActionButtonOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
|
||||
void HandleMeetingStoneInfo(WorldPacket& recPacket);
|
||||
void HandleGameobjectReportUse(WorldPacket& recvPacket);
|
||||
|
||||
void HandleNameQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleQueryTimeOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleCreatureQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGameObjectQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMoveWorldportAckOpcode(WorldPacket& recvPacket);
|
||||
void HandleMoveWorldportAckOpcode(); // for server-side calls
|
||||
|
||||
void HandleMovementOpcodes(WorldPacket& recvPacket);
|
||||
void HandleSetActiveMoverOpcode(WorldPacket& recvData);
|
||||
void HandleMoveNotActiveMover(WorldPacket& recvData);
|
||||
void HandleDismissControlledVehicle(WorldPacket& recvData);
|
||||
void HandleRequestVehicleExit(WorldPacket& recvData);
|
||||
void HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData);
|
||||
void HandleMoveTimeSkippedOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleRequestRaidInfoOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleBattlefieldStatusOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleGroupInviteOpcode(WorldPacket& recvPacket);
|
||||
//void HandleGroupCancelOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupAcceptOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupDeclineOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupUninviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupDisbandOpcode(WorldPacket& recvPacket);
|
||||
void HandleOptOutOfLootOpcode(WorldPacket& recvData);
|
||||
void HandleLootMethodOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootRoll(WorldPacket& recvData);
|
||||
void HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData);
|
||||
void HandleRaidTargetUpdateOpcode(WorldPacket& recvData);
|
||||
void HandleRaidReadyCheckOpcode(WorldPacket& recvData);
|
||||
void HandleRaidReadyCheckFinishedOpcode(WorldPacket& recvData);
|
||||
void HandleGroupRaidConvertOpcode(WorldPacket& recvData);
|
||||
void HandleGroupChangeSubGroupOpcode(WorldPacket& recvData);
|
||||
void HandleGroupAssistantLeaderOpcode(WorldPacket& recvData);
|
||||
void HandlePartyAssignmentOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandlePetitionBuyOpcode(WorldPacket& recvData);
|
||||
void HandlePetitionShowSignOpcode(WorldPacket& recvData);
|
||||
void HandlePetitionQueryOpcode(WorldPacket& recvData);
|
||||
void HandlePetitionRenameOpcode(WorldPacket& recvData);
|
||||
void HandlePetitionSignOpcode(WorldPacket& recvData);
|
||||
void HandlePetitionDeclineOpcode(WorldPacket& recvData);
|
||||
void HandleOfferPetitionOpcode(WorldPacket& recvData);
|
||||
void HandleTurnInPetitionOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleGuildQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildInviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRemoveOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildAcceptOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDeclineOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildInfoOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildEventLogQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRosterOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildPromoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDemoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildLeaveOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDisbandOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildLeaderOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildMOTDOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildAddRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDelRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket);
|
||||
void HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
|
||||
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
|
||||
void HandleActivateTaxiExpressOpcode(WorldPacket& recvPacket);
|
||||
void HandleMoveSplineDoneOpcode(WorldPacket& recvPacket);
|
||||
void SendActivateTaxiReply(ActivateTaxiReply reply);
|
||||
|
||||
void HandleTabardVendorActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleBankerActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleBuyBankSlotOpcode(WorldPacket& recvPacket);
|
||||
void HandleTrainerListOpcode(WorldPacket& recvPacket);
|
||||
void HandleTrainerBuySpellOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetitionShowListOpcode(WorldPacket& recvPacket);
|
||||
void HandleGossipHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleGossipSelectOptionOpcode(WorldPacket& recvPacket);
|
||||
void HandleSpiritHealerActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleNpcTextQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
|
||||
void HandleStablePet(WorldPacket& recvPacket);
|
||||
void HandleStablePetCallback(PreparedQueryResult result);
|
||||
void HandleUnstablePet(WorldPacket& recvPacket);
|
||||
void HandleUnstablePetCallback(PreparedQueryResult result, uint32 petId);
|
||||
void HandleBuyStableSlot(WorldPacket& recvPacket);
|
||||
void HandleStableRevivePet(WorldPacket& recvPacket);
|
||||
void HandleStableSwapPet(WorldPacket& recvPacket);
|
||||
void HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId);
|
||||
void HandleOpenWrappedItemCallback(PreparedQueryResult result, uint8 bagIndex, uint8 slot, uint32 itemLowGUID);
|
||||
void HandleLoadActionsSwitchSpec(PreparedQueryResult result);
|
||||
void HandleCharacterAuraFrozen(PreparedQueryResult result);
|
||||
uint8 HandleLoadPetFromDBFirstCallback(PreparedQueryResult result, uint8 asynchLoadType);
|
||||
void HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder * holder);
|
||||
|
||||
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
|
||||
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAcceptTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleBeginTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleBusyTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleClearTradeItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleIgnoreTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleInitiateTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetTradeGoldOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetTradeItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleUnacceptTradeOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAuctionHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleAuctionListItems(WorldPacket& recvData);
|
||||
void HandleAuctionListBidderItems(WorldPacket& recvData);
|
||||
void HandleAuctionSellItem(WorldPacket& recvData);
|
||||
void HandleAuctionRemoveItem(WorldPacket& recvData);
|
||||
void HandleAuctionListOwnerItems(WorldPacket& recvData);
|
||||
void HandleAuctionListOwnerItemsEvent(WorldPacket & recvData);
|
||||
void HandleAuctionPlaceBid(WorldPacket& recvData);
|
||||
void HandleAuctionListPendingSales(WorldPacket& recvData);
|
||||
|
||||
void HandleGetMailList(WorldPacket& recvData);
|
||||
void HandleSendMail(WorldPacket& recvData);
|
||||
void HandleMailTakeMoney(WorldPacket& recvData);
|
||||
void HandleMailTakeItem(WorldPacket& recvData);
|
||||
void HandleMailMarkAsRead(WorldPacket& recvData);
|
||||
void HandleMailReturnToSender(WorldPacket& recvData);
|
||||
void HandleMailDelete(WorldPacket& recvData);
|
||||
void HandleItemTextQuery(WorldPacket& recvData);
|
||||
void HandleMailCreateTextItem(WorldPacket& recvData);
|
||||
void HandleQueryNextMailTime(WorldPacket& recvData);
|
||||
void HandleCancelChanneling(WorldPacket& recvData);
|
||||
|
||||
void SendItemPageInfo(ItemTemplate* itemProto);
|
||||
void HandleSplitItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleDestroyItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoEquipItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleItemQuerySingleOpcode(WorldPacket& recvPacket);
|
||||
void HandleSellItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
|
||||
void HandleBuyItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleListInventoryOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoStoreBagItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleReadItem(WorldPacket& recvPacket);
|
||||
void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket);
|
||||
void HandleSwapItem(WorldPacket& recvPacket);
|
||||
void HandleBuybackItem(WorldPacket& recvPacket);
|
||||
void HandleAutoBankItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleWrapItemOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAttackSwingOpcode(WorldPacket& recvPacket);
|
||||
void HandleAttackStopOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetSheathedOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleUseItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleOpenItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleCastSpellOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelCastOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelGrowthAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleLearnTalentOpcode(WorldPacket& recvPacket);
|
||||
void HandleLearnPreviewTalents(WorldPacket& recvPacket);
|
||||
void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
|
||||
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleQuestgiverStatusQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverStatusMultipleQuery(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverQueryQuestOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverRequestRewardOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverCancel(WorldPacket& recvData);
|
||||
void HandleQuestLogSwapQuest(WorldPacket& recvData);
|
||||
void HandleQuestLogRemoveQuest(WorldPacket& recvData);
|
||||
void HandleQuestConfirmAccept(WorldPacket& recvData);
|
||||
void HandleQuestgiverCompleteQuest(WorldPacket& recvData);
|
||||
void HandleQuestgiverQuestAutoLaunch(WorldPacket& recvPacket);
|
||||
void HandlePushQuestToParty(WorldPacket& recvPacket);
|
||||
void HandleQuestPushResult(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMessagechatOpcode(WorldPacket& recvPacket);
|
||||
void SendPlayerNotFoundNotice(std::string const& name);
|
||||
void SendPlayerAmbiguousNotice(std::string const& name);
|
||||
void SendWrongFactionNotice();
|
||||
void SendChatRestrictedNotice(ChatRestrictionType restriction);
|
||||
void HandleTextEmoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleChatIgnoredOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleReclaimCorpseOpcode(WorldPacket& recvPacket);
|
||||
void HandleCorpseQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleCorpseMapPositionQuery(WorldPacket& recvPacket);
|
||||
void HandleResurrectResponseOpcode(WorldPacket& recvPacket);
|
||||
void HandleSummonResponseOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleJoinChannel(WorldPacket& recvPacket);
|
||||
void HandleLeaveChannel(WorldPacket& recvPacket);
|
||||
void HandleChannelList(WorldPacket& recvPacket);
|
||||
void HandleChannelPassword(WorldPacket& recvPacket);
|
||||
void HandleChannelSetOwner(WorldPacket& recvPacket);
|
||||
void HandleChannelOwner(WorldPacket& recvPacket);
|
||||
void HandleChannelModerator(WorldPacket& recvPacket);
|
||||
void HandleChannelUnmoderator(WorldPacket& recvPacket);
|
||||
void HandleChannelMute(WorldPacket& recvPacket);
|
||||
void HandleChannelUnmute(WorldPacket& recvPacket);
|
||||
void HandleChannelInvite(WorldPacket& recvPacket);
|
||||
void HandleChannelKick(WorldPacket& recvPacket);
|
||||
void HandleChannelBan(WorldPacket& recvPacket);
|
||||
void HandleChannelUnban(WorldPacket& recvPacket);
|
||||
void HandleChannelAnnouncements(WorldPacket& recvPacket);
|
||||
void HandleChannelModerate(WorldPacket& recvPacket);
|
||||
void HandleChannelDeclineInvite(WorldPacket& recvPacket);
|
||||
void HandleChannelDisplayListQuery(WorldPacket& recvPacket);
|
||||
void HandleGetChannelMemberCount(WorldPacket& recvPacket);
|
||||
void HandleSetChannelWatch(WorldPacket& recvPacket);
|
||||
void HandleClearChannelWatch(WorldPacket& recvPacket);
|
||||
|
||||
void HandleCompleteCinematic(WorldPacket& recvPacket);
|
||||
void HandleNextCinematicCamera(WorldPacket& recvPacket);
|
||||
|
||||
void HandlePageTextQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTutorialFlag (WorldPacket& recvData);
|
||||
void HandleTutorialClear(WorldPacket& recvData);
|
||||
void HandleTutorialReset(WorldPacket& recvData);
|
||||
|
||||
//Pet
|
||||
void HandlePetAction(WorldPacket& recvData);
|
||||
void HandlePetStopAttack(WorldPacket& recvData);
|
||||
void HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid, uint16 flag, uint64 guid2);
|
||||
void HandlePetNameQuery(WorldPacket& recvData);
|
||||
void HandlePetSetAction(WorldPacket& recvData);
|
||||
void HandlePetAbandon(WorldPacket& recvData);
|
||||
void HandlePetRename(WorldPacket& recvData);
|
||||
void HandlePetCancelAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetCastSpellOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetLearnTalent(WorldPacket& recvPacket);
|
||||
void HandleLearnPreviewTalentsPet(WorldPacket& recvPacket);
|
||||
|
||||
void HandleSetActionBarToggles(WorldPacket& recvData);
|
||||
|
||||
void HandleCharRenameOpcode(WorldPacket& recvData);
|
||||
void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName);
|
||||
void HandleSetPlayerDeclinedNames(WorldPacket& recvData);
|
||||
|
||||
void HandleTotemDestroyed(WorldPacket& recvData);
|
||||
void HandleDismissCritter(WorldPacket& recvData);
|
||||
|
||||
//Battleground
|
||||
void HandleBattlemasterHelloOpcode(WorldPacket& recvData);
|
||||
void HandleBattlemasterJoinOpcode(WorldPacket& recvData);
|
||||
void HandleBattlegroundPlayerPositionsOpcode(WorldPacket& recvData);
|
||||
void HandlePVPLogDataOpcode(WorldPacket& recvData);
|
||||
void HandleBattleFieldPortOpcode(WorldPacket& recvData);
|
||||
void HandleBattlefieldListOpcode(WorldPacket& recvData);
|
||||
void HandleBattlefieldLeaveOpcode(WorldPacket& recvData);
|
||||
void HandleBattlemasterJoinArena(WorldPacket& recvData);
|
||||
void HandleReportPvPAFK(WorldPacket& recvData);
|
||||
|
||||
void HandleWardenDataOpcode(WorldPacket& recvData);
|
||||
void HandleWorldTeleportOpcode(WorldPacket& recvData);
|
||||
void HandleMinimapPingOpcode(WorldPacket& recvData);
|
||||
void HandleRandomRollOpcode(WorldPacket& recvData);
|
||||
void HandleFarSightOpcode(WorldPacket& recvData);
|
||||
void HandleSetDungeonDifficultyOpcode(WorldPacket& recvData);
|
||||
void HandleSetRaidDifficultyOpcode(WorldPacket& recvData);
|
||||
void HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData);
|
||||
void HandleSetTitleOpcode(WorldPacket& recvData);
|
||||
void HandleRealmSplitOpcode(WorldPacket& recvData);
|
||||
void HandleTimeSyncResp(WorldPacket& recvData);
|
||||
void HandleWhoisOpcode(WorldPacket& recvData);
|
||||
void HandleResetInstancesOpcode(WorldPacket& recvData);
|
||||
void HandleHearthAndResurrect(WorldPacket& recvData);
|
||||
void HandleInstanceLockResponse(WorldPacket& recvPacket);
|
||||
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);
|
||||
|
||||
// Battlefield
|
||||
void SendBfInvitePlayerToWar(uint32 battleId, uint32 zoneId, uint32 time);
|
||||
void SendBfInvitePlayerToQueue(uint32 battleId);
|
||||
void SendBfQueueInviteResponse(uint32 battleId, uint32 zoneId, bool canQueue = true, bool full = false);
|
||||
void SendBfEntered(uint32 battleId);
|
||||
void SendBfLeaveMessage(uint32 battleId, BFLeaveReason reason = BF_LEAVE_REASON_EXITED);
|
||||
void HandleBfQueueInviteResponse(WorldPacket& recvData);
|
||||
void HandleBfEntryInviteResponse(WorldPacket& recvData);
|
||||
void HandleBfExitRequest(WorldPacket& recvData);
|
||||
|
||||
// Looking for Dungeon/Raid
|
||||
void HandleLfgSetCommentOpcode(WorldPacket& recvData);
|
||||
void HandleLfgPlayerLockInfoRequestOpcode(WorldPacket& recvData);
|
||||
void HandleLfgPartyLockInfoRequestOpcode(WorldPacket& recvData);
|
||||
void HandleLfgJoinOpcode(WorldPacket& recvData);
|
||||
void HandleLfgLeaveOpcode(WorldPacket& recvData);
|
||||
void HandleLfgSetRolesOpcode(WorldPacket& recvData);
|
||||
void HandleLfgProposalResultOpcode(WorldPacket& recvData);
|
||||
void HandleLfgSetBootVoteOpcode(WorldPacket& recvData);
|
||||
void HandleLfgTeleportOpcode(WorldPacket& recvData);
|
||||
void HandleLfrSearchJoinOpcode(WorldPacket& recvData);
|
||||
void HandleLfrSearchLeaveOpcode(WorldPacket& recvData);
|
||||
void HandleLfgGetStatus(WorldPacket& recvData);
|
||||
|
||||
void SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData);
|
||||
void SendLfgUpdateParty(lfg::LfgUpdateData const& updateData);
|
||||
void SendLfgRoleChosen(uint64 guid, uint8 roles);
|
||||
void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& pRoleCheck);
|
||||
void SendLfgLfrList(bool update);
|
||||
void SendLfgJoinResult(lfg::LfgJoinResultData const& joinData);
|
||||
void SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData);
|
||||
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const& lfgPlayerRewardData);
|
||||
void SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot);
|
||||
void SendLfgUpdateProposal(lfg::LfgProposal const& proposal);
|
||||
void SendLfgDisabled();
|
||||
void SendLfgOfferContinue(uint32 dungeonEntry);
|
||||
void SendLfgTeleportError(uint8 err);
|
||||
|
||||
// Arena Team
|
||||
void HandleInspectArenaTeamsOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamQueryOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamRosterOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamInviteOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamAcceptOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamDeclineOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamLeaveOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamRemoveOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamDisbandOpcode(WorldPacket& recvData);
|
||||
void HandleArenaTeamLeaderOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleAreaSpiritHealerQueryOpcode(WorldPacket& recvData);
|
||||
void HandleAreaSpiritHealerQueueOpcode(WorldPacket& recvData);
|
||||
void HandleCancelMountAuraOpcode(WorldPacket& recvData);
|
||||
void HandleSelfResOpcode(WorldPacket& recvData);
|
||||
void HandleComplainOpcode(WorldPacket& recvData);
|
||||
void HandleRequestPetInfoOpcode(WorldPacket& recvData);
|
||||
|
||||
// Socket gem
|
||||
void HandleSocketOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleCancelTempEnchantmentOpcode(WorldPacket& recvData);
|
||||
|
||||
void HandleItemRefundInfoRequest(WorldPacket& recvData);
|
||||
void HandleItemRefund(WorldPacket& recvData);
|
||||
|
||||
void HandleChannelVoiceOnOpcode(WorldPacket& recvData);
|
||||
void HandleVoiceSessionEnableOpcode(WorldPacket& recvData);
|
||||
void HandleSetActiveVoiceChannel(WorldPacket& recvData);
|
||||
void HandleSetTaxiBenchmarkOpcode(WorldPacket& recvData);
|
||||
|
||||
// Guild Bank
|
||||
void HandleGuildPermissions(WorldPacket& recvData);
|
||||
void HandleGuildBankMoneyWithdrawn(WorldPacket& recvData);
|
||||
void HandleGuildBankerActivate(WorldPacket& recvData);
|
||||
void HandleGuildBankQueryTab(WorldPacket& recvData);
|
||||
void HandleGuildBankLogQuery(WorldPacket& recvData);
|
||||
void HandleGuildBankDepositMoney(WorldPacket& recvData);
|
||||
void HandleGuildBankWithdrawMoney(WorldPacket& recvData);
|
||||
void HandleGuildBankSwapItems(WorldPacket& recvData);
|
||||
|
||||
void HandleGuildBankUpdateTab(WorldPacket& recvData);
|
||||
void HandleGuildBankBuyTab(WorldPacket& recvData);
|
||||
void HandleQueryGuildBankTabText(WorldPacket& recvData);
|
||||
void HandleSetGuildBankTabText(WorldPacket& recvData);
|
||||
|
||||
// Refer-a-Friend
|
||||
void HandleGrantLevel(WorldPacket& recvData);
|
||||
void HandleAcceptGrantLevel(WorldPacket& recvData);
|
||||
|
||||
// Calendar
|
||||
void HandleCalendarGetCalendar(WorldPacket& recvData);
|
||||
void HandleCalendarGetEvent(WorldPacket& recvData);
|
||||
void HandleCalendarGuildFilter(WorldPacket& recvData);
|
||||
void HandleCalendarArenaTeam(WorldPacket& recvData);
|
||||
void HandleCalendarAddEvent(WorldPacket& recvData);
|
||||
void HandleCalendarUpdateEvent(WorldPacket& recvData);
|
||||
void HandleCalendarRemoveEvent(WorldPacket& recvData);
|
||||
void HandleCalendarCopyEvent(WorldPacket& recvData);
|
||||
void HandleCalendarEventInvite(WorldPacket& recvData);
|
||||
void HandleCalendarEventRsvp(WorldPacket& recvData);
|
||||
void HandleCalendarEventRemoveInvite(WorldPacket& recvData);
|
||||
void HandleCalendarEventStatus(WorldPacket& recvData);
|
||||
void HandleCalendarEventModeratorStatus(WorldPacket& recvData);
|
||||
void HandleCalendarComplain(WorldPacket& recvData);
|
||||
void HandleCalendarGetNumPending(WorldPacket& recvData);
|
||||
void HandleCalendarEventSignup(WorldPacket& recvData);
|
||||
|
||||
void SendCalendarRaidLockout(InstanceSave const* save, bool add);
|
||||
void SendCalendarRaidLockoutUpdated(InstanceSave const* save, bool isExtended);
|
||||
void HandleSetSavedInstanceExtend(WorldPacket& recvData);
|
||||
|
||||
void HandleSpellClick(WorldPacket& recvData);
|
||||
void HandleMirrorImageDataRequest(WorldPacket& recvData);
|
||||
void HandleAlterAppearance(WorldPacket& recvData);
|
||||
void HandleRemoveGlyph(WorldPacket& recvData);
|
||||
void HandleCharCustomize(WorldPacket& recvData);
|
||||
void HandleQueryInspectAchievements(WorldPacket& recvData);
|
||||
void HandleEquipmentSetSave(WorldPacket& recvData);
|
||||
void HandleEquipmentSetDelete(WorldPacket& recvData);
|
||||
void HandleEquipmentSetUse(WorldPacket& recvData);
|
||||
void HandleWorldStateUITimerUpdate(WorldPacket& recvData);
|
||||
void HandleReadyForAccountDataTimes(WorldPacket& recvData);
|
||||
void HandleQueryQuestsCompleted(WorldPacket& recvData);
|
||||
void HandleQuestPOIQuery(WorldPacket& recvData);
|
||||
void HandleEjectPassenger(WorldPacket& data);
|
||||
void HandleEnterPlayerVehicle(WorldPacket& data);
|
||||
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
|
||||
|
||||
// _loadPetFromDBFirstCallback helpers
|
||||
//QueryCallback<PreparedQueryResult, uint64> GetLoadPetFromDBFirstCallback() { return _loadPetFromDBFirstCallback; }
|
||||
|
||||
uint32 _lastAuctionListItemsMSTime;
|
||||
uint32 _lastAuctionListOwnerItemsMSTime;
|
||||
|
||||
void HandleTeleportTimeout(bool updateInSessions);
|
||||
bool HandleSocketClosed();
|
||||
void SetOfflineTime(uint32 time) { _offlineTime = time; }
|
||||
uint32 GetOfflineTime() const { return _offlineTime; }
|
||||
bool IsKicked() const { return _kicked; }
|
||||
void SetKicked(bool val) { _kicked = val; }
|
||||
void SetShouldSetOfflineInDB(bool val) { _shouldSetOfflineInDB = val; }
|
||||
bool GetShouldSetOfflineInDB() const { return _shouldSetOfflineInDB; }
|
||||
|
||||
/***
|
||||
CALLBACKS
|
||||
***/
|
||||
private:
|
||||
void InitializeQueryCallbackParameters();
|
||||
void ProcessQueryCallbacks();
|
||||
void ProcessQueryCallbackPlayer();
|
||||
void ProcessQueryCallbackPet();
|
||||
void ProcessQueryCallbackLogin();
|
||||
|
||||
PreparedQueryResultFuture _charEnumCallback;
|
||||
PreparedQueryResultFuture _stablePetCallback;
|
||||
QueryCallback<PreparedQueryResult, std::string> _charRenameCallback;
|
||||
QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback;
|
||||
QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback;
|
||||
QueryCallback<PreparedQueryResult, uint64> _sendStabledPetCallback;
|
||||
QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback;
|
||||
|
||||
QueryResultHolderFuture _charLoginCallback;
|
||||
|
||||
QueryResultHolderFuture _loadPetFromDBSecondCallback;
|
||||
QueryCallback_3<PreparedQueryResult, uint8, uint8, uint32> _openWrappedItemCallback;
|
||||
|
||||
public:
|
||||
// xinef: those must be public, requires calls out of worldsession :(
|
||||
QueryCallback_2<PreparedQueryResult, uint32, AsynchPetSummon*> _loadPetFromDBFirstCallback;
|
||||
PreparedQueryResultFuture _loadActionsSwitchSpecCallback;
|
||||
PreparedQueryResultFuture _CharacterAuraFrozenCallback;
|
||||
|
||||
/***
|
||||
END OF CALLBACKS
|
||||
***/
|
||||
private:
|
||||
// private trade methods
|
||||
void moveItems(Item* myItems[], Item* hisItems[]);
|
||||
|
||||
bool CanUseBank(uint64 bankerGUID = 0) const;
|
||||
|
||||
// EnumData helpers
|
||||
bool IsLegitCharacterForAccount(uint32 lowGUID)
|
||||
{
|
||||
return _legitCharacters.find(lowGUID) != _legitCharacters.end();
|
||||
}
|
||||
|
||||
// this stores the GUIDs of the characters who can login
|
||||
// characters who failed on Player::BuildEnumData shouldn't login
|
||||
std::set<uint32> _legitCharacters;
|
||||
|
||||
uint32 m_GUIDLow;
|
||||
Player* _player;
|
||||
WorldSocket* m_Socket;
|
||||
std::string m_Address;
|
||||
|
||||
AccountTypes _security;
|
||||
bool _skipQueue;
|
||||
uint32 _accountId;
|
||||
uint8 m_expansion;
|
||||
|
||||
typedef std::list<AddonInfo> AddonsList;
|
||||
|
||||
// Warden
|
||||
Warden* _warden; // Remains NULL if Warden system is not enabled by config
|
||||
|
||||
time_t _logoutTime;
|
||||
bool m_inQueue; // session wait in auth.queue
|
||||
bool m_playerLoading; // code processed in LoginPlayer
|
||||
bool m_playerLogout; // code processed in LogoutPlayer
|
||||
bool m_playerSave;
|
||||
LocaleConstant m_sessionDbcLocale;
|
||||
LocaleConstant m_sessionDbLocaleIndex;
|
||||
uint32 m_latency;
|
||||
uint32 m_clientTimeDelay;
|
||||
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
|
||||
uint32 m_Tutorials[MAX_ACCOUNT_TUTORIAL_VALUES];
|
||||
bool m_TutorialsChanged;
|
||||
AddonsList m_addonsList;
|
||||
uint32 recruiterId;
|
||||
bool isRecruiter;
|
||||
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
|
||||
uint64 m_currentBankerGUID;
|
||||
time_t timeWhoCommandAllowed;
|
||||
uint32 _offlineTime;
|
||||
bool _kicked;
|
||||
bool _shouldSetOfflineInDB;
|
||||
};
|
||||
#endif
|
||||
/// @}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/** \addtogroup u2w User to World Communication
|
||||
* @{
|
||||
* \file WorldSocket.h
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef _WORLDSOCKET_H
|
||||
#define _WORLDSOCKET_H
|
||||
|
||||
#include <ace/Basic_Types.h>
|
||||
#include <ace/Synch_Traits.h>
|
||||
#include <ace/Svc_Handler.h>
|
||||
#include <ace/SOCK_Stream.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
#include <ace/Guard_T.h>
|
||||
#include <ace/Unbounded_Queue.h>
|
||||
#include <ace/Message_Block.h>
|
||||
|
||||
#if !defined (ACE_LACKS_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif /* ACE_LACKS_PRAGMA_ONCE */
|
||||
|
||||
#include "Common.h"
|
||||
#include "AuthCrypt.h"
|
||||
|
||||
class ACE_Message_Block;
|
||||
class WorldPacket;
|
||||
class WorldSession;
|
||||
|
||||
/// Handler that can communicate over stream sockets.
|
||||
typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> WorldHandler;
|
||||
|
||||
/**
|
||||
* WorldSocket.
|
||||
*
|
||||
* This class is responsible for the communication with
|
||||
* remote clients.
|
||||
* Most methods return -1 on failure.
|
||||
* The class uses reference counting.
|
||||
*
|
||||
* For output the class uses one buffer (64K usually) and
|
||||
* a queue where it stores packet if there is no place on
|
||||
* the queue. The reason this is done, is because the server
|
||||
* does really a lot of small-size writes to it, and it doesn't
|
||||
* scale well to allocate memory for every. When something is
|
||||
* written to the output buffer the socket is not immediately
|
||||
* activated for output (again for the same reason), there
|
||||
* is 10ms celling (thats why there is Update() method).
|
||||
* This concept is similar to TCP_CORK, but TCP_CORK
|
||||
* uses 200ms celling. As result overhead generated by
|
||||
* sending packets from "producer" threads is minimal,
|
||||
* and doing a lot of writes with small size is tolerated.
|
||||
*
|
||||
* The calls to Update() method are managed by WorldSocketMgr
|
||||
* and ReactorRunnable.
|
||||
*
|
||||
* For input, the class uses one 4096 bytes buffer on stack
|
||||
* to which it does recv() calls. And then received data is
|
||||
* distributed where its needed. 4096 matches pretty well the
|
||||
* traffic generated by client for now.
|
||||
*
|
||||
* The input/output do speculative reads/writes (AKA it tryes
|
||||
* to read all data available in the kernel buffer or tryes to
|
||||
* write everything available in userspace buffer),
|
||||
* which is ok for using with Level and Edge Triggered IO
|
||||
* notification.
|
||||
*
|
||||
*/
|
||||
class WorldSocket : public WorldHandler
|
||||
{
|
||||
public:
|
||||
WorldSocket (void);
|
||||
virtual ~WorldSocket (void);
|
||||
|
||||
friend class WorldSocketMgr;
|
||||
|
||||
/// Mutex type used for various synchronizations.
|
||||
typedef ACE_Thread_Mutex LockType;
|
||||
typedef ACE_Guard<LockType> GuardType;
|
||||
|
||||
/// Check if socket is closed.
|
||||
bool IsClosed (void) const;
|
||||
|
||||
/// Close the socket.
|
||||
void CloseSocket (void);
|
||||
|
||||
/// Get address of connected peer.
|
||||
const std::string& GetRemoteAddress (void) const;
|
||||
|
||||
/// Send A packet on the socket, this function is reentrant.
|
||||
/// @param pct packet to send
|
||||
/// @return -1 of failure
|
||||
int SendPacket(const WorldPacket& pct);
|
||||
|
||||
/// Add reference to this object.
|
||||
long AddReference (void);
|
||||
|
||||
/// Remove reference to this object.
|
||||
long RemoveReference (void);
|
||||
|
||||
/// things called by ACE framework.
|
||||
|
||||
/// Called on open, the void* is the acceptor.
|
||||
virtual int open (void *);
|
||||
|
||||
/// Called on failures inside of the acceptor, don't call from your code.
|
||||
virtual int close (u_long);
|
||||
|
||||
/// Called when we can read from the socket.
|
||||
virtual int handle_input (ACE_HANDLE = ACE_INVALID_HANDLE);
|
||||
|
||||
/// Called when the socket can write.
|
||||
virtual int handle_output (ACE_HANDLE = ACE_INVALID_HANDLE);
|
||||
|
||||
/// Called when connection is closed or error happens.
|
||||
virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
|
||||
ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
|
||||
|
||||
/// Called by WorldSocketMgr/ReactorRunnable.
|
||||
int Update (void);
|
||||
|
||||
private:
|
||||
/// Helper functions for processing incoming data.
|
||||
int handle_input_header (void);
|
||||
int handle_input_payload (void);
|
||||
int handle_input_missing_data (void);
|
||||
|
||||
/// Help functions to mark/unmark the socket for output.
|
||||
/// @param g the guard is for m_OutBufferLock, the function will release it
|
||||
int cancel_wakeup_output (GuardType& g);
|
||||
int schedule_wakeup_output (GuardType& g);
|
||||
|
||||
/// Drain the queue if its not empty.
|
||||
int handle_output_queue (GuardType& g);
|
||||
|
||||
/// process one incoming packet.
|
||||
/// @param new_pct received packet, note that you need to delete it.
|
||||
int ProcessIncoming (WorldPacket* new_pct);
|
||||
|
||||
/// Called by ProcessIncoming() on CMSG_AUTH_SESSION.
|
||||
int HandleAuthSession (WorldPacket& recvPacket);
|
||||
|
||||
/// Called by ProcessIncoming() on CMSG_PING.
|
||||
int HandlePing (WorldPacket& recvPacket);
|
||||
|
||||
private:
|
||||
/// Time in which the last ping was received
|
||||
ACE_Time_Value m_LastPingTime;
|
||||
|
||||
/// Keep track of over-speed pings, to prevent ping flood.
|
||||
uint32 m_OverSpeedPings;
|
||||
|
||||
/// Address of the remote peer
|
||||
std::string m_Address;
|
||||
|
||||
/// Class used for managing encryption of the headers
|
||||
AuthCrypt m_Crypt;
|
||||
|
||||
/// Mutex lock to protect m_Session
|
||||
LockType m_SessionLock;
|
||||
|
||||
/// Session to which received packets are routed
|
||||
WorldSession* m_Session;
|
||||
|
||||
/// here are stored the fragments of the received data
|
||||
WorldPacket* m_RecvWPct;
|
||||
|
||||
/// This block actually refers to m_RecvWPct contents,
|
||||
/// which allows easy and safe writing to it.
|
||||
/// It wont free memory when its deleted. m_RecvWPct takes care of freeing.
|
||||
ACE_Message_Block m_RecvPct;
|
||||
|
||||
/// Fragment of the received header.
|
||||
ACE_Message_Block m_Header;
|
||||
|
||||
/// Mutex for protecting output related data.
|
||||
LockType m_OutBufferLock;
|
||||
|
||||
/// Buffer used for writing output.
|
||||
ACE_Message_Block* m_OutBuffer;
|
||||
|
||||
/// Size of the m_OutBuffer.
|
||||
size_t m_OutBufferSize;
|
||||
|
||||
/// True if the socket is registered with the reactor for output
|
||||
bool m_OutActive;
|
||||
|
||||
uint32 m_Seed;
|
||||
|
||||
};
|
||||
|
||||
#endif /* _WORLDSOCKET_H */
|
||||
|
||||
/// @}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/** \addtogroup u2w User to World Communication
|
||||
* @{
|
||||
* \file WorldSocketMgr.h
|
||||
*/
|
||||
|
||||
#ifndef __WORLDSOCKETACCEPTOR_H_
|
||||
#define __WORLDSOCKETACCEPTOR_H_
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
#include <ace/Acceptor.h>
|
||||
#include <ace/SOCK_Acceptor.h>
|
||||
|
||||
#include "WorldSocket.h"
|
||||
|
||||
class WorldSocketAcceptor : public ACE_Acceptor<WorldSocket, ACE_SOCK_Acceptor>
|
||||
{
|
||||
public:
|
||||
WorldSocketAcceptor(void) { }
|
||||
virtual ~WorldSocketAcceptor(void)
|
||||
{
|
||||
if (reactor())
|
||||
reactor()->cancel_timer(this, 1);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual int handle_timeout(const ACE_Time_Value& /*current_time*/, const void* /*act = 0*/)
|
||||
{
|
||||
sLog->outBasic("Resuming acceptor");
|
||||
reactor()->cancel_timer(this, 1);
|
||||
return reactor()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
|
||||
}
|
||||
|
||||
virtual int handle_accept_error(void)
|
||||
{
|
||||
#if defined(ENFILE) && defined(EMFILE)
|
||||
if (errno == ENFILE || errno == EMFILE)
|
||||
{
|
||||
sLog->outError("Out of file descriptors, suspending incoming connections for 10 seconds");
|
||||
reactor()->remove_handler(this, ACE_Event_Handler::ACCEPT_MASK | ACE_Event_Handler::DONT_CALL);
|
||||
reactor()->schedule_timer(this, NULL, ACE_Time_Value(10));
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* __WORLDSOCKETACCEPTOR_H_ */
|
||||
/// @}
|
||||
@@ -0,0 +1,354 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/** \file WorldSocketMgr.cpp
|
||||
* \ingroup u2w
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#include "WorldSocketMgr.h"
|
||||
|
||||
#include <ace/ACE.h>
|
||||
#include <ace/Log_Msg.h>
|
||||
#include <ace/Reactor.h>
|
||||
#include <ace/Reactor_Impl.h>
|
||||
#include <ace/TP_Reactor.h>
|
||||
#include <ace/Dev_Poll_Reactor.h>
|
||||
#include <ace/Guard_T.h>
|
||||
#include <atomic>
|
||||
#include <ace/os_include/arpa/os_inet.h>
|
||||
#include <ace/os_include/netinet/os_tcp.h>
|
||||
#include <ace/os_include/sys/os_types.h>
|
||||
#include <ace/os_include/sys/os_socket.h>
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "Log.h"
|
||||
#include "Common.h"
|
||||
#include "Config.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "WorldSocket.h"
|
||||
#include "WorldSocketAcceptor.h"
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
/**
|
||||
* This is a helper class to WorldSocketMgr, that manages
|
||||
* network threads, and assigning connections from acceptor thread
|
||||
* to other network threads
|
||||
*/
|
||||
class ReactorRunnable : protected ACE_Task_Base
|
||||
{
|
||||
public:
|
||||
|
||||
ReactorRunnable() :
|
||||
m_Reactor(0),
|
||||
m_Connections(0),
|
||||
m_ThreadId(-1)
|
||||
{
|
||||
ACE_Reactor_Impl* imp;
|
||||
|
||||
#if defined (ACE_HAS_EVENT_POLL) || defined (ACE_HAS_DEV_POLL)
|
||||
|
||||
imp = new ACE_Dev_Poll_Reactor();
|
||||
|
||||
imp->max_notify_iterations (128);
|
||||
imp->restart (1);
|
||||
|
||||
#else
|
||||
|
||||
imp = new ACE_TP_Reactor();
|
||||
imp->max_notify_iterations (128);
|
||||
|
||||
#endif
|
||||
|
||||
m_Reactor = new ACE_Reactor (imp, 1);
|
||||
}
|
||||
|
||||
virtual ~ReactorRunnable()
|
||||
{
|
||||
Stop();
|
||||
Wait();
|
||||
|
||||
delete m_Reactor;
|
||||
}
|
||||
|
||||
void Stop()
|
||||
{
|
||||
m_Reactor->end_reactor_event_loop();
|
||||
}
|
||||
|
||||
int Start()
|
||||
{
|
||||
if (m_ThreadId != -1)
|
||||
return -1;
|
||||
|
||||
return (m_ThreadId = activate());
|
||||
}
|
||||
|
||||
void Wait() { ACE_Task_Base::wait(); }
|
||||
|
||||
long Connections()
|
||||
{
|
||||
return static_cast<long> (m_Connections);
|
||||
}
|
||||
|
||||
int AddSocket (WorldSocket* sock)
|
||||
{
|
||||
TRINITY_GUARD(ACE_Thread_Mutex, m_NewSockets_Lock);
|
||||
|
||||
++m_Connections;
|
||||
sock->AddReference();
|
||||
sock->reactor (m_Reactor);
|
||||
m_NewSockets.insert (sock);
|
||||
|
||||
sScriptMgr->OnSocketOpen(sock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ACE_Reactor* GetReactor()
|
||||
{
|
||||
return m_Reactor;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
void AddNewSockets()
|
||||
{
|
||||
TRINITY_GUARD(ACE_Thread_Mutex, m_NewSockets_Lock);
|
||||
|
||||
if (m_NewSockets.empty())
|
||||
return;
|
||||
|
||||
for (SocketSet::const_iterator i = m_NewSockets.begin(); i != m_NewSockets.end(); ++i)
|
||||
{
|
||||
WorldSocket* sock = (*i);
|
||||
|
||||
if (sock->IsClosed())
|
||||
{
|
||||
sScriptMgr->OnSocketClose(sock, true);
|
||||
|
||||
sock->RemoveReference();
|
||||
--m_Connections;
|
||||
}
|
||||
else
|
||||
m_Sockets.insert (sock);
|
||||
}
|
||||
|
||||
m_NewSockets.clear();
|
||||
}
|
||||
|
||||
virtual int svc()
|
||||
{
|
||||
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
|
||||
sLog->outStaticDebug ("Network Thread Starting");
|
||||
#endif
|
||||
|
||||
ACE_ASSERT (m_Reactor);
|
||||
|
||||
SocketSet::iterator i, t;
|
||||
|
||||
while (!m_Reactor->reactor_event_loop_done())
|
||||
{
|
||||
// dont be too smart to move this outside the loop
|
||||
// the run_reactor_event_loop will modify interval
|
||||
ACE_Time_Value interval (0, 10000);
|
||||
|
||||
if (m_Reactor->run_reactor_event_loop (interval) == -1)
|
||||
break;
|
||||
|
||||
AddNewSockets();
|
||||
|
||||
for (i = m_Sockets.begin(); i != m_Sockets.end();)
|
||||
{
|
||||
if ((*i)->Update() == -1)
|
||||
{
|
||||
t = i;
|
||||
++i;
|
||||
|
||||
(*t)->CloseSocket();
|
||||
|
||||
sScriptMgr->OnSocketClose((*t), false);
|
||||
|
||||
(*t)->RemoveReference();
|
||||
--m_Connections;
|
||||
m_Sockets.erase (t);
|
||||
}
|
||||
else
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
|
||||
sLog->outStaticDebug ("Network Thread exits");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
typedef std::atomic<int> AtomicInt;
|
||||
typedef std::set<WorldSocket*> SocketSet;
|
||||
|
||||
ACE_Reactor* m_Reactor;
|
||||
AtomicInt m_Connections;
|
||||
int m_ThreadId;
|
||||
|
||||
SocketSet m_Sockets;
|
||||
|
||||
SocketSet m_NewSockets;
|
||||
ACE_Thread_Mutex m_NewSockets_Lock;
|
||||
};
|
||||
|
||||
WorldSocketMgr::WorldSocketMgr() :
|
||||
m_NetThreads(0),
|
||||
m_NetThreadsCount(0),
|
||||
m_SockOutKBuff(-1),
|
||||
m_SockOutUBuff(65536),
|
||||
m_UseNoDelay(true),
|
||||
m_Acceptor (0)
|
||||
{
|
||||
}
|
||||
|
||||
WorldSocketMgr::~WorldSocketMgr()
|
||||
{
|
||||
delete [] m_NetThreads;
|
||||
delete m_Acceptor;
|
||||
}
|
||||
|
||||
int
|
||||
WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address)
|
||||
{
|
||||
m_UseNoDelay = sConfigMgr->GetBoolDefault ("Network.TcpNodelay", true);
|
||||
|
||||
int num_threads = sConfigMgr->GetIntDefault ("Network.Threads", 1);
|
||||
|
||||
if (num_threads <= 0)
|
||||
{
|
||||
sLog->outError("Network.Threads is wrong in your config file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
m_NetThreadsCount = static_cast<size_t> (num_threads + 1);
|
||||
|
||||
m_NetThreads = new ReactorRunnable[m_NetThreadsCount];
|
||||
|
||||
sLog->outBasic ("Max allowed socket connections %d", ACE::max_handles());
|
||||
|
||||
// -1 means use default
|
||||
m_SockOutKBuff = sConfigMgr->GetIntDefault ("Network.OutKBuff", -1);
|
||||
|
||||
m_SockOutUBuff = sConfigMgr->GetIntDefault ("Network.OutUBuff", 65536);
|
||||
|
||||
if (m_SockOutUBuff <= 0)
|
||||
{
|
||||
sLog->outError("Network.OutUBuff is wrong in your config file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
m_Acceptor = new WorldSocketAcceptor;
|
||||
|
||||
ACE_INET_Addr listen_addr (port, address);
|
||||
|
||||
if (m_Acceptor->open(listen_addr, m_NetThreads[0].GetReactor(), ACE_NONBLOCK) == -1)
|
||||
{
|
||||
sLog->outError("Failed to open acceptor, check if the port is free");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Start();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
WorldSocketMgr::StartNetwork (ACE_UINT16 port, const char* address)
|
||||
{
|
||||
if (!sLog->IsOutDebug())
|
||||
ACE_Log_Msg::instance()->priority_mask (LM_ERROR, ACE_Log_Msg::PROCESS);
|
||||
|
||||
if (StartReactiveIO(port, address) == -1)
|
||||
return -1;
|
||||
|
||||
sScriptMgr->OnNetworkStart();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
WorldSocketMgr::StopNetwork()
|
||||
{
|
||||
if (m_Acceptor)
|
||||
{
|
||||
m_Acceptor->close();
|
||||
}
|
||||
|
||||
if (m_NetThreadsCount != 0)
|
||||
{
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Stop();
|
||||
}
|
||||
|
||||
Wait();
|
||||
|
||||
sScriptMgr->OnNetworkStop();
|
||||
}
|
||||
|
||||
void
|
||||
WorldSocketMgr::Wait()
|
||||
{
|
||||
if (m_NetThreadsCount != 0)
|
||||
{
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Wait();
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
WorldSocketMgr::OnSocketOpen (WorldSocket* sock)
|
||||
{
|
||||
// set some options here
|
||||
if (m_SockOutKBuff >= 0)
|
||||
{
|
||||
if (sock->peer().set_option (SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
(void*) & m_SockOutKBuff,
|
||||
sizeof (int)) == -1 && errno != ENOTSUP)
|
||||
{
|
||||
sLog->outError("WorldSocketMgr::OnSocketOpen set_option SO_SNDBUF");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static const int ndoption = 1;
|
||||
|
||||
// Set TCP_NODELAY.
|
||||
if (m_UseNoDelay)
|
||||
{
|
||||
if (sock->peer().set_option (ACE_IPPROTO_TCP,
|
||||
TCP_NODELAY,
|
||||
(void*)&ndoption,
|
||||
sizeof (int)) == -1)
|
||||
{
|
||||
sLog->outError("WorldSocketMgr::OnSocketOpen: peer().set_option TCP_NODELAY errno = %s", ACE_OS::strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
sock->m_OutBufferSize = static_cast<size_t> (m_SockOutUBuff);
|
||||
|
||||
// we skip the Acceptor Thread
|
||||
size_t min = 1;
|
||||
|
||||
ACE_ASSERT (m_NetThreadsCount >= 1);
|
||||
|
||||
for (size_t i = 1; i < m_NetThreadsCount; ++i)
|
||||
if (m_NetThreads[i].Connections() < m_NetThreads[min].Connections())
|
||||
min = i;
|
||||
|
||||
return m_NetThreads[min].AddSocket (sock);
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/** \addtogroup u2w User to World Communication
|
||||
* @{
|
||||
* \file WorldSocketMgr.h
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __WORLDSOCKETMGR_H
|
||||
#define __WORLDSOCKETMGR_H
|
||||
|
||||
#include <ace/Basic_Types.h>
|
||||
#include <ace/Singleton.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
|
||||
class WorldSocket;
|
||||
class ReactorRunnable;
|
||||
class ACE_Event_Handler;
|
||||
|
||||
/// Manages all sockets connected to peers and network threads
|
||||
class WorldSocketMgr
|
||||
{
|
||||
public:
|
||||
friend class WorldSocket;
|
||||
friend class ACE_Singleton<WorldSocketMgr, ACE_Thread_Mutex>;
|
||||
|
||||
/// Start network, listen at address:port .
|
||||
int StartNetwork(ACE_UINT16 port, const char* address);
|
||||
|
||||
/// Stops all network threads, It will wait for all running threads .
|
||||
void StopNetwork();
|
||||
|
||||
/// Wait untill all network threads have "joined" .
|
||||
void Wait();
|
||||
|
||||
private:
|
||||
int OnSocketOpen(WorldSocket* sock);
|
||||
|
||||
int StartReactiveIO(ACE_UINT16 port, const char* address);
|
||||
|
||||
private:
|
||||
WorldSocketMgr();
|
||||
virtual ~WorldSocketMgr();
|
||||
|
||||
ReactorRunnable* m_NetThreads;
|
||||
size_t m_NetThreadsCount;
|
||||
|
||||
int m_SockOutKBuff;
|
||||
int m_SockOutUBuff;
|
||||
bool m_UseNoDelay;
|
||||
|
||||
class WorldSocketAcceptor* m_Acceptor;
|
||||
};
|
||||
|
||||
#define sWorldSocketMgr ACE_Singleton<WorldSocketMgr, ACE_Thread_Mutex>::instance()
|
||||
|
||||
#endif
|
||||
/// @}
|
||||
Reference in New Issue
Block a user