1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-25 11:07:45 +00:00

more wedding stuff

This commit is contained in:
collett 2021-08-15 05:04:10 +09:00
parent 1e8e421dba
commit b2cc65e9ff
17 changed files with 212 additions and 42 deletions

View file

@ -1439,6 +1439,20 @@ namespace Sapphire::Network::Packets::Server
uint8_t unknown[8]; 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 > template< int ArgCount >
struct FFXIVIpcEventPlayN struct FFXIVIpcEventPlayN
{ {

View file

@ -76,4 +76,9 @@ uint16_t Util::floatToUInt16Rot( float val )
uint8_t Util::floatToUInt8Rot( float val ) uint8_t Util::floatToUInt8Rot( float val )
{ {
return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI ); return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI );
}
float Util::floatFromUInt16Rot( uint16_t rot )
{
return rot / 32768.0f * PI - PI;
} }

View file

@ -25,6 +25,8 @@ namespace Sapphire::Common::Util
uint16_t floatToUInt16Rot( float val ); uint16_t floatToUInt16Rot( float val );
float floatFromUInt16Rot( uint16_t rot );
uint8_t floatToUInt8Rot( float val ); uint8_t floatToUInt8Rot( float val );
template < typename T > template < typename T >

View file

@ -2,9 +2,16 @@
#include <Territory/InstanceContent.h> #include <Territory/InstanceContent.h>
#include "Actor/Player.h" #include "Actor/Player.h"
#include "Actor/EventObject.h"
#include "Territory/PublicContent.h" #include "Territory/PublicContent.h"
#include <Util/UtilMath.h>
#include "Network/CommonActorControl.h"
#include "Network/PacketWrappers/ActorControlSelfPacket.h"
using namespace Sapphire; 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 class SanctumOfTheTwelve : public Sapphire::ScriptAPI::PublicContentScript
{ {
@ -13,7 +20,20 @@ public:
void onInit( PublicContent& instance ) override 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 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 void onEnterTerritory( PublicContent& instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override
{ {
player.setPosAndSendActorMove( 0, 250, -50, player.getRot() ); auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result )
player.directorPlayScene( instance.getDirectorId(), 1, NONE, 0, 0, 0 ); {
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 void onDebug( Entity::Player& player, uint32_t param ) override

View file

@ -3,6 +3,7 @@
//ACTOR1 = CEREMONYSHOP01578 //ACTOR1 = CEREMONYSHOP01578
//_ACTOR1 SET!! //_ACTOR1 SET!!
//SCENE_100 REMOVED!! //SCENE_100 REMOVED!!
#include <ctime>
#include <Actor/Player.h> #include <Actor/Player.h>
#include <ScriptObject.h> #include <ScriptObject.h>
#include <Service.h> #include <Service.h>
@ -12,11 +13,16 @@
#include "Network/PacketWrappers/ActorControlSelfPacket.h" #include "Network/PacketWrappers/ActorControlSelfPacket.h"
using namespace Sapphire; 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 class SubCts999 : public Sapphire::ScriptAPI::EventScript
{ {
private:
TerritoryPtr currentInstance;
public: public:
SubCts999() : Sapphire::ScriptAPI::EventScript( 67114 ){}; SubCts999() : Sapphire::ScriptAPI::EventScript( 67114 ){ currentInstance = nullptr; };
~SubCts999() = default; ~SubCts999() = default;
//SEQ_0, 1 entries //SEQ_0, 1 entries
@ -416,7 +422,7 @@ private:
} }
if( type == 4 ) // BASE_ID_TERRITORY_TYPE = unknown 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 Scene00067( player ); // Scene00067: Normal(SetWeddingFestivalParam), id=unknown
break; break;
} }
@ -451,7 +457,7 @@ private:
} }
if( type == 4 ) // BASE_ID_TERRITORY_TYPE = unknown 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 Scene00073( player ); // Scene00073: Normal(FadeIn, SetWeddingFestivalParam), id=unknown
break; break;
} }
@ -1365,12 +1371,25 @@ private:
player.sendDebug( "SubCts999:67114 calling Scene00070: Normal(Talk, YesNo, TargetCanMove, SystemTalk), id=ETOINELLE" ); player.sendDebug( "SubCts999:67114 calling Scene00070: Normal(Talk, YesNo, TargetCanMove, SystemTalk), id=ETOINELLE" );
auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result ) auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result )
{ {
//if( result.param1 > 0 && result.param2 == 1 ) if( result.param1 == 1024 && result.param3 == 2 )
//{ {
//} player.prepareZoning( 392, true, 1, 0, 0, 1, 8 );
checkProgressSeq12( player ); 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 ) void Scene00071( Entity::Player& player )
@ -1401,7 +1420,6 @@ private:
player.sendDebug( "SubCts999:67114 calling Scene00073: Normal(FadeIn, SetWeddingFestivalParam), id=unknown" ); player.sendDebug( "SubCts999:67114 calling Scene00073: Normal(FadeIn, SetWeddingFestivalParam), id=unknown" );
auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result ) auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result )
{ {
//checkProgressSeq12( player );
}; };
player.playScene( getId(), 73, HIDE_HOTBAR, callback ); player.playScene( getId(), 73, HIDE_HOTBAR, callback );
} }

