Merge branch 'master' into terencehill/maximized_radar
authorterencehill <piuntn@gmail.com>
Mon, 3 Oct 2011 19:38:06 +0000 (21:38 +0200)
committerterencehill <piuntn@gmail.com>
Mon, 3 Oct 2011 19:38:06 +0000 (21:38 +0200)
131 files changed:
Makefile
autoexec.cfg [new file with mode: 0644]
autoexec/empty.cfg [new file with mode: 0644]
balance25.cfg
balanceFruit.cfg
balanceLeeStricklin.cfg
balanceXonotic.cfg
balancetZork.cfg
config_update.cfg
csprogs.dat.de.po
csprogs.dat.pot
data/campaign.cfg [new file with mode: 0644]
defaultXonotic.cfg
menu.dat.de.po
menu.dat.pot
models/player/megaerebus.iqm_0.tga
qcsrc/Makefile [new file with mode: 0644]
qcsrc/client/autocvars.qh
qcsrc/client/casings.qc
qcsrc/client/csqc_builtins.qc
qcsrc/client/csqc_constants.qc
qcsrc/client/hud.qc
qcsrc/client/hud_config.qc
qcsrc/client/scoreboard.qc
qcsrc/client/tuba.qc
qcsrc/common/constants.qh
qcsrc/common/gamecommand.qc
qcsrc/common/urllib.qc
qcsrc/common/util-pre.qh
qcsrc/menu/mbuiltin.qh
qcsrc/menu/menu.qc
qcsrc/menu/xonotic/checkbox_slider_invalid.c
qcsrc/menu/xonotic/dialog_hudpanel_weapons.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_input.c
qcsrc/menu/xonotic/dialog_settings_misc.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/menu/xonotic/slider.c
qcsrc/menu/xonotic/util.qc
qcsrc/menu/xonotic/util.qh
qcsrc/server/arena.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/scripting.qc
qcsrc/server/campaign.qc
qcsrc/server/cheats.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_impulse.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/clientcommands.qc
qcsrc/server/defs.qh
qcsrc/server/extensions.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_world.qc
qcsrc/server/gamecommand.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/mutator_nix.qc
qcsrc/server/playerstats.qc
qcsrc/server/playerstats.qh
qcsrc/server/scores.qc
qcsrc/server/scores_rules.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/server/w_crylink.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hagar.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_rifle.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc
sound/weapons/tuba_note-1.ogg [deleted file]
sound/weapons/tuba_note-10.ogg [deleted file]
sound/weapons/tuba_note-11.ogg [deleted file]
sound/weapons/tuba_note-12.ogg [deleted file]
sound/weapons/tuba_note-13.ogg [deleted file]
sound/weapons/tuba_note-14.ogg [deleted file]
sound/weapons/tuba_note-15.ogg [deleted file]
sound/weapons/tuba_note-16.ogg [deleted file]
sound/weapons/tuba_note-17.ogg [deleted file]
sound/weapons/tuba_note-18.ogg [deleted file]
sound/weapons/tuba_note-2.ogg [deleted file]
sound/weapons/tuba_note-3.ogg [deleted file]
sound/weapons/tuba_note-4.ogg [deleted file]
sound/weapons/tuba_note-5.ogg [deleted file]
sound/weapons/tuba_note-6.ogg [deleted file]
sound/weapons/tuba_note-7.ogg [deleted file]
sound/weapons/tuba_note-8.ogg [deleted file]
sound/weapons/tuba_note-9.ogg [deleted file]
sound/weapons/tuba_note0.ogg [deleted file]
sound/weapons/tuba_note1.ogg [deleted file]
sound/weapons/tuba_note10.ogg [deleted file]
sound/weapons/tuba_note11.ogg [deleted file]
sound/weapons/tuba_note12.ogg [deleted file]
sound/weapons/tuba_note13.ogg [deleted file]
sound/weapons/tuba_note14.ogg [deleted file]
sound/weapons/tuba_note15.ogg [deleted file]
sound/weapons/tuba_note16.ogg [deleted file]
sound/weapons/tuba_note17.ogg [deleted file]
sound/weapons/tuba_note18.ogg [deleted file]
sound/weapons/tuba_note19.ogg [deleted file]
sound/weapons/tuba_note2.ogg [deleted file]
sound/weapons/tuba_note20.ogg [deleted file]
sound/weapons/tuba_note21.ogg [deleted file]
sound/weapons/tuba_note22.ogg [deleted file]
sound/weapons/tuba_note23.ogg [deleted file]
sound/weapons/tuba_note24.ogg [deleted file]
sound/weapons/tuba_note25.ogg [deleted file]
sound/weapons/tuba_note26.ogg [deleted file]
sound/weapons/tuba_note27.ogg [deleted file]
sound/weapons/tuba_note3.ogg [deleted file]
sound/weapons/tuba_note4.ogg [deleted file]
sound/weapons/tuba_note5.ogg [deleted file]
sound/weapons/tuba_note6.ogg [deleted file]
sound/weapons/tuba_note7.ogg [deleted file]
sound/weapons/tuba_note8.ogg [deleted file]
sound/weapons/tuba_note9.ogg [deleted file]
tooltips.db
update-cvarcount.sh

index 53c5cf5b70d42fb993cfb065d6ba26de28d6c301..abd82b133fa159c61d145f8e4f1a037c2323eb7a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,15 +1,9 @@
 SCM := $(shell if [ -d .svn ]; then echo svn; elif [ -d ../.git ]; then echo git; fi)
-FTEQCC ?= fteqcc
 PERL ?= perl
 ZIP ?= 7za a -tzip -mx=9
 ZIPEXCLUDE ?= -x\!*.pk3 -xr\!\.svn -x\!qcsrc
 DIFF ?= diff
 
-FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"$(shell git describe)"' -DCVAR_POPCON
-FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
-FTEQCCFLAGS_PROGS ?=
-FTEQCCFLAGS_MENU ?=
-
 # NOTE: use -DUSE_FTE instead of -TFTE here!
 # It will automagically add an engine check with -TID and then change back to -TFTE
 FTEQCCFLAGS_CSPROGS ?= 
@@ -26,36 +20,14 @@ update-cvarcount:
 
 .PHONY: qc
 qc: update-cvarcount
-       $(MAKE) qc-recursive
-
-.PHONY: qc-recursive
-qc-recursive: menu.dat progs.dat csprogs.dat
+       $(MAKE) -C qcsrc
 
 .PHONY: skin
 skin: gfx/menu/default/skinvalues.txt
 
 .PHONY: clean
 clean:
-       rm -f progs.dat menu.dat csprogs.dat
-
-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 = $(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 = $(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)
+       $(MAKE) -C qcsrc clean
 
 gfx/menu/default/skinvalues.txt: qcsrc/menu/skin-customizables.inc
        $(PERL) qcsrc/menu/skin-customizables.inc > gfx/menu/default/skinvalues.txt
-
-.PHONY: testcase
-testcase:
-       cd qcsrc/testcase && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS) -DTESTCASE="$$TESTCASE"
diff --git a/autoexec.cfg b/autoexec.cfg
new file mode 100644 (file)
index 0000000..504904b
--- /dev/null
@@ -0,0 +1 @@
+// placeholder file, is replaced by autoexec.cfg in user home directory
diff --git a/autoexec/empty.cfg b/autoexec/empty.cfg
new file mode 100644 (file)
index 0000000..80d65ff
--- /dev/null
@@ -0,0 +1 @@
+// not so empty now
index 843bd634fdfedb6b7da041a49327245c3dd9f0d8..81381f4638cbc21084ac14e196e476554331e121 100644 (file)
@@ -542,6 +542,8 @@ set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_load 0
 set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 0
 set g_balance_hagar_secondary_load_releasedeath 1
@@ -695,6 +697,7 @@ set g_balance_tuba_damage 5
 set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
 // }}}
 // {{{ fireball
 set g_balance_fireball_primary_ammo 40
index 5a078e44cfe7dd5a7e10664f51ed33b5e288cf35..9e73743e9d6bf5a695c860dad883467d0c4ad8f3 100644 (file)
@@ -542,6 +542,8 @@ set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_load 0
 set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 0
 set g_balance_hagar_secondary_load_releasedeath 1
@@ -695,6 +697,7 @@ set g_balance_tuba_damage 5
 set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
 // }}}
 // {{{ fireball
 set g_balance_fireball_primary_ammo 40
index 02e804e798ed7aca25363201c6c120632cfc917a..b73360f204f479af25598a4ecb83559a3abd4a94 100644 (file)
@@ -542,6 +542,8 @@ set g_balance_hagar_primary_ammo 2
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_load 0
 set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 0
 set g_balance_hagar_secondary_load_releasedeath 1
@@ -695,6 +697,7 @@ set g_balance_tuba_damage 5
 set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
 // }}}
 // {{{ fireball
 set g_balance_fireball_primary_ammo 5
index 0c46451f4a2a1b1929d8a03104f11a4a228e2047..182e66cb1ccb486be92967163d2036a128321033 100644 (file)
@@ -144,7 +144,7 @@ set g_balance_fuel_limit 999
 // }}}
 
 // {{{ misc
-set g_balance_selfdamagepercent 0.75
+set g_balance_selfdamagepercent 0.65
 set g_balance_weaponswitchdelay 0.15
 set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 set g_weaponratefactor 1 "weapon fire rate multiplier"
@@ -286,13 +286,13 @@ set g_balance_uzi_burst_force 20
 set g_balance_uzi_burst_ammo 3
 
 set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 16
+set g_balance_uzi_first_damage 14
 set g_balance_uzi_first_force 5
 set g_balance_uzi_first_spread 0.03
-set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_refire 0.4
 set g_balance_uzi_first_ammo 1
 
-set g_balance_uzi_sustained_damage 14
+set g_balance_uzi_sustained_damage 12
 set g_balance_uzi_sustained_force 5
 set g_balance_uzi_sustained_spread 0.04
 set g_balance_uzi_sustained_refire 0.1
@@ -480,8 +480,8 @@ set g_balance_crylink_reload_time 2
 // {{{ nex
 set g_balance_nex_primary_damage 90
 set g_balance_nex_primary_force 400
-set g_balance_nex_primary_refire 1.25
-set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_refire 1.5
+set g_balance_nex_primary_animtime 0.4
 set g_balance_nex_primary_ammo 6
 set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
@@ -530,11 +530,11 @@ set g_balance_minstanex_reload_ammo 0 //default: 50
 set g_balance_minstanex_reload_time 2
 // }}}
 // {{{ hagar
-set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 15
+set g_balance_hagar_primary_damage 25
+set g_balance_hagar_primary_edgedamage 12.5
 set g_balance_hagar_primary_force 50
-set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.05
+set g_balance_hagar_primary_radius 60
+set g_balance_hagar_primary_spread 0.04
 set g_balance_hagar_primary_speed 2000
 set g_balance_hagar_primary_lifetime 5
 set g_balance_hagar_primary_refire 0.15
@@ -542,6 +542,8 @@ set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_load 1
 set g_balance_hagar_secondary_load_speed 0.5
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 1
 set g_balance_hagar_secondary_load_releasedeath 0
@@ -550,7 +552,7 @@ set g_balance_hagar_secondary_damage 40
 set g_balance_hagar_secondary_edgedamage 20
 set g_balance_hagar_secondary_force 50
 set g_balance_hagar_secondary_radius 80
-set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_spread 0.06
 set g_balance_hagar_secondary_speed 2000
 set g_balance_hagar_secondary_lifetime_min 10
 set g_balance_hagar_secondary_lifetime_rand 0
@@ -563,7 +565,7 @@ set g_balance_hagar_reload_time 2
 set g_balance_rocketlauncher_damage 80
 set g_balance_rocketlauncher_edgedamage 40
 set g_balance_rocketlauncher_force 400
-set g_balance_rocketlauncher_radius 100
+set g_balance_rocketlauncher_radius 110
 set g_balance_rocketlauncher_speed 1500
 set g_balance_rocketlauncher_speedaccel 1500
 set g_balance_rocketlauncher_speedstart 800
@@ -581,7 +583,7 @@ set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 set g_balance_rocketlauncher_remote_damage 70
 set g_balance_rocketlauncher_remote_edgedamage 35
-set g_balance_rocketlauncher_remote_radius 100
+set g_balance_rocketlauncher_remote_radius 110
 set g_balance_rocketlauncher_remote_force 400
 set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 set g_balance_rocketlauncher_reload_time 2
@@ -695,6 +697,7 @@ set g_balance_tuba_damage 5
 set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
 // }}}
 // {{{ fireball // this is a superweapon -- lets make it behave as one. 
 set g_balance_fireball_primary_ammo 20
index 57c4996871f3fc2fa46719ec04ac9e46cdf1aa75..fd229feb9f394aa8157e749d210ab8cd0b751e57 100644 (file)
@@ -541,6 +541,8 @@ set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
 set g_balance_hagar_secondary_load 0
 set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 0
 set g_balance_hagar_secondary_load_releasedeath 1
@@ -694,6 +696,7 @@ set g_balance_tuba_damage 5
 set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
 // }}}
 // {{{ fireball
 set g_balance_fireball_primary_ammo 40
index f470875425711ad29ff89f9e2df2a3ad98594823..a99803136122e0b31e9d280c09a2b9ef06f42822 100644 (file)
@@ -13,9 +13,15 @@ alias _update_configversion_3 "cl_gunalign 3; menu_cl_gunalign 3; _update_config
 // place to put further updates
 alias _update_configversion_4 "snd_entchannel0volume 1; snd_entchannel1volume 1; snd_entchannel2volume 1; snd_entchannel3volume 1; snd_entchannel4volume 1; snd_entchannel5volume 1; snd_entchannel6volume 1; snd_entchannel7volume 1; snd_playerchannel0volume 1; snd_playerchannel1volume 1; snd_playerchannel2volume 1; snd_playerchannel3volume 1; snd_playerchannel4volume 1; snd_playerchannel5volume 1; snd_playerchannel6volume 1; snd_playerchannel7volume 1; snd_worldchannel0volume 1; snd_worldchannel1volume 1; snd_worldchannel2volume 1; snd_worldchannel3volume 1; snd_worldchannel4volume 1; snd_worldchannel5volume 1; snd_worldchannel6volume 1; snd_worldchannel7volume 1; snd_csqcchannel0volume 1; snd_csqcchannel1volume 1; snd_csqcchannel2volume 1; snd_csqcchannel3volume 1; snd_csqcchannel4volume 1; snd_csqcchannel5volume 1; snd_csqcchannel6volume 1; snd_csqcchannel7volume 1; _update_configversion_5"
 
+// fix for common broken config for unknown reason
+alias _update_configversion_5 "r_shadow_realtime_world_lightmaps 1; _update_configversion_6"
+
+// some people have freetype issues, weird
+alias _update_configversion_6 "r_font_disable_freetype 0; utf8_enable 1; _update_configversion_7"
+
 // place to put further updates
-alias _update_configversion_5 ""
+alias _update_configversion_7 ""
 
 _update_configversion_$g_configversion
 
-set g_configversion 5
+set g_configversion 7
index c7bbe00a7752d5d7c4b336d0ab6a37769375959d..52a844f0b917c5232d80a1ccd44d9296dacd0ca9 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -192,443 +192,443 @@ msgstr "Zwischenzeit %d"
 msgid "%s (%s %s)"
 msgstr "%s (%s %s)"
 
-#: qcsrc/client/hud.qc:735
+#: qcsrc/client/hud.qc:772
 msgid "Out of ammo"
 msgstr "Keine Munition mehr."
 
-#: qcsrc/client/hud.qc:739
+#: qcsrc/client/hud.qc:776
 msgid "Don't have"
 msgstr "nicht vorhanden"
 
-#: qcsrc/client/hud.qc:743
+#: qcsrc/client/hud.qc:780
 msgid "Unavailable"
 msgstr "nicht verfügbar"
 
-#: qcsrc/client/hud.qc:1483
+#: qcsrc/client/hud.qc:1520
 #, c-format
 msgid "^1%s^1 couldn't take it anymore\n"
 msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
 
-#: qcsrc/client/hud.qc:1487 qcsrc/client/hud.qc:1791
+#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
 #, c-format
 msgid "^1%s^1 died\n"
 msgstr "^1%s^1 ist gestorben\n"
 
-#: qcsrc/client/hud.qc:1491
+#: qcsrc/client/hud.qc:1528
 #, c-format
 msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
 
-#: qcsrc/client/hud.qc:1495
+#: qcsrc/client/hud.qc:1532
 #, c-format
 msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
 
-#: qcsrc/client/hud.qc:1499
+#: qcsrc/client/hud.qc:1536
 #, c-format
 msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
 
-#: qcsrc/client/hud.qc:1503
+#: qcsrc/client/hud.qc:1540
 #, c-format
 msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:1507
+#: qcsrc/client/hud.qc:1544
 #, c-format
 msgid "^1%s^1 burned to death\n"
 msgstr "^1%s^1 brannte zu Tode\n"
 
-#: qcsrc/client/hud.qc:1511
+#: qcsrc/client/hud.qc:1548
 #, c-format
 msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 "^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
 
-#: qcsrc/client/hud.qc:1515
+#: qcsrc/client/hud.qc:1552
 #, c-format
 msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
 
-#: qcsrc/client/hud.qc:1532
+#: qcsrc/client/hud.qc:1569
 #, c-format
 msgid "^1%s^1 took action against a team mate\n"
 msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
 
-#: qcsrc/client/hud.qc:1534
+#: qcsrc/client/hud.qc:1571
 #, c-format
 msgid "^1%s^1 mows down a team mate\n"
 msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
 
-#: qcsrc/client/hud.qc:1539
+#: qcsrc/client/hud.qc:1576
 #, c-format
 msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 "^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem "
 "Mitspieler aus\n"
 
-#: qcsrc/client/hud.qc:1541
+#: qcsrc/client/hud.qc:1578
 #, c-format
 msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
 
-#: qcsrc/client/hud.qc:1545
+#: qcsrc/client/hud.qc:1582
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 "^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
 
-#: qcsrc/client/hud.qc:1547
+#: qcsrc/client/hud.qc:1584
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
 
-#: qcsrc/client/hud.qc:1551
+#: qcsrc/client/hud.qc:1588
 #, c-format
 msgid "^1%s^1 drew first blood\n"
 msgstr "^1%s^1 war der Erste\n"
 
-#: qcsrc/client/hud.qc:1555
+#: qcsrc/client/hud.qc:1592
 #, c-format
 msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
 
-#: qcsrc/client/hud.qc:1557
+#: qcsrc/client/hud.qc:1594
 #, c-format
 msgid "^1%s^1 was telefragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 telefragged\n"
 
-#: qcsrc/client/hud.qc:1562
+#: qcsrc/client/hud.qc:1599
 #, c-format
 msgid "^1%s^1 was drowned by %s\n"
 msgstr "^1%s^1 wurde von %s^1 etränkt\n"
 
-#: qcsrc/client/hud.qc:1567
+#: qcsrc/client/hud.qc:1604
 #, c-format
 msgid "^1%s^1 was slimed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:1572
+#: qcsrc/client/hud.qc:1609
 #, c-format
 msgid "^1%s^1 was cooked by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gebraten\n"
 
-#: qcsrc/client/hud.qc:1577
+#: qcsrc/client/hud.qc:1614
 #, c-format
 msgid "^1%s^1 was grounded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 geerdet\n"
 
-#: qcsrc/client/hud.qc:1582
+#: qcsrc/client/hud.qc:1619
 #, c-format
 msgid "^1%s^1 was shot into space by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
 
-#: qcsrc/client/hud.qc:1587
+#: qcsrc/client/hud.qc:1624
 #, c-format
 msgid "^1%s^1 was conserved by %s\n"
 msgstr "^1%s^1 wurde von %s^1 konserviert\n"
 
-#: qcsrc/client/hud.qc:1593
+#: qcsrc/client/hud.qc:1630
 #, c-format
 msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
 
-#: qcsrc/client/hud.qc:1597
+#: qcsrc/client/hud.qc:1634
 #, c-format
 msgid "^1%s^1 was crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
 
-#: qcsrc/client/hud.qc:1601
+#: qcsrc/client/hud.qc:1638
 #, c-format
 msgid "^1%s^1 got shredded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerstückelt\n"
 
-#: qcsrc/client/hud.qc:1605
+#: qcsrc/client/hud.qc:1642
 #, c-format
 msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Luft gejagt\n"
 
-#: qcsrc/client/hud.qc:1609
+#: qcsrc/client/hud.qc:1646
 #, c-format
 msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr "^1%s^1 wurde von der Explosion von %s^1s Fahrzeug erwischt\n"
 
-#: qcsrc/client/hud.qc:1613
+#: qcsrc/client/hud.qc:1650
 #, c-format
 msgid "^1%s^1 was bolted down by %s\n"
 msgstr "^1%s^1 wurde von %s^1 niedergeschmettert\n"
 
-#: qcsrc/client/hud.qc:1617
+#: qcsrc/client/hud.qc:1654
 #, c-format
 msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr "^1%s^1 fand keine Deckung vor %s^1s Raketen\n"
 
-#: qcsrc/client/hud.qc:1621
+#: qcsrc/client/hud.qc:1658
 #, c-format
 msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Wakizashi.\n"
 
-#: qcsrc/client/hud.qc:1625
+#: qcsrc/client/hud.qc:1662
 #, c-format
 msgid "^1%s^1 nailed to hell by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Hölle geschossen\n"
 
-#: qcsrc/client/hud.qc:1629
+#: qcsrc/client/hud.qc:1666
 #, c-format
 msgid "^1%s^1 cluster crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 total zerstört\n"
 
-#: qcsrc/client/hud.qc:1633
+#: qcsrc/client/hud.qc:1670
 #, c-format
 msgid "^1%s^1 dies when %s^1's raptor dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Raptor.\n"
 
-#: qcsrc/client/hud.qc:1637
+#: qcsrc/client/hud.qc:1674
 #, c-format
 msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins offene Feuer geschubst\n"
 
-#: qcsrc/client/hud.qc:1641
+#: qcsrc/client/hud.qc:1678
 #, c-format
 msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in einen unglücklichen Unfall geschubst\n"
 
-#: qcsrc/client/hud.qc:1645
+#: qcsrc/client/hud.qc:1682
 #, c-format
 msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr "^1%s^1 wurde von %s auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:1649
+#: qcsrc/client/hud.qc:1686
 #, c-format
 msgid "^1%s^1 was burnt to death by %s\n"
 msgstr "^1%s^1 wurde von %s verbrannt\n"
 
-#: qcsrc/client/hud.qc:1661
+#: qcsrc/client/hud.qc:1698
 #, c-format
 msgid "^1%s^1 was fragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gefraggt\n"
 
-#: qcsrc/client/hud.qc:1666
+#: qcsrc/client/hud.qc:1703
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr "^1%s^1's Punkte-Folge wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:1668
+#: qcsrc/client/hud.qc:1705
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr "^1%s^1's Kill-Spree wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:1671
+#: qcsrc/client/hud.qc:1708
 #, c-format
 msgid "^1%s^1 made %s scores in a row\n"
 msgstr "^1%s^1 machte %s Punkte hintereinander\n"
 
-#: qcsrc/client/hud.qc:1673
+#: qcsrc/client/hud.qc:1710
 #, c-format
 msgid "^1%s^1 has %s frags in a row\n"
 msgstr "^1%s^1 hat %s Frags hintereinander\n"
 
-#: qcsrc/client/hud.qc:1676
+#: qcsrc/client/hud.qc:1713
 #, c-format
 msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr "%s^7 hat einen ^1TRIPLE SCORE\n"
 
-#: qcsrc/client/hud.qc:1678
+#: qcsrc/client/hud.qc:1715
 #, c-format
 msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr "%s^7 hat einen ^1TRIPLE FRAG\n"
 
-#: qcsrc/client/hud.qc:1681
+#: qcsrc/client/hud.qc:1718
 #, c-format
 msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr "%s^7 hat ^1PUNKTE-RASEN\n"
 
-#: qcsrc/client/hud.qc:1683
+#: qcsrc/client/hud.qc:1720
 #, c-format
 msgid "%s^7 unleashes ^1RAGE\n"
 msgstr "%s^7 ^1RAST VOR ZORN\n"
 
-#: qcsrc/client/hud.qc:1686
+#: qcsrc/client/hud.qc:1723
 #, c-format
 msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZEHN PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:1688
+#: qcsrc/client/hud.qc:1725
 #, c-format
 msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr "%s^7 beginnt das ^1MASSAKER!\n"
 
-#: qcsrc/client/hud.qc:1691
+#: qcsrc/client/hud.qc:1728
 #, c-format
 msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFZEHN PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1693
+#: qcsrc/client/hud.qc:1730
 #, c-format
 msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr "%s^7 erzeugt das ^1CHAOS!\n"
 
-#: qcsrc/client/hud.qc:1696
+#: qcsrc/client/hud.qc:1733
 #, c-format
 msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZWANZIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1698
+#: qcsrc/client/hud.qc:1735
 #, c-format
 msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr "%s^7 ist ein ^1BERSERKER!\n"
 
-#: qcsrc/client/hud.qc:1701
+#: qcsrc/client/hud.qc:1738
 #, c-format
 msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFUNDZWANZIG PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:1703
+#: qcsrc/client/hud.qc:1740
 #, c-format
 msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr "%s^7 hält ein ^1BLUTBAD!\n"
 
-#: qcsrc/client/hud.qc:1706
+#: qcsrc/client/hud.qc:1743
 #, c-format
 msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1DREISSIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1708
