From 06717fb9a6fd88967759138c53d7106e7eff97d1 Mon Sep 17 00:00:00 2001 From: kadaverjack Date: Mon, 17 Apr 2006 20:54:12 +0000 Subject: [PATCH] new gamemode: arena still needs some more testing, i only tested it in botmatches git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1301 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/default.cfg | 8 +- data/maps/arena_nexctf01.mapcfg | 4 + data/maps/arena_nexctf01.txt | 15 ++ data/maps/arena_nexdm01.mapcfg | 4 + data/maps/arena_nexdm01.txt | 15 ++ data/maps/arena_nexdm02.mapcfg | 4 + data/maps/arena_nexdm02.txt | 17 ++ data/maps/arena_nexdm03.mapcfg | 4 + data/maps/arena_nexdm03.txt | 17 ++ data/maps/arena_nexdm04.mapcfg | 4 + data/maps/arena_nexdm04.txt | 17 ++ data/maps/arena_nexdm05.mapcfg | 4 + data/maps/arena_nexdm05.txt | 15 ++ data/maps/arena_nexdm06.mapcfg | 4 + data/maps/arena_nexdm06.txt | 16 ++ data/maps/arena_nexdm07.mapcfg | 4 + data/maps/arena_nexdm07.txt | 15 ++ data/maps/arena_nexdm08.mapcfg | 4 + data/maps/arena_nexdm08.txt | 15 ++ data/maps/arena_nexdm09.mapcfg | 4 + data/maps/arena_nexdm09.txt | 18 ++ data/maps/arena_nexdm10.mapcfg | 4 + data/maps/arena_nexdm10.txt | 20 ++ data/maps/arena_nexdm11.mapcfg | 4 + data/maps/arena_nexdm11.txt | 20 ++ data/maps/arena_nexdm12.mapcfg | 4 + data/maps/arena_nexdm12.txt | 14 ++ data/maps/arena_nexdm13.mapcfg | 4 + data/maps/arena_nexdm13.txt | 16 ++ data/maps/arena_nexdm14.mapcfg | 4 + data/maps/arena_nexdm14.txt | 15 ++ data/maps/arena_nexdm15.mapcfg | 4 + data/maps/arena_nexdm15.txt | 20 ++ data/maps/arena_nexdm16.mapcfg | 4 + data/maps/arena_nexdm16.txt | 17 ++ data/maps/arena_nexdm17.mapcfg | 4 + data/maps/arena_nexdm17.txt | 17 ++ data/maps/arena_nexdm18.mapcfg | 4 + data/maps/arena_nexdm18.txt | 16 ++ data/maps/arena_nexdm18_1on1remix.mapcfg | 4 + data/maps/arena_nexdm18_1on1remix.txt | 16 ++ data/maps/arena_nexdmextra1.mapcfg | 4 + data/maps/arena_nexdmextra1.txt | 15 ++ data/maps/arena_nexdmextra2.mapcfg | 4 + data/maps/arena_nexdmextra2.txt | 18 ++ data/menu/creategame/game.menu | 8 + data/menu/creategame/gamemodes/arena.menu | 44 +++++ data/menu/data/game.menu | 1 + data/menu/data/gamemodes/arena.menu | 60 ++++++ data/menu/data/server.menu | 4 +- data/qcsrc/server/gamec/arena.c | 193 ++++++++++++++++++++ data/qcsrc/server/gamec/bots.c | 6 +- data/qcsrc/server/gamec/cl_client.c | 70 +++++-- data/qcsrc/server/gamec/cl_impulse.c | 1 + data/qcsrc/server/gamec/cl_physics.c | 3 +- data/qcsrc/server/gamec/cl_player.c | 7 + data/qcsrc/server/gamec/cl_weapons.c | 4 + data/qcsrc/server/gamec/clientcommands.c | 3 +- data/qcsrc/server/gamec/constants.h | 1 + data/qcsrc/server/gamec/defs.h | 4 + data/qcsrc/server/gamec/g_casings.c | 2 +- data/qcsrc/server/gamec/g_damage.c | 8 +- data/qcsrc/server/gamec/g_hook.c | 4 + data/qcsrc/server/gamec/sv_main.c | 2 + data/qcsrc/server/gamec/teamplay.c | 38 +++- data/qcsrc/server/gamec/w_common.c | 1 + data/qcsrc/server/gamec/w_crylink.c | 2 + data/qcsrc/server/gamec/w_electro.c | 2 + data/qcsrc/server/gamec/w_grenadelauncher.c | 2 + data/qcsrc/server/gamec/w_hagar.c | 2 + data/qcsrc/server/gamec/w_laser.c | 1 + data/qcsrc/server/gamec/w_rocketlauncher.c | 1 + data/qcsrc/server/progs.src | 1 + data/textures/grenademodelskin_glow.jpg | Bin 1642 -> 876 bytes nexuiz-linux.sh | 4 +- 75 files changed, 903 insertions(+), 36 deletions(-) create mode 100644 data/maps/arena_nexctf01.mapcfg create mode 100644 data/maps/arena_nexctf01.txt create mode 100644 data/maps/arena_nexdm01.mapcfg create mode 100644 data/maps/arena_nexdm01.txt create mode 100644 data/maps/arena_nexdm02.mapcfg create mode 100644 data/maps/arena_nexdm02.txt create mode 100644 data/maps/arena_nexdm03.mapcfg create mode 100644 data/maps/arena_nexdm03.txt create mode 100644 data/maps/arena_nexdm04.mapcfg create mode 100644 data/maps/arena_nexdm04.txt create mode 100644 data/maps/arena_nexdm05.mapcfg create mode 100644 data/maps/arena_nexdm05.txt create mode 100644 data/maps/arena_nexdm06.mapcfg create mode 100644 data/maps/arena_nexdm06.txt create mode 100644 data/maps/arena_nexdm07.mapcfg create mode 100644 data/maps/arena_nexdm07.txt create mode 100644 data/maps/arena_nexdm08.mapcfg create mode 100644 data/maps/arena_nexdm08.txt create mode 100644 data/maps/arena_nexdm09.mapcfg create mode 100644 data/maps/arena_nexdm09.txt create mode 100644 data/maps/arena_nexdm10.mapcfg create mode 100644 data/maps/arena_nexdm10.txt create mode 100644 data/maps/arena_nexdm11.mapcfg create mode 100644 data/maps/arena_nexdm11.txt create mode 100644 data/maps/arena_nexdm12.mapcfg create mode 100644 data/maps/arena_nexdm12.txt create mode 100644 data/maps/arena_nexdm13.mapcfg create mode 100644 data/maps/arena_nexdm13.txt create mode 100644 data/maps/arena_nexdm14.mapcfg create mode 100644 data/maps/arena_nexdm14.txt create mode 100644 data/maps/arena_nexdm15.mapcfg create mode 100644 data/maps/arena_nexdm15.txt create mode 100644 data/maps/arena_nexdm16.mapcfg create mode 100644 data/maps/arena_nexdm16.txt create mode 100644 data/maps/arena_nexdm17.mapcfg create mode 100644 data/maps/arena_nexdm17.txt create mode 100644 data/maps/arena_nexdm18.mapcfg create mode 100644 data/maps/arena_nexdm18.txt create mode 100644 data/maps/arena_nexdm18_1on1remix.mapcfg create mode 100644 data/maps/arena_nexdm18_1on1remix.txt create mode 100644 data/maps/arena_nexdmextra1.mapcfg create mode 100644 data/maps/arena_nexdmextra1.txt create mode 100644 data/maps/arena_nexdmextra2.mapcfg create mode 100644 data/maps/arena_nexdmextra2.txt create mode 100644 data/menu/creategame/gamemodes/arena.menu create mode 100644 data/menu/data/gamemodes/arena.menu create mode 100644 data/qcsrc/server/gamec/arena.c diff --git a/data/default.cfg b/data/default.cfg index 943a96772..69e03acbd 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -169,7 +169,7 @@ set g_fullbrightplayers 0 set g_fullbrightitems 0 set g_casings 0 set g_norecoil 0 -set g_maplist_defaultlist "'dm_nexdm01''dm_nexdm02''dm_nexdm03''dm_nexdm04''dm_nexdm05''dm_nexdm06''dm_nexdm07''dm_nexdm08''dm_nexdm09''dm_nexdm10''dm_nexdm11''dm_nexdm12''dm_nexdm13''dm_nexdm14''dm_nexdm15''dm_nexdm16''dm_nexdm17''dm_nexdm18''dm_nexdm18_1on1remix''dm_nexdmextra1''dm_nexdmextra2''dom_nexdm01''dom_nexdm02''dom_nexdm03''dom_nexdm04''dom_nexdm05''dom_nexdm06''dom_nexdm07''dom_nexdm08''dom_nexdm09''dom_nexdm10''dom_nexdm11''dom_nexdm12''dom_nexdm13''dom_nexdm14''dom_nexdm15''dom_nexdm16''dom_nexdm17''dom_nexdm18''dom_nexdm18_1on1remix''dom_nexdmextra1''dom_nexdmextra2''rune_nexdm01''rune_nexdm02''rune_nexdm03''rune_nexdm04''rune_nexdm05''rune_nexdm06''rune_nexdm07''rune_nexdm08''rune_nexdm09''rune_nexdm10''rune_nexdm11''rune_nexdm12''rune_nexdm13''rune_nexdm14''rune_nexdm15''rune_nexdm16''rune_nexdm17''rune_nexdm18''rune_nexdm18_1on1remix''rune_nexdmextra1''rune_nexdmextra2''tdm_nexdm01''tdm_nexdm02''tdm_nexdm03''tdm_nexdm04''tdm_nexdm05''tdm_nexdm06''tdm_nexdm07''tdm_nexdm08''tdm_nexdm09''tdm_nexdm10''tdm_nexdm11''tdm_nexdm12''tdm_nexdm13''tdm_nexdm14''tdm_nexdm15''tdm_nexdm16''tdm_nexdm17''tdm_nexdm18''tdm_nexdm18_1on1remix''tdm_nexdmextra1''tdm_nexdmextra2''ctf_nexctf01''ctf_nexctf02''ctf_nexdm13''lms_nexdm01''lms_nexdm02''lms_nexdm03''lms_nexdm04''lms_nexdm05''lms_nexdm06''lms_nexdm07''lms_nexdm08''lms_nexdm10''lms_nexdm11''lms_nexdm12''lms_nexdm13''lms_nexdm14''lms_nexdm18_1on1remix''lms_nexdm18''lms_nexdmextra2'" +set g_maplist_defaultlist "'dm_nexdm01''dm_nexdm02''dm_nexdm03''dm_nexdm04''dm_nexdm05''dm_nexdm06''dm_nexdm07''dm_nexdm08''dm_nexdm09''dm_nexdm10''dm_nexdm11''dm_nexdm12''dm_nexdm13''dm_nexdm14''dm_nexdm15''dm_nexdm16''dm_nexdm17''dm_nexdm18''dm_nexdm18_1on1remix''dm_nexdmextra1''dm_nexdmextra2''dom_nexdm01''dom_nexdm02''dom_nexdm03''dom_nexdm04''dom_nexdm05''dom_nexdm06''dom_nexdm07''dom_nexdm08''dom_nexdm09''dom_nexdm10''dom_nexdm11''dom_nexdm12''dom_nexdm13''dom_nexdm14''dom_nexdm15''dom_nexdm16''dom_nexdm17''dom_nexdm18''dom_nexdm18_1on1remix''dom_nexdmextra1''dom_nexdmextra2''rune_nexdm01''rune_nexdm02''rune_nexdm03''rune_nexdm04''rune_nexdm05''rune_nexdm06''rune_nexdm07''rune_nexdm08''rune_nexdm09''rune_nexdm10''rune_nexdm11''rune_nexdm12''rune_nexdm13''rune_nexdm14''rune_nexdm15''rune_nexdm16''rune_nexdm17''rune_nexdm18''rune_nexdm18_1on1remix''rune_nexdmextra1''rune_nexdmextra2''tdm_nexdm01''tdm_nexdm02''tdm_nexdm03''tdm_nexdm04''tdm_nexdm05''tdm_nexdm06''tdm_nexdm07''tdm_nexdm08''tdm_nexdm09''tdm_nexdm10''tdm_nexdm11''tdm_nexdm12''tdm_nexdm13''tdm_nexdm14''tdm_nexdm15''tdm_nexdm16''tdm_nexdm17''tdm_nexdm18''tdm_nexdm18_1on1remix''tdm_nexdmextra1''tdm_nexdmextra2''ctf_nexctf01''ctf_nexctf02''ctf_nexdm13''lms_nexdm01''lms_nexdm02''lms_nexdm03''lms_nexdm04''lms_nexdm05''lms_nexdm06''lms_nexdm07''lms_nexdm08''lms_nexdm10''lms_nexdm11''lms_nexdm12''lms_nexdm13''lms_nexdm14''lms_nexdm18_1on1remix''lms_nexdm18''lms_nexdmextra2''arena_nexdm01''arena_nexdm02''arena_nexdm03''arena_nexdm04''arena_nexdm05''arena_nexdm06''arena_nexdm07''arena_nexdm08''arena_nexdm09''arena_nexdm10''arena_nexdm11''arena_nexdm12''arena_nexdm13'' arena_nexdm14''arena_nexdm15''arena_nexdm16''arena_nexdm17''arena_nexdm18_1on1remix''arena_nexdm18''arena_nexdmextra1''arena_nexdmextra2'" seta g_maplist $g_maplist_defaultlist seta g_maplist_index 0 // this is used internally for saving position in maplist cycle seta g_maplist_selectrandom 0 // if 1, a random map will be chosen as next map @@ -305,6 +305,12 @@ set g_lms_campcheck_distance 1800 set g_lms_last_join 3 // if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives set g_lms_join_anytime 1 // if true, new players can join, but get same amount of lives as the worst player +// arena +set g_arena 0 +set g_arena_maxspawned 2 // maximum number of players to spawn at once (the rest is spectating, waiting for their turn) +set g_arena_roundbased 1 // if disabled, the next player will spawn as soon as someone dies +set g_arena_warmup 5 // time, newly spawned players have to prepare themselves in round based matches + // server game balance settings set g_balance_armor_regen 0 set g_balance_armor_rot 0.1 diff --git a/data/maps/arena_nexctf01.mapcfg b/data/maps/arena_nexctf01.mapcfg new file mode 100644 index 000000000..ab81c907c --- /dev/null +++ b/data/maps/arena_nexctf01.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexctf01 diff --git a/data/maps/arena_nexctf01.txt b/data/maps/arena_nexctf01.txt new file mode 100644 index 000000000..b7c1249b2 --- /dev/null +++ b/data/maps/arena_nexctf01.txt @@ -0,0 +1,15 @@ +Basement CTF (arena_nexctf01) +maps/nexctf01 + +Remake of nexdm01, +"The Basement" for CTF. + +Players: 2-8 + +Weapons: Machine Gun, Electro, +Hagar, Mortar + +Gametype: Arena + +Author: +Clinton "Kaziganthe" Freeman diff --git a/data/maps/arena_nexdm01.mapcfg b/data/maps/arena_nexdm01.mapcfg new file mode 100644 index 000000000..1c3c1708a --- /dev/null +++ b/data/maps/arena_nexdm01.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm01 diff --git a/data/maps/arena_nexdm01.txt b/data/maps/arena_nexdm01.txt new file mode 100644 index 000000000..3d29d9cc8 --- /dev/null +++ b/data/maps/arena_nexdm01.txt @@ -0,0 +1,15 @@ +Basement (arena_nexdm01) +maps/nexdm01 + +A small map designed for fast +constant gameplay. + +Players: 2-4 + +Weapons: Machine Gun, Mortar, +Electro, Crylink, Hagar + +Gametype: Arena + +Author: +Garth Hendy \ No newline at end of file diff --git a/data/maps/arena_nexdm02.mapcfg b/data/maps/arena_nexdm02.mapcfg new file mode 100644 index 000000000..e46e012b7 --- /dev/null +++ b/data/maps/arena_nexdm02.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm02 diff --git a/data/maps/arena_nexdm02.txt b/data/maps/arena_nexdm02.txt new file mode 100644 index 000000000..7a15b338e --- /dev/null +++ b/data/maps/arena_nexdm02.txt @@ -0,0 +1,17 @@ +Bleach (arena_nexdm02) +maps/nexdm02 + +A large multiple arena map. + +Players: 6-12 + +Weapons: Machine Gun, Mortar, +Electro, Crylink, Hagar, +Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm03.mapcfg b/data/maps/arena_nexdm03.mapcfg new file mode 100644 index 000000000..dd83a6abc --- /dev/null +++ b/data/maps/arena_nexdm03.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm03 diff --git a/data/maps/arena_nexdm03.txt b/data/maps/arena_nexdm03.txt new file mode 100644 index 000000000..8fdd36bd2 --- /dev/null +++ b/data/maps/arena_nexdm03.txt @@ -0,0 +1,17 @@ +The Slime Pit (arena_nexdm03) +maps/nexdm03 + +An industrial arena. + +Players: 3-5 + +Weapons: Machine Gun, Mortar, +Electro, Nex, Hagar, +Rocket Launcher + +Gametype: Arena + +Author: +Mattrew Rye +Garth Hendy +Maik Merten \ No newline at end of file diff --git a/data/maps/arena_nexdm04.mapcfg b/data/maps/arena_nexdm04.mapcfg new file mode 100644 index 000000000..a27701304 --- /dev/null +++ b/data/maps/arena_nexdm04.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm04 diff --git a/data/maps/arena_nexdm04.txt b/data/maps/arena_nexdm04.txt new file mode 100644 index 000000000..38861ea8f --- /dev/null +++ b/data/maps/arena_nexdm04.txt @@ -0,0 +1,17 @@ +Skyway (arena_nexdm04) +maps/nexdm04 + +Vertical arena. + +Players: 2-6 + +Weapons: Machine Gun, Mortar, +Electro, Nexgun, Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +Mattrew Rye +Garth Hendy \ No newline at end of file diff --git a/data/maps/arena_nexdm05.mapcfg b/data/maps/arena_nexdm05.mapcfg new file mode 100644 index 000000000..973a1ebf5 --- /dev/null +++ b/data/maps/arena_nexdm05.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm05 diff --git a/data/maps/arena_nexdm05.txt b/data/maps/arena_nexdm05.txt new file mode 100644 index 000000000..25afb955f --- /dev/null +++ b/data/maps/arena_nexdm05.txt @@ -0,0 +1,15 @@ +Downer (arena_nexdm05) +maps/nexdm05 + +A multilevel map. + +Players: 3-4 + +Weapons: Electro, Mortar, +Rocket Launcher, Machine Gun + +Gametype: Arena + +Author: +Eric Sambach +Maik Merten \ No newline at end of file diff --git a/data/maps/arena_nexdm06.mapcfg b/data/maps/arena_nexdm06.mapcfg new file mode 100644 index 000000000..9c3de59e3 --- /dev/null +++ b/data/maps/arena_nexdm06.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm06 diff --git a/data/maps/arena_nexdm06.txt b/data/maps/arena_nexdm06.txt new file mode 100644 index 000000000..ed43e2e4f --- /dev/null +++ b/data/maps/arena_nexdm06.txt @@ -0,0 +1,16 @@ +Starship (arena_nexdm06) +maps/nexdm06 + +A sprawling complex. + +Players: 4-6 + +Weapons: Machine Gun, Electro, +Crylink, Nexgun, Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +Chris Matz \ No newline at end of file diff --git a/data/maps/arena_nexdm07.mapcfg b/data/maps/arena_nexdm07.mapcfg new file mode 100644 index 000000000..ecbaf218d --- /dev/null +++ b/data/maps/arena_nexdm07.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm07 diff --git a/data/maps/arena_nexdm07.txt b/data/maps/arena_nexdm07.txt new file mode 100644 index 000000000..76f048889 --- /dev/null +++ b/data/maps/arena_nexdm07.txt @@ -0,0 +1,15 @@ +DSI (arena_nexdm07) +maps/nexdm07 + +Sci-Fi Arena. + +Players: 3-5 + +Weapons: Machine Gun, Mortar, +Electro, Hagar, Crylink, +Rocket Launcher + +Gametypes: Arena + +Author: +Yves Allaire \ No newline at end of file diff --git a/data/maps/arena_nexdm08.mapcfg b/data/maps/arena_nexdm08.mapcfg new file mode 100644 index 000000000..fcb33cf7b --- /dev/null +++ b/data/maps/arena_nexdm08.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm08 diff --git a/data/maps/arena_nexdm08.txt b/data/maps/arena_nexdm08.txt new file mode 100644 index 000000000..cb6e9a224 --- /dev/null +++ b/data/maps/arena_nexdm08.txt @@ -0,0 +1,15 @@ +Glow Arena (arena_nexdm08) +maps/nexdm08 + +A small arena map. + +Players: 2-5 + +Weapons: Machine Gun, Mortar, +Electro, Crylink, +Rocket Launcher + +Gametype: Arena + +Author: +Garth Hendy \ No newline at end of file diff --git a/data/maps/arena_nexdm09.mapcfg b/data/maps/arena_nexdm09.mapcfg new file mode 100644 index 000000000..cf76ef3f7 --- /dev/null +++ b/data/maps/arena_nexdm09.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm09 diff --git a/data/maps/arena_nexdm09.txt b/data/maps/arena_nexdm09.txt new file mode 100644 index 000000000..a4fd8a1ff --- /dev/null +++ b/data/maps/arena_nexdm09.txt @@ -0,0 +1,18 @@ +Aneurysm (arena_nexdm09) +maps/nexdm09 + +A multiple arena map with +complex flow. + +Players: 3-6 + +Weapons: Mortar, Crylink, +Nexgun, Rocket Launcher, +Electro, Machine Gun + +Powerups: Strength + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm10.mapcfg b/data/maps/arena_nexdm10.mapcfg new file mode 100644 index 000000000..5d5d0b088 --- /dev/null +++ b/data/maps/arena_nexdm10.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm10 diff --git a/data/maps/arena_nexdm10.txt b/data/maps/arena_nexdm10.txt new file mode 100644 index 000000000..76fcc1a51 --- /dev/null +++ b/data/maps/arena_nexdm10.txt @@ -0,0 +1,20 @@ +StormKeep (arena_nexdm10) +maps/nexdm10 + +A large slow paced +medieval complex. + +Players: 4-6 + +Weapons: Mortar, Electro, +Crylink, Nexgun, Hagar, +Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +William Libert +Maik Merten +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm11.mapcfg b/data/maps/arena_nexdm11.mapcfg new file mode 100644 index 000000000..3ffc4bdea --- /dev/null +++ b/data/maps/arena_nexdm11.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm11 diff --git a/data/maps/arena_nexdm11.txt b/data/maps/arena_nexdm11.txt new file mode 100644 index 000000000..72f087c0a --- /dev/null +++ b/data/maps/arena_nexdm11.txt @@ -0,0 +1,20 @@ +Toxic (arena_nexdm11) +maps/nexdm11 + +Fast competitive map. + +Players: 2-6 + +Weapons: +Machine Gun, Mortar, +Electro, Nexgun +and Rocket Launcher + +Powerups: +1 Mega Health + +Gametype: +Arena + +Author: +morfar \ No newline at end of file diff --git a/data/maps/arena_nexdm12.mapcfg b/data/maps/arena_nexdm12.mapcfg new file mode 100644 index 000000000..86775c8cc --- /dev/null +++ b/data/maps/arena_nexdm12.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm12 diff --git a/data/maps/arena_nexdm12.txt b/data/maps/arena_nexdm12.txt new file mode 100644 index 000000000..64b38e9f0 --- /dev/null +++ b/data/maps/arena_nexdm12.txt @@ -0,0 +1,14 @@ +Evil Space (arena_nexdm12) +maps/nexdm12 + +A dark space map. + +Players: 2-4 + +Weapons: Machine Gun, Electro, +Nexgun, Rocket Launcher + +Gametype: Arena + +Author: +Yves Allaire \ No newline at end of file diff --git a/data/maps/arena_nexdm13.mapcfg b/data/maps/arena_nexdm13.mapcfg new file mode 100644 index 000000000..32ccf9af4 --- /dev/null +++ b/data/maps/arena_nexdm13.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm13 diff --git a/data/maps/arena_nexdm13.txt b/data/maps/arena_nexdm13.txt new file mode 100644 index 000000000..0da4539fd --- /dev/null +++ b/data/maps/arena_nexdm13.txt @@ -0,0 +1,16 @@ +Dismal (arena_nexdm13) +maps/nexdm13 + +Small space map + +Players: 2-4 + +Weapons: Electro, Nexgun, +Hagar + +Powerups: Strength + +Gametype: Arena + +Author: +"HReaper" \ No newline at end of file diff --git a/data/maps/arena_nexdm14.mapcfg b/data/maps/arena_nexdm14.mapcfg new file mode 100644 index 000000000..99a100bda --- /dev/null +++ b/data/maps/arena_nexdm14.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm14 diff --git a/data/maps/arena_nexdm14.txt b/data/maps/arena_nexdm14.txt new file mode 100644 index 000000000..06cf41c3a --- /dev/null +++ b/data/maps/arena_nexdm14.txt @@ -0,0 +1,15 @@ +Soylent Space (arena_nexdm14) +maps/nexdm14 + +Medium sized vertical Level + +Players: 2-6 + +Weapons: Mortar, Nexgun, +Rocket Launcher, Crylink, +Hagar, Machine Gun + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm15.mapcfg b/data/maps/arena_nexdm15.mapcfg new file mode 100644 index 000000000..5d3d99c4a --- /dev/null +++ b/data/maps/arena_nexdm15.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm15 diff --git a/data/maps/arena_nexdm15.txt b/data/maps/arena_nexdm15.txt new file mode 100644 index 000000000..292a40718 --- /dev/null +++ b/data/maps/arena_nexdm15.txt @@ -0,0 +1,20 @@ +Oilrig (arena_nexdm15) +maps/nexdm15 + +A very large open map designed +after an offshore oil rig. + +Players: 3-6 + +Weapons: Machine Gun, Electro, +Nexgun, Hagar, Mortar, +Crylink + +Powerups: Invincibility, +Strength + +Gametype: Arena + +Author: +Dustin Geeraert +Garth Hendy diff --git a/data/maps/arena_nexdm16.mapcfg b/data/maps/arena_nexdm16.mapcfg new file mode 100644 index 000000000..bb0e753eb --- /dev/null +++ b/data/maps/arena_nexdm16.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm16 diff --git a/data/maps/arena_nexdm16.txt b/data/maps/arena_nexdm16.txt new file mode 100644 index 000000000..8fadb06ed --- /dev/null +++ b/data/maps/arena_nexdm16.txt @@ -0,0 +1,17 @@ +Silver City (arena_nexdm16) +maps/nexdm16 + +A very large very open map. + +Players: 4-16 + +Weapons: Mortar, Electro, +Hagar, Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +Forest Hale +Garth Hendy \ No newline at end of file diff --git a/data/maps/arena_nexdm17.mapcfg b/data/maps/arena_nexdm17.mapcfg new file mode 100644 index 000000000..61a191f8d --- /dev/null +++ b/data/maps/arena_nexdm17.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm17 diff --git a/data/maps/arena_nexdm17.txt b/data/maps/arena_nexdm17.txt new file mode 100644 index 000000000..6d6c3bc87 --- /dev/null +++ b/data/maps/arena_nexdm17.txt @@ -0,0 +1,17 @@ +Diesel Power (arena_nexdm17) +maps/nexdm17 + +A large multiple arena map. + +Players: 6-12 + +Weapons: Mortar, Electro, +Crylink, Hagar, Nexgun, +Rocket Launcher + +Powerups: Strength + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm18.mapcfg b/data/maps/arena_nexdm18.mapcfg new file mode 100644 index 000000000..2d2ec4675 --- /dev/null +++ b/data/maps/arena_nexdm18.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm18 diff --git a/data/maps/arena_nexdm18.txt b/data/maps/arena_nexdm18.txt new file mode 100644 index 000000000..3335c0e8c --- /dev/null +++ b/data/maps/arena_nexdm18.txt @@ -0,0 +1,16 @@ +Running Man (arena_nexdm18) +maps/nexdm18 + +Small DM-Level, best suited +for 2 players. + +Players: 2-4 + +Weapons: Mortar, Nexgun, +Rocket Launcher, Electro, +Crylink, Hagar, Machine Gun + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdm18_1on1remix.mapcfg b/data/maps/arena_nexdm18_1on1remix.mapcfg new file mode 100644 index 000000000..342bc0c30 --- /dev/null +++ b/data/maps/arena_nexdm18_1on1remix.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdm18_1on1remix diff --git a/data/maps/arena_nexdm18_1on1remix.txt b/data/maps/arena_nexdm18_1on1remix.txt new file mode 100644 index 000000000..3ee7eec2e --- /dev/null +++ b/data/maps/arena_nexdm18_1on1remix.txt @@ -0,0 +1,16 @@ +Running Man (arena_nexdm18_1on1remix) +maps/nexdm18_1on1remix + +DM-Level especially designed +for 1on1 Matches. + +Players: 2-4 + +Weapons: Mortar, Nexgun, +Rocket Launcher, Electro, +Crylink, Hagar, Machine Gun + +Gametype: Arena + +Author: +Paul Evers \ No newline at end of file diff --git a/data/maps/arena_nexdmextra1.mapcfg b/data/maps/arena_nexdmextra1.mapcfg new file mode 100644 index 000000000..048ccc09d --- /dev/null +++ b/data/maps/arena_nexdmextra1.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdmextra1 diff --git a/data/maps/arena_nexdmextra1.txt b/data/maps/arena_nexdmextra1.txt new file mode 100644 index 000000000..93d8cc35b --- /dev/null +++ b/data/maps/arena_nexdmextra1.txt @@ -0,0 +1,15 @@ +Q1Dm6 Remake (arena_nexdmextra1) +maps/nexdmextra1 + +The Dark Zone returns. + +Players: 2-6 + +Weapons: Machine Gun, Mortar, +Electro, Crylink, Hagar, +Rocket Launcher + +Gametype: Arena + +Author: +Maik Merten \ No newline at end of file diff --git a/data/maps/arena_nexdmextra2.mapcfg b/data/maps/arena_nexdmextra2.mapcfg new file mode 100644 index 000000000..fb2b30276 --- /dev/null +++ b/data/maps/arena_nexdmextra2.mapcfg @@ -0,0 +1,4 @@ +set g_arena 1 +set fraglimit 0 +set timelimit 15 +changelevel nexdmextra2 diff --git a/data/maps/arena_nexdmextra2.txt b/data/maps/arena_nexdmextra2.txt new file mode 100644 index 000000000..316b2d676 --- /dev/null +++ b/data/maps/arena_nexdmextra2.txt @@ -0,0 +1,18 @@ +Aggressor (arena_nexdmextra2) +maps/nexdmextra2 + +Small map with brutal fast +vertical action. + +Players: 2-4 + +Weapons: Electro, Machine Gun, +Mortar, Hagar, Rocket Launcher, +Nex + +Gametype: Arena + +Layout/Architecture: +Kevin "Tyrann" Shanahan +Texturing/Lighting: +Paul Evers diff --git a/data/menu/creategame/game.menu b/data/menu/creategame/game.menu index f044555d4..79d2869ae 100644 --- a/data/menu/creategame/game.menu +++ b/data/menu/creategame/game.menu @@ -42,6 +42,13 @@ Item Layout Game init Nex_Action_JumpToPage target "Panel::LMS" } + Derive TextButton Arena + { + normal "Arena" + + init Nex_Action_JumpToPage + target "Panel::Arena" + } Derive TextButton GameMisc { normal "Misc" @@ -61,5 +68,6 @@ Item Layout Game #include "menu/creategame/gamemodes/domination.menu" #include "menu/creategame/gamemodes/runematch.menu" #include "menu/creategame/gamemodes/lms.menu" + #include "menu/creategame/gamemodes/arena.menu" } } diff --git a/data/menu/creategame/gamemodes/arena.menu b/data/menu/creategame/gamemodes/arena.menu new file mode 100644 index 000000000..38e799508 --- /dev/null +++ b/data/menu/creategame/gamemodes/arena.menu @@ -0,0 +1,44 @@ +Item Layout Arena +{ + direction [Nex_DefaultVertDirection] + size '900 585' + origin '600 50' + alignment [AlignFirst] + + Derive Nex_Option_EditBox TimeLimit + { + text "Time Limit Override (disable: -1)" + target "Data::Server::TimeLimit::Text" + } + Derive Nex_Option_EditBox FragLimit + { + text "Frag Limit Override (disable: -1)" + target "Data::Server::FragLimit::Text" + } + Derive Nex_Option_EditBox MaxSpawned + { + text "Maximum Players Spawned" + target "::Data::Game::Arena::MaxSpawned::Text" + } + Derive Nex_Option_Switch RoundBased + { + text "Spawn Players In Rounds" + target "::Data::Game::Arena::RoundBased::Switch" + } + Derive Nex_Option_EditBox Warmup + { + text "Warmup Time" + target "::Data::Game::Arena::Warmup::Text" + } + + + + Derive Nex_Line Seperator + {} + Derive TextButton Reset + { + normal "Reset to default" + init Nex_Action_ResetData + target "::Data::Game::Arena" + } +} diff --git a/data/menu/data/game.menu b/data/menu/data/game.menu index 2d5f23cd3..979d8e122 100644 --- a/data/menu/data/game.menu +++ b/data/menu/data/game.menu @@ -11,4 +11,5 @@ Item DataContainer Game #include "menu/data/gamemodes/domination.menu" #include "menu/data/gamemodes/runematch.menu" #include "menu/data/gamemodes/lms.menu" + #include "menu/data/gamemodes/arena.menu" } diff --git a/data/menu/data/gamemodes/arena.menu b/data/menu/data/gamemodes/arena.menu new file mode 100644 index 000000000..e4e2c0f22 --- /dev/null +++ b/data/menu/data/gamemodes/arena.menu @@ -0,0 +1,60 @@ +// Property of Alientrap +// +// data/gamemisc.menu + +Item DataContainer Arena +{ + Item Data_Cvar MaxSpawned + { + cvarName "g_arena_maxspawned" + defValue 2 + + Item DataLink_Value Value + { + minValue 2 + maxValue 256 + stepValue 1 + link "##up" + } + Item DataLink_Text Text + { + maxValue 8 + link "##down" + + Item DataLink_TextValue TextValue + { + link "##up prev" + } + } + } + Item Data_Cvar RoundBased + { + cvarName "g_arena_roundbased" + defValue 1 + + [DataLink_OnOffSwitch] + } + Item Data_Cvar Warmup + { + cvarName "g_arena_warmup" + defValue 5 + + Item DataLink_Value Value + { + minValue 0 + maxValue 60 + stepValue 1 + link "##up" + } + Item DataLink_Text Text + { + maxValue 60 + link "##down" + + Item DataLink_TextValue TextValue + { + link "##up prev" + } + } + } +} diff --git a/data/menu/data/server.menu b/data/menu/data/server.menu index fb8a4c87e..814ba4c7f 100644 --- a/data/menu/data/server.menu +++ b/data/menu/data/server.menu @@ -13,8 +13,8 @@ Item DataContainer Server Item DataLink_TextSwitch Switch { - valueList "'' 'dm_' 'tdm_' 'dom_' 'ctf_' 'rune_' 'lms_'" - descList "'List All''Classic Deathmatch''Team Deathmatch''Domination''Capture The Flag''Rune Match''Last Man Standing'" + valueList "'' 'dm_' 'tdm_' 'dom_' 'ctf_' 'rune_' 'lms_' 'arena_'" + descList "'List All''Classic Deathmatch''Team Deathmatch''Domination''Capture The Flag''Rune Match''Last Man Standing''Arena'" link "##up" } diff --git a/data/qcsrc/server/gamec/arena.c b/data/qcsrc/server/gamec/arena.c new file mode 100644 index 000000000..209bfad8d --- /dev/null +++ b/data/qcsrc/server/gamec/arena.c @@ -0,0 +1,193 @@ +float maxspawned; +float numspawned; +float arena_roundbased; +.float spawned; +.entity spawnqueue_next; +.entity spawnqueue_prev; +.float spawnqueue_in; +entity spawnqueue_first; +entity spawnqueue_last; +entity champion; +.float arena_warmup_end; + +void PutObserverInServer(); +void PutClientInServer(); +void(entity e) DropFlag; +void(entity e) ReturnFlag; +void(entity e) removedecor; + +void reset_map() +{ + float warmup; + + champion = world; + self = nextent(world); + + warmup = cvar("g_arena_warmup"); + + while(self) + { + if(self.classname == "droppedweapon" // cleanup + || self.classname == "gib" + || self.classname == "body") + { + remove(self); + } + else if(self.flags & FL_ITEM) // reset items + { + self.model = self.mdl; + self.solid = SOLID_TRIGGER; + setorigin (self, self.origin); + self.think = SUB_Null; + self.nextthink = 0; + self.effects = self.effects - (self.effects & EF_STARDUST); + } + else if(self.flags & FL_PROJECTILE) // remove any projectiles left + { + sound(self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM); + remove(self); + } + else if(self.isdecor) + { + removedecor(self); + } + else if(self.flags & FL_CLIENT) // reset all players + { + if(self.spawned) + { + if(self.classname == "player" && !self.deadflag) + champion = self; + + self.classname = "player"; + + if(warmup) + self.arena_warmup_end = time + warmup; + } + else + { + self.classname = "observer"; + } + PutClientInServer(); + + } + self = nextent(self); + } + + if(champion) + champion.frags += 1; +} + +void Spawnqueue_Insert(entity e) +{ + if(e.spawnqueue_in) + return; + dprint(strcat("Into queue: ", e.netname, "\n")); + e.spawnqueue_in = TRUE; + e.spawnqueue_prev = spawnqueue_last; + e.spawnqueue_next = world; + if(spawnqueue_last) + spawnqueue_last.spawnqueue_next = e; + spawnqueue_last = e; + if(!spawnqueue_first) + spawnqueue_first = e; +} + +void Spawnqueue_Remove(entity e) +{ + if(!e.spawnqueue_in) + return; + dprint(strcat("Out of queue: ", e.netname, "\n")); + e.spawnqueue_in = FALSE; + if(e == spawnqueue_first) + spawnqueue_first = e.spawnqueue_next; + if(e == spawnqueue_last) + spawnqueue_last = e.spawnqueue_prev; + if(e.spawnqueue_prev) + e.spawnqueue_prev.spawnqueue_next = e.spawnqueue_next; + if(e.spawnqueue_next) + e.spawnqueue_next.spawnqueue_prev = e.spawnqueue_prev; + e.spawnqueue_next = world; + e.spawnqueue_prev = world; +} + +void Spawnqueue_Unmark(entity e) +{ + if(!e.spawned) + return; + e.spawned = FALSE; + numspawned = numspawned - 1; +} + +void Spawnqueue_Mark(entity e) +{ + if(e.spawned) + return; + e.spawned = TRUE; + numspawned = numspawned + 1; +} + +void Arena_Warmup() +{ + string msg; + + if(!arena_roundbased) + return; + + msg = newlines; + if(time < self.arena_warmup_end) + { + float f; + f = rint(self.arena_warmup_end - time); + + if(champion) + msg = strcat(msg, "The Champion is ", champion.netname, "^7\n\n\n"); + + if(f) + msg = strcat(msg, "Round will start in ", ftos(rint(self.arena_warmup_end - time))); + else + { + if(self.spawned) + msg = strcat(msg, "^1Fight!"); + } + + centerprint(self, msg); + + if(self.spawned) + self.movetype = MOVETYPE_NONE; + } + else if(self.movetype == MOVETYPE_NONE) + { + self.movetype = MOVETYPE_WALK; + centerprint(self, "\n"); + } + +} + +float next_round; +void Spawnqueue_Check() +{ + if(!next_round) + if(numspawned < 2) + next_round = time + 3; + + if(!arena_roundbased || (next_round && next_round < time && player_count > 1)) + { + next_round = 0; + while(numspawned < maxspawned && spawnqueue_first) + { + self = spawnqueue_first; + + bprint (strcat("^4", self.netname, "^4 is the next challenger\n")); + + Spawnqueue_Remove(self); + Spawnqueue_Mark(self); + if(!arena_roundbased) + { + self.classname = "player"; + PutClientInServer(); + } + } + if(arena_roundbased) + reset_map(); + } +} diff --git a/data/qcsrc/server/gamec/bots.c b/data/qcsrc/server/gamec/bots.c index e4f0ee5a7..c281edfef 100644 --- a/data/qcsrc/server/gamec/bots.c +++ b/data/qcsrc/server/gamec/bots.c @@ -111,7 +111,7 @@ void() AutoBotRemove = { local entity ent, t; - ent = findchain(classname, "player"); + ent = findchainflags(flags, FL_CLIENT); while (ent) { if (clienttype(ent) == CLIENTTYPE_BOT) @@ -124,12 +124,12 @@ void() AutoBotRemove = urrebot_chain = self.list; else { - t = find(world, classname, "player"); + t = findflags(world, flags, FL_CLIENT); while(t) { if (t.list == ent) t.list = ent.list; - t = find(t, classname, "player"); + t = findflags(t, flags, FL_CLIENT); } } } diff --git a/data/qcsrc/server/gamec/cl_client.c b/data/qcsrc/server/gamec/cl_client.c index 430377df1..05e427e6c 100644 --- a/data/qcsrc/server/gamec/cl_client.c +++ b/data/qcsrc/server/gamec/cl_client.c @@ -187,6 +187,13 @@ void PutObserverInServer (void) spot = SelectSpawnPoint (FALSE); RemoveGrapplingHook(self); // Wazat's Grappling Hook + if(clienttype(self) == CLIENTTYPE_REAL) + { + msg_entity = self; + WriteByte(MSG_ONE, SVC_SETVIEW); + WriteEntity(MSG_ONE, self); + } + if (cvar("g_runematch")) DropAllRunes(self); @@ -231,7 +238,8 @@ void PutObserverInServer (void) self.fixangle = TRUE; self.crouch = FALSE; self.view_ofs = PL_VIEW_OFS; - setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 14)); + setorigin (self, spot.origin); + setsize (self, '0 0 0', '0 0 0'); self.oldorigin = self.origin; self.items = 0; self.model = ""; @@ -247,10 +255,20 @@ void PutObserverInServer (void) self.punchvector = '0 0 0'; self.oldvelocity = self.velocity; - if(!cvar("g_lms")) + if(cvar("g_arena")) + { + if(self.frags != -2) + { + Spawnqueue_Insert(self); + } + else + { + Spawnqueue_Unmark(self); + Spawnqueue_Remove(self); + } + } + else if(!cvar("g_lms")) self.frags = -666; - //stuffcmd(self, "set viewsize 120 \n"); -// bprint (strcat("^4", self.netname, "^4 is spectating now\n")); } @@ -263,14 +281,24 @@ Called when a client spawns in the server */ void PutClientInServer (void) { - if(clienttype(self) == CLIENTTYPE_BOT) + if(clienttype(self) == CLIENTTYPE_BOT) { self.classname = "player"; } + else if(clienttype(self) == CLIENTTYPE_REAL) + { + msg_entity = self; + WriteByte(MSG_ONE, SVC_SETVIEW); + WriteEntity(MSG_ONE, self); + } // player is dead and becomes observer if(cvar("g_lms") && self.frags < 1) self.classname = "observer"; + + if(cvar("g_arena")) + if(!self.spawned) + self.classname = "observer"; if(self.classname == "player") { entity spot; @@ -453,6 +481,9 @@ void PutClientInServer (void) self.jump_interval = time; } + if(cvar("g_arena")) + Spawnqueue_Remove(self); + self.event_damage = PlayerDamage; self.statdraintime = time + 5; @@ -460,7 +491,8 @@ void PutClientInServer (void) if(self.killcount == -666) { self.killcount = 0; - self.frags = 0; + if(!cvar("g_arena")) + self.frags = 0; } self.cnt = WEP_LASER; @@ -621,6 +653,11 @@ void ClientConnect (void) self.frags = lms_lowest_lives; } } + else if(cvar("g_arena")) + { + self.classname = "observer"; + Spawnqueue_Insert(self); + } player_count += 1; self.jointime = time; @@ -665,7 +702,8 @@ void ClientDisconnect (void) // player was dead, decrease dead count if(cvar("g_lms") && self.frags < 1) lms_dead_count -= 1; - //stuffcmd(self, "set viewsize $tmpviewsize \n"); + else if(cvar("g_arena")) + Spawnqueue_Remove(self); } .float buttonchat; @@ -1064,6 +1102,8 @@ void SpectateCopy(entity spectatee) { void SpectateUpdate() { if (self != self.enemy) { + if(self.enemy.flags & FL_NOTARGET) + PutObserverInServer(); SpectateCopy(self.enemy); msg_entity = self; WriteByte(MSG_ONE, SVC_SETANGLE); @@ -1136,7 +1176,7 @@ void PlayerPreThink (void) } else if (self.deadflag == DEAD_DEAD) { - if (cvar("g_lms") || cvar("g_forced_respawn")) + if (cvar("g_lms") || cvar("g_arena") || cvar("g_forced_respawn")) self.button0 = self.button2 = self.button3 = 0; if (!self.button0 && !self.button2 && !self.button3) @@ -1284,9 +1324,9 @@ void PlayerPreThink (void) if(!cvar("teamplay")) { self.flags = self.flags & !FL_JUMPRELEASED; self.classname = "player"; - if(!cvar("g_lms")) - bprint (strcat("^4", self.netname, "^4 is playing now\n")); PutClientInServer(); + if(self.flags & !FL_NOTARGET) + bprint (strcat("^4", self.netname, "^4 is playing now\n")); centerprint(self,""); return; } else { @@ -1316,9 +1356,6 @@ void PlayerPreThink (void) if(!cvar("g_lms")) bprint (strcat("^4", self.netname, "^4 is playing now\n")); - msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEW); - WriteEntity(MSG_ONE, self); PutClientInServer(); centerprint(self,""); return; @@ -1333,17 +1370,11 @@ void PlayerPreThink (void) self.classname = "spectator"; } else { self.classname = "observer"; - msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEW); - WriteEntity(MSG_ONE, self); PutClientInServer(); } } else if (self.button3) { self.flags = self.flags & !FL_JUMPRELEASED; self.classname = "observer"; - msg_entity = self; - WriteByte(MSG_ONE, SVC_SETVIEW); - WriteEntity(MSG_ONE, self); PutClientInServer(); } else { SpectateUpdate(); @@ -1385,4 +1416,5 @@ void PlayerPostThink (void) } else if (self.classname == "spectator") { //do nothing } + Arena_Warmup(); } diff --git a/data/qcsrc/server/gamec/cl_impulse.c b/data/qcsrc/server/gamec/cl_impulse.c index 2d80d5a9b..9f2315421 100644 --- a/data/qcsrc/server/gamec/cl_impulse.c +++ b/data/qcsrc/server/gamec/cl_impulse.c @@ -139,6 +139,7 @@ void ImpulseCommands (void) self.ammo_cells = 999; } } + else reset_map(); } //TetrisImpulses(); } diff --git a/data/qcsrc/server/gamec/cl_physics.c b/data/qcsrc/server/gamec/cl_physics.c index b541ab7b2..521b31279 100644 --- a/data/qcsrc/server/gamec/cl_physics.c +++ b/data/qcsrc/server/gamec/cl_physics.c @@ -212,7 +212,8 @@ void SV_PlayerPhysics() if(!(self.lastflags & FL_ONGROUND)) { - dprint(strcat("landing velocity: ", vtos(self.velocity), " (abs: ", ftos(vlen(self.velocity)), ")\n")); + if(cvar("speedmeter")) + dprint(strcat("landing velocity: ", vtos(self.velocity), " (abs: ", ftos(vlen(self.velocity)), ")\n")); self.velocity = self.velocity * (1 - cvar("sv_friction_on_land")); } diff --git a/data/qcsrc/server/gamec/cl_player.c b/data/qcsrc/server/gamec/cl_player.c index 696dc44f5..67e1ddc0f 100644 --- a/data/qcsrc/server/gamec/cl_player.c +++ b/data/qcsrc/server/gamec/cl_player.c @@ -247,6 +247,10 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.pain_finished = time + 0.5; //Supajoe } + if(cvar("g_arena")) + if(numspawned < 2) + return; + if (!cvar("g_minstagib")) { save = bound(0, damage * cvar("g_balance_armor_blockpercent"), self.armorvalue); @@ -363,6 +367,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht WriteAngle (MSG_ONE, self.v_angle_y); WriteAngle (MSG_ONE, 80); } + + if(cvar("g_arena")) + Spawnqueue_Unmark(self); } } diff --git a/data/qcsrc/server/gamec/cl_weapons.c b/data/qcsrc/server/gamec/cl_weapons.c index 9e14f790c..2a4b45fea 100644 --- a/data/qcsrc/server/gamec/cl_weapons.c +++ b/data/qcsrc/server/gamec/cl_weapons.c @@ -246,6 +246,10 @@ void() W_PreviousWeapon = // Bringed back weapon frame void() W_WeaponFrame = { + if(arena_roundbased) + if(time < self.arena_warmup_end) + return; + if (!self.weaponentity || self.health < 1) return; // Dead player can't use weapons and injure impulse commands diff --git a/data/qcsrc/server/gamec/clientcommands.c b/data/qcsrc/server/gamec/clientcommands.c index 9166b5304..a13955e6d 100644 --- a/data/qcsrc/server/gamec/clientcommands.c +++ b/data/qcsrc/server/gamec/clientcommands.c @@ -204,13 +204,14 @@ void SV_ParseClientCommand(string s) { stuffcmd(self,"menu_showteamselect\n"); } } else if(argv(0) == "spectate") { - if(cvar("g_lms")) + if(cvar("g_lms") || cvar("g_arena")) return; // don't allow spectating in lms, unless player runs out of lives if(self.classname == "player" && cvar("sv_spectate") == 1) { self.classname = "observer"; PutClientInServer(); } } else if(argv(0) == "join") { + if(!cvar("g_arena")) if (self.classname != "player") { self.classname = "player"; diff --git a/data/qcsrc/server/gamec/constants.h b/data/qcsrc/server/gamec/constants.h index 827eb9884..2a8d2c0b7 100644 --- a/data/qcsrc/server/gamec/constants.h +++ b/data/qcsrc/server/gamec/constants.h @@ -16,6 +16,7 @@ float FL_WATERJUMP = 2048; float FL_JUMPRELEASED = 4096; float FL_WEAPON = 8192; float FL_POWERUP = 16384; +float FL_PROJECTILE = 32768; float MOVETYPE_NONE = 0; float MOVETYPE_ANGLENOCLIP = 1; diff --git a/data/qcsrc/server/gamec/defs.h b/data/qcsrc/server/gamec/defs.h index 15d77d2b5..805676597 100644 --- a/data/qcsrc/server/gamec/defs.h +++ b/data/qcsrc/server/gamec/defs.h @@ -13,6 +13,8 @@ float team1_score, team2_score, team3_score, team4_score; float maxclients; +string newlines = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; + //entity casing; entity dest; @@ -256,3 +258,5 @@ float playerid_last; .vector death_origin; .vector killer_origin; + +.float isdecor; diff --git a/data/qcsrc/server/gamec/g_casings.c b/data/qcsrc/server/gamec/g_casings.c index c73154e4d..2b6f571e0 100644 --- a/data/qcsrc/server/gamec/g_casings.c +++ b/data/qcsrc/server/gamec/g_casings.c @@ -58,7 +58,7 @@ void(vector org, vector vel, float randomvel, vector ang, vector avel, float ran return; e = newdecor(); - //e.isdecor = TRUE; + e.isdecor = TRUE; e.alpha = 1; //e.forcescale = 15; e.movetype = MOVETYPE_BOUNCE; diff --git a/data/qcsrc/server/gamec/g_damage.c b/data/qcsrc/server/gamec/g_damage.c index da88a14e5..6c5e244b6 100644 --- a/data/qcsrc/server/gamec/g_damage.c +++ b/data/qcsrc/server/gamec/g_damage.c @@ -6,7 +6,13 @@ void GiveFrags (entity attacker, entity targ, float f) if(gameover) return; - if(f > 0 && cvar("g_domination") && cvar("g_domination_disable_frags")) + if(cvar("g_arena")) + if(cvar("g_arena_roundbased")) + return; + + if(cvar("g_domination")) + if(cvar("g_domination_disable_frags")) + if(f > 0) return; else if(f > 0 && cvar("g_runematch")) f = RunematchHandleFrags(attacker, targ, f); diff --git a/data/qcsrc/server/gamec/g_hook.c b/data/qcsrc/server/gamec/g_hook.c index 9f5553d0a..12ca27188 100644 --- a/data/qcsrc/server/gamec/g_hook.c +++ b/data/qcsrc/server/gamec/g_hook.c @@ -200,6 +200,10 @@ void FireGrapplingHook (void) local entity missile; local vector org; + if(arena_roundbased) + if(time < self.arena_warmup_end) + return; + makevectors(self.v_angle); sound (self, CHAN_WEAPON, "weapons/hook_fire.ogg", 1, ATTN_NORM); diff --git a/data/qcsrc/server/gamec/sv_main.c b/data/qcsrc/server/gamec/sv_main.c index b0514ca6f..f0dc9ef68 100644 --- a/data/qcsrc/server/gamec/sv_main.c +++ b/data/qcsrc/server/gamec/sv_main.c @@ -154,6 +154,8 @@ void StartFrame (void) teamplay = cvar ("teamplay"); skill = cvar("skill"); + Spawnqueue_Check(); + CreatureFrame (); CheckRules_World (); diff --git a/data/qcsrc/server/gamec/teamplay.c b/data/qcsrc/server/gamec/teamplay.c index 7f1178a98..860a77587 100644 --- a/data/qcsrc/server/gamec/teamplay.c +++ b/data/qcsrc/server/gamec/teamplay.c @@ -10,6 +10,7 @@ float GAME_DOMINATION = 3; float GAME_CTF = 4; float GAME_RUNEMATCH = 5; float GAME_LMS = 6; +float GAME_ARENA = 7; // client counts for each team @@ -86,6 +87,7 @@ void ResetGameCvars() cvar_set("g_ctf", "0"); cvar_set("g_runematch", "0"); cvar_set("g_lms", "0"); + cvar_set("g_arena", "0"); cvar_set("teamplay", "0"); @@ -125,6 +127,7 @@ void InitGameplayMode() if(game == GAME_DOMINATION || cvar("g_domination")) { + ResetGameCvars(); game = GAME_DOMINATION; cvar_set("g_domination", "1"); @@ -137,6 +140,7 @@ void InitGameplayMode() } else if(game == GAME_CTF || cvar("g_ctf")) { + ResetGameCvars(); game = GAME_CTF; cvar_set("g_ctf", "1"); @@ -171,6 +175,7 @@ void InitGameplayMode() if(game == GAME_TEAM_DEATHMATCH || cvar("g_tdm") || cvar("deathmatch_force_teamplay")) { + ResetGameCvars(); game = GAME_TEAM_DEATHMATCH; gamemode_name = "Team Deathmatch"; ActivateTeamplay(); @@ -179,6 +184,7 @@ void InitGameplayMode() } else { + ResetGameCvars(); game = GAME_DEATHMATCH; gamemode_name = "Deathmatch"; teams_matter = 0; @@ -188,6 +194,7 @@ void InitGameplayMode() } else if(game == GAME_LMS || cvar("g_lms")) { + ResetGameCvars(); game = GAME_LMS; cvar_set("g_lms", "1"); fraglimit_override = cvar("g_lms_lives_override"); @@ -195,12 +202,25 @@ void InitGameplayMode() fraglimit_override = -1; gamemode_name = "Last Man Standing"; teams_matter = 0; - cvar_set("teamplay", "0"); lms_lowest_lives = 999; } + else if(game == GAME_ARENA || cvar("g_arena")) + { + ResetGameCvars(); + game = GAME_ARENA; + cvar_set("g_arena", "1"); + fraglimit_override = cvar("g_arena_point_limit"); + maxspawned = cvar("g_arena_maxspawned"); + if(maxspawned < 2) + maxspawned = 2; + arena_roundbased = cvar("g_arena_roundbased"); + gamemode_name = "Arena"; + teams_matter = 0; + } else { // we can only assume... + ResetGameCvars(); gamemode_name = "Deathmatch"; teams_matter = 0; } @@ -275,7 +295,7 @@ string GetClientVersionMessage(float v) { void PrintWelcomeMessage(entity pl) { - string s, mutator, modifications, newlines; + string s, mutator, modifications; /*if(self.welcomemessage_time < time) return; @@ -283,8 +303,6 @@ void PrintWelcomeMessage(entity pl) return; self.welcomemessage_time2 = time + 0.8; */ - newlines = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - if(self.classname == "observer") { if(cvar("g_lms") && self.frags <= 0 && self.frags > -666) @@ -294,7 +312,7 @@ void PrintWelcomeMessage(entity pl) } else if(self.classname == "spectator") { - if (cvar("g_lms") && self.frags < 1) + if ((cvar("g_lms") && self.frags < 1) || cvar("g_arena")) return centerprint(self, strcat(newlines, "spectating ", self.enemy.netname, "\n\n\n^7press attack for next player\npress attack2 for free fly mode")); else return centerprint(self, strcat(newlines, "spectating ", self.enemy.netname, "\n\n\n^7press jump to play\n^7press attack for next player\npress attack2 for free fly mode")); @@ -341,7 +359,15 @@ void PrintWelcomeMessage(entity pl) s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n"); if((self.classname == "observer" || self.classname == "spectator") && self.version == cvar("gameversion")) { - s = strcat(s,"^7\n\n\npress jump to play\npress attack to spectate other players\n\n"); + if(!cvar("g_arena")) + s = strcat(s,"^7\n\n\npress jump to play\npress attack to spectate other players\n\n"); + else if(self.spawnqueue_in) + { + s = strcat(s, "\n\n\n"); + if(champion) + s = strcat(s, "^7current champion is: ", champion.netname, "\n\n"); + s = strcat(s,"^7press attack to spectate other players\n\n"); + } } diff --git a/data/qcsrc/server/gamec/w_common.c b/data/qcsrc/server/gamec/w_common.c index 08abe8f9a..74ab03ab1 100644 --- a/data/qcsrc/server/gamec/w_common.c +++ b/data/qcsrc/server/gamec/w_common.c @@ -499,6 +499,7 @@ void fireBullet (vector start, vector dir, float spread, float damage, float dty setsize (e, '0 0 0', '0 0 0'); setorigin (e, start); e.effects = e.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_NOSHADOW; + e.flags = FL_PROJECTILE; } if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY)) diff --git a/data/qcsrc/server/gamec/w_crylink.c b/data/qcsrc/server/gamec/w_crylink.c index 86eaca3bd..93e8b5ea7 100644 --- a/data/qcsrc/server/gamec/w_crylink.c +++ b/data/qcsrc/server/gamec/w_crylink.c @@ -143,6 +143,7 @@ void W_Crylink_Attack (void) //proj.glow_size = 20; proj.effects = EF_NOSHADOW | EF_FULLBRIGHT | EF_LOWPRECISION; + proj.flags = FL_PROJECTILE; proj.colormod = proj_color; counter = counter + 1; } @@ -193,6 +194,7 @@ void W_Crylink_Attack2 (void) //proj.glow_size = 20; proj.effects = EF_NOSHADOW | EF_FULLBRIGHT | EF_LOWPRECISION; + proj.flags = FL_PROJECTILE; proj.colormod = proj_color; counter = counter + 1; } diff --git a/data/qcsrc/server/gamec/w_electro.c b/data/qcsrc/server/gamec/w_electro.c index 734f6fb9c..dfcfea271 100644 --- a/data/qcsrc/server/gamec/w_electro.c +++ b/data/qcsrc/server/gamec/w_electro.c @@ -160,6 +160,7 @@ void() W_Electro_Attack proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_primary_speed"); proj.angles = vectoangles(proj.velocity); proj.touch = W_Plasma_TouchExplode; + proj.flags = FL_PROJECTILE; setmodel(proj, "models/elaser.mdl"); setsize(proj, '0 0 0', '0 0 0'); @@ -215,6 +216,7 @@ void() W_Electro_Attack2 proj.damageforcescale = 4; proj.health = 5; proj.event_damage = W_Plasma_Damage; + proj.flags = FL_PROJECTILE; sound (proj, CHAN_BODY, "weapons/electro_fly.wav", 1, ATTN_NORM); } diff --git a/data/qcsrc/server/gamec/w_grenadelauncher.c b/data/qcsrc/server/gamec/w_grenadelauncher.c index 9d200a96c..2bef2352b 100644 --- a/data/qcsrc/server/gamec/w_grenadelauncher.c +++ b/data/qcsrc/server/gamec/w_grenadelauncher.c @@ -139,6 +139,7 @@ void W_Grenade_Attack (void) gren.avelocity_x = random () * -500 - 500; gren.angles = vectoangles (gren.velocity); + gren.flags = FL_PROJECTILE; } void W_Grenade_Attack2 (void) @@ -176,6 +177,7 @@ void W_Grenade_Attack2 (void) gren.avelocity = '100 150 100'; gren.angles = vectoangles (gren.velocity); + gren.flags = FL_PROJECTILE; } // weapon frames diff --git a/data/qcsrc/server/gamec/w_hagar.c b/data/qcsrc/server/gamec/w_hagar.c index e8f70f24d..f4a2ba635 100644 --- a/data/qcsrc/server/gamec/w_hagar.c +++ b/data/qcsrc/server/gamec/w_hagar.c @@ -138,6 +138,7 @@ void W_Hagar_Attack (void) missile.velocity = (normalize(trueaim - org) + randomvec() * cvar("g_balance_hagar_primary_spread")) * cvar("g_balance_hagar_primary_speed"); missile.angles = vectoangles (missile.velocity); + missile.flags = FL_PROJECTILE; } void W_Hagar_Attack2 (void) @@ -179,6 +180,7 @@ void W_Hagar_Attack2 (void) missile.avelocity = '100 10 10'; missile.angles = vectoangles (missile.velocity); + missile.flags = FL_PROJECTILE; } // weapon frames diff --git a/data/qcsrc/server/gamec/w_laser.c b/data/qcsrc/server/gamec/w_laser.c index 2b1cc3740..429ffc01c 100644 --- a/data/qcsrc/server/gamec/w_laser.c +++ b/data/qcsrc/server/gamec/w_laser.c @@ -101,6 +101,7 @@ void W_Laser_Attack (void) missile.nextthink = time + cvar("g_balance_laser_lifetime"); missile.effects = EF_NOSHADOW | EF_FULLBRIGHT | EF_FULLBRIGHT | EF_LOWPRECISION; + missile.flags = FL_PROJECTILE; } // weapon frames diff --git a/data/qcsrc/server/gamec/w_rocketlauncher.c b/data/qcsrc/server/gamec/w_rocketlauncher.c index bf6e47411..24b78f340 100644 --- a/data/qcsrc/server/gamec/w_rocketlauncher.c +++ b/data/qcsrc/server/gamec/w_rocketlauncher.c @@ -275,6 +275,7 @@ void W_Rocket_Attack (void) missile.cnt = time + cvar("g_balance_rocketlauncher_lifetime"); missile.effects = EF_NOSHADOW; sound (missile, CHAN_BODY, "weapons/rocket_fly.wav", 0.4, ATTN_NORM); + missile.flags = FL_PROJECTILE; flash = spawn (); setorigin (flash, org); diff --git a/data/qcsrc/server/progs.src b/data/qcsrc/server/progs.src index 79b9dac79..7924e79a9 100644 --- a/data/qcsrc/server/progs.src +++ b/data/qcsrc/server/progs.src @@ -20,6 +20,7 @@ gamec/urrebot_ai_main.c gamec/g_subs.c gamec/runematch.c +gamec/arena.c gamec/g_violence.c gamec/g_damage.c diff --git a/data/textures/grenademodelskin_glow.jpg b/data/textures/grenademodelskin_glow.jpg index 3ed650acbf19ee0ac540cea273a59de3cf686b7b..e5c2e5a68e8429720b8660ff1be40504f5efe565 100644 GIT binary patch literal 876 zcmex=iINl~k1E zRAl7jvd&2IH}-INS{X{i>=ouY2AR^^yw(N)aj;)Z!x? zq~hMc%TwFGQZ2arySZ@umC0KFZah4fd~?gG+&-CSw%tCf+R857x+~Y$bHPwQR?f1{ zOM3s#9kc!|ndy7~&K=+SAfMI0liMx(lP+s+vnZbNP1k7VZSU-oDk(PA*NczqpLB*A ztGWC4?9TPCJg3&@6g)S46P4T)%w#>e=knhaV1AKJD38>?BvUwEgLav-uu& z7uNmwcQR7xcuLsHsFt*q(vRyk40{&coS`~9^YYTB%Po_RdAPmEe(THqpJ4)n*9xVi z2A0#Z!A@3t1?nDv!iM(+TgjX4%}Y444~gEFzp1U9JHl!M%obzta^`j^A3#kAL$zDRpl`?ZViPeZcf9@QYV8hVV^U=l=%N90KJqUhX4Qo literal 1642 zcmex=mO8#^02KL-cDf~b(Fr~;|r{}IMTz@TPj1OuSU z!GMv8nFZ(^4o)s^0R|>UW@aW9W>%mpfhuc(atthjtU`*0j%>n#iR?;+B1Vl97jh^& zZ9FI%bn%0VaZ*teCzqJGgrtbvx}>nyN9P&a7buactm7Wa!P7i zdPZheaY<=ec|~Pab4zPmdq-#2q{&mJPMbbs=B!1Fmn>bje8tLDn>KIRx^4T8ox2Vl zK63Qf@e?OcUAlbb>b2`PZr*zM=<$=M&z`?{`Re1R&tJZN`~KtSFGdDth7; zWmS*4^S{V#SyM$gSFdIj33NDwrXF2CPJZJ{S1rx-(6}WJ0+<3_MHq15&|XuP=^xZr zH-^6Q&a69cLn}2MkKIAtR@HodB z@?qWbWiNT3-ASDP^3txukI(8ZKKH@!Lio&{wH?o%E|#^PpM7|T%(Rf$nA*^@m(+6P z`Ewf%3uUJMD9@{V_@~$G@gvbybKGVg_X#cg(c5aRr0{K>t4zsO_x)OXbbX7q%s&xX zC+{d8+41XYyDA)A)mcjS7mRm76@ zn)2p7$DahvZq?$SzVFzhKlVFH!dTY16;yS#Jw8xgsHs)l_4<$LnqI$)G4tF5qx_1e zN_<<#HRF$~RUhB+s}C*wHI6<^j+*=CdhzjhZ=PvUF;g{}6=DL?BC*ZgPTz2%<2^vJ0_Z(nG8WnA;<$P?QaFB<5#IsM%p`<7|)y36_Y zY>zkY`*>QIsW>LLJkGL_wQJKC(L>iaPq)5!;m`G+%u|wW`%g7>X{`JF6r461451s?LP;UAvv$W;=Yc&Kap6Nz&oN&B1y zRo|xUy7RC5l*Y*fjk7rq`jU^oV4FW-LAtEn)aRuy=b5$Cr*6zi*e-u*&zYXWxMv~n i-JjKkA76EI(tidn#_J+M>loQ4?KOS`OQ!t)Zvp_ai7o*E diff --git a/nexuiz-linux.sh b/nexuiz-linux.sh index a4b65e139..0c56686f0 100755 --- a/nexuiz-linux.sh +++ b/nexuiz-linux.sh @@ -3,6 +3,8 @@ path=`dirname ${0}` link=`readlink ${0}` +sndspeed=`lsmod | grep ac97 > /dev/null 2>&1 && echo "-sndspeed 48000"` + [ -n "$link" ] && path=`dirname $link` cd "$path" @@ -11,4 +13,4 @@ case "$(uname -m)" in *) nexuiz="nexuiz-linux-686-sdl" ;; esac -exec ./$nexuiz "${@}" +echo exec ./$nexuiz $sndspeed "${@}" -- 2.39.2