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
20 #include "Database/DatabaseEnv.h"
23 #include "WorldSocket.h"
24 #include "WorldPacket.h"
25 #include "WorldSession.h"
27 #include "ObjectMgr.h"
28 #include "AuctionHouseObject.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()
46 while(!_recvQueue
.empty())
48 packet
= _recvQueue
.next();
53 void WorldSession::SetSocket(WorldSocket
*sock
)
58 void WorldSession::SendPacket(WorldPacket
* packet
)
61 _socket
->SendPacket(packet
);
64 void WorldSession::QueuePacket(WorldPacket
& packet
)
66 WorldPacket
*pck
= new WorldPacket(packet
);
72 bool WorldSession::Update(uint32 diff
)
75 OpcodeHandler
*table
= _GetOpcodeHandlerTable();
78 while (!_recvQueue
.empty())
80 packet
= _recvQueue
.next();
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
);
96 sLog
.outError( "SESSION: received unexpected opcode %s (0x%.4X)",
97 LookupName(packet
->GetOpcode(), g_worldOpcodeNames
),
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());
113 time_t currTime
= time(NULL
);
114 if (!_socket
|| ShouldLogOut(currTime
))
123 void WorldSession::LogoutPlayer(bool Save
)
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())
140 group
= objmgr
.GetGroupByLeader(_player
->GetGroupLeader());
143 if (group
->RemoveMember(_player
->GetGUID()) > 1)
148 objmgr
.RemoveGroup(group
);
153 _player
->UnSetInGroup();
156 guild
= objmgr
.GetGuildById(_player
->GetGuildId());
159 guild
->LoadPlayerStatsByGuid(_player
->GetGUID());
162 data
.Initialize(SMSG_GUILD_EVENT
);
163 data
<<(uint8
)GE_SIGNED_OFF
;
165 data
<<_player
->GetName();
166 data
<<(uint8
)0<<(uint8
)0<<(uint8
)0;
167 guild
->BroadcastPacket(&data
);
169 _player
->UnsummonPet();
171 _player
->UnsummonTotem();
172 _player
->InvisiblePjsNear
.clear();
174 ObjectAccessor::Instance().RemovePlayer(_player
);
175 MapManager::Instance().GetMap(_player
->GetMapId())->Remove(_player
, false);
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);
192 data
.Initialize(SMSG_FRIEND_STATUS
);
193 data
<<uint8(FRIEND_OFFLINE
);
194 data
<<_player
->GetGUID();
195 _player
->BroadcastPacketToFriendListers(&data
);
200 data
.Initialize( SMSG_LOGOUT_COMPLETE
);
203 sLog
.outDebug( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" );
209 void WorldSession::KickPlayer()
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
},
249 { CMSG_PLAYED_TIME
, STATUS_LOGGEDIN
, &WorldSession::HandlePlayedTime
},
252 { CMSG_INSPECT
, STATUS_LOGGEDIN
, &WorldSession::HandleInspectOpcode
},
255 { MSG_INSPECT_HONOR_STATS
, STATUS_LOGGEDIN
, &WorldSession::HandleInspectHonorStatsOpcode
},
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
},
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
},
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
},
541 void WorldSession::HandleCancelChanneling( WorldPacket
& recv_data
)
544 recv_data
>> spellid
;