1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "Group.h"
#include "GroupHandler.h"
#include "Game/GlobalUnsynced.h"
#include "Sim/Units/UnitHandler.h"
#include "System/EventHandler.h"
#include "System/creg/STL_Set.h"
#include "System/float3.h"
CR_BIND(CGroup, (0, 0))
CR_REG_METADATA(CGroup, (
CR_MEMBER(id),
CR_MEMBER(ghIndex),
CR_MEMBER(units),
CR_POSTLOAD(PostLoad)
))
void CGroup::PostLoad()
{
while (!units.empty()) {
CUnit* unit = unitHandler.GetUnit(*units.begin());
units.erase(unit->id);
uiGroupHandlers[ghIndex].SetUnitGroup(unit->id, nullptr);
}
}
bool CGroup::AddUnit(CUnit* unit)
{
units.insert(unit->id);
uiGroupHandlers[ghIndex].PushGroupChange(id);
return true;
}
void CGroup::RemoveUnit(CUnit* unit)
{
units.erase(unit->id);
uiGroupHandlers[ghIndex].PushGroupChange(id);
}
void CGroup::RemoveIfEmptySpecialGroup()
{
if (!units.empty())
return;
if (id < CGroupHandler::FIRST_SPECIAL_GROUP)
return;
//HACK so Global AI groups do not get erased DEPRECATED
if (uiGroupHandlers[ghIndex].GetTeam() != gu->myTeam)
return;
uiGroupHandlers[ghIndex].RemoveGroup(this);
}
void CGroup::ClearUnits()
{
assert(!uiGroupHandlers.empty());
while (!units.empty()) {
CUnit* unit = unitHandler.GetUnit(*units.begin());
unit->SetGroup(nullptr);
}
uiGroupHandlers[ghIndex].PushGroupChange(id);
}
float3 CGroup::CalculateCenter() const
{
float3 center;
if (!units.empty()) {
for (const int unitID: units) {
center += (unitHandler.GetUnit(unitID))->pos;
}
center /= units.size();
}
return center;
}
|