From 1d02dccbb53009bd4f673861f41433f856f187ba Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sat, 28 Nov 2020 22:52:56 +0100 Subject: [PATCH] trigger_camera: Misc improvements, plus added test map. --- .../maps/test_triggercamera.bsp | Bin 0 -> 1588624 bytes .../maps/test_triggercamera.map | 138 +++++++++ src/client/entry.c | 21 +- src/gs-entbase/server.src | 1 - src/gs-entbase/server/func_button.cpp | 6 +- src/gs-entbase/server/path_corner.cpp | 3 +- src/gs-entbase/server/trigger_camera.cpp | 78 ----- src/gs-entbase/shared.src | 1 + src/gs-entbase/shared/trigger_camera.cpp | 273 ++++++++++++++++++ src/shared/entities.h | 1 + 10 files changed, 425 insertions(+), 97 deletions(-) create mode 100644 platform/test_maps.pk3dir/maps/test_triggercamera.bsp create mode 100644 platform/test_maps.pk3dir/maps/test_triggercamera.map delete mode 100644 src/gs-entbase/server/trigger_camera.cpp create mode 100644 src/gs-entbase/shared/trigger_camera.cpp diff --git a/platform/test_maps.pk3dir/maps/test_triggercamera.bsp b/platform/test_maps.pk3dir/maps/test_triggercamera.bsp new file mode 100644 index 0000000000000000000000000000000000000000..9aeec4848cea6b2ba8b80188adf038e38a92d5b6 GIT binary patch literal 1588624 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%0DZOd3Qxi5b0 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 z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00I#Bdx8J`-~avnssH$o|M=|$8Qt>5Zx28D2-MV$ZJtU(BTE9K~hAgHfBxs?(bcP0FCTwGuGO{phu7}>ZStS|-h(Sg|Ni$HoLV{hhv)0Ia`f-7HT?fp zj_%pB;*Ubsym8gaH9I*u{Wh75e!lHr{^ehm&+OQ-;?GS+zc~JH|MqXoqksQ<*I4|+ zYjywO@7=e2TXOJ+HM_1H{rlf*7_f5m@BhB~D+fPuadG+WF?mL7KUuk|M~@!;ZuFl& z`PYB_*X1*3&YW33*8KJVhxPCO{_o3YKL7ml-y9M_)nQh?T^icV^!2o9&76 zk(}Sxl*g37dJ{E!c`}*p3}YVkc7A#Y=Z%5B6do z_TvCLa1fomG>tBFqX)g{!y)v;|EVy5!x+R7b{)kr97hOyyxn{sCvXy{*i;SSG|u2G zd>EX=d0apS7m^EHl^FD<7&1$Po1K!xuaFhEsWMHvNmPity@*63e3~iQi+shSIQNW z+4pqy@K-WD&>!3eWvpJ+8rNNm)hktO$8}t*#tQvTS)o>8UM!1nMlS2S%mNO~cve;2 zakR3Rus&HcES2{s_T}gW%PfW*>S2r4jkwdjeS<-~%|jOlxyFV?Em*dx+x3Bo#^c*J z0;*ewf@*mGqcxxGlA)CyHX40V%kc0tJpV3V-5ghWM^42G*43ZbHb$Z0`&YR(vkk4l z-wUQ;5G=N2)Ac7#BHs+A<(gxL5zL}h)D1R@9lecVWKY667u%P{%z`>H=DPln;AcDk n1F(f{)7JV{^}gHcZ?DLE4z!@2r+fF_+q?H(f#yH?Z9MH4sm_flCameraTime > time) { - vector lastang; - float lerp; - - lerp = bound(0.0f, 1.0f - clframetime, 1.0f); - makevectors(view_angles); - lastang = v_forward; - makevectors(pSeat->m_vecCameraAngle); - - lastang[0] = Math_Lerp(lastang[0], v_forward[0], clframetime); - lastang[1] = Math_Lerp(lastang[1], v_forward[1], clframetime); - lastang[2] = Math_Lerp(lastang[2], v_forward[2], clframetime); - view_angles = vectoangles(lastang); - + view_angles = pSeat->m_vecCameraAngle; setproperty(VF_ORIGIN, pSeat->m_vecCameraOrigin); setproperty(VF_CL_VIEWANGLES, view_angles); setproperty(VF_ANGLES, view_angles); @@ -847,6 +835,13 @@ CSQC_Ent_Update(float new) case ENT_AMBIENTSOUND: Sound_ParseLoopingEntity(self, new); break; + case ENT_OLDCAMERA: + trigger_camera tc = (trigger_camera)self; + if (new) { + spawnfunc_trigger_camera(); + } + tc.ReceiveEntity(readfloat()); + break; case ENT_DLIGHT: light_dynamic dl = (light_dynamic)self; if (new) { diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index 53ac952b..3f5e32a6 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -72,7 +72,6 @@ server/target_cdaudio.cpp server/trigger_auto.cpp server/trigger_autosave.cpp server/trigger_cdaudio.cpp -server/trigger_camera.cpp server/trigger_counter.cpp server/trigger_hurt.cpp server/trigger_changelevel.cpp diff --git a/src/gs-entbase/server/func_button.cpp b/src/gs-entbase/server/func_button.cpp index d33bb0bd..5cf08350 100644 --- a/src/gs-entbase/server/func_button.cpp +++ b/src/gs-entbase/server/func_button.cpp @@ -234,10 +234,8 @@ func_button::Trigger(entity act, int state) MoveAway(); - if (m_strOnPressed) - UseOutput(act, m_strOnPressed); - else - UseTargets(act, TRIG_TOGGLE, m_flDelay); + UseOutput(act, m_strOnPressed); + UseTargets(act, TRIG_TOGGLE, m_flDelay); } void diff --git a/src/gs-entbase/server/path_corner.cpp b/src/gs-entbase/server/path_corner.cpp index e1ebd52f..3857b851 100644 --- a/src/gs-entbase/server/path_corner.cpp +++ b/src/gs-entbase/server/path_corner.cpp @@ -66,7 +66,7 @@ path_corner::Trigger(entity act, int state) { entity a; - if ((spawnflags & PC_FIREONCE) && (m_iFired)) { + if ((spawnflags & PC_FIREONCE) && m_iFired) { return; } @@ -114,5 +114,6 @@ void path_corner::path_corner(void) { m_flWait = 1.0f; + m_flSpeed = 100.0f; CBaseTrigger::CBaseTrigger(); } diff --git a/src/gs-entbase/server/trigger_camera.cpp b/src/gs-entbase/server/trigger_camera.cpp deleted file mode 100644 index f22780e3..00000000 --- a/src/gs-entbase/server/trigger_camera.cpp +++ /dev/null @@ -1,78 +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. - */ - -/*QUAKED trigger_camera (1 0 0) (-8 -8 -8) (8 8 8) -"targetname" Name -"angles" Sets the pitch, yaw and roll angles of the camera -"target" Which entity we're aiming at. Overrides angles. -"wait" How long to hold onto the target. - -Causes the activators first-person camera to switch to the view of this entity. - -Trivia: -This entity was introduced in Half-Life (1998). -*/ - -class trigger_camera:CBaseTrigger -{ - string m_strMoveTo; - float m_flDelay; - float m_flWait; - - void(void) trigger_camera; - virtual void(entity, int) Trigger; - virtual void(string, string) SpawnKey; -}; - -void -trigger_camera::Trigger(entity act, int state) -{ - UseTargets(act, TRIG_TOGGLE, m_flDelay); - - if (m_strMoveTo) { - entity e = find(world, ::targetname, m_strMoveTo); - if (e) { - angles = vectoangles(e.origin - origin); - } - } - - Client_TriggerCamera(act, origin, angles, m_flWait); - //eActivator.view2 = this; - - dprint(sprintf("^2trigger_camera::^3Trigger^7: Camera at %v, %v, for %f sec/s requested\n", - origin, angles, m_flWait)); -} - -void -trigger_camera::SpawnKey(string strKey, string strValue) -{ - switch (strKey) { - case "wait": - m_flWait = stof(strValue); - break; - case "moveto": - m_strMoveTo = strValue; - break; - default: - CBaseTrigger::SpawnKey(strKey, strValue); - } -} - -void -trigger_camera::trigger_camera(void) -{ - CBaseTrigger::CBaseTrigger(); -} diff --git a/src/gs-entbase/shared.src b/src/gs-entbase/shared.src index 411e0a5c..d822a133 100644 --- a/src/gs-entbase/shared.src +++ b/src/gs-entbase/shared.src @@ -8,6 +8,7 @@ shared/spraylogo.cpp shared/func_friction.cpp shared/env_projectedtexture.cpp shared/light_dynamic.cpp +shared/trigger_camera.cpp shared/trigger_gravity.cpp shared/info_particle_system.cpp #endlist diff --git a/src/gs-entbase/shared/trigger_camera.cpp b/src/gs-entbase/shared/trigger_camera.cpp new file mode 100644 index 00000000..ca38d3f9 --- /dev/null +++ b/src/gs-entbase/shared/trigger_camera.cpp @@ -0,0 +1,273 @@ +/* + * 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. + */ + +/*QUAKED trigger_camera (1 0 0) (-8 -8 -8) (8 8 8) +"targetname" Name +"target" Camera aims at this target. +"moveto" First path_corner entity, if present. + +Trivia: +This entity was introduced in Half-Life (1998). +*/ + +enumflags +{ + OCAMFL_CHANGED_ORIGIN, + OCAMFL_CHANGED_ANGLES, + OCAMFL_CHANGED_WAIT +}; + +#ifdef CLIENT +class trigger_camera +#else +class trigger_camera:CBaseTrigger +#endif +{ +#ifdef CLIENT +#else + float m_flWait; + string m_strAimAt; + string m_strMoveTo; + entity m_eLooker; +#endif + + void(void) trigger_camera; + +#ifdef CLIENT + virtual void(float) ReceiveEntity; +#else + virtual void(void) NextPath; + virtual void(void) GoToTarget; + virtual void(entity, int) Trigger; + virtual void(void) Respawn; + virtual void(string, string) SpawnKey; + virtual float(entity, float) SendEntity; + virtual void(void) ParentUpdate; +#endif +}; + +#ifdef CLIENT +void +trigger_camera::ReceiveEntity(float flFlags) +{ + if (flFlags & OCAMFL_CHANGED_ORIGIN) { + origin[0] = readcoord(); + origin[1] = readcoord(); + origin[2] = readcoord(); + setorigin(this, origin); + } + + if (flFlags & OCAMFL_CHANGED_ANGLES) { + angles[0] = readfloat(); + angles[1] = readfloat(); + angles[2] = readfloat(); + } + + int s = (float)getproperty(VF_ACTIVESEAT); + pSeat = &g_seats[s]; + pSeat->m_vecCameraOrigin = origin; + pSeat->m_vecCameraAngle = angles; + + if (flFlags & OCAMFL_CHANGED_WAIT) { + pSeat->m_flCameraTime = time + readfloat(); + setproperty(VF_CL_VIEWANGLES, angles); + setproperty(VF_ANGLES, angles); + } + + classname = "trigger_camera"; +} +#else +float +trigger_camera::SendEntity(entity ePVSEnt, float flFlags) +{ + if (ePVSEnt != m_eLooker) + return FALSE; + + WriteByte(MSG_ENTITY, ENT_OLDCAMERA); + WriteFloat(MSG_ENTITY, flFlags); + + if (flFlags & OCAMFL_CHANGED_ORIGIN) { + WriteCoord(MSG_ENTITY, origin[0]); + WriteCoord(MSG_ENTITY, origin[1]); + WriteCoord(MSG_ENTITY, origin[2]); + } + + if (flFlags & OCAMFL_CHANGED_ANGLES) { + WriteFloat(MSG_ENTITY, angles[0]); + WriteFloat(MSG_ENTITY, angles[1]); + WriteFloat(MSG_ENTITY, angles[2]); + } + + if (flFlags & OCAMFL_CHANGED_WAIT) { + WriteFloat(MSG_ENTITY, m_flWait); + } + + return TRUE; +} + +void +trigger_camera::ParentUpdate(void) +{ + entity t = find(world, ::targetname, m_strAimAt); + if (t) { + angles = vectoangles(t.origin - origin); + } + + if (net_origin != origin) { + net_origin = origin; + SendFlags |= OCAMFL_CHANGED_ORIGIN; + } + if (net_angles != angles) { + net_angles = angles; + SendFlags |= OCAMFL_CHANGED_ANGLES; + } + + /* camera don't support parenting when we're following paths! */ + if (m_parent && !m_strMoveTo) { + entity p = find(world, ::targetname, m_parent); + + if (p) + SetOrigin(p.origin); + } +} + +void +trigger_camera::GoToTarget(void) +{ + float flTravelTime; + vector vecVelocity; + + path_corner eNode; + eNode = (path_corner)find(world, ::targetname, target); + + if (!eNode) { + return; + } + + vecVelocity = (eNode.origin - origin); + flTravelTime = (vlen(vecVelocity) / eNode.m_flSpeed); + + if (!flTravelTime) { + print("^1trigger_camera::^3GoToTarget^7: Distance short, going next\n"); + think = NextPath; + + /* because ltime may be 0 */ + if (!ltime) + nextthink = ltime + 0.001f; + else + nextthink = ltime; + + return; + } + + velocity = (vecVelocity * (1 / flTravelTime)); + think = NextPath; + nextthink = (ltime + flTravelTime); +} + +void +trigger_camera::NextPath(void) +{ + path_corner eNode; + eNode = (path_corner)find(world, ::targetname, target); + + if (!eNode) { + return; + } + + /* fire the path_corners' target */ + eNode.Trigger(this, TRIG_TOGGLE); + + SetOrigin(eNode.origin - (mins + maxs) * 0.5); + + target = eNode.target; + velocity = [0,0,0]; + + /* warp next frame */ + if (eNode.spawnflags & PC_TELEPORT) { + print(sprintf("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname)); + think = NextPath; + nextthink = ltime; + return; + } + + /* stop until triggered again */ + if (eNode.spawnflags & PC_WAIT) { + return; + } + + if (eNode.m_flWait > 0) { + think = GoToTarget; + nextthink = ltime + eNode.m_flWait; + } else { + GoToTarget(); + } +} + +/* TODO: Handle state? */ +void +trigger_camera::Trigger(entity act, int state) +{ + m_eLooker = act; + + SetOrigin(m_oldOrigin); + velocity = [0,0,0]; + think = __NULL__; + nextthink = 0.0f; + target = m_strMoveTo; + NextPath(); + GoToTarget(); + SendFlags |= OCAMFL_CHANGED_ORIGIN | OCAMFL_CHANGED_ANGLES | OCAMFL_CHANGED_WAIT; +} + +void +trigger_camera::Respawn(void) +{ + SetSolid(SOLID_NOT); + SetMovetype(MOVETYPE_PUSH); + SetModel(m_oldModel); + SetOrigin(m_oldOrigin); +} + +void +trigger_camera::SpawnKey(string strKey, string strValue) +{ + switch (strKey) { + case "target": + m_strAimAt = strValue; + break; + case "moveto": + m_strMoveTo = strValue; + break; + case "wait": + m_flWait = stof(strValue); + break; + default: + CBaseTrigger::SpawnKey(strKey, strValue); + } +} +#endif + +void +trigger_camera::trigger_camera(void) +{ +#ifdef CLIENT + drawmask = MASK_ENGINE; +#else + m_flWait = 4.0f; + CBaseTrigger::CBaseTrigger(); +#endif +} diff --git a/src/shared/entities.h b/src/shared/entities.h index 880a1a49..a937436b 100644 --- a/src/shared/entities.h +++ b/src/shared/entities.h @@ -27,6 +27,7 @@ enum ENT_SPRITE, ENT_SPRAY, ENT_DECAL, + ENT_OLDCAMERA, ENT_SEPARATOR };