]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/newpanelhud' into terencehill/speedpanel
authorterencehill <piuntn@gmail.com>
Sat, 4 Dec 2010 19:09:47 +0000 (20:09 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 4 Dec 2010 19:21:37 +0000 (20:21 +0100)
Conflicts:
qcsrc/client/hud.qc
qcsrc/menu/xonotic/dialog_settings_misc.c

214 files changed:
Makefile
_hud_descriptions.cfg
balanceLeeStricklin.cfg
balanceXonotic.cfg
defaultXonotic.cfg
effectinfo.txt
gfx/crosshairdot.tga
gfx/crosshairlaser.tga
gfx/crosshairrocketlauncher.tga
gfx/hud/default/keepawayball_carrying.tga [new file with mode: 0644]
gfx/hud/default/notify_balldropped.tga [new file with mode: 0644]
gfx/hud/default/notify_ballpickedup.tga [new file with mode: 0644]
gfx/hud/luminos/keepawayball_carrying.tga [new file with mode: 0644]
gfx/hud/luminos/notify_balldropped.tga [new file with mode: 0644]
gfx/hud/luminos/notify_ballpickedup.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_bullets.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_cells.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_current_bg.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_rockets.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_shells.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/border_healtharmor.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_ammo.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_armor_vertical.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_health_vertical.tga [new file with mode: 0644]
hud_luminos.cfg
hud_luminos_minimal.cfg [new file with mode: 0644]
hud_luminos_xhair_minimal.cfg [new file with mode: 0644]
hud_nexuiz.cfg
keybinds.txt
merge-settings-into-cfg.pl [deleted file]
models/ctf/banner_blue.tga [new file with mode: 0644]
models/ctf/banner_blue_gloss.tga [new file with mode: 0644]
models/ctf/banner_red.tga [new file with mode: 0644]
models/ctf/banner_red_gloss.tga [new file with mode: 0644]
models/ctf/flag_blue.tga [new file with mode: 0644]
models/ctf/flag_blue_gloss.tga [new file with mode: 0644]
models/ctf/flag_blue_glow.tga [new file with mode: 0644]
models/ctf/flag_blue_norm.tga [new file with mode: 0644]
models/ctf/flag_red.tga [new file with mode: 0644]
models/ctf/flag_red_gloss.tga [new file with mode: 0644]
models/ctf/flag_red_glow.tga [new file with mode: 0644]
models/ctf/flag_red_norm.tga [new file with mode: 0644]
models/ctf/flags.md3
models/ctf/flags.md3.framegroups [new file with mode: 0644]
models/ctf/flags.md3_0.skin
models/ctf/flags.md3_1.skin
models/ctf/glow_blue.tga [new file with mode: 0644]
models/ctf/glow_blue_glow.tga [new file with mode: 0644]
models/ctf/glow_red.tga [new file with mode: 0644]
models/ctf/glow_red_glow.tga [new file with mode: 0644]
models/elaser.mdl
models/hlac_bullet.md3
models/laser.mdl
models/mine.md3
models/orbs/orbblue.md3 [new file with mode: 0644]
models/orbs/orbblue.tga [new file with mode: 0644]
models/orbs/orbblue_glow.tga [new file with mode: 0644]
models/orbs/orbpink.md3 [new file with mode: 0644]
models/orbs/orbpink.tga [new file with mode: 0644]
models/orbs/orbpink_glow.tga [new file with mode: 0644]
models/orbs/orbred.md3 [new file with mode: 0644]
models/orbs/orbred.tga [new file with mode: 0644]
models/orbs/orbred_glow.tga [new file with mode: 0644]
models/orbs/orbyellow.md3 [new file with mode: 0644]
models/orbs/orbyellow.tga [new file with mode: 0644]
models/orbs/orbyellow_glow.tga [new file with mode: 0644]
models/plasmatrail.mdl
models/player/erebus.iqm_1.tga [new file with mode: 0644]
models/sprites/ka-ball.tga [new file with mode: 0644]
models/sprites/ka-ballcarrier.tga [new file with mode: 0644]
models/sprites/make-sprites.sh
models/weapons/g_minelayer.md3
models/weapons/v_minelayer.md3
physicsLeeStricklin-ModdedFruit.cfg [new file with mode: 0644]
physicsXPM.cfg
physicsXPMLight.cfg
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/hud.qc
qcsrc/client/scoreboard.qc
qcsrc/common/constants.qh
qcsrc/common/gamecommand.qc
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/util-pre.qh
qcsrc/common/util.qc
qcsrc/menu/xonotic/crosshairbutton.c
qcsrc/menu/xonotic/cvarlist.c
qcsrc/menu/xonotic/dialog_multiplayer_create.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c
qcsrc/menu/xonotic/util.qc
qcsrc/server/arena.qc
qcsrc/server/assault.qc
qcsrc/server/bot/aim.qc
qcsrc/server/bot/havocbot/roles.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/clientcommands.qc
qcsrc/server/ctf.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/gamemode_freezetag.qc [new file with mode: 0644]
qcsrc/server/mutators/gamemode_keepaway.qc [new file with mode: 0644]
qcsrc/server/mutators/mutator_vampire.qc
qcsrc/server/mutators/mutators.qh
qcsrc/server/playerstats.qc [new file with mode: 0644]
qcsrc/server/playerstats.qh [new file with mode: 0644]
qcsrc/server/progs.src
qcsrc/server/scores_rules.qc
qcsrc/server/sv_main.qc
qcsrc/server/t_jumppads.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/units/unit_ewheel.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_nex.qc
scripts/ctf.shader [new file with mode: 0644]
scripts/orbs.shader [new file with mode: 0644]
scripts/projectiles.shader [new file with mode: 0644]
scripts/weapons.shader
sound/announcer/default/03kills.ogg
sound/announcer/default/05kills.ogg
sound/announcer/default/10kills.ogg
sound/announcer/default/15kills.ogg
sound/announcer/default/1fragleft.ogg
sound/announcer/default/1minuteremains.ogg
sound/announcer/default/20kills.ogg
sound/announcer/default/25kills.ogg
sound/announcer/default/2fragsleft.ogg
sound/announcer/default/30kills.ogg
sound/announcer/default/3fragsleft.ogg
sound/announcer/default/5minutesremain.ogg
sound/announcer/default/airshot.ogg
sound/announcer/default/amazing.ogg
sound/announcer/default/awesome.ogg
sound/announcer/default/blueteamtakeslead.ogg
sound/announcer/default/headshot.ogg
sound/announcer/default/impressive.ogg
sound/announcer/default/redteamtakeslead.ogg
sound/keepaway/dropped.wav [new file with mode: 0644]
sound/keepaway/pickedup.wav [new file with mode: 0644]
sound/keepaway/respawn.wav [new file with mode: 0644]
sound/keepaway/touch.wav [new file with mode: 0644]
sound/misc/armor25.wav
sound/monsters/alien_chant_loop.ogg [new file with mode: 0644]
sound/monsters/giant_snoring_loop.ogg [new file with mode: 0644]
sound/monsters/growl1.wav [new file with mode: 0644]
sound/monsters/growl2.wav [new file with mode: 0644]
sound/monsters/growl3.wav [new file with mode: 0644]
sound/player/slime.wav
sound/weapons/crylink_fire.ogg
sound/weapons/crylink_fire2.ogg
sound/weapons/electro_fire.ogg
sound/weapons/electro_fire2.ogg
sound/weapons/grenade_fire.ogg
sound/weapons/grenade_impact.ogg
sound/weapons/hagar_fire.ogg
sound/weapons/hagexp1.ogg
sound/weapons/hagexp2.ogg
sound/weapons/hagexp3.ogg
sound/weapons/minstanexfire.ogg
sound/weapons/nexcharge.ogg [new file with mode: 0644]
sound/weapons/nexfire.ogg
sound/weapons/nexwhoosh1.ogg
sound/weapons/nexwhoosh2.ogg
sound/weapons/nexwhoosh3.ogg
sound/weapons/rocket_impact.ogg
sound/weapons/shotgun_fire.ogg
sound/weapons/strength_fire.ogg
sound/weapons/uzi_fire.ogg
textures/flags/flag_blue.tga [deleted file]
textures/flags/flag_blue_cloth.tga [deleted file]
textures/flags/flag_blue_gloss.tga [deleted file]
textures/flags/flag_blue_glow.tga [deleted file]
textures/flags/flag_blue_laser.tga [deleted file]
textures/flags/flag_blue_norm.tga [deleted file]
textures/flags/flag_red.tga [deleted file]
textures/flags/flag_red_cloth.tga [deleted file]
textures/flags/flag_red_gloss.tga [deleted file]
textures/flags/flag_red_glow.tga [deleted file]
textures/flags/flag_red_laser.tga [deleted file]
textures/flags/flag_red_norm.tga [deleted file]
textures/mine.tga [new file with mode: 0644]
textures/mine_gloss.tga [new file with mode: 0644]
textures/mine_glow.tga [new file with mode: 0644]
textures/minelayer.tga [new file with mode: 0644]
textures/minelayer_gloss.tga [new file with mode: 0644]
textures/minelayer_glow.tga [new file with mode: 0644]
textures/nexgun.tga
textures/nexgun_glow.tga
textures/projectiles/crylink_projectile_core.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_long.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_core.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_long.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_core.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_long.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_core.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_long.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_long_glow.tga [new file with mode: 0644]
xonotic-credits.txt

index e71d9d1c10d656da49ad3a9901544c6646907149..c5871ad4e5a7ea0a6121666d066752df7d4d1f33 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -38,17 +38,17 @@ skin: gfx/menu/default/skinvalues.txt
 clean:
        rm -f progs.dat menu.dat csprogs.dat
 
-FILES_CSPROGS = qcsrc/client/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^   ],qcsrc/client/&,' < qcsrc/client/progs.src)
+FILES_CSPROGS = $(shell find qcsrc/client qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
 csprogs.dat: $(FILES_CSPROGS)
        @echo make[1]: Entering directory \`$(PWD)/qcsrc/client\'
        cd qcsrc/client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
 
-FILES_PROGS = qcsrc/server/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^     ],qcsrc/server/&,' < qcsrc/server/progs.src)
+FILES_PROGS = $(shell find qcsrc/server qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
 progs.dat: $(FILES_PROGS)
        @echo make[1]: Entering directory \`$(PWD)/qcsrc/server\'
        cd qcsrc/server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
 
-FILES_MENU = qcsrc/menu/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^        ],qcsrc/menu/&,' < qcsrc/menu/progs.src)
+FILES_MENU = $(shell find qcsrc/menu qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
 menu.dat: $(FILES_MENU)
        @echo make[1]: Entering directory \`$(PWD)/qcsrc/menu\'
        cd qcsrc/menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
index 3438a25e84afe35b65f57871a404cfebed492fa0..0675788238109e9f505556ea6f9c82237e079b58 100644 (file)
@@ -62,6 +62,10 @@ seta hud_panel_ammo_bg_color_team "" "override panel color with team color in te
 seta hud_panel_ammo_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
 seta hud_panel_ammo_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 seta hud_panel_ammo_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+seta hud_panel_ammo_progressbar "" "use progressbar behind ammo icons"
+seta hud_panel_ammo_progressbar_xoffset "" "percentage of mySize_x to offset progressbar with"
+seta hud_panel_ammo_progressbar_name "" "name of progressbar to use behind ammo icons"
+seta hud_panel_ammo_text "" "show text/icons in the ammo panel"
 
 seta hud_panel_powerups "" "enable/disable this panel"
 seta hud_panel_powerups_pos "" "position of this panel"
@@ -76,6 +80,9 @@ seta hud_panel_powerups_bg_alpha "" "if set to something else than \"\" = overri
 seta hud_panel_powerups_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 seta hud_panel_powerups_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
 seta hud_panel_powerups_progressbar "" "enable progressbar in panel"
+seta hud_panel_powerups_progressbar_strength "" "progressbar image for strength"
+seta hud_panel_powerups_progressbar_shield "" "progressbar image for shield"
+seta hud_panel_powerups_text "" "show text/icons in the powerups panel"
 
 seta hud_panel_healtharmor "" "enable/disable this panel, 2 = combined health/armor display"
 seta hud_panel_healtharmor_pos "" "position of this panel"
@@ -90,6 +97,9 @@ seta hud_panel_healtharmor_bg_alpha "" "if set to something else than \"\" = ove
 seta hud_panel_healtharmor_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 seta hud_panel_healtharmor_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
 seta hud_panel_healtharmor_progressbar "" "enable progressbar in panel"
+seta hud_panel_healtharmor_progressbar_health "" "progressbar image for health"
+seta hud_panel_healtharmor_progressbar_armor "" "progressbar image for armor"
+seta hud_panel_healtharmor_text "" "show text/icons in the healtharmor panel"
 
 seta hud_panel_notify "" "enable/disable this panel"
 seta hud_panel_notify_pos "" "position of this base of the panel"
index ade867648f67a9093f79e9c2eb791db1d1aba901..baca6f9f31b9f80f828633156d656feb65a78043 100644 (file)
@@ -1,13 +1,3 @@
-////2.4.2 weapons (with some tweaks) VS balanceLeeStricklin
-
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-// }}}
-
 // {{{ starting gear
 set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
@@ -63,7 +53,6 @@ set g_balance_nix_ammoincr_fuel 2
 // }}}
 
 // {{{ pickup items
-// Ammo caps copied from balanceFruit
 set g_pickup_ammo_anyway 0
 set g_pickup_weapons_anyway 1
 set g_pickup_shells 20
@@ -299,7 +288,7 @@ set g_balance_uzi_sustained_ammo 1
 set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 300 // 13.1qu
 // }}}
-// {{{ mortar
+// {{{ mortar // TODO
 set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 65
 set g_balance_grenadelauncher_primary_edgedamage 35
@@ -340,14 +329,14 @@ set g_balance_grenadelauncher_bouncefactor 0.7
 set g_balance_grenadelauncher_bouncestop 0.12
 // }}}
 // {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
+set g_balance_minelayer_damage 65
 set g_balance_minelayer_edgedamage 30
 set g_balance_minelayer_force 250
 set g_balance_minelayer_radius 175
 set g_balance_minelayer_proximityradius 150
 set g_balance_minelayer_speed 750
 set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_refire 1.3
 set g_balance_minelayer_animtime 0.4
 set g_balance_minelayer_ammo 5
 set g_balance_minelayer_health 15
@@ -361,7 +350,7 @@ set g_balance_minelayer_remote_edgedamage 40
 set g_balance_minelayer_remote_radius 200
 set g_balance_minelayer_remote_force 300
 // }}}
-// {{{ electro
+// {{{ electro // TODO
 set g_balance_electro_lightning 0
 set g_balance_electro_primary_damage 55
 set g_balance_electro_primary_edgedamage 5
@@ -386,8 +375,8 @@ set g_balance_electro_secondary_radius 150
 set g_balance_electro_secondary_speed 900
 set g_balance_electro_secondary_speed_up 200
 set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_lifetime 3
 set g_balance_electro_secondary_spread 0.05
+set g_balance_electro_secondary_lifetime 3
 set g_balance_electro_secondary_refire 0.2
 set g_balance_electro_secondary_refire2 1
 set g_balance_electro_secondary_animtime 0.3
@@ -459,11 +448,11 @@ set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 80
 set g_balance_crylink_secondary_line_fadetime 2
 // }}}
 // {{{ nex
-set g_balance_nex_primary_ammo 13
-set g_balance_nex_primary_animtime 0.3
 set g_balance_nex_primary_damage 78
 set g_balance_nex_primary_force 600
 set g_balance_nex_primary_refire 1.505
+set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_ammo 13
 set g_balance_nex_primary_damagefalloff_mindist 9999999
 set g_balance_nex_primary_damagefalloff_maxdist 9999999
 set g_balance_nex_primary_damagefalloff_halflife 9999999
@@ -525,7 +514,7 @@ set g_balance_hagar_secondary_lifetime_rand 0
 set g_balance_hagar_secondary_refire 0.15
 set g_balance_hagar_secondary_ammo 2
 // }}}
-// {{{ rocketlauncher
+// {{{ rocketlauncher // TODO
 set g_balance_rocketlauncher_damage 65
 set g_balance_rocketlauncher_edgedamage 25
 set g_balance_rocketlauncher_force 360
@@ -711,7 +700,7 @@ set g_balance_seeker_missile_accel 1.05
 set g_balance_seeker_missile_ammo 2
 set g_balance_seeker_missile_animtime 0.3
 set g_balance_seeker_missile_count 8
-set g_balance_seeker_missile_damage 15
+set g_balance_seeker_missile_damage 25
 set g_balance_seeker_missile_damageforcescale 4
 set g_balance_seeker_missile_decel 0.9
 set g_balance_seeker_missile_delay 0.25
index a6a2e66d94429bd09acfed9a3e14b1aa7c45c54a..1dc5e511b58817dd80890283ecdac54fb10303ef 100644 (file)
@@ -72,22 +72,22 @@ set g_pickup_fuel_weapon 15
 set g_pickup_fuel_jetpack 50
 set g_pickup_fuel_max 100
 set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 250
+set g_pickup_armorsmall_max 150
 set g_pickup_armorsmall_anyway 1
 set g_pickup_armormedium 25
-set g_pickup_armormedium_max 250
-set g_pickup_armormedium_anyway 1
+set g_pickup_armormedium_max 50
+set g_pickup_armormedium_anyway 0
 set g_pickup_armorbig 50
-set g_pickup_armorbig_max 250
-set g_pickup_armorbig_anyway 1
+set g_pickup_armorbig_max 50
+set g_pickup_armorbig_anyway 0
 set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 250
+set g_pickup_armorlarge_max 150
 set g_pickup_armorlarge_anyway 1
 set g_pickup_healthsmall 5
 set g_pickup_healthsmall_max 250
 set g_pickup_healthsmall_anyway 1
 set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 150
+set g_pickup_healthmedium_max 100
 set g_pickup_healthmedium_anyway 0
 set g_pickup_healthlarge 50
 set g_pickup_healthlarge_max 150
@@ -263,37 +263,41 @@ set g_balance_shotgun_secondary_refire 1.1
 set g_balance_shotgun_secondary_animtime 1
 // }}}
 // {{{ uzi
-set g_balance_uzi_mode 0                               // Activates varible spread for sustained & burst mode secondary
+set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
 set g_balance_uzi_spread_min 0.02
 set g_balance_uzi_spread_max 0.6
-set g_balance_uzi_spread_add 0.012
-set g_balance_uzi_burst 0                              // # of bullets in a burst (if set to 2 or more)
+set g_balance_uzi_spread_add 0.008
+
+set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
 set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.75   // refire after burst
-set g_balance_uzi_burst_spread 0.04
-set g_balance_uzi_burst_damage 18              
+set g_balance_uzi_burst_refire2 0.45   // refire after burst
+set g_balance_uzi_burst_spread 0.05
+set g_balance_uzi_burst_damage 20       // 100 dps, delivered in 0.15s 
 set g_balance_uzi_burst_force 50
 set g_balance_uzi_burst_ammo 3
+
 set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 20
-set g_balance_uzi_first_force 35
+set g_balance_uzi_first_damage 20       // 100 dps
+set g_balance_uzi_first_force 50
 set g_balance_uzi_first_spread 0.03
 set g_balance_uzi_first_refire 0.2
 set g_balance_uzi_first_ammo 2
-set g_balance_uzi_sustained_damage 12
-set g_balance_uzi_sustained_force 7.5
-set g_balance_uzi_sustained_spread 0.1
+
+set g_balance_uzi_sustained_damage 12   // 120 dps
+set g_balance_uzi_sustained_force 12
+set g_balance_uzi_sustained_spread 0.08
 set g_balance_uzi_sustained_refire 0.1
 set g_balance_uzi_sustained_ammo 1
+
 set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 // }}}
-// {{{ mortar // TODO
+// {{{ mortar
 set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 50
-set g_balance_grenadelauncher_primary_edgedamage 25
+set g_balance_grenadelauncher_primary_edgedamage 32
 set g_balance_grenadelauncher_primary_force 300
-set g_balance_grenadelauncher_primary_radius 100
+set g_balance_grenadelauncher_primary_radius 115
 set g_balance_grenadelauncher_primary_speed 1500
 set g_balance_grenadelauncher_primary_speed_up 225
 set g_balance_grenadelauncher_primary_speed_z 0
@@ -328,7 +332,7 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 set g_balance_grenadelauncher_bouncefactor 0.5
 set g_balance_grenadelauncher_bouncestop 0.12
 // }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
 set g_balance_minelayer_damage 35
 set g_balance_minelayer_edgedamage 30
 set g_balance_minelayer_force 250
@@ -350,9 +354,9 @@ set g_balance_minelayer_remote_edgedamage 40
 set g_balance_minelayer_remote_radius 200
 set g_balance_minelayer_remote_force 300
 // }}}
-// {{{ electro // TODO
+// {{{ electro
 set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 100
+set g_balance_electro_primary_damage 92
 set g_balance_electro_primary_edgedamage 0
 set g_balance_electro_primary_force 425
 set g_balance_electro_primary_force_up 125
@@ -394,12 +398,12 @@ set g_balance_electro_combo_comboradius 0
 set g_balance_electro_combo_speed 400
 // }}}
 // {{{ crylink
-set g_balance_crylink_primary_damage 8
+set g_balance_crylink_primary_damage 10
 set g_balance_crylink_primary_edgedamage 6
 set g_balance_crylink_primary_force 40
 set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 1200
-set g_balance_crylink_primary_spread 0.1
+set g_balance_crylink_primary_speed 1250
+set g_balance_crylink_primary_spread 0.05
 set g_balance_crylink_primary_shots 7
 set g_balance_crylink_primary_bounces 2
 set g_balance_crylink_primary_refire 0.8
@@ -421,11 +425,11 @@ set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
 set g_balance_crylink_primary_other_fadetime 0.25
 
 set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 2
+set g_balance_crylink_secondary_damage 3
 set g_balance_crylink_secondary_edgedamage 0
 set g_balance_crylink_secondary_force -20
 set g_balance_crylink_secondary_radius 5
-set g_balance_crylink_secondary_speed 1600
+set g_balance_crylink_secondary_speed 1700
 set g_balance_crylink_secondary_spread 0.03
 set g_balance_crylink_secondary_shots 3
 set g_balance_crylink_secondary_bounces 0
@@ -460,7 +464,7 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 0
 
 set g_balance_nex_secondary 1
 set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.55
+set g_balance_nex_secondary_charge_rate 0.4
 set g_balance_nex_secondary_charge_pool 1
 set g_balance_nex_secondary_charge_pool_regen 0.15
 set g_balance_nex_secondary_charge_pool_pause_regen 1
@@ -469,16 +473,16 @@ set g_balance_nex_secondary_damage 0
 set g_balance_nex_secondary_force 0
 set g_balance_nex_secondary_refire 0
 set g_balance_nex_secondary_animtime 0
-set g_balance_nex_secondary_ammo 0.25 // full charge pool is 1, so it depletes in 4 secs
+set g_balance_nex_secondary_ammo 0.2 // full charge pool is 1, so it depletes in 5 secs
 set g_balance_nex_secondary_damagefalloff_mindist 0
 set g_balance_nex_secondary_damagefalloff_maxdist 0
 set g_balance_nex_secondary_damagefalloff_halflife 0
 set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 
 set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 30
+set g_balance_nex_charge_mindmg 20
 set g_balance_nex_charge_start 0.5
-set g_balance_nex_charge_rate 0.6
+set g_balance_nex_charge_rate 0.5
 set g_balance_nex_charge_limit 0.5
 set g_balance_nex_charge_rot_rate 0.1
 set g_balance_nex_charge_rot_pause 1 // Dont rot down until this long after release of charge button
@@ -493,20 +497,20 @@ set g_balance_minstanex_animtime 0.75
 set g_balance_minstanex_ammo 10
 // }}}
 // {{{ hagar
-set g_balance_hagar_primary_damage 12
+set g_balance_hagar_primary_damage 14
 set g_balance_hagar_primary_edgedamage 6
 set g_balance_hagar_primary_force 70
-set g_balance_hagar_primary_radius 125
+set g_balance_hagar_primary_radius 115
 set g_balance_hagar_primary_spread 0.1
 set g_balance_hagar_primary_speed 1800
 set g_balance_hagar_primary_lifetime 5
 set g_balance_hagar_primary_refire 0.12
 set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_damage 12
+set g_balance_hagar_secondary_damage 14
 set g_balance_hagar_secondary_edgedamage 6
 set g_balance_hagar_secondary_force 70
-set g_balance_hagar_secondary_radius 135
+set g_balance_hagar_secondary_radius 125
 set g_balance_hagar_secondary_spread 0.15
 set g_balance_hagar_secondary_speed 1800
 set g_balance_hagar_secondary_lifetime_min 5
@@ -514,13 +518,13 @@ set g_balance_hagar_secondary_lifetime_rand 0
 set g_balance_hagar_secondary_refire 0.12
 set g_balance_hagar_secondary_ammo 1
 // }}}
-// {{{ rocketlauncher // TODO
+// {{{ rocketlauncher
 set g_balance_rocketlauncher_damage 90
-set g_balance_rocketlauncher_edgedamage 33
+set g_balance_rocketlauncher_edgedamage 30
 set g_balance_rocketlauncher_force 350
 set g_balance_rocketlauncher_radius 125
-set g_balance_rocketlauncher_speed 1600
-set g_balance_rocketlauncher_speedaccel 1600
+set g_balance_rocketlauncher_speed 1400
+set g_balance_rocketlauncher_speedaccel 1400
 set g_balance_rocketlauncher_speedstart 800
 set g_balance_rocketlauncher_lifetime 5
 set g_balance_rocketlauncher_refire 1
@@ -529,13 +533,13 @@ set g_balance_rocketlauncher_ammo 3
 set g_balance_rocketlauncher_health 0
 set g_balance_rocketlauncher_damageforcescale 0
 set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 45 // max degrees per second
+set g_balance_rocketlauncher_guiderate 40 // max degrees per second
 set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
 set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 50
-set g_balance_rocketlauncher_remote_edgedamage 16.5
+set g_balance_rocketlauncher_remote_damage 60
+set g_balance_rocketlauncher_remote_edgedamage 20
 set g_balance_rocketlauncher_remote_radius 120
 set g_balance_rocketlauncher_remote_force 350
 // }}}
@@ -574,9 +578,9 @@ set g_balance_hlac_primary_spread_add 0.001
 set g_balance_hlac_primary_spread_crouchmod 0.25
 
 set g_balance_hlac_primary_damage 15
-set g_balance_hlac_primary_edgedamage 5
+set g_balance_hlac_primary_edgedamage 10
 set g_balance_hlac_primary_force 70
-set g_balance_hlac_primary_radius 30
+set g_balance_hlac_primary_radius 40
 set g_balance_hlac_primary_speed 2500
 set g_balance_hlac_primary_lifetime 5
 
@@ -589,9 +593,9 @@ set g_balance_hlac_secondary_spread 0.15
 set g_balance_hlac_secondary_spread_crouchmod 0.5
 
 set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 5
+set g_balance_hlac_secondary_edgedamage 13
 set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 35
+set g_balance_hlac_secondary_radius 45
 set g_balance_hlac_secondary_speed 2500
 set g_balance_hlac_secondary_lifetime 5
 
@@ -606,8 +610,8 @@ set g_balance_campingrifle_reloadtime 2 // matches reload anim
 set g_balance_campingrifle_auto_reload_after_changing_weapons 0
 set g_balance_campingrifle_bursttime 0
 set g_balance_campingrifle_primary_tracer 1
-set g_balance_campingrifle_primary_damage 75
-set g_balance_campingrifle_primary_headshotaddeddamage 125
+set g_balance_campingrifle_primary_damage 70
+set g_balance_campingrifle_primary_headshotaddeddamage 110
 set g_balance_campingrifle_primary_spread 0
 set g_balance_campingrifle_primary_force 2
 set g_balance_campingrifle_primary_speed 40000
index 51a5edb4d73e043974f4551cd1bb43a1c656d3e3..0bf5bd815d14af5510ca035613d5b5d1b98c7494 100644 (file)
@@ -89,13 +89,14 @@ _cl_color 102
 _cl_name Player
 _cl_playermodel models/player/umbra.iqm
 _cl_playerskin 0
-seta crosshair 3
+seta crosshair 16
 seta crosshair_color "0.6 0.8 1"
-seta crosshair_alpha 1
-seta crosshair_size 0.35
+seta crosshair_alpha 0.3
+seta crosshair_size 0.5
 seta crosshair_dot 1
 seta crosshair_dot_alpha 1
-seta crosshair_dot_size 1
+seta crosshair_dot_size 0.6
+seta crosshair_dot_color "1 0 0" "when != 0, use custom color for the crosshair dot"
 seta crosshair_pickup 0.25
 seta crosshair_pickup_speed 4
 seta crosshair_per_weapon 0    "when 1, each gun will display a different crosshair"
@@ -181,6 +182,7 @@ seta crosshair_fireball_size 1      "crosshair size when wielding the fireball"
 
 // ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
 seta crosshair_ring_size 2     "bullet counter ring size for Rifle, velocity ring for Nex"
+seta crosshair_ring_alpha 0.2  "ring alpha"
 
 seta crosshair_ring_campingrifle_alpha 0.15
 
@@ -262,6 +264,14 @@ gl_polyblend 0 // whether to use screen tints, this has now been replaced by a b
 r_motionblur 0 // motion blur value, default is 0
 r_damageblur 0 // motion blur when damaged, default is 0
 
+r_bloom_blur 8
+r_bloom_brighten 3
+r_bloom_colorexponent 1
+r_bloom_colorscale 1
+r_bloom_colorsubtract 0.25
+r_bloom_resolution 320
+r_hdr_range 4
+
 seta vid_x11_display ""        "xonotic-linux-*.sh will use this to start xonotic on an other/new X display"
 // This can have three possible settings:
 //     ""              run as usual
@@ -567,6 +577,14 @@ seta g_nexball_goalleadlimit -1 "Nexball goal lead limit overriding the mapinfo
 seta g_ctf_win_mode 0  "0: captures only, 1: captures, then points, 2: points only"
 seta g_ctf_ignore_frags 0      "1: regular frags give no points"
 
+set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze teammates by standing next to them"
+seta g_freezetag_warmup 5 "Time players get to run around before the round starts"
+seta g_freezetag_point_limit -1        "Freeze Tag point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_freezetag_point_leadlimit -1    "Freeze Tag point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_freezetag_revive_time 2.5 "Time it takes to revive a frozen teammate"
+seta g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him"
+seta g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with"
+
 // 50% of the spawns shall be far away from any players
 set g_spawn_furthest 0.5
 // respawn delay
@@ -606,6 +624,10 @@ set g_cts_respawn_waves 0
 set g_cts_respawn_delay 0.25
 set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
 set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
+set g_freezetag_respawn_waves 0
+set g_freezetag_respawn_delay 0.25
+set g_ka_respawn_delay 0
+set g_ka_respawn_waves 0
 
 // overtime
 seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
@@ -1057,8 +1079,8 @@ alias vstop "cmd vote stop"
 alias vmaster "cmd vote master"
 alias vlogin "cmd vote login $*"
 alias vdo "cmd vote do $*"
-alias vyes "cmd vote yes"
-alias vno "cmd vote no"
+alias vyes "cl_cmd vyes"
+alias vno "cl_cmd vno"
 alias vdontcare "cmd vote dontcare"
 alias vabstain "cmd vote abstain"
 
@@ -1243,6 +1265,28 @@ set g_balance_keyhunt_damageforcescale 1
 seta g_keyhunt_teams_override 0
 set g_keyhunt_teams 0
 
+// keepaway
+set g_keepaway 0 "game mode which focuses around a ball, look at g_keepaway_win_mode for further details"
+set g_keepaway_bckillscore 1 "enable scoring points (y/n) for ball carrier kills"
+set g_keepaway_pointlimit      -1      "total amount of points you can get, -1 for unlimited"
+set g_keepaway_pointleadlimit  -1      "mercy rule, -1 for unlimited"
+set g_keepaway_ballcarrier_alpha 0.6 "alpha when the player is the ballcarrier"
+set g_keepaway_ballcarrier_highspeed 1.5 "speed multiplier done to the person holding the ball"
+set g_keepaway_ballcarrier_damage      1.5     "damage multiplier while having powerup"
+set g_keepaway_ballcarrier_force       1.5     "force multiplier while having powerup"
+set g_keepaway_ballcarrier_selfdamage  1       "self damage multiplier while having powerup"
+set g_keepaway_ballcarrier_selfforce   1.5     "self force multiplier while having powerup"
+set g_keepaway_noncarrier_warn 0       "warn players when they kill without holding the ball"
+set g_keepaway_noncarrier_damage       0.5     "damage done to other players if both you and they don't have the ball"
+set g_keepaway_noncarrier_force        0.5     "force done to other players if both you and they don't have the ball"
+set g_keepaway_noncarrier_selfdamage   1       "self damage if you don't have the ball"
+set g_keepaway_noncarrier_selfforce    1       "self force if you don't have the ball"
+set g_keepawayball_trail_color 254     "particle trail color from player/ball"
+set g_keepawayball_damageforcescale    2 "Scale of force which is applied to the ball by weapons/explosions/etc"
+set g_keepawayball_respawntime 15      "if no one picks up the ball, how long to wait until the ball respawns"
+seta g_keepaway_teams_override 0
+set g_keepaway_teams 0
+
 // so it can be stuffcmd-ed still
 set cl_gravity 800     "but ignored anyway"
 
@@ -1348,6 +1392,11 @@ seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this a
 seta hud_panel_weapons_timeout "3" "panel disappears if you don't switch weapon for this amount of seconds"
 seta hud_panel_weapons_timeout_effect "1" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
 
+seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
+
+seta hud_panel_healtharmor_maxhealth "250" "when you have this much health, the health status bar is full"
+seta hud_panel_healtharmor_maxarmor "150" "when you have this much armor, the armor status bar is full"
+
 seta hud_panel_notify_time 10 "time that a new entry stays until it fades out"
 seta hud_panel_notify_fadetime 3 "fade out time"
 
@@ -1378,6 +1427,8 @@ seta hud_panel_physics_acceleration_z 0 "include the acceleration on the Z-axis"
 seta hud_showbinds 1   "the way to show the keys to press in HUD messages: 0 displays commands, 1 bound keys, 2 both"
 seta hud_showbinds_limit 2     "maximum number of bound keys to show for a command. 0 for unlimited"
 
+seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
+
 seta hud_damage 1 "an improved version of gl_polyblend, draw an image instead when hurt"
 seta hud_damage_gentle_alpha_multiplier 0.25 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
 seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
@@ -1753,6 +1804,7 @@ alias cl_hook_gamestart_as
 alias cl_hook_gamestart_rc
 alias cl_hook_gamestart_nexball
 alias cl_hook_gamestart_cts
+alias cl_hook_gamestart_ka
 alias cl_hook_gameend
 alias cl_hook_activeweapon
 
@@ -1773,6 +1825,7 @@ alias sv_hook_gamestart_as
 alias sv_hook_gamestart_rc
 alias sv_hook_gamestart_nexball
 alias sv_hook_gamestart_cts
+alias sv_hook_gamestart_ka
 alias sv_hook_gamerestart
 alias sv_hook_gameend
 
@@ -1989,6 +2042,9 @@ set g_forced_team_yellow "" "list of player IDs for yellow team"
 set g_forced_team_pink "" "list of player IDs for pink team"
 set g_forced_team_otherwise "default" "action if a non listed player joins (can be default for default action, spectate for forcing to spectate, or red, blue, yellow, pink)"
 
+// player statistics server URI
+set g_playerstats_uri ""
+
 // other config files
 exec balanceXonotic.cfg
 exec ctfscoring-ai.cfg
@@ -2001,3 +2057,11 @@ exec _hud_descriptions.cfg
 // exec the default skin config
 // please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
 exec hud_luminos.cfg
+
+set g_weapon_charge_colormod_hdrmultiplier 4 "how much to multiply the colors by in the colormod vector"
+set g_weapon_charge_colormod_red_half 0
+set g_weapon_charge_colormod_green_half 0.5
+set g_weapon_charge_colormod_blue_half 1
+set g_weapon_charge_colormod_red_full 1
+set g_weapon_charge_colormod_green_full -0.5
+set g_weapon_charge_colormod_blue_full -1
index 6c7428d1f6619fd5414b31dd0eb9f649b690029b..3e69bd82671b6483593a81bcdb184500be56cc37 100644 (file)
@@ -5110,3 +5110,18 @@ size 16 16
 alpha 256 256 1024
 velocityjitter 256 256 256
 
+//sparks for keepaway ball touch
+// used nowhere in code
+effect kaball_sparks
+count 35
+type spark
+tex 40 40
+color 0xa9cacf 0x0054ff
+size 1 3
+alpha 0 256 556
+gravity 1
+bounce 1.5
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 3
index 8d8741b5207cb5f3fa6cb654394db763a42ba48c..143a372f8c4ea9dec113759d80f93147d577f518 100644 (file)
Binary files a/gfx/crosshairdot.tga and b/gfx/crosshairdot.tga differ
index 884e9f03a373f4d201a8d4470e351bc0de703c2c..30e9bf3c839c4889964c128132d4da1a3221c231 100644 (file)
Binary files a/gfx/crosshairlaser.tga and b/gfx/crosshairlaser.tga differ
index ba1b7b17ae8908e02cd59dd2a7e7a11afbe58491..e77996d979c02adc8a09f127d07002dded217607 100644 (file)
Binary files a/gfx/crosshairrocketlauncher.tga and b/gfx/crosshairrocketlauncher.tga differ
diff --git a/gfx/hud/default/keepawayball_carrying.tga b/gfx/hud/default/keepawayball_carrying.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/default/keepawayball_carrying.tga differ
diff --git a/gfx/hud/default/notify_balldropped.tga b/gfx/hud/default/notify_balldropped.tga
new file mode 100644 (file)
index 0000000..7300a15
Binary files /dev/null and b/gfx/hud/default/notify_balldropped.tga differ
diff --git a/gfx/hud/default/notify_ballpickedup.tga b/gfx/hud/default/notify_ballpickedup.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/default/notify_ballpickedup.tga differ
diff --git a/gfx/hud/luminos/keepawayball_carrying.tga b/gfx/hud/luminos/keepawayball_carrying.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/luminos/keepawayball_carrying.tga differ
diff --git a/gfx/hud/luminos/notify_balldropped.tga b/gfx/hud/luminos/notify_balldropped.tga
new file mode 100644 (file)
index 0000000..7300a15
Binary files /dev/null and b/gfx/hud/luminos/notify_balldropped.tga differ
diff --git a/gfx/hud/luminos/notify_ballpickedup.tga b/gfx/hud/luminos/notify_ballpickedup.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/luminos/notify_ballpickedup.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_bullets.tga b/gfx/hud/luminos_xhair/ammo_bullets.tga
new file mode 100644 (file)
index 0000000..8e2783c
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_bullets.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_cells.tga b/gfx/hud/luminos_xhair/ammo_cells.tga
new file mode 100644 (file)
index 0000000..3735acd
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_cells.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_current_bg.tga b/gfx/hud/luminos_xhair/ammo_current_bg.tga
new file mode 100644 (file)
index 0000000..8b41e0f
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_current_bg.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_rockets.tga b/gfx/hud/luminos_xhair/ammo_rockets.tga
new file mode 100644 (file)
index 0000000..de61d5a
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_rockets.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_shells.tga b/gfx/hud/luminos_xhair/ammo_shells.tga
new file mode 100644 (file)
index 0000000..fd70b43
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_shells.tga differ
diff --git a/gfx/hud/luminos_xhair/border_healtharmor.tga b/gfx/hud/luminos_xhair/border_healtharmor.tga
new file mode 100644 (file)
index 0000000..ab30e14
Binary files /dev/null and b/gfx/hud/luminos_xhair/border_healtharmor.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_ammo.tga b/gfx/hud/luminos_xhair/progressbar_ammo.tga
new file mode 100644 (file)
index 0000000..9db210f
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_ammo.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga b/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga
new file mode 100644 (file)
index 0000000..0eb2972
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_health_vertical.tga b/gfx/hud/luminos_xhair/progressbar_health_vertical.tga
new file mode 100644 (file)
index 0000000..1bfe49b
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_health_vertical.tga differ
index 6f68796545d7cc3b6032440a7f816e34d4ea330e..d6e20a5b6db64e663a3386ed3108a763d347613b 100644 (file)
@@ -60,6 +60,10 @@ seta hud_panel_ammo_bg_border ""
 seta hud_panel_ammo_bg_padding ""
 seta hud_panel_ammo_onlycurrent "0"
 seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
 
 seta hud_panel_powerups 1
 seta hud_panel_powerups_pos "0.660000 0.940000"
@@ -74,6 +78,9 @@ seta hud_panel_powerups_flip "1"
 seta hud_panel_powerups_iconalign "3"
 seta hud_panel_powerups_baralign "3"
 seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
 
 seta hud_panel_healtharmor 1
 seta hud_panel_healtharmor_pos "0.330000 0.920000"
@@ -88,6 +95,9 @@ seta hud_panel_healtharmor_flip "0"
 seta hud_panel_healtharmor_iconalign "3"
 seta hud_panel_healtharmor_baralign "3"
 seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
 
 seta hud_panel_notify 1
 seta hud_panel_notify_pos "0.660000 0.730000"
diff --git a/hud_luminos_minimal.cfg b/hud_luminos_minimal.cfg
new file mode 100644 (file)
index 0000000..8ee4ea7
--- /dev/null
@@ -0,0 +1,215 @@
+seta hud_skin "luminos"
+seta hud_panel_bg "0"
+seta hud_panel_bg_color "1 0.4375 0"
+seta hud_panel_bg_color_team "0"
+seta hud_panel_bg_alpha "1"
+seta hud_panel_bg_border "8"
+seta hud_panel_bg_padding "2"
+seta hud_panel_fg_alpha "1"
+
+seta hud_dock "0"
+seta hud_dock_color "0 0.449576 0.860796"
+seta hud_dock_color_team "0.700000"
+seta hud_dock_alpha "1"
+
+seta hud_progressbar_alpha "0.500000"
+seta hud_progressbar_strength_color "0 0 0.6"
+seta hud_progressbar_shield_color "0.6 0 0.6"
+seta hud_progressbar_health_color "0.6 0 0"
+seta hud_progressbar_armor_color "0 0.6 0"
+seta hud_progressbar_fuel_color "0.6 0.6 0"
+seta hud_progressbar_nexball_color "0.7 0.1 0"
+
+seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 "
+
+seta hud_configure_grid "1"
+seta hud_configure_grid_xsize "0.010000"
+seta hud_configure_grid_ysize "0.010000"
+
+seta scr_centerpos "0.25"
+
+seta hud_panel_weapons 1
+seta hud_panel_weapons_pos "0.350000 0.940000"
+seta hud_panel_weapons_size "0.300000 0.060000"
+seta hud_panel_weapons_bg ""
+seta hud_panel_weapons_bg_color ""
+seta hud_panel_weapons_bg_color_team ""
+seta hud_panel_weapons_bg_alpha ""
+seta hud_panel_weapons_bg_border ""
+seta hud_panel_weapons_bg_padding ""
+seta hud_panel_weapons_complainbubble "1"
+seta hud_panel_weapons_complainbubble_padding "-10"
+seta hud_panel_weapons_complainbubble_color_outofammo "0.8 0 0"
+seta hud_panel_weapons_complainbubble_color_donthave "0.8 0.5 0"
+seta hud_panel_weapons_complainbubble_color_unavailable "0 0.3 0.8"
+seta hud_panel_weapons_ammo_color "0 1 0"
+seta hud_panel_weapons_ammo_alpha "1"
+seta hud_panel_weapons_aspect "2"
+
+seta hud_panel_ammo 1
+seta hud_panel_ammo_pos "0.650000 0.890000"
+seta hud_panel_ammo_size "0.055000 0.110000"
+seta hud_panel_ammo_bg ""
+seta hud_panel_ammo_bg_color ""
+seta hud_panel_ammo_bg_color_team ""
+seta hud_panel_ammo_bg_alpha ""
+seta hud_panel_ammo_bg_border ""
+seta hud_panel_ammo_bg_padding ""
+seta hud_panel_ammo_onlycurrent "0"
+seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
+
+seta hud_panel_powerups 1
+seta hud_panel_powerups_pos "0.290000 0.890000"
+seta hud_panel_powerups_size "0.055000 0.110000"
+seta hud_panel_powerups_bg "0"
+seta hud_panel_powerups_bg_color ""
+seta hud_panel_powerups_bg_color_team ""
+seta hud_panel_powerups_bg_alpha ""
+seta hud_panel_powerups_bg_border ""
+seta hud_panel_powerups_bg_padding "-3"
+seta hud_panel_powerups_flip "1"
+seta hud_panel_powerups_iconalign "1"
+seta hud_panel_powerups_baralign "1"
+seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
+
+seta hud_panel_healtharmor 1
+seta hud_panel_healtharmor_pos "0.350000 0.890000"
+seta hud_panel_healtharmor_size "0.300000 0.050000"
+seta hud_panel_healtharmor_bg ""
+seta hud_panel_healtharmor_bg_color ""
+seta hud_panel_healtharmor_bg_color_team ""
+seta hud_panel_healtharmor_bg_alpha ""
+seta hud_panel_healtharmor_bg_border ""
+seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_flip "0"
+seta hud_panel_healtharmor_iconalign "3"
+seta hud_panel_healtharmor_baralign "3"
+seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
+
+seta hud_panel_notify 1
+seta hud_panel_notify_pos "0 0"
+seta hud_panel_notify_size "0.210000 0.260000"
+seta hud_panel_notify_bg "0"
+seta hud_panel_notify_bg_color ""
+seta hud_panel_notify_bg_color_team ""
+seta hud_panel_notify_bg_alpha ""
+seta hud_panel_notify_bg_border ""
+seta hud_panel_notify_bg_padding ""
+seta hud_panel_notify_flip "1"
+seta hud_panel_notify_print "0"
+
+seta hud_panel_timer 1
+seta hud_panel_timer_pos "0.435000 0"
+seta hud_panel_timer_size "0.135000 0.060000"
+seta hud_panel_timer_bg "0"
+seta hud_panel_timer_bg_color ""
+seta hud_panel_timer_bg_color_team ""
+seta hud_panel_timer_bg_alpha ""
+seta hud_panel_timer_bg_border ""
+seta hud_panel_timer_bg_padding "0"
+
+seta hud_panel_radar 2
+seta hud_panel_radar_pos "0.810000 0"
+seta hud_panel_radar_size "0.190000 0.250000"
+seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg_color ""
+seta hud_panel_radar_bg_color_team ""
+seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_border "0"
+seta hud_panel_radar_bg_padding "0"
+seta hud_panel_radar_foreground_alpha "0.500000"
+
+seta hud_panel_score 1
+seta hud_panel_score_pos "0.465000 0.045000"
+seta hud_panel_score_size "0.090000 0.060000"
+seta hud_panel_score_bg ""
+seta hud_panel_score_bg_color ""
+seta hud_panel_score_bg_color_team ""
+seta hud_panel_score_bg_alpha ""
+seta hud_panel_score_bg_border ""
+seta hud_panel_score_bg_padding ""
+
+seta hud_panel_racetimer 1
+seta hud_panel_racetimer_pos "0.360000 0.090000"
+seta hud_panel_racetimer_size "0.280000 0.090000"
+seta hud_panel_racetimer_bg "0"
+seta hud_panel_racetimer_bg_color ""
+seta hud_panel_racetimer_bg_color_team ""
+seta hud_panel_racetimer_bg_alpha ""
+seta hud_panel_racetimer_bg_border ""
+seta hud_panel_racetimer_bg_padding ""
+
+seta hud_panel_vote 1
+seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_size "0.170000 0.110000"
+seta hud_panel_vote_bg ""
+seta hud_panel_vote_bg_color ""
+seta hud_panel_vote_bg_color_team ""
+seta hud_panel_vote_bg_alpha ""
+seta hud_panel_vote_bg_border ""
+seta hud_panel_vote_bg_padding ""
+seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+
+seta hud_panel_modicons 1
+seta hud_panel_modicons_pos "0.560000 0"
+seta hud_panel_modicons_size "0.050000 0.100000"
+seta hud_panel_modicons_bg ""
+seta hud_panel_modicons_bg_color ""
+seta hud_panel_modicons_bg_color_team ""
+seta hud_panel_modicons_bg_alpha ""
+seta hud_panel_modicons_bg_border ""
+seta hud_panel_modicons_bg_padding ""
+
+seta hud_panel_pressedkeys 1
+seta hud_panel_pressedkeys_pos "0.450000 0.650000"
+seta hud_panel_pressedkeys_size "0.100000 0.110000"
+seta hud_panel_pressedkeys_bg "0"
+seta hud_panel_pressedkeys_bg_color ""
+seta hud_panel_pressedkeys_bg_color_team ""
+seta hud_panel_pressedkeys_bg_alpha ""
+seta hud_panel_pressedkeys_bg_border ""
+seta hud_panel_pressedkeys_bg_padding ""
+seta hud_panel_pressedkeys_aspect "1.600000"
+
+seta hud_panel_chat 1
+seta hud_panel_chat_pos "0 0.775000"
+seta hud_panel_chat_size "0.460000 0.110000"
+seta hud_panel_chat_bg "0"
+seta hud_panel_chat_bg_color ""
+seta hud_panel_chat_bg_color_team ""
+seta hud_panel_chat_bg_alpha ""
+seta hud_panel_chat_bg_border ""
+seta hud_panel_chat_bg_padding ""
+
+seta hud_panel_engineinfo 0
+seta hud_panel_engineinfo_pos "0.910000 0.970000"
+seta hud_panel_engineinfo_size "0.090000 0.030000"
+seta hud_panel_engineinfo_bg "0"
+seta hud_panel_engineinfo_bg_color ""
+seta hud_panel_engineinfo_bg_color_team ""
+seta hud_panel_engineinfo_bg_alpha ""
+seta hud_panel_engineinfo_bg_border ""
+seta hud_panel_engineinfo_bg_padding ""
+
+seta hud_panel_infomessages 1
+seta hud_panel_infomessages_pos "0.710000 0"
+seta hud_panel_infomessages_size "0.290000 0.100000"
+seta hud_panel_infomessages_bg "0"
+seta hud_panel_infomessages_bg_color ""
+seta hud_panel_infomessages_bg_color_team ""
+seta hud_panel_infomessages_bg_alpha ""
+seta hud_panel_infomessages_bg_border ""
+seta hud_panel_infomessages_bg_padding "0"
+seta hud_panel_infomessages_flip "1"
+
+menu_sync
diff --git a/hud_luminos_xhair_minimal.cfg b/hud_luminos_xhair_minimal.cfg
new file mode 100644 (file)
index 0000000..ba9e01a
--- /dev/null
@@ -0,0 +1,213 @@
+seta hud_skin "luminos_xhair"
+seta hud_panel_bg "0"
+seta hud_panel_bg_color "1 0.4375 0"
+seta hud_panel_bg_color_team "0"
+seta hud_panel_bg_alpha "1"
+seta hud_panel_bg_border "8"
+seta hud_panel_bg_padding "2"
+seta hud_panel_fg_alpha "1"
+
+seta hud_dock "0"
+seta hud_dock_color "0 0.449576 0.860796"
+seta hud_dock_color_team "0.700000"
+seta hud_dock_alpha "1"
+
+seta hud_progressbar_alpha "0.3"
+seta hud_progressbar_strength_color "0 0 0.6"
+seta hud_progressbar_shield_color "0.6 0 0.6"
+seta hud_progressbar_health_color "0.6 0 0"
+seta hud_progressbar_armor_color "0 0.6 0"
+seta hud_progressbar_fuel_color "0.6 0.6 0"
+seta hud_progressbar_nexball_color "0.7 0.1 0"
+
+seta _hud_panelorder "3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 "
+
+seta hud_configure_grid "1"
+seta hud_configure_grid_xsize "0.010000"
+seta hud_configure_grid_ysize "0.010000"
+
+seta scr_centerpos "0.25"
+
+seta hud_panel_weapons 1
+seta hud_panel_weapons_pos "0.350000 0.940000"
+seta hud_panel_weapons_size "0.300000 0.060000"
+seta hud_panel_weapons_bg ""
+seta hud_panel_weapons_bg_color ""
+seta hud_panel_weapons_bg_color_team ""
+seta hud_panel_weapons_bg_alpha ""
+seta hud_panel_weapons_bg_border ""
+seta hud_panel_weapons_bg_padding ""
+seta hud_panel_weapons_complainbubble "1"
+seta hud_panel_weapons_complainbubble_padding "-10"
+seta hud_panel_weapons_complainbubble_color_outofammo "0.8 0 0"
+seta hud_panel_weapons_complainbubble_color_donthave "0.8 0.5 0"
+seta hud_panel_weapons_complainbubble_color_unavailable "0 0.3 0.8"
+seta hud_panel_weapons_ammo_color "0 1 0"
+seta hud_panel_weapons_ammo_alpha "1"
+seta hud_panel_weapons_aspect "2"
+
+seta hud_panel_ammo 1
+seta hud_panel_ammo_pos "0.450000 0.630000"
+seta hud_panel_ammo_size "0.080000 0.040000"
+seta hud_panel_ammo_bg ""
+seta hud_panel_ammo_bg_color ""
+seta hud_panel_ammo_bg_color_team ""
+seta hud_panel_ammo_bg_alpha ""
+seta hud_panel_ammo_bg_border ""
+seta hud_panel_ammo_bg_padding ""
+seta hud_panel_ammo_onlycurrent "1"
+seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "1"
+seta hud_panel_ammo_progressbar_name "progressbar_ammo"
+seta hud_panel_ammo_text "1"
+
+seta hud_panel_powerups 1
+seta hud_panel_powerups_pos "0.270000 0.940000"
+seta hud_panel_powerups_size "0.080000 0.060000"
+seta hud_panel_powerups_bg "0"
+seta hud_panel_powerups_bg_color ""
+seta hud_panel_powerups_bg_color_team ""
+seta hud_panel_powerups_bg_alpha ""
+seta hud_panel_powerups_bg_border ""
+seta hud_panel_powerups_bg_padding "-3"
+seta hud_panel_powerups_flip "1"
+seta hud_panel_powerups_iconalign "1"
+seta hud_panel_powerups_baralign "1"
+seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+
+seta hud_panel_healtharmor 1
+seta hud_panel_healtharmor_pos "0.350000 0.380000"
+seta hud_panel_healtharmor_size "0.070000 0.240000"
+seta hud_panel_healtharmor_bg "border_healtharmor"
+seta hud_panel_healtharmor_bg_color "0.464391 0.464391 0.464391"
+seta hud_panel_healtharmor_bg_color_team ""
+seta hud_panel_healtharmor_bg_alpha "0.600000"
+seta hud_panel_healtharmor_bg_border "-1"
+seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_flip "0"
+seta hud_panel_healtharmor_iconalign "1"
+seta hud_panel_healtharmor_baralign "1"
+seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar_health"
+seta hud_panel_healtharmor_progressbar_armor "progressbar_armor"
+seta hud_panel_healtharmor_text "0"
+
+seta hud_panel_notify 1
+seta hud_panel_notify_pos "0 0"
+seta hud_panel_notify_size "0.210000 0.260000"
+seta hud_panel_notify_bg "0"
+seta hud_panel_notify_bg_color ""
+seta hud_panel_notify_bg_color_team ""
+seta hud_panel_notify_bg_alpha ""
+seta hud_panel_notify_bg_border ""
+seta hud_panel_notify_bg_padding ""
+seta hud_panel_notify_flip "1"
+seta hud_panel_notify_print "0"
+
+seta hud_panel_timer 1
+seta hud_panel_timer_pos "0.435000 0"
+seta hud_panel_timer_size "0.135000 0.060000"
+seta hud_panel_timer_bg "0"
+seta hud_panel_timer_bg_color ""
+seta hud_panel_timer_bg_color_team ""
+seta hud_panel_timer_bg_alpha ""
+seta hud_panel_timer_bg_border ""
+seta hud_panel_timer_bg_padding "0"
+
+seta hud_panel_radar 2
+seta hud_panel_radar_pos "0.810000 0"
+seta hud_panel_radar_size "0.190000 0.250000"
+seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg_color ""
+seta hud_panel_radar_bg_color_team ""
+seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_border "0"
+seta hud_panel_radar_bg_padding "0"
+seta hud_panel_radar_foreground_alpha "0.500000"
+
+seta hud_panel_score 1
+seta hud_panel_score_pos "0.465000 0.045000"
+seta hud_panel_score_size "0.090000 0.060000"
+seta hud_panel_score_bg ""
+seta hud_panel_score_bg_color ""
+seta hud_panel_score_bg_color_team ""
+seta hud_panel_score_bg_alpha ""
+seta hud_panel_score_bg_border ""
+seta hud_panel_score_bg_padding ""
+
+seta hud_panel_racetimer 1
+seta hud_panel_racetimer_pos "0.360000 0.090000"
+seta hud_panel_racetimer_size "0.280000 0.090000"
+seta hud_panel_racetimer_bg "0"
+seta hud_panel_racetimer_bg_color ""
+seta hud_panel_racetimer_bg_color_team ""
+seta hud_panel_racetimer_bg_alpha ""
+seta hud_panel_racetimer_bg_border ""
+seta hud_panel_racetimer_bg_padding ""
+
+seta hud_panel_vote 1
+seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_size "0.170000 0.110000"
+seta hud_panel_vote_bg ""
+seta hud_panel_vote_bg_color ""
+seta hud_panel_vote_bg_color_team ""
+seta hud_panel_vote_bg_alpha ""
+seta hud_panel_vote_bg_border ""
+seta hud_panel_vote_bg_padding ""
+seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+
+seta hud_panel_modicons 1
+seta hud_panel_modicons_pos "0.560000 0"
+seta hud_panel_modicons_size "0.050000 0.100000"
+seta hud_panel_modicons_bg ""
+seta hud_panel_modicons_bg_color ""
+seta hud_panel_modicons_bg_color_team ""
+seta hud_panel_modicons_bg_alpha ""
+seta hud_panel_modicons_bg_border ""
+seta hud_panel_modicons_bg_padding ""
+
+seta hud_panel_pressedkeys 1
+seta hud_panel_pressedkeys_pos "0.450000 0.690000"
+seta hud_panel_pressedkeys_size "0.100000 0.110000"
+seta hud_panel_pressedkeys_bg "0"
+seta hud_panel_pressedkeys_bg_color ""
+seta hud_panel_pressedkeys_bg_color_team ""
+seta hud_panel_pressedkeys_bg_alpha ""
+seta hud_panel_pressedkeys_bg_border ""
+seta hud_panel_pressedkeys_bg_padding ""
+seta hud_panel_pressedkeys_aspect "1.600000"
+
+seta hud_panel_chat 1
+seta hud_panel_chat_pos "0 0.775000"
+seta hud_panel_chat_size "0.460000 0.110000"
+seta hud_panel_chat_bg "0"
+seta hud_panel_chat_bg_color ""
+seta hud_panel_chat_bg_color_team ""
+seta hud_panel_chat_bg_alpha ""
+seta hud_panel_chat_bg_border ""
+seta hud_panel_chat_bg_padding ""
+
+seta hud_panel_engineinfo 0
+seta hud_panel_engineinfo_pos "0.910000 0.970000"
+seta hud_panel_engineinfo_size "0.090000 0.030000"
+seta hud_panel_engineinfo_bg "0"
+seta hud_panel_engineinfo_bg_color ""
+seta hud_panel_engineinfo_bg_color_team ""
+seta hud_panel_engineinfo_bg_alpha ""
+seta hud_panel_engineinfo_bg_border ""
+seta hud_panel_engineinfo_bg_padding ""
+
+seta hud_panel_infomessages 1
+seta hud_panel_infomessages_pos "0.710000 0"
+seta hud_panel_infomessages_size "0.290000 0.100000"
+seta hud_panel_infomessages_bg "0"
+seta hud_panel_infomessages_bg_color ""
+seta hud_panel_infomessages_bg_color_team ""
+seta hud_panel_infomessages_bg_alpha ""
+seta hud_panel_infomessages_bg_border ""
+seta hud_panel_infomessages_bg_padding "0"
+seta hud_panel_infomessages_flip "1"
+
+menu_sync
index ee076a0ad7b3825eb33a994353a4a6f6b0b7754e..f2799697a283b7a32880cf372287a1e0e40b0ddc 100644 (file)
@@ -60,6 +60,10 @@ seta hud_panel_ammo_bg_border ""
 seta hud_panel_ammo_bg_padding ""
 seta hud_panel_ammo_onlycurrent "0"
 seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
 
 seta hud_panel_powerups 1
 seta hud_panel_powerups_pos "0.660000 0.910000"
@@ -74,6 +78,9 @@ seta hud_panel_powerups_flip "1"
 seta hud_panel_powerups_iconalign "0"
 seta hud_panel_powerups_baralign "0"
 seta hud_panel_powerups_progressbar "0"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
 
 seta hud_panel_healtharmor 1
 seta hud_panel_healtharmor_pos "0.370000 0.930000"
@@ -88,6 +95,9 @@ seta hud_panel_healtharmor_flip "0"
 seta hud_panel_healtharmor_iconalign "0"
 seta hud_panel_healtharmor_baralign "0"
 seta hud_panel_healtharmor_progressbar "0"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
 
 seta hud_panel_notify 0
 seta hud_panel_notify_pos "0 0.650000"
index 028547ac27ac68b76f66c1c3696228247888e659..453e09165fe5fe7ea0914d71750bf1fc3b53f20a 100644 (file)
@@ -31,7 +31,6 @@
 ""                                      "View"
 "+zoom"                                 "zoom"
 "+showscores"                           "show scores"
-"+showaccuracy"                                "show accuracy"
 "screenshot"                            "screen shot"
 ""                                      ""
 ""                                      "Communicate"
diff --git a/merge-settings-into-cfg.pl b/merge-settings-into-cfg.pl
deleted file mode 100644 (file)
index 3f2d5fa..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my ($in, $out) = @ARGV;
-
-my %changes = ();
-while(<STDIN>)
-{
-       chomp;
-       /^(?:seta?\s)?\s*(\S+)\s+(.*)/
-               or next;
-       $changes{$1} = $2;
-}
-
-my %changes_unapplied = %changes;
-my $result = "";
-open my $fh, "<", $in
-       or die "<$in: $!";
-while(<$fh>)
-{
-       chomp;
-       /^(seta?\s?\s*)(\S+)(\s+)(.*)/
-               or do { $result .= "$_\n"; next; };
-       my $v = exists($changes{$2}) ? $changes{$2} : $4;
-       $result .= "$1$2$3$v\n";
-       delete $changes_unapplied{$2};
-}
-close $fh;
-open $fh, ">", $out
-       or die ">$out: $!";
-print $fh $result;
-print $fh "set $_ $changes_unapplied{$_}\n" for keys %changes_unapplied;
-close $fh;
diff --git a/models/ctf/banner_blue.tga b/models/ctf/banner_blue.tga
new file mode 100644 (file)
index 0000000..8b95589
Binary files /dev/null and b/models/ctf/banner_blue.tga differ
diff --git a/models/ctf/banner_blue_gloss.tga b/models/ctf/banner_blue_gloss.tga
new file mode 100644 (file)
index 0000000..77168a8
Binary files /dev/null and b/models/ctf/banner_blue_gloss.tga differ
diff --git a/models/ctf/banner_red.tga b/models/ctf/banner_red.tga
new file mode 100644 (file)
index 0000000..a64aa36
Binary files /dev/null and b/models/ctf/banner_red.tga differ
diff --git a/models/ctf/banner_red_gloss.tga b/models/ctf/banner_red_gloss.tga
new file mode 100644 (file)
index 0000000..77168a8
Binary files /dev/null and b/models/ctf/banner_red_gloss.tga differ
diff --git a/models/ctf/flag_blue.tga b/models/ctf/flag_blue.tga
new file mode 100644 (file)
index 0000000..63feddd
Binary files /dev/null and b/models/ctf/flag_blue.tga differ
diff --git a/models/ctf/flag_blue_gloss.tga b/models/ctf/flag_blue_gloss.tga
new file mode 100644 (file)
index 0000000..3e92985
Binary files /dev/null and b/models/ctf/flag_blue_gloss.tga differ
diff --git a/models/ctf/flag_blue_glow.tga b/models/ctf/flag_blue_glow.tga
new file mode 100644 (file)
index 0000000..8605da1
Binary files /dev/null and b/models/ctf/flag_blue_glow.tga differ
diff --git a/models/ctf/flag_blue_norm.tga b/models/ctf/flag_blue_norm.tga
new file mode 100644 (file)
index 0000000..07d5e17
Binary files /dev/null and b/models/ctf/flag_blue_norm.tga differ
diff --git a/models/ctf/flag_red.tga b/models/ctf/flag_red.tga
new file mode 100644 (file)
index 0000000..63feddd
Binary files /dev/null and b/models/ctf/flag_red.tga differ
diff --git a/models/ctf/flag_red_gloss.tga b/models/ctf/flag_red_gloss.tga
new file mode 100644 (file)
index 0000000..3e92985
Binary files /dev/null and b/models/ctf/flag_red_gloss.tga differ
diff --git a/models/ctf/flag_red_glow.tga b/models/ctf/flag_red_glow.tga
new file mode 100644 (file)
index 0000000..dfe90a4
Binary files /dev/null and b/models/ctf/flag_red_glow.tga differ
diff --git a/models/ctf/flag_red_norm.tga b/models/ctf/flag_red_norm.tga
new file mode 100644 (file)
index 0000000..07d5e17
Binary files /dev/null and b/models/ctf/flag_red_norm.tga differ
index 5d91c7ad652848fb43c814eca8b5bcdf2d66f7c9..86d232c6c4070531b9fdb8a96f30cc22b2a4b9a6 100644 (file)
Binary files a/models/ctf/flags.md3 and b/models/ctf/flags.md3 differ
diff --git a/models/ctf/flags.md3.framegroups b/models/ctf/flags.md3.framegroups
new file mode 100644 (file)
index 0000000..05a4991
--- /dev/null
@@ -0,0 +1 @@
+0 50 5 1
\ No newline at end of file
index 05a4fe72fc5955dfe55a03b29dd5ce6cc0d44b85..489df22f419006fee5bb41eb28961d01467802d7 100644 (file)
@@ -1,3 +1,3 @@
-flag,flags/flag_red
-flag_cloth,flags/flag_red_cloth
-flag_laser,flags/flag_red_laser
+mesh,models/ctf/flag_red.tga
+mesh2,models/ctf/banner_red.tga
+mesh3,models/ctf/glow_red.tga
\ No newline at end of file
index 02f217f36abf28de8af0c36f6d5dab9ec9e60360..47c5aeb71f53e85d6ae55a5b2ce35a019e57791f 100644 (file)
@@ -1,3 +1,3 @@
-flag,flags/flag_blue
-flag_cloth,flags/flag_blue_cloth
-flag_laser,flags/flag_blue_laser
+mesh,models/ctf/flag_blue.tga
+mesh2,models/ctf/banner_blue.tga
+mesh3,models/ctf/glow_blue.tga
\ No newline at end of file
diff --git a/models/ctf/glow_blue.tga b/models/ctf/glow_blue.tga
new file mode 100644 (file)
index 0000000..6968dc2
Binary files /dev/null and b/models/ctf/glow_blue.tga differ
diff --git a/models/ctf/glow_blue_glow.tga b/models/ctf/glow_blue_glow.tga
new file mode 100644 (file)
index 0000000..6968dc2
Binary files /dev/null and b/models/ctf/glow_blue_glow.tga differ
diff --git a/models/ctf/glow_red.tga b/models/ctf/glow_red.tga
new file mode 100644 (file)
index 0000000..9702b0b
Binary files /dev/null and b/models/ctf/glow_red.tga differ
diff --git a/models/ctf/glow_red_glow.tga b/models/ctf/glow_red_glow.tga
new file mode 100644 (file)
index 0000000..9702b0b
Binary files /dev/null and b/models/ctf/glow_red_glow.tga differ
index 02fd59d3a7dd34e6760d5e170317ec435055b526..ce62d46b5deff4be1df1a1c3d0ce77841f47996a 100644 (file)
Binary files a/models/elaser.mdl and b/models/elaser.mdl differ
index 8ae609a06b38c1553bd3b7a209d930d0846b9a37..a1be45958efea2ae93b772f0188f03df5e1d783a 100644 (file)
Binary files a/models/hlac_bullet.md3 and b/models/hlac_bullet.md3 differ
index c3a5d99e06304e69d71e5a678e046620685ec29a..8809d164557ac8fd8c0a2a4132ed2e0930245eb2 100644 (file)
Binary files a/models/laser.mdl and b/models/laser.mdl differ
index 7758e3e0f3e134e34a90504bc862604a393faf88..0af95286683444390b22ff10826d2d453d1ed700 100644 (file)
Binary files a/models/mine.md3 and b/models/mine.md3 differ
diff --git a/models/orbs/orbblue.md3 b/models/orbs/orbblue.md3
new file mode 100644 (file)
index 0000000..ac412e5
Binary files /dev/null and b/models/orbs/orbblue.md3 differ
diff --git a/models/orbs/orbblue.tga b/models/orbs/orbblue.tga
new file mode 100644 (file)
index 0000000..325577f
Binary files /dev/null and b/models/orbs/orbblue.tga differ
diff --git a/models/orbs/orbblue_glow.tga b/models/orbs/orbblue_glow.tga
new file mode 100644 (file)
index 0000000..d06af31
Binary files /dev/null and b/models/orbs/orbblue_glow.tga differ
diff --git a/models/orbs/orbpink.md3 b/models/orbs/orbpink.md3
new file mode 100644 (file)
index 0000000..c6844d2
Binary files /dev/null and b/models/orbs/orbpink.md3 differ
diff --git a/models/orbs/orbpink.tga b/models/orbs/orbpink.tga
new file mode 100644 (file)
index 0000000..9dad41a
Binary files /dev/null and b/models/orbs/orbpink.tga differ
diff --git a/models/orbs/orbpink_glow.tga b/models/orbs/orbpink_glow.tga
new file mode 100644 (file)
index 0000000..5f90638
Binary files /dev/null and b/models/orbs/orbpink_glow.tga differ
diff --git a/models/orbs/orbred.md3 b/models/orbs/orbred.md3
new file mode 100644 (file)
index 0000000..041973a
Binary files /dev/null and b/models/orbs/orbred.md3 differ
diff --git a/models/orbs/orbred.tga b/models/orbs/orbred.tga
new file mode 100644 (file)
index 0000000..ffb352e
Binary files /dev/null and b/models/orbs/orbred.tga differ
diff --git a/models/orbs/orbred_glow.tga b/models/orbs/orbred_glow.tga
new file mode 100644 (file)
index 0000000..142092f
Binary files /dev/null and b/models/orbs/orbred_glow.tga differ
diff --git a/models/orbs/orbyellow.md3 b/models/orbs/orbyellow.md3
new file mode 100644 (file)
index 0000000..ca63a33
Binary files /dev/null and b/models/orbs/orbyellow.md3 differ
diff --git a/models/orbs/orbyellow.tga b/models/orbs/orbyellow.tga
new file mode 100644 (file)
index 0000000..64b61f7
Binary files /dev/null and b/models/orbs/orbyellow.tga differ
diff --git a/models/orbs/orbyellow_glow.tga b/models/orbs/orbyellow_glow.tga
new file mode 100644 (file)
index 0000000..9e0597b
Binary files /dev/null and b/models/orbs/orbyellow_glow.tga differ
index 59dcdb9cdc5c23a7dce98bc4017fdb131c9b7694..5669bc4cc58d3f218688ab0a708a496af6b46ee6 100644 (file)
Binary files a/models/plasmatrail.mdl and b/models/plasmatrail.mdl differ
diff --git a/models/player/erebus.iqm_1.tga b/models/player/erebus.iqm_1.tga
new file mode 100644 (file)
index 0000000..bf151b5
Binary files /dev/null and b/models/player/erebus.iqm_1.tga differ
diff --git a/models/sprites/ka-ball.tga b/models/sprites/ka-ball.tga
new file mode 100644 (file)
index 0000000..17b1e6e
Binary files /dev/null and b/models/sprites/ka-ball.tga differ
diff --git a/models/sprites/ka-ballcarrier.tga b/models/sprites/ka-ballcarrier.tga
new file mode 100644 (file)
index 0000000..ca0c12f
Binary files /dev/null and b/models/sprites/ka-ballcarrier.tga differ
index 59468b54fc32e708a421aac2d1e7c58394c72dd8..50131ee91c12fbeeb6c374b9e606114a28e9b3f2 100644 (file)
@@ -171,6 +171,8 @@ sprite race-checkpoint    "Checkpoint"    ff8000 000000 0.0
 sprite race-finish        "Finish"        ff8000 000000 0.0
 sprite race-start         "Start"         ff8000 000000 0.0
 sprite nb-ball            "Ball"          e8d8a0 000000 0.0
+sprite ka-ball            "Ball"          00ffff 000000 0.0
+sprite ka-ballcarrier     "Ball carrier"  ff0000 000000 0.0
 
 sprite wpn-laser          "Laser"         ff8080 000000 0.0 # bright red
 sprite wpn-shotgun        "Shotgun"       804000 000000 0.0 # brown
index 5fce1ef258582d741089a8c8ecbae7d981f83295..60caa4125a6f9a8336ba364059861f443dab7b13 100644 (file)
Binary files a/models/weapons/g_minelayer.md3 and b/models/weapons/g_minelayer.md3 differ
index 4c7d4498f645d8752aba0474ccba834442e04449..648b0f1a74249033bb352d9aabfdbb0e936c7328 100644 (file)
Binary files a/models/weapons/v_minelayer.md3 and b/models/weapons/v_minelayer.md3 differ
diff --git a/physicsLeeStricklin-ModdedFruit.cfg b/physicsLeeStricklin-ModdedFruit.cfg
new file mode 100644 (file)
index 0000000..805df99
--- /dev/null
@@ -0,0 +1,40 @@
+// "NoQWBunny" physics based on XPM
+sv_gravity 800
+sv_maxspeed 424
+sv_maxairspeed 400
+
+sv_stopspeed 100
+sv_accelerate 13
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 26
+// Q1: 16+2
+// Nex: 32+2
+// we try: 24+2
+
+// actually, what we want is 266.6666 for 180bpm
+// but 260 takes same amount of frames and is nicer to mappers
+sv_jumpvelocity 260
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0 // breaks strafing?
+sv_airaccel_qw -0.8
+
+sv_airstopaccelerate -0.95
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.97
+sv_aircontrol 125
+sv_aircontrol_penalty 150
+sv_aircontrol_power 2.5
+sv_airspeedlimit_nonqw 800
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0 // TINY (1.35x normal) doublejumps only, can be disabled if wanted...
+sv_jumpspeedcap_min 0 // need predicting? (it should already be in CSQC prediction code)
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
index 74a20a46840871ead0789d623d930b7e4d5fd740..6c6b8a4ec54133fba4d6ec2ad082419a762ab319 100644 (file)
@@ -9,7 +9,7 @@ sv_accelerate 15
 sv_airaccelerate 1
 sv_friction 8
 edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
 // CPMA: 18
 sv_jumpvelocity 270
 sv_wateraccelerate 4
index db9c6179c0b4f8c5a471ff0c3d912761f0b53dc1..519db9f729fbde9d008ec3bbb6443a0832019a32 100644 (file)
@@ -9,7 +9,7 @@ sv_accelerate 15
 sv_airaccelerate 1
 sv_friction 8
 edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
 // CPMA: 18
 sv_jumpvelocity 270
 sv_wateraccelerate 4
index 8e47e6fa5bd880bc815444ae80c154985793ca6a..2d780381eedced49f15c67549f6455c535ae3a67 100644 (file)
@@ -271,3 +271,5 @@ string weaponorder_bypriority;
 float nex_charge_movingavg;
 
 float serverflags;
+
+float uid2name_dialog;
index 9e5b6be54a57650d30ceebf8213e14719d9e15c0..8092cf7f8f56263b8234ce7a1dcfcf3689acd112 100644 (file)
@@ -608,6 +608,35 @@ void GameCommand(string msg)
                e.draw = DrawDebugModel;
                e.classname = "debugmodel";
        }
+    else if(cmd == "vyes")
+    {
+        if(uid2name_dialog)
+        {
+            vote_active = 0; // force the panel to disappear right as we have selected the value (to prevent it from fading out in the normal vote panel pos)
+            vote_prev = 0;
+            cvar_set("cl_allow_uid2name", "1");
+            vote_change = -9999;
+        }
+        else
+        {
+            localcmd("cmd vote yes\n");
+        }
+    }
+    else if(cmd == "vno")
+    {
+        if(uid2name_dialog)
+        {
+            vote_active = 0;
+            vote_prev = 0;
+            cvar_set("cl_allow_uid2name", "0");
+            vote_change = -9999;
+        }
+        else
+        {
+            localcmd("cmd vote no\n");
+        }
+    }
+
        else
        {
                print("Invalid command. For a list of supported commands, try cl_cmd help.\n");
@@ -627,56 +656,6 @@ float CSQC_InputEvent(float bInputType, float nPrimary, float nSecondary)
        local float bSkipKey;
        bSkipKey = false;
 
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE) && panel_fg_alpha && !scoreboard_active) // don't lock keys before we actually see what's going on
-       {
-               /*
-               string vyes_keys;
-               float keys;
-               vyes_keys = findkeysforcommand("vyes");
-               keys = tokenize(vyes_keys);
-
-               float i;
-               for (i = 0; i < keys; ++i)
-               {
-                       print(ftos(nPrimary), " ", argv(i), "\n"); 
-                       if(nPrimary == stof(argv(i)))
-                       {
-                               vote_active = 0;
-                               cvar_set("cl_allow_uid2name", "1");
-                               return TRUE;
-                       }
-               }
-
-               string vno_keys;
-               vno_keys = findkeysforcommand("vno");
-               keys = tokenize(vno_keys);
-
-               float i;
-               for (i = 0; i < keys; ++i)
-               {
-                       if(nPrimary == stof(argv(i)))
-                       {
-                               vote_active = 0;
-                               cvar_set("cl_allow_uid2name", "0");
-                               return TRUE;
-                       }
-               }
-               */ // If only I could grab F1-F12 in CSQC... but no
-
-               if(nPrimary == 121) // ascii value for y
-               {
-                       vote_active = 0;
-                       cvar_set("cl_allow_uid2name", "1");
-                       return TRUE;
-               }
-               else if(nPrimary == 110) // ascii value for n
-               {
-                       vote_active = 0;
-                       cvar_set("cl_allow_uid2name", "0");
-                       return TRUE;
-               }
-       }
-
        if (HUD_Panel_InputEvent(bInputType, nPrimary, nSecondary))
                return true;
 
index 65f36cf7a0af360cd84cb5bd170e47c2fee397ce..f0bcba6e6b8d805020f989731ddf91d6ac15f35a 100644 (file)
@@ -723,10 +723,10 @@ void CSQC_UpdateView(float w, float h)
                        else
                                myhealth_gentlergb = stov(cvar_string("hud_damage_gentle_color"));
 
-                       drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, myhealth_gentlergb, cvar("hud_damage_gentle_alpha_multiplier") * bound(0, myhealth_flash_temp, 1), DRAWFLAG_NORMAL);
+                       drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, myhealth_gentlergb, cvar("hud_damage_gentle_alpha_multiplier") * bound(0, myhealth_flash_temp, 1) * cvar("hud_damage"), DRAWFLAG_NORMAL);
                }
                else
-                       drawpic(reticle_pos, "gfx/blood", reticle_size, stov(cvar_string("hud_damage_color")), bound(0, myhealth_flash_temp, 1), DRAWFLAG_NORMAL);
+                       drawpic(reticle_pos, "gfx/blood", reticle_size, stov(cvar_string("hud_damage_color")), bound(0, myhealth_flash_temp, 1) * cvar("hud_damage"), DRAWFLAG_NORMAL);
        }
 
        // Draw the mouse cursor
@@ -764,6 +764,17 @@ void CSQC_UpdateView(float w, float h)
         CSQC_RAPTOR_HUD();
        else
        {
+               if(gametype == GAME_FREEZETAG)
+               {
+                       if(getstati(STAT_FROZEN))
+                               drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', cvar_or("hud_colorflash_alpha", 0.5), DRAWFLAG_ADDITIVE);
+                       if(getstatf(STAT_REVIVE_PROGRESS))
+                       {
+                               DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', cvar("hud_colorflash_alpha"), DRAWFLAG_ADDITIVE);
+                               drawstring_aspect(eY * 0.64 * vid_conheight, "Revival progress", eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
+                       }
+               }
+
                if(cvar("r_letterbox") == 0)
                        if(cvar("viewsize") < 120)
                                CSQC_common_hud();
@@ -1001,7 +1012,14 @@ void CSQC_UpdateView(float w, float h)
                        CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
 
                        if(cvar("crosshair_dot"))
-                               CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", wcross_alpha * f * cvar("crosshair_dot_alpha"));
+            {
+                vector wcross_color_old;
+                wcross_color_old = wcross_color;
+                if(cvar_string("crosshair_dot_color") != "0")
+                    wcross_color = stov(cvar_string("crosshair_dot_color"));
+                               CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", f * cvar("crosshair_dot_alpha"));
+                wcross_color = wcross_color_old;
+            }
 
                        wcross_name_alpha_goal_prev = f;
                }
index 4a65b2c1770aee8575bd13f206fa9c823d7613b1..b43e6268bc1dca5d6bb974061fb8df50e0ee9df7 100644 (file)
@@ -14,7 +14,12 @@ Misc HUD functions
 //   1/4 height: bottom part
 void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
 {
-       if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border
+    if (theBorderSize_x < 0 && theBorderSize_y < 0) // draw whole image as it is
+    {
+               drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0);
+               return;
+    }
+       if (theBorderSize_x == 0 && theBorderSize_y == 0) // no border
        {
                // draw only the central part
                drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0);
@@ -491,18 +496,26 @@ void HUD_Panel_ExportCfg(string cfgname)
                                case HUD_PANEL_AMMO:
                                        HUD_Write_PanelCvar_q("_onlycurrent");
                                        HUD_Write_PanelCvar_q("_iconalign");
+                                       HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_name");
+                                       HUD_Write_PanelCvar_q("_text");
                                        break;
                                case HUD_PANEL_POWERUPS:
                                        HUD_Write_PanelCvar_q("_flip");
                                        HUD_Write_PanelCvar_q("_iconalign");
                                        HUD_Write_PanelCvar_q("_baralign");
                                        HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_strength");
+                                       HUD_Write_PanelCvar_q("_progressbar_shield");
                                        break;
                                case HUD_PANEL_HEALTHARMOR:
                                        HUD_Write_PanelCvar_q("_flip");
                                        HUD_Write_PanelCvar_q("_iconalign");
                                        HUD_Write_PanelCvar_q("_baralign");
                                        HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_health");
+                                       HUD_Write_PanelCvar_q("_progressbar_armor");
+                                       HUD_Write_PanelCvar_q("_text");
                                        break;
                                case HUD_PANEL_NOTIFY:
                                        HUD_Write_PanelCvar_q("_flip");
@@ -559,18 +572,17 @@ if(highlightedPanel_prev == active_panel && autocvar__hud_configure)\
 } ENDS_WITH_CURLY_BRACE
 
 //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu
-void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, float lenght_ratio, float vertical, float right_align, vector theColor, float theAlpha, float drawflag)
+void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float lenght_ratio, float vertical, float right_align, vector theColor, float theAlpha, float drawflag)
 {
        if(lenght_ratio <= 0 || !theAlpha)
                return;
        if(lenght_ratio > 1)
                lenght_ratio = 1;
 
-       string pic;
        vector square;
        vector width, height;
        if(vertical) {
-               pic = strcat(hud_skin_path, "/statusbar_vertical");
+               pic = strcat(hud_skin_path, "/", pic, "_vertical");
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar_vertical";
                }
@@ -599,7 +611,7 @@ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, float lenght_ra
                        drawsubpic(theOrigin + height - square, width   +     square, pic, '0 0.75 0', '1 0.25 0', theColor, theAlpha, drawflag);
                }
        } else {
-               pic = strcat(hud_skin_path, "/statusbar");
+               pic = strcat(hud_skin_path, "/", pic);
                if(precache_pic(pic) == "") {
                        pic = "gfx/hud/default/statusbar";
                }
@@ -1935,10 +1947,16 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
        if (currently_selected)
                drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 
-       if(a > 0)
-               drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
-       else // "ghost" ammo count
-               drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+    if(a > 0 && cvar("hud_panel_ammo_progressbar"))
+        HUD_Panel_DrawProgressBar(myPos + eX * cvar("hud_panel_ammo_progressbar_xoffset") * mySize_x, mySize - eX * cvar("hud_panel_ammo_progressbar_xoffset") * mySize_x, cvar_string("hud_panel_ammo_progressbar_name"), 0, 0, a/cvar("hud_panel_ammo_maxammo"), color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+
+    if(cvar("hud_panel_ammo_text"))
+    {
+        if(a > 0)
+            drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+        else // "ghost" ammo count
+            drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+    }
        if(a > 0)
                drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
        else // "ghost" ammo icon
@@ -2154,27 +2172,32 @@ void HUD_Powerups(void) {
                mySize -= '2 2 0' * panel_bg_padding;
        }
 
-       vector barpos, barsize;
+       vector barsize;
        vector picpos;
        vector numpos;
 
        string leftname, rightname;
+    string leftprogressname, rightprogressname;
        float leftcnt, rightcnt;
        float leftexact, rightexact;
        if (cvar("hud_panel_powerups_flip")) {
                leftname = "strength";
+        leftprogressname = cvar_string("hud_panel_powerups_progressbar_strength");
                leftcnt = ceil(strength_time);
                leftexact = strength_time;
 
                rightname = "shield";
+        rightprogressname = cvar_string("hud_panel_powerups_progressbar_shield");
                rightcnt = ceil(shield_time);
                rightexact = shield_time;
        } else {
                leftname = "shield";
+        leftprogressname = cvar_string("hud_panel_powerups_progressbar_shield");
                leftcnt = ceil(shield_time);
                leftexact = shield_time;
 
                rightname = "strength";
+        rightprogressname = cvar_string("hud_panel_powerups_progressbar_strength");
                rightcnt = ceil(strength_time);
                rightexact = strength_time;
        }
@@ -2187,58 +2210,74 @@ void HUD_Powerups(void) {
        float is_vertical = (panel_ar < 1);
        if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
        {
+        barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                if(leftcnt)
                {
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(leftname);
-                               HUD_Panel_DrawProgressBar(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                       }
+            if(cvar("hud_panel_powerups_text"))
+            {
+                               if(leftcnt > 1)
+                                       DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
+                               if(leftcnt <= 5)
+                                       DrawNumIcon_expanding(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                        }
-                       if(leftcnt > 1)
-                               DrawNumIcon(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
-                       if(leftcnt <= 5)
-                               DrawNumIcon_expanding(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                }
 
                if(rightcnt)
                {
+                       pos_x += barsize_x;
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(rightname);
-                               HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, barsize, rightprogressname, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                       }
+            if(cvar("hud_panel_powerups_text"))
+            {
+                               if(rightcnt > 1)
+                                       DrawNumIcon(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
+                               if(rightcnt <= 5)
+                                       DrawNumIcon_expanding(pos, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                        }
-                       if(rightcnt > 1)
-                               DrawNumIcon(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
-                       if(rightcnt <= 5)
-                               DrawNumIcon_expanding(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                }
        }
        else
        {
+        barsize = eX * mySize_x + eY * 0.5 * mySize_y;
                if(leftcnt)
                {
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(leftname);
-                               HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                       }
+            if(cvar("hud_panel_powerups_text"))
+            {
+                               if(leftcnt > 1)
+                                       DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
+                               if(leftcnt <= 5)
+                                       DrawNumIcon_expanding(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                        }
-                       if(leftcnt > 1)
-                               DrawNumIcon(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1);
-                       if(leftcnt <= 5)
-                               DrawNumIcon_expanding(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
                }
 
                if(rightcnt)
                {
+                       pos_y += barsize_y;
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColorForString(rightname);
-                               HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, barsize, rightprogressname, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+                       }
+            if(cvar("hud_panel_powerups_text"))
+            {
+                               if(rightcnt > 1)
+                                       DrawNumIcon(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
+                               if(rightcnt <= 5)
+                                       DrawNumIcon_expanding(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                        }
-                       if(rightcnt > 1)
-                               DrawNumIcon(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1);
-                       if(rightcnt <= 5)
-                               DrawNumIcon_expanding(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
                }
        }
        drawfont = hud_font;
@@ -2274,21 +2313,24 @@ void HUD_HealthArmor(void)
 
        if(autocvar__hud_configure)
        {
-               armor = 150;
-               health = 100;
-               fuel = 70;
+               armor = 75;
+               health = 150;
+               fuel = 20;
        }
 
        if(health <= 0)
                return;
 
-       vector barpos, barsize;
+       vector barsize;
        vector picpos, numpos;
 
        drawfont = hud_bigfont;
        float baralign = cvar("hud_panel_healtharmor_baralign");
        float iconalign = cvar("hud_panel_healtharmor_iconalign");
        float progressbar = cvar("hud_panel_healtharmor_progressbar");
+
+    float maxhealth = cvar("hud_panel_healtharmor_maxhealth");
+    float maxarmor = cvar("hud_panel_healtharmor_maxarmor");
        if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display
        {
                vector v;
@@ -2297,6 +2339,7 @@ void HUD_HealthArmor(void)
                float x;
                x = floor(v_x + 1);
 
+        float maxtotal = maxhealth + maxarmor;
                string biggercount;
                if(v_z) // NOT fully armored
                {
@@ -2304,9 +2347,10 @@ void HUD_HealthArmor(void)
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColor(health);
-                               HUD_Panel_DrawProgressBar(pos, mySize, x/400, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, mySize, cvar_string("hud_panel_healtharmor_progressbar_health"), x/maxtotal, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(armor)
+            if(cvar("hud_panel_healtharmor_text"))
                                drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "armor", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL);
                }
                else
@@ -2315,61 +2359,75 @@ void HUD_HealthArmor(void)
                        if(progressbar)
                        {
                                HUD_Panel_GetProgressBarColor(armor);
-                               HUD_Panel_DrawProgressBar(pos, mySize, x/400, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, mySize, cvar_string("hud_panel_healtharmor_progressbar_armor"), x/maxtotal, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        if(health)
+            if(cvar("hud_panel_healtharmor_text"))
                                drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "health", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                }
-               DrawNumIcon(pos, mySize, x, biggercount, 0, iconalign, HUD_Get_Num_Color(x, 2 * 200), 1);
+        if(cvar("hud_panel_healtharmor_text"))
+                       DrawNumIcon(pos, mySize, x, biggercount, 0, iconalign, HUD_Get_Num_Color(x, maxtotal), 1);
 
                if(fuel)
                {
                        HUD_Panel_GetProgressBarColor(fuel);
-                       HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.2 * mySize_y, fuel/100, 0, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+                       HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.2 * mySize_y, "progressbar", fuel/100, 0, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                }
        }
        else
        {
                string leftname, rightname;
+        string leftprogressname, rightprogressname;
                float leftcnt, rightcnt;
+               float leftmax, rightmax;
                float leftactive, rightactive;
                float leftalpha, rightalpha;
                if (cvar("hud_panel_healtharmor_flip")) { // layout with armor left/top of health
                        leftname = "armor";
+            leftprogressname = cvar_string("hud_panel_healtharmor_progressbar_armor");
                        leftcnt = armor;
                        if(leftcnt)
                                leftactive = 1;
                        leftalpha = min((armor+10)/55, 1);
+            leftmax = maxarmor;
 
                        rightname = "health";
+            rightprogressname = cvar_string("hud_panel_healtharmor_progressbar_health");
                        rightcnt = health;
                        rightactive = 1;
                        rightalpha = 1;
+            rightmax = maxhealth;
                } else {
                        leftname = "health";
+            leftprogressname = cvar_string("hud_panel_healtharmor_progressbar_health");
                        leftcnt = health;
                        leftactive = 1;
                        leftalpha = 1;
+            leftmax = maxhealth;
 
                        rightname = "armor";
+            rightprogressname = cvar_string("hud_panel_healtharmor_progressbar_armor");
                        rightcnt = armor;
                        if(rightcnt)
                                rightactive = 1;
                        rightalpha = min((armor+10)/55, 1);
+            rightmax = maxarmor;
                }
 
                float panel_ar = mySize_x/mySize_y;
                float is_vertical = (panel_ar < 1);
                if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1))
                {
+            barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                        if(leftactive)
                        {
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(leftname);
-                                       HUD_Panel_DrawProgressBar(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt/200, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/200, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
-                               DrawNumIcon(pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
+                               if(cvar("hud_panel_healtharmor_text"))
+                                       DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
                        }
 
                        if(rightactive)
@@ -2377,9 +2435,10 @@ void HUD_HealthArmor(void)
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(rightname);
-                                       HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt/200, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, barsize, rightprogressname, rightcnt/200, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
-                               DrawNumIcon(pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
+                               if(cvar("hud_panel_healtharmor_text"))
+                                       DrawNumIcon(pos + eX * 0.5 * mySize_x, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
                        }
 
                        if(fuel)
@@ -2389,19 +2448,21 @@ void HUD_HealthArmor(void)
                                        mySize_x *= 0.2 * 0.5 / 2;
                                else
                                        mySize_y *= 0.2;
-                               HUD_Panel_DrawProgressBar(pos, mySize, fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
                else
                {
+            barsize = eX * 0.5 * mySize_x + eY * mySize_y;
                        if(leftactive)
                        {
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(leftname);
-                                       HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt/200, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/200, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
-                               DrawNumIcon(pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
+                               if(cvar("hud_panel_healtharmor_text"))
+                                       DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, 200), 1);
                        }
 
                        if(rightactive)
@@ -2409,9 +2470,10 @@ void HUD_HealthArmor(void)
                                if(progressbar)
                                {
                                        HUD_Panel_GetProgressBarColorForString(rightname);
-                                       HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt/200, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, barsize, rightprogressname, rightcnt/200, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                                }
-                               DrawNumIcon(pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
+                               if(cvar("hud_panel_healtharmor_text"))
+                                       DrawNumIcon(pos + eY * 0.5 * mySize_y, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, 200), 1);
                        }
 
                        if(fuel)
@@ -2421,7 +2483,7 @@ void HUD_HealthArmor(void)
                                        mySize_x *= 0.2 / 2;
                                else
                                        mySize_y *= 0.2 * 0.5;
-                               HUD_Panel_DrawProgressBar(pos, mySize, fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+                               HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
                        }
                }
        }
@@ -2821,6 +2883,17 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                else if(type == RACE_FAIL) {
                        HUD_KillNotify_Push(s1, s2, 1, RACE_FAIL);
                }
+       } else if(msg == MSG_KA) {
+               if(type == KA_PICKUPBALL) {
+                       HUD_KillNotify_Push(s1, s2, 0, KA_PICKUPBALL);
+                       if(alsoprint)
+                               print (s1, "^7 has picked up the ball!\n");
+               }
+               else if(type == KA_DROPBALL) {
+                       HUD_KillNotify_Push(s1, s2, 0, KA_DROPBALL);
+                       if(alsoprint)
+                               print(s1, "^7 has dropped the ball!\n");
+               }
        }
 }
 
@@ -3100,6 +3173,15 @@ void HUD_Notify (void)
                                        s = "notify_blue_captured";
                                }
                        }
+                       else if(killnotify_deathtype[j] == KA_DROPBALL)
+                       {
+                               s = "notify_balldropped";
+                       }
+                       else if(killnotify_deathtype[j] == KA_PICKUPBALL)
+                       {
+                               s = "notify_ballpickedup";
+                       }
+                       
                        attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
                        pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height);
                        weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
@@ -3816,10 +3898,12 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
+    uid2name_dialog = 0;
        if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
        {
                vote_active = 1;
                vote_called_vote = strzone(strcat("^2Name ^7instead of \"^1Unregistered player\"", " ^7in stats"));
+        uid2name_dialog = 1;
        }
 
        if(!autocvar_hud_panel_vote && !autocvar__hud_configure)
@@ -3860,16 +3944,18 @@ void HUD_VoteWindow(void)
 
        active_panel = HUD_PANEL_VOTE;
        HUD_Panel_UpdateCvars(vote);
-       vector pos, mySize;
-       pos = panel_pos;
-       mySize = panel_size;
 
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
+       if(uid2name_dialog)
        {
                panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight;
                panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight;
        }
 
+    // these must be below above block
+       vector pos, mySize;
+       pos = panel_pos;
+       mySize = panel_size;
+
        a = vote_alpha * bound(cvar("hud_panel_vote_alreadyvoted_alpha"), 1 - vote_highlighted, 1);
        HUD_Panel_DrawBg(a);
        a = panel_fg_alpha * a;
@@ -3899,7 +3985,7 @@ void HUD_VoteWindow(void)
        mySize = newSize;
 
        s = "A vote has been called for:";
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
+       if(uid2name_dialog)
                s = "Allow servers to store and display your name?";
        drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1/8), stringwidth_colors);
@@ -3908,13 +3994,9 @@ void HUD_VoteWindow(void)
        drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL);
 
        // print the yes/no counts
-       s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount));
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
-               s = strcat("Yes: (press y)");
+    s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount));
        drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL);
-       s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount));
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
-               s = strcat("No: (press n)");
+    s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount));
        drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL);
 
        // draw the progress bar backgrounds
@@ -4282,6 +4364,44 @@ void HUD_Mod_KH(vector pos, vector mySize)
        }
 }
 
+// Keepaway HUD mod icon
+float kaball_prevstatus; // last remembered status
+float kaball_statuschange_time; // time when the status changed
+
+// we don't need to reset for keepaway since it immediately 
+// autocorrects prevstatus as to if the player has the ball or not
+
+void HUD_Mod_Keepaway(vector pos, vector mySize)
+{
+       mod_active = 1; // keepaway should always show the mod HUD
+       
+       float BLINK_FACTOR = 0.15;
+       float BLINK_BASE = 0.85;
+       float BLINK_FREQ = 5; 
+       float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
+       
+       float stat_items = getstati(STAT_ITEMS);
+       float kaball = (stat_items/IT_KEY1) & 1;
+       
+       if(kaball != kaball_prevstatus)
+       {
+               kaball_statuschange_time = time;
+               kaball_prevstatus = kaball;
+       }
+       
+       // todo: Fix the sizing with the expanding image
+       
+       float kaball_statuschange_elapsedtime = time - kaball_statuschange_time;
+       float f = bound(0, kaball_statuschange_elapsedtime*2, 1);
+       
+       if(kaball_prevstatus && f < 1)
+               drawpic_aspect_skin_expanding(pos + eY * 0.25 * mySize_y, "keepawayball_carrying", eX * mySize_x + eY * mySize_y * 0.5, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f);
+       
+       if(kaball)
+               drawpic_aspect_skin(pos, "keepawayball_carrying", eX * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL);
+}
+
+
 // Nexball HUD mod icon
 void HUD_Mod_NexBall(vector pos, vector mySize)
 {
@@ -4305,13 +4425,11 @@ void HUD_Mod_NexBall(vector pos, vector mySize)
                        p = 2 - p;
 
                //Draw the filling
-               vector barsize;
-               float vertical;
                HUD_Panel_GetProgressBarColor(nexball);
                if(mySize_x > mySize_y)
-                       HUD_Panel_DrawProgressBar(pos, mySize, p, 0, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                       HUD_Panel_DrawProgressBar(pos, mySize, "statusbar", p, 0, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                else
-                       HUD_Panel_DrawProgressBar(pos, mySize, p, 1, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+                       HUD_Panel_DrawProgressBar(pos, mySize, "statusbar", p, 1, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
 
        if (stat_items & IT_KEY1)
@@ -4475,7 +4593,7 @@ void HUD_ModIcons(void)
        if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
                return;
 
-       if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && !autocvar__hud_configure)
+       if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && !autocvar__hud_configure)
                return;
 
        active_panel = HUD_PANEL_MODICONS;
@@ -4512,8 +4630,10 @@ void HUD_ModIcons(void)
                HUD_Mod_NexBall(pos, mySize);
        else if(gametype == GAME_CTS || gametype == GAME_RACE)
                HUD_Mod_Race(pos, mySize);
-       else if(gametype == GAME_CA)
+       else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
                HUD_Mod_CA(pos, mySize);
+       else if(gametype == GAME_KEEPAWAY)
+               HUD_Mod_Keepaway(pos, mySize);
 }
 
 // Draw pressed keys (#11)
@@ -5008,7 +5128,7 @@ void HUD_Physics(void)
        if(speed && progressbar)
        {
                HUD_Panel_GetProgressBarColor(speed);
-               HUD_Panel_DrawProgressBar(pos + speed_offset, mySize, speed/max_speed, 0, speed_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+               HUD_Panel_DrawProgressBar(pos + speed_offset, mySize, "progressbar", speed/max_speed, 0, speed_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
 
        vector tmp_offset, tmp_size;
@@ -5091,7 +5211,7 @@ void HUD_Physics(void)
                        HUD_Panel_GetProgressBarColor(acceleration_neg);
                else
                        HUD_Panel_GetProgressBarColor(acceleration);
-               HUD_Panel_DrawProgressBar(pos + acceleration_offset, mySize, fabs(acceleration)/max_acceleration, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+               HUD_Panel_DrawProgressBar(pos + acceleration_offset, mySize, "progressbar", fabs(acceleration)/max_acceleration, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
        }
        drawstring_aspect(pos + acceleration_offset, ftos_decimals(acceleration, 3), mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
        drawfont = hud_font;
index 1a99f87ddd2a0e87e042a9c2a3dcd5329d57c63a..8738c5d81b05bf2e1b44e457d23bbbf422c79242 100644 (file)
@@ -248,12 +248,12 @@ string HUD_DefaultColumnLayout()
 {
        return strcat( // fteqcc sucks
                "ping pl name | ",
-               "-teams,race,lms/kills -teams,lms/deaths -teams,lms,race/suicides -race,dm,tdm/frags ", // tdm already has this in "score"
+               "-teams,race,lms/kills -teams,lms/deaths -teams,lms,race,ka/suicides -race,dm,tdm,ka/frags ", // tdm already has this in "score"
                "+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
                "+lms/lives +lms/rank ",
                "+kh/caps +kh/pushes +kh/destroyed ",
                "?+race/laps ?+race/time ?+race/fastest ",
-               "+as/objectives +nexball/faults +nexball/goals ",
+               "+as/objectives +nexball/faults +nexball/goals +ka/drops +ka/pickups +ka/bckills ",
                "-lms,race,nexball/score");
 }
 
index 5c6fe1da75d452d0e93bb38c04d13b63762294c6..409e6c86f7fa01c4bc9507321ffa1c45242a2d86 100644 (file)
@@ -39,6 +39,8 @@ const float GAME_RACE = 11;
 const float GAME_NEXBALL = 12;
 const float GAME_CTS = 13;
 const float GAME_CA            = 14;
+const float GAME_FREEZETAG             = 15;
+const float GAME_KEEPAWAY              = 16;
 
 const float AS_STRING          = 1;
 const float AS_INT             = 2;
@@ -342,6 +344,12 @@ const float STAT_VEHICLESTAT_RELOAD2 = 66;
 // mod stats (1xx)
 const float STAT_REDALIVE = 100;
 const float STAT_BLUEALIVE = 101;
+const float STAT_YELLOWALIVE = 102;
+const float STAT_PINKALIVE = 103;
+
+// freeze tag
+const float STAT_FROZEN = 104;
+const float STAT_REVIVE_PROGRESS = 105;
 
 //const float STAT_SPIDERBOT_AIM     53 // compressShotOrigin
 //const float STAT_SPIDERBOT_TARGET  54 // compressShotOrigin
@@ -566,7 +574,7 @@ float MSG_SPREE = 2;
 float MSG_KILL_ACTION = 3;
 float MSG_KILL_ACTION_SPREE = 4;
 float MSG_INFO = 5;
-
+float MSG_KA = 6;
 float MSG_RACE = 10;
 
 float KILL_TEAM_RED = 10301;
@@ -594,6 +602,9 @@ float INFO_LOSTFLAG = 10321;
 float INFO_RETURNFLAG = 10322;
 float INFO_CAPTUREFLAG = 10323;
 
+float KA_PICKUPBALL = 10350;
+float KA_DROPBALL = 10351;
+
 float RACE_SERVER_RECORD = 10400;
 float RACE_NEW_TIME = 10401;
 float RACE_NEW_RANK = 10402;
index f6b54f155b842e6ff683ad236bfb7463f8d785ae..60c7199a65c0e4a00a4711190f5d3a1243a73c37 100644 (file)
@@ -312,7 +312,7 @@ float GameCommand_Generic(string command)
 
                return TRUE;
        }
-       else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55970)
+       else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55790)
        {
                // test case for terrencehill's color codes
                s = strdecolorize(substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
index 5192b75ac24ea37fd4a67cc72bc885b80dd3ea60..35a827f90035438c33b7a6ce60b25d19e5629008 100644 (file)
@@ -347,9 +347,11 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
                MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH;      // DM always works
                MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RUNEMATCH;       // Rune always works
                MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS;             // LMS always works
+               MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEEPAWAY;                // Keepaway always works
 
                if(spawnpoints >= 8  && diameter > 4096) {
                        MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH;
+                       MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_FREEZETAG;
                        MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CA;
                }
                if(                     diameter < 4096)
@@ -406,6 +408,8 @@ string _MapInfo_GetDefault(float t)
                case MAPINFO_TYPE_ONSLAUGHT:       return "20 0";
                case MAPINFO_TYPE_NEXBALL:         return "5 20 0";
                case MAPINFO_TYPE_CTS:             return "20 0 0";
+               case MAPINFO_TYPE_FREEZETAG:       return "10 20 0";
+               case MAPINFO_TYPE_KEEPAWAY:        return "30 20 0";
                default:                           return "";
        }
 }
@@ -462,6 +466,14 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType, fl
                s = cdr(s);
        }
 
+       if(pWantedType == MAPINFO_TYPE_KEEPAWAY)
+       {
+               sa = car(s);
+               if(sa != "")
+                       cvar_set("fraglimit", sa);
+               s = cdr(s);
+       }
+
        // rc = timelimit timelimit_qualification laps laps_teamplay
        if(pWantedType == MAPINFO_TYPE_RACE)
        {
@@ -526,6 +538,8 @@ string _MapInfo_GetDefaultEx(float t)
                case MAPINFO_TYPE_ONSLAUGHT:       return "timelimit=20";
                case MAPINFO_TYPE_NEXBALL:         return "timelimit=20 pointlimit=5 leadlimit=0";
                case MAPINFO_TYPE_CTS:             return "timelimit=20 skill=-1";
+               case MAPINFO_TYPE_FREEZETAG:       return "timelimit=20 pointlimit=10 teams=2 leadlimit=0";
+               case MAPINFO_TYPE_KEEPAWAY:        return "timelimit=20 pointlimit=30";
                default:                           return "";
        }
 }
@@ -650,6 +664,8 @@ float MapInfo_Type_FromString(string t)
        else if(t == "rc")      return MAPINFO_TYPE_RACE;
        else if(t == "nexball") return MAPINFO_TYPE_NEXBALL;
        else if(t == "cts")     return MAPINFO_TYPE_CTS;
+       else if(t == "freezetag")       return MAPINFO_TYPE_FREEZETAG;
+       else if(t == "keepaway") return MAPINFO_TYPE_KEEPAWAY;
        else if(t == "all")     return MAPINFO_TYPE_ALL;
        else                    return 0;
 }
@@ -670,6 +686,8 @@ string MapInfo_Type_ToString(float t)
        else if(t == MAPINFO_TYPE_RACE)            return "rc";
        else if(t == MAPINFO_TYPE_NEXBALL)         return "nexball";
        else if(t == MAPINFO_TYPE_CTS)             return "cts";
+       else if(t == MAPINFO_TYPE_FREEZETAG)       return "freezetag";
+       else if(t == MAPINFO_TYPE_KEEPAWAY)        return "keepaway";
        else if(t == MAPINFO_TYPE_ALL)             return "all";
        else                                       return "";
 }
@@ -1134,6 +1152,10 @@ float MapInfo_CurrentGametype()
                return MAPINFO_TYPE_NEXBALL;
        else if(cvar("g_cts"))
                return MAPINFO_TYPE_CTS;
+       else if(cvar("g_freezetag"))
+               return MAPINFO_TYPE_FREEZETAG;
+       else if(cvar("g_keepaway"))
+               return MAPINFO_TYPE_KEEPAWAY;
        else
                return MAPINFO_TYPE_DEATHMATCH;
 }
@@ -1174,7 +1196,9 @@ string MapInfo_GetGameTypeCvar(float t)
                case MAPINFO_TYPE_ONSLAUGHT: return "g_onslaught";
                case MAPINFO_TYPE_RACE: return "g_race";
                case MAPINFO_TYPE_NEXBALL: return "g_nexball";
+               case MAPINFO_TYPE_FREEZETAG: return "g_freezetag";
                case MAPINFO_TYPE_CTS: return "g_cts";
+               case MAPINFO_TYPE_KEEPAWAY:             return "g_keepaway";
                default: return "";
        }
 }
@@ -1196,6 +1220,8 @@ void MapInfo_SwitchGameType(float t)
        cvar_set("g_race",       (t == MAPINFO_TYPE_RACE)            ? "1" : "0");
        cvar_set("g_nexball",    (t == MAPINFO_TYPE_NEXBALL)         ? "1" : "0");
        cvar_set("g_cts",        (t == MAPINFO_TYPE_CTS)             ? "1" : "0");
+       cvar_set("g_freezetag",  (t == MAPINFO_TYPE_FREEZETAG)       ? "1" : "0");
+       cvar_set("g_keepaway",   (t == MAPINFO_TYPE_KEEPAWAY)        ? "1" : "0");
 }
 
 void MapInfo_LoadMap(string s)
index 1fcc0dc662783ebd056281a5732a9d75ca98a31f..12026689b8b3195e21ef40db0079c70fe50dacaf 100644 (file)
@@ -12,7 +12,9 @@ float MAPINFO_TYPE_KEYHUNT            = 1024;
 float MAPINFO_TYPE_ASSAULT             = 2048;
 float MAPINFO_TYPE_ONSLAUGHT           = 4096;
 float MAPINFO_TYPE_NEXBALL             = 8192;
-float MAPINFO_TYPE_ALL                 = 16383; // this has to include all above bits
+float MAPINFO_TYPE_FREEZETAG           = 16384;
+float MAPINFO_TYPE_KEEPAWAY    = 32768;
+float MAPINFO_TYPE_ALL                 = 65535; // this has to include all above bits
 
 float MAPINFO_FEATURE_WEAPONS       = 1; // not defined for minstagib-only maps
 
index e7d67392ae01c4e6eeb53b569540694b36fa4e9c..bc086e4a9af392358db52715af04de0ae882f6bc 100644 (file)
@@ -1,8 +1,2 @@
 #pragma flag enable subscope
 #pragma flag enable lo
-
-//float log(float x);
-#define log log_builtin \
-       #undef log \
-       /* turn the next use of "log" into a declaration of log_builtin */
-
index 8c87b7fdad4f0e81a26e66633d9bb9032c7020a8..44f8751733aab62e96406a890da8cee451966806 100644 (file)
@@ -1,43 +1,3 @@
-// checkextension wrapper for log
-float sqrt(float f); // declared later
-float exp(float f); // declared later
-float pow(float f, float e); // declared later
-float checkextension(string s); // declared later
-float log_synth(float f)
-{
-       float p, l;
-       if(f < 0)
-               return sqrt(-1); // nan? -inf?
-       if(f == 0)
-               return sqrt(-1); // ACTUALLY this should rather be -inf, but we cannot create a +inf in QC
-       if(f + f == f)
-               return l; // +inf
-       if(f < 1)
-       {
-               f = 1 / f;
-               p = -1;
-       }
-       else
-               p = 1;
-       while(f > 2)
-       {
-               f = sqrt(f);
-               p *= 2;
-       }
-       // two steps are good enough
-       l = ((6-f) * f - 5) / 4.32808512266689022212;
-       l += exp(-l) * f - 1;
-       l += exp(-l) * f - 1;
-       return l * p;
-}
-float log(float f)
-{
-       if(checkextension("DP_QC_LOG"))
-               return log_builtin(f);
-       else
-               return log_synth(f);
-}
-
 string wordwrap_buffer;
 
 void wordwrap_buffer_put(string s)
@@ -439,6 +399,8 @@ string GametypeNameFromType(float g)
        else if (g == GAME_RACE) return "rc";
        else if (g == GAME_NEXBALL) return "nexball";
        else if (g == GAME_CTS) return "cts";
+       else if (g == GAME_FREEZETAG) return "freezetag";
+       else if (g == GAME_KEEPAWAY) return "ka";
        return "dm";
 }
 
index 26b9bcb8f52361d9a60b9ea794ec3de95a7be8a3..434a7bc87fabe63b7ac17a9846f44a6772d4a3e3 100644 (file)
@@ -104,6 +104,10 @@ void XonoticCrosshairButton_draw(entity me)
 
        draw_Picture('0.5 0.5 0' - 0.5 * sz, me.src3, sz, rgb, a);
        if(cvar("crosshair_dot"))
+    {
+        if(cvar_string("crosshair_dot_color") != "0")
+            rgb = stov(cvar_string("crosshair_dot_color"));
                draw_Picture('0.5 0.5 0' - 0.5 * sz * cvar("crosshair_dot_size"), me.src4, sz * cvar("crosshair_dot_size"), rgb, a * cvar("crosshair_dot_alpha"));
+    }
 }
 #endif
index d1116a70db870bcd7fbc9bb88ece64d9740d4dd4..3eaf2677e9a4316231080e552e34ad0c7bf7365b 100644 (file)
@@ -15,7 +15,9 @@ CLASS(XonoticCvarList) EXTENDS(XonoticListBox)
        ATTRIB(XonoticCvarList, columnValueOrigin, float, 0)
        ATTRIB(XonoticCvarList, columnValueSize, float, 0)
 
+       METHOD(XonoticCvarList, mouseRelease, float(entity, vector))
        METHOD(XonoticCvarList, setSelected, void(entity, float))
+
        ATTRIB(XonoticCvarList, controlledTextbox, entity, NULL)
        ATTRIB(XonoticCvarList, cvarNameBox, entity, NULL)
        ATTRIB(XonoticCvarList, cvarDescriptionBox, entity, NULL)
@@ -162,6 +164,8 @@ float XonoticCvarList_keyDown(entity me, float scan, float ascii, float shift)
                CvarList_Revert_Click(world, me);
                return 1;
        }
+       else if(scan == K_ENTER)
+               me.cvarValueBox.parent.setFocus(me.cvarValueBox.parent, me.cvarValueBox);
        else if(SUPER(XonoticCvarList).keyDown(me, scan, ascii, shift))
                return 1;
        else if(!me.controlledTextbox)
@@ -170,6 +174,13 @@ float XonoticCvarList_keyDown(entity me, float scan, float ascii, float shift)
                return me.controlledTextbox.keyDown(me.controlledTextbox, scan, ascii, shift);
 }
 
+float XonoticCvarList_mouseRelease(entity me, vector pos)
+{
+       if(me.pressed == 2)
+               me.cvarValueBox.parent.setFocus(me.cvarValueBox.parent, me.cvarValueBox);
+       return SUPER(XonoticCvarList).mouseRelease(me, pos);
+}
+
 void CvarList_Value_Change(entity box, entity me)
 {
        cvar_set(me.cvarNameBox.text, box.text);
@@ -180,4 +191,5 @@ void CvarList_Revert_Click(entity btn, entity me)
        me.cvarValueBox.setText(me.cvarValueBox, me.cvarDefault);
        me.cvarValueBox.cursorPos = strlen(me.cvarDefault);
 }
+
 #endif
index 4fb8ac0ca5836e662ef911416e356e532c81c6cc..416a85419b1f2a3cd5e549c428b7713e2195c20b 100644 (file)
@@ -39,18 +39,22 @@ void XonoticServerCreateTab_fill(entity me)
                        if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_arena", "Arena"));
                        if(e.checked) e0 = NULL;
+               me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_keepaway", "Keepaway"));
+                       if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_race", "Race"));
                        if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_cts", "Race CTS"));
                        if(e.checked) e0 = NULL;
        me.TR(me);
-               n = 8;
+               n = 9;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_tdm", "TDM"));
                        if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ctf", "CTF"));
                        if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ca", "CA"));
                        if(e.checked) e0 = NULL;
+               me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_freezetag", "Freeze Tag"));
+                       if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_domination", "Domination"));
                        if(e.checked) e0 = NULL;
                me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_keyhunt", "Key Hunt"));
index 467357810c005b050953b8f34192d727e7c27f82..f3f620d7318bad17a6b00edc8ae5cac4e20f8c0f 100644 (file)
@@ -28,6 +28,8 @@ CLASS(XonoticMapInfoDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticMapInfoDialog, typeRaceLabel, entity, NULL)
        ATTRIB(XonoticMapInfoDialog, typeCTSLabel, entity, NULL)
        ATTRIB(XonoticMapInfoDialog, typeNexballLabel, entity, NULL)
+       ATTRIB(XonoticMapInfoDialog, typeFreezetagLabel, entity, NULL)
+       ATTRIB(XonoticMapInfoDialog, typeKeepawayLabel, entity, NULL)
 
        ATTRIB(XonoticMapInfoDialog, currentMapIndex, float, 0)
        ATTRIB(XonoticMapInfoDialog, currentMapBSPName, string, string_null)
@@ -83,6 +85,8 @@ void XonoticMapInfoDialog_loadMapInfo(entity me, float i, entity mlb)
        me.typeRaceLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE);
        me.typeCTSLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTS);
        me.typeNexballLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_NEXBALL);
+       me.typeFreezetagLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_FREEZETAG);
+       me.typeKeepawayLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEEPAWAY);
 
        MapInfo_ClearTemps();
 }
@@ -146,6 +150,10 @@ void XonoticMapInfoDialog_fill(entity me)
                        me.typeCTSLabel = e;
                me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Nexball"));
                        me.typeNexballLabel = e;
+               me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Freezetag"));
+                       me.typeFreezetagLabel = e;
+               me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Keepaway"));
+                       me.typeKeepawayLabel = e;
 
        me.gotoRC(me, me.rows - 2, 0);
                me.TD(me, 1, me.columns, e = makeXonoticTextLabel(0.5, ""));
index 02177fb6363dded55bc059e8b4510a7b1f2f95e7..562c097ce8f228d6738fdf6c8bc0f8cd6a02c9f1 100644 (file)
@@ -86,9 +86,6 @@ void XonoticPlayerSettingsTab_fill(entity me)
        me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Field of view:"));
                me.TD(me, 1, 2, e = makeXonoticSlider(60, 130, 1, "fov"));
-       me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Damage kick:"));
-               me.TD(me, 1, 2, e = makeXonoticSlider(0, 0.5, 0.05, "v_kicktime"));
        me.TR(me);
                sl = makeXonoticSlider(0.45, 0.75, 0.01, "cl_bobcycle");
                me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, sl, "View bobbing:"));
@@ -158,7 +155,6 @@ void XonoticPlayerSettingsTab_fill(entity me)
                me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "0",    "None"));
                me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "1",    "TrueAim"));
                me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "1.25", "Enemies"));
-       me.TR(me);
        me.TR(me);
                me.TDempty(me, 0.4);
                me.TD(me, 1, 2.2, e = makeXonoticButton("Waypoints setup...", '0 0 0'));
@@ -172,6 +168,7 @@ void XonoticPlayerSettingsTab_fill(entity me)
                        e.onClickEntity = me;
                me.TDempty(me, 0.5);
        me.TR(me);
+       me.TR(me);
        #ifdef ALLOW_FORCEMODELS
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Force models:"));
                me.TD(me, 1, 2/3, e = makeXonoticRadioButton(6, string_null, string_null, "None"));
@@ -188,6 +185,9 @@ void XonoticPlayerSettingsTab_fill(entity me)
                        e.addValue(e, "Lots", "0");
                        e.configureXonoticTextSliderValues(e);
                        setDependent(e, "cl_gentle", 0, 0);
+       me.TR(me);
+               me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Damage splash:"));
+               me.TD(me, 1, 2, e = makeXonoticSlider(0, 1, 0.05, "hud_damage"));
 
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";cl_cmd sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_shownames;sendcvar cl_forceplayermodelsfromxonotic;sendcvar cl_forceplayermodels;playermodel $_cl_playermodel;playerskin $_cl_playerskin", COMMANDBUTTON_APPLY));
index 0bacab7a49baa63160dc158f6286f04ffa35501e..c6fca21ac2e606d91b5be05217a793f6abc754f6 100644 (file)
@@ -359,8 +359,8 @@ void preMenuDraw()
                if(!_Nex_ExtResponseSystem_Queried)
                {
                        _Nex_ExtResponseSystem_Queried = 1;
-                       //uri_get(sprintf("http://www.xonotic.org/dl/checkupdate.txt?version=%s", uri_escape(cvar_string("g_xonoticversion"))), URI_GET_UPDATENOTIFICATION);
-                       crypto_uri_postbuf(sprintf("http://www.xonotic.org/dl/t/checkupdate2.cgi?version=%s", uri_escape(cvar_string("g_xonoticversion"))), URI_GET_UPDATENOTIFICATION, "application/x-www-urlencoded", "hello=world&foo=bar", -1, 0);
+                       uri_get(sprintf("http://www.xonotic.org/dl/checkupdate.txt?version=%s", uri_escape(cvar_string("g_xonoticversion"))), URI_GET_UPDATENOTIFICATION);
+                       //crypto_uri_postbuf(sprintf("http://www.xonotic.org/dl/t/checkupdate2.cgi?version=%s", uri_escape(cvar_string("g_xonoticversion"))), URI_GET_UPDATENOTIFICATION, "application/x-www-urlencoded", "hello=world&foo=bar", -1, 0);
                }
        }
 
index 046743151dbc02fd27dbd706a77d8065418397b6..fbabbcf74ac6c4e5c0bfff4ae32ab41ec2fd734e 100644 (file)
@@ -24,6 +24,14 @@ void func_breakable_reset();
 void assault_objective_reset();
 void target_assault_roundend_reset();
 
+float next_round;
+float stopalivecheck;
+float redalive, bluealive, yellowalive, pinkalive;
+float totalalive;
+.float redalive_stat, bluealive_stat, yellowalive_stat, pinkalive_stat;
+float redspawned, bluespawned, yellowspawned, pinkspawned;
+float totalspawned;
+
 /**
  * Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
  * Sets the 'warmup' global variable.
@@ -39,6 +47,10 @@ void reset_map(float dorespawn)
                warmup = time + cvar("g_ca_warmup");
                allowed_to_spawn = 1;
        }
+       else if(g_freezetag)
+       {
+               warmup = time + cvar("g_freezetag_warmup");
+       }
 
        lms_lowest_lives = 999;
        lms_next_place = player_count;
@@ -46,7 +58,7 @@ void reset_map(float dorespawn)
        race_ReadyRestart();
 
        for(self = world; (self = nextent(self)); )
-       if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+       if(clienttype(self) == CLIENTTYPE_NOTACLIENT && self.items != IT_STRENGTH && self.items != IT_INVINCIBLE) // don't respawn strength or shield, that will only lead to them spawning very early each match
        {
                if(self.reset)
                {
@@ -92,6 +104,11 @@ void reset_map(float dorespawn)
                                self.classname = "player";
                                PutClientInServer();
                        }
+                       else if(g_freezetag)
+                       {
+                               if(self.classname == "player")
+                                       PutClientInServer();
+                       }
                        else
                        {
                                /*
@@ -191,8 +208,9 @@ void Arena_Warmup()
 {
        float f;
        string msg;
+    entity e;
 
-       if((!g_arena && !g_ca) || (g_arena && !arena_roundbased) || (time < game_starttime))
+       if((!g_arena && !g_ca && !g_freezetag) || (g_arena && !arena_roundbased) || (time < game_starttime))
                return;
 
        f = ceil(warmup - time);
@@ -228,7 +246,8 @@ void Arena_Warmup()
                        else if(f == 1)
                                Announce("1");
 
-                       centerprint(self, msg);
+            FOR_EACH_PLAYER(e)
+                centerprint(e, msg);
                }
 
                if (g_arena) {
@@ -251,19 +270,104 @@ void Arena_Warmup()
                if(g_ca) {
                        ca_players = 0;
 
-                       FOR_EACH_PLAYER(self)
+            FOR_EACH_PLAYER(e)
                                ca_players += 1;
                }
+
+        if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE)
+            self.movetype = MOVETYPE_WALK;
+       }
+}
+
+void count_spawned_players()
+{
+       // TODO fix "*spawned" name, it should rather be "*players" or so
+       // not doing this now to prevent merge hell with Tag
+       // fix after merging with Tag
+
+       // count amount of players in each team
+       totalspawned = redspawned = bluespawned = yellowspawned = pinkspawned = 0;
+       FOR_EACH_PLAYER(self) {
+               if (self.team == COLOR_TEAM1)
+               {
+                       redspawned += 1;
+                       totalspawned += 1;
+               }
+               else if (self.team == COLOR_TEAM2)
+               {
+                       bluespawned += 1;
+                       totalspawned += 1;
+               }
+               else if (self.team == COLOR_TEAM3)
+               {
+                       yellowspawned += 1;
+                       totalspawned += 1;
+               }
+               else if (self.team == COLOR_TEAM4)
+               {
+                       pinkspawned += 1;
+                       totalspawned += 1;
+               }
+       }
+}
+
+void count_alive_players()
+{
+       totalalive = redalive = bluealive = yellowalive = pinkalive = 0;
+       if(g_ca)
+       {
+               FOR_EACH_PLAYER(self) {
+                       if (self.team == COLOR_TEAM1 && self.health >= 1)
+                       {
+                               redalive += 1;
+                               totalalive += 1;
+                       }
+                       else if (self.team == COLOR_TEAM2 && self.health >= 1)
+                       {
+                               bluealive += 1;
+                               totalalive += 1;
+                       }
+               }
+               FOR_EACH_PLAYER(self) {
+                       self.redalive_stat = redalive;
+                       self.bluealive_stat = bluealive;
+               }
+       }
+       else if(g_freezetag)
+       {
+               // count amount of alive players in each team
+               FOR_EACH_PLAYER(self) {
+                       if (self.team == COLOR_TEAM1 && self.freezetag_frozen == 0 && self.health >= 1)
+                       {
+                               redalive += 1;
+                               totalalive += 1;
+                       }
+                       else if (self.team == COLOR_TEAM2 && self.freezetag_frozen == 0 && self.health >= 1)
+                       {
+                               bluealive += 1;
+                               totalalive += 1;
+                       }
+                       else if (self.team == COLOR_TEAM3 && self.freezetag_frozen == 0 && self.health >= 1)
+                       {
+                               yellowalive += 1;
+                               totalalive += 1;
+                       }
+                       else if (self.team == COLOR_TEAM4 && self.freezetag_frozen == 0 && self.health >= 1)
+                       {
+                               pinkalive += 1;
+                               totalalive += 1;
+                       }
+               }
+               FOR_EACH_PLAYER(self) {
+                       self.redalive_stat = redalive;
+                       self.bluealive_stat = bluealive;
+                       self.yellowalive_stat = yellowalive;
+                       self.pinkalive_stat = pinkalive;
+               }
        }
 
-       if(self.classname == "player" && self.health > 0)
-               self.movetype = MOVETYPE_WALK;
 }
 
-float next_round;
-float stopalivecheck;
-float redalive, bluealive;
-.float redalive_stat, bluealive_stat;
 /**
  * This function finds out whether an arena round is over 1 player is left.
  * It determines the last player who's still alive and saves it's entity reference
@@ -273,33 +377,15 @@ float redalive, bluealive;
  */
 void Spawnqueue_Check()
 {
-       if(g_ca) // we want to perform this before the return block below...
+       count_spawned_players();
+       if(g_ca || g_freezetag) // we want to perform this before the return block below (CA)...
        {
-               // this is STUPID to perform again, but has to be done so that we can give instant feedback when a round ends
-               // and so the code won't start searching for a champion using find() before all players are actually REMOVED
-               redalive = 0; bluealive = 0;
-               FOR_EACH_PLAYER(self) {
-                       if (self.team == COLOR_TEAM1 && self.health >= 1) redalive += 1;
-                       else if (self.team == COLOR_TEAM2 && self.health >= 1) bluealive += 1;
-               }
-               // as if the above stuff wasn't stupid enough, let's run it a third time! :D
-               // (so that we can send redalive/bluealive as a stat)
-               FOR_EACH_PLAYER(self) {
-                       self.redalive_stat = redalive;
-                       self.bluealive_stat = bluealive;
-               }
+               count_alive_players();
        }
-       if(time < warmup + 1 || inWarmupStage)
+       if(time < warmup + 1 || inWarmupStage || intermission_running)
                return;
 
        if(g_ca) {
-               // check the amount of spawned players in each team
-               float redspawned, bluespawned;
-               FOR_EACH_PLAYER(self) {
-                       if (self.team == COLOR_TEAM1) redspawned += 1;
-                       else if (self.team == COLOR_TEAM2) bluespawned += 1;
-               }
-
                required_ca_players = max(2, fabs(cvar("bot_vs_human") + 1));
 
                if(ca_players < required_ca_players && (redspawned && bluespawned)) {
@@ -348,6 +434,12 @@ void Spawnqueue_Check()
                        next_round = 0;
                        reset_map(TRUE);
                }
+       } else if(g_freezetag) {
+               if((next_round && next_round < time))
+               {
+                       next_round = 0;
+                       reset_map(TRUE);
+               }
        } else { // arena
                //extend next_round if it isn't set yet and only 1 player is spawned
                if(!next_round)
index 3575d563293d4d6c20261bc5b7e4606ca576142e..0d7da73572a3083af09aff6a296b55afbe4fabf2 100644 (file)
@@ -92,6 +92,17 @@ void assault_objective_decrease_use() {
 
                        oldself = self;
                        self = oldself.enemy;
+                               if(self.message)
+                               {
+                                       entity player;
+                                       string s;
+                                       FOR_EACH_PLAYER(player)
+                                       {
+                                               s = strcat(self.message, "\n");
+                                               centerprint(player, s);
+                                       }
+                               }
+                                       
                                oldactivator = activator;
                                activator = oldself;
                                        SUB_UseTargets();
index d1c9a5a402fb4d684984795e8a019793744dc66c..e6950dd3e4ebc472a4e59b10244ce9432f5cdd61 100644 (file)
@@ -109,6 +109,10 @@ float bot_shouldattack(entity e)
                        return FALSE;
        }
 
+       if(g_freezetag)
+               if(e.freezetag_frozen)
+                       return FALSE;
+
        if(teams_matter)
        {
                if(e.team==0)
index d2f6b900084fa685cfcf126bc54b2bb656d48d91..1e9231b6a12b853d211f69ee683ab2ae0b41c0e7 100644 (file)
@@ -274,6 +274,24 @@ void havocbot_role_race()
        }
 };
 
+// Keepaway
+// If you don't have the ball, get it; if you do, kill people.
+void havocbot_role_ka()
+{
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (self.bot_strategytime < time)
+       {
+               self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+}
+
 void havocbot_chooserole_dm()
 {
        self.havocbot_role = havocbot_role_dm;
@@ -289,6 +307,11 @@ void havocbot_chooserole_dom()
        self.havocbot_role = havocbot_role_dom;
 };
 
+void havocbot_chooserole_ka()
+{
+       self.havocbot_role = havocbot_role_ka;
+}
+
 void havocbot_chooserole()
 {
        dprint("choosing a role...\n");
@@ -304,6 +327,8 @@ void havocbot_chooserole()
                havocbot_chooserole_race();
        else if (g_onslaught)
                havocbot_chooserole_ons();
+       else if (g_keepaway)
+               havocbot_chooserole_ka();
        else // assume anything else is deathmatch
                havocbot_chooserole_dm();
 };
index 2985b45b41262b4f9ac4ed51749d34323203a639..a1a8c4f900ad0a959e5993c09746868d8cb955a1 100644 (file)
@@ -603,10 +603,16 @@ void PutObserverInServer (void)
 
        Portal_ClearAll(self);
 
+       if(self.alivetime)
+       {
+               PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+               self.alivetime = 0;
+       }
+
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
 
-       if(self.ballcarried)
+       if(self.ballcarried && g_nexball)
                DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
 
        WaypointSprite_PlayerDead();
@@ -1074,6 +1080,9 @@ void PutClientInServer (void)
                self.switchweapon = w_getbestweapon(self);
                self.cnt = self.switchweapon;
                self.weapon = 0;
+
+               if(!self.alivetime)
+                       self.alivetime = time;
        } else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) {
                PutObserverInServer ();
        }
@@ -1338,6 +1347,10 @@ void ClientKill (void)
        {
                // do nothing
        }
+    else if(g_freezetag && self.freezetag_frozen == 1)
+    {
+        // do nothing
+    }
        else
                ClientKill_TeamChange(0);
 }
@@ -1701,6 +1714,8 @@ void ClientConnect (void)
        send_CSQC_cr_maxbullets(self);
 
        CheatInitClient();
+
+       PlayerStats_AddPlayer(self);
 }
 
 /*
@@ -1721,6 +1736,8 @@ void ClientDisconnect (void)
                return;
        }
 
+       PlayerStats_AddGlobalInfo(self);
+
        CheatShutdownClient();
 
        if(self.hitplotfh >= 0)
@@ -1753,7 +1770,7 @@ void ClientDisconnect (void)
 
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
-       if(self.ballcarried)
+       if(self.ballcarried && g_nexball)
                DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
 
        // Here, everything has been done that requires this player to be a client.
@@ -1987,6 +2004,9 @@ string getTimeoutText(float addOneSecond) {
 
 void player_powerups (void)
 {
+       // add a way to see what the items were BEFORE all of these checks for the mutator hook
+       olditems = self.items;
+       
        if((self.items & IT_USING_JETPACK) && !self.deadflag)
        {
                SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, cvar("g_jetpack_attenuation"));
@@ -2049,64 +2069,67 @@ void player_powerups (void)
                                sprint(self, "^3You are on speed\n");
                        }
                }
-               return;
        }
-
-       if (self.items & IT_STRENGTH)
+       else // if we're not in minstagib, continue. I added this else to replace the "return" which was here that broke the callhook for this function -- This code is nasty.
        {
-               play_countdown(self.strength_finished, "misc/poweroff.wav");
-               self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
-               if (time > self.strength_finished && cvar("g_balance_powerup_timer"))
+               if (self.items & IT_STRENGTH)
                {
-                       self.items = self.items - (self.items & IT_STRENGTH);
-                       sprint(self, "^3Strength has worn off\n");
+                       play_countdown(self.strength_finished, "misc/poweroff.wav");
+                       self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
+                       if (time > self.strength_finished && cvar("g_balance_powerup_timer"))
+                       {
+                               self.items = self.items - (self.items & IT_STRENGTH);
+                               sprint(self, "^3Strength has worn off\n");
+                       }
                }
-       }
-       else
-       {
-               if (time < self.strength_finished)
+               else
                {
-                       self.items = self.items | IT_STRENGTH;
-                       sprint(self, "^3Strength infuses your weapons with devastating power\n");
+                       if (time < self.strength_finished)
+                       {
+                               self.items = self.items | IT_STRENGTH;
+                               sprint(self, "^3Strength infuses your weapons with devastating power\n");
+                       }
                }
-       }
-       if (self.items & IT_INVINCIBLE)
-       {
-               play_countdown(self.invincible_finished, "misc/poweroff.wav");
-               self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
-               if (time > self.invincible_finished && cvar("g_balance_powerup_timer"))
+               if (self.items & IT_INVINCIBLE)
                {
-                       self.items = self.items - (self.items & IT_INVINCIBLE);
-                       sprint(self, "^3Shield has worn off\n");
+                       play_countdown(self.invincible_finished, "misc/poweroff.wav");
+                       self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
+                       if (time > self.invincible_finished && cvar("g_balance_powerup_timer"))
+                       {
+                               self.items = self.items - (self.items & IT_INVINCIBLE);
+                               sprint(self, "^3Shield has worn off\n");
+                       }
                }
-       }
-       else
-       {
-               if (time < self.invincible_finished)
+               else
                {
-                       self.items = self.items | IT_INVINCIBLE;
-                       sprint(self, "^3Shield surrounds you\n");
+                       if (time < self.invincible_finished)
+                       {
+                               self.items = self.items | IT_INVINCIBLE;
+                               sprint(self, "^3Shield surrounds you\n");
+                       }
                }
-       }
 
-       if(cvar("g_nodepthtestplayers"))
-               self.effects = self.effects | EF_NODEPTHTEST;
+               if(cvar("g_nodepthtestplayers"))
+                       self.effects = self.effects | EF_NODEPTHTEST;
 
-       if(cvar("g_fullbrightplayers"))
-               self.effects = self.effects | EF_FULLBRIGHT;
+               if(cvar("g_fullbrightplayers"))
+                       self.effects = self.effects | EF_FULLBRIGHT;
 
-       // midair gamemode: damage only while in the air
-       // if in midair mode, being on ground grants temporary invulnerability
-       // (this is so that multishot weapon don't clear the ground flag on the
-       // first damage in the frame, leaving the player vulnerable to the
-       // remaining hits in the same frame)
-       if (self.flags & FL_ONGROUND)
-       if (g_midair)
-               self.spawnshieldtime = max(self.spawnshieldtime, time + cvar("g_midair_shieldtime"));
+               // midair gamemode: damage only while in the air
+               // if in midair mode, being on ground grants temporary invulnerability
+               // (this is so that multishot weapon don't clear the ground flag on the
+               // first damage in the frame, leaving the player vulnerable to the
+               // remaining hits in the same frame)
+               if (self.flags & FL_ONGROUND)
+               if (g_midair)
+                       self.spawnshieldtime = max(self.spawnshieldtime, time + cvar("g_midair_shieldtime"));
 
-       if (time >= game_starttime)
-       if (time < self.spawnshieldtime)
-               self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
+               if (time >= game_starttime)
+               if (time < self.spawnshieldtime)
+                       self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
+       }
+       
+       MUTATOR_CALLHOOK(PlayerPowerups);
 }
 
 float CalcRegen(float current, float stable, float regenfactor, float regenframetime)
@@ -3042,7 +3065,7 @@ void PlayerPostThink (void)
 
        playerdemo_write();
 
-       if((g_cts || g_race) && self.cvar_cl_allow_uid2name)
+       if((g_cts || g_race) && self.cvar_cl_allow_uid2name == 1)
        {
                if(!self.stored_netname)
                        self.stored_netname = strzone(uid2name(self.crypto_idfp));
index e9d1932302f737db6d350019ef9b7300190ce045..b852e3f05b8652b6c35a242148167f2180034156 100644 (file)
@@ -46,6 +46,9 @@ When you press the jump key
 */
 void PlayerJump (void)
 {
+       if(g_freezetag && self.freezetag_frozen)
+               return; // no jumping in freezetag when frozen
+
        float mjumpheight;
        float doublejump;
 
@@ -690,8 +693,12 @@ void SV_PlayerPhysics()
        maxspd_mod = 1;
        if(g_minstagib && (self.items & IT_INVINCIBLE))
                maxspd_mod *= cvar("g_minstagib_speed_highspeed");
-       if(g_nexball && self.ballcarried)
-               maxspd_mod *= cvar("g_nexball_basketball_carrier_highspeed");
+       if(self.ballcarried)
+               if(g_nexball)
+                       maxspd_mod *= cvar("g_nexball_basketball_carrier_highspeed");
+               else if(g_keepaway)
+                       maxspd_mod *= cvar("g_keepaway_ballcarrier_highspeed");
+
        if(g_runematch)
        {
                if(self.runes & RUNE_SPEED)
index a2943a76053e61e6e873e951594bfa7bd1898feb..f8acd05036ae9d7acb3982fed0502a7017598061 100644 (file)
@@ -386,6 +386,8 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
 }
 
 void ClientKill_Now_TeamChange();
+void freezetag_CheckWinner();
+void freezetag_Unfreeze();
 
 void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
@@ -455,7 +457,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        damage_take = take;
        damage_save = save;
        damage_force = force;
-       MUTATOR_CALLHOOK(PlayerDamage);
+       MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor);
        take = bound(0, damage_take, self.health);
        save = bound(0, damage_save, self.armorvalue);
 
@@ -567,6 +569,12 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                float defer_ClientKill_Now_TeamChange;
                defer_ClientKill_Now_TeamChange = FALSE;
 
+               if(self.alivetime)
+               {
+                       PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+                       self.alivetime = 0;
+               }
+
                if(valid_damage_for_weaponstats)
                        WeaponStats_LogKill(DEATH_WEAPONOF(deathtype), self.weapon);
 
@@ -595,22 +603,37 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        }
                }
 
-               // become fully visible
-               self.alpha = 1;
-               // clear selected player display
-               ClearSelectedPlayer();
-               // throw a weapon
-               SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+               if(!g_freezetag)
+               {
+                       // become fully visible
+                       self.alpha = 1;
+                       // clear selected player display
+                       ClearSelectedPlayer();
+                       // throw a weapon
+                       SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+               }
+
                // print an obituary message
                Obituary (attacker, inflictor, self, deathtype);
                race_PreDie();
                DropAllRunes(self);
 
+               if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
+               {
+                       PutClientInServer();
+                       count_alive_players(); // re-count players
+                       freezetag_CheckWinner();
+                       return;
+               }
+
                frag_attacker = attacker;
                frag_inflictor = inflictor;
                frag_target = self;
                MUTATOR_CALLHOOK(PlayerDies);
 
+               if(g_freezetag)
+            return;
+
                if(self.flagcarried)
                {
                        if(attacker.classname != "player" && attacker.classname != "gib")
@@ -620,7 +643,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        else
                                DropFlag(self.flagcarried, world, attacker);
                }
-               if(self.ballcarried)
+               if(self.ballcarried && g_nexball)
                        DropBall(self.ballcarried, self.origin, self.velocity);
                Portal_ClearAllLater(self);
                // clear waypoints
index 477b641ba7e61d21ba7d28989827ccbe20a5ef8a..5b765396c4641aa847b5aacd2c20f3dc395d726f 100644 (file)
@@ -310,7 +310,10 @@ void W_WeaponFrame()
        if (frametime)
                self.weapon_frametime = frametime;
 
-       if(((arena_roundbased || g_ca) && time < warmup) || ((time < game_starttime) && !cvar("sv_ready_restart_after_countdown")))
+       if(((arena_roundbased || g_ca || g_freezetag) && time < warmup) || ((time < game_starttime) && !cvar("sv_ready_restart_after_countdown")))
+               return;
+
+       if(g_freezetag && self.freezetag_frozen == 1)
                return;
 
        if (!self.weaponentity || self.health < 1)
index e221911d30aaa6f8a056c274e22e01052ba30493..1a46ed8b51deccbc0925641996bfa6da6bfbc553 100644 (file)
@@ -213,7 +213,7 @@ void SV_ParseClientCommand(string s) {
                if(self.classname == "player" && cvar("sv_spectate") == 1) {
                        if(self.flagcarried)
                                DropFlag(self.flagcarried, world, world);
-                       if(self.ballcarried)
+                       if(self.ballcarried && g_nexball)
                                DropBall(self.ballcarried, self.origin, self.velocity);
                        WaypointSprite_PlayerDead();
                        self.classname = "observer";
index 690231b605c90b0728e4d99f24d4fe040324a94f..a6d31ca57a01da68d842917532ca8aa7686d0fc4 100644 (file)
@@ -171,11 +171,6 @@ void place_flag()
                return;
        }
 
-       if(!self.t_width)
-               self.t_width = 0.1; // frame animation rate
-       if(!self.t_length)
-               self.t_length = 58; // maximum frame
-
        setattachment(self, world, "");
        self.mdl = self.model;
        self.flags = FL_ITEM;
@@ -339,19 +334,6 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
                dprint("FLAG FALLTHROUGH will happen SOON\n");
 };
 
-void AnimateFlag()
-{
-       if(self.delay > time)
-               return;
-       self.delay = time + self.t_width;
-       if(self.nextthink > self.delay)
-               self.nextthink = self.delay;
-
-       self.frame = self.frame + 1;
-       if(self.frame > self.t_length)
-               self.frame = 0;
-}
-
 void FlagThink()
 {
        local entity e;
@@ -373,8 +355,6 @@ void FlagThink()
                        ctf_captureshield_update(e, 1); // release shield only
        }
 
-       AnimateFlag();
-
        if(self.speedrunning)
        if(self.cnt == FLAG_CARRY)
        {
index a0718d839a69b2530b29d9a3b6b7125e0f6de1c1..381543fae3b9aa38110085740fc688e253a85584 100644 (file)
@@ -17,7 +17,7 @@ float require_spawnfunc_prefix; // if this float exists, only functions with spa
 
 float ctf_score_value(string parameter);
 
-float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts;
+float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts, g_freezetag, g_keepaway;
 float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_minstagib_invis_alpha, g_bloodloss;
 float g_warmup_limit;
 float g_warmup_allguns;
@@ -263,7 +263,8 @@ float blockSpectators; //if set, new or existing spectators or observers will be
 void checkSpectatorBlock();
 
 .float winning;
-.float jointime;
+.float jointime; // time of joining
+.float alivetime; // time of being alive
 
 float isJoinAllowed();
 #define PREVENT_JOIN_TEXT "^1You may not join the game at this time.\n\nThe player limit reached maximum capacity."
@@ -554,8 +555,8 @@ void target_voicescript_clear(entity pl);
 .string target4;
 .float trigger_reverse;
 
-// Nexball
-.entity ballcarried;
+// Nexball 
+.entity ballcarried; // Also used for keepaway
 .float metertime;
 float g_nexball_meter_period;
 
@@ -653,3 +654,7 @@ float allowed_to_spawn; // boolean variable used by the clan arena code to deter
 float serverflags;
 
 .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
+
+.float freezetag_frozen;
+.float freezetag_beginrevive_time;
+.float freezetag_revive_progress;
index 387514be45194dabb3d9337de29da5a30f45f295..fd5b445eba8664746b8ad43f64738e3ad0534fd7 100644 (file)
@@ -120,12 +120,14 @@ void GiveFrags (entity attacker, entity targ, float f)
                {
                        // teamkill
                        PlayerScore_Add(attacker, SP_KILLS, -1); // or maybe add a teamkills field?
+                       PlayerStats_Event(attacker, PLAYERSTATS_KILLS, -1);
                }
        }
        else
        {
                // regular frag
                PlayerScore_Add(attacker, SP_KILLS, 1);
+               PlayerStats_Event(attacker, PLAYERSTATS_KILLS, 1);
        }
 
        PlayerScore_Add(targ, SP_DEATHS, 1);
@@ -623,7 +625,17 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        force = force * g_weaponforcefactor;
                        mirrorforce *= g_weaponforcefactor;
                }
-
+               
+               // should this be changed at all? If so, in what way?
+               frag_attacker = attacker;
+               frag_target = targ;
+               frag_damage = damage;
+               frag_force = force;
+        frag_deathtype = deathtype;
+               MUTATOR_CALLHOOK(PlayerDamage_Calculate);
+               damage = frag_damage;
+               force = frag_force;
+               
                // apply strength multiplier
                if ((attacker.items & IT_STRENGTH) && !g_minstagib)
                {
index 4628aef459f4a798df89dcb2868c972a0ff225f6..9a3c3614a25de91e4bab9259f6e5e142431c12cb 100644 (file)
@@ -329,6 +329,7 @@ void cvar_changes_init()
                BADCVAR("g_runematch");
                BADCVAR("g_tdm");
                BADCVAR("g_nexball");
+               BADCVAR("g_keepaway");
                BADCVAR("teamplay");
 
                // long
@@ -809,11 +810,19 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
        addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_charge_pool_ammo);
 
-       if(g_ca)
+       if(g_ca || g_freezetag)
        {
                addstat(STAT_REDALIVE, AS_INT, redalive_stat);
                addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
+               addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat);
+               addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat);
        }
+       if(g_freezetag)
+       {
+               addstat(STAT_FROZEN, AS_INT, freezetag_frozen);
+               addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress);
+       }
+
        // g_movementspeed hack
        addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
        addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed);
@@ -897,6 +906,8 @@ void spawnfunc_worldspawn (void)
                cvar_set("sv_curl_serverpackages", substring(s, 1, -1));
        }
 
+       PlayerStats_Init();
+
        world_initialized = 1;
 }
 
@@ -1397,12 +1408,13 @@ RULES
 
 void DumpStats(float final)
 {
-       local float file;
-       local string s;
-       local float to_console;
-       local float to_eventlog;
-       local float to_file;
-       local float i;
+       float file;
+       string s;
+       float to_console;
+       float to_eventlog;
+       float to_file;
+       float i;
+       entity e;
 
        to_console = cvar("sv_logscores_console");
        to_eventlog = cvar("sv_eventlog");
@@ -1497,6 +1509,11 @@ void DumpStats(float final)
                fputs(file, ":end\n");
                fclose(file);
        }
+
+       // send statistics
+       FOR_EACH_CLIENT(e)
+               PlayerStats_AddGlobalInfo(e);
+       PlayerStats_Shutdown();
 }
 
 void FixIntermissionClient(entity e)
@@ -2718,6 +2735,10 @@ void MapVote_Start()
        if(mapvote_run)
                return;
 
+       // wait for stats to be sent first
+       if(!playerstats_waitforme)
+               return;
+
        MapInfo_Enumerate();
        if(MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1))
                mapvote_run = TRUE;
@@ -2892,6 +2913,8 @@ void RestoreGame()
 
 void SV_Shutdown()
 {
+       entity e;
+
        if(gameover > 1) // shutting down already?
                return;
 
@@ -2902,6 +2925,11 @@ void SV_Shutdown()
                world_initialized = 0;
                print("Saving persistent data...\n");
                Ban_SaveBans();
+
+               FOR_EACH_CLIENT(e)
+                       PlayerStats_AddGlobalInfo(e);
+               PlayerStats_Shutdown();
+
                if(!cheatcount_total)
                {
                        if(cvar("sv_db_saveasdump"))
index 25222a38f7a43a70fbacca9a39c63182a9b889e5..cb74c8d3a8a926148704766a302c6ab9004284b1 100644 (file)
@@ -2027,11 +2027,12 @@ float WarpZone_Projectile_Touch_ImpactFilter_Callback()
 }
 #define PROJECTILE_TOUCH if(WarpZone_Projectile_Touch()) return
 
-float MAX_IPBAN_URIS = 16;
-
-float URI_GET_DISCARD   = 0;
-float URI_GET_IPBAN     = 1;
-float URI_GET_IPBAN_END = 16;
+float MAX_IPBAN_URIS           = 16;
+                              
+float URI_GET_DISCARD          = 0;
+float URI_GET_IPBAN            = 1;
+float URI_GET_IPBAN_END        = 16;
+float URI_GET_PLAYERSTATS_SENT = 17;
 
 void URI_Get_Callback(float id, float status, string data)
 {
@@ -2048,6 +2049,10 @@ void URI_Get_Callback(float id, float status, string data)
         // online ban list
         OnlineBanList_URI_Get_Callback(id, status, data);
     }
+    else if (id == URI_GET_PLAYERSTATS_SENT)
+    {
+        PlayerStats_Sent_URI_Get_Callback(id, status, data);
+    }
     else
     {
         print("Received HTTP request data for an invalid id ", ftos(id), ".\n");
index fdfbdfb1223d2c3bfc9111b584c85ce2decc368d..b7c523dcbbfd0853c80bab058559b380fb104f0d 100644 (file)
@@ -119,13 +119,30 @@ MUTATOR_HOOKABLE(EditProjectile);
                entity self;
                entity other;
 
-MUTATOR_HOOKABLE(PlayerDamage);
+MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor);
        // called when a player gets damaged to e.g. remove stuff he was carrying.
        // INPUT:
                entity frag_inflictor;
                entity frag_attacker;
                entity frag_target; // same as self
-               vector damage_force; // NOTE: this force already HAS been applied (create and use a Damage hook to change that one)
+               vector damage_force; // NOTE: this force already HAS been applied
        // INPUT, OUTPUT:
                float damage_take;
                float damage_save;
+               
+MUTATOR_HOOKABLE(PlayerDamage_Calculate);
+       // called to adjust damage and force values which are applied to the player, used for e.g. strength damage/force multiplier or runematch runes
+       // i'm not sure if I should change this around slightly (Naming of the entities, and also how they're done in g_damage).
+       // INPUT:
+               entity frag_attacker;
+               entity frag_target;
+               float frag_deathtype;
+       // INPUT, OUTPUT:
+               float frag_damage;
+               vector frag_force;
+
+MUTATOR_HOOKABLE(PlayerPowerups);
+       // called at the end of player_powerups() in cl_client.qc, used for manipulating the values which are set by powerup items.
+       // INPUT
+       entity self;
+       float olditems; // also technically output, but since it is at the end of the function it's useless for that :P 
diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc
new file mode 100644 (file)
index 0000000..790c9d0
--- /dev/null
@@ -0,0 +1,299 @@
+void freezetag_Initialize()
+{
+       precache_model("models/ice/ice.md3");
+       warmup = time + cvar("g_start_delay") + cvar("g_freezetag_warmup");
+}
+
+void freezetag_CheckWinner()
+{
+       if(time <= game_starttime) // game didn't even start yet! nobody can win in that case.
+               return;
+
+       if(next_round || (time > warmup - cvar("g_freezetag_warmup") && time < warmup))
+               return; // already waiting for next round to start
+
+       if((redalive >= 1 && bluealive >= 1) // counted in arena.qc
+               || (redalive >= 1 && yellowalive >= 1)
+               || (redalive >= 1 && pinkalive >= 1)
+               || (bluealive >= 1 && yellowalive >= 1)
+               || (bluealive >= 1 && pinkalive >= 1)
+               || (yellowalive >= 1 && pinkalive >= 1))
+               return; // we still have active players on two or more teams, nobody won yet
+
+       entity e, winner;
+       string teamname;
+
+       FOR_EACH_PLAYER(e)
+       {
+               if(e.freezetag_frozen == 0 && e.classname == "player" && e.health >= 1) // here's one player from the winning team... good
+               {
+                       winner = e;
+                       break; // break, we found the winner
+               }
+       }
+
+       if(winner != world) // just in case a winner wasn't found
+       {
+               TeamScore_AddToTeam(winner.team, ST_SCORE, +1);
+               if(winner.team == COLOR_TEAM1)
+                       teamname = "^1Red Team";
+               else if(winner.team == COLOR_TEAM2)
+                       teamname = "^4Blue Team";
+               else if(winner.team == COLOR_TEAM3)
+                       teamname = "^3Yellow Team";
+               else
+                       teamname = "^6Pink Team";
+               FOR_EACH_PLAYER(e) {
+                       centerprint(e, strcat(teamname, "^5 wins the round, all other teams were frozen.\n"));
+               }
+               bprint(teamname, "^5 wins the round since all the other teams were frozen.\n");
+       }
+
+       next_round = time + 5;
+}
+
+void freezetag_Ice_Think()
+{
+       setorigin(self, self.owner.origin - '0 0 16');
+       self.nextthink = time;
+}
+
+void freezetag_Freeze()
+{
+       self.freezetag_frozen = 1;
+
+       entity ice;
+       ice = spawn();
+       ice.owner = self;
+       ice.classname = "freezetag_ice";
+       ice.think = freezetag_Ice_Think;
+       ice.nextthink = time;
+       ice.frame = floor(random() * 21); // ice model has 20 different looking frames
+       setmodel(ice, "models/ice/ice.md3");
+
+       self.movement = '0 0 0';
+
+       // add waypoint
+       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
+       if(self.waypointsprite_attached)
+       {
+               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
+       }
+}
+
+void freezetag_Unfreeze()
+{
+       self.freezetag_frozen = 0;
+
+       // remove the ice block
+       entity ice;
+       for(ice = world; (ice = find(ice, classname, "freezetag_ice")); ) if(ice.owner == self)
+       {
+               remove(ice);
+               break;
+       }
+
+       // remove waypoint
+       if(self.waypointsprite_attached)
+               WaypointSprite_Kill(self.waypointsprite_attached);
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
+{
+       if(self.freezetag_frozen == 0)
+       {
+               if(self.team == COLOR_TEAM1)
+                       --redalive;
+               else if(self.team == COLOR_TEAM2)
+                       --bluealive;
+               else if(self.team == COLOR_TEAM3)
+                       --yellowalive;
+               else if(self.team == COLOR_TEAM4)
+                       --pinkalive;
+               --totalalive;
+       }
+
+       if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
+               freezetag_CheckWinner();
+
+       freezetag_Unfreeze();
+
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
+{
+       if(self.freezetag_frozen == 0)
+       {
+               if(self.team == COLOR_TEAM1)
+                       --redalive;
+               else if(self.team == COLOR_TEAM2)
+                       --bluealive;
+               else if(self.team == COLOR_TEAM3)
+                       --yellowalive;
+               else if(self.team == COLOR_TEAM4)
+                       --pinkalive;
+               --totalalive;
+
+        freezetag_Freeze();
+       }
+
+    if(frag_attacker.classname == STR_PLAYER)
+        centerprint(frag_attacker, strcat("^2You froze ^7", frag_target.netname, ".\n"));
+
+       if(frag_attacker == frag_target || frag_attacker == world)
+       {
+        if(frag_target.classname == STR_PLAYER)
+            centerprint(frag_target, "^1You froze yourself.\n");
+               bprint("^7", frag_target.netname, "^1 froze himself.\n");
+       }
+       else
+       {
+        if(frag_target.classname == STR_PLAYER)
+            centerprint(frag_target, strcat("^1You were frozen by ^7", frag_attacker.netname, ".\n"));
+               bprint("^7", frag_target.netname, "^1 was frozen by ^7", frag_attacker.netname, ".\n");
+       }
+
+       frag_target.health = cvar("g_balance_health_start"); // "respawn" the player :P
+
+       freezetag_CheckWinner();
+
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
+{
+    freezetag_Unfreeze(); // start by making sure that all ice blocks are removed
+
+       if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately
+       if(!next_round && warmup && (time < warmup - cvar("g_freezetag_warmup") || time > warmup)) // not awaiting next round
+       {
+               next_round = time;
+               return 1;
+       }
+       if(warmup && time > warmup) // spawn too late, freeze player
+       {
+               centerprint(self, "^1You spawned after the round started, you'll spawn as frozen.\n");
+               freezetag_Freeze();
+       }
+
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill)
+{
+       frag_score = 0; // no frags counted in Freeze Tag
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
+{
+    vector revive_extra_size;
+    revive_extra_size = '1 1 1' * cvar("g_freezetag_revive_extra_size");
+
+    float teammate_nearby;
+    FOR_EACH_PLAYER(other) if(self != other)
+    {
+        if(other.freezetag_frozen == 0)
+        {
+            if(other.team == self.team)
+            {
+                teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
+                if(teammate_nearby)
+                    break;
+            }
+        }
+    }
+
+    if(teammate_nearby && self.freezetag_frozen == 1) // OK, there is at least one teammate reviving us
+    {
+        if(self.freezetag_beginrevive_time == -9999) // initialize values if this is the first frame of revival
+        {
+            self.freezetag_beginrevive_time = time;
+            self.freezetag_revive_progress = 0;
+        }
+        else
+        {
+            self.freezetag_revive_progress = (time - self.freezetag_beginrevive_time) / cvar("g_freezetag_revive_time");
+            if(time - self.freezetag_beginrevive_time >= cvar("g_freezetag_revive_time"))
+            {
+                freezetag_Unfreeze();
+
+                centerprint(self, strcat("^5You were revived by ^7", other.netname, ".\n"));
+                centerprint(other, strcat("^5You revived ^7", self.netname, ".\n"));
+                bprint("^7", other.netname, "^5 revived ^7", self.netname, ".\n");
+
+                self.freezetag_beginrevive_time = -9999;
+                self.freezetag_revive_progress = 0;
+            }
+        }
+        // now find EVERY teammate within reviving radius, set their revive_progress values correct
+        FOR_EACH_PLAYER(other) if(self != other)
+        {
+            if(other.freezetag_frozen == 0)
+            {
+                if(other.team == self.team)
+                {
+                    teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
+                    if(teammate_nearby)
+                        other.freezetag_revive_progress = self.freezetag_revive_progress;
+                }
+            }
+        }
+    }
+    else if(!teammate_nearby) // only if no teammate is nearby will we reset
+    {
+        self.freezetag_beginrevive_time = -9999;
+        self.freezetag_revive_progress = 0;
+    }
+
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics)
+{
+       if(self.freezetag_frozen)
+               self.movement = '0 0 0';
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
+{
+    if(g_freezetag)
+    {
+        if(frag_target.freezetag_frozen == 1 && frag_deathtype != DEATH_HURTTRIGGER)
+        {
+            frag_damage = 0;
+            frag_force = frag_force * cvar("g_freezetag_frozen_force");
+        }
+    }
+    return 1;
+}
+
+MUTATOR_DEFINITION(gamemode_freezetag)
+{
+       MUTATOR_HOOK(MakePlayerObserver, freezetag_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ClientDisconnect, freezetag_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDies, freezetag_PlayerDies, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerSpawn, freezetag_PlayerSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY);
+
+       MUTATOR_ONADD
+       {
+               if(time > 1) // game loads at time 1
+                       error("This is a game type and it cannot be added at runtime.");
+               g_freezetag = 1;
+               freezetag_Initialize();
+       }
+
+       MUTATOR_ONREMOVE
+       {
+               g_freezetag = 0;
+               error("This is a game type and it cannot be removed at runtime.");
+       }
+
+       return 0;
+}
diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc
new file mode 100644 (file)
index 0000000..c771ab1
--- /dev/null
@@ -0,0 +1,354 @@
+void ka_SpawnBall(void);
+void ka_TouchEvent(void);
+void ka_RespawnBall(void);
+void ka_DropEvent(entity);
+
+float ka_ballcarrier_waypointsprite_visible_for_player(entity);
+
+void ka_Initialize() // run at the start of a match, initiates game mode
+{
+       if(!g_keepaway)
+               return;
+               
+       precache_sound("keepaway/pickedup.wav");
+       precache_sound("keepaway/dropped.wav");
+       precache_sound("keepaway/respawn.wav");
+       precache_sound("keepaway/touch.wav");
+
+       ScoreRules_keepaway();
+       ka_SpawnBall();
+}
+
+void ka_Reset() // used to clear the ballcarrier whenever the match switches from warmup to normal
+{
+       if(self.owner)
+               if(self.owner.classname == "player")
+                       ka_DropEvent(self.owner);
+
+       ka_RespawnBall();
+}
+
+void ka_SpawnBall() // loads various values for the ball
+{
+       if(!g_keepaway) { return; }
+       
+       entity e;
+       e = spawn();
+       e.model = "models/orbs/orbblue.md3";    
+       e.scale = 1;
+       precache_model(e.model);
+       setmodel(e, e.model);
+       setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off
+       e.classname = "keepawayball";
+       e.damageforcescale = cvar("g_keepawayball_damageforcescale");
+       e.takedamage = DAMAGE_YES;
+       e.glow_color = cvar("g_keepawayball_trail_color");
+       e.glow_trail = TRUE;
+       e.movetype = MOVETYPE_BOUNCE;
+       e.touch = ka_TouchEvent;
+       e.flags = FL_ITEM;
+       e.reset = ka_Reset;
+       e.owner = world;
+
+       InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. 
+}
+
+void ka_RespawnBall() // runs whenever the ball needs to be relocated
+{
+       vector oldballorigin = self.origin;
+
+       if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, 10, 1024, 256))
+       {
+               makevectors(self.angles);
+               self.movetype = MOVETYPE_BOUNCE;
+               self.velocity = '0 0 200';
+               self.angles = '0 0 0';
+               self.solid = SOLID_TRIGGER;
+               self.think = ka_RespawnBall;
+               self.nextthink = time + cvar("g_keepawayball_respawntime");
+               
+               pointparticles(particleeffectnum("electro_combo"), oldballorigin, '0 0 0', 1);
+               pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 1);
+
+               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
+               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+               WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);    
+
+               sound(self, CHAN_AUTO, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
+       }
+       else
+       {
+               ka_RespawnBall(); // finding a location failed, retry 
+       }
+}
+
+void ka_TouchEvent() // runs any time that the ball comes in contact with something
+{
+       if(!self) { return; }
+       if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+       { // The ball fell off the map, respawn it since players can't get to it
+               ka_RespawnBall();
+               return;
+       }
+       if(other.deadflag != DEAD_NO) { return; }
+       if(other.classname != "player") 
+       {  // The ball just touched an object, most likely the world
+               pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1);
+               sound(self, CHAN_AUTO, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
+               return; 
+       }
+       else if(self.wait > time) { return; }
+
+       // attach the ball to the player
+       self.owner = other;
+       other.ballcarried = self;
+       setattachment(self, other, "");
+       setorigin(self, '3 0 20');
+       
+       // make the ball invisible/unable to do anything
+       self.velocity = '0 0 0';
+       self.movetype = MOVETYPE_NONE;
+       self.touch = SUB_Null;
+       self.effects |= EF_NODRAW;
+       self.think = SUB_Null;
+       self.nextthink = 0;
+       self.takedamage = DAMAGE_NO;
+
+       // apply effects to player
+       other.glow_color = cvar("g_keepawayball_trail_color");
+       other.glow_trail = TRUE;
+       other.effects |= EF_DIMLIGHT;
+       other.alpha = cvar("g_keepaway_ballcarrier_alpha");
+       other.exteriorweaponentity.alpha = cvar("g_keepaway_ballcarrier_alpha");
+
+       // messages and sounds
+       Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
+       WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
+       WriteString(MSG_BROADCAST, strcat("\n\n", other.netname, "^7 has picked up the ball!\n"));
+       sound(self.owner, CHAN_AUTO, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
+       
+       // scoring
+       PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
+
+       // waypoints
+       WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+       other.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = ka_ballcarrier_waypointsprite_visible_for_player;
+       WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
+       WaypointSprite_Ping(other.waypointsprite_attachedforcarrier);   
+       WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
+}
+
+void ka_DropEvent(entity plyr) // runs any time that a player is supposed to lose the ball
+{
+       entity ball;
+       ball = plyr.ballcarried;
+
+       if(!ball) { return; }
+       
+       // reset the ball
+       setattachment(ball, world, "");
+       ball.movetype = MOVETYPE_BOUNCE;
+       ball.solid = SOLID_TRIGGER; // is this needed? 
+       ball.wait = time + 1; 
+       ball.think = ka_RespawnBall;
+       ball.nextthink = time + cvar("g_keepawayball_respawntime");
+       ball.touch = ka_TouchEvent;
+       ball.takedamage = DAMAGE_YES;
+       ball.effects &~= EF_NODRAW; 
+       setorigin(ball, plyr.origin + '0 0 10');
+       ball.velocity = '0 0 200' + '0 100 0'*crandom() + '100 0 0'*crandom();
+       ball.owner.ballcarried = world; // I hope nothing checks to see if the world has the ball in the rest of my code :P 
+       ball.owner = world;
+       
+       // reset the player effects
+       plyr.effects &~= EF_DIMLIGHT;
+       plyr.alpha = default_player_alpha;
+       plyr.exteriorweaponentity.alpha = default_weapon_alpha; 
+       plyr.glow_trail = FALSE;
+       
+       // messages and sounds
+       Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
+       WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
+       WriteString(MSG_BROADCAST, strcat("\n\n", plyr.netname, "^7 has dropped the ball!\n"));
+       sound(other, CHAN_AUTO, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE);   // ATTN_NONE (it's a sound intended to be heard anywhere) 
+       
+       // scoring
+       PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1);
+       
+       // waypoints
+       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+       WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+       WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);    
+       WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
+}
+
+float ka_ballcarrier_waypointsprite_visible_for_player(entity e) // runs on waypoints which are attached to ballcarriers, updates once per frame 
+{
+       if(e.ballcarried)
+       {
+               if(other.classname == "spectator") 
+                       return FALSE; // we don't want spectators of the ballcarrier to see the attached waypoint on the top of their screen
+               else if(g_minstagib && (e.items & IT_STRENGTH))
+                       return FALSE; // if the ballcarrier has invisibility, don't draw the waypoint as this is the function of invisibility in keepaway
+       }
+
+       return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(ka_RemovePlayer)
+{
+       if(self.ballcarried) { ka_DropEvent(self); } // a player with the ball has left the match, drop it
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_Scoring)
+{
+       if((frag_attacker != frag_target) && (frag_attacker.classname == "player"))
+       {
+               if(frag_target.ballcarried) { // add to amount of times killing carrier
+                       PlayerScore_Add(frag_attacker, SP_KEEPAWAY_CARRIERKILLS, 1);
+                       if(cvar("g_keepaway_bckillscore")) // add bckills to the score
+                               PlayerScore_Add(frag_attacker, SP_KEEPAWAY_SCORE, 1);
+               }
+               else if(!frag_attacker.ballcarried)
+                       if(cvar("g_keepaway_noncarrier_warn"))
+                               centerprint_atprio(frag_attacker, (CENTERPRIO_SPAM + 5), "Killing people while you don't have the ball gives no points!");
+
+               if(frag_attacker.ballcarried) // add to amount of kills while ballcarrier
+                       PlayerScore_Add(frag_attacker, SP_KEEPAWAY_SCORE, 1);
+       }
+
+       if(self.ballcarried) { ka_DropEvent(self); } // a player with the ball has died, drop it
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_GiveFragsForKill)
+{
+       frag_score = 0; // no frags counted in keepaway
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerPreThink)
+{
+       // clear the item used for the ball in keepaway
+       self.items &~= IT_KEY1;
+       
+       // if the player has the ball, make sure they have the item for it (Used for HUD primarily)
+       if(self.ballcarried)
+               self.items |= IT_KEY1;
+
+       // drop the ball if the player presses the use button
+       if(self.BUTTON_USE)
+               if(self.ballcarried) { ka_DropEvent(self); } 
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerDamage) // for changing damage and force values that are applied to players in g_damage.qc
+{
+       if(frag_attacker.ballcarried) // if the attacker is a ballcarrier
+       {
+               if(frag_target == frag_attacker) // damage done to yourself
+               {
+                       frag_damage *= cvar("g_keepaway_ballcarrier_selfdamage");
+                       frag_force *= cvar("g_keepaway_ballcarrier_selfforce");
+               }
+               else // damage done to noncarriers
+               {
+                       frag_damage *= cvar("g_keepaway_ballcarrier_damage");
+                       frag_force *= cvar("g_keepaway_ballcarrier_force");
+               }
+       }
+       else if not(frag_target.ballcarried) // if the target is a noncarrier
+       {
+               if(frag_target == frag_attacker) // damage done to yourself
+               {
+                       frag_damage *= cvar("g_keepaway_noncarrier_selfdamage");
+                       frag_force *= cvar("g_keepaway_noncarrier_selfforce");
+               }
+               else // damage done to other noncarriers
+               {
+                       frag_damage *= cvar("g_keepaway_noncarrier_damage");
+                       frag_force *= cvar("g_keepaway_noncarrier_force");
+               }
+       }
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerPowerups)
+{
+       if(self.ballcarried)
+       { 
+               // if the player has the ball, force ballcarrier alpha upon them
+               self.alpha = cvar("g_keepaway_ballcarrier_alpha");
+               self.exteriorweaponentity.alpha = cvar("g_keepaway_ballcarrier_alpha");
+       
+               // if we're in minstagib and a ballcarrier has just picked up invisibility, 
+               // notify all the other players that the ballcarrier no longer has a waypoint
+               if(g_minstagib)
+               {
+                       if(olditems & IT_STRENGTH) 
+                       {
+                               if(time > self.strength_finished) 
+                               {       // this only runs ONCE right after the player loses invisibility
+                                       bprint(self.netname, "^7 isn't invisible from radar anymore.\n");
+                               }
+                       }
+                       else 
+                       {
+                               if(time < self.strength_finished)
+                               {       // this only runs ONCE right after the player gains invisibility
+                                       bprint(self.netname, "^7 has picked up invisibility and can no longer be seen on radar!\n");
+                               }
+                       }
+               }
+       }
+       else if(g_minstagib)
+       {
+               // if we're in minstagib and a noncarrier has invisibility, assure that we apply the invisibility effects normally
+               if(olditems & IT_STRENGTH) 
+               {
+                       self.alpha = g_minstagib_invis_alpha;
+                       self.exteriorweaponentity.alpha = g_minstagib_invis_alpha;
+               }
+       }
+       else
+       {
+               // if we're a normal player with no powerups that edit alpha make sure the alpha is default. 
+               // (normal powerups just use EF_ADDITIVE)
+               self.alpha = default_player_alpha;
+               self.exteriorweaponentity.alpha = default_weapon_alpha;
+       }
+       
+       return 0;
+}
+
+MUTATOR_DEFINITION(gamemode_keepaway)
+{
+       // I don't quite understand these orders, perhaps someone could enlighten me?
+       MUTATOR_HOOK(MakePlayerObserver, ka_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ClientDisconnect, ka_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDies, ka_Scoring, CBC_ORDER_ANY);
+       MUTATOR_HOOK(GiveFragsForKill, ka_GiveFragsForKill, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerDamage_Calculate, ka_PlayerDamage, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerPowerups, ka_PlayerPowerups, CBC_ORDER_ANY);
+
+       MUTATOR_ONADD
+       {
+               if(time > 1) // game loads at time 1
+                       error("This is a game type and it cannot be added at runtime.");
+               g_keepaway = 1;
+               ka_Initialize();
+       }
+
+       MUTATOR_ONREMOVE
+       {
+               g_keepaway = 0;
+               error("This is a game type and it cannot be removed at runtime.");
+       }
+
+       return 0;
+}
\ No newline at end of file
index 54b5b9f57028fd44723dd96abd6b8e60513d2dfb..7e253ddf9dafbe3f50f3d247890e8573edb841bf 100644 (file)
@@ -29,7 +29,7 @@ MUTATOR_HOOKFUNCTION(vampire_BuildMutatorsPrettyString)
 
 MUTATOR_DEFINITION(mutator_vampire)
 {
-       MUTATOR_HOOK(PlayerDamage, vampire_PlayerDamage, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, vampire_PlayerDamage, CBC_ORDER_ANY);
        MUTATOR_HOOK(BuildMutatorsString, vampire_BuildMutatorsString, CBC_ORDER_ANY);
        MUTATOR_HOOK(BuildMutatorsPrettyString, vampire_BuildMutatorsPrettyString, CBC_ORDER_ANY);
 
index 542014e8691275dfe11870f8d97118036f5f846e..d9fff4490467b77fd2f146dd68ec4a416882d6bb 100644 (file)
@@ -1,4 +1,6 @@
 MUTATOR_DECLARATION(gamemode_keyhunt);
+MUTATOR_DECLARATION(gamemode_freezetag);
+MUTATOR_DECLARATION(gamemode_keepaway);
 
 MUTATOR_DECLARATION(mutator_nix);
 MUTATOR_DECLARATION(mutator_dodging);
diff --git a/qcsrc/server/playerstats.qc b/qcsrc/server/playerstats.qc
new file mode 100644 (file)
index 0000000..0ac40ee
--- /dev/null
@@ -0,0 +1,155 @@
+float playerstats_db;
+string playerstats_last;
+string events_last;
+.float playerstats_addedglobalinfo;
+float playerstats_requested;
+
+void PlayerStats_Init()
+{
+       string uri;
+       playerstats_db = -1;
+       playerstats_waitforme = TRUE;
+       uri = cvar_string("g_playerstats_uri");
+       if(uri == "")
+               return;
+       playerstats_db = db_create();
+       if(playerstats_db >= 0)
+               playerstats_waitforme = FALSE; // must wait for it at match end
+       
+       PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
+       PlayerStats_AddEvent(PLAYERSTATS_KILLS);
+}
+
+void PlayerStats_AddPlayer(entity e)
+{
+       if(!e.crypto_idfp || playerstats_db < 0)
+               return;
+       
+       string key;
+       key = sprintf("%s:*", e.crypto_idfp);
+       
+       string p;
+       p = db_get(playerstats_db, key);
+       if(p == "")
+       {
+               if(playerstats_last)
+               {
+                       db_put(playerstats_db, key, playerstats_last);
+                       strunzone(playerstats_last);
+               }
+               else
+                       db_put(playerstats_db, key, "#");
+               playerstats_last = strzone(e.crypto_idfp);
+       }
+}
+
+void PlayerStats_AddEvent(string event_id)
+{
+       if(playerstats_db < 0)
+               return;
+       
+       string key;
+       key = sprintf("*:%s", event_id);
+       
+       string p;
+       p = db_get(playerstats_db, key);
+       if(p == "")
+       {
+               if(events_last)
+               {
+                       db_put(playerstats_db, key, events_last);
+                       strunzone(events_last);
+               }
+               else
+                       db_put(playerstats_db, key, "#");
+               events_last = strzone(event_id);
+       }
+}
+
+void PlayerStats_Event(entity e, string event_id, float value)
+{
+       if(!e.crypto_idfp || playerstats_db < 0)
+               return;
+       
+       string key;
+       float val;
+       key = sprintf("%s:%s", e.crypto_idfp, event_id);
+       val = stof(db_get(playerstats_db, key));
+       val += value;
+       db_put(playerstats_db, key, ftos(val));
+}
+
+void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data)
+{
+       if(playerstats_requested)
+               playerstats_waitforme = TRUE;
+}
+
+void PlayerStats_Shutdown()
+{
+       string p, pn;
+       string e, en;
+       string nn;
+       float b;
+       float i;
+       string uri;
+
+       if(playerstats_db < 0)
+               return;
+
+       uri = cvar_string("g_playerstats_uri");
+       if(uri != "")
+       {
+               b = buf_create();
+               i = 0;
+
+               db_dump(playerstats_db, "foo.db");
+
+               bufstr_set(b, i++, "V 1");
+               bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000)));
+               bufstr_set(b, i++, sprintf("G %s", GetGametype()));
+               bufstr_set(b, i++, sprintf("M %s", GetMapname()));
+               for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
+               {
+                       bufstr_set(b, i++, sprintf("P %s", p));
+                       nn = db_get(playerstats_db, sprintf("%s:_netname", p));
+                       if(nn != "")
+                               bufstr_set(b, i++, sprintf("n %s", nn));
+                       for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
+                       {
+                               float v;
+                               v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
+                               bufstr_set(b, i++, sprintf("e %s %f", e, v));
+                       }
+               }
+               bufstr_set(b, i++, "");
+
+               if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0))
+                       playerstats_requested = TRUE;
+               else
+                       playerstats_waitforme = TRUE; // if posting fails, we must continue anyway
+
+               buf_del(b);
+       }
+       else
+               playerstats_waitforme = TRUE;
+
+       db_close(playerstats_db);
+       playerstats_db = -1;
+}
+
+void PlayerStats_AddGlobalInfo(entity p)
+{
+       if(playerstats_db < 0)
+               return;
+       if(!p.crypto_idfp || playerstats_db < 0)
+               return;
+       p.playerstats_addedglobalinfo = TRUE;
+
+       // add global info!
+       if(p.alivetime)
+               PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+       
+       if(p.cvar_cl_allow_uid2name == 1)
+               db_put(playerstats_db, sprintf("%s:_netname", p.crypto_idfp), p.netname);
+}
diff --git a/qcsrc/server/playerstats.qh b/qcsrc/server/playerstats.qh
new file mode 100644 (file)
index 0000000..fea546a
--- /dev/null
@@ -0,0 +1,27 @@
+// time the player was alive and kicking
+string PLAYERSTATS_ALIVETIME = "alivetime";
+string PLAYERSTATS_KILLS     = "kills";
+
+// delay map switch until this is set
+float playerstats_waitforme;
+
+// call at initialization
+void PlayerStats_Init();
+
+// add a new player
+void PlayerStats_AddPlayer(entity e);
+
+// add a new event
+void PlayerStats_AddEvent(string event_id);
+
+// call on each event to track, or at player disconnect OR match end for "global stuff"
+void PlayerStats_Event(entity e, string event_id, float value);
+
+// call at game over
+void PlayerStats_Shutdown(); // send stats to the server
+
+// URI GET callback
+void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data);
+
+// call this whenever a player leaves
+void PlayerStats_AddGlobalInfo(entity p);
index 104f58c3886de7ae036c4d806dacfcc82642608b..c76395fdbc27df7bdd26371a491fe1da65064276 100644 (file)
@@ -41,6 +41,7 @@ csqceffects.qc
 
 anticheat.qh
 cheats.qh
+playerstats.qh
 
 portals.qh
 
@@ -176,9 +177,12 @@ playerdemo.qc
 
 anticheat.qc
 cheats.qc
+playerstats.qc
 
 mutators/base.qc
 mutators/gamemode_keyhunt.qc
+mutators/gamemode_freezetag.qc
+mutators/gamemode_keepaway.qc
 mutators/mutator_nix.qc
 mutators/mutator_dodging.qc
 mutators/mutator_rocketflying.qc
index 4db1b4493af571ec3b12f504347a6461a41beba1..96acdba94cea1f892dfa07fadf9df7ecb3def100 100644 (file)
@@ -187,3 +187,18 @@ void ScoreRules_nexball(float teams)
        ScoreInfo_SetLabel_PlayerScore(SP_NEXBALL_FAULTS, "faults", SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER);
        ScoreRules_basics_end();
 }
+
+// Keep Away stuff
+#define SP_KEEPAWAY_PICKUPS 4
+#define SP_KEEPAWAY_CARRIERKILLS 5
+#define SP_KEEPAWAY_DROPS 6
+#define SP_KEEPAWAY_SCORE 7
+void ScoreRules_keepaway()
+{
+       ScoreRules_basics(0, SFL_SORT_PRIO_PRIMARY, 0, FALSE); // SFL_SORT_PRIO_PRIMARY
+       ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_SCORE,               "score",                SFL_SORT_PRIO_PRIMARY);
+       ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_PICKUPS,             "pickups",              0);
+       ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_CARRIERKILLS,        "bckills",              0);
+       ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_DROPS,               "drops",                SFL_LOWER_IS_BETTER);
+       ScoreRules_basics_end();
+}
index 8a73e6799afb6436a3fa23ca9b73995908ae8092..a5f35aa89ae3bc04a0e8d51d9ab5587dea084c1d 100644 (file)
@@ -34,7 +34,7 @@ void CreatureFrame (void)
                                }
                                if (self.dmgtime < time)
                                {
-                                       self.dmgtime = time + 0.1;
+                                       self.dmgtime = time + 0.2;
                                        if (self.watertype == CONTENT_LAVA)
                                        {
                                                if (self.watersound_finished < time)
index df5788f4c3a0ff251854b2fd9d5235b23b99a073..e5340ab930e63ee5031c32be23c80d4404aa9df1 100644 (file)
@@ -137,6 +137,7 @@ void trigger_push_touch()
        if (other.classname != "gib")
        if (other.classname != "casing")
        if (other.classname != "droppedweapon")
+       if (other.classname != "keepawayball")
        if (!other.projectiledeathtype || other.classname == "bullet")
                return;
 
index b9064c783b852a515586ade5e0826b3323380bf9..7df082c8747475d3b6d8fd0e3fb116ecca519fee 100644 (file)
@@ -101,6 +101,8 @@ void WriteGameCvars()
        cvar_set("g_race", ftos(g_race));
        cvar_set("g_nexball", ftos(g_nexball));
        cvar_set("g_cts", ftos(g_cts));
+       cvar_set("g_freezetag", ftos(g_freezetag));
+       cvar_set("g_keepaway", ftos(g_keepaway));
 }
 
 void ReadGameCvars()
@@ -127,6 +129,8 @@ void ReadGameCvars()
                found += (g_race = (!found && (prev != GAME_RACE) && cvar("g_race")));
                found += (g_nexball = (!found && (prev != GAME_NEXBALL) && cvar("g_nexball")));
                found += (g_cts = (!found && (prev != GAME_CTS) && cvar("g_cts")));
+               found += (g_freezetag = (!found && (prev != GAME_FREEZETAG) && cvar("g_freezetag")));
+               found += (g_keepaway = (!found && (prev != GAME_KEEPAWAY) && cvar("g_keepaway")));
 
                if(found)
                        break;
@@ -317,6 +321,16 @@ void InitGameplayMode()
                MUTATOR_ADD(gamemode_keyhunt);
        }
 
+       if(g_freezetag)
+       {
+               game = GAME_FREEZETAG;
+               gamemode_name = "Freeze Tag";
+               ActivateTeamplay();
+               fraglimit_override = cvar("g_freezetag_point_limit");
+               leadlimit_override = cvar("g_freezetag_point_leadlimit");
+               MUTATOR_ADD(gamemode_freezetag);
+       }
+
        if(g_assault)
        {
                game = GAME_ASSAULT;
@@ -373,6 +387,13 @@ void InitGameplayMode()
                have_team_spawns = -1; // request team spawns
        }
 
+       if(g_keepaway)
+       {
+               game = GAME_KEEPAWAY;
+               gamemode_name = "Keepaway";
+               MUTATOR_ADD(gamemode_keepaway);
+       }
+
        if(teams_matter)
                entcs_init();
 
@@ -816,6 +837,8 @@ float FindSmallestTeam(entity pl, float ignore_pl)
                        error("Too few teams available for ctf\n");
                else if(g_keyhunt)
                        error("Too few teams available for key hunt\n");
+               else if(g_freezetag)
+                       error("Too few teams available for freeze tag\n");
                else
                        error("Too few teams available for team deathmatch\n");
        }
index aff4c0aec907ad77cb2a5a9a2ee8d2001ef72f54..fa150df0a84e7254350a891c9a49e109a96a8bfe 100644 (file)
@@ -216,6 +216,10 @@ void ewheel_respawnhook()
 {
     entity e;
 
+    // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
+    if(self.movetype  != MOVETYPE_WALK)
+               return;
+               
     self.velocity = '0 0 0';
     self.enemy = world;
 
index 59aaf653de3750a80540b616fdd41ca5df20e081..3952dc16a407cf02f98270e732194c0d4317245d 100644 (file)
@@ -637,7 +637,11 @@ void walker_respawnhook()
     vector vtmp;
     entity e;
 
-    setorigin(self,self.wkr_spawn.origin);
+    // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
+    if(self.movetype  != MOVETYPE_WALK)
+               return;
+               
+    setorigin(self, self.wkr_spawn.origin);
 
     self.angles = self.wkr_spawn.angles;
     vtmp = self.wkr_spawn.origin;
index 11f97f07062ed16e4253914f98802642c3b7d29e..e7716feaf252051d90e0f9cc9c53d0256e071708 100644 (file)
@@ -232,7 +232,7 @@ void lgbeam_think()
                remove(self);
                return;
        }
-       if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
+       if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || (g_freezetag && self.owner.freezetag_frozen))
        {
                if(self == self.owner.lgbeam)
                        self.owner.lgbeam = world;
index 61f4dc2929feacf92f54270c8c185171aac8e666..6e3210859dc65d2c80ccf4b31f4662551237d917 100644 (file)
@@ -48,6 +48,7 @@ void W_Nex_Attack (float issecondary)
                charge = cvar("g_balance_nex_charge_mindmg") / mydmg + (1 - cvar("g_balance_nex_charge_mindmg") / mydmg) * self.nex_charge;
                self.nex_charge *= cvar("g_balance_nex_charge_shot_multiplier"); // do this AFTER setting mydmg/myforce
                                                                                 // O RLY? -- divVerent
+                                                                         // YA RLY -- FruitieX
        }
        else
                charge = 1;
@@ -55,6 +56,10 @@ void W_Nex_Attack (float issecondary)
        myforce *= charge;
 
        W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CHAN_WEAPON, mydmg);
+    if(charge > cvar("g_balance_nex_charge_limit") && cvar("g_balance_nex_charge_limit")) // if the Nex is overcharged, we play an extra sound
+    {
+        sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * cvar("g_balance_nex_charge_limit")) / (1 - 0.5 * cvar("g_balance_nex_charge_limit")), ATTN_NORM);
+    }
 
        yoda = 0;
        FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, WEP_NEX);
@@ -89,6 +94,23 @@ float w_nex(float req)
                if(cvar("g_balance_nex_charge") && self.nex_charge < cvar("g_balance_nex_charge_limit"))
                        self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_rate") * frametime / W_TICSPERFRAME);
 
+        if(cvar("g_balance_nex_charge"))
+        {
+            self.weaponentity.weaponentity.glowmod = '0 0 0'; // reset
+
+            self.weaponentity.weaponentity.glowmod_x = cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_red_half") * bound(0, self.weaponentity.weaponentity.glowmod_y + self.nex_charge / cvar("g_balance_nex_charge_limit"), 1);
+            self.weaponentity.weaponentity.glowmod_y = cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_green_half") * bound(0, self.weaponentity.weaponentity.glowmod_y + self.nex_charge / cvar("g_balance_nex_charge_limit"), 1);
+            self.weaponentity.weaponentity.glowmod_z = cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_blue_half") * bound(0, self.weaponentity.weaponentity.glowmod_z + self.nex_charge / cvar("g_balance_nex_charge_limit"), 1);
+
+            if(self.nex_charge > cvar("g_balance_nex_charge_limit"))
+            {
+                self.weaponentity.weaponentity.glowmod_x = self.weaponentity.weaponentity.glowmod_x + cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_red_full") * (self.nex_charge - cvar("g_balance_nex_charge_limit")) / (1 - cvar("g_balance_nex_charge_limit"));
+                self.weaponentity.weaponentity.glowmod_y = self.weaponentity.weaponentity.glowmod_y + cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_green_full") * (self.nex_charge - cvar("g_balance_nex_charge_limit")) / (1 - cvar("g_balance_nex_charge_limit"));
+                self.weaponentity.weaponentity.glowmod_z = self.weaponentity.weaponentity.glowmod_z + cvar("g_weapon_charge_colormod_hdrmultiplier") * cvar("g_weapon_charge_colormod_blue_full") * (self.nex_charge - cvar("g_balance_nex_charge_limit")) / (1 - cvar("g_balance_nex_charge_limit"));
+            }
+            self.exteriorweaponentity.glowmod = self.weaponentity.weaponentity.glowmod;
+        }
+
                if(cvar("g_balance_nex_secondary_charge_pool"))
                if(self.nex_charge_pool_ammo < 1)
                {
@@ -163,6 +185,7 @@ float w_nex(float req)
                precache_model ("models/weapons/v_nex.md3");
                precache_model ("models/weapons/h_nex.iqm");
                precache_sound ("weapons/nexfire.wav");
+               precache_sound ("weapons/nexcharge.wav");
                precache_sound ("weapons/nexwhoosh1.wav");
                precache_sound ("weapons/nexwhoosh2.wav");
                precache_sound ("weapons/nexwhoosh3.wav");
diff --git a/scripts/ctf.shader b/scripts/ctf.shader
new file mode 100644 (file)
index 0000000..2eceff3
--- /dev/null
@@ -0,0 +1,18 @@
+models/ctf/glow_red
+{
+ {
+       map models/ctf/glow_red.tga
+       tcMod scale 0.03 0.03
+       tcMod scroll 0.1 -0.04
+       tcMod rotate 0.1
+ }
+}
+models/ctf/glow_blue
+{
+ {
+       map models/ctf/glow_blue.tga
+       tcMod scale 0.03 0.03
+       tcMod scroll 0.1 -0.04
+       tcMod rotate 0.1
+ }
+}
\ No newline at end of file
diff --git a/scripts/orbs.shader b/scripts/orbs.shader
new file mode 100644 (file)
index 0000000..26d1fdf
--- /dev/null
@@ -0,0 +1,48 @@
+models/orbs/orbblue
+{
+       deformVertexes autosprite
+       dpnoshadow
+
+ {
+       map models/orbs/orbblue.tga
+       blendfunc add
+       tcmod page 4 4 0.05
+       rgbgen vertex
+ }
+}
+models/orbs/orbred
+{
+       deformVertexes autosprite
+       dpnoshadow
+
+ {
+       map models/orbs/orbred.tga
+       blendfunc add
+       tcmod page 4 4 0.05
+       rgbgen vertex
+ }
+}
+models/orbs/orbyellow
+{
+       deformVertexes autosprite
+       dpnoshadow
+
+ {
+       map models/orbs/orbyellow.tga
+       blendfunc add
+       tcmod page 4 4 0.05
+       rgbgen vertex
+ }
+}
+models/orbs/orbpink
+{
+       deformVertexes autosprite
+       dpnoshadow
+
+ {
+       map models/orbs/orbpink.tga
+       blendfunc add
+       tcmod page 4 4 0.05
+       rgbgen vertex
+ }
+}
\ No newline at end of file
diff --git a/scripts/projectiles.shader b/scripts/projectiles.shader
new file mode 100644 (file)
index 0000000..28b1e94
--- /dev/null
@@ -0,0 +1,90 @@
+crylink_projectile_core
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+               map textures/projectiles/crylink_projectile_core.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+crylink_projectile_long
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite2
+       {
+               map textures/projectiles/crylink_projectile_long.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+hlac_projectile_core
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+               map textures/projectiles/hlac_projectile_core.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+hlac_projectile_long
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite2
+       {
+               map textures/projectiles/hlac_projectile_long.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+electro_projectile_core
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+               map textures/projectiles/electro_projectile_core.tga
+               blendfunc add
+               tcmod page 4 1 0.1
+               rgbGen lightingDiffuse
+       }
+}
+electro_projectile_long
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite2
+       {
+               map textures/projectiles/electro_projectile_long.tga
+               blendfunc add
+               tcmod page 4 1 0.1
+               rgbGen lightingDiffuse
+       }
+}
+laser_projectile_core
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+               map textures/projectiles/laser_projectile_core.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+laser_projectile_long
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite2
+       {
+               map textures/projectiles/laser_projectile_long.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
\ No newline at end of file
index 2ed0c9ad660eaadc683525ff8d4025d29e1bfc6b..c093eb3334808095149715e2413d7ad8ef68f542 100644 (file)
@@ -102,3 +102,11 @@ seeker
                rgbgen lightingDiffuse
        }
 }
+minelayer
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/minelayer.tga
+               rgbgen lightingDiffuse
+       }
+}
index 74b797ba147b9d558a4d2620c7d6853876d52ab2..d58d62b682c840b96c413092396724bb544662c4 100644 (file)
Binary files a/sound/announcer/default/03kills.ogg and b/sound/announcer/default/03kills.ogg differ
index 24602994332d9325ac7e52d669873fafd75bb138..c6e4a1c57c2f54df8ae28e19b8622a1b1df29d35 100644 (file)
Binary files a/sound/announcer/default/05kills.ogg and b/sound/announcer/default/05kills.ogg differ
index aeb209d2a6ca2d2cc4eafb3326e18d4bccaf6a60..0002a3b1e3ef51dfe70baca021a7fde6100f59c0 100644 (file)
Binary files a/sound/announcer/default/10kills.ogg and b/sound/announcer/default/10kills.ogg differ
index f0f44394461def9561a09afe770347b9f0bdf7c6..a3ed1b2d3b55a026c6fa627a708d41b79a7fe335 100644 (file)
Binary files a/sound/announcer/default/15kills.ogg and b/sound/announcer/default/15kills.ogg differ
index 14d667644af008425939434761c9a5f83cc85959..9e17e91f296efba5fbb0ac7c2883394bf5291bc8 100644 (file)
Binary files a/sound/announcer/default/1fragleft.ogg and b/sound/announcer/default/1fragleft.ogg differ
index 12d5f7c0acfa87daf6e43207066ec9ac3eb3b0d7..f21a1bd818e7ef17323c0028ae0dd44c673b6b08 100644 (file)
Binary files a/sound/announcer/default/1minuteremains.ogg and b/sound/announcer/default/1minuteremains.ogg differ
index 638ec676ed649b95360cc3f7975c6dbc46ff0094..5867d59252b687946925d610b134674909fd9ac5 100644 (file)
Binary files a/sound/announcer/default/20kills.ogg and b/sound/announcer/default/20kills.ogg differ
index 1b700977e26274d7a4a0abd42b2523e4e1b437d5..44d6d8b38ddd36079e894c45ec8ef048f9e4e9bd 100644 (file)
Binary files a/sound/announcer/default/25kills.ogg and b/sound/announcer/default/25kills.ogg differ
index e346570b021160dccca1305a59fbbe56b15a9df5..24ea3c39345acd4ecc2e869290e99bfb902995ee 100644 (file)
Binary files a/sound/announcer/default/2fragsleft.ogg and b/sound/announcer/default/2fragsleft.ogg differ
index 536d5ec5407ed6235632c1afab577aaf078e58c8..e6bb66ef20a3b92b397088a89ba8fd5e8edac8eb 100644 (file)
Binary files a/sound/announcer/default/30kills.ogg and b/sound/announcer/default/30kills.ogg differ
index 9ccceff060053a5275dc436d07fd477c8b07d69a..6a20bfdba208b928d693e77b89357c7131c43ad2 100644 (file)
Binary files a/sound/announcer/default/3fragsleft.ogg and b/sound/announcer/default/3fragsleft.ogg differ
index 1ec462bf3dbaa9a69948f930b1219a0dd4520502..c4572ab35bea9b4751309dbc5a952f648efef51d 100644 (file)
Binary files a/sound/announcer/default/5minutesremain.ogg and b/sound/announcer/default/5minutesremain.ogg differ
index a4e14ba5e8423c3a8fb28d1d71fffb44f0716eb1..39cf68d21c90f59596e65facd94945b9abad7ac3 100644 (file)
Binary files a/sound/announcer/default/airshot.ogg and b/sound/announcer/default/airshot.ogg differ
index 7ce6f3a9ec7ad2769c93319401a8ea70a794f0fe..d28a8ef620771a77dc9c00852245ca32a482ce90 100644 (file)
Binary files a/sound/announcer/default/amazing.ogg and b/sound/announcer/default/amazing.ogg differ
index 962a6bd3024203871919863f840b874db0b2f2bb..004e086e216db44ae4256a5d0ef3a6259993356c 100644 (file)
Binary files a/sound/announcer/default/awesome.ogg and b/sound/announcer/default/awesome.ogg differ
index 500fed8159b7b66656fc53b3ff7ed36ad3c1cf75..bea17ecb63dc5323cabae1f2b3aa736f65d5e507 100644 (file)
Binary files a/sound/announcer/default/blueteamtakeslead.ogg and b/sound/announcer/default/blueteamtakeslead.ogg differ
index 903fb85108944b31541be158ed45d3758380ad1f..133294d9fc2243fb0441a0c587c6273314cdaa55 100644 (file)
Binary files a/sound/announcer/default/headshot.ogg and b/sound/announcer/default/headshot.ogg differ
index 25d01c05651a3abc471d212ce75479435a7c96b4..942bf21567b1326be18976f53c154c31e90ef112 100644 (file)
Binary files a/sound/announcer/default/impressive.ogg and b/sound/announcer/default/impressive.ogg differ
index 81ac853f3475b06520d29187ae39154aa3598310..1ac573fcd9c94641a849a9efcf7a05e34e3f500c 100644 (file)
Binary files a/sound/announcer/default/redteamtakeslead.ogg and b/sound/announcer/default/redteamtakeslead.ogg differ
diff --git a/sound/keepaway/dropped.wav b/sound/keepaway/dropped.wav
new file mode 100644 (file)
index 0000000..6867468
Binary files /dev/null and b/sound/keepaway/dropped.wav differ
diff --git a/sound/keepaway/pickedup.wav b/sound/keepaway/pickedup.wav
new file mode 100644 (file)
index 0000000..55e55a4
Binary files /dev/null and b/sound/keepaway/pickedup.wav differ
diff --git a/sound/keepaway/respawn.wav b/sound/keepaway/respawn.wav
new file mode 100644 (file)
index 0000000..0be02d5
Binary files /dev/null and b/sound/keepaway/respawn.wav differ
diff --git a/sound/keepaway/touch.wav b/sound/keepaway/touch.wav
new file mode 100644 (file)
index 0000000..2ab908b
Binary files /dev/null and b/sound/keepaway/touch.wav differ
index ca16d218875a6228757cfe3b29153c22d0adef89..9aea70caf4bcc70bea3df59d5e145f9927f107a6 100644 (file)
Binary files a/sound/misc/armor25.wav and b/sound/misc/armor25.wav differ
diff --git a/sound/monsters/alien_chant_loop.ogg b/sound/monsters/alien_chant_loop.ogg
new file mode 100644 (file)
index 0000000..527411f
Binary files /dev/null and b/sound/monsters/alien_chant_loop.ogg differ
diff --git a/sound/monsters/giant_snoring_loop.ogg b/sound/monsters/giant_snoring_loop.ogg
new file mode 100644 (file)
index 0000000..aeb9c1c
Binary files /dev/null and b/sound/monsters/giant_snoring_loop.ogg differ
diff --git a/sound/monsters/growl1.wav b/sound/monsters/growl1.wav
new file mode 100644 (file)
index 0000000..bc0f256
Binary files /dev/null and b/sound/monsters/growl1.wav differ
diff --git a/sound/monsters/growl2.wav b/sound/monsters/growl2.wav
new file mode 100644 (file)
index 0000000..58842b8
Binary files /dev/null and b/sound/monsters/growl2.wav differ
diff --git a/sound/monsters/growl3.wav b/sound/monsters/growl3.wav
new file mode 100644 (file)
index 0000000..8b75efd
Binary files /dev/null and b/sound/monsters/growl3.wav differ
index 8d5a28c153849d619e54aa1e8cd08958e7911230..94514e5ac56aaaf138f453d3db5615c07893f7b2 100644 (file)
Binary files a/sound/player/slime.wav and b/sound/player/slime.wav differ
index b935160834e0a811efc4baf748792cf6b6b40bed..bb18f53f11617a23513ff6b86eacc7b2d9356010 100644 (file)
Binary files a/sound/weapons/crylink_fire.ogg and b/sound/weapons/crylink_fire.ogg differ
index 1f8b751151ea9bb0c592c75fc9a9cc87da9bac1b..f10d6dd0c2aa07835aaa0e5a47736fdb3733bb2d 100644 (file)
Binary files a/sound/weapons/crylink_fire2.ogg and b/sound/weapons/crylink_fire2.ogg differ
index 26b0358ed5219856e8a85639f46ef0eceffaef68..18b3e156d1763f81612ea77a1d72e47d5a95ca1d 100644 (file)
Binary files a/sound/weapons/electro_fire.ogg and b/sound/weapons/electro_fire.ogg differ
index f96966d34cb0398fa902d6d90c4197fd709147d0..a7192fa8994a5dc5667d61fe647ece8a9609d422 100644 (file)
Binary files a/sound/weapons/electro_fire2.ogg and b/sound/weapons/electro_fire2.ogg differ
index a6408b387d0658119604509709b766b9f00cb5df..41895ed983dcfb18db177ac634d108d528803238 100644 (file)
Binary files a/sound/weapons/grenade_fire.ogg and b/sound/weapons/grenade_fire.ogg differ
index 8cf78ea1e7eaec1802522a7d7b918d1740858c00..8175cd7aa3afbb1e780564489194593364fee3a1 100644 (file)
Binary files a/sound/weapons/grenade_impact.ogg and b/sound/weapons/grenade_impact.ogg differ
index 2068d4414b63b9c358bc3c5ee991ed1951db7733..fcb68c00ba3c5af7f5745884612ba99dfba8978e 100644 (file)
Binary files a/sound/weapons/hagar_fire.ogg and b/sound/weapons/hagar_fire.ogg differ
index 664c4440a4426d481abc1de7a4301ce2c3675ca5..f7b872e6ea09ebce06ced24316dbae22611a31e5 100644 (file)
Binary files a/sound/weapons/hagexp1.ogg and b/sound/weapons/hagexp1.ogg differ
index b58b3f12cf800fa11e02aded12235f1e146c4156..d0f6e83973d2ee6706d71b5d2b5a7f18f149715d 100644 (file)
Binary files a/sound/weapons/hagexp2.ogg and b/sound/weapons/hagexp2.ogg differ
index 27192c1776d63e5e572e0a19975a1884a310b955..f2fcbb5fd4d4b3c75c2d14e977d4de2048aed646 100644 (file)
Binary files a/sound/weapons/hagexp3.ogg and b/sound/weapons/hagexp3.ogg differ
index 09232de00dca121d8fd735b89e94750fff4b223b..d08710985743ab7de72c67b14c8d58870001c3d1 100644 (file)
Binary files a/sound/weapons/minstanexfire.ogg and b/sound/weapons/minstanexfire.ogg differ
diff --git a/sound/weapons/nexcharge.ogg b/sound/weapons/nexcharge.ogg
new file mode 100644 (file)
index 0000000..6fa152d
Binary files /dev/null and b/sound/weapons/nexcharge.ogg differ
index dc893698154d11f53fe558f722bb8df5ec51967c..5d28b731cee1f6e8d305958728617bb4c84c7f4b 100644 (file)
Binary files a/sound/weapons/nexfire.ogg and b/sound/weapons/nexfire.ogg differ
index 55e4f7610dc7c5549f2c497d3998c738ec8242d4..36f1183daa35e003b8a7d6f774e7cded07e3ae6b 100644 (file)
Binary files a/sound/weapons/nexwhoosh1.ogg and b/sound/weapons/nexwhoosh1.ogg differ
index 6fcaaeaeaeaa0d3338797663d8530d3057a129b0..38ffa22f33090b94b8bb2f3ef3259cd5daa47763 100644 (file)
Binary files a/sound/weapons/nexwhoosh2.ogg and b/sound/weapons/nexwhoosh2.ogg differ
index 4f3eb6cf8d7577a5d43e4218ad1baf2c16a020e9..3db8d4b44605818b3c42508a88bf153e672ca335 100644 (file)
Binary files a/sound/weapons/nexwhoosh3.ogg and b/sound/weapons/nexwhoosh3.ogg differ
index 1d600459fcc1acc532db5b44543c6be012571a3d..56b114e65d37e1900f4380f1cb5b26ecc909c8ab 100644 (file)
Binary files a/sound/weapons/rocket_impact.ogg and b/sound/weapons/rocket_impact.ogg differ
index 81908df8a566cd555d407225b2f0c9e3eeddd95d..8d4f607c742a2b17970129c9d072125bf545f5f1 100644 (file)
Binary files a/sound/weapons/shotgun_fire.ogg and b/sound/weapons/shotgun_fire.ogg differ
index be1159d4fdc344146f10036da22e5558dbd65c9d..8d27e4fde32969d3fce75917edffda68e852f38e 100644 (file)
Binary files a/sound/weapons/strength_fire.ogg and b/sound/weapons/strength_fire.ogg differ
index 6ed281ddb8c5406b4c3c06f3ff2d3875314b1624..24c73a4c05affd2ba71965e79720549b92adeef4 100644 (file)
Binary files a/sound/weapons/uzi_fire.ogg and b/sound/weapons/uzi_fire.ogg differ
diff --git a/textures/flags/flag_blue.tga b/textures/flags/flag_blue.tga
deleted file mode 100644 (file)
index e84fca5..0000000
Binary files a/textures/flags/flag_blue.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_cloth.tga b/textures/flags/flag_blue_cloth.tga
deleted file mode 100644 (file)
index a8ea97f..0000000
Binary files a/textures/flags/flag_blue_cloth.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_gloss.tga b/textures/flags/flag_blue_gloss.tga
deleted file mode 100644 (file)
index 77176c0..0000000
Binary files a/textures/flags/flag_blue_gloss.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_glow.tga b/textures/flags/flag_blue_glow.tga
deleted file mode 100644 (file)
index 88d58c0..0000000
Binary files a/textures/flags/flag_blue_glow.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_laser.tga b/textures/flags/flag_blue_laser.tga
deleted file mode 100644 (file)
index 6901f4f..0000000
Binary files a/textures/flags/flag_blue_laser.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_norm.tga b/textures/flags/flag_blue_norm.tga
deleted file mode 100644 (file)
index fc26022..0000000
Binary files a/textures/flags/flag_blue_norm.tga and /dev/null differ
diff --git a/textures/flags/flag_red.tga b/textures/flags/flag_red.tga
deleted file mode 100644 (file)
index d659d8c..0000000
Binary files a/textures/flags/flag_red.tga and /dev/null differ
diff --git a/textures/flags/flag_red_cloth.tga b/textures/flags/flag_red_cloth.tga
deleted file mode 100644 (file)
index ae451c9..0000000
Binary files a/textures/flags/flag_red_cloth.tga and /dev/null differ
diff --git a/textures/flags/flag_red_gloss.tga b/textures/flags/flag_red_gloss.tga
deleted file mode 100644 (file)
index a499830..0000000
Binary files a/textures/flags/flag_red_gloss.tga and /dev/null differ
diff --git a/textures/flags/flag_red_glow.tga b/textures/flags/flag_red_glow.tga
deleted file mode 100644 (file)
index deae22e..0000000
Binary files a/textures/flags/flag_red_glow.tga and /dev/null differ
diff --git a/textures/flags/flag_red_laser.tga b/textures/flags/flag_red_laser.tga
deleted file mode 100644 (file)
index f4d4de5..0000000
Binary files a/textures/flags/flag_red_laser.tga and /dev/null differ
diff --git a/textures/flags/flag_red_norm.tga b/textures/flags/flag_red_norm.tga
deleted file mode 100644 (file)
index 97480bb..0000000
Binary files a/textures/flags/flag_red_norm.tga and /dev/null differ
diff --git a/textures/mine.tga b/textures/mine.tga
new file mode 100644 (file)
index 0000000..f50282b
Binary files /dev/null and b/textures/mine.tga differ
diff --git a/textures/mine_gloss.tga b/textures/mine_gloss.tga
new file mode 100644 (file)
index 0000000..2e084c3
Binary files /dev/null and b/textures/mine_gloss.tga differ
diff --git a/textures/mine_glow.tga b/textures/mine_glow.tga
new file mode 100644 (file)
index 0000000..0fc35f9
Binary files /dev/null and b/textures/mine_glow.tga differ
diff --git a/textures/minelayer.tga b/textures/minelayer.tga
new file mode 100644 (file)
index 0000000..e0fa48c
Binary files /dev/null and b/textures/minelayer.tga differ
diff --git a/textures/minelayer_gloss.tga b/textures/minelayer_gloss.tga
new file mode 100644 (file)
index 0000000..2ca8b9a
Binary files /dev/null and b/textures/minelayer_gloss.tga differ
diff --git a/textures/minelayer_glow.tga b/textures/minelayer_glow.tga
new file mode 100644 (file)
index 0000000..163735f
Binary files /dev/null and b/textures/minelayer_glow.tga differ
index 240695f03c7f0b2aede35eb56e8c5cca54d2a6c4..09fb1b224ace0529a9b159baa63341aabdd7a8d8 100644 (file)
Binary files a/textures/nexgun.tga and b/textures/nexgun.tga differ
index c58c009cb814567d8fa656342392b0d4ccea1ba9..e3befff7394c3ff2026092e11f8ff01f3647572e 100644 (file)
Binary files a/textures/nexgun_glow.tga and b/textures/nexgun_glow.tga differ
diff --git a/textures/projectiles/crylink_projectile_core.tga b/textures/projectiles/crylink_projectile_core.tga
new file mode 100644 (file)
index 0000000..a9f686b
Binary files /dev/null and b/textures/projectiles/crylink_projectile_core.tga differ
diff --git a/textures/projectiles/crylink_projectile_core_glow.tga b/textures/projectiles/crylink_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..b53993b
Binary files /dev/null and b/textures/projectiles/crylink_projectile_core_glow.tga differ
diff --git a/textures/projectiles/crylink_projectile_long.tga b/textures/projectiles/crylink_projectile_long.tga
new file mode 100644 (file)
index 0000000..6f78dd0
Binary files /dev/null and b/textures/projectiles/crylink_projectile_long.tga differ
diff --git a/textures/projectiles/crylink_projectile_long_glow.tga b/textures/projectiles/crylink_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..6f78dd0
Binary files /dev/null and b/textures/projectiles/crylink_projectile_long_glow.tga differ
diff --git a/textures/projectiles/electro_projectile_core.tga b/textures/projectiles/electro_projectile_core.tga
new file mode 100644 (file)
index 0000000..b9a1930
Binary files /dev/null and b/textures/projectiles/electro_projectile_core.tga differ
diff --git a/textures/projectiles/electro_projectile_core_glow.tga b/textures/projectiles/electro_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..b9a1930
Binary files /dev/null and b/textures/projectiles/electro_projectile_core_glow.tga differ
diff --git a/textures/projectiles/electro_projectile_long.tga b/textures/projectiles/electro_projectile_long.tga
new file mode 100644 (file)
index 0000000..4672763
Binary files /dev/null and b/textures/projectiles/electro_projectile_long.tga differ
diff --git a/textures/projectiles/electro_projectile_long_glow.tga b/textures/projectiles/electro_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..4672763
Binary files /dev/null and b/textures/projectiles/electro_projectile_long_glow.tga differ
diff --git a/textures/projectiles/hlac_projectile_core.tga b/textures/projectiles/hlac_projectile_core.tga
new file mode 100644 (file)
index 0000000..f5a49e1
Binary files /dev/null and b/textures/projectiles/hlac_projectile_core.tga differ
diff --git a/textures/projectiles/hlac_projectile_core_glow.tga b/textures/projectiles/hlac_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..f5a49e1
Binary files /dev/null and b/textures/projectiles/hlac_projectile_core_glow.tga differ
diff --git a/textures/projectiles/hlac_projectile_long.tga b/textures/projectiles/hlac_projectile_long.tga
new file mode 100644 (file)
index 0000000..a7e68da
Binary files /dev/null and b/textures/projectiles/hlac_projectile_long.tga differ
diff --git a/textures/projectiles/hlac_projectile_long_glow.tga b/textures/projectiles/hlac_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..a7e68da
Binary files /dev/null and b/textures/projectiles/hlac_projectile_long_glow.tga differ
diff --git a/textures/projectiles/laser_projectile_core.tga b/textures/projectiles/laser_projectile_core.tga
new file mode 100644 (file)
index 0000000..1fdec98
Binary files /dev/null and b/textures/projectiles/laser_projectile_core.tga differ
diff --git a/textures/projectiles/laser_projectile_core_glow.tga b/textures/projectiles/laser_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..1fdec98
Binary files /dev/null and b/textures/projectiles/laser_projectile_core_glow.tga differ
diff --git a/textures/projectiles/laser_projectile_long.tga b/textures/projectiles/laser_projectile_long.tga
new file mode 100644 (file)
index 0000000..361342d
Binary files /dev/null and b/textures/projectiles/laser_projectile_long.tga differ
diff --git a/textures/projectiles/laser_projectile_long_glow.tga b/textures/projectiles/laser_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..361342d
Binary files /dev/null and b/textures/projectiles/laser_projectile_long_glow.tga differ
index d253bd1594c7e1f0e23dadf0c3dc30098632593c..0e4cb86289e81aecac9046e00f6c15e27c3739b8 100644 (file)
@@ -54,6 +54,7 @@ Antonio "terencehill" Piu
 Ben "MooKow" Banker
 Calinou
 chooksta
+Cuinn "Cuinnton" Herrick
 Kristian "morfar" Johansson
 kojn
 Maik "SavageX" Merten