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:
commit
b3497ee06f
13 changed files with 77 additions and 26 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
@ -1490,7 +1497,7 @@ void Core::Entity::Player::sendZonePackets()
|
||||||
|
|
||||||
if( isLogin() )
|
if( isLogin() )
|
||||||
{
|
{
|
||||||
queuePacket(ActorControlPacket143( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) );
|
queuePacket( ActorControlPacket143( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// set flags, will be reset automatically by zoning ( only on client side though )
|
// set flags, will be reset automatically by zoning ( only on client side though )
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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() ) );
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||||
if( m_playerMap.size() < 1 )
|
if( m_playerMap.size() < 1 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto& playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
if( !playerIt.second->isLoadingComplete() ||
|
if( !playerIt.second->isLoadingComplete() ||
|
||||||
!playerIt.second->isDirectorInitialized() ||
|
!playerIt.second->isDirectorInitialized() ||
|
||||||
|
@ -110,7 +110,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto& playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
auto pPlayer = playerIt.second;
|
auto pPlayer = playerIt.second;
|
||||||
pPlayer->queuePacket(
|
pPlayer->queuePacket(
|
||||||
|
@ -222,7 +222,7 @@ void Core::InstanceContent::setVar( uint8_t index, uint8_t value )
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: genericise this?
|
// todo: genericise this?
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto& playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
sendDirectorVars( *playerIt.second );
|
sendDirectorVars( *playerIt.second );
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,7 @@ void Core::InstanceContent::setSequence( uint8_t value )
|
||||||
{
|
{
|
||||||
setDirectorSequence( value );
|
setDirectorSequence( value );
|
||||||
|
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto& playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
sendDirectorVars( *playerIt.second );
|
sendDirectorVars( *playerIt.second );
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ void Core::InstanceContent::setBranch( uint8_t value )
|
||||||
{
|
{
|
||||||
setDirectorBranch( value );
|
setDirectorBranch( value );
|
||||||
|
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto& playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
sendDirectorVars( *playerIt.second );
|
sendDirectorVars( *playerIt.second );
|
||||||
}
|
}
|
||||||
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
@ -279,7 +279,7 @@ void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player
|
||||||
player.resetObjSpawnIndex( );
|
player.resetObjSpawnIndex( );
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::string &name )
|
Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::string& name )
|
||||||
{
|
{
|
||||||
auto it = m_eventObjectMap.find( name );
|
auto it = m_eventObjectMap.find( name );
|
||||||
if( it == m_eventObjectMap.end() )
|
if( it == m_eventObjectMap.end() )
|
||||||
|
@ -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 );
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue