Beispiel #1
0
void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius,
	bool is_attached, const v3f &attached_pos, float attached_yaw)
{
	v3f ppos = m_player->getPosition() / BS;
	v3f pos = random_v3f(m_minpos, m_maxpos);

	// Need to apply this first or the following check
	// will be wrong for attached spawners
	if (is_attached) {
		pos.rotateXZBy(attached_yaw);
		pos += attached_pos;
	}

	if (pos.getDistanceFrom(ppos) > radius)
		return;

	v3f vel = random_v3f(m_minvel, m_maxvel);
	v3f acc = random_v3f(m_minacc, m_maxacc);

	if (is_attached) {
		// Apply attachment yaw
		vel.rotateXZBy(attached_yaw);
		acc.rotateXZBy(attached_yaw);
	}

	float exptime = rand() / (float)RAND_MAX
			* (m_maxexptime - m_minexptime)
			+ m_minexptime;
	float size = rand() / (float)RAND_MAX
			* (m_maxsize - m_minsize)
			+ m_minsize;

	m_particlemanager->addParticle(new Particle(
		m_gamedef,
		m_player,
		env,
		pos,
		vel,
		acc,
		exptime,
		size,
		m_collisiondetection,
		m_collision_removal,
		m_object_collision,
		m_vertical,
		m_texture,
		v2f(0.0, 0.0),
		v2f(1.0, 1.0),
		m_animation,
		m_glow
	));
}
Beispiel #2
0
void ParticleSpawner::step(float dtime, ClientEnvironment* env)
{
	m_time += dtime;

	bool unloaded = false;
	bool is_attached = false;
	v3f attached_pos = v3f(0,0,0);
	float attached_yaw = 0;
	if (m_attached_id != 0) {
		if (ClientActiveObject *attached = env->getActiveObject(m_attached_id)) {
			attached_pos = attached->getPosition() / BS;
			attached_yaw = attached->getYaw();
			is_attached = true;
		} else {
			unloaded = true;
		}
	}

	if (m_spawntime != 0) // Spawner exists for a predefined timespan
	{
		for(std::vector<float>::iterator i = m_spawntimes.begin();
				i != m_spawntimes.end();)
		{
			if ((*i) <= m_time && m_amount > 0)
			{
				m_amount--;

				// Pretend to, but don't actually spawn a
				// particle if it is attached to an unloaded
				// object.
				if (!unloaded) {
					v3f pos = random_v3f(m_minpos, m_maxpos);
					v3f vel = random_v3f(m_minvel, m_maxvel);
					v3f acc = random_v3f(m_minacc, m_maxacc);

					if (is_attached) {
						// Apply attachment yaw and position
						pos.rotateXZBy(attached_yaw);
						pos += attached_pos;
						vel.rotateXZBy(attached_yaw);
						acc.rotateXZBy(attached_yaw);
					}

					float exptime = rand()/(float)RAND_MAX
							*(m_maxexptime-m_minexptime)
							+m_minexptime;
					float size = rand()/(float)RAND_MAX
							*(m_maxsize-m_minsize)
							+m_minsize;

					Particle* toadd = new Particle(
						m_gamedef,
						m_smgr,
						m_player,
						env,
						pos,
						vel,
						acc,
						exptime,
						size,
						m_collisiondetection,
						m_collision_removal,
						m_vertical,
						m_texture,
						v2f(0.0, 0.0),
						v2f(1.0, 1.0),
						m_animation,
						m_glow);
					m_particlemanager->addParticle(toadd);
				}
				i = m_spawntimes.erase(i);
			}
			else
			{
				++i;
			}
		}
	}
	else // Spawner exists for an infinity timespan, spawn on a per-second base
	{
		// Skip this step if attached to an unloaded object
		if (unloaded)
			return;
		for (int i = 0; i <= m_amount; i++)
		{
			if (rand()/(float)RAND_MAX < dtime)
			{
				v3f pos = random_v3f(m_minpos, m_maxpos);
				v3f vel = random_v3f(m_minvel, m_maxvel);
				v3f acc = random_v3f(m_minacc, m_maxacc);

				if (is_attached) {
					// Apply attachment yaw and position
					pos.rotateXZBy(attached_yaw);
					pos += attached_pos;
					vel.rotateXZBy(attached_yaw);
					acc.rotateXZBy(attached_yaw);
				}

				float exptime = rand()/(float)RAND_MAX
						*(m_maxexptime-m_minexptime)
						+m_minexptime;
				float size = rand()/(float)RAND_MAX
						*(m_maxsize-m_minsize)
						+m_minsize;

				Particle* toadd = new Particle(
					m_gamedef,
					m_smgr,
					m_player,
					env,
					pos,
					vel,
					acc,
					exptime,
					size,
					m_collisiondetection,
					m_collision_removal,
					m_vertical,
					m_texture,
					v2f(0.0, 0.0),
					v2f(1.0, 1.0),
					m_animation,
					m_glow);
				m_particlemanager->addParticle(toadd);
			}
		}
	}
}
Beispiel #3
0
void ParticleSpawner::step(float dtime, ClientEnvironment* env)
{
	m_time += dtime;

	if (m_spawntime != 0) // Spawner exists for a predefined timespan
	{
		for(std::vector<float>::iterator i = m_spawntimes.begin();
				i != m_spawntimes.end();)
		{
			if ((*i) <= m_time && m_amount > 0)
			{
				m_amount--;

				v3f pos = random_v3f(m_minpos, m_maxpos);
				v3f vel = random_v3f(m_minvel, m_maxvel);
				v3f acc = random_v3f(m_minacc, m_maxacc);
				float exptime = rand()/(float)RAND_MAX
						*(m_maxexptime-m_minexptime)
						+m_minexptime;
				float size = rand()/(float)RAND_MAX
						*(m_maxsize-m_minsize)
						+m_minsize;

				Particle* toadd = new Particle(
					m_gamedef,
					m_smgr,
					m_player,
					env,
					pos,
					vel,
					acc,
					exptime,
					size,
					m_collisiondetection,
					m_vertical,
					m_texture,
					v2f(0.0, 0.0),
					v2f(1.0, 1.0));
				m_particlemanager->addParticle(toadd);
				i = m_spawntimes.erase(i);
			}
			else
			{
				++i;
			}
		}
	}
	else // Spawner exists for an infinity timespan, spawn on a per-second base
	{
		for (int i = 0; i <= m_amount; i++)
		{
			if (rand()/(float)RAND_MAX < dtime)
			{
				v3f pos = random_v3f(m_minpos, m_maxpos);
				v3f vel = random_v3f(m_minvel, m_maxvel);
				v3f acc = random_v3f(m_minacc, m_maxacc);
				float exptime = rand()/(float)RAND_MAX
						*(m_maxexptime-m_minexptime)
						+m_minexptime;
				float size = rand()/(float)RAND_MAX
						*(m_maxsize-m_minsize)
						+m_minsize;

				Particle* toadd = new Particle(
					m_gamedef,
					m_smgr,
					m_player,
					env,
					pos,
					vel,
					acc,
					exptime,
					size,
					m_collisiondetection,
					m_vertical,
					m_texture,
					v2f(0.0, 0.0),
					v2f(1.0, 1.0));
				m_particlemanager->addParticle(toadd);
			}
		}
	}
}