Remove SendFlags with constants from NSEntity and peers, make full use

of EvaluateEntity() to decide which attributes to send network updates of.
This commit is contained in:
Marco Cawthorne 2022-02-18 00:30:24 -08:00
parent af04bc5e4c
commit 8cb4c35e23
Signed by: eukara
GPG Key ID: C196CD8BA993248A
15 changed files with 222 additions and 109 deletions

View File

@ -165,18 +165,19 @@ void
env_laser::EvaluateEntity(void)
{
/* FIXME: Check our fields for networking */
if (origin != net_origin) {
if (ATTR_CHANGED(angles)) {
SetSendFlags(ENVLASER_CHANGED_ORIGIN);
net_origin = origin;
}
if (angles != net_angles) {
if (ATTR_CHANGED(origin)) {
SetSendFlags(ENVLASER_CHANGED_ANGLES);
net_angles = angles;
}
if (m_iState != m_iStateOld) {
SetSendFlags(ENVLASER_CHANGED_STATE);
m_iStateOld = m_iState;
}
SAVE_STATE(origin);
SAVE_STATE(angles);
}
void

View File

@ -26,6 +26,17 @@ class NSEntity:NSTrigger
vector m_vecMins;
vector m_vecMaxs;
/* keep track of these variables */
PREDICTED_VECTOR_N(origin);
PREDICTED_VECTOR_N(angles);
PREDICTED_FLOAT_N(modelindex);
PREDICTED_VECTOR_N(size);
PREDICTED_FLOAT_N(solid);
PREDICTED_FLOAT_N(movetype);
PREDICTED_FLOAT_N(scale);
PREDICTED_FLOAT_N(flags);
PREDICTED_VECTOR_N(velocity);
#ifdef CLIENT
virtual void(float,float) ReceiveEntity;
virtual void(void) postdraw;
@ -48,12 +59,6 @@ class NSEntity:NSTrigger
vector m_oldAngle;
string m_oldModel;
/* keep track of these variables */
vector net_origin;
vector net_angles;
vector net_velocity;
float net_modelindex;
string m_parent;
virtual void(void) Show;

View File

@ -211,22 +211,49 @@ NSEntity::EvaluateEntity(void)
{
/* while the engine is still handling physics for these, we can't
* predict when origin/angle might change */
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(BASEFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
net_angles = angles;
SetSendFlags(BASEFL_CHANGED_ANGLES);
}
if (net_velocity != velocity) {
net_velocity = velocity;
if (ATTR_CHANGED(modelindex)) {
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
if (ATTR_CHANGED(size)) {
SetSendFlags(BASEFL_CHANGED_SIZE);
}
if (ATTR_CHANGED(solid)) {
SetSendFlags(BASEFL_CHANGED_SOLID);
}
if (ATTR_CHANGED(movetype)) {
SetSendFlags(BASEFL_CHANGED_MOVETYPE);
}
if (ATTR_CHANGED(scale)) {
SetSendFlags(BASEFL_CHANGED_SCALE);
}
if (ATTR_CHANGED(velocity)) {
SetSendFlags(BASEFL_CHANGED_VELOCITY);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
SAVE_STATE(modelindex);
SAVE_STATE(size);
SAVE_STATE(solid);
SAVE_STATE(movetype);
SAVE_STATE(scale);
SAVE_STATE(velocity);
}
/* Make sure StartFrame calls this */
@ -280,7 +307,6 @@ NSEntity::SetVelocity(vector vecNew)
return;
velocity = vecNew;
SetSendFlags(BASEFL_CHANGED_VELOCITY);
};
void
@ -307,7 +333,6 @@ NSEntity::SetMovetype(float newMovetype)
return;
movetype = newMovetype;
SetSendFlags(BASEFL_CHANGED_MOVETYPE);
}
void
NSEntity::SetSolid(float newSolid)
@ -316,7 +341,6 @@ NSEntity::SetSolid(float newSolid)
return;
solid = newSolid;
SetSendFlags(BASEFL_CHANGED_SOLID);
}
void
NSEntity::SetScale(float newScale)
@ -325,7 +349,6 @@ NSEntity::SetScale(float newScale)
return;
scale = newScale;
SetSendFlags(BASEFL_CHANGED_SCALE);
}
void
@ -371,7 +394,6 @@ NSEntity::UpdateBounds(void)
flScale = scale;
setsize(this, newMins * flScale, newMaxs * flScale);
SetSendFlags(BASEFL_CHANGED_SIZE);
}
void
@ -381,7 +403,6 @@ NSEntity::SetAngles(vector newAngles)
return;
angles = newAngles;
SetSendFlags(BASEFL_CHANGED_ANGLES);
}
void
@ -397,7 +418,6 @@ NSEntity::SetSize(vector newMins, vector newMaxs)
flScale = scale;
setsize(this, newMins * flScale, newMaxs * flScale);
SetSendFlags(BASEFL_CHANGED_SIZE);
}
void
@ -407,7 +427,6 @@ NSEntity::SetOrigin(vector newOrigin)
return;
setorigin(this, newOrigin);
SetSendFlags(BASEFL_CHANGED_ORIGIN);
}
void
@ -418,8 +437,6 @@ NSEntity::SetModel(string newModel)
/* mins/maxs have been updated by setmodel */
SetSize(mins, maxs);
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
void
NSEntity::SetModelindex(float newModelIndex)
@ -429,7 +446,6 @@ NSEntity::SetModelindex(float newModelIndex)
modelindex = newModelIndex;
SetSize(mins, maxs);
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
#ifdef SERVER
@ -659,7 +675,5 @@ NSEntity::NSEntity(void)
if (m_oldModel != "") {
precache_model(GetSpawnModel());
}
#else
isCSQC = 1;
#endif
}

