summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2010-06-20 23:10:02 +0300
committerChuck Miller <shadowmil@gmail.com>2010-06-20 18:02:28 -0400
commit75587e38bd6f3b91d46f3e10ccd195f26a00f098 (patch)
tree6ea7c1734392f3513ca920986acb7d59346ac065
parentceab31510f4c419ba3d68b25633504890db483f6 (diff)
downloadmana-client-75587e38bd6f3b91d46f3e10ccd195f26a00f098.tar.gz
mana-client-75587e38bd6f3b91d46f3e10ccd195f26a00f098.tar.bz2
mana-client-75587e38bd6f3b91d46f3e10ccd195f26a00f098.tar.xz
mana-client-75587e38bd6f3b91d46f3e10ccd195f26a00f098.zip
Fix ActorSprite double deletion
Also replaces std::list to std::set in actorspritemanager. Reviewed-by: Chuck Miller <shadowmil@gmail.com>
-rw-r--r--src/actorspritemanager.cpp19
-rw-r--r--src/actorspritemanager.h2
2 files changed, 12 insertions, 9 deletions
diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index ead469c2..a6c82420 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -74,14 +74,14 @@ void ActorSpriteManager::setMap(Map *map)
void ActorSpriteManager::setPlayer(LocalPlayer *player)
{
player_node = player;
- mActors.push_back(player);
+ mActors.insert(player);
}
Being *ActorSpriteManager::createBeing(int id, ActorSprite::Type type, int subtype)
{
Being *being = new Being(id, type, subtype, mMap);
- mActors.push_back(being);
+ mActors.insert(being);
return being;
}
@@ -89,7 +89,7 @@ FloorItem *ActorSpriteManager::createItem(int id, int itemId, int x, int y)
{
FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap);
- mActors.push_back(floorItem);
+ mActors.insert(floorItem);
return floorItem;
}
@@ -98,7 +98,7 @@ void ActorSpriteManager::destroy(ActorSprite *actor)
if (!actor || actor == player_node)
return;
- mDeleteActors.push_back(actor);
+ mDeleteActors.insert(actor);
}
Being *ActorSpriteManager::findBeing(int id) const
@@ -208,7 +208,7 @@ void ActorSpriteManager::logic()
it != it_end; ++it)
{
viewport->clearHover(*it);
- mActors.remove(*it);
+ mActors.erase(*it);
delete *it;
}
@@ -220,15 +220,16 @@ void ActorSpriteManager::clear()
if (player_node)
{
player_node->setTarget(0);
- mActors.remove(player_node);
+ mActors.erase(player_node);
}
- delete_all(mActors);
+ for_actors
+ delete *it;
mActors.clear();
mDeleteActors.clear();
if (player_node)
- mActors.push_back(player_node);
+ mActors.insert(player_node);
}
Being *ActorSpriteManager::findNearestLivingBeing(int x, int y,
@@ -297,7 +298,9 @@ void ActorSpriteManager::getPlayerNames(std::vector<std::string> &names,
if ((being->getType() == ActorSprite::PLAYER
|| (being->getType() == ActorSprite::NPC && npcNames))
&& being->getName() != "")
+ {
names.push_back(being->getName());
+ }
}
}
diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h
index 93a2f4ed..d9d5b534 100644
--- a/src/actorspritemanager.h
+++ b/src/actorspritemanager.h
@@ -29,7 +29,7 @@
class LocalPlayer;
class Map;
-typedef std::list<ActorSprite*> ActorSprites;
+typedef std::set<ActorSprite*> ActorSprites;
typedef ActorSprites::iterator ActorSpritesIterator;
typedef ActorSprites::const_iterator ActorSpritesConstIterator;