pe_defaultrail, like pe_default but for trails, works mostly with q2 for now though

additional Q2 TE_s supported
a few other particle fixes


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1454 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2005-10-08 22:35:20 +00:00
parent 0751c774e9
commit e47090201b
7 changed files with 140 additions and 174 deletions

View File

@ -3190,7 +3190,7 @@ int CL_PlayerColor(player_info_t *plr, int *name_ormask)
if (*t)
c = atoi(t);
else
c = plr->userid - 1;
c = plr->userid; // Quake2 can start from 0
if ((c / 7) & 1)
*name_ormask = CON_STANDARDMASK;

View File

@ -331,7 +331,9 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
case 0:
if (ent < 0 && ent >= -512) //a zquake concept. ent between -1 and -maxplayers is to be taken to be a railtrail from a particular player instead of a beam.
{
CLQ2_RailTrail(start, end);
// TODO: add support for those finnicky colored railtrails...
if (P_ParticleTrail(start, end, rt_railtrail, NULL))
P_ParticleTrailIndex(start, end, 208, 8, NULL);
return;
}
default:
@ -735,7 +737,10 @@ void CL_ParseTEnt (void)
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
if (P_RunParticleEffectTypeString(pos, NULL, 1, "te_explosionquad"))
P_ParticleExplosion (pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value)
@ -772,7 +777,10 @@ void CL_ParseTEnt (void)
pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
P_ParticleExplosion (pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value)
@ -809,7 +817,11 @@ void CL_ParseTEnt (void)
pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
P_ParticleExplosion (pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value)
@ -836,7 +848,10 @@ void CL_ParseTEnt (void)
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
if (P_RunParticleEffectTypeString(pos, NULL, 1, "te_bigexplosion"))
P_ParticleExplosion (pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value)
@ -951,7 +966,9 @@ void CL_ParseTEnt (void)
pos2[0] = MSG_ReadCoord ();
pos2[1] = MSG_ReadCoord ();
pos2[2] = MSG_ReadCoord ();
CLQ2_RailTrail (pos, pos2);
if (P_ParticleTrail(pos, pos2, rt_railtrail, NULL))
P_ParticleTrailIndex(pos, pos2, 208, 8, NULL);
break;
case TE_STREAM_CHAIN:
@ -1088,7 +1105,8 @@ void CL_ParseTEnt (void)
// stain (Hopefully this is close to how DP does it)
R_AddStain(pos, -10, -10, -10, 30);
P_ParticleTrail(pos, pos2, P_FindParticleType("te_plasmaburn"), NULL);
if (P_ParticleTrail(pos, pos2, P_FindParticleType("te_plasmaburn"), NULL))
P_ParticleTrailIndex(pos, pos2, 15, 0, NULL);
break;
case DPTE_TEI_G3: //nexuiz's nex beam
@ -1105,7 +1123,8 @@ void CL_ParseTEnt (void)
MSG_ReadCoord ();
MSG_ReadCoord ();
P_ParticleTrail(pos, pos2, P_FindParticleType("te_nexbeam"), NULL);
if (P_ParticleTrail(pos, pos2, P_FindParticleType("te_nexbeam"), NULL))
P_ParticleTrailIndex(pos, pos2, 15, 0, NULL);
break;
case DPTE_SMOKE:
@ -1527,6 +1546,7 @@ void CL_Laser (vec3_t start, vec3_t end, int colors)
VectorCopy (end, ex->oldorigin);
ex->flags = Q2RF_TRANSLUCENT | Q2RF_BEAM;
ex->start = cl.time;
ex->framerate = 100; // smoother fading
}
static qbyte splash_color[] = {0x00, 0xe0, 0xb0, 0x50, 0xd0, 0xe0, 0xe8};
@ -1556,7 +1576,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_BLOOD: // bullet hitting flesh
MSG_ReadPos (pos);
MSG_ReadDir (dir);
P_RunParticleEffectType(pos, dir, 1, pt_blood);
if (P_RunParticleEffectType(pos, dir, 1, pt_blood))
P_RunParticleEffect(pos, dir, 0xe8, 60);
R_AddStain(pos, 0, -10, -10, 40);
break;
@ -1707,7 +1728,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_RAILTRAIL: // railgun effect
MSG_ReadPos (pos);
MSG_ReadPos (pos2);
CLQ2_RailTrail (pos, pos2);
if (P_ParticleTrail(pos, pos2, rt_railtrail, NULL))
P_ParticleTrailIndex(pos, pos2, 0x74, 8, NULL);
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("weapons/railgf1a.wav"), 1, ATTN_NORM, 0);
break;
@ -1716,8 +1738,11 @@ void CLQ2_ParseTEnt (void)
case Q2TE_GRENADE_EXPLOSION_WATER:
MSG_ReadPos (pos);
P_ParticleExplosion (pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 0xe0, 256);
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value)
{
@ -1806,7 +1831,12 @@ void CLQ2_ParseTEnt (void)
// particle effect
if (type != Q2TE_EXPLOSION1_BIG && type != Q2TE_EXPLOSION1_NP)
P_ParticleExplosion (pos);
{
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 0xe0, 256);
R_AddStain(pos, -1, -1, -1, 100);
}
// light
if (r_explosionlight.value)
@ -1892,6 +1922,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_BFG_BIGEXPLOSION:
MSG_ReadPos (pos);
// CL_BFGExplosionParticles (pos);
if (P_RunParticleEffectTypeString(pos, dir, 1, "te_bfg_bigexplosion"))
P_RunParticleEffect(pos, dir, 0xd0, 256); // TODO: x+(r%8) unstead of x&7+(r&7)
break;
case Q2TE_BFG_LASER:
@ -1903,7 +1935,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_BUBBLETRAIL:
MSG_ReadPos (pos);
MSG_ReadPos (pos2);
CLQ2_BubbleTrail (pos, pos2);
if (P_ParticleTrail(pos, pos2, rt_bubbletrail, NULL))
P_ParticleTrailIndex(pos, pos2, 4, 8, NULL);
break;
case Q2TE_PARASITE_ATTACK:
@ -1928,6 +1961,9 @@ void CLQ2_ParseTEnt (void)
MSG_ReadPos (pos);
MSG_ReadDir (dir);
color = MSG_ReadByte ();
// TODO: fix to Q2's standards
P_RunParticleEffect(pos, dir, color, cnt);
/* CL_ParticleEffect2 (pos, dir, color, cnt);
ex = CL_AllocExplosion ();
@ -1948,6 +1984,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_GREENBLOOD:
MSG_ReadPos (pos);
MSG_ReadDir (dir);
if (P_RunParticleEffectTypeString(pos, dir, 1, "te_greenblood"))
P_RunParticleEffect(pos, dir, 0xdf, 30); // TODO: x+(r%8) unstead of x&7+(r&7)
// CL_ParticleEffect2 (pos, dir, 0xdf, 30);
break;
@ -2072,7 +2110,8 @@ void CLQ2_ParseTEnt (void)
case Q2TE_DEBUGTRAIL:
MSG_ReadPos (pos);
MSG_ReadPos (pos2);
P_ParticleTrail(pos, pos2, P_AllocateParticleType("te_debugtrail"), NULL);
if (P_ParticleTrail(pos, pos2, P_AllocateParticleType("te_debugtrail"), NULL))
P_ParticleTrailIndex(pos, pos2, 116, 8, NULL);
break;
case Q2TE_PLAIN_EXPLOSION:
@ -2169,13 +2208,15 @@ void CLQ2_ParseTEnt (void)
CL_BubbleTrail2 (pos, pos2, cnt);
S_StartSound (pos, 0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0);
break;
*/
case Q2TE_MOREBLOOD:
MSG_ReadPos (&net_message, pos);
MSG_ReadDir (&net_message, dir);
CL_ParticleEffect (pos, dir, 0xe8, 250);
MSG_ReadPos (pos);
MSG_ReadDir (dir);
if (P_RunParticleEffectTypeString(pos, dir, 1, "te_moreblood"))
if (P_RunParticleEffectType(pos, dir, 4, pt_blood))
P_RunParticleEffect(pos, dir, 0xe8, 250);
break;
/*
case Q2TE_CHAINFIST_SMOKE:
dir[0]=0; dir[1]=0; dir[2]=1;
MSG_ReadPos(&net_message, pos);
@ -2196,7 +2237,8 @@ void CLQ2_ParseTEnt (void)
MSG_ReadPos (pos);
// effect
P_RunParticleEffectTypeString(pos, NULL, 1, "te_tracker_explosion");
if (P_RunParticleEffectTypeString(pos, NULL, 1, "te_tracker_explosion"))
P_RunParticleEffect(pos, NULL, 0, 128); // TODO: needs to be nonrandom instead of 0+r%8
// light
// light
@ -2234,13 +2276,17 @@ void CLQ2_ParseTEnt (void)
CL_ParseNuke ();
break;
*/
case Q2TE_WIDOWSPLASH:
MSG_ReadPos (&net_message, pos);
CL_WidowSplash (pos);
MSG_ReadPos (pos);
// this one is really annoying, it's supposed to be a random choice
// between 2*8, 13*8, 21*8, 18*8
if (P_RunParticleEffectTypeString(pos, NULL, 1, "te_widowsplash"))
P_RunParticleEffect(pos, NULL, 13*8, 256);
break;
//PGM
//==============
*/
default:
Host_EndGame ("CLQ2_ParseTEnt: bad/non-implemented type %i", type);
}

