From 1235ce264bf33cf6f27b5aebcc2d498b42c10433 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 25 Feb 2018 15:16:42 +1100 Subject: [PATCH 1/3] more opcodes --- src/common/Network/PacketDef/Ipcs.h | 2 ++ .../sapphire_zone/Network/Handlers/ActionHandler.cpp | 3 +++ src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 6 +++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a7892f9e..fc4a1da2 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -206,6 +206,8 @@ namespace Packets { FcInfoReqHandler = 0x011A, // updated 4.2 + + ReqJoinNoviceNetwork = 0x0129, // updated 4.2 ReqCountdownInitiate = 0x012C, // updated 4.2 ReqCountdownCancel = 0x012D, // updated 4.2 diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index 00cc62d0..6915f69b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -73,6 +73,8 @@ enum ClientTrigger DyeItem = 0x1B5, + RequestChocoboInventory = 0x1C4, + Emote = 0x1F4, PersistantEmoteCancel = 0x1F7, PoseChange = 0x1F9, @@ -95,6 +97,7 @@ enum ClientTrigger CompanionSetBarding = 0x6A5, CompanionActionUnlock = 0x6A6, + OpenPerformInstrumentUI = 0x71C, }; void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& inPacket, diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 18ae16c2..ed4c1513 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -115,9 +115,9 @@ bool Core::TerritoryMgr::createDefaultTerritories() g_log.Log( LoggingSeverity::info, std::to_string( territoryId ) + "\t" + std::to_string( guid ) + "\t" + std::to_string( territoryInfo->territoryIntendedUse ) + - "\t" + territoryInfo->name + - "\t" + pPlaceName->name + - "\t" + ( isPrivateTerritory( territoryId ) ? "PRIVATE" : "PUBLIC" ) ); + "\t" + ( territoryInfo->name.length() <= 4 ? territoryInfo->name + "\t" : territoryInfo->name ) + + "\t" + ( isPrivateTerritory( territoryId ) ? "PRIVATE" : "PUBLIC" ) + + "\t" + pPlaceName->name ); auto pZone = make_Zone( territoryId, guid, territoryInfo->name, pPlaceName->name ); pZone->init(); From 3cf0a233b1a64aef25c91da3c4636bcd27ec711b Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 25 Feb 2018 17:23:52 +1100 Subject: [PATCH 2/3] redirect ontalk events inside instances to instancecontent ptr --- src/servers/sapphire_zone/Actor/Actor.cpp | 6 ++++ src/servers/sapphire_zone/Actor/Actor.h | 2 ++ .../DebugCommand/DebugCommandHandler.cpp | 2 +- .../Network/Handlers/EventHandlers.cpp | 8 +++++- .../sapphire_zone/Script/NativeScriptApi.h | 4 +-- .../sapphire_zone/Zone/InstanceContent.cpp | 7 ++++- .../sapphire_zone/Zone/InstanceContent.h | 1 + src/servers/sapphire_zone/Zone/Zone.cpp | 28 ------------------- src/servers/sapphire_zone/Zone/Zone.h | 1 - 9 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index f1db8533..7c855c43 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -313,6 +313,12 @@ void Core::Entity::Actor::setCurrentZone( ZonePtr currZone ) m_pCurrentZone = currZone; } +/*! \return InstanceContentPtr to the current instance, null if not an instance or not set */ +Core::InstanceContentPtr Core::Entity::Actor::getCurrentInstance() const +{ + return getCurrentZone()->getAsInstanceContent(); +} + /*! Get the current cell of a region the actor is in diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index 94502c0d..54916754 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -124,6 +124,8 @@ namespace Entity { ZonePtr getCurrentZone() const; void setCurrentZone( ZonePtr currZone ); + InstanceContentPtr getCurrentInstance() const; + // get the current cell of a region the actor is in Cell* getCellPtr(); // set the current cell diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 14a938c7..46241c87 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -734,7 +734,7 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo if( !obj ) return; - instance->updateEObj(obj); + //instance->updateEObj(obj); } else if( subCommand == "objstate" ) { diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 692fc1a5..d44e0241 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -20,6 +20,7 @@ #include "Actor/Player.h" #include "Forwards.h" #include "Event/EventHelper.h" +#include "Zone/InstanceContent.h" extern Core::Data::ExdDataGenerated g_exdDataGen; extern Core::Scripting::ScriptManager g_scriptMgr; @@ -49,7 +50,12 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& player.sendDebug( "Calling: " + objName + "." + eventName ); player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); - if( !g_scriptMgr.onTalk( player, actorId, eventId ) && + + if( auto instance = player.getCurrentInstance() ) + { + instance->onTalk( player, eventId, actorId ); + } + else if( !g_scriptMgr.onTalk( player, actorId, eventId ) && eventType == Event::EventHandler::EventHandlerType::Quest ) { auto questInfo = g_exdDataGen.get< Core::Data::Quest >( eventId ); diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index 058195c6..f65f93f4 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -87,7 +87,7 @@ public: virtual void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) { } virtual void onNpcKill( uint32_t npcId, Entity::Player& player ) { } virtual void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Entity::Player& player ) { } - virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } + virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } virtual void onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { } virtual void onOutsideRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { } virtual void onEventItem( Entity::Player& player, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId ) { } @@ -122,7 +122,7 @@ public: virtual void onInit( InstanceContentPtr instance ) { } virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { } - virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } + virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } }; #endif \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index ee0a032a..2b8682a0 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -13,6 +13,8 @@ #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" +#include "Event/EventHandler.h" + extern Core::Logger g_log; extern Core::Scripting::ScriptManager g_scriptMgr; @@ -253,4 +255,7 @@ Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::st return it->second; } - +void Core::InstanceContent::onTalk( Core::Entity::Player& player, uint32_t eventId, uint64_t actorId ) +{ + auto type = static_cast< Core::Event::EventHandler::EventType >( eventId >> 16 ); +} diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 184dde51..b42dc47d 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -34,6 +34,7 @@ public: 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 onRegisterEObj( Entity::EventObjectPtr object ) override; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index b679ce83..1df0f389 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -679,34 +679,6 @@ Core::Entity::EventObjectPtr Core::Zone::getEObj( uint32_t objId ) return obj->second; } -// TODO: this is located wrong. state change should happen in the object and it should send to his in range set. -void Core::Zone::updateEObj( Entity::EventObjectPtr object ) -{ - if( !object ) - return; - - for( const auto& playerIt : m_playerMap ) - { - // send that packet with le data - ZoneChannelPacket< FFXIVIpcObjectSpawn > eobjStatePacket( playerIt.second->getId() ); - eobjStatePacket.data().objKind = object->getObjKind(); - eobjStatePacket.data().state = object->getState(); - eobjStatePacket.data().objId = object->getId(); - eobjStatePacket.data().hierachyId = object->getMapLinkId(); - eobjStatePacket.data().position = object->getPos(); - - // ???? - //eobjStatePacket.data().levelId = 4236873; - //eobjStatePacket.data().unknown2 = 5; - //eobjStatePacket.data().unknown1C = 1065353216; - //eobjStatePacket.data().unknown20 = 2147423605; - //eobjStatePacket.data().actorId = 1074105831; - //eobjStatePacket.data().unknown = 1; - - playerIt.second->queuePacket( eobjStatePacket ); - } -} - Core::InstanceContentPtr Core::Zone::getAsInstanceContent() { return boost::dynamic_pointer_cast< InstanceContent, Zone >( shared_from_this() ); diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 048421c7..097100c9 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -113,7 +113,6 @@ public: void registerEObj( Entity::EventObjectPtr object ); Entity::EventObjectPtr getEObj( uint32_t objId ); - void updateEObj( Entity::EventObjectPtr object ); InstanceContentPtr getAsInstanceContent(); From 6b089af4af445492e814e6eea6da68fb7fc23c67 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 25 Feb 2018 17:24:00 +1100 Subject: [PATCH 3/3] cmake test --- src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt b/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt index 03c76b3c..907e3288 100644 --- a/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt +++ b/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt @@ -42,6 +42,10 @@ foreach(_scriptDir ${children}) add_library("script_${_name}" MODULE "${SCRIPT_BUILD_FILES}" "${SCRIPT_INCLUDE_FILES}" "${_scriptDir}/ScriptLoader.cpp") target_link_libraries("script_${_name}" sapphire_zone) + if(MSVC) + target_link_libraries("script_${_name}" ${Boost_LIBRARIES}) + endif() + if(MSVC) set_target_properties("script_${_name}" PROPERTIES CXX_STANDARD 14