1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-27 07:06:00 +00:00

Fix possible crash due to unsafe shot iteration.

Fixes regression introduced in 0784d1b9df.
With a std::list it was okay to create shots while iterating with an
iterator, but not so with a std::vector.
Now using index access, which is safe with push_back() operations.
This commit is contained in:
fgenesis 2013-05-16 03:54:20 +02:00
parent 5717149234
commit 36247593d4

View file

@ -8402,9 +8402,9 @@ void Game::handleShotCollisions(Entity *e, bool hasShield)
{ {
BBGE_PROF(Game_handleShotCollisions); BBGE_PROF(Game_handleShotCollisions);
bool isRegValid=true; bool isRegValid=true;
for (Shot::Shots::iterator i = Shot::shots.begin(); i != Shot::shots.end(); i++) for (size_t i = 0; i < Shot::shots.size(); ++i)
{ {
Shot *shot = *i; Shot *shot = Shot::shots[i];
if (shot->isActive() && isEntityCollideWithShot(e, shot) && (!hasShield || (!shot->shotData || !shot->shotData->ignoreShield))) if (shot->isActive() && isEntityCollideWithShot(e, shot) && (!hasShield || (!shot->shotData || !shot->shotData->ignoreShield)))
{ {
Vector collidePoint = e->position+e->offset; Vector collidePoint = e->position+e->offset;
@ -8434,9 +8434,9 @@ bool Game::isDamageTypeEnemy(DamageType dt)
void Game::handleShotCollisionsSkeletal(Entity *e) void Game::handleShotCollisionsSkeletal(Entity *e)
{ {
BBGE_PROF(Game_HSSKELETAL); BBGE_PROF(Game_HSSKELETAL);
for (Shot::Shots::iterator i = Shot::shots.begin(); i != Shot::shots.end(); i++) for (size_t i = 0; i < Shot::shots.size(); ++i)
{ {
Shot *shot = *i; Shot *shot = Shot::shots[i];
if (shot->isActive() && isEntityCollideWithShot(e, shot)) if (shot->isActive() && isEntityCollideWithShot(e, shot))
{ {
Bone *b = collideSkeletalVsCircle(e, shot->position, shot->collideRadius); Bone *b = collideSkeletalVsCircle(e, shot->position, shot->collideRadius);
@ -8451,9 +8451,9 @@ void Game::handleShotCollisionsSkeletal(Entity *e)
void Game::handleShotCollisionsHair(Entity *e, int num) void Game::handleShotCollisionsHair(Entity *e, int num)
{ {
for (Shot::Shots::iterator i = Shot::shots.begin(); i != Shot::shots.end(); i++) for (size_t i = 0; i < Shot::shots.size(); ++i)
{ {
Shot *shot = *i; Shot *shot = Shot::shots[i];
if (shot->isActive() && isEntityCollideWithShot(e, shot)) if (shot->isActive() && isEntityCollideWithShot(e, shot))
{ {
bool b = collideHairVsCircle(e, num, shot->position, 8); bool b = collideHairVsCircle(e, num, shot->position, 8);