1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-24 05:37:45 +00:00

Merge pull request #265 from NotAdam/actor_rewrite

fix onEnterTerritory events, eventstart handling for instances
This commit is contained in:
Mordred 2018-03-05 21:07:46 +01:00 committed by GitHub
commit b3497ee06f
13 changed files with 77 additions and 26 deletions

View file

@ -73,6 +73,7 @@ namespace Packets {
Playtime = 0x00DF, // updated 4.2 Playtime = 0x00DF, // updated 4.2
CFRegistered = 0x00B8, // updated 4.1 CFRegistered = 0x00B8, // updated 4.1
SocialRequestResponse = 0x00BB, // updated 4.1 SocialRequestResponse = 0x00BB, // updated 4.1
CancelAllianceForming = 0x00C6, // updated 4.2
Chat = 0x00E1, // updated 4.2 Chat = 0x00E1, // updated 4.2
SocialList = 0x00E7, // updated 4.2 SocialList = 0x00E7, // updated 4.2

View file

@ -999,7 +999,7 @@ struct FFXIVIpcEventStart : FFXIVIpcBasePacket<EventStart>
/* 000D */ uint8_t param2; /* 000D */ uint8_t param2;
/* 000E */ uint16_t padding; /* 000E */ uint16_t padding;
/* 0010 */ uint32_t param3; /* 0010 */ uint32_t param3;
/* 0014 */ uint32_t padding1; /* 0014 */ uint32_t contentId;
}; };

View file

@ -98,6 +98,13 @@ Core::Entity::Player::~Player()
{ {
} }
void Core::Entity::Player::injectPacket( std::string path )
{
auto session = g_serverZone.getSession( getId() );
if( session )
session->getZoneConnection()->injectPacket( path, *this );
}
// TODO: add a proper calculation based on race / job / level / gear // TODO: add a proper calculation based on race / job / level / gear
uint32_t Core::Entity::Player::getMaxHp() uint32_t Core::Entity::Player::getMaxHp()
{ {
@ -1480,7 +1487,7 @@ uint32_t Core::Entity::Player::getTerritoryId() const
void Core::Entity::Player::sendZonePackets() void Core::Entity::Player::sendZonePackets()
{ {
getCurrentZone()->onBeforeEnterTerritory( *this ); getCurrentZone()->onBeforePlayerZoneIn( *this );
ZoneChannelPacket< FFXIVIpcInit > initPacket( getId() ); ZoneChannelPacket< FFXIVIpcInit > initPacket( getId() );
initPacket.data().charId = getId(); initPacket.data().charId = getId();
@ -1547,7 +1554,7 @@ void Core::Entity::Player::sendZonePackets()
if( getLastPing() == 0 ) if( getLastPing() == 0 )
sendQuestInfo(); sendQuestInfo();
getCurrentZone()->onEnterTerritory( *this ); getCurrentZone()->onPlayerZoneIn( *this );
m_bMarkedForZoning = false; m_bMarkedForZoning = false;
} }

View file

@ -45,6 +45,8 @@ public:
void autoAttack( CharaPtr pTarget ) override; void autoAttack( CharaPtr pTarget ) override;
void injectPacket( std::string path );
// EventHandlers // EventHandlers
////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////
/*! start an event action */ /*! start an event action */
@ -52,7 +54,7 @@ public:
/*! start an event item action */ /*! start an event item action */
void eventItemActionStart( uint32_t eventId, uint32_t action, ActionCallback finishCallback, ActionCallback interruptCallback, uint64_t additional ); void eventItemActionStart( uint32_t eventId, uint32_t action, ActionCallback finishCallback, ActionCallback interruptCallback, uint64_t additional );
/*! start/register a normal event */ /*! start/register a normal event */
void eventStart( uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventParam, uint8_t eventParam1, uint32_t eventParam2 ); void eventStart( uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventParam, uint8_t eventParam1, uint32_t eventParam2, uint32_t contentId = 0 );
/*! play a subevent */ /*! play a subevent */
void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 );
/*! play a subevent */ /*! play a subevent */

View file

@ -77,7 +77,7 @@ void Core::Entity::Player::checkEvent( uint32_t eventId )
void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId,
Event::EventHandler::EventType eventType, uint8_t eventParam1, Event::EventHandler::EventType eventType, uint8_t eventParam1,
uint32_t eventParam2 ) uint32_t eventParam2, uint32_t contentId )
{ {
auto newEvent = Event::make_EventHandler( this, actorId, eventId, eventType, eventParam2 ); auto newEvent = Event::make_EventHandler( this, actorId, eventId, eventType, eventParam2 );
@ -86,7 +86,7 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId,
setStateFlag( PlayerStateFlag::InNpcEvent ); setStateFlag( PlayerStateFlag::InNpcEvent );
EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2 ); EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2, contentId );
queuePacket( eventStart ); queuePacket( eventStart );

