aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/GoalSelector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/GoalSelector.cpp')
-rw-r--r--Minecraft.World/GoalSelector.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/Minecraft.World/GoalSelector.cpp b/Minecraft.World/GoalSelector.cpp
new file mode 100644
index 00000000..85a37dda
--- /dev/null
+++ b/Minecraft.World/GoalSelector.cpp
@@ -0,0 +1,147 @@
+#include "stdafx.h"
+#include "Goal.h"
+#include "GoalSelector.h"
+
+
+GoalSelector::InternalGoal::InternalGoal(int prio, Goal *goal, bool canDeletePointer)
+{
+ this->prio = prio;
+ this->goal = goal;
+ this->canDeletePointer = canDeletePointer;
+}
+
+GoalSelector::GoalSelector()
+{
+ tickCount = 0;
+ newGoalRate = 3;
+}
+
+GoalSelector::~GoalSelector()
+{
+ for(AUTO_VAR(it, goals.begin()); it != goals.end(); ++it)
+ {
+ if((*it)->canDeletePointer) delete (*it)->goal;
+ delete (*it);
+ }
+}
+
+void GoalSelector::addGoal(int prio, Goal *goal, bool canDeletePointer /*= true*/) // 4J Added canDelete param
+{
+ goals.push_back(new InternalGoal(prio, goal, canDeletePointer));
+}
+
+void GoalSelector::tick()
+{
+ vector<InternalGoal *> toStart;
+
+ if(tickCount++ % newGoalRate == 0)
+ {
+ //for (InternalGoal ig : goals)
+ for(AUTO_VAR(it, goals.begin()); it != goals.end(); ++it)
+ {
+ InternalGoal *ig = *it;
+ //bool isUsing = usingGoals.contains(ig);
+ AUTO_VAR(usingIt, find(usingGoals.begin(), usingGoals.end(), ig));
+
+ //if (isUsing)
+ if(usingIt != usingGoals.end())
+ {
+ if (!canUseInSystem(ig) || !canContinueToUse(ig))
+ {
+ ig->goal->stop();
+ //usingGoals.remove(ig);
+ usingGoals.erase(usingIt);
+ }
+ else continue;
+ }
+
+ if (!canUseInSystem(ig) || !ig->goal->canUse()) continue;
+
+ toStart.push_back(ig);
+ usingGoals.push_back(ig);
+ }
+ }
+ else
+ {
+ for(AUTO_VAR(it, usingGoals.begin() ); it != usingGoals.end(); )
+ {
+ InternalGoal *ig = *it;
+ if (!ig->goal->canContinueToUse())
+ {
+ ig->goal->stop();
+ it = usingGoals.erase(it);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+ }
+
+
+ //bool debug = false;
+ //if (debug && toStart.size() > 0) System.out.println("Starting: ");
+ //for (InternalGoal ig : toStart)
+ for(AUTO_VAR(it, toStart.begin()); it != toStart.end(); ++it)
+ {
+ //if (debug) System.out.println(ig.goal.toString() + ", ");
+ (*it)->goal->start();
+ }
+
+ //if (debug && usingGoals.size() > 0) System.out.println("Running: ");
+ //for (InternalGoal ig : usingGoals)
+ for(AUTO_VAR(it, usingGoals.begin()); it != usingGoals.end(); ++it)
+ {
+ //if (debug) System.out.println(ig.goal.toString());
+ (*it)->goal->tick();
+ }
+}
+
+vector<GoalSelector::InternalGoal *> *GoalSelector::getRunningGoals()
+{
+ return &usingGoals;
+}
+
+bool GoalSelector::canContinueToUse(InternalGoal *ig)
+{
+ return ig->goal->canContinueToUse();
+}
+
+bool GoalSelector::canUseInSystem(GoalSelector::InternalGoal *goal)
+{
+ //for (InternalGoal ig : goals)
+ for(AUTO_VAR(it, goals.begin()); it != goals.end(); ++it)
+ {
+ InternalGoal *ig = *it;
+ if (ig == goal) continue;
+
+ AUTO_VAR(usingIt, find(usingGoals.begin(), usingGoals.end(), ig));
+
+ if (goal->prio >= ig->prio)
+ {
+ if (usingIt != usingGoals.end() && !canCoExist(goal, ig)) return false;
+ }
+ else if (usingIt != usingGoals.end() && !ig->goal->canInterrupt()) return false;
+ }
+
+ return true;
+}
+
+bool GoalSelector::canCoExist(GoalSelector::InternalGoal *goalA, GoalSelector::InternalGoal *goalB)
+{
+ return (goalA->goal->getRequiredControlFlags() & goalB->goal->getRequiredControlFlags()) == 0;
+}
+
+void GoalSelector::setNewGoalRate(int newGoalRate)
+{
+ this->newGoalRate = newGoalRate;
+}
+
+void GoalSelector::setLevel(Level *level)
+{
+ for(AUTO_VAR(it, goals.begin()); it != goals.end(); ++it)
+ {
+ InternalGoal *ig = *it;
+ ig->goal->setLevel(level);
+ }
+} \ No newline at end of file