diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 76322136..49b67bd9 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -73,6 +73,7 @@ namespace Packets { Playtime = 0x00DF, // updated 4.2 CFRegistered = 0x00B8, // updated 4.1 SocialRequestResponse = 0x00BB, // updated 4.1 + CancelAllianceForming = 0x00C6, // updated 4.2 Chat = 0x00E1, // updated 4.2 SocialList = 0x00E7, // updated 4.2 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 071ebc50..4cd5349b 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -999,7 +999,7 @@ struct FFXIVIpcEventStart : FFXIVIpcBasePacket /* 000D */ uint8_t param2; /* 000E */ uint16_t padding; /* 0010 */ uint32_t param3; - /* 0014 */ uint32_t padding1; + /* 0014 */ uint32_t contentId; }; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 85090868..5d94a554 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -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 uint32_t Core::Entity::Player::getMaxHp() { @@ -1480,7 +1487,7 @@ uint32_t Core::Entity::Player::getTerritoryId() const void Core::Entity::Player::sendZonePackets() { - getCurrentZone()->onBeforeEnterTerritory( *this ); + getCurrentZone()->onBeforePlayerZoneIn( *this ); ZoneChannelPacket< FFXIVIpcInit > initPacket( getId() ); initPacket.data().charId = getId(); @@ -1490,7 +1497,7 @@ void Core::Entity::Player::sendZonePackets() 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 ) @@ -1547,7 +1554,7 @@ void Core::Entity::Player::sendZonePackets() if( getLastPing() == 0 ) sendQuestInfo(); - getCurrentZone()->onEnterTerritory( *this ); + getCurrentZone()->onPlayerZoneIn( *this ); m_bMarkedForZoning = false; } diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 89d4ff69..39806a55 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -45,6 +45,8 @@ public: void autoAttack( CharaPtr pTarget ) override; + void injectPacket( std::string path ); + // EventHandlers ////////////////////////////////////////////////////////////////////////////////////////////////////// /*! start an event action */ @@ -52,7 +54,7 @@ public: /*! start an event item action */ void eventItemActionStart( uint32_t eventId, uint32_t action, ActionCallback finishCallback, ActionCallback interruptCallback, uint64_t additional ); /*! 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 */ void eventPlay( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); /*! play a subevent */ diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index b0ba4679..c9f25c82 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -77,7 +77,7 @@ void Core::Entity::Player::checkEvent( uint32_t eventId ) void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, 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 ); @@ -86,7 +86,7 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, setStateFlag( PlayerStateFlag::InNpcEvent ); - EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2 ); + EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2, contentId ); queuePacket( eventStart ); diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index d44e0241..a04288b9 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -158,9 +158,22 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G 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 ); - g_scriptMgr.onEnterTerritory( player, eventId, param1, param2 ); + 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 ); + } player.checkEvent( eventId ); } diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EventStartPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EventStartPacket.h index 2109c856..963c138f 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/EventStartPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EventStartPacket.h @@ -20,10 +20,11 @@ public: uint32_t eventId, uint8_t param1 = 0, uint8_t param2 = 0, - uint32_t param3 = 0 ) : + uint32_t param3 = 0, + uint32_t contentId = 0 ) : ZoneChannelPacket< FFXIVIpcEventStart >( playerId, playerId ) { - initialize( actorId, eventId, param1, param2, param3 ); + initialize( actorId, eventId, param1, param2, param3, contentId ); }; private: @@ -31,13 +32,15 @@ private: uint32_t eventId, uint8_t param1, uint8_t param2, - uint32_t param3 ) + uint32_t param3, + uint32_t contentId ) { m_data.actorId = actorId; m_data.eventId = eventId; m_data.param1 = param1; m_data.param2 = param2; m_data.param3 = param3; + m_data.contentId = contentId; }; }; diff --git a/src/servers/sapphire_zone/Script/ScriptManager.cpp b/src/servers/sapphire_zone/Script/ScriptManager.cpp index 5ab27cc0..99d77499 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/ScriptManager.cpp @@ -360,6 +360,18 @@ bool Core::Scripting::ScriptManager::onInstanceUpdate( InstanceContentPtr instan 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() { return *m_nativeScriptManager; diff --git a/src/servers/sapphire_zone/Script/ScriptManager.h b/src/servers/sapphire_zone/Script/ScriptManager.h index 39b702cb..e872d9f2 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.h +++ b/src/servers/sapphire_zone/Script/ScriptManager.h @@ -59,6 +59,7 @@ namespace Core bool onInstanceInit( InstanceContentPtr instance ); 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 &files, const std::string& ext ); diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 58a6fa7c..14bb06b1 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -63,9 +63,9 @@ Core::Data::ExdDataGenerated::InstanceContentPtr Core::InstanceContent::getInsta 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() ) + + ", Entity#" + std::to_string( player.getId() ) ); @@ -102,7 +102,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) if( m_playerMap.size() < 1 ) return; - for( const auto &playerIt : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { if( !playerIt.second->isLoadingComplete() || !playerIt.second->isDirectorInitialized() || @@ -110,7 +110,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) return; } - for( const auto &playerIt : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { auto pPlayer = playerIt.second; pPlayer->queuePacket( @@ -222,7 +222,7 @@ void Core::InstanceContent::setVar( uint8_t index, uint8_t value ) } // todo: genericise this? - for( const auto &playerIt : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { sendDirectorVars( *playerIt.second ); } @@ -232,7 +232,7 @@ void Core::InstanceContent::setSequence( uint8_t value ) { setDirectorSequence( value ); - for( const auto &playerIt : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { sendDirectorVars( *playerIt.second ); } @@ -242,7 +242,7 @@ void Core::InstanceContent::setBranch( uint8_t value ) { setDirectorBranch( value ); - for( const auto &playerIt : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { 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() ) ); } -void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player ) +void Core::InstanceContent::onBeforePlayerZoneIn( Core::Entity::Player& player ) { if( m_pEntranceEObj != nullptr ) { @@ -279,7 +279,7 @@ void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player 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 ); 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: " + 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 ); +} diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index e2aeb8ad..fb5305e5 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -30,13 +30,14 @@ public: virtual ~InstanceContent(); bool init() override; - void onBeforeEnterTerritory( Entity::Player& player ) override; - void onEnterTerritory( Entity::Player& player ) override; + void onBeforePlayerZoneIn( Entity::Player& player ) override; + void onPlayerZoneIn( Entity::Player& player ) override; void onLeaveTerritory( Entity::Player& player ) override; void onFinishLoading( Entity::Player& player ) override; void onInitDirector( Entity::Player& player ) override; void onUpdate( uint32_t currTime ) override; 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; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 03c42ada..aded0dbc 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -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() ) + + ", 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 ) { if( !object ) diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index de83e10f..ae747869 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -73,13 +73,14 @@ public: virtual void loadCellCache(); virtual uint32_t getTerritoryId() const; - virtual void onBeforeEnterTerritory( Entity::Player& player ) {}; - virtual void onEnterTerritory( Entity::Player& player ); + virtual void onBeforePlayerZoneIn( Entity::Player &player ) {}; + virtual void onPlayerZoneIn( Entity::Player &player ); virtual void onFinishLoading( Entity::Player& player ); virtual void onInitDirector( Entity::Player& player ); virtual void onLeaveTerritory( Entity::Player& player ); virtual void onUpdate( uint32_t currTime ); virtual void onRegisterEObj( Entity::EventObjectPtr object ) {}; + virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ); Common::Weather getNextWeather();