+#: qcsrc/client/hud.qc:1745
 #, c-format
 msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr "%s^7 lässt die ^1APOKALYPSE^7 los!\n"
 
-#: qcsrc/client/hud.qc:1716
+#: qcsrc/client/hud.qc:1753
 #, c-format
 msgid "^1%s^1 was in the water for too long\n"
 msgstr "^1%s^1 war zu lange im Wasser\n"
 
-#: qcsrc/client/hud.qc:1718
+#: qcsrc/client/hud.qc:1755
 #, c-format
 msgid "^1%s^1 drowned\n"
 msgstr "^1%s^1 ertrank\n"
 
-#: qcsrc/client/hud.qc:1723
+#: qcsrc/client/hud.qc:1760
 #, c-format
 msgid "^1%s^1 was slimed\n"
 msgstr "^1%s^1 wurde im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:1729
+#: qcsrc/client/hud.qc:1766
 #, c-format
 msgid "^1%s^1 found a hot place\n"
 msgstr "^1%s^1 fand einen heißen Ort\n"
 
-#: qcsrc/client/hud.qc:1731
+#: qcsrc/client/hud.qc:1768
 #, c-format
 msgid "^1%s^1 turned into hot slag\n"
 msgstr "^1%s^1 verwandelte sich in heiße Schlacke\n"
 
-#: qcsrc/client/hud.qc:1738
+#: qcsrc/client/hud.qc:1775
 #, c-format
 msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr "^1%s^1 probierte die Gravitation aus (und sie funktionierte)\n"
 
-#: qcsrc/client/hud.qc:1740
+#: qcsrc/client/hud.qc:1777
 #, c-format
 msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr "^1%s^1 landete mit einem Knall auf dem Boden\n"
 
-#: qcsrc/client/hud.qc:1745
+#: qcsrc/client/hud.qc:1782
 #, c-format
 msgid "^1%s^1 became a shooting star\n"
 msgstr "^1%s^1 wurde zu einer Sternschnuppe\n"
 
-#: qcsrc/client/hud.qc:1751
+#: qcsrc/client/hud.qc:1788
 #, c-format
 msgid "^1%s^1 discovered a swamp\n"
 msgstr "^1%s^1 entdeckte einen Sumpf\n"
 
-#: qcsrc/client/hud.qc:1753
+#: qcsrc/client/hud.qc:1790
 #, c-format
 msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr "^1%s^1 ist jetzt für Jahrhunderte konserviert\n"
 
-#: qcsrc/client/hud.qc:1758
+#: qcsrc/client/hud.qc:1795
 #, c-format
 msgid "^1%s^1 was mowed down by a turret \n"
 msgstr "^1%s^1 wurde von einem Turret niedergemäht\n"
 
-#: qcsrc/client/hud.qc:1770
+#: qcsrc/client/hud.qc:1807
 #, c-format
 msgid "^1%s^1 died in an accident\n"
 msgstr "^1%s^1 starb an einem Unfall\n"
 
-#: qcsrc/client/hud.qc:1774
+#: qcsrc/client/hud.qc:1811
 #, c-format
 msgid "^1%s^1 was unfairly eliminated\n"
 msgstr "^1%s^1 wurde auf unfaire Weise eliminiert\n"
 
-#: qcsrc/client/hud.qc:1780
+#: qcsrc/client/hud.qc:1817
 #, c-format
 msgid "^1%s^1 felt a little hot\n"
 msgstr "^1%s^1 fand es ein wenig zu warm\n"
 
-#: qcsrc/client/hud.qc:1782
+#: qcsrc/client/hud.qc:1819
 #, c-format
 msgid "^1%s^1 burnt to death\n"
 msgstr "^1%s^1 verbrannte\n"
 
-#: qcsrc/client/hud.qc:1789
+#: qcsrc/client/hud.qc:1826
 #, c-format
 msgid "^1%s^1 needs a restart\n"
 msgstr "^1%s^1 braucht einen Neustart\n"
 
-#: qcsrc/client/hud.qc:1796
+#: qcsrc/client/hud.qc:1833
 #, c-format
 msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr "^1%s^1 braucht einen Neustart nach %d Punkten in Folge\n"
 
-#: qcsrc/client/hud.qc:1798
+#: qcsrc/client/hud.qc:1835
 #, c-format
 msgid "^1%s^1 died with a %d kill spree\n"
 msgstr "^1%s^1 starb mit einer %d-Kill-Spree\n"
 
-#: qcsrc/client/hud.qc:1802
+#: qcsrc/client/hud.qc:1839
 #, c-format
 msgid "%s^7 got the %s\n"
 msgstr "%s^7 bekam die %s\n"
 
-#: qcsrc/client/hud.qc:1805
+#: qcsrc/client/hud.qc:1842
 #, c-format
 msgid "%s^7 lost the %s\n"
 msgstr "%s^7 verlor die %s\n"
 
-#: qcsrc/client/hud.qc:1808
+#: qcsrc/client/hud.qc:1845
 #, c-format
 msgid "%s^7 picked up the %s\n"
 msgstr "%s^7 nahm sich die %s\n"
 
-#: qcsrc/client/hud.qc:1811
+#: qcsrc/client/hud.qc:1848
 #, c-format
 msgid "%s^7 returned the %s\n"
 msgstr "%s^7 brachte die %s^7 zurück\n"
 
-#: qcsrc/client/hud.qc:1814
+#: qcsrc/client/hud.qc:1851
 #, c-format
 msgid "%s^7 captured the %s%s\n"
 msgstr "%s^7 eroberte die %s%s\n"
 
-#: qcsrc/client/hud.qc:1833
+#: qcsrc/client/hud.qc:1870
 #, c-format
 msgid "%s^7 has picked up the ball!\n"
 msgstr "%s^7 hat den Ball genommen!\n"
 
-#: qcsrc/client/hud.qc:1838
+#: qcsrc/client/hud.qc:1875
 #, c-format
 msgid "%s^7 has dropped the ball!\n"
 msgstr "%s^7 hat den Ball verloren!\n"
 
-#: qcsrc/client/hud.qc:1849
+#: qcsrc/client/hud.qc:1886
 #, c-format
 msgid "You are now on: %s"
 msgstr "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:1851
+#: qcsrc/client/hud.qc:1888
 #, c-format
 msgid ""
 "You have been moved into a different team to improve team balance\n"
@@ -637,312 +637,312 @@ msgstr ""
 "Du wurdest in ein anderes Team verschoben, um Team-Balance zu verbessern.\n"
 "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:1854
+#: qcsrc/client/hud.qc:1891
 msgid "^1Reconsider your tactics, camper!"
 msgstr "^1Ändere dein Verhalten, Camper!"
 
-#: qcsrc/client/hud.qc:1856
+#: qcsrc/client/hud.qc:1893
 msgid "^1Die camper!"
 msgstr "^1Stirb, Camper!"
 
-#: qcsrc/client/hud.qc:1859
+#: qcsrc/client/hud.qc:1896
 msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 "^1Du wurdest ins Spiel neu eingesetzt, weil dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:1861
+#: qcsrc/client/hud.qc:1898
 msgid "^1You were killed for running out of ammo..."
 msgstr "^1Du wurdest getötet, da dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:1864
+#: qcsrc/client/hud.qc:1901
 msgid "^1You need to preserve your health"
 msgstr "^1Du solltest deine Gesundheit erhalten"
 
-#: qcsrc/client/hud.qc:1866
+#: qcsrc/client/hud.qc:1903
 msgid "^1You grew too old without taking your medicine"
 msgstr "^1Du wurdest zu alt, und hast nicht deine Medizin genommen"
 
-#: qcsrc/client/hud.qc:1869
+#: qcsrc/client/hud.qc:1906
 msgid "^1Don't go against team mates!"
 msgstr "^1Ärgere deine Teamkollegen nicht!"
 
-#: qcsrc/client/hud.qc:1871
+#: qcsrc/client/hud.qc:1908
 msgid "^1Don't shoot your team mates!"
 msgstr "^1Schieße nicht auf deine Teamkollegen!"
 
-#: qcsrc/client/hud.qc:1876
+#: qcsrc/client/hud.qc:1913
 msgid "^1You need to be more careful!"
 msgstr "^1Sei vorsichtiger!"
 
-#: qcsrc/client/hud.qc:1878
+#: qcsrc/client/hud.qc:1915
 msgid "^1You killed your own dumb self!"
 msgstr "^1Du hast dich selbst umgebracht. Wie blöd."
 
-#: qcsrc/client/hud.qc:1883
+#: qcsrc/client/hud.qc:1920
 #, c-format
 msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:1885
+#: qcsrc/client/hud.qc:1922
 #, c-format
 msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:1889
+#: qcsrc/client/hud.qc:1926
 msgid "^1First score"
 msgstr "^1Erster Punkt"
 
-#: qcsrc/client/hud.qc:1891
+#: qcsrc/client/hud.qc:1928
 msgid "^1First blood"
 msgstr "^1Erstes Blut"
 
-#: qcsrc/client/hud.qc:1895
+#: qcsrc/client/hud.qc:1932
 msgid "^1First casualty"
 msgstr "^1Erster Kollateralschaden"
 
-#: qcsrc/client/hud.qc:1897
+#: qcsrc/client/hud.qc:1934
 msgid "^1First victim"
 msgstr "^1Erstes Opfer"
 
-#: qcsrc/client/hud.qc:1901
+#: qcsrc/client/hud.qc:1938
 #, c-format
 msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr "^1Du hast gegen ^7%s^1 gepunktet, während er am Tippen war!"
 
-#: qcsrc/client/hud.qc:1903
+#: qcsrc/client/hud.qc:1940
 #, c-format
 msgid "^1You typefragged ^7%s"
 msgstr "^1Du hast ^7%s^1 beim Tippen erschossen"
 
-#: qcsrc/client/hud.qc:1907
+#: qcsrc/client/hud.qc:1944
 #, c-format
 msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet, während du am Tippen warst!"
 
-#: qcsrc/client/hud.qc:1909
+#: qcsrc/client/hud.qc:1946
 #, c-format
 msgid "^1You were typefragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 erschossen, während du am Tippen warst"
 
-#: qcsrc/client/hud.qc:1913
+#: qcsrc/client/hud.qc:1950
 #, c-format
 msgid "^4You scored against ^7%s"
 msgstr "^4Du hast gegen ^7%s^4 gepunktet"
 
-#: qcsrc/client/hud.qc:1915
+#: qcsrc/client/hud.qc:1952
 #, c-format
 msgid "^4You fragged ^7%s"
 msgstr "^4Du hast ^7%s^4 getötet"
 
-#: qcsrc/client/hud.qc:1919
+#: qcsrc/client/hud.qc:1956
 #, c-format
 msgid "^1You were scored against by ^7%s"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet"
 
-#: qcsrc/client/hud.qc:1921
+#: qcsrc/client/hud.qc:1958
 #, c-format
 msgid "^1You were fragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 getötet"
 
-#: qcsrc/client/hud.qc:1926
+#: qcsrc/client/hud.qc:1963
 msgid "^1Watch your step!"
 msgstr "^1Achte, wo du hintrittst!"
 
-#: qcsrc/client/hud.qc:1995 qcsrc/client/hud.qc:1996 qcsrc/client/hud.qc:2481
+#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
 #, c-format
 msgid "Player %d"
 msgstr "Spieler %d"
 
-#: qcsrc/client/hud.qc:2786
+#: qcsrc/client/hud.qc:2823
 msgid "^1Intermediate 1 (+15.42)"
 msgstr "^1Intermediate 1 (+15.42)"
 
-#: qcsrc/client/hud.qc:2788 qcsrc/client/hud.qc:2830 qcsrc/client/hud.qc:2871
+#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
 #, c-format
 msgid "^1PENALTY: %.1f (%s)"
 msgstr "^1STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:2873
+#: qcsrc/client/hud.qc:2910
 #, c-format
 msgid "^2PENALTY: %.1f (%s)"
 msgstr "^2STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:2901
+#: qcsrc/client/hud.qc:2938
 msgid "^1You must answer before entering hud configure mode\n"
 msgstr "^1Du musst antworten, bevore das HUD konfiguriert werden kann\n"
 
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:2941
 msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
 msgstr "^2Name^7 statt \"^1Unregistered player^7\" in den Statistiken"
 
-#: qcsrc/client/hud.qc:2986
+#: qcsrc/client/hud.qc:3023
 msgid "A vote has been called for:"
 msgstr "Eine Abstimmung wurde initiiert für:"
 
-#: qcsrc/client/hud.qc:2988
+#: qcsrc/client/hud.qc:3025
 msgid "Allow servers to store and display your name?"
 msgstr "Erlaube Servern, deinen Namen zu speichern und später zu zeigen?"
 
-#: qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:3029
 msgid "^1Configure the HUD"
 msgstr "^1Das HUD konfigurieren"
 
-#: qcsrc/client/hud.qc:2996
+#: qcsrc/client/hud.qc:3033
 #, c-format
 msgid "Yes (%s): %d"
 msgstr "Ja (%s): %d"
 
-#: qcsrc/client/hud.qc:2998
+#: qcsrc/client/hud.qc:3035
 #, c-format
 msgid "No (%s): %d"
 msgstr "Nein (%s): %d"
 
-#: qcsrc/client/hud.qc:3501 qcsrc/client/hud.qc:3504 qcsrc/client/hud.qc:3506
+#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
 msgid "Personal best"
 msgstr "Persönliche Bestzeit"
 
-#: qcsrc/client/hud.qc:3519 qcsrc/client/hud.qc:3522 qcsrc/client/hud.qc:3524
+#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
 msgid "Server best"
 msgstr "Server-Bestzeit"
 
-#: qcsrc/client/hud.qc:3868
+#: qcsrc/client/hud.qc:3905
 msgid "^3Player^7: This is the chat area."
 msgstr "^3Player^7: Das ist der Chat-Bereich."
 
-#: qcsrc/client/hud.qc:3936
+#: qcsrc/client/hud.qc:3973
 #, c-format
 msgid "FPS: %.*f"
 msgstr "FPS: %.*f"
 
-#: qcsrc/client/hud.qc:4003
+#: qcsrc/client/hud.qc:4040
 msgid "^1Observing"
 msgstr "^1Beobachten"
 
-#: qcsrc/client/hud.qc:4005
+#: qcsrc/client/hud.qc:4042
 #, c-format
 msgid "^1Spectating: ^7%s"
 msgstr "^1Zuschauen bei: ^7%s"
 
-#: qcsrc/client/hud.qc:4009
+#: qcsrc/client/hud.qc:4046
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
 msgstr "^1Drücke ^3%s^1, um bei jemandem zuzuschauen"
 
-#: qcsrc/client/hud.qc:4011
+#: qcsrc/client/hud.qc:4048
 #, c-format
 msgid "^1Press ^3%s^1 for another player"
 msgstr "^1Drücke ^3%s^1 für einen anderen Spieler"
 
-#: qcsrc/client/hud.qc:4015
+#: qcsrc/client/hud.qc:4052
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr "^1Benutze ^3%s^1 oder ^3%s^1 zum Ändern der Geschwindigkeit"
 
-#: qcsrc/client/hud.qc:4017
+#: qcsrc/client/hud.qc:4054
 #, c-format
 msgid "^1Press ^3%s^1 to observe"
 msgstr "^1Drücke ^3%s^1 zum Beobachten"
 
-#: qcsrc/client/hud.qc:4020
+#: qcsrc/client/hud.qc:4057
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
 msgstr "^1Drücke ^3%s^1 für Spielmodus-Info"
 
-#: qcsrc/client/hud.qc:4024
+#: qcsrc/client/hud.qc:4061
 msgid "^1Wait for your turn to join"
 msgstr "^1Warte, bis du dran bist"
 
-#: qcsrc/client/hud.qc:4030
+#: qcsrc/client/hud.qc:4067
 msgid "^1Match has already begun"
 msgstr "^1Das Match hat bereits begonnen"
 
-#: qcsrc/client/hud.qc:4032
+#: qcsrc/client/hud.qc:4069
 msgid "^1You have no more lives left"
 msgstr "^1Du hast keine Leben mehr übrig"
 
-#: qcsrc/client/hud.qc:4034 qcsrc/client/hud.qc:4037
+#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
 #, c-format
 msgid "^1Press ^3%s^1 to join"
 msgstr "^1Drücke ^3%s^1 zum Mitspielen"
 
-#: qcsrc/client/hud.qc:4045
+#: qcsrc/client/hud.qc:4082
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
 msgstr "^1Das Spiel beginnt in ^3%d^1 Sekunden"
 
-#: qcsrc/client/hud.qc:4052
+#: qcsrc/client/hud.qc:4089
 msgid "^2Currently in ^1warmup^2 stage!"
 msgstr "^2Momentan in der ^1Aufwärmphase!"
 
-#: qcsrc/client/hud.qc:4067
+#: qcsrc/client/hud.qc:4104
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
 msgstr "%sDrücke ^3%s%s um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4069
+#: qcsrc/client/hud.qc:4106
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
 msgstr "%sDrücke ^3%s%s sobald du soweit bist"
 
-#: qcsrc/client/hud.qc:4074
+#: qcsrc/client/hud.qc:4111
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr "^2Warte, bis andere bereit sind, um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4076
+#: qcsrc/client/hud.qc:4113
 msgid "^2Waiting for others to ready up..."
 msgstr "^2Warte, bis andere bereit sind..."
 
-#: qcsrc/client/hud.qc:4082
+#: qcsrc/client/hud.qc:4119
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
 msgstr "^2Drücke ^3%s^2 um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4103
+#: qcsrc/client/hud.qc:4140
 msgid "Teamnumbers are unbalanced!"
 msgstr "Die Teams sind unbalanciert!"
 
-#: qcsrc/client/hud.qc:4108
+#: qcsrc/client/hud.qc:4145
 #, c-format
 msgid " Press ^3%s%s to adjust"
 msgstr "Drücke ^3%s%s um dies zu korrigieren"
 
-#: qcsrc/client/hud.qc:4116
+#: qcsrc/client/hud.qc:4153
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr "^7Drücke ^3ESC^7 um die HUD-Optionen zu zeigen"
 
-#: qcsrc/client/hud.qc:4118
+#: qcsrc/client/hud.qc:4155
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr "^3Doppelklick^7 auf ein Panel für Panel-spezifische Optionen."
 
-#: qcsrc/client/hud.qc:4120
+#: qcsrc/client/hud.qc:4157
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr "^3CTRL^7 um Kollisionstests zu deaktivieren, ^3SHIFT^7 und"
 
-#: qcsrc/client/hud.qc:4122
+#: qcsrc/client/hud.qc:4159
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr "^3ALT^7 + ^3PFEILTASTEN^7 für Feinjustierungen"
 
-#: qcsrc/client/hud.qc:4160
+#: qcsrc/client/hud.qc:4197
 msgid " qu/s"
 msgstr "qu/s"
 
-#: qcsrc/client/hud.qc:4164
+#: qcsrc/client/hud.qc:4201
 msgid " m/s"
 msgstr "m/s"
 
-#: qcsrc/client/hud.qc:4168
+#: qcsrc/client/hud.qc:4205
 msgid " km/h"
 msgstr "km/h"
 
-#: qcsrc/client/hud.qc:4172
+#: qcsrc/client/hud.qc:4209
 msgid " mph"
 msgstr "mph"
 
-#: qcsrc/client/hud.qc:4176
+#: qcsrc/client/hud.qc:4213
 msgid " knots"
 msgstr "Knoten"
 
-#: qcsrc/client/hud.qc:4823
+#: qcsrc/client/hud.qc:4860
 msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
 msgstr "Falsche Panel-Nummern in _hud_panelorder wurden automatisch behoben"
 
@@ -1180,8 +1180,8 @@ msgid "^2scoreboard_columns_set default\n"
 msgstr "^2scoreboard_columns_set default\n"
 
 #: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
-msgstr "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
+msgstr "^2scoreboard_columns_set ^7field1 field2 ...\n"
 
 #: qcsrc/client/scoreboard.qc:244
 msgid "The following field names are recognized (case insensitive):\n"
@@ -1603,7 +1603,7 @@ msgstr "MinstaNex"
 
 #: qcsrc/client/waypointsprites.qc:301
 msgid "Hook"
-msgstr "Hook"
+msgstr "Enterhaken"
 
 #: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
 msgid "Fireball"
@@ -1673,7 +1673,7 @@ msgstr "%s braucht Hilfe!"
 #: qcsrc/common/mapinfo.qc:1092
 #, c-format
 msgid "%s: %s"
-msgstr ""
+msgstr "%s: %s"
 
 #: qcsrc/server/w_crylink.qc:666
 #, c-format
@@ -1821,7 +1821,7 @@ msgstr "^1%s^1 wurde von %s^1 niedergehauen"
 
 #: qcsrc/server/w_hook.qc:2
 msgid "Grappling Hook"
-msgstr "Grappling Hook"
+msgstr "Enterhaken"
 
 #: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
index 5e4428f489d247b5d9a0ce70bd4bef531b9a01dd..cf220c0943f18b783127c3e30a537dd3f90ecf0a 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -173,750 +173,750 @@ msgstr ""
 msgid "%s (%s %s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:735
+#: qcsrc/client/hud.qc:772
 msgid "Out of ammo"
 msgstr ""
 
-#: qcsrc/client/hud.qc:739
+#: qcsrc/client/hud.qc:776
 msgid "Don't have"
 msgstr ""
 
-#: qcsrc/client/hud.qc:743
+#: qcsrc/client/hud.qc:780
 msgid "Unavailable"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1483
+#: qcsrc/client/hud.qc:1520
 #, c-format
 msgid "^1%s^1 couldn't take it anymore\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1487 qcsrc/client/hud.qc:1791
+#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
 #, c-format
 msgid "^1%s^1 died\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1491
+#: qcsrc/client/hud.qc:1528
 #, c-format
 msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1495
+#: qcsrc/client/hud.qc:1532
 #, c-format
 msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1499
+#: qcsrc/client/hud.qc:1536
 #, c-format
 msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1503
+#: qcsrc/client/hud.qc:1540
 #, c-format
 msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1507
+#: qcsrc/client/hud.qc:1544
 #, c-format
 msgid "^1%s^1 burned to death\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1511
+#: qcsrc/client/hud.qc:1548
 #, c-format
 msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1515
+#: qcsrc/client/hud.qc:1552
 #, c-format
 msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1532
+#: qcsrc/client/hud.qc:1569
 #, c-format
 msgid "^1%s^1 took action against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1534
+#: qcsrc/client/hud.qc:1571
 #, c-format
 msgid "^1%s^1 mows down a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1539
+#: qcsrc/client/hud.qc:1576
 #, c-format
 msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1541
+#: qcsrc/client/hud.qc:1578
 #, c-format
 msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1545
+#: qcsrc/client/hud.qc:1582
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1547
+#: qcsrc/client/hud.qc:1584
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1551
+#: qcsrc/client/hud.qc:1588
 #, c-format
 msgid "^1%s^1 drew first blood\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1555
+#: qcsrc/client/hud.qc:1592
 #, c-format
 msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1557
+#: qcsrc/client/hud.qc:1594
 #, c-format
 msgid "^1%s^1 was telefragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1562
+#: qcsrc/client/hud.qc:1599
 #, c-format
 msgid "^1%s^1 was drowned by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1567
+#: qcsrc/client/hud.qc:1604
 #, c-format
 msgid "^1%s^1 was slimed by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1572
+#: qcsrc/client/hud.qc:1609
 #, c-format
 msgid "^1%s^1 was cooked by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1577
+#: qcsrc/client/hud.qc:1614
 #, c-format
 msgid "^1%s^1 was grounded by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1582
+#: qcsrc/client/hud.qc:1619
 #, c-format
 msgid "^1%s^1 was shot into space by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1587
+#: qcsrc/client/hud.qc:1624
 #, c-format
 msgid "^1%s^1 was conserved by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1593
+#: qcsrc/client/hud.qc:1630
 #, c-format
 msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1597
+#: qcsrc/client/hud.qc:1634
 #, c-format
 msgid "^1%s^1 was crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1601
+#: qcsrc/client/hud.qc:1638
 #, c-format
 msgid "^1%s^1 got shredded by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1605
+#: qcsrc/client/hud.qc:1642
 #, c-format
 msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1609
+#: qcsrc/client/hud.qc:1646
 #, c-format
 msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1613
+#: qcsrc/client/hud.qc:1650
 #, c-format
 msgid "^1%s^1 was bolted down by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1617
+#: qcsrc/client/hud.qc:1654
 #, c-format
 msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1621
+#: qcsrc/client/hud.qc:1658
 #, c-format
 msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1625
+#: qcsrc/client/hud.qc:1662
 #, c-format
 msgid "^1%s^1 nailed to hell by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1629
+#: qcsrc/client/hud.qc:1666
 #, c-format
 msgid "^1%s^1 cluster crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1633
+#: qcsrc/client/hud.qc:1670
 #, c-format
 msgid "^1%s^1 dies when %s^1's raptor dies.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1637
+#: qcsrc/client/hud.qc:1674
 #, c-format
 msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1641
+#: qcsrc/client/hud.qc:1678
 #, c-format
 msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1645
+#: qcsrc/client/hud.qc:1682
 #, c-format
 msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1649
+#: qcsrc/client/hud.qc:1686
 #, c-format
 msgid "^1%s^1 was burnt to death by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1661
+#: qcsrc/client/hud.qc:1698
 #, c-format
 msgid "^1%s^1 was fragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1666
