/** Creates an explosion effect. */ Explosion::Explosion(const Vec3& coord, const char* explosion_sound, const char * particle_file) : HitSFX(coord, explosion_sound) { // short emision time, explosion, not constant flame m_remaining_time = burst_time; m_emission_frames = 0; #ifndef SERVER_ONLY ParticleKindManager* pkm = ParticleKindManager::get(); ParticleKind* particles = pkm->getParticles(particle_file); m_emitter = new ParticleEmitter(particles, coord, NULL); #endif } // Explosion
void Material::initParticlesEffect(const XMLNode *node) { ParticleKindManager* pkm = ParticleKindManager::get(); std::string base; node->get("base", &base); if (base.size() < 1) { Log::warn("Material::initParticlesEffect" "Invalid particle settings for material '%s'\n", m_texname.c_str()); return; } ParticleKind* particles = NULL; try { particles = pkm->getParticles(base); if (particles == NULL) { Log::warn("Material::initParticlesEffect", "Error loading particles '%s' for material '%s'\n", base.c_str(), m_texname.c_str()); } } catch (...) { Log::warn("Material::initParticlesEffect", "Cannot find particles '%s' for material '%s'\n", base.c_str(), m_texname.c_str()); return; } std::vector<std::string> conditions; node->get("condition", &conditions); const int count = (int)conditions.size(); if (count == 0) { Log::warn("material", "initParticlesEffect: Particles " "'%s' for material '%s' are declared but not used " "(no emission condition set).", base.c_str(), m_texname.c_str()); } for (int c=0; c<count; c++) { if (conditions[c] == "skid") { m_particles_effects[EMIT_ON_SKID] = particles; } else if (conditions[c] == "drive") { m_particles_effects[EMIT_ON_DRIVE] = particles; } else { Log::warn("material", "initParticlesEffect: Unknown " "condition '%s' for material '%s'", conditions[c].c_str(), m_texname.c_str()); } } } // initParticlesEffect