From beb6f496207287f7b2eb21ad807264b40abab67c Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 3 Jun 2022 15:22:33 -0700 Subject: [PATCH] Fixed dynamic lights not spawning properly, fix double init for CSQC ents. Be more specific about which ents can spawn and which won't on the client. Make sure __fullspawndata is wiped after every bsp ent init. --- src/client/entities.qc | 15 ++---- src/gs-entbase/client/env_cubemap.qc | 1 + src/gs-entbase/client/env_glow.qc | 1 + src/gs-entbase/client/env_particle.qc | 1 + src/gs-entbase/client/env_sound.qc | 1 + src/gs-entbase/client/env_soundscape.qc | 1 + src/gs-entbase/client/env_sun.qc | 1 + src/gs-entbase/client/func_dustcloud.qc | 1 + src/gs-entbase/client/func_dustmotes.qc | 1 + src/gs-entbase/client/func_lod.qc | 1 + src/gs-entbase/client/func_smokevolume.qc | 1 + src/gs-entbase/client/light_environment.qc | 1 + src/gs-entbase/client/point_message.qc | 1 + src/gs-entbase/client/prop_static.qc | 1 + src/gs-entbase/client/sky_camera.qc | 1 + src/gs-entbase/shared/NSEntity.qc | 4 +- src/gs-entbase/shared/ambient_generic.qc | 2 + src/gs-entbase/shared/env_bubbles.qc | 2 + src/gs-entbase/shared/func_tankmortar.qc | 2 + src/gs-entbase/shared/light_dynamic.qc | 55 +++++++++++++++------- 20 files changed, 62 insertions(+), 32 deletions(-) diff --git a/src/client/entities.qc b/src/client/entities.qc index 8cebe9fb..1b0bfb02 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -99,11 +99,7 @@ Entity_EntityUpdate(float type, float new) fc.ReceiveEntity(new, readfloat()); break; case ENT_DLIGHT: - light_dynamic dl = (light_dynamic)self; - if (new) { - spawnfunc_light_dynamic(); - } - dl.ReceiveEntity(new, readfloat()); + light_dynamic_ReadEntity(new); break; case ENT_PROJECTEDTEXTURE: env_projectedtexture ept = (env_projectedtexture)self; @@ -163,14 +159,11 @@ Entities_ParseLump(void) if (!eEnt.classname) { break; } - /* when we've reached the end of the lump, initialize the class! */ - if (iClass == TRUE) { - eEnt.Init(); - return (1); - } + + __fullspawndata = ""; /* remove if we've found no valid class to go with us */ - if (eEnt) { + if (eEnt && eEnt.isCSQC == false) { remove(eEnt); } return (1); diff --git a/src/gs-entbase/client/env_cubemap.qc b/src/gs-entbase/client/env_cubemap.qc index 1c824bdd..1469cbb4 100644 --- a/src/gs-entbase/client/env_cubemap.qc +++ b/src/gs-entbase/client/env_cubemap.qc @@ -69,6 +69,7 @@ void env_cubemap::env_cubemap(void) { m_iSize = 32; + isCSQC = true; } /* diff --git a/src/gs-entbase/client/env_glow.qc b/src/gs-entbase/client/env_glow.qc index cecca465..a85b6c75 100644 --- a/src/gs-entbase/client/env_glow.qc +++ b/src/gs-entbase/client/env_glow.qc @@ -226,4 +226,5 @@ env_glow::env_glow(void) m_flMaxAlpha = 1.0f; m_vecColor = [1,1,1]; drawmask = MASK_GLOWS; + isCSQC = true; } diff --git a/src/gs-entbase/client/env_particle.qc b/src/gs-entbase/client/env_particle.qc index c5df01cd..6b4850bc 100644 --- a/src/gs-entbase/client/env_particle.qc +++ b/src/gs-entbase/client/env_particle.qc @@ -107,4 +107,5 @@ env_particle::Respawn(void) void env_particle::env_particle(void) { + isCSQC = true; } diff --git a/src/gs-entbase/client/env_sound.qc b/src/gs-entbase/client/env_sound.qc index bb7b1b10..026001a1 100644 --- a/src/gs-entbase/client/env_sound.qc +++ b/src/gs-entbase/client/env_sound.qc @@ -111,4 +111,5 @@ void env_sound::env_sound(void) { m_iRadius = 256; + isCSQC = true; } diff --git a/src/gs-entbase/client/env_soundscape.qc b/src/gs-entbase/client/env_soundscape.qc index 906d06e3..bc9e9548 100644 --- a/src/gs-entbase/client/env_soundscape.qc +++ b/src/gs-entbase/client/env_soundscape.qc @@ -79,6 +79,7 @@ env_soundscape::env_soundscape(void) g_scapes+=1; m_iID = g_scapes; m_iRadius = 1024; + isCSQC = true; } void diff --git a/src/gs-entbase/client/env_sun.qc b/src/gs-entbase/client/env_sun.qc index 4529c4d3..6bfc2e47 100644 --- a/src/gs-entbase/client/env_sun.qc +++ b/src/gs-entbase/client/env_sun.qc @@ -158,6 +158,7 @@ env_sun::SpawnKey(string strField, string strKey) void env_sun::env_sun(void) { + isCSQC = true; } void diff --git a/src/gs-entbase/client/func_dustcloud.qc b/src/gs-entbase/client/func_dustcloud.qc index 36c560fb..34cf8326 100644 --- a/src/gs-entbase/client/func_dustcloud.qc +++ b/src/gs-entbase/client/func_dustcloud.qc @@ -194,4 +194,5 @@ func_dustcloud::func_dustcloud(void) m_vecColor = [1,1,1]; */ solid = SOLID_NOT; + isCSQC = true; } diff --git a/src/gs-entbase/client/func_dustmotes.qc b/src/gs-entbase/client/func_dustmotes.qc index ffed9460..e427db26 100644 --- a/src/gs-entbase/client/func_dustmotes.qc +++ b/src/gs-entbase/client/func_dustmotes.qc @@ -95,4 +95,5 @@ void func_dustmotes::func_dustmotes(void) { solid = SOLID_NOT; + isCSQC = true; } diff --git a/src/gs-entbase/client/func_lod.qc b/src/gs-entbase/client/func_lod.qc index bc01b42d..a979f9f3 100644 --- a/src/gs-entbase/client/func_lod.qc +++ b/src/gs-entbase/client/func_lod.qc @@ -108,4 +108,5 @@ func_lod::func_lod(void) { m_iDisappearDist = 2000; solid = SOLID_BSP; + isCSQC = true; } diff --git a/src/gs-entbase/client/func_smokevolume.qc b/src/gs-entbase/client/func_smokevolume.qc index 0cc20b86..6ce57c2f 100644 --- a/src/gs-entbase/client/func_smokevolume.qc +++ b/src/gs-entbase/client/func_smokevolume.qc @@ -210,4 +210,5 @@ func_smokevolume::func_smokevolume(void) m_vecColor1 = m_vecColor2 = [0,0,0]; solid = SOLID_NOT; + isCSQC = true; } diff --git a/src/gs-entbase/client/light_environment.qc b/src/gs-entbase/client/light_environment.qc index 6c4ee009..16ceca7c 100644 --- a/src/gs-entbase/client/light_environment.qc +++ b/src/gs-entbase/client/light_environment.qc @@ -84,4 +84,5 @@ void light_environment::light_environment(void) { solid = SOLID_NOT; + isCSQC = true; } diff --git a/src/gs-entbase/client/point_message.qc b/src/gs-entbase/client/point_message.qc index f2f7200c..1bee8170 100644 --- a/src/gs-entbase/client/point_message.qc +++ b/src/gs-entbase/client/point_message.qc @@ -63,6 +63,7 @@ point_message::point_message(void) { m_flRadius = 512; m_strMessage = "No message"; + isCSQC = true; } int diff --git a/src/gs-entbase/client/prop_static.qc b/src/gs-entbase/client/prop_static.qc index fa773249..94a28cd4 100644 --- a/src/gs-entbase/client/prop_static.qc +++ b/src/gs-entbase/client/prop_static.qc @@ -67,4 +67,5 @@ prop_static::Spawned(void) void prop_static::prop_static(void) { + isCSQC = true; } diff --git a/src/gs-entbase/client/sky_camera.qc b/src/gs-entbase/client/sky_camera.qc index f20859fb..80b43ab4 100644 --- a/src/gs-entbase/client/sky_camera.qc +++ b/src/gs-entbase/client/sky_camera.qc @@ -62,6 +62,7 @@ void sky_camera::sky_camera(void) { g_skyscale = 16; + isCSQC = true; } void diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index ddea7ad4..54ac14c5 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -1045,10 +1045,8 @@ NSEntity::NSEntity(void) #ifdef SERVER identity = 1; /* .identity is a global ent field we abuse to let find() calls reliably know that those are NSEntity class-based */ +#endif blocked = BlockedHandler; touch = TouchHandler; -#else - isCSQC = 1; -#endif } diff --git a/src/gs-entbase/shared/ambient_generic.qc b/src/gs-entbase/shared/ambient_generic.qc index e8a8e8ec..8763bbaa 100644 --- a/src/gs-entbase/shared/ambient_generic.qc +++ b/src/gs-entbase/shared/ambient_generic.qc @@ -390,6 +390,8 @@ ambient_generic::SpawnKey(string strKey, string strValue) void ambient_generic::Spawned(void) { + super::Spawned(); + precache_sound("common/null.wav"); } diff --git a/src/gs-entbase/shared/env_bubbles.qc b/src/gs-entbase/shared/env_bubbles.qc index 386f64eb..de41b8d1 100644 --- a/src/gs-entbase/shared/env_bubbles.qc +++ b/src/gs-entbase/shared/env_bubbles.qc @@ -345,6 +345,8 @@ env_bubbles::Respawn(void) void env_bubbles::Spawned(void) { + super::Spawned(); + precache_model("sprites/bubble.spr"); } diff --git a/src/gs-entbase/shared/func_tankmortar.qc b/src/gs-entbase/shared/func_tankmortar.qc index 40d5df18..34f079d6 100644 --- a/src/gs-entbase/shared/func_tankmortar.qc +++ b/src/gs-entbase/shared/func_tankmortar.qc @@ -436,6 +436,8 @@ func_tankmortar::SpawnKey(string strKey, string strValue) void func_tankmortar::Spawned(void) { + super::Spawned(); + #ifdef SERVER if (m_strSpriteFlash) precache_model(m_strSpriteFlash); diff --git a/src/gs-entbase/shared/light_dynamic.qc b/src/gs-entbase/shared/light_dynamic.qc index e2d28f60..6eacaf58 100644 --- a/src/gs-entbase/shared/light_dynamic.qc +++ b/src/gs-entbase/shared/light_dynamic.qc @@ -84,11 +84,11 @@ class light_dynamic:NSPointTrigger void(void) light_dynamic; virtual void(string, string) SpawnKey; + virtual void(void) Spawned; #ifdef CLIENT virtual void(float,float) ReceiveEntity; virtual float(void) predraw; - virtual void(void) Spawned; virtual void(void) RendererRestarted; #else @@ -137,6 +137,7 @@ light_dynamic::ReceiveEntity(float flNew, float flFlags) origin[1] = readcoord(); origin[2] = readcoord(); setorigin(this, origin); + print(sprintf("received %v\n", origin)); } if (flFlags & DLIGHTFL_CHANGED_ANGLES) { @@ -184,17 +185,6 @@ light_dynamic::RendererRestarted(void) dynamiclight_set(p, LFIELD_STYLESTRING, m_strPattern); #endif } -void -light_dynamic::Spawned(void) -{ - /* we're meant to be a server controlled entity. cancel out and kill us ASAP */ - if (targetname) { - Destroy(); - return; - } - - RendererRestarted(); -} #else void light_dynamic::EvaluateEntity(void) @@ -240,6 +230,7 @@ light_dynamic::SendEntity(entity ePEnt, float flFlags) WriteCoord(MSG_ENTITY, origin[0]); WriteCoord(MSG_ENTITY, origin[1]); WriteCoord(MSG_ENTITY, origin[2]); + print(sprintf("sending %v\n", origin)); } if (flFlags & DLIGHTFL_CHANGED_ANGLES) { @@ -323,6 +314,7 @@ light_dynamic::Input(entity eAct, string strInput, string strData) super::Input(eAct, strInput, strData); } } + void light_dynamic::Respawn(void) { @@ -330,7 +322,6 @@ light_dynamic::Respawn(void) SetSize([-16,-16,-16], [16,16,16]); SetOrigin(GetSpawnOrigin()); SetAngles(GetSpawnAngles()); - m_iState = (m_iStartActive == 1) ? 1 : 0; } #endif @@ -374,14 +365,18 @@ light_dynamic::SpawnKey(string strKey, string strValue) } void -light_dynamic::light_dynamic(void) +light_dynamic::Spawned(void) { - m_vecLight = [255,255,255]; - m_flDistance = 256; - m_iStartActive = 1; + super::Spawned(); #ifdef CLIENT - drawmask = MASK_ENGINE; + /* we're meant to be a server controlled entity. cancel out and kill us ASAP */ + if (isCSQC == true && targetname) { + Destroy(); + return; + } + + RendererRestarted(); #else /* the client-side will handle dlights without targetnames */ if (!targetname) { @@ -391,5 +386,29 @@ light_dynamic::light_dynamic(void) #endif } +void +light_dynamic::light_dynamic(void) +{ + m_vecLight = [255,255,255]; + m_flDistance = 256; + m_iStartActive = 1; +} + /* compatibility for q3map users, stay safe out there */ class dynamic_light:light_dynamic { }; + +#ifdef CLIENT +void +light_dynamic_ReadEntity(float new) +{ + light_dynamic dl = (light_dynamic)self; + + if (new) { + spawnfunc_light_dynamic(); + } + + dl.isCSQC = false; + dl.ReceiveEntity(new, readfloat()); + dl.drawmask = MASK_GLOWS; +} +#endif