+#: qcsrc/client/hud.qc:1703
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1668
+#: qcsrc/client/hud.qc:1705
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1671
+#: qcsrc/client/hud.qc:1708
 #, c-format
 msgid "^1%s^1 made %s scores in a row\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1673
+#: qcsrc/client/hud.qc:1710
 #, c-format
 msgid "^1%s^1 has %s frags in a row\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1676
+#: qcsrc/client/hud.qc:1713
 #, c-format
 msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1678
+#: qcsrc/client/hud.qc:1715
 #, c-format
 msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1681
+#: qcsrc/client/hud.qc:1718
 #, c-format
 msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1683
+#: qcsrc/client/hud.qc:1720
 #, c-format
 msgid "%s^7 unleashes ^1RAGE\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1686
+#: qcsrc/client/hud.qc:1723
 #, c-format
 msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1688
+#: qcsrc/client/hud.qc:1725
 #, c-format
 msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1691
+#: qcsrc/client/hud.qc:1728
 #, c-format
 msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1693
+#: qcsrc/client/hud.qc:1730
 #, c-format
 msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1696
+#: qcsrc/client/hud.qc:1733
 #, c-format
 msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1698
+#: qcsrc/client/hud.qc:1735
 #, c-format
 msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1701
+#: qcsrc/client/hud.qc:1738
 #, c-format
 msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1703
+#: qcsrc/client/hud.qc:1740
 #, c-format
 msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1706
+#: qcsrc/client/hud.qc:1743
 #, c-format
 msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1708
+#: qcsrc/client/hud.qc:1745
 #, c-format
 msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1716
+#: qcsrc/client/hud.qc:1753
 #, c-format
 msgid "^1%s^1 was in the water for too long\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1718
+#: qcsrc/client/hud.qc:1755
 #, c-format
 msgid "^1%s^1 drowned\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1723
+#: qcsrc/client/hud.qc:1760
 #, c-format
 msgid "^1%s^1 was slimed\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1729
+#: qcsrc/client/hud.qc:1766
 #, c-format
 msgid "^1%s^1 found a hot place\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1731
+#: qcsrc/client/hud.qc:1768
 #, c-format
 msgid "^1%s^1 turned into hot slag\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1738
+#: qcsrc/client/hud.qc:1775
 #, c-format
 msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1740
+#: qcsrc/client/hud.qc:1777
 #, c-format
 msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1745
+#: qcsrc/client/hud.qc:1782
 #, c-format
 msgid "^1%s^1 became a shooting star\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1751
+#: qcsrc/client/hud.qc:1788
 #, c-format
 msgid "^1%s^1 discovered a swamp\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1753
+#: qcsrc/client/hud.qc:1790
 #, c-format
 msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1758
+#: qcsrc/client/hud.qc:1795
 #, c-format
 msgid "^1%s^1 was mowed down by a turret \n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1770
+#: qcsrc/client/hud.qc:1807
 #, c-format
 msgid "^1%s^1 died in an accident\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1774
+#: qcsrc/client/hud.qc:1811
 #, c-format
 msgid "^1%s^1 was unfairly eliminated\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1780
+#: qcsrc/client/hud.qc:1817
 #, c-format
 msgid "^1%s^1 felt a little hot\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1782
+#: qcsrc/client/hud.qc:1819
 #, c-format
 msgid "^1%s^1 burnt to death\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1789
+#: qcsrc/client/hud.qc:1826
 #, c-format
 msgid "^1%s^1 needs a restart\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1796
+#: qcsrc/client/hud.qc:1833
 #, c-format
 msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1798
+#: qcsrc/client/hud.qc:1835
 #, c-format
 msgid "^1%s^1 died with a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1802
+#: qcsrc/client/hud.qc:1839
 #, c-format
 msgid "%s^7 got the %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1805
+#: qcsrc/client/hud.qc:1842
 #, c-format
 msgid "%s^7 lost the %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1808
+#: qcsrc/client/hud.qc:1845
 #, c-format
 msgid "%s^7 picked up the %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1811
+#: qcsrc/client/hud.qc:1848
 #, c-format
 msgid "%s^7 returned the %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1814
+#: qcsrc/client/hud.qc:1851
 #, c-format
 msgid "%s^7 captured the %s%s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1833
+#: qcsrc/client/hud.qc:1870
 #, c-format
 msgid "%s^7 has picked up the ball!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1838
+#: qcsrc/client/hud.qc:1875
 #, c-format
 msgid "%s^7 has dropped the ball!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1849
+#: qcsrc/client/hud.qc:1886
 #, c-format
 msgid "You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1851
+#: qcsrc/client/hud.qc:1888
 #, c-format
 msgid ""
 "You have been moved into a different team to improve team balance\n"
 "You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1854
+#: qcsrc/client/hud.qc:1891
 msgid "^1Reconsider your tactics, camper!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1856
+#: qcsrc/client/hud.qc:1893
 msgid "^1Die camper!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1859
+#: qcsrc/client/hud.qc:1896
 msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/hud.qc:1861
+#: qcsrc/client/hud.qc:1898
 msgid "^1You were killed for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/hud.qc:1864
+#: qcsrc/client/hud.qc:1901
 msgid "^1You need to preserve your health"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1866
+#: qcsrc/client/hud.qc:1903
 msgid "^1You grew too old without taking your medicine"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1869
+#: qcsrc/client/hud.qc:1906
 msgid "^1Don't go against team mates!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1871
+#: qcsrc/client/hud.qc:1908
 msgid "^1Don't shoot your team mates!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1876
+#: qcsrc/client/hud.qc:1913
 msgid "^1You need to be more careful!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1878
+#: qcsrc/client/hud.qc:1915
 msgid "^1You killed your own dumb self!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1883
+#: qcsrc/client/hud.qc:1920
 #, c-format
 msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1885
+#: qcsrc/client/hud.qc:1922
 #, c-format
 msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1889
+#: qcsrc/client/hud.qc:1926
 msgid "^1First score"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1891
+#: qcsrc/client/hud.qc:1928
 msgid "^1First blood"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1895
+#: qcsrc/client/hud.qc:1932
 msgid "^1First casualty"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1897
+#: qcsrc/client/hud.qc:1934
 msgid "^1First victim"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1901
+#: qcsrc/client/hud.qc:1938
 #, c-format
 msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1903
+#: qcsrc/client/hud.qc:1940
 #, c-format
 msgid "^1You typefragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1907
+#: qcsrc/client/hud.qc:1944
 #, c-format
 msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1909
+#: qcsrc/client/hud.qc:1946
 #, c-format
 msgid "^1You were typefragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1913
+#: qcsrc/client/hud.qc:1950
 #, c-format
 msgid "^4You scored against ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1915
+#: qcsrc/client/hud.qc:1952
 #, c-format
 msgid "^4You fragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1919
+#: qcsrc/client/hud.qc:1956
 #, c-format
 msgid "^1You were scored against by ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1921
+#: qcsrc/client/hud.qc:1958
 #, c-format
 msgid "^1You were fragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1926
+#: qcsrc/client/hud.qc:1963
 msgid "^1Watch your step!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1995 qcsrc/client/hud.qc:1996 qcsrc/client/hud.qc:2481
+#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
 #, c-format
 msgid "Player %d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2786
+#: qcsrc/client/hud.qc:2823
 msgid "^1Intermediate 1 (+15.42)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2788 qcsrc/client/hud.qc:2830 qcsrc/client/hud.qc:2871
+#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
 #, c-format
 msgid "^1PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2873
+#: qcsrc/client/hud.qc:2910
 #, c-format
 msgid "^2PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2901
+#: qcsrc/client/hud.qc:2938
 msgid "^1You must answer before entering hud configure mode\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:2941
 msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2986
+#: qcsrc/client/hud.qc:3023
 msgid "A vote has been called for:"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2988
+#: qcsrc/client/hud.qc:3025
 msgid "Allow servers to store and display your name?"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:3029
 msgid "^1Configure the HUD"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2996
+#: qcsrc/client/hud.qc:3033
 #, c-format
 msgid "Yes (%s): %d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2998
+#: qcsrc/client/hud.qc:3035
 #, c-format
 msgid "No (%s): %d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3501 qcsrc/client/hud.qc:3504 qcsrc/client/hud.qc:3506
+#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
 msgid "Personal best"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3519 qcsrc/client/hud.qc:3522 qcsrc/client/hud.qc:3524
+#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
 msgid "Server best"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3868
+#: qcsrc/client/hud.qc:3905
 msgid "^3Player^7: This is the chat area."
 msgstr ""
 
-#: qcsrc/client/hud.qc:3936
+#: qcsrc/client/hud.qc:3973
 #, c-format
 msgid "FPS: %.*f"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4003
+#: qcsrc/client/hud.qc:4040
 msgid "^1Observing"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4005
+#: qcsrc/client/hud.qc:4042
 #, c-format
 msgid "^1Spectating: ^7%s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4009
+#: qcsrc/client/hud.qc:4046
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4011
+#: qcsrc/client/hud.qc:4048
 #, c-format
 msgid "^1Press ^3%s^1 for another player"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4015
+#: qcsrc/client/hud.qc:4052
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4017
+#: qcsrc/client/hud.qc:4054
 #, c-format
 msgid "^1Press ^3%s^1 to observe"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4020
+#: qcsrc/client/hud.qc:4057
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4024
+#: qcsrc/client/hud.qc:4061
 msgid "^1Wait for your turn to join"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4030
+#: qcsrc/client/hud.qc:4067
 msgid "^1Match has already begun"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4032
+#: qcsrc/client/hud.qc:4069
 msgid "^1You have no more lives left"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4034 qcsrc/client/hud.qc:4037
+#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
 #, c-format
 msgid "^1Press ^3%s^1 to join"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4045
+#: qcsrc/client/hud.qc:4082
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4052
+#: qcsrc/client/hud.qc:4089
 msgid "^2Currently in ^1warmup^2 stage!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4067
+#: qcsrc/client/hud.qc:4104
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4069
+#: qcsrc/client/hud.qc:4106
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4074
+#: qcsrc/client/hud.qc:4111
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr ""
 
-#: qcsrc/client/hud.qc:4076
+#: qcsrc/client/hud.qc:4113
 msgid "^2Waiting for others to ready up..."
 msgstr ""
 
-#: qcsrc/client/hud.qc:4082
+#: qcsrc/client/hud.qc:4119
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4103
+#: qcsrc/client/hud.qc:4140
 msgid "Teamnumbers are unbalanced!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4108
+#: qcsrc/client/hud.qc:4145
 #, c-format
 msgid " Press ^3%s%s to adjust"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4116
+#: qcsrc/client/hud.qc:4153
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr ""
 
-#: qcsrc/client/hud.qc:4118
+#: qcsrc/client/hud.qc:4155
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr ""
 
-#: qcsrc/client/hud.qc:4120
+#: qcsrc/client/hud.qc:4157
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4122
+#: qcsrc/client/hud.qc:4159
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr ""
 
-#: qcsrc/client/hud.qc:4160
+#: qcsrc/client/hud.qc:4197
 msgid " qu/s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4164
+#: qcsrc/client/hud.qc:4201
 msgid " m/s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4168
+#: qcsrc/client/hud.qc:4205
 msgid " km/h"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4172
+#: qcsrc/client/hud.qc:4209
 msgid " mph"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4176
+#: qcsrc/client/hud.qc:4213
 msgid " knots"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4823
+#: qcsrc/client/hud.qc:4860
 msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
 msgstr ""
 
@@ -1278,7 +1278,7 @@ msgid "^2scoreboard_columns_set default\n"
 msgstr ""
 
 #: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
 msgstr ""
 
 #: qcsrc/client/scoreboard.qc:244
diff --git a/data/campaign.cfg b/data/campaign.cfg
new file mode 100644 (file)
index 0000000..c8a6efb
--- /dev/null
@@ -0,0 +1 @@
+// placeholder file, is replaced by data/campaign.cfg in user home directory
index 921735e819cd4be5efce8843a9950527b90c42eb..9ea422f760922646b35d59b63b9ae4e3cbbc345a 100644 (file)
@@ -53,6 +53,8 @@ alias asay_drop "say_team (%l) dropped %w ; impulse 17"
 alias +hook +button6
 alias -hook -button6
 alias use "impulse 21"
+alias +use use // always send that impulse AND press the key (+use is engine internal command and executes anyway)
+set cl_newusekeysupported 1 // indicates that we always send the use impulse too, so they do not need to be synthesized
 alias ready "cmd ready"
 alias lockteams "sv_cmd lockteams"
 alias unlockteams "sv_cmd unlockteams"
@@ -381,8 +383,6 @@ set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when c
 set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel"
 set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
 
-set sv_pogostick 1 "don't require releasing the space bar for jumping again"
-set cl_nopogostick 0 "when set on a client, server's setting of sv_pogostick is ignored (hint: when enabled, try both cl_movement_track_canjump modes)"
 set sv_doublejump 0 "allow Quake 2-style double jumps"
 set sv_jumpspeedcap_min "" "lower bound on the baseline velocity of a jump; final velocity will be >= (jumpheight * min + jumpheight)"
 set sv_jumpspeedcap_max "" "upper bound on the baseline velocity of a jump; final velocity will be <= (jumpheight * max + jumpheight)"
@@ -1040,8 +1040,7 @@ bind MWHEELDOWN weapprev
 bind r reload
 bind BACKSPACE dropweapon
 bind g dropweapon
-// TODO change this to "use" once we can
-bind f +use
+bind f use
 
 // misc
 bind e +hook
@@ -1189,6 +1188,7 @@ set g_campaign 0
 set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
 seta g_campaign_name "xonoticbeta"
 set g_campaign_skill 0
+alias warp "sv_cmd warp $*"
 
 alias singleplayer_start "g_campaign_index 0; set scmenu_campaign_goto 0"
 alias singleplayer_continue "set scmenu_campaign_goto -1"
@@ -1412,6 +1412,7 @@ seta slowmo 1
 seta menu_skin "luminos"
 set menu_slowmo 1
 seta menu_sounds 0 "enables menu sound effects. 1 enables click sounds, 2 also enables hover sounds"
+seta menu_tooltips 1 "menu tooltips: 0 disabled, 1 enabled, 2 also shows cvar or console command (when available) changed or executed by the item"
 set menu_picmip_bypass 0 "bypass texture quality enforcement based on system resources, not recommended and may cause crashes!"
 
 r_textbrightness 0.2
@@ -1448,6 +1449,7 @@ seta hud_panel_weapons_ammo_full_nails 200 "show 100% of the status bar at this
 seta hud_panel_weapons_ammo_full_cells 80 "show 100% of the status bar at this ammo count"
 seta hud_panel_weapons_ammo_full_rockets 80 "show 100% of the status bar at this ammo count"
 seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this ammo count"
+seta hud_panel_weapons_onlyowned 1 "show only owned weapons"
 
 seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
 
@@ -1999,6 +2001,9 @@ set _origin "0 0 0"
 set _campaign_index ""
 set _campaign_name ""
 
+// debug
+set _independent_players 0 "DO NOT TOUCH"
+
 // define some engine cvars that we need even on dedicated server
 set r_showbboxes 0
 
index d32971d16003712b92cd33b2d6d4d15f1478e2b9..09051a381ce47d56bb53426ef3aef704c4a29ac4 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -79,7 +79,7 @@ msgid "^4MQC Build information: ^1%s\n"
 msgstr "^4MQC Build-Information: ^1%s (deutsch)\n"
 
 #: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
 msgid "???"
 msgstr "???"
 
@@ -464,7 +464,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:600
+#: qcsrc/menu/xonotic/util.qc:612
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -603,34 +603,38 @@ msgid "Weapon icons:"
 msgstr "Waffensymbole:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr "Nur vorhandene Waffen zeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Show weapon ID as:"
 msgstr "Waffen-ID zeigen als:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
 msgid "SHOWAS^None"
 msgstr "nichts"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
 msgid "Number"
 msgstr "Zahl"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Bind"
 msgstr "Taste"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
 msgid "Show Accuracy"
 msgstr "Trefferquote zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Show Ammo"
 msgstr "Munition zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
 msgid "Ammo bar color:"
 msgstr "Muntionsleistenfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
 msgid "Ammo bar alpha:"
 msgstr "Munitionsleistenalpha:"
 
@@ -642,24 +646,24 @@ msgstr "HUD-Konfiguration"
 msgid "Panel background defaults:"
 msgstr "Panel-Standardhintergrund:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
 msgid "Background:"
 msgstr "Hintergrund:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
-#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
 msgid "Disable"
 msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
 msgid "Color:"
 msgstr "Farbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
 msgid "Border size:"
 msgstr "Rahmengröße:"
 
@@ -668,11 +672,11 @@ msgstr "Rahmengröße:"
 msgid "Team color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
 msgid "Test team color in configure mode"
 msgstr "Teamfarbe bei Konfiguration testen"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
 msgid "Padding:"
 msgstr "Abstand:"
 
@@ -1415,6 +1419,7 @@ msgstr "Schadenseffekt:"
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:173
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_input.c:74
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
 #: qcsrc/menu/xonotic/dialog_settings_video.c:109
@@ -2018,6 +2023,10 @@ msgstr "Mausbeschleunigung deaktivieren"
 msgid "\"enter console\" also closes"
 msgstr "\"Konsole öffnen\" schließt auch"
 
+#: qcsrc/menu/xonotic/dialog_settings_input.c:72
+msgid "Holding jump key keeps jumping"
+msgstr "Festhalten der Springen-Taste springt weiter"
+
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
 msgid "User defined key bind"
 msgstr "Benutzerdefinierte Tastenbelegung"
@@ -2270,11 +2279,11 @@ msgstr "Lichtstärke:"
 msgid "Singleplayer"
 msgstr "Einzelspieler"
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
 msgid "Instant action! (random map with bots)"
 msgstr "Sofortstart! (zufällige Map mit Bots)"
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
 msgid "Start Singleplayer!"
 msgstr "Spiel starten!"
 
@@ -2391,25 +2400,25 @@ msgstr "%s dB"
 msgid "%dx%d"
 msgstr "%dx%d"
 
-#: qcsrc/menu/xonotic/util.qc:270
+#: qcsrc/menu/xonotic/util.qc:271
 #, c-format
 msgid "Received HTTP request data for an invalid id %d.\n"
 msgstr "HTTP-Antwort für ungültige ID %d erhalten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:285
+#: qcsrc/menu/xonotic/util.qc:286
 #, c-format
 msgid "error receiving update notification: status is %d\n"
 msgstr "Fehler beim Empfang von Update-Information (Status: %d)\n"
 
-#: qcsrc/menu/xonotic/util.qc:290
+#: qcsrc/menu/xonotic/util.qc:291
 msgid "error: received HTML instead of an update notification\n"
 msgstr "Fehler: HTML statt Update-Information erhalten\n"
 
-#: qcsrc/menu/xonotic/util.qc:295
+#: qcsrc/menu/xonotic/util.qc:296
 msgid "error: received carriage returns from update notification server\n"
 msgstr "Fehler: Carriage-Returns in Update-Information enthalten\n"
 
-#: qcsrc/menu/xonotic/util.qc:316
+#: qcsrc/menu/xonotic/util.qc:317
 #, c-format
 msgid ""
 "Update can be downloaded at:\n"
@@ -2419,21 +2428,21 @@ msgstr ""
 "%s\n"
 "heruntergeladen werden.\n"
 
-#: qcsrc/menu/xonotic/util.qc:337
+#: qcsrc/menu/xonotic/util.qc:340
 msgid "Autogenerating mapinfo for newly added maps..."
 msgstr "Automatische Generierung von mapinfo-Dateien..."
 
-#: qcsrc/menu/xonotic/util.qc:367
+#: qcsrc/menu/xonotic/util.qc:370
 #, c-format
 msgid "^1%s TEST BUILD"
 msgstr "^1%s TESTVERSION"
 
-#: qcsrc/menu/xonotic/util.qc:432
+#: qcsrc/menu/xonotic/util.qc:428
 #, c-format
 msgid "Update to %s now!"
 msgstr "Jetzt auf %s updaten!"
 
-#: qcsrc/menu/xonotic/util.qc:501
+#: qcsrc/menu/xonotic/util.qc:513
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2441,86 +2450,86 @@ msgstr ""
 "^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
 "^1Darstellungsprobleme sind zu erwarten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:523
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:524
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:525
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:526
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:527
+#: qcsrc/menu/xonotic/util.qc:539
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:528
+#: qcsrc/menu/xonotic/util.qc:540
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:529
+#: qcsrc/menu/xonotic/util.qc:541
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:530
+#: qcsrc/menu/xonotic/util.qc:542
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:543
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:544
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:545
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:546
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:547
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:548
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:549
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:550
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:557
+#: qcsrc/menu/xonotic/util.qc:569
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba-Werfen"
 
-#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
-#: qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:634
 msgid "Default"
 msgstr "Standard"
 
-#: qcsrc/menu/xonotic/util.qc:588
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Use default"
 msgstr "Standard verwenden"
 
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:620
 msgid "Team Color:"
 msgstr "Teamfarbe:"
 
@@ -2694,7 +2703,7 @@ msgstr "^1%s^1 wurde von %s^1 niedergehauen"
 
 #: qcsrc/server/w_hook.qc:2
 msgid "Grappling Hook"
-msgstr "Grappling Hook"
+msgstr "Enterhaken"
 
 #: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
@@ -2885,8 +2894,8 @@ msgstr "Machine Gun"
 msgid "%s was riddled full of holes by %s"
 msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
 
-#~ msgid "Powerup sharpen"
-#~ msgstr "Bonus-Schärfe"
-
 #~ msgid "Damage & water blur"
 #~ msgstr "Schadens-Unschärfe"
+
+#~ msgid "Powerup sharpen"
+#~ msgstr "Bonus-Schärfe"
index ea85c33f59b81ea0454ff4f1e823f52a50992a8b..a64c1ac323a1a200c6ee50e0cc4aac9e31cc45e7 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -212,6 +212,7 @@ msgid "Intensity:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:109
+#: qcsrc/menu/xonotic/dialog_settings_input.c:74
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
@@ -228,24 +229,24 @@ msgstr ""
 msgid "Panel background defaults:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
 msgid "Background:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
-#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
 msgid "Disable"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
 msgid "Color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
 msgid "Border size:"
 msgstr ""
 
@@ -253,7 +254,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:600
+#: qcsrc/menu/xonotic/util.qc:612
 msgid "Alpha:"
 msgstr ""
 
@@ -262,11 +263,11 @@ msgstr ""
 msgid "Team color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
 msgid "Test team color in configure mode"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
 msgid "Padding:"
 msgstr ""
 
@@ -529,7 +530,7 @@ msgid "Save settings"
 msgstr ""
 
 #: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
 msgid "???"
 msgstr ""
 
@@ -580,6 +581,10 @@ msgstr ""
 msgid "\"enter console\" also closes"
 msgstr ""
 
+#: qcsrc/menu/xonotic/dialog_settings_input.c:72
+msgid "Holding jump key keeps jumping"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
 msgid "Weapons Panel"
 msgstr ""
@@ -618,34 +623,38 @@ msgid "Weapon icons:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Show weapon ID as:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
 msgid "SHOWAS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
 msgid "Number"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Bind"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
 msgid "Show Accuracy"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Show Ammo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
 msgid "Ammo bar color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
 msgid "Ammo bar alpha:"
 msgstr ""
 
@@ -862,11 +871,11 @@ msgstr ""
 msgid "Singleplayer"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
 msgid "Instant action! (random map with bots)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
 msgid "Start Singleplayer!"
 msgstr ""
 
@@ -1728,131 +1737,131 @@ msgstr ""
 msgid "Simple majority wins vcall"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:270
+#: qcsrc/menu/xonotic/util.qc:271
 #, c-format
 msgid "Received HTTP request data for an invalid id %d.\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:285
+#: qcsrc/menu/xonotic/util.qc:286
 #, c-format
 msgid "error receiving update notification: status is %d\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:290
+#: qcsrc/menu/xonotic/util.qc:291
 msgid "error: received HTML instead of an update notification\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:295
+#: qcsrc/menu/xonotic/util.qc:296
 msgid "error: received carriage returns from update notification server\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:316
+#: qcsrc/menu/xonotic/util.qc:317
 #, c-format
 msgid ""
 "Update can be downloaded at:\n"
 "%s\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:337
+#: qcsrc/menu/xonotic/util.qc:340
 msgid "Autogenerating mapinfo for newly added maps..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:367
+#: qcsrc/menu/xonotic/util.qc:370
 #, c-format
 msgid "^1%s TEST BUILD"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:432
+#: qcsrc/menu/xonotic/util.qc:428
 #, c-format
 msgid "Update to %s now!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:501
+#: qcsrc/menu/xonotic/util.qc:513
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:523
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Arena"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:524
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Assault"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:525
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Capture The Flag"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:526
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Clan Arena"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:527
+#: qcsrc/menu/xonotic/util.qc:539
 msgid "Deathmatch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:528
+#: qcsrc/menu/xonotic/util.qc:540
 msgid "Domination"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:529
+#: qcsrc/menu/xonotic/util.qc:541
 msgid "Freeze Tag"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:530
+#: qcsrc/menu/xonotic/util.qc:542
 msgid "Keepaway"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:543
 msgid "Key Hunt"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:544
 msgid "Last Man Standing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:545
 msgid "Nexball"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:546
 msgid "Onslaught"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:547
 msgid "Race"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:548
 msgid "Race CTS"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:549
 msgid "Runematch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:550
 msgid "Team Deathmatch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:557
+#: qcsrc/menu/xonotic/util.qc:569
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
-#: qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:634
 msgid "Default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:588
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Use default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:620
 msgid "Team Color:"
 msgstr ""
 
