mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-07-13 13:21:42 +00:00
[General] Implement ActorAI packet, part 5
Allow repetition for AiWander package to be turned on and off.
This commit is contained in:
parent
2e31c212c0
commit
bff6e9e235
6 changed files with 27 additions and 6 deletions
|
@ -344,6 +344,11 @@ void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept
|
||||||
tempActor.aiDuration = duration;
|
tempActor.aiDuration = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept
|
||||||
|
{
|
||||||
|
tempActor.aiShouldRepeat = shouldRepeat;
|
||||||
|
}
|
||||||
|
|
||||||
void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsigned int count, int charge, double enchantmentCharge) noexcept
|
void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsigned int count, int charge, double enchantmentCharge) noexcept
|
||||||
{
|
{
|
||||||
tempActor.equipmentItems[slot].refId = refId;
|
tempActor.equipmentItems[slot].refId = refId;
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
{"SetActorAICoordinates", ActorFunctions::SetActorAICoordinates},\
|
{"SetActorAICoordinates", ActorFunctions::SetActorAICoordinates},\
|
||||||
{"SetActorAIDistance", ActorFunctions::SetActorAIDistance},\
|
{"SetActorAIDistance", ActorFunctions::SetActorAIDistance},\
|
||||||
{"SetActorAIDuration", ActorFunctions::SetActorAIDuration},\
|
{"SetActorAIDuration", ActorFunctions::SetActorAIDuration},\
|
||||||
|
{"SetActorAIRepetition", ActorFunctions::SetActorAIRepetition},\
|
||||||
\
|
\
|
||||||
{"EquipActorItem", ActorFunctions::EquipActorItem},\
|
{"EquipActorItem", ActorFunctions::EquipActorItem},\
|
||||||
{"UnequipActorItem", ActorFunctions::UnequipActorItem},\
|
{"UnequipActorItem", ActorFunctions::UnequipActorItem},\
|
||||||
|
@ -595,6 +596,16 @@ public:
|
||||||
*/
|
*/
|
||||||
static void SetActorAIDuration(unsigned int duration) noexcept;
|
static void SetActorAIDuration(unsigned int duration) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set whether the current AI package should be repeated.
|
||||||
|
*
|
||||||
|
* Note: This only has an effect on the WANDER package.
|
||||||
|
*
|
||||||
|
* \param shouldRepeat Whether the package should be repeated.
|
||||||
|
* \return void
|
||||||
|
*/
|
||||||
|
static void SetActorAIRepetition(bool shouldRepeat) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Equip an item in a certain slot of the equipment of the temporary actor stored
|
* \brief Equip an item in a certain slot of the equipment of the temporary actor stored
|
||||||
* on the server.
|
* on the server.
|
||||||
|
|
|
@ -259,6 +259,7 @@ void Cell::readAI(ActorList& actorList)
|
||||||
actor->aiAction = baseActor.aiAction;
|
actor->aiAction = baseActor.aiAction;
|
||||||
actor->aiDistance = baseActor.aiDistance;
|
actor->aiDistance = baseActor.aiDistance;
|
||||||
actor->aiDuration = baseActor.aiDuration;
|
actor->aiDuration = baseActor.aiDuration;
|
||||||
|
actor->aiShouldRepeat = baseActor.aiShouldRepeat;
|
||||||
actor->aiCoordinates = baseActor.aiCoordinates;
|
actor->aiCoordinates = baseActor.aiCoordinates;
|
||||||
actor->hasAiTarget = baseActor.hasAiTarget;
|
actor->hasAiTarget = baseActor.hasAiTarget;
|
||||||
actor->aiTarget = baseActor.aiTarget;
|
actor->aiTarget = baseActor.aiTarget;
|
||||||
|
|
|
@ -232,12 +232,12 @@ void DedicatedActor::setAI()
|
||||||
}
|
}
|
||||||
else if (aiAction == mwmp::BaseActorList::WANDER)
|
else if (aiAction == mwmp::BaseActorList::WANDER)
|
||||||
{
|
{
|
||||||
LOG_APPEND(Log::LOG_VERBOSE, "--- Wandering for distance %i and duration %i",
|
LOG_APPEND(Log::LOG_VERBOSE, "--- Wandering for distance %i and duration %i, repetition is %s",
|
||||||
aiDistance, aiDuration);
|
aiDistance, aiDuration, aiShouldRepeat ? "true" : "false");
|
||||||
|
|
||||||
std::vector<unsigned char> idleList;
|
std::vector<unsigned char> idleList;
|
||||||
|
|
||||||
MWMechanics::AiWander package(aiDistance, aiDuration, -1, idleList, true);
|
MWMechanics::AiWander package(aiDistance, aiDuration, -1, idleList, aiShouldRepeat);
|
||||||
ptrCreatureStats->getAiSequence().stack(package, ptr, true);
|
ptrCreatureStats->getAiSequence().stack(package, ptr, true);
|
||||||
}
|
}
|
||||||
else if (hasAiTarget)
|
else if (hasAiTarget)
|
||||||
|
|
|
@ -46,6 +46,7 @@ namespace mwmp
|
||||||
unsigned int aiAction;
|
unsigned int aiAction;
|
||||||
unsigned int aiDistance;
|
unsigned int aiDistance;
|
||||||
unsigned int aiDuration;
|
unsigned int aiDuration;
|
||||||
|
bool aiShouldRepeat;
|
||||||
ESM::Position aiCoordinates;
|
ESM::Position aiCoordinates;
|
||||||
|
|
||||||
bool hasPositionData;
|
bool hasPositionData;
|
||||||
|
|
|
@ -16,14 +16,17 @@ void PacketActorAI::Actor(BaseActor &actor, bool send)
|
||||||
if (actor.aiAction != mwmp::BaseActorList::CANCEL)
|
if (actor.aiAction != mwmp::BaseActorList::CANCEL)
|
||||||
{
|
{
|
||||||
if (actor.aiAction == mwmp::BaseActorList::WANDER)
|
if (actor.aiAction == mwmp::BaseActorList::WANDER)
|
||||||
|
{
|
||||||
RW(actor.aiDistance, send);
|
RW(actor.aiDistance, send);
|
||||||
|
RW(actor.aiShouldRepeat, send);
|
||||||
if (actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::TRAVEL)
|
}
|
||||||
RW(actor.aiCoordinates, send);
|
|
||||||
|
|
||||||
if (actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::WANDER)
|
if (actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::WANDER)
|
||||||
RW(actor.aiDuration, send);
|
RW(actor.aiDuration, send);
|
||||||
|
|
||||||
|
if (actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::TRAVEL)
|
||||||
|
RW(actor.aiCoordinates, send);
|
||||||
|
|
||||||
if (actor.aiAction == mwmp::BaseActorList::ACTIVATE || actor.aiAction == mwmp::BaseActorList::COMBAT ||
|
if (actor.aiAction == mwmp::BaseActorList::ACTIVATE || actor.aiAction == mwmp::BaseActorList::COMBAT ||
|
||||||
actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::FOLLOW)
|
actor.aiAction == mwmp::BaseActorList::ESCORT || actor.aiAction == mwmp::BaseActorList::FOLLOW)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue