/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//
//
// WorldSession.h
//
#ifndef __WORLDSESSION_H
#define __WORLDSESSION_H
class Player;
class WorldPacket;
class WorldSocket;
class WorldSession;
class MapMgr;
class Creature;
class MovementInfo;
struct TrainerSpell;
// MovementFlags Contribution by Tenshi
enum MovementFlags
{
// Byte 1 (Resets on Movement Key Press)
MOVEFLAG_MOVE_STOP = 0x00, //verified
MOVEFLAG_MOVE_FORWARD = 0x01, //verified
MOVEFLAG_MOVE_BACKWARD = 0x02, //verified
MOVEFLAG_STRAFE_LEFT = 0x04, //verified
MOVEFLAG_STRAFE_RIGHT = 0x08, //verified
MOVEFLAG_TURN_LEFT = 0x10, //verified
MOVEFLAG_TURN_RIGHT = 0x20, //verified
MOVEFLAG_PITCH_DOWN = 0x40, // Unconfirmed
MOVEFLAG_PITCH_UP = 0x80, // Unconfirmed
// Byte 2 (Resets on Situation Change)
MOVEFLAG_WALK = 0x100, //verified
MOVEFLAG_TAXI = 0x200,
MOVEFLAG_NO_COLLISION = 0x400,
MOVEFLAG_FLYING = 0x800, //verified
MOVEFLAG_REDIRECTED = 0x1000, // Unconfirmed
MOVEFLAG_FALLING = 0x2000, //verified
MOVEFLAG_FALLING_FAR = 0x4000, // verified Going to take damage(might not take damage).
MOVEFLAG_FREE_FALLING = 0x8000, // half verified ;P
// Byte 3 (Set by server. TB = Third Byte. Completely unconfirmed.)
MOVEFLAG_TB_PENDING_STOP = 0x10000, // (MOVEFLAG_PENDING_STOP)
MOVEFLAG_TB_PENDING_UNSTRAFE = 0x20000, // (MOVEFLAG_PENDING_UNSTRAFE)
MOVEFLAG_TB_PENDING_FALL = 0x40000, // (MOVEFLAG_PENDING_FALL)
MOVEFLAG_TB_PENDING_FORWARD = 0x80000, // (MOVEFLAG_PENDING_FORWARD)
MOVEFLAG_TB_PENDING_BACKWARD = 0x100000, // (MOVEFLAG_PENDING_BACKWARD)
MOVEFLAG_SWIMMING = 0x200000, // verified
MOVEFLAG_FLYING_PITCH_UP = 0x400000, // (half confirmed)(MOVEFLAG_PENDING_STR_RGHT)
MOVEFLAG_TB_MOVED = 0x800000, // (half confirmed) gets called when landing (MOVEFLAG_MOVED)
// Byte 4 (Script Based Flags. Never reset, only turned on or off.)
MOVEFLAG_AIR_SUSPENSION = 0x1000000, // confirmed allow body air suspension(good name? lol).
MOVEFLAG_AIR_SWIMMING = 0x2000000, // confirmed while flying.
MOVEFLAG_SPLINE_MOVER = 0x4000000, // Unconfirmed
MOVEFLAG_IMMOBILIZED = 0x8000000,
MOVEFLAG_WATER_WALK = 0x10000000,
MOVEFLAG_FEATHER_FALL = 0x20000000, // Does not negate fall damage.
MOVEFLAG_LEVITATE = 0x40000000,
MOVEFLAG_LOCAL = 0x80000000, // This flag defaults to on. (Assumption)
// Masks
MOVEFLAG_MOVING_MASK = 0x03,
MOVEFLAG_STRAFING_MASK = 0x0C,
MOVEFLAG_TURNING_MASK = 0x30,
MOVEFLAG_FALLING_MASK = 0x6000,
MOVEFLAG_MOTION_MASK = 0xE00F, // Forwards, Backwards, Strafing, Falling
MOVEFLAG_PENDING_MASK = 0x7F0000,
MOVEFLAG_PENDING_STRAFE_MASK = 0x600000,
MOVEFLAG_PENDING_MOVE_MASK = 0x180000,
};
struct OpcodeHandler
{
uint16 status;
void (WorldSession::*handler)(WorldPacket& recvPacket);
};
enum SessionStatus
{
STATUS_AUTHED = 0,
STATUS_LOGGEDIN
};
struct AccountDataEntry
{
char * data;
uint32 sz;
bool bIsDirty;
};
typedef struct Cords {
float x,y,z;
}Cords;
class MovementInfo
{
public:
uint32 time;
float unk6;//pitch
//on slip 8 is zero, on jump some other number
//9,10 changes if you are not on foot
uint32 unk8, unk9, unk10, unk11, unk12, unk13;
uint32 unklast;//something related to collision
float x, y, z, orientation;
uint32 flags;
uint32 FallTime;
uint64 transGuid;
float transX, transY, transZ, transO, transUnk;
void init(WorldPacket & data)
{
transGuid = 0;
unk13 = 0;
data >> flags >> time;
data >> x >> y >> z >> orientation;
if (flags & MOVEFLAG_TAXI)
{
data >> transGuid >> transX >> transY >> transZ >> transO >> transUnk;
}
if (flags & MOVEFLAG_SWIMMING)
{
data >> unk6;
}
if (flags & MOVEFLAG_FALLING)
{
data >> FallTime >> unk8 >> unk9 >> unk10;
}
if (flags & MOVEFLAG_SPLINE_MOVER)
{
data >> unk12;
}
data >> unklast;
if(data.rpos() != data.wpos())
{
if(data.rpos() + 4 == data.wpos())
data >> unk13;
else
sLog.outDebug("Extra bits of movement packet left");
}
}
void write(WorldPacket & data)
{
data << flags << getMSTime();
data << x << y << z << orientation;
if (flags & MOVEFLAG_TAXI)
{
data << transGuid << transX << transY << transZ << transO << transUnk;
}
if (flags & MOVEFLAG_SWIMMING)
{
data << unk6;
}
if (flags & MOVEFLAG_FALLING)
{
data << FallTime << unk8 << unk9 << unk10;
}
if (flags & MOVEFLAG_SPLINE_MOVER)
{
data << unk12;
}
data << unklast;
if(unk13)
data << unk13;
}
};
#define NOTIFICATION_MESSAGE_NO_PERMISSION "You do not have permission to perform that function."
//#define CHECK_PACKET_SIZE(x, y) if(y > 0 && x.size() < y) { _socket->Disconnect(); return; }
void EncodeHex(const char* source, char* dest, uint32 size);
void DecodeHex(const char* source, char* dest, uint32 size);
extern OpcodeHandler WorldPacketHandlers[NUM_MSG_TYPES];
void CapitalizeString(string& arg);
class SERVER_DECL WorldSession
{
friend class WorldSocket;
public:
WorldSession(uint32 id, string Name, WorldSocket *sock);
~WorldSession();
inline void SendPacket(WorldPacket* packet)
{
if(_socket && _socket->IsConnected())
_socket->SendPacket(packet);
}
inline void SendPacket(StackBufferBase * packet)
{
if(_socket && _socket->IsConnected())
_socket->SendPacket(packet);
}
inline void OutPacket(uint16 opcode)
{
if(_socket && _socket->IsConnected())
_socket->OutPacket(opcode, 0, NULL);
}
uint32 m_currMsTime;
uint32 m_lastPing;
inline uint32 GetAccountId() const { return _accountId; }
inline Player* GetPlayer() { return _player; }
/* Acct flags */
void SetAccountFlags(uint32 flags) { _accountFlags = flags; }
bool HasFlag(uint32 flag) { return (_accountFlags & flag) != 0; }
uint32 GetSide() { return _side; }
void SetSide(uint32 side) { _side = side; };
/* GM Permission System */
void LoadSecurity(std::string securitystring);
void SetSecurity(std::string securitystring);
inline char* GetPermissions() { return permissions; }
inline int GetPermissionCount() { return permissioncount; }
inline bool HasPermissions() { return (permissioncount > 0) ? true : false; }
inline bool HasGMPermissions()
{
if(!permissioncount)
return false;
return (strchr(permissions,'a')!=NULL) ? true : false;
}
bool CanUseCommand(char cmdstr);
inline void SetSocket(WorldSocket *sock)
{
_socket = sock;
}
inline void SetPlayer(Player *plr) { _player = plr; }
inline void SetAccountData(uint32 index, char* data, bool initial,uint32 sz)
{
ASSERT(index < 8);
if(sAccountData[index].data)
delete [] sAccountData[index].data;
sAccountData[index].data = data;
sAccountData[index].sz = sz;
if(!initial && !sAccountData[index].bIsDirty) // Mark as "changed" or "dirty"
sAccountData[index].bIsDirty = true;
else if(initial)
sAccountData[index].bIsDirty = false;
}
inline AccountDataEntry* GetAccountData(uint32 index)
{
ASSERT(index < 8);
return &sAccountData[index];
}
void SetLogoutTimer(uint32 ms)
{
if(ms) _logoutTime = m_currMsTime+ms;
else _logoutTime = 0;
}
void LogoutPlayer(bool Save);
inline void QueuePacket(WorldPacket* packet)
{
_recvQueue.Push(packet);
}
void OutPacket(uint16 opcode, uint16 len, const void* data)
{
if(_socket && _socket->IsConnected())
_socket->OutPacket(opcode, len, data);
}
inline WorldSocket* GetSocket() { return _socket; }
void Disconnect()
{
if(_socket && _socket->IsConnected())
_socket->Disconnect();
}
int __fastcall Update(uint32 InstanceID);
void BuildItemPushResult(WorldPacket *data, uint64 guid, uint32 type, uint32 count, uint32 itemid, uint32 randomprop, uint8 unk = 0xFF, uint32 unk2 = 0, uint32 unk3 = 1, uint32 count_have = 0);
void SendBuyFailed(uint64 guid, uint32 itemid, uint8 error);
void SendSellItem(uint64 vendorguid, uint64 itemid, uint8 error);
void SendNotification(const char *message, ...);
inline void SetInstance(uint32 Instance) { instanceId = Instance; }
inline uint32 GetLatency() { return _latency; }
inline string GetAccountName() { return _accountName; }
inline uint32 GetClientBuild() { return client_build; }
inline void SetClientBuild(uint32 build) { client_build = build; }
bool bDeleted;
inline uint32 GetInstance() { return instanceId; }
Mutex deleteMutex;
void _HandleAreaTriggerOpcode(uint32 id);//real handle
uint32 m_moveDelayTime;
protected:
/// Login screen opcodes (PlayerHandler.cpp):
void HandleCharEnumOpcode(WorldPacket& recvPacket);
void HandleCharDeleteOpcode(WorldPacket& recvPacket);
void HandleCharCreateOpcode(WorldPacket& recvPacket);
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
/// Authentification and misc opcodes (MiscHandler.cpp):
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& recv_data);
void HandleLootRollOpcode(WorldPacket& recv_data);
void HandleWhoOpcode(WorldPacket& recvPacket);
void HandleLogoutRequestOpcode(WorldPacket& recvPacket);
void HandlePlayerLogoutOpcode(WorldPacket& recvPacket);
void HandleLogoutCancelOpcode(WorldPacket& recvPacket);
void HandleZoneUpdateOpcode(WorldPacket& recvPacket);
void HandleSetTargetOpcode(WorldPacket& recvPacket);
void HandleSetSelectionOpcode(WorldPacket& recvPacket);
void HandleStandStateChangeOpcode(WorldPacket& recvPacket);
void HandleDismountOpcode(WorldPacket & recvPacket);
void HandleFriendListOpcode(WorldPacket& recvPacket);
void HandleAddFriendOpcode(WorldPacket& recvPacket);
void HandleDelFriendOpcode(WorldPacket& recvPacket);
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
void HandleBugOpcode(WorldPacket& recvPacket);
void HandleAreaTriggerOpcode(WorldPacket& recvPacket);
void HandleUpdateAccountData(WorldPacket& recvPacket);
void HandleRequestAccountData(WorldPacket& recvPacket);
void HandleSetActionButtonOpcode(WorldPacket& recvPacket);
void HandleSetAtWarOpcode(WorldPacket& recvPacket);
void HandleSetWatchedFactionIndexOpcode(WorldPacket& recvPacket);
void HandleTogglePVPOpcode(WorldPacket& recvPacket);
void HandleAmmoSetOpcode(WorldPacket& recvPacket);
void HandleGameObjectUse(WorldPacket& recvPacket);
//void HandleJoinChannelOpcode(WorldPacket& recvPacket);
//void HandleLeaveChannelOpcode(WorldPacket& recvPacket);
void HandlePlayedTimeOpcode(WorldPacket & recv_data);
void HandleSetSheathedOpcode(WorldPacket & recv_data);
void HandleCompleteCinematic(WorldPacket & recv_data);
/// Gm Ticket System in GMTicket.cpp:
void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);
void HandleGMTicketUpdateOpcode(WorldPacket& recvPacket);
void HandleGMTicketDeleteOpcode(WorldPacket& recvPacket);
void HandleGMTicketGetTicketOpcode(WorldPacket& recvPacket);
void HandleGMTicketSystemStatusOpcode(WorldPacket& recvPacket);
void HandleGMTicketToggleSystemStatusOpcode(WorldPacket& recvPacket);
/// Opcodes implemented in QueryHandler.cpp:
void HandleNameQueryOpcode(WorldPacket& recvPacket);
void HandleQueryTimeOpcode(WorldPacket& recvPacket);
void HandleCreatureQueryOpcode(WorldPacket& recvPacket);
void HandleGameObjectQueryOpcode(WorldPacket& recvPacket);
void HandleItemNameQueryOpcode( WorldPacket & recv_data );
void HandlePageTextQueryOpcode( WorldPacket & recv_data );
/// Opcodes implemented in MovementHandler.cpp
void HandleMoveHeartbeatOpcode( WorldPacket& recvPacket );
void HandleMoveWorldportAckOpcode( WorldPacket& recvPacket );
void HandleMoveStopOpcode( WorldPacket& recvPacket );
void HandleMovementOpcodes( WorldPacket& recvPacket );
void HandleFallOpcode( WorldPacket & recv_data );
void HandleMoveTimeSkippedOpcode( WorldPacket & recv_data );
void HandleMoveNotActiveMoverOpcode( WorldPacket & recv_data );
void HandleSetActiveMoverOpcode( WorldPacket & recv_data );
void HandleMoveTeleportAckOpcode( WorldPacket & recv_data );
void HandleBasicMovementOpcodes( WorldPacket& recvPacket );
/// Opcodes implemented in GroupHandler.cpp:
void HandleGroupInviteOpcode(WorldPacket& recvPacket);
void HandleGroupCancelOpcode(WorldPacket& recvPacket);
void HandleGroupAcceptOpcode(WorldPacket& recvPacket);
void HandleGroupDeclineOpcode(WorldPacket& recvPacket);
void HandleGroupUninviteOpcode(WorldPacket& recvPacket);
void HandleGroupUninviteGuildOpcode(WorldPacket& recvPacket);
void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket);
void HandleGroupDisbandOpcode(WorldPacket& recvPacket);
void HandleLootMethodOpcode(WorldPacket& recvPacket);
void HandleMinimapPingOpcode(WorldPacket& recvPacket);
void HandleSetPlayerIconOpcode(WorldPacket& recv_data);
void SendPartyCommandResult(Player *pPlayer, uint32 p1, std::string name, uint32 err);
// Raid
void HandleConvertGroupToRaidOpcode(WorldPacket& recvPacket);
void HandleGroupChangeSubGroup(WorldPacket& recvPacket);
void HandleGroupAssistantLeader(WorldPacket& recvPacket);
void HandleRequestRaidInfoOpcode(WorldPacket& recvPacket);
void HandleReadyCheckOpcode(WorldPacket& recv_data);
// LFG opcodes
void HandleEnableAutoJoin(WorldPacket& recvPacket);
void HandleDisableAutoJoin(WorldPacket& recvPacket);
void HandleEnableAutoAddMembers(WorldPacket& recvPacket);
void HandleDisableAutoAddMembers(WorldPacket& recvPacket);
void HandleSetLookingForGroupComment(WorldPacket& recvPacket);
void HandleMsgLookingForGroup(WorldPacket& recvPacket);
void HandleSetLookingForGroup(WorldPacket& recvPacket);
/// Taxi opcodes (TaxiHandler.cpp)
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
void HandleTaxiQueryAvaibleNodesOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
void HandleMultipleActivateTaxiOpcode(WorldPacket & recvPacket);
/// NPC opcodes (NPCHandler.cpp)
void HandleTabardVendorActivateOpcode(WorldPacket& recvPacket);
void HandleBankerActivateOpcode(WorldPacket& recvPacket);
void HandleBuyBankSlotOpcode(WorldPacket& recvPacket);
void HandleTrainerListOpcode(WorldPacket& recvPacket);
void HandleTrainerBuySpellOpcode(WorldPacket& recvPacket);
void HandleCharterShowListOpcode(WorldPacket& recvPacket);
void HandleGossipHelloOpcode(WorldPacket& recvPacket);
void HandleGossipSelectOptionOpcode(WorldPacket& recvPacket);
void HandleSpiritHealerActivateOpcode(WorldPacket& recvPacket);
void HandleNpcTextQueryOpcode(WorldPacket& recvPacket);
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
// Auction House opcodes
void HandleAuctionHelloOpcode(WorldPacket& recvPacket);
void HandleAuctionListItems( WorldPacket & recv_data );
void HandleAuctionListBidderItems( WorldPacket & recv_data );
void HandleAuctionSellItem( WorldPacket & recv_data );
void HandleAuctionListOwnerItems( WorldPacket & recv_data );
void HandleAuctionPlaceBid( WorldPacket & recv_data );
void HandleCancelAuction( WorldPacket & recv_data);
// Mail opcodes
void HandleGetMail( WorldPacket & recv_data );
void HandleSendMail( WorldPacket & recv_data );
void HandleTakeMoney( WorldPacket & recv_data );
void HandleTakeItem( WorldPacket & recv_data );
void HandleMarkAsRead( WorldPacket & recv_data );
void HandleReturnToSender( WorldPacket & recv_data );
void HandleMailDelete( WorldPacket & recv_data );
void HandleItemTextQuery( WorldPacket & recv_data);
void HandleMailTime(WorldPacket & recv_data);
void HandleMailCreateTextItem(WorldPacket & recv_data );
/// Item opcodes (ItemHandler.cpp)
void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
void HandleSwapItemOpcode(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 HandleBuyBackOpcode(WorldPacket& recvPacket);
void HandleSplitOpcode(WorldPacket& recvPacket);
void HandleReadItemOpcode(WorldPacket& recvPacket);
void HandleRepairItemOpcode(WorldPacket &recvPacket);
void HandleAutoBankItemOpcode(WorldPacket &recvPacket);
void HandleAutoStoreBankItemOpcode(WorldPacket &recvPacket);
void HandleCancelTemporaryEnchantmentOpcode(WorldPacket &recvPacket);
void HandleInsertGemOpcode(WorldPacket &recvPacket);
/// Combat opcodes (CombatHandler.cpp)
void HandleAttackSwingOpcode(WorldPacket& recvPacket);
void HandleAttackStopOpcode(WorldPacket& recvPacket);
/// Spell opcodes (SpellHandler.cpp)
void HandleUseItemOpcode(WorldPacket& recvPacket);
void HandleCastSpellOpcode(WorldPacket& recvPacket);
void HandleCancelCastOpcode(WorldPacket& recvPacket);
void HandleCancelAuraOpcode(WorldPacket& recvPacket);
void HandleCancelChannellingOpcode(WorldPacket& recvPacket);
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recv_data);
void HandleAddDynamicTargetOpcode(WorldPacket & recvPacket);
/// Skill opcodes (SkillHandler.spp)
//void HandleSkillLevelUpOpcode(WorldPacket& recvPacket);
void HandleLearnTalentOpcode(WorldPacket& recvPacket);
void HandleUnlearnTalents( WorldPacket & recv_data );
/// Quest opcodes (QuestHandler.cpp)
void HandleQuestgiverStatusQueryOpcode(WorldPacket& recvPacket);
void HandleQuestgiverHelloOpcode(WorldPacket& recvPacket);
void HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvPacket);
void HandleQuestgiverCancelOpcode(WorldPacket& recvPacket);
void HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket);
void HandleQuestgiverRequestRewardOpcode(WorldPacket& recvPacket);
void HandleQuestGiverQueryQuestOpcode( WorldPacket& recvPacket );
void HandleQuestQueryOpcode(WorldPacket& recvPacket);
void HandleQuestgiverCompleteQuestOpcode( WorldPacket & recvPacket );
void HandleQuestlogRemoveQuestOpcode(WorldPacket& recvPacket);
void HandlePushQuestToPartyOpcode(WorldPacket &recvPacket);
void HandleQuestPushResult(WorldPacket &recvPacket);
/// Chat opcodes (Chat.cpp)
void HandleMessagechatOpcode(WorldPacket& recvPacket);
void HandleTextEmoteOpcode(WorldPacket& recvPacket);
void HandleReportSpamOpcode(WorldPacket& recvPacket);
/// Corpse opcodes (Corpse.cpp)
void HandleCorpseReclaimOpcode( WorldPacket& recvPacket );
void HandleCorpseQueryOpcode( WorldPacket& recvPacket );
void HandleResurrectResponseOpcode(WorldPacket& recvPacket);
/// Channel Opcodes (ChannelHandler.cpp)
void HandleChannelJoin(WorldPacket& recvPacket);
void HandleChannelLeave(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 HandleChannelAnnounce(WorldPacket& recvPacket);
void HandleChannelModerate(WorldPacket& recvPacket);
// Duel
void HandleDuelAccepted(WorldPacket & recv_data);
void HandleDuelCancelled(WorldPacket & recv_data);
// Trade
void HandleInitiateTrade(WorldPacket & recv_data);
void HandleBeginTrade(WorldPacket & recv_data);
void HandleBusyTrade(WorldPacket & recv_data);
void HandleIgnoreTrade(WorldPacket & recv_data);
void HandleAcceptTrade(WorldPacket & recv_data);
void HandleUnacceptTrade(WorldPacket & recv_data);
void HandleCancelTrade(WorldPacket & recv_data);
void HandleSetTradeItem(WorldPacket & recv_data);
void HandleClearTradeItem(WorldPacket & recv_data);
void HandleSetTradeGold(WorldPacket & recv_data);
// Guild
void HandleGuildQuery(WorldPacket & recv_data);
void HandleCreateGuild(WorldPacket & recv_data);
void HandleInviteToGuild(WorldPacket & recv_data);
void HandleGuildAccept(WorldPacket & recv_data);
void HandleGuildDecline(WorldPacket & recv_data);
void HandleGuildInfo(WorldPacket & recv_data);
void HandleGuildRoster(WorldPacket & recv_data);
void HandleGuildPromote(WorldPacket & recv_data);
void HandleGuildDemote(WorldPacket & recv_data);
void HandleGuildLeave(WorldPacket & recv_data);
void HandleGuildRemove(WorldPacket & recv_data);
void HandleGuildDisband(WorldPacket & recv_data);
void HandleGuildLeader(WorldPacket & recv_data);
void HandleGuildMotd(WorldPacket & recv_data);
void HandleGuildRank(WorldPacket & recv_data);
void HandleGuildAddRank(WorldPacket & recv_data);
void HandleGuildDelRank(WorldPacket & recv_data);
void HandleGuildSetPublicNote(WorldPacket & recv_data);
void HandleGuildSetOfficerNote(WorldPacket & recv_data);
void HandleSaveGuildEmblem(WorldPacket & recv_data);
void HandleCharterBuy(WorldPacket & recv_data);
void HandleCharterShowSignatures(WorldPacket & recv_data);
void HandleCharterTurnInCharter(WorldPacket & recv_data);
void HandleCharterQuery(WorldPacket & recv_data);
void HandleCharterOffer(WorldPacket & recv_data);
void HandleCharterSign(WorldPacket &recv_data);
void HandleCharterRename(WorldPacket & recv_data);
void HandleSetGuildInformation(WorldPacket & recv_data);
void SendGuildCommandResult(uint32 typecmd,const char * str,uint32 cmdresult);
// Pet
void HandlePetAction(WorldPacket & recv_data);
void HandlePetInfo(WorldPacket & recv_data);
void HandlePetNameQuery(WorldPacket & recv_data);
void HandleBuyStableSlot(WorldPacket & recv_data);
void HandleStablePet(WorldPacket & recv_data);
void HandleUnstablePet(WorldPacket & recv_data);
void HandleStabledPetList(WorldPacket & recv_data);
void HandlePetRename(WorldPacket & recv_data);
void HandlePetAbandon(WorldPacket & recv_data);
// Battleground
void HandleBattlefieldPortOpcode(WorldPacket &recv_data);
void HandleBattlefieldStatusOpcode(WorldPacket &recv_data);
void HandleBattleMasterHelloOpcode(WorldPacket &recv_data);
void HandleLeaveBattlefieldOpcode(WorldPacket &recv_data);
void HandleAreaSpiritHealerQueryOpcode(WorldPacket &recv_data);
void HandleAreaSpiritHealerQueueOpcode(WorldPacket &recv_data);
void HandleBattlegroundPlayerPositionsOpcode(WorldPacket &recv_data);
void HandleArenaJoinOpcode(WorldPacket &recv_data);
void HandleBattleMasterJoinOpcode(WorldPacket &recv_data);
void HandleInspectHonorStatsOpcode(WorldPacket &recv_data);
void HandlePVPLogDataOpcode(WorldPacket &recv_data);
void HandleBattlefieldListOpcode(WorldPacket &recv_data);
void HandleSetActionBarTogglesOpcode(WorldPacket &recvPacket);
void HandleMoveSplineCompleteOpcode(WorldPacket &recvPacket);
/// Helper functions
void SetNpcFlagsForTalkToQuest(const uint64& guid, const uint64& targetGuid);
//Tutorials
void HandleTutorialFlag ( WorldPacket & recv_data );
void HandleTutorialClear( WorldPacket & recv_data );
void HandleTutorialReset( WorldPacket & recv_data );
//Acknowledgements
void HandleAcknowledgementOpcodes( WorldPacket & recv_data );
void HandleMountSpecialAnimOpcode(WorldPacket& recv_data);
void HandleSelfResurrectOpcode(WorldPacket& recv_data);
void HandleUnlearnSkillOpcode(WorldPacket &recv_data);
void HandleRandomRollOpcode(WorldPacket &recv_data);
void HandleOpenItemOpcode(WorldPacket &recv_data);
void HandleToggleHelmOpcode(WorldPacket &recv_data);
void HandleToggleCloakOpcode(WorldPacket &recv_data);
void HandleSetVisibleRankOpcode(WorldPacket& recv_data);
void HandlePetSetActionOpcode(WorldPacket& recv_data);
void _HandleBreathing(WorldPacket &recv_data, MovementInfo &mi);
void _SpeedCheck(MovementInfo &mi);
//instances
void HandleResetInstanceOpcode(WorldPacket& recv_data);
void HandleDungeonDifficultyOpcode(WorldPacket& recv_data);
uint8 TrainerGetSpellStatus(TrainerSpell* pSpell,bool oldtrainer=true);
void __fastcall CHECK_PACKET_SIZE(WorldPacket& data, uint32 size);
void SendMailError(uint32 error);
void HandleCharRenameOpcode(WorldPacket & recv_data);
void HandlePartyMemberStatsOpcode(WorldPacket & recv_data);
void HandleSummonResponseOpcode(WorldPacket & recv_data);
public:
void SendInventoryList(Creature* pCreature);
void SendTrainerList(Creature* pCreature);
void SendCharterRequest(Creature* pCreature);
void SendTaxiList(Creature* pCreature);
void SendInnkeeperBind(Creature* pCreature);
void SendBattlegroundList(Creature* pCreature, uint32 mapid);
void SendBankerList(Creature* pCreature);
void SendTabardHelp(Creature* pCreature);
void SendAuctionList(Creature* pCreature);
void SendSpiritHealerRequest(Creature* pCreature);
bool PlayerLogin(uint32 guid, uint32 forced_map_id, uint32 forced_instance_id);
private:
friend class Player;
Player *_player;
WorldSocket *_socket;
/* Preallocated buffers for movement handlers */
MovementInfo movement_info;
uint8 movement_packet[90];
float m_wLevel; // Level of water the player is currently in
bool m_bIsWLevelSet; // Does the m_wLevel variable contain up-to-date information about water level?
uint32 _accountId;
uint32 _accountFlags;
string _accountName;
uint32 _side;
WoWGuid m_MoverWoWGuid;
uint32 _logoutTime; // time we received a logout request -- wait 20 seconds, and quit
AccountDataEntry sAccountData[8];
FastQueue _recvQueue;
char *permissions;
int permissioncount;
bool _loggingOut;
uint32 _latency;
uint32 client_build;
uint32 instanceId;
uint8 _updatecount;
public:
static void InitPacketHandlerTable();
uint32 floodLines;
uint32 floodTime;
};
typedef std::set SessionSet;
#endif