View file

@ -158,9 +158,22 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G
player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) ); player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) );
player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId() ); player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId(), 0 );
if( auto instance = player.getCurrentInstance() )
{
// param2 of eventStart
// 0 = default state?
// 1 = restore state?
player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId(), instance->getDirectorId() & 0xFFFF );
instance->onEnterTerritory( player, eventId, param1, param2 );
}
else
{
player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId() );
g_scriptMgr.onEnterTerritory( player, eventId, param1, param2 ); g_scriptMgr.onEnterTerritory( player, eventId, param1, param2 );
}
player.checkEvent( eventId ); player.checkEvent( eventId );
} }

View file

@ -20,10 +20,11 @@ public:
uint32_t eventId, uint32_t eventId,
uint8_t param1 = 0, uint8_t param1 = 0,
uint8_t param2 = 0, uint8_t param2 = 0,
uint32_t param3 = 0 ) : uint32_t param3 = 0,
uint32_t contentId = 0 ) :
ZoneChannelPacket< FFXIVIpcEventStart >( playerId, playerId ) ZoneChannelPacket< FFXIVIpcEventStart >( playerId, playerId )
{ {
initialize( actorId, eventId, param1, param2, param3 ); initialize( actorId, eventId, param1, param2, param3, contentId );
}; };
private: private:
@ -31,13 +32,15 @@ private:
uint32_t eventId, uint32_t eventId,
uint8_t param1, uint8_t param1,
uint8_t param2, uint8_t param2,
uint32_t param3 ) uint32_t param3,
uint32_t contentId )
{ {
m_data.actorId = actorId; m_data.actorId = actorId;
m_data.eventId = eventId; m_data.eventId = eventId;
m_data.param1 = param1; m_data.param1 = param1;
m_data.param2 = param2; m_data.param2 = param2;
m_data.param3 = param3; m_data.param3 = param3;
m_data.contentId = contentId;
}; };
}; };

View file

