mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-13 09:07:19 +00:00
105 lines
2.3 KiB
C++
105 lines
2.3 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it
|
|
* and/or modify it under version 2 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#include "Action.h"
|
|
|
|
#include "Playerbots.h"
|
|
#include "Timer.h"
|
|
|
|
uint32 NextAction::size(NextAction** actions)
|
|
{
|
|
if (!actions)
|
|
return 0;
|
|
|
|
uint32 size = 0;
|
|
for (size = 0; actions[size];)
|
|
++size;
|
|
|
|
return size;
|
|
}
|
|
|
|
NextAction** NextAction::clone(NextAction** actions)
|
|
{
|
|
if (!actions)
|
|
return nullptr;
|
|
|
|
uint32 size = NextAction::size(actions);
|
|
|
|
NextAction** res = new NextAction*[size + 1];
|
|
for (uint32 i = 0; i < size; i++)
|
|
res[i] = new NextAction(*actions[i]);
|
|
|
|
res[size] = nullptr;
|
|
|
|
return res;
|
|
}
|
|
|
|
NextAction** NextAction::merge(NextAction** left, NextAction** right)
|
|
{
|
|
uint32 leftSize = NextAction::size(left);
|
|
uint32 rightSize = NextAction::size(right);
|
|
|
|
NextAction** res = new NextAction*[leftSize + rightSize + 1];
|
|
|
|
for (uint32 i = 0; i < leftSize; i++)
|
|
res[i] = new NextAction(*left[i]);
|
|
|
|
for (uint32 i = 0; i < rightSize; i++)
|
|
res[leftSize + i] = new NextAction(*right[i]);
|
|
|
|
res[leftSize + rightSize] = nullptr;
|
|
|
|
NextAction::destroy(left);
|
|
NextAction::destroy(right);
|
|
|
|
return res;
|
|
}
|
|
|
|
NextAction** NextAction::array(uint32 nil, ...)
|
|
{
|
|
va_list vl;
|
|
va_start(vl, nil);
|
|
|
|
uint32 size = 0;
|
|
NextAction* cur = nullptr;
|
|
do
|
|
{
|
|
cur = va_arg(vl, NextAction*);
|
|
++size;
|
|
} while (cur);
|
|
|
|
va_end(vl);
|
|
|
|
NextAction** res = new NextAction*[size];
|
|
va_start(vl, nil);
|
|
for (uint32 i = 0; i < size; i++)
|
|
res[i] = va_arg(vl, NextAction*);
|
|
va_end(vl);
|
|
|
|
return res;
|
|
}
|
|
|
|
void NextAction::destroy(NextAction** actions)
|
|
{
|
|
if (!actions)
|
|
return;
|
|
|
|
for (uint32 i = 0; actions[i]; i++)
|
|
delete actions[i];
|
|
|
|
delete[] actions;
|
|
}
|
|
|
|
Value<Unit*>* Action::GetTargetValue() { return context->GetValue<Unit*>(GetTargetName()); }
|
|
|
|
Unit* Action::GetTarget() { return GetTargetValue()->Get(); }
|
|
|
|
ActionBasket::ActionBasket(ActionNode* action, float relevance, bool skipPrerequisites, Event event)
|
|
: action(action), relevance(relevance), skipPrerequisites(skipPrerequisites), event(event), created(getMSTime())
|
|
{
|
|
}
|
|
|
|
bool ActionBasket::isExpired(uint32 msecs) { return getMSTime() - created >= msecs; }
|