index 69f16648fb841be11bbb25588706b26a5a0f6c0e..81649e3d480087f591e80730c7e06e5aeb70f57e 100644 (file)
Binary files a/models/player/megaerebus.iqm_0.tga and b/models/player/megaerebus.iqm_0.tga differ
diff --git a/qcsrc/Makefile b/qcsrc/Makefile
new file mode 100644 (file)
index 0000000..e2be8a8
--- /dev/null
@@ -0,0 +1,47 @@
+SCM := $(shell if [ -d .svn ]; then echo svn; elif [ -d ../.git ]; then echo git; fi)
+FTEQCC ?= fteqcc
+PERL ?= perl
+
+FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"$(shell git describe)"' -DCVAR_POPCON
+FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
+FTEQCCFLAGS_PROGS ?=
+FTEQCCFLAGS_MENU ?=
+
+# NOTE: use -DUSE_FTE instead of -TFTE here!
+# It will automagically add an engine check with -TID and then change back to -TFTE
+FTEQCCFLAGS_CSPROGS ?= 
+
+# xonotic build system overrides this by command line argument to turn off the update-cvarcount step
+XON_BUILDSYSTEM =
+
+all: qc
+
+.PHONY: qc
+qc:
+       $(MAKE) qc-recursive
+
+.PHONY: qc-recursive
+qc-recursive: ../menu.dat ../progs.dat ../csprogs.dat
+
+.PHONY: clean
+clean:
+       rm -f ../progs.dat ../menu.dat ../csprogs.dat
+
+FILES_CSPROGS = $(shell find client common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
+../csprogs.dat: $(FILES_CSPROGS)
+       @echo make[1]: Entering directory \`$(PWD)/client\'
+       cd client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
+
+FILES_PROGS = $(shell find server common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
+../progs.dat: $(FILES_PROGS)
+       @echo make[1]: Entering directory \`$(PWD)/server\'
+       cd server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
+
+FILES_MENU = $(shell find menu common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
+../menu.dat: $(FILES_MENU)
+       @echo make[1]: Entering directory \`$(PWD)/menu\'
+       cd menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
+
+.PHONY: testcase
+testcase:
+       cd testcase && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS) -DTESTCASE="$$TESTCASE"
index 086594b9da587980f6bcb9710cd1c1f73feba930..f066a9fe58c5159e865865f97f00b4e4ae769b7b 100644 (file)
@@ -121,6 +121,7 @@ float autocvar_g_balance_damagepush_speedfactor;
 float autocvar_g_balance_tuba_attenuation;
 float autocvar_g_balance_tuba_fadetime;
 float autocvar_g_balance_tuba_volume;
+float autocvar_g_balance_tuba_pitchstep;
 float autocvar_g_warmup_limit;
 var float autocvar_g_waypointsprite_uppercase = 1;
 var float autocvar_g_waypointsprite_alpha = 1;
@@ -306,6 +307,7 @@ float autocvar_hud_panel_weapons_complainbubble_padding;
 float autocvar_hud_panel_weapons_complainbubble_time;
 var float autocvar_hud_panel_weapons_fade = 1;
 float autocvar_hud_panel_weapons_label;
+float autocvar_hud_panel_weapons_onlyowned;
 float autocvar_hud_panel_weapons_timeout;
 float autocvar_hud_panel_weapons_timeout_effect;
 float autocvar_hud_progressbar_alpha;
index 269f93087d77a7b996e001cdaa29d77715865d3d..1e2d4fbd8c92a3e1cec90f6710e16ba9a1cb2b15 100644 (file)
@@ -55,7 +55,7 @@ void Casing_Touch()
                                                break;
                                }
 
-                               sound (self, CH_SHOTS, s, VOL_BASE, ATTN_NORM);
+                               sound (self, CH_SHOTS, s, VOL_BASE, ATTN_LARGE);
                        }
                }
        }
index 48012e7a4ccf4a4c4fcd56dac92109dc095dd33f..6ef34f35eab5fa8109e2eda628b889ace10a431d 100644 (file)
@@ -336,3 +336,15 @@ float trace_dphitcontents;
 float trace_networkentity;
 
 string(string search, string replace, string subject) strreplace = #484;
+
+//DP_QC_DIGEST
+//idea: motorsep, Spike
+//DarkPlaces implementation: divVerent
+//builtin definitions:
+string(string digest, string data, ...) digest_hex = #639;
+//description:
+//returns a given hex digest of given data
+//the returned digest is always encoded in hexadecimal
+//only the "MD4" digest is always supported!
+//if the given digest is not supported, string_null is returned
+//the digest string is matched case sensitively, use "MD4", not "md4"!
index e82f4399bdb0ce9921ceabe7bf059ab9ff8673fd..f6e04e7b322e04a87f910c497f0b31a53a167b7b 100644 (file)
@@ -1,4 +1,4 @@
-const entity   NULL                                                    = world;
+#define NULL world
 
 // Mask Constants (set .drawmask on entities; use R_AddEntities to add all entities based on mask)
 const float            MASK_ENGINE                                             = 1;
index e273e0dc2e48b275f2c8802e630f7eaffd763628..05b42ed3629e095b47b54dffb9a87bb05e5df438 100644 (file)
@@ -250,11 +250,7 @@ HUD panels
 // draw the background/borders
 #define HUD_Panel_DrawBg(alpha)\
 if(panel_bg != "0")\
-       draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\
-if(highlightedPanel == hud_configure_active_panel && autocvar__hud_configure)\
-{\
-       HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\
-} ENDS_WITH_CURLY_BRACE
+       draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER))
 
 //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu
 void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, float vertical, float baralign, vector theColor, float theAlpha, float drawflag)
@@ -435,7 +431,7 @@ float GetAmmoTypeForWep(float i)
 
 void HUD_Weapons(void)
 {
-       float f, screen_ar;
+       float i, f, screen_ar;
        float center_x, center_y;
     if(hud != HUD_NORMAL) return;
        if(!autocvar__hud_configure)
@@ -468,6 +464,79 @@ void HUD_Weapons(void)
        HUD_Panel_UpdateCvars(weapons);
        HUD_Panel_ApplyFadeAlpha();
 
+       // TODO make this configurable
+       if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
+       {
+               float weapon_cnt;
+               if(weaponorder_bypriority)
+                       strunzone(weaponorder_bypriority);
+               if(weaponorder_byimpulse)
+                       strunzone(weaponorder_byimpulse);
+
+               weaponorder_bypriority = strzone(autocvar_cl_weaponpriority);
+               weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
+               weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
+
+               weapon_cnt = 0;
+               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+               {
+                       self = get_weaponinfo(i);
+                       if(self.impulse >= 0)
+                       {
+                               weaponorder[weapon_cnt] = self;
+                               ++weapon_cnt;
+                       }
+               }
+               for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i)
+                       weaponorder[i] = NULL;
+               heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
+
+               weaponorder_cmp_str = string_null;
+       }
+
+       float when, fadetime;
+       when = autocvar_hud_panel_weapons_complainbubble_time;
+       fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
+       float weapons_st = getstati(STAT_WEAPONS);
+       float weapon_count;
+       if (autocvar_hud_panel_weapons_onlyowned)
+       {
+               if(autocvar__hud_configure)
+               {
+                       if (weapons_st == 0)
+                               for(i = 0; i <= WEP_LAST-WEP_FIRST; i += floor((WEP_LAST-WEP_FIRST)/5))
+                                       weapons_st |= power2of(i);
+                       if(menu_enabled != 2)
+                               HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
+               }
+
+               vector old_panel_size;
+               for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
+               {
+                       if(weapons_st & weaponorder[i].weapons)
+                               ++weapon_count;
+               }
+               if(!autocvar__hud_configure && (autocvar_hud_panel_weapons_complainbubble && time - complain_weapon_time < when + fadetime))// && complain_weapon >= 0
+                       ++weapon_count;
+               if (weapon_count == 0)
+                       return;
+               // reduce size of the panel
+               if (panel_size_y > panel_size_x)
+               {
+                       old_panel_size_y = panel_size_y;
+                       panel_size_y *= weapon_count / WEP_COUNT;
+                       panel_pos_y += (old_panel_size_y - panel_size_y) / 2;
+               }
+               else
+               {
+                       old_panel_size_x = panel_size_x;
+                       panel_size_x *= weapon_count / WEP_COUNT;
+                       panel_pos_x += (old_panel_size_x - panel_size_x) / 2;
+               }
+       }
+       else
+               weapon_count = WEP_COUNT;
+
        if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
        {
                f = (time - (weapontime + timeout)) / timeout_effect_length;
@@ -531,37 +600,6 @@ void HUD_Weapons(void)
                }
        }
 
-       float i, weapid, wpnalpha, weapon_cnt;
-
-       // TODO make this configurable
-       if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
-       {
-               if(weaponorder_bypriority)
-                       strunzone(weaponorder_bypriority);
-               if(weaponorder_byimpulse)
-                       strunzone(weaponorder_byimpulse);
-
-               weaponorder_bypriority = strzone(autocvar_cl_weaponpriority);
-               weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
-               weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
-
-               weapon_cnt = 0;
-               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-               {
-                       self = get_weaponinfo(i);
-                       if(self.impulse >= 0)
-                       {
-                               weaponorder[weapon_cnt] = self;
-                               ++weapon_cnt;
-                       }
-               }
-               for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i)
-                       weaponorder[i] = NULL;
-               heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
-
-               weaponorder_cmp_str = string_null;
-       }
-
        HUD_Panel_DrawBg(1);
        if(panel_bg_padding)
        {
@@ -569,6 +607,8 @@ void HUD_Weapons(void)
                panel_size -= '2 2 0' * panel_bg_padding;
        }
 
+       float weapid, wpnalpha;
+
        if(autocvar_hud_panel_weapons_fade)
        {
                wpnalpha = 3.2 - 2 * (time - weapontime);
@@ -580,21 +620,17 @@ void HUD_Weapons(void)
        float rows, columns;
        float aspect = autocvar_hud_panel_weapons_aspect;
        rows = panel_size_y/panel_size_x;
-       rows = bound(1, floor((sqrt(4 * aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT);
+       rows = bound(1, floor((sqrt(4 * aspect * rows * weapon_count + rows * rows) + rows + 0.5) / 2), weapon_count);
 
-       columns = ceil(WEP_COUNT/rows);
+       columns = ceil(weapon_count/rows);
        float row, column;
 
        float a, type, fullammo;
-       float when;
-       when = autocvar_hud_panel_weapons_complainbubble_time;
-       float fadetime;
-       fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
 
        vector color;
        vector wpnpos;
        vector wpnsize;
-       
+
        vector ammo_color;
        float ammo_alpha;
        wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
@@ -629,13 +665,14 @@ void HUD_Weapons(void)
                                acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i))));
        }
 
-       float weapons_st = getstati(STAT_WEAPONS);
-
        for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
        {
                self = weaponorder[i];
                if (!self || self.impulse < 0)
                        continue;
+               if (autocvar_hud_panel_weapons_onlyowned)
+               if (!((weapons_st & self.weapons) || (self.weapon == complain_weapon && time - complain_weapon_time < when + fadetime && autocvar_hud_panel_weapons_complainbubble)))
+                       continue;
                wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y;
 
                weapid = self.impulse;
@@ -2460,19 +2497,20 @@ void HUD_Score_Rankings(vector pos, vector mySize, entity me, float team_count)
        entity tm, pl;
 #define SCOREPANEL_MAX_ENTRIES 6
 #define SCOREPANEL_ASPECTRATIO 2
-       const float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
-       const vector fontsize = '1 1 0' * (mySize_y/entries);
+       float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
+       vector fontsize = '1 1 0' * (mySize_y/entries);
 
        vector rgb, score_color;
        rgb = '1 1 1';
        score_color = '1 1 1';
 
-       const float name_size = mySize_x*0.75;
-       const float spacing_size = mySize_x*0.04;
+       float name_size = mySize_x*0.75;
+       float spacing_size = mySize_x*0.04;
        const float highlight_alpha = 0.2;
        float i, me_printed, first_pl;
        string s;
-       i, first_pl = 0;
+       i = 0;
+       first_pl = 0;
        if (autocvar__hud_configure)
        {
                float players_per_team;
@@ -4567,7 +4605,7 @@ void HUD_CenterPrint (void)
        {
                if (j == CENTERPRINT_MAX_MSGS)
                        j = 0;
-               if (centerprint_expire_time[j] < time)
+               if (centerprint_expire_time[j] <= time)
                {
                        if (centerprint_countdown_num[j] && centerprint_time[j] > 0)
                        {
@@ -4874,10 +4912,18 @@ void HUD_Main (void)
        if(autocvar__con_chat_maximized)
                HUD_Chat();
 
-       if(autocvar__hud_configure && tab_panel != -1)
+       if(autocvar__hud_configure)
        {
-               HUD_Panel_UpdatePosSizeForId(tab_panel)
-               drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL);
+               if(tab_panel != -1)
+               {
+                       HUD_Panel_UpdatePosSizeForId(tab_panel)
+                       drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL);
+               }
+               if(highlightedPanel != -1)
+               {
+                       HUD_Panel_UpdatePosSizeForId(highlightedPanel);
+                       HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha));
+               }
        }
 
        hud_configure_prev = autocvar__hud_configure;
index 109a9cf54a239b17e7280f2aa15823c06c3614f6..f26f65ea54b53d3c7a5d8cd564457416d81755d7 100644 (file)
@@ -680,7 +680,7 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary)
                float k, level, start_pos_x;
                vector candidate_pos;
                const float LEVELS_NUM = 4;
-               const float level_height = vid_conheight / LEVELS_NUM;
+               float level_height = vid_conheight / LEVELS_NUM;
 :find_tab_panel
                level = floor(tab_panel_pos_y / level_height) * level_height; //starting level
                candidate_pos_x = (!tab_backward) ? vid_conwidth : 0;
index 2562ba00544f9c5c651fa4ae8b0420f632870aa4..be457e480876119eaf22a614cfe8138c8ca374f1 100644 (file)
@@ -240,11 +240,11 @@ void Cmd_HUD_Help(float argc)
        print(_("^3|---------------------------------------------------------------|\n"));
        print(_("Usage:\n"));
        print(_("^2scoreboard_columns_set default\n"));
-       print(_("^2scoreboard_columns_set ^7filed1 field2 ...\n"));
+       print(_("^2scoreboard_columns_set ^7field1 field2 ...\n"));
        print(_("The following field names are recognized (case insensitive):\n"));
        print(_("You can use a ^3|^7 to start the right-aligned fields.\n\n"));
 
-       print(_("^3name^7 or ^3nick^7         Name of a player\n"));
+       print(_("^3name^7 or ^3nick^7             Name of a player\n"));
        print(_("^3ping^7                     Ping time\n"));
        print(_("^3pl^7                       Packet loss\n"));
        print(_("^3kills^7                    Number of kills\n"));
index 06edec4da0e00a82982093323a63ee5f84546548..6e1c1f9bd78b2ab3480a1054020fbec475edbc86 100644 (file)
@@ -1,6 +1,79 @@
-#define TUBA_STARTNOTE(n) strcat((checkextension("DP_SND_SETPARAMS") ? "weapons/tuba_loopnote" : "weapons/tuba_note"), ftos(n), ".wav")
-.float cnt; // note
+#define TUBA_MIN -18
+#define TUBA_MAX  27
+#define TUBA_INSTRUMENTS 1
+
+#define TUBA_STARTNOTE(i,n) strcat("weapons/tuba", (i ? ftos(i) : ""), "_loopnote", ftos(n), ".wav")
+.float note; // note
 .float attenuate; // if set, attenuate it
+.float cnt; // current volume
+.float count; // initial volume
+.float tuba_instrument;
+
+float Tuba_PitchStep;
+
+void tubasound(entity e, float restart)
+{
+       string snd1;
+
+       snd1 = string_null;
+
+       if(Tuba_PitchStep)
+       {
+               string snd2;
+               float f1, f2;
+               float p1, p2;
+               float m;
+
+               f1 = 1;
+               p1 = 1;
+               snd2 = string_null;
+               f2 = 0;
+               p2 = 1;
+
+               m = mod(e.note, Tuba_PitchStep);
+               if(m)
+               {
+                       if(e.note - m < TUBA_MIN)
+                       {
+                               if(restart)
+                                       snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
+                               p1 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
+                       }
+                       else if(e.note - m + Tuba_PitchStep > TUBA_MAX)
+                       {
+                               if(restart)
+                                       snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
+                               p1 = pow(2.0, m / 12.0);
+                       }
+                       else
+                       {
+                               if(restart)
+                                       snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
+                               f1 = cos(M_PI_2 * m / Tuba_PitchStep);
+                               p1 = pow(2.0, m / 12.0);
+                               if(restart)
+                                       snd2 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
+                               f2 = sin(M_PI_2 * m / Tuba_PitchStep);
+                               p2 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
+                       }
+               }
+               else
+               {
+                       if(restart)
+                               snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
+               }
+
+               sound7(e, CH_TUBA, snd1, e.cnt * f1, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p1, 0);
+               if(f2)
+                       sound7(e.enemy, CH_TUBA, snd2, e.cnt * f2, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p2, 0);
+       }
+       else
+       {
+               if(restart)
+                       snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
+               sound(e, CH_TUBA, snd1, e.cnt, e.attenuate * autocvar_g_balance_tuba_attenuation);
+       }
+}
 
 void Ent_TubaNote_Think()
 {
@@ -13,18 +86,27 @@ void Ent_TubaNote_Think()
        self.nextthink = time;
        if(self.cnt <= 0)
        {
-               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", 0, 0);
+               sound(self, CH_TUBA, "misc/null.wav", 0, 0);
+               if(self.enemy)
+               {
+                       sound(self.enemy, CH_TUBA, "misc/null.wav", 0, 0);
+                       remove(self.enemy);
+               }
                remove(self);
        }
        else
-               sound(self, CH_SHOTS_SINGLE, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
+       {
+               tubasound(self, 0);
+       }
 }
 
 void Ent_TubaNote_UpdateSound()
 {
        self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
        self.enemy.count = self.enemy.cnt;
-       sound(self.enemy, CH_SHOTS_SINGLE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
+       self.enemy.note = self.note;
+       self.enemy.tuba_instrument = self.tuba_instrument;
+       tubasound(self.enemy, 1);
 }
 
 void Ent_TubaNote_StopSound()
@@ -35,43 +117,78 @@ void Ent_TubaNote_StopSound()
 
 void Ent_TubaNote(float bIsNew)
 {
-       float f, n;
+       float f, n, i, att;
        f = ReadByte();
-       n = floor(f / 2) - 42;
-       if(n != self.cnt || bIsNew)
-               if(self.enemy)
-                       Ent_TubaNote_StopSound();
-       if(!self.enemy)
+
+       if(f & 1)
        {
-               self.enemy = spawn();
-               self.enemy.classname = "tuba_note";
-               bIsNew = TRUE;
+               n = ReadChar();
+               i = ReadByte();
+               att = (i & 1);
+               i = floor(i / 2);
+
+               if(n != self.note || i != self.tuba_instrument || bIsNew)
+               {
+                       if(self.enemy)
+                               Ent_TubaNote_StopSound();
+               }
+
+               if(!self.enemy)
+               {
+                       self.enemy = spawn();
+                       self.enemy.classname = "tuba_note";
+                       if(Tuba_PitchStep)
+                       {
+                               self.enemy.enemy = spawn();
+                               self.enemy.enemy.classname = "tuba_note_2";
+                       }
+                       bIsNew = TRUE;
+               }
+
+               self.enemy.attenuate = att;
+
+               if(bIsNew)
+               {
+                       self.note = n;
+                       self.tuba_instrument = i;
+                       Ent_TubaNote_UpdateSound();
+               }
        }
-       if(f & 1)
+
+       if(f & 2)
        {
                self.enemy.origin_x = ReadCoord();
                self.enemy.origin_y = ReadCoord();
                self.enemy.origin_z = ReadCoord();
                setorigin(self.enemy, self.enemy.origin);
-               self.enemy.attenuate = ReadByte();
+               if(self.enemy.enemy)
+                       setorigin(self.enemy.enemy, self.enemy.origin);
        }
+
        self.think = Ent_TubaNote_StopSound;
        self.entremove = Ent_TubaNote_StopSound;
        self.enemy.think = Ent_TubaNote_Think;
        self.enemy.nextthink = time + 10;
-       if(bIsNew)
-       {
-               self.cnt = n;
-               Ent_TubaNote_UpdateSound();
-       }
 }
 
 void Tuba_Precache()
 {
-       float i;
-       for(i = -18; i <= +27; ++i)
+       float i, n;
+       Tuba_PitchStep = autocvar_g_balance_tuba_pitchstep;
+       if(Tuba_PitchStep)
+       {
+               if(!checkextension("DP_SND_SOUND7_WIP2") && !checkextension("DP_SND_SOUND7"))
+               {
+                       print("^1NOTE:^7 requested pitch shifting, but not supported by this engine build\n");
+                       Tuba_PitchStep = 0;
+               }
+       }
+       for(n = TUBA_MIN; n <= TUBA_MAX; ++n)
        {
-               precache_sound(TUBA_STARTNOTE(i));
+               if(!Tuba_PitchStep || (mod(n, Tuba_PitchStep) == 0))
+               {
+                       for(i = 0; i < TUBA_INSTRUMENTS; ++i)
+                               precache_sound(TUBA_STARTNOTE(i, n));
+               }
        }
-       //precache_sound(""); // we want to change volume of existing sounds
 }
index e13a1071b9be470ba2f4d875cf8a6307b52fce35..9c40578739b3ae00744a63dc3fd0e14bd827a250 100644 (file)
@@ -442,6 +442,7 @@ float CH_WEAPON_B = 5; // only on players and entities
 float CH_PAIN = 6; // only on players and csqc
 float CH_PAIN_SINGLE = 6; // only on players and csqc
 float CH_PLAYER = 7; // only on players and entities
+float CH_TUBA = 5; // only on csqc
 #else
 float CH_INFO = 0;
 float CH_TRIGGER = -3;
@@ -457,11 +458,13 @@ float CH_WEAPON_B = -1;
 float CH_PAIN = -6;
 float CH_PAIN_SINGLE = 6;
 float CH_PLAYER = -7;
+float CH_TUBA = 5;
 #endif
 
 float  ATTN_NONE                               = 0;
 float  ATTN_MIN                                = 0.015625;
 float  ATTN_NORM                               = 0.5;
+float  ATTN_LARGE                              = 1;
 float  ATTN_IDLE                               = 2;
 float  ATTN_STATIC                             = 3;
 float  ATTN_MAX                                = 3.984375;
@@ -610,6 +613,7 @@ float CPID_GAME_STARTING = 7;
 float CPID_TIMEOUT_COUNTDOWN = 8;
 float CPID_MOTD = 9;
 float CPID_KH_MSG = 10;
+float CPID_PREVENT_JOIN = 11;
 
 // CSQC centerprint/notify message types
 float MSG_SUICIDE = 0;
index 518cf74971a645dde3c412c1a1eaabee9b5ae1b8..c2b986bb889a9ebd3afb64a87cd2bd325f9f92ba 100644 (file)
@@ -191,6 +191,8 @@ float GameCommand_Generic(string command)
                print("    s localtime -----------------------> s   : formats the current local time\n");
                print("    s gmtime --------------------------> s   : formats the current UTC time\n");
                print("    time ------------------------------> f   : seconds since VM start\n");
+               print("    s /MD4 digest ---------------------> s   : MD4 digest\n");
+               print("    s /SHA256 digest ------------------> s   : SHA256 digest\n");
                print("    Set operations operate on 'such''strings'.\n");
                print("    Unknown tokens insert their cvar value.\n");
                print("  maplist add map\n");
@@ -790,6 +792,9 @@ float GameCommand_Generic(string command)
                                        rpn_set(strftime(FALSE, rpn_get()));
                                } else if(rpncmd == "time") {
                                        rpn_pushf(time);
+                               } else if(rpncmd == "digest") {
+                                       s = rpn_pop();
+                                       rpn_set(digest_hex(s, rpn_get()));
                                } else {
                                        rpn_push(cvar_string(rpncmd));
                                }
index 0ab17f34a4eebed25e7dee028c104c7d5fb25602..d23873e74c81eea11a1f877c43a9ce44252a1380 100644 (file)
@@ -1,5 +1,7 @@
-// files (-1 for URL)
+// files
 .float url_fh;
+#define URL_FH_CURL   -1
+#define URL_FH_STDOUT -2
 
 // URLs
 .string url_url;
@@ -35,7 +37,7 @@ float url_URI_Get_Callback(float id, float status, string data)
        url_fromid[id] = world;
 
        // if we get here, we MUST have both buffers cleared
-       if(e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != -1)
+       if(e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != URL_FH_CURL)
                error("url_URI_Get_Callback: not a request waiting for data");
 
        if(status == 0)
@@ -93,7 +95,7 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass)
                                e = spawn();
                                e.classname = "url_fopen_file";
                                e.url_url = strzone(url);
-                               e.url_fh = -1;
+                               e.url_fh = URL_FH_CURL;
                                e.url_wbuf = buf_create();
                                if(e.url_wbuf < 0)
                                {
@@ -142,7 +144,7 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass)
                                e = spawn();
                                e.classname = "url_fopen_file";
                                e.url_url = strzone(url);
-                               e.url_fh = -1;
+                               e.url_fh = URL_FH_CURL;
                                e.url_rbuf = -1;
                                e.url_wbuf = -1;
                                e.url_ready = rdy;
@@ -155,6 +157,23 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass)
                                break;
                }
        }
+       else if(url == "-")
+       {
+               switch(mode)
+               {
+                       case FILE_WRITE:
+                       case FILE_APPEND:
+                               e = spawn();
+                               e.classname = "url_fopen_stdout";
+                               e.url_fh = URL_FH_STDOUT;
+                               rdy(e, pass, URL_READY_CANWRITE);
+                               break;
+                       case FILE_READ:
+                               print("url_fopen: cannot open '-' for reading\n");
+                               rdy(world, pass, URL_READY_ERROR);
+                               break;
+               }
+       }
        else
        {
                float fh;
@@ -182,7 +201,7 @@ void url_fclose(entity e, url_ready_func rdy, entity pass)
 {
        float i;
 
-       if(e.url_fh < 0)
+       if(e.url_fh == URL_FH_CURL)
        {
                if(e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request)
                if(e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request)
@@ -246,6 +265,11 @@ void url_fclose(entity e, url_ready_func rdy, entity pass)
                        remove(e);
                }
        }
+       else if(e.url_fh == URL_FH_STDOUT)
+       {
+               rdy(e, pass, URL_READY_CLOSED); // closing creates no reading handle
+               remove(e);
+       }
        else
        {
                // file
@@ -258,7 +282,7 @@ void url_fclose(entity e, url_ready_func rdy, entity pass)
 // with \n (blame FRIK_FILE)
 string url_fgets(entity e)
 {
-       if(e.url_fh < 0)
+       if(e.url_fh == URL_FH_CURL)
        {
                if(e.url_rbuf == -1)
                        error("url_fgets: not readable in current state");
@@ -268,6 +292,11 @@ string url_fgets(entity e)
                e.url_rbufpos += 1;
                return s;
        }
+       else if(e.url_fh == URL_FH_STDOUT)
+       {
+               // stdout
+               return string_null;
+       }
        else
        {
                // file
@@ -278,7 +307,7 @@ string url_fgets(entity e)
 // without \n (blame FRIK_FILE)
 void url_fputs(entity e, string s)
 {
-       if(e.url_fh < 0)
+       if(e.url_fh == URL_FH_CURL)
        {
                if(e.url_wbuf == -1)
                        error("url_fputs: not writable in current state");
@@ -286,6 +315,11 @@ void url_fputs(entity e, string s)
                bufstr_set(e.url_wbuf, e.url_wbufpos, s);
                e.url_wbufpos += 1;
        }
+       else if(e.url_fh == URL_FH_STDOUT)
+       {
+               // stdout
+               print(s);
+       }
        else
        {
                // file
index f5633ab3f31dec7546438633407c4feb6edede7a..e61d57fb65e8721660aa369acb81628e20f9abd9 100644 (file)
@@ -2,6 +2,6 @@
 #pragma flag enable lo
 
 #ifndef NOCOMPAT
-# define WORKAROUND_XON010
-# define COMPAT_XON010_CHANNELS
+//# define WORKAROUND_XON010
+//# define COMPAT_XON010_CHANNELS
 #endif
index e5d366eb7049cd92ea883e24444c0dcc5c441230..ffdc1bb91d60f9f559de74190102a916c422b1c2 100644 (file)
@@ -341,3 +341,15 @@ string crypto_getidfp(string serveraddress) = #634; // retrieves the cached host
 string crypto_getencryptlevel(string serveraddress) = #635; // 0 if never encrypting, 1 supported, 2 requested, 3 required, appended by list of allowed methods in order of preference ("AES128"), preceded by a space each
 float(string url, float id, string content_type, string delim, float buf, float keyid) crypto_uri_postbuf = #513;
 //description:
+
+//DP_QC_DIGEST
+//idea: motorsep, Spike
+//DarkPlaces implementation: divVerent
+//builtin definitions:
+string(string digest, string data, ...) digest_hex = #639;
+//description:
+//returns a given hex digest of given data
+//the returned digest is always encoded in hexadecimal
+//only the "MD4" digest is always supported!
+//if the given digest is not supported, string_null is returned
+//the digest string is matched case sensitively, use "MD4", not "md4"!
index 741749a57442a8eed2f46e90434d985654d84841..36973c96f82d899c6bf906effdf8cb65e1a939c9 100644 (file)
@@ -247,8 +247,8 @@ void draw_Picture_Aligned(vector algn, float scalemode, string img, float a)
 
        sz = draw_PictureSize(img);
        width_is_larger = (sz_x * draw_scale_y >= sz_y * draw_scale_x);
-       isz_w = '1 0 0' + '0 1 0' * ((sz_y / sz_x) * (draw_scale_x / draw_scale_y)); 
-       isz_h = '0 1 0' + '1 0 0' * ((sz_x / sz_y) * (draw_scale_y / draw_scale_x)); 
+       isz_w = '1 0 0' + '0 1 0' * ((sz_y / sz_x) * (draw_scale_x / draw_scale_y));
+       isz_h = '0 1 0' + '1 0 0' * ((sz_x / sz_y) * (draw_scale_y / draw_scale_x));
 
        switch(scalemode)
        {
@@ -324,12 +324,15 @@ void(string img, float a, string algn, float force1) drawBackground =
        }
 }
 
+float menu_tooltips;
+float menu_tooltips_old;
 vector menuTooltipAveragedMousePos;
 entity menuTooltipItem;
 vector menuTooltipOrigin;
 vector menuTooltipSize;
 float menuTooltipAlpha;
-float menuTooltipState; // 0: no tooltip, 1: fading in, 2: displaying, 3: fading out
+string menuTooltipText;
+float menuTooltipState; // 0: static, 1: fading in, 2: fading out
 float m_testmousetooltipbox(vector pos)
 {
        if(pos_x >= menuTooltipOrigin_x && pos_x < menuTooltipOrigin_x + menuTooltipSize_x)
@@ -415,6 +418,8 @@ entity m_findtooltipitem(entity root, vector pos)
                        it = it.itemFromPoint(it, pos);
                        if(it.tooltip)
                                best = it;
+                       else if(menu_tooltips == 2 && (it.cvarName || it.onClickCommand))
+                               best = it;
                        it = world;
                }
                else if(it.instanceOfModalController)
@@ -425,11 +430,35 @@ entity m_findtooltipitem(entity root, vector pos)
                        break;
                if(it.tooltip)
                        best = it;
+               else if(menu_tooltips == 2 && (it.cvarName || it.onClickCommand))
+                       best = it;
                pos = globalToBox(pos, it.Container_origin, it.Container_size);
        }
 
        return best;
 }
+string gettooltip()
+{
+       if (menu_tooltips == 2)
+       {
+               string s;
+               if (menuTooltipItem.cvarName)
+               {
+                       if (getCvarsMulti(menuTooltipItem))
+                               s = strcat("[", menuTooltipItem.cvarName, " ", getCvarsMulti(menuTooltipItem), "]");
+                       else
+                               s = strcat("[", menuTooltipItem.cvarName, "]");
+               }
+               else if (menuTooltipItem.onClickCommand)
+                       s = strcat("<", menuTooltipItem.onClickCommand, ">");
+               else
+                       return menuTooltipItem.tooltip;
+               if (menuTooltipItem.tooltip)
+                       return strcat(menuTooltipItem.tooltip, " ", s);
+               return s;
+       }
+       return menuTooltipItem.tooltip;
+}
 void m_tooltip(vector pos)
 {
        float f, i, w;
@@ -437,16 +466,26 @@ void m_tooltip(vector pos)
        vector fontsize, p;
        string s;
 
-       fontsize = '1 0 0' * (SKINFONTSIZE_TOOLTIP / conwidth) + '0 1 0' * (SKINFONTSIZE_TOOLTIP / conheight);
-
-       f = bound(0, frametime * 2, 1);
-       menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
-       f = vlen(pos - menuTooltipAveragedMousePos);
-
-       if(f < 0.01)
-               it = m_findtooltipitem(main, pos);
-       else    
+       menu_tooltips = cvar("menu_tooltips");
+       if (!menu_tooltips)
+       {
+               // don't return immediately, fade out the active tooltip first
+               if (menuTooltipItem == world)
+                       return;
                it = world;
+               menu_tooltips_old = menu_tooltips;
+       }
+       else
+       {
+               f = bound(0, frametime * 2, 1);
+               menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
+               f = vlen(pos - menuTooltipAveragedMousePos);
+               if(f < 0.01)
+                       it = m_findtooltipitem(main, pos);
+               else
+                       it = world;
+       }
+       fontsize = '1 0 0' * (SKINFONTSIZE_TOOLTIP / conwidth) + '0 1 0' * (SKINFONTSIZE_TOOLTIP / conheight);
 
        // float menuTooltipState; // 0: static, 1: fading in, 2: fading out
        if(it != menuTooltipItem)
@@ -466,9 +505,14 @@ void m_tooltip(vector pos)
                                        menuTooltipItem = it;
 
                                        menuTooltipOrigin_x = -1; // unallocated
+
+                                       if (menuTooltipText)
+                                               strunzone(menuTooltipText);
+                                       menuTooltipText = strzone(gettooltip());
+
                                        i = 0;
-                                       w =  0;
-                                       getWrappedLine_remaining = it.tooltip;
+                                       w = 0;
+                                       getWrappedLine_remaining = menuTooltipText;
                                        while(getWrappedLine_remaining)
                                        {
                                                s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
@@ -515,9 +559,24 @@ void m_tooltip(vector pos)
                        break;
        }
 
-       if(menuTooltipItem)
+       if(menuTooltipItem == world)
        {
-               if(menuTooltipOrigin_x < 0) // unallocated?
+               if (menuTooltipText)
+               {
+                       strunzone(menuTooltipText);
+                       menuTooltipText = string_null;
+               }
+               return;
+       }
+       else
+       {
+               if(menu_tooltips != menu_tooltips_old)
+               {
+                       if (menu_tooltips != 0 && menu_tooltips_old != 0)
+                               menuTooltipItem = world; // reload tooltip next frame
+                       menu_tooltips_old = menu_tooltips;
+               }
+               else if(menuTooltipOrigin_x < 0) // unallocated?
                        m_allocatetooltipbox(pos);
 
                if(menuTooltipOrigin_x >= 0)
@@ -530,7 +589,7 @@ void m_tooltip(vector pos)
                        p = menuTooltipOrigin;
                        p_x += SKINMARGIN_TOOLTIP_x / conwidth;
                        p_y += SKINMARGIN_TOOLTIP_y / conheight;
-                       getWrappedLine_remaining = menuTooltipItem.tooltip;
+                       getWrappedLine_remaining = menuTooltipText;
                        while(getWrappedLine_remaining)
                        {
                                s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
index a9d2becc3d9ef8f47f7c5309918634a856edddad..c5500394bd46d550a14b615c6a798e00f2356016 100644 (file)
@@ -42,6 +42,7 @@ void XonoticSliderCheckBox_configureXonoticSliderCheckBox(entity me, float theOf
        me.controlledSlider = theControlledSlider;
        me.configureCheckBox(me, theText, me.fontSize, me.image);
        me.tooltip = theControlledSlider.tooltip;
+       me.cvarName = theControlledSlider.cvarName; // in case we want to display the cvar in the tooltip
 }
 void XonoticSliderCheckBox_draw(entity me)
 {
index d0daa678422237378b21adc71800766c0627e481..b31622f67390e02f1d1465b02c5b55652fab1907 100644 (file)
@@ -4,7 +4,7 @@ CLASS(XonoticHUDWeaponsDialog) EXTENDS(XonoticRootDialog)
        ATTRIB(XonoticHUDWeaponsDialog, title, string, _("Weapons Panel"))
        ATTRIB(XonoticHUDWeaponsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
        ATTRIB(XonoticHUDWeaponsDialog, intendedWidth, float, 0.4)
-       ATTRIB(XonoticHUDWeaponsDialog, rows, float, 17)
+       ATTRIB(XonoticHUDWeaponsDialog, rows, float, 18)
        ATTRIB(XonoticHUDWeaponsDialog, columns, float, 4)
        ATTRIB(XonoticHUDWeaponsDialog, name, string, "HUDweapons")
 ENDCLASS(XonoticHUDWeaponsDialog)
@@ -40,6 +40,9 @@ void XonoticHUDWeaponsDialog_fill(entity me)
                        setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Weapon icons:")));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_weapons_onlyowned", _("Show only owned weapons")));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Show weapon ID as:")));
index 69d6af6b01898b0d3370f9217d52a3824ede7ce1..f85c2877cc6f8c82e44be48ed91582eb634eea20 100644 (file)
@@ -87,7 +87,7 @@ void XonoticAudioSettingsTab_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel1volume");
-               makeMulti(s, "snd_channel5volume"); // legacy
+               makeMulti(s, "snd_channel5volume"); // @!#%'n Tuba
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Weapons:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
index 617b4e95f2628837225cf0acee3e44db339be3aa..440d00d8b1aefc0b07d7f555ec7c45a8abb4780e 100644 (file)
@@ -25,8 +25,8 @@ void XonoticInputSettingsTab_fill(entity me)
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Key bindings:")));
        me.TR(me);
-               me.TD(me, me.rows - 2, 3.3, kb = makeXonoticKeyBinder());
-       me.gotoRC(me, me.rows - 1, 0);
+               me.TD(me, me.rows - 4, 3.3, kb = makeXonoticKeyBinder());
+       me.gotoRC(me, me.rows - 3, 0);
        me.TR(me);
                me.TD(me, 1, 1.1, e = makeXonoticButton(_("Change key..."), '0 0 0'));
                        e.onClick = KeyBinder_Bind_Change;
@@ -67,5 +67,10 @@ void XonoticInputSettingsTab_fill(entity me)
                        me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "apple_mouse_noaccel", _("Turn off OS mouse acceleration")));
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_closeontoggleconsole", _("\"enter console\" also closes")));
+       me.TR(me);
+       me.TR(me);
+               me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_movement_track_canjump", _("Holding jump key keeps jumping")));
+       me.gotoRC(me, me.rows - 1, 0);
+               me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "sendcvar cl_movement_track_canjump", COMMANDBUTTON_APPLY));
 }
 #endif
index 72af4dce144b4e9c6d00e5a42f5d6ce5ec737c06..61295359aa67fe2e4ddf71a5783b3ac112d96f68 100644 (file)
@@ -51,6 +51,17 @@ void XonoticMiscSettingsTab_fill(entity me)
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showfps", _("Show frames per second")));
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_maxfps_alwayssleep", _("Minimize input latency")));
+
+       if(cvar("developer"))
+       {
+               me.TR(me);
+               me.TR(me);
+                       me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Menu Tooltips:")));
+                       me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_tooltips", "0", _("Off")));
+                       me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "menu_tooltips", "1", _("Standard")));
+                       me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "menu_tooltips", "2", _("Advanced")));
+       }
+
        me.TR(me);
        me.TR(me);
                me.TDempty(me, 0.5);
index 6e9bf1790751764bd48bf9007c5e519106fa08ee..e6b0d6232f5ef0760f430e19c6e244dbf2f22081 100644 (file)
@@ -469,17 +469,17 @@ void ServerList_ShowFull_Click(entity box, entity me)
        me.ipAddressBox.cursorPos = 0;
        me.ipAddressBoxFocused = -1;
 }
-void XonoticServerList_setSortOrder(entity me, float field, float direction)
+void XonoticServerList_setSortOrder(entity me, float fld, float direction)
 {
-       if(me.currentSortField == field)
+       if(me.currentSortField == fld)
                direction = -me.currentSortOrder;
        me.currentSortOrder = direction;
-       me.currentSortField = field;
-       me.sortButton1.forcePressed = (field == SLIST_FIELD_PING);
-       me.sortButton2.forcePressed = (field == SLIST_FIELD_NAME);
-       me.sortButton3.forcePressed = (field == SLIST_FIELD_MAP);
+       me.currentSortField = fld;
+       me.sortButton1.forcePressed = (fld == SLIST_FIELD_PING);
+       me.sortButton2.forcePressed = (fld == SLIST_FIELD_NAME);
+       me.sortButton3.forcePressed = (fld == SLIST_FIELD_MAP);
        me.sortButton4.forcePressed = 0;
-       me.sortButton5.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
+       me.sortButton5.forcePressed = (fld == SLIST_FIELD_NUMHUMANS);
        me.selectedItem = 0;
        if(me.selectedServer)
                strunzone(me.selectedServer);
index 46a01bb5ac0e3c1c1e089a90836c4de3b851370f..e833bb1251379f49535c3edd1599a662b8fc6721 100644 (file)
@@ -45,8 +45,7 @@ void XonoticSlider_configureXonoticSlider(entity me, float theValueMin, float th
        {
                me.cvarName = theCvar;
                me.loadCvars(me);
-               if(tooltipdb >= 0)
-                       me.tooltip = getZonedTooltipForIdentifier(theCvar);
+               me.tooltip = getZonedTooltipForIdentifier(theCvar);
        }
 }
 void XonoticSlider_setValue(entity me, float val)
index 0bcee6a192352148b2465207a753392e2f14de4e..65a5d3e71a60fad721cddb189660e0489891c6ab 100644 (file)
@@ -8,7 +8,6 @@ float GL_Have_TextureCompression()
        return (GL_CheckExtension("GL_EXT_texture_compression_s3tc") && GL_CheckExtension("GL_ARB_texture_compression"));
 }
 
-float tooltipdb;
 void loadTooltips()
 {
        tooltipdb = db_load(language_filename("tooltips.db"));
@@ -72,6 +71,12 @@ void loadAllCvars(entity root)
 
 .string cvarNames_Multi;
 .void(entity me) saveCvars_Multi;
+string getCvarsMulti(entity me)
+{
+       if (me.cvarNames_Multi)
+               return me.cvarNames_Multi;
+       return string_null;
+}
 void saveCvarsMulti(entity me)
 {
        float n, i;
@@ -250,6 +255,7 @@ void setDependentWeird(entity e, float(entity) func)
 
 float _Nex_ExtResponseSystem_Queried;
 string _Nex_ExtResponseSystem_UpdateTo;
+string _Nex_ExtResponseSystem_UpdateToURL;
 
 void URI_Get_Callback(float id, float status, string data)
 {
@@ -314,6 +320,8 @@ void UpdateNotification_URI_Get_Callback(float id, float status, string data)
                        // update needed
                        if(n >= 2)
                                print(sprintf(_("Update can be downloaded at:\n%s\n"), argv(1)));
+                       if(n >= 3)
+                               _Nex_ExtResponseSystem_UpdateToURL = strzone(argv(2));
                }
 
                _Nex_ExtResponseSystem_UpdateTo = strzone(_Nex_ExtResponseSystem_UpdateTo);
@@ -421,16 +429,25 @@ void preMenuDraw()
                // TODO rather turn this into a dialog
                fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;
                line = eY * fs_y;
-               sz_x = draw_TextWidth("  http://www.xonotic.org/  ", 0, fs);
+               string l1, l2;
+               l1 = sprintf(_("Update to %s now!"), _Nex_ExtResponseSystem_UpdateTo);
+               l2 = "http://www.xonotic.org/";
+               if(_Nex_ExtResponseSystem_UpdateToURL)
+                       l2 = _Nex_ExtResponseSystem_UpdateToURL;
+
+               sz_x = draw_TextWidth("    ", 0, fs) + max(
+                               draw_TextWidth(l1, 0, fs),
+                               draw_TextWidth(l2, 0, fs)
+                       );
                sz_y = 3 * fs_y;
 
-               draw_alpha = sin(time * 0.112 - 0.3) * 10;
+               draw_alpha = bound(0, sin(time * 0.112 - 0.3) * 10, 1);
                mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))
                    + eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));
 
                draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);
-               draw_CenterText(mid - 1 * line, sprintf(_("Update to %s now!"), _Nex_ExtResponseSystem_UpdateTo), fs, '1 0 0', 1, 0);
-               draw_CenterText(mid - 0 * line, "http://www.xonotic.org/", fs, '0 0 1', 1, 0);
+               draw_CenterText(mid - 1 * line, l1, fs, '1 0 0', 1, 0);
+               draw_CenterText(mid - 0 * line, l2, fs, '0 0 1', 1, 0);
        }
        if not(campaign_name_previous)
                campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal
index 5962b9648ccc74ff091132952af3956ad0681fcf..1720710d2c44de09db39110aa93b9a84578ebb5d 100644 (file)
@@ -6,6 +6,7 @@ void saveAllCvars(entity root);
 void loadAllCvars(entity root);
 
 void makeMulti(entity me, string otherCvars);
+string getCvarsMulti(entity me);
 void makeCallback(entity me, entity cbent, void(entity, entity) cbfunc);
 
 void setDependent(entity e, string theCvarName, float theCvarMin, float theCvarMax);
index 587b1ec54cef0cac9c4be7447d1961d89c67a974..c89c2b2efada451a84b1990255d437641088195b 100644 (file)
@@ -9,8 +9,7 @@ entity spawnqueue_first;
 entity spawnqueue_last;
 entity champion;
 float warmup;
-float ca_players;
-float required_ca_players;
+float ca_teams_ok;
 .float caplayer;
 
 void PutObserverInServer();
@@ -28,8 +27,8 @@ 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;
+float red_players, blue_players, yellow_players, pink_players;
+float total_players;
 
 /**
  * Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
@@ -214,7 +213,7 @@ void Arena_Warmup()
 
        if(inWarmupStage)
                allowed_to_spawn = 1;
-       if(ca_players < required_ca_players)
+       if(g_ca && !ca_teams_ok)
                allowed_to_spawn = 1;
 
        if(time < warmup && !inWarmupStage)
@@ -259,10 +258,16 @@ void Arena_Warmup()
                        Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "^1Begin!", 1, 0);
 
                if(g_ca) {
-                       ca_players = 0;
+                       float start_red_ca_players, start_blue_ca_players;
 
-            FOR_EACH_PLAYER(e)
-                               ca_players += 1;
+                       FOR_EACH_PLAYER(e) {
+                               if (e.team == COLOR_TEAM1)
+                                       start_red_ca_players += 1;
+                               else if (e.team == COLOR_TEAM2)
+                                       start_blue_ca_players += 1;
+                       }
+                       // teams are ok if there's at least 1 player in each team
+                       ca_teams_ok = (start_red_ca_players && start_blue_ca_players);
                }
 
         if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE)
@@ -275,34 +280,30 @@ void Arena_Warmup()
                champion = world;
 }
 
-void count_spawned_players()
+void count_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;
+       total_players = red_players = blue_players = yellow_players = pink_players = 0;
        FOR_EACH_PLAYER(self) {
                if (self.team == COLOR_TEAM1)
                {
-                       redspawned += 1;
-                       totalspawned += 1;
+                       red_players += 1;
+                       total_players += 1;
                }
                else if (self.team == COLOR_TEAM2)
                {
-                       bluespawned += 1;
-                       totalspawned += 1;
+                       blue_players += 1;
+                       total_players += 1;
                }
                else if (self.team == COLOR_TEAM3)
                {
-                       yellowspawned += 1;
-                       totalspawned += 1;
+                       yellow_players += 1;
+                       total_players += 1;
                }
                else if (self.team == COLOR_TEAM4)
                {
-                       pinkspawned += 1;
-                       totalspawned += 1;
+                       pink_players += 1;
+                       total_players += 1;
                }
        }
 }
@@ -374,7 +375,7 @@ void count_alive_players()
 float warntime;
 void Spawnqueue_Check()
 {
-       count_spawned_players();
+       count_players();
        if(g_ca || g_freezetag) // we want to perform this before the return block below (CA)...
        {
                count_alive_players();
@@ -383,12 +384,10 @@ void Spawnqueue_Check()
                return;
 
        if(g_ca) {
-               required_ca_players = max(2, fabs(autocvar_bot_vs_human + 1));
-
-               if(ca_players < required_ca_players && (redspawned && bluespawned)) {
+               if(!ca_teams_ok && (red_players && blue_players)) {
                        reset_map(TRUE);
                }
-               else if(ca_players < required_ca_players) {
+               else if(!ca_teams_ok) {
                        if (time > warntime)
                        {
                                FOR_EACH_PLAYER(self)
@@ -398,10 +397,10 @@ void Spawnqueue_Check()
                        return;
                }
                else if(!next_round) {
-                       if((redspawned && !bluespawned) || (bluespawned && !redspawned)) {
+                       if((red_players && !blue_players) || (blue_players && !red_players)) {
                                next_round = time + 5;
                        }
-                       else if((!redspawned && !bluespawned) || time - warmup > autocvar_g_ca_round_timelimit) {
+                       else if((!red_players && !blue_players) || time - warmup > autocvar_g_ca_round_timelimit) {
                                FOR_EACH_CLIENT(self) centerprint(self, "^7Round tied");
                                next_round = time + 5;
                        }
index e920b5c3415613f35f336b36d90ded55fb2233ad..c91bfa640907599c0bdedc0f6fcd4132273e7702 100644 (file)
@@ -1,3 +1,4 @@
+float autocvar__independent_players;
 float autocvar__campaign_index;
 string autocvar__campaign_name;
 float autocvar__sv_init;
@@ -324,6 +325,8 @@ float autocvar_g_balance_hagar_primary_speed;
 float autocvar_g_balance_hagar_secondary;
 float autocvar_g_balance_hagar_secondary_load;
 float autocvar_g_balance_hagar_secondary_load_speed;
+float autocvar_g_balance_hagar_secondary_load_spread;
+float autocvar_g_balance_hagar_secondary_load_spread_bias;
 float autocvar_g_balance_hagar_secondary_load_max;
 float autocvar_g_balance_hagar_secondary_load_hold;
 float autocvar_g_balance_hagar_secondary_load_releasedeath;
@@ -336,6 +339,8 @@ float autocvar_g_balance_hagar_secondary_lifetime_min;
 float autocvar_g_balance_hagar_secondary_lifetime_rand;
 float autocvar_g_balance_hagar_secondary_radius;
 float autocvar_g_balance_hagar_secondary_refire;
+float autocvar_g_balance_hagar_secondary_speed;
+float autocvar_g_balance_hagar_secondary_spread;
 float autocvar_g_balance_hagar_reload_ammo;
 float autocvar_g_balance_hagar_reload_time;
 float autocvar_g_balance_health_limit;
@@ -1189,3 +1194,4 @@ float autocvar_welcome_message_time;
 float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
 float autocvar_g_trueaim_minrange;
 float autocvar_g_debug_defaultsounds;
+float autocvar_g_loituma;
index bbdb16cd2b71b89fcc607d10c95a791b222e32d9..ad9f3d185c57b7c18d50593f622cbf177c063a00 100644 (file)
@@ -367,6 +367,7 @@ void havocbot_bunnyhop(vector dir)
                self.bot_timelastseengoal = 0;
        }
 
+#if 0
        // Release jump button
        if(!cvar("sv_pogostick"))
        if(self.flags & FL_ONGROUND == 0)
@@ -392,6 +393,7 @@ void havocbot_bunnyhop(vector dir)
 
                }
        }
+#endif
 };
 
 void havocbot_movetogoal()
index e540a438d55f07e88cccb96126ed3830290d46bd..63151cac1b8e845e4be1e26663984dc24661775a 100644 (file)
@@ -21,6 +21,28 @@ void bot_queuecommand(entity bot, string cmdstring)
        }
 
        bufstr_set(bot.bot_cmdqueuebuf, bot.bot_cmdqueuebuf_end, cmdstring);
+
+       // if the command was a "sound" command, precache the sound NOW
+       // this prevents lagging!
+       {
+               float sp;
+               string parm;
+               string cmdstr;
+
+               sp = strstrofs(cmdstr, " ", 0);
+               if(sp < 0)
+               {
+                       parm = "";
+               }
+               else
+               {
+                       parm = substring(cmdstr, sp + 1, -1);
+                       cmdstr = substring(cmdstr, 0, sp);
+               }
+               if(cmdstr == "sound")
+                       precache_sound(cmdstr);
+       }
+
        bot.bot_cmdqueuebuf_end += 1;
 }
 
@@ -131,11 +153,12 @@ entity bot_getplace(string placename)
 #define BOT_CMD_BARRIER         20
 #define BOT_CMD_CONSOLE                        21
 #define BOT_CMD_SOUND                  22
-#define BOT_CMD_WHILE                  23      // TODO: Not implemented yet
-#define BOT_CMD_WEND                   24      // TODO: Not implemented yet
-#define BOT_CMD_CHASE                  25      // TODO: Not implemented yet
+#define BOT_CMD_DEBUG_ASSERT_CANFIRE 23
+#define BOT_CMD_WHILE                  24      // TODO: Not implemented yet
+#define BOT_CMD_WEND                   25      // TODO: Not implemented yet
+#define BOT_CMD_CHASE                  26      // TODO: Not implemented yet
 
-#define BOT_CMD_COUNTER                        23      // Update this value if you add/remove a command
+#define BOT_CMD_COUNTER                        24      // Update this value if you add/remove a command
 
 // NOTE: Following commands should be implemented on the bot ai
 //              If a new command should be handled by the target ai(s) please declare it here
@@ -241,6 +264,9 @@ void bot_commands_init()
        bot_cmd_string[BOT_CMD_SOUND] = "sound";
        bot_cmd_parm_type[BOT_CMD_SOUND] = BOT_CMD_PARAMETER_STRING;
 
+       bot_cmd_string[BOT_CMD_DEBUG_ASSERT_CANFIRE] = "debug_assert_canfire";
+       bot_cmd_parm_type[BOT_CMD_DEBUG_ASSERT_CANFIRE] = BOT_CMD_PARAMETER_FLOAT;
+
        bot_cmds_initialized = TRUE;
 }
 
@@ -448,6 +474,9 @@ void bot_cmdhelp(string scmd)
                        case BOT_CMD_SOUND:
                                print("play sound file at bot location");
                                break;
+                       case BOT_CMD_DEBUG_ASSERT_CANFIRE:
+                               print("verify the state of the weapon entity");
+                               break;
                        default:
                                print("This command has no description yet.");
                                break;
@@ -1066,6 +1095,48 @@ float bot_cmd_sound()
        return CMD_STATUS_FINISHED;
 }
 
+.entity tuba_note;
+float bot_cmd_debug_assert_canfire()
+{
+       float f;
+       f = bot_cmd.bot_cmd_parm_float;
+
+       if(self.weaponentity.state != WS_READY)
+       {
+               if(f)
+               {
+                       self.colormod = '0 8 8';
+                       print("Bot wants to fire, inhibited by weaponentity state\n");
+               }
+       }
+       else if(ATTACK_FINISHED(self) > time)
+       {
+               if(f)
+               {
+                       self.colormod = '8 0 8';
+                       print("Bot wants to fire, inhibited by ATTACK_FINISHED\n");
+               }
+       }
+       else if(self.tuba_note)
+       {
+               if(f)
+               {
+                       self.colormod = '8 0 0';
+                       print("Bot wants to fire, bot still has an active tuba note\n");
+               }
+       }
+       else
+       {
+               if(!f)
+               {
+                       self.colormod = '8 8 0';
+                       print("Bot thinks it has fired, but apparently did not\n");
+               }
+       }
+
+       return CMD_STATUS_FINISHED;
+}
+
 //
 
 void bot_command_executed(float rm)
@@ -1144,12 +1215,16 @@ float bot_execute_commands_once()
 {
        local float status, ispressingkey;
 
-       if(self.deadflag!=DEAD_NO)
-               return 0;
-
        // Find command
        bot_setcurrentcommand();
 
+       // if we have no bot command, better return
+       // old logic kept pressing previously pressed keys, but that has problems
+       // (namely, it means you cannot make a bot "normal" ever again)
+       // to keep a bot walking for a while, use the "wait" bot command
+       if(bot_cmd == world)
+               return FALSE;
+
        // Ignore all commands except continue when the bot is paused
        if(self.bot_exec_status & BOT_EXEC_STATUS_PAUSED)
        if(bot_cmd.bot_cmd_type!=BOT_CMD_CONTINUE)
@@ -1165,9 +1240,6 @@ float bot_execute_commands_once()
        // Keep pressing keys raised by the "presskey" command
        ispressingkey = !!bot_presskeys();
 
-       if(bot_cmd==world)
-               return ispressingkey;
-
        // Handle conditions
        if not(bot_cmd.bot_cmd_type==BOT_CMD_FI||bot_cmd.bot_cmd_type==BOT_CMD_ELSE)
        if(self.bot_cmd_condition_status & CMD_CONDITION_TRUE && self.bot_cmd_condition_status & CMD_CONDITION_FALSE_BLOCK)
@@ -1254,6 +1326,9 @@ float bot_execute_commands_once()
                case BOT_CMD_SOUND:
                        status = bot_cmd_sound();
                        break;
+               case BOT_CMD_DEBUG_ASSERT_CANFIRE:
+                       status = bot_cmd_debug_assert_canfire();
+                       break;
                default:
                        print(strcat("ERROR: Invalid command on queue with id '",ftos(bot_cmd.bot_cmd_type),"'\n"));
                        return 0;
index 923950b5071cd4084dff6e3b3750f61560822784..c64716d9e2134517db182084a82a6ce611cd74ac 100644 (file)
@@ -219,10 +219,13 @@ void CampaignPreIntermission()
                if(campaign_entries < 2)
                {
                        // I have won
-                       savevar = strcat("g_campaign", campaign_name, "_won");
-                       CampaignSaveCvar(savevar, 1);
-                       // advance level (for menu to show it right)
-                       CampaignSaveCvar(campaign_index_var, campaign_level + 1);
+                       if(campaign_level == cvar_normal(campaign_index_var))
+                       {
+                               savevar = strcat("g_campaign", campaign_name, "_won");
+                               CampaignSaveCvar(savevar, 1);
+                               // advance level (for menu to show it right)
+                               CampaignSaveCvar(campaign_index_var, campaign_level + 1);
+                       }
                }
                else if(campaign_level == cvar_normal(campaign_index_var))
                {
@@ -256,6 +259,8 @@ void CampaignPostIntermission()
 
 void CampaignLevelWarp(float n)
 {
+       if(n < 0)
+               n = campaign_level + 1;
        CampaignFile_Unload();
        CampaignFile_Load(n, 1);
        if(campaign_entries)
index 3270a9077fbcb1c7b640303553026221836ec7f3..0d95c453a1e6685b1d7032dd06dd520670ae628b 100644 (file)
@@ -604,14 +604,6 @@ float CheatCommand(float argc)
                                remove(e);
                        DID_CHEAT();
                        break;
-               case "warp":
-                       IS_CHEAT(0, argc, 0);
-                       if(argc == 2) if(autocvar_g_campaign)
-                       {
-                               CampaignLevelWarp(stof(argv(1)));
-                               DID_CHEAT();
-                       }
-                       break;
                case "god":
                        IS_CHEAT(0, argc, 0);
                        BITXOR_ASSIGN(self.flags, FL_GODMODE);
index 034a61af73b1986230186afbb85fa28ea48ed74b..4a2de06131ffe3ad6bba6c06ba9269b570bbd411 100644 (file)
@@ -705,6 +705,7 @@ void PutObserverInServer (void)
        self.model = "";
        self.modelindex = 0;
        self.weapon = 0;
+       self.weaponname = "";
        self.switchingweapon = 0;
        self.weaponmodel = "";
        self.weaponentity = world;
@@ -906,7 +907,7 @@ void PutClientInServer (void)
                if(clienttype(self) == CLIENTTYPE_BOT && autocvar_g_botclip_collisions)
                        self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
                self.frags = FRAGS_PLAYER;
-               if(independent_players)
+               if(INDEPENDENT_PLAYERS)
                        MAKE_INDEPENDENT_PLAYER(self);
                self.flags = FL_CLIENT;
                self.takedamage = DAMAGE_AIM;
@@ -1049,8 +1050,6 @@ void PutClientInServer (void)
                        self.killcount = 0;
                }
 
-               self.cnt = WEP_LASER;
-
                CL_SpawnWeaponentity();
                self.alpha = default_player_alpha;
                self.colormod = '1 1 1' * autocvar_g_player_brightness;
@@ -1092,7 +1091,7 @@ void PutClientInServer (void)
                        entity e;
                        e = get_weaponinfo(j);
                        if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
-                               self.weapon_load[j] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
+                               self.(weapon_load[j]) = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
                }
 
                oldself = self;
@@ -1109,8 +1108,9 @@ void PutClientInServer (void)
                MUTATOR_CALLHOOK(PlayerSpawn);
 
                self.switchweapon = w_getbestweapon(self);
-               self.cnt = self.switchweapon;
+               self.cnt = -1; // W_LastWeapon will not complain
                self.weapon = 0;
+               self.weaponname = "";
                self.switchingweapon = 0;
 
                if(!self.alivetime)
@@ -1343,9 +1343,11 @@ void KillIndicator_Think()
        }
 }
 
+float clientkilltime;
 void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 = spec
 {
        float killtime;
+       float starttime;
        entity e;
 
        if (gameover)
@@ -1381,13 +1383,16 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
                }
                else
                {
+                       starttime = max(time, clientkilltime);
+
                        self.killindicator = spawn();
                        self.killindicator.owner = self;
                        self.killindicator.scale = 0.5;
                        setattachment(self.killindicator, self, "");
                        setorigin(self.killindicator, '0 0 52');
                        self.killindicator.think = KillIndicator_Think;
-                       self.killindicator.nextthink = time + (self.lip) * 0.05;
+                       self.killindicator.nextthink = starttime + (self.lip) * 0.05;
+                       clientkilltime = max(clientkilltime, self.killindicator.nextthink + 0.05);
                        self.killindicator.cnt = ceil(killtime);
                        self.killindicator.count = bound(0, ceil(killtime), 10);
                        //sprint(self, strcat("^1You'll be dead in ", ftos(self.killindicator.cnt), " seconds\n"));
@@ -1402,7 +1407,8 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
                                setattachment(e.killindicator, e, "");
                                setorigin(e.killindicator, '0 0 52');
                                e.killindicator.think = KillIndicator_Think;
-                               e.killindicator.nextthink = time + (e.lip) * 0.05;
+                               e.killindicator.nextthink = starttime + (e.lip) * 0.05;
+                               clientkilltime = max(clientkilltime, e.killindicator.nextthink + 0.05);
                                e.killindicator.cnt = ceil(killtime);
                        }
                        self.lip = 0;
@@ -1667,8 +1673,7 @@ void ClientConnect (void)
        bprint("\n");
 
        stuffcmd(self, strcat(clientstuff, "\n"));
-       stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n"));
-       stuffcmd(self, "cl_particles_reloadeffects\n");
+       stuffcmd(self, "cl_particles_reloadeffects\n"); // TODO do we still need this?
 
        FixClientCvars(self);
 
@@ -2461,6 +2466,7 @@ void ShowRespawnCountdown()
        }
 }
 
+.float prevent_join_msgtime;
 void LeaveSpectatorMode()
 {
        if(nJoinAllowed(1)) {
@@ -2482,6 +2488,12 @@ void LeaveSpectatorMode()
                        if (time < self.jointime + autocvar_welcome_message_time)
                                Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); // clear MOTD
 
+                       if (self.prevent_join_msgtime)
+                       {
+                               Send_CSQC_Centerprint_Generic_Expire(self, CPID_PREVENT_JOIN);
+                               self.prevent_join_msgtime = 0;
+                       }
+
                        return;
                } else {
                        if (g_ca && self.caplayer) {
@@ -2493,7 +2505,11 @@ void LeaveSpectatorMode()
        }
        else {
                //player may not join because of g_maxplayers is set
-               centerprint(self, PREVENT_JOIN_TEXT);
+               if (time - self.prevent_join_msgtime > 2)
+               {
+                       Send_CSQC_Centerprint_Generic(self, CPID_PREVENT_JOIN, PREVENT_JOIN_TEXT, 0, 0);
+                       self.prevent_join_msgtime = time;
+               }
        }
 }
 
@@ -2604,7 +2620,7 @@ void ObserverThink()
                        }
                }
        }
-       
+
        PrintWelcomeMessage();
 }
 
@@ -2758,12 +2774,15 @@ void PlayerPreThink (void)
 
        MUTATOR_CALLHOOK(PlayerPreThink);
 
-       if(self.BUTTON_USE && !self.usekeypressed)
-               PlayerUseKey();
-       self.usekeypressed = self.BUTTON_USE;
+       if(!self.cvar_cl_newusekeysupported)
+       {
+               if(self.BUTTON_USE && !self.usekeypressed)
+                       PlayerUseKey();
+               self.usekeypressed = self.BUTTON_USE;
+       }
 
        PrintWelcomeMessage();
-       
+
        if(self.classname == "player") {
 //             if(self.netname == "Wazat")
 //                     bprint(self.classname, "\n");
@@ -3153,6 +3172,8 @@ void PlayerPostThink (void)
 
        CheatFrame();
 
+       //CheckPlayerJump();
+
        if(self.classname == "player") {
                CheckRules_Player();
                UpdateChatBubble();
index 939b6d2580b67a98b00b4cd3cf1590024922d2e6..9e211e5f504086be15b3c2bd7361262b946349fc 100644 (file)
@@ -70,7 +70,7 @@ void ImpulseCommands (void)
                                        W_NextWeapon (0);
                                        break;
                                case 11:
-                                       W_SwitchWeapon (self.cnt); // previously used
+                                       W_LastWeapon();
                                        break;
                                case 12:
                                        W_PreviousWeapon (0);
index b10c88d49d305fb17e2c0bbd788e6402443cc1b8..b7e8bc22648b631647bf33898c4be713dc3d46f9 100644 (file)
@@ -34,7 +34,15 @@ void PlayerJump (void)
        {
                tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
                if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
+               {
                        doublejump = TRUE;
+
+                       // we MUST clip velocity here!
+                       float f;
+                       f = self.velocity * trace_plane_normal;
+                       if(f < 0)
+                               self.velocity -= f * trace_plane_normal;
+               }
        }
 
        mjumpheight = autocvar_sv_jumpvelocity;
@@ -104,7 +112,7 @@ void PlayerJump (void)
                if (!(self.flags & FL_ONGROUND))
                        return;
 
-       if(!sv_pogostick || self.cvar_cl_nopogostick)
+       if(self.cvar_cl_movement_track_canjump)
                if (!(self.flags & FL_JUMPRELEASED))
                        return;
 
@@ -172,7 +180,6 @@ void PlayerJump (void)
        self.restart_jump = -1; // restart jump anim next time
        // value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
 }
-
 void CheckWaterJump()
 {
        local vector start, end;
@@ -201,6 +208,25 @@ void CheckWaterJump()
                }
        }
 };
+void CheckPlayerJump()
+{
+       if(self.flags & FL_ONGROUND)
+       {
+               if (autocvar_g_multijump > 0)
+                       self.multijump_count = 0;
+               else
+                       self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
+       }
+
+       if (self.BUTTON_JUMP)
+               PlayerJump ();
+       else
+               self.flags |= FL_JUMPRELEASED;
+
+       if (self.waterlevel == WATERLEVEL_SWIMMING)
+               CheckWaterJump ();
+       self.prevjumpbutton = self.BUTTON_JUMP;
+}
 
 float racecar_angle(float forward, float down)
 {
@@ -930,24 +956,7 @@ void SV_PlayerPhysics()
                self.wasFlying = 1;
 
        if(self.classname == "player")
-       {
-               if(self.flags & FL_ONGROUND)
-               {
-                       if (autocvar_g_multijump > 0)
-                               self.multijump_count = 0;
-                       else
-                               self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
-               }
-
-               if (self.BUTTON_JUMP)
-                       PlayerJump ();
-               else
-                       self.flags |= FL_JUMPRELEASED;
-
-               if (self.waterlevel == WATERLEVEL_SWIMMING)
-                       CheckWaterJump ();
-               self.prevjumpbutton = self.BUTTON_JUMP;
-       }
+               CheckPlayerJump();
 
        if (self.flags & FL_WATERJUMP )
        {
index 16d413bd063a7552f904da7e565318f6a71d2029..e5e2d377cf4981f7d9527d1a4ca7f927caf87bec 100644 (file)
@@ -421,7 +421,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        float valid_damage_for_weaponstats;
        float excess;
 
-       if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage)
+       if((g_arena && numspawned < 2) || (g_ca && !ca_teams_ok) && !inWarmupStage)
                return;
 
        dh = max(self.health, 0);
index afe3088d431cd40507f61ce543442da20f80fa8c..4a333934ae84a5ddc83f4281e2f7406daff1ef9a 100644 (file)
@@ -137,6 +137,15 @@ void W_PreviousWeapon(float list)
                W_CycleWeapon(self.cvar_cl_weaponpriority, +1);
 }
 
+// previously used if exists and has ammo, (second) best otherwise
+void W_LastWeapon()
+{
+       if(client_hasweapon(self, self.cnt, TRUE, FALSE))
+               W_SwitchWeapon(self.cnt);
+       else
+               W_SwitchToOtherWeapon(self);
+}
+
 float w_getbestweapon(entity e)
 {
        return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, FALSE, TRUE);
@@ -224,10 +233,10 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                                        s = strcat(s, " and ", ftos(thisammo), " ", Item_CounterFieldName(j));
 
                                        // if our weapon is loaded, give its load back to the player
-                                       if(self.weapon_load[self.weapon] > 0)
+                                       if(self.(weapon_load[self.weapon]) > 0)
                                        {
-                                               own.ammofield += self.weapon_load[self.weapon];
-                                               self.weapon_load[self.weapon] = -1; // schedule the weapon for reloading
+                                               own.ammofield += self.(weapon_load[self.weapon]);
+                                               self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading
                                        }
                                }
                        }
@@ -359,7 +368,7 @@ void W_WeaponFrame()
                        e = get_weaponinfo(self.switchweapon);
                        if(e.spawnflags & WEP_FLAG_RELOADABLE && cvar(strcat("g_balance_", e.netname, "_reload_ammo"))) // prevent accessing undefined cvars
                        {
-                               self.clip_load = self.weapon_load[self.switchweapon];
+                               self.clip_load = self.(weapon_load[self.switchweapon]);
                                self.clip_size = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
                        }
                        else
@@ -412,7 +421,8 @@ void W_WeaponFrame()
                c = c + 1;
                if(wb && ((self.weapons & wb) == 0))
                {
-                       W_SwitchWeapon_Force(self, w_getbestweapon(self));
+                       if(self.weapon == self.switchweapon)
+                               W_SwitchWeapon_Force(self, w_getbestweapon(self));
                        wb = 0;
                }
 
index 0b73f36144994867b931c422980d4b348e28348f..73928031f5951f5979c21d6dac05ef8a7e7d9432 100644 (file)
@@ -293,7 +293,6 @@ vector weapon_adjust = '10 0 -15';
 .vector weapon_morph4origin;
 .vector weapon_morph4angles;
 .float  weapon_morph4time;
-.string weaponname;
 #define QCWEAPONANIMATION_ORIGIN(e) ((weapon_offset_x + e.view_ofs_x) * v_forward - (weapon_offset_y + e.view_ofs_y) * v_right + (weapon_offset_z + e.view_ofs_z) * v_up + weapon_adjust)
 
 /*
@@ -583,9 +582,9 @@ void CL_Weaponentity_Think()
                        self.weaponentity.model = "";
                return;
        }
-       if (self.cnt != self.owner.weapon || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
+       if (self.weaponname != self.owner.weaponname || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
        {
-               self.cnt = self.owner.weapon;
+               self.weaponname = self.owner.weaponname;
                self.dmg = self.owner.modelindex;
                self.deadflag = self.owner.deadflag;
 
@@ -789,9 +788,9 @@ void CL_ExteriorWeaponentity_Think()
                self.model = "";
                return;
        }
-       if (self.cnt != self.owner.weapon || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
+       if (self.weaponname != self.owner.weaponname || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
        {
-               self.cnt = self.owner.weapon;
+               self.weaponname = self.owner.weaponname;
                self.dmg = self.owner.modelindex;
                self.deadflag = self.owner.deadflag;
                if (self.owner.weaponname != "")
@@ -854,6 +853,27 @@ void CL_ExteriorWeaponentity_Think()
                        ang_x = -/* don't ask */ang_x;
                        self.angles = ang;
                }
+
+               if(autocvar_g_loituma)
+               {
+                       vector moddir, modup;
+                       vector modangles;
+                       float t;
+
+                       t = time * autocvar_g_loituma;
+
+                       modangles_x = t * 360;
+                       modangles_y = 90;
+                       modangles_z = 0;
+
+                       self.angles =
+                               AnglesTransform_ToAngles(
+                                       AnglesTransform_Multiply(
+                                               AnglesTransform_FromAngles(self.angles),
+                                               AnglesTransform_FromAngles(modangles)
+                                       )
+                               );
+               }
        }
 
        self.glowmod = self.owner.weaponentity_glowmod;
@@ -1634,7 +1654,7 @@ void W_DecreaseAmmo(.float ammo_type, float ammo_use, float ammo_reload)
        if(ammo_reload)
        {
                self.clip_load -= ammo_use;
-               self.weapon_load[self.weapon] = self.clip_load;
+               self.(weapon_load[self.weapon]) = self.clip_load;
        }
        else
                self.(self.current_ammo) -= ammo_use;
@@ -1663,7 +1683,7 @@ void W_ReloadedAndReady()
                        self.(self.current_ammo) -= 1;
                }
        }
-       self.weapon_load[self.weapon] = self.clip_load;
+       self.(weapon_load[self.weapon]) = self.clip_load;
 
        // do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon,
        // then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
@@ -1746,5 +1766,5 @@ void W_Reload(float sent_ammo_min, float sent_ammo_amount, float sent_time, stri
        if(self.clip_load < 0)
                self.clip_load = 0;
        self.old_clip_load = self.clip_load;
-       self.clip_load = self.weapon_load[self.weapon] = -1;
+       self.clip_load = self.(weapon_load[self.weapon]) = -1;
 }
index 13cddc0d22cf87a7734b7d8ec77dbd07ba92d792..f89d383631c453c35f2d64ee2fd0d82528d56a6e 100644 (file)
@@ -277,13 +277,25 @@ void SV_ParseClientCommand(string s) {
                } else if(lockteams) {
                        sprint( self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n");
                } else if( argv(1) == "red" ) {
-                       ClientKill_TeamChange(COLOR_TEAM1);
+                       if(self.team != COLOR_TEAM1 || self.deadflag != DEAD_NO)
+                               ClientKill_TeamChange(COLOR_TEAM1);
+                       else
+                               sprint( self, "^7You already are on that team.\n");
                } else if( argv(1) == "blue" ) {
-                       ClientKill_TeamChange(COLOR_TEAM2);
+                       if(self.team != COLOR_TEAM2 || self.deadflag != DEAD_NO)
+                               ClientKill_TeamChange(COLOR_TEAM2);
+                       else
+                               sprint( self, "^7You already are on that team.\n");
                } else if( argv(1) == "yellow" ) {
-                       ClientKill_TeamChange(COLOR_TEAM3);
+                       if(self.team != COLOR_TEAM3 || self.deadflag != DEAD_NO)
+                               ClientKill_TeamChange(COLOR_TEAM3);
+                       else
+                               sprint( self, "^7You already are on that team.\n");
                } else if( argv(1) == "pink" ) {
-                       ClientKill_TeamChange(COLOR_TEAM4);
+                       if(self.team != COLOR_TEAM4 || self.deadflag != DEAD_NO)
+                               ClientKill_TeamChange(COLOR_TEAM4);
+                       else
+                               sprint( self, "^7You already are on that team.\n");
                } else if( argv(1) == "auto" ) {
                        ClientKill_TeamChange(-1);
                } else {
index 458489d90e1381e0ca3512105410fa04cbd934cf..9f4631a47c1195f5bf345f36f45c0a971c6fd31c 100644 (file)
@@ -206,6 +206,7 @@ void setanim(entity e, vector anim, float looping, float override, float restart
 //.float weapon; // current weapon
 .float switchweapon; // weapon requested to switch to
 .float switchingweapon; // weapon currently being switched to (is copied from switchweapon once switch is possible)
+.string weaponname; // name of .weapon
 
 .float autoswitch;
 float weapon_action(float wpn, float wrequest);
@@ -313,7 +314,8 @@ float default_weapon_alpha;
 .float cvar_cl_handicap;
 .float cvar_cl_playerdetailreduction;
 .float cvar_cl_clippedspectating;
-.float cvar_cl_nopogostick;
+.float cvar_cl_movement_track_canjump;
+.float cvar_cl_newusekeysupported;
 
 .string cvar_g_xonoticversion;
 .string cvar_cl_weaponpriority;
@@ -411,7 +413,6 @@ float lockteams;
 float sv_maxidle;
 float sv_maxidle_spectatorsareidle;
 
-float sv_pogostick;
 float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end);
 
 float next_pingtime;
@@ -497,6 +498,7 @@ float GetPlayerSoundSampleField_notFound;
 .float version_mismatch;
 
 float independent_players;
+#define INDEPENDENT_PLAYERS (autocvar__independent_players ? (autocvar__independent_players > 0) : independent_players)
 #define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
 #define MAKE_INDEPENDENT_PLAYER(e) (((e).solid = SOLID_TRIGGER) + ((e).frags = FRAGS_PLAYER_NONSOLID))
 // we're using + here instead of , because fteqcc sucks
index 8422cf5df8d7b73294b0b18cf6061e4f7730ee41..57d943438e5a2f36caf3c9c37dfad4b7cb4ff34d 100644 (file)
@@ -621,6 +621,13 @@ void(entity from, entity to) copyentity = #400;
 //description:
 //copies all data in the entity to another entity.
 
+//DP_QC_CRC16
+//idea: divVerent
+//darkplaces implementation: divVerent
+//Some hash function to build hash tables with. This has to be be the CRC-16-CCITT that is also required for the QuakeWorld download protocol.
+//When caseinsensitive is set, the CRC is calculated of the lower cased string.
+float(float caseinsensitive, string s, ...) crc16 = #494;
+
 //DP_QC_CVAR_DEFSTRING
 //idea: id Software (Doom3), LordHavoc
 //darkplaces implementation: LordHavoc
@@ -657,6 +664,24 @@ float CVAR_TYPEFLAG_ENGINE = 8;
 float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
 float CVAR_TYPEFLAG_READONLY = 32;
 
+//DP_QC_DIGEST
+//idea: motorsep, Spike
+//DarkPlaces implementation: divVerent
+//builtin definitions:
+string(string digest, string data, ...) digest_hex = #639;
+//description:
+//returns a given hex digest of given data
+//the returned digest is always encoded in hexadecimal
+//only the "MD4" digest is always supported!
+//if the given digest is not supported, string_null is returned
+//the digest string is matched case sensitively, use "MD4", not "md4"!
+
+//DP_QC_DIGEST_SHA256
+//idea: motorsep, Spike
+//DarkPlaces implementation: divVerent
+//description:
+//"SHA256" is also an allowed digest type
+
 //DP_QC_EDICT_NUM
 //idea: 515
 //DarkPlaces implementation: LordHavoc
@@ -882,6 +907,30 @@ float GETTIME_CDTRACK = 4;
 //returns the playing time of the current cdtrack when passed to gettime()
 //see DP_END_GETSOUNDTIME for similar functionality but for entity sound channels
 
+//DP_QC_I18N
+//idea: divVerent
+//darkplaces implementation: divVerent
+//description:
+//
+//The engine supports translating by gettext compatible .po files.
+//progs.dat uses progs.dat.<LANGUAGE>.po
+//menu.dat uses menu.dat.<LANGUAGE>.po
+//csprogs.dat uses csprogs.dat.<LANGUAGE>.po
+//
+//To create a string that can be translated, define it as
+//  string dotranslate_FILENOTFOUND = "File not found";
+//Note: if the compiler does constant folding, this will only work if there is
+//no other "File not found" string in the progs!
+//
+//Alternatively, if using the Xonotic patched fteqcc compiler, you can simplify
+//this by using _("File not found") directly in the source code.
+//
+//The language is set by the "prvm_language" cvar: if prvm_language is set to
+//"de", it will read progs.dat.de.po for translating strings in progs.dat.
+//
+//If prvm_language is set to to the special name "dump", progs.dat.pot which is
+//a translation template to be edited by filling out the msgstr entries.
+
 //DP_QC_LOG
 //darkplaces implementation: divVerent
 //builtin definitions:
@@ -1209,12 +1258,14 @@ float(string name, string value) registercvar = #93;
 
 //DP_SND_FAKETRACKS
 //idea: requested
+
 //darkplaces implementation: Elric
 //description:
 //the engine plays sound/cdtracks/track001.wav instead of cd track 1 and so on if found, this allows games and mods to have music tracks without using ambientsound.
 //Note: also plays .ogg with DP_SND_OGGVORBIS extension.
 
 //DP_SND_SOUND7_WIP1
+//DP_SND_SOUND7_WIP2
 //idea: divVerent
 //darkplaces implementation: divVerent
 //builtin definitions:
@@ -1225,8 +1276,9 @@ float SOUNDFLAG_RELIABLE = 1;
 //extensions to sound():
 //- channel may be in the range from -128 to 127; channels -128 to 0 are "auto",
 //  i.e. support multiple sounds at once, but cannot be stopped/restarted
-//- a speed parameter has been reserved for later addition of pitch shifting.
-//  it MUST be set to 0 for now, meaning "no pitch change"
+//- a value 0 in the speed parameter means no change; otherwise, it is a
+//  percentage of playback speed ("pitch shifting"). 100 is normal pitch, 50 is
+//  half speed, 200 is double speed, etc. (DP_SND_SOUND7_WIP2)
 //- the flag SOUNDFLAG_RELIABLE can be specified, which makes the sound send
 //  to MSG_ALL (reliable) instead of MSG_BROADCAST (unreliable, default);
 //  similarily, SOUNDFLAG_RELIABLE_TO_ONE sends to MSG_ONE
@@ -1614,6 +1666,8 @@ const float MOVETYPE_PHYSICS = 32; // need to be set before any physics_* builti
 const float SOLID_PHYSICS_BOX = 32;
 const float SOLID_PHYSICS_SPHERE = 33;
 const float SOLID_PHYSICS_CAPSULE = 34;
+const float SOLID_PHYSICS_TRIMESH = 35;
+const float SOLID_PHYSICS_CYLINDER = 36;
 //SOLID_BSP;
 //joint types:
 const float JOINTTYPE_POINT = 1;
@@ -1636,6 +1690,8 @@ const float JOINTTYPE_FIXED = -1;
 //   note that ODE does not support both in one anyway
 //field definitions:
 .float mass; // ODE mass, standart value is 1
+.vector massofs; // offsets a mass center out of object center, if not set a center of model bounds is used
+.float friction;
 .float bouncefactor;
 .float bouncestop;
 .float jointtype;
@@ -1646,7 +1702,6 @@ void(entity e, vector torque) physics_addtorque = #542; // add relative torque
 //description: provides Open Dynamics Engine support, requires extenal dll to be present or engine compiled with statical link option
 //be sure to checkextension for it to know if library is loaded and ready, also to enable physics set "physics_ode" cvar to 1
 //note: this extension is highly experimental and may be unstable
-//note: use SOLID_BSP on entities to get a trimesh collision models on them
 
 //DP_SV_PRINT
 //idea: id Software (QuakeWorld Server)
@@ -2397,13 +2452,6 @@ string(string search, string replace, string subject) strireplace = #485;
 //description:
 //strreplace replaces all occurrences of 'search' with 'replace' in the string 'subject', and returns the result as a tempstring.
 //strireplace does the same but uses case-insensitive matching of the 'search' term
-//
-//DP_QC_CRC16
-//idea: divVerent
-//darkplaces implementation: divVerent
-//Some hash function to build hash tables with. This has to be be the CRC-16-CCITT that is also required for the QuakeWorld download protocol.
-//When caseinsensitive is set, the CRC is calculated of the lower cased string.
-float(float caseinsensitive, string s, ...) crc16 = #494;
 
 //DP_SV_SHUTDOWN
 //idea: divVerent
index 40887ad933c5d61329e18301a41083b253eeae07..994ee260baefb3384a4522de33f146b2d562bcdb 100644 (file)
@@ -543,12 +543,15 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
        }
        else
        {
+               /*
+               skill based bot damage? gtfo. (tZork)
                if (targ.classname == "player")
                if (attacker.classname == "player")
                if (!targ.isbot)
                if (attacker.isbot)
                        damage = damage * bound(0.1, (skill + 5) * 0.1, 1);
-
+        */
+        
                // nullify damage if teamplay is on
                if(deathtype != DEATH_TELEFRAG)
                if(attacker.classname == "player")
index bd5b2c328d01a8ae6ca748d578f700a59489b1e2..4f655ca5738220c1dc75da1c95849f347b2cef68 100644 (file)
@@ -62,6 +62,14 @@ void RemoveGrapplingHook(entity pl)
        //pl.disableclientprediction = FALSE;
 }
 
+void GrapplingHookReset(void)
+{
+       if(self.realowner.hook == self)
+               RemoveGrapplingHook(self.owner);
+       else // in any case:
+               remove(self);
+}
+
 void GrapplingHookThink();
 void GrapplingHook_Stop()
 {
@@ -288,8 +296,11 @@ void FireGrapplingHook (void)
        if((arena_roundbased && time < warmup) || (time < game_starttime))
                return;
 
-    if(self.freezetag_frozen)
-        return;
+  if(self.freezetag_frozen)
+               return;
+       
+       if(self.vehicle)
+               return;
 
        makevectors(self.v_angle);
 
@@ -311,6 +322,7 @@ void FireGrapplingHook (void)
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
        missile.owner = missile.realowner = self;
        self.hook = missile;
+       missile.reset = GrapplingHookReset;
        missile.classname = "grapplinghook";
 
        missile.movetype = MOVETYPE_FLY;
index b9552673e889107ad89f7ec5eea76f9124427d2c..93157819efe8f6685c7594ba38e0f35942d0fe2a 100644 (file)
@@ -406,6 +406,7 @@ void cvar_changes_init()
                BADCVAR("bot_number");
                BADCVAR("bot_prefix");
                BADCVAR("bot_suffix");
+               BADCVAR("bot_config_file");
                BADCVAR("capturelimit_override");
                BADCVAR("fraglimit_override");
                BADCVAR("gametype");
@@ -1355,7 +1356,7 @@ void IntermissionThink()
                return;
 
        if(!mapvote_initialized)
-               if (time < intermission_exittime + 10 && !self.BUTTON_ATCK && !self.BUTTON_JUMP && !self.BUTTON_ATCK2 && !self.BUTTON_HOOK && !self.BUTTON_USE)
+               if (time < intermission_exittime + 10 && !(self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE))
                        return;
 
        MapVote_Start();
index 9203eadbf41c6fbbd63a594a01b87fd01eb692c2..a8537a0ae88c93cb92cf845f5463fd389abc0c10 100644 (file)
@@ -725,6 +725,7 @@ void GameCommand(string command)
                print("  find classname\n");
                print("  extendmatchtime\n");
                print("  reducematchtime\n");
+               print("  warp [level]\n");
                GameCommand_Vote("help", world);
                GameCommand_Ban("help");
                GameCommand_Generic("help");
@@ -1485,6 +1486,19 @@ void GameCommand(string command)
                return;
        }
 
+       if(argv(0) == "warp")
+       {
+               if(autocvar_g_campaign)
+               {
+                       if(argc >= 2)
+                               CampaignLevelWarp(stof(argv(1)));
+                       else
+                               CampaignLevelWarp(-1);
+               }
+               else
+                       print("Not in campaign, can't level warp\n");
+       }
+
        print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }
 
index 3e5bdf392910f87454b6c18c7f00bca134d0d593..b0b1aa3e0dcb3afd67e17a60c685b59d32cb05da 100644 (file)
@@ -616,7 +616,8 @@ void GetCvars(float f)
        GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign");
        GetCvars_handleFloat(s, f, cvar_cl_allow_uid2name, "cl_allow_uid2name");
        GetCvars_handleFloat(s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking");
-       GetCvars_handleFloat(s, f, cvar_cl_nopogostick, "cl_nopogostick");
+       GetCvars_handleFloat(s, f, cvar_cl_movement_track_canjump, "cl_movement_track_canjump");
+       GetCvars_handleFloat(s, f, cvar_cl_newusekeysupported, "cl_newusekeysupported");
 
        // fixup of switchweapon (needed for LMS or when spectating is disabled, as PutClientInServer comes too early)
        if (f > 0)
@@ -1180,7 +1181,6 @@ void readlevelcvars(void)
        g_bloodloss = cvar("g_bloodloss");
        sv_maxidle = cvar("sv_maxidle");
        sv_maxidle_spectatorsareidle = cvar("sv_maxidle_spectatorsareidle");
-       sv_pogostick = cvar("sv_pogostick");
        g_ctf_reverse = cvar("g_ctf_reverse");
        sv_autotaunt = cvar("sv_autotaunt");
        sv_taunt = cvar("sv_taunt");
@@ -2043,7 +2043,6 @@ 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)
 {
@@ -2064,10 +2063,6 @@ 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 f74c9951fd4d49027e518057685823896b6a7def..d2c741f0b46ee0e1757e19c6eab076b4818c5f43 100644 (file)
@@ -144,7 +144,7 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
                --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)
+       if(total_players > 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(world);
@@ -196,7 +196,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
 {
     freezetag_Unfreeze(world); // 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(total_players == 1 && time > game_starttime) // only one player active on server, start a new match immediately
        if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round
        {
                next_round = time;
index 6e85e7aff695290dfd75e2a9609ea06b233b4a84..519d51daa2510edd8f23ecef335e454127bd4f9c 100644 (file)
@@ -109,7 +109,7 @@ void NIX_GiveCurrentWeapon()
                entity e;
                e = get_weaponinfo(nix_weapon);
                if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
-                       self.weapon_load[nix_weapon] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
+                       self.(weapon_load[nix_weapon]) = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
 
                // nex too
                if(autocvar_g_balance_nex_charge)
index 9f40a453ead2bfdad1a40fc0a4829e6051e8165b..a15c2b1341588b896c2beae564c3dcbe0ea4fa10 100644 (file)
@@ -154,12 +154,6 @@ void PlayerStats_TeamScore(float t, string event_id, float value) // TODO: doesn
        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;
-}
-
 /*
        format spec:
 
@@ -283,8 +277,8 @@ void PlayerStats_Shutdown()
        uri = autocvar_g_playerstats_uri;
        if(uri != "")
        {
-               url_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
                playerstats_waitforme = FALSE;
+               url_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
        }
        else
        {
@@ -295,6 +289,26 @@ void PlayerStats_Shutdown()
 }
 //#NO AUTOCVARS END
 
+void PlayerStats_Accuracy(entity p)
+{
+    entity a, w;
+    a = p.accuracy;
+    float i;
+
+    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+    {
+        w = get_weaponinfo(i);
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-hit"), a.(accuracy_hit[i-1]));
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-fired"), a.(accuracy_fired[i-1]));
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-hit"), a.(accuracy_cnt_hit[i-1]));
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-fired"), a.(accuracy_cnt_fired[i-1]));
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-frags"), a.(accuracy_frags[i-1]));
+    }
+}
+
 void PlayerStats_AddGlobalInfo(entity p)
 {
        if(playerstats_db < 0)
@@ -321,30 +335,12 @@ void PlayerStats_AddGlobalInfo(entity p)
        if(stof(db_get(playerstats_db, sprintf("%d:%s", p.playerstats_id, PLAYERSTATS_ALIVETIME))) > 0)
                PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
 
+       PlayerStats_Accuracy(p);
+
        strunzone(p.playerstats_id);
        p.playerstats_id = string_null;
 }
 
-void PlayerStats_Accuracy(entity p)
-{
-    entity a, w;
-    a = p.accuracy;
-    float i;
-
-    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-    {
-        w = get_weaponinfo(i);
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-hit"), a.accuracy_hit[i-1]);
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-fired"), a.accuracy_fired[i-1]);
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-hit"), a.accuracy_cnt_hit[i-1]);
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-fired"), a.accuracy_cnt_fired[i-1]);
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-frags"), a.accuracy_frags[i-1]);
-    }
-}
-
 void PlayerStats_EndMatch(float finished)
 {
        entity p, winner;
index f546e560590025c124a4615905e07a2c15252a3e..b99366434b9e214bbeff607a333dc81f1d6271b6 100644 (file)
@@ -44,9 +44,6 @@ void PlayerStats_TeamScore(float t, 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 8d5fa100c92eec6bdc2f34a793ed917ccd7e5a92..782c567ceb09ab92b9c94cf5a00522a0aec71ed0 100644 (file)
@@ -56,7 +56,7 @@ float TeamScore_SendEntity(entity to, float sendflags)
 
        longflags = 0;
        for(i = 0, p = 1; i < MAX_TEAMSCORE; ++i, p *= 2)
-               if(self.teamscores[i] > 127 || self.teamscores[i] <= -128)
+               if(self.(teamscores[i]) > 127 || self.(teamscores[i]) <= -128)
                        longflags |= p;
 
 #if MAX_TEAMSCORE <= 8
@@ -70,9 +70,9 @@ float TeamScore_SendEntity(entity to, float sendflags)
                if(sendflags & p)
                {
                        if(longflags & p)
-                               WriteInt24_t(MSG_ENTITY, self.teamscores[i]);
+                               WriteInt24_t(MSG_ENTITY, self.(teamscores[i]));
                        else
-                               WriteChar(MSG_ENTITY, self.teamscores[i]);
+                               WriteChar(MSG_ENTITY, self.(teamscores[i]));
                }
 
        return TRUE;
@@ -222,7 +222,7 @@ float PlayerScore_SendEntity(entity to, float sendflags)
 
        longflags = 0;
        for(i = 0, p = 1; i < MAX_SCORE; ++i, p *= 2)
-               if(self.scores[i] > 127 || self.scores[i] <= -128)
+               if(self.(scores[i]) > 127 || self.(scores[i]) <= -128)
                        longflags |= p;
 
 #if MAX_SCORE <= 8
@@ -236,9 +236,9 @@ float PlayerScore_SendEntity(entity to, float sendflags)
                if(sendflags & p)
                {
                        if(longflags & p)
-                               WriteInt24_t(MSG_ENTITY, self.scores[i]);
+                               WriteInt24_t(MSG_ENTITY, self.(scores[i]));
                        else
-                               WriteChar(MSG_ENTITY, self.scores[i]);
+                               WriteChar(MSG_ENTITY, self.(scores[i]));
                }
 
        return TRUE;
index 030a26d9cb8857f922fec1cc382ef14e81d6a29d..eb7205e9c3859bf5d3c2977d8bde069bd31993d7 100644 (file)
@@ -17,12 +17,12 @@ void ScoreRules_basics(float teams, float sprio, float stprio, float score_enabl
        if(score_enabled)
                ScoreInfo_SetLabel_TeamScore  (ST_SCORE,        "score",     stprio);
 
-       if not(independent_players)
+       if not(INDEPENDENT_PLAYERS)
                ScoreInfo_SetLabel_PlayerScore(SP_KILLS,        "kills",     0);
 
        ScoreInfo_SetLabel_PlayerScore(SP_DEATHS,       "deaths",    SFL_LOWER_IS_BETTER);
 
-       if not(independent_players)
+       if not(INDEPENDENT_PLAYERS)
                ScoreInfo_SetLabel_PlayerScore(SP_SUICIDES,     "suicides",  SFL_LOWER_IS_BETTER);
 
        if(score_enabled)
index d9d77b5f5211957f539c4ee41b1057beec0980a4..683b43669536cc76a3ce2d3defe1762f2844701f 100644 (file)
@@ -42,7 +42,7 @@ void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
     entity axh;
 
     axh_id = bound(0, axh_id, MAX_AXH);
-    axh = own.AuxiliaryXhair[axh_id];
+    axh = own.(AuxiliaryXhair[axh_id]);
 
     if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
     {
@@ -56,7 +56,7 @@ void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
     setorigin(axh, loc);
     axh.colormod            = clr;
     axh.SendFlags           = 0x01;
-    own.AuxiliaryXhair[axh_id] = axh;
+    own.(AuxiliaryXhair[axh_id]) = axh;
 }
 
 /*
@@ -428,6 +428,8 @@ void vehicles_enter()
     if(self.team)
     if(self.team != other.team)
         return;
+        
+    RemoveGrapplingHook(other);
 
     self.vehicle_ammo1   = 0;
     self.vehicle_ammo2   = 0;
index 3866284a4c2007efeb3c0e55c99ec32044a2bc6e..aa72d8ec1736590dc0c1bb42b8f2489d289a7bea 100644 (file)
@@ -616,7 +616,7 @@ float w_crylink(float req)
                        return TRUE;
 
                ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_CRYLINK] >= autocvar_g_balance_crylink_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
@@ -626,7 +626,7 @@ float w_crylink(float req)
                        return TRUE;
 
                ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_CRYLINK] >= autocvar_g_balance_crylink_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
index 526d4cd32d6253ff11f5b07022f8e76bd0b369f7..e51b1a826673180c7614a7f52251cf767146c284 100644 (file)
@@ -268,7 +268,7 @@ void lgbeam_think()
                        {
                                dt = min(dt, owner_player.clip_load / autocvar_g_balance_electro_primary_ammo);
                                owner_player.clip_load = max(0, owner_player.clip_load - autocvar_g_balance_electro_primary_ammo * frametime);
-                               owner_player.weapon_load[WEP_ELECTRO] = owner_player.clip_load;
+                               owner_player.(weapon_load[WEP_ELECTRO]) = owner_player.clip_load;
                        }
                        else
                        {
@@ -507,19 +507,19 @@ float w_electro(float req)
                                ammo_amount = 1;
                        else
                                ammo_amount = self.ammo_cells > 0;
-                       ammo_amount += self.weapon_load[WEP_ELECTRO] > 0;
+                       ammo_amount += self.(weapon_load[WEP_ELECTRO]) > 0;
                }
                else
                {
                        ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_primary_ammo;
-                       ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_primary_ammo;
+                       ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_primary_ammo;
                }
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
index d916edd9f60e18005a6700223f5256f88cbc1d5d..9469c354dbf24d8f5262fccb8bb0011e61c81c9a 100644 (file)
@@ -365,13 +365,13 @@ float w_fireball(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_fuel >= autocvar_g_balance_fireball_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_FIREBALL] >= autocvar_g_balance_fireball_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_FIREBALL]) >= autocvar_g_balance_fireball_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_fuel >= autocvar_g_balance_fireball_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_FIREBALL] >= autocvar_g_balance_fireball_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_FIREBALL]) >= autocvar_g_balance_fireball_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
index 1d2ee93b9a2cfb8778d290f69f5071b0491b55ed..a9d1246448f784661490a2d176c1e2635d5eed3d 100644 (file)
@@ -346,13 +346,13 @@ float w_glauncher(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_grenadelauncher_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_GRENADE_LAUNCHER] >= autocvar_g_balance_grenadelauncher_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_GRENADE_LAUNCHER]) >= autocvar_g_balance_grenadelauncher_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_grenadelauncher_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_GRENADE_LAUNCHER] >= autocvar_g_balance_grenadelauncher_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_GRENADE_LAUNCHER]) >= autocvar_g_balance_grenadelauncher_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
index 26d2df69e89507ac3bc7bb8f10690ee96703884f..1952607b823e04838f4f4b671a97a009d4a844f9 100644 (file)
@@ -118,7 +118,7 @@ void W_Hagar_Attack2_Load_Release (void)
        // time to release the rockets we've loaded
 
        local entity missile;
-       local float counter, shots;
+       local float counter, shots, spread_pershot;
        local vector s;
        vector forward, right, up;
 
@@ -153,7 +153,13 @@ void W_Hagar_Attack2_Load_Release (void)
                setorigin (missile, w_shotorg);
                setsize(missile, '0 0 0', '0 0 0');
                missile.movetype = MOVETYPE_FLY;
-
+               
+               // per-shot spread calculation: the more shots there are, the less spread is applied (based on the bias cvar)
+               spread_pershot = ((shots - 1) / (autocvar_g_balance_hagar_secondary_load_max - 1)); 
+               spread_pershot = (1 - (spread_pershot * autocvar_g_balance_hagar_secondary_load_spread_bias));
+               spread_pershot = (autocvar_g_balance_hagar_secondary_spread * spread_pershot * g_weaponspreadfactor);
+               
+               // pattern spread calculation
                s = '0 0 0';
                if (counter == 0)
                        s = '0 0 0';
@@ -163,8 +169,9 @@ void W_Hagar_Attack2_Load_Release (void)
                        s_y = v_forward_x;
                        s_z = v_forward_y;
                }
-               s = s * cvar("g_balance_hagar_secondary_spread") * g_weaponspreadfactor;
-               W_SetupProjectileVelocityEx(missile, w_shotdir + right * s_y + up * s_z, v_up, cvar("g_balance_hagar_secondary_speed"), 0, 0, 0, FALSE);
+               s = s * autocvar_g_balance_hagar_secondary_load_spread * g_weaponspreadfactor;
+               
+               W_SetupProjectileVelocityEx(missile, w_shotdir + right * s_y + up * s_z, v_up, autocvar_g_balance_hagar_secondary_speed, 0, 0, spread_pershot, FALSE);
 
                missile.angles = vectoangles (missile.velocity);
                missile.flags = FL_PROJECTILE;
@@ -190,7 +197,7 @@ void W_Hagar_Attack2_Load (void)
 
        // this is different than WR_CHECKAMMO when it comes to reloading
        if(autocvar_g_balance_hagar_reload_ammo)
-               enough_ammo = self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_secondary_ammo;
+               enough_ammo = self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_secondary_ammo;
        else
                enough_ammo = self.ammo_rockets >= autocvar_g_balance_hagar_secondary_ammo;
 
@@ -340,13 +347,13 @@ float w_hagar(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_hagar_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_hagar_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
index 978ac5f4a4df38316360403e436aad260974183a..0a163e2f98affc699d87da07e3ddcb69b0a8dd2d 100644 (file)
@@ -205,13 +205,13 @@ float w_hlac(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_HLAC] >= autocvar_g_balance_hlac_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_HLAC] >= autocvar_g_balance_hlac_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
index 5e034acb908f9bfe6b1b9a085b8c4dd10dd17a24..fa52a6e0dfb6ad2f7877538874af8333eefb2621 100644 (file)
@@ -3,6 +3,7 @@ REGISTER_WEAPON(LASER, w_laser, 0, 1, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WE
 #else
 #ifdef SVQC
 void(float imp) W_SwitchWeapon;
+void() W_LastWeapon;
 
 void W_Laser_Touch (void)
 {
@@ -259,7 +260,7 @@ float w_laser(float req)
                        else
                        {
                                if(self.switchweapon == WEP_LASER) // don't do this if already switching
-                                       W_SwitchWeapon (self.cnt);
+                                       W_LastWeapon();
                        }
                }
        }
index 4e56d2d94ed99916ff21662fa019e944100785ab..cf970ae9f785f2bba64dbeb8a11a1936bddbcbe4 100644 (file)
@@ -486,7 +486,7 @@ float w_minelayer(float req)
                if (ATTACK_FINISHED(self) <= time || self.weapon != WEP_MINE_LAYER)
                {
                        ammo_amount = self.ammo_rockets >= autocvar_g_balance_minelayer_ammo;
-                       ammo_amount += self.weapon_load[WEP_MINE_LAYER] >= autocvar_g_balance_minelayer_ammo;
+                       ammo_amount += self.(weapon_load[WEP_MINE_LAYER]) >= autocvar_g_balance_minelayer_ammo;
                        return ammo_amount;
                }
        }
index 16cbdcded3778eb1bb7988991ecbeb39a11c54ec..10014a7e1b2fb7f794a24b6fdef0c21f79eb9d9f 100644 (file)
@@ -246,7 +246,7 @@ float w_minstanex(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= minstanex_ammo;
-               ammo_amount += self.weapon_load[WEP_MINSTANEX] >= minstanex_ammo;
+               ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= minstanex_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
@@ -254,7 +254,7 @@ float w_minstanex(float req)
                if(!autocvar_g_balance_minstanex_laser_ammo)
                        return TRUE;
                ammo_amount = self.ammo_cells >= autocvar_g_balance_minstanex_laser_ammo;
-               ammo_amount += self.weapon_load[WEP_MINSTANEX] >= autocvar_g_balance_minstanex_laser_ammo;
+               ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= autocvar_g_balance_minstanex_laser_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
index f9367059555cca67c033a8311e593e9bfc152a81..802298912d96eb774796b893d222705f92eeb754 100644 (file)
@@ -161,7 +161,7 @@ float w_nex(float req)
                                                                                {
                                                                                        self.clip_load = max(autocvar_g_balance_nex_secondary_ammo, self.clip_load - autocvar_g_balance_nex_secondary_ammo * dt);
                                                                                }
-                                                                               self.weapon_load[WEP_NEX] = self.clip_load;
+                                                                               self.(weapon_load[WEP_NEX]) = self.clip_load;
                                                                        }
                                                                        else
                                                                        {
@@ -216,14 +216,14 @@ float w_nex(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_nex_primary_ammo;
-               ammo_amount += (autocvar_g_balance_nex_reload_ammo && self.weapon_load[WEP_NEX] >= autocvar_g_balance_nex_primary_ammo);
+               ammo_amount += (autocvar_g_balance_nex_reload_ammo && self.(weapon_load[WEP_NEX]) >= autocvar_g_balance_nex_primary_ammo);
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                // don't allow charging if we don't have enough ammo
                ammo_amount = self.ammo_cells >= autocvar_g_balance_nex_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_NEX] >= autocvar_g_balance_nex_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_NEX]) >= autocvar_g_balance_nex_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
index 02d859e0fdf854c734e8739111a8bf19aa5558b2..941a528a4b0b4fa9eac087b0222cc3c4d60b9d93 100644 (file)
@@ -183,13 +183,13 @@ float w_rifle(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
index b4987b69f9bcf62a9729c428d35009f1024a1953..4da611e7263dc023953dbce8ff8408e1db7535f2 100644 (file)
@@ -461,7 +461,7 @@ float w_rlauncher(float req)
                {
                        if(autocvar_g_balance_rocketlauncher_reload_ammo)
                        {
-                               if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo && self.weapon_load[WEP_ROCKET_LAUNCHER] < autocvar_g_balance_rocketlauncher_ammo)
+                               if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo && self.(weapon_load[WEP_ROCKET_LAUNCHER]) < autocvar_g_balance_rocketlauncher_ammo)
                                        ammo_amount = TRUE;
                        }
                        else if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
index 7071ed706bd8ffa483eb8ed364e567f0da45efbf..a110c003fdada021479974cbf2b057668d88026e 100644 (file)
@@ -409,6 +409,8 @@ void Seeker_Tag_Touch()
        vector org2;
        entity e;
        
+       PROJECTILE_TOUCH;
+
        dir     = normalize (self.realowner.origin - self.origin);
        org2    = findbetterlocation (self.origin, 8);
 
@@ -586,13 +588,13 @@ float w_seeker(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_seeker_missile_ammo;
-               ammo_amount += self.weapon_load[WEP_SEEKER] >= autocvar_g_balance_seeker_missile_ammo;
+               ammo_amount += self.(weapon_load[WEP_SEEKER]) >= autocvar_g_balance_seeker_missile_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_seeker_tag_ammo;
-               ammo_amount += self.weapon_load[WEP_SEEKER] >= autocvar_g_balance_seeker_tag_ammo;
+               ammo_amount += self.(weapon_load[WEP_SEEKER]) >= autocvar_g_balance_seeker_tag_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
index 2088073f9970e62a1836b96725ab231f85898638..1f097132d84de84acc70fa16375ff6dab115ecaf 100644 (file)
@@ -170,7 +170,7 @@ float w_shotgun(float req)
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_shells >= autocvar_g_balance_shotgun_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_SHOTGUN] >= autocvar_g_balance_shotgun_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_SHOTGUN]) >= autocvar_g_balance_shotgun_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
index 7a4a9c6009927abbd0015b91c38eb93dab34fb90..987e7b41e2570b6480e4d141aa546fcd3dc6ccec 100644 (file)
@@ -5,6 +5,7 @@ REGISTER_WEAPON(TUBA, w_tuba, 0, 1, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH, BOT_PICKU
 //#define TUBA_NOTE(n) strcat("weapons/tuba_note", ftos(n), ".wav")
 .entity tuba_note;
 .float tuba_smoketime;
+.float tuba_instrument;
 
 float Tuba_GetNote(entity pl, float hittype)
 {
@@ -75,14 +76,24 @@ float Tuba_GetNote(entity pl, float hittype)
 
 float W_Tuba_NoteSendEntity(entity to, float sf)
 {
+       float f;
+
        WriteByte(MSG_ENTITY, ENT_CLIENT_TUBANOTE);
-       WriteByte(MSG_ENTITY, (sf & 1) | ((self.cnt + 42) * 2));
+       WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
+       {
+               WriteChar(MSG_ENTITY, self.cnt);
+               f = 0;
+               if(self.realowner != to)
+                       f |= 1;
+               f |= 2 * self.tuba_instrument;
+               WriteByte(MSG_ENTITY, f);
+       }
+       if(sf & 2)
        {
                WriteCoord(MSG_ENTITY, self.origin_x);
                WriteCoord(MSG_ENTITY, self.origin_y);
                WriteCoord(MSG_ENTITY, self.origin_z);
-               WriteByte(MSG_ENTITY, self.realowner != to);
        }
        return TRUE;
 }
@@ -114,13 +125,13 @@ void W_Tuba_NoteThink()
                if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume
                {
                        setorigin(self, self.realowner.origin);
-                       self.SendFlags |= 1;
+                       self.SendFlags |= 2;
                        break;
                }
                if(dir0 * dir1 < 0.9994) // 2 degrees change in angle
                {
                        setorigin(self, self.realowner.origin);
-                       self.SendFlags |= 1;
+                       self.SendFlags |= 2;
                        break;
                }
        }
@@ -136,12 +147,8 @@ void W_Tuba_Attack(float hittype)
 
        if(self.tuba_note)
        {
-               if(self.tuba_note.cnt != n)
+               if(self.tuba_note.cnt != n || self.tuba_note.tuba_instrument != self.tuba_instrument)
                {
-                       /*
-                       self.tuba_note.cnt = n;
-                       self.tuba_note.SendFlags |= 2;
-                       */
                        remove(self.tuba_note);
                        self.tuba_note = world;
                }
@@ -152,6 +159,7 @@ void W_Tuba_Attack(float hittype)
                self.tuba_note = spawn();
                self.tuba_note.owner = self.tuba_note.realowner = self;
                self.tuba_note.cnt = n;
+               self.tuba_note.tuba_instrument = self.tuba_instrument;
                self.tuba_note.think = W_Tuba_NoteThink;
                self.tuba_note.nextthink = time;
                Net_LinkEntity(self.tuba_note, FALSE, 0, W_Tuba_NoteSendEntity);
@@ -228,6 +236,31 @@ float w_tuba(float req)
        {
                weapon_setup(WEP_TUBA);
                self.current_ammo = ammo_none;
+               self.tuba_instrument = 0;
+       }
+       else if (req == WR_RELOAD)
+       {
+               // TODO switch to alternate instruments :)
+               if(self.weaponentity.state == WS_READY)
+               {
+                       /*
+                       switch(self.tuba_instrument)
+                       {
+                               case 0:
+                                       self.tuba_instrument = 1;
+                                       self.weaponname = "laser";
+                                       break;
+                               case 1:
+                                       self.tuba_instrument = 0;
+                                       self.weaponname = "tuba";
+                                       break;
+                       }
+                       */
+                       W_SetupShot(self, FALSE, 0, "", 0, 0);
+                       pointparticles(particleeffectnum("teleport"), w_shotorg, '0 0 0', 1);
+                       self.weaponentity.state = WS_INUSE;
+                       weapon_thinkf(WFRAME_RELOAD, 0.5, w_ready);
+               }
        }
        else if (req == WR_CHECKAMMO1)
                return TRUE; // TODO use fuel?
index 92c81714a1a96fd1f0b606258d0dffe76645571e..71ea1f6f6710d33f25dd833324c15f824fbe8a79 100644 (file)
@@ -4,8 +4,8 @@ REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE |
 #ifdef SVQC
 
 // leilei's fancy muzzleflash stuff
-void UZI_Flash_Go() 
-{      
+void UZI_Flash_Go()
+{
        self.frame = self.frame + 2;
        self.scale = self.scale * 0.5;
        self.alpha = self.alpha - 0.25;
@@ -18,17 +18,17 @@ void UZI_Flash_Go()
                self.realowner.muzzle_flash = world;
                return;
        }
-       
+
 }
 
 void UziFlash()
-{      
+{
        if (self.muzzle_flash == world)
-               self.muzzle_flash = spawn();    
-       
+               self.muzzle_flash = spawn();
+
        // muzzle flash for 1st person view
        setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
-       
+
        self.muzzle_flash.scale = 0.75;
        self.muzzle_flash.think = UZI_Flash_Go;
        self.muzzle_flash.nextthink = time + 0.02;
@@ -102,14 +102,9 @@ void uzi_mode1_fire_auto()
 {
        float uzi_spread;
 
-       W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo);
-       
-       if (self.BUTTON_ATCK)
-               weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
-       else
+       if (!self.BUTTON_ATCK)
        {
-               ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
-               weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
+               w_ready();
                return;
        }
 
@@ -120,27 +115,32 @@ void uzi_mode1_fire_auto()
                w_ready();
                return;
        }
-       
+
+       W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo);
+
        W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage);
        if (!g_norecoil)
        {
                self.punchangle_x = random () - 0.5;
                self.punchangle_y = random () - 0.5;
        }
-       
+
        uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
        fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        endFireBallisticBullet();
-       
+
        self.misc_bulletcounter = self.misc_bulletcounter + 1;
-       
+
        pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        UziFlash();
        W_AttachToShotorg(self.muzzle_flash, '5 0 0');
-       
+
        if (autocvar_g_casings >= 2) // casing code
                SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
+
+       ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
+       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
 }
 
 void uzi_mode1_fire_burst()
@@ -151,16 +151,16 @@ void uzi_mode1_fire_burst()
                self.punchangle_x = random () - 0.5;
                self.punchangle_y = random () - 0.5;
        }
-       
+
        fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        endFireBallisticBullet();
-       
-       
+
+
        pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        UziFlash();
        W_AttachToShotorg(self.muzzle_flash, '5 0 0');
-       
+
        if (autocvar_g_casings >= 2) // casing code
                SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 
@@ -174,7 +174,7 @@ void uzi_mode1_fire_burst()
        {
                weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_refire, uzi_mode1_fire_burst);
        }
-               
+
 }
 
 void spawnfunc_weapon_machinegun(); // defined in t_items.qc
@@ -197,15 +197,16 @@ float w_uzi(float req)
                {
                        if (self.BUTTON_ATCK)
                        if (weapon_prepareattack(0, 0))
-                       {                               
+                       {
                                self.misc_bulletcounter = 0;
                                uzi_mode1_fire_auto();
                        }
-                       
+
                        if(self.BUTTON_ATCK2)
                        if(weapon_prepareattack(1, 0))
                        {
                                if (!weapon_action(self.weapon, WR_CHECKAMMO2))
+                               if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
                                {
                                        W_SwitchWeapon_Force(self, w_getbestweapon(self));
                                        w_ready();
@@ -220,7 +221,7 @@ float w_uzi(float req)
                }
                else
                {
-                       
+
                        if (self.BUTTON_ATCK)
                        if (weapon_prepareattack(0, 0))
                        {
@@ -262,9 +263,9 @@ float w_uzi(float req)
                if(autocvar_g_balance_uzi_reload_ammo)
                {
                        if(autocvar_g_balance_uzi_mode == 1)
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_sustained_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_sustained_ammo;
                        else
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_first_ammo;
                }
                return ammo_amount;
        }
@@ -278,9 +279,9 @@ float w_uzi(float req)
                if(autocvar_g_balance_uzi_reload_ammo)
                {
                        if(autocvar_g_balance_uzi_mode == 1)
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_burst_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_burst_ammo;
                        else
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_first_ammo;
                }
                return ammo_amount;
        }
diff --git a/sound/weapons/tuba_note-1.ogg b/sound/weapons/tuba_note-1.ogg
deleted file mode 100644 (file)
index 2539692..0000000
Binary files a/sound/weapons/tuba_note-1.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-10.ogg b/sound/weapons/tuba_note-10.ogg
deleted file mode 100644 (file)
index 254a7f6..0000000
Binary files a/sound/weapons/tuba_note-10.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-11.ogg b/sound/weapons/tuba_note-11.ogg
deleted file mode 100644 (file)
index d9b0598..0000000
Binary files a/sound/weapons/tuba_note-11.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-12.ogg b/sound/weapons/tuba_note-12.ogg
deleted file mode 100644 (file)
index 855bb22..0000000
Binary files a/sound/weapons/tuba_note-12.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-13.ogg b/sound/weapons/tuba_note-13.ogg
deleted file mode 100644 (file)
index 082ab0b..0000000
Binary files a/sound/weapons/tuba_note-13.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-14.ogg b/sound/weapons/tuba_note-14.ogg
deleted file mode 100644 (file)
index 06a6c47..0000000
Binary files a/sound/weapons/tuba_note-14.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-15.ogg b/sound/weapons/tuba_note-15.ogg
deleted file mode 100644 (file)
index ecbbdff..0000000
Binary files a/sound/weapons/tuba_note-15.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-16.ogg b/sound/weapons/tuba_note-16.ogg
deleted file mode 100644 (file)
index 990d4fa..0000000
Binary files a/sound/weapons/tuba_note-16.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-17.ogg b/sound/weapons/tuba_note-17.ogg
deleted file mode 100644 (file)
index 0d6277c..0000000
Binary files a/sound/weapons/tuba_note-17.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-18.ogg b/sound/weapons/tuba_note-18.ogg
deleted file mode 100644 (file)
index d065eb9..0000000
Binary files a/sound/weapons/tuba_note-18.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-2.ogg b/sound/weapons/tuba_note-2.ogg
deleted file mode 100644 (file)
index b91b5b7..0000000
Binary files a/sound/weapons/tuba_note-2.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-3.ogg b/sound/weapons/tuba_note-3.ogg
deleted file mode 100644 (file)
index 94a56cb..0000000
Binary files a/sound/weapons/tuba_note-3.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-4.ogg b/sound/weapons/tuba_note-4.ogg
deleted file mode 100644 (file)
index 023a7d3..0000000
Binary files a/sound/weapons/tuba_note-4.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-5.ogg b/sound/weapons/tuba_note-5.ogg
deleted file mode 100644 (file)
index 25ff35b..0000000
Binary files a/sound/weapons/tuba_note-5.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-6.ogg b/sound/weapons/tuba_note-6.ogg
deleted file mode 100644 (file)
index 8bff99a..0000000
Binary files a/sound/weapons/tuba_note-6.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-7.ogg b/sound/weapons/tuba_note-7.ogg
deleted file mode 100644 (file)
index 3cc7f93..0000000
Binary files a/sound/weapons/tuba_note-7.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-8.ogg b/sound/weapons/tuba_note-8.ogg
deleted file mode 100644 (file)
index 23f5410..0000000
Binary files a/sound/weapons/tuba_note-8.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note-9.ogg b/sound/weapons/tuba_note-9.ogg
deleted file mode 100644 (file)
index c15291c..0000000
Binary files a/sound/weapons/tuba_note-9.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note0.ogg b/sound/weapons/tuba_note0.ogg
deleted file mode 100644 (file)
index 64d73c4..0000000
Binary files a/sound/weapons/tuba_note0.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note1.ogg b/sound/weapons/tuba_note1.ogg
deleted file mode 100644 (file)
index d0b26e9..0000000
Binary files a/sound/weapons/tuba_note1.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note10.ogg b/sound/weapons/tuba_note10.ogg
deleted file mode 100644 (file)
index e5e8157..0000000
Binary files a/sound/weapons/tuba_note10.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note11.ogg b/sound/weapons/tuba_note11.ogg
deleted file mode 100644 (file)
index 0421399..0000000
Binary files a/sound/weapons/tuba_note11.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note12.ogg b/sound/weapons/tuba_note12.ogg
deleted file mode 100644 (file)
index a0139f4..0000000
Binary files a/sound/weapons/tuba_note12.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note13.ogg b/sound/weapons/tuba_note13.ogg
deleted file mode 100644 (file)
index b5794c3..0000000
Binary files a/sound/weapons/tuba_note13.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note14.ogg b/sound/weapons/tuba_note14.ogg
deleted file mode 100644 (file)
index ae414fa..0000000
Binary files a/sound/weapons/tuba_note14.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note15.ogg b/sound/weapons/tuba_note15.ogg
deleted file mode 100644 (file)
index 6193dc7..0000000
Binary files a/sound/weapons/tuba_note15.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note16.ogg b/sound/weapons/tuba_note16.ogg
deleted file mode 100644 (file)
index a7c3d64..0000000
Binary files a/sound/weapons/tuba_note16.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note17.ogg b/sound/weapons/tuba_note17.ogg
deleted file mode 100644 (file)
index ce94216..0000000
Binary files a/sound/weapons/tuba_note17.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note18.ogg b/sound/weapons/tuba_note18.ogg
deleted file mode 100644 (file)
index 47f9bc1..0000000
Binary files a/sound/weapons/tuba_note18.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note19.ogg b/sound/weapons/tuba_note19.ogg
deleted file mode 100644 (file)
index d51d714..0000000
Binary files a/sound/weapons/tuba_note19.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note2.ogg b/sound/weapons/tuba_note2.ogg
deleted file mode 100644 (file)
index 4ee01b0..0000000
Binary files a/sound/weapons/tuba_note2.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note20.ogg b/sound/weapons/tuba_note20.ogg
deleted file mode 100644 (file)
index 8598e49..0000000
Binary files a/sound/weapons/tuba_note20.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note21.ogg b/sound/weapons/tuba_note21.ogg
deleted file mode 100644 (file)
index 42e4d05..0000000
Binary files a/sound/weapons/tuba_note21.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note22.ogg b/sound/weapons/tuba_note22.ogg
deleted file mode 100644 (file)
index 40c9e64..0000000
Binary files a/sound/weapons/tuba_note22.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note23.ogg b/sound/weapons/tuba_note23.ogg
deleted file mode 100644 (file)
index 81e2215..0000000
Binary files a/sound/weapons/tuba_note23.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note24.ogg b/sound/weapons/tuba_note24.ogg
deleted file mode 100644 (file)
index 8dafb9b..0000000
Binary files a/sound/weapons/tuba_note24.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note25.ogg b/sound/weapons/tuba_note25.ogg
deleted file mode 100644 (file)
index 0ded294..0000000
Binary files a/sound/weapons/tuba_note25.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note26.ogg b/sound/weapons/tuba_note26.ogg
deleted file mode 100644 (file)
index 39a7401..0000000
Binary files a/sound/weapons/tuba_note26.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note27.ogg b/sound/weapons/tuba_note27.ogg
deleted file mode 100644 (file)
index 6c87882..0000000
Binary files a/sound/weapons/tuba_note27.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note3.ogg b/sound/weapons/tuba_note3.ogg
deleted file mode 100644 (file)
index 3057d39..0000000
Binary files a/sound/weapons/tuba_note3.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note4.ogg b/sound/weapons/tuba_note4.ogg
deleted file mode 100644 (file)
index 36e22c4..0000000
Binary files a/sound/weapons/tuba_note4.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note5.ogg b/sound/weapons/tuba_note5.ogg
deleted file mode 100644 (file)
index 08c3c00..0000000
Binary files a/sound/weapons/tuba_note5.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note6.ogg b/sound/weapons/tuba_note6.ogg
deleted file mode 100644 (file)
index 2db0871..0000000
Binary files a/sound/weapons/tuba_note6.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note7.ogg b/sound/weapons/tuba_note7.ogg
deleted file mode 100644 (file)
index 89776e1..0000000
Binary files a/sound/weapons/tuba_note7.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note8.ogg b/sound/weapons/tuba_note8.ogg
deleted file mode 100644 (file)
index 0ebea71..0000000
Binary files a/sound/weapons/tuba_note8.ogg and /dev/null differ
diff --git a/sound/weapons/tuba_note9.ogg b/sound/weapons/tuba_note9.ogg
deleted file mode 100644 (file)
index dc19ff4..0000000
Binary files a/sound/weapons/tuba_note9.ogg and /dev/null differ
index f863dcfc7d2a088f2706d3b20302b3df3a8282e7..5e2a0e83b1c7014ab6b1f6e04492c703cbd57ddd 100644 (file)
 \cl_port\Force client to use chosen port unless it is set to 0
 
 \XonoticSettingsDialog/Misc\Misc settings
+\menu_tooltips\Menu tooltips: disabled, standard or advanced (also shows cvar or console command bound to the menu item)
 \showtime\Show current time of day, useful on screenshots
 \showdate\Show current date, useful on screenshots
 \showfps\Show your rendered frames per second
index b7c87a34a63ff22494dbecbb418dc9fd25cd7d74..0024010420e5a06168e479f2e20046db328b3f7c 100755 (executable)
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+errord=false
 countw=`awk '/^seta? g_/ { print $2; }' balanceXonotic.cfg       | sort -u | tr -d '\r' | git hash-object --stdin | cut -c 1-32`
 for b in balance*.cfg; do
        countb=`awk '/^seta? g_/ { print $2; }' "$b"  | sort -u | tr -d '\r' | git hash-object --stdin | cut -c 1-32`
@@ -14,7 +15,10 @@ for b in balance*.cfg; do
                awk '/^seta? g_/ { print $2; }' "$b"                     | sort -u | tr -d '\r' > "$B"
                diff "$A" "$B" | grep '^[<>]' | sort
                rm -f "$A" "$B"
-               echo "Please wait for 30 seconds, so you have had enough time to read this..."
-               sleep 30
+               errord=true
        fi
 done
+if $errord; then
+       echo "Please wait for 30 seconds, so you have had enough time to read this..."
+       sleep 30
+fi