Skip to content

Commit

Permalink
Fix bug when giving units
Browse files Browse the repository at this point in the history
  • Loading branch information
ashdnazg committed Jan 7, 2016
1 parent 5866c1b commit ec7b786
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 20 deletions.
35 changes: 22 additions & 13 deletions rts/Sim/Misc/QuadField.cpp
Expand Up @@ -283,16 +283,13 @@ void CQuadField::MovedUnit(CUnit* unit)
}

for (const int qi: unit->quads) {
std::vector<CUnit*>& quadUnits = baseQuads[qi].units;
std::vector<CUnit*>& quadAllyUnits = baseQuads[qi].teamUnits[unit->allyteam];

VectorErase(quadUnits, unit);
VectorErase(quadAllyUnits, unit);
VectorErase(baseQuads[qi].units, unit);
VectorErase(baseQuads[qi].teamUnits[unit->allyteam], unit);
}

for (const int qi: newQuads) {
baseQuads[qi].units.push_back(unit);
baseQuads[qi].teamUnits[unit->allyteam].push_back(unit);
VectorInsertUnique(baseQuads[qi].units, unit, false);
VectorInsertUnique(baseQuads[qi].teamUnits[unit->allyteam], unit, false);
}

unit->quads = std::move(newQuads);
Expand All @@ -309,10 +306,20 @@ void CQuadField::RemoveUnit(CUnit* unit)
}

unit->quads.clear();

#ifdef DEBUG_QUADFIELD
for (const Quad& q: baseQuads) {
for (auto& teamUnits: q.teamUnits) {
for (CUnit* u: teamUnits) {
assert(u != unit);
}
}
}
#endif
}


void CQuadField::MovedRepulsor(CPlasmaRepulser* repulser)
void CQuadField::MovedRepulser(CPlasmaRepulser* repulser)
{
auto newQuads = std::move(GetQuads(repulser->weaponMuzzlePos, repulser->GetRadius()));

Expand All @@ -328,20 +335,22 @@ void CQuadField::MovedRepulsor(CPlasmaRepulser* repulser)
}

for (const int qi: newQuads) {
baseQuads[qi].repulsers.push_back(repulser);
VectorInsertUnique(baseQuads[qi].repulsers, repulser, false);
}

repulser->quads = std::move(newQuads);
}

void CQuadField::RemoveRepulsor(CPlasmaRepulser* repulser)
void CQuadField::RemoveRepulser(CPlasmaRepulser* repulser)
{
const auto& quads = GetQuads(repulser->weaponMuzzlePos, repulser->GetRadius());

for (const int qi: repulser->quads) {
VectorErase(baseQuads[qi].repulsers, repulser);
}

repulser->quads.clear();

#ifdef DEBUG_QUADFIELD
for (const Quad& q: baseQuads) {
for (CPlasmaRepulser* r: q.repulsers) {
Expand All @@ -357,7 +366,7 @@ void CQuadField::AddFeature(CFeature* feature)
const auto& newQuads = GetQuads(feature->pos, feature->radius);

for (const int qi: newQuads) {
baseQuads[qi].features.push_back(feature);
VectorInsertUnique(baseQuads[qi].features, feature, false);
}
}

Expand Down Expand Up @@ -403,13 +412,13 @@ void CQuadField::AddProjectile(CProjectile* p)
auto newQuads = std::move(GetQuadsOnRay(p->pos, p->dir, p->speed.w));

for (const int qi: newQuads) {
baseQuads[qi].projectiles.push_back(p);
VectorInsertUnique(baseQuads[qi].projectiles, p, false);
}

p->quads = std::move(newQuads);
} else {
int newQuad = WorldPosToQuadFieldIdx(p->pos);
baseQuads[newQuad].projectiles.push_back(p);
VectorInsertUnique(baseQuads[newQuad].projectiles, p, false);
p->quads.clear();
p->quads.push_back(newQuad);
}
Expand Down
4 changes: 2 additions & 2 deletions rts/Sim/Misc/QuadField.h
Expand Up @@ -95,8 +95,8 @@ needed to support dynamic resizing (not used yet)
void AddProjectile(CProjectile* projectile);
void RemoveProjectile(CProjectile* projectile);

void MovedRepulsor(CPlasmaRepulser* repulser);
void RemoveRepulsor(CPlasmaRepulser* repulser);
void MovedRepulser(CPlasmaRepulser* repulser);
void RemoveRepulser(CPlasmaRepulser* repulser);

struct Quad {
CR_DECLARE_STRUCT(Quad)
Expand Down
3 changes: 1 addition & 2 deletions rts/Sim/Units/Unit.cpp
Expand Up @@ -1516,8 +1516,6 @@ bool CUnit::ChangeTeam(int newteam, ChangeType type)
eoh->UnitCaptured(*this, oldteam, newteam);

quadField->RemoveUnit(this);
quads.clear();
quadField->MovedUnit(this);


if (type == ChangeGiven) {
Expand All @@ -1540,6 +1538,7 @@ bool CUnit::ChangeTeam(int newteam, ChangeType type)
team = newteam;
allyteam = teamHandler->AllyTeam(newteam);
neutral = false;
quadField->MovedUnit(this);

unitHandler->unitsByDefs[oldteam][unitDef->id].erase(this);
unitHandler->unitsByDefs[newteam][unitDef->id].insert(this);
Expand Down
6 changes: 3 additions & 3 deletions rts/Sim/Weapons/PlasmaRepulser.cpp
Expand Up @@ -49,7 +49,7 @@ CPlasmaRepulser::CPlasmaRepulser(CUnit* owner, const WeaponDef* def): CWeapon(ow
CPlasmaRepulser::~CPlasmaRepulser()
{
shieldProjectile->PreDelete();
quadField->RemoveRepulsor(this);
quadField->RemoveRepulser(this);
}


Expand All @@ -67,7 +67,7 @@ void CPlasmaRepulser::Init()

CWeapon::Init();

quadField->MovedRepulsor(this);
quadField->MovedRepulser(this);

// deleted by ProjectileHandler
shieldProjectile = new ShieldProjectile(this);
Expand Down Expand Up @@ -117,7 +117,7 @@ void CPlasmaRepulser::Update()
UpdateWeaponVectors();
collisionVolume.SetOffsets((relWeaponMuzzlePos - owner->relMidPos) * WORLD_TO_OBJECT_SPACE);
if (weaponMuzzlePos != lastPos)
quadField->MovedRepulsor(this);
quadField->MovedRepulser(this);

lastPos = weaponMuzzlePos;
}
Expand Down

0 comments on commit ec7b786

Please sign in to comment.