[2771] Applied MaNGOS coding style (see trunk/bcpp.cfg).
[mangos-git.git] / src / game / WorldSession.cpp
blob83babda4e63853e35c107fc8689bad5cf68680fb
1 /*
2 * Copyright (C) 2005,2006 MaNGOS <http://www.mangosproject.org/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "Common.h"
20 #include "Database/DatabaseEnv.h"
21 #include "Log.h"
22 #include "Opcodes.h"
23 #include "WorldSocket.h"
24 #include "WorldPacket.h"
25 #include "WorldSession.h"
26 #include "Player.h"
27 #include "ObjectMgr.h"
28 #include "AuctionHouseObject.h"
29 #include "Group.h"
30 #include "Guild.h"
31 #include "World.h"
32 #include "NameTables.h"
33 #include "MapManager.h"
34 #include "ObjectAccessor.h"
36 WorldSession::WorldSession(uint32 id, WorldSocket *sock) : _player(0), _socket(sock),
37 _security(0), _accountId(id), _logoutTime(0)
42 WorldSession::~WorldSession()
44 WorldPacket *packet;
46 while(!_recvQueue.empty())
48 packet = _recvQueue.next();
49 delete packet;
53 void WorldSession::SetSocket(WorldSocket *sock)
55 _socket = sock;
58 void WorldSession::SendPacket(WorldPacket* packet)
60 if (_socket)
61 _socket->SendPacket(packet);
64 void WorldSession::QueuePacket(WorldPacket& packet)
66 WorldPacket *pck = new WorldPacket(packet);
67 ASSERT(pck);
69 _recvQueue.add(pck);
72 bool WorldSession::Update(uint32 diff)
74 WorldPacket *packet;
75 OpcodeHandler *table = _GetOpcodeHandlerTable();
76 uint32 i;
78 while (!_recvQueue.empty())
80 packet = _recvQueue.next();
82 if(packet==NULL)
83 continue;
85 for (i = 0; table[i].handler != NULL; i++)
87 if (table[i].opcode == packet->GetOpcode())
89 if (table[i].status == STATUS_AUTHED ||
90 (table[i].status == STATUS_LOGGEDIN && _player))
92 (this->*table[i].handler)(*packet);
94 else
96 sLog.outError( "SESSION: received unexpected opcode %s (0x%.4X)",
97 LookupName(packet->GetOpcode(), g_worldOpcodeNames),
98 packet->GetOpcode());
101 break;
105 if (table[i].handler == NULL)
106 sLog.outError( "SESSION: received unhandled opcode %s (0x%.4X)",
107 LookupName(packet->GetOpcode(), g_worldOpcodeNames),
108 packet->GetOpcode());
110 delete packet;
113 time_t currTime = time(NULL);
114 if (!_socket || ShouldLogOut(currTime))
115 LogoutPlayer(true);
117 if (!_socket)
118 return false;
120 return true;
123 void WorldSession::LogoutPlayer(bool Save)
125 if (_player)
127 // logging out just after died
128 if (_player->GetDeathTimer())
130 _player->KillPlayer();
131 _player->BuildPlayerRepop();
134 sDatabase.PExecute("UPDATE `character` SET `online` = 0 WHERE `guid` = '%u'", _player->GetGUIDLow());
135 loginDatabase.PExecute("UPDATE `account` SET `online` = 0 WHERE `id` = '%u'", GetAccountId());
137 if (_player->IsInGroup())
139 Group *group;
140 group = objmgr.GetGroupByLeader(_player->GetGroupLeader());
141 if(group!=NULL)
143 if (group->RemoveMember(_player->GetGUID()) > 1)
144 group->SendUpdate();
145 else
147 group->Disband();
148 objmgr.RemoveGroup(group);
150 delete group;
153 _player->UnSetInGroup();
155 Guild *guild;
156 guild = objmgr.GetGuildById(_player->GetGuildId());
157 if(guild)
159 guild->LoadPlayerStatsByGuid(_player->GetGUID());
161 WorldPacket data;
162 data.Initialize(SMSG_GUILD_EVENT);
163 data<<(uint8)GE_SIGNED_OFF;
164 data<<(uint8)1;
165 data<<_player->GetName();
166 data<<(uint8)0<<(uint8)0<<(uint8)0;
167 guild->BroadcastPacket(&data);
169 _player->UnsummonPet();
170 _player->Uncharm();
171 _player->UnsummonTotem();
172 _player->InvisiblePjsNear.clear();
174 ObjectAccessor::Instance().RemovePlayer(_player);
175 MapManager::Instance().GetMap(_player->GetMapId())->Remove(_player, false);
177 if(Save)
179 uint32 eslot;
180 for(int j = BUYBACK_SLOT_START; j < BUYBACK_SLOT_END; j++)
182 eslot = j - BUYBACK_SLOT_START;
183 _player->SetUInt64Value(PLAYER_FIELD_VENDORBUYBACK_SLOT_1+eslot*2,0);
184 _player->SetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1+eslot,0);
185 _player->SetUInt32Value(PLAYER_FIELD_BUYBACK_TIMESTAMP_1+eslot,0);
187 _player->SaveToDB();
191 WorldPacket data;
192 data.Initialize(SMSG_FRIEND_STATUS);
193 data<<uint8(FRIEND_OFFLINE);
194 data<<_player->GetGUID();
195 _player->BroadcastPacketToFriendListers(&data);
197 delete _player;
198 _player = 0;
200 data.Initialize( SMSG_LOGOUT_COMPLETE );
201 SendPacket( &data );
203 sLog.outDebug( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" );
206 LogoutRequest(0);
209 void WorldSession::KickPlayer()
211 if(!_socket)
212 return;
214 LogoutPlayer(true);
216 // session will removed in next update tick
217 _socket->SetCloseAndDelete(true);
220 OpcodeHandler* WorldSession::_GetOpcodeHandlerTable() const
222 static OpcodeHandler table[] =
225 { CMSG_CHAR_ENUM, STATUS_AUTHED, &WorldSession::HandleCharEnumOpcode },
226 { CMSG_CHAR_CREATE, STATUS_AUTHED, &WorldSession::HandleCharCreateOpcode },
227 { CMSG_CHAR_DELETE, STATUS_AUTHED, &WorldSession::HandleCharDeleteOpcode },
228 { CMSG_PLAYER_LOGIN, STATUS_AUTHED, &WorldSession::HandlePlayerLoginOpcode },
229 { CMSG_CHAR_RENAME, STATUS_AUTHED, &WorldSession::HandleChangePlayerNameOpcode },
231 { CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, &WorldSession::HandleSetActionButtonOpcode },
232 { CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, &WorldSession::HandleRepopRequestOpcode },
233 { CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAutostoreLootItemOpcode },
234 { CMSG_LOOT_MONEY, STATUS_LOGGEDIN, &WorldSession::HandleLootMoneyOpcode },
235 { CMSG_LOOT, STATUS_LOGGEDIN, &WorldSession::HandleLootOpcode },
236 { CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, &WorldSession::HandleLootReleaseOpcode },
237 { CMSG_WHO, STATUS_LOGGEDIN, &WorldSession::HandleWhoOpcode },
238 { CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, &WorldSession::HandleLogoutRequestOpcode },
239 { CMSG_PLAYER_LOGOUT, STATUS_LOGGEDIN, &WorldSession::HandlePlayerLogoutOpcode },
240 { CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, &WorldSession::HandleLogoutCancelOpcode },
241 { CMSG_GMTICKET_GETTICKET, STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode },
242 { CMSG_GMTICKET_CREATE, STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
243 { CMSG_GMTICKET_SYSTEMSTATUS, STATUS_LOGGEDIN, &WorldSession::HandleGMTicketSystemStatusOpcode },
244 { CMSG_GMTICKET_DELETETICKET, STATUS_LOGGEDIN, &WorldSession::HandleGMTicketDeleteOpcode },
245 { CMSG_GMTICKET_UPDATETEXT, STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateTextOpcode },
246 { CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, &WorldSession::HandleEnablePvP },
248 // played time
249 { CMSG_PLAYED_TIME, STATUS_LOGGEDIN, &WorldSession::HandlePlayedTime },
251 // new inspect
252 { CMSG_INSPECT, STATUS_LOGGEDIN, &WorldSession::HandleInspectOpcode },
254 // new inspect stats
255 { MSG_INSPECT_HONOR_STATS, STATUS_LOGGEDIN, &WorldSession::HandleInspectHonorStatsOpcode },
257 // new
258 { CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, &WorldSession::HandleMoveUnRootAck },
259 { CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, &WorldSession::HandleMoveRootAck },
260 { CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck },
262 // repair item
263 { CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleRepairItemOpcode },
265 { CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, &WorldSession::HandleSetActiveMoverOpcode },
266 { MSG_LOOKING_FOR_GROUP, STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup },
267 { MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, &WorldSession::HandleMoveTeleportAck },
268 { CMSG_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, &WorldSession::HandleForceRunSpeedChangeAck },
269 { CMSG_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, &WorldSession::HandleForceSwimSpeedChangeAck },
270 { CMSG_SET_FACTION_ATWAR, STATUS_LOGGEDIN, &WorldSession::HandleSetFactionAtWar },
271 { CMSG_SET_FACTION_CHEAT, STATUS_LOGGEDIN, &WorldSession::HandleSetFactionCheat },
272 { CMSG_ZONEUPDATE, STATUS_LOGGEDIN, &WorldSession::HandleZoneUpdateOpcode },
273 { CMSG_SET_TARGET_OBSOLETE, STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
274 { CMSG_SET_SELECTION, STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
275 { CMSG_STANDSTATECHANGE, STATUS_LOGGEDIN, &WorldSession::HandleStandStateChangeOpcode },
276 { CMSG_FRIEND_LIST, STATUS_LOGGEDIN, &WorldSession::HandleFriendListOpcode },
277 { CMSG_ADD_FRIEND, STATUS_LOGGEDIN, &WorldSession::HandleAddFriendOpcode },
278 { CMSG_DEL_FRIEND, STATUS_LOGGEDIN, &WorldSession::HandleDelFriendOpcode },
279 { CMSG_ADD_IGNORE, STATUS_LOGGEDIN, &WorldSession::HandleAddIgnoreOpcode },
280 { CMSG_DEL_IGNORE, STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode },
281 { CMSG_BUG, STATUS_LOGGEDIN, &WorldSession::HandleBugOpcode },
282 { CMSG_SET_AMMO, STATUS_LOGGEDIN, &WorldSession::HandleSetAmmoOpcode },
283 { CMSG_AREATRIGGER, STATUS_LOGGEDIN, &WorldSession::HandleAreaTriggerOpcode },
284 { CMSG_UPDATE_ACCOUNT_DATA, STATUS_LOGGEDIN, &WorldSession::HandleUpdateAccountData },
285 { CMSG_REQUEST_ACCOUNT_DATA, STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
286 { CMSG_MEETINGSTONE_INFO, STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo },
287 { CMSG_GAMEOBJ_USE, STATUS_LOGGEDIN, &WorldSession::HandleGameObjectUseOpcode },
288 { MSG_CORPSE_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleCorpseQueryOpcode },
289 { CMSG_NAME_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleNameQueryOpcode },
290 { CMSG_QUERY_TIME, STATUS_LOGGEDIN, &WorldSession::HandleQueryTimeOpcode },
291 { CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleCreatureQueryOpcode },
292 { CMSG_GAMEOBJECT_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleGameObjectQueryOpcode },
294 { MSG_MOVE_WORLDPORT_ACK, STATUS_LOGGEDIN, &WorldSession::HandleMoveWorldportAckOpcode },
295 { MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
296 { MSG_MOVE_JUMP, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
297 { MSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
298 { MSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
299 { MSG_MOVE_SET_FACING, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
300 { MSG_MOVE_STOP, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
301 { MSG_MOVE_START_STRAFE_LEFT, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
302 { MSG_MOVE_START_STRAFE_RIGHT, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
303 { MSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
304 { MSG_MOVE_START_TURN_LEFT, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
305 { MSG_MOVE_START_TURN_RIGHT, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
306 { MSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
307 { MSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
308 { MSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
309 { MSG_MOVE_STOP_PITCH, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
310 { MSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
311 { MSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
312 { MSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
313 { MSG_MOVE_START_SWIM, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
314 { MSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
315 { MSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, &WorldSession::HandleFallOpcode },
316 { CMSG_MOUNTSPECIAL_ANIM, STATUS_LOGGEDIN, &WorldSession::HandleMountSpecialAnimOpcode },
318 { CMSG_GROUP_INVITE, STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode },
319 { CMSG_GROUP_CANCEL, STATUS_LOGGEDIN, &WorldSession::HandleGroupCancelOpcode },
320 { CMSG_GROUP_ACCEPT, STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode },
321 { CMSG_GROUP_DECLINE, STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode },
322 { CMSG_GROUP_UNINVITE, STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteOpcode },
323 { CMSG_GROUP_UNINVITE_GUID, STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteGuildOpcode },
324 { CMSG_GROUP_SET_LEADER, STATUS_LOGGEDIN, &WorldSession::HandleGroupSetLeaderOpcode },
325 { CMSG_GROUP_DISBAND, STATUS_LOGGEDIN, &WorldSession::HandleGroupDisbandOpcode },
326 { CMSG_LOOT_METHOD, STATUS_LOGGEDIN, &WorldSession::HandleLootMethodOpcode },
327 { CMSG_LOOT_ROLL, STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
328 { CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, &WorldSession::HandleRequestPartyMemberStatsOpcode },
329 { CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, &WorldSession::HandleRequestRaidInfoOpcode },
330 { MSG_RAID_ICON_TARGET, STATUS_LOGGEDIN, &WorldSession::HandleRaidIconTargetOpcode },
332 { CMSG_PETITION_SHOWLIST, STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowListOpcode },
333 { CMSG_PETITION_BUY, STATUS_LOGGEDIN, &WorldSession::HandlePetitionBuyOpcode },
334 { CMSG_PETITION_SHOW_SIGNATURES, STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowSignOpcode },
335 { CMSG_PETITION_QUERY, STATUS_LOGGEDIN, &WorldSession::HandlePetitionQueryOpcode },
336 { MSG_PETITION_RENAME, STATUS_LOGGEDIN, &WorldSession::HandlePetitionRenameOpcode },
337 { CMSG_PETITION_SIGN, STATUS_LOGGEDIN, &WorldSession::HandlePetitionSignOpcode },
338 { MSG_PETITION_DECLINE, STATUS_LOGGEDIN, &WorldSession::HandlePetitionDeclineOpcode },
339 { CMSG_OFFER_PETITION, STATUS_LOGGEDIN, &WorldSession::HandleOfferPetitionOpcode },
340 { CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, &WorldSession::HandleTurnInPetitionOpcode },
341 { CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, &WorldSession::HandleMoveFallResetOpcode },
343 { CMSG_GUILD_QUERY, STATUS_AUTHED, &WorldSession::HandleGuildQueryOpcode },
344 { CMSG_GUILD_CREATE, STATUS_LOGGEDIN, &WorldSession::HandleGuildCreateOpcode },
345 { CMSG_GUILD_INVITE, STATUS_LOGGEDIN, &WorldSession::HandleGuildInviteOpcode },
346 { CMSG_GUILD_REMOVE, STATUS_LOGGEDIN, &WorldSession::HandleGuildRemoveOpcode },
347 { CMSG_GUILD_ACCEPT, STATUS_LOGGEDIN, &WorldSession::HandleGuildAcceptOpcode },
348 { CMSG_GUILD_DECLINE, STATUS_LOGGEDIN, &WorldSession::HandleGuildDeclineOpcode },
349 { CMSG_GUILD_INFO, STATUS_LOGGEDIN, &WorldSession::HandleGuildInfoOpcode },
350 { CMSG_GUILD_ROSTER, STATUS_LOGGEDIN, &WorldSession::HandleGuildRosterOpcode },
351 { CMSG_GUILD_PROMOTE, STATUS_LOGGEDIN, &WorldSession::HandleGuildPromoteOpcode },
352 { CMSG_GUILD_DEMOTE, STATUS_LOGGEDIN, &WorldSession::HandleGuildDemoteOpcode },
353 { CMSG_GUILD_LEAVE, STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaveOpcode },
354 { CMSG_GUILD_DISBAND, STATUS_LOGGEDIN, &WorldSession::HandleGuildDisbandOpcode },
355 { CMSG_GUILD_LEADER, STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaderOpcode },
356 { CMSG_GUILD_MOTD, STATUS_LOGGEDIN, &WorldSession::HandleGuildMOTDOpcode },
357 { CMSG_GUILD_SET_PUBLIC_NOTE, STATUS_LOGGEDIN, &WorldSession::HandleGuildSetPublicNoteOpcode },
358 { CMSG_GUILD_SET_OFFICER_NOTE, STATUS_LOGGEDIN, &WorldSession::HandleGuildSetOfficerNoteOpcode },
359 { CMSG_GUILD_RANK, STATUS_LOGGEDIN, &WorldSession::HandleGuildRankOpcode },
360 { CMSG_GUILD_ADD_RANK, STATUS_LOGGEDIN, &WorldSession::HandleGuildAddRankOpcode },
361 { CMSG_GUILD_DEL_RANK, STATUS_LOGGEDIN, &WorldSession::HandleGuildDelRankOpcode },
362 { CMSG_GUILD_CHANGEINFO, STATUS_LOGGEDIN, &WorldSession::HandleGuildChangeInfoOpcode },
363 { MSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, &WorldSession::HandleGuildSaveEmblemOpcode },
365 { CMSG_TAXINODE_STATUS_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleTaxiNodeStatusQueryOpcode },
366 { CMSG_TAXIQUERYAVAILABLENODES, STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAviableNodesOpcode },
367 { CMSG_ACTIVATETAXI, STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiOpcode },
368 { CMSG_ACTIVATETAXI_FAR, STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiFarOpcode },
369 { CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, &WorldSession::HandleTaxiNextDestinationOpcode },
371 { MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, &WorldSession::HandleTabardVendorActivateOpcode },
372 { CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, &WorldSession::HandleBankerActivateOpcode },
373 { CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, &WorldSession::HandleBuyBankSlotOpcode },
374 { CMSG_TRAINER_LIST, STATUS_LOGGEDIN, &WorldSession::HandleTrainerListOpcode },
375 { CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, &WorldSession::HandleTrainerBuySpellOpcode },
376 { MSG_AUCTION_HELLO, STATUS_LOGGEDIN, &WorldSession::HandleAuctionHelloOpcode },
377 { CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, &WorldSession::HandleGossipHelloOpcode },
378 { CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, &WorldSession::HandleGossipSelectOptionOpcode },
379 { CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, &WorldSession::HandleSpiritHealerActivateOpcode },
380 { CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleNpcTextQueryOpcode },
381 { CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, &WorldSession::HandleBinderActivateOpcode },
382 { MSG_LIST_STABLED_PETS , STATUS_LOGGEDIN, &WorldSession::HandleListStabledPetsOpcode },
384 { CMSG_DUEL_ACCEPTED, STATUS_LOGGEDIN, &WorldSession::HandleDuelAcceptedOpcode },
385 { CMSG_DUEL_CANCELLED, STATUS_LOGGEDIN, &WorldSession::HandleDuelCancelledOpcode },
387 { CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode },
388 { CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleBeginTradeOpcode },
389 { CMSG_BUSY_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleBusyTradeOpcode },
390 // sended after loguot complete
391 { CMSG_CANCEL_TRADE, STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode },
392 { CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode },
393 { CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode },
394 { CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleInitiateTradeOpcode },
395 { CMSG_SET_TRADE_GOLD, STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode },
396 { CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode },
397 { CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode },
399 { CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleSplitItemOpcode },
400 { CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleSwapInvItemOpcode },
401 { CMSG_DESTROYITEM, STATUS_LOGGEDIN, &WorldSession::HandleDestroyItemOpcode },
402 { CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemOpcode },
403 { CMSG_ITEM_QUERY_SINGLE, STATUS_LOGGEDIN, &WorldSession::HandleItemQuerySingleOpcode },
404 { CMSG_SELL_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleSellItemOpcode },
405 { CMSG_BUY_ITEM_IN_SLOT, STATUS_LOGGEDIN, &WorldSession::HandleBuyItemInSlotOpcode },
406 { CMSG_BUY_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleBuyItemOpcode },
407 { CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, &WorldSession::HandleListInventoryOpcode },
408 { CMSG_SWAP_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleSwapItem },
409 { CMSG_BUYBACK_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem },
410 { CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBagItemOpcode },
411 { CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAutoBankItemOpcode },
412 { CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBankItemOpcode },
413 { CMSG_ITEM_NAME_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleItemNameQueryOpcode },
415 { CMSG_ATTACKSWING, STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
416 { CMSG_ATTACKSTOP, STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
417 { CMSG_SETSHEATHED, STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode },
419 { CMSG_USE_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleUseItemOpcode },
420 { CMSG_OPEN_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleOpenItemOpcode },
421 { CMSG_CAST_SPELL, STATUS_LOGGEDIN, &WorldSession::HandleCastSpellOpcode },
422 { CMSG_CANCEL_CAST, STATUS_LOGGEDIN, &WorldSession::HandleCancelCastOpcode },
423 { CMSG_CANCEL_AURA, STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
424 { CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_LOGGEDIN, &WorldSession::HandleCancelAutoRepeatSpellOpcode },
426 { CMSG_LEARN_TALENT, STATUS_LOGGEDIN, &WorldSession::HandleLearnTalentOpcode },
427 { MSG_TALENT_WIPE_CONFIRM, STATUS_LOGGEDIN, &WorldSession::HandleTalentWipeOpcode },
428 { CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode },
430 { CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryOpcode },
431 { CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverHelloOpcode },
432 { CMSG_QUESTGIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverAcceptQuestOpcode },
433 { CMSG_QUESTGIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverChooseRewardOpcode },
434 { CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverRequestRewardOpcode },
435 { CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverQuestQueryOpcode },
436 { CMSG_QUEST_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleQuestQueryOpcode },
438 { CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, &WorldSession::HandleQuestConfirmAccept },
439 { CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, &WorldSession::HandleQuestLogRemoveQuest },
440 { CMSG_QUESTLOG_SWAP_QUEST, STATUS_LOGGEDIN, &WorldSession::HandleQuestLogSwapQuest },
441 { CMSG_QUESTGIVER_CANCEL, STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverCancel },
442 { CMSG_QUESTGIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, &WorldSession::HandleQuestComplete },
443 { CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_LOGGEDIN, &WorldSession::HandleQuestAutoLaunch },
444 { CMSG_PUSHQUESTTOPARTY, STATUS_LOGGEDIN, &WorldSession::HandleQuestPushToParty },
445 { MSG_QUEST_PUSH_RESULT, STATUS_LOGGEDIN, &WorldSession::HandleQuestPushResult },
447 { CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, &WorldSession::HandleTutorialFlag },
448 { CMSG_TUTORIAL_CLEAR, STATUS_LOGGEDIN, &WorldSession::HandleTutorialClear },
449 { CMSG_TUTORIAL_RESET, STATUS_LOGGEDIN, &WorldSession::HandleTutorialReset },
451 { CMSG_MESSAGECHAT, STATUS_LOGGEDIN, &WorldSession::HandleMessagechatOpcode },
452 { CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, &WorldSession::HandleTextEmoteOpcode },
453 { CMSG_CHAT_IGNORED, STATUS_LOGGEDIN, &WorldSession::HandleChatIgnoredOpcode },
455 { CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, &WorldSession::HandleCorpseReclaimOpcode },
456 { CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, &WorldSession::HandleResurrectResponseOpcode },
457 { CMSG_AUCTION_LIST_ITEMS, STATUS_LOGGEDIN, &WorldSession::HandleAuctionListItems },
458 { CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_LOGGEDIN, &WorldSession::HandleAuctionListBidderItems },
459 { CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAuctionSellItem },
460 { CMSG_AUCTION_REMOVE_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleAuctionRemoveItem },
461 { CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_LOGGEDIN, &WorldSession::HandleAuctionListOwnerItems },
462 { CMSG_AUCTION_PLACE_BID, STATUS_LOGGEDIN, &WorldSession::HandleAuctionPlaceBid },
464 { CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, &WorldSession::HandleChannelJoin },
465 { CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, &WorldSession::HandleChannelLeave },
466 { CMSG_CHANNEL_LIST, STATUS_LOGGEDIN, &WorldSession::HandleChannelList },
467 { CMSG_CHANNEL_PASSWORD, STATUS_LOGGEDIN, &WorldSession::HandleChannelPassword },
468 { CMSG_CHANNEL_SET_OWNER, STATUS_LOGGEDIN, &WorldSession::HandleChannelSetOwner },
469 { CMSG_CHANNEL_OWNER, STATUS_LOGGEDIN, &WorldSession::HandleChannelOwner },
470 { CMSG_CHANNEL_MODERATOR, STATUS_LOGGEDIN, &WorldSession::HandleChannelModerator },
471 { CMSG_CHANNEL_UNMODERATOR, STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmoderator },
472 { CMSG_CHANNEL_MUTE, STATUS_LOGGEDIN, &WorldSession::HandleChannelMute },
473 { CMSG_CHANNEL_UNMUTE, STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmute },
474 { CMSG_CHANNEL_INVITE, STATUS_LOGGEDIN, &WorldSession::HandleChannelInvite },
475 { CMSG_CHANNEL_KICK, STATUS_LOGGEDIN, &WorldSession::HandleChannelKick },
476 { CMSG_CHANNEL_BAN, STATUS_LOGGEDIN, &WorldSession::HandleChannelBan },
477 { CMSG_CHANNEL_UNBAN, STATUS_LOGGEDIN, &WorldSession::HandleChannelUnban },
478 { CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, &WorldSession::HandleChannelAnnounce },
479 { CMSG_CHANNEL_MODERATE, STATUS_LOGGEDIN, &WorldSession::HandleChannelModerate },
481 { CMSG_GET_MAIL_LIST, STATUS_LOGGEDIN, &WorldSession::HandleGetMail },
482 { CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, &WorldSession::HandleItemTextQuery },
483 { CMSG_SEND_MAIL, STATUS_LOGGEDIN, &WorldSession::HandleSendMail },
484 { CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, &WorldSession::HandleTakeMoney },
485 { CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleTakeItem },
486 { CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, &WorldSession::HandleMarkAsRead },
487 { CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, &WorldSession::HandleReturnToSender },
488 { CMSG_MAIL_DELETE, STATUS_LOGGEDIN, &WorldSession::HandleMailDelete },
489 { CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleMailCreateTextItem },
490 { MSG_QUERY_NEXT_MAIL_TIME, STATUS_LOGGEDIN, &WorldSession::HandleMsgQueryNextMailtime },
492 { CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, &WorldSession::HandleCompleteCinema },
493 { CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, &WorldSession::HandleNextCinematicCamera },
495 { CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode },
497 { CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, &WorldSession::HandlePageQueryOpcode },
498 { CMSG_READ_ITEM, STATUS_LOGGEDIN, &WorldSession::HandleReadItem },
500 { CMSG_PET_ACTION, STATUS_LOGGEDIN, &WorldSession::HandlePetAction },
501 { CMSG_PET_NAME_QUERY, STATUS_LOGGEDIN, &WorldSession::HandlePetNameQuery },
503 { CMSG_PET_ABANDON, STATUS_LOGGEDIN, &WorldSession::HandlePetAbandon },
504 { CMSG_PET_SET_ACTION, STATUS_LOGGEDIN, &WorldSession::HandlePetSetAction },
505 { CMSG_PET_RENAME, STATUS_LOGGEDIN, &WorldSession::HandlePetRename },
506 { CMSG_STABLE_PET, STATUS_LOGGEDIN, &WorldSession::HandleStablePet },
507 { CMSG_UNSTABLE_PET, STATUS_LOGGEDIN, &WorldSession::HandleUnstablePet },
508 { CMSG_BUY_STABLE_SLOT, STATUS_LOGGEDIN, &WorldSession::HandleBuyStableSlot },
509 { CMSG_STABLE_REVIVE_PET, STATUS_LOGGEDIN, &WorldSession::HandleStableRevivePet },
510 { CMSG_STABLE_SWAP_PET, STATUS_LOGGEDIN, &WorldSession::HandleStableSwapPet },
512 { CMSG_CANCEL_CHANNELLING , STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
514 //BattleGround
516 { CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode },
517 //{ CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, &WorldSession::HandleBattleMasterHelloOpcode },
518 { CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundHelloOpcode },
519 { CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundJoinOpcode },
520 { MSG_BATTLEGROUND_PLAYER_POSITIONS,STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPositionsOpcode },
521 { MSG_PVP_LOG_DATA, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPVPlogdataOpcode },
522 { CMSG_BATTLEFIELD_PORT, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPortOpcode },
523 { CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundListOpcode },
524 { CMSG_LEAVE_BATTLEFIELD, STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundLeaveOpcode },
526 { CMSG_SET_ACTIONBAR_TOGGLES, STATUS_LOGGEDIN, &WorldSession::HandleSetActionBar },
527 { CMSG_FIELD_WATCHED_FACTION_SHOW_BAR, STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionIndexOpcode },
529 { CMSG_LOOT_ROLL, STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
530 { CMSG_WARDEN_DATA, STATUS_LOGGEDIN, &WorldSession::HandleWardenDataOpcode },
531 { CMSG_WORLD_TELEPORT, STATUS_LOGGEDIN, &WorldSession::HandleWorldTeleportOpcode },
532 { MSG_MINIMAP_PING, STATUS_LOGGEDIN, &WorldSession::HandleMinimapPingOpcode },
533 { MSG_RANDOM_ROLL, STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode },
535 { 0, 0, NULL }
538 return table;
541 void WorldSession::HandleCancelChanneling( WorldPacket & recv_data )
543 uint32 spellid;
544 recv_data >> spellid;