From 6a65a4cf5b6b10839254c0c5846ec2dbfea882f8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 23 Jul 2016 02:14:30 +0300 Subject: Allow delete untracker being particle effects. This fix some possible memory leaks. --- src/being/actorsprite.cpp | 27 ++++++++++++++++++++++++--- src/being/actorsprite.h | 11 +++++++++-- src/being/being.cpp | 6 +++--- src/being/localplayer.cpp | 2 +- 4 files changed, 37 insertions(+), 9 deletions(-) (limited to 'src/being') diff --git a/src/being/actorsprite.cpp b/src/being/actorsprite.cpp index f0dfc07ec..3a9c457a4 100644 --- a/src/being/actorsprite.cpp +++ b/src/being/actorsprite.cpp @@ -33,6 +33,7 @@ #include "listeners/debugmessagelistener.h" +#include "particle/particle.h" #include "particle/particleengine.h" #include "resources/db/statuseffectdb.h" @@ -141,9 +142,29 @@ void ActorSprite::setMap(Map *const map) mMustResetParticles = true; // Reset status particles on next redraw } -void ActorSprite::controlParticle(Particle *const particle) +void ActorSprite::controlAutoParticle(Particle *const particle) { - mChildParticleEffects.addLocally(particle); + if (particle) + { + particle->setActor(mId); + mChildParticleEffects.addLocally(particle); + } +} + +void ActorSprite::controlCustomParticle(Particle *const particle) +{ + if (particle) + { + // The effect may not die without the beings permission or we segfault + particle->disableAutoDelete(); + mChildParticleEffects.addLocally(particle); + } +} + +void ActorSprite::controlParticleDeleted(Particle *const particle) +{ + if (particle) + mChildParticleEffects.removeLocally(particle); } void ActorSprite::setTargetType(const TargetCursorTypeT type) @@ -456,7 +477,7 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, FOR_EACH (StringVectCIter, itr, display.particles) { Particle *const p = particleEngine->addEffect(*itr, 0, 0); - controlParticle(p); + controlAutoParticle(p); } } diff --git a/src/being/actorsprite.h b/src/being/actorsprite.h index 6f5c020c2..c06f1c983 100644 --- a/src/being/actorsprite.h +++ b/src/being/actorsprite.h @@ -81,9 +81,14 @@ class ActorSprite notfinal : public CompoundSprite, public Actor { return BlockType::NONE; } /** - * Take control of a particle. + * Take control of a particle. Particle can be auto deleted. */ - void controlParticle(Particle *const particle); + void controlAutoParticle(Particle *const particle); + + /** + * Take control of a particle. Owner must remove particle by self. + */ + void controlCustomParticle(Particle *const particle); /** * Returns the required size of a target cursor for this being. @@ -190,6 +195,8 @@ class ActorSprite notfinal : public CompoundSprite, public Actor mChildParticleEffects.size(); } + void controlParticleDeleted(Particle *const particle); + protected: /** * A status effect block is a 16 bit mask of status effects. We assign diff --git a/src/being/being.cpp b/src/being/being.cpp index b5732b15f..0cf52c353 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -1349,7 +1349,7 @@ void Being::fireMissile(Being *restrict const victim, { target->moveBy(Vector(0.0F, 0.0F, 32.0F)); target->setLifetime(1000); - victim->controlParticle(target); + victim->controlAutoParticle(target); missile->setDestination(target, 7, 0); missile->setDieDistance(8); @@ -4849,7 +4849,7 @@ void Being::addItemParticles(const int id, FOR_EACH (StringVectCIter, itr, display.particles) { Particle *const p = particleEngine->addEffect(*itr, 0, 0); - controlParticle(p); + controlCustomParticle(p); pi->files.push_back(*itr); pi->particles.push_back(p); } @@ -4893,7 +4893,7 @@ void Being::recreateItemParticles() restrict2 { Particle *const p = particleEngine->addEffect( *str, 0, 0); - controlParticle(p); + controlCustomParticle(p); pi->particles.push_back(p); } } diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp index 25699f704..e065fafe4 100644 --- a/src/being/localplayer.cpp +++ b/src/being/localplayer.cpp @@ -2709,7 +2709,7 @@ void LocalPlayer::setTestParticle(const std::string &fileName, if (!fileName.empty()) { mTestParticle = particleEngine->addEffect(fileName, 0, 0, 0); - controlParticle(mTestParticle); + controlCustomParticle(mTestParticle); if (updateHash) mTestParticleHash = UpdaterWindow::getFileHash(mTestParticleName); } -- cgit v1.2.3-60-g2f50