diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 7b19e94a..af204adb 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1439,6 +1439,20 @@ namespace Sapphire::Network::Packets::Server uint8_t unknown[8]; }; + struct FFXIVIpcEventPlay16 : FFXIVIpcBasePacket< EventPlay16 > + { + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t flags; + uint32_t param3; + uint8_t paramSize; + uint8_t padding1[3]; + uint32_t param5; + uint32_t param[16]; + }; + template< int ArgCount > struct FFXIVIpcEventPlayN { diff --git a/src/common/Util/UtilMath.cpp b/src/common/Util/UtilMath.cpp index ae61e171..d81a2f62 100644 --- a/src/common/Util/UtilMath.cpp +++ b/src/common/Util/UtilMath.cpp @@ -76,4 +76,9 @@ uint16_t Util::floatToUInt16Rot( float val ) uint8_t Util::floatToUInt8Rot( float val ) { return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI ); +} + +float Util::floatFromUInt16Rot( uint16_t rot ) +{ + return rot / 32768.0f * PI - PI; } \ No newline at end of file diff --git a/src/common/Util/UtilMath.h b/src/common/Util/UtilMath.h index c35ef6be..1168d71b 100644 --- a/src/common/Util/UtilMath.h +++ b/src/common/Util/UtilMath.h @@ -25,6 +25,8 @@ namespace Sapphire::Common::Util uint16_t floatToUInt16Rot( float val ); + float floatFromUInt16Rot( uint16_t rot ); + uint8_t floatToUInt8Rot( float val ); template < typename T > diff --git a/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp b/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp index 48a33ebf..349fd93c 100644 --- a/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp +++ b/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp @@ -2,9 +2,16 @@ #include #include "Actor/Player.h" +#include "Actor/EventObject.h" #include "Territory/PublicContent.h" +#include +#include "Network/CommonActorControl.h" +#include "Network/PacketWrappers/ActorControlSelfPacket.h" using namespace Sapphire; +using namespace Sapphire::Network::ActorControl; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::Server; class SanctumOfTheTwelve : public Sapphire::ScriptAPI::PublicContentScript { @@ -13,7 +20,20 @@ public: void onInit( PublicContent& instance ) override { + auto exitHandler = [ & ]( Entity::Player& player, Entity::EventObjectPtr eobj, TerritoryPtr terri, uint32_t eventId, uint64_t actorId ) + { + player.eventFinish( eventId, 1 ); + player.exitInstance(); + }; + instance.registerEObj( "unknown_0", 2005027, 0, 0, { 0.0f, 251.103f, -60.39313f }, 1.0f, Common::Util::floatFromUInt16Rot( 28453 ) ); + instance.registerEObj( "unknown_1", 2004902, 0, 1, { -0.1025963f, 2.902821f, -125.97f }, 1.0f, Common::Util::floatFromUInt16Rot( 32767 ) ); + instance.registerEObj( "unknown_2", 2004786, 0, 0, { 0.0f, 501.103f, -60.39313f }, 1.0f, Common::Util::floatFromUInt16Rot( 28453 ) ); + instance.registerEObj( "unknown_3", 2004783, 0, 0, { 0.0f, 0.5f, 19.0f }, 1.0f, Common::Util::floatFromUInt16Rot( 32767 ) )->setOnTalkHandler( exitHandler ); + instance.registerEObj( "unknown_4", 2004783, 0, 0, { 0.0f, 250.5515f, -48.19313f }, 1.0f, Common::Util::floatFromUInt16Rot( 32767 ) )->setOnTalkHandler( exitHandler ); + instance.registerEObj( "unknown_5", 2004783, 0, 0, { -0.01531982f, 500.5456f, -48.20331 }, 0.9917603f, Common::Util::floatFromUInt16Rot( 32767 ) )->setOnTalkHandler( exitHandler ); + instance.registerEObj( "unknown_6", 2004783, 0, 0, { -0.01531982f, 750.5475f, -55.13086f }, 0.9917603f, Common::Util::floatFromUInt16Rot( 32767 ) )->setOnTalkHandler( exitHandler ); + instance.setCurrentFestival( 237, 0 ); } void onUpdate( PublicContent& instance, uint64_t tickCount ) override @@ -48,8 +68,17 @@ public: void onEnterTerritory( PublicContent& instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override { - player.setPosAndSendActorMove( 0, 250, -50, player.getRot() ); - player.directorPlayScene( instance.getDirectorId(), 1, NONE, 0, 0, 0 ); + auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + auto p = makeZonePacket< FFXIVDirectorUnk4 >( getId() ); + p->data().param[0] = instance.getDirectorId(); + p->data().param[1] = 4365; + p->data().param[2] = 0; + p->data().param[3] = 0; + player.queuePacket( p ); + }; + player.queuePacket( makeActorControlSelf( getId(), DirectorUpdate, instance.getDirectorId(), 0x80000003, 1200 ) ); // timer + player.playScene( instance.getDirectorId(), 1, HIDE_HOTBAR, 0, 2, 4, callback ); } void onDebug( Entity::Player& player, uint32_t param ) override diff --git a/src/scripts/quest/subquest/gridania/SubCts999.cpp b/src/scripts/quest/subquest/gridania/SubCts999.cpp index 23bc47a4..9f4fc818 100644 --- a/src/scripts/quest/subquest/gridania/SubCts999.cpp +++ b/src/scripts/quest/subquest/gridania/SubCts999.cpp @@ -3,6 +3,7 @@ //ACTOR1 = CEREMONYSHOP01578 //_ACTOR1 SET!! //SCENE_100 REMOVED!! +#include #include #include #include @@ -12,11 +13,16 @@ #include "Network/PacketWrappers/ActorControlSelfPacket.h" using namespace Sapphire; +using namespace Sapphire::Network::ActorControl; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::Server; class SubCts999 : public Sapphire::ScriptAPI::EventScript { +private: + TerritoryPtr currentInstance; public: - SubCts999() : Sapphire::ScriptAPI::EventScript( 67114 ){}; + SubCts999() : Sapphire::ScriptAPI::EventScript( 67114 ){ currentInstance = nullptr; }; ~SubCts999() = default; //SEQ_0, 1 entries @@ -416,7 +422,7 @@ private: } if( type == 4 ) // BASE_ID_TERRITORY_TYPE = unknown { - player.queuePacket( Sapphire::Network::Packets::Server::makeActorControlSelf( getId(), Sapphire::Network::ActorControl::ActorControlType::CeremonyDecoration, player.getQuestUI8FH( getId() ), player.getQuestUI8FL( getId() ), 0, 0 ) ); + player.queuePacket( makeActorControlSelf( getId(), ActorControlType::CeremonyDecoration, player.getQuestUI8FH( getId() ), player.getQuestUI8FL( getId() ), 0, 0 ) ); Scene00067( player ); // Scene00067: Normal(SetWeddingFestivalParam), id=unknown break; } @@ -451,7 +457,7 @@ private: } if( type == 4 ) // BASE_ID_TERRITORY_TYPE = unknown { - player.queuePacket( Sapphire::Network::Packets::Server::makeActorControlSelf( getId(), Sapphire::Network::ActorControl::ActorControlType::CeremonyDecoration, player.getQuestUI8FH( getId() ), player.getQuestUI8FL( getId() ), 0, 0 ) ); + player.queuePacket( makeActorControlSelf( getId(), ActorControlType::CeremonyDecoration, player.getQuestUI8FH( getId() ), player.getQuestUI8FL( getId() ), 0, 0 ) ); Scene00073( player ); // Scene00073: Normal(FadeIn, SetWeddingFestivalParam), id=unknown break; } @@ -1365,12 +1371,25 @@ private: player.sendDebug( "SubCts999:67114 calling Scene00070: Normal(Talk, YesNo, TargetCanMove, SystemTalk), id=ETOINELLE" ); auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - //if( result.param1 > 0 && result.param2 == 1 ) - //{ - //} - checkProgressSeq12( player ); + if( result.param1 == 1024 && result.param3 == 2 ) + { + player.prepareZoning( 392, true, 1, 0, 0, 1, 8 ); + player.eventFinish( getId(), 1 ); + if( !currentInstance ) + { + auto& terriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + currentInstance = terriMgr.createPublicContent( 1, 392 ); + } + Common::FFXIVARR_POSITION3 pos; + pos.x = 0; + pos.y = 500; + pos.z = -50; + player.setInstance( currentInstance, pos, -3.14f ); + } }; - player.playScene( getId(), 70, NONE, callback ); + std::vector< uint32_t > list; + list.push_back( std::time( 0 ) ); + player.playScene16( getId(), 70, HIDE_HOTBAR, 0, 0, list, callback ); } void Scene00071( Entity::Player& player ) @@ -1401,7 +1420,6 @@ private: player.sendDebug( "SubCts999:67114 calling Scene00073: Normal(FadeIn, SetWeddingFestivalParam), id=unknown" ); auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - //checkProgressSeq12( player ); }; player.playScene( getId(), 73, HIDE_HOTBAR, callback ); } diff --git a/src/world/Actor/EventObject.h b/src/world/Actor/EventObject.h index f2ae6d05..c497bf1f 100644 --- a/src/world/Actor/EventObject.h +++ b/src/world/Actor/EventObject.h @@ -13,7 +13,7 @@ namespace Sapphire::Entity Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" ); using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr, - TerritoryPtr, uint64_t ) >; + TerritoryPtr, uint32_t, uint64_t ) >; uint32_t getGimmickId() const; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 9fe99177..fd37ed57 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1830,14 +1830,14 @@ void Sapphire::Entity::Player::sendZonePackets() //setStateFlag( PlayerStateFlag::BetweenAreas ); //setStateFlag( PlayerStateFlag::BetweenAreas1 ); - if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) - sendHuntingLog(); - sendStats(); // only initialize the UI if the player in fact just logged in. if( isLogin() ) { + if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) + sendHuntingLog(); + auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() ); for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ ) @@ -1898,18 +1898,31 @@ void Sapphire::Entity::Player::sendZonePackets() if( auto d = getCurrentTerritory()->getAsDirector() ) { - struct UNK00EA : FFXIVIpcBasePacket< 0x00EA > + if( d->getContentFinderConditionId() > 0 ) { - uint32_t unknown[4]; - }; - auto p = makeZonePacket< UNK00EA >( getId() ); - p->data().unknown[0] = d->getContentFinderConditionId(); - p->data().unknown[2] = 1082270818; - queuePacket( p ); - auto p2 = makeZonePacket< UNK00EA >( getId() ); - p2->data().unknown[0] = d->getContentFinderConditionId(); - p2->data().unknown[1] = 4; - queuePacket( p2 ); + struct UNK00EA : FFXIVIpcBasePacket< 0x00EA > + { + uint32_t unknown[4]; + }; + auto p2 = makeZonePacket< UNK00EA >( getId() ); + p2->data().unknown[0] = d->getContentFinderConditionId(); + p2->data().unknown[1] = 4; + queuePacket( p2 ); + } + if( d->getDirectorId() == 2147745793 ) + { + initZonePacket->data().unknown4 = 5038252; + initZonePacket->data().bitmask = 174; + initZonePacket->data().bitmask1 = 0; + initZonePacket->data().unknown8 = 12152490; + initZonePacket->data().festivalId = 237; + initZonePacket->data().unknown9 = 1091141632; + initZonePacket->data().unknown10 = 1065353216; + initZonePacket->data().unknown12[3] = 116; + initZonePacket->data().unknown14[0] = 67372032; + initZonePacket->data().unknown14[1] = 16843012; + initZonePacket->data().unknown14[2] = 132097; + } } getCurrentTerritory()->onPlayerZoneIn( *this ); diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index c983670c..39c6ddc0 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -111,6 +111,8 @@ namespace Sapphire::Entity void playSceneChain( uint32_t eventId, uint32_t scene, uint32_t flags, Event::EventHandler::SceneChainCallback sceneChainCallback ); + void playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, uint32_t param5, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ); + /*! setup the event and return a ptr to it */ Event::EventHandlerPtr bootstrapSceneEvent( uint32_t eventId, uint32_t flags ); diff --git a/src/world/Actor/PlayerEvent.cpp b/src/world/Actor/PlayerEvent.cpp index 12f8c626..33c4efe3 100644 --- a/src/world/Actor/PlayerEvent.cpp +++ b/src/world/Actor/PlayerEvent.cpp @@ -323,6 +323,34 @@ void Sapphire::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlaye unsetStateFlag( PlayerStateFlag::InNpcEvent ); } +void Sapphire::Entity::Player::playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, uint32_t param5, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ) +{ + auto pEvent = bootstrapSceneEvent( eventId, flags ); + if( !pEvent ) + return; + + pEvent->setPlayedScene( true ); + pEvent->setEventReturnCallback( eventReturnCallback ); + pEvent->setSceneChainCallback( nullptr ); + auto eventPlay16 = makeZonePacket< FFXIVIpcEventPlay16 >( getId() ); + eventPlay16->data().actorId = pEvent->getActorId(); + eventPlay16->data().eventId = pEvent->getId(); + eventPlay16->data().scene = scene; + eventPlay16->data().flags = flags; + eventPlay16->data().param3 = param3; + eventPlay16->data().param5 = param5; + eventPlay16->data().paramSize = paramList.size(); + int i = 0; + for( auto p : paramList ) + { + assert( i < 16 ); + eventPlay16->data().param[ i ] = paramList.at( i ); + i++; + } + + queuePacket( eventPlay16 ); +} + void Sapphire::Entity::Player::eventActionStart( uint32_t eventId, uint32_t action, World::Action::ActionCallback finishCallback, diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index fb8061e7..4ff427d0 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -1490,4 +1490,42 @@ void Sapphire::World::Manager::DebugCommandMgr::pc( char* data, Entity::Player& instance->setBranch( branch ); } + else if( subCommand == "objstate" ) + { + char objName[128]; + uint8_t state; + + sscanf( params.c_str(), "%s %hhu", objName, &state ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + return; + + obj->setState( state ); + } + else if( subCommand == "objflag" ) + { + char objName[256]; + uint32_t state1; + uint32_t state2; + + sscanf( params.c_str(), "%s %i %i", objName, &state1, &state2 ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + { + player.sendDebug( "No eobj found." ); + return; + } + + obj->setAnimationFlag( state1, state2 ); + } } diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 44a17fa4..70133b04 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -380,15 +380,18 @@ void Sapphire::Network::GameConnection::pingHandler( const Packets::FFXIVARR_PAC void Sapphire::Network::GameConnection::finishLoadingHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - player.sendQuestInfo(); + if( player.isLogin() ) + { + player.sendQuestInfo(); - // TODO: load and save this data instead of hardcoding - auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() ); - gcPacket->data().gcId = player.getGc(); - gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ]; - gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ]; - gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ]; - player.queuePacket( gcPacket ); + // TODO: load and save this data instead of hardcoding + auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() ); + gcPacket->data().gcId = player.getGc(); + gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ]; + gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ]; + gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ]; + player.queuePacket( gcPacket ); + } player.getCurrentTerritory()->onFinishLoading( player ); diff --git a/src/world/Network/PacketWrappers/ActorControlSelfPacket.h b/src/world/Network/PacketWrappers/ActorControlSelfPacket.h index bfd343a5..0ce5b4fc 100644 --- a/src/world/Network/PacketWrappers/ActorControlSelfPacket.h +++ b/src/world/Network/PacketWrappers/ActorControlSelfPacket.h @@ -22,15 +22,15 @@ namespace Sapphire::Network::Packets::Server uint32_t param3 = 0, uint32_t param4 = 0, uint32_t param5 = 0, - uint32_t padding1 = 0 ) : + uint32_t param6 = 0 ) : ZoneChannelPacket< FFXIVIpcActorControlSelf >( actorId, actorId ) { - initialize( category, param1, param2, param3, param4, param5 ); + initialize( category, param1, param2, param3, param4, param5, param6 ); }; private: void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, - uint32_t param5 ) + uint32_t param5, uint32_t param6 ) { m_data.padding = 0; m_data.category = category; @@ -39,6 +39,7 @@ namespace Sapphire::Network::Packets::Server m_data.param3 = param3; m_data.param4 = param4; m_data.param5 = param5; + m_data.param6 = param6; }; }; diff --git a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h index 7ddbe23d..9e8df9e0 100644 --- a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h @@ -8,6 +8,8 @@ #include "Forwards.h" #include "Inventory/Item.h" #include "StatusEffect/StatusEffect.h" +#include "Territory/Territory.h" +#include "Event/Director.h" namespace Sapphire::Network::Packets::Server { @@ -143,6 +145,10 @@ namespace Sapphire::Network::Packets::Server m_data.effect[ effect.first ].param = effect.second->getParam(); } + if( auto d = player.getCurrentTerritory()->getAsDirector() ) + { + m_data.directorId = d->getDirectorId(); + } }; }; diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 8559014a..ad9e08fb 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -377,7 +377,7 @@ void Sapphire::InstanceContent::onTalk( Sapphire::Entity::Player& player, uint32 return; if( auto onTalk = it->second->getOnTalkHandler() ) - onTalk( player, it->second, getAsInstanceContent(), actorId ); + onTalk( player, it->second, getAsInstanceContent(), eventId, actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId ); diff --git a/src/world/Territory/PublicContent.cpp b/src/world/Territory/PublicContent.cpp index 55fc26e1..0285f92f 100644 --- a/src/world/Territory/PublicContent.cpp +++ b/src/world/Territory/PublicContent.cpp @@ -106,7 +106,7 @@ void Sapphire::PublicContent::onDirectorSync( Entity::Player& player ) void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& player ) { - if( m_pEntranceEObj != nullptr ) + /*if( m_pEntranceEObj != nullptr ) { player.setRot( PI ); player.setPos( m_pEntranceEObj->getPos() ); @@ -115,7 +115,7 @@ void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& pl { player.setRot( PI ); player.setPos( { 0.f, 0.f, 0.f } ); - } + }*/ player.resetObjSpawnIndex(); } @@ -144,6 +144,15 @@ void Sapphire::PublicContent::onRegisterEObj( Entity::EventObjectPtr object ) std::to_string( object->getObjectId() ) ); } +Sapphire::Entity::EventObjectPtr Sapphire::PublicContent::getEObjByName( const std::string& name ) +{ + auto it = m_eventObjectMap.find( name ); + if( it == m_eventObjectMap.end() ) + return nullptr; + + return it->second; +} + void Sapphire::PublicContent::clearDirector( Entity::Player& player ) { sendDirectorClear( player ); @@ -157,7 +166,7 @@ void Sapphire::PublicContent::onTalk( Sapphire::Entity::Player& player, uint32_t return; if( auto onTalk = it->second->getOnTalkHandler() ) - onTalk( player, it->second, getAsPublicContent(), actorId ); + onTalk( player, it->second, getAsPublicContent(), eventId, actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId ); diff --git a/src/world/Territory/PublicContent.h b/src/world/Territory/PublicContent.h index b9d62b07..e765cf3a 100644 --- a/src/world/Territory/PublicContent.h +++ b/src/world/Territory/PublicContent.h @@ -48,6 +48,8 @@ namespace Sapphire uint32_t getContentId() const; + Entity::EventObjectPtr getEObjByName( const std::string& name ); + void clearDirector( Entity::Player& player ); void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index 675d00b3..5db5aeec 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -330,7 +330,7 @@ void Sapphire::QuestBattle::onTalk( Sapphire::Entity::Player& player, uint32_t e return; if( auto onTalkHandler = it->second->getOnTalkHandler() ) - onTalkHandler( player, it->second, getAsQuestBattle(), actorId ); + onTalkHandler( player, it->second, getAsQuestBattle(), eventId, actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId );