nuclide/src/server/footsteps.qc

326 lines
7.7 KiB
Plaintext
Executable File

/*
* Copyright (c) 2016-2021 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
Footsteps_Init
Just precaching sound shaders for all the types of material oriented footsteps.
=================
*/
void
Footsteps_Init(void)
{
Sound_Precache("step_default.left");
Sound_Precache("step_default.right");
Sound_Precache("step_alien.left");
Sound_Precache("step_alien.right");
Sound_Precache("step_computer.left");
Sound_Precache("step_computer.right");
Sound_Precache("step_concrete.left");
Sound_Precache("step_concrete.right");
Sound_Precache("step_dirt.left");
Sound_Precache("step_dirt.right");
Sound_Precache("step_flesh.left");
Sound_Precache("step_flesh.right");
Sound_Precache("step_foliage.left");
Sound_Precache("step_foliage.right");
Sound_Precache("step_glass.left");
Sound_Precache("step_glass.right");
Sound_Precache("step_grate.left");
Sound_Precache("step_grate.right");
Sound_Precache("step_metal.left");
Sound_Precache("step_metal.right");
Sound_Precache("step_sand.left");
Sound_Precache("step_sand.right");
Sound_Precache("step_slosh.left");
Sound_Precache("step_slosh.right");
Sound_Precache("step_snow.left");
Sound_Precache("step_snow.right");
Sound_Precache("step_tile.left");
Sound_Precache("step_tile.right");
Sound_Precache("step_vent.left");
Sound_Precache("step_vent.right");
Sound_Precache("step_wood.left");
Sound_Precache("step_wood.right");
Sound_Precache("step_ladder.left");
Sound_Precache("step_ladder.right");
Sound_Precache("step_wade.left");
Sound_Precache("step_wade.right");
Sound_Precache("step_swim.left");
Sound_Precache("step_swim.right");
}
/*
=================
Footsteps_HLBSP
Footstep code for BSP version 30, which uses an external materials.txt
to specify materials.
=================
*/
void
Footsteps_HLBSP(NSClientPlayer target)
{
string mat_name = "";
string tex_name = "";
//tracebox(target.origin, PHY_HULL_MIN, PHY_HULL_MAX, target.origin + [0,0,-48], MOVE_NORMAL, target);
traceline(target.origin + target.view_ofs, target.origin + [0,0,-48], FALSE, target);
tex_name = getsurfacetexture(trace_ent, getsurfacenearpoint(trace_ent, trace_endpos));
if (target.flags & FL_ONGROUND) {
tex_name = Materials_FixName(tex_name);
switch((float)hash_get(hashMaterials, tex_name)) {
case MATID_ALIEN:
mat_name = "step_alien";
break;
case MATID_BLOODYFLESH:
mat_name = "step_flesh";
break;
case MATID_COMPUTER:
mat_name = "step_computer";
break;
case MATID_CONCRETE:
mat_name = "step_concrete";
break;
case MATID_DIRT:
mat_name = "step_dirt";
break;
case MATID_FLESH:
mat_name = "step_flesh";
break;
case MATID_FOLIAGE:
mat_name = "step_foliage";
break;
case MATID_GLASS:
mat_name = "step_glass";
break;
case MATID_GRATE:
mat_name = "step_grate";
break;
case MATID_METAL:
mat_name = "step_metal";
break;
case MATID_SLOSH:
mat_name = "step_slosh";
break;
case MATID_SNOW:
mat_name = "step_snow";
break;
case MATID_TILE:
mat_name = "step_tile";
break;
case MATID_VENT:
mat_name = "step_vent";
break;
case MATID_WOOD:
mat_name = "step_wood";
break;
default:
mat_name = "step_default";
break;
}
} else if (target.flags & FL_ONLADDER) {
mat_name = "step_ladder";
}
if (target.step) {
Sound_Play(target, CHAN_BODY, sprintf("%s.left", mat_name));
} else {
Sound_Play(target, CHAN_BODY, sprintf("%s.right", mat_name));
}
}
/*
=================
Footsteps_VVBSP
Modern BSP format which uses surfaceflags to specify materials on surfaces.
=================
*/
void
Footsteps_VVBSP(NSClientPlayer target)
{
string mat_name = "";
/* WIP */
if (target.flags & FL_ONGROUND) {
target.hitcontentsmaski = CONTENTBITS_POINTSOLID;
tracebox(target.origin, target.mins, target.maxs, (target.origin + [0,0,-16]), MOVE_NORMAL, target);
target.hitcontentsmaski = 0;
trace_surfaceflagsi &= ~SURF_MASK;
switch (trace_surfaceflagsi) {
case SURF_ALIEN:
mat_name = "step_alien";
break;
case SURF_BLOODYFLESH:
mat_name = "step_flesh";
break;
case SURF_FOLIAGE:
mat_name = "step_foliage";
break;
case SURF_COMPUTER:
mat_name = "step_computer";
break;
case SURF_DIRT:
mat_name = "step_dirt";
break;
case SURF_VENT:
mat_name = "step_vent";
break;
case SURF_GRATE:
mat_name = "step_grate";
break;
case SURF_METAL:
mat_name = "step_metal";
break;
case SURF_GLASS:
mat_name = "step_glass";
break;
case SURF_SAND:
mat_name = "step_sand";
break;
case SURF_SLOSH:
mat_name = "step_slosh";
break;
case SURF_SNOW:
mat_name = "step_snow";
break;
case SURF_TILE:
mat_name = "step_tile";
break;
case SURF_WOOD:
mat_name = "step_wood";
break;
case SURF_CONCRETE:
mat_name = "step_concrete";
break;
default:
mat_name = "step_default";
}
} else if (target.flags & FL_ONLADDER) {
mat_name = "step_ladder";
}
if (target.step) {
Sound_Play(target, CHAN_BODY, sprintf("%s.left", mat_name));
} else {
Sound_Play(target, CHAN_BODY, sprintf("%s.right", mat_name));
}
}
/*
=================
Footsteps_Default
Default for any map format which we don't support or don't know how to support
materials for.
=================
*/
void
Footsteps_Default(NSClientPlayer target)
{
string mat_name = "";
/* WIP */
if (target.flags & FL_ONGROUND) {
mat_name = "step_default";
} else if (target.flags & FL_ONLADDER) {
mat_name = "step_ladder";
}
if (target.step) {
Sound_Play(target, CHAN_BODY, sprintf("%s.left", mat_name));
} else {
Sound_Play(target, CHAN_BODY, sprintf("%s.right", mat_name));
}
}
/*
=================
Footsteps_Update
Run every frame for each player, plays material based footsteps
=================
*/
void
Footsteps_Update(void)
{
NSClientPlayer pl;
if (self.classname != "player")
return;
pl = (NSClientPlayer)self;
if (pl.movetype == MOVETYPE_WALK) {
if ((pl.velocity[0] == 0 && pl.velocity[1] == 0) || pl.step_time > time) {
return;
}
if (pl.waterlevel == 1) {
if (pl.step) {
Sound_Play(pl, CHAN_BODY, "step_slosh.left");
} else {
Sound_Play(pl, CHAN_BODY, "step_slosh.right");
}
pl.step_time = time + 0.35f;
} else if (pl.waterlevel == 2) {
if (pl.step) {
Sound_Play(pl, CHAN_BODY, "step_wade.left");
} else {
Sound_Play(pl, CHAN_BODY, "step_wade.right");
}
pl.step_time = time + 1.0f;
} else if (pl.waterlevel == 3) {
if (pl.step) {
Sound_Play(pl, CHAN_BODY, "step_swim.left");
} else {
Sound_Play(pl, CHAN_BODY, "step_swim.right");
}
pl.step_time = time + 2.0f;
} else {
/* make it so we step once we land */
if (!(pl.flags & FL_ONGROUND) && !(pl.flags & FL_ONLADDER)) {
pl.step_time = 0.0f;
return;
}
/* the footsteps call might overwrite this later */
pl.step_time = time + 0.35;
switch (serverkeyfloat("*bspversion")) {
case BSPVER_HL:
Footsteps_HLBSP(pl);
break;
case BSPVER_Q3: /* Q3 */
case BSPVER_RTCW: /* RtCW */
case BSPVER_RBSP: /* RFVBSP */
Footsteps_VVBSP(pl);
break;
default:
Footsteps_Default(pl);
}
}
/* switch between feet */
pl.step = 1 - pl.step;
}
}