From 31b88f63f276c28aa5e4d0f9c48b82473c1bda3d Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Mon, 29 Jan 2024 23:47:36 -0800 Subject: [PATCH] Fixes for DAMAGE_AIM, so we can respect the `sv_aim` cvar. --- src/gs-entbase/server/func_rotating.qc | 7 +- src/server/NSGameRules.qc | 5 +- src/server/NSTraceAttack.qc | 16 +- src/shared/NSMonster.qc | 32 +- src/shared/NSRenderableEntity.qc | 3 + src/shared/NSSurfacePropEntity.h | 3 +- src/shared/NSSurfacePropEntity.qc | 488 +++++++++---------------- src/shared/surfaceproperties.qc | 2 +- 8 files changed, 221 insertions(+), 335 deletions(-) diff --git a/src/gs-entbase/server/func_rotating.qc b/src/gs-entbase/server/func_rotating.qc index f2443b6a..48a5f477 100644 --- a/src/gs-entbase/server/func_rotating.qc +++ b/src/gs-entbase/server/func_rotating.qc @@ -206,11 +206,12 @@ func_rotating::Blocked(entity eBlocker) return; } - if (other.takedamage == DAMAGE_YES) { + /* this can be crushed */ + if (eBlocker.takedamage != DAMAGE_NO) { /* this is to work around a Q1 BSP bug. don't attempt to damage our * target unless we're absolutely sure he's within the bounds of the entity */ - if (WithinBounds(other)) - Damage_Apply(other, this, m_flDamage, 0, DMG_CRUSH); + if (WithinBounds(eBlocker)) + Damage_Apply(eBlocker, this, m_flDamage, 0, DMG_CRUSH); } } diff --git a/src/server/NSGameRules.qc b/src/server/NSGameRules.qc index 9f45fa16..75921c89 100644 --- a/src/server/NSGameRules.qc +++ b/src/server/NSGameRules.qc @@ -470,7 +470,10 @@ NSGameRules::DamageRadius(vector org, entity attacker, float dmg, float r, bool float diff; vector pos; - for (entity e = world; (e = findfloat(e, ::takedamage, DAMAGE_YES));) { + for (entity e = world; (e = nextent(e));) { + if (e.takedamage == DAMAGE_NO) + continue; + pos[0] = e.absmin[0] + (0.5 * (e.absmax[0] - e.absmin[0])); pos[1] = e.absmin[1] + (0.5 * (e.absmax[1] - e.absmin[1])); pos[2] = e.absmin[2] + (0.5 * (e.absmax[2] - e.absmin[2])); diff --git a/src/server/NSTraceAttack.qc b/src/server/NSTraceAttack.qc index e4c88148..1b325ca5 100644 --- a/src/server/NSTraceAttack.qc +++ b/src/server/NSTraceAttack.qc @@ -180,7 +180,7 @@ NSTraceAttack::_FireSingle(vector vecPos, vector vecAngles, float flDamage, floa _FireSingle(trace_endpos + (v_forward * 2), vecAngles, flDamage / 2, flRange); } - if (trace_ent.takedamage == DAMAGE_YES && trace_ent.iBleeds) { + if (trace_ent.takedamage != DAMAGE_NO && trace_ent.iBleeds) { Sound_Play(trace_ent, CHAN_BODY, "damage_bullet.hit"); #ifdef CSTRIKE @@ -232,7 +232,7 @@ NSTraceAttack::_FireSingle(vector vecPos, vector vecAngles, float flDamage, floa } /* combine them into one single Damage_Apply call later */ - if (trace_ent.takedamage == DAMAGE_YES) { + if (trace_ent.takedamage != DAMAGE_NO) { if (trace_ent != m_eMultiTarget) { _ApplyDamage(); m_eMultiTarget = (NSSurfacePropEntity)trace_ent; @@ -269,16 +269,22 @@ void NSTraceAttack::Fire(void) { vector vecDir; - makevectors(m_eOwner.v_angle); + vector ownerAngle; + vector ownerDir; m_eMultiTarget = __NULL__; m_iMultiValue = 0; + makevectors(m_eOwner.v_angle); + ownerAngle = v_forward; + ownerDir = aim(m_eOwner, 100000); while (m_iShots > 0) { + /* use cached value */ + v_forward = ownerAngle; + if (m_eOwner.flags & FL_CLIENT) { - vecDir = aim(m_eOwner, 100000); + vecDir = ownerDir; } else { - makevectors(m_eOwner.v_angle); vecDir = v_forward; } diff --git a/src/shared/NSMonster.qc b/src/shared/NSMonster.qc index 3d1cf7f6..4baaa235 100644 --- a/src/shared/NSMonster.qc +++ b/src/shared/NSMonster.qc @@ -107,6 +107,7 @@ NSMonster::TriggerTargets(void) { for (entity f = world; (f = find(f, ::targetname, m_strTriggerTarget));) { NSTrigger trigger = (NSTrigger)f; + if (trigger.Trigger != __NULL__) { trigger.Trigger(this, TRIG_TOGGLE); } @@ -206,7 +207,6 @@ void NSMonster::Restore(string strKey, string strValue) { switch (strKey) { - case "m_flHeadYaw": m_flHeadYaw = ReadFloat(strValue); break; @@ -494,9 +494,6 @@ NSMonster::ActPlay(float actName) void NSMonster::AnimPlay(float seq) { - /* forces a client-side update */ - SetSendFlags(MONFL_CHANGED_FRAME); - SetFrame(seq); m_flAnimTime = time + frameduration(modelindex, seq); } @@ -592,7 +589,11 @@ NSMonster::AlertNearby(void) if (m_eEnemy == __NULL__) return; - for (entity w = world; (w = findfloat(w, ::takedamage, DAMAGE_YES));) { + /* iterate over all living things. */ + for (entity w = world; (w = nextent(w));) { + if (w.takedamage == DAMAGE_NO) + continue; + if (w.classname != classname) continue; @@ -721,12 +722,18 @@ NSMonster::SeeThink(void) if (m_iFlags & MSF_HORDE) { m_eEnemy = NSMonster_FindClosestPlayer(this); - if (m_eEnemy) + if (m_eEnemy) { RouteToPosition(m_eEnemy.origin); + } + return; } - for (entity w = world; (w = findfloat(w, ::takedamage, DAMAGE_YES));) { + /* iterate through all players, monsters. */ + for (entity w = world; (w = nextent(w));) { + if (w.takedamage == DAMAGE_NO) + continue; + /* check if 'w' could be a valid enemy */ if (IsValidEnemy(w) == false) continue; @@ -937,7 +944,7 @@ NSMonster::AttackMelee(void) float meleeWait = Skill_GetDefValue(EntityDef_GetKeyValue(m_defMelee, "wait")); traceline(origin, m_eEnemy.origin, FALSE, this); - if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) { + if (trace_fraction >= 1.0 || trace_ent.takedamage == DAMAGE_NO) { StartSoundDef(m_sndMeleeAttackMiss, CHAN_WEAPON, true); return; } @@ -1536,7 +1543,7 @@ NSMonster::Touch(entity eToucher) /* leap test, are we no longer on the ground? */ if (m_flLeapDamage && m_bLeapAttacked == false) if (HasFlags(FL_ONGROUND) == false) { - if (eToucher.takedamage == DAMAGE_YES) { + if (eToucher.takedamage != DAMAGE_NO) { Damage_Apply(eToucher, this, m_flLeapDamage, WEAPON_NONE, DMG_BLUNT); m_bLeapAttacked = true; } @@ -1799,7 +1806,7 @@ NSMonster::Respawn(void) v_angle[2] = Math_FixDelta(v_angle[2]); AddFlags(FL_MONSTER); - SetTakedamage(DAMAGE_YES); + SetTakedamage(DAMAGE_AIM); SetVelocity([0,0,0]); SetState(MONSTER_IDLE); SetHealth(base_health); @@ -2270,7 +2277,10 @@ NSMonster_AlertEnemyAlliance(vector pos, float radius, int alliance) if (autocvar_ai_alertdebug) NSMonster_Log("AI alert from %v with radius %f and alliance %i\n", pos, radius, alliance); - for (entity w = world; (w = findfloat(w, ::takedamage, DAMAGE_YES));) { + for (entity w = world; (w = nextent(w));) { + if (w.takedamage == DAMAGE_NO) + continue; + /* out of radius */ if (vlen(pos - w.origin) > radius) { continue; diff --git a/src/shared/NSRenderableEntity.qc b/src/shared/NSRenderableEntity.qc index 68bfe0e4..b713c375 100644 --- a/src/shared/NSRenderableEntity.qc +++ b/src/shared/NSRenderableEntity.qc @@ -112,9 +112,12 @@ NSRenderableEntity::EvaluateEntity(void) EVALUATE_VECTOR(origin, 0, RDENT_CHANGED_ORIGIN_X) EVALUATE_VECTOR(origin, 1, RDENT_CHANGED_ORIGIN_Y) EVALUATE_VECTOR(origin, 2, RDENT_CHANGED_ORIGIN_Z) + + angles = Math_FixDeltaVector(angles); EVALUATE_VECTOR(angles, 0, RDENT_CHANGED_ANGLES_X) EVALUATE_VECTOR(angles, 1, RDENT_CHANGED_ANGLES_Y) EVALUATE_VECTOR(angles, 2, RDENT_CHANGED_ANGLES_Z) + EVALUATE_FIELD(modelindex, RDENT_CHANGED_MODELINDEX) EVALUATE_FIELD(colormap, RDENT_CHANGED_MODELINDEX) EVALUATE_FIELD(solid, RDENT_CHANGED_SOLIDMOVETYPE) diff --git a/src/shared/NSSurfacePropEntity.h b/src/shared/NSSurfacePropEntity.h index 4c1846a9..2660d013 100644 --- a/src/shared/NSSurfacePropEntity.h +++ b/src/shared/NSSurfacePropEntity.h @@ -179,5 +179,4 @@ private: #ifdef CLIENT void NSSurfacePropEntity_ReadEntity(bool); -#endif - +#endif \ No newline at end of file diff --git a/src/shared/NSSurfacePropEntity.qc b/src/shared/NSSurfacePropEntity.qc index e8e05f17..2f2c851a 100644 --- a/src/shared/NSSurfacePropEntity.qc +++ b/src/shared/NSSurfacePropEntity.qc @@ -103,300 +103,6 @@ NSSurfacePropEntity::CanBleed(void) return iBleeds; } -#if 0 -typedef enum -{ - NETFIELD_BYTE, - NETFIELD_SHORT, - NETFIELD_FLOAT, - NETFIELD_INT, - NETFIELD_COORD, - NETFIELD_ANGLE, - NETFIELD_ENTITY, - NETFIELD_STRING -} nettype_t; - -typedef struct -{ - .variant field; - .variant field_net; - int changedflag; - __variant defaultvalue; - nettype_e type; -} netinfo_t; - -netinfo_t n_NSSurfacePropEntity[] = -{ - {origin[0], NSEntity::origin_net[0], SRFENT_CHANGED_ORIGIN_X, 0, NETFIELD_COORD}, - {origin[1], NSEntity::origin_net[1], SRFENT_CHANGED_ORIGIN_Y, 0, NETFIELD_COORD}, - {origin[2], NSEntity::origin_net[2], SRFENT_CHANGED_ORIGIN_Z, 0, NETFIELD_COORD}, - {angles[0], NSEntity::angles_net[0], SRFENT_CHANGED_ANGLES_X, 0, NETFIELD_ANGLE}, - {angles[1], NSEntity::angles_net[1], SRFENT_CHANGED_ANGLES_Y, 0, NETFIELD_ANGLE}, - {angles[2], NSEntity::angles_net[2], SRFENT_CHANGED_ANGLES_Z, 0, NETFIELD_ANGLE}, - {modelindex, NSEntity::modelindex_net, SRFENT_CHANGED_MODELINDEX, 0, NETFIELD_SHORT}, - {solid, NSEntity::solid_net, SRFENT_CHANGED_SOLID, 0, NETFIELD_BYTE}, - {movetype, NSEntity::movetype_net, SRFENT_CHANGED_MOVETYPE, 0, NETFIELD_BYTE}, - {flags, NSEntity::flags_net, SRFENT_CHANGED_FLAGS, 0, NETFIELD_FLOAT}, - {mins[0], NSEntity::mins_net[0], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {mins[1], NSEntity::mins_net[1], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {mins[2], NSEntity::mins_net[2], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {maxs[0], NSEntity::maxs_net[0], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {maxs[1], NSEntity::maxs_net[1], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {maxs[2], NSEntity::maxs_net[2], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT}, - {frame, NSRenderableEntity::frame_net, SRFENT_CHANGED_FRAME, 0, NETFIELD_SHORT}, - {skin, NSRenderableEntity::skin_net, SRFENT_CHANGED_SKIN, 0, NETFIELD_BYTE}, - {effects, NSRenderableEntity::effects_net, SRFENT_CHANGED_EFFECTS, 0, NETFIELD_SHORT}, - {NSRenderableEntity::m_iBody, NSRenderableEntity::m_iBody_net, SRFENT_CHANGED_BODY, 0, NETFIELD_BYTE}, - {scale, NSEntity::scale_net, SRFENT_CHANGED_SCALE, 0, NETFIELD_FLOAT}, - {velocity[0], NSEntity::velocity_net[0], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE}, - {velocity[1], NSEntity::velocity_net[1], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE}, - {velocity[2], NSEntity::velocity_net[2], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE}, - {NSRenderableEntity::m_iRenderMode, NSRenderableEntity::m_iRenderMode_net, SRFENT_CHANGED_RENDERMODE, 0, NETFIELD_BYTE}, - {NSRenderableEntity::m_iRenderFX, NSRenderableEntity::m_iRenderFX_net, SRFENT_CHANGED_RENDERMODE, 0, NETFIELD_BYTE}, -}; - -void -NSSurfacePropEntity::EvaluateEntity(void) -{ - for (int i = 0; i < n_NSSurfacePropEntity.length; i++) { - if (this.(n_NSSurfacePropEntity[i].field) != this.(n_NSSurfacePropEntity[i].field_net)) { - SetSendFlags(n_NSSurfacePropEntity[i].changedflag); - print(sprintf("uhh %i\n", i)); - } - - this.(n_NSSurfacePropEntity[i].field_net) = this.(n_NSSurfacePropEntity[i].field); - } -} - - -/* Make sure StartFrame calls this */ -float -NSSurfacePropEntity::SendEntity(entity ePEnt, float fChanged) -{ - if (!modelindex) - return (0); - - if (clienttype(ePEnt) != CLIENTTYPE_REAL) - return (0); - - WriteByte(MSG_ENTITY, ENT_SURFPROP); - -#if 0 - if (fChanged == 0xFFFFFF) { - for (int i = 0; i < n_NSSurfacePropEntity.length; i++) { - /* unflag everything that's the default value */ - if (this.(n_NSSurfacePropEntity[i].field) == this.(n_NSSurfacePropEntity[i].defaultvalue)) - fChanged &= ~n_NSSurfacePropEntity[i].changedflag; - } - } -#endif - - /* broadcast how much data is expected to be read */ - WriteFloat(MSG_ENTITY, fChanged); - - for (int i = 0; i < n_NSSurfacePropEntity.length; i++) { - if (fChanged & n_NSSurfacePropEntity[i].changedflag) { - switch (n_NSSurfacePropEntity[i].type) { - case NETFIELD_BYTE: - WriteByte(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_SHORT: - WriteShort(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_FLOAT: - WriteFloat(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_INT: - WriteInt(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_COORD: - WriteCoord(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_ANGLE: - WriteShort(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field) * 32767 / 360); - break; - case NETFIELD_ENTITY: - WriteEntity(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - case NETFIELD_STRING: - WriteString(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field)); - break; - } - } - } - - return (1); -} -#else - -void -NSSurfacePropEntity::EvaluateEntity(void) -{ - EVALUATE_VECTOR(origin, 0, SRFENT_CHANGED_ORIGIN_X) - EVALUATE_VECTOR(origin, 1, SRFENT_CHANGED_ORIGIN_Y) - EVALUATE_VECTOR(origin, 2, SRFENT_CHANGED_ORIGIN_Z) - EVALUATE_VECTOR(angles, 0, SRFENT_CHANGED_ANGLES_X) - EVALUATE_VECTOR(angles, 1, SRFENT_CHANGED_ANGLES_Y) - EVALUATE_VECTOR(angles, 2, SRFENT_CHANGED_ANGLES_Z) - EVALUATE_FIELD(modelindex, SRFENT_CHANGED_MODELINDEX) - EVALUATE_FIELD(solid, SRFENT_CHANGED_SOLIDMOVETYPE) - EVALUATE_FIELD(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) - EVALUATE_FIELD(flags, SRFENT_CHANGED_FLAGS) - EVALUATE_VECTOR(mins, 0, SRFENT_CHANGED_SIZE) - EVALUATE_VECTOR(mins, 1, SRFENT_CHANGED_SIZE) - EVALUATE_VECTOR(mins, 2, SRFENT_CHANGED_SIZE) - EVALUATE_VECTOR(maxs, 0, SRFENT_CHANGED_SIZE) - EVALUATE_VECTOR(maxs, 1, SRFENT_CHANGED_SIZE) - EVALUATE_VECTOR(maxs, 2, SRFENT_CHANGED_SIZE) - EVALUATE_FIELD(frame, SRFENT_CHANGED_FRAME) - EVALUATE_FIELD(skin, SRFENT_CHANGED_SKIN) - EVALUATE_FIELD(effects, SRFENT_CHANGED_EFFECTS) - EVALUATE_FIELD(m_iBody, SRFENT_CHANGED_BODY) - EVALUATE_FIELD(scale, SRFENT_CHANGED_SCALE) - EVALUATE_VECTOR(m_vecAxialScale, 0, SRFENT_CHANGED_SCALE) - EVALUATE_VECTOR(m_vecAxialScale, 1, SRFENT_CHANGED_SCALE) - EVALUATE_VECTOR(m_vecAxialScale, 2, SRFENT_CHANGED_SCALE) - EVALUATE_VECTOR(velocity, 0, SRFENT_CHANGED_VELOCITY) - EVALUATE_VECTOR(velocity, 1, SRFENT_CHANGED_VELOCITY) - EVALUATE_VECTOR(velocity, 2, SRFENT_CHANGED_VELOCITY) - EVALUATE_VECTOR(avelocity, 0, SRFENT_CHANGED_ANGULARVELOCITY) - EVALUATE_VECTOR(avelocity, 1, SRFENT_CHANGED_ANGULARVELOCITY) - EVALUATE_VECTOR(avelocity, 2, SRFENT_CHANGED_ANGULARVELOCITY) - EVALUATE_FIELD(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) - EVALUATE_FIELD(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) - EVALUATE_VECTOR(m_vecRenderColor, 0, SRFENT_CHANGED_RENDERCOLOR) - EVALUATE_VECTOR(m_vecRenderColor, 1, SRFENT_CHANGED_RENDERCOLOR) - EVALUATE_VECTOR(m_vecRenderColor, 2, SRFENT_CHANGED_RENDERCOLOR) - EVALUATE_FIELD(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) - EVALUATE_FIELD(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) - EVALUATE_FIELD(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) - EVALUATE_FIELD(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) - EVALUATE_FIELD(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) - EVALUATE_FIELD(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) -} - -/* Make sure StartFrame calls this */ -float -NSSurfacePropEntity::SendEntity(entity ePEnt, float flChanged) -{ - if (!modelindex) - return (0); - - if (clienttype(ePEnt) != CLIENTTYPE_REAL) - return (0); - - WriteByte(MSG_ENTITY, ENT_SURFPROP); - - /* broadcast how much data is expected to be read */ - WriteFloat(MSG_ENTITY, flChanged); - SENDENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X) - SENDENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y) - SENDENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z) - SENDENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X) - SENDENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y) - SENDENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z) - SENDENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX) - SENDENTITY_BYTE(solid, SRFENT_CHANGED_SOLIDMOVETYPE) - SENDENTITY_BYTE(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) - SENDENTITY_INT(flags, SRFENT_CHANGED_FLAGS) - SENDENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE) - SENDENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE) - SENDENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE) - SENDENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE) - SENDENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE) - SENDENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE) - SENDENTITY_BYTE(frame, SRFENT_CHANGED_FRAME) - SENDENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN) - SENDENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS) - SENDENTITY_SHORT(m_iBody, SRFENT_CHANGED_BODY) - SENDENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE) - SENDENTITY_FLOAT(m_vecAxialScale[0], SRFENT_CHANGED_SCALE) - SENDENTITY_FLOAT(m_vecAxialScale[1], SRFENT_CHANGED_SCALE) - SENDENTITY_FLOAT(m_vecAxialScale[2], SRFENT_CHANGED_SCALE) - SENDENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY) - SENDENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY) - SENDENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY) - SENDENTITY_COORD(avelocity[0], SRFENT_CHANGED_ANGULARVELOCITY) - SENDENTITY_COORD(avelocity[1], SRFENT_CHANGED_ANGULARVELOCITY) - SENDENTITY_COORD(avelocity[2], SRFENT_CHANGED_ANGULARVELOCITY) - SENDENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) - SENDENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) - SENDENTITY_COLOR(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR) - SENDENTITY_COLOR(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR) - SENDENTITY_COLOR(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR) - SENDENTITY_COLOR(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) - SENDENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) - SENDENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) - SENDENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) - SENDENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) - SENDENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) - - return (1); -} -#endif - -#else -/* -============ -NSSurfacePropEntity::ReceiveEntity -============ -*/ -void -NSSurfacePropEntity::ReceiveEntity(float flNew, float flChanged) -{ - READENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X) - READENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y) - READENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z) - READENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X) - READENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y) - READENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z) - READENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX) - READENTITY_BYTE(solid, SRFENT_CHANGED_SOLIDMOVETYPE) - READENTITY_BYTE(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) - READENTITY_INT(flags, SRFENT_CHANGED_FLAGS) - READENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE) - READENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE) - READENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE) - READENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE) - READENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE) - READENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE) - READENTITY_BYTE(frame, SRFENT_CHANGED_FRAME) - READENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN) - READENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS) - READENTITY_SHORT(m_iBody, SRFENT_CHANGED_BODY) - READENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE) - READENTITY_FLOAT(m_vecAxialScale[0], SRFENT_CHANGED_SCALE) - READENTITY_FLOAT(m_vecAxialScale[1], SRFENT_CHANGED_SCALE) - READENTITY_FLOAT(m_vecAxialScale[2], SRFENT_CHANGED_SCALE) - READENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY) - READENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY) - READENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY) - READENTITY_COORD(avelocity[0], SRFENT_CHANGED_ANGULARVELOCITY) - READENTITY_COORD(avelocity[1], SRFENT_CHANGED_ANGULARVELOCITY) - READENTITY_COORD(avelocity[2], SRFENT_CHANGED_ANGULARVELOCITY) - READENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) - READENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) - READENTITY_COLOR(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR) - READENTITY_COLOR(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR) - READENTITY_COLOR(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR) - READENTITY_COLOR(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) - READENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) - READENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) - READENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) - READENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) - READENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) - - if (scale == 0.0) - scale = 1.0f; - - if (flChanged & SRFENT_CHANGED_SIZE) - setsize(this, mins * scale, maxs * scale); - if (flChanged & SRFENT_CHANGED_BODY) - setcustomskin(this, "", sprintf("geomset 0 %i\ngeomset 1 %i\n", m_iBody, m_iBody)); -} -#endif - -#ifdef SERVER void NSSurfacePropEntity::SetTakedamage(float type) { @@ -643,11 +349,9 @@ NSSurfacePropEntity::SpawnKey(string strKey, string strValue) m_vecBloodColor = ReadVector(strValue); break; /* Input/Output system */ -#ifdef SERVER case "OnBreak": m_strOnBreak = PrepareOutput(m_strOnBreak, ReadString(strValue)); break; -#endif default: super::SpawnKey(strKey, strValue); break; @@ -739,9 +443,171 @@ NSSurfacePropEntity::TimeSinceDeath(void) return time - m_flDeathTime; } -#endif +void +NSSurfacePropEntity::EvaluateEntity(void) +{ + EVALUATE_VECTOR(origin, 0, SRFENT_CHANGED_ORIGIN_X) + EVALUATE_VECTOR(origin, 1, SRFENT_CHANGED_ORIGIN_Y) + EVALUATE_VECTOR(origin, 2, SRFENT_CHANGED_ORIGIN_Z) + EVALUATE_VECTOR(angles, 0, SRFENT_CHANGED_ANGLES_X) + EVALUATE_VECTOR(angles, 1, SRFENT_CHANGED_ANGLES_Y) + EVALUATE_VECTOR(angles, 2, SRFENT_CHANGED_ANGLES_Z) + EVALUATE_FIELD(modelindex, SRFENT_CHANGED_MODELINDEX) + EVALUATE_FIELD(solid, SRFENT_CHANGED_SOLIDMOVETYPE) + EVALUATE_FIELD(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) + EVALUATE_FIELD(flags, SRFENT_CHANGED_FLAGS) + EVALUATE_VECTOR(mins, 0, SRFENT_CHANGED_SIZE) + EVALUATE_VECTOR(mins, 1, SRFENT_CHANGED_SIZE) + EVALUATE_VECTOR(mins, 2, SRFENT_CHANGED_SIZE) + EVALUATE_VECTOR(maxs, 0, SRFENT_CHANGED_SIZE) + EVALUATE_VECTOR(maxs, 1, SRFENT_CHANGED_SIZE) + EVALUATE_VECTOR(maxs, 2, SRFENT_CHANGED_SIZE) + EVALUATE_FIELD(frame, SRFENT_CHANGED_FRAME) + EVALUATE_FIELD(skin, SRFENT_CHANGED_SKIN) + EVALUATE_FIELD(effects, SRFENT_CHANGED_EFFECTS) + EVALUATE_FIELD(m_iBody, SRFENT_CHANGED_BODY) + EVALUATE_FIELD(scale, SRFENT_CHANGED_SCALE) + EVALUATE_VECTOR(m_vecAxialScale, 0, SRFENT_CHANGED_SCALE) + EVALUATE_VECTOR(m_vecAxialScale, 1, SRFENT_CHANGED_SCALE) + EVALUATE_VECTOR(m_vecAxialScale, 2, SRFENT_CHANGED_SCALE) + EVALUATE_VECTOR(velocity, 0, SRFENT_CHANGED_VELOCITY) + EVALUATE_VECTOR(velocity, 1, SRFENT_CHANGED_VELOCITY) + EVALUATE_VECTOR(velocity, 2, SRFENT_CHANGED_VELOCITY) + EVALUATE_VECTOR(avelocity, 0, SRFENT_CHANGED_ANGULARVELOCITY) + EVALUATE_VECTOR(avelocity, 1, SRFENT_CHANGED_ANGULARVELOCITY) + EVALUATE_VECTOR(avelocity, 2, SRFENT_CHANGED_ANGULARVELOCITY) + EVALUATE_FIELD(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) + EVALUATE_FIELD(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) + EVALUATE_VECTOR(m_vecRenderColor, 0, SRFENT_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 1, SRFENT_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 2, SRFENT_CHANGED_RENDERCOLOR) + EVALUATE_FIELD(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) + EVALUATE_FIELD(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) + EVALUATE_FIELD(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) + EVALUATE_FIELD(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) + EVALUATE_FIELD(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) + EVALUATE_FIELD(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) +} + +/* Make sure StartFrame calls this */ +float +NSSurfacePropEntity::SendEntity(entity ePEnt, float flChanged) +{ + if (!modelindex) + return (0); + + if (clienttype(ePEnt) != CLIENTTYPE_REAL) + return (0); + + WriteByte(MSG_ENTITY, ENT_SURFPROP); + + /* broadcast how much data is expected to be read */ + WriteFloat(MSG_ENTITY, flChanged); + SENDENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X) + SENDENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y) + SENDENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z) + SENDENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X) + SENDENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y) + SENDENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z) + SENDENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX) + SENDENTITY_BYTE(solid, SRFENT_CHANGED_SOLIDMOVETYPE) + SENDENTITY_BYTE(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) + SENDENTITY_INT(flags, SRFENT_CHANGED_FLAGS) + SENDENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE) + SENDENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE) + SENDENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE) + SENDENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE) + SENDENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE) + SENDENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE) + SENDENTITY_BYTE(frame, SRFENT_CHANGED_FRAME) + SENDENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN) + SENDENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS) + SENDENTITY_SHORT(m_iBody, SRFENT_CHANGED_BODY) + SENDENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE) + SENDENTITY_FLOAT(m_vecAxialScale[0], SRFENT_CHANGED_SCALE) + SENDENTITY_FLOAT(m_vecAxialScale[1], SRFENT_CHANGED_SCALE) + SENDENTITY_FLOAT(m_vecAxialScale[2], SRFENT_CHANGED_SCALE) + SENDENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY) + SENDENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY) + SENDENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY) + SENDENTITY_COORD(avelocity[0], SRFENT_CHANGED_ANGULARVELOCITY) + SENDENTITY_COORD(avelocity[1], SRFENT_CHANGED_ANGULARVELOCITY) + SENDENTITY_COORD(avelocity[2], SRFENT_CHANGED_ANGULARVELOCITY) + SENDENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) + SENDENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) + SENDENTITY_COLOR(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) + SENDENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) + SENDENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) + SENDENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) + SENDENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) + SENDENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) + + return (1); +} + +#else +/* +============ +NSSurfacePropEntity::ReceiveEntity +============ +*/ +void +NSSurfacePropEntity::ReceiveEntity(float flNew, float flChanged) +{ + READENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X) + READENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y) + READENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z) + READENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X) + READENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y) + READENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z) + READENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX) + READENTITY_BYTE(solid, SRFENT_CHANGED_SOLIDMOVETYPE) + READENTITY_BYTE(movetype, SRFENT_CHANGED_SOLIDMOVETYPE) + READENTITY_INT(flags, SRFENT_CHANGED_FLAGS) + READENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE) + READENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE) + READENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE) + READENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE) + READENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE) + READENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE) + READENTITY_BYTE(frame, SRFENT_CHANGED_FRAME) + READENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN) + READENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS) + READENTITY_SHORT(m_iBody, SRFENT_CHANGED_BODY) + READENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE) + READENTITY_FLOAT(m_vecAxialScale[0], SRFENT_CHANGED_SCALE) + READENTITY_FLOAT(m_vecAxialScale[1], SRFENT_CHANGED_SCALE) + READENTITY_FLOAT(m_vecAxialScale[2], SRFENT_CHANGED_SCALE) + READENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY) + READENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY) + READENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY) + READENTITY_COORD(avelocity[0], SRFENT_CHANGED_ANGULARVELOCITY) + READENTITY_COORD(avelocity[1], SRFENT_CHANGED_ANGULARVELOCITY) + READENTITY_COORD(avelocity[2], SRFENT_CHANGED_ANGULARVELOCITY) + READENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE) + READENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE) + READENTITY_COLOR(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT) + READENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER) + READENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER) + READENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER) + READENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER) + READENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER) + + if (scale == 0.0) + scale = 1.0f; + + if (flChanged & SRFENT_CHANGED_SIZE) + setsize(this, mins * scale, maxs * scale); + if (flChanged & SRFENT_CHANGED_BODY) + setcustomskin(this, "", sprintf("geomset 0 %i\ngeomset 1 %i\n", m_iBody, m_iBody)); +} -#ifdef CLIENT void NSSurfacePropEntity::RenderFire(void) { @@ -763,21 +629,7 @@ NSSurfacePropEntity::predraw(void) RenderFire(); return super::predraw(); } -#endif -void -NSSurfacePropEntity::SetModel(string newModel) -{ - NSRenderableEntity::SetModel(newModel); - -#ifdef SERVER - if (model && HasPropData() == false) { - m_iPropData = PropData_ForModel(model); - } -#endif -} - -#ifdef CLIENT void NSSurfacePropEntity_ReadEntity(bool new) { @@ -790,3 +642,15 @@ NSSurfacePropEntity_ReadEntity(bool new) rend.ReceiveEntity(new, fl); } #endif + +void +NSSurfacePropEntity::SetModel(string newModel) +{ + NSRenderableEntity::SetModel(newModel); + +#ifdef SERVER + if (model && HasPropData() == false) { + m_iPropData = PropData_ForModel(model); + } +#endif +} \ No newline at end of file diff --git a/src/shared/surfaceproperties.qc b/src/shared/surfaceproperties.qc index 3862a9a8..1e09d6dd 100644 --- a/src/shared/surfaceproperties.qc +++ b/src/shared/surfaceproperties.qc @@ -461,7 +461,7 @@ SurfData_Impact(entity e, vector org, vector ang) SurfData_ImpactID_Net(texdata, org, ang); } else SurfData_Impact_SurfaceParm(e, org, ang); - } else { /* anything with takedamage = DAMAGE_YES is a NSurfacePropEntity. */ + } else { /* anything with else is a NSurfacePropEntity. */ NSSurfacePropEntity foo = (NSSurfacePropEntity)e; if (foo.HasSurfaceData() && foo.GetSurfaceData(SURFDATA_MATERIAL) != -1)