From 3cf0a233b1a64aef25c91da3c4636bcd27ec711b Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 25 Feb 2018 17:23:52 +1100 Subject: [PATCH] redirect ontalk events inside instances to instancecontent ptr --- src/servers/sapphire_zone/Actor/Actor.cpp | 6 ++++ src/servers/sapphire_zone/Actor/Actor.h | 2 ++ .../DebugCommand/DebugCommandHandler.cpp | 2 +- .../Network/Handlers/EventHandlers.cpp | 8 +++++- .../sapphire_zone/Script/NativeScriptApi.h | 4 +-- .../sapphire_zone/Zone/InstanceContent.cpp | 7 ++++- .../sapphire_zone/Zone/InstanceContent.h | 1 + src/servers/sapphire_zone/Zone/Zone.cpp | 28 ------------------- src/servers/sapphire_zone/Zone/Zone.h | 1 - 9 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index f1db8533..7c855c43 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -313,6 +313,12 @@ void Core::Entity::Actor::setCurrentZone( ZonePtr currZone ) m_pCurrentZone = currZone; } +/*! \return InstanceContentPtr to the current instance, null if not an instance or not set */ +Core::InstanceContentPtr Core::Entity::Actor::getCurrentInstance() const +{ + return getCurrentZone()->getAsInstanceContent(); +} + /*! Get the current cell of a region the actor is in diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index 94502c0d..54916754 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -124,6 +124,8 @@ namespace Entity { ZonePtr getCurrentZone() const; void setCurrentZone( ZonePtr currZone ); + InstanceContentPtr getCurrentInstance() const; + // get the current cell of a region the actor is in Cell* getCellPtr(); // set the current cell diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 14a938c7..46241c87 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -734,7 +734,7 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo if( !obj ) return; - instance->updateEObj(obj); + //instance->updateEObj(obj); } else if( subCommand == "objstate" ) { diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 692fc1a5..d44e0241 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -20,6 +20,7 @@ #include "Actor/Player.h" #include "Forwards.h" #include "Event/EventHelper.h" +#include "Zone/InstanceContent.h" extern Core::Data::ExdDataGenerated g_exdDataGen; extern Core::Scripting::ScriptManager g_scriptMgr; @@ -49,7 +50,12 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& player.sendDebug( "Calling: " + objName + "." + eventName ); player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); - if( !g_scriptMgr.onTalk( player, actorId, eventId ) && + + if( auto instance = player.getCurrentInstance() ) + { + instance->onTalk( player, eventId, actorId ); + } + else if( !g_scriptMgr.onTalk( player, actorId, eventId ) && eventType == Event::EventHandler::EventHandlerType::Quest ) { auto questInfo = g_exdDataGen.get< Core::Data::Quest >( eventId ); diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index 058195c6..f65f93f4 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -87,7 +87,7 @@ public: virtual void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) { } virtual void onNpcKill( uint32_t npcId, Entity::Player& player ) { } virtual void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Entity::Player& player ) { } - virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } + virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } virtual void onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { } virtual void onOutsideRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { } virtual void onEventItem( Entity::Player& player, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId ) { } @@ -122,7 +122,7 @@ public: virtual void onInit( InstanceContentPtr instance ) { } virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { } - virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } + virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } }; #endif \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index ee0a032a..2b8682a0 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -13,6 +13,8 @@ #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" +#include "Event/EventHandler.h" + extern Core::Logger g_log; extern Core::Scripting::ScriptManager g_scriptMgr; @@ -253,4 +255,7 @@ Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::st return it->second; } - +void Core::InstanceContent::onTalk( Core::Entity::Player& player, uint32_t eventId, uint64_t actorId ) +{ + auto type = static_cast< Core::Event::EventHandler::EventType >( eventId >> 16 ); +} diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 184dde51..b42dc47d 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -34,6 +34,7 @@ public: void onFinishLoading( Entity::Player& player ) override; void onInitDirector( Entity::Player& player ) override; void onUpdate( uint32_t currTime ) override; + void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); void onRegisterEObj( Entity::EventObjectPtr object ) override; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index b679ce83..1df0f389 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -679,34 +679,6 @@ Core::Entity::EventObjectPtr Core::Zone::getEObj( uint32_t objId ) return obj->second; } -// TODO: this is located wrong. state change should happen in the object and it should send to his in range set. -void Core::Zone::updateEObj( Entity::EventObjectPtr object ) -{ - if( !object ) - return; - - for( const auto& playerIt : m_playerMap ) - { - // send that packet with le data - ZoneChannelPacket< FFXIVIpcObjectSpawn > eobjStatePacket( playerIt.second->getId() ); - eobjStatePacket.data().objKind = object->getObjKind(); - eobjStatePacket.data().state = object->getState(); - eobjStatePacket.data().objId = object->getId(); - eobjStatePacket.data().hierachyId = object->getMapLinkId(); - eobjStatePacket.data().position = object->getPos(); - - // ???? - //eobjStatePacket.data().levelId = 4236873; - //eobjStatePacket.data().unknown2 = 5; - //eobjStatePacket.data().unknown1C = 1065353216; - //eobjStatePacket.data().unknown20 = 2147423605; - //eobjStatePacket.data().actorId = 1074105831; - //eobjStatePacket.data().unknown = 1; - - playerIt.second->queuePacket( eobjStatePacket ); - } -} - Core::InstanceContentPtr Core::Zone::getAsInstanceContent() { return boost::dynamic_pointer_cast< InstanceContent, Zone >( shared_from_this() ); diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 048421c7..097100c9 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -113,7 +113,6 @@ public: void registerEObj( Entity::EventObjectPtr object ); Entity::EventObjectPtr getEObj( uint32_t objId ); - void updateEObj( Entity::EventObjectPtr object ); InstanceContentPtr getAsInstanceContent();