View File

@ -33,13 +33,17 @@ class NSRenderableEntity:NSEntity
virtual void(void) Respawn;
virtual void(float) Save;
virtual void(string,string) Restore;
virtual void(void) EvaluateEntity;
#else
virtual void(float,float) ReceiveEntity;
virtual float(void) predraw;
#endif
/* new */
int m_iBody;
PREDICTED_INT(m_iBody);
PREDICTED_FLOAT_N(frame);
PREDICTED_FLOAT_N(skin);
PREDICTED_FLOAT_N(effects);
/* model events */
float m_flBaseTime;
@ -55,10 +59,10 @@ class NSRenderableEntity:NSEntity
virtual void(void) MakeStatic;
#ifdef GS_RENDERFX
float m_iRenderFX;
float m_iRenderMode;
float m_flRenderAmt;
vector m_vecRenderColor;
PREDICTED_FLOAT(m_iRenderFX);
PREDICTED_FLOAT(m_iRenderMode);
PREDICTED_FLOAT(m_flRenderAmt);
PREDICTED_VECTOR(m_vecRenderColor);
/* set */
nonvirtual void(float) SetRenderFX;

View File

@ -48,6 +48,77 @@ NSRenderableEntity::MakeStatic(void)
}
#ifdef SERVER
void
NSRenderableEntity::EvaluateEntity(void)
{
if (ATTR_CHANGED(origin)) {
SetSendFlags(BASEFL_CHANGED_ORIGIN);
}
if (ATTR_CHANGED(angles)) {
SetSendFlags(BASEFL_CHANGED_ANGLES);
}
if (ATTR_CHANGED(modelindex)) {
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
if (ATTR_CHANGED(solid)) {
SetSendFlags(BASEFL_CHANGED_SOLID);
}
if (ATTR_CHANGED(movetype)) {
SetSendFlags(BASEFL_CHANGED_MOVETYPE);
}
if (ATTR_CHANGED(size)) {
SetSendFlags(BASEFL_CHANGED_SIZE);
}
if (ATTR_CHANGED(frame)) {
SetSendFlags(BASEFL_CHANGED_FRAME);
}
if (ATTR_CHANGED(skin)) {
SetSendFlags(BASEFL_CHANGED_SKIN);
}
if (ATTR_CHANGED(effects)) {
SetSendFlags(BASEFL_CHANGED_EFFECTS);
}
if (ATTR_CHANGED(m_iBody)) {
SetSendFlags(BASEFL_CHANGED_BODY);
}
if (ATTR_CHANGED(scale)) {
SetSendFlags(BASEFL_CHANGED_SCALE);
}
if (ATTR_CHANGED(velocity)) {
SetSendFlags(BASEFL_CHANGED_VELOCITY);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
SAVE_STATE(modelindex);
SAVE_STATE(solid);
SAVE_STATE(movetype);
SAVE_STATE(size);
SAVE_STATE(frame);
SAVE_STATE(skin);
SAVE_STATE(effects);
SAVE_STATE(m_iBody);
SAVE_STATE(scale);
SAVE_STATE(velocity);
#ifdef GS_RENDERFX
if (ATTR_CHANGED(m_iRenderMode)) {
SetSendFlags(BASEFL_CHANGED_RENDERMODE);
}
if (ATTR_CHANGED(m_vecRenderColor)) {
SetSendFlags(BASEFL_CHANGED_RENDERCOLOR);
}
if (ATTR_CHANGED(m_flRenderAmt)) {
SetSendFlags(BASEFL_CHANGED_RENDERAMT);
}
#else
if (ATTR_CHANGED(alpha)) {
SetSendFlags(BASEFL_CHANGED_ALPHA);
}
#endif
}
/* Make sure StartFrame calls this */
float
NSRenderableEntity::SendEntity(entity ePEnt, float fChanged)
@ -559,7 +630,6 @@ NSRenderableEntity::SetEffects(float newEffects)
return;
effects = newEffects;
SetSendFlags(BASEFL_CHANGED_EFFECTS);
}
void
NSRenderableEntity::SetFrame(float newFrame)
@ -569,7 +639,6 @@ NSRenderableEntity::SetFrame(float newFrame)
frame = newFrame;
frame1time = 0.0f;
SetSendFlags(BASEFL_CHANGED_FRAME);
}
void
NSRenderableEntity::SetSkin(float newSkin)
@ -578,7 +647,6 @@ NSRenderableEntity::SetSkin(float newSkin)
return;
skin = newSkin;
SetSendFlags(BASEFL_CHANGED_SKIN);
}
void
NSRenderableEntity::SetBody(int newBody)
@ -587,7 +655,6 @@ NSRenderableEntity::SetBody(int newBody)
return;
m_iBody = newBody;
SetSendFlags(BASEFL_CHANGED_BODY);
}
void
NSRenderableEntity::SetScale(float newScale)
@ -597,7 +664,6 @@ NSRenderableEntity::SetScale(float newScale)
scale = newScale;
setsize(this, m_vecMins * scale, m_vecMaxs * scale);
SetSendFlags(BASEFL_CHANGED_SCALE);
}
#ifdef GS_RENDERFX
@ -608,7 +674,6 @@ NSRenderableEntity::SetRenderFX(float newFX)
return;
m_iRenderFX = newFX;
SetSendFlags(BASEFL_CHANGED_RENDERMODE);
}
void
NSRenderableEntity::SetRenderMode(float newMode)
@ -617,7 +682,6 @@ NSRenderableEntity::SetRenderMode(float newMode)
return;
m_iRenderMode = newMode;
SetSendFlags(BASEFL_CHANGED_RENDERMODE);
}
void
NSRenderableEntity::SetRenderAmt(float newAmt)
@ -626,7 +690,6 @@ NSRenderableEntity::SetRenderAmt(float newAmt)
return;
m_flRenderAmt = newAmt;
SetSendFlags(BASEFL_CHANGED_RENDERAMT);
}
void
NSRenderableEntity::SetRenderColor(vector newColor)
@ -635,7 +698,6 @@ NSRenderableEntity::SetRenderColor(vector newColor)
return;
m_vecRenderColor = newColor;
SetSendFlags(BASEFL_CHANGED_RENDERCOLOR);
}
#endif

