diff --git a/src/gs-entbase/client.src b/src/gs-entbase/client.src index 9d1f5cf2..e1945e79 100644 --- a/src/gs-entbase/client.src +++ b/src/gs-entbase/client.src @@ -20,7 +20,6 @@ client/env_laser.cpp client/func_lod.cpp client/func_dustmotes.cpp client/light_environment.cpp -client/light_dynamic.cpp client/sky_camera.cpp client/info_notnull.cpp client/point_message.cpp diff --git a/src/gs-entbase/client/light_dynamic.cpp b/src/gs-entbase/client/light_dynamic.cpp deleted file mode 100644 index a13c92d6..00000000 --- a/src/gs-entbase/client/light_dynamic.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Hladik - * - * 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. - */ - -/* this has to match gs-entbase/server/light_dynamic.cpp! */ -enumflags -{ - DLIGHTFL_CHANGED_ORIGIN, - DLIGHTFL_CHANGED_ANGLES, - DLIGHTFL_CHANGED_LIGHT, - DLIGHTFL_CHANGED_INTENSITY, - DLIGHTFL_CHANGED_INNERCONE, - DLIGHTFL_CHANGED_CONE, - DLIGHTFL_CHANGED_DISTANCE, - DLIGHTFL_CHANGED_RADIUS, - DLIGHTFL_CHANGED_STYLE, - DLIGHTFL_CHANGED_STATE -}; - -class light_dynamic -{ - vector m_vecLight; - float m_flIntensity; - float m_flInnerCone; - float m_flCone; - float m_flDistance; - float m_flRadius; - float m_flStyle; - int m_iState; - - void(void) light_dynamic; - - virtual void(float) ReceiveEntity; - virtual float(void) predraw; -}; - -float -light_dynamic::predraw(void) -{ - if (!m_iState) { - return PREDRAW_NEXT; - } - - /* TODO: We need to handle the second cone light */ - dynamiclight_add(origin, m_flDistance, m_vecLight, m_flStyle); - - addentity(this); - return PREDRAW_NEXT; -} - -void -light_dynamic::ReceiveEntity(float flFlags) -{ - if (flFlags & DLIGHTFL_CHANGED_ORIGIN) { - origin[0] = readcoord(); - origin[1] = readcoord(); - origin[2] = readcoord(); - setorigin(this, origin); - } - - if (flFlags & DLIGHTFL_CHANGED_ANGLES) { - angles[0] = readcoord(); - angles[1] = readcoord(); - angles[2] = readcoord(); - } - - if (flFlags & DLIGHTFL_CHANGED_LIGHT) { - m_vecLight[0] = readbyte() / 255; - m_vecLight[1] = readbyte() / 255; - m_vecLight[2] = readbyte() / 255; - } - - if (flFlags & DLIGHTFL_CHANGED_INTENSITY) - m_flIntensity = readfloat(); - if (flFlags & DLIGHTFL_CHANGED_INNERCONE) - m_flInnerCone = readfloat(); - if (flFlags & DLIGHTFL_CHANGED_CONE) - m_flCone = readfloat(); - if (flFlags & DLIGHTFL_CHANGED_DISTANCE) - m_flDistance = readfloat(); - if (flFlags & DLIGHTFL_CHANGED_RADIUS) - m_flRadius = readfloat(); - if (flFlags & DLIGHTFL_CHANGED_STYLE) - m_flStyle = readbyte(); - if (flFlags & DLIGHTFL_CHANGED_STATE) - m_iState = readbyte(); - - classname = "light_dynamic"; -} - -void -light_dynamic::light_dynamic(void) -{ - drawmask = MASK_ENGINE; -} diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index fe49631f..53ac952b 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -62,7 +62,6 @@ server/func_pendulum.cpp server/func_vehicle.cpp server/func_vehiclecontrols.cpp server/light.cpp -server/light_dynamic.cpp server/stubs.cpp server/infodecal.cpp server/player_weaponstrip.cpp diff --git a/src/gs-entbase/shared.src b/src/gs-entbase/shared.src index d9495554..a6cd9e15 100644 --- a/src/gs-entbase/shared.src +++ b/src/gs-entbase/shared.src @@ -6,6 +6,7 @@ shared/decals.cpp shared/spraylogo.cpp shared/func_friction.cpp +shared/light_dynamic.cpp shared/trigger_gravity.cpp shared/info_particle_system.cpp #endlist diff --git a/src/gs-entbase/server/light_dynamic.cpp b/src/gs-entbase/shared/light_dynamic.cpp similarity index 80% rename from src/gs-entbase/server/light_dynamic.cpp rename to src/gs-entbase/shared/light_dynamic.cpp index abf89de7..34743c01 100644 --- a/src/gs-entbase/server/light_dynamic.cpp +++ b/src/gs-entbase/shared/light_dynamic.cpp @@ -36,7 +36,6 @@ Trivia: This entity was introduced in Half-Life 2 (2004). */ -/* this has to match gs-entbase/client/light_dynamic.cpp! */ enumflags { DLIGHTFL_CHANGED_ORIGIN, @@ -51,7 +50,11 @@ enumflags DLIGHTFL_CHANGED_STATE }; +#ifdef CLIENT +class light_dynamic +#else class light_dynamic:CBaseTrigger +#endif { vector m_vecLight; float m_flIntensity; @@ -61,17 +64,79 @@ class light_dynamic:CBaseTrigger float m_flRadius; float m_flStyle; int m_iState; - int m_iStartActive; void(void) light_dynamic; + +#ifdef CLIENT + virtual void(float) ReceiveEntity; + virtual float(void) predraw; +#else + int m_iStartActive; + virtual void(entity, int) Trigger; virtual void(void) Respawn; virtual float(entity, float) SendEntity; virtual void(string, string) SpawnKey; virtual void(entity, string, string) Input; virtual void(void) ParentUpdate; +#endif }; +#ifdef CLIENT +float +light_dynamic::predraw(void) +{ + if (!m_iState) { + return PREDRAW_NEXT; + } + + /* TODO: We need to handle the second cone light */ + dynamiclight_add(origin, m_flDistance, m_vecLight, m_flStyle); + + addentity(this); + return PREDRAW_NEXT; +} + +void +light_dynamic::ReceiveEntity(float flFlags) +{ + if (flFlags & DLIGHTFL_CHANGED_ORIGIN) { + origin[0] = readcoord(); + origin[1] = readcoord(); + origin[2] = readcoord(); + setorigin(this, origin); + } + + if (flFlags & DLIGHTFL_CHANGED_ANGLES) { + angles[0] = readcoord(); + angles[1] = readcoord(); + angles[2] = readcoord(); + } + + if (flFlags & DLIGHTFL_CHANGED_LIGHT) { + m_vecLight[0] = readbyte() / 255; + m_vecLight[1] = readbyte() / 255; + m_vecLight[2] = readbyte() / 255; + } + + if (flFlags & DLIGHTFL_CHANGED_INTENSITY) + m_flIntensity = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_INNERCONE) + m_flInnerCone = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_CONE) + m_flCone = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_DISTANCE) + m_flDistance = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_RADIUS) + m_flRadius = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_STYLE) + m_flStyle = readbyte(); + if (flFlags & DLIGHTFL_CHANGED_STATE) + m_iState = readbyte(); + + classname = "light_dynamic"; +} +#else void light_dynamic::ParentUpdate(void) { @@ -223,6 +288,7 @@ light_dynamic::SpawnKey(string strKey, string strValue) case "style": m_flStyle = stof(strValue); break; + /* out-of-spec */ case "start_active": m_iStartActive = stoi(strValue); break; @@ -252,15 +318,24 @@ light_dynamic::Respawn(void) DLIGHTFL_CHANGED_STYLE | \ DLIGHTFL_CHANGED_STATE; } +#endif void light_dynamic::light_dynamic(void) { +#ifdef CLIENT + drawmask = MASK_ENGINE; +#else m_vecLight = [255,255,255]; m_flDistance = 256; m_iStartActive = 1; CBaseTrigger::CBaseTrigger(); +#endif } +/* workaround for q3map2, as it turns any entity starting with light* + into a generic static world light. */ +#ifndef CLIENT CLASSEXPORT(dynamic_light, light_dynamic) +#endif