99854ae8ec
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1066 fc73d0e0-1445-4013-8a0c-d673dee63da5
319 lines
7.9 KiB
C++
319 lines
7.9 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
|
|
|
|
/*
|
|
================
|
|
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
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_BLOOD);
|
|
WriteByte (MSG_MULTICAST, damage);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
#ifdef NETQUAKE
|
|
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 =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
CreateExplosion(org);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_gunshot =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_GUNSHOT);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_GUNSHOT);
|
|
WriteByte (MSG_MULTICAST, 3);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PVS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_spike =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_SPIKE);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_SPIKE);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_knightspike =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_KNIGHTSPIKE);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_KNIGHTSPIKE);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_wizspike =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_WIZSPIKE);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_WIZSPIKE);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_superspike =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_SUPERSPIKE);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_SUPERSPIKE);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) _TE_teleport =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_TELEPORT);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_TELEPORT);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(entity ent, vector start, vector end) _TE_lightning2 =
|
|
{
|
|
#ifdef NETQUAKE
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
|
|
WriteEntity (MSG_BROADCAST, ent);
|
|
WriteCoord (MSG_BROADCAST, start_x);
|
|
WriteCoord (MSG_BROADCAST, start_y);
|
|
WriteCoord (MSG_BROADCAST, start_z);
|
|
WriteCoord (MSG_BROADCAST, end_x);
|
|
WriteCoord (MSG_BROADCAST, end_y);
|
|
WriteCoord (MSG_BROADCAST, end_z);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_LIGHTNING2);
|
|
WriteEntity (MSG_MULTICAST, ent);
|
|
WriteCoord (MSG_MULTICAST, start_x);
|
|
WriteCoord (MSG_MULTICAST, start_y);
|
|
WriteCoord (MSG_MULTICAST, start_z);
|
|
WriteCoord (MSG_MULTICAST, end_x);
|
|
WriteCoord (MSG_MULTICAST, end_y);
|
|
WriteCoord (MSG_MULTICAST, end_z);
|
|
multicast (start, MULTICAST_PHS);
|
|
#endif
|
|
};
|
|
|
|
void(vector org) TE_lightningblood =
|
|
{
|
|
#ifdef NETQUAKE
|
|
particle(org, '0 0 100', 225, 120);
|
|
#else
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_LIGHTNINGBLOOD);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
multicast (org, 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(entity ent, vector start, vector end) TE_lightning2 = _TE_lightning2;
|
|
|
|
// 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_lightning2 = _te_lightning2;
|
|
}
|
|
|
|
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);
|
|
};
|