Ejemplo n.º 1
0
void
ThrowGib (edict_t * self, char *gibname, int damage, int type)
{
  edict_t *gib;
  vec3_t vd;
  vec3_t origin;
  vec3_t size;
  float vscale;

  gib = G_Spawn ();

  VectorScale (self->size, 0.5, size);
  VectorAdd (self->absmin, size, origin);
  gib->s.origin[0] = origin[0] + crandom () * size[0];
  gib->s.origin[1] = origin[1] + crandom () * size[1];
  gib->s.origin[2] = origin[2] + crandom () * size[2];
  VectorCopy( gib->s.origin, gib->old_origin );

  gi.setmodel (gib, gibname);
  gib->solid = SOLID_NOT;
  gib->s.effects |= EF_GIB;
  gib->flags |= FL_NO_KNOCKBACK;
  gib->takedamage = DAMAGE_YES;
  gib->die = gib_die;

  if (type == GIB_ORGANIC)
    {
      gib->movetype = MOVETYPE_TOSS;
      gib->touch = gib_touch;
      vscale = 0.5;
    }
  else
    {
      gib->movetype = MOVETYPE_BOUNCE;
      vscale = 1.0;
    }

  VelocityForDamage (damage, vd);
  VectorMA (self->velocity, vscale, vd, gib->velocity);
  ClipGibVelocity (gib);
  gib->avelocity[0] = random () * 600;
  gib->avelocity[1] = random () * 600;
  gib->avelocity[2] = random () * 600;

  gib->think = G_FreeEdict;
  gib->nextthink = level.framenum + (10 + random() * 10) * HZ;

  gi.linkentity (gib);
}
Ejemplo n.º 2
0
void ThrowHead (edict_t *self, char *gibname, int damage, int type)
{
	vec3_t	vd;
	float	vscale;

	self->s.skinnum = 0;
	self->s.frame = 0;
	VectorClear (self->mins);
	VectorClear (self->maxs);

	self->s.modelindex2 = 0;
	gi.setmodel (self, gibname);
	self->solid = SOLID_NOT;
	self->s.effects |= EF_GIB;
	self->s.effects &= ~EF_FLIES;
	self->s.sound = 0;
	self->flags |= FL_NO_KNOCKBACK;
	self->svflags &= ~SVF_MONSTER;
	//self->takedamage = DAMAGE_YES;
	//self->die = gib_die;
	self->enttype = ENT_GIB;

	if (type == GIB_ORGANIC)
	{
		self->movetype = MOVETYPE_TOSS;
		//self->touch = gib_touch;
		vscale = 0.5;
	}
	else
	{
		self->movetype = MOVETYPE_BOUNCE;
		vscale = 1.0;
	}

	VelocityForDamage (damage, vd);
	VectorMA (self->velocity, vscale, vd, self->velocity);
	ClipGibVelocity (self);

	self->avelocity[YAW] = crandom()*600;

	self->think = G_FreeEdict;
	self->nextthink = level.time + (10 + random()*10) * (1 * SERVER_FPS);

	gi.linkentity (self);
}
Ejemplo n.º 3
0
void Gib::SetVelocity
	(
	float damage
	)

   {
   velocity[0] = 100.0 * crandom();
	velocity[1] = 100.0 * crandom();
	velocity[2] = 200.0 + 100.0 * random();

   avelocity = Vector( G_Random( 600 ), G_Random( 600 ), G_Random( 600 ) );

   if ( ( damage < -150 )  && ( G_Random() > 0.95f ) )
      velocity *= 2.0f;
   else if ( damage < -100 )
      velocity *= 1.5f;

   ClipGibVelocity();
   }
Ejemplo n.º 4
0
void
ThrowWidowGibReal(edict_t *self, char *gibname, int damage, int type,
		vec3_t startpos, qboolean sized, int hitsound, qboolean fade)
{
	edict_t *gib;
	vec3_t vd;
	vec3_t origin;
	vec3_t size;
	float vscale;

	if (!self || !gibname)
	{
		return;
	}

	gib = G_Spawn();

	if (startpos)
	{
		VectorCopy(startpos, gib->s.origin);
	}
	else
	{
		VectorScale(self->size, 0.5, size);
		VectorAdd(self->absmin, size, origin);
		gib->s.origin[0] = origin[0] + crandom() * size[0];
		gib->s.origin[1] = origin[1] + crandom() * size[1];
		gib->s.origin[2] = origin[2] + crandom() * size[2];
	}

	gib->solid = SOLID_NOT;
	gib->s.effects |= EF_GIB;
	gib->flags |= FL_NO_KNOCKBACK;
	gib->takedamage = DAMAGE_YES;
	gib->die = gib_die;
	gib->s.renderfx |= RF_IR_VISIBLE;

	if (fade)
	{
		gib->think = G_FreeEdict;

		/* sized gibs last longer */
		if (sized)
		{
			gib->nextthink = level.time + 20 + random() * 15;
		}
		else
		{
			gib->nextthink = level.time + 5 + random() * 10;
		}
	}
	else
	{
		gib->think = G_FreeEdict;

		/* sized gibs last longer */
		if (sized)
		{
			gib->nextthink = level.time + 60 + random() * 15;
		}
		else
		{
			gib->nextthink = level.time + 25 + random() * 10;
		}
	}

	if (type == GIB_ORGANIC)
	{
		gib->movetype = MOVETYPE_TOSS;
		gib->touch = gib_touch;
		vscale = 0.5;
	}
	else
	{
		gib->movetype = MOVETYPE_BOUNCE;
		vscale = 1.0;
	}

	WidowVelocityForDamage(damage, vd);
	VectorMA(self->velocity, vscale, vd, gib->velocity);
	ClipGibVelocity(gib);

	gi.setmodel(gib, gibname);

	if (sized)
	{
		gib->plat2flags = hitsound;
		gib->solid = SOLID_BBOX;
		gib->avelocity[0] = random() * 400;
		gib->avelocity[1] = random() * 400;
		gib->avelocity[2] = random() * 200;

		if (gib->velocity[2] < 0)
		{
			gib->velocity[2] *= -1;
		}

		gib->velocity[0] *= 2;
		gib->velocity[1] *= 2;
		ClipGibVelocity(gib);
		gib->velocity[2] = max((350 + (random() * 100.0)), gib->velocity[2]);
		gib->gravity = 0.25;
		gib->touch = widow_gib_touch;
		gib->owner = self;

		if (gib->s.modelindex == gi.modelindex("models/monsters/blackwidow2/gib2/tris.md2"))
		{
			VectorSet(gib->mins, -10, -10, 0);
			VectorSet(gib->maxs, 10, 10, 10);
		}
		else
		{
			VectorSet(gib->mins, -5, -5, 0);
			VectorSet(gib->maxs, 5, 5, 5);
		}
	}
	else
	{
		gib->velocity[0] *= 2;
		gib->velocity[1] *= 2;
		gib->avelocity[0] = random() * 600;
		gib->avelocity[1] = random() * 600;
		gib->avelocity[2] = random() * 600;
	}

	gi.linkentity(gib);
}