View File

@ -105,7 +105,6 @@ void CLQ2_TrapParticles(entity_t *ent){};
void CLQ2_BfgParticles(entity_t *ent){};
void CLQ2_FlyEffect(q2centity_t *ent, vec3_t org){};
void CLQ2_DiminishingTrail(vec3_t oldorg, vec3_t neworg, q2centity_t *ent, unsigned int effects){};
void CLQ2_BlasterTrail(vec3_t oldorg, vec3_t neworg);
void CLQ2_BlasterTrail2(vec3_t oldorg, vec3_t neworg){};
@ -651,7 +650,10 @@ void CLQ2_AddProjectiles (void)
}
if (pr->effects & EF_BLASTER)
CLQ2_BlasterTrail (pr->oldorigin, ent.origin);
{
if (P_ParticleTrail(pr->oldorigin, ent.origin, rt_blastertrail, NULL))
P_ParticleTrailIndex(pr->oldorigin, ent.origin, 0xe0, 1, NULL);
}
V_AddLight (pr->origin, 200, 0.2, 0.2, 0);
VectorCopy (pr->angles, ent.angles);
@ -1706,14 +1708,15 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
{
if (effects & Q2EF_ROCKET)
{
P_ParticleTrail(cent->lerp_origin, ent.origin, rt_rocket, &cent->trailstate);
if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_rocket, &cent->trailstate))
P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xdc, 4, &cent->trailstate);
V_AddLight (ent.origin, 200, 0.2, 0.2, 0);
}
// PGM - Do not reorder EF_BLASTER and EF_HYPERBLASTER.
// EF_BLASTER | EF_TRACKER is a special case for EF_BLASTER2... Cheese!
else if (effects & Q2EF_BLASTER)
{
// CLQ2_BlasterTrail (cent->lerp_origin, ent.origin);
//PGM
if (effects & Q2EF_TRACKER) // lame... problematic?
{
@ -1722,7 +1725,8 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
}
else
{
P_ParticleTrail(cent->lerp_origin, ent.origin, rt_blastertrail, &cent->trailstate);
if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_blastertrail, &cent->trailstate))
P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xe0, 1, &cent->trailstate);
V_AddLight (ent.origin, 200, 0.2, 0.2, 0);
}
//PGM
@ -1736,11 +1740,13 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
}
else if (effects & Q2EF_GIB)
{
P_ParticleTrail(cent->lerp_origin, ent.origin, rt_gib, &cent->trailstate);
if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_gib, &cent->trailstate))
P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 0xe8, 8, &cent->trailstate);
}
else if (effects & Q2EF_GRENADE)
{
P_ParticleTrail(cent->lerp_origin, ent.origin, rt_grenade, &cent->trailstate);
if (P_ParticleTrail(cent->lerp_origin, ent.origin, rt_grenade, &cent->trailstate))
P_ParticleTrailIndex(cent->lerp_origin, ent.origin, 4, 8, &cent->trailstate);
}
else if (effects & Q2EF_FLIES)
{

View File

@ -2208,7 +2208,10 @@ static void PF_cl_te_explosion (progfuncs_t *prinst, struct globalvars_s *pr_glo
dl->channelfade[2] = 0.12;
}
P_ParticleExplosion(pos);
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
S_StartSound (-2, 0, cl_sfx_r_exp3, pos, 1, 1);
}
@ -2273,9 +2276,10 @@ static void PF_cl_te_explosionquad (progfuncs_t *prinst, struct globalvars_s *pr
{
float *pos = G_VECTOR(OFS_PARM0);
if (P_RunParticleEffectTypeString(pos, vec3_origin, 1, "te_explosionquad"))
{
P_ParticleExplosion(pos);
}
if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion))
P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111
R_AddStain(pos, -1, -1, -1, 100);
// light
if (r_explosionlight.value) {
@ -2384,7 +2388,10 @@ static void PF_cl_te_explosionrgb (progfuncs_t *prinst, struct globalvars_s *pr_
dlight_t *dl;
P_ParticleExplosion (org);
if (P_RunParticleEffectType(org, NULL, 1, pt_explosion))
P_RunParticleEffect(org, NULL, 107, 1024); // should be 97-111
R_AddStain(org, -1, -1, -1, 100);
// light
if (r_explosionlight.value)

View File

@ -60,7 +60,8 @@ int pt_explosion,
int pe_default,
pe_size2,
pe_size3;
pe_size3,
pe_defaulttrail;
int rt_blastertrail,
rt_railtrail,
@ -1022,6 +1023,7 @@ void P_AssosiateTrail_f (void)
void P_DefaultTrail (model_t *model)
{
// TODO: EF_BRIGHTFIELD should probably be handled in here somewhere
if (model->engineflags & MDLF_NODEFAULTTRAIL)
return;
@ -1280,6 +1282,7 @@ void P_InitParticles (void)
pe_default = P_AllocateParticleType("pe_default");
pe_size2 = P_AllocateParticleType("pe_size2");
pe_size3 = P_AllocateParticleType("pe_size3");
pe_defaulttrail = P_AllocateParticleType("pe_defaulttrail");
}
@ -1807,12 +1810,6 @@ static trailstate_t *P_NewTrailstate(trailstate_t **key)
return ts;
}
/*
===============
R_EntityParticles
===============
*/
#define NUMVERTEXNORMALS 162
float r_avertexnormals[NUMVERTEXNORMALS][3] = {
#include "anorms.h"
@ -1823,105 +1820,6 @@ vec2_t avelocities[NUMVERTEXNORMALS];
// float partstep = 0.01;
// float timescale = 0.01;
void P_EntityParticles (float *org, qbyte colour, float *radius)
{
part_type[pt_entityparticles].areaspread = radius[0]*0.5 + radius[1]*0.5;
part_type[pt_entityparticles].areaspreadvert = radius[2];
part_type[pt_entityparticles].colorindex = colour;
P_RunParticleEffectType(org, NULL, 1, pt_entityparticles);
}
/*
===============
R_ParticleExplosion
===============
*/
void P_ParticleExplosion (vec3_t org)
{
// int i, j;
// particle_t *p;
P_RunParticleEffectType(org, NULL, 1, pt_explosion);
R_AddStain(org, -1, -1, -1, 100);
/*
for (i=0 ; i<r_particles_in_explosion.value ; i++)
{
if (!free_particles)
return;
if ((rand()&3)==3)
{
p = free_particles;
free_particles = p->next;
p->next = active_sparks;
active_sparks = p;
p->scale = 1;
p->alpha = 0.8 + (rand()&15)/(15.0*5);
p->die = particletime + 7;
p->color = ramp1[0];
p->ramp = rand()&3;
if (i & 1)
{
p->type = st_shrapnal;
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j];// + ((rand()%32)-16);
p->vel[j] = ((rand()%512)-256)*r_particle_explosion_speed.value;
}
}
else
{
p->type = pt_grav;
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j];// + ((rand()%32)-16);
p->vel[j] = ((rand()%512)-256)*r_particle_explosion_speed.value;
}
}
}
else
{
p = free_particles;
free_particles = p->next;
p->next = active_sparks;
active_sparks = p;
p->scale = 1;
p->alpha = 0.8;
p->die = particletime + 7;
p->color = ramp1[0];
p->ramp = rand()&3;
if (i & 1)
{
p->type = st_shrapnal;
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j];// + ((rand()%32)-16);
p->vel[j] = ((rand()%512)-256)*r_particle_explosion_speed.value;
}
}
else
{
p->type = st_shrapnal;
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j];// + ((rand()%32)-16);
p->vel[j] = ((rand()%512)-256)*r_particle_explosion_speed.value;
}
}
}
}*/
}
/*
===============
R_BlobExplosion
===============
*/
int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out);
int P_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk)
{
@ -2329,6 +2227,30 @@ int P_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum,
m += 0.1762891; // some BS number to try to "randomize" things
}
break;
case SM_DISTBALL:
{
float rdist;
rdist = ptype->spawnparam2 - crandom()*(1-(crandom() * ptype->spawnparam1));
// this is a strange spawntype, which is based on the fact that
// crandom()*crandom() provides something similar to an exponential
// probability curve
ofsvec[0] = hrandom();
ofsvec[1] = hrandom();
if (ptype->areaspreadvert)
ofsvec[2] = hrandom();
else
ofsvec[2] = 0;
VectorNormalize(ofsvec);
VectorScale(ofsvec, rdist, ofsvec);
arsvec[0] = ofsvec[0]*ptype->areaspread;
arsvec[1] = ofsvec[1]*ptype->areaspread;
arsvec[2] = ofsvec[2]*ptype->areaspreadvert;
}
break;
default: // SM_BALL, SM_CIRCLE
ofsvec[0] = hrandom();
ofsvec[1] = hrandom();
@ -2458,7 +2380,7 @@ void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk)
/*
===============
R_RunParticleEffect
P_RunParticleEffect
===============
*/
@ -2529,7 +2451,7 @@ void P_RunParticleEffect2 (vec3_t org, vec3_t dmin, vec3_t dmax, int color, int
/*
===============
R_RunParticleEffect3
P_RunParticleEffect3
===============
*/
@ -2571,7 +2493,7 @@ void P_RunParticleEffect3 (vec3_t org, vec3_t box, int color, int effect, int co
/*
===============
R_RunParticleEffect4
P_RunParticleEffect4
===============
*/
@ -2689,23 +2611,7 @@ void P_LavaSplash (vec3_t org)
P_RunParticleEffectType(org, NULL, 1, pt_lavasplash);
}
/*
===============
R_TeleportSplash
===============
*/
void CLQ2_BlasterTrail (vec3_t start, vec3_t end)
{
P_ParticleTrail(start, end, rt_blastertrail, NULL);
}
void CLQ2_RailTrail (vec3_t start, vec3_t end)
{
P_ParticleTrail(start, end, rt_railtrail, NULL);
}
static int P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype, trailstate_t **tsk)
static void P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype, trailstate_t **tsk)
{
vec3_t vec, vstep, right, up, start;
float len;
@ -2763,7 +2669,7 @@ static int P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype,
if (ptype->spawntime && ts)
{
if (ts->statetime > particletime)
return 0; // timelimit still in effect
return; // timelimit still in effect
ts->statetime = particletime + ptype->spawntime; // record old time
ts = NULL; // clear trailstate so we don't save length/lastseg
@ -2771,7 +2677,7 @@ static int P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype,
// random chance for trails
if (ptype->spawnchance < frandom())
return 0; // don't spawn but return success
return; // don't spawn but return success
if (!ptype->die)
ts = NULL;
@ -3096,7 +3002,7 @@ static int P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype,
}
}
return 0;
return;
}
int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
@ -3119,12 +3025,15 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
ptype = &part_type[ptype->inwater];
}
return P_ParticleTrailDraw (startpos, end, ptype, tsk);
P_ParticleTrailDraw (startpos, end, ptype, tsk);
return 0;
}
void CLQ2_BubbleTrail (vec3_t start, vec3_t end)
void P_ParticleTrailIndex (vec3_t start, vec3_t end, int color, int crnd, trailstate_t **tsk)
{
P_ParticleTrail(start, end, rt_bubbletrail, NULL);
part_type[pe_defaulttrail].colorindex = color;
part_type[pe_defaulttrail].colorrand = crnd;
P_ParticleTrail(start, end, pe_defaulttrail, tsk);
}
#ifdef Q2BSPS

