From 7512619a06aa50e87ceb4cfd62c230fd407262e4 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Thu, 14 Jul 2022 22:35:45 -0700 Subject: [PATCH] Commit some of this WiP stuff so Xylemon can merge his changes. --- src/client/draw.qc | 28 ++++++++++++++ src/client/progs.src | 2 +- src/server/defs.h | 1 + src/server/info_areadef.qc | 12 +++++- src/server/sentry.h | 43 ++++++++++++++++++++++ src/server/sentry.qc | 75 +++++++++++++++++++++++++++++--------- src/server/server.qc | 1 + src/shared/include.src | 1 - 8 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 src/client/draw.qc create mode 100644 src/server/sentry.h diff --git a/src/client/draw.qc b/src/client/draw.qc new file mode 100644 index 0000000..f3c76a6 --- /dev/null +++ b/src/client/draw.qc @@ -0,0 +1,28 @@ +/* + * 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. +*/ + +void +ClientGame_PreDraw(void) +{ + +} + +void +ClientGame_PostDraw(void) +{ + if (serverkeyfloat("areadefs") == 1) + Font_DrawText([16,16], getplayerkeyvalue(player_localnum, "*areadef"), FONT_CON); +} diff --git a/src/client/progs.src b/src/client/progs.src index edc0cf7..f626f0d 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -22,7 +22,7 @@ defs.h vox.qc ../../../valve/src/client/damage.qc -../../../base/src/client/draw.qc +draw.qc init.qc ../../../valve/src/client/flashlight.qc ../../../valve/src/client/player.qc diff --git a/src/server/defs.h b/src/server/defs.h index 95bbd1d..37feccf 100644 --- a/src/server/defs.h +++ b/src/server/defs.h @@ -17,6 +17,7 @@ #include "gamerules.h" #include "../../../valve/src/server/items.h" #include "../../../valve/src/server/flashlight.h" +#include "sentry.h" /* returns if a player already has a teleporter/exit built */ bool diff --git a/src/server/info_areadef.qc b/src/server/info_areadef.qc index 7776009..e41968a 100644 --- a/src/server/info_areadef.qc +++ b/src/server/info_areadef.qc @@ -38,8 +38,18 @@ info_areadef:NSPointTrigger virtual void(void) Respawn; virtual void(string,string) SpawnKey; + virtual void(entity) Touch; }; +void +info_areadef::Touch(entity eToucher) +{ + if (!(eToucher.flags & FL_CLIENT)) + return; + + forceinfokey(eToucher, "*areadef", strtoupper(m_strDescription)); +} + void info_areadef::SpawnKey(string strKey, string strValue) { @@ -71,5 +81,5 @@ info_areadef::Respawn(void) void info_areadef::info_areadef(void) { - + forceinfokey(world, "areadefs", "1"); } \ No newline at end of file diff --git a/src/server/sentry.h b/src/server/sentry.h new file mode 100644 index 0000000..0cacde0 --- /dev/null +++ b/src/server/sentry.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 Marco Cawthorne + * + * 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. +*/ + +#define TFC_SENTRY_COST 130 + +typedef enum +{ + SENTRY_IDLE, + SENTRY_SEARCHING, + SENTRY_ALERTED, + SENTRY_SHOOTING +} sentrystate_e; + +class +TFCSentry:NSSurfacePropEntity +{ + NSSurfacePropEntity m_eHead; + sentrystate_e m_state; + float m_flNextIdleSound; + + /* spinny */ + float m_flWantAngle; + float m_flCurrAngle; + + void(void) TFCSentry; + + virtual void(NSClientPlayer) Place; + virtual void(void) FinishPlacing; + virtual void(void) Think; +}; \ No newline at end of file diff --git a/src/server/sentry.qc b/src/server/sentry.qc index cf5bb75..8c8da0e 100644 --- a/src/server/sentry.qc +++ b/src/server/sentry.qc @@ -14,31 +14,62 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define TFC_SENTRY_COST 130 - -class -TFCSentry:NSSurfacePropEntity -{ - NSSurfacePropEntity m_eHead; - - void(void) TFCSentry; - - virtual void(player) Place; - virtual void(void) FinishPlacing; - virtual void(void) Think; -}; - void TFCSentry::Think(void) { - float twist = sin(time); - m_eHead.SetBoneControl1(twist); - m_eHead.SetBoneControl2(0.5f); nextthink = time + 0.1f; + + /* searching */ + entity t = world; + { + for (entity p = world; (p = find(p, ::classname, "player"));) { + /* out of range */ + if (vlen(origin - p.origin) > 1024) + continue; + + /* find them */ + traceline(origin, p.origin, MOVE_NORMAL, this); + if (trace_ent == p) { + t = p; + break; + } + } + } + + if (m_state == SENTRY_SEARCHING) { + float twist = sin(time); + m_eHead.SetBoneControl1(twist); + m_eHead.SetBoneControl2(0.5f); + + if (m_flNextIdleSound < time) { + sound(this, CHAN_VOICE, "weapons/turridle.wav", 1.0f, ATTN_NORM); + m_flNextIdleSound = time + 10.0f; + } + + if (t) + m_state = SENTRY_ALERTED; + } else if (m_state == SENTRY_ALERTED) { + sound(this, CHAN_VOICE, "weapons/turrspot.wav", 1.0f, ATTN_NORM); + m_state = SENTRY_SHOOTING; + } else if (m_state == SENTRY_SHOOTING) { + // shoot things + if (!t) + m_state = SENTRY_SEARCHING; + else { + makevectors([0, angles[1], 0]); + m_flWantAngle = dotproduct(normalize(origin - t.origin), v_right); + m_flCurrAngle = Math_Lerp(m_flCurrAngle, m_flWantAngle, 0.25f); + m_eHead.SetBoneControl1(m_flCurrAngle); + + /* fire bullets */ + v_angle = vectoangles(normalize(origin - t.origin)); + TraceAttack_FireBullets(1, origin, 5, [0.025,0.025], WEAPON_NONE); + } + } } void -TFCSentry::Place(player pl) +TFCSentry::Place(NSClientPlayer pl) { SetAngles(pl.GetAngles()); @@ -68,6 +99,8 @@ TFCSentry::FinishPlacing(void) m_eHead.colormap = colormap; think = Think; nextthink = time + 0.1f; + m_state = SENTRY_SEARCHING; + m_flNextIdleSound = time + 5.0f; env_message_single(real_owner, "#Sentry_finish"); Sound_Play(this, CHAN_BODY, "engineer.turret_set"); @@ -81,6 +114,12 @@ TFCSentry::TFCSentry(void) SetSolid(SOLID_BBOX); SetMovetype(MOVETYPE_NONE); SetSize([-16,-16,0], [16,16,20]); + + SetTakedamage(DAMAGE_YES); + SetHealth(100); + m_eHead.SetTakedamage(DAMAGE_YES); + m_eHead.SetHealth(100); + m_state = SENTRY_IDLE; } void diff --git a/src/server/server.qc b/src/server/server.qc index 409e184..f6f927b 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -23,6 +23,7 @@ Game_InitRules(void) void Game_Worldspawn(void) { + forceinfokey(world, "areadefs", "0"); Sound_Precache("ammo.pickup"); Sound_Precache("ammo.respawn"); Sound_Precache("player.fall"); diff --git a/src/shared/include.src b/src/shared/include.src index 6a82ddd..43d52a2 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -10,7 +10,6 @@ player.qc ../../../valve/src/shared/animations.h ../../../valve/src/shared/animations.qc pmove.qc -../../../valve/src/shared/pmove_water.qc ../../../valve/src/shared/fx_blood.qc ../../../valve/src/shared/fx_breakmodel.qc