TraceAttack: check surfaceflags on world traces, m_iMaterial on anything

else.
This commit is contained in:
Marco Cawthorne 2021-10-15 09:37:51 +02:00
parent d283c309cd
commit 736ecb61f8
Signed by: eukara
GPG Key ID: C196CD8BA993248A
8 changed files with 180 additions and 124 deletions

View File

@ -122,6 +122,7 @@ Weapons_SetModel(string mdl)
#ifdef CLIENT
setmodel(pSeat->m_eViewModel, mdl);
setsize(pSeat->m_eViewModel, [0,0,0], [0,0,0]);
pSeat->m_eViewModel.effects |= EF_NOSHADOW;
#endif
}

2
build.cfg Executable file → Normal file
View File

@ -26,7 +26,7 @@ BUILD_IQMTOOL=1
BUILD_IMGTOOL=1
# Specify which engine revision to build, these are considered 'stable'; 0 = latest
BUILD_ENGINEREVISION=6063
BUILD_ENGINEREVISION=6084
# Whether or not to run 'git pull' or 'svn up' before building a component
BUILD_UPDATE=1

View File

@ -105,7 +105,6 @@ const string funcbreakable_objtable[] = {
class func_breakable:CBaseTrigger
{
int m_iMaterial;
float m_flDelay;
float m_flExplodeMag;
float m_flExplodeRad;

View File

@ -70,6 +70,7 @@ class CBaseEntity
nonvirtual int(void) IsOnFire;
/* Reliable APIs */
int m_iMaterial;
nonvirtual vector(void) GetSpawnOrigin;
nonvirtual vector(void) GetSpawnAngles;
nonvirtual string(void) GetSpawnModel;

View File

@ -49,6 +49,26 @@
#define MATID_SAND 'N'
#endif
/* other notes:
in The Wastes (2003) 'I' is sand, 'U' is plaster,
'R' is rust.
*/
/* modern additions, not implemented yet */
#define MATID_CLAY 1
#define MATID_PLASTER 2
#define MATID_ROCK 3
#define MATID_RUBBER 4
#define MATID_SHEETROCK 5
#define MATID_CLOTH 6
#define MATID_CARPET 7
#define MATID_PAPER 8
#define MATID_UPHOLSTERY 9
#define MATID_PUDDLE 10
#define MATID_MUD 11
#define MATID_SANDBARREL 12
void Footsteps_Init(void);
void Footsteps_HLBSP(base_player target);
void Footsteps_VVBSP(base_player target);

View File

@ -33,61 +33,9 @@ TraceAttack_Apply(entity eAttacker, int iWeapon)
g_multiDamage_Value = 0;
}
/* cast a single bullet shot */
static void
TraceAttack_FireSingle(vector vecPos, vector vAngle, int iDamage, int iWeapon)
void
TraceAttack_ImpactWorld(void)
{
vector range;
range = (vAngle * 8196);
/* make sure we can gib corpses */
int oldhitcontents = self.hitcontentsmaski;
self.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE;
traceline(vecPos, vecPos + range, MOVE_LAGGED | MOVE_HITMODEL, self);
self.hitcontentsmaski = oldhitcontents;
if (trace_fraction >= 1.0f)
return;
if (trace_ent.takedamage == DAMAGE_YES && trace_ent.iBleeds) {
Sound_Play(trace_ent, CHAN_BODY, "damage_bullet.hit");
#ifdef CSTRIKE
player pl = (player)trace_ent;
/* modify the damage based on the location */
switch (trace_surface_id) {
case BODY_HEAD:
/* the helmet is one power house */
if (pl.g_items & ITEM_HELMET) {
iDamage = 0;
Sound_Play(trace_ent, CHAN_BODY, "player.headshotarmor");
pl.g_items &= ~ITEM_HELMET;
return;
} else {
iDamage *= 4;
Sound_Play(trace_ent, CHAN_BODY, "player.headshot");
}
break;
case BODY_STOMACH:
iDamage *= 0.9;
if (pl.armor > 0)
Sound_Play(trace_ent, CHAN_BODY, "player.hitarmor");
break;
case BODY_LEGLEFT:
case BODY_LEGRIGHT:
iDamage *= 0.4;
break;
}
#else
/* only headshots count in HL */
if (trace_surface_id == BODY_HEAD)
iDamage *= 3;
#endif
}
/* impact per bullet */
if (trace_ent.iBleeds == 0) {
string tex_name;
float surf;
@ -208,6 +156,100 @@ TraceAttack_FireSingle(vector vecPos, vector vAngle, int iDamage, int iWeapon)
}
}
/* cast a single bullet shot */
static void
TraceAttack_FireSingle(vector vecPos, vector vAngle, int iDamage, int iWeapon)
{
vector range;
range = (vAngle * 8196);
/* make sure we can gib corpses */
int oldhitcontents = self.hitcontentsmaski;
self.hitcontentsmaski = CONTENTBITS_POINTSOLID | CONTENTBIT_CORPSE;
traceline(vecPos, vecPos + range, MOVE_LAGGED | MOVE_HITMODEL, self);
self.hitcontentsmaski = oldhitcontents;
if (trace_fraction >= 1.0f)
return;
if (trace_ent.takedamage == DAMAGE_YES && trace_ent.iBleeds) {
Sound_Play(trace_ent, CHAN_BODY, "damage_bullet.hit");
#ifdef CSTRIKE
player pl = (player)trace_ent;
/* modify the damage based on the location */
switch (trace_surface_id) {
case BODY_HEAD:
/* the helmet is one power house */
if (pl.g_items & ITEM_HELMET) {
iDamage = 0;
Sound_Play(trace_ent, CHAN_BODY, "player.headshotarmor");
pl.g_items &= ~ITEM_HELMET;
return;
} else {
iDamage *= 4;
Sound_Play(trace_ent, CHAN_BODY, "player.headshot");
}
break;
case BODY_STOMACH:
iDamage *= 0.9;
if (pl.armor > 0)
Sound_Play(trace_ent, CHAN_BODY, "player.hitarmor");
break;
case BODY_LEGLEFT:
case BODY_LEGRIGHT:
iDamage *= 0.4;
break;
}
#else
/* only headshots count in HL */
if (trace_surface_id == BODY_HEAD)
iDamage *= 3;
#endif
}
/* impact per bullet */
if (trace_ent.iBleeds == 0) {
if (trace_ent == world) {
TraceAttack_ImpactWorld();
} else {
CBaseEntity foo = (CBaseEntity)trace_ent;
switch (foo.m_iMaterial) {
case BREAKMT_GLASS:
FX_Impact(IMPACT_GLASS, trace_endpos, trace_plane_normal);
break;
case BREAKMT_WOOD:
FX_Impact(IMPACT_WOOD, trace_endpos, trace_plane_normal);
break;
case BREAKMT_METAL:
FX_Impact(IMPACT_METAL, trace_endpos, trace_plane_normal);
break;
case BREAKMT_FLESH:
FX_Impact(IMPACT_FLESH, trace_endpos, trace_plane_normal);
break;
case BREAKMT_CINDER:
FX_Impact(IMPACT_CONCRETE, trace_endpos, trace_plane_normal);
break;
case BREAKMT_TILE:
FX_Impact(IMPACT_TILE, trace_endpos, trace_plane_normal);
break;
case BREAKMT_COMPUTER:
FX_Impact(IMPACT_COMPUTER, trace_endpos, trace_plane_normal);
break;
case BREAKMT_GLASS_UNBREAKABLE:
FX_Impact(IMPACT_GLASS, trace_endpos, trace_plane_normal);
break;
case BREAKMT_ROCK:
FX_Impact(IMPACT_DEFAULT, trace_endpos, trace_plane_normal);
break;
case BREAKMT_NONE:
FX_Impact(IMPACT_DEFAULT, trace_endpos, trace_plane_normal);
break;
}
}
}
/* combine them into one single Damage_Apply call later */
if (trace_ent.takedamage == DAMAGE_YES) {
if (trace_ent != g_multiDamage_Target) {

15
vmap
View File

@ -22,7 +22,7 @@ fi
set -e
if [ "$VMAP_NOBSP" != "1" ]; then
"$SCRPATH"/bin/vmap -v -custinfoparms -fs_basepath "$SCRPATH" -fs_game platform -threads $BUILD_PROC -samplesize 4 $*
"$SCRPATH"/bin/vmap -v -custinfoparms -fs_basepath "$SCRPATH" -fs_game platform -threads $BUILD_PROC $*
fi
if [ "$VMAP_NOVIS" != "1" ]; then
@ -39,24 +39,17 @@ if [ "$VMAP_NOLIGHT" != "1" ]; then
-custinfoparms \
-fs_basepath "$SCRPATH" \
-v \
-dirty \
-fs_game platform \
-bounce 8 \
-samplesize 4 \
-threads $BUILD_PROC \
-shade \
-shadeangle 60 \
-patchshadows $*
$*
else
"$SCRPATH"/bin/vmap -light \
-custinfoparms \
-fs_basepath "$SCRPATH" \
-v \
-fs_game platform \
-samplesize 64 \
-threads $BUILD_PROC \
-shade \
-shadeangle 60 \
-patchshadows $*
-fast \
$*
fi
fi