From 8ac5ac7c7786c05f4a8125b502a5c7c3bfb243f3 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 19 Apr 2020 12:01:20 +0200 Subject: [PATCH] Support for Q3-based BSP material flags - for footsteps anyway --- src/server/defs.h | 1 + src/server/footsteps.c | 80 ++++++++++++++++++++++++++++++++++++++++-- src/shared/materials.h | 46 ++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/src/server/defs.h b/src/server/defs.h index cc2f4092..5eba4375 100644 --- a/src/server/defs.h +++ b/src/server/defs.h @@ -48,6 +48,7 @@ entity g_eAttacker; * we don't want this all of the time. so use this as a fallback */ .entity real_owner; +int trace_surfaceflagsi; string startspot; string __fullspawndata; hashtable hashMaterials; diff --git a/src/server/footsteps.c b/src/server/footsteps.c index 008506d6..38087fdb 100755 --- a/src/server/footsteps.c +++ b/src/server/footsteps.c @@ -117,6 +117,79 @@ Footsteps_VVBSP(entity 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_FLESH: + 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.iStep) { + Sound_Play(target, CHAN_BODY, sprintf("%s.left", mat_name)); + } else { + Sound_Play(target, CHAN_BODY, sprintf("%s.right", mat_name)); + } +} + +/* anything unsupported */ +void +Footsteps_Default(entity target) +{ + string mat_name = ""; + /* WIP */ if (target.flags & FL_ONGROUND) { mat_name = "step_default"; @@ -156,13 +229,16 @@ Footsteps_Update(void) self.fStepTime = time + 0.35; switch (serverkeyfloat("*bspversion")) { - case 30: + case 30: /* HL */ Footsteps_HLBSP(self); break; - case 1: + case 46: /* Q3 */ + case 47: /* RtCW */ + case 1: /* RFVBSP */ Footsteps_VVBSP(self); break; default: + Footsteps_Default(self); } /* switch between feet */ diff --git a/src/shared/materials.h b/src/shared/materials.h index 4e0a03e3..8b331788 100644 --- a/src/shared/materials.h +++ b/src/shared/materials.h @@ -26,3 +26,49 @@ enum IMPACT_FLESH, IMPACT_ROCK }; + + +/* TW/NEXT specific game flags */ + +/* q3 bsp base flags */ +#define SURF_NODAMAGE 0x1i // never give falling damage +#define SURF_SLICK 0x2i // effects game physics +#define SURF_SKY 0x4i // lighting from environment map +#define SURF_LADDER 0x8i // climb this surface +#define SURF_NOIMPACT 0x10i // don't make missile explosions +#define SURF_NOMARKS 0x20i // don't leave missile marks +#define SURF_FLESH 0x40i // make flesh sounds and effects +#define SURF_NODRAW 0x80i // don't generate a drawsurface at all +#define SURF_HINT 0x100i // make a primary bsp splitter +#define SURF_SKIP 0x200i // completely ignore, allowing non-closed brushes +#define SURF_NOLIGHTMAP 0x400i // surface doesn't need a lightmap +#define SURF_POINTLIGHT 0x800i // generate lighting info at vertexes +#define SURF_METALSTEPS 0x1000i // clanking footsteps +#define SURF_NOSTEPS 0x2000i // no footstep sounds +#define SURF_NONSOLID 0x4000i // don't collide against curves with this set +#define SURF_LIGHTFILTER 0x8000i // act as a light filter during q3map -light +#define SURF_ALPHASHADOW 0x10000i // do per-pixel light shadow casting in q3map +#define SURF_NODLIGHT 0x20000i // don't dlight even if solid (solid lava, skies) +#define SURF_DUST 0x40000i // leave a dust trail when walking on this surface + +// behaviour surfaceflags +#define SURF_LEAKSTEAM 0x80000i /* surface shoots steam when hit */ +#define SURF_LEAKWATER 0x100000i /* surface sprays water when hit */ + +// material surfaceflags +#define SURF_MASK 0x0FFFFFFFi +#define SURF_ALIEN 0x10000000i +#define SURF_FLESH 0x20000000i +#define SURF_FOLIAGE 0x30000000i +#define SURF_COMPUTER 0x40000000i +#define SURF_DIRT 0x50000000i +#define SURF_VENT 0x60000000i +#define SURF_GRATE 0x70000000i +#define SURF_METAL 0x80000000i +#define SURF_GLASS 0x90000000i +#define SURF_SAND 0xA0000000i +#define SURF_SLOSH 0xB0000000i +#define SURF_SNOW 0xC0000000i +#define SURF_TILE 0xD0000000i +#define SURF_WOOD 0xE0000000i +#define SURF_CONCRETE 0xF0000000i