From aec68db169a909ed1930be5f670eaae0b1252926 Mon Sep 17 00:00:00 2001 From: cypress Date: Tue, 29 Aug 2023 22:46:50 -0400 Subject: [PATCH] SERVER: Make Teddies work with Soft_Restart --- source/server/clientfuncs.qc | 15 +++++++++++++++ source/server/defs/custom.qc | 1 + source/server/entities/triggers.qc | 4 ++-- source/server/utilities/game_restart.qc | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/source/server/clientfuncs.qc b/source/server/clientfuncs.qc index 490018d..b87142b 100644 --- a/source/server/clientfuncs.qc +++ b/source/server/clientfuncs.qc @@ -568,6 +568,21 @@ void (float achievement_id, float progress_value, optional entity who) UpdateAch // Unrelated to engine, but custom functions // ***************************************** +// "Removes" an entity that is placed back on restart. +void(entity ent) Ent_FakeRemove = +{ + ent.entity_removed = true; + ent.oldmodel = ent.model; + ent.oldorigin = ent.origin; + ent.bbmins = ent.mins; + ent.bbmaxs = ent.maxs; + ent.sprintflag = ent.solid; + + ent.solid = SOLID_NOT; + setsize(ent, '0 0 0', '0 0 0'); + setmodel(ent, ""); +} + void(string modelname) Precache_Set = // Precache model, and set myself to it { modelname = convert_old_asset_path(modelname); diff --git a/source/server/defs/custom.qc b/source/server/defs/custom.qc index babf14b..d0aabb0 100644 --- a/source/server/defs/custom.qc +++ b/source/server/defs/custom.qc @@ -507,6 +507,7 @@ waypoint_ai waypoints[MAX_WAYPOINTS]; //Misc patch definitions .string teddyremovetarget; +.float entity_removed; .float oldz; // used for fall damage that does not truly work correctly diff --git a/source/server/entities/triggers.qc b/source/server/entities/triggers.qc index 41d4b44..ea4cab7 100644 --- a/source/server/entities/triggers.qc +++ b/source/server/entities/triggers.qc @@ -277,7 +277,7 @@ void() teddy_react = t = find (world, teddyremovetarget, self.target); if (t) - remove(t); + Ent_FakeRemove(t); } else if (self.target) { SUB_UseTargets(); } @@ -291,7 +291,7 @@ void() teddy_react = if (self.noise) sound (dummy, CHAN_ITEM, self.noise, 1, ATTN_NORM); - remove(self); + Ent_FakeRemove(self); } /* diff --git a/source/server/utilities/game_restart.qc b/source/server/utilities/game_restart.qc index 944707b..ef59248 100644 --- a/source/server/utilities/game_restart.qc +++ b/source/server/utilities/game_restart.qc @@ -238,6 +238,23 @@ void() GameRestart_ResetMysteryBox = } } +void() GameRestart_RestoreFakeRemovals = +{ + entity ent = findfloat(world, entity_removed, true); + while(ent != world) { + ent.entity_removed = false; + ent.model = ent.oldmodel; + ent.origin = ent.oldorigin; + ent.mins = ent.bbmins; + ent.maxs = ent.bbmaxs; + ent.solid = ent.sprintflag; + setsize(ent, ent.mins, ent.maxs); + setmodel(ent, ent.model); + + ent = findfloat(ent, entity_removed, true); + } +} + //moto -- put this here because it keeps soft_restart somewhat clean.. void(entity door) reclose_door = { entity oldself; @@ -289,6 +306,7 @@ void() Soft_Restart = { GameRestart_RepairBarricades(); // Make sure all barricades are fully repaired. GameRestart_ResetPerkaColas(); // Turn all of the Perk-a-Cola lights off, reset states. GameRestart_ResetMysteryBox(); // Clean up the Mystery Box, delete floating weapon, etc. + GameRestart_RestoreFakeRemovals(); // Puts back everything "removed" using Ent_FakeRemove(). //close doors doors = findfloat(world, isopen, 1);