From b777f24195a0a574adc0e726e59277fe939b5ba3 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 2 Feb 2019 23:06:57 +1100 Subject: [PATCH 1/2] refactor minion to companion and add companion spawning --- src/common/Network/CommonActorControl.h | 8 ++++---- src/world/Actor/Player.cpp | 18 ++++++++++++++++++ src/world/Actor/Player.h | 6 ++++++ .../Network/Handlers/ClientTriggerHandler.cpp | 5 +++++ .../Network/PacketWrappers/InitUIPacket.h | 1 + .../Network/PacketWrappers/PlayerSpawnPacket.h | 1 + 6 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index b853f07f..77daeef4 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -122,9 +122,9 @@ enum ActorControlType : uint16_t ActorFadeOut = 0x10A, ActorFadeIn = 0x10B, WithdrawMsg = 0x10C, - OrderMinion = 0x10D, - ToggleMinion = 0x10E, - LearnMinion = 0x10F, + OrderCompanion = 0x10D, + ToggleCompanion = 0x10E, + LearnCompanion = 0x10F, ActorFateOut1 = 0x110, Emote = 0x122, @@ -278,7 +278,7 @@ enum ActorControlType : uint16_t ChangeTarget = 0x03, DismountReq = 0x65, - + SpawnCompanionReq = 0x66, RemoveStatusEffect = 0x68, CastCancel = 0x69, diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 9ccc85d2..76268f57 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1504,6 +1504,24 @@ void Sapphire::Entity::Player::dismount() m_mount = 0; } +void Sapphire::Entity::Player::spawnCompanion( uint16_t id ) +{ + auto exdData = m_pFw->get< Data::ExdDataGenerated >(); + assert( exdData ); + + auto companion = exdData->get< Data::Companion >( id ); + if( !id ) + return; + + m_companionId = id; + sendToInRangeSet( makeActorControl142( getId(), ActorControlType::ToggleCompanion, id ), true ); +} + +uint16_t Sapphire::Entity::Player::getCurrentCompanion() const +{ + return m_companionId; +} + uint8_t Sapphire::Entity::Player::getCurrentMount() const { return m_mount; diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 02e1c282..388afa51 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -565,6 +565,11 @@ namespace Sapphire::Entity /*! dismount the current mount and send the packets */ void dismount(); + void spawnCompanion( uint16_t id ); + void despawnCompanion(); + + uint16_t getCurrentCompanion() const; + /*! get the current mount */ uint8_t getCurrentMount() const; @@ -1076,6 +1081,7 @@ namespace Sapphire::Entity // content finder info uint32_t m_cfPenaltyUntil; // unix time + uint16_t m_companionId; uint32_t m_mount; uint32_t m_emoteMode; diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp index 362e6a13..1b49e689 100644 --- a/src/world/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp @@ -126,6 +126,11 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( FrameworkPtr pFw, player.dismount(); break; } + case ClientTriggerType::SpawnCompanionReq: + { + player.spawnCompanion( param1 ); + break; + } case ClientTriggerType::RemoveStatusEffect: // Remove status (clicking it off) { // todo: check if status can be removed by client from exd diff --git a/src/world/Network/PacketWrappers/InitUIPacket.h b/src/world/Network/PacketWrappers/InitUIPacket.h index 91fa6c59..cdcdcf48 100644 --- a/src/world/Network/PacketWrappers/InitUIPacket.h +++ b/src/world/Network/PacketWrappers/InitUIPacket.h @@ -84,6 +84,7 @@ namespace Sapphire::Network::Packets::Server memset( m_data.unlockedPvp, 0xFF, sizeof( m_data.unlockedPvp ) ); memset( m_data.unlockedRaids, 0xFF, sizeof( m_data.unlockedRaids ) ); memset( m_data.unlockedTrials, 0xFF, sizeof( m_data.unlockedTrials ) ); + memset( m_data.minions, 0xFF, sizeof( m_data.minions ) ); }; }; diff --git a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h index 71481112..0f0375a6 100644 --- a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h @@ -71,6 +71,7 @@ namespace Sapphire::Network::Packets::Server m_data.title = player.getTitle(); m_data.voice = player.getVoiceId(); m_data.currentMount = player.getCurrentMount(); + m_data.activeMinion = player.getCurrentCompanion(); m_data.onlineStatus = static_cast< uint8_t >( player.getOnlineStatus() ); From 5d965493e9ea1531a094f905f98f6c428b80ba46 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 2 Feb 2019 23:32:36 +1100 Subject: [PATCH 2/2] fix name inconsistency with bnpc kill script callbacks --- src/scripts/quest/subquest/gridania/SubFst002.cpp | 2 +- src/world/Actor/Player.cpp | 2 +- src/world/Script/NativeScriptApi.cpp | 2 +- src/world/Script/NativeScriptApi.h | 2 +- src/world/Script/ScriptMgr.cpp | 8 ++++---- src/world/Script/ScriptMgr.h | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/scripts/quest/subquest/gridania/SubFst002.cpp b/src/scripts/quest/subquest/gridania/SubFst002.cpp index d539d591..8dbd831b 100644 --- a/src/scripts/quest/subquest/gridania/SubFst002.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst002.cpp @@ -68,7 +68,7 @@ public: Scene00001( player ); } - void onNpcKill( uint32_t npcId, Entity::Player& player ) override + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override { if( npcId != ENEMY0 ) return; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 76268f57..52130a41 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1133,7 +1133,7 @@ void Sapphire::Entity::Player::update( int64_t currTime ) void Sapphire::Entity::Player::onMobKill( uint16_t nameId ) { auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onMobKill( *getAsPlayer(), nameId ); + pScriptMgr->onBNpcKill( *getAsPlayer(), nameId ); } void Sapphire::Entity::Player::freePlayerSpawnId( uint32_t actorId ) diff --git a/src/world/Script/NativeScriptApi.cpp b/src/world/Script/NativeScriptApi.cpp index 5c99828a..06e04cc2 100644 --- a/src/world/Script/NativeScriptApi.cpp +++ b/src/world/Script/NativeScriptApi.cpp @@ -111,7 +111,7 @@ namespace Sapphire::ScriptAPI { } - void EventScript::onNpcKill( uint32_t npcId, Entity::Player& player ) + void EventScript::onBNpcKill( uint32_t nameId, Entity::Player& player ) { } diff --git a/src/world/Script/NativeScriptApi.h b/src/world/Script/NativeScriptApi.h index de810b6c..a86a8c63 100644 --- a/src/world/Script/NativeScriptApi.h +++ b/src/world/Script/NativeScriptApi.h @@ -165,7 +165,7 @@ namespace Sapphire::ScriptAPI virtual void onTalk( uint32_t eventId, Sapphire::Entity::Player& player, uint64_t actorId ); - virtual void onNpcKill( uint32_t npcId, Sapphire::Entity::Player& player ); + virtual void onBNpcKill( uint32_t nameId, Sapphire::Entity::Player& player ); virtual void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Sapphire::Entity::Player& player ); diff --git a/src/world/Script/ScriptMgr.cpp b/src/world/Script/ScriptMgr.cpp index 37967d1a..b8a59322 100644 --- a/src/world/Script/ScriptMgr.cpp +++ b/src/world/Script/ScriptMgr.cpp @@ -272,20 +272,20 @@ bool Sapphire::Scripting::ScriptMgr::onEventItem( Entity::Player& player, uint32 return false; } -bool Sapphire::Scripting::ScriptMgr::onMobKill( Entity::Player& player, uint16_t nameId ) +bool Sapphire::Scripting::ScriptMgr::onBNpcKill( Entity::Player& player, uint16_t nameId ) { auto pEventMgr = framework()->get< World::Manager::EventMgr >(); std::string eventName = "onBnpcKill_" + std::to_string( nameId ); - // loop through all active quests and try to call available onMobKill callbacks + // loop through all active quests and try to call available onBNpcKill callbacks for( size_t i = 0; i < 30; i++ ) { auto activeQuests = player.getQuestActive( static_cast< uint16_t >( i ) ); if( !activeQuests ) continue; - uint32_t questId = activeQuests->c.questId | 0x00010000; + uint32_t questId = activeQuests->c.questId | Event::EventHandler::EventHandlerType::Quest << 16; auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( questId ); if( script ) @@ -294,7 +294,7 @@ bool Sapphire::Scripting::ScriptMgr::onMobKill( Entity::Player& player, uint16_t player.sendDebug( "Calling: {0}.{1}", objName, eventName ); - script->onNpcKill( nameId, player ); + script->onBNpcKill( nameId, player ); } } diff --git a/src/world/Script/ScriptMgr.h b/src/world/Script/ScriptMgr.h index ca51f5fe..b2423ccf 100644 --- a/src/world/Script/ScriptMgr.h +++ b/src/world/Script/ScriptMgr.h @@ -68,7 +68,7 @@ namespace Sapphire::Scripting bool onEventItem( Entity::Player& player, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId ); - bool onMobKill( Entity::Player& player, uint16_t nameId ); + bool onBNpcKill( Entity::Player& player, uint16_t nameId ); bool onCastFinish( Entity::Player& pPlayer, Entity::CharaPtr pTarget, uint32_t actionId );