From b7126fbadb8f73d1cba2873cf73d8cd8633287ac Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 19 Sep 2023 22:01:36 -0700 Subject: [PATCH] env_glow: from client-side only entity to shared. also support other rendermodes (accurate to GoldSrc) --- src/client/NSInteractiveSurface.qc | 2 +- src/client/entities.qc | 83 ++-- src/gs-entbase/client.src | 1 - src/gs-entbase/client/env_glow.qc | 259 ------------- src/gs-entbase/client/env_particle.qc | 6 +- src/gs-entbase/client/env_sound.qc | 2 +- src/gs-entbase/client/func_dustcloud.qc | 6 + src/gs-entbase/client/func_smokevolume.qc | 16 +- src/gs-entbase/server/func_breakable.qc | 3 +- src/gs-entbase/server/func_guntarget.qc | 2 +- src/gs-entbase/server/trigger_once.qc | 2 +- src/gs-entbase/shared.src | 1 + src/gs-entbase/shared/ambient_generic.qc | 12 - src/gs-entbase/shared/env_beam.qc | 14 - src/gs-entbase/shared/env_bubbles.qc | 12 - src/gs-entbase/shared/env_fire.qc | 205 ++++++++++ src/gs-entbase/shared/env_fog.qc | 14 - src/gs-entbase/shared/env_fog_controller.qc | 29 +- src/gs-entbase/shared/env_glow.qc | 353 ++++++++++++++++++ src/gs-entbase/shared/env_laser.qc | 14 - src/gs-entbase/shared/env_sprite.qc | 168 +++------ src/gs-entbase/shared/env_steam.qc | 14 - src/gs-entbase/shared/func_conveyor.qc | 14 - src/gs-entbase/shared/func_tankmortar.qc | 16 +- src/gs-entbase/shared/func_vehicle.qc | 14 - src/gs-entbase/shared/info_waypoint.qc | 14 - src/gs-entbase/shared/light_dynamic.qc | 17 +- src/gs-entbase/shared/point_spotlight.qc | 14 +- src/gs-entbase/shared/prop_rope.qc | 17 +- .../shared/prop_vehicle_driveable.qc | 16 +- src/gs-entbase/shared/trigger_camera.qc | 8 +- src/shared/NSEntity.h | 6 +- src/shared/NSEntity.qc | 20 +- src/shared/NSMonster.h | 1 - src/shared/NSMonster.qc | 14 +- src/shared/NSPhysicsEntity.h | 6 +- src/shared/NSPhysicsEntity.qc | 18 +- src/shared/NSPortal.h | 2 - src/shared/NSPortal.qc | 12 - src/shared/NSProjectile.h | 5 - src/shared/NSProjectile.qc | 17 - src/shared/NSRenderableEntity.h | 6 +- src/shared/NSRenderableEntity.qc | 36 +- src/shared/NSTrigger.qc | 11 +- src/shared/defs.h | 32 ++ src/shared/entities.h | 1 + src/shared/global.h | 9 + 47 files changed, 759 insertions(+), 785 deletions(-) delete mode 100644 src/gs-entbase/client/env_glow.qc create mode 100644 src/gs-entbase/shared/env_fire.qc create mode 100644 src/gs-entbase/shared/env_glow.qc diff --git a/src/client/NSInteractiveSurface.qc b/src/client/NSInteractiveSurface.qc index 3db0a3c8..febefb9b 100644 --- a/src/client/NSInteractiveSurface.qc +++ b/src/client/NSInteractiveSurface.qc @@ -159,7 +159,7 @@ NSInteractiveSurface::predraw(void) return (PREDRAW_NEXT); makevectors(angles); - R_BeginPolygon(strtolower(m_strSurfaceMat), 0, 0); + R_BeginPolygon(m_strSurfaceMat, 0, 0); R_PolygonVertex(origin + v_right * fsize[0] - v_up * fsize[1], [1,1], [1,0,0], 1.0f); R_PolygonVertex(origin - v_right * fsize[0] - v_up * fsize[1], diff --git a/src/client/entities.qc b/src/client/entities.qc index a076c0d4..c1b8585c 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -20,45 +20,45 @@ Entity_EntityUpdate(float type, float new) { switch (type) { case ENT_ENTITY: - NSEntity_ReadEntity(new); + NSENTITY_READENTITY(NSEntity, new) break; case ENT_ENTITYRENDERABLE: - NSRenderableEntity_ReadEntity(new); + NSENTITY_READENTITY(NSRenderableEntity, new) break; case ENT_SURFPROP: - NSSurfacePropEntity_ReadEntity(new); + NSENTITY_READENTITY(NSSurfacePropEntity, new) break; case ENT_BEAM: - env_beam_ReadEntity(new); + NSENTITY_READENTITY(env_beam, new) break; case ENT_LASER: - env_laser_ReadEntity(new); + NSENTITY_READENTITY(env_laser, new) break; case ENT_PHYSICS: - NSPhysicsEntity_ReadEntity(new); + NSENTITY_READENTITY(NSPhysicsEntity, new) break; case ENT_MONSTER: - NSMonster_ReadEntity(new); + NSENTITY_READENTITY(NSMonster, new) self.customphysics = Empty; break; case ENT_TALKMONSTER: - NSTalkMonster_ReadEntity(new); + NSENTITY_READENTITY(NSTalkMonster, new) self.customphysics = Empty; break; case ENT_VEHICLE: - basevehicle_readentity(new); + NSENTITY_READENTITY(NSVehicle, new) break; case ENT_PORTAL: - NSPortal_ReadEntity(new); + NSENTITY_READENTITY(NSPortal, new) break; case ENT_VEH_BRUSH: - func_vehicle_readentity(new); + NSENTITY_READENTITY(func_vehicle, new) break; case ENT_VEH_TANKMORTAR: - func_tankmortar_readentity(new); + NSENTITY_READENTITY(func_tankmortar, new) break; case ENT_VEH_4WHEEL: - prop_vehicle_driveable_readentity(new); + NSENTITY_READENTITY(prop_vehicle_driveable, new) break; case ENT_PLAYER: player pl = (player)self; @@ -78,11 +78,10 @@ Entity_EntityUpdate(float type, float new) Spectator_ReadEntity(new); break; case ENT_SPRITE: - env_sprite spr = (env_sprite)self; - if (new) { - spawnfunc_env_sprite(); - } - spr.ReceiveEntity(new, readfloat()); + NSENTITY_READENTITY(env_sprite, new) + break; + case ENT_GLOW: + NSENTITY_READENTITY(env_glow, new) break; case ENT_SPRAY: Spray_Parse(); @@ -91,68 +90,52 @@ Entity_EntityUpdate(float type, float new) Decal_Parse(); break; case ENT_AMBIENTSOUND: - ambient_generic_ReadEntity(new); + NSENTITY_READENTITY(ambient_generic, new) break; case ENT_OLDCAMERA: - trigger_camera tc = (trigger_camera)self; - if (new) { - spawnfunc_trigger_camera(); - } - tc.ReceiveEntity(new, readfloat()); + NSENTITY_READENTITY(trigger_camera, new) break; case ENT_MONITOR: - func_monitor fc = (func_monitor)self; - if (new) { - spawnfunc_func_monitor(); - } - fc.ReceiveEntity(new, readfloat()); + NSENTITY_READENTITY(func_monitor, new) break; case ENT_DLIGHT: - light_dynamic_ReadEntity(new); + NSENTITY_READENTITY(light_dynamic, new) break; case ENT_PROJECTEDTEXTURE: - env_projectedtexture ept = (env_projectedtexture)self; - if (new) { - spawnfunc_env_projectedtexture(); - } - ept.ReceiveEntity(new, readfloat()); + NSENTITY_READENTITY(env_projectedtexture, new) break; case ENT_SPOTLIGHT: - point_spotlight_ReadEntity(new); + NSENTITY_READENTITY(point_spotlight, new) break; case ENT_FOG: - env_fog_readentity(new); + NSENTITY_READENTITY(env_fog, new) break; case ENT_STEAM: - env_steam_ReadEntity(new); + NSENTITY_READENTITY(env_steam, new) break; case ENT_FOGCONTROLLER: - env_fog_controller_readentity(new); + NSENTITY_READENTITY(env_fog_controller, new) break; case ENT_PARTSYSTEM: - info_particle_system ips = (info_particle_system)self; - if (new) { - spawnfunc_info_particle_system(); - } - ips.ReceiveEntity(new, readfloat()); + NSENTITY_READENTITY(info_particle_system, new) break; case ENT_PROPROPE: - prop_rope_readentity(new); + NSENTITY_READENTITY(prop_rope, new) break; case ENT_BUBBLES: - env_bubbles_ReadEntity(new); + NSENTITY_READENTITY(env_bubbles, new) break; case ENT_CONVEYOR: - func_conveyor_ReadEntity(new); + NSENTITY_READENTITY(func_conveyor, new) break; case ENT_WAYPOINT: - info_waypoint_ReadEntity(new); + NSENTITY_READENTITY(info_waypoint, new) break; case ENT_PUSH: - trigger_push_ReadEntity(new); + NSENTITY_READENTITY(trigger_push, new) break; case ENT_ENTITYPROJECTILE: - NSProjectile_ReadEntity(new); + NSENTITY_READENTITY(NSProjectile, new) break; default: //error(sprintf("Unknown entity type update received. (%d)\n", t)); diff --git a/src/gs-entbase/client.src b/src/gs-entbase/client.src index 5d80a19f..1d55f861 100644 --- a/src/gs-entbase/client.src +++ b/src/gs-entbase/client.src @@ -6,7 +6,6 @@ decals.h client/defs.h client/env_cubemap.qc -client/env_glow.qc client/env_sun.qc client/env_sound.qc client/env_soundscape.qc diff --git a/src/gs-entbase/client/env_glow.qc b/src/gs-entbase/client/env_glow.qc deleted file mode 100644 index b01170a3..00000000 --- a/src/gs-entbase/client/env_glow.qc +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2016-2022 Vera Visions LLC. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -var int autocvar_r_skipGlows = 0; -var int autocvar_r_skipLensFlares = 0; - -/*!QUAKED env_glow (1 .5 0) (-8 -8 -8) (8 8 8) EVGLOW_ORIENT -# OVERVIEW -Client-side glare/glow orb effect like the flares in 1997's Unreal. - -# KEYS -- "shader" : Material to use for the glare/glow effect. -- "model" : Sprite model to use for the glare/glow (idTech 2 BSPs only) -- "scale" : Scale multiplier. -- "rendercolor" : Material color override in RGB8. -- "renderamt" : Material alpha override in A8. - -# SPAWNFLAGS -- EVGLOW_ORIENT (1) : TODO: Glow is an oriented sprite when set. - -# TRIVIA -This entity was introduced in Half-Life (1998). -*/ -class env_glow:NSEntity /* TODO: change to renderablentity? */ -{ -public: - void env_glow(void); - - virtual void Spawned(void); - virtual void Respawn(void); - virtual float predraw(void); - virtual void postdraw(void); - virtual void SpawnKey(string,string); - virtual void RendererRestarted(void); - virtual bool CanSpawn(bool); - -private: - vector m_vecColor; - float m_flAlpha; - float m_flMaxAlpha; - string m_strSprite; - vector m_vecSize; - float m_flScale; - - vector m_vecRotate; - vector m_vecOrientation; - - nonvirtual bool IsVisible(vector); - nonvirtual void RenderGlow(vector, vector); -}; - -bool -env_glow::IsVisible(vector vecPlayer) -{ - entity oother = other; - - if (autocvar_r_skipGlows) - return (false); - - if (checkpvs(vecPlayer, this) == FALSE) - return (false); - - other = world; - traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this); - other = oother; - - /* If we can't trace against the player, or are two close, fade out */ - if (trace_fraction < 1.0f || vlen(origin - vecPlayer) < 128) - m_flAlpha = m_flAlpha - frametime; - else - m_flAlpha = m_flAlpha + frametime; - - m_flAlpha = bound(0.0f, m_flAlpha, 1.0f); - - if (m_flAlpha <= 0.0f) - return (false); - - return (true); -} - -bool -env_glow::CanSpawn(bool clientSide) -{ - return true; -} - -void env_sun_lensflare(vector, float, vector); -void -env_glow::postdraw(void) -{ - if (!autocvar_r_skipLensFlares) - env_sun_lensflare(origin, m_flAlpha, m_vecColor); -} - -void -env_glow::RendererRestarted(void) -{ - if (!model && m_strSprite) { - precache_pic(m_strSprite); - m_vecSize = drawgetimagesize(m_strSprite) / 2; - } else { - precache_model(model); - m_strSprite = spriteframe(model, 0, 0.0f); - m_vecSize = drawgetimagesize(m_strSprite) / 2; - } - - if (HasSpawnFlags(1)) { - hitcontentsmaski = CONTENTBIT_SOLID; - decal_pickwall(this, origin); - m_vecOrientation = vectoangles(g_tracedDecal.normal * -1); - } -} - -void -env_glow::RenderGlow(vector forg, vector fsize) -{ -#ifndef FTE_QUADFIX - R_BeginPolygon(m_strSprite, 1, 0); - R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], - [1,1], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], - [0,1], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], - [0,0], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], - [1,0], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_EndPolygon(); -#else - R_BeginPolygon(m_strSprite, 1, 0); - R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], - [1,1], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], - [0,1], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], - [0,0], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_EndPolygon(); - R_BeginPolygon(m_strSprite, 1, 0); - R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], - [0,1], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], - [0,0], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], - [1,0], m_vecColor * m_flMaxAlpha, m_flAlpha); - R_EndPolygon(); -#endif -} - -float -env_glow::predraw(void) -{ - vector forg; - vector fsize; - vector vecPlayer = g_view.GetCameraOrigin(); - vector vecAngle = g_view.GetCameraAngle(); - float flDist = vlen(vecPlayer - origin); - - if (IsVisible(vecPlayer) == false) - return (PREDRAW_NEXT); - - /* Scale the glow somewhat with the players distance */ - fsize = m_vecSize * m_flScale; - fsize *= bound(1, flDist / 256, 4); - - /* Nudge this slightly towards the camera */ - makevectors(vectoangles(origin - vecPlayer)); - forg = origin + (v_forward * -16); - - if (HasSpawnFlags(1)) { - vector above; - makevectors(m_vecOrientation); - above = origin + (v_forward * 16); - - /* we're aiming right down */ - if (above[2] > origin[2]) - makevectors(m_vecOrientation+[0, m_vecRotate[2],0]); - else - makevectors(m_vecOrientation+[0,0, m_vecRotate[2]]); - } else { - makevectors(vecAngle +[0, m_vecRotate[1], m_vecRotate[2]]); - } - - RenderGlow(forg, fsize); - - return (PREDRAW_NEXT); -} - -void -env_glow::SpawnKey(string strField, string strKey) -{ - switch (strField) { - case "material": - case "shader": - model = __NULL__; - m_strSprite = strKey; - break; - case "sprite": - case "model": - model = strKey; - break; - case "scale": - m_flScale = stof(strKey); - break; - case "color": - m_vecColor = stov(strKey); - break; - case "rendercolor": - case "rendercolour": - m_vecColor = stov(strKey) / 255; - break; - case "renderamt": - m_flMaxAlpha = stof(strKey) / 255; - break; - case "rotate": - m_vecRotate[2] = stof(strKey); - break; - case "rotate": - break; - default: - super::SpawnKey(strField, strKey); - } -} - -void -env_glow::Respawn(void) -{ - SetSize([0,0,0], [0,0,0]); - SetOrigin(GetSpawnOrigin()); - effects &= ~EF_NOSHADOW; -} - -void -env_glow::Spawned(void) -{ - super::Spawned(); - RendererRestarted(); -} - -void -env_glow::env_glow(void) -{ - m_flScale = 1.0f; - 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 91fb31c9..5674a18a 100644 --- a/src/gs-entbase/client/env_particle.qc +++ b/src/gs-entbase/client/env_particle.qc @@ -57,11 +57,7 @@ env_particle::CanSpawn(bool clientSide) void env_particle::customphysics(void) { - vector vecPlayer; - - int s = (float)getproperty(VF_ACTIVESEAT); - pSeat = &g_seats[s]; - vecPlayer = pSeat->m_vecPredictedOrigin; + vector vecPlayer = g_view.GetCameraOrigin(); if (checkpvs(vecPlayer, this) == FALSE) { return; diff --git a/src/gs-entbase/client/env_sound.qc b/src/gs-entbase/client/env_sound.qc index a4d290c2..02509832 100644 --- a/src/gs-entbase/client/env_sound.qc +++ b/src/gs-entbase/client/env_sound.qc @@ -99,7 +99,7 @@ env_sound::SpawnKey(string strField, string strKey) int efx_alias = stoi(strKey); if (efx_alias >= g_hlefx.length) { - print("^1env_sound::SpawnKey: Invalid roomtype!\n"); + NSEntWarning("invalid roomtype!"); m_iRoomType = 0; } else m_iRoomType = EFX_Load(g_hlefx[efx_alias]); diff --git a/src/gs-entbase/client/func_dustcloud.qc b/src/gs-entbase/client/func_dustcloud.qc index 820c22b0..389e61e1 100644 --- a/src/gs-entbase/client/func_dustcloud.qc +++ b/src/gs-entbase/client/func_dustcloud.qc @@ -77,6 +77,12 @@ float func_dustcloud_cloud::predraw(void) { float alpha; + vector vecPlayer = g_view.GetCameraOrigin(); + + if (checkpvs(vecPlayer, this) == FALSE) { + return; + } + makevectors(view_angles); if (lifetime < (m_flLifeTime / 2)) { diff --git a/src/gs-entbase/client/func_smokevolume.qc b/src/gs-entbase/client/func_smokevolume.qc index c14ba68c..61c9a0de 100644 --- a/src/gs-entbase/client/func_smokevolume.qc +++ b/src/gs-entbase/client/func_smokevolume.qc @@ -77,6 +77,13 @@ float func_smokevolume_cloud::predraw(void) { float alpha; + vector vecPlayer = g_view.GetCameraOrigin(); + return PREDRAW_NEXT; + + if (checkpvs(vecPlayer, this) == FALSE) { + return PREDRAW_NEXT; + } + makevectors(view_angles); if (lifetime < (m_flLifeTime / 2)) { @@ -89,6 +96,9 @@ func_smokevolume_cloud::predraw(void) if (!(spawnflags & 1)) { m_vecColor *= (getlight(origin) / 255); + m_vecColor[0] = bound(0.0, m_vecColor[0], 1.0); + m_vecColor[1] = bound(0.0, m_vecColor[1], 1.0); + m_vecColor[2] = bound(0.0, m_vecColor[2], 1.0); } R_BeginPolygon(m_strMaterial, 0, 0); @@ -121,12 +131,14 @@ float func_smokevolume::predraw(void) { vector vecPlayer = g_view.GetCameraOrigin(); + float playerDist = vlen(vecPlayer - origin); + float fracDist = 1.0 - bound(0.0, playerDist / 512, 1.0); if (checkpvs(vecPlayer, this) == FALSE) return (PREDRAW_NEXT); if (m_flMaxDrawDistance > 0.0) - if (vlen(vecPlayer - origin) > m_flMaxDrawDistance) + if (playerDist > m_flMaxDrawDistance) return (PREDRAW_NEXT); if (m_flNexTime > cltime) @@ -144,7 +156,7 @@ func_smokevolume::predraw(void) cloud.m_vecColor[0] = Math_Lerp(m_vecColor1[0], m_vecColor2[0], r); cloud.m_vecColor[1] = Math_Lerp(m_vecColor1[1], m_vecColor2[1], r); cloud.m_vecColor[2] = Math_Lerp(m_vecColor1[2], m_vecColor2[2], r); - cloud.m_flMaxAlpha = m_flAlpha; + cloud.m_flMaxAlpha = m_flAlpha * fracDist; cloud.cloudsize[0] = random(m_flSizeMin, m_flSizeMax); cloud.cloudsize[1] = random(m_flSizeMin, m_flSizeMax); cloud.m_flLifeTime = random(m_flLifetimeMin, m_flLifetimeMax); diff --git a/src/gs-entbase/server/func_breakable.qc b/src/gs-entbase/server/func_breakable.qc index 8542972a..2d053d12 100644 --- a/src/gs-entbase/server/func_breakable.qc +++ b/src/gs-entbase/server/func_breakable.qc @@ -215,8 +215,7 @@ func_breakable::SpawnKey(string strKey, string strValue) if (oid >= funcbreakable_objtable.length) { m_strBreakSpawn = ""; - print(sprintf("^1func_breakable^7:" \ - "spawnobject %i out of bounds! fix your mod!\n", oid)); + NSEntWarning("spawnobject %i out of bounds", oid); } else { m_strBreakSpawn = funcbreakable_objtable[oid]; } diff --git a/src/gs-entbase/server/func_guntarget.qc b/src/gs-entbase/server/func_guntarget.qc index 63e37360..8178c8e1 100644 --- a/src/gs-entbase/server/func_guntarget.qc +++ b/src/gs-entbase/server/func_guntarget.qc @@ -148,7 +148,7 @@ func_guntarget::Move(void) node = (path_corner)find(world, ::targetname, target); if (!node) { - NSLog("^1func_guntarget::^3Move^7: Path node for %s not found!", targetname); + NSEntWarning("node %s for %s not found!", target, targetname); return; } diff --git a/src/gs-entbase/server/trigger_once.qc b/src/gs-entbase/server/trigger_once.qc index a6ad7cb9..f30d8fe8 100644 --- a/src/gs-entbase/server/trigger_once.qc +++ b/src/gs-entbase/server/trigger_once.qc @@ -136,7 +136,7 @@ trigger_once::Touch(entity eToucher) SetSolid(SOLID_NOT); /* make inactive */ m_iValue = 1; - if (!target) { + if (!target && !m_strKillTarget) { UseOutput(eToucher, m_strOnStartTouch); return; } diff --git a/src/gs-entbase/shared.src b/src/gs-entbase/shared.src index 885c084e..4c8656b7 100644 --- a/src/gs-entbase/shared.src +++ b/src/gs-entbase/shared.src @@ -10,6 +10,7 @@ shared/env_beam.qc shared/env_sprite.qc shared/env_bubbles.qc shared/env_laser.qc +shared/env_glow.qc shared/env_projectedtexture.qc shared/env_fog.qc shared/env_fog_controller.qc diff --git a/src/gs-entbase/shared/ambient_generic.qc b/src/gs-entbase/shared/ambient_generic.qc index 16d51fc6..e5ef8d5a 100644 --- a/src/gs-entbase/shared/ambient_generic.qc +++ b/src/gs-entbase/shared/ambient_generic.qc @@ -427,15 +427,3 @@ ambient_generic::predraw(void) return (PREDRAW_NEXT); } #endif - -#ifdef CLIENT -void -ambient_generic_ReadEntity(float new) -{ - ambient_generic me = (ambient_generic)self; - if (new) { - spawnfunc_ambient_generic(); - } - me.ReceiveEntity(new, readfloat()); -} -#endif diff --git a/src/gs-entbase/shared/env_beam.qc b/src/gs-entbase/shared/env_beam.qc index 15193f2e..1d7b0b6b 100644 --- a/src/gs-entbase/shared/env_beam.qc +++ b/src/gs-entbase/shared/env_beam.qc @@ -512,18 +512,4 @@ env_beam::predraw(void) return (PREDRAW_NEXT); } -#endif - -#ifdef CLIENT -void -env_beam_ReadEntity(float isnew) -{ - env_beam beam = (env_beam)self; - float changedflags = readfloat(); - - if (isnew) - spawnfunc_env_beam(); - - beam.ReceiveEntity(isnew, changedflags); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/env_bubbles.qc b/src/gs-entbase/shared/env_bubbles.qc index 1bacc500..de075ac4 100644 --- a/src/gs-entbase/shared/env_bubbles.qc +++ b/src/gs-entbase/shared/env_bubbles.qc @@ -345,15 +345,3 @@ env_bubbles::Spawned(void) precache_model("sprites/bubble.spr"); } - -#ifdef CLIENT -void -env_bubbles_ReadEntity(float new) -{ - env_bubbles me = (env_bubbles)self; - if (new) { - spawnfunc_env_bubbles(); - } - me.ReceiveEntity(new, readfloat()); -} -#endif diff --git a/src/gs-entbase/shared/env_fire.qc b/src/gs-entbase/shared/env_fire.qc new file mode 100644 index 00000000..64807c00 --- /dev/null +++ b/src/gs-entbase/shared/env_fire.qc @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2023 Vera Visions LLC. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +enumflags +{ + ENVFIRE_INFINITE, + ENVFIRE_SMOKELESS, + ENVFIRE_STARTON, + ENVFIRE_STARTFULL, + ENVFIRE_NODROP, + ENVFIRE_NOGLOW, + ENVFIRE_UNUSED, + ENVFIRE_DELETE, + ENVFIRE_TOPVISIBLE +}; + +/*!QUAKED env_fire (1 .5 0) (-8 -8 -8) (8 8 8) INFINITE_DURATION SMOKELESS STARTON STARTFULL NODROP NOGLOW x DELETE TOPVISIBLE +# OVERVIEW +Environmental fire/flame entity. Will apply damage to entities, including other fire entities. They grow/shrink depending on their ignition level. + +# KEYS +- "targetname" : Name +- "health" : Duration, in seconds. +- "firesize" : Size of the fire in world units. +- "fireattack" : Time in seconds until the fire has fully expanded. +- "firetype" : Type of fire. 0 - Standard, 1 - Plasma +- "ignitionpoint" : Amount of fire damage it takes before igniting fully. +- "damagescale" : Burn damage multiplier. + +# SPAWNFLAGS +- INFINITE_DURATION (1) : Don't extinguish by itself. +- SMOKELESS (2) : Don't spawn smoke. +- STARTON (4) : Starts enabled. +- STARTFULL (8) : Starts expanded. +- NODROP (16) : Don't drop to floor (?) +- NOGLOW (32) : Don't glow. +- DELETE (128) : Delete from game when extinguished. +- TOPVISIBLE (256) : Visible from above. + +# INPUTS +- "StartFire" : Starts the fire effect. +- "Extinguish" : Puts out the fire, with an optional timer (in seconds). +- "ExtinguishTemporary" : Puts out the fire (temporarily). + +# OUTPUTS +- "OnIgnited" : Triggered when the fire ignites. +- "OnExtinguished" : Triggered when the fire is extinguished. + +# TRIVIA +This entity was introduced in Half-Life 2 (2004). +*/ +class +env_fire:NSPointTrigger +{ + PREDICTED_FLOAT(m_flSize) + PREDICTED_BOOL(m_bState) + PREDICTED_FLOAT m_flMaxSize) + PREDICTED_FLOATm_flGrowTime) + PREDICTED_BOOL(m_bType) + float m_flIgnitionPoint; + float m_flDamageScale; + float m_flDuration; + + void env_fire(void); + +#ifdef SERVER + virtual void SpawnKey(string strKey, string strValue); +#endif +}; + +void +env_fire::env_fire(void) +{ + m_flDuration = 30.0f; + m_flSize = 64.0; + m_flGrowTime = 4.0f; + m_bType = false; + m_flIgnitionPoint = 32.0f; + m_flDamageScale = 1.0f; +} + +#ifdef SERVER +void +env_fire::SpawnKey(string strKey, string strValue) +{ + switch (strKey) { + case "health": + m_flDuration = stof(strValue); + break; + case "firesize": + m_flSize = stof(strValue); + break; + case "fireattack": + m_flGrowTime = stof(strValue); + break; + case "firetype": + m_bType = stof(strValue); + break; + case "ignitionpoint": + m_flIgnitionPoint = stof(strValue); + break; + case "damagescale": + m_flDamageScale = stof(strValue); + break; + default: + super::SpawnKey(strKey, strValue); + } +} + +void +env_fire::Respawn(void) +{ + SetSize([0,0,0], [0,0,0]); + SetOrigin(GetSpawnOrigin()); +} + +void +env_fire::EvaluateEntity(void) +{ + EVALUATE_VECTOR(origin, 0, EVFIRE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 1, EVFIRE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 2, EVFIRE_CHANGED_ORIGIN) + EVALUATE_VECTOR(angles, 0, EVFIRE_CHANGED_ANGLE) + EVALUATE_VECTOR(angles, 1, EVFIRE_CHANGED_ANGLE) + EVALUATE_VECTOR(angles, 2, EVFIRE_CHANGED_ANGLE) + EVALUATE_FIELD(m_flDuration, EVFIRE_CHANGED_DURATION) + EVALUATE_FIELD(m_flMaxSize, EVFIRE_CHANGED_SIZE) + EVALUATE_FIELD(m_flGrowTime, EVFIRE_CHANGED_GROW) + EVALUATE_FIELD(m_bType, EVFIRE_CHANGED_TYPE) +} + +float +env_fire::SendEntity(entity ePEnt, float flChanged) +{ + WriteByte(MSG_ENTITY, ENT_STEAM); + WriteFloat(MSG_ENTITY, flChanged); + + SENDENTITY_COORD(origin[0], EVFIRE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[1], EVFIRE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[2], EVFIRE_CHANGED_ORIGIN) + SENDENTITY_COORD(angles[0], EVFIRE_CHANGED_ANGLE) + SENDENTITY_COORD(angles[1], EVFIRE_CHANGED_ANGLE) + SENDENTITY_COORD(angles[2], EVFIRE_CHANGED_ANGLE) + SENDENTITY_BYTE(m_bState, EVFIRE_CHANGED_STATE) + SENDENTITY_BYTE(m_bType, EVFIRE_CHANGED_TYPE) + SENDENTITY_FLOAT(m_flSpread, EVFIRE_CHANGED_SPREAD) + SENDENTITY_FLOAT(m_flSpeed, EVFIRE_CHANGED_SPEED) + SENDENTITY_FLOAT(m_flStartSize, EVFIRE_CHANGED_MINS) + SENDENTITY_FLOAT(m_flEndSize , EVFIRE_CHANGED_MAXS) + SENDENTITY_FLOAT(m_flRate, EVFIRE_CHANGED_RATE) + SENDENTITY_COLOR(m_vecColor[0], EVFIRE_CHANGED_COLOR) + SENDENTITY_COLOR(m_vecColor[1], EVFIRE_CHANGED_COLOR) + SENDENTITY_COLOR(m_vecColor[2], EVFIRE_CHANGED_COLOR) + SENDENTITY_FLOAT(m_flLength, EVFIRE_CHANGED_LENGTH) + SENDENTITY_FLOAT(m_flAlpha, EVFIRE_CHANGED_ALPHA) + SENDENTITY_FLOAT(m_flRollSpeed, EVFIRE_CHANGED_ROLL) + + //print(sprintf("S (%x): %v %v %i\n", flChanged, origin, m_vecEndPos, m_iActive)); + + return (1); +} +#else +void +env_fire::ReceiveEntity(float flNew, float flChanged) +{ + READENTITY_COORD(origin[0], EVFIRE_CHANGED_ORIGIN) + READENTITY_COORD(origin[1], EVFIRE_CHANGED_ORIGIN) + READENTITY_COORD(origin[2], EVFIRE_CHANGED_ORIGIN) + READENTITY_COORD(angles[0], EVFIRE_CHANGED_ANGLE) + READENTITY_COORD(angles[1], EVFIRE_CHANGED_ANGLE) + READENTITY_COORD(angles[2], EVFIRE_CHANGED_ANGLE) + READENTITY_BYTE(m_bState, EVFIRE_CHANGED_STATE) + READENTITY_BYTE(m_bType, EVFIRE_CHANGED_TYPE) + READENTITY_FLOAT(m_flSpread, EVFIRE_CHANGED_SPREAD) + READENTITY_FLOAT(m_flSpeed, EVFIRE_CHANGED_SPEED) + READENTITY_FLOAT(m_flStartSize, EVFIRE_CHANGED_MINS) + READENTITY_FLOAT(m_flEndSize , EVFIRE_CHANGED_MAXS) + READENTITY_FLOAT(m_flRate, EVFIRE_CHANGED_RATE) + READENTITY_COLOR(m_vecColor[0], EVFIRE_CHANGED_COLOR) + READENTITY_COLOR(m_vecColor[1], EVFIRE_CHANGED_COLOR) + READENTITY_COLOR(m_vecColor[2], EVFIRE_CHANGED_COLOR) + READENTITY_FLOAT(m_flLength, EVFIRE_CHANGED_LENGTH) + READENTITY_FLOAT(m_flAlpha, EVFIRE_CHANGED_ALPHA) + READENTITY_FLOAT(m_flRollSpeed, EVFIRE_CHANGED_ROLL) + + //print(sprintf("R (%x): %v %v %i\n", flChanged, origin, m_vecEndPos, m_iActive)); + + //drawmask = MASK_ENGINE; + setsize(this, [0,0,0], [0,0,0]); + setorigin(this, origin); +} +#endif \ No newline at end of file diff --git a/src/gs-entbase/shared/env_fog.qc b/src/gs-entbase/shared/env_fog.qc index 3103af7e..4ea51c28 100644 --- a/src/gs-entbase/shared/env_fog.qc +++ b/src/gs-entbase/shared/env_fog.qc @@ -215,18 +215,4 @@ env_fog::Trigger(entity act, triggermode_t state) m_bEnabled = (m_bEnabled) ? false : true; } } -#endif - -#ifdef CLIENT -void -env_fog_readentity(float isnew) -{ - env_fog fog = (env_fog)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_env_fog(); - - fog.ReceiveEntity(isnew, flags); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/env_fog_controller.qc b/src/gs-entbase/shared/env_fog_controller.qc index 81a9678e..b383213e 100644 --- a/src/gs-entbase/shared/env_fog_controller.qc +++ b/src/gs-entbase/shared/env_fog_controller.qc @@ -168,13 +168,13 @@ env_fog_controller::FogRender(void) m_flNextDraw = cltime + 1.0f; /* apply the fog. wish there was a builtin for this instead... */ - localcmd(sprintf("fog %f %f %f %f %f %f\n", \ - StartToBias(), + localcmd(sprintf("set r_fog_linear 1; fog %f %f %f %f %f %f\n", \ + m_flFogEnd, Math_Lerp(m_vecFogColor[0], m_vecFogColor2[0], delta), Math_Lerp(m_vecFogColor[1], m_vecFogColor2[1], delta), Math_Lerp(m_vecFogColor[2], m_vecFogColor2[2], delta), m_flFogMaxDensity, - 0.0f)); + m_flFogStart)); //print(sprintf("%f (%v, %v)\n", delta, p1, p2)); @@ -187,13 +187,13 @@ env_fog_controller::FogUpdate(void) if (!m_iFogActive) return; - localcmd(sprintf("fog %f %f %f %f %f %f\n", \ - StartToBias(), + localcmd(sprintf("set r_fog_linear 1; fog %f %f %f %f %f %f\n", \ + m_flFogEnd, m_vecFogColor[0], m_vecFogColor[1], m_vecFogColor[2], m_flFogMaxDensity, - 0.0f)); + m_flFogStart)); } void @@ -528,19 +528,4 @@ env_fog_controller::env_fog_controller(void) m_vecSpawnColor = [1.0, 1.0, 1.0]; m_flSpawnMaxDensity = 1.0f; #endif -} - - -#ifdef CLIENT -void -env_fog_controller_readentity(float isnew) -{ - env_fog_controller fog = (env_fog_controller)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_env_fog_controller(); - - fog.ReceiveEntity(flags, isnew); -} -#endif +} \ No newline at end of file diff --git a/src/gs-entbase/shared/env_glow.qc b/src/gs-entbase/shared/env_glow.qc new file mode 100644 index 00000000..8ffa8c01 --- /dev/null +++ b/src/gs-entbase/shared/env_glow.qc @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2016-2022 Vera Visions LLC. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +var int autocvar_r_skipGlows = 0; +var int autocvar_r_skipLensFlares = 0; + +/*!QUAKED env_glow (1 .5 0) (-8 -8 -8) (8 8 8) EVGLOW_ORIENT +# OVERVIEW +Glare/glow orb effect like the flares in 1997's Unreal. + +# KEYS +- "targetname" : Name +- "shader" : Material to use for the glare/glow effect. +- "model" : Sprite model to use for the glare/glow (idTech 2 BSPs only) +- "scale" : Scale multiplier. +- "rendercolor" : Material color override in RGB8. +- "renderamt" : Material alpha override in A8. +- "rendermode" : Render Mode +- "renderfx" : Render FX + +# SPAWNFLAGS +- EVGLOW_ORIENT (1) : Glow is an oriented sprite when set. + +# TRIVIA +This entity was introduced in Half-Life (1998). +*/ +class env_glow:NSRenderableEntity +{ +public: + void env_glow(void); + +#ifdef SERVER + virtual void Respawn(void); + virtual void SpawnKey(string,string); + virtual void EvaluateEntity(void); + virtual float SendEntity(entity,float); +#else + float m_flMaxAlpha; + vector m_vecSize; + vector m_vecRotate; + virtual float predraw(void); + virtual void postdraw(void); + virtual void RendererRestarted(void); + nonvirtual bool IsVisible(vector); + nonvirtual void RenderGlow(vector, vector); + nonvirtual void RenderNormal(vector, vector); + virtual void ReceiveEntity(float,float); +#endif + +private: + NETWORKED_STRING(m_strMaterial) +}; + +void +env_glow::env_glow(void) +{ + m_strMaterial = __NULL__; +#ifdef CLIENT + m_flMaxAlpha = 1.0f; +#endif +} + +#ifdef SERVER +void +env_glow::SpawnKey(string strField, string strKey) +{ + switch (strField) { + case "material": + case "shader": + model = __NULL__; + m_strMaterial = strKey; + break; + default: + super::SpawnKey(strField, strKey); + } +} + +void +env_glow::Respawn(void) +{ + if (!model && !m_strMaterial) { + NSEntWarning("no model specified"); + Destroy(); + return; + } + + SetModel(GetSpawnModel()); + SetSize([0,0,0], [0,0,0]); + SetOrigin(GetSpawnOrigin()); + AddEffects(EF_NOSHADOW); + + if (GetRenderColor() == g_vec_null) + SetRenderColor([1.0, 1.0, 1.0]); + + if (GetRenderMode() == RM_NORMAL) + SetRenderAmt(1.0); +/* + if (HasSpawnFlags(1)) { + hitcontentsmaski = CONTENTBIT_SOLID; + decal_pickwall(this, origin); + angles = vectoangles(g_tracedDecal.normal * -1); + } +*/ +} +void +env_glow::EvaluateEntity(void) +{ + EVALUATE_VECTOR(origin, 0, SPRITE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 1, SPRITE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 2, SPRITE_CHANGED_ORIGIN) + EVALUATE_FIELD(modelindex, SPRITE_CHANGED_MODELINDEX) + EVALUATE_FIELD(scale, SPRITE_CHANGED_SCALE) + EVALUATE_FIELD(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + EVALUATE_FIELD(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + EVALUATE_VECTOR(m_vecRenderColor, 0, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 1, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 2, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_FIELD(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + EVALUATE_FIELD(m_strMaterial, SPRITE_CHANGED_MATERIAL) +} + +float +env_glow::SendEntity(entity ePEnt, float flChanged) +{ + if (clienttype(ePEnt) != CLIENTTYPE_REAL) + return (0); + + /* strings are expensive. */ + if (!m_strMaterial) + flChanged &= ~SPRITE_CHANGED_MATERIAL; + + WriteByte(MSG_ENTITY, ENT_GLOW); + WriteFloat(MSG_ENTITY, flChanged); + + SENDENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN) + SENDENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX) + SENDENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE) + SENDENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + SENDENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + SENDENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + SENDENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL) + + return (1); +} +#else +bool +env_glow::IsVisible(vector vecPlayer) +{ + entity oother = other; + + if (autocvar_r_skipGlows) + return (false); + + if (checkpvs(vecPlayer, this) == FALSE) + return (false); + + other = world; + traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this); + other = oother; + + /* If we can't trace against the player, or are two close, fade out */ + if (trace_fraction < 1.0f || vlen(origin - vecPlayer) < 128) + m_flMaxAlpha = m_flMaxAlpha - frametime; + else + m_flMaxAlpha = m_flMaxAlpha + frametime; + + m_flMaxAlpha = bound(0.0f, m_flMaxAlpha, 1.0f); + + if (m_flMaxAlpha <= 0.0f) + return (false); + + return (true); +} + +void env_sun_lensflare(vector, float, vector); +void +env_glow::postdraw(void) +{ + if (GetRenderMode() == RM_GLOW) + if (!autocvar_r_skipLensFlares) + env_sun_lensflare(origin, m_flMaxAlpha, m_vecRenderColor); +} + +void +env_glow::RendererRestarted(void) +{ + if (!modelindex && m_strMaterial) { + precache_pic(m_strMaterial); + m_vecSize = drawgetimagesize(m_strMaterial) / 2; + } else { + model = modelnameforindex(modelindex); + m_strMaterial = spriteframe(model, 0, 0.0f); + m_vecSize = drawgetimagesize(m_strMaterial) / 2; + //NSEntWarning("%S %d %S %v", model, modelindex, m_strMaterial, m_vecSize); + } +} + +void +env_glow::RenderGlow(vector forg, vector fsize) +{ +#ifndef FTE_QUADFIX + R_BeginPolygon(m_strMaterial, 1, 0); + R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], + [1,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], + [1,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_EndPolygon(); +#else + R_BeginPolygon(m_strMaterial, 1, 0); + R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], + [1,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_EndPolygon(); + R_BeginPolygon(m_strMaterial, 1, 0); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], + [1,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha); + R_EndPolygon(); +#endif +} + +void +env_glow::RenderNormal(vector forg, vector fsize) +{ +#ifndef FTE_QUADFIX + R_BeginPolygon(m_strMaterial, 0, 0); + R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], + [1,1], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], + [1,0], m_vecRenderColor, m_flRenderAmt); + R_EndPolygon(); +#else + R_BeginPolygon(m_strMaterial, 0, 0); + R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1], + [1,1], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor, m_flRenderAmt); + R_EndPolygon(); + R_BeginPolygon(m_strMaterial, 0, 0); + R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1], + [0,1], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1], + [0,0], m_vecRenderColor, m_flRenderAmt); + R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1], + [1,0], m_vecRenderColor, m_flRenderAmt); + R_EndPolygon(); +#endif +} + +float +env_glow::predraw(void) +{ + vector forg; + vector fsize; + vector vecPlayer = g_view.GetCameraOrigin(); + vector vecAngle = g_view.GetCameraAngle(); + float flDist = vlen(vecPlayer - origin); + + if (GetRenderMode() == RM_GLOW) { + if (IsVisible(vecPlayer) == false) + return (PREDRAW_NEXT); + + /* Scale the glow somewhat with the players distance */ + fsize = m_vecSize * scale; + fsize *= bound(1, flDist / 256, 4); + } + + /* Nudge this slightly towards the camera */ + makevectors(vectoangles(origin - vecPlayer)); + forg = origin + (v_forward * -16); + + if (HasSpawnFlags(1)) { + vector above; + makevectors(angles); + above = origin + (v_forward * 16); + + /* we're aiming right down */ + if (above[2] > origin[2]) + makevectors(angles + [0, m_vecRotate[2],0]); + else + makevectors(angles + [0,0, m_vecRotate[2]]); + } else { + makevectors(vecAngle + [0, m_vecRotate[1], m_vecRotate[2]]); + } + + if (GetRenderMode() == RM_GLOW) + RenderGlow(forg, fsize); + else if (GetRenderMode() == RM_ADDITIVE) + RenderGlow(forg, m_vecSize * scale); + else + RenderNormal(forg, m_vecSize * scale); + + return (PREDRAW_NEXT); +} + +void +env_glow::ReceiveEntity(float flNew, float flChanged) +{ + READENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN) + READENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN) + READENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN) + READENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX) + READENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE) + READENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + READENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + READENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + READENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL) + + if (flNew) + RendererRestarted(); + + drawmask = MASK_GLOWS; + setsize(this, g_vec_null, g_vec_null); + setorigin(this, origin); +} +#endif \ No newline at end of file diff --git a/src/gs-entbase/shared/env_laser.qc b/src/gs-entbase/shared/env_laser.qc index e7d011bd..a3af8f7d 100644 --- a/src/gs-entbase/shared/env_laser.qc +++ b/src/gs-entbase/shared/env_laser.qc @@ -401,18 +401,4 @@ env_laser::predraw(void) return (PREDRAW_NEXT); } -#endif - -#ifdef CLIENT -void -env_laser_ReadEntity(float isnew) -{ - env_laser laser = (env_laser)self; - float changedflags = readfloat(); - - if (isnew) - spawnfunc_env_laser(); - - laser.ReceiveEntity(isnew, changedflags); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/env_sprite.qc b/src/gs-entbase/shared/env_sprite.qc index 63722b68..c650c520 100644 --- a/src/gs-entbase/shared/env_sprite.qc +++ b/src/gs-entbase/shared/env_sprite.qc @@ -66,8 +66,8 @@ private: int m_iToggled; float m_flEffects; - PREDICTED_STRING(m_strMaterial) - PREDICTED_FLOAT(m_flFramerate) + NETWORKED_STRING(m_strMaterial) + NETWORKED_FLOAT(m_flFramerate) #ifdef CLIENT int m_iMaxFrame; @@ -96,48 +96,36 @@ public: #endif }; +void +env_sprite::env_sprite(void) +{ + NETWORKED_DEFAULT(m_strMaterial, __NULL__) + NETWORKED_DEFAULT(m_flFramerate, 10.0f) + NETWORKED_DEFAULT(scale, 1.0f) + m_iIsShader = false; +} + #ifdef SERVER void env_sprite::EvaluateEntity(void) { - if (ATTR_CHANGED(origin)) { - SetSendFlags(SPRITE_CHANGED_ORIGIN); - } - if (ATTR_CHANGED(modelindex)) { - SetSendFlags(SPRITE_CHANGED_MODELINDEX); - } - if (ATTR_CHANGED(m_flFramerate)) { - SetSendFlags(SPRITE_CHANGED_FRAMERATE); - } - if (ATTR_CHANGED(scale)) { - SetSendFlags(SPRITE_CHANGED_SCALE); - } - if (ATTR_CHANGED(m_iRenderMode)) { - SetSendFlags(SPRITE_CHANGED_RENDERMODE); - } - if (ATTR_CHANGED(m_vecRenderColor)) { - SetSendFlags(SPRITE_CHANGED_RENDERCOLOR); - } - if (ATTR_CHANGED(m_flRenderAmt)) { - SetSendFlags(SPRITE_CHANGED_RENDERAMT); - } - if (ATTR_CHANGED(m_strMaterial)) { - SetSendFlags(SPRITE_CHANGED_MATERIAL); - } - - SAVE_STATE(origin) - SAVE_STATE(modelindex) - SAVE_STATE(m_flFramerate) - SAVE_STATE(scale) - SAVE_STATE(m_iRenderMode) - SAVE_STATE(m_iRenderFX) - SAVE_STATE(m_vecRenderColor) - SAVE_STATE(m_flRenderAmt) - SAVE_STATE(m_strMaterial) + EVALUATE_VECTOR(origin, 0, SPRITE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 1, SPRITE_CHANGED_ORIGIN) + EVALUATE_VECTOR(origin, 2, SPRITE_CHANGED_ORIGIN) + EVALUATE_FIELD(modelindex, SPRITE_CHANGED_MODELINDEX) + EVALUATE_FIELD(m_flFramerate, SPRITE_CHANGED_FRAMERATE) + EVALUATE_FIELD(scale, SPRITE_CHANGED_SCALE) + EVALUATE_FIELD(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + EVALUATE_FIELD(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + EVALUATE_VECTOR(m_vecRenderColor, 0, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 1, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_VECTOR(m_vecRenderColor, 2, SPRITE_CHANGED_RENDERCOLOR) + EVALUATE_FIELD(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + EVALUATE_FIELD(m_strMaterial, SPRITE_CHANGED_MATERIAL) } float -env_sprite::SendEntity(entity ePEnt, float flFlags) +env_sprite::SendEntity(entity ePEnt, float flChanged) { if (clienttype(ePEnt) != CLIENTTYPE_REAL) return (0); @@ -149,41 +137,26 @@ env_sprite::SendEntity(entity ePEnt, float flFlags) if (m_iToggled == FALSE) return (0); + /* strings are expensive. */ + if (!m_strMaterial) + flChanged &= ~SPRITE_CHANGED_MATERIAL; + WriteByte(MSG_ENTITY, ENT_SPRITE); - WriteFloat(MSG_ENTITY, flFlags); + WriteFloat(MSG_ENTITY, flChanged); - if (flFlags & SPRITE_CHANGED_ORIGIN) { - WriteCoord(MSG_ENTITY, origin[0]); - WriteCoord(MSG_ENTITY, origin[1]); - WriteCoord(MSG_ENTITY, origin[2]); - } - - if (flFlags & SPRITE_CHANGED_MODELINDEX) { - WriteFloat(MSG_ENTITY, modelindex); - } - if (flFlags & SPRITE_CHANGED_FRAMERATE) { - WriteFloat(MSG_ENTITY, m_flFramerate); - } - if (flFlags & SPRITE_CHANGED_SCALE) { - WriteFloat(MSG_ENTITY, scale); - } - if (flFlags & SPRITE_CHANGED_RENDERMODE) { - WriteByte(MSG_ENTITY, m_iRenderMode); - } - if (flFlags & SPRITE_CHANGED_RENDERFX) { - WriteByte(MSG_ENTITY, m_iRenderFX); - } - if (flFlags & SPRITE_CHANGED_RENDERCOLOR) { - WriteFloat(MSG_ENTITY, m_vecRenderColor[0]); - WriteFloat(MSG_ENTITY, m_vecRenderColor[1]); - WriteFloat(MSG_ENTITY, m_vecRenderColor[2]); - } - if (flFlags & SPRITE_CHANGED_RENDERAMT) { - WriteFloat(MSG_ENTITY, m_flRenderAmt); - } - if (flFlags & SPRITE_CHANGED_MATERIAL) { - WriteString(MSG_ENTITY, m_strMaterial); - } + SENDENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN) + SENDENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN) + SENDENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX) + SENDENTITY_FLOAT(m_flFramerate, SPRITE_CHANGED_FRAMERATE) + SENDENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE) + SENDENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + SENDENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + SENDENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + SENDENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL) return (1); } @@ -305,39 +278,21 @@ env_sprite::think(void) } void -env_sprite::ReceiveEntity(float flNew, float flFlags) +env_sprite::ReceiveEntity(float flNew, float flChanged) { - if (flFlags & SPRITE_CHANGED_ORIGIN) { - origin[0] = readcoord(); - origin[1] = readcoord(); - origin[2] = readcoord(); - } - if (flFlags & SPRITE_CHANGED_MODELINDEX) { - modelindex = readfloat(); - } - if (flFlags & SPRITE_CHANGED_FRAMERATE) { - m_flFramerate = readfloat(); - } - if (flFlags & SPRITE_CHANGED_SCALE) { - scale = readfloat(); - } - if (flFlags & SPRITE_CHANGED_RENDERMODE) { - m_iRenderMode = readbyte(); - } - if (flFlags & SPRITE_CHANGED_RENDERFX) { - m_iRenderFX = readbyte(); - } - if (flFlags & SPRITE_CHANGED_RENDERCOLOR) { - m_vecRenderColor[0] = readfloat(); - m_vecRenderColor[1] = readfloat(); - m_vecRenderColor[2] = readfloat(); - } - if (flFlags & SPRITE_CHANGED_RENDERAMT) { - m_flRenderAmt = readfloat(); - } - if (flFlags & SPRITE_CHANGED_MATERIAL) { - m_strMaterial = readstring(); - } + READENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN) + READENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN) + READENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN) + READENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX) + READENTITY_FLOAT(m_flFramerate, SPRITE_CHANGED_FRAMERATE) + READENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE) + READENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE) + READENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX) + READENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT) + READENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL) drawmask = MASK_ENGINE; nextthink = time + (1 / m_flFramerate); @@ -366,15 +321,6 @@ env_sprite::SetFramerate(bool flag) } -void -env_sprite::env_sprite(void) -{ - m_iIsShader = false; - m_flFramerate = 10; - m_strMaterial = __NULL__; - scale = 1.0f; -} - #ifdef CLIENT void EnvSprite_ParseEvent(void) diff --git a/src/gs-entbase/shared/env_steam.qc b/src/gs-entbase/shared/env_steam.qc index 5661ab1d..5c7f575e 100644 --- a/src/gs-entbase/shared/env_steam.qc +++ b/src/gs-entbase/shared/env_steam.qc @@ -481,18 +481,4 @@ env_steam::predraw(void) addentity(self); return (PREDRAW_NEXT); } -#endif - -#ifdef CLIENT -void -env_steam_ReadEntity(float isnew) -{ - env_steam laser = (env_steam)self; - float changedflags = readfloat(); - - if (isnew) - spawnfunc_env_steam(); - - laser.ReceiveEntity(isnew, changedflags); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/func_conveyor.qc b/src/gs-entbase/shared/func_conveyor.qc index cae53702..f3c5c75b 100644 --- a/src/gs-entbase/shared/func_conveyor.qc +++ b/src/gs-entbase/shared/func_conveyor.qc @@ -364,20 +364,6 @@ func_conveyor::ReceiveEntity(float flNew, float flChanged) setorigin(this, origin); } - -void -func_conveyor_ReadEntity(bool new) -{ - float fl; - - func_conveyor rend = (func_conveyor)self; - if (new) { - spawnfunc_func_conveyor(); - } - - fl = readfloat(); - rend.ReceiveEntity(new, fl); -} #endif void diff --git a/src/gs-entbase/shared/func_tankmortar.qc b/src/gs-entbase/shared/func_tankmortar.qc index f58ea630..817b7541 100644 --- a/src/gs-entbase/shared/func_tankmortar.qc +++ b/src/gs-entbase/shared/func_tankmortar.qc @@ -458,18 +458,4 @@ func_tankmortar::func_tankmortar(void) { m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; -} - -#ifdef CLIENT -void -func_tankmortar_readentity(float isnew) -{ - func_tankmortar veh = (func_tankmortar)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_func_tankmortar(); - - veh.ReceiveEntity(flags, isnew); -} -#endif +} \ No newline at end of file diff --git a/src/gs-entbase/shared/func_vehicle.qc b/src/gs-entbase/shared/func_vehicle.qc index d37fddb5..868ae1c4 100644 --- a/src/gs-entbase/shared/func_vehicle.qc +++ b/src/gs-entbase/shared/func_vehicle.qc @@ -1018,18 +1018,4 @@ func_vehicle::SendEntity(entity ePEnt, float flChanged) return true; } -#endif - -#ifdef CLIENT -void -func_vehicle_readentity(float isnew) -{ - func_vehicle veh = (func_vehicle)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_func_vehicle(); - - veh.ReceiveEntity(flags, isnew); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/info_waypoint.qc b/src/gs-entbase/shared/info_waypoint.qc index 916e7623..68cb967c 100644 --- a/src/gs-entbase/shared/info_waypoint.qc +++ b/src/gs-entbase/shared/info_waypoint.qc @@ -245,18 +245,4 @@ info_waypoint::postdraw(void) Font_DrawText_RGBA(projectedPos, m_strText, [1,1,1], a, FONT_CON); } } - -void -info_waypoint_ReadEntity(bool new) -{ - float fl; - - info_waypoint rend = (info_waypoint)self; - if (new) { - spawnfunc_info_waypoint(); - } - - fl = readfloat(); - rend.ReceiveEntity(new, fl); -} #endif \ No newline at end of file diff --git a/src/gs-entbase/shared/light_dynamic.qc b/src/gs-entbase/shared/light_dynamic.qc index f77c3f7d..80831934 100644 --- a/src/gs-entbase/shared/light_dynamic.qc +++ b/src/gs-entbase/shared/light_dynamic.qc @@ -416,19 +416,4 @@ light_dynamic::light_dynamic(void) } /* 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.ReceiveEntity(new, readfloat()); - dl.drawmask = MASK_GLOWS; -} -#endif +class dynamic_light:light_dynamic { }; \ No newline at end of file diff --git a/src/gs-entbase/shared/point_spotlight.qc b/src/gs-entbase/shared/point_spotlight.qc index 7755acfa..746b4fb2 100644 --- a/src/gs-entbase/shared/point_spotlight.qc +++ b/src/gs-entbase/shared/point_spotlight.qc @@ -353,16 +353,4 @@ point_spotlight::point_spotlight(void) m_flBeamWidth = 50.0f; m_vecColor = [1.0,1.0,1.0]; #endif -} - -#ifdef CLIENT -void -point_spotlight_ReadEntity(float isNew) -{ - point_spotlight ept = (point_spotlight)self; - if (isNew) { - spawnfunc_point_spotlight(); - } - ept.ReceiveEntity(isNew, readfloat()); -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/gs-entbase/shared/prop_rope.qc b/src/gs-entbase/shared/prop_rope.qc index 8dc93579..006e5609 100644 --- a/src/gs-entbase/shared/prop_rope.qc +++ b/src/gs-entbase/shared/prop_rope.qc @@ -307,19 +307,4 @@ prop_rope::prop_rope(void) /* this is empty for a good reason */ drawmask = MASK_ENGINE; #endif -} - - -#ifdef CLIENT -void -prop_rope_readentity(float isnew) -{ - prop_rope rope = (prop_rope)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_prop_rope(); - - rope.ReceiveEntity(flags, isnew); -} -#endif +} \ No newline at end of file diff --git a/src/gs-entbase/shared/prop_vehicle_driveable.qc b/src/gs-entbase/shared/prop_vehicle_driveable.qc index 73ab9e50..bf9e95f3 100644 --- a/src/gs-entbase/shared/prop_vehicle_driveable.qc +++ b/src/gs-entbase/shared/prop_vehicle_driveable.qc @@ -903,18 +903,4 @@ prop_vehicle_driveable::Spawned(void) #ifdef SERVER Sound_Precache("prop_vehicle_driveable.bounce"); #endif -} - -#ifdef CLIENT -void -prop_vehicle_driveable_readentity(float isnew) -{ - prop_vehicle_driveable veh = (prop_vehicle_driveable)self; - float flags = readfloat(); - - if (isnew) - spawnfunc_prop_vehicle_driveable(); - - veh.ReceiveEntity(flags, isnew); -} -#endif +} \ No newline at end of file diff --git a/src/gs-entbase/shared/trigger_camera.qc b/src/gs-entbase/shared/trigger_camera.qc index ee70c790..db928c3a 100644 --- a/src/gs-entbase/shared/trigger_camera.qc +++ b/src/gs-entbase/shared/trigger_camera.qc @@ -87,8 +87,6 @@ trigger_camera::ReceiveEntity(float flNew, float flFlags) { float flWait = 0.0f; - print(sprintf("camera update %d %d %x\n", entnum, flNew, flFlags)); - if (flFlags & OCAMFL_CHANGED_ORIGIN) { origin[0] = readcoord(); origin[1] = readcoord(); @@ -234,7 +232,7 @@ trigger_camera::GoToTarget(void) NSLog("trigger_camera (%s): Moving to path_corner %S within %f secs", targetname, target, flTravelTime); if (!flTravelTime) { - print("^1trigger_camera::^3GoToTarget^7: Distance short, going next\n"); + NSEntWarning("distance too short, going to next"); NextPath(); return; } @@ -264,7 +262,7 @@ trigger_camera::NextPath(void) /* warp next frame */ if (eNode.HasSpawnFlags(PC_TELEPORT)) { - print(sprintf("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname)); + NSLog("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname); ScheduleThink(NextPath, 0.0f); return; } @@ -290,7 +288,7 @@ trigger_camera::Trigger(entity act, triggermode_t state) act = find(world, ::classname, "player"); } - print(sprintf("trigger_camera for %S is now %S\n", act.netname, targetname)); + NSLog("trigger_camera for %S is now %S\n", act.netname, targetname); /* kill the other cams the player may be attached to */ for (trigger_camera cam = __NULL__; (cam = (trigger_camera)find(cam, ::classname, "trigger_camera"));) { diff --git a/src/shared/NSEntity.h b/src/shared/NSEntity.h index 665b9042..5999010a 100644 --- a/src/shared/NSEntity.h +++ b/src/shared/NSEntity.h @@ -368,8 +368,4 @@ public: nonvirtual float GetSpawnTime(void); /** Move the entity to a new position, with updated angles. */ nonvirtual void Transport(vector, vector); -}; - -#ifdef CLIENT -void NSEntity_ReadEntity(float); -#endif \ No newline at end of file +}; \ No newline at end of file diff --git a/src/shared/NSEntity.qc b/src/shared/NSEntity.qc index 2abf2e80..e792d028 100644 --- a/src/shared/NSEntity.qc +++ b/src/shared/NSEntity.qc @@ -908,7 +908,7 @@ bool NSEntity::StartSound( string strSample, float channel, float flags, bool br } bool NSEntity::StartSoundDef( string strSample, float channel, bool broadcast ) { - NSLog( "StartSoundDef: %s %d %d", strSample, channel, broadcast ); + NSLog( "^2%s::^3StartSoundDef^7: %s (chan: %d bcast: %d)", classname, strSample, channel, broadcast ); Sound_Play( this, channel, strSample ); return ( true ); } @@ -979,20 +979,4 @@ NSEntity::Transport(vector new_pos, vector new_ang) if (flags & FL_CLIENT) Client_FixAngle(this, new_ang); #endif -} - -#ifdef CLIENT -void -NSEntity_ReadEntity(bool new) -{ - float fl; - - NSEntity read = (NSEntity)self; - if (new) { - spawnfunc_NSEntity(); - } - - fl = readfloat(); - read.ReceiveEntity(new, fl); -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/shared/NSMonster.h b/src/shared/NSMonster.h index 9f401fb5..1742149b 100644 --- a/src/shared/NSMonster.h +++ b/src/shared/NSMonster.h @@ -576,7 +576,6 @@ private: #ifdef CLIENT string Sentences_GetSamples(string); string Sentences_ProcessSample(string); -void NSMonster_ReadEntity(bool); #endif #ifdef SERVER diff --git a/src/shared/NSMonster.qc b/src/shared/NSMonster.qc index 95b17fe2..0250ac16 100644 --- a/src/shared/NSMonster.qc +++ b/src/shared/NSMonster.qc @@ -2099,19 +2099,7 @@ NSMonster::_RenderDebugViewCone(void) } #endif -#ifdef CLIENT -void -NSMonster_ReadEntity(bool new) -{ - NSMonster me = (NSMonster)self; - if (new) { - spawnfunc_NSMonster(); - } - me.ReceiveEntity(new, readfloat()); -} -#else - - +#ifdef SERVER var int autocvar_ai_alertdebug = 0; var float g_monsteralert_timer; diff --git a/src/shared/NSPhysicsEntity.h b/src/shared/NSPhysicsEntity.h index fec7cdd0..79217678 100644 --- a/src/shared/NSPhysicsEntity.h +++ b/src/shared/NSPhysicsEntity.h @@ -120,8 +120,4 @@ public: nonvirtual void ApplyTorqueCenter(vector); /** Called by the physics routine to figure out the impact damage. */ nonvirtual float CalculateImpactDamage(int,int); -}; - -#ifdef CLIENT -void NSPhysicsEntity_ReadEntity(bool); -#endif \ No newline at end of file +}; \ No newline at end of file diff --git a/src/shared/NSPhysicsEntity.qc b/src/shared/NSPhysicsEntity.qc index 55ece365..6e3d42ed 100644 --- a/src/shared/NSPhysicsEntity.qc +++ b/src/shared/NSPhysicsEntity.qc @@ -633,20 +633,4 @@ NSPhysicsEntity::SpawnKey(string strKey, string strValue) super::SpawnKey(strKey, strValue); break; } -} - -#ifdef CLIENT -void -NSPhysicsEntity_ReadEntity(bool new) -{ - float fl; - NSPhysicsEntity rend = (NSPhysicsEntity)self; - if (new) { - spawnfunc_NSPhysicsEntity(); - } - fl = readfloat(); - rend.ReceiveEntity(new, fl); - - //print(sprintf("physics ent update: %d %x %d %v\n", self.entnum, fl, self.origin, vlen(self.velocity))); -} -#endif +} \ No newline at end of file diff --git a/src/shared/NSPortal.h b/src/shared/NSPortal.h index 00e9739d..d1c52a05 100644 --- a/src/shared/NSPortal.h +++ b/src/shared/NSPortal.h @@ -90,8 +90,6 @@ private: }; #ifdef CLIENT -void NSPortal_ReadEntity(bool); - #define READENTITY_PORTAL(field, changedflag) {\ if (flChanged & changedflag) {\ field = (NSPortal)findfloat(world, ::entnum, readentitynum());\ diff --git a/src/shared/NSPortal.qc b/src/shared/NSPortal.qc index b6bf0b05..87b1aa8e 100644 --- a/src/shared/NSPortal.qc +++ b/src/shared/NSPortal.qc @@ -445,16 +445,4 @@ NSPortal::ReceiveEntity(float flNew, float flChanged) drawmask = MASK_ENGINE; predraw = 0; } -#endif - -#ifdef CLIENT -void -NSPortal_ReadEntity(bool new) -{ - NSPortal me = (NSPortal)self; - if (new) { - spawnfunc_NSPortal(); - } - me.ReceiveEntity(new, readfloat()); -} #endif \ No newline at end of file diff --git a/src/shared/NSProjectile.h b/src/shared/NSProjectile.h index 6debfac4..e0264980 100644 --- a/src/shared/NSProjectile.h +++ b/src/shared/NSProjectile.h @@ -153,11 +153,6 @@ public: #endif }; - -#ifdef CLIENT -void NSProjectile_ReadEntity(bool); -#endif - #ifdef SERVER NSProjectile NSProjectile_SpawnDef(string entityDef, NSEntity theOwner); NSProjectile NSProjectile_SpawnDefAtPosition(string entityDef, NSEntity theOwner, vector vecOrigin, vector vecAngles); diff --git a/src/shared/NSProjectile.qc b/src/shared/NSProjectile.qc index c7ea2717..07a3cc3b 100644 --- a/src/shared/NSProjectile.qc +++ b/src/shared/NSProjectile.qc @@ -840,23 +840,6 @@ NSProjectile::ReceiveEntity(float flNew, float flChanged) } #endif -#ifdef CLIENT -void -NSProjectile_ReadEntity(bool new) -{ - float fl; - - NSProjectile rend = (NSProjectile)self; - if (new) { - spawnfunc_NSProjectile(); - } - - fl = readfloat(); - - rend.ReceiveEntity(new, fl); -} -#endif - #ifdef SERVER NSProjectile NSProjectile_SpawnDef(string entityDef, NSEntity theOwner) diff --git a/src/shared/NSRenderableEntity.h b/src/shared/NSRenderableEntity.h index 1c94d8da..c56ba3db 100644 --- a/src/shared/NSRenderableEntity.h +++ b/src/shared/NSRenderableEntity.h @@ -208,8 +208,4 @@ public: nonvirtual void RenderAxialScale(void); nonvirtual void RenderGLQuakeShadow(void); #endif -}; - -#ifdef CLIENT -void NSRenderableEntity_ReadEntity(bool) -#endif +}; \ No newline at end of file diff --git a/src/shared/NSRenderableEntity.qc b/src/shared/NSRenderableEntity.qc index 7756a9fb..8103f367 100644 --- a/src/shared/NSRenderableEntity.qc +++ b/src/shared/NSRenderableEntity.qc @@ -217,9 +217,9 @@ NSRenderableEntity::SendEntity(entity ePEnt, float flChanged) SENDENTITY_COORD(avelocity[2], RDENT_CHANGED_ANGULARVELOCITY) SENDENTITY_BYTE(m_iRenderMode, RDENT_CHANGED_RENDERMODE) SENDENTITY_BYTE(m_iRenderFX, RDENT_CHANGED_RENDERMODE) - SENDENTITY_ANGLE(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR) - SENDENTITY_ANGLE(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR) - SENDENTITY_ANGLE(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR) + SENDENTITY_COLOR(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR) /* these need more precision for shader hacks... */ SENDENTITY_FLOAT(glowmod[0], RDENT_CHANGED_RENDERCOLOR) SENDENTITY_FLOAT(glowmod[1], RDENT_CHANGED_RENDERCOLOR) @@ -277,9 +277,9 @@ NSRenderableEntity::ReceiveEntity(float flNew, float flChanged) READENTITY_COORD(avelocity[2], RDENT_CHANGED_ANGULARVELOCITY) READENTITY_BYTE(m_iRenderMode, RDENT_CHANGED_RENDERMODE) READENTITY_BYTE(m_iRenderFX, RDENT_CHANGED_RENDERMODE) - READENTITY_ANGLE(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR) - READENTITY_ANGLE(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR) - READENTITY_ANGLE(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR) + READENTITY_COLOR(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR) /* these need more precision for shader hacks... */ READENTITY_FLOAT(glowmod[0], RDENT_CHANGED_RENDERCOLOR) READENTITY_FLOAT(glowmod[1], RDENT_CHANGED_RENDERCOLOR) @@ -638,6 +638,12 @@ NSRenderableEntity::Respawn(void) SetRenderMode(m_oldiRenderMode); SetRenderAmt(m_oldflRenderAmt); SetRenderColor(m_oldvecRenderColor); + + if (GetRenderColor() == g_vec_null) + SetRenderColor([1.0, 1.0, 1.0]); + + if (GetRenderMode() == RM_NORMAL) + SetRenderAmt(1.0); } #endif @@ -1042,20 +1048,4 @@ NSRenderableEntity::SpawnKey(string strKey, string strValue) super::SpawnKey(strKey, strValue); break; } -} - -#ifdef CLIENT -void -NSRenderableEntity_ReadEntity(bool new) -{ - float fl; - - NSRenderableEntity rend = (NSRenderableEntity)self; - if (new) { - spawnfunc_NSRenderableEntity(); - } - - fl = readfloat(); - rend.ReceiveEntity(new, fl); -} -#endif +} \ No newline at end of file diff --git a/src/shared/NSTrigger.qc b/src/shared/NSTrigger.qc index 09d4cee5..ffb8eb1a 100644 --- a/src/shared/NSTrigger.qc +++ b/src/shared/NSTrigger.qc @@ -50,8 +50,9 @@ NSTrigger::UseTargets(entity act, int state, float fDelay) remove(self); } - if (!target || target == "") - return; + if not (m_strKillTarget) + if not (target) + return; if (fDelay > 0.0f) { NSLog("^2%s::^3UseTargets^7: Triggering `%s`", @@ -82,9 +83,11 @@ NSTrigger::UseTargets(entity act, int state, float fDelay) } if (m_strKillTarget && m_strKillTarget != "") { - entity eKill = find(world, ::targetname, m_strKillTarget); + NSEntity eKill = (NSEntity)find(world, ::targetname, m_strKillTarget); + NSLog("^2%s::^3UseTargets^7: Killing `%s`", + classname, m_strKillTarget); if (eKill) { - remove(eKill); + eKill.Destroy(); } } } diff --git a/src/shared/defs.h b/src/shared/defs.h index bdc3025b..41fd6145 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -15,6 +15,18 @@ */ /* networking helpers */ +#define NETWORKED_INT(x) int x; int x ##_net; +#define NETWORKED_FLOAT(x) float x; float x ##_net; +#define NETWORKED_VECTOR(x) vector x; vector x ##_net; +#define NETWORKED_ENT(x) entity x; entity x ##_net; +#define NETWORKED_STRING(x) string x; string x ##_net; +#define NETWORKED_BOOL(x) bool x; bool x ##_net; + +#define NETWORKED_INT_N(x) int x ##_net; +#define NETWORKED_FLOAT_N(x) float x ##_net; +#define NETWORKED_VECTOR_N(x) vector x ##_net; +#define NETWORKED_STRING_N(x) string x ##_net; + #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; @@ -27,6 +39,22 @@ #define PREDICTED_VECTOR_N(x) vector x ##_net; #define PREDICTED_STRING_N(x) string x ##_net; +#ifdef CLIENT +#define NSENTITY_READENTITY(x, y) \ + { \ + local x x ##_e = ( x )self;\ + if (y == true) { \ + self.classname = strcat("spawnfunc_", #x); \ + callfunction(self.classname); \ + } \ + x ##_e.ReceiveEntity( y, readfloat() );\ + } +#else + +#endif + +#define NETWORKED_DEFAULT(x, y) x ##_net = x = y; + #define ROLL_BACK(x) x = x ##_net; #define SAVE_STATE(x) x ##_net = x; #define SAVE_STATE_FIELD(x, y) x ##_net[y] = x[y]; @@ -175,6 +203,10 @@ crossprint(string m) __wrap string precache_model(string m) { + if not (m) { + breakpoint(); + } + #ifdef CLIENT NSLog("^3Client precaching model ^7%s", m); #else diff --git a/src/shared/entities.h b/src/shared/entities.h index 20c55cc8..8f2453cd 100644 --- a/src/shared/entities.h +++ b/src/shared/entities.h @@ -40,6 +40,7 @@ typedef enum ENT_LASER, /**< of type env_laser */ ENT_PARTSYSTEM, /**< of type info_particle_system */ ENT_SPRITE, /**< of type env_sprite */ + ENT_GLOW, /**< of type env_glow */ ENT_SPRAY, /**< of type spray */ ENT_DECAL, /**< of type infodecal */ ENT_OLDCAMERA, /**< of type trigger_camera */ diff --git a/src/shared/global.h b/src/shared/global.h index a9a9850a..e7d6d2a6 100644 --- a/src/shared/global.h +++ b/src/shared/global.h @@ -37,6 +37,12 @@ _NSAssert(bool condition, string function, string descr) } } +void +_NSEntWarning(string className, vector classOrg, string warnMessage) +{ + print(sprintf("^1Class %s at %v: %s\n", className, classOrg, warnMessage)); +} + /** Logs an error type message, with timestamp. The console variable `g_developer` has to be `1` for them to be visible. @@ -50,6 +56,9 @@ _NSAssert(bool condition, string function, string descr) #define NSAssert(condition, ...) _NSAssert(condition, __FUNC__, sprintf(__VA_ARGS__)) + +#define NSEntWarning(...) _NSEntWarning(classname, origin, sprintf(__VA_ARGS__)) + typedef enumflags { SEARCH_INSENSITIVE, /**< Attempt to do a case-insensitive search (slower) */