@ -360,6 +360,18 @@ bool Core::Scripting::ScriptManager::onInstanceUpdate( InstanceContentPtr instan
return false; return false;
} }
bool Core::Scripting::ScriptManager::onInstanceEnterTerritory( InstanceContentPtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 )
{
auto script = m_nativeScriptManager->getScript< InstanceContentScript >( instance->getDirectorId() );
if( script )
{
script->onEnterTerritory( player, eventId, param1, param2 );
return true;
}
return false;
}
Scripting::NativeScriptManager& Core::Scripting::ScriptManager::getNativeScriptHandler() Scripting::NativeScriptManager& Core::Scripting::ScriptManager::getNativeScriptHandler()
{ {
return *m_nativeScriptManager; return *m_nativeScriptManager;

View file

@ -59,6 +59,7 @@ namespace Core
bool onInstanceInit( InstanceContentPtr instance ); bool onInstanceInit( InstanceContentPtr instance );
bool onInstanceUpdate( InstanceContentPtr instance, uint32_t currTime ); bool onInstanceUpdate( InstanceContentPtr instance, uint32_t currTime );
bool onInstanceEnterTerritory( InstanceContentPtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 );
void loadDir( const std::string& dirname, std::set<std::string> &files, const std::string& ext ); void loadDir( const std::string& dirname, std::set<std::string> &files, const std::string& ext );

View file

@ -63,9 +63,9 @@ Core::Data::ExdDataGenerated::InstanceContentPtr Core::InstanceContent::getInsta
return m_instanceContentInfo; return m_instanceContentInfo;
} }
void Core::InstanceContent::onEnterTerritory( Entity::Player& player ) void Core::InstanceContent::onPlayerZoneIn( Entity::Player& player )
{ {
g_log.debug( "InstanceContent::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" g_log.debug( "InstanceContent::onPlayerZoneIn: Zone#" + std::to_string( getGuId() ) + "|"
+ std::to_string( getInstanceContentId() ) + + std::to_string( getInstanceContentId() ) +
+ ", Entity#" + std::to_string( player.getId() ) ); + ", Entity#" + std::to_string( player.getId() ) );
@ -263,7 +263,7 @@ void Core::InstanceContent::onRegisterEObj( Entity::EventObjectPtr object )
g_log.error( "InstanceContent::onRegisterEObj Zone " + m_internalName + ": No EObj data found for EObj with ID: " + std::to_string( object->getObjectId() ) ); g_log.error( "InstanceContent::onRegisterEObj Zone " + m_internalName + ": No EObj data found for EObj with ID: " + std::to_string( object->getObjectId() ) );
} }
void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player ) void Core::InstanceContent::onBeforePlayerZoneIn( Core::Entity::Player& player )
{ {
if( m_pEntranceEObj != nullptr ) if( m_pEntranceEObj != nullptr )
{ {
@ -302,3 +302,8 @@ void Core::InstanceContent::onTalk( Core::Entity::Player& player, uint32_t event
player.sendDebug( "No onTalk handler found for interactable eobj with EObjID: " + player.sendDebug( "No onTalk handler found for interactable eobj with EObjID: " +
std::to_string( it->second->getObjectId() ) + ", eventId: " + std::to_string( eventId ) ); std::to_string( it->second->getObjectId() ) + ", eventId: " + std::to_string( eventId ) );
} }
void Core::InstanceContent::onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 )
{
g_scriptMgr.onInstanceEnterTerritory( getAsInstanceContent(), player, eventId, param1, param2 );
}

View file

@ -30,13 +30,14 @@ public:
virtual ~InstanceContent(); virtual ~InstanceContent();
bool init() override; bool init() override;
void onBeforeEnterTerritory( Entity::Player& player ) override; void onBeforePlayerZoneIn( Entity::Player& player ) override;
void onEnterTerritory( Entity::Player& player ) override; void onPlayerZoneIn( Entity::Player& player ) override;
void onLeaveTerritory( Entity::Player& player ) override; void onLeaveTerritory( Entity::Player& player ) override;
void onFinishLoading( Entity::Player& player ) override; void onFinishLoading( Entity::Player& player ) override;
void onInitDirector( Entity::Player& player ) override; void onInitDirector( Entity::Player& player ) override;
void onUpdate( uint32_t currTime ) override; void onUpdate( uint32_t currTime ) override;
void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId );
void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override;
void onRegisterEObj( Entity::EventObjectPtr object ) override; void onRegisterEObj( Entity::EventObjectPtr object ) override;

View file

@ -631,7 +631,7 @@ void Core::Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell )
} }
} }
void Core::Zone::onEnterTerritory( Entity::Player& player ) void Core::Zone::onPlayerZoneIn( Entity::Player &player )
{ {
g_log.debug( "Zone::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) + g_log.debug( "Zone::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) +
+ ", Entity#" + std::to_string( player.getId() ) ); + ", Entity#" + std::to_string( player.getId() ) );
@ -658,6 +658,11 @@ void Core::Zone::onInitDirector( Entity::Player& player )
} }
void Core::Zone::onEnterTerritory( Core::Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 )
{
}
void Core::Zone::registerEObj( Entity::EventObjectPtr object ) void Core::Zone::registerEObj( Entity::EventObjectPtr object )
{ {
if( !object ) if( !object )

View file

@ -73,13 +73,14 @@ public:
virtual void loadCellCache(); virtual void loadCellCache();
virtual uint32_t getTerritoryId() const; virtual uint32_t getTerritoryId() const;
virtual void onBeforeEnterTerritory( Entity::Player& player ) {}; virtual void onBeforePlayerZoneIn( Entity::Player &player ) {};
virtual void onEnterTerritory( Entity::Player& player ); virtual void onPlayerZoneIn( Entity::Player &player );
virtual void onFinishLoading( Entity::Player& player ); virtual void onFinishLoading( Entity::Player& player );
virtual void onInitDirector( Entity::Player& player ); virtual void onInitDirector( Entity::Player& player );
virtual void onLeaveTerritory( Entity::Player& player ); virtual void onLeaveTerritory( Entity::Player& player );
virtual void onUpdate( uint32_t currTime ); virtual void onUpdate( uint32_t currTime );
virtual void onRegisterEObj( Entity::EventObjectPtr object ) {}; virtual void onRegisterEObj( Entity::EventObjectPtr object ) {};
virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 );
Common::Weather getNextWeather(); Common::Weather getNextWeather();