From 9f2c8daab5d8e534b74e0eacdcd41d9416722eec Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 30 Nov 2018 23:15:58 +1100 Subject: [PATCH] EObjs are special so they get their own scripts --- .../HousingEstateEntranceWarpTaxi.cpp | 20 ++++++------------- .../sapphire_zone/Script/NativeScriptApi.cpp | 11 ++++++++++ .../sapphire_zone/Script/NativeScriptApi.h | 10 ++++++++++ .../sapphire_zone/Script/ScriptMgr.cpp | 14 +++++++++++++ 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/servers/Scripts/common/warptaxi/HousingEstateEntranceWarpTaxi.cpp b/src/servers/Scripts/common/warptaxi/HousingEstateEntranceWarpTaxi.cpp index 7190b7e7..dfc332ff 100644 --- a/src/servers/Scripts/common/warptaxi/HousingEstateEntranceWarpTaxi.cpp +++ b/src/servers/Scripts/common/warptaxi/HousingEstateEntranceWarpTaxi.cpp @@ -1,38 +1,30 @@ #include #include -#include "Zone/HousingZone.h" #include "Actor/EventObject.h" using namespace Sapphire; class HousingEstateEntranceWarpTaxi : - public Sapphire::ScriptAPI::EventScript + public Sapphire::ScriptAPI::EventObjectScript { public: HousingEstateEntranceWarpTaxi() : - Sapphire::ScriptAPI::EventScript( 0x0002004c ) + Sapphire::ScriptAPI::EventObjectScript( 2002737 ) { } - void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + void onTalk( uint32_t eventId, Entity::Player& player, Entity::EventObject& eobj ) override { - auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentZone() ); - if( !zone ) - return; + player.sendDebug( "Found plot entrance for plot: " + std::to_string( eobj.getHousingLink() >> 8 ) ); - auto eobj = zone->getEObj( actorId ); - if( !eobj ) - return; - - player.sendDebug( "Found plot entrance for plot: " + std::to_string( eobj->getHousingLink() >> 8 ) ); - - player.playScene( getId(), 0, 0, []( Entity::Player& player, const Event::SceneResult& result ) + player.playScene( eventId, 0, 0, []( Entity::Player& player, const Event::SceneResult& result ) { if( result.param2 != 1 ) return; // param2 == 1, zone into instance + } ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.cpp b/src/servers/sapphire_zone/Script/NativeScriptApi.cpp index 49b78d9f..5c99828a 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.cpp +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.cpp @@ -143,6 +143,17 @@ namespace Sapphire::ScriptAPI /////////////////////////////////////////////////////////////////// + EventObjectScript::EventObjectScript( uint32_t eobjId ) : + ScriptObject( eobjId, typeid( EventObjectScript ).hash_code() ) + { + } + + void EventObjectScript::onTalk( uint32_t eventId, Sapphire::Entity::Player& player, Entity::EventObject& eobj ) + { + } + + /////////////////////////////////////////////////////////////////// + BattleNpcScript::BattleNpcScript( uint32_t npcId ) : ScriptObject( npcId, typeid( BattleNpcScript ).hash_code() ) { diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index 05329528..c5c35166 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -182,6 +182,16 @@ namespace Sapphire::ScriptAPI uint32_t catalogId ); }; + /*! + * @brief The base class for scripts that implement behaviour related to Event Objects (EObjs) + */ + class EventObjectScript : public ScriptObject + { + public: + explicit EventObjectScript( uint32_t eobjId ); + + virtual void onTalk( uint32_t eventId, Sapphire::Entity::Player& player, Entity::EventObject& eobj ); + }; /*! * @brief The base class for any scripts that implement behaviour related to BattleNPCs diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index b84c17c1..eaddfce9 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -7,6 +7,7 @@ #include "Zone/Zone.h" #include "Zone/InstanceContent.h" #include "Actor/Player.h" +#include "Actor/EventObject.h" #include "ServerMgr.h" #include "Event/EventHandler.h" #include "Event/EventHelper.h" @@ -168,6 +169,19 @@ void Sapphire::Scripting::ScriptMgr::onPlayerFirstEnterWorld( Entity::Player& pl bool Sapphire::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId ) { + // check if the actor is an eobj and call its script if we have one + auto zone = player.getCurrentZone(); + if( auto eobj = zone->getEObj( actorId ) ) + { + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventObjectScript >( eobj->getObjectId() ); + if( script ) + { + script->onTalk( eventId, player, *eobj ); + return true; + } + } + + // check for a direct eventid match first, otherwise default to base type auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId ); if( script ) {