View file

@ -13,7 +13,7 @@ namespace Sapphire::Entity
Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" ); Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" );
using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr, using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr,
TerritoryPtr, uint64_t ) >; TerritoryPtr, uint32_t, uint64_t ) >;
uint32_t getGimmickId() const; uint32_t getGimmickId() const;

View file

@ -1830,14 +1830,14 @@ void Sapphire::Entity::Player::sendZonePackets()
//setStateFlag( PlayerStateFlag::BetweenAreas ); //setStateFlag( PlayerStateFlag::BetweenAreas );
//setStateFlag( PlayerStateFlag::BetweenAreas1 ); //setStateFlag( PlayerStateFlag::BetweenAreas1 );
if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) )
sendHuntingLog();
sendStats(); sendStats();
// only initialize the UI if the player in fact just logged in. // only initialize the UI if the player in fact just logged in.
if( isLogin() ) if( isLogin() )
{ {
if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) )
sendHuntingLog();
auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() ); auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() );
for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ ) for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ )
@ -1898,18 +1898,31 @@ void Sapphire::Entity::Player::sendZonePackets()
if( auto d = getCurrentTerritory()->getAsDirector() ) if( auto d = getCurrentTerritory()->getAsDirector() )
{ {
struct UNK00EA : FFXIVIpcBasePacket< 0x00EA > if( d->getContentFinderConditionId() > 0 )
{ {
uint32_t unknown[4]; struct UNK00EA : FFXIVIpcBasePacket< 0x00EA >
}; {
auto p = makeZonePacket< UNK00EA >( getId() ); uint32_t unknown[4];
p->data().unknown[0] = d->getContentFinderConditionId(); };
p->data().unknown[2] = 1082270818; auto p2 = makeZonePacket< UNK00EA >( getId() );
queuePacket( p ); p2->data().unknown[0] = d->getContentFinderConditionId();
auto p2 = makeZonePacket< UNK00EA >( getId() ); p2->data().unknown[1] = 4;
p2->data().unknown[0] = d->getContentFinderConditionId(); queuePacket( p2 );
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 ); getCurrentTerritory()->onPlayerZoneIn( *this );

View file

@ -111,6 +111,8 @@ namespace Sapphire::Entity
void playSceneChain( uint32_t eventId, uint32_t scene, uint32_t flags, void playSceneChain( uint32_t eventId, uint32_t scene, uint32_t flags,
Event::EventHandler::SceneChainCallback sceneChainCallback ); 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 */ /*! setup the event and return a ptr to it */
Event::EventHandlerPtr bootstrapSceneEvent( uint32_t eventId, uint32_t flags ); Event::EventHandlerPtr bootstrapSceneEvent( uint32_t eventId, uint32_t flags );

View file

@ -323,6 +323,34 @@ void Sapphire::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlaye
unsetStateFlag( PlayerStateFlag::InNpcEvent ); 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, void Sapphire::Entity::Player::eventActionStart( uint32_t eventId,
uint32_t action, uint32_t action,
World::Action::ActionCallback finishCallback, World::Action::ActionCallback finishCallback,

View file

@ -1490,4 +1490,42 @@ void Sapphire::World::Manager::DebugCommandMgr::pc( char* data, Entity::Player&
instance->setBranch( branch ); 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 );
}
} }

View file

@ -380,15 +380,18 @@ void Sapphire::Network::GameConnection::pingHandler( const Packets::FFXIVARR_PAC
void Sapphire::Network::GameConnection::finishLoadingHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, void Sapphire::Network::GameConnection::finishLoadingHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player& player ) Entity::Player& player )
{ {
player.sendQuestInfo(); if( player.isLogin() )
{
player.sendQuestInfo();
// TODO: load and save this data instead of hardcoding // TODO: load and save this data instead of hardcoding
auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() ); auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() );
gcPacket->data().gcId = player.getGc(); gcPacket->data().gcId = player.getGc();
gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ]; gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ];
gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ]; gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ];
gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ]; gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ];
player.queuePacket( gcPacket ); player.queuePacket( gcPacket );
}
player.getCurrentTerritory()->onFinishLoading( player ); player.getCurrentTerritory()->onFinishLoading( player );

View file

