From 00c13ae96c0bb3675eb68f442a409c3fef6646df Mon Sep 17 00:00:00 2001 From: David Cernat Date: Tue, 10 Jul 2018 07:07:37 +0300 Subject: [PATCH] [General] Implement ActorAI packet, part 4 The server can now make actors activate players and objects, at least in theory. In practice, OpenMW''s AiActivate package needs to be worked so it allows specific objects as targets instead of just refIds. --- apps/openmw-mp/Script/Functions/Actors.cpp | 2 +- apps/openmw-mp/Script/Functions/Actors.hpp | 10 +++++----- apps/openmw/mwmp/DedicatedActor.cpp | 9 +++++++++ components/openmw-mp/Base/BaseActor.hpp | 11 ++++++----- components/openmw-mp/Packets/Actor/PacketActorAI.cpp | 4 ++-- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/openmw-mp/Script/Functions/Actors.cpp b/apps/openmw-mp/Script/Functions/Actors.cpp index 2947f0166..a509b29f1 100644 --- a/apps/openmw-mp/Script/Functions/Actors.cpp +++ b/apps/openmw-mp/Script/Functions/Actors.cpp @@ -318,7 +318,7 @@ void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept tempActor.aiTarget.guid = player->guid; } -void ActorFunctions::SetActorAITargetToActor(int refNumIndex, int mpNum) noexcept +void ActorFunctions::SetActorAITargetToObject(int refNumIndex, int mpNum) noexcept { tempActor.hasAiTarget = true; tempActor.aiTarget.isPlayer = false; diff --git a/apps/openmw-mp/Script/Functions/Actors.hpp b/apps/openmw-mp/Script/Functions/Actors.hpp index f9a2c07e6..0cec3e09f 100644 --- a/apps/openmw-mp/Script/Functions/Actors.hpp +++ b/apps/openmw-mp/Script/Functions/Actors.hpp @@ -69,7 +69,7 @@ \ {"SetActorAIAction", ActorFunctions::SetActorAIAction},\ {"SetActorAITargetToPlayer", ActorFunctions::SetActorAITargetToPlayer},\ - {"SetActorAITargetToActor", ActorFunctions::SetActorAITargetToActor},\ + {"SetActorAITargetToObject", ActorFunctions::SetActorAITargetToObject},\ {"SetActorAICoordinates", ActorFunctions::SetActorAICoordinates},\ {"SetActorAIDistance", ActorFunctions::SetActorAIDistance},\ {"SetActorAIDuration", ActorFunctions::SetActorAIDuration},\ @@ -561,13 +561,13 @@ public: static void SetActorAITargetToPlayer(unsigned short pid) noexcept; /** - * \brief Set another actor as the AI target of the temporary actor stored on the server. + * \brief Set another object as the AI target of the temporary actor stored on the server. * - * \param refNumIndex The refNumIndex of the target actor. - * \param mpNum The mpNum of the target actor. + * \param refNumIndex The refNumIndex of the target object. + * \param mpNum The mpNum of the target object. * \return void */ - static void SetActorAITargetToActor(int refNumIndex, int mpNum) noexcept; + static void SetActorAITargetToObject(int refNumIndex, int mpNum) noexcept; /** * \brief Set the coordinates for the AI package associated with the current AI action. diff --git a/apps/openmw/mwmp/DedicatedActor.cpp b/apps/openmw/mwmp/DedicatedActor.cpp index b0a0868cd..7acbd992b 100644 --- a/apps/openmw/mwmp/DedicatedActor.cpp +++ b/apps/openmw/mwmp/DedicatedActor.cpp @@ -6,6 +6,7 @@ #include "../mwdialogue/dialoguemanagerimp.hpp" +#include "../mwmechanics/aiactivate.hpp" #include "../mwmechanics/aicombat.hpp" #include "../mwmechanics/aiescort.hpp" #include "../mwmechanics/aifollow.hpp" @@ -271,6 +272,14 @@ void DedicatedActor::setAI() if (targetPtr) { + if (aiAction == mwmp::BaseActorList::ACTIVATE) + { + LOG_APPEND(Log::LOG_VERBOSE, "--- Activating target"); + + MWMechanics::AiActivate package(targetPtr.getCellRef().getRefId()); + ptr.getClass().getCreatureStats(ptr).getAiSequence().stack(package, ptr, true); + } + if (aiAction == mwmp::BaseActorList::COMBAT) { LOG_APPEND(Log::LOG_VERBOSE, "--- Starting combat with target"); diff --git a/components/openmw-mp/Base/BaseActor.hpp b/components/openmw-mp/Base/BaseActor.hpp index 93e3acef4..87162dc3d 100644 --- a/components/openmw-mp/Base/BaseActor.hpp +++ b/components/openmw-mp/Base/BaseActor.hpp @@ -74,11 +74,12 @@ namespace mwmp enum AI_ACTION { CANCEL = 0, - COMBAT = 1, - ESCORT = 2, - FOLLOW = 3, - TRAVEL = 4, - WANDER = 5 + ACTIVATE = 1, + COMBAT = 2, + ESCORT = 3, + FOLLOW = 4, + TRAVEL = 5, + WANDER = 6 }; RakNet::RakNetGUID guid; diff --git a/components/openmw-mp/Packets/Actor/PacketActorAI.cpp b/components/openmw-mp/Packets/Actor/PacketActorAI.cpp index 7e02d764b..45596aa1f 100644 --- a/components/openmw-mp/Packets/Actor/PacketActorAI.cpp +++ b/components/openmw-mp/Packets/Actor/PacketActorAI.cpp @@ -24,8 +24,8 @@ void PacketActorAI::Actor(BaseActor &actor, bool send) if (actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::WANDER) RW(actor.aiDuration, send); - if (actor.aiAction == mwmp::BaseActorList::COMBAT || actor.aiAction == mwmp::BaseActorList::ESCORT || - actor.aiAction == mwmp::BaseActorList::FOLLOW) + if (actor.aiAction == mwmp::BaseActorList::ACTIVATE || actor.aiAction == mwmp::BaseActorList::COMBAT || + actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::FOLLOW) { RW(actor.hasAiTarget, send);