From a4d70996b09a2b5fc5d2cabdad3689ba1b5c7732 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 31 Jan 2025 14:34:49 -0800 Subject: [PATCH] unpk3dir --- .dir.tiff | Bin 0 -> 9494 bytes LICENSE => COPYING | 0 zpak001.pk3dir/PAK_NAME => PAK_NAME | 0 PROJECT | 2 +- README.md | 7 +- {zpak001.pk3dir/cfg => cfg}/skill.cfg | 0 .../cfg => cfg}/skill_manifest.cfg | 0 {zpak001.pk3dir/data => data}/avanti.way | 0 {zpak001.pk3dir/data => data}/badlands.way | 0 {zpak001.pk3dir/data => data}/casbah.way | 0 {zpak001.pk3dir/data => data}/crossover2.way | 0 {zpak001.pk3dir/data => data}/cz2.way | 0 {zpak001.pk3dir/data => data}/dustbowl.way | 0 {zpak001.pk3dir/data => data}/epicenter.way | 0 {zpak001.pk3dir/data => data}/flagrun.way | 0 {zpak001.pk3dir/data => data}/hunted.way | 0 {zpak001.pk3dir/data => data}/push.way | 0 {zpak001.pk3dir/data => data}/rock2.way | 0 {zpak001.pk3dir/data => data}/warpath.way | 0 {zpak001.pk3dir/data => data}/well.way | 0 {zpak001.pk3dir/decls => decls}/def/ammo.def | 0 {zpak001.pk3dir/decls => decls}/def/armor.def | 0 {zpak001.pk3dir/decls => decls}/def/items.def | 2 +- .../decls => decls}/def/monsters.def | 0 .../decls => decls}/def/player.def | 26 +- .../decls => decls}/def/weapons.def | 0 .../decls => decls}/def/weapons/ac.def | 0 .../decls => decls}/def/weapons/autorifle.def | 0 .../decls => decls}/def/weapons/axe.def | 0 .../def/weapons/flamethrower.def | 2 +- .../decls => decls}/def/weapons/gl.def | 2 +- .../decls => decls}/def/weapons/ic.def | 2 +- .../decls => decls}/def/weapons/knife.def | 0 .../decls => decls}/def/weapons/medikit.def | 0 .../decls => decls}/def/weapons/ng.def | 9 +- .../decls => decls}/def/weapons/pl.def | 2 +- .../decls => decls}/def/weapons/railgun.def | 4 +- .../decls => decls}/def/weapons/rpg.def | 2 +- .../decls => decls}/def/weapons/shotgun.def | 0 .../def/weapons/sniperrifle.def | 0 .../decls => decls}/def/weapons/spanner.def | 0 .../decls => decls}/def/weapons/superng.def | 2 +- .../def/weapons/supershotgun.def | 0 .../decls => decls}/def/weapons/tranq.def | 2 +- .../decls => decls}/def/weapons/umbrella.def | 0 .../decls => decls}/sound/items_tfc.sndshd | 0 .../decls => decls}/sound/player_tfc.sndshd | 0 .../decls => decls}/sound/turret_tfc.sndshd | 0 .../decls => decls}/sound/weapons_tfc.sndshd | 0 default_tfc.cfg | 2 + icon.tga | Bin 0 -> 8235 bytes img/te.png | Bin 0 -> 5474 bytes instructions.txt | 2 - manifest.fmf | 14 -- maps/2fort.jpg | Bin 0 -> 6456 bytes {zpak001.pk3dir/maps => maps}/2fort_src.jpg | Bin maps/avanti.jpg | Bin 0 -> 6571 bytes {zpak001.pk3dir/maps => maps}/avanti_src.jpg | Bin maps/badlands.jpg | Bin 0 -> 8006 bytes .../maps => maps}/badlands_src.jpg | Bin maps/casbah.jpg | Bin 0 -> 6676 bytes {zpak001.pk3dir/maps => maps}/casbah_src.jpg | Bin maps/crossover2.jpg | Bin 0 -> 6790 bytes .../maps => maps}/crossover2_src.jpg | Bin maps/cz2.jpg | Bin 0 -> 4486 bytes {zpak001.pk3dir/maps => maps}/cz2_src.jpg | Bin maps/dustbowl.jpg | Bin 0 -> 7269 bytes .../maps => maps}/dustbowl_src.jpg | Bin maps/epicenter.jpg | Bin 0 -> 6983 bytes .../maps => maps}/epicenter_src.jpg | Bin maps/flagrun.jpg | Bin 0 -> 7488 bytes {zpak001.pk3dir/maps => maps}/flagrun_src.jpg | Bin maps/hunted.jpg | Bin 0 -> 6478 bytes {zpak001.pk3dir/maps => maps}/hunted_src.jpg | Bin maps/push.jpg | Bin 0 -> 4812 bytes {zpak001.pk3dir/maps => maps}/push_src.jpg | Bin maps/rock2.jpg | Bin 0 -> 4952 bytes {zpak001.pk3dir/maps => maps}/rock2_src.jpg | Bin maps/warpath.jpg | Bin 0 -> 6674 bytes {zpak001.pk3dir/maps => maps}/warpath_src.jpg | Bin maps/well.jpg | Bin 0 -> 5130 bytes {zpak001.pk3dir/maps => maps}/well_src.jpg | Bin .../weapon_railgun.cfg | 0 quake.rc | 5 + radiant.game | 26 -- radiant.xml | 76 ------ .../scripts => scripts}/constants.txt | 0 src/Makefile | 1 + src/client/Makefile | 2 +- src/client/cmds.qc | 4 +- src/client/game_event.qc | 23 -- src/client/hallucination.qc | 9 +- src/client/hud_ammonotify.qc | 2 +- src/client/hud_itemnotify.qc | 2 +- src/client/init.qc | 5 +- src/client/progs.src | 5 +- src/client/vgui_changeclass.qc | 232 ------------------ src/client/vgui_chooseteam.qc | 159 ------------ src/client/vox.qc | 2 +- src/files.dat | 64 +++++ src/progs.src | 1 + src/rules/Makefile | 5 + src/rules/default.qc | 196 +++++++++++++++ src/server/Makefile | 2 +- src/server/bot.qc | 2 +- src/server/defs.h | 3 +- src/server/dispenser.qc | 20 +- src/server/func_nobuild.qc | 2 +- src/server/func_nogrenades.qc | 2 +- src/server/gamerules.h | 34 --- src/server/gamerules.qc | 185 -------------- src/server/info_areadef.qc | 2 +- src/server/info_player_teamspawn.qc | 38 ++- src/server/info_tfdetect.qc | 134 ++++++---- src/server/info_tfgoal.qc | 10 +- src/server/item_armor.qc | 6 +- src/server/item_healthkit.qc | 8 +- src/server/item_tfgoal.qc | 6 +- src/server/nades.qc | 40 +-- src/server/progs.src | 2 +- src/server/sentry.h | 6 +- src/server/sentry.qc | 4 +- src/server/server.qc | 7 - src/server/teleporter.qc | 2 +- src/shared/include.src | 3 - src/shared/player.qc | 70 ++---- src/shared/pmove.qc | 44 ---- src/shared/w_flamer.qc | 8 +- src/shared/w_glauncher.qc | 4 +- src/shared/w_pipebomb.qc | 10 +- zpak001.pk3dir/decls/def/bot.def | 4 - zpak001.pk3dir/decls/def/spawns.def | 44 ---- zpak001.pk3dir/default.cfg | 6 - 133 files changed, 512 insertions(+), 1097 deletions(-) create mode 100644 .dir.tiff rename LICENSE => COPYING (100%) rename zpak001.pk3dir/PAK_NAME => PAK_NAME (100%) rename {zpak001.pk3dir/cfg => cfg}/skill.cfg (100%) rename {zpak001.pk3dir/cfg => cfg}/skill_manifest.cfg (100%) rename {zpak001.pk3dir/data => data}/avanti.way (100%) rename {zpak001.pk3dir/data => data}/badlands.way (100%) rename {zpak001.pk3dir/data => data}/casbah.way (100%) rename {zpak001.pk3dir/data => data}/crossover2.way (100%) rename {zpak001.pk3dir/data => data}/cz2.way (100%) rename {zpak001.pk3dir/data => data}/dustbowl.way (100%) rename {zpak001.pk3dir/data => data}/epicenter.way (100%) rename {zpak001.pk3dir/data => data}/flagrun.way (100%) rename {zpak001.pk3dir/data => data}/hunted.way (100%) rename {zpak001.pk3dir/data => data}/push.way (100%) rename {zpak001.pk3dir/data => data}/rock2.way (100%) rename {zpak001.pk3dir/data => data}/warpath.way (100%) rename {zpak001.pk3dir/data => data}/well.way (100%) rename {zpak001.pk3dir/decls => decls}/def/ammo.def (100%) rename {zpak001.pk3dir/decls => decls}/def/armor.def (100%) rename {zpak001.pk3dir/decls => decls}/def/items.def (83%) rename {zpak001.pk3dir/decls => decls}/def/monsters.def (100%) rename {zpak001.pk3dir/decls => decls}/def/player.def (91%) rename {zpak001.pk3dir/decls => decls}/def/weapons.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/ac.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/autorifle.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/axe.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/flamethrower.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/gl.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/ic.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/knife.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/medikit.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/ng.def (92%) rename {zpak001.pk3dir/decls => decls}/def/weapons/pl.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/railgun.def (97%) rename {zpak001.pk3dir/decls => decls}/def/weapons/rpg.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/shotgun.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/sniperrifle.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/spanner.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/superng.def (97%) rename {zpak001.pk3dir/decls => decls}/def/weapons/supershotgun.def (100%) rename {zpak001.pk3dir/decls => decls}/def/weapons/tranq.def (98%) rename {zpak001.pk3dir/decls => decls}/def/weapons/umbrella.def (100%) rename {zpak001.pk3dir/decls => decls}/sound/items_tfc.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/player_tfc.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/turret_tfc.sndshd (100%) rename {zpak001.pk3dir/decls => decls}/sound/weapons_tfc.sndshd (100%) create mode 100644 default_tfc.cfg create mode 100644 icon.tga create mode 100644 img/te.png delete mode 100644 instructions.txt delete mode 100644 manifest.fmf create mode 100644 maps/2fort.jpg rename {zpak001.pk3dir/maps => maps}/2fort_src.jpg (100%) create mode 100644 maps/avanti.jpg rename {zpak001.pk3dir/maps => maps}/avanti_src.jpg (100%) create mode 100644 maps/badlands.jpg rename {zpak001.pk3dir/maps => maps}/badlands_src.jpg (100%) create mode 100644 maps/casbah.jpg rename {zpak001.pk3dir/maps => maps}/casbah_src.jpg (100%) create mode 100644 maps/crossover2.jpg rename {zpak001.pk3dir/maps => maps}/crossover2_src.jpg (100%) create mode 100644 maps/cz2.jpg rename {zpak001.pk3dir/maps => maps}/cz2_src.jpg (100%) create mode 100644 maps/dustbowl.jpg rename {zpak001.pk3dir/maps => maps}/dustbowl_src.jpg (100%) create mode 100644 maps/epicenter.jpg rename {zpak001.pk3dir/maps => maps}/epicenter_src.jpg (100%) create mode 100644 maps/flagrun.jpg rename {zpak001.pk3dir/maps => maps}/flagrun_src.jpg (100%) create mode 100644 maps/hunted.jpg rename {zpak001.pk3dir/maps => maps}/hunted_src.jpg (100%) create mode 100644 maps/push.jpg rename {zpak001.pk3dir/maps => maps}/push_src.jpg (100%) create mode 100644 maps/rock2.jpg rename {zpak001.pk3dir/maps => maps}/rock2_src.jpg (100%) create mode 100644 maps/warpath.jpg rename {zpak001.pk3dir/maps => maps}/warpath_src.jpg (100%) create mode 100644 maps/well.jpg rename {zpak001.pk3dir/maps => maps}/well_src.jpg (100%) rename {zpak001.pk3dir/particles => particles}/weapon_railgun.cfg (100%) create mode 100644 quake.rc delete mode 100644 radiant.game delete mode 100644 radiant.xml rename {zpak001.pk3dir/scripts => scripts}/constants.txt (100%) delete mode 100644 src/client/vgui_changeclass.qc delete mode 100644 src/client/vgui_chooseteam.qc create mode 100644 src/files.dat create mode 100644 src/rules/Makefile create mode 100644 src/rules/default.qc delete mode 100644 src/server/gamerules.h delete mode 100644 src/server/gamerules.qc delete mode 100644 zpak001.pk3dir/decls/def/bot.def delete mode 100644 zpak001.pk3dir/decls/def/spawns.def delete mode 100644 zpak001.pk3dir/default.cfg diff --git a/.dir.tiff b/.dir.tiff new file mode 100644 index 0000000000000000000000000000000000000000..021f7170e500557b743c30a729ed6236539ba345 GIT binary patch literal 9494 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 XdHDv#n}&on(9@^SHvF=}9PIx99QPs| literal 0 HcmV?d00001 diff --git a/LICENSE b/COPYING similarity index 100% rename from LICENSE rename to COPYING diff --git a/zpak001.pk3dir/PAK_NAME b/PAK_NAME similarity index 100% rename from zpak001.pk3dir/PAK_NAME rename to PAK_NAME diff --git a/PROJECT b/PROJECT index ae47d31..013f924 100644 --- a/PROJECT +++ b/PROJECT @@ -1 +1 @@ -TeamContest \ No newline at end of file +TeamEffort diff --git a/README.md b/README.md index 99bca50..875d209 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Team Contest (FreeTFC) +# ![](img/te.png) Team Effort Clean-room reimplementation of Team Fortress Classic in QuakeC. ![Preview 1](img/preview1.jpg) @@ -8,8 +8,7 @@ Clone the repository into the Nuclide-SDK: > git clone REPOURL tfc -then either run Nuclide's ./build_game.sh shell script, or issue 'make' inside -./tfc/src! +Then run `make game GAME=tfc`! Obviously make sure that Nuclide has fteqw and fteqcc set-up for building. @@ -29,7 +28,7 @@ We've had people ask in the oddest of places for help, please don't do that. ## License ISC License -Copyright (c) 2016-2021 Marco Hladik +Copyright (c) 2016-2025 Marco Hladik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/zpak001.pk3dir/cfg/skill.cfg b/cfg/skill.cfg similarity index 100% rename from zpak001.pk3dir/cfg/skill.cfg rename to cfg/skill.cfg diff --git a/zpak001.pk3dir/cfg/skill_manifest.cfg b/cfg/skill_manifest.cfg similarity index 100% rename from zpak001.pk3dir/cfg/skill_manifest.cfg rename to cfg/skill_manifest.cfg diff --git a/zpak001.pk3dir/data/avanti.way b/data/avanti.way similarity index 100% rename from zpak001.pk3dir/data/avanti.way rename to data/avanti.way diff --git a/zpak001.pk3dir/data/badlands.way b/data/badlands.way similarity index 100% rename from zpak001.pk3dir/data/badlands.way rename to data/badlands.way diff --git a/zpak001.pk3dir/data/casbah.way b/data/casbah.way similarity index 100% rename from zpak001.pk3dir/data/casbah.way rename to data/casbah.way diff --git a/zpak001.pk3dir/data/crossover2.way b/data/crossover2.way similarity index 100% rename from zpak001.pk3dir/data/crossover2.way rename to data/crossover2.way diff --git a/zpak001.pk3dir/data/cz2.way b/data/cz2.way similarity index 100% rename from zpak001.pk3dir/data/cz2.way rename to data/cz2.way diff --git a/zpak001.pk3dir/data/dustbowl.way b/data/dustbowl.way similarity index 100% rename from zpak001.pk3dir/data/dustbowl.way rename to data/dustbowl.way diff --git a/zpak001.pk3dir/data/epicenter.way b/data/epicenter.way similarity index 100% rename from zpak001.pk3dir/data/epicenter.way rename to data/epicenter.way diff --git a/zpak001.pk3dir/data/flagrun.way b/data/flagrun.way similarity index 100% rename from zpak001.pk3dir/data/flagrun.way rename to data/flagrun.way diff --git a/zpak001.pk3dir/data/hunted.way b/data/hunted.way similarity index 100% rename from zpak001.pk3dir/data/hunted.way rename to data/hunted.way diff --git a/zpak001.pk3dir/data/push.way b/data/push.way similarity index 100% rename from zpak001.pk3dir/data/push.way rename to data/push.way diff --git a/zpak001.pk3dir/data/rock2.way b/data/rock2.way similarity index 100% rename from zpak001.pk3dir/data/rock2.way rename to data/rock2.way diff --git a/zpak001.pk3dir/data/warpath.way b/data/warpath.way similarity index 100% rename from zpak001.pk3dir/data/warpath.way rename to data/warpath.way diff --git a/zpak001.pk3dir/data/well.way b/data/well.way similarity index 100% rename from zpak001.pk3dir/data/well.way rename to data/well.way diff --git a/zpak001.pk3dir/decls/def/ammo.def b/decls/def/ammo.def similarity index 100% rename from zpak001.pk3dir/decls/def/ammo.def rename to decls/def/ammo.def diff --git a/zpak001.pk3dir/decls/def/armor.def b/decls/def/armor.def similarity index 100% rename from zpak001.pk3dir/decls/def/armor.def rename to decls/def/armor.def diff --git a/zpak001.pk3dir/decls/def/items.def b/decls/def/items.def similarity index 83% rename from zpak001.pk3dir/decls/def/items.def rename to decls/def/items.def index 46df44d..221d8fc 100644 --- a/zpak001.pk3dir/decls/def/items.def +++ b/decls/def/items.def @@ -1,6 +1,6 @@ entityDef item_suit { - "spawnclass" "NSItem" + "spawnclass" "ncItem" "model" "models/w_suit.mdl" "mins" "-16 -16 0" "maxs" "16 16 16" diff --git a/zpak001.pk3dir/decls/def/monsters.def b/decls/def/monsters.def similarity index 100% rename from zpak001.pk3dir/decls/def/monsters.def rename to decls/def/monsters.def diff --git a/zpak001.pk3dir/decls/def/player.def b/decls/def/player.def similarity index 91% rename from zpak001.pk3dir/decls/def/player.def rename to decls/def/player.def index 9fb43ed..0b92487 100644 --- a/zpak001.pk3dir/decls/def/player.def +++ b/decls/def/player.def @@ -3,9 +3,15 @@ entityDef player "spawnclass" "TFPlayer" } +entityDef player_shared +{ + "inherit" "player" + "item" "item_suit" +} + entityDef player_scout { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/scout/scout.mdl" "health" "75" "armor" "25" @@ -23,7 +29,7 @@ entityDef player_scout entityDef player_sniper { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/sniper/sniper.mdl" "health" "90" "armor" "0" @@ -41,7 +47,7 @@ entityDef player_sniper entityDef player_soldier { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/soldier/soldier.mdl" "health" "100" "armor" "100" @@ -59,7 +65,7 @@ entityDef player_soldier entityDef player_demo { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/demo/demo.mdl" "health" "90" "armor" "50" @@ -77,7 +83,7 @@ entityDef player_demo entityDef player_medic { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/medic/medic.mdl" "health" "90" "armor" "50" @@ -95,7 +101,7 @@ entityDef player_medic entityDef player_heavy { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/hvyweapon/hvyweapon.mdl" "health" "100" "armor" "150" @@ -112,7 +118,7 @@ entityDef player_heavy entityDef player_pyro { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/pyro/pyro.mdl" "health" "100" "armor" "50" @@ -131,7 +137,7 @@ entityDef player_pyro entityDef player_spy { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/spy/spy.mdl" "health" "90" "armor" "25" @@ -149,7 +155,7 @@ entityDef player_spy entityDef player_engineer { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/engineer/engineer.mdl" "health" "80" "armor" "25" @@ -168,7 +174,7 @@ entityDef player_engineer entityDef player_civilian { - "inherit" "player" + "inherit" "player_shared" "model" "models/player/civilian/civilian.mdl" "health" "50" "armor" "0" diff --git a/zpak001.pk3dir/decls/def/weapons.def b/decls/def/weapons.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons.def rename to decls/def/weapons.def diff --git a/zpak001.pk3dir/decls/def/weapons/ac.def b/decls/def/weapons/ac.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/ac.def rename to decls/def/weapons/ac.def diff --git a/zpak001.pk3dir/decls/def/weapons/autorifle.def b/decls/def/weapons/autorifle.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/autorifle.def rename to decls/def/weapons/autorifle.def diff --git a/zpak001.pk3dir/decls/def/weapons/axe.def b/decls/def/weapons/axe.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/axe.def rename to decls/def/weapons/axe.def diff --git a/zpak001.pk3dir/decls/def/weapons/flamethrower.def b/decls/def/weapons/flamethrower.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/flamethrower.def rename to decls/def/weapons/flamethrower.def index 9bf1bbb..e0d6307 100644 --- a/zpak001.pk3dir/decls/def/weapons/flamethrower.def +++ b/decls/def/weapons/flamethrower.def @@ -44,7 +44,7 @@ entityDef fireInfo_tfFlameThrower entityDef projectile_tfFire { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "sprites/fthrow.spr" "def_damage" "tfFireDirect" diff --git a/zpak001.pk3dir/decls/def/weapons/gl.def b/decls/def/weapons/gl.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/gl.def rename to decls/def/weapons/gl.def index f17a1b8..39c51d0 100644 --- a/zpak001.pk3dir/decls/def/weapons/gl.def +++ b/decls/def/weapons/gl.def @@ -47,7 +47,7 @@ entityDef fireInfo_tfGrenadeLauncher entityDef projectile_tfPipebomb { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/pipebomb.mdl" "skin" "1" "frame" "1" diff --git a/zpak001.pk3dir/decls/def/weapons/ic.def b/decls/def/weapons/ic.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/ic.def rename to decls/def/weapons/ic.def index bd679e4..de7cff3 100644 --- a/zpak001.pk3dir/decls/def/weapons/ic.def +++ b/decls/def/weapons/ic.def @@ -42,7 +42,7 @@ entityDef tf_weapon_ic entityDef projectile_tfIncendiaryRocket { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/rpgrocket.mdl" "def_damage" "damage_tfIncendiaryRocketDirect" diff --git a/zpak001.pk3dir/decls/def/weapons/knife.def b/decls/def/weapons/knife.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/knife.def rename to decls/def/weapons/knife.def diff --git a/zpak001.pk3dir/decls/def/weapons/medikit.def b/decls/def/weapons/medikit.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/medikit.def rename to decls/def/weapons/medikit.def diff --git a/zpak001.pk3dir/decls/def/weapons/ng.def b/decls/def/weapons/ng.def similarity index 92% rename from zpak001.pk3dir/decls/def/weapons/ng.def rename to decls/def/weapons/ng.def index 4346bb0..d04973d 100644 --- a/zpak001.pk3dir/decls/def/weapons/ng.def +++ b/decls/def/weapons/ng.def @@ -33,13 +33,13 @@ entityDef tf_weapon_ng entityDef debris_tfNail { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/nail.mdl" } entityDef projectile_tfNail { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/nail.mdl" "velocity" "1000 0 0" "angular_velocity" "0 0 20" @@ -54,10 +54,11 @@ entityDef projectile_tfNail "detonate_on_actor" "1" "projectile_debris" "debris_tfNail" "model_detonate" "impact_default.main" - "decal_detonate" "ExplosionScorch" + "decal_detonate" "Impact.Shot" "debris_count" "1" "debris_stick" "1" "debris_offset" "-2 0 0" + "offset" "0 3 -6" } entityDef fireInfo_tfNailGun @@ -66,4 +67,4 @@ entityDef fireInfo_tfNailGun "fireRate" "0.1" "punchAngle" "-4 0 0" "model_flash" "sprites/muzzleflash2.spr" -} \ No newline at end of file +} diff --git a/zpak001.pk3dir/decls/def/weapons/pl.def b/decls/def/weapons/pl.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/pl.def rename to decls/def/weapons/pl.def index 52ba078..692bf36 100644 --- a/zpak001.pk3dir/decls/def/weapons/pl.def +++ b/decls/def/weapons/pl.def @@ -48,7 +48,7 @@ entityDef fireInfo_tfStickyLauncher entityDef projectile_tfStickybomb { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/pipebomb.mdl" "frame" "1" "bounce" "1" diff --git a/zpak001.pk3dir/decls/def/weapons/railgun.def b/decls/def/weapons/railgun.def similarity index 97% rename from zpak001.pk3dir/decls/def/weapons/railgun.def rename to decls/def/weapons/railgun.def index 3988367..bd166f3 100644 --- a/zpak001.pk3dir/decls/def/weapons/railgun.def +++ b/decls/def/weapons/railgun.def @@ -39,7 +39,7 @@ entityDef tf_weapon_railgun entityDef projectile_tfRailShot { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "" "def_damage" "damage_tfRailDirect" @@ -70,7 +70,7 @@ entityDef projectile_tfRailShot entityDef projectile_tfRailChargedShot { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "" "def_damage" "damage_tfRailChargeDirect" diff --git a/zpak001.pk3dir/decls/def/weapons/rpg.def b/decls/def/weapons/rpg.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/rpg.def rename to decls/def/weapons/rpg.def index 55656a3..a4e1217 100644 --- a/zpak001.pk3dir/decls/def/weapons/rpg.def +++ b/decls/def/weapons/rpg.def @@ -41,7 +41,7 @@ entityDef tf_weapon_rpg entityDef projectile_tfRocket { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/rpgrocket.mdl" "def_damage" "damage_tfRocketDirect" diff --git a/zpak001.pk3dir/decls/def/weapons/shotgun.def b/decls/def/weapons/shotgun.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/shotgun.def rename to decls/def/weapons/shotgun.def diff --git a/zpak001.pk3dir/decls/def/weapons/sniperrifle.def b/decls/def/weapons/sniperrifle.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/sniperrifle.def rename to decls/def/weapons/sniperrifle.def diff --git a/zpak001.pk3dir/decls/def/weapons/spanner.def b/decls/def/weapons/spanner.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/spanner.def rename to decls/def/weapons/spanner.def diff --git a/zpak001.pk3dir/decls/def/weapons/superng.def b/decls/def/weapons/superng.def similarity index 97% rename from zpak001.pk3dir/decls/def/weapons/superng.def rename to decls/def/weapons/superng.def index c68eed2..cb3239b 100644 --- a/zpak001.pk3dir/decls/def/weapons/superng.def +++ b/decls/def/weapons/superng.def @@ -33,7 +33,7 @@ entityDef tf_weapon_superng entityDef projectile_tfSuperNail { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/nail.mdl" "velocity" "1000 0 0" "angular_velocity" "0 0 20" diff --git a/zpak001.pk3dir/decls/def/weapons/supershotgun.def b/decls/def/weapons/supershotgun.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/supershotgun.def rename to decls/def/weapons/supershotgun.def diff --git a/zpak001.pk3dir/decls/def/weapons/tranq.def b/decls/def/weapons/tranq.def similarity index 98% rename from zpak001.pk3dir/decls/def/weapons/tranq.def rename to decls/def/weapons/tranq.def index f27b051..159c190 100644 --- a/zpak001.pk3dir/decls/def/weapons/tranq.def +++ b/decls/def/weapons/tranq.def @@ -49,7 +49,7 @@ entityDef fireInfo_tfTranq entityDef projectile_tfTranq { - "spawnclass" "NSProjectile" + "spawnclass" "ncProjectile" "model" "models/nail.mdl" "velocity" "1000 0 0" "angular_velocity" "0 0 20" diff --git a/zpak001.pk3dir/decls/def/weapons/umbrella.def b/decls/def/weapons/umbrella.def similarity index 100% rename from zpak001.pk3dir/decls/def/weapons/umbrella.def rename to decls/def/weapons/umbrella.def diff --git a/zpak001.pk3dir/decls/sound/items_tfc.sndshd b/decls/sound/items_tfc.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/items_tfc.sndshd rename to decls/sound/items_tfc.sndshd diff --git a/zpak001.pk3dir/decls/sound/player_tfc.sndshd b/decls/sound/player_tfc.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/player_tfc.sndshd rename to decls/sound/player_tfc.sndshd diff --git a/zpak001.pk3dir/decls/sound/turret_tfc.sndshd b/decls/sound/turret_tfc.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/turret_tfc.sndshd rename to decls/sound/turret_tfc.sndshd diff --git a/zpak001.pk3dir/decls/sound/weapons_tfc.sndshd b/decls/sound/weapons_tfc.sndshd similarity index 100% rename from zpak001.pk3dir/decls/sound/weapons_tfc.sndshd rename to decls/sound/weapons_tfc.sndshd diff --git a/default_tfc.cfg b/default_tfc.cfg new file mode 100644 index 0000000..a1f7eab --- /dev/null +++ b/default_tfc.cfg @@ -0,0 +1,2 @@ +set "hostname" "FreeTFC Server" +set "maxplayers" "8" diff --git a/icon.tga b/icon.tga new file mode 100644 index 0000000000000000000000000000000000000000..6de816c6a556298bb5fa4ac1caeaa206fc70c00e GIT binary patch literal 8235 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/2fort_src.jpg b/maps/2fort_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/2fort_src.jpg rename to maps/2fort_src.jpg diff --git a/maps/avanti.jpg b/maps/avanti.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bc000bcdf3f79a820193138faa836400d47f5bc GIT binary patch literal 6571 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 Y{o|;^`y0zTj53&nm>$g0$D4)!0qABAmH+?% literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/badlands_src.jpg b/maps/badlands_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/badlands_src.jpg rename to maps/badlands_src.jpg diff --git a/maps/casbah.jpg b/maps/casbah.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a00135f66a1b65978f57cc525c50d985f85f987b GIT binary patch literal 6676 zcmb7`WmuG9vw&Z^rMqEKKtNy#DG_NY>7`*Q>28sdW{IUcR$!NI7LL*Zeg#kjaImre6aT>d7kGqt zc(}ND!~_KRgrvlzq$I>7BxDb$D99dAJ|H2XprfFqrlF;!B_*e4prc`+qM@bvj|2_0* zNwcFM#lI$j83!s`M~w$wXX%{d%S}i{J>BiZt69$w_Bq>#F#0dvab5J8BZ|MKc&y_QvR9lLkc&e&3C z1H4G7@h`|%4%Th+Q)R1;7gDuck=oR3VwUx5#Golfv8$)N(f-QRv{C?5#xkMg{YVg! z&&fa3?=9J`+c-Gbnhg3BM%g2~VT9R4VZ8gNX*%f}_4khszTRv&<@%U+J4>mFc2dp^ zPu(3)YaV4wf2JKx+tFT-Q(c?w=F(75AJ7%_*Wvil*9NCYd*a>p`n7!xv9YrJ{;sKq za4n91694I7pk&;B)Nz*ch>mco`+9wKg?MikVqKr9FPE#N8$4w zNqL0KDYJ}Oq2A1#+_lGGG2}F}aI=|f z+^tP)w3>?EfwE+8!j)ik%h;G{Mh`9InAAPT*gp(@?81||Wg)E~lQMI)T|Af)&A4N; z8EVC-_dR_l*F2-;M9_ljH>f;tYHyz5HzeP~#UrMOeG4<1XQE9ZEQI@ z5&3ESn1gFV0PDA4SFK0glcTgFc=KCkHc_#}c`uPe3ywFD>pwuoMe6ghhLhOg?l6|9eM-P-cILF@oy^xP1#>$2va zzq(N^+P`4n%J?;ObZo!_r`eJXmCzKObT(RU7tgfy_8xFYSG%C~+Ih=L#+}4x=VYBP zG$Q4^=HD`&_^v7pUJsdAu>XRfU@YcXF1zwYkArXPh(GTdN*EMw@scfSt$1ATM^f0=$jr!?+TqZlnVxYVBmxz3X;<_H-;m#0*Sb(O}~E|G_K#jZJd>lOko-Z zPVzmwZAD@^CmkX0lHFM4ENWSbKDDXHUlc9PZ|NL2c=ZpiA4q7H#-*lJ6d6#q0J?@vX!#}wTTrWCWIqVewwHgpGlkEd5%JNPR2EPlu6y-23l!_t5bv}9Mzx2!c%2eZuUN@)XhE*Q0c#cb_Ko(LNymE6 z8|IY0OJAqOcdt`O|B~ypei!s|M&T8w6BDOsc1&PDe(T@Mz2L3#>|efwi@l5$iv8DT z;^*maCu@onSgWXCK4mr+UJ8Z{Q6Uk*!JmC!_TbNs9Qkq7u6~KQ2eJv+oJHGW;(dp9 z5cxGcU~``Fep)wJ`|=H`Tb6P{RB8&ngl?r`MSf!XO4ks_*UOG|aY1tGrh^`_J+E_qw(rS&Pp7JH^{&;=ub`-~^7htFcZos7mFGs4l&t?o zP5RRf^i@JaTUcyOMZu8{`}hg3$NODkby7l(!g||C`B+PwvB3WR+eLvYBgEwHV^y9J zj$Kdpn(inCdD}$CPnP7B$IS!$HDgJS*T<-0aV?P z3~sQc5>hli#KO_x_rTap0nfloo%^$13d*oej|kU1#INtdA|MsnaI&@&#IMcK@C$rZ zc(t}w2VNH#euTV|mNvc0ll(pvKF<0}XyCAczJVdJFEx9krk1}fp!z$aaf*h@2qRbH zkq{y>>LYLuh#|)IxKaeivV2c{q~Ig8F&LFmx!4^qx9wI#d2%)Whbb8vmNM=|J~roT zBo6I7mKS!_05!_#crjMbvBT95c~T}FZ7qnzdfSr)&J2_qeJ^kwWnsUdUHIIuX=Uby z`Y1*A(dM8enVl6D4=8<{sZiNosiR{h^bji9?y8V7loClRes<0CBR5h^-%uXDvKrpj zQ$GhqGV8pce!(&Of)lgLZ}+0*a!T*H!ANNGT}s$~JgpO}@A*rvgoz#eq=poe1ls!lVkXbv{_F=1;53 zv~}oR2-%&mXkD|2BdQ?!ySb!batX}V6aOao&NJOG)k`VkI@vaJXKq@zRzrVSM?Z%l z2M%%e7c76?t_Tfr>t?u>MkET4G!s@kyVzlN{D#|1?GSkOsp_2eBwmeO6P*3H6q6a9 z;;zwqlq?3LO71Yqu+*Ex^MU0A+^VeTrBrCKFLvMJ)B5hHZ#q@VR!QaCcNt;olA zoPb2Lg zK-Bra)xqzC5Iho%HeLN@e>TTzFpgt;KcBHBn4%r>p6*!pdK<)#(hPpBwGr)rGaOpDugJlW%*AD~f(5j-6XzI`n^b=QVi-&d5Q~ zS))SQ^}D65Vo+u2(Wg1(2`cuLxXu;{wB77uSTxQ8O$Oo~c=94#PN3%vt5jOG{%v<| z-C#|=EJi$K86{M;s2w9g@6;f7;>)TppBtl{OEt9e(br^I$v7c*D(JS?Sck zxL=F;<; zcNe=wa?~0Hrej~{8Cxqo^30a(kZjnEW?MubPD~yVSJ61BlsG?QuPAD@cjh(IRcFjG z7vV@>wCT9>jNP0tZ&t`M5_kb%P6YT%Umzcq+(73lQO+;Di4mehH2f(FjXiZsswc{H zA9yNdW7HApD9IT}e#%%_H<4m7$LhX6k4*nu`oamVAeF)Am*)Z$BT3J(FAvX#75ZR` zGXrFBOxUm9dJ=h(UOFr%O!by51`3n1PV5IilWvxpE;N4zH+k; zrrz&n8sS_8F%7R-h+pX<* zhYth@ZyPQ%?B$!9_?dzO{2*I6qYEF*Y{NnuUI>F`1?n0#yzxdHZ1!jWlH!>SceAR4 z=?{~BxJw*s_Xr@sx{hReqkp8pN}sF#R($vGcf@f7FK$zOdev{iNwd(^W{BMzX5}h( zGL`I3TLlB@ORLp-mQZ%EhHRFs6WHcD%<1Ecnu{K}P%V4h10yU{LlScup=uF`xu&K) z#qlZ>DoJ`z4@-iBG9<;Kk?b)&IH;ScP@$5Z9v3DTvYs|kt3%QfHiX1T%8*!HlXru& zG)QXgm5iB=FbkcGT8C3N_kg)^)P;>WXx`o>$6n{LGS54@hSbIei3YB(cV1jUjL2Os z#~9FzE7hL5%v#+=yN9_;tSH4N;k0G7B{~B`p|`Pf=|^i6;F@JMXhkTXuQotMZ(U;5 zcC+T5HGu!aArI3{=wpC{DN)v6XEWp2^t2Hg4LRF8Au>5$x8zq^SVRva4T(AvJb-5K*4@_G}1lV{{s!B zQ+ceH@Dw`F0~QSbStY%8%DnXz2$06IE#>&0(dQh`w``oJ#FSy>k8X`^x2hvHI>wr` zCeHzF78}(WSVJdt&X)%fA%C!c}+giM^MVfzf)bRA~tsqP`rx{eS)@JI0wkv*Fq`E z*`P=xu{@;Z-hS!KR_&i7Yx!<*Rgjn;c@GaVR|2EN;xq z{f4!>_a2bd7NmPxS@=-HibQEprBIV0=*_}CP;9RMg?~KrWR;)k)NuGcwF@1$?R7-r z;!^~b=X}@|Wa{TbN#i{k$X&{8Wt-HPSbbJ@9LkR0ur$4~=Y{9IExajye5{+$1|Gv` zkg15OvpbDkDc+AWiT%5|^VGoGP}BW02meap$o`boJ%C|fmyUR7A}e}L>a(8|hsiR+ z3&+0v*^fVAm96m#YFp=rz8fKx=;&zRta~zZH@T4gd0@}vp=25k4kg%h{aBd+<&gR; z3h7Lb>%?&&9qJ|83DfK1CLz;!O+3cg8Hqo1cfneJ#xRX<3N{QPP5Wu|fC1@kb_MHF z{=>c-3D=(;IBrp+jC6L6x$e3=@Mo24aDS(*=mbTKImVX+Ir5c472L9VS1;P|$2H`{ ziPM2Be|{-mg?Sf1D1>~B0CoDZ;3#9k)Ra(6Wfm)l)uhe3%dKa8cIHZ4=h#gJ1<<$jM+o>0D#li{*QqXv0 ziABA>OGj;oqVsbKQt{leCT}epAh z!Z=FasAha@Oi3fa7S0MOnv34lh49prMTF-Sj2fn;jEr-zGMAvGYpoZWX>+n%T zLu5Np0SFyaB!FF27|wPjBuBv2TfO&UUzu0^68j`Jk*weZtc)8_7JoqxLjHQ&_4jW- zT?$cPV*lwZ4`0rVRO`USY4Rr>pV^SmA*tfn*OplieETPceo5{xg{qn}{TKwdc=O_v zHtydwBA@=G;kwh@^&V)va5QGhb1JjcOf;k)ub`u|>0UXITwC->3flwb_4RV>D%D;d ziYaGCu=6L^o-zBeWo-Zh-3UyT=V@$0bor6!s@)DS=FzVo>3 zt4->kUR`(ccA%vdwLc%3#-WV<6sTrTpe_MQJhFBr*b|xf=%h_mMx5btJ@V}9kN~E6 zh^49CbY4|Zrp5kAsPQ?oE5Tc|a!nxEpEq4u7O08*q1CnuHGFIoLOnBbeA;aqk==u7 zn&vZt#aVCehM0bb@%kURLe33d`Pdfc5UI>?sWZTc%KOPL!WnL;ci(jrZv0ky&0R6` ziPWrGaGr4@|BSo5O9=n!ZDp`yd38ab66yY{Dl?^Owq*+iy>@-i-g8Uzq@9!bo|R41 z)^uDhZ6LDLF-A-&%b%Rvl?(R`rr(~~^zWTE3w6vE;>Yyjpn#up)a=~zjdx09ss{d# zpih1_ahvoQfJ3lxcFU1 ziHoCaO6$`Q2?6i}ZuB>Cjwlzn%D5*{@0T$+opz0VjoSy|dq6r}pvu`X(&KTmDs(t*BV>mzcr`;#quc4-Zzq!bDmD#^4MW>zlC1AKDCUfi!H|Ak7 zuFXB5ozU$FH68k%hIEny0cVJiWU_P=e?|Py?=fY3kJ-(4m^$M*?U8zdfd}d)I{Gu; zzuk$&>FGHz&JfwesPiq~p2fW25e$7?(#ZLBQNxMN@NsC|5T+smY)T;-Kh9>&&ApC_ z5aF+%m}q*_885?$zhYHKE33JA@F8l~M0B~MN?fr@go9+vZK$O+m&P48j1N>4zM6^h zU+-T38u{emIqgTo6J^m`cv%FV7<_U&h)Gb8f#9}W|I|!v{(UA?N8cye>y?l5MRfrf zzG!y#s7~(Wp`+nIZlcVnmA?7v&1NV_cUB3;F-sMRdRx2acC>N`OO_)^E>P{rYg_1O zn=wfOF}Z5Rw+=@6vEHeOi>K)(DNlVlkM4?f@6m-#^V##{tS%u|Li~G9hhy{^pss`- zxdAI7NpuAIykpYRsIL0oMO|LIuGABqQ->ItdiU(}hT)&(k>YbTWaF?{i=N`jHMag? z)Z(kSZ`&E)E?HBo!!&GX(KC>8oMzOX%NgI+6T>vMLgXgK9`%RO`Fw0DIpqqU->ZD+dilWE+n;X*#R%BRoA__(|a*_4``AlFtdK@>Wp$V`VKYtrA{@>c4;^TzW?$+`l*bF literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/casbah_src.jpg b/maps/casbah_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/casbah_src.jpg rename to maps/casbah_src.jpg diff --git a/maps/crossover2.jpg b/maps/crossover2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea1c985c75c9b9b0e456eeb97b2ad17efd187931 GIT binary patch literal 6790 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 Iq&|N8ALJOYCjbBd literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/crossover2_src.jpg b/maps/crossover2_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/crossover2_src.jpg rename to maps/crossover2_src.jpg diff --git a/maps/cz2.jpg b/maps/cz2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..385fdb7120b83a4b03d200c15e2516ea7f5a72b9 GIT binary patch literal 4486 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 R4FfAC-r(t#G3oP({{y#|9AN+e literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/flagrun_src.jpg b/maps/flagrun_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/flagrun_src.jpg rename to maps/flagrun_src.jpg diff --git a/maps/hunted.jpg b/maps/hunted.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdc35dfd8a691270ad53488f9ef0ab32daf2e441 GIT binary patch literal 6478 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 C0ysYa literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/hunted_src.jpg b/maps/hunted_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/hunted_src.jpg rename to maps/hunted_src.jpg diff --git a/maps/push.jpg b/maps/push.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c5439864a3da34cfc5fcc463bb2341a904798ec GIT binary patch literal 4812 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 literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/push_src.jpg b/maps/push_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/push_src.jpg rename to maps/push_src.jpg diff --git a/maps/rock2.jpg b/maps/rock2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96d2023d7bd849aa15a82dfec60b8c62903a13fa GIT binary patch literal 4952 zcmb7{Wn9w@)c5}|1`IcHbVv+oX+}y(=SD~=BB6uPp$JG_P9+A8Zs}1H(q4+RbSf!G zDgzXTAa%jb{o;8(&)esF&a3k~=XcKAb2)qY9bh!pH_`_vC;))sDuBxcKoT33QR{sLrn{%gF>&-UAqROXJ&-aGtpnW#>mFV!~$n!WrZ@ZbFjfVnBlDO z|23fiUCmH|Az&~B4!Z_}|9^A&31FfHqJSt6g&;u5L;+%=xaTmk$as41^b zq@e(4Ay={nBS1+(Nkv5kqM@Xs23_?~T**uTm|1{YRvX14=;BWUmlM*7eqGo(fv#so z$nUWUD?A8@A*}3QjdM`|l%W5|8vrP&016P8`btAE0hCuzP=WsMZVE~!kN~qR6ce9iP+C*qxT$s7H~g&m zy#md>9mSNLZL|QJzWd+hYqr6g(mu2Jta*)|*G#1MD?ck;a(+gRLB{%rk~UcM5U23N zTaNS(u}VaQ>QmS#59nEfrn;1?o^4C|+25{>mqK9_xb+l6ag{@5M{2Dg*zKck!#pQe z-Xtdn@Xk7h=oBxly-c4`w>S$GC;@&SLzS2|7k6YO>-$n$8wfNczfyenaO5G!jv-NM zX!@Wlx~<{b>FUd{vNQTv9&q*wO~)nBYWXtIHFEbkb12129cZqBjU@Bbu-zc6>2+z} zdHrIQYSqv-^PyZ?0&efyKx<#|{E{9J2O^Y7vIOvFAOhUyj# zmL1}b8XWRKLt2p+v%mV0;*t71W_&M_rEj+^nQGA&8p$S{7=oQ99p*KS%Q_X{|+AG$(({HR>TJ|k_t4u#t z-iYzctP(AjfCVX5(wv%0$Eluo-^@YZL5EkD|JKLNHZJgg#c)l1RxnItS|Ukdp9;qq zMjIzPk!?5P2IK4+*-EQe#AXq=e%8tA#@hDGGsY0*Q9If76A3|Vqe_%LCm$zMbknES z?ya|at+wvJtXJPcSKaEop)`j#C11dY-~!A;+ng7EssG(#K5kdA=j^6qL&R>oHnX-T ziNdyq81auabfX1qc_Eezo3bm;H!ifk2d(=hd{7fVo`SgD-Vo51<9_O5B6XyG#aFsgHc6E&2xJhj_6lnHKlt#p|xeuF6%O4`5$M#w$Qa z{iXYx4X&oWm2Ppbi1ro()3!x?Ub5`xeS$;6aM^i>$}FD5*OFR)MHoH3O3SBs0u6&< zor2xX{PFMPWjl027gw-L7St>BT?xMKc~UkMBPJu)Pqfk}yR$%3ZCwOUhe3?G0Y2YK zO!T9xyJlUlwdKF@_se}vRWZV?4R-j9F2AwY*qfpmHW|lCvW86%-wJ80nn8El^QWYk z%+}vThF|`7Su8AMg6`;}86@ozMpeWryV147X8b{EcEki<{}QbBLV=`a(%=T!nuZNm zNp8<=h@>yNVQ}{|^(8>;2j704X5Xd%_*C!HhuZk0eQ{AIBfSg?{{YXZlx5IlW0H`( zDEO5U&+~!a6Ha%I{#SlREf3#4`bQBbAQFFHy?X{yg67L5AMpNOfSlNSJd6-AYgYQ< zGkaH2ePXn9B8I4h@cz6OpVej@c&3DJRQU@WcBiQwzn^uO)nbSEl(<->VDxGuYOn&Z z0j}o~1P`l0A$&G^B#cT+dZvtVE;vAzI`8XduVJ$iJzE*>`b*AW$tcM&g$^zRl&aq68Oaj~fOJW0p2OCV_s9CUKz`+8!GH>L`7 z(ZpGXL0NHn)-k{tExtJT|G6Q z6D__uFCHit9mn?UZ?gWe_8)}W2P^o+bH}VxUIH~QR-Vs%J+DzTGh!E4q#%Vdi~*Kt zi#uYId>9^rPW)p2Lok9eqUfvoAU`RXJ2vpdkv$igJ!zC{g{a)6O_pCE^2&_C&eewH zp@STiL=rl4p;tD#T5Rb%4<=N)^E}@IZeU@Bl4GPGJdiZ1Yek){wpawgJ-=3u3m(Ut zk(tpG;}C4@i}TfrX3S4AHDImCQ%*QWncQ5DYx<@NkfSw9kW=x@)eUx>yRFk zofpi}F=C2%*kPGq^fT=Ks%e#CS!rAW(wGx78q3^p?ACOVav!<;@oWE0yVm!C2F?co z)`j}+d)pT`hR9slX1u8BL`ifZLiRxAf!6l3wJFYD-g{yAl5Bf)Hv99eOu1>nS*Jfr znmDDMe%wPm16wwdIQ34bp*p(d*1fYZ-nLxyRQT;Dbgw2nC*`ndemH*eEtlQDwXwaU zQiE#mpoD~?Vhz*_kL$EgDsgPtMF?^rN}%Jrx9iwPp(#HRR+P>SIFtnb;b-#EIZm|KPO&j%rhXcl$1pkLHEHv<)7EM18}&UqeMC+j{TbU<>hrUfzo3KNxLHAIH9@?03H>GT>k@d2 z+}78v?Fv3OF|RUvw3WIYN-L7QkgmXh>!7yHcdHzJXz(&QNY)(+KJ{LByLiUKw3o&{ zIC0BSoX#`YGEtrIvJ*kMOU!HeiRAwthiRBSRHVkBEKReAty@y=Hct@~`FW2zNd5yE zuf@z$CZ=$-qU2=9p1px-t~`cC27Pt|YWOhnY|JX;qs7njNX@^tft;$E&5$xmOFu)_MvGTjqjXKq&ptn6}OQC-Nen-PY>x+?G10JhhDM z)RUsyUiU5moA_tQkK%VkzGaK)i5p5(4_3MkTzJrViW8~lW5Lj_^`_6jPRO~xqbB=g z$-H2UScYLjBluftl4Dw(X1RZ~nA7JNIvJE73#&Vym^j{B;s zsgF(BH5?%C_>__)%UJp?gw3LClVlzZCf@`%#u&&iaNdo0Fk_uXWki7}pa<98`iI~n z^Y4OEij3RdeP8NR+t6ntkiWib47y#cySKlv24s$h#!cO5FmOihY4}};`dj}aXEcx| z_mdw&NA&UR$C@W8)x)3=klonaee#GkCXIRU9qmA85 z;H&b#oScQusg*kY0m8`~h8M}973ckBineYYu`+iiHsPD>)lZFM{g~}OsL+r!zt!i2 z-;Xi2*n8qe{^sUavb1zx6U#QOBbe`CYe}e0TM6T)zbKyePWZ8k%#ba9DJ$?mB(QFg z+~Ylt3Inflx#p5*8D_X2ceAFa#E9N?jW#71lgRRSI|FDZ!Aa8L4(A@_)Ll21iwnKcrnb~|+`3}g03DOh{1Q1Oh!b4*RGM}2 zQE`UH&G)VLty9eSw90?>bQugdwCggmvDy@`bn`<37~s#vG4x=K=5{Y1dRE^x8qpC` zj+$E@?pbJS>&4s4t2Q*20xoSxp{c*!3b|4}_C4)FMGg#QWRHNC3q~S-IXT$S`J+yH z-@T=Ke1!yY(n%oKB>;;@e+sAVn{mXv=Z??&+%G6+;{2{?O}u@=%rVmnRliTyxJZx} z$^6}v>fgPw# zr%5E=h`qaneaS43yD*IiRTDMyMlujidLK1hp1!(}{{vbwzaED&nvU|kdCfSykM_+(?~I!}*{~-vHT)xSauV|0u)t2oCy2bbJ5}1!BdT1Ce3DlD z%4X>kCTT$Q_p`sv7sWiD2{Y16GXs`2HE|};tw6Rj8N`1gK6jdGnrEMh|9O6>4K@>3 zbhENL0Y?SNrn3oUthL;sf^xQ80z%HwtYstd&I?aU_n`WT>14E`z0j8mAL{QFhkdTMT-3?O2@$EV zsP5F0>T$ycJ)vGfvYV1}NmYZ2op;IvbhMeaDV2WRQ!^Or<6pPurK>I3&{=qo$O~RDUa0{kqg*IPEy7d_nNGS+l}a*_p9$VYc2sK#-Uv>apm8ycrPbPRr%Q*5GkZLF?@emFjVl& z@a;csOofhrd9{2^$o&><;yV^M%BoSEc4_8Z(S4$89~y|(+o<(zdOQpxP49->I)30l_}p{#t)6`kl}l0MDRuMZ9a>xt2wy5$QEZan zVwV(3cm`rs%qr@miwK~PBKN9)k+)2u8d(Nl^RW|Mqv;HSjDhLv)UbZL5rzbN>S`B@ti% literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/rock2_src.jpg b/maps/rock2_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/rock2_src.jpg rename to maps/rock2_src.jpg diff --git a/maps/warpath.jpg b/maps/warpath.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfcfe8afdf36f715281bc102e34dbeaa9d53018d GIT binary patch literal 6674 zcmb7ocRU+z^lnIqz4snb`&*Q1jHY&CkDykm9YyU;jaEyo#As1_B~fbc8r8;Xsa;Y< zLsOJiQKiK7yPtbM_wW0>=fCGX&pGdTKkq;1;?u<%fX&ztVF;k20syEk58#3b&;tOe zssAS~0lEwtIvN@fh=u_Srln(IU}9oqU}R)w;b3ECVP|1vWaD9D=j7t%=4N8$<>TSv zv_KG;j+zQ^$wJux)Kr&kQ~ytG0QfS6iu&>b>;MjNT4fzhE3m}fU@ny;G`FO6 z#V=j=<{`*6y^zr9^-HNB72tpS{y*bOAvG-(0DMU*u>&q`sj2B`f&Yi6x@-f)F3zFM zsY636p>j7EJ#Cd#(LD6)nyy~R#WH~DGLf1c$PR!3f)EKMM>0@;fqEQ=UP(e;xBlYY z-WX+n&Cui7fc}3xQ{TEo&UO^-e&1Leu(|*=48&VtGFysQ_%Q_y-cIcbDZar|+3|My zB=&;O)c=INQ4Xq6Zy#sJvsd@deK_mLLlbXt3D62XCG@WgHDYTG-JKwR1!#{Lq@=D* z))YDnMF^~46X_b zH?|BgoB}4jy7P6qWt8_@+Vc0B2wFR`5Xp2duRKWLrRnMUQNI4i?C zITUFA)$c0_!)eBU;rubKTaaNWIUJQ*B6bqh&LVSB7*J;Li5Mz z{fm6HeRbyy&aH%(AK_{&J_xdQEhM>@VhWxQ->EMQm2Y}HO4;dQzDj9X#$tBN*d`{lVy;lp1g4=Vnc z-0OxZiN#0Fjfbc%NqH#-+8JA7Symlkg`pX1`{)aRsEcjFi|S`5Z^&lUoEh*T_|4BG z7h9P5N93^-@4;DMrO9-=<>qvme(x(dQBcGErTyy$L&e(;Y{Z& zZ{z>o)OFYN)-&4eJqiIVZV2|RZMVgV{GEU3)-ZD8c)ICvT;<$#Iox<>HA9)ye%%DG zg^eB{CasDIHq%!E`RJMv#gZuo1OPLgi*ehMk6wcgM?ue|HI4dfkZILCSBBL1eK*6) z(_~R;?2?_c{o!BzjzI-aXI%$0CKhpWW4eoM#RSXVHKkME22o2ZEQh_Ttn60^5Q0gB zh2r#eL|o)8J}6DgH!XZPG!v~Jx#AYmM}DJrx##lmbnFs2M>gU&21d@k)3iT zZSyynxkA8Fbf>Wx+Jv4DfqzaJ84K;uD4xb(0jpd69eky{!GbMOq|&v}$!^EJrXdq` zTE3&=`?0M5`R%Ifn`k*Z2-j&k$r~ngwGQ8$4XMWXQ}mxjQ zfL9liqPT^_pb+7LfG1A$^Zz?0>v-;HhPP~~e+}dsgN%3%s+2UeHXr0J8O`kw?@^U|arQ8F zOS0L0!LK>)l!Oa2uo>G-k4CIr035_pNm?YppDFa8;!Loen$fTEC-ManWY*zCt9Z=F(#Qh(mVH51*8@$`zD+SeoaGd#-j zJVcEALr3TF=IDkB3cX33x=8A}Ndcy)_RJ7?c(b>*OA$Fu{L0K>=u zfQo*ay4JZ~eGSo02TV#1P8vJSt#3JcS|dl(emN%e&v2ESPb!~0D?9Pv-u{9VukKDy2%dafmS$v@1&~zeS*f zDU)>iWy5zP&768-Vqs-zJU_N*SKQj-JKw_d%n+x!DX*9m}O=q%g_%GRyg?|d)XGE_rlZ6lTbK_JlE5l86lNcp{(mo zgCfIPKF$Y=36Ee-cjEamcO~WVTA!>Vs9r=0kvn%AlX;2+G~lw%l?JrBX%JxK>I-3d zVf*Pn_~gv+*4g(6_j-uegb*gdxeSby9eR@MrGnB=1hm3Zd3VyoUzxj4NhzjsOxWJZ z(pJs!@a9`j>wKlR3r{0@y?LT!N%W;l(t?jad&ZKG zH?HPa{J7s^r%_<&BJ?=nLB*Zz2ZY1-=$CCAGcru-w)*CSu`L~NQt6UtfQKu`E1raw z)YN$^7tS|cIipSQnF<+)ZtUh(uH5@Ij3s$tdtB;YeZK%`n1$rc*>s%-hzFngm6?6s zL)tQ$zZUk(M-jhak_*L00-aOA#O?zE&Sv;cTPN)o8Ed3!GV$kHdq<0t2C?eY*BM_g zThn16WZ6eoq1%)hbRtA?#y~gzp%xl9nb_vXgs!-eP&G#n?yQ*QWSuE&i*1qRVTQMd*VTu<*$ z_vzoO1|EaW0Tk5N;|Fzkj6)?OB2X^56iPedR!xqcjBnENnJlQ;zAZ1mVfVo0lTa32 z8oeaU`OnOXtHlvb`?WjmsQ|=PiI}7$0w6d?c{Pg?ChIr9y|pb+BT;WBFFPbQaxR|* z&Yda~kdzHeHjFC}wib3X>zh4S2_ULz?V3u)0bV3(W)8!YE&$p`-b8zp%4csi7O7gV zhi|6yq_XAPJial7rtX$$*cbfdQdL1tb1L8`o^NZJ2f(N`!@JKo*guM&y zw+KpgRO#KSmg6@9qt@cH2g*)$>bgc}$3QpHQg5^r$L^@GKiNf3M*l2bZkSuq3)&io zI^2==3FnZ>z2WTE@rAT?bbOFRTlKBYtLe9W&+%6yN2gN3xcqi%RN<9ce5av12lKyp z?cSDZ&IupETLi?+ZfE`dqoWX~%EpEs0}IWf?ey*%uS|watWYz{kGC0DHvzd>RCj7x zS2cQy`dePdJInWtF%?%ny!yT=6$}ZUG)e}L&F9p@=|OYJsm7?UhfD0UVvj(98~@GG z*kiO#G?b_+7igFV8O7Td)jL1hociZWMA-UyZ|rHE&G5Xzf;`dKSK83+Wtplfyd%m2 zCpj0iCkRB@ih0F0vamq;G{78oh()Cb0z_AP)r|gjE{G0-4e(^${C5C!!foR($@Gv@ ztq6m!3pbfJM$lF_x*PmR1ny!I>Pom5QH1YifTS>mnYocbC4vnqGi6E)2n9=*K}r)& zM|aPyJC>ToDJ}87*8V|fru7p|h z9z!B+D4RpG#$m5ajv7L2Z*Pl?#PQu9Ho7LBmqm1D@ADYqCp*8Mb}^CasB{$Q{?b@@ z8!ajH{6s8iukS&E8kYD9_7DS=@G33U=|+mM`m=>ai}5R7hxK91a@v-b=%;WB=T_cW z)r0v3t9(!ln#MJO92nod;1N;2?dVu#E$=7q)Kj>r5W4V;0p*i*b zhk}KHsvOpcl5R_zZ^sva0|9vN*)^F=TT}gpvU3$G@NS)|-WC7WNG3%;fjduoYX4s8 za@cUAWotm{!CD{0n~3U|+4JnE&8&un9_YL04atoBb7qM?UerpzH(zR~WFjpT09pI~ zuI|+yn|X5EedQPR(O{v2&%$1Fjg-ct@xRcj{DS(c7AqS1eA|i~Ha5!QPv1r~OG8ed zPKIcbHGV&9S3P3ZzWR0hoX6PZ!;`%19k6EaF~QLMb=VX^utsF0ras*_bw-wKHh!~v z3T(mdqM_Gt#dpuwKk}NW8WPRih>(>2Hbnl6lI}G6-9q}RjTU@$wz^$W(2=~VJE!^` zZ6q$?I^6g%GIE!UPzi5WD^1&qx6HMlp@_f`T>aOww@6bVD_t8qD_?g_j1US*wfMWK z@O8nA>d^LULy#5}`8UMkZ2M;hHpuS7t6 z9SeZq3Dd{0dS#)Ftl^Q;Sg!$g|Mmw@9^SuQ7v^PsEo&GEd!><3bnF1~lASlXmQhHn z@?c7UHR8!i5mR7()k=3+w=_R#M6#nWsaBmjMWJZfTGT8Ii|ZJ^rV06N^W+b?%s!;T z=Ct{|9XDWZb2#4^V;p{_pO;^3TQ&AJ5Pu^19dX{47Tq#u>EeGZ7Y#{Il^gxiK{E=5 z$>jcE`FyY@d|eTl7K?MZGKFJ+n{YtwykMU)ZyfV_a@G6OJTZ{PM~<+k{Tg4}15avS z0Q3mYdmdmts~b3t9MotWnWRiPxU|oQNEDV9^JfKX^Pyid^|U*-6tZMPvrSXq1`b%K z{A1RhH4!?=QS#CXrbI5*BrnMNaLhjH|D>^;e9pV3Q5;mD(|#`}N$|mM*|WOy;q17` z`8(x*O&|yF7qHb)^qPg~>wK)>i1@Da)|UkZ>oy!CK2*74Og+HnJ|KE!P#VPHcTN z@*WPz)|k@BE^lh#;}ts2IICOj6gy|>=|6HW-(ggl8#1uv)*2VMZY{@~o1=FXD#ST8 zL3FTi4l|p418Omne!r^va-iHl>jL2X``RI)lg2H$dC2r82kmv|?}wd&^0a0j_%uUH zNuRco#}*X@uw{^uH<-}uffJH>CreSx=%>kM!e-)^Vc)R}fJv!+*KX=MfH80swSJM0%sAy{!{2KLq;X({*gv5l`s{a<86{Z>mpGyK~tb%0|IP-T~x zOX0AYP>y7v118>dM-YrU$_*gd*A-jb2ryhvx*u#Vtu$#(UKT-w%Iy zRO=;mf2=AK&*SLYCqNf6_h;Ah!SB8#mrhBUhS~Q(X#(&)-AP`^h?^7(2%^rdiX;Nj6>N33aBdqj_Z)JBfVs5VE%1wg&Pa)e)d zQtdq&`I;FKev+GPqa|YAd#~o|p(|Gm2>DvufD;Kh!^)Vpd(7l`8llW{OsdjyNk)ek0DH<$ zk>!2O>&tdbtS}`zFbYr_f8Ms^b+2Se)?Bbir8t5A%)IaHCVIUNS8&ghd~&!+m_;X# zm5mPf8-b_#JDkko)otkgyn{n4ON?rpvG%NEK}(X~tX80qkQ-#@B`XCa-H~FMY2y!8 zP!u5}Ec4sWtXg((O#_A@EytVd?pE7_Ejtm5gxG8W-P-(?h{BX(^Vvy{;TE34`Ex2A zS3w4CT;JWVp^tUe;lDKxUKXs+wmQ~D)uV=6sl{_7S#6GhU6czze3+}*f&&F&ZT;cQ zFiZXk$VBJ1qeea-X*MXLhYVBZ+kXW8_yzyh%2s4OumF((UkcQ%5K1IwFZN_Gg=WJ2 ze;Y+W9eh1nc$LDnxADGGSs!aP(w?Dkm>_*)GF8xEGWUo=dFJP{&~JM$yA+%VbkA_XKZDD zy8I+S=+CjA_~Ywh5Q9X})p~edb8okvYW)G1?MNV)II>f5*zwI;xX$wDV|f8}B1S8| zEkX{(z04ubu$nX4opGKW6z(Sw^W2lD)<#3=@>yPOUfWquOm>OS=ks-Or@(y}s8lC; zllHpzU@mbHMg~vzYU4N`O9HZ1|BIex*8ye4U<%pWKpznI?xb8>pH3xsbw<>(=m; z1`qk88P>M2M=`gbXMZ-huLZR>=%i?nU~nZrbn*GVfpTW z8KO6Y)}p{R_Z*cDS2VL66X)VIyNUf`Bl8Pfonxpz!@1)gtFtOAi0pGYajT@Aq_a+b z!8{y<>*K_#p58CYx^Q?pCQG#ewVnNSaSnqrcYcRXwOiXIC&J0eVQ_`~4ig4Fv$&UC zZ!n_f5L?YCZ<>LXQR@-FM#R`OBt5r5CcyduTcgjTwMOIgs0>;tubhWh@DMp)GABfn z8FEE3G_#MwYx#`g3ix2Aq1b#b%u!g>0c} zUpwKq0_pi`pZ~Xz#3#pbgK#_N8c}+SWNM_&^e5t0oIS5|*_`U^yZce(+M?$cNiELu z$3PHuaQ07Kj_8Wk$q0p;2)CJ&WOh~Mh#X97P^Ll1WrKeOO*q!g7%$=vh~B&;W};GwT*>Gw?@T|MLjm| z`Fv-6>b?nE^Q?0;9^zj$rI)u1#q1aO<3ujEgu?>ldL*Ibw)(~m`4rM*aSX$XMaWJs lC=`;bkdJQqv;>iz0{$dC!#=_&Jqu*Ni=OVHYIeO?`d@|cW`Y0! literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/warpath_src.jpg b/maps/warpath_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/warpath_src.jpg rename to maps/warpath_src.jpg diff --git a/maps/well.jpg b/maps/well.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91eea41e948765ce3766ccde40d94343036024b6 GIT binary patch literal 5130 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 N6>;&4c#oU8{{f6Wc}oBQ literal 0 HcmV?d00001 diff --git a/zpak001.pk3dir/maps/well_src.jpg b/maps/well_src.jpg similarity index 100% rename from zpak001.pk3dir/maps/well_src.jpg rename to maps/well_src.jpg diff --git a/zpak001.pk3dir/particles/weapon_railgun.cfg b/particles/weapon_railgun.cfg similarity index 100% rename from zpak001.pk3dir/particles/weapon_railgun.cfg rename to particles/weapon_railgun.cfg diff --git a/quake.rc b/quake.rc new file mode 100644 index 0000000..ea26d80 --- /dev/null +++ b/quake.rc @@ -0,0 +1,5 @@ +exec default_controls.cfg +exec default_cvar.cfg +exec default_video.cfg +exec default_valve.cfg +exec default_tfc.cfg diff --git a/radiant.game b/radiant.game deleted file mode 100644 index a3bb8b1..0000000 --- a/radiant.game +++ /dev/null @@ -1,26 +0,0 @@ - - diff --git a/radiant.xml b/radiant.xml deleted file mode 100644 index 84fafec..0000000 --- a/radiant.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - "hlcsg" - "hlbsp" - "hlvis" - "hlrad" - - qbsp -hlbsp -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" - qvis -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" - qlight -basedir "[EnginePath]" -gamedir "[GameName]" -path "[UserEnginePath]" - - - [csg] "[MapFile]" - [bsp] "[MapFile]" - [vis] -full "[MapFile]" - [light] -extra "[MapFile]" - - - [csg] "[MapFile]" - [bsp] "[MapFile]" - [vis] "[MapFile]" - [light] "[MapFile]" - - - [csg] "[MapFile]" - [bsp] "[MapFile]" - [vis] -fast "[MapFile]" - [light] -fast "[MapFile]" - - - [csg] "[MapFile]" - [bsp] "[MapFile]" - [vis] -fast "[MapFile]" - - - [csg] "[MapFile]" - [bsp] "[MapFile]" - - - [csg] -onlyents "[MapFile]" - [bsp]"[MapFile]" - - - - - [qbsp] "[MapFile]" - [qvis] "[MapFile]" - [qlight] -extra "[MapFile]" - - - [qbsp] "[MapFile]" - [qvis] "[MapFile]" - [qlight] "[MapFile]" - - - [qbsp] "[MapFile]" - [qvis] -fast "[MapFile]" - [qlight] -fast "[MapFile]" - - - [qbsp] "[MapFile]" - [qvis] -fast "[MapFile]" - - - [qbsp] "[MapFile]" - - - [qbsp] -onlyents "[MapFile]" - - - diff --git a/zpak001.pk3dir/scripts/constants.txt b/scripts/constants.txt similarity index 100% rename from zpak001.pk3dir/scripts/constants.txt rename to scripts/constants.txt diff --git a/src/Makefile b/src/Makefile index cc3f82d..4bd1c05 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,4 +2,5 @@ CC=fteqcc all: cd client && $(MAKE) + cd rules && $(MAKE) cd server && $(MAKE) diff --git a/src/client/Makefile b/src/client/Makefile index 2fe44a4..bcb3bed 100644 --- a/src/client/Makefile +++ b/src/client/Makefile @@ -1,4 +1,4 @@ QCC=fteqcc all: - $(QCC) progs.src + $(QCC) $(CFLAGS) -I../../../src/platform/ -I../../../valve/src/shared/ progs.src diff --git a/src/client/cmds.qc b/src/client/cmds.qc index 5160ace..7edfdca 100644 --- a/src/client/cmds.qc +++ b/src/client/cmds.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void VGUI_ChooseClass(void); +void VGUI_ChooseClass(int); bool ClientGame_ConsoleCommand(void) @@ -31,7 +31,7 @@ ClientGame_ConsoleCommand(void) break; case "chooseclass": case "changeclass": - VGUI_ChooseClass(); + VGUI_ChooseClass(userinfo.GetInteger(pSeat->m_ePlayer, "*team")); break; case "chooseteam": case "changeteam": diff --git a/src/client/game_event.qc b/src/client/game_event.qc index d4e6d77..a5b72b3 100644 --- a/src/client/game_event.qc +++ b/src/client/game_event.qc @@ -24,20 +24,6 @@ ClientGame_EventParse(float fHeader) case EV_OBITUARY: Obituary_Parse(); break; - case EV_BLOOD: - vector vBloodPos; - vector vBloodColor; - - vBloodPos[0] = readcoord(); - vBloodPos[1] = readcoord(); - vBloodPos[2] = readcoord(); - - vBloodColor[0] = readbyte() / 255; - vBloodColor[1] = readbyte() / 255; - vBloodColor[2] = readbyte() / 255; - - FX_Blood(vBloodPos, vBloodColor); - break; case EV_CHAT: float fSender = readbyte(); float fTeam = readbyte(); @@ -55,15 +41,6 @@ ClientGame_EventParse(float fHeader) case EV_VIEWMODEL: View_PlayAnimation(readbyte()); break; - case EV_WEAPON_PICKUP: - int w = readbyte(); - - if (autocvar_cl_autoweaponswitch == 1) { - sendevent("PlayerSwitchWeapon", "i", w); - } - - HUD_WeaponPickupNotify(w); - break; default: return (0); } diff --git a/src/client/hallucination.qc b/src/client/hallucination.qc index 99ad049..e792f13 100644 --- a/src/client/hallucination.qc +++ b/src/client/hallucination.qc @@ -1,5 +1,5 @@ class -TFCHallucination:NSEntity +TFCHallucination:ncEntity { }; @@ -28,7 +28,8 @@ TFCHallucination_Insert(vector viewPosition, vector viewDirection) halluPos += v_forward * random(8, 64); halluPos += v_up * random(-64, 64); halluPos += v_right * random(-64, 64); - FX_Blood(halluPos, [1,0,0]); + #warning FIX THE BLOOD CALL! + //FX_Blood(halluPos, [1,0,0]); } pointsound(viewPosition, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break; @@ -67,7 +68,7 @@ TFCHallucination_Insert(vector viewPosition, vector viewDirection) break; case 7: /* nade thrown about */ int nadeSelection = (int)floor(random(0, 8)); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); switch (nadeSelection) { case 1: @@ -107,7 +108,7 @@ TFCHallucination_Insert(vector viewPosition, vector viewDirection) break; case 8: /* nail shot around */ halluPos = viewPosition + (v_forward * -32) + (v_right * random(-64, 64)); - NSRenderableEntity eNail = spawn(NSRenderableEntity); + ncRenderableEntity eNail = spawn(ncRenderableEntity); eNail.SetModel("models/nail.mdl"); eNail.SetOrigin(halluPos); eNail.SetMovetype(MOVETYPE_NOCLIP); diff --git a/src/client/hud_ammonotify.qc b/src/client/hud_ammonotify.qc index 11ca3a5..58dc8f8 100644 --- a/src/client/hud_ammonotify.qc +++ b/src/client/hud_ammonotify.qc @@ -76,7 +76,7 @@ HUD_AmmoNotify_Insert(int type, int count) /* called whenever we should check for pickup updates */ void -HUD_AmmoNotify_Check(NSClientPlayer pl) +HUD_AmmoNotify_Check(ncPlayer pl) { HUD_AmmoNotify_Insert(0, pl.m_iAmmoTypes[1] - pl.m_iAmmoTypes_net[1]); HUD_AmmoNotify_Insert(1, pl.m_iAmmoTypes[2] - pl.m_iAmmoTypes_net[2]); diff --git a/src/client/hud_itemnotify.qc b/src/client/hud_itemnotify.qc index aa38106..56247cb 100644 --- a/src/client/hud_itemnotify.qc +++ b/src/client/hud_itemnotify.qc @@ -76,7 +76,7 @@ HUD_ItemNotify_Insert(int type, int count) /* called whenever we should check for pickup updates */ void -HUD_ItemNotify_Check(NSClientPlayer pl) +HUD_ItemNotify_Check(ncPlayer pl) { int healthdiff = bound(0, pl.health - pl.health_net, 100); int armordiff = bound(0, pl.armor - pl.armor_net, 100); diff --git a/src/client/init.qc b/src/client/init.qc index c92fd2e..bbb8d29 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -30,10 +30,9 @@ ClientGame_Init(float apilevel, string enginename, float engineversion) registercommand("-gren1"); registercommand("+gren2"); registercommand("-gren2"); - registercommand("chooseclass"); registercommand("changeclass"); - registercommand("chooseteam"); registercommand("changeteam"); + registercommand("chooseteam"); registercommand("lastinv"); registercommand("invnext"); @@ -59,8 +58,6 @@ ClientGame_RendererRestart(string rstr) Obituary_Precache(); Damage_Precache(); - FX_Blood_Init(); - /* HUD selection icons */ g_dmsg_spr = spriteframe("sprites/tfc_dmsg.spr", 0, 0.0f); g_tfchud1_spr = spriteframe("sprites/tfchud01.spr", 0, 0.0f); diff --git a/src/client/progs.src b/src/client/progs.src index ee00e31..338e480 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -1,6 +1,7 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../csprogs.dat" +#pragma forcecrc 54730 #define CSQC #define CLIENT @@ -43,8 +44,8 @@ hud_ammonotify.qc ../../../valve/src/client/scoreboard.qc ../../../src/client/include.src -vgui_chooseteam.qc -vgui_changeclass.qc +../../../valve/src/client/vgui_chooseteam.qc +../../../valve/src/client/vgui_changeclass.qc ../../../src/shared/include.src #endlist diff --git a/src/client/vgui_changeclass.qc b/src/client/vgui_changeclass.qc deleted file mode 100644 index 0f6fdf0..0000000 --- a/src/client/vgui_changeclass.qc +++ /dev/null @@ -1,232 +0,0 @@ -/* - * 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. - */ - -static string g_classDescrScout; -static string g_classDescrSniper; -static string g_classDescrSoldier; -static string g_classDescrDemoman; -static string g_classDescrMedic; -static string g_classDescrHWGuy; -static string g_classDescrPyro; -static string g_classDescrSpy; -static string g_classDescrEngineer; -static string g_classDescrRandomPC; - -static void -TFCClass_Init(void) -{ - g_classDescrScout = textfile_to_string("classes/short_scout.txt"); - g_classDescrSniper = textfile_to_string("classes/short_sniper.txt"); - g_classDescrSoldier = textfile_to_string("classes/short_soldier.txt"); - g_classDescrDemoman = textfile_to_string("classes/short_demoman.txt"); - g_classDescrMedic = textfile_to_string("classes/short_medic.txt"); - g_classDescrHWGuy = textfile_to_string("classes/short_hwguy.txt"); - g_classDescrPyro = textfile_to_string("classes/short_pyro.txt"); - g_classDescrSpy = textfile_to_string("classes/short_spy.txt"); - g_classDescrEngineer = textfile_to_string("classes/short_engineer.txt"); - g_classDescrRandomPC = textfile_to_string("classes/short_randompc.txt"); -} - -static VGUIWindow winClassSelection; -static VGUIPic imgClassPreview; -static VGUILabel lblClassTitle; -static VGUILabel lblClassDescription; -static VGUILabel lblClassCounter; - -class TFClassButton:VGUIButton -{ - void TFClassButton(void); - - virtual void OnMouseUp(void); - virtual void OnMouseEntered(void); -}; - -void -TFClassButton::TFClassButton(void) -{ -} - -void -TFClassButton::OnMouseUp(void) -{ - int classSelection = GetTag(); - sendevent("ClassJoin", "f", (float)classSelection); - winClassSelection.Hide(); -} - -void -TFClassButton::OnMouseEntered(void) -{ - int classSelection = GetTag(); - string teamName = "blue"; - - switch (getplayerkeyfloat(player_localnum, "*team")) { - case 1: - teamName = "blue"; - break; - case 2: - teamName = "red"; - break; - case 3: - teamName = "blue"; /* TFC doesn't ship with a real green. */ - break; - case 4: - teamName = "red"; /* TFC doesn't ship with a real yellow either. */ - break; - } - - switch (classSelection) { - case 1: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_scout")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_scout", teamName)); - lblClassDescription.SetTitle(g_classDescrScout); - break; - case 2: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_sniper")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_sniper", teamName)); - lblClassDescription.SetTitle(g_classDescrSniper); - break; - case 3: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_soldier")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_soldier", teamName)); - lblClassDescription.SetTitle(g_classDescrSoldier); - break; - case 4: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_demoman")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_demoman", teamName)); - lblClassDescription.SetTitle(g_classDescrDemoman); - break; - case 5: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_medic")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_medic", teamName)); - lblClassDescription.SetTitle(g_classDescrMedic); - break; - case 6: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_hwguy")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_hwguy", teamName)); - lblClassDescription.SetTitle(g_classDescrHWGuy); - break; - case 7: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_pyro")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_pyro", teamName)); - lblClassDescription.SetTitle(g_classDescrPyro); - break; - case 8: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_spy")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_spy", teamName)); - lblClassDescription.SetTitle(g_classDescrSpy); - break; - case 9: - lblClassTitle.SetTitle(Titles_GetTextBody("Title_engineer")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_engineer", teamName)); - lblClassDescription.SetTitle(g_classDescrEngineer); - break; - case 0: - lblClassTitle.SetTitle(Titles_GetTextBody("RandomPC")); - imgClassPreview.SetImage(strcat("gfx/vgui/640_randompc", teamName)); - lblClassDescription.SetTitle(g_classDescrRandomPC); - break; - } -} - -string g_classnames [] = { - "Scout", - "Sniper", - "Soldier", - "Demoman", - "Medic", - "HWGuy", - "Pyro", - "Spy", - "Engineer", - "Random" -}; - -void -VGUI_ChooseClass(void) -{ - static int initialized; - static TFClassButton *btns; - static VGUILabel lblSelectClass; - static VGUIFrame frmClassInfo; - - if (!initialized) { - vector btnpos = [40,80]; - initialized = TRUE; - - TFCClass_Init(); - - winClassSelection = spawn(VGUIWindow); - winClassSelection.SetSize([640, 480]); - winClassSelection.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); - - lblSelectClass = spawn(VGUILabel); - lblSelectClass.SetTitle(Titles_GetTextBody("Title_SelectYourClass")); - lblSelectClass.SetTextSize(19); - lblSelectClass.SetPos([40, 38]); - lblSelectClass.SetSize([400, 24]); - - frmClassInfo = spawn(VGUIFrame); - frmClassInfo.SetPos([176, 80]); - frmClassInfo.SetSize([424, 312]); - - imgClassPreview = spawn(VGUIPic); - imgClassPreview.SetPos([190, 90]); - - lblClassTitle = spawn(VGUILabel); - lblClassTitle.SetPos([338, 90]); - lblClassTitle.SetTextSize(19); - lblClassTitle.SetSize([320, 24]); - - lblClassCounter = spawn(VGUILabel); - lblClassCounter.SetPos([338, 90 + 32]); - lblClassCounter.SetSize([320, 18]); - - lblClassDescription = spawn(VGUILabel); - lblClassDescription.SetPos([338, 90 + 32 + 32]); - lblClassDescription.SetSize([250, 240]); - - g_uiDesktop.Add(winClassSelection); - winClassSelection.Add(lblSelectClass); - winClassSelection.Add(frmClassInfo); - winClassSelection.Add(imgClassPreview); - winClassSelection.Add(lblClassTitle); - winClassSelection.Add(lblClassCounter); - winClassSelection.Add(lblClassDescription); - - btns = memalloc(sizeof(TFClassButton) * g_classnames.length); - for (int i = 0; i < g_classnames.length; i++) { - btns[i] = spawn(TFClassButton); - btns[i].SetTitle(Titles_GetTextBody(g_classnames[i])); - btns[i].SetSize([124, 24]); - btns[i].SetPos(btnpos); - - if (i == 9) { - btns[i].SetKeyEquivalent("0"); - btns[i].SetTag(0); - } else { - btns[i].SetKeyEquivalent(ftos((float)i+1)); - btns[i].SetTag(i+1i); - } - - winClassSelection.Add(btns[i]); - btnpos[1] += 32; - } - } - - winClassSelection.Show(); - winClassSelection.SetPos((g_vidsize / 2) - (winClassSelection.GetSize() / 2)); -} \ No newline at end of file diff --git a/src/client/vgui_chooseteam.qc b/src/client/vgui_chooseteam.qc deleted file mode 100644 index 0ba9ecf..0000000 --- a/src/client/vgui_chooseteam.qc +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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. - */ - -static VGUIWindow winChooseTeam; - -class TFTeamButton:VGUIButton -{ - void TFTeamButton(void); - - virtual void OnMouseUp(void); -}; - -void -TFTeamButton::TFTeamButton(void) -{ -} - -void -TFTeamButton::OnMouseUp(void) -{ - int tag = GetTag(); - - localcmd("changeclass\n"); - sendevent("TeamJoin", "f", (float)tag); - winChooseTeam.Hide(); -} - - -string -VGUI_ChooseTeam_MapInfo(void) -{ - static string mapinfo = __NULL__; - - if (mapinfo != __NULL__) - return mapinfo; - - filestream fileMap = fopen(strcat("maps/", mapname, ".txt"), FILE_READ); - string temp; - - if (fileMap != -1) { - while ((temp = fgets(fileMap))) { - mapinfo = strcat(mapinfo, temp, "\n"); - } - } else { - mapinfo = Titles_GetTextBody("Map_Description_not_available"); - } - - return mapinfo; -} - -void -VGUI_ChooseTeam(void) -{ - static int initialized; - static VGUIButton btnAutoAssign; - static VGUIButton btnGoSpectator; - static VGUIFrame frmMapInfo; - static VGUILabel lblSelectTeam; - static VGUILabel lblMapName; - static VGUILabel lblMapInfo; - - if (!initialized) { - vector btnpos = [40,80]; - - initialized = TRUE; - winChooseTeam = spawn(VGUIWindow); - winChooseTeam.SetSize('640 480'); - winChooseTeam.SetStyleMask(VGUIWindowBorderless | VGUIWindowFullscreen); - - lblSelectTeam = spawn(VGUILabel); - lblSelectTeam.SetTitle(Titles_GetTextBody("Title_SelectYourTeam")); - lblSelectTeam.SetTextSize(19); - lblSelectTeam.SetPos([40, 38]); - lblSelectTeam.SetSize('400 24'); - - frmMapInfo = spawn(VGUIFrame); - frmMapInfo.SetPos('176 80'); - frmMapInfo.SetSize('424 312'); - - lblMapName = spawn(VGUILabel); - lblMapName.SetTitle(mapname); - lblMapName.SetTextSize(19); - lblMapName.SetPos('194 105'); - lblMapName.SetSize('250 312'); - - lblMapInfo = spawn(VGUILabel); - lblMapInfo.SetTitle(VGUI_ChooseTeam_MapInfo()); - lblMapInfo.SetPos('194 129'); - lblMapInfo.SetSize('375 250'); - - for (int t = 1; t <= serverkeyfloat("teams"); t++) { - TFTeamButton btnForTeam; - string team_name = serverkey(sprintf("team_%i", t)); - - btnForTeam = spawn(TFTeamButton); - btnForTeam.SetTitle(strtoupper(team_name)); - btnForTeam.SetPos(btnpos); - btnForTeam.SetKeyEquivalent(ftos((float)t)); - btnForTeam.SetSize('124 24'); - - switch (team_name) { - case "Blue": - btnForTeam.SetTag(1); - break; - case "Red": - btnForTeam.SetTag(2); - break; - case "Green": - btnForTeam.SetTag(3); - break; - case "Yellow": - btnForTeam.SetTag(4); - break; - } - - winChooseTeam.Add(btnForTeam); - btnpos[1] += 32; - } - - btnAutoAssign = spawn(VGUIButton); - btnAutoAssign.SetTitle(Titles_GetTextBody("Team_AutoAssign")); - btnAutoAssign.SetPos(btnpos); - btnAutoAssign.SetSize('124 24'); - btnAutoAssign.SetKeyEquivalent("5"); - //btnAutoAssign.SetFunc(VGUI_AutoAssign); - btnpos[1] += 32; - - btnGoSpectator = spawn(VGUIButton); - btnGoSpectator.SetTitle(Titles_GetTextBody("Menu_Spectate")); - btnGoSpectator.SetPos(btnpos); - btnGoSpectator.SetSize('124 24'); - btnGoSpectator.SetKeyEquivalent("6"); - //btnGoSpectator.SetFunc(VGUI_GoSpectator); - - g_uiDesktop.Add(winChooseTeam); - winChooseTeam.Add(frmMapInfo); - winChooseTeam.Add(lblSelectTeam); - winChooseTeam.Add(lblMapName); - winChooseTeam.Add(lblMapInfo); - winChooseTeam.Add(btnAutoAssign); - winChooseTeam.Add(btnGoSpectator); - } - - winChooseTeam.Show(); - winChooseTeam.SetPos((g_vidsize / 2) - (winChooseTeam.GetSize() / 2)); -} diff --git a/src/client/vox.qc b/src/client/vox.qc index 24f4c18..7ad81e6 100644 --- a/src/client/vox.qc +++ b/src/client/vox.qc @@ -15,7 +15,7 @@ */ class -TFCVox:NSTalkMonster +TFCVox:ncTalkMonster { void(void) TFCVox; virtual void(string) SentenceSample; diff --git a/src/files.dat b/src/files.dat new file mode 100644 index 0000000..db7f644 --- /dev/null +++ b/src/files.dat @@ -0,0 +1,64 @@ +63 +1 cfg/skill.cfg +1 cfg/skill_manifest.cfg +1 data/avanti.way +1 data/badlands.way +1 data/casbah.way +1 data/crossover2.way +1 data/cz2.way +1 data/dustbowl.way +1 data/epicenter.way +1 data/flagrun.way +1 data/hunted.way +1 data/push.way +1 data/rock2.way +1 data/warpath.way +1 data/well.way +1 decls/def/ammo.def +1 decls/def/armor.def +1 decls/def/items.def +1 decls/def/monsters.def +1 decls/def/player.def +1 decls/def/weapons.def +1 decls/def/weapons/ac.def +1 decls/def/weapons/autorifle.def +1 decls/def/weapons/axe.def +1 decls/def/weapons/flamethrower.def +1 decls/def/weapons/gl.def +1 decls/def/weapons/ic.def +1 decls/def/weapons/knife.def +1 decls/def/weapons/medikit.def +1 decls/def/weapons/ng.def +1 decls/def/weapons/pl.def +1 decls/def/weapons/railgun.def +1 decls/def/weapons/rpg.def +1 decls/def/weapons/shotgun.def +1 decls/def/weapons/sniperrifle.def +1 decls/def/weapons/spanner.def +1 decls/def/weapons/superng.def +1 decls/def/weapons/supershotgun.def +1 decls/def/weapons/tranq.def +1 decls/def/weapons/umbrella.def +1 decls/sound/items_tfc.sndshd +1 decls/sound/player_tfc.sndshd +1 decls/sound/turret_tfc.sndshd +1 decls/sound/weapons_tfc.sndshd +1 default_tfc.cfg +1 maps/2fort.jpg +1 maps/avanti.jpg +1 maps/badlands.jpg +1 maps/casbah.jpg +1 maps/crossover2.jpg +1 maps/cz2.jpg +1 maps/dustbowl.jpg +1 maps/epicenter.jpg +1 maps/flagrun.jpg +1 maps/hunted.jpg +1 maps/push.jpg +1 maps/rock2.jpg +1 maps/warpath.jpg +1 maps/well.jpg +1 particles/weapon_railgun.cfg +1 progs/default.dat +1 quake.rc +1 scripts/constants.txt diff --git a/src/progs.src b/src/progs.src index 2c2a868..31ef574 100755 --- a/src/progs.src +++ b/src/progs.src @@ -1,2 +1,3 @@ #pragma sourcefile client/progs.src #pragma sourcefile server/progs.src +#pragma sourcefile rules/default.qc diff --git a/src/rules/Makefile b/src/rules/Makefile new file mode 100644 index 0000000..325d772 --- /dev/null +++ b/src/rules/Makefile @@ -0,0 +1,5 @@ +QCC=fteqcc + +all: + mkdir -pv ../../zpak001.pk3dir/progs/ + $(QCC) $(CFLAGS) -I../../../src/server default.qc diff --git a/src/rules/default.qc b/src/rules/default.qc new file mode 100644 index 0000000..f82d92b --- /dev/null +++ b/src/rules/default.qc @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2024 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. + */ + +#pragma PROGS_DAT "../../zpak001.pk3dir/progs/default.dat" + +#include "../../../src/server/api.h" + +static string g_tfClasses[] = { + "player_scout", + "player_sniper", + "player_soldier", + "player_demo", + "player_medic", + "player_heavy", + "player_pyro", + "player_spy", + "player_engineer", +}; + +static string g_tfHelp[] = { + "HELP_SCOUT", + "HELP_SNIPER", + "HELP_SOLDIER", + "HELP_DEMO", + "HELP_MEDIC", + "HELP_HEAVY", + "HELP_PYRO", + "HELP_SPY", + "HELP_ENGINEER", +}; + +static string g_tfPlayerColor[5] = { + "0xffffff", + "0x9aff", + "0xff1800" + "0xffca00", + "0x3bff00" +}; + +bool +AllowFlashlight(void) +{ + return cvars.GetBool("mp_flashlight"); +} + +void +TF_SwitchClass(entity targetPlayer, int classID) +{ + ents.ChangeToClass(targetPlayer, g_tfClasses[classID]); + game.TeleportToSpawn(targetPlayer); + ents.Input(targetPlayer, "Message", g_tfHelp[classID], targetPlayer); + userinfo.SetString(targetPlayer, "topcolor", g_tfPlayerColor[targetPlayer.team]); + userinfo.SetString(targetPlayer, "bottomcolor", g_tfPlayerColor[targetPlayer.team]); +} + +void +TF_GoSpectator(entity targetPlayer) +{ + if (!targetPlayer) { + return; + } + + ents.ChangeToClass(targetPlayer, "spectator"); + game.TeleportToSpawn(targetPlayer); +} + +void +CodeCallback_StartGameType(void) +{ + motd.LoadDefault(); +} + +void +CodeCallback_PlayerSpawn(entity playerEntity) +{ + /* first course of action is to kick players into spectator cam */ + TF_GoSpectator(playerEntity); +} + +void +CodeCallback_PlayerDisconnect(void) +{ + +} + +bool +CodeCallback_PlayerRequestRespawn(entity playerEntity) +{ + CodeCallback_PlayerSpawn(playerEntity); + return (true); +} + +void +CodeCallback_PlayerDamage(entity inflictor, entity attacker) +{ + +} + +void +CodeCallback_PlayerKilled(entity inflictor, entity attacker, string weapon) +{ + combat.Obituary(self.netname, attacker.netname, weapon, ""); + + /* death-counter */ + self.deaths++; + + /* update score-counter */ + if (ents.isPlayer(attacker)) { + if (self == attacker) { + attacker.frags--; + } else { + attacker.frags++; + } + } +} + + +bool +CodeCallback_CallRequestTeam(entity playerEntity, int teamNum) +{ + ents.Input(playerEntity, "SetTeam", itos(teamNum), playerEntity); + return (true); +} + +bool +CodeCallback_ClientCommand(entity targetPlayer, string command) +{ + float commandArgs = tokenize(command); + + switch (argv(0)) { + case "random": + int classID = (int)floor(0, g_tfClasses.length); + TF_SwitchClass(targetPlayer, classID); + break; + case "scout": + TF_SwitchClass(targetPlayer, 0); + break; + case "sniper": + TF_SwitchClass(targetPlayer, 1); + break; + case "soldier": + TF_SwitchClass(targetPlayer, 2); + break; + case "demo": + TF_SwitchClass(targetPlayer, 3); + break; + case "medic": + TF_SwitchClass(targetPlayer, 4); + break; + case "heavy": + TF_SwitchClass(targetPlayer, 5); + break; + case "pyro": + TF_SwitchClass(targetPlayer, 6); + break; + case "spy": + TF_SwitchClass(targetPlayer, 7); + break; + case "engineer": + TF_SwitchClass(targetPlayer, 8); + break; + default: + return (false); + } + + return (true); +} + +bool +CodeCallback_ImpulseCommand(entity clientEntity, float impulseNum) +{ + switch (impulseNum) { + case 100: + if (AllowFlashlight() == true) { + ents.Input(clientEntity, "UseItem", "item_suit", clientEntity); + } + break; + default: + return (false); + } + + return (true); +} diff --git a/src/server/Makefile b/src/server/Makefile index 2fe44a4..e96b4a9 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,4 +1,4 @@ QCC=fteqcc all: - $(QCC) progs.src + $(QCC) $(CFLAGS) -I../../../valve/src/shared/ progs.src diff --git a/src/server/bot.qc b/src/server/bot.qc index f0758b3..2184d7b 100644 --- a/src/server/bot.qc +++ b/src/server/bot.qc @@ -1,5 +1,5 @@ class -TFCBot:NSBot +TFCBot:ncBot { void TFCBot(void); diff --git a/src/server/defs.h b/src/server/defs.h index 0ee34d8..0a65b50 100644 --- a/src/server/defs.h +++ b/src/server/defs.h @@ -14,7 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "gamerules.h" #include "../../../valve/src/shared/defs.h" #include "sentry.h" @@ -48,7 +47,7 @@ TFC_DetonateTypeForPlayer(entity pl, string cname) if (e.real_owner != pl) continue; - NSSurfacePropEntity targ = (NSSurfacePropEntity)e; + ncSurfacePropEntity targ = (ncSurfacePropEntity)e; targ.Destroy(); } } diff --git a/src/server/dispenser.qc b/src/server/dispenser.qc index 0a733ae..49a40ce 100644 --- a/src/server/dispenser.qc +++ b/src/server/dispenser.qc @@ -19,7 +19,7 @@ /* The unit has 150 health and can hold up to 400 shells, 600 nails, 300 rockets, 400 cells, and 500 armor points. */ class -TFCDispenser:NSSurfacePropEntity +TFCDispenser:ncSurfacePropEntity { float m_flNextDispense; @@ -45,11 +45,11 @@ TFCDispenser:NSSurfacePropEntity virtual int GrabCells(void); virtual int GrabArmor(void); - virtual void Death(entity, entity, int, vector, int); + virtual void Death(entity, entity, int, vector, vector, int); }; void -TFCDispenser::Death(entity inflictor, entity attacker, int damage, vector dir, int location) +TFCDispenser::Death(entity inflictor, entity attacker, int damage, vector dir, vector absImpactPos, int hitBody) { env_message_single(real_owner, "#Dispenser_destroyed"); pointparticles(particleeffectnum("fx_explosion.main"), origin, [0,0,0], 1); @@ -181,15 +181,15 @@ TFCDispenser::Touch(entity eToucher) r = n = c = s = a = sum = 0; /* only subtract what if we need anything */ - if (pl.GetReserveAmmo(rocketType) < pl.m_iMaxRockets) + if (pl.GetReserveAmmo(rocketType) < pl.MaxAmmo(rocketType)) r = GrabRockets(); - if (pl.GetReserveAmmo(nailType) < pl.m_iMaxNails) + if (pl.GetReserveAmmo(nailType) < pl.MaxAmmo(nailType)) n = GrabNails(); - if (pl.GetReserveAmmo(cellType) < pl.m_iMaxCells) + if (pl.GetReserveAmmo(cellType) < pl.MaxAmmo(cellType)) c = GrabCells(); - if (pl.GetReserveAmmo(shellType) < pl.m_iMaxShells) + if (pl.GetReserveAmmo(shellType) < pl.MaxAmmo(shellType)) s = GrabShells(); - if (pl.armor < pl.m_iMaxArmor) + if (pl.armor < pl.GetMaxArmor()) a = GrabArmor(); /* see the sum of what we picked up to determine if we'll register as a pickup */ @@ -208,8 +208,8 @@ TFCDispenser::Touch(entity eToucher) pl.GiveAmmo(shellType, s); pl.armor += a; - if (pl.armor > pl.m_iMaxArmor) - pl.armor = pl. m_iMaxArmor; + if (pl.armor > pl.GetMaxArmor()) + pl.armor = pl.GetMaxArmor(); m_flNextDispense = time + 2.0f; } diff --git a/src/server/func_nobuild.qc b/src/server/func_nobuild.qc index 32bea00..dd17b87 100644 --- a/src/server/func_nobuild.qc +++ b/src/server/func_nobuild.qc @@ -25,7 +25,7 @@ Brush volume that when entered, will not allow you to deploy anything as an engi */ class -func_nobuild:NSBrushTrigger +func_nobuild:ncBrushTrigger { void(void) func_nobuild; diff --git a/src/server/func_nogrenades.qc b/src/server/func_nogrenades.qc index 5a7bb7f..0aa0e81 100644 --- a/src/server/func_nogrenades.qc +++ b/src/server/func_nogrenades.qc @@ -25,7 +25,7 @@ Brush volume that when entered, will not allow you to deploy any grenades. */ class -func_nogrenades:NSBrushTrigger +func_nogrenades:ncBrushTrigger { void(void) func_nogrenades; diff --git a/src/server/gamerules.h b/src/server/gamerules.h deleted file mode 100644 index 50517d4..0000000 --- a/src/server/gamerules.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 TFCGameRules:CGameRules -{ - void(void) TFCGameRules; - - virtual bool ConsoleCommand(NSClientPlayer, string); - virtual bool IsTeamplay(void); - - virtual void PlayerConnect(NSClientPlayer); - virtual void PlayerDisconnect(NSClientPlayer); - virtual void PlayerPostFrame(NSClientPlayer); - virtual void PlayerSpawn(NSClientPlayer); - virtual void PlayerKill(NSClientPlayer); - virtual void PlayerRespawn(NSClientPlayer); - virtual void DropGoalItem(NSClientPlayer); - virtual float ImpulseCommand(NSClient, float); - virtual void LevelNewParms(void); - virtual void InitPostEnts(void); -}; diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc deleted file mode 100644 index c44b364..0000000 --- a/src/server/gamerules.qc +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2016-2023 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 -TFCGameRules::TFCGameRules(void) -{ - /* wipe the serverinfo clean */ - forceinfokey(world, "teams", "0"); - forceinfokey(world, "team_1", ""); - forceinfokey(world, "team_2", ""); - forceinfokey(world, "team_3", ""); - forceinfokey(world, "team_4", ""); - forceinfokey(world, "teamscore_1", ""); - forceinfokey(world, "teamscore_2", ""); - forceinfokey(world, "teamscore_3", ""); - forceinfokey(world, "teamscore_4", ""); -} - -bool -TFCGameRules::ConsoleCommand(NSClientPlayer pp, string cmd) -{ - tokenize(cmd); - - switch (argv(0)) { - default: - return (false); - } - - return (true); -} - -bool -TFCGameRules::IsTeamplay(void) -{ - return TRUE; -} - -void -TFCGameRules::DropGoalItem(NSClientPlayer pp) -{ - /* skip normal players */ - if (!(pp.g_items & ITEM_GOALITEM)) - return; - - item_tfgoal target; - - for (entity e = world; (e = find(e, ::classname, "item_tfgoal"));) { - target = (item_tfgoal)e; - - /* item is still pick-upable */ - if (target.solid != SOLID_NOT) { - print("the item is not picked up. \n"); - continue; - } - - /* that's us, yup */ - if (target.m_eActivator == pp) { - target.DropReturnable(pp); - return; - } - } - - print("^1WARNING: ^7Player marked as having impossible goal-item\n"); -} - -/* we check what fields have changed over the course of the frame and network - * only the ones that have actually changed */ -void -TFCGameRules::PlayerPostFrame(NSClientPlayer pp) -{ -} - -void -TFCGameRules::LevelNewParms(void) -{ - parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 = - parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 = - parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 = - parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 = - parm29 = parm30 = 0; - parm64 = FL_CLIENT; -} - -void -TFCGameRules::PlayerConnect(NSClientPlayer pl) -{ - if (Plugin_PlayerConnect(pl) == FALSE) - bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname)); -} - -void -TFCGameRules::PlayerDisconnect(NSClientPlayer pl) -{ - bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname)); - - /* Make this unusable */ - pl.solid = SOLID_NOT; - pl.movetype = MOVETYPE_NONE; - pl.modelindex = 0; - pl.health = 0; - pl.takedamage = 0; - pl.SendFlags = PLAYER_MODELINDEX; -} - -void -TFCGameRules_PlayerRespawn(void) -{ - TFCGameRules rule = (TFCGameRules)g_grMode; - rule.PlayerRespawn((NSClientPlayer)self); -} - - -void -TFCGameRules::PlayerKill(NSClientPlayer pp) -{ -} - -void -TFCGameRules::PlayerRespawn(NSClientPlayer pp) -{ - TFPlayer pl = (TFPlayer)pp; - pl.MakeClass(pl.classtype); - pl.SpawnIntoGame(); -} - -void -TFCGameRules::PlayerSpawn(NSClientPlayer pp) -{ - TFPlayer pl = (TFPlayer)pp; - pl.MakeTempSpectator(); /* replace this with a non-spectator ghost */ - Spawn_ObserverCam(pl); -} - -bool -TFCGameRules::ImpulseCommand(NSClient bp, float num) -{ - switch (num) { - default: - return super::ImpulseCommand(bp, num); - } - - return true; -} - -void -TFCGameRules::InitPostEnts(void) -{ - super::InitPostEnts(); - - EntityDef_Precache("tf_weapon_ac"); - EntityDef_Precache("tf_weapon_autorifle"); - EntityDef_Precache("tf_weapon_axe"); - EntityDef_Precache("tf_weapon_flamethrower"); - EntityDef_Precache("tf_weapon_gl"); - EntityDef_Precache("tf_weapon_ic"); - EntityDef_Precache("tf_weapon_knife"); - EntityDef_Precache("tf_weapon_medikit"); - EntityDef_Precache("tf_weapon_ng"); - EntityDef_Precache("tf_weapon_pl"); - EntityDef_Precache("tf_weapon_railgun"); - EntityDef_Precache("tf_weapon_rpg"); - EntityDef_Precache("tf_weapon_shotgun"); - EntityDef_Precache("tf_weapon_sniperrifle"); - EntityDef_Precache("tf_weapon_spanner"); - EntityDef_Precache("tf_weapon_superng"); - EntityDef_Precache("tf_weapon_supershotgun"); - EntityDef_Precache("tf_weapon_tranq"); - - /* rename the team spawns. */ - info_player_teamspawn::RenameTeamSpawns(); - info_tfdetect::Setup(); -} diff --git a/src/server/info_areadef.qc b/src/server/info_areadef.qc index 9db7535..565890b 100644 --- a/src/server/info_areadef.qc +++ b/src/server/info_areadef.qc @@ -28,7 +28,7 @@ Describes an area's bounds and description/name. */ class -info_areadef:NSPointTrigger +info_areadef:ncPointTrigger { string m_strDescription; vector m_vecMins; diff --git a/src/server/info_player_teamspawn.qc b/src/server/info_player_teamspawn.qc index 98df156..85319ce 100644 --- a/src/server/info_player_teamspawn.qc +++ b/src/server/info_player_teamspawn.qc @@ -14,13 +14,13 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class info_player_teamspawn:NSSpawnPoint +class +info_player_teamspawn:ncSpawnPoint { void(void) info_player_teamspawn; virtual void SpawnKey(string, string); - - nonvirtual void RenameTeamSpawns(void); + virtual void Spawned(void); }; void @@ -42,25 +42,21 @@ info_player_teamspawn::SpawnKey(string keyName, string setValue) } void -info_player_teamspawn::RenameTeamSpawns(void) +info_player_teamspawn::Spawned(void) { - for (entity e = world; (e = find(e, ::classname, "info_player_teamspawn"));) { - info_player_teamspawn findSpawn = (info_player_teamspawn)e; - - switch (findSpawn.team) { - case 1: - e.classname = "info_teamspawn_blue"; - break; - case 2: - e.classname = "info_teamspawn_red"; - break; - case 3: - e.classname = "info_teamspawn_yellow"; - break; - case 4: - e.classname = "info_teamspawn_green"; - break; - } + switch (team) { + case 1: + classname = "info_teamspawn_blue"; + break; + case 2: + classname = "info_teamspawn_red"; + break; + case 4: + classname = "info_teamspawn_yellow"; + break; + case 3: + classname = "info_teamspawn_green"; + break; } botinfo = BOTINFO_SPAWNPOINT; diff --git a/src/server/info_tfdetect.qc b/src/server/info_tfdetect.qc index 0b4714d..6d2af56 100644 --- a/src/server/info_tfdetect.qc +++ b/src/server/info_tfdetect.qc @@ -57,20 +57,35 @@ typedef enum # NOTES +The `maxammo_` keys sets the limits regarding available team classes. + +The following flags can be combined: + +- ONLY_CIVILLIAN (-1) : Not a bitflag, but when set this team only allows the civillian class. +- SCOUT (1) : No Scout class. +- SNIPER (2) : No Sniper class. +- SOLDIER (4) : No Soldier class. +- DEMO (8) : No Demoman class. +- MEDIC (16) : No Medic class. +- HEAVY (32) : No Heavy Weapons Guy class. +- PYRO (64) : No Pyro class. +- NO_RANDOM_CLASS (128) : No random class in menus. +- SPY (256) : No Spy class. +- ENGINEER (512) : No Engineer class. # TRIVIA This entity was introduced in Team Fortress (1996). */ class -info_tfdetect:NSPointTrigger +info_tfdetect:ncPointTrigger { public: void info_tfdetect(void); virtual void SpawnKey(string, string); - virtual void Respawn(void); - + virtual void Spawned(void); nonvirtual void Setup(void); + nonvirtual void SetupClass(int teamID, tfdetectTeamFlags_t classFlags); private: string m_strTeam1Name; @@ -136,74 +151,99 @@ info_tfdetect::SpawnKey(string keyName, string setValue) } void -info_tfdetect::Respawn(void) +info_tfdetect::Spawned(void) { + super::Spawned(); + ScheduleThink(Setup, 0.0f); +} + +void +info_tfdetect::SetupClass(int teamID, tfdetectTeamFlags_t classFlags) +{ + if (classFlags == TFDFL_CIVILIANONLY) { + teams.AddClass(teamID, "civilian"); + return; + } + + if (!(classFlags & TFDFL_NOSCOUNT)) { + teams.AddClass(teamID, "scout"); + } + + if (!(classFlags & TFDFL_NOSNIPER)) { + teams.AddClass(teamID, "sniper"); + } + + if (!(classFlags & TFDFL_NOSOLDIER)) { + teams.AddClass(teamID, "soldier"); + } + + if (!(classFlags & TFDFL_NODEMOMAN)) { + teams.AddClass(teamID, "demo"); + } + + if (!(classFlags & TFDFL_NOMEDIC)) { + teams.AddClass(teamID, "medic"); + } + + if (!(classFlags & TFDFL_NOHEAVY)) { + teams.AddClass(teamID, "heavy"); + } + + if (!(classFlags & TFDFL_NOPYRO)) { + teams.AddClass(teamID, "pyro"); + } + + if (!(classFlags & TFDFL_NOSPY)) { + teams.AddClass(teamID, "spy"); + } + + if (!(classFlags & TFDFL_NOENGINEER)) { + teams.AddClass(teamID, "engineer"); + } + + if (!(classFlags & TFDFL_NORANDOM)) { + teams.AddClass(teamID, "random"); + } } void info_tfdetect::Setup(void) { - int team_count = 0i; entity e = __NULL__; - info_tfdetect globalTFD = (info_tfdetect)find(world, ::classname, "info_tfdetect"); /* populate the serverinfo field with the teams we have on the map */ - e = find(world, ::classname, "info_teamspawn_blue"); - if (e) { - team_count += 1; - forceinfokey(world, sprintf("team_%i", team_count), "Blue"); - forceinfokey(world, sprintf("teamscore_%i", team_count), "0"); + if (exists.InMap("info_teamspawn_blue")) { + teams.SetUp(1, m_strTeam1Name, [153, 204, 255], true); + SetupClass(1, m_bfTeam1Flags); + teams.SetSpawnPoint(1, "info_teamspawn_blue"); g_tfcHasBlueTeam = true; } - e = find(world, ::classname, "info_teamspawn_red"); - if (e) { - team_count += 1; - forceinfokey(world, sprintf("team_%i", team_count), "Red"); - forceinfokey(world, sprintf("teamscore_%i", team_count), "0"); + if (exists.InMap("info_teamspawn_red")) { + teams.SetUp(2, m_strTeam2Name, [255, 63, 63], true); + SetupClass(2, m_bfTeam2Flags); + teams.SetSpawnPoint(2, "info_teamspawn_red"); g_tfcHasRedTeam = true; } - e = find(world, ::classname, "info_teamspawn_green"); - if (e) { - team_count += 1; - forceinfokey(world, sprintf("team_%i", team_count), "Green"); - forceinfokey(world, sprintf("teamscore_%i", team_count), "0"); + if (exists.InMap("info_teamspawn_green")) { + teams.SetUp(3, m_strTeam3Name, [153, 255, 204], true); + SetupClass(3, m_bfTeam3Flags); + teams.SetSpawnPoint(3, "info_teamspawn_green"); g_tfcHasGreenTeam = true; } - e = find(world, ::classname, "info_teamspawn_yellow"); - if (e) { - team_count += 1; - forceinfokey(world, sprintf("team_%i", team_count), "Yellow"); - forceinfokey(world, sprintf("teamscore_%i", team_count), "0"); + if (exists.InMap("info_teamspawn_yellow")) { + teams.SetUp(4, m_strTeam4Name, [255, 255, 153], true); + SetupClass(4, m_bfTeam4Flags); + teams.SetSpawnPoint(4, "info_teamspawn_yellow"); g_tfcHasYellowTeam = true; } - forceinfokey(world, "teams", itos(team_count)); - - if (!globalTFD) { - NSLog("No info_tfdetect in level."); - forceinfokey(world, "teamflags_1", "0"); - forceinfokey(world, "teamflags_2", "0"); - forceinfokey(world, "teamflags_3", "0"); - forceinfokey(world, "teamflags_4", "0"); - return; - } - - forceinfokey(world, "team_1", globalTFD.m_strTeam1Name); - forceinfokey(world, "team_2", globalTFD.m_strTeam2Name); - forceinfokey(world, "team_3", globalTFD.m_strTeam3Name); - forceinfokey(world, "team_4", globalTFD.m_strTeam4Name); - - forceinfokey(world, "teamflags_1", ftos(globalTFD.m_bfTeam1Flags)); - forceinfokey(world, "teamflags_2", ftos(globalTFD.m_bfTeam1Flags)); - forceinfokey(world, "teamflags_3", ftos(globalTFD.m_bfTeam1Flags)); - forceinfokey(world, "teamflags_4", ftos(globalTFD.m_bfTeam1Flags)); /* the evil localcmd feature of this entity. */ if (m_strLocalCommand) { localcmd(m_strLocalCommand); localcmd("\n"); } -} \ No newline at end of file +} diff --git a/src/server/info_tfgoal.qc b/src/server/info_tfgoal.qc index b6fc82a..eca4766 100644 --- a/src/server/info_tfgoal.qc +++ b/src/server/info_tfgoal.qc @@ -59,7 +59,7 @@ typedef enumflags } tfgoal_result; /* point entity version */ -class info_tfgoal:NSRenderableEntity +class info_tfgoal:ncRenderableEntity { public: void(void) info_tfgoal; @@ -207,8 +207,8 @@ info_tfgoal::Touch(entity eToucher) pl.GiveAmmo(detpackType, m_iDetpack); /* clamp */ - pl.health = bound(0, pl.health, pl.max_health); - pl.armor = bound(0, pl.armor, pl.m_iMaxArmor); + pl.SetHealth(bound(0, pl.GetHealth(), pl.GetMaxHealth())); + pl.SetArmor(bound(0, pl.GetArmor(), pl.GetMaxArmor())); pl.frags += frags; @@ -439,7 +439,7 @@ info_tfgoal::info_tfgoal(void) precache_sound(m_strActivatedSound); - super::NSRenderableEntity(); + super::ncRenderableEntity(); info_tfgoal::Respawn(); } @@ -476,7 +476,7 @@ i_t_g::i_t_g(void) SpawnKey(argv(i), argv(i+1)); } - super::NSRenderableEntity(); + super::ncRenderableEntity(); precache_sound(m_strActivatedSound); Respawn(); diff --git a/src/server/item_armor.qc b/src/server/item_armor.qc index 79c829c..54c03c0 100644 --- a/src/server/item_armor.qc +++ b/src/server/item_armor.qc @@ -15,7 +15,7 @@ */ class -TFCArmor:NSRenderableEntity +TFCArmor:ncRenderableEntity { float m_flRespawnDelay; int m_iTeamUses; @@ -89,14 +89,14 @@ TFCArmor::Touch(entity eToucher) return; /* if we can't add anything, don't bother */ - if (pl.armor >= pl.m_iMaxArmor && pl.GetReserveAmmo(cellType) >= pl.m_iMaxCells) + if (pl.armor >= pl.GetMaxArmor() && pl.GetReserveAmmo(cellType) >= pl.MaxAmmo(cellType)) return; int ap; int tp = 0; /* get remaining points */ - ap = pl.m_iMaxArmor - pl.armor; + ap = pl.GetMaxArmor() - pl.armor; tp = m_iArmorValue; /* if that's all we can give... */ diff --git a/src/server/item_healthkit.qc b/src/server/item_healthkit.qc index 65d5f95..08c32a4 100644 --- a/src/server/item_healthkit.qc +++ b/src/server/item_healthkit.qc @@ -29,7 +29,7 @@ Health pickup. Unlike Team Fortress, this is the only one and it provides */ class -item_healthkit:NSRenderableEntity +item_healthkit:ncRenderableEntity { int m_iTeamUses; float m_flRespawnDelay; @@ -55,10 +55,10 @@ item_healthkit::Touch(entity eToucher) return; /* leave when full */ - if (pl.health >= pl.m_iMaxHealth) + if (pl.health >= pl.GetMaxHealth()) return; - pl.health = bound(0, pl.health + 25, pl.m_iMaxHealth); + pl.SetHealth(bound(0, pl.GetHealth() + 25, pl.GetMaxHealth())); Sound_Play(this, CHAN_ITEM, "item_healthkit_tfc.pickup"); @@ -98,4 +98,4 @@ item_healthkit::item_healthkit(void) { Sound_Precache("item_healthkit_tfc.pickup"); m_flRespawnDelay = 30.0f; -} \ No newline at end of file +} diff --git a/src/server/item_tfgoal.qc b/src/server/item_tfgoal.qc index 0873cc9..02b7517 100644 --- a/src/server/item_tfgoal.qc +++ b/src/server/item_tfgoal.qc @@ -58,14 +58,14 @@ typedef enum GISTATUS_DROPPED /*<< The item is at neither on a player, nor at its base. */ } goalitem_status_e; -class item_tfgoal:NSRenderableEntity +class item_tfgoal:ncRenderableEntity { public: void(void) item_tfgoal; virtual void(entity) Touch; virtual void(void) Respawn; virtual void(string, string) SpawnKey; - virtual void(NSClientPlayer) DropReturnable; + virtual void(ncPlayer) DropReturnable; virtual void(void) TeamOwnerReturns; virtual void(void) Spawned; @@ -103,7 +103,7 @@ private: }; void -item_tfgoal::DropReturnable(NSClientPlayer pp) +item_tfgoal::DropReturnable(ncPlayer pp) { TFPlayer pl = (TFPlayer)pp; diff --git a/src/server/nades.qc b/src/server/nades.qc index e927b81..973cd10 100644 --- a/src/server/nades.qc +++ b/src/server/nades.qc @@ -15,14 +15,14 @@ TFCNade_ThrowCaltrop(TFPlayer pl) pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); - NSEntity::Destroy(); + ncEntity::Destroy(); } for (int i = 0; i < 6; i++) { makevectors([0, random() * 360, 0]); vecNadeVelocity = v_forward * 50 + v_up * 150 + crandom() * v_right * 10 + crandom() * v_up * 10; - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/caltrop.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -57,14 +57,14 @@ TFCNade_ThrowHandGrenade(TFPlayer pl) pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl. gren1.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/w_grenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -130,14 +130,14 @@ TFCNade_ThrowConcussion(TFPlayer pl) msg_entity = self; multicast(self.origin, MULTICAST_PVS); - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl.gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/conc_grenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -170,7 +170,7 @@ TFCNade_ThrowNail(TFPlayer pl) pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); - NSEntity::Destroy(); + ncEntity::Destroy(); } static void TFCNade_ThrowNail_Shoot(entity source, vector euler_dir) { @@ -229,7 +229,7 @@ TFCNade_ThrowNail(TFPlayer pl) vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl.gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/ngrenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -246,7 +246,7 @@ TFCNade_ThrowNail(TFPlayer pl) } void -TFCNade_ThrowMIRVBomblet(NSEntity bomb) +TFCNade_ThrowMIRVBomblet(ncEntity bomb) { #if 0 vector vecNadeVelocity; @@ -262,7 +262,7 @@ TFCNade_ThrowMIRVBomblet(NSEntity bomb) pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); - NSEntity::Destroy(); + ncEntity::Destroy(); } TFPlayer pl = (TFPlayer)bomb.owner; @@ -270,7 +270,7 @@ TFCNade_ThrowMIRVBomblet(NSEntity bomb) makevectors([0, random() * 360, 0]); vecNadeVelocity = v_forward * 100 + v_up * 350 + crandom() * v_right * 10 + crandom() * v_up * 10; - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/bomblet.mdl"); eNade.SetOrigin(bomb.origin + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -308,10 +308,10 @@ TFCNade_ThrowMIRV(TFPlayer pl) sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); for (int i = 0; i < 4; i++) { - TFCNade_ThrowMIRVBomblet((NSEntity)self); + TFCNade_ThrowMIRVBomblet((ncEntity)self); } - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); @@ -319,7 +319,7 @@ TFCNade_ThrowMIRV(TFPlayer pl) vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl. gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/mirv_grenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -348,14 +348,14 @@ TFCNade_ThrowNapalm(TFPlayer pl) } static void TFCNade_ThrowConcussion_Explode(void) { - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl.gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/napalm.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -392,14 +392,14 @@ TFCNade_ThrowHallucination(TFPlayer pl) f.m_flHallucination = 15.0f; } } - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl.gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/spy_grenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); @@ -429,14 +429,14 @@ TFCNade_ThrowEMP(TFPlayer pl) } static void TFCNade_ThrowEMP_Explode(void) { - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; flTimer = max(0.0, pl.gren2.GetNextThinkTime() - time); - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/emp_grenade.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); diff --git a/src/server/progs.src b/src/server/progs.src index 887664b..f8d0d13 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -1,6 +1,7 @@ #pragma target fte_5768 //#pragma flag enable assumeint #pragma progs_dat "../../progs.dat" +#pragma forcecrc 54730 #define QWSSQC #define SERVER @@ -32,7 +33,6 @@ info_tfdetect.qc item_armor.qc item_healthkit.qc nades.qc -gamerules.qc client.qc server.qc spawn.qc diff --git a/src/server/sentry.h b/src/server/sentry.h index 0cacde0..8588f16 100644 --- a/src/server/sentry.h +++ b/src/server/sentry.h @@ -25,9 +25,9 @@ typedef enum } sentrystate_e; class -TFCSentry:NSSurfacePropEntity +TFCSentry:ncSurfacePropEntity { - NSSurfacePropEntity m_eHead; + ncSurfacePropEntity m_eHead; sentrystate_e m_state; float m_flNextIdleSound; @@ -37,7 +37,7 @@ TFCSentry:NSSurfacePropEntity void(void) TFCSentry; - virtual void(NSClientPlayer) Place; + virtual void(ncPlayer) Place; virtual void(void) FinishPlacing; virtual void(void) Think; }; \ No newline at end of file diff --git a/src/server/sentry.qc b/src/server/sentry.qc index 9a09226..7b9d7f9 100644 --- a/src/server/sentry.qc +++ b/src/server/sentry.qc @@ -76,7 +76,7 @@ TFCSentry::Think(void) } void -TFCSentry::Place(NSClientPlayer pl) +TFCSentry::Place(ncPlayer pl) { vector newAngles = pl.GetAngles(); newAngles[0] = newAngles[2] = 0; @@ -118,7 +118,7 @@ TFCSentry::FinishPlacing(void) void TFCSentry::TFCSentry(void) { - m_eHead = spawn(NSSurfacePropEntity); + m_eHead = spawn(ncSurfacePropEntity); SetModel("models/base.mdl"); SetSolid(SOLID_BBOX); SetMovetype(MOVETYPE_NONE); diff --git a/src/server/server.qc b/src/server/server.qc index fec4708..a0d8f06 100644 --- a/src/server/server.qc +++ b/src/server/server.qc @@ -14,12 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void -Game_InitRules(void) -{ - g_grMode = spawn(TFCGameRules); -} - void Game_Worldspawn(void) { @@ -42,7 +36,6 @@ Game_Worldspawn(void) precache_model("models/sentry3.mdl"); precache_model("models/player.mdl"); precache_model("models/w_weaponbox.mdl"); - FX_Corpse_Init(); } void weaponbox_spawn(TFPlayer pl) diff --git a/src/server/teleporter.qc b/src/server/teleporter.qc index 0465dd7..e05f91d 100644 --- a/src/server/teleporter.qc +++ b/src/server/teleporter.qc @@ -18,7 +18,7 @@ /* main teleporter */ class -TFCTeleporter:NSSurfacePropEntity +TFCTeleporter:ncSurfacePropEntity { float m_flNextTeleport; diff --git a/src/shared/include.src b/src/shared/include.src index 4ba3338..68c366f 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -12,8 +12,5 @@ player.qc animations_tfc.h ../../../valve/src/shared/animations.qc pmove.qc - -../../../valve/src/shared/fx_blood.qc -../../../valve/src/shared/fx_corpse.qc ../../../valve/src/shared/HLWeapon.qc #endlist diff --git a/src/shared/player.qc b/src/shared/player.qc index 66c033e..ca57fa3 100644 --- a/src/shared/player.qc +++ b/src/shared/player.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021 Marco Cawthorne + * Copyright (c) 2016-2024AAAAAA 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 @@ -14,7 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class TFPlayer:HLPlayer +class +TFPlayer:HLPlayer { void TFPlayer(void); @@ -38,7 +39,6 @@ class TFPlayer:HLPlayer virtual bool CanLean(void); virtual void Physics_Jump(void); - virtual float Physics_MaxSpeed(void); virtual void ProcessInput(void); @@ -57,18 +57,8 @@ class TFPlayer:HLPlayer float m_flNextHallucination; #else - NSTimer gren1; - NSTimer gren2; - - int m_iMaxHealth; - int m_iMaxArmor; - - int m_iMaxShells; - int m_iMaxNails; - int m_iMaxRockets; - int m_iMaxCells; - int m_iMaxDetpack; - int m_iMaxMedikit; + ncTimer gren1; + ncTimer gren2; virtual void EvaluateEntity(void); virtual float SendEntity(entity, float); @@ -100,24 +90,24 @@ TFPlayer::UpdatePlayerAnimation(float timelength) bool TFPlayer::CanSprint(void) { - return false; + return (false); } bool TFPlayer::CanProne(void) { - return false; + return (false); } bool TFPlayer::CanCrouch(void) { - return true; + return (true); } bool TFPlayer::CanLean(void) { - return false; + return (false); } #ifdef SERVER @@ -237,7 +227,6 @@ TFPlayer::ProcessInput(void) } #ifdef CLIENT - void TFPlayer::UpdateAliveCam(void) { @@ -256,7 +245,7 @@ TFPlayer::UpdateAliveCam(void) g_view.SetCameraAngle(view_angles); if (vehicle) { - NSVehicle veh = (NSVehicle)vehicle; + ncVehicle veh = (ncVehicle)vehicle; if (veh.UpdateView) veh.UpdateView(); @@ -288,16 +277,11 @@ TFPlayer::ClientInputFrame(void) } } -/* -================= -player::ReceiveEntity -================= -*/ void TFPlayer::ReceiveEntity(float new, float flChanged) { /* the generic client attributes */ - NSClientPlayer::ReceiveEntity(new, flChanged); + ncPlayer::ReceiveEntity(new, flChanged); /* animation */ READENTITY_BYTE(anim_top, PLAYER_TOPFRAME) @@ -340,19 +324,11 @@ TFPlayer::ReceiveEntity(float new, float flChanged) } } -/* -================= -player::PredictPostFrame - -Save the last valid server values away in the _net variants of each field -so we can roll them back later. -================= -*/ void TFPlayer::PredictPreFrame(void) { /* the generic client attributes */ - NSClientPlayer::PredictPreFrame(); + ncPlayer::PredictPreFrame(); SAVE_STATE(anim_top) SAVE_STATE(anim_top_delay) @@ -364,18 +340,11 @@ TFPlayer::PredictPreFrame(void) SAVE_STATE(m_flHallucination) } -/* -================= -player::PredictPostFrame - -Where we roll back our values to the ones last sent/verified by the server. -================= -*/ void TFPlayer::PredictPostFrame(void) { /* the generic client attributes */ - NSClientPlayer::PredictPostFrame(); + ncPlayer::PredictPostFrame(); ROLL_BACK(anim_top) ROLL_BACK(anim_top_delay) @@ -406,7 +375,7 @@ void TFPlayer::EvaluateEntity(void) { /* the generic client attributes */ - NSClientPlayer::EvaluateEntity(); + ncPlayer::EvaluateEntity(); /* animation */ EVALUATE_FIELD(anim_top, PLAYER_TOPFRAME) @@ -449,10 +418,6 @@ TFPlayer::SpawnIntoGame(void) void TFPlayer::MakeClass(classtype_e classType) { - int atShells = ammoNumForName("ammo_shells"); - int atNails = ammoNumForName("ammo_nails"); - int atCells = ammoNumForName("ammo_cells"); - int atRockets = ammoNumForName("ammo_rockets"); int oldTeam = team; switch (classType) { @@ -501,11 +466,6 @@ TFPlayer::MakeClass(classtype_e classType) SpawnIntoGame(); } -/* -================= -player::SendEntity -================= -*/ float TFPlayer::SendEntity(entity ePEnt, float flChanged) { @@ -518,7 +478,7 @@ TFPlayer::SendEntity(entity ePEnt, float flChanged) flChanged = OptimiseChangedFlags(ePEnt, flChanged); /* the generic client attributes */ - NSClientPlayer::SendEntity(ePEnt, flChanged); + ncPlayer::SendEntity(ePEnt, flChanged); SENDENTITY_BYTE(anim_top, PLAYER_TOPFRAME) SENDENTITY_FLOAT(anim_top_time, PLAYER_TOPFRAME) diff --git a/src/shared/pmove.qc b/src/shared/pmove.qc index 00cfe96..e93b381 100644 --- a/src/shared/pmove.qc +++ b/src/shared/pmove.qc @@ -49,47 +49,3 @@ TFPlayer::Physics_Jump(void) } } } - -float -TFPlayer::Physics_MaxSpeed(void) -{ - float desiredspeed = 300.0f; - - /* values courtesy of https://wiki.teamfortress.com/ */ - switch (classtype) { - case CLASS_SCOUT: - desiredspeed = 400.0f; - break; - case CLASS_SNIPER: - desiredspeed = 300.0f; - break; - case CLASS_SOLDIER: - desiredspeed = 240.0f; - break; - case CLASS_DEMO: - desiredspeed = 280.0f; - break; - case CLASS_MEDIC: - desiredspeed = 320.0f; - break; - case CLASS_HVYWEAPON: - desiredspeed = 228.0f; - break; - case CLASS_PYRO: - desiredspeed = 300.0f; - break; - case CLASS_SPY: - desiredspeed = 300.0f; - break; - case CLASS_ENGINEER: - desiredspeed = 300.0f; - break; - default: - desiredspeed = 300.0f; - } - - if (IsCrouching()) - desiredspeed /= 3; - - return desiredspeed; -} \ No newline at end of file diff --git a/src/shared/w_flamer.qc b/src/shared/w_flamer.qc index 0b14882..9d43732 100644 --- a/src/shared/w_flamer.qc +++ b/src/shared/w_flamer.qc @@ -101,14 +101,14 @@ w_flamer_primary(player pl) #ifdef SERVER static void w_flamer_die(void) { - NSEntity::Destroy(); + ncEntity::Destroy(); } static void w_flamer_touch(entity target, entity source) { - NSEntity me = (NSEntity)source; + ncEntity me = (ncEntity)source; if (target.takedamage == DAMAGE_YES) { - NSSurfacePropEntity m = (NSSurfacePropEntity)target; + ncSurfacePropEntity m = (ncSurfacePropEntity)target; m.Ignite(source, 5.0f, WEAPON_FLAMER); } } @@ -116,7 +116,7 @@ w_flamer_primary(player pl) Sound_Play(pl, CHAN_WEAPON, "weapon_flame.fire"); - NSProjectile ball = spawn(NSProjectile); + ncProjectile ball = spawn(ncProjectile); ball.SetModel("sprites/fthrow.spr"); ball.SetRenderMode(RM_ADDITIVE); ball.SetOwner(pl); diff --git a/src/shared/w_glauncher.qc b/src/shared/w_glauncher.qc index ad1a1e3..21515f6 100644 --- a/src/shared/w_glauncher.qc +++ b/src/shared/w_glauncher.qc @@ -102,13 +102,13 @@ w_glauncher_shootnade(player pl) pointparticles(particleeffectnum("fx_explosion.main"), self.origin, [0,0,0], 1); Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); Sound_Play(self, CHAN_VOICE, "fx.explosion"); - NSEntity::Destroy(); + ncEntity::Destroy(); } Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.SetModel("models/pipebomb.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); eNade.SetOwner(pl); diff --git a/src/shared/w_pipebomb.qc b/src/shared/w_pipebomb.qc index 5ba6e13..bd61336 100644 --- a/src/shared/w_pipebomb.qc +++ b/src/shared/w_pipebomb.qc @@ -75,7 +75,7 @@ void w_pipebomb_explode(void) /* dmg/radius taken from http://web.archive.org/web/20030323072941fw_/http://www.planetfortress.com/tfce/grenades/pipebomb.htm */ Damage_Radius(self.origin, self.owner, 80, 128, TRUE, WEAPON_GLAUNCHER); Sound_Play(self, CHAN_VOICE, "fx.explosion"); - NSEntity::Destroy(); + ncEntity::Destroy(); } #endif @@ -83,7 +83,7 @@ void w_pipebomb_shootnade(player pl) { vector vecNadeVelocity; - NSEntity first_nade; + ncEntity first_nade; int known_nades = 0i; float oldest_time = 0.0f; @@ -97,7 +97,7 @@ w_pipebomb_shootnade(player pl) Weapons_MakeVectors(pl); vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; - NSRenderableEntity eNade = spawn(NSRenderableEntity); + ncRenderableEntity eNade = spawn(ncRenderableEntity); eNade.classname = "pipebomb"; eNade.SetModel("models/pipebomb.mdl"); eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); @@ -117,7 +117,7 @@ w_pipebomb_shootnade(player pl) #ifdef SERVER /* iterate through and mark the first nade we own */ for (entity e = world; (e = find(e, ::classname, "pipebomb"));) { - NSEntity pb = (NSEntity)e; + ncEntity pb = (ncEntity)e; if (pb.GetOwner() == pl) { if (pb.GetSpawnAge() > oldest_time) { @@ -208,7 +208,7 @@ w_pipebomb_secondary(player pl) #ifdef SERVER for (entity e = world; (e = find(e, ::classname, "pipebomb"));) { - NSEntity pb = (NSEntity)e; + ncEntity pb = (ncEntity)e; if (pb.GetOwner() == pl) { pb.ScheduleThink(w_pipebomb_explode, pb_timer); diff --git a/zpak001.pk3dir/decls/def/bot.def b/zpak001.pk3dir/decls/def/bot.def deleted file mode 100644 index 4bcbcda..0000000 --- a/zpak001.pk3dir/decls/def/bot.def +++ /dev/null @@ -1,4 +0,0 @@ -entityDef bot -{ - spawnclass TFCBot -} \ No newline at end of file diff --git a/zpak001.pk3dir/decls/def/spawns.def b/zpak001.pk3dir/decls/def/spawns.def deleted file mode 100644 index 07ed426..0000000 --- a/zpak001.pk3dir/decls/def/spawns.def +++ /dev/null @@ -1,44 +0,0 @@ -entityDef info_player_start -{ - editor_mins "-16 -16 -36" - editor_maxs "16 16 36" - editor_description "Singleplayer Spawn" - - spawnclass NSSpawnPoint -} - -entityDef info_teamspawn_blue -{ - editor_mins "-16 -16 -36" - editor_maxs "16 16 36" - editor_description "Blue Team Spawn" - - spawnclass NSSpawnPoint -} - -entityDef info_teamspawn_red -{ - editor_mins "-16 -16 -36" - editor_maxs "16 16 36" - editor_description "Red Team Spawn" - - spawnclass NSSpawnPoint -} - -entityDef info_teamspawn_green -{ - editor_mins "-16 -16 -36" - editor_maxs "16 16 36" - editor_description "Yellow Team Spawn" - - spawnclass NSSpawnPoint -} - -entityDef info_teamspawn_yellow -{ - editor_mins "-16 -16 -36" - editor_maxs "16 16 36" - editor_description "Yellow Team Spawn" - - spawnclass NSSpawnPoint -} \ No newline at end of file diff --git a/zpak001.pk3dir/default.cfg b/zpak001.pk3dir/default.cfg deleted file mode 100644 index 2e4168a..0000000 --- a/zpak001.pk3dir/default.cfg +++ /dev/null @@ -1,6 +0,0 @@ -exec default_controls.cfg -exec cvar_defaults.cfg - -seta "hostname" "FreeTFC Server" -seta "maxplayers" "8" - \ No newline at end of file