From 93728d283c87a489e5139a2ce1b045690d13197f Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Fri, 22 Jan 2021 15:50:47 +0100 Subject: [PATCH] Added Materials_FixName() for preparing materials.txt lookups --- src/server/entry.c | 2 ++ src/server/footsteps.c | 4 +++- src/server/traceattack.c | 6 +++--- src/shared/materials.h | 27 +++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/server/entry.c b/src/server/entry.c index 676af94a..3444417c 100644 --- a/src/server/entry.c +++ b/src/server/entry.c @@ -351,6 +351,8 @@ void initents(void) while ((sTemp = fgets(fileMaterial))) { /* tokenize and just parse this stuff in */ if (tokenize_console(sTemp) == 2) { + string tex_name; + tex_name = Materials_FixName(strtolower(argv(1))); hash_add(hashMaterials, strtolower(argv(1)), str2chr(argv(0), 0)); } } diff --git a/src/server/footsteps.c b/src/server/footsteps.c index 56963b1f..e3794016 100755 --- a/src/server/footsteps.c +++ b/src/server/footsteps.c @@ -76,7 +76,9 @@ Footsteps_HLBSP(base_player target) tex_name = getsurfacetexture(trace_ent, getsurfacenearpoint(trace_ent, trace_endpos)); if (target.flags & FL_ONGROUND) { - switch((float)hash_get(hashMaterials, tex_name)) { + tex_name = Materials_FixName(tex_name); + + switch((float)hash_get(hashMaterials, tex_name)) { case MATID_ALIEN: mat_name = "step_alien"; break; diff --git a/src/server/traceattack.c b/src/server/traceattack.c index 08dea00e..a567270c 100644 --- a/src/server/traceattack.c +++ b/src/server/traceattack.c @@ -18,7 +18,7 @@ void TraceAttack_FireSingle(vector vecPos, vector vAngle, int iDamage, int iWeapon) { - string tex; + string tex_name; vector range; float surf; @@ -68,10 +68,10 @@ TraceAttack_FireSingle(vector vecPos, vector vAngle, int iDamage, int iWeapon) switch (serverkeyfloat("*bspversion")) { case BSPVER_HL: surf = getsurfacenearpoint(trace_ent, trace_endpos); - tex = getsurfacetexture(trace_ent, surf); + tex_name = Materials_FixName(getsurfacetexture(trace_ent, surf)); /* our hashtable is the key to all this */ - switch ((float)hash_get(hashMaterials, tex)) { + switch ((float)hash_get(hashMaterials, tex_name)) { case MATID_ALIEN: FX_Impact(IMPACT_ALIEN, trace_endpos, trace_plane_normal); break; diff --git a/src/shared/materials.h b/src/shared/materials.h index 59ce6de0..48539327 100644 --- a/src/shared/materials.h +++ b/src/shared/materials.h @@ -88,3 +88,30 @@ enum #define SURF_TILE 0xD0000000i #define SURF_WOOD 0xE0000000i #define SURF_CONCRETE 0xF0000000i + +/* this is used for material-lookups using the external materials.txt file + * method used in Half-Life. In that environment we have to strip any + * prefixes and limit our material-name to 12 chars for everything to be + * identified correctly */ +string +Materials_FixName(string tex_name) +{ + dprint(sprintf("^3material_fixname^7: %s > ", tex_name)); + + /* strip the first 2 chars when they're frame/random indicators */ + if (str2chr(tex_name, 0) == '-') + tex_name = substring(tex_name, 2, -1); + else if (str2chr(tex_name, 0) == '+') + tex_name = substring(tex_name, 2, -1); + + /* also not allowed */ + if (str2chr(tex_name, 0) == '~') + tex_name = substring(tex_name, 1, -1); + + /* limit to 12 chars! */ + tex_name = substring(tex_name, 0, 11); + + dprint(sprintf("%s\n", tex_name)); + + return tex_name; +}