From 82b1cb68fa5c1a487ceb734f8d311cde63bf28f3 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Fri, 21 Jan 2022 12:24:25 -0800 Subject: [PATCH] Improvements to some GoldSrc rendermode code, better teleporting behaviour for scripted_sequences. --- src/gs-entbase/baseentity.h | 35 +++-- src/gs-entbase/server/env_render.qc | 2 +- src/gs-entbase/server/prop_dynamic.qc | 6 +- src/gs-entbase/server/scripted_sequence.qc | 2 - src/gs-entbase/shared/NSEntity.qc | 47 ++++--- src/gs-entbase/shared/NSMonster.qc | 10 +- src/gs-entbase/shared/NSRenderableEntity.h | 6 +- src/gs-entbase/shared/NSRenderableEntity.qc | 79 ++++++++--- src/gs-entbase/shared/NSTalkMonster.h | 1 + src/gs-entbase/shared/NSTalkMonster.qc | 141 +++++++++++++------- 10 files changed, 214 insertions(+), 115 deletions(-) diff --git a/src/gs-entbase/baseentity.h b/src/gs-entbase/baseentity.h index a245c89a..b65a9478 100644 --- a/src/gs-entbase/baseentity.h +++ b/src/gs-entbase/baseentity.h @@ -32,23 +32,23 @@ enum enum { - RFX_NORMAL, - RFX_SLOWPULSE, - RFX_FASTPULSE, - RFX_SLOWWIDEPULSE, - RFX_FASTWIDEPULSE, - RFX_SLOWFADEAWAY, - RFX_FASTFADEAWAY, - RFX_SLOWBECOMESOLID, - RFX_FASTBECOMESOLID, - RFX_SLOWSTROBE, - RFX_FASTSTROBE, - RFX_FASTERSTROBE, - RFX_SLOWFLICKER, - RFX_FASTFLICKER, - RFX_CONSTANTGLOW, - RFX_DISTORT, - RFX_HOLOGRAM + RFX_NORMAL = 0, + RFX_SLOWPULSE = 1, + RFX_FASTPULSE = 2, + RFX_SLOWWIDEPULSE = 3, + RFX_FASTWIDEPULSE = 4, + RFX_SLOWFADEAWAY = 5, + RFX_FASTFADEAWAY = 6, + RFX_SLOWBECOMESOLID = 7, + RFX_FASTBECOMESOLID = 8, + RFX_SLOWSTROBE = 9, + RFX_FASTSTROBE = 10, + RFX_FASTERSTROBE = 11, + RFX_SLOWFLICKER = 12, + RFX_FASTFLICKER = 13, + RFX_CONSTANTGLOW = 14, + RFX_DISTORT = 15, + RFX_HOLOGRAM = 16 }; #endif @@ -69,7 +69,6 @@ enumflags #ifdef GS_RENDERFX BASEFL_CHANGED_RENDERCOLOR, BASEFL_CHANGED_RENDERAMT, - BASEFL_CHANGED_RENDERFX, BASEFL_CHANGED_RENDERMODE, #else BASEFL_CHANGED_ALPHA, diff --git a/src/gs-entbase/server/env_render.qc b/src/gs-entbase/server/env_render.qc index 7238c097..250db819 100644 --- a/src/gs-entbase/server/env_render.qc +++ b/src/gs-entbase/server/env_render.qc @@ -106,7 +106,7 @@ env_render::Trigger(entity act, int state) trigger.SetRenderAmt(m_flRenderAmt); } if (!(spawnflags & SF_NORENDERFX)) { - dprint(sprintf("\tFX change from %i to %i\n", trigger.m_iRenderFX, m_iRenderFX)); + dprint(sprintf("\tFX change from %d to %d\n", trigger.m_iRenderFX, m_iRenderFX)); trigger.SetRenderFX(m_iRenderFX); } } diff --git a/src/gs-entbase/server/prop_dynamic.qc b/src/gs-entbase/server/prop_dynamic.qc index 5a255bfe..657463bd 100644 --- a/src/gs-entbase/server/prop_dynamic.qc +++ b/src/gs-entbase/server/prop_dynamic.qc @@ -43,6 +43,7 @@ prop_dynamic::Respawn(void) { super::Respawn(); SetModel(GetSpawnModel()); + UpdateBounds(); if (spawnflags & PRPDYN_NONSOLID) SetSolid(SOLID_NOT); @@ -56,15 +57,14 @@ prop_dynamic::SpawnKey(string strKey, string strValue) float s = stof(strValue); switch (s) { - case 0: - SetSolid(SOLID_NOT); - break; case 2: SetSolid(SOLID_BBOX); break; case 6: SetSolid(SOLID_BSP); break; + default: + SetSolid(SOLID_NOT); } break; default: diff --git a/src/gs-entbase/server/scripted_sequence.qc b/src/gs-entbase/server/scripted_sequence.qc index d8a648e2..d0573331 100644 --- a/src/gs-entbase/server/scripted_sequence.qc +++ b/src/gs-entbase/server/scripted_sequence.qc @@ -207,12 +207,10 @@ scripted_sequence::RunOnEntity(entity targ) f.NewRoute(origin); f.m_flSequenceSpeed = 64; dprint("\tType: SS_WALK\n"); - return; } else if (m_iMove == SS_RUN) { f.NewRoute(origin); f.m_flSequenceSpeed = 200; dprint("\tType: SS_RUN\n"); - return; } else if (m_iMove == SS_INSTANTANEOUS) { setorigin(f, this.origin); dprint("\tType: SS_INSTANTANEOUS\n"); diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index b946c654..b170bb56 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -286,28 +286,9 @@ NSEntity::SetSolid(float newSolid) void NSEntity::UpdateBounds(void) { - SetSize(m_vecMins, m_vecMaxs); -} - -void -NSEntity::SetAngles(vector newAngles) -{ - if (newAngles == angles) - return; - - angles = newAngles; - SetSendFlags(BASEFL_CHANGED_ANGLES); - UpdateBounds(); -} - -void -NSEntity::SetSize(vector newMins, vector newMaxs) -{ + vector newMins, newMaxs; float flScale = 1.0f; - m_vecMins = newMins; - m_vecMaxs = newMaxs; - /* avoid useless computation */ if (angles != [0,0,0]) { /* adjust bbox according to rotation */ @@ -345,6 +326,32 @@ NSEntity::SetSize(vector newMins, vector newMaxs) SetSendFlags(BASEFL_CHANGED_SIZE); } +void +NSEntity::SetAngles(vector newAngles) +{ + if (newAngles == angles) + return; + + angles = newAngles; + SetSendFlags(BASEFL_CHANGED_ANGLES); +} + +void +NSEntity::SetSize(vector newMins, vector newMaxs) +{ + float flScale = 1.0f; + + m_vecMins = newMins; + m_vecMaxs = newMaxs; + + /* 0.0 is never valid, if you want it to disappear do something else */ + if (scale != 0.0) + flScale = scale; + + setsize(this, newMins * flScale, newMaxs * flScale); + SetSendFlags(BASEFL_CHANGED_SIZE); +} + void NSEntity::SetOrigin(vector newOrigin) { diff --git a/src/gs-entbase/shared/NSMonster.qc b/src/gs-entbase/shared/NSMonster.qc index 3fc4ee77..e78d26b6 100644 --- a/src/gs-entbase/shared/NSMonster.qc +++ b/src/gs-entbase/shared/NSMonster.qc @@ -294,7 +294,7 @@ void NSMonster::FreeStateMoved(void) { vector new_origin; - new_origin = gettaginfo(this, 0); + new_origin = gettaginfo(this, 1); SetOrigin(new_origin); FreeState(); } @@ -749,11 +749,9 @@ NSMonster::SendEntity(entity ePEnt, float fChanged) } #ifdef GS_RENDERFX - if (fChanged & BASEFL_CHANGED_RENDERFX) { - WriteByte(MSG_ENTITY, m_iRenderFX); - } if (fChanged & BASEFL_CHANGED_RENDERMODE) { WriteByte(MSG_ENTITY, m_iRenderMode); + WriteByte(MSG_ENTITY, m_iRenderFX); } if (fChanged & BASEFL_CHANGED_RENDERCOLOR) { @@ -855,11 +853,9 @@ NSMonster::ReceiveEntity(float flNew, float flChanged) } #ifdef GS_RENDERFX - if (flChanged & BASEFL_CHANGED_RENDERFX) { - m_iRenderFX = readbyte(); - } if (flChanged & BASEFL_CHANGED_RENDERMODE) { m_iRenderMode = readbyte(); + m_iRenderFX = readbyte(); } if (flChanged & BASEFL_CHANGED_RENDERCOLOR) { m_vecRenderColor[0] = readfloat(); diff --git a/src/gs-entbase/shared/NSRenderableEntity.h b/src/gs-entbase/shared/NSRenderableEntity.h index bcfc2bfd..2b1bc146 100644 --- a/src/gs-entbase/shared/NSRenderableEntity.h +++ b/src/gs-entbase/shared/NSRenderableEntity.h @@ -55,13 +55,13 @@ class NSRenderableEntity:NSEntity virtual void(void) MakeStatic; #ifdef GS_RENDERFX - int m_iRenderFX; + float m_iRenderFX; float m_iRenderMode; float m_flRenderAmt; vector m_vecRenderColor; /* set */ - nonvirtual void(int) SetRenderFX; + nonvirtual void(float) SetRenderFX; nonvirtual void(float) SetRenderMode; nonvirtual void(float) SetRenderAmt; nonvirtual void(vector) SetRenderColor; @@ -70,7 +70,7 @@ class NSRenderableEntity:NSEntity nonvirtual void(void) RenderFXPass; #else /* respawn */ - int m_oldiRenderFX; + float m_oldiRenderFX; float m_oldiRenderMode; float m_oldflRenderAmt; vector m_oldvecRenderColor; diff --git a/src/gs-entbase/shared/NSRenderableEntity.qc b/src/gs-entbase/shared/NSRenderableEntity.qc index 9e362a76..755f1036 100644 --- a/src/gs-entbase/shared/NSRenderableEntity.qc +++ b/src/gs-entbase/shared/NSRenderableEntity.qc @@ -162,11 +162,9 @@ NSRenderableEntity::SendEntity(entity ePEnt, float fChanged) } #ifdef GS_RENDERFX - if (fChanged & BASEFL_CHANGED_RENDERFX) { - WriteByte(MSG_ENTITY, m_iRenderFX); - } if (fChanged & BASEFL_CHANGED_RENDERMODE) { WriteByte(MSG_ENTITY, m_iRenderMode); + WriteByte(MSG_ENTITY, m_iRenderFX); } if (fChanged & BASEFL_CHANGED_RENDERCOLOR) { @@ -211,6 +209,12 @@ NSRenderableEntity::RenderFXPass(void) colormod = m_vecRenderColor; alpha = m_flRenderAmt; + /* these should be reset! */ + renderflags = 0; + effects = 0; + drawflags = 0; + abslight = 0; + switch (m_iRenderMode) { case RM_NORMAL: colormod = [1,1,1]; @@ -226,6 +230,7 @@ NSRenderableEntity::RenderFXPass(void) drawflags = 7; abslight = 128; } + break; case RM_GLOW: case RM_WORLDGLOW: /* TODO: Figure out what this does differently */ @@ -284,8 +289,49 @@ NSRenderableEntity::RenderFXPass(void) alpha = 0.0f; } - /* messy hologram imitation */ - if (m_iRenderFX == RFX_HOLOGRAM) { + switch (m_iRenderFX) { + case RFX_SLOWPULSE: + alpha = sin(cltime * 0.5); + break; + case RFX_FASTPULSE: + alpha = sin(cltime * 2.0); + break; + case RFX_SLOWWIDEPULSE: + alpha = sin(cltime * 0.5); + break; + case RFX_FASTWIDEPULSE: + alpha = sin(cltime * 2.0); + break; + case RFX_SLOWFADEAWAY: + alpha -= clframetime * 0.25; + break; + case RFX_FASTFADEAWAY: + effects = 0; + alpha -= clframetime; + break; + case RFX_SLOWBECOMESOLID: + break; + case RFX_FASTBECOMESOLID: + break; + case RFX_SLOWSTROBE: + alpha = (cltime & 1) ? 1.0 : 0.0f; + break; + case RFX_FASTSTROBE: + alpha = ((cltime*2.0) & 1) ? 1.0 : 0.0f; + break; + case RFX_FASTERSTROBE: + alpha = ((cltime*4.0) & 1) ? 1.0 : 0.0f; + break; + case RFX_SLOWFLICKER: + break; + case RFX_FASTFLICKER: + break; + case RFX_CONSTANTGLOW: + break; + case RFX_DISTORT: + break; + case RFX_HOLOGRAM: + /* messy hologram imitation */ float dist; float r; @@ -313,6 +359,9 @@ NSRenderableEntity::RenderFXPass(void) effects = EF_ADDITIVE; drawflags = 7; abslight = 128; + break; + default: + break; } /* HACK: This marks this entity as alphatested in platform's defaultwall.glsl */ @@ -388,11 +437,9 @@ NSRenderableEntity::ReceiveEntity(float flNew, float flChanged) } #ifdef GS_RENDERFX - if (flChanged & BASEFL_CHANGED_RENDERFX) { - m_iRenderFX = readbyte(); - } if (flChanged & BASEFL_CHANGED_RENDERMODE) { m_iRenderMode = readbyte(); + m_iRenderFX = readbyte(); } if (flChanged & BASEFL_CHANGED_RENDERCOLOR) { m_vecRenderColor[0] = readfloat(); @@ -555,13 +602,13 @@ NSRenderableEntity::SetScale(float newScale) #ifdef GS_RENDERFX void -NSRenderableEntity::SetRenderFX(int newFX) +NSRenderableEntity::SetRenderFX(float newFX) { if (newFX == m_iRenderFX) return; m_iRenderFX = newFX; - SetSendFlags(BASEFL_CHANGED_RENDERFX); + SetSendFlags(BASEFL_CHANGED_RENDERMODE); } void NSRenderableEntity::SetRenderMode(float newMode) @@ -609,8 +656,8 @@ NSRenderableEntity::Save(float handle) #else SaveFloat(handle, "renderamt", m_flRenderAmt); SaveVector(handle, "rendercolor", m_vecRenderColor); - SaveInt(handle, "rendermode", m_iRenderMode); - SaveInt(handle, "renderfx", m_iRenderFX); + SaveFloat(handle, "rendermode", m_iRenderMode); + SaveFloat(handle, "renderfx", m_iRenderFX); #endif super::Save(handle); @@ -649,10 +696,10 @@ NSRenderableEntity::Restore(string strKey, string strValue) m_vecRenderColor = stov(strValue) / 255; break; case "rendermode": - m_iRenderMode = stoi(strValue); + m_iRenderMode = stof(strValue); break; case "renderfx": - m_iRenderFX = stoi(strValue); + m_iRenderFX = stof(strValue); break; #endif default: @@ -736,10 +783,10 @@ NSRenderableEntity::SpawnKey(string strKey, string strValue) m_vecRenderColor = stov(strValue) / 255; break; case "rendermode": - m_iRenderMode = stoi(strValue); + m_iRenderMode = stof(strValue); break; case "renderfx": - m_iRenderFX = stoi(strValue); + m_iRenderFX = stof(strValue); break; #endif default: diff --git a/src/gs-entbase/shared/NSTalkMonster.h b/src/gs-entbase/shared/NSTalkMonster.h index 5020b84c..4e79674b 100644 --- a/src/gs-entbase/shared/NSTalkMonster.h +++ b/src/gs-entbase/shared/NSTalkMonster.h @@ -119,5 +119,6 @@ class NSTalkMonster:NSMonster virtual void(string) SentenceSample; virtual void(string) Sentence; virtual void(void) ProcessWordQue; + virtual void(float,float) ReceiveEntity; #endif }; diff --git a/src/gs-entbase/shared/NSTalkMonster.qc b/src/gs-entbase/shared/NSTalkMonster.qc index 41b4d884..7f7f7f5f 100644 --- a/src/gs-entbase/shared/NSTalkMonster.qc +++ b/src/gs-entbase/shared/NSTalkMonster.qc @@ -605,52 +605,10 @@ NSTalkMonster::SendEntity(entity ePEnt, float fChanged) WriteByte(MSG_ENTITY, ENT_TALKMONSTER); - /* newly popped into the PVS, sadly this is the only hacky way to check - * for this right now. convince the engine maintainer to make this more sensible */ - if (fChanged == 0xFFFFFF) { - /* check for defaults. if these are predictable fields, don't even bother - * networking them! you're just wasting bandwidth. */ - if (frame == 0) - fChanged &= ~BASEFL_CHANGED_FRAME; - if (skin == 0) - fChanged &= ~BASEFL_CHANGED_SKIN; - if (effects == 0) - fChanged &= ~BASEFL_CHANGED_EFFECTS; - if (m_iBody == 0) - fChanged &= ~BASEFL_CHANGED_BODY; - if (scale == 0.0 || scale == 1.0) - fChanged &= ~BASEFL_CHANGED_SCALE; - if (origin == [0,0,0]) - fChanged &= ~BASEFL_CHANGED_ORIGIN; - if (angles == [0,0,0]) - fChanged &= ~BASEFL_CHANGED_ANGLES; - if (velocity == [0,0,0]) - fChanged &= ~BASEFL_CHANGED_VELOCITY; - if (mins == [0,0,0] && maxs == [0,0,0]) - fChanged &= ~BASEFL_CHANGED_SIZE; - if (solid == SOLID_NOT) - fChanged &= ~BASEFL_CHANGED_SOLID; - if (movetype == MOVETYPE_NONE) - fChanged &= ~BASEFL_CHANGED_MOVETYPE; -#ifdef GS_RENDERFX - if (m_iRenderMode == RM_NORMAL) - fChanged &= ~BASEFL_CHANGED_RENDERMODE; -#endif - } - /* don't network triggers unless provoked */ /*if (cvar("developer") == 0 && m_iRenderMode == RM_TRIGGER) return (0);*/ -#ifdef GS_RENDERFX - /* let's not waste networking power on certain render-modes where they would - * not apply anyway. this seems sensible enough. */ - if (m_iRenderMode == RM_NORMAL || m_iRenderMode == RM_TRIGGER) { - fChanged &= ~BASEFL_CHANGED_RENDERCOLOR; - fChanged &= ~BASEFL_CHANGED_RENDERAMT; - } -#endif - /* broadcast how much data is expected to be read */ WriteFloat(MSG_ENTITY, fChanged); @@ -705,11 +663,9 @@ NSTalkMonster::SendEntity(entity ePEnt, float fChanged) } #ifdef GS_RENDERFX - if (fChanged & BASEFL_CHANGED_RENDERFX) { - WriteByte(MSG_ENTITY, m_iRenderFX); - } if (fChanged & BASEFL_CHANGED_RENDERMODE) { WriteByte(MSG_ENTITY, m_iRenderMode); + WriteByte(MSG_ENTITY, m_iRenderFX); } if (fChanged & BASEFL_CHANGED_RENDERCOLOR) { @@ -830,6 +786,101 @@ NSTalkMonster::predraw(void) return render; } +/* +============ +NSTalkMonster::ReceiveEntity +============ +*/ +void +NSTalkMonster::ReceiveEntity(float flNew, float flChanged) +{ + if (flChanged & BASEFL_CHANGED_ORIGIN) { + origin[0] = readcoord(); + origin[1] = readcoord(); + origin[2] = readcoord(); + } + if (flChanged & BASEFL_CHANGED_ANGLES) { + angles[0] = readshort() / (32767 / 360); + angles[1] = readshort() / (32767 / 360); + angles[2] = readshort() / (32767 / 360); + } + if (flChanged & BASEFL_CHANGED_MODELINDEX) { + setmodelindex(this, readshort()); + } + if (flChanged & BASEFL_CHANGED_SOLID) { + solid = readbyte(); + } + if (flChanged & BASEFL_CHANGED_MOVETYPE) { + movetype = readbyte(); + + if (movetype == MOVETYPE_PHYSICS) { + movetype = MOVETYPE_NONE; + } + } + if (flChanged & BASEFL_CHANGED_SIZE) { + mins[0] = readcoord(); + mins[1] = readcoord(); + mins[2] = readcoord(); + maxs[0] = readcoord(); + maxs[1] = readcoord(); + maxs[2] = readcoord(); + setsize(this, mins, maxs); + } + if (flChanged & BASEFL_CHANGED_FRAME) { + frame = readbyte(); + frame1time = readfloat(); + frame2time = frame1time; + } + if (flChanged & BASEFL_CHANGED_SKIN) { + skin = readbyte() - 128; + } + if (flChanged & BASEFL_CHANGED_EFFECTS) { + effects = readfloat(); + } + if (flChanged & BASEFL_CHANGED_BODY) { + m_iBody = readbyte(); + setcustomskin(this, "", sprintf("geomset 1 %i\n", m_iBody)); + } + if (flChanged & BASEFL_CHANGED_SCALE) { + scale = readfloat(); + } + if (flChanged & BASEFL_CHANGED_VELOCITY) { + velocity[0] = readfloat(); + velocity[1] = readfloat(); + velocity[2] = readfloat(); + } + +#ifdef GS_RENDERFX + if (flChanged & BASEFL_CHANGED_RENDERMODE) { + m_iRenderMode = readbyte(); + m_iRenderFX = readbyte(); + } + if (flChanged & BASEFL_CHANGED_RENDERCOLOR) { + m_vecRenderColor[0] = readfloat(); + m_vecRenderColor[1] = readfloat(); + m_vecRenderColor[2] = readfloat(); + } + if (flChanged & BASEFL_CHANGED_RENDERAMT) { + m_flRenderAmt = readfloat(); + } +#else + if (flChanged & BASEFL_CHANGED_ALPHA) { + alpha = readfloat(); + } +#endif + + if (modelindex) { + drawmask = MASK_ENGINE; + } else { + drawmask = 0; + } + + if (scale == 0.0) + scale = 1.0f; + + setorigin(this, origin); +} + void NSTalkMonster_ParseSentence(void) {