@ -22,15 +22,15 @@ namespace Sapphire::Network::Packets::Server
uint32_t param3 = 0, uint32_t param3 = 0,
uint32_t param4 = 0, uint32_t param4 = 0,
uint32_t param5 = 0, uint32_t param5 = 0,
uint32_t padding1 = 0 ) : uint32_t param6 = 0 ) :
ZoneChannelPacket< FFXIVIpcActorControlSelf >( actorId, actorId ) ZoneChannelPacket< FFXIVIpcActorControlSelf >( actorId, actorId )
{ {
initialize( category, param1, param2, param3, param4, param5 ); initialize( category, param1, param2, param3, param4, param5, param6 );
}; };
private: private:
void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, 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.padding = 0;
m_data.category = category; m_data.category = category;
@ -39,6 +39,7 @@ namespace Sapphire::Network::Packets::Server
m_data.param3 = param3; m_data.param3 = param3;
m_data.param4 = param4; m_data.param4 = param4;
m_data.param5 = param5; m_data.param5 = param5;
m_data.param6 = param6;
}; };
}; };

View file

@ -8,6 +8,8 @@
#include "Forwards.h" #include "Forwards.h"
#include "Inventory/Item.h" #include "Inventory/Item.h"
#include "StatusEffect/StatusEffect.h" #include "StatusEffect/StatusEffect.h"
#include "Territory/Territory.h"
#include "Event/Director.h"
namespace Sapphire::Network::Packets::Server namespace Sapphire::Network::Packets::Server
{ {
@ -143,6 +145,10 @@ namespace Sapphire::Network::Packets::Server
m_data.effect[ effect.first ].param = effect.second->getParam(); m_data.effect[ effect.first ].param = effect.second->getParam();
} }
if( auto d = player.getCurrentTerritory()->getAsDirector() )
{
m_data.directorId = d->getDirectorId();
}
}; };
}; };

View file

@ -377,7 +377,7 @@ void Sapphire::InstanceContent::onTalk( Sapphire::Entity::Player& player, uint32
return; return;
if( auto onTalk = it->second->getOnTalkHandler() ) if( auto onTalk = it->second->getOnTalkHandler() )
onTalk( player, it->second, getAsInstanceContent(), actorId ); onTalk( player, it->second, getAsInstanceContent(), eventId, actorId );
else else
player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ",
it->second->getObjectId(), eventId ); it->second->getObjectId(), eventId );

View file

@ -106,7 +106,7 @@ void Sapphire::PublicContent::onDirectorSync( Entity::Player& player )
void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& player ) void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& player )
{ {
if( m_pEntranceEObj != nullptr ) /*if( m_pEntranceEObj != nullptr )
{ {
player.setRot( PI ); player.setRot( PI );
player.setPos( m_pEntranceEObj->getPos() ); player.setPos( m_pEntranceEObj->getPos() );
@ -115,7 +115,7 @@ void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& pl
{ {
player.setRot( PI ); player.setRot( PI );
player.setPos( { 0.f, 0.f, 0.f } ); player.setPos( { 0.f, 0.f, 0.f } );
} }*/
player.resetObjSpawnIndex(); player.resetObjSpawnIndex();
} }
@ -144,6 +144,15 @@ void Sapphire::PublicContent::onRegisterEObj( Entity::EventObjectPtr object )
std::to_string( object->getObjectId() ) ); 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 ) void Sapphire::PublicContent::clearDirector( Entity::Player& player )
{ {
sendDirectorClear( player ); sendDirectorClear( player );
@ -157,7 +166,7 @@ void Sapphire::PublicContent::onTalk( Sapphire::Entity::Player& player, uint32_t
return; return;
if( auto onTalk = it->second->getOnTalkHandler() ) if( auto onTalk = it->second->getOnTalkHandler() )
onTalk( player, it->second, getAsPublicContent(), actorId ); onTalk( player, it->second, getAsPublicContent(), eventId, actorId );
else else
player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ",
it->second->getObjectId(), eventId ); it->second->getObjectId(), eventId );

View file

@ -48,6 +48,8 @@ namespace Sapphire
uint32_t getContentId() const; uint32_t getContentId() const;
Entity::EventObjectPtr getEObjByName( const std::string& name );
void clearDirector( Entity::Player& player ); void clearDirector( Entity::Player& player );
void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId );

View file

@ -330,7 +330,7 @@ void Sapphire::QuestBattle::onTalk( Sapphire::Entity::Player& player, uint32_t e
return; return;
if( auto onTalkHandler = it->second->getOnTalkHandler() ) if( auto onTalkHandler = it->second->getOnTalkHandler() )
onTalkHandler( player, it->second, getAsQuestBattle(), actorId ); onTalkHandler( player, it->second, getAsQuestBattle(), eventId, actorId );
else else
player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ",
it->second->getObjectId(), eventId ); it->second->getObjectId(), eventId );