aboutsummaryrefslogtreecommitdiff
path: root/src/game/MiscHandler.cpp
diff options
context:
space:
mode:
authorraczman <none@none>2009-03-30 16:57:17 +0200
committerraczman <none@none>2009-03-30 16:57:17 +0200
commit3f985645dbb8136986eeaf4c8cac6ba87c6e4b82 (patch)
tree84f7bde584f7473e573b93638423501f441152de /src/game/MiscHandler.cpp
parent9d02feed4f2cdd41c5ec300e6582af8abe3b5fcd (diff)
Added GO gossip menu support. Kudos and cookies to arrai.
--HG-- branch : trunk
Diffstat (limited to 'src/game/MiscHandler.cpp')
-rw-r--r--src/game/MiscHandler.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 6d0c94fa0ef..14da3a94360 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -26,6 +26,7 @@
#include "Opcodes.h"
#include "Log.h"
#include "Player.h"
+#include "GossipDef.h"
#include "World.h"
#include "ObjectMgr.h"
#include "WorldSession.h"
@@ -70,6 +71,79 @@ void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ )
GetPlayer()->RepopAtGraveyard();
}
+void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4+4);
+
+ sLog.outDebug("WORLD: CMSG_GOSSIP_SELECT_OPTION");
+
+ uint32 option;
+ uint32 unk;
+ uint64 guid;
+ std::string code = "";
+
+ recv_data >> guid >> unk >> option;
+
+ if(_player->PlayerTalkClass->GossipOptionCoded( option ))
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data,8+4+1);
+ sLog.outBasic("reading string");
+ recv_data >> code;
+ sLog.outBasic("string read: %s", code.c_str());
+ }
+
+ Creature *unit = NULL;
+ GameObject *go = NULL;
+ if(IS_CREATURE_GUID(guid))
+ {
+ unit = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid, UNIT_NPC_FLAG_NONE);
+ if (!unit)
+ {
+ sLog.outDebug( "WORLD: HandleGossipSelectOptionOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+ }
+ else if(IS_GAMEOBJECT_GUID(guid))
+ {
+ go = ObjectAccessor::GetGameObject(*_player, guid);
+ if (!go)
+ {
+ sLog.outDebug( "WORLD: HandleGossipSelectOptionOpcode - GameObject (GUID: %u) not found.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+ }
+ else
+ {
+ sLog.outDebug( "WORLD: HandleGossipSelectOptionOpcode - unsupported GUID type for highguid %u. lowpart %u.", uint32(GUID_HIPART(guid)), uint32(GUID_LOPART(guid)) );
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ if(!code.empty())
+ {
+ if(unit)
+ {
+ if(!Script->GossipSelectWithCode( _player, unit, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option ), code.c_str()) )
+ unit->OnGossipSelect( _player, option );
+ }
+ else
+ Script->GOSelectWithCode( _player, go, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option ), code.c_str());
+ }
+ else
+ {
+ if(unit)
+ {
+ if(!Script->GossipSelect( _player, unit, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option )) )
+ unit->OnGossipSelect( _player, option );
+ }
+ else
+ Script->GOSelect( _player, go, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option ));
+ }
+}
+
void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,4+4+1+1+4+4+4+4);