View File

@ -309,8 +309,6 @@ void Media_RecordFrame (void);
void R_SetRenderer(int wanted);
void RQ_Init(void);
void CLQ2_RailTrail (vec3_t start, vec3_t end);
void CLQ2_BubbleTrail (vec3_t start, vec3_t end);
void CLQ2_EntityEvent(entity_state_t *es);
void CLQ2_TeleporterParticles(entity_state_t *es);
void CLQ2_IonripperTrail(vec3_t oldorg, vec3_t neworg);

View File

@ -20,7 +20,8 @@ extern int pt_explosion,
pt_flame,
pt_bullet,
pt_superbullet,
pe_default;
pe_default,
pe_defaulttrail;
extern int rt_blastertrail,
rt_railtrail,
@ -157,18 +158,17 @@ void P_RunParticleEffect3 (vec3_t org, vec3_t box, int color, int effect, int co
void P_RunParticleEffect4 (vec3_t org, float radius, int color, int effect, int count);
void P_DarkFieldParticles (float *org, qbyte colour);
void P_EntityParticles (float *org, qbyte colour, float *radius); //nq's EF_BRIGHTFIELD
void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk); //particles centered around a model, called every frame for those models.
//functions that spawn point effects (basically just pass throughs)
void P_BlobExplosion (vec3_t org); //tarbaby explosion or TF emp.
void P_ParticleExplosion (vec3_t org); //rocket explosion (sprite is allocated seperatly :( )
void P_LavaSplash (vec3_t org); //cthon dying, or a gas grenade.
void P_RunParticleCube(vec3_t minb, vec3_t maxb, vec3_t dir, float count, int colour, qboolean gravity, float jitter);
void P_RunParticleWeather(vec3_t minb, vec3_t maxb, vec3_t dir, float count, int colour, char *efname);
//the core spawn function for trails. (trailstate can be null)
int P_ParticleTrail (vec3_t start, vec3_t end, int type, trailstate_t **trailstate);
void P_ParticleTrailIndex (vec3_t start, vec3_t end, int color, int rndcolor, trailstate_t **trailstate);
void P_DefaultTrail (struct model_s *model); //fills in the default particle properties for a loaded model. Should already have the model flags set.