0b792a6355
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3053 fc73d0e0-1445-4013-8a0c-d673dee63da5
294 lines
No EOL
6.8 KiB
C++
294 lines
No EOL
6.8 KiB
C++
|
|
// Effects code (EFF) --
|
|
|
|
// TE effects/muzzleflash/messages
|
|
|
|
// modular efs
|
|
var float ef_red = 0; // used for glow on pent item
|
|
var float ef_pent = EF_DIMLIGHT; // used for pent effect on player
|
|
var float ef_blue = 0; // used for glow on quad
|
|
var float ef_quad = EF_DIMLIGHT; // used for quad effect on player
|
|
|
|
// base te write functions
|
|
void WriteVector (float msg, vector org) =
|
|
{
|
|
WriteCoord (msg, org_x);
|
|
WriteCoord (msg, org_y);
|
|
WriteCoord (msg, org_z);
|
|
};
|
|
|
|
#ifdef NETQUAKE
|
|
void(vector org, float effect) _EFF_PointEffect =
|
|
{
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, effect);
|
|
WriteVector (MSG_BROADCAST, org);
|
|
};
|
|
|
|
void(entity ent, vector org, vector org2, float effect) _EFF_BeamEffect =
|
|
{
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, effect);
|
|
WriteEntity (MSG_BROADCAST, ent);
|
|
WriteVector (MSG_BROADCAST, org);
|
|
WriteVector (MSG_BROADCAST, org2);
|
|
};
|
|
|
|
void(vector org, float damage, float effect) _EFF_CountEffect =
|
|
{
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, effect);
|
|
WriteByte (MSG_BROADCAST, damage);
|
|
WriteVector (MSG_BROADCAST, org);
|
|
};
|
|
|
|
#define EFF_PointEffect(a,b,c) _EFF_PointEffect(a,b)
|
|
#define EFF_BeamEffect(a,b,c,d,e) _EFF_BeamEffect(a,b,c,d)
|
|
#define EFF_CountEffect(a,b,c,d) _EFF_CountEffect(a,b,c)
|
|
#else
|
|
void(vector org, float effect, float mcast) EFF_PointEffect =
|
|
{
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, effect);
|
|
WriteVector (MSG_MULTICAST, org);
|
|
multicast (org, mcast);
|
|
};
|
|
|
|
void(entity ent, vector org, vector org2, float effect, float mcast) EFF_BeamEffect =
|
|
{
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, effect);
|
|
WriteEntity (MSG_MULTICAST, ent);
|
|
WriteVector (MSG_MULTICAST, org);
|
|
WriteVector (MSG_MULTICAST, org2);
|
|
multicast (org, mcast);
|
|
};
|
|
|
|
void(vector org, float damage, float effect, float mcast) EFF_CountEffect =
|
|
{
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, effect);
|
|
WriteByte (MSG_MULTICAST, damage);
|
|
WriteVector (MSG_MULTICAST, org);
|
|
multicast (org, mcast);
|
|
};
|
|
#endif
|
|
|
|
/*
|
|
================
|
|
SpawnBlood
|
|
================
|
|
*/
|
|
void(vector org, float damage) _SpawnBlood_TEBlood =
|
|
{
|
|
te_blood(org, '0 0 0', damage*2);
|
|
};
|
|
|
|
void(vector org, float damage) _SpawnBlood =
|
|
{
|
|
#ifdef NETQUAKE
|
|
particle (org, '0 0 0', 73, damage*2);
|
|
#else
|
|
EFF_CountEffect(org, damage, TE_BLOOD, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
// #if defined(NETQUAKE) || defined(MONSTERS)
|
|
void() s_explode6 = [5, SUB_Remove] {};
|
|
void() s_explode5 = [4, s_explode6] {};
|
|
void() s_explode4 = [3, s_explode5] {};
|
|
void() s_explode3 = [2, s_explode4] {};
|
|
void() s_explode2 = [1, s_explode3] {};
|
|
void() s_explode1 = [0, s_explode2] {};
|
|
|
|
void(vector org) CreateExplosion =
|
|
{
|
|
local entity s;
|
|
|
|
s = self; // save old self
|
|
|
|
self = spawn();
|
|
|
|
self.movetype = MOVETYPE_NONE;
|
|
self.velocity = '0 0 0';
|
|
self.touch = SUB_Null;
|
|
setmodel (self, "progs/s_explod.spr");
|
|
setorigin (self, org);
|
|
self.solid = SOLID_NOT;
|
|
s_explode1 ();
|
|
|
|
self = s; // restore old self
|
|
};
|
|
// #endif
|
|
|
|
void(vector org) _TE_explosion =
|
|
{
|
|
EFF_PointEffect(org, TE_EXPLOSION, MULTICAST_PHS);
|
|
#ifdef NETQUAKE
|
|
CreateExplosion(org);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_gunshot =
|
|
{
|
|
#ifdef NETQUAKE
|
|
EFF_PointEffect(org, TE_GUNSHOT, MULTICAST_PVS);
|
|
#else
|
|
EFF_CountEffect(org, 3, TE_GUNSHOT, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_spike =
|
|
{
|
|
EFF_PointEffect(org, TE_SPIKE, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) _TE_knightspike =
|
|
{
|
|
EFF_PointEffect(org, TE_KNIGHTSPIKE, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) _TE_wizspike =
|
|
{
|
|
EFF_PointEffect(org, TE_WIZSPIKE, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) _TE_superspike =
|
|
{
|
|
EFF_PointEffect(org, TE_SUPERSPIKE, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) _TE_teleport =
|
|
{
|
|
EFF_PointEffect(org, TE_TELEPORT, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) _TE_lavasplash =
|
|
{
|
|
EFF_PointEffect(org, TE_LAVASPLASH, MULTICAST_PVS);
|
|
};
|
|
|
|
void(vector org) _TE_tarexplosion =
|
|
{
|
|
EFF_PointEffect(org, TE_TAREXPLOSION, MULTICAST_PHS);
|
|
};
|
|
|
|
void(entity ent, vector start, vector end) _TE_lightning1 =
|
|
{
|
|
EFF_BeamEffect (ent, start, end, TE_LIGHTNING1, MULTICAST_PHS);
|
|
};
|
|
|
|
void(entity ent, vector start, vector end) _TE_lightning2 =
|
|
{
|
|
EFF_BeamEffect (ent, start, end, TE_LIGHTNING2, MULTICAST_PHS);
|
|
};
|
|
|
|
void(entity ent, vector start, vector end) _TE_lightning3 =
|
|
{
|
|
EFF_BeamEffect (ent, start, end, TE_LIGHTNING3, MULTICAST_PHS);
|
|
};
|
|
|
|
void(vector org) TE_lightningblood =
|
|
{
|
|
#ifdef NETQUAKE
|
|
particle(org, '0 0 100', 225, 120);
|
|
#else
|
|
EFF_PointEffect(org, TE_LIGHTNINGBLOOD, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
// function pointers for TE calls
|
|
var void(vector org, float damage) SpawnBlood = _SpawnBlood;
|
|
var void(vector org) TE_explosion = _TE_explosion;
|
|
var void(vector org) TE_gunshot = _TE_gunshot;
|
|
var void(vector org) TE_spike = _TE_spike;
|
|
var void(vector org) TE_knightspike = _TE_knightspike;
|
|
var void(vector org) TE_wizspike = _TE_wizspike;
|
|
var void(vector org) TE_superspike = _TE_superspike;
|
|
var void(vector org) TE_teleport = _TE_teleport;
|
|
var void(vector org) TE_lavasplash = _TE_lavasplash;
|
|
var void(vector org) TE_tarexplosion = _TE_tarexplosion;
|
|
var void(entity ent, vector start, vector end) TE_lightning1 = _TE_lightning1;
|
|
var void(entity ent, vector start, vector end) TE_lightning2 = _TE_lightning2;
|
|
var void(entity ent, vector start, vector end) TE_lightning3 = _TE_lightning3;
|
|
|
|
// set effects function, takes function pointers and assigns them based on detected builtins
|
|
void() EFF_SetEffects =
|
|
{
|
|
if (eng_support & ENG_EFRED)
|
|
{
|
|
ef_pent = 128;
|
|
ef_red = 128;
|
|
}
|
|
|
|
if (eng_support & ENG_EFBLUE)
|
|
{
|
|
ef_blue = 64;
|
|
ef_quad = 64;
|
|
}
|
|
|
|
if (eng_support & ENG_TEBUILTINS)
|
|
{
|
|
// use TE_ builtins instead
|
|
TE_explosion = _te_explosion;
|
|
TE_gunshot = _te_gunshot;
|
|
TE_spike = _te_spike;
|
|
TE_knightspike = _te_knightspike;
|
|
TE_wizspike = _te_wizspike;
|
|
TE_superspike = _te_superspike;
|
|
TE_teleport = _te_teleport;
|
|
TE_lavasplash = _te_lavasplash;
|
|
TE_tarexplosion = _te_tarexplosion;
|
|
TE_lightning1 = _te_lightning1;
|
|
TE_lightning2 = _te_lightning2;
|
|
TE_lightning3 = _te_lightning3;
|
|
}
|
|
|
|
if (eng_support & ENG_TEBLOOD)
|
|
SpawnBlood = _SpawnBlood_TEBlood; // use TE_Blood builtin instead
|
|
};
|
|
|
|
// view kicks
|
|
void(entity ent) VK_smallkick =
|
|
{
|
|
#ifdef NETQUAKE
|
|
self.punchangle_x = -2;
|
|
#else
|
|
msg_entity = ent;
|
|
WriteByte (MSG_ONE, SVC_SMALLKICK);
|
|
#endif
|
|
}
|
|
|
|
void(entity ent) VK_bigkick =
|
|
{
|
|
#ifdef NETQUAKE
|
|
self.punchangle_x = -4;
|
|
#else
|
|
msg_entity = ent;
|
|
WriteByte (MSG_ONE, SVC_BIGKICK);
|
|
#endif
|
|
}
|
|
|
|
// muzzle flash
|
|
void() muzzleflash =
|
|
{
|
|
#ifdef NETQUAKE
|
|
self.effects |= EF_MUZZLEFLASH;
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_MUZZLEFLASH);
|
|
WriteEntity (MSG_MULTICAST, self);
|
|
multicast (self.origin, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
// touch blood functions
|
|
void(float damage) spawn_touchblood =
|
|
{
|
|
local vector vel;
|
|
|
|
vel = normalize (self.velocity);
|
|
vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
|
|
vel = vel + 2*trace_plane_normal;
|
|
vel = vel * 0.4;
|
|
SpawnBlood (self.origin + vel, damage);
|
|
};
|