From a463498f60df2d26eb0851067d481b186ab505bd Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 1 Jun 2022 17:38:52 -0700 Subject: [PATCH] Huge cleanup. Add initial code for the revamped material definition system. --- base/src/Makefile | 1 + base/src/menu/Makefile | 4 + base/src/menu/progs.src | 9 + base/src/server/items.h | 1 + base/src/server/items.qc | 10 +- .../base_glsl.pk3dir/glsl/lightmapped.glsl | 3 + platform/base_glsl.pk3dir/glsl/rtlight.glsl | 2 +- platform/base_glsl.pk3dir/glsl/terrain.glsl | 2 +- .../base_glsl.pk3dir/glsl/terrain_alpha.glsl | 2 +- .../base_glsl.pk3dir/glsl/terrain_mask.glsl | 2 +- platform/base_scripts.pk3dir/fonts/ui.font | 2 +- .../base_scripts.pk3dir/scripts/ui_style.txt | 3 +- .../menu_fonts.pk3dir/gfx/shell/cabin.ttf | Bin 0 -> 176076 bytes .../textures/common/clipplayersnow.mat | 11 ++ src/client/entry.qc | 6 + src/client/shake.qc | 2 +- src/gs-entbase/client/env_cubemap.qc | 1 - src/gs-entbase/client/env_glow.qc | 26 ++- src/gs-entbase/client/env_laser.qc | 1 - src/gs-entbase/client/env_particle.qc | 13 +- src/gs-entbase/client/env_sound.qc | 12 +- src/gs-entbase/client/env_soundscape.qc | 11 +- src/gs-entbase/client/env_sprite.qc | 5 - src/gs-entbase/client/env_sun.qc | 19 +-- src/gs-entbase/client/func_dustcloud.qc | 8 +- src/gs-entbase/client/func_dustmotes.qc | 11 +- src/gs-entbase/client/func_lod.qc | 8 +- src/gs-entbase/client/func_smokevolume.qc | 9 +- src/gs-entbase/client/info_notnull.qc | 7 +- src/gs-entbase/client/infodecal.qc | 4 - src/gs-entbase/client/light_environment.qc | 13 +- src/gs-entbase/client/point_message.qc | 1 - src/gs-entbase/client/prop_static.qc | 21 ++- src/gs-entbase/client/sky_camera.qc | 1 - src/gs-entbase/server/button_target.qc | 9 +- src/gs-entbase/server/cycler.qc | 7 +- src/gs-entbase/server/env_beverage.qc | 11 +- src/gs-entbase/server/env_explosion.qc | 1 - src/gs-entbase/server/env_fade.qc | 1 - src/gs-entbase/server/env_global.qc | 10 +- src/gs-entbase/server/env_hudhint.qc | 1 - src/gs-entbase/server/env_laser.qc | 1 - src/gs-entbase/server/env_message.qc | 1 - src/gs-entbase/server/env_render.qc | 1 - src/gs-entbase/server/env_shake.qc | 1 - src/gs-entbase/server/env_shooter.qc | 2 - src/gs-entbase/server/env_spark.qc | 11 +- src/gs-entbase/server/env_sprite.qc | 18 +- src/gs-entbase/server/func_areaportal.qc | 1 - src/gs-entbase/server/func_breakable.qc | 13 +- src/gs-entbase/server/func_brush.qc | 1 - src/gs-entbase/server/func_button.qc | 28 +++- src/gs-entbase/server/func_conveyor.qc | 1 - src/gs-entbase/server/func_door.qc | 39 ++++- src/gs-entbase/server/func_door_rotating.qc | 17 +- src/gs-entbase/server/func_guntarget.qc | 12 +- src/gs-entbase/server/func_healthcharger.qc | 17 +- src/gs-entbase/server/func_lod.qc | 1 - src/gs-entbase/server/func_mortar_field.qc | 1 - src/gs-entbase/server/func_pendulum.qc | 1 - src/gs-entbase/server/func_physbox.qc | 2 - src/gs-entbase/server/func_plat.qc | 1 - src/gs-entbase/server/func_platrot.qc | 1 - src/gs-entbase/server/func_pushable.qc | 1 - src/gs-entbase/server/func_recharge.qc | 17 +- src/gs-entbase/server/func_rot_button.qc | 1 - src/gs-entbase/server/func_rotating.qc | 2 - src/gs-entbase/server/func_tank.qc | 12 +- src/gs-entbase/server/func_tankcontrols.qc | 1 - src/gs-entbase/server/func_tracktrain.qc | 19 ++- .../server/func_tracktraincontrols.qc | 1 - src/gs-entbase/server/func_train.qc | 20 ++- src/gs-entbase/server/func_vehicle.qc | 2 - src/gs-entbase/server/func_wall_toggle.qc | 3 +- src/gs-entbase/server/game_counter.qc | 1 - src/gs-entbase/server/game_counter_set.qc | 1 - src/gs-entbase/server/game_player_equip.qc | 1 - src/gs-entbase/server/game_text.qc | 1 - src/gs-entbase/server/gibshooter.qc | 1 - src/gs-entbase/server/info_intermission.qc | 1 - src/gs-entbase/server/info_notnull.qc | 1 - src/gs-entbase/server/info_null.qc | 4 +- src/gs-entbase/server/infodecal.qc | 2 - src/gs-entbase/server/light.qc | 2 - src/gs-entbase/server/logic_auto.qc | 13 +- src/gs-entbase/server/momentary_door.qc | 1 - src/gs-entbase/server/momentary_rot_button.qc | 1 - src/gs-entbase/server/momentarybase.qc | 1 - src/gs-entbase/server/monster_furniture.qc | 1 - src/gs-entbase/server/monster_generic.qc | 1 - src/gs-entbase/server/monstermaker.qc | 1 - src/gs-entbase/server/multi_manager.qc | 25 ++- src/gs-entbase/server/multisource.qc | 1 - src/gs-entbase/server/path_corner.qc | 1 - src/gs-entbase/server/player_loadsaved.qc | 1 - src/gs-entbase/server/player_weaponstrip.qc | 1 - src/gs-entbase/server/point_camera.qc | 2 - src/gs-entbase/server/prop_door_rotating.qc | 1 - src/gs-entbase/server/prop_dynamic.qc | 1 - src/gs-entbase/server/prop_physics.qc | 2 - src/gs-entbase/server/prop_static.qc | 10 +- src/gs-entbase/server/random_speaker.qc | 5 +- src/gs-entbase/server/random_trigger.qc | 1 - src/gs-entbase/server/scripted_sentence.qc | 1 - src/gs-entbase/server/scripted_sequence.qc | 1 - src/gs-entbase/server/speaker.qc | 3 +- src/gs-entbase/server/stubs.qc | 6 + src/gs-entbase/server/targ_speaker.qc | 1 - src/gs-entbase/server/target_cdaudio.qc | 3 +- src/gs-entbase/server/trigger_auto.qc | 10 +- src/gs-entbase/server/trigger_autosave.qc | 2 +- src/gs-entbase/server/trigger_cdaudio.qc | 2 +- src/gs-entbase/server/trigger_changelevel.qc | 13 +- src/gs-entbase/server/trigger_changetarget.qc | 2 +- src/gs-entbase/server/trigger_counter.qc | 3 +- src/gs-entbase/server/trigger_endsection.qc | 1 - src/gs-entbase/server/trigger_hurt.qc | 17 +- src/gs-entbase/server/trigger_look.qc | 15 +- src/gs-entbase/server/trigger_multiple.qc | 29 +++- src/gs-entbase/server/trigger_once.qc | 13 +- src/gs-entbase/server/trigger_playerfreeze.qc | 1 - src/gs-entbase/server/trigger_push.qc | 2 +- src/gs-entbase/server/trigger_relay.qc | 3 +- src/gs-entbase/server/trigger_teleport.qc | 1 - src/gs-entbase/server/trigger_transition.qc | 1 - src/gs-entbase/shared/NSBrushTrigger.qc | 1 - src/gs-entbase/shared/NSEntity.h | 6 +- src/gs-entbase/shared/NSEntity.qc | 42 ++--- src/gs-entbase/shared/NSIO.h | 12 +- src/gs-entbase/shared/NSIO.qc | 58 ++++--- src/gs-entbase/shared/NSMonster.qc | 21 ++- src/gs-entbase/shared/NSPhysicsEntity.qc | 1 - src/gs-entbase/shared/NSPointTrigger.qc | 1 - src/gs-entbase/shared/NSProjectile.qc | 1 - src/gs-entbase/shared/NSRenderableEntity.qc | 4 +- src/gs-entbase/shared/NSSurfacePropEntity.h | 2 + src/gs-entbase/shared/NSSurfacePropEntity.qc | 29 +++- src/gs-entbase/shared/NSTalkMonster.qc | 2 - src/gs-entbase/shared/NSTrigger.qc | 4 +- src/gs-entbase/shared/NSVehicle.qc | 1 - src/gs-entbase/shared/ambient_generic.qc | 8 +- src/gs-entbase/shared/env_bubbles.qc | 9 +- src/gs-entbase/shared/env_fog_controller.qc | 1 - src/gs-entbase/shared/env_projectedtexture.qc | 6 +- src/gs-entbase/shared/func_friction.qc | 15 -- src/gs-entbase/shared/func_illusionary.qc | 5 - src/gs-entbase/shared/func_ladder.qc | 5 - src/gs-entbase/shared/func_monitor.qc | 2 - src/gs-entbase/shared/func_tankmortar.qc | 14 +- src/gs-entbase/shared/func_wall.qc | 5 - src/gs-entbase/shared/info_particle_system.qc | 2 - src/gs-entbase/shared/light_dynamic.qc | 7 +- .../shared/prop_physics_multiplayer.qc | 6 - src/gs-entbase/shared/prop_rope.qc | 2 - .../shared/prop_vehicle_driveable.qc | 12 +- src/gs-entbase/shared/trigger_camera.qc | 5 +- src/gs-entbase/shared/trigger_gravity.qc | 19 +-- src/gs-entbase/shared/worldspawn.qc | 11 +- src/materials/Alien.qc | 26 +++ src/materials/Computer.qc | 26 +++ src/materials/Concrete.qc | 26 +++ src/materials/Dirt.qc | 26 +++ src/materials/Flesh.qc | 26 +++ src/materials/Foliage.qc | 26 +++ src/materials/Glass.qc | 26 +++ src/materials/Grate.qc | 25 +++ src/materials/Metal.qc | 26 +++ src/materials/Sand.qc | 26 +++ src/materials/Slosh.qc | 26 +++ src/materials/Snow.qc | 26 +++ src/materials/Tile.qc | 26 +++ src/materials/Vent.qc | 26 +++ src/materials/Wood.qc | 26 +++ src/materials/include.src | 17 ++ src/menu-vgui/includes.src | 23 +++ src/menu-vgui/progs.src | 22 +-- src/server/entry.qc | 2 + src/shared/NSClientPlayer.qc | 10 +- src/shared/NSClientSpectator.qc | 14 -- src/shared/NSMaterial.h | 37 +++++ src/shared/NSMaterial.qc | 154 ++++++++++++++++++ src/shared/defs.h | 1 + src/shared/include.src | 2 + src/shared/player_pmove.qc | 2 +- src/shared/pmove.qc | 13 ++ src/shared/surfaceproperties.qc | 8 + src/vgui/ui.qc | 19 +-- src/vgui/ui_button.qc | 1 - src/vgui/ui_list.qc | 2 +- src/xr/NSXRInput.qc | 1 - src/xr/NSXRSpace.qc | 1 - src/xr/xr.qc | 1 - 192 files changed, 1260 insertions(+), 514 deletions(-) create mode 100644 base/src/menu/Makefile create mode 100644 base/src/menu/progs.src create mode 100644 platform/menu_fonts.pk3dir/gfx/shell/cabin.ttf create mode 100644 platform/vmap_tex.pk3dir/textures/common/clipplayersnow.mat create mode 100644 src/materials/Alien.qc create mode 100644 src/materials/Computer.qc create mode 100644 src/materials/Concrete.qc create mode 100644 src/materials/Dirt.qc create mode 100644 src/materials/Flesh.qc create mode 100644 src/materials/Foliage.qc create mode 100644 src/materials/Glass.qc create mode 100644 src/materials/Grate.qc create mode 100644 src/materials/Metal.qc create mode 100644 src/materials/Sand.qc create mode 100644 src/materials/Slosh.qc create mode 100644 src/materials/Snow.qc create mode 100644 src/materials/Tile.qc create mode 100644 src/materials/Vent.qc create mode 100644 src/materials/Wood.qc create mode 100644 src/materials/include.src create mode 100644 src/menu-vgui/includes.src create mode 100644 src/shared/NSMaterial.h create mode 100644 src/shared/NSMaterial.qc diff --git a/base/src/Makefile b/base/src/Makefile index cc3f82d8..5e8df063 100644 --- a/base/src/Makefile +++ b/base/src/Makefile @@ -3,3 +3,4 @@ CC=fteqcc all: cd client && $(MAKE) cd server && $(MAKE) + cd menu && $(MAKE) diff --git a/base/src/menu/Makefile b/base/src/menu/Makefile new file mode 100644 index 00000000..627019ab --- /dev/null +++ b/base/src/menu/Makefile @@ -0,0 +1,4 @@ +CC=fteqcc + +all: + $(CC) progs.src diff --git a/base/src/menu/progs.src b/base/src/menu/progs.src new file mode 100644 index 00000000..5022c0f0 --- /dev/null +++ b/base/src/menu/progs.src @@ -0,0 +1,9 @@ +#pragma target fte_5768 +#pragma progs_dat "../../menu.dat" +#define MENU +#define GAME_DIR "base" + +#includelist +../../../src/menu-vgui/includes.src +#endlist + diff --git a/base/src/server/items.h b/base/src/server/items.h index dc01ac8e..82c5259a 100644 --- a/base/src/server/items.h +++ b/base/src/server/items.h @@ -23,6 +23,7 @@ class item_pickup:NSRenderableEntity int id; void(void) item_pickup; + virtual void(void) Spawned; virtual void(entity) Touch; virtual void(int i) SetItem; virtual void(void) Respawn; diff --git a/base/src/server/items.qc b/base/src/server/items.qc index 0fb29881..9a87cc70 100644 --- a/base/src/server/items.qc +++ b/base/src/server/items.qc @@ -93,12 +93,14 @@ item_pickup::Respawn(void) } void -item_pickup::item_pickup(void) +item_pickup::Spawned(void) { #ifdef WASTES Sound_Precache("item_weapon.pickup"); #endif - - super::NSRenderableEntity(); - Respawn(); +} + +void +item_pickup::item_pickup(void) +{ } diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped.glsl b/platform/base_glsl.pk3dir/glsl/lightmapped.glsl index 21937c6a..34a7285f 100644 --- a/platform/base_glsl.pk3dir/glsl/lightmapped.glsl +++ b/platform/base_glsl.pk3dir/glsl/lightmapped.glsl @@ -36,6 +36,7 @@ !!cvardf r_skipNormal !!cvardf r_skipEnvmap !!cvardf r_skipLightmap +!!cvardf r_skipDetail #include "sys/defs.h" @@ -232,9 +233,11 @@ varying vec3 norm; alpha = 1.0; + #if r_skipDetail == 0 #if defined(UPPERLOWER) diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5); #endif + #endif gl_FragColor = vec4(fog3(diffuse_f.rgb), alpha); } diff --git a/platform/base_glsl.pk3dir/glsl/rtlight.glsl b/platform/base_glsl.pk3dir/glsl/rtlight.glsl index 3a1f6281..3b6d1eb1 100644 --- a/platform/base_glsl.pk3dir/glsl/rtlight.glsl +++ b/platform/base_glsl.pk3dir/glsl/rtlight.glsl @@ -173,7 +173,7 @@ varying vec3 lightvector; diff.rgb *= vc.a; #if defined(UPPERLOWER) - diff.rgb *= texture2D(s_upper, tex_c * 4.0).rgb; + diff.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5); #endif gl_FragColor = vec4(fog3additive(diff), vc.a); diff --git a/platform/base_glsl.pk3dir/glsl/terrain.glsl b/platform/base_glsl.pk3dir/glsl/terrain.glsl index 6a5cf146..c75145c2 100644 --- a/platform/base_glsl.pk3dir/glsl/terrain.glsl +++ b/platform/base_glsl.pk3dir/glsl/terrain.glsl @@ -159,7 +159,7 @@ varying vec2 lm1, lm2, lm3; #endif #if defined(UPPERLOWER) - output_f.rgb *= texture2D(s_upper, tex_c * 4.0).rgb; + output_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5); #endif gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) ); diff --git a/platform/base_glsl.pk3dir/glsl/terrain_alpha.glsl b/platform/base_glsl.pk3dir/glsl/terrain_alpha.glsl index 46539284..9448d78a 100644 --- a/platform/base_glsl.pk3dir/glsl/terrain_alpha.glsl +++ b/platform/base_glsl.pk3dir/glsl/terrain_alpha.glsl @@ -160,7 +160,7 @@ varying vec2 lm1, lm2, lm3; #if defined(UPPERLOWER) - diffuse_f.rgb *= texture2D(s_upper, tex_c * 4.0).rgb; + diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5); #endif gl_FragColor = vec4(fog3(diffuse_f), 1.0); diff --git a/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl b/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl index b1470285..654a267a 100644 --- a/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl +++ b/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl @@ -164,7 +164,7 @@ varying vec2 lm1, lm2, lm3; #endif #if defined(UPPERLOWER) - diffuse_f.rgb *= texture2D(s_upper, tex_c * 4.0).rgb; + diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5); #endif gl_FragColor = vec4(fog3(diffuse_f), 1.0); diff --git a/platform/base_scripts.pk3dir/fonts/ui.font b/platform/base_scripts.pk3dir/fonts/ui.font index 0d9d0df2..6891d4d2 100644 --- a/platform/base_scripts.pk3dir/fonts/ui.font +++ b/platform/base_scripts.pk3dir/fonts/ui.font @@ -1,4 +1,4 @@ color "255 255 255" alpha 255 size 12 -path fonts/Tahoma.ttf +path gfx/shell/cabin.ttf diff --git a/platform/base_scripts.pk3dir/scripts/ui_style.txt b/platform/base_scripts.pk3dir/scripts/ui_style.txt index 8a0b1dc1..f3d5b9ce 100644 --- a/platform/base_scripts.pk3dir/scripts/ui_style.txt +++ b/platform/base_scripts.pk3dir/scripts/ui_style.txt @@ -1,2 +1,3 @@ -COLOR=90 106 80 +COLOR=28 40 56 +FG_COLOR=255 255 255 ALPHA=255 diff --git a/platform/menu_fonts.pk3dir/gfx/shell/cabin.ttf b/platform/menu_fonts.pk3dir/gfx/shell/cabin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..210e1e3a5f9adf961308924d82375a7910988893 GIT binary patch literal 176076 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 DQG-Tq literal 0 HcmV?d00001 diff --git a/platform/vmap_tex.pk3dir/textures/common/clipplayersnow.mat b/platform/vmap_tex.pk3dir/textures/common/clipplayersnow.mat new file mode 100644 index 00000000..4f6fff55 --- /dev/null +++ b/platform/vmap_tex.pk3dir/textures/common/clipplayersnow.mat @@ -0,0 +1,11 @@ +// Vera Visions Material +{ + qer_editorImage "textures/common/clipwood.tga" + qer_trans 0.50 + surfaceParm nodraw + surfaceParm trans + surfaceParm playerclip + surfaceParm nolightmap + surfaceParm snow + nomipmaps +} diff --git a/src/client/entry.qc b/src/client/entry.qc index b9d2d73a..f04eef32 100644 --- a/src/client/entry.qc +++ b/src/client/entry.qc @@ -66,6 +66,7 @@ CSQC_Init(float apilevel, string enginename, float engineversion) Sentences_Init(); Decals_Init(); Way_Init(); + Materials_Init(); /* let the menu know we're a multi or a singleplayer game */ if (serverkeyfloat("sv_playerslots") == 1) @@ -696,6 +697,11 @@ CSQC_WorldLoaded(void) } } + for (entity a = world; (a = findfloat(a, ::isCSQC, TRUE));) { + NSEntity ent = (NSEntity)a; + ent.Respawn(); + } + print("Client world initialized.\n"); } diff --git a/src/client/shake.qc b/src/client/shake.qc index ab86ff3b..71d7da4a 100644 --- a/src/client/shake.qc +++ b/src/client/shake.qc @@ -1,5 +1,5 @@ void -Shake_Update(player pl) +Shake_Update(NSClientPlayer pl) { if (pSeat->m_flShakeDuration > 0.0) { vector vecShake = [0,0,0]; diff --git a/src/gs-entbase/client/env_cubemap.qc b/src/gs-entbase/client/env_cubemap.qc index 73f1dc45..1c824bdd 100644 --- a/src/gs-entbase/client/env_cubemap.qc +++ b/src/gs-entbase/client/env_cubemap.qc @@ -69,7 +69,6 @@ void env_cubemap::env_cubemap(void) { m_iSize = 32; - Init(); } /* diff --git a/src/gs-entbase/client/env_glow.qc b/src/gs-entbase/client/env_glow.qc index a75599e9..4ab23021 100644 --- a/src/gs-entbase/client/env_glow.qc +++ b/src/gs-entbase/client/env_glow.qc @@ -45,8 +45,10 @@ class env_glow:NSEntity /* change to renderablentity? */ void(void) env_glow; - virtual float() predraw; - virtual void() postdraw; + virtual void(void) Spawned; + virtual void(void) Respawn; + virtual float(void) predraw; + virtual void(void) postdraw; virtual void(string, string) SpawnKey; virtual void(void) RendererRestarted; }; @@ -202,6 +204,20 @@ env_glow::SpawnKey(string strField, string strKey) } } +void +env_glow::Respawn(void) +{ + SetSize([0,0,0], [0,0,0]); + SetOrigin(GetSpawnOrigin()); + effects &= ~EF_NOSHADOW; +} + +void +env_glow::Spawned(void) +{ + RendererRestarted(); +} + void env_glow::env_glow(void) { @@ -209,10 +225,4 @@ env_glow::env_glow(void) m_flMaxAlpha = 1.0f; m_vecColor = [1,1,1]; drawmask = MASK_GLOWS; - setsize(this, [0,0,0], [0,0,0]); - effects &= ~EF_NOSHADOW; - Init(); - - RendererRestarted(); - setorigin(this, origin); } diff --git a/src/gs-entbase/client/env_laser.qc b/src/gs-entbase/client/env_laser.qc index 5dccc7bc..de0506fc 100644 --- a/src/gs-entbase/client/env_laser.qc +++ b/src/gs-entbase/client/env_laser.qc @@ -76,5 +76,4 @@ env_laser::ReceiveEntity(float flNew, float flChanged) void env_laser::env_laser(void) { - drawmask = MASK_ENGINE; } diff --git a/src/gs-entbase/client/env_particle.qc b/src/gs-entbase/client/env_particle.qc index c3c6b968..c5df01cd 100644 --- a/src/gs-entbase/client/env_particle.qc +++ b/src/gs-entbase/client/env_particle.qc @@ -40,6 +40,8 @@ class env_particle:NSEntity string m_strTarget; void(void) env_particle; + + virtual void(void) Respawn; virtual void(void) customphysics; virtual void(string, string) SpawnKey; }; @@ -96,10 +98,13 @@ void env_particle::SpawnKey(string strField, string strKey) } } +void +env_particle::Respawn(void) +{ + SetOrigin(GetSpawnOrigin()); + SetSize([0,0,0], [0,0,0]); +} + void env_particle::env_particle(void) { - drawmask = MASK_ENGINE; - Init(); - setorigin(this, origin); - setsize(this, [0,0,0], [0,0,0]); } diff --git a/src/gs-entbase/client/env_sound.qc b/src/gs-entbase/client/env_sound.qc index a28ac7d8..bb7b1b10 100644 --- a/src/gs-entbase/client/env_sound.qc +++ b/src/gs-entbase/client/env_sound.qc @@ -71,6 +71,7 @@ class env_sound:NSEntity void(void) env_sound; + virtual void(void) Respawn; virtual void(string, string) SpawnKey; }; @@ -99,12 +100,15 @@ env_sound::SpawnKey(string strField, string strKey) } } +void +env_sound::Respawn(void) +{ + SetSize([0,0,0], [0,0,0]); + SetOrigin(GetSpawnOrigin()); +} + void env_sound::env_sound(void) { m_iRadius = 256; - Init(); - - setsize(this, [0,0,0], [0,0,0]); - setorigin(this, origin); } diff --git a/src/gs-entbase/client/env_soundscape.qc b/src/gs-entbase/client/env_soundscape.qc index 8309e222..906d06e3 100644 --- a/src/gs-entbase/client/env_soundscape.qc +++ b/src/gs-entbase/client/env_soundscape.qc @@ -38,6 +38,7 @@ class env_soundscape:NSEntity void(void) env_soundscape; + virtual void(void) Respawn; virtual void(string, string) SpawnKey; }; @@ -65,15 +66,19 @@ env_soundscape::SpawnKey(string strField, string strKey) } } +void +env_soundscape::Respawn(void) +{ + SetSize([0,0,0], [0,0,0]); + SetOrigin(GetSpawnOrigin()); +} + void env_soundscape::env_soundscape(void) { g_scapes+=1; m_iID = g_scapes; m_iRadius = 1024; - setsize(this, [0,0,0], [0,0,0]); - Init(); - setorigin(this, origin); } void diff --git a/src/gs-entbase/client/env_sprite.qc b/src/gs-entbase/client/env_sprite.qc index 970d0405..e06b86aa 100644 --- a/src/gs-entbase/client/env_sprite.qc +++ b/src/gs-entbase/client/env_sprite.qc @@ -23,7 +23,6 @@ class env_sprite:NSRenderableEntity virtual float(void) predraw; virtual void(void) Init; - virtual void(void) Initialized; virtual void(float,float) ReceiveEntity; virtual void(void) think; }; @@ -113,10 +112,6 @@ env_sprite::Init(void) { } void -env_sprite::Initialized(void) -{ -} -void env_sprite::env_sprite(void) { } diff --git a/src/gs-entbase/client/env_sun.qc b/src/gs-entbase/client/env_sun.qc index 13bf8930..4529c4d3 100644 --- a/src/gs-entbase/client/env_sun.qc +++ b/src/gs-entbase/client/env_sun.qc @@ -51,8 +51,8 @@ class env_sun:NSEntity int m_iUseAngles; void(void) env_sun; - virtual void(void) Init; - virtual void(void) Initialized; + + virtual void(void) Spawned; virtual void(void) postdraw; virtual float(void) predraw; virtual void(string, string) SpawnKey; @@ -127,16 +127,11 @@ env_sun::postdraw(void) } void -env_sun::Init(void) +env_sun::Spawned(void) { - super::Init(); - setorigin(this, origin); - drawmask = MASK_ENGINE; -} + super::Spawned(); -void -env_sun::Initialized(void) -{ + setorigin(this, origin); makevectors(m_vecLensPos); m_vecLensPos = vectoangles(v_forward); localcmd(sprintf("r_shadows_throwdirection %v\n", v_forward)); @@ -163,10 +158,6 @@ env_sun::SpawnKey(string strField, string strKey) void env_sun::env_sun(void) { - drawmask = MASK_ENGINE; - setsize(this, [0,0,0], [0,0,0]); - setorigin(this, origin); - Init(); } void diff --git a/src/gs-entbase/client/func_dustcloud.qc b/src/gs-entbase/client/func_dustcloud.qc index 647f5f6f..36c560fb 100644 --- a/src/gs-entbase/client/func_dustcloud.qc +++ b/src/gs-entbase/client/func_dustcloud.qc @@ -41,7 +41,7 @@ class func_dustcloud:NSEntity float m_flLifetimeMax; void(void) func_dustcloud; - virtual void(void) Init; + virtual void(void) Spawned; virtual float() predraw; virtual void(string, string) SpawnKey; }; @@ -139,9 +139,9 @@ func_dustcloud::predraw(void) } void -func_dustcloud::Init(void) +func_dustcloud::Spawned(void) { - super::Init(); + super::Spawned(); precache_model(model); setmodel(this, model); @@ -194,6 +194,4 @@ func_dustcloud::func_dustcloud(void) m_vecColor = [1,1,1]; */ solid = SOLID_NOT; - - Init(); } diff --git a/src/gs-entbase/client/func_dustmotes.qc b/src/gs-entbase/client/func_dustmotes.qc index b8d334b7..ffed9460 100644 --- a/src/gs-entbase/client/func_dustmotes.qc +++ b/src/gs-entbase/client/func_dustmotes.qc @@ -31,7 +31,8 @@ class func_dustmotes:NSEntity float m_flNexTime; void(void) func_dustmotes; - virtual void(void) Init; + + virtual void(void) Spawned; virtual float() predraw; virtual void(string, string) SpawnKey; }; @@ -66,15 +67,15 @@ func_dustmotes::predraw(void) } void -func_dustmotes::Init(void) +func_dustmotes::Spawned(void) { - super::Init(); + super::Spawned(); precache_model(model); setmodel(this, model); setorigin(this, origin); movetype = MOVETYPE_NONE; - drawmask = MASK_ENGINE; + m_iCount = vlen(size) / 10; } void @@ -94,6 +95,4 @@ void func_dustmotes::func_dustmotes(void) { solid = SOLID_NOT; - Init(); - m_iCount = vlen(size) / 10; } diff --git a/src/gs-entbase/client/func_lod.qc b/src/gs-entbase/client/func_lod.qc index dad981f0..bc01b42d 100644 --- a/src/gs-entbase/client/func_lod.qc +++ b/src/gs-entbase/client/func_lod.qc @@ -36,7 +36,8 @@ class func_lod:NSRenderableEntity int m_iDisappearDist; void(void) func_lod; - virtual void(void) Init; + + virtual void(void) Spawned; virtual float() predraw; virtual void(string,string) SpawnKey; }; @@ -91,9 +92,9 @@ func_lod::SpawnKey(string strField, string strKey) } void -func_lod::Init(void) +func_lod::Spawned(void) { - super::Init(); + super::Spawned(); precache_model(model); setmodel(this, model); @@ -107,5 +108,4 @@ func_lod::func_lod(void) { m_iDisappearDist = 2000; solid = SOLID_BSP; - Init(); } diff --git a/src/gs-entbase/client/func_smokevolume.qc b/src/gs-entbase/client/func_smokevolume.qc index b978efe1..0cc20b86 100644 --- a/src/gs-entbase/client/func_smokevolume.qc +++ b/src/gs-entbase/client/func_smokevolume.qc @@ -45,7 +45,7 @@ class func_smokevolume:NSEntity float m_flMaxDrawDistance; void(void) func_smokevolume; - virtual void(void) Init; + virtual void(void) Spawned; virtual float() predraw; virtual void(string, string) SpawnKey; }; @@ -157,15 +157,14 @@ func_smokevolume::predraw(void) } void -func_smokevolume::Init(void) +func_smokevolume::Spawned(void) { - super::Init(); + super::Spawned(); precache_model(model); setmodel(this, model); setorigin(this, origin); movetype = MOVETYPE_NONE; - drawmask = MASK_ENGINE; if (m_iCount == -1) m_iCount = (int)(vlen(size) / 100); @@ -211,6 +210,4 @@ func_smokevolume::func_smokevolume(void) m_vecColor1 = m_vecColor2 = [0,0,0]; solid = SOLID_NOT; - - Init(); } diff --git a/src/gs-entbase/client/info_notnull.qc b/src/gs-entbase/client/info_notnull.qc index 73ef817a..98a3d13f 100644 --- a/src/gs-entbase/client/info_notnull.qc +++ b/src/gs-entbase/client/info_notnull.qc @@ -16,5 +16,10 @@ class info_notnull:NSEntity { - + void(void) info_notnull; }; + +void +info_notnull::info_notnull(void) +{ +} diff --git a/src/gs-entbase/client/infodecal.qc b/src/gs-entbase/client/infodecal.qc index 6b5f0bec..dbebc531 100644 --- a/src/gs-entbase/client/infodecal.qc +++ b/src/gs-entbase/client/infodecal.qc @@ -55,12 +55,8 @@ infodecal::SpawnKey(string strField, string strKey) void infodecal::infodecal(void) { - Init(); - if (targetname) { remove(this); return; } - - drawmask = MASK_ENGINE; } diff --git a/src/gs-entbase/client/light_environment.qc b/src/gs-entbase/client/light_environment.qc index 6fe37926..6c4ee009 100644 --- a/src/gs-entbase/client/light_environment.qc +++ b/src/gs-entbase/client/light_environment.qc @@ -53,22 +53,14 @@ class light_environment:NSEntity { void(void) light_environment; - virtual void(void) Init; - virtual void(void) Initialized; + virtual void(void) Respawn; virtual void(string, string) SpawnKey; }; void -light_environment::Init(void) +light_environment::Respawn(void) { - super::Init(); setorigin(this, origin); - drawmask = MASK_ENGINE; -} - -void -light_environment::Initialized(void) -{ makevectors(g_vecSunDir); cvar_set("r_shadows_throwdirection", sprintf("%v", v_forward)); } @@ -92,5 +84,4 @@ void light_environment::light_environment(void) { solid = SOLID_NOT; - Init(); } diff --git a/src/gs-entbase/client/point_message.qc b/src/gs-entbase/client/point_message.qc index 36cdbbdf..f2f7200c 100644 --- a/src/gs-entbase/client/point_message.qc +++ b/src/gs-entbase/client/point_message.qc @@ -63,7 +63,6 @@ point_message::point_message(void) { m_flRadius = 512; m_strMessage = "No message"; - Init(); } int diff --git a/src/gs-entbase/client/prop_static.qc b/src/gs-entbase/client/prop_static.qc index 795ba729..fa773249 100644 --- a/src/gs-entbase/client/prop_static.qc +++ b/src/gs-entbase/client/prop_static.qc @@ -22,6 +22,8 @@ prop_static:NSEntity void(void) prop_static; virtual void(string, string) SpawnKey; + virtual void(void) Respawn; + virtual void(void) Spawned; }; void @@ -43,17 +45,26 @@ prop_static::SpawnKey(string strKey, string strValue) } void -prop_static::prop_static(void) +prop_static::Respawn(void) { - float skindata; - drawmask = MASK_ENGINE; - Init(); + makestatic(this); +} +void +prop_static::Spawned(void) +{ + super::Spawned(); + + float skindata; solid = SOLID_NOT; setmodel(this, model); skindata = loadcustomskin("", sprintf("geomset 0 %i\ngeomset 1 %i\n", m_iBody, m_iBody)); applycustomskin(this, skindata); setorigin(this, origin); setsize(this, mins * scale, maxs * scale); - makestatic(this); +} + +void +prop_static::prop_static(void) +{ } diff --git a/src/gs-entbase/client/sky_camera.qc b/src/gs-entbase/client/sky_camera.qc index 13a74955..f20859fb 100644 --- a/src/gs-entbase/client/sky_camera.qc +++ b/src/gs-entbase/client/sky_camera.qc @@ -62,7 +62,6 @@ void sky_camera::sky_camera(void) { g_skyscale = 16; - Init(); } void diff --git a/src/gs-entbase/server/button_target.qc b/src/gs-entbase/server/button_target.qc index 105045f3..20bf0976 100644 --- a/src/gs-entbase/server/button_target.qc +++ b/src/gs-entbase/server/button_target.qc @@ -62,13 +62,13 @@ button_target::Respawn(void) if (HasSpawnFlags(BUTTA_USE)) { PlayerUse = PUseWrapper; } else { - health = 1; - takedamage = DAMAGE_YES; + SetHealth(1); + SetTakedamage(DAMAGE_YES); Pain = Death = Damage; } /* purely cosmetic */ - frame = HasSpawnFlags(BUTTA_TEXON) ? 1 : 0; + SetFrame(HasSpawnFlags(BUTTA_TEXON) ? 1 : 0); } void @@ -76,7 +76,7 @@ button_target::Trigger(entity act, int status) { /* make unusable */ PlayerUse = __NULL__; - takedamage = DAMAGE_NO; + SetTakedamage(DAMAGE_NO); frame = 1 - frame; UseTargets(act, status, m_flDelay); @@ -91,5 +91,4 @@ button_target::Damage(void) void button_target::button_target(void) { - super::NSSurfacePropEntity(); } diff --git a/src/gs-entbase/server/cycler.qc b/src/gs-entbase/server/cycler.qc index 47c1d19b..79155f97 100644 --- a/src/gs-entbase/server/cycler.qc +++ b/src/gs-entbase/server/cycler.qc @@ -49,7 +49,7 @@ cycler::Pain(void) } else { frame += 1; } - health = 9999; + SetHealth(9999); } void @@ -58,12 +58,11 @@ cycler::Respawn(void) super::Respawn(); SetSolid(SOLID_BBOX); - takedamage = DAMAGE_YES; - health = 9999; + SetTakedamage(DAMAGE_YES); + SetHealth(9999); } void cycler::cycler(void) { - super::NSSurfacePropEntity(); } diff --git a/src/gs-entbase/server/env_beverage.qc b/src/gs-entbase/server/env_beverage.qc index 13891929..2994a81c 100644 --- a/src/gs-entbase/server/env_beverage.qc +++ b/src/gs-entbase/server/env_beverage.qc @@ -52,6 +52,7 @@ class env_beverage:NSRenderableEntity void(void) env_beverage; + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity, int) Trigger; @@ -116,13 +117,17 @@ env_beverage::SpawnKey(string strKey, string strValue) } void -env_beverage::env_beverage(void) +env_beverage::Spawned(void) { + super::Spawned(); + precache_model("models/can.mdl"); precache_sound("weapons/g_bounce3.wav"); +} - super::NSRenderableEntity(); - +void +env_beverage::env_beverage(void) +{ if (!m_iUses) { m_iUses = 10; } diff --git a/src/gs-entbase/server/env_explosion.qc b/src/gs-entbase/server/env_explosion.qc index 52f0d4ef..c1deaa99 100644 --- a/src/gs-entbase/server/env_explosion.qc +++ b/src/gs-entbase/server/env_explosion.qc @@ -112,5 +112,4 @@ env_explosion::SpawnKey(string strKey, string strValue) void env_explosion::env_explosion(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/env_fade.qc b/src/gs-entbase/server/env_fade.qc index eec0c1b9..b1343824 100644 --- a/src/gs-entbase/server/env_fade.qc +++ b/src/gs-entbase/server/env_fade.qc @@ -126,5 +126,4 @@ env_fade::SpawnKey(string strKey, string strValue) void env_fade::env_fade(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/env_global.qc b/src/gs-entbase/server/env_global.qc index fc075bd1..a24a7d4f 100644 --- a/src/gs-entbase/server/env_global.qc +++ b/src/gs-entbase/server/env_global.qc @@ -50,6 +50,7 @@ class env_global:NSPointTrigger void(void) env_global; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string,string) Restore; virtual void(entity, int) Trigger; @@ -169,9 +170,9 @@ env_global::SpawnKey(string strKey, string strValue) } void -env_global::env_global(void) +env_global::Spawned(void) { - super::NSPointTrigger(); + super::Spawned(); if (!m_strGlobalState) { objerror("env_global: No globalstate name given! Aborting\n"); @@ -183,3 +184,8 @@ env_global::env_global(void) } } } + +void +env_global::env_global(void) +{ +} diff --git a/src/gs-entbase/server/env_hudhint.qc b/src/gs-entbase/server/env_hudhint.qc index 5afaebb2..980cdd2d 100644 --- a/src/gs-entbase/server/env_hudhint.qc +++ b/src/gs-entbase/server/env_hudhint.qc @@ -71,7 +71,6 @@ env_hudhint::SpawnKey(string strKey, string strValue) void env_hudhint::env_hudhint(void) { - super::NSPointTrigger(); } void diff --git a/src/gs-entbase/server/env_laser.qc b/src/gs-entbase/server/env_laser.qc index 75ed6adc..8d70c180 100644 --- a/src/gs-entbase/server/env_laser.qc +++ b/src/gs-entbase/server/env_laser.qc @@ -206,6 +206,5 @@ env_laser::SpawnKey(string strKey, string strValue) void env_laser::env_laser(void) { - super::NSPointTrigger(); pvsflags = PVSF_IGNOREPVS; } diff --git a/src/gs-entbase/server/env_message.qc b/src/gs-entbase/server/env_message.qc index f7a5568a..379e1421 100644 --- a/src/gs-entbase/server/env_message.qc +++ b/src/gs-entbase/server/env_message.qc @@ -102,7 +102,6 @@ env_message::SpawnKey(string strKey, string strValue) void env_message::env_message(void) { - super::NSPointTrigger(); } void diff --git a/src/gs-entbase/server/env_render.qc b/src/gs-entbase/server/env_render.qc index 91a7f58b..103edc89 100644 --- a/src/gs-entbase/server/env_render.qc +++ b/src/gs-entbase/server/env_render.qc @@ -115,6 +115,5 @@ env_render::Trigger(entity act, int state) void env_render::env_render(void) { - super::NSRenderableEntity(); } #endif diff --git a/src/gs-entbase/server/env_shake.qc b/src/gs-entbase/server/env_shake.qc index feba2578..7a281f3b 100644 --- a/src/gs-entbase/server/env_shake.qc +++ b/src/gs-entbase/server/env_shake.qc @@ -77,5 +77,4 @@ env_shake::SpawnKey(string strKey, string strValue) void env_shake::env_shake(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/env_shooter.qc b/src/gs-entbase/server/env_shooter.qc index e387f6cd..6157699c 100644 --- a/src/gs-entbase/server/env_shooter.qc +++ b/src/gs-entbase/server/env_shooter.qc @@ -150,8 +150,6 @@ env_shooter::SpawnKey(string strKey, string strValue) void env_shooter::env_shooter(void) { - super::NSPointTrigger(); - if (!m_strShootModel) { remove(this); } diff --git a/src/gs-entbase/server/env_spark.qc b/src/gs-entbase/server/env_spark.qc index 0d3566fc..a832c726 100644 --- a/src/gs-entbase/server/env_spark.qc +++ b/src/gs-entbase/server/env_spark.qc @@ -53,6 +53,7 @@ class env_spark:NSPointTrigger void(void) env_spark; + virtual void(void) Spawned; virtual void(void) CreateSpark; virtual void(void) TimedSpark; virtual void(entity, int) Trigger; @@ -123,9 +124,15 @@ env_spark::SpawnKey(string strKey, string strValue) } } +void +env_spark::Spawned(void) +{ + super::Spawned(); + + Sound_Precache("env_spark.sfx"); +} + void env_spark::env_spark(void) { - Sound_Precache("env_spark.sfx"); - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/env_sprite.qc b/src/gs-entbase/server/env_sprite.qc index 8a2bfb4f..af4bd9f3 100644 --- a/src/gs-entbase/server/env_sprite.qc +++ b/src/gs-entbase/server/env_sprite.qc @@ -56,6 +56,8 @@ class env_sprite:NSRenderableEntity string m_strMaterial; void(void) env_sprite; + + virtual void(void) Spawned; virtual void(entity, int) Trigger; virtual float(entity, float) SendEntity; virtual void(string, string) SpawnKey; @@ -178,17 +180,19 @@ env_sprite::SpawnKey(string strKey, string strValue) } void -env_sprite::env_sprite(void) +env_sprite::Spawned(void) { - m_iIsShader = false; - m_flFramerate = 10; - m_flScale = 1.0f; - - super::NSRenderableEntity(); - m_iToggled = (HasSpawnFlags(ENVS_STARTON) > 0) ? TRUE : FALSE; /* how pointless this would be otherwise. */ if (!targetname) m_iToggled = TRUE; } + +void +env_sprite::env_sprite(void) +{ + m_iIsShader = false; + m_flFramerate = 10; + m_flScale = 1.0f; +} diff --git a/src/gs-entbase/server/func_areaportal.qc b/src/gs-entbase/server/func_areaportal.qc index ab781a97..649f26ca 100644 --- a/src/gs-entbase/server/func_areaportal.qc +++ b/src/gs-entbase/server/func_areaportal.qc @@ -132,5 +132,4 @@ func_areaportal::PortalClose(void) void func_areaportal::func_areaportal(void) { - super::NSEntity(); } \ No newline at end of file diff --git a/src/gs-entbase/server/func_breakable.qc b/src/gs-entbase/server/func_breakable.qc index 558ab2a2..7541ae12 100644 --- a/src/gs-entbase/server/func_breakable.qc +++ b/src/gs-entbase/server/func_breakable.qc @@ -131,6 +131,7 @@ class func_breakable:NSSurfacePropEntity void(void) func_breakable; /* overrides */ + virtual void(void) Spawned; virtual void(void) Respawn; virtual void(void) Pain; virtual void(void) Death; @@ -369,8 +370,10 @@ func_breakable::SpawnKey(string strKey, string strValue) } void -func_breakable::func_breakable(void) +func_breakable::Spawned(void) { + super::Spawned(); + /* func_breakable defaults to glass */ if (classname == "func_breakable") { SetPropData(funcbreakable_surftable[0]); @@ -380,9 +383,11 @@ func_breakable::func_breakable(void) SetSurfaceData(funcbreakable_surftable[1]); } - /* proper init */ - super::NSSurfacePropEntity(); - /* precache impact sound */ Sound_Precache(GetSurfaceData(SURFDATA_SND_BULLETIMPACT)); } + +void +func_breakable::func_breakable(void) +{ +} diff --git a/src/gs-entbase/server/func_brush.qc b/src/gs-entbase/server/func_brush.qc index 98906a5a..372a6fee 100644 --- a/src/gs-entbase/server/func_brush.qc +++ b/src/gs-entbase/server/func_brush.qc @@ -130,5 +130,4 @@ func_brush::Respawn(void) void func_brush::func_brush(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/func_button.qc b/src/gs-entbase/server/func_button.qc index b6952e9d..18afbf14 100644 --- a/src/gs-entbase/server/func_button.qc +++ b/src/gs-entbase/server/func_button.qc @@ -102,6 +102,7 @@ class func_button:NSSurfacePropEntity string m_strOnIn; string m_strOnOut; + virtual void(void) Spawned; virtual void(void) Respawn; virtual void(void) Arrived; virtual void(void) Returned; @@ -488,20 +489,29 @@ func_button::SpawnKey(string strKey, string strValue) } void -func_button::func_button(void) +func_button::Spawned(void) { - m_flWait = 4.0f; - - super::NSSurfacePropEntity(); + super::Spawned(); /* sounds */ Sound_Precache(m_strSndPressed); Sound_Precache(m_strSndUnpressed); /* input/output */ - m_strOnPressed = CreateOutput(m_strOnPressed); - m_strOnDamaged = CreateOutput(m_strOnDamaged); - m_strOnUseLocked = CreateOutput(m_strOnUseLocked); - m_strOnIn = CreateOutput(m_strOnIn); - m_strOnOut = CreateOutput(m_strOnOut); + if (m_strOnPressed) + m_strOnPressed = CreateOutput(m_strOnPressed); + if (m_strOnDamaged) + m_strOnDamaged = CreateOutput(m_strOnDamaged); + if (m_strOnUseLocked) + m_strOnUseLocked = CreateOutput(m_strOnUseLocked); + if (m_strOnIn) + m_strOnIn = CreateOutput(m_strOnIn); + if (m_strOnOut) + m_strOnOut = CreateOutput(m_strOnOut); +} + +void +func_button::func_button(void) +{ + m_flWait = 4.0f; } diff --git a/src/gs-entbase/server/func_conveyor.qc b/src/gs-entbase/server/func_conveyor.qc index 5ea55626..c405dfca 100644 --- a/src/gs-entbase/server/func_conveyor.qc +++ b/src/gs-entbase/server/func_conveyor.qc @@ -165,5 +165,4 @@ func_conveyor::SpawnKey(string strKey, string strValue) void func_conveyor::func_conveyor(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/func_door.qc b/src/gs-entbase/server/func_door.qc index 6ff6bbad..18e35ad9 100644 --- a/src/gs-entbase/server/func_door.qc +++ b/src/gs-entbase/server/func_door.qc @@ -101,6 +101,8 @@ class func_door:NSRenderableEntity void(void) func_door; + virtual void(void) Spawned; + virtual void(void) PortalOpen; virtual void(void) PortalClose; virtual void(void) SetMovementDirection; @@ -638,9 +640,9 @@ func_door::SpawnKey(string strKey, string strValue) } void -func_door::func_door(void) +func_door::Spawned(void) { - super::NSRenderableEntity(); + super::Spawned(); if (m_strSndOpen) Sound_Precache(m_strSndOpen); @@ -658,6 +660,39 @@ func_door::func_door(void) Sound_Precache(m_strUnlockedSfx); } +void +func_door::func_door(void) +{ + m_vecPos1 = + m_vecPos2 = + m_vecDest = + m_vecMoveDir = [0,0,0]; + + m_flSpeed = + m_flLip = + m_iState = + m_flNextTrigger = + m_flWait = + m_flDelay = 0.0f; + + m_iDamage = + m_iLocked = + m_iPortalState = + m_iForceClosed = 0; + + m_iCanTouch = false; + m_flSoundWait = 0.0f; + + targetClose = + m_strLockedSfx = + m_strUnlockedSfx = + + m_strSndOpen = + m_strSndClose = + m_strSndMove = + m_strSndStop = __NULL__; +} + void func_water(void) { diff --git a/src/gs-entbase/server/func_door_rotating.qc b/src/gs-entbase/server/func_door_rotating.qc index 0edfbbd3..e7e994a6 100644 --- a/src/gs-entbase/server/func_door_rotating.qc +++ b/src/gs-entbase/server/func_door_rotating.qc @@ -92,6 +92,7 @@ class func_door_rotating:NSRenderableEntity void(void) func_door_rotating; + virtual void(void) Spawned; virtual void(void) PortalOpen; virtual void(void) PortalClose; virtual void(void) Respawn; @@ -492,13 +493,9 @@ func_door_rotating::SpawnKey(string strKey, string strValue) } void -func_door_rotating::func_door_rotating(void) +func_door_rotating::Spawned(void) { - m_flSpeed = 100; - m_flDelay = 4; - m_flDistance = 90; - - super::NSRenderableEntity(); + super::Spawned(); if (m_strSndOpen) Sound_Precache(m_strSndOpen); @@ -509,3 +506,11 @@ func_door_rotating::func_door_rotating(void) if (m_strLockedSfx) Sound_Precache(m_strLockedSfx); } + +void +func_door_rotating::func_door_rotating(void) +{ + m_flSpeed = 100; + m_flDelay = 4; + m_flDistance = 90; +} diff --git a/src/gs-entbase/server/func_guntarget.qc b/src/gs-entbase/server/func_guntarget.qc index 51b6feff..a3365761 100644 --- a/src/gs-entbase/server/func_guntarget.qc +++ b/src/gs-entbase/server/func_guntarget.qc @@ -39,6 +39,7 @@ class func_guntarget:NSSurfacePropEntity void(void) func_guntarget; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(void) Respawn; @@ -246,11 +247,16 @@ func_guntarget::SpawnKey(string strKey, string strValue) } } -void func_guntarget::func_guntarget(void) +void +func_guntarget::Spawned(void) { - m_flSpeed = 100; - super::NSSurfacePropEntity(); + super::Spawned(); if (m_strOnDeath) m_strOnDeath = CreateOutput(m_strOnDeath); } + +void func_guntarget::func_guntarget(void) +{ + m_flSpeed = 100; +} diff --git a/src/gs-entbase/server/func_healthcharger.qc b/src/gs-entbase/server/func_healthcharger.qc index 3f135b7c..ba45bc43 100644 --- a/src/gs-entbase/server/func_healthcharger.qc +++ b/src/gs-entbase/server/func_healthcharger.qc @@ -42,6 +42,7 @@ class func_healthcharger:NSRenderableEntity void(void) func_healthcharger; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(string, string) SpawnKey; @@ -211,15 +212,19 @@ func_healthcharger::Respawn(void) } void -func_healthcharger::func_healthcharger(void) +func_healthcharger::Spawned(void) { - m_strSndFirst = "items/medshot4.wav"; - m_strSndCharging = "items/medcharge4.wav"; - m_strSndDone = "items/medshotno1.wav"; - - super::NSRenderableEntity(); + super::Spawned(); precache_sound(m_strSndFirst); precache_sound(m_strSndCharging); precache_sound(m_strSndDone); } + +void +func_healthcharger::func_healthcharger(void) +{ + m_strSndFirst = "items/medshot4.wav"; + m_strSndCharging = "items/medcharge4.wav"; + m_strSndDone = "items/medshotno1.wav"; +} diff --git a/src/gs-entbase/server/func_lod.qc b/src/gs-entbase/server/func_lod.qc index 75a2458c..d616568c 100644 --- a/src/gs-entbase/server/func_lod.qc +++ b/src/gs-entbase/server/func_lod.qc @@ -53,5 +53,4 @@ func_lod::Respawn(void) void func_lod::func_lod(void) { - super::NSEntity(); } diff --git a/src/gs-entbase/server/func_mortar_field.qc b/src/gs-entbase/server/func_mortar_field.qc index a8b621cf..1016ba32 100644 --- a/src/gs-entbase/server/func_mortar_field.qc +++ b/src/gs-entbase/server/func_mortar_field.qc @@ -236,5 +236,4 @@ func_mortar_field::SpawnKey(string strKey, string strValue) void func_mortar_field::func_mortar_field(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/func_pendulum.qc b/src/gs-entbase/server/func_pendulum.qc index 558737db..2e1eec7c 100644 --- a/src/gs-entbase/server/func_pendulum.qc +++ b/src/gs-entbase/server/func_pendulum.qc @@ -167,5 +167,4 @@ func_pendulum::SpawnKey(string strKey, string strValue) void func_pendulum::func_pendulum(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/func_physbox.qc b/src/gs-entbase/server/func_physbox.qc index 8322b7e0..ad203946 100644 --- a/src/gs-entbase/server/func_physbox.qc +++ b/src/gs-entbase/server/func_physbox.qc @@ -56,7 +56,6 @@ func_physbox::SpawnKey(string strKey, string strValue) void func_physbox::func_physbox(void) { - super::NSPhysicsEntity(); } #else class func_physbox:NSSurfacePropEntity @@ -84,7 +83,6 @@ func_physbox::Respawn(void) void func_physbox::func_physbox(void) { - super::NSSurfacePropEntity(); } #endif diff --git a/src/gs-entbase/server/func_plat.qc b/src/gs-entbase/server/func_plat.qc index 65c0244d..12b7a525 100644 --- a/src/gs-entbase/server/func_plat.qc +++ b/src/gs-entbase/server/func_plat.qc @@ -193,5 +193,4 @@ void func_plat::func_plat(void) { m_flSpeed = 100.0f; - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/func_platrot.qc b/src/gs-entbase/server/func_platrot.qc index 446cbbd4..13b47094 100644 --- a/src/gs-entbase/server/func_platrot.qc +++ b/src/gs-entbase/server/func_platrot.qc @@ -237,5 +237,4 @@ void func_platrot::func_platrot(void) { m_flSpeed = 100.0f; - super::NSRenderableEntity(); } \ No newline at end of file diff --git a/src/gs-entbase/server/func_pushable.qc b/src/gs-entbase/server/func_pushable.qc index bc7d5420..1860c7b0 100644 --- a/src/gs-entbase/server/func_pushable.qc +++ b/src/gs-entbase/server/func_pushable.qc @@ -170,5 +170,4 @@ func_pushable::Respawn(void) void func_pushable::func_pushable(void) { - super::func_breakable(); } diff --git a/src/gs-entbase/server/func_recharge.qc b/src/gs-entbase/server/func_recharge.qc index 75d54152..f3c0f9e7 100644 --- a/src/gs-entbase/server/func_recharge.qc +++ b/src/gs-entbase/server/func_recharge.qc @@ -42,6 +42,7 @@ class func_recharge:NSRenderableEntity void(void) func_recharge; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(string, string) SpawnKey; @@ -217,15 +218,19 @@ func_recharge::Respawn(void) } void -func_recharge::func_recharge(void) +func_recharge::Spawned(void) { - m_strSndFirst = "items/suitchargeok1.wav"; - m_strSndCharging = "items/suitcharge1.wav"; - m_strSndDone = "items/suitchargeno1.wav"; - - super::NSRenderableEntity(); + super::Spawned(); precache_sound(m_strSndFirst); precache_sound(m_strSndCharging); precache_sound(m_strSndDone); } + +void +func_recharge::func_recharge(void) +{ + m_strSndFirst = "items/suitchargeok1.wav"; + m_strSndCharging = "items/suitcharge1.wav"; + m_strSndDone = "items/suitchargeno1.wav"; +} diff --git a/src/gs-entbase/server/func_rot_button.qc b/src/gs-entbase/server/func_rot_button.qc index b361f44b..6ce5cda3 100644 --- a/src/gs-entbase/server/func_rot_button.qc +++ b/src/gs-entbase/server/func_rot_button.qc @@ -269,5 +269,4 @@ func_rot_button::SpawnKey(string strKey, string strValue) void func_rot_button::func_rot_button(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/func_rotating.qc b/src/gs-entbase/server/func_rotating.qc index 436aa502..3fd17629 100644 --- a/src/gs-entbase/server/func_rotating.qc +++ b/src/gs-entbase/server/func_rotating.qc @@ -238,6 +238,4 @@ void func_rotating::func_rotating(void) { m_flSpeed = 100; - super::NSRenderableEntity(); - Respawn(); } diff --git a/src/gs-entbase/server/func_tank.qc b/src/gs-entbase/server/func_tank.qc index 15b20cf0..ed0f39ed 100644 --- a/src/gs-entbase/server/func_tank.qc +++ b/src/gs-entbase/server/func_tank.qc @@ -89,6 +89,7 @@ class func_tank:NSVehicle void(void) func_tank; + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(void) customphysics; @@ -337,13 +338,18 @@ func_tank::SpawnKey(string strKey, string strValue) } void -func_tank::func_tank(void) +func_tank::Spawned(void) { - m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; - super::NSVehicle(); + super::Spawned(); if (m_strSpriteFlash) precache_model(m_strSpriteFlash); if (m_strSpriteSmoke) precache_model(m_strSpriteSmoke); } + +void +func_tank::func_tank(void) +{ + m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; +} diff --git a/src/gs-entbase/server/func_tankcontrols.qc b/src/gs-entbase/server/func_tankcontrols.qc index 9ca3c9bf..c8a3a641 100644 --- a/src/gs-entbase/server/func_tankcontrols.qc +++ b/src/gs-entbase/server/func_tankcontrols.qc @@ -72,5 +72,4 @@ func_tankcontrols::Respawn(void) void func_tankcontrols::func_tankcontrols(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/func_tracktrain.qc b/src/gs-entbase/server/func_tracktrain.qc index 53030ddd..aac21bf7 100644 --- a/src/gs-entbase/server/func_tracktrain.qc +++ b/src/gs-entbase/server/func_tracktrain.qc @@ -63,6 +63,7 @@ class func_tracktrain:NSRenderableEntity void(void) func_tracktrain; + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity, int) Trigger; @@ -347,16 +348,20 @@ func_tracktrain::SpawnKey(string strKey, string strValue) } } +void +func_tracktrain::Spawned(void) +{ + super::Spawned(); + + if (m_strMoveSnd) + Sound_Precache(m_strMoveSnd); + if (m_strStopSnd) + Sound_Precache(m_strStopSnd); +} + void func_tracktrain::func_tracktrain(void) { /* FIXME: This is all decided by the first path_corner pretty much */ m_flSpeed = 100; - super::NSRenderableEntity(); - - if (m_strMoveSnd) - Sound_Precache(m_strMoveSnd); - - if (m_strStopSnd) - Sound_Precache(m_strStopSnd); } diff --git a/src/gs-entbase/server/func_tracktraincontrols.qc b/src/gs-entbase/server/func_tracktraincontrols.qc index 7c2f56ad..9a1f2524 100644 --- a/src/gs-entbase/server/func_tracktraincontrols.qc +++ b/src/gs-entbase/server/func_tracktraincontrols.qc @@ -43,5 +43,4 @@ func_traincontrols::Respawn(void) void func_traincontrols::func_traincontrols(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/func_train.qc b/src/gs-entbase/server/func_train.qc index e881501b..80fec552 100644 --- a/src/gs-entbase/server/func_train.qc +++ b/src/gs-entbase/server/func_train.qc @@ -64,6 +64,8 @@ class func_train:NSRenderableEntity void(void) func_train; + virtual void(void) Spawned; + /* overrides */ virtual void(float) Save; virtual void(string, string) Restore; @@ -298,16 +300,20 @@ func_train::SpawnKey(string strKey, string strValue) } } +void +func_train::Spawned(void) +{ + super::Spawned(); + + if (m_strMoveSnd) + Sound_Precache(m_strMoveSnd); + if (m_strStopSnd) + Sound_Precache(m_strStopSnd); +} + void func_train::func_train(void) { /* FIXME: This is all decided by the first path_corner pretty much */ m_flSpeed = 100; - super::NSRenderableEntity(); - - if (m_strMoveSnd) - Sound_Precache(m_strMoveSnd); - - if (m_strStopSnd) - Sound_Precache(m_strStopSnd); } diff --git a/src/gs-entbase/server/func_vehicle.qc b/src/gs-entbase/server/func_vehicle.qc index 6b190a45..ba22be27 100644 --- a/src/gs-entbase/server/func_vehicle.qc +++ b/src/gs-entbase/server/func_vehicle.qc @@ -579,8 +579,6 @@ func_vehicle::func_vehicle(void) m_vecGravityDir = [0,0,-1]; m_iVehicleFlags |= VHF_FROZEN; - super::NSVehicle(); - m_wlFL = spawn(func_vehicle_wheel); m_wlFR = spawn(func_vehicle_wheel); m_wlBL = spawn(func_vehicle_wheel); diff --git a/src/gs-entbase/server/func_wall_toggle.qc b/src/gs-entbase/server/func_wall_toggle.qc index 83745fb7..5fb80f8e 100644 --- a/src/gs-entbase/server/func_wall_toggle.qc +++ b/src/gs-entbase/server/func_wall_toggle.qc @@ -85,7 +85,7 @@ func_wall_toggle::Trigger(entity act, int state) if (m_iVisible) { SetSolid(SOLID_BSP); - SetModelindex(m_oldmodelindex); + SetModel(GetSpawnModel()); } else { SetSolid(SOLID_NOT); SetModelindex(0); @@ -124,5 +124,4 @@ func_wall_toggle::Input(entity eAct, string strInput, string strData) void func_wall_toggle::func_wall_toggle(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/game_counter.qc b/src/gs-entbase/server/game_counter.qc index 87c5c48a..75ea6edc 100644 --- a/src/gs-entbase/server/game_counter.qc +++ b/src/gs-entbase/server/game_counter.qc @@ -146,5 +146,4 @@ void game_counter::game_counter(void) { m_iStartCount = 0; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/game_counter_set.qc b/src/gs-entbase/server/game_counter_set.qc index 0e6ebe63..efd04f65 100644 --- a/src/gs-entbase/server/game_counter_set.qc +++ b/src/gs-entbase/server/game_counter_set.qc @@ -112,5 +112,4 @@ void game_counter_set::game_counter_set(void) { m_iCount = 0; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/game_player_equip.qc b/src/gs-entbase/server/game_player_equip.qc index 815df107..d509a214 100644 --- a/src/gs-entbase/server/game_player_equip.qc +++ b/src/gs-entbase/server/game_player_equip.qc @@ -155,5 +155,4 @@ game_player_equip::SpawnKey(string strKey, string strValue) void game_player_equip::game_player_equip(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/game_text.qc b/src/gs-entbase/server/game_text.qc index 4efb4e7d..7801d404 100644 --- a/src/gs-entbase/server/game_text.qc +++ b/src/gs-entbase/server/game_text.qc @@ -194,5 +194,4 @@ game_text::SpawnKey(string strKey, string strValue) void game_text::game_text(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/gibshooter.qc b/src/gs-entbase/server/gibshooter.qc index c3c57031..ed2fe12f 100644 --- a/src/gs-entbase/server/gibshooter.qc +++ b/src/gs-entbase/server/gibshooter.qc @@ -47,5 +47,4 @@ void gibshooter2::gibshooter2(void) m_flScale = 1.0; precache_model(m_strShootModel); - super::env_shooter(); } diff --git a/src/gs-entbase/server/info_intermission.qc b/src/gs-entbase/server/info_intermission.qc index 9c6bb784..c24f1a93 100644 --- a/src/gs-entbase/server/info_intermission.qc +++ b/src/gs-entbase/server/info_intermission.qc @@ -39,5 +39,4 @@ class info_intermission:NSPointTrigger void info_intermission::info_intermission(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/info_notnull.qc b/src/gs-entbase/server/info_notnull.qc index d4491660..8ea9118b 100644 --- a/src/gs-entbase/server/info_notnull.qc +++ b/src/gs-entbase/server/info_notnull.qc @@ -40,5 +40,4 @@ class info_notnull:NSPointTrigger void info_notnull::info_notnull(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/info_null.qc b/src/gs-entbase/server/info_null.qc index f91438dc..520624e6 100644 --- a/src/gs-entbase/server/info_null.qc +++ b/src/gs-entbase/server/info_null.qc @@ -68,9 +68,7 @@ info_null::Respawn(void) void info_null::info_null(void) { -#ifdef DEBUG_INFONULL - super::NSPointTrigger(); -#else +#ifndef DEBUG_INFONULL remove(self); #endif } diff --git a/src/gs-entbase/server/infodecal.qc b/src/gs-entbase/server/infodecal.qc index 64081c9a..58143f58 100644 --- a/src/gs-entbase/server/infodecal.qc +++ b/src/gs-entbase/server/infodecal.qc @@ -141,6 +141,4 @@ infodecal::infodecal(void) remove(self); return; } - - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/light.qc b/src/gs-entbase/server/light.qc index 7476de40..69ef207c 100644 --- a/src/gs-entbase/server/light.qc +++ b/src/gs-entbase/server/light.qc @@ -247,8 +247,6 @@ light::light(void) m_flStyle = 0; m_flSwitchStyle = 0; - super::NSPointTrigger(); - /* switch styles before 12 are builtins from Quake. */ if (m_flSwitchStyle > 0 && m_flSwitchStyle <= 11) { m_strPattern = getlightstyle(m_flSwitchStyle); diff --git a/src/gs-entbase/server/logic_auto.qc b/src/gs-entbase/server/logic_auto.qc index a8b6e07b..c94dcbcf 100644 --- a/src/gs-entbase/server/logic_auto.qc +++ b/src/gs-entbase/server/logic_auto.qc @@ -66,6 +66,7 @@ class logic_auto:NSPointTrigger void(void) logic_auto; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(void) Respawn; @@ -204,11 +205,9 @@ logic_auto::SpawnKey(string strKey, string strValue) } void -logic_auto::logic_auto(void) +logic_auto::Spawned(void) { - m_iFromSaveGame = 0; - - super::NSPointTrigger(); + super::Spawned(); if (m_strOnMapSpawn) m_strOnMapSpawn = CreateOutput(m_strOnMapSpawn); @@ -225,3 +224,9 @@ logic_auto::logic_auto(void) if (m_strOnMultiNewRound) m_strOnMultiNewRound = CreateOutput(m_strOnMultiNewRound); } + +void +logic_auto::logic_auto(void) +{ + m_iFromSaveGame = 0; +} diff --git a/src/gs-entbase/server/momentary_door.qc b/src/gs-entbase/server/momentary_door.qc index 2ee43282..68ca2a40 100644 --- a/src/gs-entbase/server/momentary_door.qc +++ b/src/gs-entbase/server/momentary_door.qc @@ -138,5 +138,4 @@ momentary_door::SpawnKey(string strKey, string strValue) void momentary_door::momentary_door(void) { - super::NSMomentary(); } diff --git a/src/gs-entbase/server/momentary_rot_button.qc b/src/gs-entbase/server/momentary_rot_button.qc index e9208499..d97b8225 100644 --- a/src/gs-entbase/server/momentary_rot_button.qc +++ b/src/gs-entbase/server/momentary_rot_button.qc @@ -263,5 +263,4 @@ void momentary_rot_button::momentary_rot_button(void) { m_flReturnspeed = m_flSpeed = -1; - super::NSMomentary(); } diff --git a/src/gs-entbase/server/momentarybase.qc b/src/gs-entbase/server/momentarybase.qc index 6c7b3bc9..40053acc 100644 --- a/src/gs-entbase/server/momentarybase.qc +++ b/src/gs-entbase/server/momentarybase.qc @@ -121,5 +121,4 @@ NSMomentary::Restore(string strKey, string strValue) void NSMomentary::NSMomentary(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/monster_furniture.qc b/src/gs-entbase/server/monster_furniture.qc index f7e9186a..7b1b4c9d 100644 --- a/src/gs-entbase/server/monster_furniture.qc +++ b/src/gs-entbase/server/monster_furniture.qc @@ -58,7 +58,6 @@ monster_furniture::Respawn(void) void monster_furniture::monster_furniture(void) { - super::NSMonster(); spawnflags |= MSF_MULTIPLAYER; } diff --git a/src/gs-entbase/server/monster_generic.qc b/src/gs-entbase/server/monster_generic.qc index 3562991e..09743968 100644 --- a/src/gs-entbase/server/monster_generic.qc +++ b/src/gs-entbase/server/monster_generic.qc @@ -64,5 +64,4 @@ monster_generic::monster_generic(void) base_health = 100; spawnflags |= MSF_MULTIPLAYER; - super::NSTalkMonster(); } diff --git a/src/gs-entbase/server/monstermaker.qc b/src/gs-entbase/server/monstermaker.qc index 3e194757..c9d56d04 100644 --- a/src/gs-entbase/server/monstermaker.qc +++ b/src/gs-entbase/server/monstermaker.qc @@ -271,5 +271,4 @@ void monstermaker::monstermaker(void) { m_flDelay = 1.0f; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/multi_manager.qc b/src/gs-entbase/server/multi_manager.qc index dc37a4ed..efa0ba88 100644 --- a/src/gs-entbase/server/multi_manager.qc +++ b/src/gs-entbase/server/multi_manager.qc @@ -78,7 +78,9 @@ multi_manager_sub::Restore(string strKey, string strValue) void multi_manager_sub::multi_manager_sub(void) { - super::NSPointTrigger(); + m_eActivator = __NULL__; + m_iValue = 0; + m_flUntilTriggered = 0.0f; } class multi_manager:NSPointTrigger @@ -88,6 +90,8 @@ class multi_manager:NSPointTrigger int m_iBusy; int m_iValue; + virtual void(void) Spawned; + /* overrides */ virtual void(entity, int) Trigger; virtual void(string, string) SpawnKey; @@ -251,6 +255,9 @@ multi_manager::SpawnKey(string strKey, string strValue) case "spawnflags": case "angle": case "angles": + case "target": + case "spawnflags": + super::SpawnKey(strKey, strValue); break; default: if (substring(strKey, strlen(strKey) - 3, 1) == "#") { @@ -272,13 +279,12 @@ multi_manager::SpawnKey(string strKey, string strValue) } void -multi_manager::multi_manager(void) +multi_manager::Spawned(void) { int iFields; int b; - m_strBuffer = ""; - super::NSPointTrigger(); + super::Spawned(); for (b = 0; b < 16; b++) { m_eTriggers[b] = spawn(multi_manager_sub); @@ -304,3 +310,14 @@ multi_manager::multi_manager(void) } } } + +void +multi_manager::multi_manager(void) +{ + for (int i = 0; i < 16; i++) + m_eTriggers[i] = __NULL__; + + m_strBuffer = __NULL__; + m_iBusy = + m_iValue = 0; +} diff --git a/src/gs-entbase/server/multisource.qc b/src/gs-entbase/server/multisource.qc index 7a1d3037..ef57c5d8 100644 --- a/src/gs-entbase/server/multisource.qc +++ b/src/gs-entbase/server/multisource.qc @@ -143,5 +143,4 @@ void multisource::multisource(void) { m_strGlobalState = __NULL__; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/path_corner.qc b/src/gs-entbase/server/path_corner.qc index fec55007..a74a6a52 100644 --- a/src/gs-entbase/server/path_corner.qc +++ b/src/gs-entbase/server/path_corner.qc @@ -146,5 +146,4 @@ path_corner::path_corner(void) { m_flWait = 1.0f; m_flSpeed = 100.0f; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/player_loadsaved.qc b/src/gs-entbase/server/player_loadsaved.qc index b6fa2dec..03966bb9 100644 --- a/src/gs-entbase/server/player_loadsaved.qc +++ b/src/gs-entbase/server/player_loadsaved.qc @@ -140,5 +140,4 @@ player_loadsaved::SpawnKey(string strKey, string strValue) void player_loadsaved::player_loadsaved(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/player_weaponstrip.qc b/src/gs-entbase/server/player_weaponstrip.qc index 9bed1406..18b075e6 100644 --- a/src/gs-entbase/server/player_weaponstrip.qc +++ b/src/gs-entbase/server/player_weaponstrip.qc @@ -51,5 +51,4 @@ player_weaponstrip::Trigger(entity act, int unused) void player_weaponstrip::player_weaponstrip(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/point_camera.qc b/src/gs-entbase/server/point_camera.qc index 1566c72b..4185fab9 100644 --- a/src/gs-entbase/server/point_camera.qc +++ b/src/gs-entbase/server/point_camera.qc @@ -166,6 +166,4 @@ void point_camera::point_camera(void) { m_flFOV = 90; - - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/prop_door_rotating.qc b/src/gs-entbase/server/prop_door_rotating.qc index 1b11cd98..68ad424b 100644 --- a/src/gs-entbase/server/prop_door_rotating.qc +++ b/src/gs-entbase/server/prop_door_rotating.qc @@ -164,5 +164,4 @@ prop_door_rotating::prop_door_rotating(void) { m_flDistance = 90; m_flSpeed = 100; - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/prop_dynamic.qc b/src/gs-entbase/server/prop_dynamic.qc index 78db8c5f..10bfbe91 100644 --- a/src/gs-entbase/server/prop_dynamic.qc +++ b/src/gs-entbase/server/prop_dynamic.qc @@ -74,5 +74,4 @@ prop_dynamic::SpawnKey(string strKey, string strValue) void prop_dynamic::prop_dynamic(void) { - super::NSSurfacePropEntity(); } diff --git a/src/gs-entbase/server/prop_physics.qc b/src/gs-entbase/server/prop_physics.qc index 81723c93..0a632f24 100644 --- a/src/gs-entbase/server/prop_physics.qc +++ b/src/gs-entbase/server/prop_physics.qc @@ -56,7 +56,6 @@ prop_physics::SpawnKey(string strKey, string strValue) void prop_physics::prop_physics(void) { - super::NSPhysicsEntity(); } #else class prop_physics:NSRenderableEntity @@ -75,6 +74,5 @@ prop_physics::Respawn(void) void prop_physics::prop_physics(void) { - super::NSRenderableEntity(); } #endif diff --git a/src/gs-entbase/server/prop_static.qc b/src/gs-entbase/server/prop_static.qc index 44a987c2..aa2ae486 100644 --- a/src/gs-entbase/server/prop_static.qc +++ b/src/gs-entbase/server/prop_static.qc @@ -48,17 +48,15 @@ class prop_static:NSRenderableEntity void prop_static::Respawn(void) { - //super::Respawn(); - solid = SOLID_NOT; - setmodel(this, GetSpawnModel()); + SetSolid(SOLID_NOT); + SetModel(GetSpawnModel()); mins = [0,0,0]; maxs = [0,0,0]; - setsize(this, mins, maxs); - setorigin(this, GetSpawnOrigin()); + SetSize(mins, maxs); + SetOrigin(GetSpawnOrigin()); } void prop_static::prop_static(void) { - super::NSRenderableEntity(); } diff --git a/src/gs-entbase/server/random_speaker.qc b/src/gs-entbase/server/random_speaker.qc index eef4d5e9..ad9f34e2 100644 --- a/src/gs-entbase/server/random_speaker.qc +++ b/src/gs-entbase/server/random_speaker.qc @@ -184,5 +184,8 @@ random_speaker::SpawnKey(string strKey, string strValue) void random_speaker::random_speaker(void) { - super::NSPointTrigger(); + m_strSample = __NULL__; + m_flVolume = 1.0f; + m_flMinPos = 0.0f; + m_flRandPercent = 0.0f; } diff --git a/src/gs-entbase/server/random_trigger.qc b/src/gs-entbase/server/random_trigger.qc index 414002a4..aaf1aec5 100644 --- a/src/gs-entbase/server/random_trigger.qc +++ b/src/gs-entbase/server/random_trigger.qc @@ -121,5 +121,4 @@ random_trigger::SpawnKey(string strKey, string strValue) void random_trigger::random_trigger(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/scripted_sentence.qc b/src/gs-entbase/server/scripted_sentence.qc index 7fcc6259..986037bd 100644 --- a/src/gs-entbase/server/scripted_sentence.qc +++ b/src/gs-entbase/server/scripted_sentence.qc @@ -155,5 +155,4 @@ scripted_sentence::SpawnKey(string strKey, string strValue) void scripted_sentence::scripted_sentence(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/scripted_sequence.qc b/src/gs-entbase/server/scripted_sequence.qc index 2fd4964d..a02483c1 100644 --- a/src/gs-entbase/server/scripted_sequence.qc +++ b/src/gs-entbase/server/scripted_sequence.qc @@ -386,7 +386,6 @@ scripted_sequence::SpawnKey(string strKey, string strValue) void scripted_sequence::scripted_sequence(void) { - super::NSPointTrigger(); } CLASSEXPORT(aiscripted_sequence, scripted_sequence) diff --git a/src/gs-entbase/server/speaker.qc b/src/gs-entbase/server/speaker.qc index a9d7bc99..18765f13 100644 --- a/src/gs-entbase/server/speaker.qc +++ b/src/gs-entbase/server/speaker.qc @@ -172,5 +172,6 @@ speaker::SpawnKey(string strKey, string strValue) void speaker::speaker(void) { - super::NSTalkMonster(); + m_strSentence = __NULL__; + m_flVolume = 1.0f; } diff --git a/src/gs-entbase/server/stubs.qc b/src/gs-entbase/server/stubs.qc index e1b986b5..83da8743 100644 --- a/src/gs-entbase/server/stubs.qc +++ b/src/gs-entbase/server/stubs.qc @@ -80,6 +80,12 @@ CLASSEXPORT(env_sound, info_notnull) CLASSEXPORT(env_sun, info_notnull) CLASSEXPORT(info_intermission, info_notnull) +CLASSEXPORT(prop_static, info_null) +CLASSEXPORT(func_dustmotes, info_null) +CLASSEXPORT(env_soundscape, info_null) +CLASSEXPORT(env_cubemap, info_null) +CLASSEXPORT(sky_camera, info_null) + void env_glow(void) { diff --git a/src/gs-entbase/server/targ_speaker.qc b/src/gs-entbase/server/targ_speaker.qc index 402989a2..0592e402 100644 --- a/src/gs-entbase/server/targ_speaker.qc +++ b/src/gs-entbase/server/targ_speaker.qc @@ -103,5 +103,4 @@ targ_speaker::Respawn(void) void targ_speaker::targ_speaker(void) { - super::NSPointTrigger(); } diff --git a/src/gs-entbase/server/target_cdaudio.qc b/src/gs-entbase/server/target_cdaudio.qc index 321ad39b..11008373 100644 --- a/src/gs-entbase/server/target_cdaudio.qc +++ b/src/gs-entbase/server/target_cdaudio.qc @@ -112,5 +112,6 @@ target_cdaudio::SpawnKey(string strKey, string strValue) void target_cdaudio::target_cdaudio(void) { - super::NSPointTrigger(); + m_flRadius = 0.0f; + m_iCDTrack = 0; } diff --git a/src/gs-entbase/server/trigger_auto.qc b/src/gs-entbase/server/trigger_auto.qc index e642c047..4a8a27de 100644 --- a/src/gs-entbase/server/trigger_auto.qc +++ b/src/gs-entbase/server/trigger_auto.qc @@ -87,6 +87,7 @@ trigger_auto::Processing(void) return; UseTargets(this, m_iTriggerState, m_flDelay); + print(sprintf("%S %i %f\n", target, m_iTriggerState, m_flDelay)); if (HasSpawnFlags(1)) { NSLog("^2trigger_auto::^3think^7: %s triggerer removed self", target); @@ -97,6 +98,8 @@ trigger_auto::Processing(void) void trigger_auto::Respawn(void) { + InitPointTrigger(); + think = Processing; nextthink = time + 0.2f; } @@ -111,6 +114,9 @@ trigger_auto::SpawnKey(string strKey, string strValue) case "triggerstate": m_iTriggerState = stoi(strValue); break; + case "delay": + m_flDelay = stof(strValue); + break; default: super::SpawnKey(strKey, strValue); } @@ -121,6 +127,6 @@ trigger_auto::trigger_auto(void) { /* default is always toggle */ m_iTriggerState = TRIG_TOGGLE; - - super::NSPointTrigger(); + m_strGlobalState = __NULL__; + m_flDelay = 0.0f; } diff --git a/src/gs-entbase/server/trigger_autosave.qc b/src/gs-entbase/server/trigger_autosave.qc index 4ec08586..7d8b7269 100644 --- a/src/gs-entbase/server/trigger_autosave.qc +++ b/src/gs-entbase/server/trigger_autosave.qc @@ -95,5 +95,5 @@ trigger_autosave::trigger_autosave(void) return; } - super::NSBrushTrigger(); + m_flDelay = 0.0f; } diff --git a/src/gs-entbase/server/trigger_cdaudio.qc b/src/gs-entbase/server/trigger_cdaudio.qc index 2d86ef27..3fe11406 100644 --- a/src/gs-entbase/server/trigger_cdaudio.qc +++ b/src/gs-entbase/server/trigger_cdaudio.qc @@ -105,5 +105,5 @@ trigger_cdaudio::SpawnKey(string strKey, string strValue) void trigger_cdaudio::trigger_cdaudio(void) { - super::NSBrushTrigger(); + m_iCDTrack = 0; } diff --git a/src/gs-entbase/server/trigger_changelevel.qc b/src/gs-entbase/server/trigger_changelevel.qc index aa12f47c..7e417cad 100644 --- a/src/gs-entbase/server/trigger_changelevel.qc +++ b/src/gs-entbase/server/trigger_changelevel.qc @@ -81,6 +81,7 @@ class trigger_changelevel:NSBrushTrigger void(void) trigger_changelevel; /* overrides */ + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity, int) Trigger; @@ -267,16 +268,20 @@ trigger_changelevel::SpawnKey(string strKey, string strValue) } void -trigger_changelevel::trigger_changelevel(void) +trigger_changelevel::Spawned(void) { - m_strChangeTarget = __NULL__; - - super::NSBrushTrigger(); + super::Spawned(); if (m_strOnLevelChange) m_strOnLevelChange = CreateOutput(m_strOnLevelChange); } +void +trigger_changelevel::trigger_changelevel(void) +{ + m_strChangeTarget = __NULL__; +} + vector Landmark_GetSpot(void) { diff --git a/src/gs-entbase/server/trigger_changetarget.qc b/src/gs-entbase/server/trigger_changetarget.qc index b3c49736..6e90ced0 100644 --- a/src/gs-entbase/server/trigger_changetarget.qc +++ b/src/gs-entbase/server/trigger_changetarget.qc @@ -90,5 +90,5 @@ trigger_changetarget::SpawnKey(string strKey, string strValue) void trigger_changetarget::trigger_changetarget(void) { - super::NSPointTrigger(); + m_strNewTarget = __NULL__; } diff --git a/src/gs-entbase/server/trigger_counter.qc b/src/gs-entbase/server/trigger_counter.qc index b5e2bcc3..47c84283 100644 --- a/src/gs-entbase/server/trigger_counter.qc +++ b/src/gs-entbase/server/trigger_counter.qc @@ -134,5 +134,6 @@ trigger_counter::SpawnKey(string strKey, string strValue) void trigger_counter::trigger_counter(void) { - super::NSBrushTrigger(); + m_iCounted = 0; + m_iMaxCount = 0; } diff --git a/src/gs-entbase/server/trigger_endsection.qc b/src/gs-entbase/server/trigger_endsection.qc index 810c9cc5..7c07dd33 100644 --- a/src/gs-entbase/server/trigger_endsection.qc +++ b/src/gs-entbase/server/trigger_endsection.qc @@ -51,5 +51,4 @@ trigger_endsection::Respawn(void) void trigger_endsection::trigger_endsection(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/trigger_hurt.qc b/src/gs-entbase/server/trigger_hurt.qc index e19a599d..119ae4d9 100644 --- a/src/gs-entbase/server/trigger_hurt.qc +++ b/src/gs-entbase/server/trigger_hurt.qc @@ -77,6 +77,7 @@ class trigger_hurt:NSBrushTrigger void(void) trigger_hurt; + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity, int) Trigger; @@ -262,13 +263,9 @@ trigger_hurt::SpawnKey(string strKey, string strValue) } void -trigger_hurt::trigger_hurt(void) +trigger_hurt::Spawned(void) { - /* defaults */ - m_iDamage = 15; - m_flNextDmg = 0.5f; - - super::NSBrushTrigger(); + super::Spawned(); if (m_strOnHurt) m_strOnHurt = CreateOutput(m_strOnHurt); @@ -276,3 +273,11 @@ trigger_hurt::trigger_hurt(void) if (m_strOnHurtPlayer) m_strOnHurtPlayer = CreateOutput(m_strOnHurtPlayer); } + +void +trigger_hurt::trigger_hurt(void) +{ + /* defaults */ + m_iDamage = 15; + m_flNextDmg = 0.5f; +} diff --git a/src/gs-entbase/server/trigger_look.qc b/src/gs-entbase/server/trigger_look.qc index c9d32ae0..bbc6d763 100644 --- a/src/gs-entbase/server/trigger_look.qc +++ b/src/gs-entbase/server/trigger_look.qc @@ -48,6 +48,7 @@ class trigger_look:NSBrushTrigger void(void) trigger_look; + virtual void(void) Spawned; virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity) Touch; @@ -177,13 +178,17 @@ trigger_look::SpawnKey(string strKey, string strValue) } void -trigger_look::trigger_look(void) +trigger_look::Spawned(void) { - m_flLookTime = 0.5f; - m_flFOV = 0.9f; - - super::NSBrushTrigger(); + super::Spawned(); if (m_strOnTrigger) m_strOnTrigger = CreateOutput(m_strOnTrigger); } + +void +trigger_look::trigger_look(void) +{ + m_flLookTime = 0.5f; + m_flFOV = 0.9f; +} diff --git a/src/gs-entbase/server/trigger_multiple.qc b/src/gs-entbase/server/trigger_multiple.qc index 7b98db17..d0aea378 100644 --- a/src/gs-entbase/server/trigger_multiple.qc +++ b/src/gs-entbase/server/trigger_multiple.qc @@ -55,6 +55,8 @@ class trigger_multiple:NSBrushTrigger void(void) trigger_multiple; + virtual void(void) Spawned; + virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity) Touch; @@ -135,12 +137,6 @@ trigger_multiple::Touch(entity eToucher) SetSolid(SOLID_NOT); } -void -trigger_multiple::Respawn(void) -{ - InitBrushTrigger(); -} - void trigger_multiple::SpawnKey(string strKey, string strValue) { @@ -164,9 +160,15 @@ trigger_multiple::SpawnKey(string strKey, string strValue) } void -trigger_multiple::trigger_multiple(void) +trigger_multiple::Respawn(void) { - super::NSBrushTrigger(); + InitBrushTrigger(); +} + +void +trigger_multiple::Spawned(void) +{ + super::Spawned(); if (m_strOnTrigger) m_strOnTrigger = CreateOutput(m_strOnTrigger); @@ -175,3 +177,14 @@ trigger_multiple::trigger_multiple(void) if (m_strOnEndTouchAll) m_strOnEndTouchAll = CreateOutput(m_strOnEndTouchAll); } + +void +trigger_multiple::trigger_multiple(void) +{ + m_flWait = 0.0f; + + /* Input/Output */ + m_strOnStartTouch = + m_strOnEndTouchAll = + m_strOnTrigger = __NULL__; +} diff --git a/src/gs-entbase/server/trigger_once.qc b/src/gs-entbase/server/trigger_once.qc index 0665f989..cf711163 100644 --- a/src/gs-entbase/server/trigger_once.qc +++ b/src/gs-entbase/server/trigger_once.qc @@ -47,6 +47,8 @@ class trigger_once:NSBrushTrigger void(void) trigger_once; + virtual void(void) Spawned; + virtual void(float) Save; virtual void(string, string) Restore; virtual void(entity) Touch; @@ -125,9 +127,9 @@ trigger_once::SpawnKey(string strKey, string strValue) } void -trigger_once::trigger_once(void) +trigger_once::Spawned(void) { - super::NSBrushTrigger(); + super::Spawned(); if (m_strOnTrigger) m_strOnTrigger = CreateOutput(m_strOnTrigger); @@ -135,3 +137,10 @@ trigger_once::trigger_once(void) if (m_strOnStartTouch) m_strOnStartTouch = CreateOutput(m_strOnStartTouch); } + +void +trigger_once::trigger_once(void) +{ + m_strOnStartTouch = + m_strOnTrigger = __NULL__; +} diff --git a/src/gs-entbase/server/trigger_playerfreeze.qc b/src/gs-entbase/server/trigger_playerfreeze.qc index 4b4bf627..dcacc6c7 100644 --- a/src/gs-entbase/server/trigger_playerfreeze.qc +++ b/src/gs-entbase/server/trigger_playerfreeze.qc @@ -82,5 +82,4 @@ trigger_playerfreeze::Respawn(void) void trigger_playerfreeze::trigger_playerfreeze(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/trigger_push.qc b/src/gs-entbase/server/trigger_push.qc index e3baff0d..8a830522 100644 --- a/src/gs-entbase/server/trigger_push.qc +++ b/src/gs-entbase/server/trigger_push.qc @@ -165,6 +165,6 @@ trigger_push::SpawnKey(string strKey, string strValue) void trigger_push::trigger_push(void) { + m_vecMoveDir = [0,0,0]; m_flSpeed = 100; - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/trigger_relay.qc b/src/gs-entbase/server/trigger_relay.qc index f69b45a2..8e5eceb2 100644 --- a/src/gs-entbase/server/trigger_relay.qc +++ b/src/gs-entbase/server/trigger_relay.qc @@ -104,5 +104,6 @@ trigger_relay::SpawnKey(string strKey, string strValue) void trigger_relay::trigger_relay(void) { - super::NSPointTrigger(); + m_iTriggerState = + m_iEnabled = 0; } diff --git a/src/gs-entbase/server/trigger_teleport.qc b/src/gs-entbase/server/trigger_teleport.qc index 5c208e74..2ddf1b9d 100644 --- a/src/gs-entbase/server/trigger_teleport.qc +++ b/src/gs-entbase/server/trigger_teleport.qc @@ -75,7 +75,6 @@ trigger_teleport::Respawn(void) void trigger_teleport::trigger_teleport(void) { - super::NSBrushTrigger(); } /*QUAKED info_teleport_destination (1 0 0) (-8 -8 -8) (8 8 8) diff --git a/src/gs-entbase/server/trigger_transition.qc b/src/gs-entbase/server/trigger_transition.qc index 11106462..b583af02 100644 --- a/src/gs-entbase/server/trigger_transition.qc +++ b/src/gs-entbase/server/trigger_transition.qc @@ -41,5 +41,4 @@ trigger_transition::Respawn(void) void trigger_transition::trigger_transition(void) { - super::NSBrushTrigger(); } diff --git a/src/gs-entbase/shared/NSBrushTrigger.qc b/src/gs-entbase/shared/NSBrushTrigger.qc index 24587051..69ec9090 100644 --- a/src/gs-entbase/shared/NSBrushTrigger.qc +++ b/src/gs-entbase/shared/NSBrushTrigger.qc @@ -27,5 +27,4 @@ NSBrushTrigger::InitBrushTrigger(void) void NSBrushTrigger::NSBrushTrigger(void) { - super::NSEntity(); } \ No newline at end of file diff --git a/src/gs-entbase/shared/NSEntity.h b/src/gs-entbase/shared/NSEntity.h index 6227e627..ccb1b255 100644 --- a/src/gs-entbase/shared/NSEntity.h +++ b/src/gs-entbase/shared/NSEntity.h @@ -53,6 +53,7 @@ class NSEntity:NSTrigger vector m_oldOrigin; vector m_oldAngle; string m_oldModel; + float m_oldSolid; /* keep track of these variables */ PREDICTED_VECTOR_N(origin); @@ -70,6 +71,8 @@ class NSEntity:NSTrigger bool m_beingTouched; entity m_eTouchLast; + virtual void(void) Spawned; + #ifdef CLIENT virtual void(float,float) ReceiveEntity; virtual void(void) postdraw; @@ -87,9 +90,6 @@ class NSEntity:NSTrigger #endif #ifdef SERVER - /* respawn */ - float m_oldSolid; - string m_parent; string m_parent_attachment; diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index f6c71612..ddea7ad4 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -1010,6 +1010,28 @@ NSEntity::Destroy(void) nextthink = time; }; +void +NSEntity::Spawned(void) +{ + super::Spawned(); + + m_oldAngle = angles; + m_oldOrigin = origin; + m_oldModel = Util_FixModel(model); + m_oldSolid = solid; + +#ifdef SERVER + m_oldstrTarget = target; + + if (m_oldModel) { + precache_model(GetSpawnModel()); + } + + if (m_strOnTrigger) + m_strOnTrigger = CreateOutput(m_strOnTrigger); +#endif +} + /* ============ NSEntity::NSEntity @@ -1021,32 +1043,12 @@ void NSEntity::NSEntity(void) { #ifdef SERVER - /* don't call this function more than once per entity */ - if (identity == 1) - return; - identity = 1; /* .identity is a global ent field we abuse to let find() calls reliably know that those are NSEntity class-based */ - super::NSTrigger(); - - m_oldSolid = solid; blocked = BlockedHandler; touch = TouchHandler; - - /* Input/Output system */ - m_strOnTrigger = CreateOutput(m_strOnTrigger); - - m_oldstrTarget = target; - - if (m_oldModel != "") { - precache_model(GetSpawnModel()); - } #else isCSQC = 1; #endif - - m_oldAngle = angles; - m_oldOrigin = origin; - m_oldModel = Util_FixModel(model); } diff --git a/src/gs-entbase/shared/NSIO.h b/src/gs-entbase/shared/NSIO.h index 1ce5615c..34554d37 100644 --- a/src/gs-entbase/shared/NSIO.h +++ b/src/gs-entbase/shared/NSIO.h @@ -27,8 +27,11 @@ class NSIO void(void) NSIO; virtual void(void) Init; - virtual void(void) Initialized; - + virtual void(void) Spawned; + + /* whenever gamerules want entities to respawn */ + virtual void(void) Respawn; + /* Handle entity key/value pairs on init */ virtual void(string, string) SpawnKey; @@ -45,9 +48,6 @@ class NSIO nonvirtual string(string, string) PrepareOutput; nonvirtual string(string) CreateOutput; - /* whenever gamerules want entities to respawn */ - virtual void(void) Respawn; - virtual void(float) Save; virtual void(string,string) Restore; @@ -68,4 +68,4 @@ class NSIO /* Handle incoming entities input messaging */ virtual void(entity, string, string) Input; #endif -}; \ No newline at end of file +}; diff --git a/src/gs-entbase/shared/NSIO.qc b/src/gs-entbase/shared/NSIO.qc index 16a6a7ad..8af42cf2 100644 --- a/src/gs-entbase/shared/NSIO.qc +++ b/src/gs-entbase/shared/NSIO.qc @@ -14,6 +14,12 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +void +NSIO::Respawn(void) +{ + // Respawn code goes here... +} + #ifdef CLIENT string __fullspawndata; #endif @@ -21,11 +27,7 @@ string __fullspawndata; void NSIO::Init(void) { -#ifdef CLIENT - isCSQC = TRUE; - effects |= EF_NOSHADOW; -#endif - + /* annoylingly our starting offsets differ */ #ifdef CLIENT for (int i = 0; i < (tokenize(__fullspawndata) - 1); i += 2) SpawnKey(argv(i), argv(i+1)); @@ -40,12 +42,22 @@ NSIO::Init(void) inherit stuff from the last previously loaded entity */ __fullspawndata = ""; #endif - Initialized(); + Spawned(); } void -NSIO::Initialized(void) +NSIO::Spawned(void) { +#ifdef SERVER + if (m_strOnUser1) + m_strOnUser1 = CreateOutput(m_strOnUser1); + if (m_strOnUser2) + m_strOnUser2 = CreateOutput(m_strOnUser2); + if (m_strOnUser3) + m_strOnUser3 = CreateOutput(m_strOnUser3); + if (m_strOnUser4) + m_strOnUser4 = CreateOutput(m_strOnUser4); +#endif } #ifdef SERVER @@ -80,10 +92,10 @@ NSIO::CreateOutput(string outmsg) string outname = ""; float c; - if (!outmsg) - return (""); + if not (outmsg) + error("Cannot assign EMPTY contents to CreateOutput!"); - outname = sprintf("output_%i\n", outcount); + outname = sprintf("output_%i", outcount); outcount++; /* to make sure tokenize 'remembers' to tell us about the commonly @@ -153,12 +165,6 @@ NSIO::Input(entity eAct, string strInput, string strData) } } -void -NSIO::Respawn(void) -{ - // Respawn code goes here... -} - void NSIO::SaveBool(float handle, string key, bool value) { @@ -289,7 +295,6 @@ NSIO::SpawnKey(string strKey, string strValue) /* we do re-read a lot of the builtin fields in case we want to set defaults. just in case anybody is wondering. */ switch (strKey) { - case "zhlt_lightflags": case "classname": case "spawnflags": break; @@ -333,12 +338,17 @@ NSIO::NSIO(void) } } - Init(); - - /* assign our onuser crap */ - m_strOnUser1 = CreateOutput(m_strOnUser1); - m_strOnUser2 = CreateOutput(m_strOnUser2); - m_strOnUser3 = CreateOutput(m_strOnUser3); - m_strOnUser4 = CreateOutput(m_strOnUser4); + /* null all of them */ + m_strOnTrigger = + m_strOnUser1 = + m_strOnUser2 = + m_strOnUser3 = + m_strOnUser4 = __NULL__; +#else + isCSQC = TRUE; + effects |= EF_NOSHADOW; #endif + + /* called last */ + Init(); } diff --git a/src/gs-entbase/shared/NSMonster.qc b/src/gs-entbase/shared/NSMonster.qc index cebeaf76..71828968 100644 --- a/src/gs-entbase/shared/NSMonster.qc +++ b/src/gs-entbase/shared/NSMonster.qc @@ -586,7 +586,8 @@ NSMonster::NewRoute(vector destination) void NSMonster::AnimationUpdate(void) { - int frame, act; + int fr = 0; + int act = 0; if (style == MONSTER_DEAD) return; @@ -595,34 +596,34 @@ NSMonster::AnimationUpdate(void) float midspeed = GetWalkSpeed() + ((GetRunSpeed() - GetWalkSpeed()) * 0.5f); if (spvel < 5) { - frame = AnimIdle(); + fr = AnimIdle(); if (m_iMoveState != MOVESTATE_IDLE) m_flAnimTime = 0.0f; - if (frame == -1) + if (fr == -1) act = (frameforaction(modelindex, ACT_IDLE)); m_iMoveState = MOVESTATE_IDLE; } else if (spvel < midspeed) { - frame = AnimWalk(); + fr = AnimWalk(); if (m_iMoveState != MOVESTATE_WALK) m_flAnimTime = 0.0f; - if (frame == -1) + if (fr == -1) act = (frameforaction(modelindex, ACT_WALK)); m_iMoveState = MOVESTATE_WALK; } else { - frame = AnimRun(); + fr = AnimRun(); if (m_iMoveState != MOVESTATE_RUN) m_flAnimTime = 0.0f; - if (frame == -1) + if (fr == -1) act = (frameforaction(modelindex, ACT_RUN)); m_iMoveState = MOVESTATE_RUN; @@ -632,10 +633,10 @@ NSMonster::AnimationUpdate(void) return; } - if (frame == -1) + if (fr == -1) AnimPlay(act); else - SetFrame(frame); + SetFrame(fr); } @@ -1068,8 +1069,6 @@ NSMonster::NSMonster(void) return; } #endif - - super::NSSurfacePropEntity(); } #ifdef CLIENT diff --git a/src/gs-entbase/shared/NSPhysicsEntity.qc b/src/gs-entbase/shared/NSPhysicsEntity.qc index afff4fe8..ace6fe8f 100644 --- a/src/gs-entbase/shared/NSPhysicsEntity.qc +++ b/src/gs-entbase/shared/NSPhysicsEntity.qc @@ -716,7 +716,6 @@ NSPhysicsEntity::NSPhysicsEntity(void) { mass = 1.0f; m_flInertiaScale = 1.0f; - super::NSSurfacePropEntity(); cvar_set("physics_ode_iterationsperframe", "1"); cvar_set("physics_ode_movelimit", "0.1"); diff --git a/src/gs-entbase/shared/NSPointTrigger.qc b/src/gs-entbase/shared/NSPointTrigger.qc index 4797c1d1..fdfa44f2 100644 --- a/src/gs-entbase/shared/NSPointTrigger.qc +++ b/src/gs-entbase/shared/NSPointTrigger.qc @@ -25,5 +25,4 @@ NSPointTrigger::InitPointTrigger(void) void NSPointTrigger::NSPointTrigger(void) { - super::NSEntity(); } \ No newline at end of file diff --git a/src/gs-entbase/shared/NSProjectile.qc b/src/gs-entbase/shared/NSProjectile.qc index 95366cd3..a2244e24 100644 --- a/src/gs-entbase/shared/NSProjectile.qc +++ b/src/gs-entbase/shared/NSProjectile.qc @@ -61,7 +61,6 @@ NSProjectile::Animate(int startframe, int endframe, float framerate) void NSProjectile::NSProjectile(void) { - super::NSSurfacePropEntity(); touch = ProjectileTouch; SetMovetype(MOVETYPE_FLY); diff --git a/src/gs-entbase/shared/NSRenderableEntity.qc b/src/gs-entbase/shared/NSRenderableEntity.qc index db692f23..8fa103b9 100644 --- a/src/gs-entbase/shared/NSRenderableEntity.qc +++ b/src/gs-entbase/shared/NSRenderableEntity.qc @@ -934,8 +934,6 @@ NSRenderableEntity::NSRenderableEntity(void) effects |= EF_NOSHADOW; //scale = 1.0f; - super::NSEntity(); - #ifdef SERVER #ifdef GS_RENDERFX m_oldiRenderFX = m_iRenderFX; @@ -945,6 +943,8 @@ NSRenderableEntity::NSRenderableEntity(void) m_oldvecRenderColor = m_vecRenderColor; m_oldflRenderAmt = m_flRenderAmt; #endif +#else + drawmask = MASK_ENGINE; #endif } diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.h b/src/gs-entbase/shared/NSSurfacePropEntity.h index 8941fb09..c52eb7b6 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.h +++ b/src/gs-entbase/shared/NSSurfacePropEntity.h @@ -44,6 +44,8 @@ class NSSurfacePropEntity:NSRenderableEntity void(void) NSSurfacePropEntity; + virtual void(void) Spawned; + /* overrides */ virtual void(string) SetModel; #ifdef SERVER diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.qc b/src/gs-entbase/shared/NSSurfacePropEntity.qc index bea61512..92da51c4 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.qc +++ b/src/gs-entbase/shared/NSSurfacePropEntity.qc @@ -14,6 +14,22 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +void +NSSurfacePropEntity::Spawned(void) +{ + super::Spawned(); + +#ifdef SERVER + /* tokenization complete, now we can load propdata */ + SurfaceDataFinish(); + PropDataFinish(); + + /* Input/Output system */ + if (m_strOnBreak) + m_strOnBreak = CreateOutput(m_strOnBreak); +#endif +} + /* networking */ #ifdef SERVER void @@ -577,6 +593,9 @@ NSSurfacePropEntity::Pain(void) void NSSurfacePropEntity::Death(void) { + print(sprintf("%S", m_strOnBreak)); + print("\n"); + UseOutput(g_dmg_eAttacker, m_strOnBreak); if (HasPropData() == false) @@ -680,15 +699,7 @@ NSSurfacePropEntity::NSSurfacePropEntity(void) m_iPropData = -1; m_iMaterial = -1; max_health = 100; - - super::NSRenderableEntity(); - - /* tokenization complete, now we can load propdata */ - SurfaceDataFinish(); - PropDataFinish(); - - /* Input/Output system */ - m_strOnBreak = CreateOutput(m_strOnBreak); + m_strOnBreak = __NULL__; #endif } diff --git a/src/gs-entbase/shared/NSTalkMonster.qc b/src/gs-entbase/shared/NSTalkMonster.qc index 9f2f55df..7391ca5f 100644 --- a/src/gs-entbase/shared/NSTalkMonster.qc +++ b/src/gs-entbase/shared/NSTalkMonster.qc @@ -454,7 +454,6 @@ NSTalkMonster::FollowChain(void) void NSTalkMonster::Physics(void) { - float spvel; input_movevalues = [0,0,0]; input_impulse = 0; input_buttons = 0; @@ -924,7 +923,6 @@ NSTalkMonster_ParseSentence(void) void NSTalkMonster::NSTalkMonster(void) { - super::NSMonster(); #ifdef SERVER m_eFollowing = world; #endif diff --git a/src/gs-entbase/shared/NSTrigger.qc b/src/gs-entbase/shared/NSTrigger.qc index 88f436cd..c6bb4d28 100644 --- a/src/gs-entbase/shared/NSTrigger.qc +++ b/src/gs-entbase/shared/NSTrigger.qc @@ -172,6 +172,9 @@ NSTrigger::SpawnKey(string strKey, string strValue) case "target": target = strValue; break; + case "targetname": + targetname = strValue; + break; #ifdef SERVER case "killtarget": m_strKillTarget = strValue; @@ -198,5 +201,4 @@ NSTrigger::SpawnKey(string strKey, string strValue) void NSTrigger::NSTrigger(void) { - super::NSIO(); } diff --git a/src/gs-entbase/shared/NSVehicle.qc b/src/gs-entbase/shared/NSVehicle.qc index c49e0c9d..12393cd3 100644 --- a/src/gs-entbase/shared/NSVehicle.qc +++ b/src/gs-entbase/shared/NSVehicle.qc @@ -403,7 +403,6 @@ void NSVehicle::NSVehicle(void) { m_eDriver = __NULL__; - super::NSSurfacePropEntity(); } #ifdef CLIENT diff --git a/src/gs-entbase/shared/ambient_generic.qc b/src/gs-entbase/shared/ambient_generic.qc index e2f5bcb6..e8a8e8ec 100644 --- a/src/gs-entbase/shared/ambient_generic.qc +++ b/src/gs-entbase/shared/ambient_generic.qc @@ -78,6 +78,7 @@ class ambient_generic:NSTalkMonster void(void) ambient_generic; /* overrides */ + virtual void(void) Spawned; #ifdef SERVER virtual void(float) Save; virtual void(string, string) Restore; @@ -386,10 +387,15 @@ ambient_generic::SpawnKey(string strKey, string strValue) } } +void +ambient_generic::Spawned(void) +{ + precache_sound("common/null.wav"); +} + void ambient_generic::ambient_generic(void) { - super::NSTalkMonster(); } #ifdef CLIENT diff --git a/src/gs-entbase/shared/env_bubbles.qc b/src/gs-entbase/shared/env_bubbles.qc index 19c2ea8b..386f64eb 100644 --- a/src/gs-entbase/shared/env_bubbles.qc +++ b/src/gs-entbase/shared/env_bubbles.qc @@ -342,10 +342,15 @@ env_bubbles::Respawn(void) m_bEnabled = true; } +void +env_bubbles::Spawned(void) +{ + precache_model("sprites/bubble.spr"); +} + void env_bubbles::env_bubbles(void) { - super::NSPointTrigger(); } #ifdef CLIENT @@ -358,4 +363,4 @@ env_bubbles_ReadEntity(float new) } me.ReceiveEntity(new, readfloat()); } -#endif \ No newline at end of file +#endif diff --git a/src/gs-entbase/shared/env_fog_controller.qc b/src/gs-entbase/shared/env_fog_controller.qc index f35ec019..2f159a1a 100644 --- a/src/gs-entbase/shared/env_fog_controller.qc +++ b/src/gs-entbase/shared/env_fog_controller.qc @@ -524,7 +524,6 @@ env_fog_controller::env_fog_controller(void) #ifdef SERVER m_vecSpawnColor = [1.0, 1.0, 1.0]; m_flSpawnMaxDensity = 1.0f; - super::NSPointTrigger(); #endif } diff --git a/src/gs-entbase/shared/env_projectedtexture.qc b/src/gs-entbase/shared/env_projectedtexture.qc index 7f1546b8..8cbb2e88 100644 --- a/src/gs-entbase/shared/env_projectedtexture.qc +++ b/src/gs-entbase/shared/env_projectedtexture.qc @@ -323,9 +323,7 @@ env_projectedtexture::Respawn(void) void env_projectedtexture::env_projectedtexture(void) { -#ifdef CLIENT - drawmask = MASK_ENGINE; -#else +#ifndef CLIENT m_strPattern = "z"; m_vecLight = [255,255,255]; m_flIntensity = 512; @@ -334,8 +332,6 @@ env_projectedtexture::env_projectedtexture(void) m_strTextureName = "textures/flashlight"; m_flFOV = 90; - super::NSPointTrigger(); - if (m_flStyle > 0 && m_flStyle < 12) m_strPattern = getlightstyle(m_flStyle); #endif diff --git a/src/gs-entbase/shared/func_friction.qc b/src/gs-entbase/shared/func_friction.qc index 387f57d4..b99cba18 100644 --- a/src/gs-entbase/shared/func_friction.qc +++ b/src/gs-entbase/shared/func_friction.qc @@ -39,10 +39,6 @@ class func_friction:NSEntity virtual void(entity) Touch; virtual void(void) Respawn; virtual void(string, string) SpawnKey; - -#ifdef CLIENT - virtual void(void) Initialized; -#endif }; void @@ -76,18 +72,7 @@ func_friction::SpawnKey(string strField, string strKey) } } -#ifdef CLIENT -void -func_friction::Initialized(void) -{ - setmodel(this, model); - movetype = MOVETYPE_NONE; - solid = SOLID_BSPTRIGGER; -} -#endif - void func_friction::func_friction(void) { - super::NSEntity(); } diff --git a/src/gs-entbase/shared/func_illusionary.qc b/src/gs-entbase/shared/func_illusionary.qc index 17b98251..f18da357 100644 --- a/src/gs-entbase/shared/func_illusionary.qc +++ b/src/gs-entbase/shared/func_illusionary.qc @@ -137,9 +137,4 @@ func_illusionary::Init(void) void func_illusionary::func_illusionary(void) { -#ifdef CLIENT - Init(); -#else - super::NSRenderableEntity(); -#endif } diff --git a/src/gs-entbase/shared/func_ladder.qc b/src/gs-entbase/shared/func_ladder.qc index 73ab8dda..b8838cd0 100644 --- a/src/gs-entbase/shared/func_ladder.qc +++ b/src/gs-entbase/shared/func_ladder.qc @@ -129,9 +129,4 @@ func_ladder::Init(void) void func_ladder::func_ladder(void) { -#ifdef CLIENT - Init(); -#else - super::NSRenderableEntity(); -#endif } diff --git a/src/gs-entbase/shared/func_monitor.qc b/src/gs-entbase/shared/func_monitor.qc index fe19493e..527bb4d3 100644 --- a/src/gs-entbase/shared/func_monitor.qc +++ b/src/gs-entbase/shared/func_monitor.qc @@ -333,7 +333,5 @@ func_monitor::func_monitor(void) { #ifdef CLIENT drawmask = MASK_ENGINE; -#elif SERVER - super::NSRenderableEntity(); #endif } diff --git a/src/gs-entbase/shared/func_tankmortar.qc b/src/gs-entbase/shared/func_tankmortar.qc index 4c50cc38..40d5df18 100644 --- a/src/gs-entbase/shared/func_tankmortar.qc +++ b/src/gs-entbase/shared/func_tankmortar.qc @@ -83,6 +83,7 @@ class func_tankmortar:NSVehicle float m_flFireTime; void(void) func_tankmortar; + virtual void(void) Spawned; virtual void(void) PlayerInput; virtual void(vector) SpriteSmoke; virtual void(vector) SpriteFlash; @@ -433,12 +434,8 @@ func_tankmortar::SpawnKey(string strKey, string strValue) #endif void -func_tankmortar::func_tankmortar(void) +func_tankmortar::Spawned(void) { - m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; - - super::NSVehicle(); - #ifdef SERVER if (m_strSpriteFlash) precache_model(m_strSpriteFlash); @@ -447,6 +444,13 @@ func_tankmortar::func_tankmortar(void) #endif } +void +func_tankmortar::func_tankmortar(void) +{ + m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; + +} + #ifdef CLIENT void func_tankmortar_readentity(float isnew) diff --git a/src/gs-entbase/shared/func_wall.qc b/src/gs-entbase/shared/func_wall.qc index 7d0b2ed7..93602660 100644 --- a/src/gs-entbase/shared/func_wall.qc +++ b/src/gs-entbase/shared/func_wall.qc @@ -128,9 +128,4 @@ func_wall::Init(void) void func_wall::func_wall(void) { -#ifdef CLIENT - Init(); -#else - super::NSRenderableEntity(); -#endif } diff --git a/src/gs-entbase/shared/info_particle_system.qc b/src/gs-entbase/shared/info_particle_system.qc index 990220bb..bfbfa009 100644 --- a/src/gs-entbase/shared/info_particle_system.qc +++ b/src/gs-entbase/shared/info_particle_system.qc @@ -255,7 +255,5 @@ info_particle_system::info_particle_system(void) #ifdef CLIENT drawmask = MASK_ENGINE; think = Emit; -#elif SERVER - super::NSPointTrigger(); #endif } diff --git a/src/gs-entbase/shared/light_dynamic.qc b/src/gs-entbase/shared/light_dynamic.qc index ad4c0432..e2d28f60 100644 --- a/src/gs-entbase/shared/light_dynamic.qc +++ b/src/gs-entbase/shared/light_dynamic.qc @@ -88,7 +88,7 @@ class light_dynamic:NSPointTrigger #ifdef CLIENT virtual void(float,float) ReceiveEntity; virtual float(void) predraw; - virtual void(void) Initialized; + virtual void(void) Spawned; virtual void(void) RendererRestarted; #else @@ -185,7 +185,7 @@ light_dynamic::RendererRestarted(void) #endif } void -light_dynamic::Initialized(void) +light_dynamic::Spawned(void) { /* we're meant to be a server controlled entity. cancel out and kill us ASAP */ if (targetname) { @@ -383,9 +383,6 @@ light_dynamic::light_dynamic(void) #ifdef CLIENT drawmask = MASK_ENGINE; #else - - super::NSPointTrigger(); - /* the client-side will handle dlights without targetnames */ if (!targetname) { think = Util_Destroy; diff --git a/src/gs-entbase/shared/prop_physics_multiplayer.qc b/src/gs-entbase/shared/prop_physics_multiplayer.qc index a8257830..fdc35383 100644 --- a/src/gs-entbase/shared/prop_physics_multiplayer.qc +++ b/src/gs-entbase/shared/prop_physics_multiplayer.qc @@ -160,11 +160,6 @@ prop_physics_multiplayer::Init(void) void prop_physics_multiplayer::prop_physics_multiplayer(void) { -#ifdef CLIENT - Init(); -#else - super::NSPhysicsEntity(); -#endif } #else @@ -185,7 +180,6 @@ prop_physics_multiplayer::Respawn(void) void prop_physics_multiplayer::prop_physics_multiplayer(void) { - super::NSRenderableEntity(); } #endif #endif diff --git a/src/gs-entbase/shared/prop_rope.qc b/src/gs-entbase/shared/prop_rope.qc index c794b27d..0408ddb8 100644 --- a/src/gs-entbase/shared/prop_rope.qc +++ b/src/gs-entbase/shared/prop_rope.qc @@ -282,8 +282,6 @@ prop_rope::prop_rope(void) m_flSag = 15.0f; m_iSegments = 16; m_strShader = "textures/props/wire_default"; - - super::NSEntity(); #else /* this is empty for a good reason */ drawmask = MASK_ENGINE; diff --git a/src/gs-entbase/shared/prop_vehicle_driveable.qc b/src/gs-entbase/shared/prop_vehicle_driveable.qc index 2ca4a2cb..85798faa 100644 --- a/src/gs-entbase/shared/prop_vehicle_driveable.qc +++ b/src/gs-entbase/shared/prop_vehicle_driveable.qc @@ -102,6 +102,7 @@ class prop_vehicle_driveable:NSVehicle void(void) prop_vehicle_driveable; + virtual void(void) Spawned; virtual void(void) Physics; virtual void(void) RunVehiclePhysics; virtual void(void) WeaponInput; @@ -853,11 +854,18 @@ prop_vehicle_driveable::SendEntity(entity ePVSent, float flSendFlags) #endif void -prop_vehicle_driveable::prop_vehicle_driveable(void) +prop_vehicle_driveable::Spawned(void) { + super::Spawned(); + #ifdef SERVER Sound_Precache("prop_vehicle_driveable.bounce"); #endif +} + +void +prop_vehicle_driveable::prop_vehicle_driveable(void) +{ m_eDriver = __NULL__; m_flBounceFactor = 1.25f; m_flAcceleration = 600.0f; @@ -892,8 +900,6 @@ prop_vehicle_driveable::prop_vehicle_driveable(void) m_wlFL.owner = m_wlFR.owner = \ m_wlBL.owner = m_wlBR.owner = this; - super::NSVehicle(); - customphysics = Physics; } diff --git a/src/gs-entbase/shared/trigger_camera.qc b/src/gs-entbase/shared/trigger_camera.qc index c7ae4032..d426db04 100644 --- a/src/gs-entbase/shared/trigger_camera.qc +++ b/src/gs-entbase/shared/trigger_camera.qc @@ -273,10 +273,7 @@ trigger_camera::SpawnKey(string strKey, string strValue) void trigger_camera::trigger_camera(void) { -#ifdef CLIENT - drawmask = MASK_ENGINE; -#else +#ifndef CLIENT m_flWait = 4.0f; - super::NSPointTrigger(); #endif } diff --git a/src/gs-entbase/shared/trigger_gravity.qc b/src/gs-entbase/shared/trigger_gravity.qc index 193fddbd..f236ca5f 100644 --- a/src/gs-entbase/shared/trigger_gravity.qc +++ b/src/gs-entbase/shared/trigger_gravity.qc @@ -38,13 +38,10 @@ class trigger_gravity:NSBrushTrigger void(void) trigger_gravity; + virtual void(void) Spawned; virtual void(entity) Touch; virtual void(string, string) SpawnKey; virtual void(void) Respawn; - -#ifdef CLIENT - virtual void(void) Initialized; -#endif }; void @@ -80,17 +77,17 @@ trigger_gravity::SpawnKey(string strField, string strKey) } void -trigger_gravity::trigger_gravity(void) +trigger_gravity::Spawned(void) { -#ifdef SERVER - super::NSBrushTrigger(); + super::Spawned(); + +#ifdef CLIENT + Respawn(); #endif } -#ifdef CLIENT void -trigger_gravity::Initialized(void) +trigger_gravity::trigger_gravity(void) { - Respawn(); + m_flGravity = 1.0; } -#endif diff --git a/src/gs-entbase/shared/worldspawn.qc b/src/gs-entbase/shared/worldspawn.qc index 7d4b7eee..b749191d 100644 --- a/src/gs-entbase/shared/worldspawn.qc +++ b/src/gs-entbase/shared/worldspawn.qc @@ -56,11 +56,11 @@ class worldspawn:NSEntity void(void) worldspawn; virtual void(string, string) SpawnKey; - virtual void(void) Initialized; + virtual void(void) Spawned; }; void -worldspawn::Initialized(void) +worldspawn::Spawned(void) { g_vecSunDir = [90,0]; @@ -127,10 +127,5 @@ worldspawn::SpawnKey(string strField, string strKey) void worldspawn::worldspawn(void) { -#ifdef CLIENT - Init(); -#else - super::NSEntity(); -#endif } -#endif +#endif \ No newline at end of file diff --git a/src/materials/Alien.qc b/src/materials/Alien.qc new file mode 100644 index 00000000..f2c2851a --- /dev/null +++ b/src/materials/Alien.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Alien:NSMaterial +{ + void(void) Alien; +}; + +void +Alien::Alien(void) +{ + +} diff --git a/src/materials/Computer.qc b/src/materials/Computer.qc new file mode 100644 index 00000000..9debc35b --- /dev/null +++ b/src/materials/Computer.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Computer:NSMaterial +{ + void(void) Computer; +}; + +void +Computer::Computer(void) +{ + +} diff --git a/src/materials/Concrete.qc b/src/materials/Concrete.qc new file mode 100644 index 00000000..cab773ec --- /dev/null +++ b/src/materials/Concrete.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Concrete:NSMaterial +{ + void(void) Concrete; +}; + +void +Concrete::Concrete(void) +{ + +} diff --git a/src/materials/Dirt.qc b/src/materials/Dirt.qc new file mode 100644 index 00000000..eec2b78f --- /dev/null +++ b/src/materials/Dirt.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Dirt:NSMaterial +{ + void(void) Dirt; +}; + +void +Dirt::Dirt(void) +{ + +} diff --git a/src/materials/Flesh.qc b/src/materials/Flesh.qc new file mode 100644 index 00000000..9d5c2aa6 --- /dev/null +++ b/src/materials/Flesh.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Flesh:NSMaterial +{ + void(void) Flesh; +}; + +void +Flesh::Flesh(void) +{ + +} diff --git a/src/materials/Foliage.qc b/src/materials/Foliage.qc new file mode 100644 index 00000000..805c16e2 --- /dev/null +++ b/src/materials/Foliage.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Foliage:NSMaterial +{ + void(void) Foliage; +}; + +void +Foliage::Foliage(void) +{ + +} diff --git a/src/materials/Glass.qc b/src/materials/Glass.qc new file mode 100644 index 00000000..c1b38316 --- /dev/null +++ b/src/materials/Glass.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Glass:NSMaterial +{ + void(void) Glass; +}; + +void +Glass::Glass(void) +{ + +} diff --git a/src/materials/Grate.qc b/src/materials/Grate.qc new file mode 100644 index 00000000..3d4f5721 --- /dev/null +++ b/src/materials/Grate.qc @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Grate:NSMaterial +{ + void(void) Grate; +}; + +void +Grate::Grate(void) +{ +} diff --git a/src/materials/Metal.qc b/src/materials/Metal.qc new file mode 100644 index 00000000..ff96002e --- /dev/null +++ b/src/materials/Metal.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Metal:NSMaterial +{ + void(void) Metal; +}; + +void +Metal::Metal(void) +{ + +} diff --git a/src/materials/Sand.qc b/src/materials/Sand.qc new file mode 100644 index 00000000..92b95a31 --- /dev/null +++ b/src/materials/Sand.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Sand:NSMaterial +{ + void(void) Sand; +}; + +void +Sand::Sand(void) +{ + +} diff --git a/src/materials/Slosh.qc b/src/materials/Slosh.qc new file mode 100644 index 00000000..7d4270dc --- /dev/null +++ b/src/materials/Slosh.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Slosh:NSMaterial +{ + void(void) Slosh; +}; + +void +Slosh::Slosh(void) +{ + +} diff --git a/src/materials/Snow.qc b/src/materials/Snow.qc new file mode 100644 index 00000000..3c8a404d --- /dev/null +++ b/src/materials/Snow.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Snow:NSMaterial +{ + void(void) Snow; +}; + +void +Snow::Snow(void) +{ + +} diff --git a/src/materials/Tile.qc b/src/materials/Tile.qc new file mode 100644 index 00000000..b4c7f0fd --- /dev/null +++ b/src/materials/Tile.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Tile:NSMaterial +{ + void(void) Tile; +}; + +void +Tile::Tile(void) +{ + +} diff --git a/src/materials/Vent.qc b/src/materials/Vent.qc new file mode 100644 index 00000000..01e50c59 --- /dev/null +++ b/src/materials/Vent.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Vent:NSMaterial +{ + void(void) Vent; +}; + +void +Vent::Vent(void) +{ + +} diff --git a/src/materials/Wood.qc b/src/materials/Wood.qc new file mode 100644 index 00000000..fda7122f --- /dev/null +++ b/src/materials/Wood.qc @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class Wood:NSMaterial +{ + void(void) Wood; +}; + +void +Wood::Wood(void) +{ + +} diff --git a/src/materials/include.src b/src/materials/include.src new file mode 100644 index 00000000..2369aaec --- /dev/null +++ b/src/materials/include.src @@ -0,0 +1,17 @@ +#includelist +Alien.qc +Computer.qc +Concrete.qc +Dirt.qc +Flesh.qc +Foliage.qc +Glass.qc +Grate.qc +Metal.qc +Sand.qc +Slosh.qc +Snow.qc +Tile.qc +Vent.qc +Wood.qc +#endlist diff --git a/src/menu-vgui/includes.src b/src/menu-vgui/includes.src new file mode 100644 index 00000000..bc10136a --- /dev/null +++ b/src/menu-vgui/includes.src @@ -0,0 +1,23 @@ +#includelist +../shared/fteextensions.qc +../shared/global.h +../client/font.h +defs.h + +../vgui/include.src + +background.qc +loading.qc + +main.h +ui_console.qc +ui_newgame.qc +ui_quitgame.qc +ui_createserver.qc +ui_findservers.qc +ui_musicplayer.qc +ui_modelviewer.qc +desktop.qc +main.qc +../client/font.qc +#endlist diff --git a/src/menu-vgui/progs.src b/src/menu-vgui/progs.src index 8e549d39..d3e64c37 100644 --- a/src/menu-vgui/progs.src +++ b/src/menu-vgui/progs.src @@ -3,25 +3,5 @@ #define MENU #includelist -../shared/fteextensions.qc -../shared/global.h -../client/font.h -defs.h - -../vgui/include.src - -background.qc -loading.qc - -main.h -ui_console.qc -ui_newgame.qc -ui_quitgame.qc -ui_createserver.qc -ui_findservers.qc -ui_musicplayer.qc -ui_modelviewer.qc -desktop.qc -main.qc -../client/font.qc +includes.src #endlist diff --git a/src/server/entry.qc b/src/server/entry.qc index 79f71360..8cda9efa 100644 --- a/src/server/entry.qc +++ b/src/server/entry.qc @@ -439,6 +439,8 @@ initents(void) /* only bother doing so on Half-Life BSP */ if (serverkeyfloat("*bspversion") == BSPVER_HL) { HLMaterials_Init(); + } else { + Materials_Init(); } PMove_Init(); diff --git a/src/shared/NSClientPlayer.qc b/src/shared/NSClientPlayer.qc index 5695370b..85c52a0c 100644 --- a/src/shared/NSClientPlayer.qc +++ b/src/shared/NSClientPlayer.qc @@ -440,6 +440,7 @@ NSClientPlayer::PredictPostFrame(void) void NSClientPlayer::Save(float handle) { + SaveFloat(handle, "max_health", max_health); SaveFloat(handle, "health", health); SaveFloat(handle, "armor", armor); SaveFloat(handle, "modelindex", modelindex); @@ -454,6 +455,7 @@ NSClientPlayer::Save(float handle) SaveVector(handle, "v_angle", v_angle); SaveVector(handle, "punchangle", punchangle); SaveFloat(handle, "movetype", movetype); + SaveFloat(handle, "solid", solid); SaveFloat(handle, "pmove_flags", pmove_flags); SaveFloat(handle, "w_attack_next", w_attack_next); SaveFloat(handle, "w_idle_next", w_idle_next); @@ -463,12 +465,16 @@ NSClientPlayer::Save(float handle) SaveInt(handle, "g_items", g_items); SaveFloat(handle, "activeweapon", activeweapon); SaveFloat(handle, "vehicle", num_for_edict(vehicle)); + super::Save(handle); } void NSClientPlayer::Restore(string strKey, string strValue) { switch (strKey) { + case "max_health": + max_health = ReadFloat(strValue); + break; case "health": health = ReadFloat(strValue); break; @@ -505,6 +511,9 @@ NSClientPlayer::Restore(string strKey, string strValue) case "punchangle": punchangle = ReadVector(strValue); break; + case "solid": + solid = ReadFloat(strValue); + break; case "movetype": movetype = ReadFloat(strValue); break; @@ -971,6 +980,5 @@ NSClientPlayer::InputUse_Up(void) void NSClientPlayer::NSClientPlayer(void) { - super::NSClientSpectator(); vehicle = __NULL__; } diff --git a/src/shared/NSClientSpectator.qc b/src/shared/NSClientSpectator.qc index 29964544..a036f8d1 100644 --- a/src/shared/NSClientSpectator.qc +++ b/src/shared/NSClientSpectator.qc @@ -450,20 +450,6 @@ NSClientSpectator::PostFrame(void) void NSClientSpectator::NSClientSpectator(void) { - super::NSClient(); - modelindex = 0; - flags = FL_CLIENT; - SetSolid(SOLID_NOT); - SetMovetype(MOVETYPE_NOCLIP); - think = __NULL__; - nextthink = 0.0f; - maxspeed = 250; - spec_ent = 0; - spec_mode = 0; - -#ifdef SERVER - forceinfokey(this, "*spectator", "1"); -#endif } #ifdef CLIENT diff --git a/src/shared/NSMaterial.h b/src/shared/NSMaterial.h new file mode 100644 index 00000000..1f067ed5 --- /dev/null +++ b/src/shared/NSMaterial.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +class +NSMaterial +{ + bool m_bPenetrable; + bool m_bFootsteps; + float m_flFriction; + string m_strStepSound; + + void(void) NSMaterial; + + virtual float(void) GetFriction; + virtual bool(void) Footsteps; + virtual bool(void) Penetrable; + virtual void(NSClient) FootstepSound; + virtual void(vector, vector) Impact; +}; + +hashtable g_hashMaterials; + +void Materials_Init(void); +NSMaterial Material_FromTexture(string); diff --git a/src/shared/NSMaterial.qc b/src/shared/NSMaterial.qc new file mode 100644 index 00000000..44ec99ba --- /dev/null +++ b/src/shared/NSMaterial.qc @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2016-2020 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. + */ + +void +NSMaterial::NSMaterial(void) +{ + m_bPenetrable = false; + m_bFootsteps = false; + m_flFriction = 1.0f; + m_strStepSound = "step.default"; +} + +float +NSMaterial::GetFriction(void) +{ + return (m_flFriction); +} + +bool +NSMaterial::Footsteps(void) +{ + return (m_bFootsteps); +} + +bool +NSMaterial::Penetrable(void) +{ + return (m_bPenetrable); +} + +void +NSMaterial::FootstepSound(NSClient client) +{ + /* foobar */ +} + +void +NSMaterial::Impact(vector vecOrigin, vector vecAngle) +{ + print("IMPACT, WOOO\n"); +} + +/* general purpose functions to interact with the material system */ +void +Materials_LoadFromText(string filename) +{ + filestream fileMaterial; + string sTemp; + string mat_type; + string tex_name; + + fileMaterial = fopen(filename, FILE_READ); + + if (fileMaterial >= 0) { + print(strcat("parsing material assignments from ", filename,"\n")); + + while ((sTemp = fgets(fileMaterial))) { + /* tokenize and just parse this stuff in */ + if (tokenize_console(sTemp) == 2) { + mat_type = strtoupper(argv(0)); + tex_name = Materials_FixName(strtolower(argv(1))); + hash_add(g_hashMaterials, tex_name, str2chr(mat_type, 0)); + } + } + + fclose(fileMaterial); + } else { + dprint(strcat("^1Failed to load ", filename,"!\n")); + } +} + +void +Materials_LoadFromMat(string filename) +{ + filestream fileMaterial; + string sTemp; + string materialname = substring(filename, 0, -5); + string extension = substring(filename, strlen(filename) - 3, 3); + string command, parameters; + + fileMaterial = fopen(filename, FILE_READ); + + /* load the .mat and find which material we're supposed to be using */ + if (fileMaterial >= 0) { + while ((sTemp = fgets(fileMaterial))) { + /* tokenize and just parse this stuff in */ + if (tokenize_console(sTemp) == 2) { + command = strtolower(argv(0)); + parameters = argv(1); + + if (command == "material") { + hash_add(g_hashMaterials, materialname, parameters); + print(sprintf("added Material %S type %S\n", materialname, parameters)); + } + } + } + + fclose(fileMaterial); + } +} + +void +Materials_Init(void) +{ + g_hashMaterials = __NULL__; + g_hashMaterials = hash_createtab(2, EV_STRING); + + /* global table */ + Materials_LoadFromText("textures/materials.def"); + + /* iterate through our mat files */ + searchhandle searchy = search_begin("textures/*/*.mat", SEARCH_NAMESORT, TRUE); + for (int i = 0; i < search_getsize(searchy); i++) { + Materials_LoadFromMat(search_getfilename(searchy, i)); + } +} + +NSMaterial +Material_FromTexture(string tex_name) +{ + string mat = (string)hash_get(g_hashMaterials, tex_name); + string func = strcat("spawnfunc_", mat); + + if (isfunction(func)) { + entity oldself = self; + void(void) vFunc; + vFunc = externvalue(-2, func); + NSMaterial new_mat = spawn(NSMaterial); + self = new_mat; + vFunc(); + self = oldself; + return (new_mat); + } else if (mat != "") { + /* let the console know */ + print(sprintf("^1material %S does not exist!\n", mat)); + } + + /* return the builtin generic material */ + NSMaterial gen_mat = spawn(NSMaterial); + return (gen_mat); +} diff --git a/src/shared/defs.h b/src/shared/defs.h index 5ff21b18..c2f10758 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -46,6 +46,7 @@ #include "NSClient.h" #include "NSClientSpectator.h" #include "NSClientPlayer.h" +#include "NSMaterial.h" #include "damage.h" #include "flags.h" #include "entities.h" diff --git a/src/shared/include.src b/src/shared/include.src index b1d423f4..c990403d 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -9,5 +9,7 @@ NSClientPlayer.qc player_pmove.qc propdata.qc surfaceproperties.qc +NSMaterial.qc ../xr/include.src +../materials/include.src #endlist diff --git a/src/shared/player_pmove.qc b/src/shared/player_pmove.qc index dcdeb419..b030a5e9 100644 --- a/src/shared/player_pmove.qc +++ b/src/shared/player_pmove.qc @@ -90,7 +90,7 @@ NSClientPlayer::Physics_CheckJump(float premove) if (!(flags & FL_ONGROUND)) return; - if (!infokey(this, "autojump") == "1") + if (!(infokey(this, "autojump") == "1")) if (!(flags & FL_JUMPRELEASED)) return; diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc index 0364d49c..a6dd2e55 100644 --- a/src/shared/pmove.qc +++ b/src/shared/pmove.qc @@ -79,6 +79,19 @@ #define PHY_VIEWPOS_CROUCHED [0,0,12] #endif +/* stamina system, inspired by idTech 4 */ +#ifndef PMOVE_STAMINA + #define PMOVE_STAMINA 24 +#endif + +#ifndef PMOVE_STAMINARATE + #define PMOVE_STAMINARATE 0.75 +#endif + +#ifndef PMOVE_STAMINATHRESHOLD + #define PMOVE_STAMINATHRESHOLD 4 +#endif + /* Those are constant for HL BSP and CANNOT be changed. * Blame Valve for purchasing a Quake II license but not diff --git a/src/shared/surfaceproperties.qc b/src/shared/surfaceproperties.qc index bbd9e1cc..41bd8eee 100644 --- a/src/shared/surfaceproperties.qc +++ b/src/shared/surfaceproperties.qc @@ -464,6 +464,7 @@ void SurfData_Impact(entity e, int fl, vector org, vector ang) { static void SurfData_Impact_SurfaceParm(entity e, int fl, vector org, vector ang) { +#if 1 switch (serverkeyfloat("*bspversion")) { case BSPVER_HL: float surf; @@ -481,6 +482,13 @@ SurfData_Impact(entity e, int fl, vector org, vector ang) default: FX_Impact(IMPACT_DEFAULT, org, ang); } +#else + float surf = getsurfacenearpoint(e, org); + NSMaterial foo = Material_FromTexture(getsurfacetexture(e, surf)); + + if (foo) + foo.Impact(org, ang); +#endif } /* the static world */ diff --git a/src/vgui/ui.qc b/src/vgui/ui.qc index 4ca6148e..5b0964f0 100644 --- a/src/vgui/ui.qc +++ b/src/vgui/ui.qc @@ -144,15 +144,6 @@ CUIWidget::Input(float flEVType, float flKey, float flChar, float flDevID) { CUIWidget wNext = this; -#if 0 - do { - wNext = wNext.m_next; - if (wNext && wNext.m_iFlags & 1 && wNext.m_parent.m_iFlags & 1) { - if (wNext.Input(flEVType, flKey, flChar, flDevID) == true) - return; - } - } while (wNext); -#else /* this is garbage, but it'll work */ int c = 0; do { @@ -164,7 +155,7 @@ CUIWidget::Input(float flEVType, float flKey, float flChar, float flDevID) vgui_input_scene_t *tree = memalloc(sizeof(vgui_input_scene_t) * c); int i = 0; - CUIWidget wNext = this; + wNext = this; do { wNext = wNext.m_next; tree[i].member = wNext; @@ -172,17 +163,17 @@ CUIWidget::Input(float flEVType, float flKey, float flChar, float flDevID) } while (wNext); /* traverse the list in reverse */ - for (int i = c-1; i >= 0; i--) { - wNext = tree[i].member; + for (int x = c-1; x >= 0; x--) { + wNext = tree[x].member; if (wNext && wNext.m_iFlags & 1 && wNext.m_parent.m_iFlags & 1) if (wNext.Input(flEVType, flKey, flChar, flDevID) == true) - return; + return (false); } memfree(tree); -#endif + return (false); } void diff --git a/src/vgui/ui_button.qc b/src/vgui/ui_button.qc index 269c1720..95548083 100644 --- a/src/vgui/ui_button.qc +++ b/src/vgui/ui_button.qc @@ -113,7 +113,6 @@ CUIButton::SetTitle(string strName) void CUIButton::SetIcon(string strName) { - vector vecImgSize; m_strIcon = strName; m_vecIMGSize = drawgetimagesize(strName); diff --git a/src/vgui/ui_list.qc b/src/vgui/ui_list.qc index 338160c1..a6bc58d5 100644 --- a/src/vgui/ui_list.qc +++ b/src/vgui/ui_list.qc @@ -98,7 +98,7 @@ void CUIList::Draw(void) bool CUIList::Input (float flEVType, float flKey, float flChar, float flDevID) { - bool ret; + bool ret = false; int iMaxDisplay; int iMouseOver = Util_MouseAbove(getmousepos(), m_parent.m_vecOrigin + m_vecOrigin, m_vecSize); iMaxDisplay = bound(0, m_iItemCount, floor(m_vecSize[1] / 20)); diff --git a/src/xr/NSXRInput.qc b/src/xr/NSXRInput.qc index a8965aab..93193210 100644 --- a/src/xr/NSXRInput.qc +++ b/src/xr/NSXRInput.qc @@ -162,5 +162,4 @@ NSXRInput::PrintInfo(void) void NSXRInput::NSXRInput(void) { - print("registered NSXRInput\n"); } \ No newline at end of file diff --git a/src/xr/NSXRSpace.qc b/src/xr/NSXRSpace.qc index e6be9d98..a39c7254 100644 --- a/src/xr/NSXRSpace.qc +++ b/src/xr/NSXRSpace.qc @@ -69,5 +69,4 @@ NSXRSpace::SetAngles(vector vecAngles) void NSXRSpace::NSXRSpace(void) { - print("allocated NSXRSpace\n"); } \ No newline at end of file diff --git a/src/xr/xr.qc b/src/xr/xr.qc index b1a1adb9..c8e69cd5 100644 --- a/src/xr/xr.qc +++ b/src/xr/xr.qc @@ -32,7 +32,6 @@ XR_Init(entity ePlayer) { NSClient pl = (NSClient)ePlayer; - print("--------- Initializing XR ----------\n"); pl.m_xrSpace = spawn(NSXRSpace); /* the only 3 devices that matter right now */