View File

@ -91,22 +91,23 @@ NSVehicle::EvaluateEntity(void)
{
/* while the engine is still handling physics for these, we can't
* predict when origin/angle might change */
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(VEHFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
net_angles = angles;
SetSendFlags(VEHFL_CHANGED_ANGLES);
}
if (net_velocity != velocity) {
net_velocity = velocity;
if (ATTR_CHANGED(velocity)) {
SetSendFlags(VEHFL_CHANGED_VELOCITY);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
SAVE_STATE(velocity);
}
float

View File

@ -155,14 +155,18 @@ env_projectedtexture::ReceiveEntity(float flNew, float flFlags)
void
env_projectedtexture::EvaluateEntity(void)
{
if (net_origin != origin) {
net_origin = origin;
SendFlags |= PRTEXFL_CHANGED_ORIGIN;
if (ATTR_CHANGED(origin)) {
SetSendFlags(PRTEXFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
net_angles = angles;
SendFlags |= PRTEXFL_CHANGED_ANGLES;
if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
SetSendFlags(PRTEXFL_CHANGED_ANGLES);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
}
void

View File

@ -219,10 +219,10 @@ func_monitor::SendEntity(entity ePEnt, float flFlags)
void
func_monitor::EvaluateEntity(void)
{
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(MONITORFL_CHANGED_BASE);
}
SAVE_STATE(origin);
/* this monitor is disabled */
if (!m_iValue)

View File

@ -177,22 +177,23 @@ func_tankmortar::EvaluateEntity(void)
{
/* while the engine is still handling physics for these, we can't
* predict when origin/angle might change */
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(VEHFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
net_angles = angles;
SetSendFlags(VEHFL_CHANGED_ANGLES);
}
if (net_velocity != velocity) {
net_velocity = velocity;
if (ATTR_CHANGED(velocity)) {
SetSendFlags(VEHFL_CHANGED_VELOCITY);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
SAVE_STATE(velocity);
}
float
@ -458,4 +459,4 @@ func_tankmortar_readentity(float isnew)
veh.ReadEntity(flags, isnew);
}
#endif
#endif

View File

@ -161,15 +161,16 @@ info_particle_system::SendEntity(entity ePEnt, float flFlags)
void
info_particle_system::EvaluateEntity(void)
{
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(PARTSYSFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
net_angles = angles;
if (ATTR_CHANGED(angles)) {
SetSendFlags(PARTSYSFL_CHANGED_ANGLES);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
}
void

View File

@ -183,14 +183,15 @@ light_dynamic::Initialized(void)
void
light_dynamic::EvaluateEntity(void)
{
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(DLIGHTFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
net_angles = angles;
if (ATTR_CHANGED(angles)) {
SetSendFlags(DLIGHTFL_CHANGED_ANGLES);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
}
void

View File

@ -30,6 +30,8 @@ Point entity defining a 4-wheel vehicle that you can drive.
This entity was introduced in Half-Life 2 (2004).
*/
#define VEH_SKIDDING FL_USE_RELEASED
enumflags
{
VEHFL_DRIVER,
@ -37,7 +39,8 @@ enumflags
VEHFL_ORIGIN,
VEHFL_ANGLES,
VEHFL_VELOCITY,
VEHFL_TURNING
VEHFL_TURNING,
VEHFL_FLAGS
};
class prop_vehicle_driveable_wheel
@ -309,6 +312,12 @@ prop_vehicle_driveable_wheel::Accel(float flMoveTime, float m_flTurn)
velocity += v_forward * bound(-1, vehParent.m_vecMoveValues[0] / 400, 1) * vehParent.m_flAcceleration * flMoveTime * flTraction;
}
/* test if this car is skidding */
float skid = (velocity * v_right);
if ( fabs(skid) > vehParent.m_flSkidSpeed ) {
vehParent.flags |= VEH_SKIDDING;
}
/* nuke sideways velocity. if a wheel is off the ground this probably
means that it'll be pushed further. players should try not to roll
too much. */
@ -413,6 +422,7 @@ prop_vehicle_driveable::PredictPreFrame(void)
SAVE_STATE(origin);
SAVE_STATE(velocity);
SAVE_STATE(m_flTurn);
SAVE_STATE(flags);
m_wlFL.PredictPreFrame();
m_wlFR.PredictPreFrame();
@ -427,6 +437,7 @@ prop_vehicle_driveable::PredictPostFrame(void)
ROLL_BACK(origin);
ROLL_BACK(velocity);
ROLL_BACK(m_flTurn);
ROLL_BACK(flags);
m_wlFL.PredictPostFrame();
m_wlFR.PredictPostFrame();
@ -490,6 +501,8 @@ prop_vehicle_driveable::RunVehiclePhysics(void)
m_flTimeLength = frametime;
}
flags &= ~VEH_SKIDDING;
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
@ -614,6 +627,9 @@ prop_vehicle_driveable::ReadEntity(float flSendFlags, float flNew)
if (flSendFlags & VEHFL_TURNING)
m_flTurn = readfloat();
if (flSendFlags & VEHFL_FLAGS)
flags = readfloat();
if (flNew) {
drawmask = MASK_ENGINE;
SetMovetype(MOVETYPE_NONE);
@ -640,36 +656,40 @@ prop_vehicle_driveable::EvaluateEntity(void)
{
/* while the engine is still handling physics for these, we can't
* predict when origin/angle might change */
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(VEHFL_ORIGIN);
}
SetSendFlags(VEHFL_ORIGIN);
if (net_angles != angles) {
if (ATTR_CHANGED(angles)) {
angles[0] = Math_FixDelta(angles[0]);
angles[1] = Math_FixDelta(angles[1]);
angles[2] = Math_FixDelta(angles[2]);
net_angles = angles;
SetSendFlags(VEHFL_ANGLES);
}
if (net_modelindex != modelindex) {
net_modelindex = modelindex;
if (ATTR_CHANGED(modelindex)) {
SetSendFlags(VEHFL_MODELINDEX);
}
if (net_velocity != velocity) {
net_velocity = velocity;
if (ATTR_CHANGED(velocity)) {
SetSendFlags(VEHFL_VELOCITY);
}
if (m_flTurn_net != m_flTurn) {
m_flTurn_net = m_flTurn;
SetSendFlags(VEHFL_TURNING);
}
if (m_eDriver_net != m_eDriver) {
m_eDriver_net = m_eDriver;
SetSendFlags(VEHFL_DRIVER);
}
if (ATTR_CHANGED(flags)) {
SetSendFlags(VEHFL_FLAGS);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
SAVE_STATE(modelindex);
SAVE_STATE(velocity);
SAVE_STATE(m_flTurn);
SAVE_STATE(m_eDriver);
SAVE_STATE(flags);
}
float
@ -710,6 +730,9 @@ prop_vehicle_driveable::SendEntity(entity ePVSent, float flSendFlags)
if (flSendFlags & VEHFL_TURNING)
WriteFloat(MSG_ENTITY, m_flTurn);
if (flSendFlags & VEHFL_FLAGS)
WriteFloat(MSG_ENTITY, flags);
return TRUE;
}
#endif

View File

@ -142,14 +142,15 @@ trigger_camera::EvaluateEntity(void)
angles = vectoangles(t.origin - origin);
}
if (net_origin != origin) {
net_origin = origin;
if (ATTR_CHANGED(origin)) {
SetSendFlags(OCAMFL_CHANGED_ORIGIN);
}
if (net_angles != angles) {
net_angles = angles;
if (ATTR_CHANGED(angles)) {
SetSendFlags(OCAMFL_CHANGED_ANGLES);
}
SAVE_STATE(origin);
SAVE_STATE(angles);
}
void

View File

@ -14,6 +14,21 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* networking helpers */
#define PREDICTED_INT(x) int x; int x ##_net
#define PREDICTED_FLOAT(x) float x; float x ##_net
#define PREDICTED_VECTOR(x) vector x; vector x ##_net
#define PREDICTED_ENT(x) entity x; entity x ##_net
#define PREDICTED_INT_N(x) int x ##_net
#define PREDICTED_FLOAT_N(x) float x ##_net
#define PREDICTED_VECTOR_N(x) vector x ##_net
#define ROLL_BACK(x) x = x ##_net
#define SAVE_STATE(x) x ##_net = x
#define ATTR_CHANGED(x) (x ##_net != x)
#define VEC_CHANGED(x,y) (x ##_net[y] != x[y])
#include "sound.h"
#ifdef CLIENT

View File

@ -14,36 +14,16 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define PREDICTED_INT(x) int x; int x ##_net
#define PREDICTED_FLOAT(x) float x; float x ##_net
#define PREDICTED_VECTOR(x) vector x; vector x ##_net
#define PREDICTED_ENT(x) entity x; entity x ##_net
#define PREDICTED_INT_N(x) int x ##_net
#define PREDICTED_FLOAT_N(x) float x ##_net
#define PREDICTED_VECTOR_N(x) vector x ##_net
#define ROLL_BACK(x) x = x ##_net
#define SAVE_STATE(x) x ##_net = x
#define ATTR_CHANGED(x) (x ##_net != x)
#define VEC_CHANGED(x,y) (x ##_net[y] != x[y])
class
base_player:base_client
{
PREDICTED_FLOAT(health);
PREDICTED_FLOAT(armor);
PREDICTED_FLOAT_N(modelindex);
PREDICTED_VECTOR_N(origin);
PREDICTED_VECTOR_N(velocity);
PREDICTED_VECTOR_N(angles);
PREDICTED_FLOAT_N(colormap);
PREDICTED_FLOAT_N(flags);
PREDICTED_FLOAT_N(gflags);
PREDICTED_FLOAT(viewzoom);
PREDICTED_VECTOR_N(view_ofs);
PREDICTED_FLOAT_N(movetype);
PREDICTED_VECTOR(v_angle);
PREDICTED_FLOAT_N(pmove_flags);