]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into martin-t/master2 martin-t/master2
authorMartin Taibr <taibr.martin@gmail.com>
Sat, 30 Nov 2019 22:02:35 +0000 (23:02 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Sat, 30 Nov 2019 22:02:35 +0000 (23:02 +0100)
307 files changed:
.gitlab-ci.yml
.tx/merge-base
_hud_descriptions.cfg
bal-wep-mario.cfg
bal-wep-nexuiz25.cfg
bal-wep-overkill-nerfed.cfg
bal-wep-samual.cfg
bal-wep-testing.cfg [new file with mode: 0644]
bal-wep-testingxpm.cfg [new file with mode: 0644]
bal-wep-xdf.cfg
bal-wep-xonotic.cfg
bal-wep-xpm.cfg
balance-testing.cfg [new file with mode: 0644]
balance-testingxpm.cfg [new file with mode: 0644]
binds-xonotic.cfg
commands.cfg
common.cs.po
common.de.po
common.de_CH.po
common.fr.po
common.ro.po
common.ru.po
common.tr.po
crosshairs.cfg
gamemodes-server.cfg
help-xonotic.cfg
help.cfg
hud_luma.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
models/monsters/zombie.dpm_0.sounds
mutators.cfg
notifications.cfg
physicsCPMA.cfg
physicsQ2.cfg
physicsQ2a.cfg
physicsQ3.cfg
physicsWarsow.cfg
physicsWarsowClassicBunny.cfg
physicsWarsowDev.cfg
qcsrc/client/autocvars.qh
qcsrc/client/defs.qh
qcsrc/client/hud/hud_config.qc
qcsrc/client/hud/panel/ammo.qc
qcsrc/client/hud/panel/quickmenu.qc
qcsrc/client/hud/panel/weapons.qc
qcsrc/client/main.qc
qcsrc/client/view.qc
qcsrc/common/constants.qh
qcsrc/common/csqcmodel_settings.qh
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh
qcsrc/common/gamemodes/gamemode/ctf/_mod.inc
qcsrc/common/gamemodes/gamemode/ctf/ctf.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc
qcsrc/common/gamemodes/gamemode/domination/_mod.inc
qcsrc/common/gamemodes/gamemode/domination/_mod.qh
qcsrc/common/gamemodes/gamemode/domination/domination.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/domination/domination.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh
qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc
qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh
qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc
qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh
qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/sv_keyhunt.qc
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh
qcsrc/common/gamemodes/gamemode/nexball/_mod.inc
qcsrc/common/gamemodes/gamemode/nexball/_mod.qh
qcsrc/common/gamemodes/gamemode/nexball/nexball.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/nexball.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/weapon.qh
qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc
qcsrc/common/items/all.qh
qcsrc/common/items/inventory.qh
qcsrc/common/items/item.qh
qcsrc/common/items/item/ammo.qc
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/mapobjects/func/door.qc
qcsrc/common/mapobjects/trigger/jumppads.qc
qcsrc/common/minigames/minigame/ttt.qc
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/mutators/mutator/buffs/sv_buffs.qc
qcsrc/common/mutators/mutator/dodging/_mod.inc
qcsrc/common/mutators/mutator/dodging/_mod.qh
qcsrc/common/mutators/mutator/dodging/dodging.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/dodging/dodging.qh [new file with mode: 0644]
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/nix/sv_nix.qc
qcsrc/common/mutators/mutator/overkill/_mod.inc
qcsrc/common/mutators/mutator/overkill/_mod.qh
qcsrc/common/mutators/mutator/overkill/okhmg.qc
qcsrc/common/mutators/mutator/overkill/okmachinegun.qc
qcsrc/common/mutators/mutator/overkill/oknex.qc
qcsrc/common/mutators/mutator/overkill/overkill.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/overkill/overkill.qh [new file with mode: 0644]
qcsrc/common/mutators/mutator/overkill/sv_overkill.qc
qcsrc/common/mutators/mutator/rocketflying/sv_rocketflying.qc
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh
qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh [new file with mode: 0644]
qcsrc/common/notifications/all.inc
qcsrc/common/notifications/all.qc
qcsrc/common/notifications/all.qh
qcsrc/common/physics/movetypes/movetypes.qc
qcsrc/common/physics/movetypes/movetypes.qh
qcsrc/common/physics/movetypes/step.qc
qcsrc/common/physics/movetypes/walk.qc
qcsrc/common/physics/player.qc
qcsrc/common/playerstats.qc
qcsrc/common/stats.qh
qcsrc/common/t_items.qc
qcsrc/common/t_items.qh
qcsrc/common/turrets/turret/phaser_weapon.qc
qcsrc/common/turrets/util.qc
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/common/vehicles/sv_vehicles.qc
qcsrc/common/vehicles/sv_vehicles.qh
qcsrc/common/weapons/weapon/arc.qc
qcsrc/common/weapons/weapon/crylink.qc
qcsrc/common/weapons/weapon/devastator.qc
qcsrc/common/weapons/weapon/devastator.qh
qcsrc/common/weapons/weapon/hagar.qc
qcsrc/common/weapons/weapon/hlac.qc
qcsrc/common/weapons/weapon/hook.qc
qcsrc/common/weapons/weapon/machinegun.qc
qcsrc/common/weapons/weapon/seeker.qc
qcsrc/common/weapons/weapon/shockwave.qc
qcsrc/common/weapons/weapon/shotgun.qc
qcsrc/common/weapons/weapon/vortex.qc
qcsrc/common/wepent.qc
qcsrc/common/wepent.qh
qcsrc/lib/csqcmodel/cl_model.qc
qcsrc/lib/csqcmodel/cl_model.qh
qcsrc/lib/csqcmodel/sv_model.qc
qcsrc/lib/csqcmodel/sv_model.qh
qcsrc/lib/i18n.qh
qcsrc/lib/warpzone/mathlib.qc
qcsrc/menu/skin-customizables.inc
qcsrc/menu/xonotic/_mod.inc
qcsrc/menu/xonotic/_mod.qh
qcsrc/menu/xonotic/dialog_disconnect.qc [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_disconnect.qh [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_multiplayer_join.qc
qcsrc/menu/xonotic/dialog_multiplayer_profile.qc
qcsrc/menu/xonotic/dialog_settings_misc.qc
qcsrc/menu/xonotic/keybinder.qc
qcsrc/menu/xonotic/mainwindow.qc
qcsrc/menu/xonotic/mainwindow.qh
qcsrc/menu/xonotic/serverlist.qc
qcsrc/menu/xonotic/serverlist.qh
qcsrc/menu/xonotic/statslist.qc
qcsrc/server/antilag.qc
qcsrc/server/antilag.qh
qcsrc/server/autocvars.qh
qcsrc/server/bot/api.qh
qcsrc/server/bot/default/bot.qc
qcsrc/server/bot/default/havocbot/havocbot.qc
qcsrc/server/bot/default/navigation.qc
qcsrc/server/bot/default/navigation.qh
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/bot/default/waypoints.qh
qcsrc/server/bot/null/bot_null.qc
qcsrc/server/campaign.qc
qcsrc/server/client.qc
qcsrc/server/client.qh
qcsrc/server/command/cmd.qc
qcsrc/server/command/vote.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/ipban.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/events.qh
qcsrc/server/player.qc
qcsrc/server/sv_main.qc
qcsrc/server/tests.qc
qcsrc/server/weapons/selection.qc
qcsrc/server/weapons/spawning.qc
qcsrc/server/weapons/tracing.qc
qcsrc/server/weapons/tracing.qh
qcsrc/server/weapons/weaponsystem.qc
qcsrc/tools/compilationunits.sh
qcsrc/tools/qcc.sh
ruleset-XDF.cfg
ruleset-overkill.cfg
sound/misc/armor1.ogg [new file with mode: 0644]
sound/misc/armor1.wav [deleted file]
sound/misc/armor10.ogg [new file with mode: 0644]
sound/misc/armor10.wav [deleted file]
sound/misc/armor17_5.ogg [new file with mode: 0644]
sound/misc/armor17_5.wav [deleted file]
sound/misc/armor25.ogg [new file with mode: 0644]
sound/misc/armor25.wav [deleted file]
sound/misc/armorimpact.ogg [new file with mode: 0644]
sound/misc/armorimpact.wav [deleted file]
sound/misc/footstep01.ogg [new file with mode: 0644]
sound/misc/footstep01.wav [deleted file]
sound/misc/footstep02.ogg [new file with mode: 0644]
sound/misc/footstep02.wav [deleted file]
sound/misc/footstep03.ogg [new file with mode: 0644]
sound/misc/footstep03.wav [deleted file]
sound/misc/footstep04.ogg [new file with mode: 0644]
sound/misc/footstep04.wav [deleted file]
sound/misc/footstep05.ogg [new file with mode: 0644]
sound/misc/footstep05.wav [deleted file]
sound/misc/footstep06.ogg [new file with mode: 0644]
sound/misc/footstep06.wav [deleted file]
sound/misc/gib.ogg [new file with mode: 0644]
sound/misc/gib.wav [deleted file]
sound/misc/gib_splat01.ogg [new file with mode: 0644]
sound/misc/gib_splat01.wav [deleted file]
sound/misc/gib_splat02.ogg [new file with mode: 0644]
sound/misc/gib_splat02.wav [deleted file]
sound/misc/gib_splat03.ogg [new file with mode: 0644]
sound/misc/gib_splat03.wav [deleted file]
sound/misc/gib_splat04.ogg [new file with mode: 0644]
sound/misc/gib_splat04.wav [deleted file]
sound/misc/hitground1.ogg
sound/misc/hitground2.ogg
sound/misc/hitground3.ogg
sound/misc/hitground4.ogg
sound/misc/itempickup.ogg
sound/misc/itemrespawn.ogg
sound/misc/mediumhealth.ogg
sound/misc/megahealth.ogg
sound/misc/metalhitground1.ogg
sound/misc/metalhitground2.ogg
sound/misc/metalhitground3.ogg
sound/misc/metalhitground4.ogg
sound/misc/minihealth.ogg
sound/misc/missile_fly.ogg [new file with mode: 0644]
sound/misc/missile_fly.wav [deleted file]
sound/misc/poweroff.ogg [new file with mode: 0644]
sound/misc/poweroff.wav [deleted file]
sound/misc/powerup.ogg
sound/misc/powerup_shield.ogg
sound/misc/shield_respawn.ogg [new file with mode: 0644]
sound/misc/shield_respawn.wav [deleted file]
sound/misc/spawn.ogg
sound/misc/strength_respawn.ogg [new file with mode: 0644]
sound/misc/strength_respawn.wav [deleted file]
sound/misc/teleport.ogg
sound/misc/typehit.ogg [new file with mode: 0644]
sound/misc/typehit.wav [deleted file]
sound/nexball/bounce.ogg
sound/nexball/drop.ogg
sound/weapons/crylink_fire.ogg
sound/weapons/crylink_fire2.ogg
sound/weapons/crylink_impact.ogg
sound/weapons/crylink_impact2.ogg
sound/weapons/electro_fire.ogg
sound/weapons/electro_fire2.ogg
sound/weapons/electro_impact_combo.ogg
sound/weapons/fireball_fire.ogg [new file with mode: 0644]
sound/weapons/fireball_fire.wav [deleted file]
sound/weapons/fireball_fire2.ogg [new file with mode: 0644]
sound/weapons/fireball_fire2.wav [deleted file]
sound/weapons/fireball_fly.ogg
sound/weapons/fireball_fly2.ogg
sound/weapons/fireball_impact2.ogg [new file with mode: 0644]
sound/weapons/fireball_impact2.wav [deleted file]
sound/weapons/fireball_prefire2.ogg [new file with mode: 0644]
sound/weapons/fireball_prefire2.wav [deleted file]
sound/weapons/grenade_impact.ogg
sound/weapons/hagar_fire.ogg
sound/weapons/hook_impact.ogg
sound/weapons/hookbomb_fire.ogg
sound/weapons/lasergun_fire.ogg
sound/weapons/minstanexfire.ogg
sound/weapons/missile_fly.ogg [new file with mode: 0644]
sound/weapons/nexfire.ogg
sound/weapons/neximpact.ogg
sound/weapons/nexwhoosh1.ogg
sound/weapons/nexwhoosh2.ogg
sound/weapons/nexwhoosh3.ogg
sound/weapons/reload.ogg
sound/weapons/rocket_fire.ogg
sound/weapons/rocket_impact.ogg
sound/weapons/rocket_mode.ogg
sound/weapons/shotgun_fire.ogg
sound/weapons/shotgun_melee.ogg
sound/weapons/strength_fire.ogg
sound/weapons/unavailable.ogg [new file with mode: 0644]
sound/weapons/unavailable.wav [deleted file]
sound/weapons/uzi_fire.ogg
sound/weapons/weapon_switch.ogg
sound/weapons/weaponpickup.ogg
vehicles.cfg
wpeditor.txt [new file with mode: 0644]
xonotic-client.cfg
xonotic-server.cfg

index 094013796d99ccc391e7d134aac75687d0cc615f..8724d06617940c0ed8cf76c67ad0fc94a25cb5a9 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
     - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
     - make
-    - EXPECT=0a8b491cd50a1e77d930b048c98da88f
+    - EXPECT=892e447048e051e51f30cff2affc729a
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
@@ -56,6 +56,9 @@ test_sv_unit:
       done < <(${ENGINE} +developer 1 +map gitlab-ci +sv_cmd runtest +exit)
     - exit 1
 
+# NOTE: The generated docs are incomplete - they don't contain code behind SVQC CSQC MENUQC GAMEQC ifdefs.
+# With them added to PREDEFINED, it would take over half an hour to generate the docs and even then
+# they might not be complete. Doxygen doesn't handle #elif and might not understand some QC definitions.
 doxygen:  # rename to 'pages' when gitlab.com allows pages to exceed 100MiB
   stage: deploy
   script:
index 27d0db5ace70b7062d64d3138ea86384f87ba81f..547040790313863da4a7cfb44aa97d094f626ca5 100644 (file)
@@ -1 +1 @@
-Tue Jul 30 07:24:47 CEST 2019
+Thu Nov 28 07:24:39 CET 2019
index 30e5a8bee9a8756fe9fafe883306260e1e4025aa..6e393e6a57eff4fdba4a60878e94ce0a2d106ead 100644 (file)
@@ -63,6 +63,7 @@ seta hud_panel_weapons_label_scale "" "scale of the weapon text label"
 seta hud_panel_weapons_accuracy "" "show accuracy color as the weapon icon background; colors can be configured with accuracy_color* cvars"
 seta hud_panel_weapons_ammo "" "show ammo as a status bar"
 seta hud_panel_weapons_onlyowned "" "show only owned weapons, set it to 2 to show only the held weapon"
+seta hud_panel_weapons_orderbyimpulse "" "List weapons in their impulse order instead of priority"
 seta hud_panel_weapons_noncurrent_alpha "" "alpha of noncurrent weapons"
 seta hud_panel_weapons_noncurrent_scale "" "scale of noncurrent weapons, relative to the current weapon"
 seta hud_panel_weapons_selection_radius "" "number of weapons that get partially highlighted on each side of the currently selected weapon"
index 56eaa61cd94d48fdf7e432a3ef5fba88124ae2d4..d3270acc83acd29cf991d547f282a43eaa3c0482 100644 (file)
@@ -401,6 +401,7 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 300
+set g_balance_devastator_remote_jump 1
 set g_balance_devastator_remote_jump_damage 70
 set g_balance_devastator_remote_jump_force 450
 set g_balance_devastator_remote_jump_radius 100
@@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1
 set g_balance_okhmg_primary_damage 30
 set g_balance_okhmg_primary_force 10
 set g_balance_okhmg_primary_refire 0.05
-set g_balance_okhmg_primary_solidpenetration 32
+set g_balance_okhmg_primary_solidpenetration 127
 set g_balance_okhmg_primary_spread_add 0.005
 set g_balance_okhmg_primary_spread_max 0.06
 set g_balance_okhmg_primary_spread_min 0.01
@@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2
 set g_balance_okhmg_secondary_damage 25
 set g_balance_okhmg_secondary_delay 0
 set g_balance_okhmg_secondary_edgedamage 12.5
-set g_balance_okhmg_secondary_force 300
+set g_balance_okhmg_secondary_force 360
 set g_balance_okhmg_secondary_force_zscale 1
 set g_balance_okhmg_secondary_lifetime 5
 set g_balance_okhmg_secondary_radius 70
@@ -819,7 +820,7 @@ set g_balance_okmachinegun_primary_ammo 1
 set g_balance_okmachinegun_primary_damage 25
 set g_balance_okmachinegun_primary_force 5
 set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 63
+set g_balance_okmachinegun_primary_solidpenetration 100
 set g_balance_okmachinegun_primary_spread_add 0.012
 set g_balance_okmachinegun_primary_spread_max 0.05
 set g_balance_okmachinegun_primary_spread_min 0
@@ -829,7 +830,7 @@ set g_balance_okmachinegun_secondary_animtime 0.2
 set g_balance_okmachinegun_secondary_damage 25
 set g_balance_okmachinegun_secondary_delay 0
 set g_balance_okmachinegun_secondary_edgedamage 12.5
-set g_balance_okmachinegun_secondary_force 300
+set g_balance_okmachinegun_secondary_force 360
 set g_balance_okmachinegun_secondary_force_zscale 1
 set g_balance_okmachinegun_secondary_lifetime 5
 set g_balance_okmachinegun_secondary_radius 70
@@ -882,7 +883,7 @@ set g_balance_oknex_secondary_damagefalloff_maxdist 0
 set g_balance_oknex_secondary_damagefalloff_mindist 0
 set g_balance_oknex_secondary_delay 0
 set g_balance_oknex_secondary_edgedamage 12.5
-set g_balance_oknex_secondary_force 300
+set g_balance_oknex_secondary_force 360
 set g_balance_oknex_secondary_force_zscale 1
 set g_balance_oknex_secondary_lifetime 5
 set g_balance_oknex_secondary_radius 70
@@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2
 set g_balance_okrpc_secondary_damage 25
 set g_balance_okrpc_secondary_delay 0
 set g_balance_okrpc_secondary_edgedamage 12.5
-set g_balance_okrpc_secondary_force 300
+set g_balance_okrpc_secondary_force 360
 set g_balance_okrpc_secondary_force_zscale 1
 set g_balance_okrpc_secondary_lifetime 5
 set g_balance_okrpc_secondary_radius 70
@@ -951,7 +952,7 @@ set g_balance_okshotgun_secondary_animtime 0.2
 set g_balance_okshotgun_secondary_damage 25
 set g_balance_okshotgun_secondary_delay 0
 set g_balance_okshotgun_secondary_edgedamage 12.5
-set g_balance_okshotgun_secondary_force 300
+set g_balance_okshotgun_secondary_force 360
 set g_balance_okshotgun_secondary_force_zscale 1
 set g_balance_okshotgun_secondary_lifetime 5
 set g_balance_okshotgun_secondary_radius 70
index f49629922216af6a680399cd27d830a19ab777c0..c9d87fd0578f32daff8750b19727a8e76d2006dc 100644 (file)
@@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 105
 set g_balance_devastator_remote_edgedamage 40
 set g_balance_devastator_remote_force 600
+set g_balance_devastator_remote_jump 0
 set g_balance_devastator_remote_jump_damage 70
 set g_balance_devastator_remote_jump_force 0
-set g_balance_devastator_remote_jump_radius 0
+set g_balance_devastator_remote_jump_radius 100
 set g_balance_devastator_remote_jump_velocity_z_add 400
 set g_balance_devastator_remote_jump_velocity_z_max 1500
 set g_balance_devastator_remote_jump_velocity_z_min 400
@@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1
 set g_balance_okhmg_primary_damage 30
 set g_balance_okhmg_primary_force 10
 set g_balance_okhmg_primary_refire 0.05
-set g_balance_okhmg_primary_solidpenetration 32
+set g_balance_okhmg_primary_solidpenetration 127
 set g_balance_okhmg_primary_spread_add 0.005
 set g_balance_okhmg_primary_spread_max 0.06
 set g_balance_okhmg_primary_spread_min 0.01
@@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2
 set g_balance_okhmg_secondary_damage 25
 set g_balance_okhmg_secondary_delay 0
 set g_balance_okhmg_secondary_edgedamage 12.5
-set g_balance_okhmg_secondary_force 300
+set g_balance_okhmg_secondary_force 360
 set g_balance_okhmg_secondary_force_zscale 1
 set g_balance_okhmg_secondary_lifetime 5
 set g_balance_okhmg_secondary_radius 70
@@ -819,7 +820,7 @@ set g_balance_okmachinegun_primary_ammo 1
 set g_balance_okmachinegun_primary_damage 25
 set g_balance_okmachinegun_primary_force 5
 set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 63
+set g_balance_okmachinegun_primary_solidpenetration 100
 set g_balance_okmachinegun_primary_spread_add 0.012
 set g_balance_okmachinegun_primary_spread_max 0.05
 set g_balance_okmachinegun_primary_spread_min 0
@@ -829,7 +830,7 @@ set g_balance_okmachinegun_secondary_animtime 0.2
 set g_balance_okmachinegun_secondary_damage 25
 set g_balance_okmachinegun_secondary_delay 0
 set g_balance_okmachinegun_secondary_edgedamage 12.5
-set g_balance_okmachinegun_secondary_force 300
+set g_balance_okmachinegun_secondary_force 360
 set g_balance_okmachinegun_secondary_force_zscale 1
 set g_balance_okmachinegun_secondary_lifetime 5
 set g_balance_okmachinegun_secondary_radius 70
@@ -882,7 +883,7 @@ set g_balance_oknex_secondary_damagefalloff_maxdist 0
 set g_balance_oknex_secondary_damagefalloff_mindist 0
 set g_balance_oknex_secondary_delay 0
 set g_balance_oknex_secondary_edgedamage 12.5
-set g_balance_oknex_secondary_force 300
+set g_balance_oknex_secondary_force 360
 set g_balance_oknex_secondary_force_zscale 1
 set g_balance_oknex_secondary_lifetime 5
 set g_balance_oknex_secondary_radius 70
@@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2
 set g_balance_okrpc_secondary_damage 25
 set g_balance_okrpc_secondary_delay 0
 set g_balance_okrpc_secondary_edgedamage 12.5
-set g_balance_okrpc_secondary_force 300
+set g_balance_okrpc_secondary_force 360
 set g_balance_okrpc_secondary_force_zscale 1
 set g_balance_okrpc_secondary_lifetime 5
 set g_balance_okrpc_secondary_radius 70
@@ -951,7 +952,7 @@ set g_balance_okshotgun_secondary_animtime 0.2
 set g_balance_okshotgun_secondary_damage 25
 set g_balance_okshotgun_secondary_delay 0
 set g_balance_okshotgun_secondary_edgedamage 12.5
-set g_balance_okshotgun_secondary_force 300
+set g_balance_okshotgun_secondary_force 360
 set g_balance_okshotgun_secondary_force_zscale 1
 set g_balance_okshotgun_secondary_lifetime 5
 set g_balance_okshotgun_secondary_radius 70
index c5300f47bbd8df23ca6cf58a0914506240dc4ed4..74dd683c1d53be054daef7598fd9c2d60a2f42eb 100644 (file)
@@ -1,5 +1,6 @@
 // This config file is for overkill weapons that were nerfed to have the same
 // stats as vanilla weapons, secondary attack uses stats of vanilla blaster.
+// Secondary is actually inconsistent, see https://gitlab.com/xonotic/xonotic-data.pk3dir/issues/2258
 
 // {{{ Overkill Shotgun
 set g_balance_okshotgun_primary_ammo 1
index 1b8a388d42ea2b9890d008b161eaea4fb7547492..e32b54ff4b17e3851896ec7a40839484b1be136c 100644 (file)
@@ -401,6 +401,7 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 400
+set g_balance_devastator_remote_jump 0
 set g_balance_devastator_remote_jump_damage 40
 set g_balance_devastator_remote_jump_force 0
 set g_balance_devastator_remote_jump_radius 200
@@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1
 set g_balance_okhmg_primary_damage 30
 set g_balance_okhmg_primary_force 10
 set g_balance_okhmg_primary_refire 0.05
-set g_balance_okhmg_primary_solidpenetration 32
+set g_balance_okhmg_primary_solidpenetration 127
 set g_balance_okhmg_primary_spread_add 0.005
 set g_balance_okhmg_primary_spread_max 0.06
 set g_balance_okhmg_primary_spread_min 0.01
@@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2
 set g_balance_okhmg_secondary_damage 25
 set g_balance_okhmg_secondary_delay 0
 set g_balance_okhmg_secondary_edgedamage 12.5
-set g_balance_okhmg_secondary_force 300
+set g_balance_okhmg_secondary_force 360
 set g_balance_okhmg_secondary_force_zscale 1
 set g_balance_okhmg_secondary_lifetime 5
 set g_balance_okhmg_secondary_radius 70
@@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0
 // }}}
 // {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
 set g_balance_okmachinegun_primary_ammo 1
-set g_balance_okmachinegun_primary_damage 10
-set g_balance_okmachinegun_primary_force 3
+set g_balance_okmachinegun_primary_damage 25
+set g_balance_okmachinegun_primary_force 5
 set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 13.1
+set g_balance_okmachinegun_primary_solidpenetration 100
 set g_balance_okmachinegun_primary_spread_add 0.012
 set g_balance_okmachinegun_primary_spread_max 0.05
-set g_balance_okmachinegun_primary_spread_min 0.02
-set g_balance_okmachinegun_reload_ammo 60
-set g_balance_okmachinegun_reload_time 2
+set g_balance_okmachinegun_primary_spread_min 0
+set g_balance_okmachinegun_reload_ammo 30
+set g_balance_okmachinegun_reload_time 1.5
 set g_balance_okmachinegun_secondary_animtime 0.2
-set g_balance_okmachinegun_secondary_damage 20
+set g_balance_okmachinegun_secondary_damage 25
 set g_balance_okmachinegun_secondary_delay 0
-set g_balance_okmachinegun_secondary_edgedamage 10
-set g_balance_okmachinegun_secondary_force 300
+set g_balance_okmachinegun_secondary_edgedamage 12.5
+set g_balance_okmachinegun_secondary_force 360
 set g_balance_okmachinegun_secondary_force_zscale 1
 set g_balance_okmachinegun_secondary_lifetime 5
-set g_balance_okmachinegun_secondary_radius 60
+set g_balance_okmachinegun_secondary_radius 70
 set g_balance_okmachinegun_secondary_refire 0.7
-set g_balance_okmachinegun_secondary_refire_type 0
+set g_balance_okmachinegun_secondary_refire_type 1
 set g_balance_okmachinegun_secondary_shotangle 0
 set g_balance_okmachinegun_secondary_speed 6000
 set g_balance_okmachinegun_secondary_spread 0
@@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1
 set g_balance_okmachinegun_weaponthrowable 1
 // }}}
 // {{{ #23: Overkill Nex (MUTATOR WEAPON)
-set g_balance_oknex_charge 1
+set g_balance_oknex_charge 0
 set g_balance_oknex_charge_animlimit 0.5
 set g_balance_oknex_charge_limit 1
 set g_balance_oknex_charge_maxspeed 800
@@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0
 set g_balance_oknex_charge_shot_multiplier 0
 set g_balance_oknex_charge_start 0.5
 set g_balance_oknex_charge_velocity_rate 0
-set g_balance_oknex_primary_ammo 6
-set g_balance_oknex_primary_animtime 0.4
-set g_balance_oknex_primary_damage 80
+set g_balance_oknex_primary_ammo 10
+set g_balance_oknex_primary_animtime 0.65
+set g_balance_oknex_primary_damage 100
 set g_balance_oknex_primary_damagefalloff_forcehalflife 0
 set g_balance_oknex_primary_damagefalloff_halflife 0
 set g_balance_oknex_primary_damagefalloff_maxdist 0
 set g_balance_oknex_primary_damagefalloff_mindist 0
-set g_balance_oknex_primary_force 400
-set g_balance_oknex_primary_refire 1.5
-set g_balance_oknex_reload_ammo 0
+set g_balance_oknex_primary_force 500
+set g_balance_oknex_primary_refire 1
+set g_balance_oknex_reload_ammo 50
 set g_balance_oknex_reload_time 2
-set g_balance_oknex_secondary 0
-set g_balance_oknex_secondary_ammo 2
-set g_balance_oknex_secondary_animtime 0
+set g_balance_oknex_secondary 2
+set g_balance_oknex_secondary_ammo 0
+set g_balance_oknex_secondary_animtime 0.2
 set g_balance_oknex_secondary_chargepool 0
 set g_balance_oknex_secondary_chargepool_pause_regen 1
 set g_balance_oknex_secondary_chargepool_regen 0.15
-set g_balance_oknex_secondary_damage 0
+set g_balance_oknex_secondary_damage 25
 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0
 set g_balance_oknex_secondary_damagefalloff_halflife 0
 set g_balance_oknex_secondary_damagefalloff_maxdist 0
 set g_balance_oknex_secondary_damagefalloff_mindist 0
 set g_balance_oknex_secondary_delay 0
-set g_balance_oknex_secondary_edgedamage 10
-set g_balance_oknex_secondary_force 0
+set g_balance_oknex_secondary_edgedamage 12.5
+set g_balance_oknex_secondary_force 360
 set g_balance_oknex_secondary_force_zscale 1
 set g_balance_oknex_secondary_lifetime 5
-set g_balance_oknex_secondary_radius 60
-set g_balance_oknex_secondary_refire 0
-set g_balance_oknex_secondary_refire_type 0
+set g_balance_oknex_secondary_radius 70
+set g_balance_oknex_secondary_refire 0.7
+set g_balance_oknex_secondary_refire_type 1
 set g_balance_oknex_secondary_shotangle 0
 set g_balance_oknex_secondary_speed 6000
 set g_balance_oknex_secondary_spread 0
@@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2
 set g_balance_okrpc_secondary_damage 25
 set g_balance_okrpc_secondary_delay 0
 set g_balance_okrpc_secondary_edgedamage 12.5
-set g_balance_okrpc_secondary_force 300
+set g_balance_okrpc_secondary_force 360
 set g_balance_okrpc_secondary_force_zscale 1
 set g_balance_okrpc_secondary_lifetime 5
 set g_balance_okrpc_secondary_radius 70
@@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0
 set g_balance_okrpc_weaponthrowable 0
 // }}}
 // {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
-set g_balance_okshotgun_primary_ammo 1
-set g_balance_okshotgun_primary_animtime 0.2
+set g_balance_okshotgun_primary_ammo 3
+set g_balance_okshotgun_primary_animtime 0.65
 set g_balance_okshotgun_primary_bot_range 512
-set g_balance_okshotgun_primary_bullets 12
-set g_balance_okshotgun_primary_damage 4
-set g_balance_okshotgun_primary_force 15
+set g_balance_okshotgun_primary_bullets 10
+set g_balance_okshotgun_primary_damage 17
+set g_balance_okshotgun_primary_force 80
 set g_balance_okshotgun_primary_refire 0.75
 set g_balance_okshotgun_primary_solidpenetration 3.8
-set g_balance_okshotgun_primary_spread 0.12
-set g_balance_okshotgun_reload_ammo 0
+set g_balance_okshotgun_primary_spread 0.07
+set g_balance_okshotgun_reload_ammo 24
 set g_balance_okshotgun_reload_time 2
 set g_balance_okshotgun_secondary_animtime 0.2
-set g_balance_okshotgun_secondary_damage 20
+set g_balance_okshotgun_secondary_damage 25
 set g_balance_okshotgun_secondary_delay 0
-set g_balance_okshotgun_secondary_edgedamage 10
-set g_balance_okshotgun_secondary_force 300
+set g_balance_okshotgun_secondary_edgedamage 12.5
+set g_balance_okshotgun_secondary_force 360
 set g_balance_okshotgun_secondary_force_zscale 1
 set g_balance_okshotgun_secondary_lifetime 5
-set g_balance_okshotgun_secondary_radius 60
+set g_balance_okshotgun_secondary_radius 70
 set g_balance_okshotgun_secondary_refire 0.7
-set g_balance_okshotgun_secondary_refire_type 0
+set g_balance_okshotgun_secondary_refire_type 1
 set g_balance_okshotgun_secondary_shotangle 0
 set g_balance_okshotgun_secondary_speed 6000
 set g_balance_okshotgun_secondary_spread 0
diff --git a/bal-wep-testing.cfg b/bal-wep-testing.cfg
new file mode 100644 (file)
index 0000000..c1cb576
--- /dev/null
@@ -0,0 +1,970 @@
+// {{{ #1: Blaster
+set g_balance_blaster_primary_animtime 0.2
+set g_balance_blaster_primary_damage 20
+set g_balance_blaster_primary_delay 0
+set g_balance_blaster_primary_edgedamage 10
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
+set g_balance_blaster_primary_lifetime 5
+set g_balance_blaster_primary_radius 60
+set g_balance_blaster_primary_refire 0.7
+set g_balance_blaster_primary_shotangle 0
+set g_balance_blaster_primary_speed 6000
+set g_balance_blaster_primary_spread 0
+set g_balance_blaster_secondary 0
+set g_balance_blaster_secondary_animtime 0.2
+set g_balance_blaster_secondary_damage 25
+set g_balance_blaster_secondary_delay 0
+set g_balance_blaster_secondary_edgedamage 12.5
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
+set g_balance_blaster_secondary_lifetime 5
+set g_balance_blaster_secondary_radius 70
+set g_balance_blaster_secondary_refire 0.7
+set g_balance_blaster_secondary_shotangle 0
+set g_balance_blaster_secondary_speed 6000
+set g_balance_blaster_secondary_spread 0
+set g_balance_blaster_switchdelay_drop 0.2
+set g_balance_blaster_switchdelay_raise 0.2
+set g_balance_blaster_weaponreplace ""
+set g_balance_blaster_weaponstart 1
+set g_balance_blaster_weaponstartoverride -1
+set g_balance_blaster_weaponthrowable 0
+// }}}
+// {{{ #2: Shotgun
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_animtime 0.2
+set g_balance_shotgun_primary_bullets 12
+set g_balance_shotgun_primary_damage 4
+set g_balance_shotgun_primary_force 15
+set g_balance_shotgun_primary_refire 0.75
+set g_balance_shotgun_primary_solidpenetration 3.8
+set g_balance_shotgun_primary_spread 0.12
+set g_balance_shotgun_reload_ammo 0
+set g_balance_shotgun_reload_time 2
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_alt_animtime 0.2
+set g_balance_shotgun_secondary_alt_refire 1.2
+set g_balance_shotgun_secondary_animtime 1.15
+set g_balance_shotgun_secondary_damage 70
+set g_balance_shotgun_secondary_force 200
+set g_balance_shotgun_secondary_melee_delay 0.25
+set g_balance_shotgun_secondary_melee_multihit 1
+set g_balance_shotgun_secondary_melee_no_doubleslap 1
+set g_balance_shotgun_secondary_melee_nonplayerdamage 40
+set g_balance_shotgun_secondary_melee_range 120
+set g_balance_shotgun_secondary_melee_swing_side 120
+set g_balance_shotgun_secondary_melee_swing_up 30
+set g_balance_shotgun_secondary_melee_time 0.15
+set g_balance_shotgun_secondary_melee_traces 10
+set g_balance_shotgun_secondary_refire 1.25
+set g_balance_shotgun_switchdelay_drop 0.2
+set g_balance_shotgun_switchdelay_raise 0.2
+set g_balance_shotgun_weaponreplace ""
+set g_balance_shotgun_weaponstart 1
+set g_balance_shotgun_weaponstartoverride -1
+set g_balance_shotgun_weaponthrowable 1
+// }}}
+// {{{ #3: MachineGun
+set g_balance_machinegun_burst 3
+set g_balance_machinegun_burst_ammo 3
+set g_balance_machinegun_burst_animtime 0.3
+set g_balance_machinegun_burst_refire 0.06
+set g_balance_machinegun_burst_refire2 0.45
+set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_first 1
+set g_balance_machinegun_first_ammo 1
+set g_balance_machinegun_first_damage 14
+set g_balance_machinegun_first_force 3
+set g_balance_machinegun_first_refire 0.125
+set g_balance_machinegun_first_spread 0.03
+set g_balance_machinegun_mode 1
+set g_balance_machinegun_reload_ammo 60
+set g_balance_machinegun_reload_time 2
+set g_balance_machinegun_solidpenetration 63
+set g_balance_machinegun_spread_add 0.012
+set g_balance_machinegun_spread_max 0.05
+set g_balance_machinegun_spread_min 0.02
+set g_balance_machinegun_sustained_ammo 1
+set g_balance_machinegun_sustained_damage 10
+set g_balance_machinegun_sustained_force 3
+set g_balance_machinegun_sustained_refire 0.1
+set g_balance_machinegun_sustained_spread 0.03
+set g_balance_machinegun_switchdelay_drop 0.2
+set g_balance_machinegun_switchdelay_raise 0.2
+set g_balance_machinegun_weaponreplace ""
+set g_balance_machinegun_weaponstart 0
+set g_balance_machinegun_weaponstartoverride -1
+set g_balance_machinegun_weaponthrowable 1
+// }}}
+// {{{ #4: Mortar
+set g_balance_mortar_bouncefactor 0.5
+set g_balance_mortar_bouncestop 0.075
+set g_balance_mortar_primary_ammo 2
+set g_balance_mortar_primary_animtime 0.3
+set g_balance_mortar_primary_damage 55
+set g_balance_mortar_primary_damageforcescale 0
+set g_balance_mortar_primary_edgedamage 25
+set g_balance_mortar_primary_force 250
+set g_balance_mortar_primary_health 15
+set g_balance_mortar_primary_lifetime 5
+set g_balance_mortar_primary_lifetime_stick 0
+set g_balance_mortar_primary_radius 120
+set g_balance_mortar_primary_refire 0.8
+set g_balance_mortar_primary_remote_minbouncecnt 0
+set g_balance_mortar_primary_speed 1900
+set g_balance_mortar_primary_speed_up 225
+set g_balance_mortar_primary_speed_z 0
+set g_balance_mortar_primary_spread 0
+set g_balance_mortar_primary_type 0
+set g_balance_mortar_reload_ammo 0
+set g_balance_mortar_reload_time 2
+set g_balance_mortar_secondary_ammo 2
+set g_balance_mortar_secondary_animtime 0.3
+set g_balance_mortar_secondary_damage 55
+set g_balance_mortar_secondary_damageforcescale 4
+set g_balance_mortar_secondary_edgedamage 30
+set g_balance_mortar_secondary_force 250
+set g_balance_mortar_secondary_health 30
+set g_balance_mortar_secondary_lifetime 5
+set g_balance_mortar_secondary_lifetime_bounce 0.5
+set g_balance_mortar_secondary_lifetime_stick 0
+set g_balance_mortar_secondary_radius 120
+set g_balance_mortar_secondary_refire 0.7
+set g_balance_mortar_secondary_remote_detonateprimary 0
+set g_balance_mortar_secondary_speed 1400
+set g_balance_mortar_secondary_speed_up 150
+set g_balance_mortar_secondary_speed_z 0
+set g_balance_mortar_secondary_spread 0
+set g_balance_mortar_secondary_type 1
+set g_balance_mortar_switchdelay_drop 0.2
+set g_balance_mortar_switchdelay_raise 0.2
+set g_balance_mortar_weaponreplace ""
+set g_balance_mortar_weaponstart 0
+set g_balance_mortar_weaponstartoverride -1
+set g_balance_mortar_weaponthrowable 1
+// }}}
+// {{{ #5: Mine Layer (MUTATOR WEAPON)
+set g_balance_minelayer_ammo 4
+set g_balance_minelayer_animtime 0.4
+set g_balance_minelayer_damage 40
+set g_balance_minelayer_damageforcescale 0
+set g_balance_minelayer_detonatedelay -1
+set g_balance_minelayer_edgedamage 20
+set g_balance_minelayer_force 250
+set g_balance_minelayer_health 15
+set g_balance_minelayer_lifetime 10
+set g_balance_minelayer_lifetime_countdown 0.5
+set g_balance_minelayer_limit 3
+set g_balance_minelayer_protection 0
+set g_balance_minelayer_proximityradius 150
+set g_balance_minelayer_radius 175
+set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_reload_ammo 0
+set g_balance_minelayer_reload_time 2
+set g_balance_minelayer_remote_damage 45
+set g_balance_minelayer_remote_edgedamage 40
+set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_remote_radius 200
+set g_balance_minelayer_speed 1000
+set g_balance_minelayer_switchdelay_drop 0.2
+set g_balance_minelayer_switchdelay_raise 0.2
+set g_balance_minelayer_time 0.5
+set g_balance_minelayer_weaponreplace ""
+set g_balance_minelayer_weaponstart 0
+set g_balance_minelayer_weaponstartoverride -1
+set g_balance_minelayer_weaponthrowable 1
+// }}}
+// {{{ #6: Electro
+set g_balance_electro_combo_comboradius 300
+set g_balance_electro_combo_comboradius_thruwall 200
+set g_balance_electro_combo_damage 50
+set g_balance_electro_combo_edgedamage 25
+set g_balance_electro_combo_force 120
+set g_balance_electro_combo_radius 150
+set g_balance_electro_combo_safeammocheck 1
+set g_balance_electro_combo_speed 2000
+set g_balance_electro_primary_ammo 4
+set g_balance_electro_primary_animtime 0.3
+set g_balance_electro_primary_comboradius 300
+set g_balance_electro_primary_damage 40
+set g_balance_electro_primary_edgedamage 20
+set g_balance_electro_primary_force 200
+set g_balance_electro_primary_lifetime 5
+set g_balance_electro_primary_midaircombo_explode 1
+set g_balance_electro_primary_midaircombo_interval 0.1
+set g_balance_electro_primary_midaircombo_radius 0
+set g_balance_electro_primary_radius 100
+set g_balance_electro_primary_refire 0.6
+set g_balance_electro_primary_speed 2500
+set g_balance_electro_primary_spread 0
+set g_balance_electro_reload_ammo 0
+set g_balance_electro_reload_time 2
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_bouncefactor 0.3
+set g_balance_electro_secondary_bouncestop 0.05
+set g_balance_electro_secondary_count 3
+set g_balance_electro_secondary_damage 30
+set g_balance_electro_secondary_damagedbycontents 1
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_edgedamage 15
+set g_balance_electro_secondary_force 50
+set g_balance_electro_secondary_health 5
+set g_balance_electro_secondary_lifetime 4
+set g_balance_electro_secondary_radius 150
+set g_balance_electro_secondary_refire 0.2
+set g_balance_electro_secondary_refire2 1.6
+set g_balance_electro_secondary_speed 1000
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_speed_z 0
+set g_balance_electro_secondary_spread 0
+set g_balance_electro_secondary_stick 0
+set g_balance_electro_secondary_touchexplode 1
+set g_balance_electro_switchdelay_drop 0.2
+set g_balance_electro_switchdelay_raise 0.2
+set g_balance_electro_weaponreplace ""
+set g_balance_electro_weaponstart 0
+set g_balance_electro_weaponstartoverride -1
+set g_balance_electro_weaponthrowable 1
+// }}}
+// {{{ #7: Crylink
+set g_balance_crylink_primary_ammo 3
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_bounces 1
+set g_balance_crylink_primary_damage 10
+set g_balance_crylink_primary_edgedamage 5
+set g_balance_crylink_primary_force -50
+set g_balance_crylink_primary_joindelay 0.1
+set g_balance_crylink_primary_joinexplode 1
+set g_balance_crylink_primary_joinexplode_damage 0
+set g_balance_crylink_primary_joinexplode_edgedamage 0
+set g_balance_crylink_primary_joinexplode_force 0
+set g_balance_crylink_primary_joinexplode_radius 0
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_linkexplode 1
+set g_balance_crylink_primary_middle_fadetime 5
+set g_balance_crylink_primary_middle_lifetime 5
+set g_balance_crylink_primary_other_fadetime 5
+set g_balance_crylink_primary_other_lifetime 5
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_refire 0.7
+set g_balance_crylink_primary_shots 6
+set g_balance_crylink_primary_speed 2000
+set g_balance_crylink_primary_spread 0.08
+set g_balance_crylink_reload_ammo 0
+set g_balance_crylink_reload_time 2
+set g_balance_crylink_secondary 1
+set g_balance_crylink_secondary_ammo 3
+set g_balance_crylink_secondary_animtime 0.2
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_bounces 0
+set g_balance_crylink_secondary_damage 8
+set g_balance_crylink_secondary_edgedamage 4
+set g_balance_crylink_secondary_force -200
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_joinexplode 0
+set g_balance_crylink_secondary_joinexplode_damage 0
+set g_balance_crylink_secondary_joinexplode_edgedamage 0
+set g_balance_crylink_secondary_joinexplode_force 0
+set g_balance_crylink_secondary_joinexplode_radius 0
+set g_balance_crylink_secondary_joinspread 0
+set g_balance_crylink_secondary_linkexplode 0
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_middle_lifetime 5
+set g_balance_crylink_secondary_other_fadetime 2
+set g_balance_crylink_secondary_other_lifetime 2
+set g_balance_crylink_secondary_radius 100
+set g_balance_crylink_secondary_refire 0.7
+set g_balance_crylink_secondary_shots 5
+set g_balance_crylink_secondary_speed 4000
+set g_balance_crylink_secondary_spread 0.08
+set g_balance_crylink_secondary_spreadtype 0
+set g_balance_crylink_switchdelay_drop 0.2
+set g_balance_crylink_switchdelay_raise 0.2
+set g_balance_crylink_weaponreplace ""
+set g_balance_crylink_weaponstart 0
+set g_balance_crylink_weaponstartoverride -1
+set g_balance_crylink_weaponthrowable 1
+// }}}
+// {{{ #8: Vortex
+set g_balance_vortex_charge 0
+set g_balance_vortex_charge_always 0
+set g_balance_vortex_charge_animlimit 0.5
+set g_balance_vortex_charge_limit 1
+set g_balance_vortex_charge_maxspeed 800
+set g_balance_vortex_charge_mindmg 40
+set g_balance_vortex_charge_minspeed 400
+set g_balance_vortex_charge_rate 0.6
+set g_balance_vortex_charge_rot_pause 0
+set g_balance_vortex_charge_rot_rate 0
+set g_balance_vortex_charge_shot_multiplier 0
+set g_balance_vortex_charge_start 0.5
+set g_balance_vortex_charge_velocity_rate 0
+set g_balance_vortex_primary_ammo 6
+set g_balance_vortex_primary_animtime 0.4
+set g_balance_vortex_primary_armorpierce 0
+set g_balance_vortex_primary_damage 65
+set g_balance_vortex_primary_damagefalloff_forcehalflife 0
+set g_balance_vortex_primary_damagefalloff_halflife 0
+set g_balance_vortex_primary_damagefalloff_maxdist 0
+set g_balance_vortex_primary_damagefalloff_mindist 0
+set g_balance_vortex_primary_force 400
+set g_balance_vortex_primary_refire 1.5
+set g_balance_vortex_reload_ammo 0
+set g_balance_vortex_reload_time 2
+set g_balance_vortex_secondary 0
+set g_balance_vortex_secondary_ammo 2
+set g_balance_vortex_secondary_animtime 0
+set g_balance_vortex_secondary_armorpierce 0
+set g_balance_vortex_secondary_chargepool 0
+set g_balance_vortex_secondary_chargepool_pause_regen 1
+set g_balance_vortex_secondary_chargepool_regen 0.15
+set g_balance_vortex_secondary_damage 0
+set g_balance_vortex_secondary_damagefalloff_forcehalflife 0
+set g_balance_vortex_secondary_damagefalloff_halflife 0
+set g_balance_vortex_secondary_damagefalloff_maxdist 0
+set g_balance_vortex_secondary_damagefalloff_mindist 0
+set g_balance_vortex_secondary_force 0
+set g_balance_vortex_secondary_refire 0
+set g_balance_vortex_switchdelay_drop 0.2
+set g_balance_vortex_switchdelay_raise 0.2
+set g_balance_vortex_weaponreplace ""
+set g_balance_vortex_weaponstart 0
+set g_balance_vortex_weaponstartoverride -1
+set g_balance_vortex_weaponthrowable 1
+// }}}
+// {{{ #9: Hagar
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_primary_damage 25
+set g_balance_hagar_primary_damageforcescale 0
+set g_balance_hagar_primary_edgedamage 12.5
+set g_balance_hagar_primary_force 100
+set g_balance_hagar_primary_health 15
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_radius 65
+set g_balance_hagar_primary_refire 0.16667
+set g_balance_hagar_primary_speed 2200
+set g_balance_hagar_primary_spread 0
+set g_balance_hagar_reload_ammo 0
+set g_balance_hagar_reload_time 2
+set g_balance_hagar_secondary 1
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_secondary_damage 35
+set g_balance_hagar_secondary_damageforcescale 0
+set g_balance_hagar_secondary_edgedamage 17.5
+set g_balance_hagar_secondary_force 75
+set g_balance_hagar_secondary_health 15
+set g_balance_hagar_secondary_lifetime_min 10
+set g_balance_hagar_secondary_lifetime_rand 0
+set g_balance_hagar_secondary_load 1
+set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_load_animtime 0.2
+set g_balance_hagar_secondary_load_hold 4
+set g_balance_hagar_secondary_load_linkexplode 0
+set g_balance_hagar_secondary_load_max 4
+set g_balance_hagar_secondary_load_releasedeath 0
+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_radius 80
+set g_balance_hagar_secondary_refire 0.5
+set g_balance_hagar_secondary_speed 2000
+set g_balance_hagar_secondary_spread 0
+set g_balance_hagar_switchdelay_drop 0.2
+set g_balance_hagar_switchdelay_raise 0.2
+set g_balance_hagar_weaponreplace ""
+set g_balance_hagar_weaponstart 0
+set g_balance_hagar_weaponstartoverride -1
+set g_balance_hagar_weaponthrowable 1
+// }}}
+// {{{ #10: Devastator
+set g_balance_devastator_ammo 4
+set g_balance_devastator_animtime 0.4
+set g_balance_devastator_damage 80
+set g_balance_devastator_damageforcescale 1
+set g_balance_devastator_detonatedelay 0.02
+set g_balance_devastator_edgedamage 40
+set g_balance_devastator_force 400
+set g_balance_devastator_guidedelay 0.2
+set g_balance_devastator_guidegoal 512
+set g_balance_devastator_guiderate 90
+set g_balance_devastator_guideratedelay 0.01
+set g_balance_devastator_guidestop 0
+set g_balance_devastator_health 30
+set g_balance_devastator_lifetime 10
+set g_balance_devastator_radius 110
+set g_balance_devastator_refire 1.1
+set g_balance_devastator_reload_ammo 0
+set g_balance_devastator_reload_time 2
+set g_balance_devastator_remote_damage 70
+set g_balance_devastator_remote_edgedamage 35
+set g_balance_devastator_remote_force 300
+set g_balance_devastator_remote_jump 1
+set g_balance_devastator_remote_jump_damage 70
+set g_balance_devastator_remote_jump_force 450
+set g_balance_devastator_remote_jump_radius 100
+set g_balance_devastator_remote_jump_velocity_z_add 0
+set g_balance_devastator_remote_jump_velocity_z_max 1500
+set g_balance_devastator_remote_jump_velocity_z_min 400
+set g_balance_devastator_remote_radius 110
+set g_balance_devastator_speed 1300
+set g_balance_devastator_speedaccel 1300
+set g_balance_devastator_speedstart 1000
+set g_balance_devastator_switchdelay_drop 0.2
+set g_balance_devastator_switchdelay_raise 0.2
+set g_balance_devastator_weaponreplace ""
+set g_balance_devastator_weaponstart 0
+set g_balance_devastator_weaponstartoverride -1
+set g_balance_devastator_weaponthrowable 1
+// }}}
+// {{{ #11: Port-O-Launch
+set g_balance_porto_primary_animtime 0.3
+set g_balance_porto_primary_lifetime 5
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_speed 1000
+set g_balance_porto_secondary 1
+set g_balance_porto_secondary_animtime 0.3
+set g_balance_porto_secondary_lifetime 5
+set g_balance_porto_secondary_refire 1.5
+set g_balance_porto_secondary_speed 1000
+set g_balance_porto_switchdelay_drop 0.2
+set g_balance_porto_switchdelay_raise 0.2
+set g_balance_porto_weaponreplace ""
+set g_balance_porto_weaponstart 0
+set g_balance_porto_weaponstartoverride -1
+set g_balance_porto_weaponthrowable 1
+// }}}
+// {{{ #12: Vaporizer
+set g_balance_vaporizer_primary_ammo 10
+set g_balance_vaporizer_primary_animtime 0.3
+set g_balance_vaporizer_primary_damage 150
+set g_balance_vaporizer_primary_force 800
+set g_balance_vaporizer_primary_refire 1
+set g_balance_vaporizer_reload_ammo 0
+set g_balance_vaporizer_reload_time 0
+set g_balance_vaporizer_secondary_ammo 0
+set g_balance_vaporizer_secondary_animtime 0.2
+set g_balance_vaporizer_secondary_damage 25
+set g_balance_vaporizer_secondary_delay 0
+set g_balance_vaporizer_secondary_edgedamage 12.5
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
+set g_balance_vaporizer_secondary_lifetime 5
+set g_balance_vaporizer_secondary_radius 70
+set g_balance_vaporizer_secondary_refire 0.7
+set g_balance_vaporizer_secondary_shotangle 0
+set g_balance_vaporizer_secondary_speed 6000
+set g_balance_vaporizer_secondary_spread 0
+set g_balance_vaporizer_switchdelay_drop 0.2
+set g_balance_vaporizer_switchdelay_raise 0.2
+set g_balance_vaporizer_weaponreplace ""
+set g_balance_vaporizer_weaponstart 0
+set g_balance_vaporizer_weaponstartoverride -1
+set g_balance_vaporizer_weaponthrowable 1
+// }}}
+// {{{ #13: Grappling Hook
+set g_balance_hook_primary_ammo 5
+set g_balance_hook_primary_animtime 0.3
+set g_balance_hook_primary_hooked_ammo 5
+set g_balance_hook_primary_hooked_time_free 2
+set g_balance_hook_primary_hooked_time_max 0
+set g_balance_hook_primary_refire 0.2
+set g_balance_hook_secondary_animtime 0.3
+set g_balance_hook_secondary_damage 25
+set g_balance_hook_secondary_damageforcescale 0
+set g_balance_hook_secondary_duration 1.5
+set g_balance_hook_secondary_edgedamage 5
+set g_balance_hook_secondary_force -2000
+set g_balance_hook_secondary_gravity 5
+set g_balance_hook_secondary_health 15
+set g_balance_hook_secondary_lifetime 5
+set g_balance_hook_secondary_power 3
+set g_balance_hook_secondary_radius 500
+set g_balance_hook_secondary_refire 3
+set g_balance_hook_secondary_speed 0
+set g_balance_hook_switchdelay_drop 0.2
+set g_balance_hook_switchdelay_raise 0.2
+set g_balance_hook_weaponreplace ""
+set g_balance_hook_weaponstart 0
+set g_balance_hook_weaponstartoverride -1
+set g_balance_hook_weaponthrowable 1
+// }}}
+// {{{ #14: Heavy Laser Assault Cannon (MUTATOR WEAPON)
+set g_balance_hlac_primary_ammo 1
+set g_balance_hlac_primary_animtime 0.4
+set g_balance_hlac_primary_damage 18
+set g_balance_hlac_primary_edgedamage 9
+set g_balance_hlac_primary_force 90
+set g_balance_hlac_primary_lifetime 5
+set g_balance_hlac_primary_radius 70
+set g_balance_hlac_primary_refire 0.15
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_spread_add 0.0045
+set g_balance_hlac_primary_spread_crouchmod 0.25
+set g_balance_hlac_primary_spread_max 0.25
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_reload_ammo 0
+set g_balance_hlac_reload_time 2
+set g_balance_hlac_secondary 1
+set g_balance_hlac_secondary_ammo 10
+set g_balance_hlac_secondary_animtime 0.3
+set g_balance_hlac_secondary_damage 15
+set g_balance_hlac_secondary_edgedamage 7.5
+set g_balance_hlac_secondary_force 90
+set g_balance_hlac_secondary_lifetime 5
+set g_balance_hlac_secondary_radius 70
+set g_balance_hlac_secondary_refire 1
+set g_balance_hlac_secondary_shots 6
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+set g_balance_hlac_switchdelay_drop 0.2
+set g_balance_hlac_switchdelay_raise 0.2
+set g_balance_hlac_weaponreplace ""
+set g_balance_hlac_weaponstart 0
+set g_balance_hlac_weaponstartoverride -1
+set g_balance_hlac_weaponthrowable 1
+// }}}
+// {{{ #15: @!#%'n Tuba
+set g_balance_tuba_animtime 0.05
+set g_balance_tuba_attenuation 0.5
+set g_balance_tuba_damage 5
+set g_balance_tuba_edgedamage 0
+set g_balance_tuba_fadetime 0.25
+set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
+set g_balance_tuba_radius 200
+set g_balance_tuba_refire 0.05
+set g_balance_tuba_switchdelay_drop 0.2
+set g_balance_tuba_switchdelay_raise 0.2
+set g_balance_tuba_volume 1
+set g_balance_tuba_weaponreplace ""
+set g_balance_tuba_weaponstart 0
+set g_balance_tuba_weaponstartoverride -1
+set g_balance_tuba_weaponthrowable 1
+// }}}
+// {{{ #16: Rifle (MUTATOR WEAPON)
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_animtime 0.4
+set g_balance_rifle_primary_bullethail 0
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_damage 80
+set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_refire 1.2
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_solidpenetration 62.2
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_reload_ammo 80
+set g_balance_rifle_reload_time 2
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_animtime 0.3
+set g_balance_rifle_secondary_bullethail 0
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_damage 20
+set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_refire 0.9
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_shots 4
+set g_balance_rifle_secondary_solidpenetration 15.5
+set g_balance_rifle_secondary_spread 0.04
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_switchdelay_drop 0.2
+set g_balance_rifle_switchdelay_raise 0.2
+set g_balance_rifle_weaponreplace ""
+set g_balance_rifle_weaponstart 0
+set g_balance_rifle_weaponstartoverride -1
+set g_balance_rifle_weaponthrowable 1
+// }}}
+// {{{ #17: Fireball
+set g_balance_fireball_primary_animtime 0.4
+set g_balance_fireball_primary_bfgdamage 100
+set g_balance_fireball_primary_bfgforce 0
+set g_balance_fireball_primary_bfgradius 1000
+set g_balance_fireball_primary_damage 200
+set g_balance_fireball_primary_damageforcescale 0
+set g_balance_fireball_primary_edgedamage 50
+set g_balance_fireball_primary_force 600
+set g_balance_fireball_primary_health 0
+set g_balance_fireball_primary_laserburntime 0.5
+set g_balance_fireball_primary_laserdamage 80
+set g_balance_fireball_primary_laseredgedamage 20
+set g_balance_fireball_primary_laserradius 256
+set g_balance_fireball_primary_lifetime 15
+set g_balance_fireball_primary_radius 200
+set g_balance_fireball_primary_refire 2
+set g_balance_fireball_primary_refire2 0
+set g_balance_fireball_primary_speed 1200
+set g_balance_fireball_primary_spread 0
+set g_balance_fireball_secondary_animtime 0.3
+set g_balance_fireball_secondary_damage 40
+set g_balance_fireball_secondary_damageforcescale 4
+set g_balance_fireball_secondary_damagetime 5
+set g_balance_fireball_secondary_laserburntime 0.5
+set g_balance_fireball_secondary_laserdamage 50
+set g_balance_fireball_secondary_laseredgedamage 20
+set g_balance_fireball_secondary_laserradius 110
+set g_balance_fireball_secondary_lifetime 7
+set g_balance_fireball_secondary_refire 1.5
+set g_balance_fireball_secondary_speed 900
+set g_balance_fireball_secondary_speed_up 100
+set g_balance_fireball_secondary_speed_z 0
+set g_balance_fireball_secondary_spread 0
+set g_balance_fireball_switchdelay_drop 0.2
+set g_balance_fireball_switchdelay_raise 0.2
+set g_balance_fireball_weaponreplace ""
+set g_balance_fireball_weaponstart 0
+set g_balance_fireball_weaponstartoverride -1
+set g_balance_fireball_weaponthrowable 0
+// }}}
+// {{{ #18: T.A.G. Seeker (MUTATOR WEAPON)
+set g_balance_seeker_flac_ammo 1
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1400
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.2
+set g_balance_seeker_missile_count 3
+set g_balance_seeker_missile_damage 30
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 1400
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 150
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+set g_balance_seeker_missile_smart 1
+set g_balance_seeker_missile_smart_mindist 800
+set g_balance_seeker_missile_smart_trace_max 2500
+set g_balance_seeker_missile_smart_trace_min 1000
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_max 1300
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_reload_ammo 0
+set g_balance_seeker_reload_time 2
+set g_balance_seeker_switchdelay_drop 0.2
+set g_balance_seeker_switchdelay_raise 0.2
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.2
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.75
+set g_balance_seeker_tag_speed 5000
+set g_balance_seeker_tag_spread 0
+set g_balance_seeker_tag_tracker_lifetime 10
+set g_balance_seeker_type 0
+set g_balance_seeker_weaponreplace ""
+set g_balance_seeker_weaponstart 0
+set g_balance_seeker_weaponstartoverride -1
+set g_balance_seeker_weaponthrowable 1
+// }}}
+// {{{ #19: Shockwave
+set g_balance_shockwave_blast_animtime 0.3
+set g_balance_shockwave_blast_damage 40
+set g_balance_shockwave_blast_distance 1000
+set g_balance_shockwave_blast_edgedamage 0
+set g_balance_shockwave_blast_force 15
+set g_balance_shockwave_blast_force_forwardbias 50
+set g_balance_shockwave_blast_force_zscale 1
+set g_balance_shockwave_blast_jump_damage 20
+set g_balance_shockwave_blast_jump_edgedamage 0
+set g_balance_shockwave_blast_jump_force 100
+set g_balance_shockwave_blast_jump_force_velocitybias 1
+set g_balance_shockwave_blast_jump_force_zscale 1
+set g_balance_shockwave_blast_jump_multiplier_accuracy 0.5
+set g_balance_shockwave_blast_jump_multiplier_distance 0.5
+set g_balance_shockwave_blast_jump_multiplier_min 0
+set g_balance_shockwave_blast_jump_radius 150
+set g_balance_shockwave_blast_multiplier_accuracy 0.45
+set g_balance_shockwave_blast_multiplier_distance 0.2
+set g_balance_shockwave_blast_multiplier_min 0
+set g_balance_shockwave_blast_refire 0.75
+set g_balance_shockwave_blast_splash_damage 15
+set g_balance_shockwave_blast_splash_edgedamage 0
+set g_balance_shockwave_blast_splash_force 100
+set g_balance_shockwave_blast_splash_force_forwardbias 50
+set g_balance_shockwave_blast_splash_multiplier_accuracy 0.5
+set g_balance_shockwave_blast_splash_multiplier_distance 0.5
+set g_balance_shockwave_blast_splash_multiplier_min 0
+set g_balance_shockwave_blast_splash_radius 70
+set g_balance_shockwave_blast_spread_max 120
+set g_balance_shockwave_blast_spread_min 25
+set g_balance_shockwave_melee_animtime 1.3
+set g_balance_shockwave_melee_damage 80
+set g_balance_shockwave_melee_delay 0.25
+set g_balance_shockwave_melee_force 200
+set g_balance_shockwave_melee_multihit 1
+set g_balance_shockwave_melee_no_doubleslap 1
+set g_balance_shockwave_melee_nonplayerdamage 40
+set g_balance_shockwave_melee_range 120
+set g_balance_shockwave_melee_refire 1.25
+set g_balance_shockwave_melee_swing_side 120
+set g_balance_shockwave_melee_swing_up 30
+set g_balance_shockwave_melee_time 0.15
+set g_balance_shockwave_melee_traces 10
+set g_balance_shockwave_switchdelay_drop 0.2
+set g_balance_shockwave_switchdelay_raise 0.2
+set g_balance_shockwave_weaponreplace ""
+set g_balance_shockwave_weaponstart 0
+set g_balance_shockwave_weaponstartoverride -1
+set g_balance_shockwave_weaponthrowable 0
+// }}}
+// {{{ #20: Arc
+set g_balance_arc_beam_ammo 6
+set g_balance_arc_beam_animtime 0.1
+set g_balance_arc_beam_botaimlifetime 0
+set g_balance_arc_beam_botaimspeed 0
+set g_balance_arc_beam_damage 100
+set g_balance_arc_beam_degreespersegment 1
+set g_balance_arc_beam_distancepersegment 0
+set g_balance_arc_beam_falloff_halflifedist 0
+set g_balance_arc_beam_falloff_maxdist 0
+set g_balance_arc_beam_falloff_mindist 0
+set g_balance_arc_beam_force 600
+set g_balance_arc_beam_healing_amax 0
+set g_balance_arc_beam_healing_aps 50
+set g_balance_arc_beam_healing_hmax 150
+set g_balance_arc_beam_healing_hps 50
+set g_balance_arc_beam_heat 0
+set g_balance_arc_beam_maxangle 10
+set g_balance_arc_beam_nonplayerdamage 80
+set g_balance_arc_beam_range 1500
+set g_balance_arc_beam_refire 0.25
+set g_balance_arc_beam_returnspeed 8
+set g_balance_arc_beam_tightness 0.6
+set g_balance_arc_bolt 1
+set g_balance_arc_bolt_ammo 1
+set g_balance_arc_bolt_damage 25
+set g_balance_arc_bolt_damageforcescale 0
+set g_balance_arc_bolt_edgedamage 12.5
+set g_balance_arc_bolt_force 120
+set g_balance_arc_bolt_health 15
+set g_balance_arc_bolt_lifetime 5
+set g_balance_arc_bolt_radius 65
+set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_speed 2300
+set g_balance_arc_bolt_spread 0
+set g_balance_arc_burst_ammo 15
+set g_balance_arc_burst_damage 250
+set g_balance_arc_burst_healing_aps 100
+set g_balance_arc_burst_healing_hps 100
+set g_balance_arc_burst_heat 5
+set g_balance_arc_cooldown 2.5
+set g_balance_arc_cooldown_release 0
+set g_balance_arc_overheat_max 5
+set g_balance_arc_overheat_min 3
+set g_balance_arc_switchdelay_drop 0.2
+set g_balance_arc_switchdelay_raise 0.2
+set g_balance_arc_weaponreplace ""
+set g_balance_arc_weaponstart 0
+set g_balance_arc_weaponstartoverride -1
+set g_balance_arc_weaponthrowable 1
+// }}}
+// {{{ #21: Overkill Heavy Machine Gun (MUTATOR WEAPON)
+set g_balance_okhmg_primary_ammo 1
+set g_balance_okhmg_primary_damage 30
+set g_balance_okhmg_primary_force 10
+set g_balance_okhmg_primary_refire 0.05
+set g_balance_okhmg_primary_solidpenetration 127
+set g_balance_okhmg_primary_spread_add 0.005
+set g_balance_okhmg_primary_spread_max 0.06
+set g_balance_okhmg_primary_spread_min 0.01
+set g_balance_okhmg_reload_ammo 120
+set g_balance_okhmg_reload_time 1
+set g_balance_okhmg_secondary_ammo 0
+set g_balance_okhmg_secondary_animtime 0.2
+set g_balance_okhmg_secondary_damage 25
+set g_balance_okhmg_secondary_delay 0
+set g_balance_okhmg_secondary_edgedamage 12.5
+set g_balance_okhmg_secondary_force 360
+set g_balance_okhmg_secondary_force_zscale 1
+set g_balance_okhmg_secondary_lifetime 5
+set g_balance_okhmg_secondary_radius 70
+set g_balance_okhmg_secondary_refire 0.7
+set g_balance_okhmg_secondary_refire_type 1
+set g_balance_okhmg_secondary_shotangle 0
+set g_balance_okhmg_secondary_speed 6000
+set g_balance_okhmg_secondary_spread 0
+set g_balance_okhmg_switchdelay_drop 0.2
+set g_balance_okhmg_switchdelay_raise 0.2
+set g_balance_okhmg_weaponreplace ""
+set g_balance_okhmg_weaponstart 0
+set g_balance_okhmg_weaponstartoverride 0
+set g_balance_okhmg_weaponthrowable 0
+// }}}
+// {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
+set g_balance_okmachinegun_primary_ammo 1
+set g_balance_okmachinegun_primary_damage 25
+set g_balance_okmachinegun_primary_force 5
+set g_balance_okmachinegun_primary_refire 0.1
+set g_balance_okmachinegun_primary_solidpenetration 100
+set g_balance_okmachinegun_primary_spread_add 0.012
+set g_balance_okmachinegun_primary_spread_max 0.05
+set g_balance_okmachinegun_primary_spread_min 0
+set g_balance_okmachinegun_reload_ammo 30
+set g_balance_okmachinegun_reload_time 1.5
+set g_balance_okmachinegun_secondary_animtime 0.2
+set g_balance_okmachinegun_secondary_damage 25
+set g_balance_okmachinegun_secondary_delay 0
+set g_balance_okmachinegun_secondary_edgedamage 12.5
+set g_balance_okmachinegun_secondary_force 360
+set g_balance_okmachinegun_secondary_force_zscale 1
+set g_balance_okmachinegun_secondary_lifetime 5
+set g_balance_okmachinegun_secondary_radius 70
+set g_balance_okmachinegun_secondary_refire 0.7
+set g_balance_okmachinegun_secondary_refire_type 1
+set g_balance_okmachinegun_secondary_shotangle 0
+set g_balance_okmachinegun_secondary_speed 6000
+set g_balance_okmachinegun_secondary_spread 0
+set g_balance_okmachinegun_switchdelay_drop 0.2
+set g_balance_okmachinegun_switchdelay_raise 0.2
+set g_balance_okmachinegun_weaponreplace ""
+set g_balance_okmachinegun_weaponstart 0
+set g_balance_okmachinegun_weaponstartoverride -1
+set g_balance_okmachinegun_weaponthrowable 1
+// }}}
+// {{{ #23: Overkill Nex (MUTATOR WEAPON)
+set g_balance_oknex_charge 0
+set g_balance_oknex_charge_animlimit 0.5
+set g_balance_oknex_charge_limit 1
+set g_balance_oknex_charge_maxspeed 800
+set g_balance_oknex_charge_mindmg 40
+set g_balance_oknex_charge_minspeed 400
+set g_balance_oknex_charge_rate 0.6
+set g_balance_oknex_charge_rot_pause 0
+set g_balance_oknex_charge_rot_rate 0
+set g_balance_oknex_charge_shot_multiplier 0
+set g_balance_oknex_charge_start 0.5
+set g_balance_oknex_charge_velocity_rate 0
+set g_balance_oknex_primary_ammo 10
+set g_balance_oknex_primary_animtime 0.65
+set g_balance_oknex_primary_damage 100
+set g_balance_oknex_primary_damagefalloff_forcehalflife 0
+set g_balance_oknex_primary_damagefalloff_halflife 0
+set g_balance_oknex_primary_damagefalloff_maxdist 0
+set g_balance_oknex_primary_damagefalloff_mindist 0
+set g_balance_oknex_primary_force 500
+set g_balance_oknex_primary_refire 1
+set g_balance_oknex_reload_ammo 50
+set g_balance_oknex_reload_time 2
+set g_balance_oknex_secondary 2
+set g_balance_oknex_secondary_ammo 0
+set g_balance_oknex_secondary_animtime 0.2
+set g_balance_oknex_secondary_chargepool 0
+set g_balance_oknex_secondary_chargepool_pause_regen 1
+set g_balance_oknex_secondary_chargepool_regen 0.15
+set g_balance_oknex_secondary_damage 25
+set g_balance_oknex_secondary_damagefalloff_forcehalflife 0
+set g_balance_oknex_secondary_damagefalloff_halflife 0
+set g_balance_oknex_secondary_damagefalloff_maxdist 0
+set g_balance_oknex_secondary_damagefalloff_mindist 0
+set g_balance_oknex_secondary_delay 0
+set g_balance_oknex_secondary_edgedamage 12.5
+set g_balance_oknex_secondary_force 360
+set g_balance_oknex_secondary_force_zscale 1
+set g_balance_oknex_secondary_lifetime 5
+set g_balance_oknex_secondary_radius 70
+set g_balance_oknex_secondary_refire 0.7
+set g_balance_oknex_secondary_refire_type 1
+set g_balance_oknex_secondary_shotangle 0
+set g_balance_oknex_secondary_speed 6000
+set g_balance_oknex_secondary_spread 0
+set g_balance_oknex_switchdelay_drop 0.2
+set g_balance_oknex_switchdelay_raise 0.2
+set g_balance_oknex_weaponreplace ""
+set g_balance_oknex_weaponstart 0
+set g_balance_oknex_weaponstartoverride -1
+set g_balance_oknex_weaponthrowable 1
+// }}}
+// {{{ #24: Overkill Rocket Propelled Chainsaw (MUTATOR WEAPON)
+set g_balance_okrpc_primary_ammo 10
+set g_balance_okrpc_primary_animtime 1
+set g_balance_okrpc_primary_damage 150
+set g_balance_okrpc_primary_damage2 500
+set g_balance_okrpc_primary_damageforcescale 2
+set g_balance_okrpc_primary_edgedamage 50
+set g_balance_okrpc_primary_force 400
+set g_balance_okrpc_primary_health 25
+set g_balance_okrpc_primary_lifetime 30
+set g_balance_okrpc_primary_radius 300
+set g_balance_okrpc_primary_refire 1
+set g_balance_okrpc_primary_speed 2500
+set g_balance_okrpc_primary_speedaccel 5000
+set g_balance_okrpc_reload_ammo 10
+set g_balance_okrpc_reload_time 1
+set g_balance_okrpc_secondary_ammo 0
+set g_balance_okrpc_secondary_animtime 0.2
+set g_balance_okrpc_secondary_damage 25
+set g_balance_okrpc_secondary_delay 0
+set g_balance_okrpc_secondary_edgedamage 12.5
+set g_balance_okrpc_secondary_force 360
+set g_balance_okrpc_secondary_force_zscale 1
+set g_balance_okrpc_secondary_lifetime 5
+set g_balance_okrpc_secondary_radius 70
+set g_balance_okrpc_secondary_refire 0.7
+set g_balance_okrpc_secondary_refire_type 1
+set g_balance_okrpc_secondary_shotangle 0
+set g_balance_okrpc_secondary_speed 6000
+set g_balance_okrpc_secondary_spread 0
+set g_balance_okrpc_switchdelay_drop 0.2
+set g_balance_okrpc_switchdelay_raise 0.2
+set g_balance_okrpc_weaponreplace ""
+set g_balance_okrpc_weaponstart 0
+set g_balance_okrpc_weaponstartoverride 0
+set g_balance_okrpc_weaponthrowable 0
+// }}}
+// {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
+set g_balance_okshotgun_primary_ammo 3
+set g_balance_okshotgun_primary_animtime 0.65
+set g_balance_okshotgun_primary_bot_range 512
+set g_balance_okshotgun_primary_bullets 10
+set g_balance_okshotgun_primary_damage 17
+set g_balance_okshotgun_primary_force 80
+set g_balance_okshotgun_primary_refire 0.75
+set g_balance_okshotgun_primary_solidpenetration 3.8
+set g_balance_okshotgun_primary_spread 0.07
+set g_balance_okshotgun_reload_ammo 24
+set g_balance_okshotgun_reload_time 2
+set g_balance_okshotgun_secondary_animtime 0.2
+set g_balance_okshotgun_secondary_damage 25
+set g_balance_okshotgun_secondary_delay 0
+set g_balance_okshotgun_secondary_edgedamage 12.5
+set g_balance_okshotgun_secondary_force 360
+set g_balance_okshotgun_secondary_force_zscale 1
+set g_balance_okshotgun_secondary_lifetime 5
+set g_balance_okshotgun_secondary_radius 70
+set g_balance_okshotgun_secondary_refire 0.7
+set g_balance_okshotgun_secondary_refire_type 1
+set g_balance_okshotgun_secondary_shotangle 0
+set g_balance_okshotgun_secondary_speed 6000
+set g_balance_okshotgun_secondary_spread 0
+set g_balance_okshotgun_switchdelay_drop 0.2
+set g_balance_okshotgun_switchdelay_raise 0.2
+set g_balance_okshotgun_weaponreplace ""
+set g_balance_okshotgun_weaponstart 0
+set g_balance_okshotgun_weaponstartoverride -1
+set g_balance_okshotgun_weaponthrowable 1
+// }}}
diff --git a/bal-wep-testingxpm.cfg b/bal-wep-testingxpm.cfg
new file mode 100644 (file)
index 0000000..3bfe7a7
--- /dev/null
@@ -0,0 +1,970 @@
+// {{{ #1: Blaster
+set g_balance_blaster_primary_animtime 0.2
+set g_balance_blaster_primary_damage 20
+set g_balance_blaster_primary_delay 0
+set g_balance_blaster_primary_edgedamage 10
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
+set g_balance_blaster_primary_lifetime 5
+set g_balance_blaster_primary_radius 60
+set g_balance_blaster_primary_refire 0.7
+set g_balance_blaster_primary_shotangle 0
+set g_balance_blaster_primary_speed 6000
+set g_balance_blaster_primary_spread 0
+set g_balance_blaster_secondary 0
+set g_balance_blaster_secondary_animtime 0.2
+set g_balance_blaster_secondary_damage 25
+set g_balance_blaster_secondary_delay 0
+set g_balance_blaster_secondary_edgedamage 12.5
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
+set g_balance_blaster_secondary_lifetime 5
+set g_balance_blaster_secondary_radius 70
+set g_balance_blaster_secondary_refire 0.7
+set g_balance_blaster_secondary_shotangle 0
+set g_balance_blaster_secondary_speed 6000
+set g_balance_blaster_secondary_spread 0
+set g_balance_blaster_switchdelay_drop 0.2
+set g_balance_blaster_switchdelay_raise 0.2
+set g_balance_blaster_weaponreplace ""
+set g_balance_blaster_weaponstart 1
+set g_balance_blaster_weaponstartoverride -1
+set g_balance_blaster_weaponthrowable 0
+// }}}
+// {{{ #2: Shotgun
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_animtime 0.2
+set g_balance_shotgun_primary_bullets 12
+set g_balance_shotgun_primary_damage 4
+set g_balance_shotgun_primary_force 15
+set g_balance_shotgun_primary_refire 0.75
+set g_balance_shotgun_primary_solidpenetration 3.8
+set g_balance_shotgun_primary_spread 0.12
+set g_balance_shotgun_reload_ammo 0
+set g_balance_shotgun_reload_time 2
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_alt_animtime 0.2
+set g_balance_shotgun_secondary_alt_refire 1.2
+set g_balance_shotgun_secondary_animtime 1.15
+set g_balance_shotgun_secondary_damage 70
+set g_balance_shotgun_secondary_force 200
+set g_balance_shotgun_secondary_melee_delay 0.25
+set g_balance_shotgun_secondary_melee_multihit 1
+set g_balance_shotgun_secondary_melee_no_doubleslap 1
+set g_balance_shotgun_secondary_melee_nonplayerdamage 40
+set g_balance_shotgun_secondary_melee_range 120
+set g_balance_shotgun_secondary_melee_swing_side 120
+set g_balance_shotgun_secondary_melee_swing_up 30
+set g_balance_shotgun_secondary_melee_time 0.15
+set g_balance_shotgun_secondary_melee_traces 10
+set g_balance_shotgun_secondary_refire 1.25
+set g_balance_shotgun_switchdelay_drop 0.2
+set g_balance_shotgun_switchdelay_raise 0.2
+set g_balance_shotgun_weaponreplace ""
+set g_balance_shotgun_weaponstart 1
+set g_balance_shotgun_weaponstartoverride -1
+set g_balance_shotgun_weaponthrowable 1
+// }}}
+// {{{ #3: MachineGun
+set g_balance_machinegun_burst 3
+set g_balance_machinegun_burst_ammo 3
+set g_balance_machinegun_burst_animtime 0.3
+set g_balance_machinegun_burst_refire 0.06
+set g_balance_machinegun_burst_refire2 0.45
+set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_first 1
+set g_balance_machinegun_first_ammo 1
+set g_balance_machinegun_first_damage 14
+set g_balance_machinegun_first_force 3
+set g_balance_machinegun_first_refire 0.125
+set g_balance_machinegun_first_spread 0.03
+set g_balance_machinegun_mode 1
+set g_balance_machinegun_reload_ammo 60
+set g_balance_machinegun_reload_time 2
+set g_balance_machinegun_solidpenetration 63
+set g_balance_machinegun_spread_add 0.012
+set g_balance_machinegun_spread_max 0.05
+set g_balance_machinegun_spread_min 0.02
+set g_balance_machinegun_sustained_ammo 1
+set g_balance_machinegun_sustained_damage 10
+set g_balance_machinegun_sustained_force 3
+set g_balance_machinegun_sustained_refire 0.1
+set g_balance_machinegun_sustained_spread 0.03
+set g_balance_machinegun_switchdelay_drop 0.2
+set g_balance_machinegun_switchdelay_raise 0.2
+set g_balance_machinegun_weaponreplace ""
+set g_balance_machinegun_weaponstart 0
+set g_balance_machinegun_weaponstartoverride -1
+set g_balance_machinegun_weaponthrowable 1
+// }}}
+// {{{ #4: Mortar
+set g_balance_mortar_bouncefactor 0.5
+set g_balance_mortar_bouncestop 0.075
+set g_balance_mortar_primary_ammo 2
+set g_balance_mortar_primary_animtime 0.3
+set g_balance_mortar_primary_damage 55
+set g_balance_mortar_primary_damageforcescale 0
+set g_balance_mortar_primary_edgedamage 25
+set g_balance_mortar_primary_force 250
+set g_balance_mortar_primary_health 15
+set g_balance_mortar_primary_lifetime 5
+set g_balance_mortar_primary_lifetime_stick 0
+set g_balance_mortar_primary_radius 120
+set g_balance_mortar_primary_refire 0.8
+set g_balance_mortar_primary_remote_minbouncecnt 0
+set g_balance_mortar_primary_speed 1900
+set g_balance_mortar_primary_speed_up 225
+set g_balance_mortar_primary_speed_z 0
+set g_balance_mortar_primary_spread 0
+set g_balance_mortar_primary_type 0
+set g_balance_mortar_reload_ammo 0
+set g_balance_mortar_reload_time 2
+set g_balance_mortar_secondary_ammo 2
+set g_balance_mortar_secondary_animtime 0.3
+set g_balance_mortar_secondary_damage 55
+set g_balance_mortar_secondary_damageforcescale 4
+set g_balance_mortar_secondary_edgedamage 30
+set g_balance_mortar_secondary_force 250
+set g_balance_mortar_secondary_health 30
+set g_balance_mortar_secondary_lifetime 5
+set g_balance_mortar_secondary_lifetime_bounce 0.5
+set g_balance_mortar_secondary_lifetime_stick 0
+set g_balance_mortar_secondary_radius 120
+set g_balance_mortar_secondary_refire 0.7
+set g_balance_mortar_secondary_remote_detonateprimary 0
+set g_balance_mortar_secondary_speed 1400
+set g_balance_mortar_secondary_speed_up 150
+set g_balance_mortar_secondary_speed_z 0
+set g_balance_mortar_secondary_spread 0
+set g_balance_mortar_secondary_type 1
+set g_balance_mortar_switchdelay_drop 0.2
+set g_balance_mortar_switchdelay_raise 0.2
+set g_balance_mortar_weaponreplace ""
+set g_balance_mortar_weaponstart 0
+set g_balance_mortar_weaponstartoverride -1
+set g_balance_mortar_weaponthrowable 1
+// }}}
+// {{{ #5: Mine Layer (MUTATOR WEAPON)
+set g_balance_minelayer_ammo 4
+set g_balance_minelayer_animtime 0.4
+set g_balance_minelayer_damage 40
+set g_balance_minelayer_damageforcescale 0
+set g_balance_minelayer_detonatedelay -1
+set g_balance_minelayer_edgedamage 20
+set g_balance_minelayer_force 250
+set g_balance_minelayer_health 15
+set g_balance_minelayer_lifetime 10
+set g_balance_minelayer_lifetime_countdown 0.5
+set g_balance_minelayer_limit 3
+set g_balance_minelayer_protection 0
+set g_balance_minelayer_proximityradius 150
+set g_balance_minelayer_radius 175
+set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_reload_ammo 0
+set g_balance_minelayer_reload_time 2
+set g_balance_minelayer_remote_damage 45
+set g_balance_minelayer_remote_edgedamage 40
+set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_remote_radius 200
+set g_balance_minelayer_speed 1000
+set g_balance_minelayer_switchdelay_drop 0.2
+set g_balance_minelayer_switchdelay_raise 0.2
+set g_balance_minelayer_time 0.5
+set g_balance_minelayer_weaponreplace ""
+set g_balance_minelayer_weaponstart 0
+set g_balance_minelayer_weaponstartoverride -1
+set g_balance_minelayer_weaponthrowable 1
+// }}}
+// {{{ #6: Electro
+set g_balance_electro_combo_comboradius 300
+set g_balance_electro_combo_comboradius_thruwall 200
+set g_balance_electro_combo_damage 50
+set g_balance_electro_combo_edgedamage 25
+set g_balance_electro_combo_force 120
+set g_balance_electro_combo_radius 150
+set g_balance_electro_combo_safeammocheck 1
+set g_balance_electro_combo_speed 2000
+set g_balance_electro_primary_ammo 4
+set g_balance_electro_primary_animtime 0.3
+set g_balance_electro_primary_comboradius 300
+set g_balance_electro_primary_damage 40
+set g_balance_electro_primary_edgedamage 20
+set g_balance_electro_primary_force 200
+set g_balance_electro_primary_lifetime 5
+set g_balance_electro_primary_midaircombo_explode 1
+set g_balance_electro_primary_midaircombo_interval 0.1
+set g_balance_electro_primary_midaircombo_radius 0
+set g_balance_electro_primary_radius 100
+set g_balance_electro_primary_refire 0.6
+set g_balance_electro_primary_speed 2500
+set g_balance_electro_primary_spread 0
+set g_balance_electro_reload_ammo 0
+set g_balance_electro_reload_time 2
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_bouncefactor 0.3
+set g_balance_electro_secondary_bouncestop 0.05
+set g_balance_electro_secondary_count 3
+set g_balance_electro_secondary_damage 30
+set g_balance_electro_secondary_damagedbycontents 1
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_edgedamage 15
+set g_balance_electro_secondary_force 50
+set g_balance_electro_secondary_health 5
+set g_balance_electro_secondary_lifetime 4
+set g_balance_electro_secondary_radius 150
+set g_balance_electro_secondary_refire 0.2
+set g_balance_electro_secondary_refire2 1.6
+set g_balance_electro_secondary_speed 1000
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_speed_z 0
+set g_balance_electro_secondary_spread 0
+set g_balance_electro_secondary_stick 0
+set g_balance_electro_secondary_touchexplode 1
+set g_balance_electro_switchdelay_drop 0.2
+set g_balance_electro_switchdelay_raise 0.2
+set g_balance_electro_weaponreplace ""
+set g_balance_electro_weaponstart 0
+set g_balance_electro_weaponstartoverride -1
+set g_balance_electro_weaponthrowable 1
+// }}}
+// {{{ #7: Crylink
+set g_balance_crylink_primary_ammo 3
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_bounces 1
+set g_balance_crylink_primary_damage 10
+set g_balance_crylink_primary_edgedamage 5
+set g_balance_crylink_primary_force -50
+set g_balance_crylink_primary_joindelay 0.1
+set g_balance_crylink_primary_joinexplode 1
+set g_balance_crylink_primary_joinexplode_damage 0
+set g_balance_crylink_primary_joinexplode_edgedamage 0
+set g_balance_crylink_primary_joinexplode_force 0
+set g_balance_crylink_primary_joinexplode_radius 0
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_linkexplode 1
+set g_balance_crylink_primary_middle_fadetime 5
+set g_balance_crylink_primary_middle_lifetime 5
+set g_balance_crylink_primary_other_fadetime 5
+set g_balance_crylink_primary_other_lifetime 5
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_refire 0.7
+set g_balance_crylink_primary_shots 6
+set g_balance_crylink_primary_speed 2000
+set g_balance_crylink_primary_spread 0.08
+set g_balance_crylink_reload_ammo 0
+set g_balance_crylink_reload_time 2
+set g_balance_crylink_secondary 1
+set g_balance_crylink_secondary_ammo 3
+set g_balance_crylink_secondary_animtime 0.2
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_bounces 0
+set g_balance_crylink_secondary_damage 8
+set g_balance_crylink_secondary_edgedamage 4
+set g_balance_crylink_secondary_force -200
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_joinexplode 0
+set g_balance_crylink_secondary_joinexplode_damage 0
+set g_balance_crylink_secondary_joinexplode_edgedamage 0
+set g_balance_crylink_secondary_joinexplode_force 0
+set g_balance_crylink_secondary_joinexplode_radius 0
+set g_balance_crylink_secondary_joinspread 0
+set g_balance_crylink_secondary_linkexplode 0
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_middle_lifetime 5
+set g_balance_crylink_secondary_other_fadetime 2
+set g_balance_crylink_secondary_other_lifetime 2
+set g_balance_crylink_secondary_radius 100
+set g_balance_crylink_secondary_refire 0.7
+set g_balance_crylink_secondary_shots 5
+set g_balance_crylink_secondary_speed 4000
+set g_balance_crylink_secondary_spread 0.08
+set g_balance_crylink_secondary_spreadtype 0
+set g_balance_crylink_switchdelay_drop 0.2
+set g_balance_crylink_switchdelay_raise 0.2
+set g_balance_crylink_weaponreplace ""
+set g_balance_crylink_weaponstart 0
+set g_balance_crylink_weaponstartoverride -1
+set g_balance_crylink_weaponthrowable 1
+// }}}
+// {{{ #8: Vortex
+set g_balance_vortex_charge 0
+set g_balance_vortex_charge_always 0
+set g_balance_vortex_charge_animlimit 0.5
+set g_balance_vortex_charge_limit 1
+set g_balance_vortex_charge_maxspeed 800
+set g_balance_vortex_charge_mindmg 40
+set g_balance_vortex_charge_minspeed 400
+set g_balance_vortex_charge_rate 0.6
+set g_balance_vortex_charge_rot_pause 0
+set g_balance_vortex_charge_rot_rate 0
+set g_balance_vortex_charge_shot_multiplier 0
+set g_balance_vortex_charge_start 0.5
+set g_balance_vortex_charge_velocity_rate 0
+set g_balance_vortex_primary_ammo 6
+set g_balance_vortex_primary_animtime 0.4
+set g_balance_vortex_primary_armorpierce 0
+set g_balance_vortex_primary_damage 65
+set g_balance_vortex_primary_damagefalloff_forcehalflife 0
+set g_balance_vortex_primary_damagefalloff_halflife 0
+set g_balance_vortex_primary_damagefalloff_maxdist 0
+set g_balance_vortex_primary_damagefalloff_mindist 0
+set g_balance_vortex_primary_force 400
+set g_balance_vortex_primary_refire 1.5
+set g_balance_vortex_reload_ammo 0
+set g_balance_vortex_reload_time 2
+set g_balance_vortex_secondary 0
+set g_balance_vortex_secondary_ammo 2
+set g_balance_vortex_secondary_animtime 0
+set g_balance_vortex_secondary_armorpierce 0
+set g_balance_vortex_secondary_chargepool 0
+set g_balance_vortex_secondary_chargepool_pause_regen 1
+set g_balance_vortex_secondary_chargepool_regen 0.15
+set g_balance_vortex_secondary_damage 0
+set g_balance_vortex_secondary_damagefalloff_forcehalflife 0
+set g_balance_vortex_secondary_damagefalloff_halflife 0
+set g_balance_vortex_secondary_damagefalloff_maxdist 0
+set g_balance_vortex_secondary_damagefalloff_mindist 0
+set g_balance_vortex_secondary_force 0
+set g_balance_vortex_secondary_refire 0
+set g_balance_vortex_switchdelay_drop 0.2
+set g_balance_vortex_switchdelay_raise 0.2
+set g_balance_vortex_weaponreplace ""
+set g_balance_vortex_weaponstart 0
+set g_balance_vortex_weaponstartoverride -1
+set g_balance_vortex_weaponthrowable 1
+// }}}
+// {{{ #9: Hagar
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_primary_damage 25
+set g_balance_hagar_primary_damageforcescale 0
+set g_balance_hagar_primary_edgedamage 12.5
+set g_balance_hagar_primary_force 100
+set g_balance_hagar_primary_health 15
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_radius 65
+set g_balance_hagar_primary_refire 0.16667
+set g_balance_hagar_primary_speed 2200
+set g_balance_hagar_primary_spread 0
+set g_balance_hagar_reload_ammo 0
+set g_balance_hagar_reload_time 2
+set g_balance_hagar_secondary 1
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_secondary_damage 35
+set g_balance_hagar_secondary_damageforcescale 0
+set g_balance_hagar_secondary_edgedamage 17.5
+set g_balance_hagar_secondary_force 75
+set g_balance_hagar_secondary_health 15
+set g_balance_hagar_secondary_lifetime_min 10
+set g_balance_hagar_secondary_lifetime_rand 0
+set g_balance_hagar_secondary_load 1
+set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_load_animtime 0.2
+set g_balance_hagar_secondary_load_hold 4
+set g_balance_hagar_secondary_load_linkexplode 0
+set g_balance_hagar_secondary_load_max 4
+set g_balance_hagar_secondary_load_releasedeath 0
+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_radius 80
+set g_balance_hagar_secondary_refire 0.5
+set g_balance_hagar_secondary_speed 2000
+set g_balance_hagar_secondary_spread 0
+set g_balance_hagar_switchdelay_drop 0.2
+set g_balance_hagar_switchdelay_raise 0.2
+set g_balance_hagar_weaponreplace ""
+set g_balance_hagar_weaponstart 0
+set g_balance_hagar_weaponstartoverride -1
+set g_balance_hagar_weaponthrowable 1
+// }}}
+// {{{ #10: Devastator
+set g_balance_devastator_ammo 4
+set g_balance_devastator_animtime 0.4
+set g_balance_devastator_damage 80
+set g_balance_devastator_damageforcescale 1
+set g_balance_devastator_detonatedelay 0.02
+set g_balance_devastator_edgedamage 40
+set g_balance_devastator_force 400
+set g_balance_devastator_guidedelay 0.2
+set g_balance_devastator_guidegoal 512
+set g_balance_devastator_guiderate 90
+set g_balance_devastator_guideratedelay 0.01
+set g_balance_devastator_guidestop 0
+set g_balance_devastator_health 30
+set g_balance_devastator_lifetime 10
+set g_balance_devastator_radius 110
+set g_balance_devastator_refire 1.1
+set g_balance_devastator_reload_ammo 0
+set g_balance_devastator_reload_time 2
+set g_balance_devastator_remote_damage 70
+set g_balance_devastator_remote_edgedamage 35
+set g_balance_devastator_remote_force 300
+set g_balance_devastator_remote_jump 1
+set g_balance_devastator_remote_jump_damage 70
+set g_balance_devastator_remote_jump_force 450
+set g_balance_devastator_remote_jump_radius 100
+set g_balance_devastator_remote_jump_velocity_z_add 0
+set g_balance_devastator_remote_jump_velocity_z_max 1500
+set g_balance_devastator_remote_jump_velocity_z_min 400
+set g_balance_devastator_remote_radius 110
+set g_balance_devastator_speed 1300
+set g_balance_devastator_speedaccel 1300
+set g_balance_devastator_speedstart 1000
+set g_balance_devastator_switchdelay_drop 0.2
+set g_balance_devastator_switchdelay_raise 0.2
+set g_balance_devastator_weaponreplace ""
+set g_balance_devastator_weaponstart 0
+set g_balance_devastator_weaponstartoverride -1
+set g_balance_devastator_weaponthrowable 1
+// }}}
+// {{{ #11: Port-O-Launch
+set g_balance_porto_primary_animtime 0.3
+set g_balance_porto_primary_lifetime 5
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_speed 1000
+set g_balance_porto_secondary 1
+set g_balance_porto_secondary_animtime 0.3
+set g_balance_porto_secondary_lifetime 5
+set g_balance_porto_secondary_refire 1.5
+set g_balance_porto_secondary_speed 1000
+set g_balance_porto_switchdelay_drop 0.2
+set g_balance_porto_switchdelay_raise 0.2
+set g_balance_porto_weaponreplace ""
+set g_balance_porto_weaponstart 0
+set g_balance_porto_weaponstartoverride -1
+set g_balance_porto_weaponthrowable 1
+// }}}
+// {{{ #12: Vaporizer
+set g_balance_vaporizer_primary_ammo 10
+set g_balance_vaporizer_primary_animtime 0.3
+set g_balance_vaporizer_primary_damage 150
+set g_balance_vaporizer_primary_force 800
+set g_balance_vaporizer_primary_refire 1
+set g_balance_vaporizer_reload_ammo 0
+set g_balance_vaporizer_reload_time 0
+set g_balance_vaporizer_secondary_ammo 0
+set g_balance_vaporizer_secondary_animtime 0.2
+set g_balance_vaporizer_secondary_damage 25
+set g_balance_vaporizer_secondary_delay 0
+set g_balance_vaporizer_secondary_edgedamage 12.5
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
+set g_balance_vaporizer_secondary_lifetime 5
+set g_balance_vaporizer_secondary_radius 70
+set g_balance_vaporizer_secondary_refire 0.7
+set g_balance_vaporizer_secondary_shotangle 0
+set g_balance_vaporizer_secondary_speed 6000
+set g_balance_vaporizer_secondary_spread 0
+set g_balance_vaporizer_switchdelay_drop 0.2
+set g_balance_vaporizer_switchdelay_raise 0.2
+set g_balance_vaporizer_weaponreplace ""
+set g_balance_vaporizer_weaponstart 0
+set g_balance_vaporizer_weaponstartoverride -1
+set g_balance_vaporizer_weaponthrowable 1
+// }}}
+// {{{ #13: Grappling Hook
+set g_balance_hook_primary_ammo 5
+set g_balance_hook_primary_animtime 0.3
+set g_balance_hook_primary_hooked_ammo 5
+set g_balance_hook_primary_hooked_time_free 2
+set g_balance_hook_primary_hooked_time_max 0
+set g_balance_hook_primary_refire 0.2
+set g_balance_hook_secondary_animtime 0.3
+set g_balance_hook_secondary_damage 25
+set g_balance_hook_secondary_damageforcescale 0
+set g_balance_hook_secondary_duration 1.5
+set g_balance_hook_secondary_edgedamage 5
+set g_balance_hook_secondary_force -2000
+set g_balance_hook_secondary_gravity 5
+set g_balance_hook_secondary_health 15
+set g_balance_hook_secondary_lifetime 5
+set g_balance_hook_secondary_power 3
+set g_balance_hook_secondary_radius 500
+set g_balance_hook_secondary_refire 3
+set g_balance_hook_secondary_speed 0
+set g_balance_hook_switchdelay_drop 0.2
+set g_balance_hook_switchdelay_raise 0.2
+set g_balance_hook_weaponreplace ""
+set g_balance_hook_weaponstart 0
+set g_balance_hook_weaponstartoverride -1
+set g_balance_hook_weaponthrowable 1
+// }}}
+// {{{ #14: Heavy Laser Assault Cannon (MUTATOR WEAPON)
+set g_balance_hlac_primary_ammo 1
+set g_balance_hlac_primary_animtime 0.4
+set g_balance_hlac_primary_damage 18
+set g_balance_hlac_primary_edgedamage 9
+set g_balance_hlac_primary_force 90
+set g_balance_hlac_primary_lifetime 5
+set g_balance_hlac_primary_radius 70
+set g_balance_hlac_primary_refire 0.15
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_spread_add 0.0045
+set g_balance_hlac_primary_spread_crouchmod 0.25
+set g_balance_hlac_primary_spread_max 0.25
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_reload_ammo 0
+set g_balance_hlac_reload_time 2
+set g_balance_hlac_secondary 1
+set g_balance_hlac_secondary_ammo 10
+set g_balance_hlac_secondary_animtime 0.3
+set g_balance_hlac_secondary_damage 15
+set g_balance_hlac_secondary_edgedamage 7.5
+set g_balance_hlac_secondary_force 90
+set g_balance_hlac_secondary_lifetime 5
+set g_balance_hlac_secondary_radius 70
+set g_balance_hlac_secondary_refire 1
+set g_balance_hlac_secondary_shots 6
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+set g_balance_hlac_switchdelay_drop 0.2
+set g_balance_hlac_switchdelay_raise 0.2
+set g_balance_hlac_weaponreplace ""
+set g_balance_hlac_weaponstart 0
+set g_balance_hlac_weaponstartoverride -1
+set g_balance_hlac_weaponthrowable 1
+// }}}
+// {{{ #15: @!#%'n Tuba
+set g_balance_tuba_animtime 0.05
+set g_balance_tuba_attenuation 0.5
+set g_balance_tuba_damage 5
+set g_balance_tuba_edgedamage 0
+set g_balance_tuba_fadetime 0.25
+set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
+set g_balance_tuba_radius 200
+set g_balance_tuba_refire 0.05
+set g_balance_tuba_switchdelay_drop 0.2
+set g_balance_tuba_switchdelay_raise 0.2
+set g_balance_tuba_volume 1
+set g_balance_tuba_weaponreplace ""
+set g_balance_tuba_weaponstart 0
+set g_balance_tuba_weaponstartoverride -1
+set g_balance_tuba_weaponthrowable 1
+// }}}
+// {{{ #16: Rifle (MUTATOR WEAPON)
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_animtime 0.4
+set g_balance_rifle_primary_bullethail 0
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_damage 80
+set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_refire 1.2
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_solidpenetration 62.2
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_reload_ammo 80
+set g_balance_rifle_reload_time 2
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_animtime 0.3
+set g_balance_rifle_secondary_bullethail 0
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_damage 20
+set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_refire 0.9
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_shots 4
+set g_balance_rifle_secondary_solidpenetration 15.5
+set g_balance_rifle_secondary_spread 0.04
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_switchdelay_drop 0.2
+set g_balance_rifle_switchdelay_raise 0.2
+set g_balance_rifle_weaponreplace ""
+set g_balance_rifle_weaponstart 0
+set g_balance_rifle_weaponstartoverride -1
+set g_balance_rifle_weaponthrowable 1
+// }}}
+// {{{ #17: Fireball
+set g_balance_fireball_primary_animtime 0.4
+set g_balance_fireball_primary_bfgdamage 100
+set g_balance_fireball_primary_bfgforce 0
+set g_balance_fireball_primary_bfgradius 1000
+set g_balance_fireball_primary_damage 200
+set g_balance_fireball_primary_damageforcescale 0
+set g_balance_fireball_primary_edgedamage 50
+set g_balance_fireball_primary_force 600
+set g_balance_fireball_primary_health 0
+set g_balance_fireball_primary_laserburntime 0.5
+set g_balance_fireball_primary_laserdamage 80
+set g_balance_fireball_primary_laseredgedamage 20
+set g_balance_fireball_primary_laserradius 256
+set g_balance_fireball_primary_lifetime 15
+set g_balance_fireball_primary_radius 200
+set g_balance_fireball_primary_refire 2
+set g_balance_fireball_primary_refire2 0
+set g_balance_fireball_primary_speed 1200
+set g_balance_fireball_primary_spread 0
+set g_balance_fireball_secondary_animtime 0.3
+set g_balance_fireball_secondary_damage 40
+set g_balance_fireball_secondary_damageforcescale 4
+set g_balance_fireball_secondary_damagetime 5
+set g_balance_fireball_secondary_laserburntime 0.5
+set g_balance_fireball_secondary_laserdamage 50
+set g_balance_fireball_secondary_laseredgedamage 20
+set g_balance_fireball_secondary_laserradius 110
+set g_balance_fireball_secondary_lifetime 7
+set g_balance_fireball_secondary_refire 1.5
+set g_balance_fireball_secondary_speed 900
+set g_balance_fireball_secondary_speed_up 100
+set g_balance_fireball_secondary_speed_z 0
+set g_balance_fireball_secondary_spread 0
+set g_balance_fireball_switchdelay_drop 0.2
+set g_balance_fireball_switchdelay_raise 0.2
+set g_balance_fireball_weaponreplace ""
+set g_balance_fireball_weaponstart 0
+set g_balance_fireball_weaponstartoverride -1
+set g_balance_fireball_weaponthrowable 0
+// }}}
+// {{{ #18: T.A.G. Seeker (MUTATOR WEAPON)
+set g_balance_seeker_flac_ammo 1
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1400
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.2
+set g_balance_seeker_missile_count 3
+set g_balance_seeker_missile_damage 30
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 1400
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 150
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+set g_balance_seeker_missile_smart 1
+set g_balance_seeker_missile_smart_mindist 800
+set g_balance_seeker_missile_smart_trace_max 2500
+set g_balance_seeker_missile_smart_trace_min 1000
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_max 1300
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_reload_ammo 0
+set g_balance_seeker_reload_time 2
+set g_balance_seeker_switchdelay_drop 0.2
+set g_balance_seeker_switchdelay_raise 0.2
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.2
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.75
+set g_balance_seeker_tag_speed 5000
+set g_balance_seeker_tag_spread 0
+set g_balance_seeker_tag_tracker_lifetime 10
+set g_balance_seeker_type 0
+set g_balance_seeker_weaponreplace ""
+set g_balance_seeker_weaponstart 0
+set g_balance_seeker_weaponstartoverride -1
+set g_balance_seeker_weaponthrowable 1
+// }}}
+// {{{ #19: Shockwave
+set g_balance_shockwave_blast_animtime 0.3
+set g_balance_shockwave_blast_damage 40
+set g_balance_shockwave_blast_distance 1000
+set g_balance_shockwave_blast_edgedamage 0
+set g_balance_shockwave_blast_force 15
+set g_balance_shockwave_blast_force_forwardbias 50
+set g_balance_shockwave_blast_force_zscale 1
+set g_balance_shockwave_blast_jump_damage 20
+set g_balance_shockwave_blast_jump_edgedamage 0
+set g_balance_shockwave_blast_jump_force 100
+set g_balance_shockwave_blast_jump_force_velocitybias 1
+set g_balance_shockwave_blast_jump_force_zscale 1
+set g_balance_shockwave_blast_jump_multiplier_accuracy 0.5
+set g_balance_shockwave_blast_jump_multiplier_distance 0.5
+set g_balance_shockwave_blast_jump_multiplier_min 0
+set g_balance_shockwave_blast_jump_radius 150
+set g_balance_shockwave_blast_multiplier_accuracy 0.45
+set g_balance_shockwave_blast_multiplier_distance 0.2
+set g_balance_shockwave_blast_multiplier_min 0
+set g_balance_shockwave_blast_refire 0.75
+set g_balance_shockwave_blast_splash_damage 15
+set g_balance_shockwave_blast_splash_edgedamage 0
+set g_balance_shockwave_blast_splash_force 100
+set g_balance_shockwave_blast_splash_force_forwardbias 50
+set g_balance_shockwave_blast_splash_multiplier_accuracy 0.5
+set g_balance_shockwave_blast_splash_multiplier_distance 0.5
+set g_balance_shockwave_blast_splash_multiplier_min 0
+set g_balance_shockwave_blast_splash_radius 70
+set g_balance_shockwave_blast_spread_max 120
+set g_balance_shockwave_blast_spread_min 25
+set g_balance_shockwave_melee_animtime 1.3
+set g_balance_shockwave_melee_damage 80
+set g_balance_shockwave_melee_delay 0.25
+set g_balance_shockwave_melee_force 200
+set g_balance_shockwave_melee_multihit 1
+set g_balance_shockwave_melee_no_doubleslap 1
+set g_balance_shockwave_melee_nonplayerdamage 40
+set g_balance_shockwave_melee_range 120
+set g_balance_shockwave_melee_refire 1.25
+set g_balance_shockwave_melee_swing_side 120
+set g_balance_shockwave_melee_swing_up 30
+set g_balance_shockwave_melee_time 0.15
+set g_balance_shockwave_melee_traces 10
+set g_balance_shockwave_switchdelay_drop 0.2
+set g_balance_shockwave_switchdelay_raise 0.2
+set g_balance_shockwave_weaponreplace ""
+set g_balance_shockwave_weaponstart 0
+set g_balance_shockwave_weaponstartoverride -1
+set g_balance_shockwave_weaponthrowable 0
+// }}}
+// {{{ #20: Arc
+set g_balance_arc_beam_ammo 6
+set g_balance_arc_beam_animtime 0.1
+set g_balance_arc_beam_botaimlifetime 0
+set g_balance_arc_beam_botaimspeed 0
+set g_balance_arc_beam_damage 100
+set g_balance_arc_beam_degreespersegment 1
+set g_balance_arc_beam_distancepersegment 0
+set g_balance_arc_beam_falloff_halflifedist 0
+set g_balance_arc_beam_falloff_maxdist 0
+set g_balance_arc_beam_falloff_mindist 0
+set g_balance_arc_beam_force 600
+set g_balance_arc_beam_healing_amax 0
+set g_balance_arc_beam_healing_aps 50
+set g_balance_arc_beam_healing_hmax 150
+set g_balance_arc_beam_healing_hps 50
+set g_balance_arc_beam_heat 0
+set g_balance_arc_beam_maxangle 10
+set g_balance_arc_beam_nonplayerdamage 80
+set g_balance_arc_beam_range 1000
+set g_balance_arc_beam_refire 0.25
+set g_balance_arc_beam_returnspeed 8
+set g_balance_arc_beam_tightness 0.5
+set g_balance_arc_bolt 0
+set g_balance_arc_bolt_ammo 1
+set g_balance_arc_bolt_damage 25
+set g_balance_arc_bolt_damageforcescale 0
+set g_balance_arc_bolt_edgedamage 12.5
+set g_balance_arc_bolt_force 120
+set g_balance_arc_bolt_health 15
+set g_balance_arc_bolt_lifetime 5
+set g_balance_arc_bolt_radius 65
+set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_speed 2300
+set g_balance_arc_bolt_spread 0
+set g_balance_arc_burst_ammo 15
+set g_balance_arc_burst_damage 250
+set g_balance_arc_burst_healing_aps 100
+set g_balance_arc_burst_healing_hps 100
+set g_balance_arc_burst_heat 5
+set g_balance_arc_cooldown 2.5
+set g_balance_arc_cooldown_release 0
+set g_balance_arc_overheat_max 5
+set g_balance_arc_overheat_min 3
+set g_balance_arc_switchdelay_drop 0.2
+set g_balance_arc_switchdelay_raise 0.2
+set g_balance_arc_weaponreplace ""
+set g_balance_arc_weaponstart 0
+set g_balance_arc_weaponstartoverride -1
+set g_balance_arc_weaponthrowable 1
+// }}}
+// {{{ #21: Overkill Heavy Machine Gun (MUTATOR WEAPON)
+set g_balance_okhmg_primary_ammo 1
+set g_balance_okhmg_primary_damage 30
+set g_balance_okhmg_primary_force 10
+set g_balance_okhmg_primary_refire 0.05
+set g_balance_okhmg_primary_solidpenetration 127
+set g_balance_okhmg_primary_spread_add 0.005
+set g_balance_okhmg_primary_spread_max 0.06
+set g_balance_okhmg_primary_spread_min 0.01
+set g_balance_okhmg_reload_ammo 120
+set g_balance_okhmg_reload_time 1
+set g_balance_okhmg_secondary_ammo 0
+set g_balance_okhmg_secondary_animtime 0.2
+set g_balance_okhmg_secondary_damage 25
+set g_balance_okhmg_secondary_delay 0
+set g_balance_okhmg_secondary_edgedamage 12.5
+set g_balance_okhmg_secondary_force 360
+set g_balance_okhmg_secondary_force_zscale 1
+set g_balance_okhmg_secondary_lifetime 5
+set g_balance_okhmg_secondary_radius 70
+set g_balance_okhmg_secondary_refire 0.7
+set g_balance_okhmg_secondary_refire_type 1
+set g_balance_okhmg_secondary_shotangle 0
+set g_balance_okhmg_secondary_speed 6000
+set g_balance_okhmg_secondary_spread 0
+set g_balance_okhmg_switchdelay_drop 0.2
+set g_balance_okhmg_switchdelay_raise 0.2
+set g_balance_okhmg_weaponreplace ""
+set g_balance_okhmg_weaponstart 0
+set g_balance_okhmg_weaponstartoverride 0
+set g_balance_okhmg_weaponthrowable 0
+// }}}
+// {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
+set g_balance_okmachinegun_primary_ammo 1
+set g_balance_okmachinegun_primary_damage 25
+set g_balance_okmachinegun_primary_force 5
+set g_balance_okmachinegun_primary_refire 0.1
+set g_balance_okmachinegun_primary_solidpenetration 100
+set g_balance_okmachinegun_primary_spread_add 0.012
+set g_balance_okmachinegun_primary_spread_max 0.05
+set g_balance_okmachinegun_primary_spread_min 0
+set g_balance_okmachinegun_reload_ammo 30
+set g_balance_okmachinegun_reload_time 1.5
+set g_balance_okmachinegun_secondary_animtime 0.2
+set g_balance_okmachinegun_secondary_damage 25
+set g_balance_okmachinegun_secondary_delay 0
+set g_balance_okmachinegun_secondary_edgedamage 12.5
+set g_balance_okmachinegun_secondary_force 360
+set g_balance_okmachinegun_secondary_force_zscale 1
+set g_balance_okmachinegun_secondary_lifetime 5
+set g_balance_okmachinegun_secondary_radius 70
+set g_balance_okmachinegun_secondary_refire 0.7
+set g_balance_okmachinegun_secondary_refire_type 1
+set g_balance_okmachinegun_secondary_shotangle 0
+set g_balance_okmachinegun_secondary_speed 6000
+set g_balance_okmachinegun_secondary_spread 0
+set g_balance_okmachinegun_switchdelay_drop 0.2
+set g_balance_okmachinegun_switchdelay_raise 0.2
+set g_balance_okmachinegun_weaponreplace ""
+set g_balance_okmachinegun_weaponstart 0
+set g_balance_okmachinegun_weaponstartoverride -1
+set g_balance_okmachinegun_weaponthrowable 1
+// }}}
+// {{{ #23: Overkill Nex (MUTATOR WEAPON)
+set g_balance_oknex_charge 0
+set g_balance_oknex_charge_animlimit 0.5
+set g_balance_oknex_charge_limit 1
+set g_balance_oknex_charge_maxspeed 800
+set g_balance_oknex_charge_mindmg 40
+set g_balance_oknex_charge_minspeed 400
+set g_balance_oknex_charge_rate 0.6
+set g_balance_oknex_charge_rot_pause 0
+set g_balance_oknex_charge_rot_rate 0
+set g_balance_oknex_charge_shot_multiplier 0
+set g_balance_oknex_charge_start 0.5
+set g_balance_oknex_charge_velocity_rate 0
+set g_balance_oknex_primary_ammo 10
+set g_balance_oknex_primary_animtime 0.65
+set g_balance_oknex_primary_damage 100
+set g_balance_oknex_primary_damagefalloff_forcehalflife 0
+set g_balance_oknex_primary_damagefalloff_halflife 0
+set g_balance_oknex_primary_damagefalloff_maxdist 0
+set g_balance_oknex_primary_damagefalloff_mindist 0
+set g_balance_oknex_primary_force 500
+set g_balance_oknex_primary_refire 1
+set g_balance_oknex_reload_ammo 50
+set g_balance_oknex_reload_time 2
+set g_balance_oknex_secondary 2
+set g_balance_oknex_secondary_ammo 0
+set g_balance_oknex_secondary_animtime 0.2
+set g_balance_oknex_secondary_chargepool 0
+set g_balance_oknex_secondary_chargepool_pause_regen 1
+set g_balance_oknex_secondary_chargepool_regen 0.15
+set g_balance_oknex_secondary_damage 25
+set g_balance_oknex_secondary_damagefalloff_forcehalflife 0
+set g_balance_oknex_secondary_damagefalloff_halflife 0
+set g_balance_oknex_secondary_damagefalloff_maxdist 0
+set g_balance_oknex_secondary_damagefalloff_mindist 0
+set g_balance_oknex_secondary_delay 0
+set g_balance_oknex_secondary_edgedamage 12.5
+set g_balance_oknex_secondary_force 360
+set g_balance_oknex_secondary_force_zscale 1
+set g_balance_oknex_secondary_lifetime 5
+set g_balance_oknex_secondary_radius 70
+set g_balance_oknex_secondary_refire 0.7
+set g_balance_oknex_secondary_refire_type 1
+set g_balance_oknex_secondary_shotangle 0
+set g_balance_oknex_secondary_speed 6000
+set g_balance_oknex_secondary_spread 0
+set g_balance_oknex_switchdelay_drop 0.2
+set g_balance_oknex_switchdelay_raise 0.2
+set g_balance_oknex_weaponreplace ""
+set g_balance_oknex_weaponstart 0
+set g_balance_oknex_weaponstartoverride -1
+set g_balance_oknex_weaponthrowable 1
+// }}}
+// {{{ #24: Overkill Rocket Propelled Chainsaw (MUTATOR WEAPON)
+set g_balance_okrpc_primary_ammo 10
+set g_balance_okrpc_primary_animtime 1
+set g_balance_okrpc_primary_damage 150
+set g_balance_okrpc_primary_damage2 500
+set g_balance_okrpc_primary_damageforcescale 2
+set g_balance_okrpc_primary_edgedamage 50
+set g_balance_okrpc_primary_force 400
+set g_balance_okrpc_primary_health 25
+set g_balance_okrpc_primary_lifetime 30
+set g_balance_okrpc_primary_radius 300
+set g_balance_okrpc_primary_refire 1
+set g_balance_okrpc_primary_speed 2500
+set g_balance_okrpc_primary_speedaccel 5000
+set g_balance_okrpc_reload_ammo 10
+set g_balance_okrpc_reload_time 1
+set g_balance_okrpc_secondary_ammo 0
+set g_balance_okrpc_secondary_animtime 0.2
+set g_balance_okrpc_secondary_damage 25
+set g_balance_okrpc_secondary_delay 0
+set g_balance_okrpc_secondary_edgedamage 12.5
+set g_balance_okrpc_secondary_force 360
+set g_balance_okrpc_secondary_force_zscale 1
+set g_balance_okrpc_secondary_lifetime 5
+set g_balance_okrpc_secondary_radius 70
+set g_balance_okrpc_secondary_refire 0.7
+set g_balance_okrpc_secondary_refire_type 1
+set g_balance_okrpc_secondary_shotangle 0
+set g_balance_okrpc_secondary_speed 6000
+set g_balance_okrpc_secondary_spread 0
+set g_balance_okrpc_switchdelay_drop 0.2
+set g_balance_okrpc_switchdelay_raise 0.2
+set g_balance_okrpc_weaponreplace ""
+set g_balance_okrpc_weaponstart 0
+set g_balance_okrpc_weaponstartoverride 0
+set g_balance_okrpc_weaponthrowable 0
+// }}}
+// {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
+set g_balance_okshotgun_primary_ammo 3
+set g_balance_okshotgun_primary_animtime 0.65
+set g_balance_okshotgun_primary_bot_range 512
+set g_balance_okshotgun_primary_bullets 10
+set g_balance_okshotgun_primary_damage 17
+set g_balance_okshotgun_primary_force 80
+set g_balance_okshotgun_primary_refire 0.75
+set g_balance_okshotgun_primary_solidpenetration 3.8
+set g_balance_okshotgun_primary_spread 0.07
+set g_balance_okshotgun_reload_ammo 24
+set g_balance_okshotgun_reload_time 2
+set g_balance_okshotgun_secondary_animtime 0.2
+set g_balance_okshotgun_secondary_damage 25
+set g_balance_okshotgun_secondary_delay 0
+set g_balance_okshotgun_secondary_edgedamage 12.5
+set g_balance_okshotgun_secondary_force 360
+set g_balance_okshotgun_secondary_force_zscale 1
+set g_balance_okshotgun_secondary_lifetime 5
+set g_balance_okshotgun_secondary_radius 70
+set g_balance_okshotgun_secondary_refire 0.7
+set g_balance_okshotgun_secondary_refire_type 1
+set g_balance_okshotgun_secondary_shotangle 0
+set g_balance_okshotgun_secondary_speed 6000
+set g_balance_okshotgun_secondary_spread 0
+set g_balance_okshotgun_switchdelay_drop 0.2
+set g_balance_okshotgun_switchdelay_raise 0.2
+set g_balance_okshotgun_weaponreplace ""
+set g_balance_okshotgun_weaponstart 0
+set g_balance_okshotgun_weaponstartoverride -1
+set g_balance_okshotgun_weaponthrowable 1
+// }}}
index 15bc65034e7f0dbf07c8c2fdb8925c34bb50f4c5..1fe4044cab7f25ce1e1a624e1c895680224ed668 100644 (file)
@@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 350
+set g_balance_devastator_remote_jump 0
 set g_balance_devastator_remote_jump_damage 70
 set g_balance_devastator_remote_jump_force 450
-set g_balance_devastator_remote_jump_radius 0
+set g_balance_devastator_remote_jump_radius 100
 set g_balance_devastator_remote_jump_velocity_z_add 0
 set g_balance_devastator_remote_jump_velocity_z_max 1500
 set g_balance_devastator_remote_jump_velocity_z_min 400
@@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1
 set g_balance_okhmg_primary_damage 30
 set g_balance_okhmg_primary_force 10
 set g_balance_okhmg_primary_refire 0.05
-set g_balance_okhmg_primary_solidpenetration 32
+set g_balance_okhmg_primary_solidpenetration 127
 set g_balance_okhmg_primary_spread_add 0.005
 set g_balance_okhmg_primary_spread_max 0.06
 set g_balance_okhmg_primary_spread_min 0.01
@@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2
 set g_balance_okhmg_secondary_damage 25
 set g_balance_okhmg_secondary_delay 0
 set g_balance_okhmg_secondary_edgedamage 12.5
-set g_balance_okhmg_secondary_force 300
+set g_balance_okhmg_secondary_force 360
 set g_balance_okhmg_secondary_force_zscale 1
 set g_balance_okhmg_secondary_lifetime 5
 set g_balance_okhmg_secondary_radius 70
@@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0
 // }}}
 // {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
 set g_balance_okmachinegun_primary_ammo 1
-set g_balance_okmachinegun_primary_damage 10
-set g_balance_okmachinegun_primary_force 3
+set g_balance_okmachinegun_primary_damage 25
+set g_balance_okmachinegun_primary_force 5
 set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 13.1
+set g_balance_okmachinegun_primary_solidpenetration 100
 set g_balance_okmachinegun_primary_spread_add 0.012
 set g_balance_okmachinegun_primary_spread_max 0.05
-set g_balance_okmachinegun_primary_spread_min 0.02
-set g_balance_okmachinegun_reload_ammo 60
-set g_balance_okmachinegun_reload_time 2
+set g_balance_okmachinegun_primary_spread_min 0
+set g_balance_okmachinegun_reload_ammo 30
+set g_balance_okmachinegun_reload_time 1.5
 set g_balance_okmachinegun_secondary_animtime 0.2
-set g_balance_okmachinegun_secondary_damage 20
+set g_balance_okmachinegun_secondary_damage 25
 set g_balance_okmachinegun_secondary_delay 0
-set g_balance_okmachinegun_secondary_edgedamage 10
-set g_balance_okmachinegun_secondary_force 300
+set g_balance_okmachinegun_secondary_edgedamage 12.5
+set g_balance_okmachinegun_secondary_force 360
 set g_balance_okmachinegun_secondary_force_zscale 1
 set g_balance_okmachinegun_secondary_lifetime 5
-set g_balance_okmachinegun_secondary_radius 60
+set g_balance_okmachinegun_secondary_radius 70
 set g_balance_okmachinegun_secondary_refire 0.7
-set g_balance_okmachinegun_secondary_refire_type 0
+set g_balance_okmachinegun_secondary_refire_type 1
 set g_balance_okmachinegun_secondary_shotangle 0
 set g_balance_okmachinegun_secondary_speed 6000
 set g_balance_okmachinegun_secondary_spread 0
@@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1
 set g_balance_okmachinegun_weaponthrowable 1
 // }}}
 // {{{ #23: Overkill Nex (MUTATOR WEAPON)
-set g_balance_oknex_charge 1
+set g_balance_oknex_charge 0
 set g_balance_oknex_charge_animlimit 0.5
 set g_balance_oknex_charge_limit 1
 set g_balance_oknex_charge_maxspeed 800
@@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0
 set g_balance_oknex_charge_shot_multiplier 0
 set g_balance_oknex_charge_start 0.5
 set g_balance_oknex_charge_velocity_rate 0
-set g_balance_oknex_primary_ammo 6
-set g_balance_oknex_primary_animtime 0.4
-set g_balance_oknex_primary_damage 80
+set g_balance_oknex_primary_ammo 10
+set g_balance_oknex_primary_animtime 0.65
+set g_balance_oknex_primary_damage 100
 set g_balance_oknex_primary_damagefalloff_forcehalflife 0
 set g_balance_oknex_primary_damagefalloff_halflife 0
 set g_balance_oknex_primary_damagefalloff_maxdist 0
 set g_balance_oknex_primary_damagefalloff_mindist 0
-set g_balance_oknex_primary_force 400
-set g_balance_oknex_primary_refire 1.5
-set g_balance_oknex_reload_ammo 0
+set g_balance_oknex_primary_force 500
+set g_balance_oknex_primary_refire 1
+set g_balance_oknex_reload_ammo 50
 set g_balance_oknex_reload_time 2
-set g_balance_oknex_secondary 0
-set g_balance_oknex_secondary_ammo 2
-set g_balance_oknex_secondary_animtime 0
+set g_balance_oknex_secondary 2
+set g_balance_oknex_secondary_ammo 0
+set g_balance_oknex_secondary_animtime 0.2
 set g_balance_oknex_secondary_chargepool 0
 set g_balance_oknex_secondary_chargepool_pause_regen 1
 set g_balance_oknex_secondary_chargepool_regen 0.15
-set g_balance_oknex_secondary_damage 0
+set g_balance_oknex_secondary_damage 25
 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0
 set g_balance_oknex_secondary_damagefalloff_halflife 0
 set g_balance_oknex_secondary_damagefalloff_maxdist 0
 set g_balance_oknex_secondary_damagefalloff_mindist 0
 set g_balance_oknex_secondary_delay 0
-set g_balance_oknex_secondary_edgedamage 10
-set g_balance_oknex_secondary_force 0
+set g_balance_oknex_secondary_edgedamage 12.5
+set g_balance_oknex_secondary_force 360
 set g_balance_oknex_secondary_force_zscale 1
 set g_balance_oknex_secondary_lifetime 5
-set g_balance_oknex_secondary_radius 60
-set g_balance_oknex_secondary_refire 0
-set g_balance_oknex_secondary_refire_type 0
+set g_balance_oknex_secondary_radius 70
+set g_balance_oknex_secondary_refire 0.7
+set g_balance_oknex_secondary_refire_type 1
 set g_balance_oknex_secondary_shotangle 0
 set g_balance_oknex_secondary_speed 6000
 set g_balance_oknex_secondary_spread 0
@@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2
 set g_balance_okrpc_secondary_damage 25
 set g_balance_okrpc_secondary_delay 0
 set g_balance_okrpc_secondary_edgedamage 12.5
-set g_balance_okrpc_secondary_force 300
+set g_balance_okrpc_secondary_force 360
 set g_balance_okrpc_secondary_force_zscale 1
 set g_balance_okrpc_secondary_lifetime 5
 set g_balance_okrpc_secondary_radius 70
@@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0
 set g_balance_okrpc_weaponthrowable 0
 // }}}
 // {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
-set g_balance_okshotgun_primary_ammo 1
-set g_balance_okshotgun_primary_animtime 0.2
+set g_balance_okshotgun_primary_ammo 3
+set g_balance_okshotgun_primary_animtime 0.65
 set g_balance_okshotgun_primary_bot_range 512
-set g_balance_okshotgun_primary_bullets 12
-set g_balance_okshotgun_primary_damage 4
-set g_balance_okshotgun_primary_force 15
+set g_balance_okshotgun_primary_bullets 10
+set g_balance_okshotgun_primary_damage 17
+set g_balance_okshotgun_primary_force 80
 set g_balance_okshotgun_primary_refire 0.75
 set g_balance_okshotgun_primary_solidpenetration 3.8
-set g_balance_okshotgun_primary_spread 0.12
-set g_balance_okshotgun_reload_ammo 0
+set g_balance_okshotgun_primary_spread 0.07
+set g_balance_okshotgun_reload_ammo 24
 set g_balance_okshotgun_reload_time 2
 set g_balance_okshotgun_secondary_animtime 0.2
-set g_balance_okshotgun_secondary_damage 20
+set g_balance_okshotgun_secondary_damage 25
 set g_balance_okshotgun_secondary_delay 0
-set g_balance_okshotgun_secondary_edgedamage 10
-set g_balance_okshotgun_secondary_force 300
+set g_balance_okshotgun_secondary_edgedamage 12.5
+set g_balance_okshotgun_secondary_force 360
 set g_balance_okshotgun_secondary_force_zscale 1
 set g_balance_okshotgun_secondary_lifetime 5
-set g_balance_okshotgun_secondary_radius 60
+set g_balance_okshotgun_secondary_radius 70
 set g_balance_okshotgun_secondary_refire 0.7
-set g_balance_okshotgun_secondary_refire_type 0
+set g_balance_okshotgun_secondary_refire_type 1
 set g_balance_okshotgun_secondary_shotangle 0
 set g_balance_okshotgun_secondary_speed 6000
 set g_balance_okshotgun_secondary_spread 0
index f789d78cd7ad82e8d5f04dce50f1f54c1e3bbc12..52d63dfa2bbcd26332d1d551b05778f8a536cd67 100644 (file)
@@ -81,7 +81,7 @@ set g_balance_machinegun_first_spread 0.03
 set g_balance_machinegun_mode 1
 set g_balance_machinegun_reload_ammo 60
 set g_balance_machinegun_reload_time 2
-set g_balance_machinegun_solidpenetration 63
+set g_balance_machinegun_solidpenetration 13.1
 set g_balance_machinegun_spread_add 0.012
 set g_balance_machinegun_spread_max 0.05
 set g_balance_machinegun_spread_min 0.02
@@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 300
+set g_balance_devastator_remote_jump 0
 set g_balance_devastator_remote_jump_damage 70
 set g_balance_devastator_remote_jump_force 450
-set g_balance_devastator_remote_jump_radius 0
+set g_balance_devastator_remote_jump_radius 100
 set g_balance_devastator_remote_jump_velocity_z_add 0
 set g_balance_devastator_remote_jump_velocity_z_max 1500
 set g_balance_devastator_remote_jump_velocity_z_min 400
index 4f947eaf89b82e14de501ffeead7d210d525c167..91743112acb1f23602f9dbcd05e79415f25e24d6 100644 (file)
@@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 300
+set g_balance_devastator_remote_jump 0
 set g_balance_devastator_remote_jump_damage 70
 set g_balance_devastator_remote_jump_force 450
-set g_balance_devastator_remote_jump_radius 0
+set g_balance_devastator_remote_jump_radius 100
 set g_balance_devastator_remote_jump_velocity_z_add 0
 set g_balance_devastator_remote_jump_velocity_z_max 1500
 set g_balance_devastator_remote_jump_velocity_z_min 400
@@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1
 set g_balance_okhmg_primary_damage 30
 set g_balance_okhmg_primary_force 10
 set g_balance_okhmg_primary_refire 0.05
-set g_balance_okhmg_primary_solidpenetration 32
+set g_balance_okhmg_primary_solidpenetration 127
 set g_balance_okhmg_primary_spread_add 0.005
 set g_balance_okhmg_primary_spread_max 0.06
 set g_balance_okhmg_primary_spread_min 0.01
@@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2
 set g_balance_okhmg_secondary_damage 25
 set g_balance_okhmg_secondary_delay 0
 set g_balance_okhmg_secondary_edgedamage 12.5
-set g_balance_okhmg_secondary_force 300
+set g_balance_okhmg_secondary_force 360
 set g_balance_okhmg_secondary_force_zscale 1
 set g_balance_okhmg_secondary_lifetime 5
 set g_balance_okhmg_secondary_radius 70
@@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0
 // }}}
 // {{{ #22: Overkill MachineGun (MUTATOR WEAPON)
 set g_balance_okmachinegun_primary_ammo 1
-set g_balance_okmachinegun_primary_damage 10
-set g_balance_okmachinegun_primary_force 3
+set g_balance_okmachinegun_primary_damage 25
+set g_balance_okmachinegun_primary_force 5
 set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 13.1
+set g_balance_okmachinegun_primary_solidpenetration 100
 set g_balance_okmachinegun_primary_spread_add 0.012
 set g_balance_okmachinegun_primary_spread_max 0.05
-set g_balance_okmachinegun_primary_spread_min 0.02
-set g_balance_okmachinegun_reload_ammo 60
-set g_balance_okmachinegun_reload_time 2
+set g_balance_okmachinegun_primary_spread_min 0
+set g_balance_okmachinegun_reload_ammo 30
+set g_balance_okmachinegun_reload_time 1.5
 set g_balance_okmachinegun_secondary_animtime 0.2
-set g_balance_okmachinegun_secondary_damage 20
+set g_balance_okmachinegun_secondary_damage 25
 set g_balance_okmachinegun_secondary_delay 0
-set g_balance_okmachinegun_secondary_edgedamage 10
-set g_balance_okmachinegun_secondary_force 300
+set g_balance_okmachinegun_secondary_edgedamage 12.5
+set g_balance_okmachinegun_secondary_force 360
 set g_balance_okmachinegun_secondary_force_zscale 1
 set g_balance_okmachinegun_secondary_lifetime 5
-set g_balance_okmachinegun_secondary_radius 60
+set g_balance_okmachinegun_secondary_radius 70
 set g_balance_okmachinegun_secondary_refire 0.7
-set g_balance_okmachinegun_secondary_refire_type 0
+set g_balance_okmachinegun_secondary_refire_type 1
 set g_balance_okmachinegun_secondary_shotangle 0
 set g_balance_okmachinegun_secondary_speed 6000
 set g_balance_okmachinegun_secondary_spread 0
@@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1
 set g_balance_okmachinegun_weaponthrowable 1
 // }}}
 // {{{ #23: Overkill Nex (MUTATOR WEAPON)
-set g_balance_oknex_charge 1
+set g_balance_oknex_charge 0
 set g_balance_oknex_charge_animlimit 0.5
 set g_balance_oknex_charge_limit 1
 set g_balance_oknex_charge_maxspeed 800
@@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0
 set g_balance_oknex_charge_shot_multiplier 0
 set g_balance_oknex_charge_start 0.5
 set g_balance_oknex_charge_velocity_rate 0
-set g_balance_oknex_primary_ammo 6
-set g_balance_oknex_primary_animtime 0.4
-set g_balance_oknex_primary_damage 80
+set g_balance_oknex_primary_ammo 10
+set g_balance_oknex_primary_animtime 0.65
+set g_balance_oknex_primary_damage 100
 set g_balance_oknex_primary_damagefalloff_forcehalflife 0
 set g_balance_oknex_primary_damagefalloff_halflife 0
 set g_balance_oknex_primary_damagefalloff_maxdist 0
 set g_balance_oknex_primary_damagefalloff_mindist 0
-set g_balance_oknex_primary_force 400
-set g_balance_oknex_primary_refire 1.5
-set g_balance_oknex_reload_ammo 0
+set g_balance_oknex_primary_force 500
+set g_balance_oknex_primary_refire 1
+set g_balance_oknex_reload_ammo 50
 set g_balance_oknex_reload_time 2
-set g_balance_oknex_secondary 0
-set g_balance_oknex_secondary_ammo 2
-set g_balance_oknex_secondary_animtime 0
+set g_balance_oknex_secondary 2
+set g_balance_oknex_secondary_ammo 0
+set g_balance_oknex_secondary_animtime 0.2
 set g_balance_oknex_secondary_chargepool 0
 set g_balance_oknex_secondary_chargepool_pause_regen 1
 set g_balance_oknex_secondary_chargepool_regen 0.15
-set g_balance_oknex_secondary_damage 0
+set g_balance_oknex_secondary_damage 25
 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0
 set g_balance_oknex_secondary_damagefalloff_halflife 0
 set g_balance_oknex_secondary_damagefalloff_maxdist 0
 set g_balance_oknex_secondary_damagefalloff_mindist 0
 set g_balance_oknex_secondary_delay 0
-set g_balance_oknex_secondary_edgedamage 10
-set g_balance_oknex_secondary_force 0
+set g_balance_oknex_secondary_edgedamage 12.5
+set g_balance_oknex_secondary_force 360
 set g_balance_oknex_secondary_force_zscale 1
 set g_balance_oknex_secondary_lifetime 5
-set g_balance_oknex_secondary_radius 60
-set g_balance_oknex_secondary_refire 0
-set g_balance_oknex_secondary_refire_type 0
+set g_balance_oknex_secondary_radius 70
+set g_balance_oknex_secondary_refire 0.7
+set g_balance_oknex_secondary_refire_type 1
 set g_balance_oknex_secondary_shotangle 0
 set g_balance_oknex_secondary_speed 6000
 set g_balance_oknex_secondary_spread 0
@@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2
 set g_balance_okrpc_secondary_damage 25
 set g_balance_okrpc_secondary_delay 0
 set g_balance_okrpc_secondary_edgedamage 12.5
-set g_balance_okrpc_secondary_force 300
+set g_balance_okrpc_secondary_force 360
 set g_balance_okrpc_secondary_force_zscale 1
 set g_balance_okrpc_secondary_lifetime 5
 set g_balance_okrpc_secondary_radius 70
@@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0
 set g_balance_okrpc_weaponthrowable 0
 // }}}
 // {{{ #25: Overkill Shotgun (MUTATOR WEAPON)
-set g_balance_okshotgun_primary_ammo 1
-set g_balance_okshotgun_primary_animtime 0.2
+set g_balance_okshotgun_primary_ammo 3
+set g_balance_okshotgun_primary_animtime 0.65
 set g_balance_okshotgun_primary_bot_range 512
-set g_balance_okshotgun_primary_bullets 12
-set g_balance_okshotgun_primary_damage 4
-set g_balance_okshotgun_primary_force 15
+set g_balance_okshotgun_primary_bullets 10
+set g_balance_okshotgun_primary_damage 17
+set g_balance_okshotgun_primary_force 80
 set g_balance_okshotgun_primary_refire 0.75
 set g_balance_okshotgun_primary_solidpenetration 3.8
-set g_balance_okshotgun_primary_spread 0.12
-set g_balance_okshotgun_reload_ammo 0
+set g_balance_okshotgun_primary_spread 0.07
+set g_balance_okshotgun_reload_ammo 24
 set g_balance_okshotgun_reload_time 2
 set g_balance_okshotgun_secondary_animtime 0.2
-set g_balance_okshotgun_secondary_damage 20
+set g_balance_okshotgun_secondary_damage 25
 set g_balance_okshotgun_secondary_delay 0
-set g_balance_okshotgun_secondary_edgedamage 10
-set g_balance_okshotgun_secondary_force 300
+set g_balance_okshotgun_secondary_edgedamage 12.5
+set g_balance_okshotgun_secondary_force 360
 set g_balance_okshotgun_secondary_force_zscale 1
 set g_balance_okshotgun_secondary_lifetime 5
-set g_balance_okshotgun_secondary_radius 60
+set g_balance_okshotgun_secondary_radius 70
 set g_balance_okshotgun_secondary_refire 0.7
-set g_balance_okshotgun_secondary_refire_type 0
+set g_balance_okshotgun_secondary_refire_type 1
 set g_balance_okshotgun_secondary_shotangle 0
 set g_balance_okshotgun_secondary_speed 6000
 set g_balance_okshotgun_secondary_spread 0
diff --git a/balance-testing.cfg b/balance-testing.cfg
new file mode 100644 (file)
index 0000000..96426aa
--- /dev/null
@@ -0,0 +1,243 @@
+g_mod_balance Testing
+
+// {{{ starting gear
+set g_balance_health_start 100
+set g_balance_armor_start 0
+set g_start_ammo_shells 15
+set g_start_ammo_nails 0
+set g_start_ammo_rockets 0
+set g_start_ammo_cells 0
+set g_start_ammo_plasma 0
+set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
+set g_warmup_start_health 100 "starting values when being in warmup-stage"
+set g_warmup_start_armor 100 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_plasma 90 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
+set g_lms_start_health 200
+set g_lms_start_armor 200
+set g_lms_start_ammo_shells 60
+set g_lms_start_ammo_nails 320
+set g_lms_start_ammo_rockets 160
+set g_lms_start_ammo_cells 180
+set g_lms_start_ammo_plasma 180
+set g_lms_start_ammo_fuel 0
+set g_balance_nix_roundtime 25
+set g_balance_nix_incrtime 1.6
+set g_balance_nix_ammo_shells 60
+set g_balance_nix_ammo_nails 320
+set g_balance_nix_ammo_rockets 160
+set g_balance_nix_ammo_cells 180
+set g_balance_nix_ammo_plasma 180
+set g_balance_nix_ammo_fuel 100
+set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
+set g_balance_nix_ammoincr_nails 6
+set g_balance_nix_ammoincr_rockets 2
+set g_balance_nix_ammoincr_cells 2
+set g_balance_nix_ammoincr_plasma 2
+set g_balance_nix_ammoincr_fuel 2
+// }}}
+
+// {{{ pickup items
+set g_pickup_ammo_anyway 1
+set g_pickup_weapons_anyway 1
+set g_pickup_shells 15
+set g_pickup_shells_weapon 15
+set g_pickup_shells_max 60
+set g_pickup_nails 80
+set g_pickup_nails_weapon 80
+set g_pickup_nails_max 320
+set g_pickup_rockets 40
+set g_pickup_rockets_weapon 40
+set g_pickup_rockets_max 160
+set g_pickup_cells 30
+set g_pickup_cells_weapon 30
+set g_pickup_cells_max 180
+set g_pickup_plasma 30
+set g_pickup_plasma_weapon 30
+set g_pickup_plasma_max 180
+set g_pickup_fuel 50
+set g_pickup_fuel_weapon 50
+set g_pickup_fuel_jetpack 100
+set g_pickup_fuel_max 100
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 200
+set g_pickup_armorsmall_anyway 1
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 200
+set g_pickup_armormedium_anyway 1
+set g_pickup_armorbig 50
+set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 1
+set g_pickup_armormega 100
+set g_pickup_armormega_max 200
+set g_pickup_armormega_anyway 1
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_anyway 1
+set g_pickup_healthmedium 25
+set g_pickup_healthmedium_max 200
+set g_pickup_healthmedium_anyway 1
+set g_pickup_healthbig 50
+set g_pickup_healthbig_max 200
+set g_pickup_healthbig_anyway 1
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 200
+set g_pickup_healthmega_anyway 1
+set g_pickup_respawntime_short 15
+set g_pickup_respawntime_medium 20
+set g_pickup_respawntime_long 30
+set g_pickup_respawntime_powerup 120
+set g_pickup_respawntime_weapon 10
+set g_pickup_respawntime_superweapon 120
+set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 1
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 0
+set g_pickup_respawntimejitter_weapon 0
+set g_pickup_respawntimejitter_superweapon 10
+set g_pickup_respawntimejitter_ammo 0
+// }}}
+
+// {{{ regen/rot
+set g_balance_health_regen 0.08
+set g_balance_health_regenlinear 0.5
+set g_balance_pause_health_regen 5
+set g_balance_pause_health_regen_spawn 0
+set g_balance_health_rot 0.02
+set g_balance_health_rotlinear 1
+set g_balance_pause_health_rot 1
+set g_balance_pause_health_rot_spawn 5
+set g_balance_health_regenstable 100
+set g_balance_health_rotstable 100
+set g_balance_health_limit 200
+set g_balance_armor_regen 0
+set g_balance_armor_regenlinear 0
+set g_balance_armor_rot 0.02
+set g_balance_armor_rotlinear 1
+set g_balance_pause_armor_rot 1
+set g_balance_pause_armor_rot_spawn 5
+set g_balance_armor_regenstable 100
+set g_balance_armor_rotstable 100
+set g_balance_armor_limit 200
+set g_balance_armor_blockpercent 0.7
+set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
+set g_balance_fuel_regenlinear 0
+set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
+set g_balance_fuel_rot 0.05
+set g_balance_fuel_rotlinear 0
+set g_balance_pause_fuel_rot 5
+set g_balance_pause_fuel_rot_spawn 10
+set g_balance_fuel_regenstable 50
+set g_balance_fuel_rotstable 100
+set g_balance_fuel_limit 100
+// }}}
+
+// {{{ misc
+set g_balance_selfdamagepercent 0.65
+set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
+set g_weaponratefactor 1 "weapon fire rate multiplier"
+set g_weapondamagefactor 1 "weapon damage multiplier"
+set g_weaponforcefactor 1 "weapon force multiplier"
+set g_weaponspreadfactor 1 "weapon spread multiplier"
+set g_balance_firetransfer_time 0.9
+set g_balance_firetransfer_damage 0.8
+set g_throughfloor_damage 0.75
+set g_throughfloor_force 0.75
+set g_projectiles_damage -2
+// possible values:
+// -2: absolutely no damage to projectiles (no exceptions)
+// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
+// 0: only damage from contents (lava/slime) or exceptions
+// 1: only self damage or damage from contents or exceptions
+// 2: allow all damage to projectiles normally
+set g_projectiles_keep_owner 1
+set g_projectiles_newton_style 0
+// possible values:
+// 0: absolute velocity projectiles (like Quake)
+// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
+// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
+set g_projectiles_newton_style_2_minfactor 0.8
+set g_projectiles_newton_style_2_maxfactor 1.5
+set g_projectiles_spread_style 7
+// possible values:
+// 0: forward + solid sphere (like Quake) - varies velocity
+// 1: forward + flattened solid sphere
+// 2: forward + solid circle
+// 3: forward + normal distribution 3D - varies velocity
+// 4: forward + normal distribution on a plane
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
+// 7: forward + circle with (1-r)(2-r) falloff
+set g_balance_falldamage_deadminspeed 250
+set g_balance_falldamage_minspeed 900
+set g_balance_falldamage_factor 0.20
+set g_balance_falldamage_maxdamage 40
+set g_balance_damagepush_speedfactor 2.5
+set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
+set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
+set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
+set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
+set g_balance_contents_playerdamage_lava_burn 0 // extra burning damage after leaving lava
+set g_balance_contents_playerdamage_lava_burn_time 2.5 // time across which the damage is applied (note: not dps!)
+set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
+set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
+set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
+// }}}
+
+// {{{ powerups
+set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
+set g_balance_powerup_invincible_time 30
+set g_balance_powerup_strength_damage 3
+set g_balance_powerup_strength_force 3
+set g_balance_powerup_strength_time 30
+set g_balance_powerup_strength_selfdamage 1.5
+set g_balance_powerup_strength_selfforce 1.5
+set g_balance_superweapons_time 30
+// }}}
+
+// {{{ jetpack/hook
+set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
+set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
+set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
+set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
+set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
+set g_jetpack_fuel 8 "fuel per second for jetpack"
+set g_jetpack_reverse_thrust 0 "if not 0, downward acceleration when crouching with the jetpack"
+
+set g_grappling_hook_tarzan 2 // 2: can also pull players
+set g_balance_grapplehook_speed_fly 1800
+set g_balance_grapplehook_speed_pull 2000
+set g_balance_grapplehook_force_rubber 2000
+set g_balance_grapplehook_force_rubber_overstretch 1000
+set g_balance_grapplehook_length_min 50
+set g_balance_grapplehook_stretch 50
+set g_balance_grapplehook_airfriction 0.2
+set g_balance_grapplehook_health 50
+set g_balance_grapplehook_damagedbycontents 1
+set g_balance_grapplehook_refire 0.2
+set g_balance_grapplehook_nade_time 0.7
+set g_balance_grapplehook_crouchslide 0
+set g_balance_grapplehook_gravity 0
+set g_balance_grapplehook_pull_frozen 0
+// }}}
+
+// {{{ port-o-launch
+set g_balance_portal_health 200 // these get recharged whenever the portal is used
+set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
+// }}}
+
+exec bal-wep-testing.cfg
diff --git a/balance-testingxpm.cfg b/balance-testingxpm.cfg
new file mode 100644 (file)
index 0000000..7c2da46
--- /dev/null
@@ -0,0 +1,243 @@
+g_mod_balance XPM
+
+// {{{ starting gear
+set g_balance_health_start 100
+set g_balance_armor_start 0
+set g_start_ammo_shells 15
+set g_start_ammo_nails 0
+set g_start_ammo_rockets 0
+set g_start_ammo_cells 0
+set g_start_ammo_plasma 0
+set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
+set g_warmup_start_health 100 "starting values when being in warmup-stage"
+set g_warmup_start_armor 100 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_plasma 90 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
+set g_lms_start_health 200
+set g_lms_start_armor 200
+set g_lms_start_ammo_shells 60
+set g_lms_start_ammo_nails 320
+set g_lms_start_ammo_rockets 160
+set g_lms_start_ammo_cells 180
+set g_lms_start_ammo_plasma 180
+set g_lms_start_ammo_fuel 0
+set g_balance_nix_roundtime 25
+set g_balance_nix_incrtime 1.6
+set g_balance_nix_ammo_shells 60
+set g_balance_nix_ammo_nails 320
+set g_balance_nix_ammo_rockets 160
+set g_balance_nix_ammo_cells 180
+set g_balance_nix_ammo_plasma 180
+set g_balance_nix_ammo_fuel 100
+set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
+set g_balance_nix_ammoincr_nails 6
+set g_balance_nix_ammoincr_rockets 2
+set g_balance_nix_ammoincr_cells 2
+set g_balance_nix_ammoincr_plasma 2
+set g_balance_nix_ammoincr_fuel 2
+// }}}
+
+// {{{ pickup items
+set g_pickup_ammo_anyway 1
+set g_pickup_weapons_anyway 1
+set g_pickup_shells 15
+set g_pickup_shells_weapon 15
+set g_pickup_shells_max 60
+set g_pickup_nails 80
+set g_pickup_nails_weapon 80
+set g_pickup_nails_max 320
+set g_pickup_rockets 40
+set g_pickup_rockets_weapon 40
+set g_pickup_rockets_max 160
+set g_pickup_cells 30
+set g_pickup_cells_weapon 30
+set g_pickup_cells_max 180
+set g_pickup_plasma 30
+set g_pickup_plasma_weapon 30
+set g_pickup_plasma_max 180
+set g_pickup_fuel 50
+set g_pickup_fuel_weapon 50
+set g_pickup_fuel_jetpack 100
+set g_pickup_fuel_max 100
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 200
+set g_pickup_armorsmall_anyway 0
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 100
+set g_pickup_armormedium_anyway 0
+set g_pickup_armorbig 50
+set g_pickup_armorbig_max 100
+set g_pickup_armorbig_anyway 0
+set g_pickup_armormega 100
+set g_pickup_armormega_max 200
+set g_pickup_armormega_anyway 0
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_anyway 0
+set g_pickup_healthmedium 25
+set g_pickup_healthmedium_max 100
+set g_pickup_healthmedium_anyway 0
+set g_pickup_healthbig 50
+set g_pickup_healthbig_max 100
+set g_pickup_healthbig_anyway 0
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 200
+set g_pickup_healthmega_anyway 0
+set g_pickup_respawntime_short 15
+set g_pickup_respawntime_medium 20
+set g_pickup_respawntime_long 30
+set g_pickup_respawntime_powerup 120
+set g_pickup_respawntime_weapon 10
+set g_pickup_respawntime_superweapon 120
+set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 1
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 0
+set g_pickup_respawntimejitter_weapon 0
+set g_pickup_respawntimejitter_superweapon 10
+set g_pickup_respawntimejitter_ammo 0
+// }}}
+
+// {{{ regen/rot
+set g_balance_health_regen 0.08
+set g_balance_health_regenlinear 0.5
+set g_balance_pause_health_regen 5
+set g_balance_pause_health_regen_spawn 0
+set g_balance_health_rot 0.02
+set g_balance_health_rotlinear 1
+set g_balance_pause_health_rot 1
+set g_balance_pause_health_rot_spawn 5
+set g_balance_health_regenstable 100
+set g_balance_health_rotstable 100
+set g_balance_health_limit 200
+set g_balance_armor_regen 0
+set g_balance_armor_regenlinear 0
+set g_balance_armor_rot 0.02
+set g_balance_armor_rotlinear 1
+set g_balance_pause_armor_rot 1
+set g_balance_pause_armor_rot_spawn 5
+set g_balance_armor_regenstable 100
+set g_balance_armor_rotstable 100
+set g_balance_armor_limit 200
+set g_balance_armor_blockpercent 0.7
+set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
+set g_balance_fuel_regenlinear 0
+set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
+set g_balance_fuel_rot 0.05
+set g_balance_fuel_rotlinear 0
+set g_balance_pause_fuel_rot 5
+set g_balance_pause_fuel_rot_spawn 10
+set g_balance_fuel_regenstable 50
+set g_balance_fuel_rotstable 100
+set g_balance_fuel_limit 100
+// }}}
+
+// {{{ misc
+set g_balance_selfdamagepercent 0.65
+set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
+set g_weaponratefactor 1 "weapon fire rate multiplier"
+set g_weapondamagefactor 1 "weapon damage multiplier"
+set g_weaponforcefactor 1 "weapon force multiplier"
+set g_weaponspreadfactor 1 "weapon spread multiplier"
+set g_balance_firetransfer_time 0.9
+set g_balance_firetransfer_damage 0.8
+set g_throughfloor_damage 0.75
+set g_throughfloor_force 0.75
+set g_projectiles_damage -2
+// possible values:
+// -2: absolutely no damage to projectiles (no exceptions)
+// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
+// 0: only damage from contents (lava/slime) or exceptions
+// 1: only self damage or damage from contents or exceptions
+// 2: allow all damage to projectiles normally
+set g_projectiles_keep_owner 1
+set g_projectiles_newton_style 0
+// possible values:
+// 0: absolute velocity projectiles (like Quake)
+// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
+// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
+set g_projectiles_newton_style_2_minfactor 0.8
+set g_projectiles_newton_style_2_maxfactor 1.5
+set g_projectiles_spread_style 7
+// possible values:
+// 0: forward + solid sphere (like Quake) - varies velocity
+// 1: forward + flattened solid sphere
+// 2: forward + solid circle
+// 3: forward + normal distribution 3D - varies velocity
+// 4: forward + normal distribution on a plane
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
+// 7: forward + circle with (1-r)(2-r) falloff
+set g_balance_falldamage_deadminspeed 250
+set g_balance_falldamage_minspeed 900
+set g_balance_falldamage_factor 0.20
+set g_balance_falldamage_maxdamage 40
+set g_balance_damagepush_speedfactor 2.5
+set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
+set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
+set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
+set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
+set g_balance_contents_playerdamage_lava_burn 0 // extra burning damage after leaving lava
+set g_balance_contents_playerdamage_lava_burn_time 2.5 // time across which the damage is applied (note: not dps!)
+set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
+set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
+set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
+// }}}
+
+// {{{ powerups
+set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
+set g_balance_powerup_invincible_time 30
+set g_balance_powerup_strength_damage 3
+set g_balance_powerup_strength_force 3
+set g_balance_powerup_strength_time 30
+set g_balance_powerup_strength_selfdamage 1.5
+set g_balance_powerup_strength_selfforce 1.5
+set g_balance_superweapons_time 30
+// }}}
+
+// {{{ jetpack/hook
+set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
+set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
+set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
+set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
+set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
+set g_jetpack_fuel 8 "fuel per second for jetpack"
+set g_jetpack_reverse_thrust 0 "if not 0, downward acceleration when crouching with the jetpack"
+
+set g_grappling_hook_tarzan 2 // 2: can also pull players
+set g_balance_grapplehook_speed_fly 1800
+set g_balance_grapplehook_speed_pull 2000
+set g_balance_grapplehook_force_rubber 2000
+set g_balance_grapplehook_force_rubber_overstretch 1000
+set g_balance_grapplehook_length_min 50
+set g_balance_grapplehook_stretch 50
+set g_balance_grapplehook_airfriction 0.2
+set g_balance_grapplehook_health 50
+set g_balance_grapplehook_damagedbycontents 1
+set g_balance_grapplehook_refire 0.2
+set g_balance_grapplehook_nade_time 0.7
+set g_balance_grapplehook_crouchslide 0
+set g_balance_grapplehook_gravity 0
+set g_balance_grapplehook_pull_frozen 0
+// }}}
+
+// {{{ port-o-launch
+set g_balance_portal_health 200 // these get recharged whenever the portal is used
+set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
+// }}}
+
+exec bal-wep-testingxpm.cfg
index 3bdf7909633a288625182623498ba8a4106bc8b7..3046579ae4788b2524c51474aaf8b86590d10ead 100644 (file)
@@ -121,7 +121,7 @@ bind F2 vno
 bind F3 spec
 
 // usercommands. These can be edited and bound by the menu.
-seta "userbind1_press" "say_team quad soon";  seta "userbind1_release" "";  seta "userbind1_description" "team: quad soon"
+seta "userbind1_press" "say_team strength soon";  seta "userbind1_release" "";  seta "userbind1_description" "team: strength soon"
 seta "userbind2_press" "say_team free item %x^7 (l:%y^7); g_waypointsprite_team_here_p";  seta "userbind2_release" "";  seta "userbind2_description" "team: free item, icon"
 seta "userbind3_press" "say_team took item (l:%l^7); g_waypointsprite_team_here";  seta "userbind3_release" "";  seta "userbind3_description" "team: took item, icon"
 seta "userbind4_press" "say_team negative";  seta "userbind4_release" "";  seta "userbind4_description" "team: negative"
index d5da481b9794517a219a0879092a01bf01c64c0a..5a5667c8c31a53f3b6443488db13c40c665daa57 100644 (file)
@@ -83,7 +83,7 @@ alias g_hitplots_remove "qc_cmd_svmenu rpn /g_hitplots_individuals g_hitplots_in
 
 alias g_maplist_add    "qc_cmd_svmenu maplist add ${* ?}"
 alias g_maplist_remove "qc_cmd_svmenu maplist remove ${* ?}"
-alias g_maplist_putfirst       "qc_cmd_svmenu maplist remove ${* ?} ; qc_cmd maplist add ${* ?}"
+alias g_maplist_putfirst       "qc_cmd_svmenu maplist remove ${* ?} ; qc_cmd_svmenu maplist add ${* ?}"
 alias g_maplist_shufflenow     "qc_cmd_svmenu maplist shuffle"
 alias g_maplist_cleanup        "qc_cmd_svmenu maplist cleanup" // removes maps that don't exist from the map list
 
@@ -235,6 +235,8 @@ alias warp                 "qc_cmd_sv     warp                 ${* ?}" // Choose
 
 // other aliases for server commands
 alias endmatch "timelimit -1"
+alias bots "minplayers 4; minplayers_per_team 2"
+alias nobots "minplayers 0; minplayers_per_team 0"
 
 alias savedb "sv_cmd database save \"${1 ?}\""
 alias dumpdb "sv_cmd database dump \"${1 ?}\""
@@ -322,13 +324,13 @@ set sv_vote_command_help_gotomap "\nUsage:^3 vcall gotomap mapname\n^7  Where 'm
 // =================================
 set sv_vote_call 1 "Allow users to call a vote for the commands in sv_vote_commands"
 set sv_vote_change 1 "Allow voters to change their mind after already voting"
-set sv_vote_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoauto shuffleteams" "these commands can be voted"
+set sv_vote_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoauto shuffleteams bots nobots" "these commands can be voted by players or used directly by masters (vdo) in addition to sv_vote_master_commands"
 set sv_vote_only_commands ""
 set sv_vote_limit 160 "Maximum allowed length of a vote command"
-set sv_vote_master_commands "movetored movetoblue movetoyellow movetopink movetospec " "Extra commands which vote masters can execute by themselves, along with the normal sv_vote_commands." // maybe add kickban here (but then sv_vote_master 0)
+set sv_vote_master_commands "movetored movetoblue movetoyellow movetopink movetospec" "Extra commands which vote masters can execute by themselves, along with the normal sv_vote_commands." // maybe add kickban here (but then sv_vote_master 0)
 set sv_vote_master 0   "Allows the use of the vote master system"
 set sv_vote_master_callable 0 "When set, users can use \"vmaster\" to call a vote to become master of voting commands"
-set sv_vote_master_password "" "when set, users can use \"vlogin PASSWORD\" to log in as master"
+set sv_vote_master_password "" "when set, users can use \"vlogin PASSWORD\" to log in as master, then run master commands directly using vdo"
 set sv_vote_master_playerlimit 2 "Minimum number of players needed for a player to be allowed to vote for master"
 set sv_vote_no_stops_vote 1 "Allow the vote caller to stop his own vote simply by voting no"
 set sv_vote_singlecount 0      "set to 1 to count votes once after timeout or to 0 to count with every vote"
@@ -372,4 +374,4 @@ alias vext "vcall extendmatchtime"
 //  rcon server commands
 // ======================
 rcon_secure 1
-set rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban *\" status \"sv_cmd teamstatus\" movetoauto movetored movetoblue movetoyellow movetopink movetospec"
+set rcon_restricted_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoauto shuffleteams bots nobots movetored movetoblue movetoyellow movetopink movetospec kickban \"sv_cmd bans\" \"sv_cmd unban *\" status \"sv_cmd teamstatus\""
index 3ef1de28097b0d08d3b6bdd5abdf6367063fa472..1b8dbda4fd945500b5a3f3672c00affece71d20c 100644 (file)
@@ -4,6 +4,8 @@
 #
 # Translators:
 # Martin Taibr <taibr.martin@gmail.com>, 2017
+# GamingasCZ <gamingforyou875@gmail.com>, 2019
+# Jan Kocka <kockahonza@gmail.com>, 2019
 # Martin Taibr <taibr.martin@gmail.com>, 2017
 # NONE <nechtom@gmail.com>, 2015
 # Tomáš Volavka <czheron@gmail.com>, 2015,2018
@@ -13,8 +15,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-11-27 23:34+0000\n"
+"Last-Translator: Jan Kocka <kockahonza@gmail.com>\n"
 "Language-Team: Czech (http://www.transifex.com/team-xonotic/xonotic/language/"
 "cs/)\n"
 "Language: cs\n"
@@ -27,12 +29,12 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:243
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr ""
+msgstr "^2Úspěšně exportováno do %s! (Poznámka: Uloženo v data/data/)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
 msgid "^1Couldn't write to %s"
-msgstr ""
+msgstr "^1Nešlo zapsat do 1%s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
@@ -45,15 +47,17 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Víceřádková zpráva v čase %s že\n"
+"^1trvá déle než normálně"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Zpráva v čase %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "Obecná zpráva"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -126,7 +130,7 @@ msgstr "^1Stiskni ^3%s^1 pro informace o herním módu"
 #: qcsrc/client/hud/panel/infomessages.qc:113
 #: qcsrc/menu/xonotic/keybinder.qc:105
 msgid "server info"
-msgstr ""
+msgstr "info o serveru"
 
 #: qcsrc/client/hud/panel/infomessages.qc:126
 msgid "^1Match has already begun"
@@ -154,12 +158,12 @@ msgstr "^1Hra začíná za ^3%d^1 sekund"
 
 #: qcsrc/client/hud/panel/infomessages.qc:147
 msgid "^2Currently in ^1warmup^2 stage!"
-msgstr ""
+msgstr "^2Momentálně v ^1zahřívací^2 fázi!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:162
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
-msgstr ""
+msgstr "%sZmáčkni ^3%s%s pro ukončení zahřívací fáze"
 
 #: qcsrc/client/hud/panel/infomessages.qc:162
 #: qcsrc/client/hud/panel/infomessages.qc:164
@@ -171,20 +175,20 @@ msgstr ""
 #: qcsrc/client/hud/panel/infomessages.qc:164
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr ""
+msgstr "%sZmáčkni ^3%s%s až budeš připravený"
 
 #: qcsrc/client/hud/panel/infomessages.qc:169
 msgid "^2Waiting for others to ready up to end warmup..."
-msgstr ""
+msgstr "^2Čeká se než ostatní hráči ukončí zahřívací fázi..."
 
 #: qcsrc/client/hud/panel/infomessages.qc:171
 msgid "^2Waiting for others to ready up..."
-msgstr ""
+msgstr "^2Čeká se než budou ostatní hráči připraveni..."
 
 #: qcsrc/client/hud/panel/infomessages.qc:177
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
-msgstr ""
+msgstr "^2Zmáčkni ^3%s^2 pro ukončení zahřívací fáze"
 
 #: qcsrc/client/hud/panel/infomessages.qc:198
 msgid "Teamnumbers are unbalanced!"
@@ -193,24 +197,24 @@ msgstr "Týmy jsou nevyvážené"
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #, c-format
 msgid " Press ^3%s%s to adjust"
-msgstr ""
+msgstr " Zmáčkni ^3%s%s pro upravení"
 
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #: qcsrc/menu/xonotic/keybinder.qc:117
 msgid "team menu"
-msgstr ""
+msgstr "týmové menu"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1Sleduješ tohoto hráče:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1Sledují tě:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:227
 msgid "^7Press ^3ESC ^7to show HUD options."
-msgstr ""
+msgstr "^7Zmáčkni ^3ESC ^7pro zobrazení nastavení HUD."
 
 #: qcsrc/client/hud/panel/infomessages.qc:228
 msgid "^3Doubleclick ^7a panel for panel-specific options."
@@ -247,49 +251,49 @@ msgstr ""
 #: qcsrc/client/hud/panel/quickmenu.qc:598
 #, c-format
 msgid "Command%d"
-msgstr ""
+msgstr "Příkaz%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:624
 msgid "Continue..."
-msgstr ""
+msgstr "Pokračovat..."
 
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^Poslat veřejnou zprávu do"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
-msgstr ""
+msgstr "QMCMD^:-) / hezký"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^nice one"
-msgstr ""
+msgstr "QMCMD^hezký"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:784
 msgid "QMCMD^good game"
-msgstr ""
+msgstr "QMCMD^dobrá hra"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck"
-msgstr ""
+msgstr "QMCMD^ahoj/hodně štěstí"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck and have fun"
-msgstr ""
+msgstr "QMCMD^ahoj/hodně štěstí a užijte si hru"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
-msgstr ""
+msgstr "QMCMD^Pošli v angličtině"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^Team chat"
-msgstr ""
+msgstr "QMCMD^Týmový chat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
@@ -596,7 +600,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "Number of deaths"
-msgstr ""
+msgstr "Počet smrtí"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
@@ -616,7 +620,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
-msgstr ""
+msgstr "Celkový udělený damage"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
@@ -8501,11 +8505,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:40
 msgid "Up"
-msgstr ""
+msgstr "Nahoru"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:44
 msgid "Down"
-msgstr ""
+msgstr "Dolů"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:50
 msgid "Use priority list for weapon cycling"
@@ -8518,17 +8522,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:53
 msgid "Cycle through only usable weapon selections"
-msgstr ""
+msgstr "Cyklovat jen mezi použitelnými výběry zbraní"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:57
 msgid "Auto switch weapons on pickup"
-msgstr ""
+msgstr "Automaticky měnit zbraň po sebrání"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:58
 msgid ""
 "Automatically switch to newly picked up weapons if they are better than what "
 "you are carrying"
 msgstr ""
+"Automaticky změnit na právě sebranou zbraň, jestli je novější lepší než "
+"starší"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:61
 msgid "Release attack buttons when you switch weapons"
@@ -8563,39 +8569,39 @@ msgstr "Zbraně"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:34
 msgid "Key Bindings"
-msgstr ""
+msgstr "Klávesové zkratky"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:38
 msgid "Change key..."
-msgstr ""
+msgstr "Změnit klávesu"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:42
 msgid "Edit..."
-msgstr ""
+msgstr "Upravit"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:48
 msgid "Clear"
-msgstr ""
+msgstr "Vymazat"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:53
 msgid "Reset all"
-msgstr ""
+msgstr "Resetovat vše"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:58
 msgid "Mouse"
-msgstr ""
+msgstr "Myš"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:60
 msgid "Sensitivity:"
-msgstr ""
+msgstr "Sensitivita:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:62
 msgid "Mouse speed multiplier"
-msgstr ""
+msgstr "Násobič rychlosti myši"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:64
 msgid "Smooth aiming"
-msgstr ""
+msgstr "Jemné míření"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:65
 msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
@@ -8603,7 +8609,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:67
 msgid "Invert aiming"
-msgstr ""
+msgstr "Invertovat míření"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:68
 msgid "Invert mouse movement on the Y-axis"
@@ -8615,13 +8621,13 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:75
 msgid "Enable built in mouse acceleration"
-msgstr ""
+msgstr "Použít zabudované zrychlení myši"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:79
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:83
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:86
 msgid "Disable system mouse acceleration"
-msgstr ""
+msgstr "Zakázat systémové zrychlení myši"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:80
 msgid "Make use of DGA mouse input"
@@ -8649,7 +8655,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:103
 msgid "Air only"
-msgstr ""
+msgstr "Jen vzduch"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:104
 msgid "JPJUMP^All"
@@ -8659,7 +8665,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:115
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:120
 msgid "Use joystick input"
-msgstr ""
+msgstr "Použít vstup joysticku"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
 msgid "Command when pressed:"
@@ -8671,30 +8677,30 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
 msgid "Cancel"
-msgstr ""
+msgstr "Zrušit"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
 msgid "User defined key bind"
-msgstr ""
+msgstr "Uživatelem definovaná kláv. zkratka"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
 #, c-format
 msgid "%d fps"
-msgstr ""
+msgstr "%d fps"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
 #, c-format
 msgid "%d KB/s"
-msgstr ""
+msgstr "%d KB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
 #, c-format
 msgid "%d MB/s"
-msgstr ""
+msgstr "%d MB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
 msgid "Network"
-msgstr ""
+msgstr "Síť"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
 msgid "Client UDP port:"
@@ -8710,7 +8716,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
 msgid "Specify your network speed"
-msgstr ""
+msgstr "Upřesní svou rychlost internetu"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
 msgid "56k"
@@ -8718,15 +8724,15 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
 msgid "ISDN"
-msgstr ""
+msgstr "ISDN"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
 msgid "Slow ADSL"
-msgstr ""
+msgstr "Pomalé ADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
 msgid "Fast ADSL"
-msgstr ""
+msgstr "Rychlé ADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
 msgid "Broadband"
@@ -8746,7 +8752,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
 msgid "Downloads:"
-msgstr ""
+msgstr "Stahování:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:54
 msgid "Maximum number of concurrent HTTP/FTP downloads"
@@ -8754,7 +8760,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:56
 msgid "Download speed:"
-msgstr ""
+msgstr "Rychlost stahování:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
 msgid "Local latency:"
@@ -8786,7 +8792,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:87
 msgid "Maximum:"
-msgstr ""
+msgstr "Maximum:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:99
 msgid "MAXFPS^Unlimited"
@@ -8794,7 +8800,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:102
 msgid "Target:"
-msgstr ""
+msgstr "Cíl:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:104
 msgid "TRGT^Disabled"
@@ -8814,11 +8820,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:129
 msgid "Show frames per second"
-msgstr ""
+msgstr "Ukázat snímky za sekundu"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
 msgid "Show your rendered frames per second"
-msgstr ""
+msgstr "Ukáže tvé vyrenderované snímky za sekundu"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:135
 msgid "Menu tooltips:"
@@ -8844,23 +8850,23 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:143
 msgid "Show current date and time"
-msgstr ""
+msgstr "Ukázat aktuální datum a čas"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:144
 msgid "Show current date and time of day, useful on screenshots"
-msgstr ""
+msgstr "Ukázat aktuální datum a čas, užitečné na snímcích obrazovky"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:147
 msgid "Enable developer mode"
-msgstr ""
+msgstr "Povolit vývojářský režim"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:151
 msgid "Advanced settings..."
-msgstr ""
+msgstr "Pokročilé nastavení..."
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:152
 msgid "Advanced settings where you can tweak every single variable of the game"
-msgstr ""
+msgstr "Pokročilé nastavení, kde můžeš měnit každou proměnou ve hře"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:157
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
@@ -8869,43 +8875,43 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
 msgid "Cvar filter:"
-msgstr ""
+msgstr "Filtr cvar:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
 msgid "Modified cvars only"
-msgstr ""
+msgstr "Jen modifikované cvary"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
 msgid "Setting:"
-msgstr ""
+msgstr "Nastavení:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:49
 msgid "Type:"
-msgstr ""
+msgstr "Typ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:53
 msgid "Value:"
-msgstr ""
+msgstr "Hodnota:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:70
 msgid "Description:"
-msgstr ""
+msgstr "Popis:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qh:7
 msgid "Advanced settings"
-msgstr ""
+msgstr "Pokročilé nastavení"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
 msgid "Are you sure you want to reset all settings?"
-msgstr ""
+msgstr "Jsi si jistý, že chceš resetovat všechna nastavení?"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
 msgid "This will create a backup config in your data directory"
-msgstr ""
+msgstr "Tohle vytvoří zálohu configu v tvé data složce"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:25
 msgid "Menu Skins"
-msgstr ""
+msgstr "Skiny menu"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:64
 msgid "Text Language"
@@ -8913,11 +8919,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:69
 msgid "Set language"
-msgstr ""
+msgstr "Nastavit jazyk"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:74
 msgid "Disable gore effects and harsh language"
-msgstr ""
+msgstr "Zakázat násilí a sprostý jazyk"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:75
 msgid "Replace blood and gibs with content that does not have any gore effects"
@@ -8933,23 +8939,23 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
 msgid "Disconnect now"
-msgstr ""
+msgstr "Odpojit teď"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
 msgid "Switch language"
-msgstr ""
+msgstr "Změnit jazyk"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qh:6
 msgid "Warning"
-msgstr ""
+msgstr "Varování"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:33
 msgid "Resolution:"
-msgstr ""
+msgstr "Rozlišení:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:37
 msgid "Font/UI size:"
-msgstr ""
+msgstr "Velikost písma/UI"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:39
 msgid "SZ^Unreadable"
@@ -8989,7 +8995,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:51
 msgid "Color depth:"
-msgstr ""
+msgstr "Hloubka barev:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:53
 msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
@@ -8997,19 +9003,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:54
 msgid "16bit"
-msgstr ""
+msgstr "16bitový"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:55
 msgid "32bit"
-msgstr ""
+msgstr "32bitový"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:59
 msgid "Full screen"
-msgstr ""
+msgstr "Celá obrazovka"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:61
 msgid "Vertical Synchronization"
-msgstr ""
+msgstr "Vertikální synchronizace"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:62
 msgid ""
@@ -9031,7 +9037,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:73
 msgid "Anisotropic filtering quality"
-msgstr ""
+msgstr "Kvalita anizotropního filtrování"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:74
 msgid "ANISO^Disabled"
@@ -9040,20 +9046,20 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:75
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:86
 msgid "2x"
-msgstr ""
+msgstr "2x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:76
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:87
 msgid "4x"
-msgstr ""
+msgstr "4x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:77
 msgid "8x"
-msgstr ""
+msgstr "8x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:78
 msgid "16x"
-msgstr ""
+msgstr "16x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:81
 msgid "Antialiasing:"
@@ -9075,7 +9081,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:97
 msgid "Depth first:"
-msgstr ""
+msgstr "Hloubka prvně:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:99
 msgid ""
@@ -9125,23 +9131,23 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:119
 msgid "Brightness:"
-msgstr ""
+msgstr "Jas:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:121
 msgid "Brightness of black"
-msgstr ""
+msgstr "Jas černé"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:123
 msgid "Contrast:"
-msgstr ""
+msgstr "Kontrast:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:125
 msgid "Brightness of white"
-msgstr ""
+msgstr "Jas bílé"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:127
 msgid "Gamma:"
-msgstr ""
+msgstr "Gamma:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:130
 msgid ""
@@ -9155,17 +9161,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:136
 msgid "By how much to multiply the contrast in dark areas"
-msgstr ""
+msgstr "Kolikati násobit kontrast v tmavých oblastech"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:139
 msgid "Saturation:"
-msgstr ""
+msgstr "Sytost:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:142
 msgid ""
 "Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
 "requires GLSL color control"
 msgstr ""
+"Upravení sytosti (0 = černobílé, 1 = normální, 2 = přesycené), potřebuje "
+"kontrolování barev GLSL "
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:146
 msgid "LIT^Ambient:"
@@ -9179,15 +9187,15 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:150
 msgid "Intensity:"
-msgstr ""
+msgstr "Intenzita:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:152
 msgid "Global rendering brightness"
-msgstr ""
+msgstr "Globální jas renderování"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:155
 msgid "Wait for GPU to finish each frame"
-msgstr ""
+msgstr "Počkat než GPU dokončí každý snímek"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:156
 msgid ""
@@ -9197,7 +9205,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:158
 msgid "Use OpenGL 2.0 shaders (GLSL)"
-msgstr ""
+msgstr "Použít OpenGL 2.0 shadery (GLSL)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:162
 msgid "Use GLSL to handle color control"
@@ -9219,7 +9227,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:110
 msgid "Instant action! (random map with bots)"
-msgstr ""
+msgstr "Instantní akce! (náhodná mapa s boty)"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:117
 msgid "???"
@@ -9243,11 +9251,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:135
 msgid "Start Singleplayer!"
-msgstr ""
+msgstr "Začít hru jednoho hráče"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
 msgid "Singleplayer"
-msgstr ""
+msgstr "Hra jednoho hráče"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
 msgid "Play the singleplayer campaign or instant action matches against bots"
@@ -9255,31 +9263,31 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
 msgid "Winner"
-msgstr ""
+msgstr "Vítěz"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:32
 msgid "join 'best' team (auto-select)"
-msgstr ""
+msgstr "připojit se k 'nejlepšímu' týmu (automatický výběr)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:33
 msgid "Autoselect team (recommended)"
-msgstr ""
+msgstr "Automaticky vybrat tým (doporučeno)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:37
 msgid "red"
-msgstr ""
+msgstr "červená"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:38
 msgid "blue"
-msgstr ""
+msgstr "modrá"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:39
 msgid "yellow"
-msgstr ""
+msgstr "žlutá"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:40
 msgid "pink"
-msgstr ""
+msgstr "růžová"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:43
 msgid "spectate"
@@ -9287,15 +9295,15 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qh:7
 msgid "Team Selection"
-msgstr ""
+msgstr "Vybírání týmů"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:10
 msgid "Allow player statistics to use your nickname?"
-msgstr ""
+msgstr "Povolit používání Vaší přezdívky v hráčské statistice?"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:12
 msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr ""
+msgstr "Pokud odpovíš \"ne\", objevíš se jako \"Anonymní hráč\""
 
 #: qcsrc/menu/xonotic/gametypelist.qc:87
 msgid "teamplay"
@@ -9311,7 +9319,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:36
 msgid "forward"
-msgstr ""
+msgstr "dopředu"
 
 #: qcsrc/menu/xonotic/keybinder.qc:37
 msgid "backpedal"
@@ -9339,11 +9347,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:43
 msgid "jetpack"
-msgstr ""
+msgstr "jetpack"
 
 #: qcsrc/menu/xonotic/keybinder.qc:46
 msgid "Attacking"
-msgstr ""
+msgstr "Útočení"
 
 #: qcsrc/menu/xonotic/keybinder.qc:52
 msgid "WEAPON^previous"
@@ -9379,19 +9387,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:88
 msgid "show scores"
-msgstr ""
+msgstr "ukázat skóre"
 
 #: qcsrc/menu/xonotic/keybinder.qc:89
 msgid "screen shot"
-msgstr ""
+msgstr "snímek obrazovky"
 
 #: qcsrc/menu/xonotic/keybinder.qc:90
 msgid "maximize radar"
-msgstr ""
+msgstr "maximalizovat radar"
 
 #: qcsrc/menu/xonotic/keybinder.qc:91
 msgid "3rd person view"
-msgstr ""
+msgstr "pohled 3. osoby"
 
 #: qcsrc/menu/xonotic/keybinder.qc:92
 msgid "enter spectator mode"
@@ -9399,43 +9407,43 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:95
 msgid "Communicate"
-msgstr ""
+msgstr "Komunikovat"
 
 #: qcsrc/menu/xonotic/keybinder.qc:96
 msgid "public chat"
-msgstr ""
+msgstr "veřejný chat"
 
 #: qcsrc/menu/xonotic/keybinder.qc:97 qcsrc/menu/xonotic/keybinder.qc:115
 msgid "team chat"
-msgstr ""
+msgstr "týmový chat"
 
 #: qcsrc/menu/xonotic/keybinder.qc:98
 msgid "show chat history"
-msgstr ""
+msgstr "ukázat historii chatu"
 
 #: qcsrc/menu/xonotic/keybinder.qc:99
 msgid "vote YES"
-msgstr ""
+msgstr "volit ANO"
 
 #: qcsrc/menu/xonotic/keybinder.qc:100
 msgid "vote NO"
-msgstr ""
+msgstr "volit NE"
 
 #: qcsrc/menu/xonotic/keybinder.qc:104
 msgid "Client"
-msgstr ""
+msgstr "Klient"
 
 #: qcsrc/menu/xonotic/keybinder.qc:108
 msgid "enter console"
-msgstr ""
+msgstr "vstoupit do konzole"
 
 #: qcsrc/menu/xonotic/keybinder.qc:110
 msgid "disconnect"
-msgstr ""
+msgstr "odpojit"
 
 #: qcsrc/menu/xonotic/keybinder.qc:111
 msgid "quit"
-msgstr ""
+msgstr "opustit"
 
 #: qcsrc/menu/xonotic/keybinder.qc:116
 msgid "auto-join team"
@@ -9467,7 +9475,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/mainwindow.qc:65 qcsrc/menu/xonotic/mainwindow.qc:68
 msgid "Do not press this button again!"
-msgstr ""
+msgstr "Neklikej znova na tohle tlačítko!"
 
 #: qcsrc/menu/xonotic/maplist.qc:288
 msgid ""
@@ -9491,21 +9499,22 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/playermodel.qc:161
 msgid "<no model found>"
-msgstr ""
+msgstr "<no model found>"
 
 #: qcsrc/menu/xonotic/serverlist.qc:267
 msgid "Favorite"
-msgstr ""
+msgstr "Oblíbené"
 
 #: qcsrc/menu/xonotic/serverlist.qc:268
 msgid ""
 "Bookmark the currently highlighted server so that it's faster to find in the "
 "future"
 msgstr ""
+"Přidat označený server do záložek, aby byl jednodušší najít v budoucnosti."
 
 #: qcsrc/menu/xonotic/serverlist.qc:747
 msgid "Ping"
-msgstr ""
+msgstr "Odezva"
 
 #: qcsrc/menu/xonotic/serverlist.qc:748
 msgid "Hostname"
@@ -9513,11 +9522,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/serverlist.qc:749
 msgid "Map"
-msgstr ""
+msgstr "Mapa"
 
 #: qcsrc/menu/xonotic/serverlist.qc:750
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1043
 #, c-format
@@ -9530,7 +9539,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/serverlist.qc:1043
 msgid "encryption:"
-msgstr ""
+msgstr "šifrování:"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1044
 #, c-format
@@ -9540,20 +9549,20 @@ msgstr ""
 #: qcsrc/menu/xonotic/serverlist.qc:1046
 #, c-format
 msgid "modified settings"
-msgstr ""
+msgstr "modifikované nastavení"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1046
 #, c-format
 msgid "official settings"
-msgstr ""
+msgstr "oficiální nastavení"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1048
 msgid "stats disabled"
-msgstr ""
+msgstr "statistiky zakázány"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1048
 msgid "stats enabled"
-msgstr ""
+msgstr "statistiky povoleny"
 
 #: qcsrc/menu/xonotic/serverlist.qh:152
 msgid "SLCAT^Favorites"
@@ -9593,11 +9602,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/skinlist.qc:70
 msgid "<TITLE>"
-msgstr ""
+msgstr "<TITLE>"
 
 #: qcsrc/menu/xonotic/skinlist.qc:71
 msgid "<AUTHOR>"
-msgstr ""
+msgstr "<AUTHOR>"
 
 #: qcsrc/menu/xonotic/slider_decibels.qc:72
 msgid "VOL^MAX"
@@ -9610,7 +9619,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/slider_decibels.qc:82
 #, c-format
 msgid "%s dB"
-msgstr ""
+msgstr "%s db"
 
 #: qcsrc/menu/xonotic/slider_particles.qc:14
 msgid "PART^OMG"
@@ -9649,7 +9658,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/slider_resolution.qc:115
 msgid "Screen resolution"
-msgstr ""
+msgstr "Rozlišení obrazovky"
 
 #: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
 msgid "PART^Slow"
@@ -9665,51 +9674,51 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/statslist.qc:29
 msgid "January"
-msgstr ""
+msgstr "Leden"
 
 #: qcsrc/menu/xonotic/statslist.qc:30
 msgid "February"
-msgstr ""
+msgstr "Únor"
 
 #: qcsrc/menu/xonotic/statslist.qc:31
 msgid "March"
-msgstr ""
+msgstr "Březen"
 
 #: qcsrc/menu/xonotic/statslist.qc:32
 msgid "April"
-msgstr ""
+msgstr "Duben"
 
 #: qcsrc/menu/xonotic/statslist.qc:33
 msgid "May"
-msgstr ""
+msgstr "Květen"
 
 #: qcsrc/menu/xonotic/statslist.qc:34
 msgid "June"
-msgstr ""
+msgstr "Červen"
 
 #: qcsrc/menu/xonotic/statslist.qc:35
 msgid "July"
-msgstr ""
+msgstr "Červenec"
 
 #: qcsrc/menu/xonotic/statslist.qc:36
 msgid "August"
-msgstr ""
+msgstr "Srpen"
 
 #: qcsrc/menu/xonotic/statslist.qc:37
 msgid "September"
-msgstr ""
+msgstr "Září"
 
 #: qcsrc/menu/xonotic/statslist.qc:38
 msgid "October"
-msgstr ""
+msgstr "Říjen"
 
 #: qcsrc/menu/xonotic/statslist.qc:39
 msgid "November"
-msgstr ""
+msgstr "Listopad"
 
 #: qcsrc/menu/xonotic/statslist.qc:40
 msgid "December"
-msgstr ""
+msgstr "Prosinec"
 
 #: qcsrc/menu/xonotic/statslist.qc:96
 msgid "Joined:"
@@ -9717,26 +9726,26 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/statslist.qc:103
 msgid "Last match:"
-msgstr ""
+msgstr "Poslední zápas:"
 
 #: qcsrc/menu/xonotic/statslist.qc:110
 msgid "Time played:"
-msgstr ""
+msgstr "Odehraný čas:"
 
 #: qcsrc/menu/xonotic/statslist.qc:117 qcsrc/menu/xonotic/statslist.qc:230
 msgid "Favorite map:"
-msgstr ""
+msgstr "Oblíbená mapa:"
 
 #: qcsrc/menu/xonotic/statslist.qc:149 qcsrc/menu/xonotic/statslist.qc:201
 #: qcsrc/menu/xonotic/statslist.qc:244
 #, c-format
 msgid "Matches:"
-msgstr ""
+msgstr "Zápasy:"
 
 #: qcsrc/menu/xonotic/statslist.qc:154
 #, c-format
 msgid "Wins/Losses:"
-msgstr ""
+msgstr "Výhry/Prohry:"
 
 #: qcsrc/menu/xonotic/statslist.qc:155
 #, c-format
@@ -9772,7 +9781,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/util.qc:417
 msgid "Update can be downloaded at:"
-msgstr ""
+msgstr "Update je ke stažení na:"
 
 #: qcsrc/menu/xonotic/util.qc:525
 msgid "Autogenerating mapinfo for newly added maps..."
@@ -9786,7 +9795,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/util.qc:574
 #, c-format
 msgid "Update to %s now!"
-msgstr ""
+msgstr "Updatuj na 1%s teď!"
 
 #: qcsrc/menu/xonotic/util.qc:658
 msgid ""
@@ -9796,8 +9805,8 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/util.qc:788
 msgid "Use default"
-msgstr ""
+msgstr "Použít výchozí"
 
 #: qcsrc/menu/xonotic/util.qc:808
 msgid "Team Color:"
-msgstr ""
+msgstr "Barva týmu:"
index fdefde94ebe86b941e82145de1880d443d55c1a2..67d054ca62230cadabe9e8d3dbe83042fc733a63 100644 (file)
@@ -5,7 +5,7 @@
 # Translators:
 # afba88cf42cbdff57149d4a6d53a94f9, 2018
 # Wuzzy <almikes@aol.com>, 2016-2018
-# Brot Brot <noah.schluessel@gmail.com>, 2015
+# TheTrueBrot <noah.schluessel@gmail.com>, 2015
 # cvcxc <hans.andersen72@yahoo.com>, 2013
 # divVerent <divVerent@xonotic.org>, 2011,2013
 # divVerent <divVerent@xonotic.org>, 2013-2015
@@ -19,6 +19,7 @@
 # divVerent <divVerent@xonotic.org>, 2011
 # Sless <sless@gmx.net>, 2014
 # Sless <sless@gmx.net>, 2014
+# TheTrueBrot <noah.schluessel@gmail.com>, 2015
 # Wuzzy <almikes@aol.com>, 2016
 # Yepoleb <huberg18@gmail.com>, 2013
 msgid ""
@@ -26,8 +27,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-23 12:22+0000\n"
-"Last-Translator: Mirio <opivy@hotmail.de>\n"
+"PO-Revision-Date: 2019-11-09 23:02+0000\n"
+"Last-Translator: Wuzzy <almikes@aol.com>\n"
 "Language-Team: German (http://www.transifex.com/team-xonotic/xonotic/"
 "language/de/)\n"
 "Language: de\n"
@@ -187,7 +188,7 @@ msgstr "Bereit"
 #: qcsrc/client/hud/panel/infomessages.qc:164
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr "%sDrücke ^3%s%s, sobald Du bereit bist"
+msgstr "%sDrücke ^3%s%s, sobald du bereit bist"
 
 #: qcsrc/client/hud/panel/infomessages.qc:169
 msgid "^2Waiting for others to ready up to end warmup..."
@@ -235,7 +236,7 @@ msgstr "^3Doppelklicke ^7ein Panel für Panel-spezifische Optionen."
 
 #: qcsrc/client/hud/panel/infomessages.qc:229
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
-msgstr "^3CTRL^7, um Kollisionstests zu deaktivieren, ^3SHIFT ^7und"
+msgstr "^3STRG^7, um Kollisionstests zu deaktivieren, ^3UMSCHALT ^7und"
 
 #: qcsrc/client/hud/panel/infomessages.qc:230
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
@@ -281,259 +282,259 @@ msgstr "QMCMD^Sende öffentliche Nachricht an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
-msgstr ":-) / gut gemacht"
+msgstr "QMCMD^:-) / gut gemacht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^nice one"
-msgstr "gut gemacht"
+msgstr "QMCMD^Gut gemacht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:784
 msgid "QMCMD^good game"
-msgstr "gutes Spiel"
+msgstr "QMCMD^Gut gespielt"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck"
-msgstr "Hallo / Viel Glück"
+msgstr "QMCMD^Hallo / Viel Glück"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck and have fun"
-msgstr "Hallo / Viel Glück und habt Spaß"
+msgstr "QMCMD^Hallo / Viel Glück und habt Spaß"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
-msgstr "QMCMD^Sende in Englisch"
+msgstr "QMCMD^Auf Englisch senden"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^Team chat"
-msgstr "Teamchat"
+msgstr "QMCMD^Teamchat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
-msgstr "Quad kommt bald"
+msgstr "QMCMD^Quad kommt bald"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr "freier Gegenstand %x^7 (l:%y^7)"
+msgstr "QMCMD^Freier Gegenstand %x^7 (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item, icon"
-msgstr "freier Gegenstand, Icon"
+msgstr "QMCMD^Freier Gegenstand, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item (l:%l^7)"
-msgstr "Gegenstand genommen (l:%l^7)"
+msgstr "QMCMD^Gegenstand genommen (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item, icon"
-msgstr "Gegenstand genommen, Icon"
+msgstr "QMCMD^Gegenstand genommen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:796
 msgid "QMCMD^negative"
-msgstr "Negativ"
+msgstr "QMCMD^Negativ"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:797
 msgid "QMCMD^positive"
-msgstr "Positiv"
+msgstr "QMCMD^Positiv"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "brauche Hilfe (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Brauche Hilfe (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help, icon"
-msgstr "brauche Hilfe, Icon"
+msgstr "QMCMD^Brauche Hilfe, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen (l:%y^7)"
-msgstr "Gegner gesehen (l:%y^7)"
+msgstr "QMCMD^Gegner gesehen (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen, icon"
-msgstr "Gegner gesehen, icon"
+msgstr "QMCMD^Gegner gesehen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen (l:%y^7)"
-msgstr "Flagge gesehen (l:%y^7)"
+msgstr "QMCMD^Flagge gesehen (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen, icon"
-msgstr "Flagge gesehen, Icon"
+msgstr "QMCMD^Flagge gesehen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "verteidigen (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Verteidigend (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending, icon"
-msgstr "verteidigen, Icon"
+msgstr "QMCMD^Verteidigend, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "wandernd (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Wandernd (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming, icon"
-msgstr "wandernd, Icon"
+msgstr "QMCMD^Wandernd, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "angreifen (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Angreifend (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking, icon"
-msgstr "angreifen, Icon"
+msgstr "QMCMD^Angreifend, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier (l:%y^7)"
-msgstr "Flaggenträger getötet (l:%y^7)"
+msgstr "QMCMD^Flaggenträger getötet (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier, icon"
-msgstr "Flaggenträger getötet, Icon"
+msgstr "QMCMD^Flaggenträger getötet, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 #, c-format
 msgid "QMCMD^dropped flag (l:%d^7)"
-msgstr "Flagge fallen gelassen (l:%d^7)"
+msgstr "QMCMD^Flagge weggeworfen (l:%d^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 msgid "QMCMD^dropped flag, icon"
-msgstr "Flagge fallen gelassen, Icon"
+msgstr "QMCMD^Flagge weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^drop weapon, icon"
-msgstr "Waffe wegwerfen, Icon"
+msgstr "QMCMD^Waffe weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr "Waffe fallen gelassen %w^7 (l:%l^7)"
+msgstr "QMCMD^Waffe weggeworfen %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^drop flag/key, icon"
-msgstr "Flagge/Schlüssel fallen gelassen, Icon"
+msgstr "QMCMD^Flagge/Schlüssel weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
-msgstr "Flagge/Schlüssel fallen gelassen %w^7 (l:%l^7)"
+msgstr "QMCMD^Flagge/Schlüssel weggeworfen %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:811
 msgid "QMCMD^Send private message to"
-msgstr "Sende private Nachricht an"
+msgstr "QMCMD^Sende private Nachricht an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:813
 #: qcsrc/client/hud/panel/quickmenu.qc:848
 msgid "QMCMD^Settings"
-msgstr "Einstellungen"
+msgstr "QMCMD^Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:814
 #: qcsrc/client/hud/panel/quickmenu.qc:821
 msgid "QMCMD^View/HUD settings"
-msgstr "Ansicht/HUD-Einstellungen"
+msgstr "QMCMD^Ansicht/HUD-Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:815
 msgid "QMCMD^3rd person view"
-msgstr "Dritte-Person-Ansicht"
+msgstr "QMCMD^Dritte-Person-Ansicht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:816
 msgid "QMCMD^Player models like mine"
-msgstr "Spielermodelle wie meins"
+msgstr "QMCMD^Spielermodelle wie meins"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:817
 msgid "QMCMD^Names above players"
-msgstr "Namen über Spieler"
+msgstr "QMCMD^Namen über Spieler"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:818
 msgid "QMCMD^Crosshair per weapon"
-msgstr "Fadenkreuz je nach Waffe"
+msgstr "QMCMD^Fadenkreuz je nach Waffe"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:819
 msgid "QMCMD^FPS"
-msgstr "FPS"
+msgstr "QMCMD^FPS"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:820
 msgid "QMCMD^Net graph"
-msgstr "Netzwerkgraph"
+msgstr "QMCMD^Netzwerkgraph"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:823
 #: qcsrc/client/hud/panel/quickmenu.qc:826
 msgid "QMCMD^Sound settings"
-msgstr "Ton-Einstellungen"
+msgstr "QMCMD^Ton-Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:824
 msgid "QMCMD^Hit sound"
-msgstr "Ton bei Treffer"
+msgstr "QMCMD^Ton bei Treffer"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:825
 msgid "QMCMD^Chat sound"
-msgstr "Chat-Ton"
+msgstr "QMCMD^Chat-Ton"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:830
 #: qcsrc/client/hud/panel/quickmenu.qc:834
 msgid "QMCMD^Spectator camera"
-msgstr "Zuschauerkamera"
+msgstr "QMCMD^Zuschauerkamera"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:831
 msgid "QMCMD^1st person"
-msgstr "Ego-Perspektive"
+msgstr "QMCMD^Ego-Perspektive"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:832
 msgid "QMCMD^3rd person around player"
-msgstr "Dritte-Person-Ansicht um Spieler"
+msgstr "QMCMD^Dritte-Person-Ansicht um Spieler"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:833
 msgid "QMCMD^3rd person behind"
-msgstr "Dritte-Person-Ansicht (hinter)"
+msgstr "QMCMD^Dritte-Person-Ansicht (hinter)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:839
 #: qcsrc/client/hud/panel/quickmenu.qc:844
 msgid "QMCMD^Observer camera"
-msgstr "Beobachterkamera"
+msgstr "QMCMD^Beobachterkamera"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:840
 msgid "QMCMD^Increase speed"
-msgstr "Tempo erhöhen"
+msgstr "QMCMD^Tempo erhöhen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:841
 msgid "QMCMD^Decrease speed"
-msgstr "Tempo verringern"
+msgstr "QMCMD^Tempo verringern"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:842
 msgid "QMCMD^Wall collision off"
-msgstr "Wandkollision aus"
+msgstr "QMCMD^Wandkollision aus"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:843
 msgid "QMCMD^Wall collision on"
-msgstr "Wandkollision an"
+msgstr "QMCMD^Wandkollision an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:847
 msgid "QMCMD^Fullscreen"
-msgstr "Vollbild"
+msgstr "QMCMD^Vollbild"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:850
 #: qcsrc/client/hud/panel/quickmenu.qc:860
 msgid "QMCMD^Call a vote"
-msgstr "Abstimmung starten"
+msgstr "QMCMD^Abstimmung starten"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:851
 msgid "QMCMD^Restart the map"
-msgstr "Karte neustarten"
+msgstr "QMCMD^Karte neustarten"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:852
 msgid "QMCMD^End match"
-msgstr "Spiel beenden"
+msgstr "QMCMD^Spiel beenden"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:855
 msgid "QMCMD^Reduce match time"
-msgstr "Spielzeit verringern"
+msgstr "QMCMD^Spielzeit verringern"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:856
 msgid "QMCMD^Extend match time"
-msgstr "Spielzeit erhöhen"
+msgstr "QMCMD^Spielzeit erhöhen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:859
 msgid "QMCMD^Shuffle teams"
-msgstr "Teams mischen"
+msgstr "QMCMD^Teams mischen"
 
 #: qcsrc/client/hud/panel/racetimer.qc:54
 #, c-format
@@ -569,7 +570,7 @@ msgstr "STRAFE: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
-msgstr "einen Checkpoint verpasst"
+msgstr "einen Kontrollpunkt verpasst"
 
 #: qcsrc/client/hud/panel/radar.qc:373
 msgid "Click to select teleport destination"
@@ -585,11 +586,11 @@ msgstr "Anzahl an Ballbesitzer-Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "SCO^bckills"
-msgstr "bbkills"
+msgstr "Bbkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "SCO^bctime"
-msgstr "bbzeit"
+msgstr "Bbzeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "Total amount of time holding the ball in Keepaway"
@@ -602,11 +603,11 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "SCO^caps"
-msgstr "caps"
+msgstr "Caps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "SCO^captime"
-msgstr "capzeit"
+msgstr "Capzeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "Time of fastest capture (CTF)"
@@ -618,7 +619,7 @@ msgstr "Anzahl Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
-msgstr "tode"
+msgstr "Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "Number of keys destroyed by pushing them into void"
@@ -631,7 +632,7 @@ msgstr "zerstört"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "SCO^damage"
-msgstr "schaden"
+msgstr "Schaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
@@ -639,11 +640,11 @@ msgstr "Angerichteter Gesamtschaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
-msgstr "scherhal"
+msgstr "Scherhal"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "The total damage taken"
-msgstr "Erhaltenen Gesamtschaden"
+msgstr "Erhaltener Gesamtschaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "Number of flag drops"
@@ -651,19 +652,19 @@ msgstr "Anzahl fallengelassener Flaggen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "SCO^drops"
-msgstr "fallen"
+msgstr "Falleng"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "Player ELO"
-msgstr "Spieler-ELO"
+msgstr "Spieler-Elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "SCO^elo"
-msgstr "elo"
+msgstr "Elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "SCO^fastest"
-msgstr "schnellste"
+msgstr "Schnellste"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "Time of fastest lap (Race/CTS)"
@@ -683,7 +684,7 @@ msgstr "Anzahl an Flaggenträgerkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:99
 msgid "SCO^fckills"
-msgstr "fckills"
+msgstr "Ftkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "FPS"
@@ -691,7 +692,7 @@ msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "SCO^fps"
-msgstr "fps"
+msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "Number of kills minus suicides"
@@ -699,7 +700,7 @@ msgstr "Anzahl Kills minus Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "SCO^frags"
-msgstr "frags"
+msgstr "Frags"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "Number of goals scored"
@@ -707,7 +708,7 @@ msgstr "Anzahl geschossener Tore"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "SCO^goals"
-msgstr "tore"
+msgstr "Tore"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "Number of keys carrier kills"
@@ -715,11 +716,11 @@ msgstr "Anzahl an Schlüsselträgerkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "SCO^kckills"
-msgstr "kckills"
+msgstr "Stkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:104
 msgid "SCO^k/d"
-msgstr "k/d"
+msgstr "K/T"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:104
 #: qcsrc/client/hud/panel/scoreboard.qc:105
@@ -729,11 +730,11 @@ msgstr "Das Kill-/Tod-Verhältnis"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^kdr"
-msgstr "kdr"
+msgstr "KTV"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "SCO^kdratio"
-msgstr "kdratio"
+msgstr "KT-Verh."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "Number of kills"
@@ -741,7 +742,7 @@ msgstr "Anzahl an Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^kills"
-msgstr "kills"
+msgstr "Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "Number of laps finished (Race/CTS)"
@@ -749,7 +750,7 @@ msgstr "Anzahl gedrehter Runden (Rennen/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "SCO^laps"
-msgstr "runden"
+msgstr "Runden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "Number of lives (LMS)"
@@ -757,7 +758,7 @@ msgstr "Anzahl Leben (LMS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "SCO^lives"
-msgstr "leben"
+msgstr "Leben"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of times a key was lost"
@@ -765,7 +766,7 @@ msgstr "Wie oft ein Schlüssel verloren wurde"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "SCO^losses"
-msgstr "verloren"
+msgstr "Verlor"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 #: qcsrc/client/hud/panel/scoreboard.qc:112
@@ -774,19 +775,19 @@ msgstr "Spielername"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "SCO^name"
-msgstr "name"
+msgstr "Name"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "SCO^nick"
-msgstr "nick"
+msgstr "Nick"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of objectives destroyed"
-msgstr "Anzahl an zerstörten Zielen"
+msgstr "Anzahl an zerstörten Angriffszielen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^objectives"
-msgstr "ziele"
+msgstr "Ziele"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid ""
@@ -797,7 +798,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid "SCO^pickups"
-msgstr "aufheb"
+msgstr "Aufheb"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "Ping time"
@@ -805,7 +806,7 @@ msgstr "Latenz"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "SCO^ping"
-msgstr "ping"
+msgstr "Ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "Packet loss"
@@ -813,7 +814,7 @@ msgstr "Paketverlust"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "SCO^pl"
-msgstr "pl"
+msgstr "Pv"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of players pushed into void"
@@ -821,7 +822,7 @@ msgstr "Anzahl der Spieler, die in die Leere geschubst wurden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^pushes"
-msgstr "schubser"
+msgstr "Schubser"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "Player rank"
@@ -829,7 +830,7 @@ msgstr "Spielerrang"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "SCO^rank"
-msgstr "rang"
+msgstr "Rang"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of flag returns"
@@ -845,7 +846,7 @@ msgstr "Anzahl Wiederbelebungen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "SCO^revivals"
-msgstr "wiederbelebungen"
+msgstr "Wiederbe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of rounds won"
@@ -853,11 +854,11 @@ msgstr "Anzahl gewonnener Runden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^rounds won"
-msgstr "gewonnene Runden"
+msgstr "Rundensiege"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "SCO^score"
-msgstr "punkte"
+msgstr "Punkte"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "Total score"
@@ -869,7 +870,7 @@ msgstr "Anzahl Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^suicides"
-msgstr "suizide"
+msgstr "Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "Number of kills minus deaths"
@@ -877,7 +878,7 @@ msgstr "Anzahl der Kills minus der Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^sum"
-msgstr "summe"
+msgstr "Summe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of domination points taken (Domination)"
@@ -885,7 +886,7 @@ msgstr "Anzahl eroberter Dominationspunkte (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^takes"
-msgstr "takes"
+msgstr "erobert"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of teamkills"
@@ -893,19 +894,19 @@ msgstr "Anzahl der Teamkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^teamkills"
-msgstr "teamkills"
+msgstr "Teamkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "Number of ticks (Domination)"
-msgstr "Anzahl Ticks (Domination)"
+msgstr "Anzahl der Ticks/Zeiteinheiten (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^ticks"
-msgstr "ticks"
+msgstr "Ticks"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^time"
-msgstr "zeit"
+msgstr "Zeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "Total time raced (Race/CTS)"
@@ -948,7 +949,7 @@ msgid ""
 "it into the cvar scoreboard_columns so you can edit it"
 msgstr ""
 "^2scoreboard_columns_set ^3expand_default ^7lädt das Standard-Layout und "
-"expandiert es in die cvar scoreboard_columns, damit Du sie bearbeiten kannst"
+"expandiert es in die cvar scoreboard_columns, damit du sie bearbeiten kannst"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:319
 msgid "You can use a ^3|^7 to start the right-aligned fields."
@@ -966,7 +967,7 @@ msgid ""
 "or in all but these game types. You can also specify 'all' as a\n"
 "field to show all fields available for the current game mode."
 msgstr ""
-"Vor einem Feld kannst Du ein Plus- oder Minuszeichen setzen, dann\n"
+"Vor einem Feld kannst du ein Plus- oder Minuszeichen setzen, dann\n"
 "eine kommagetrennte Liste an Spieltypen, dann ein Schrägstrich,\n"
 "um das Feld nur in diesen oder in allen außer diesen Spieltypen\n"
 "anzuzeigen. Du kannst außerdem „all“ als ein Feld angeben, um\n"
@@ -1016,7 +1017,7 @@ msgstr "N/V"
 #: qcsrc/client/hud/panel/scoreboard.qc:1188
 #, c-format
 msgid "Accuracy stats (average %d%%)"
-msgstr "Genauigkeit (Durchschn.: %d%%)"
+msgstr "Genauigkeitsstatistik (Durchschnitt: %d%%)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1336
 msgid "Map stats:"
@@ -1047,7 +1048,7 @@ msgstr "^3%1.0f Minuten"
 #: qcsrc/client/hud/panel/scoreboard.qc:1629
 #, c-format
 msgid "^5%s %s"
-msgstr "^5%s%s"
+msgstr "^5%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1623
 #: qcsrc/client/hud/panel/scoreboard.qc:1630
@@ -1061,13 +1062,13 @@ msgstr "Punkte"
 #: qcsrc/client/hud/panel/scoreboard.qc:1643
 #: qcsrc/client/hud/panel/scoreboard.qc:1650
 msgid "SCO^is beaten"
-msgstr "wurde geschlagen"
+msgstr "geschlagen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1641
 #: qcsrc/client/hud/panel/scoreboard.qc:1648
 #, c-format
 msgid "^2+%s %s"
-msgstr "^2+%s%s"
+msgstr "^2+%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1659
 #, c-format
@@ -1082,7 +1083,7 @@ msgstr "Geschwindigkeitspreis: %d%s ^7(%s^7)"
 #: qcsrc/client/hud/panel/scoreboard.qc:1802
 #, c-format
 msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr "Rekordzeit: %d%s ^7(%s^7)"
+msgstr "Rekordtempo: %d%s ^7(%s^7)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1818
 #, c-format
@@ -1110,7 +1111,7 @@ msgstr "AUFWÄRMPHASE"
 
 #: qcsrc/client/hud/panel/vote.qc:27
 msgid "^1You must answer before entering hud configure mode"
-msgstr "^1Du musst antworten, bevor Du den HUD-Konfigurationsmodus betrittst"
+msgstr "^1Du musst antworten, bevor du den HUD-Konfigurationsmodus betrittst"
 
 #: qcsrc/client/hud/panel/vote.qc:30
 msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
@@ -1253,7 +1254,7 @@ msgstr ""
 
 #: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
 msgid "Ball Stealer"
-msgstr "Ball-Dieb"
+msgstr "Balldieb"
 
 #: qcsrc/common/items/item/ammo.qh:66
 msgid "bullets"
@@ -1581,7 +1582,7 @@ msgstr "Spiel vorbei!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr "Gut gemacht! Klicke 'Nächstes Level' um fortzufahren"
+msgstr "Gut gemacht! Klicke „Nächstes Level“, um fortzufahren"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
@@ -1718,12 +1719,12 @@ msgstr "KI-Spieler entfernen"
 
 #: qcsrc/common/minigames/minigame/pp.qc:2
 msgid "Push-Pull"
-msgstr "Drücken-Ziehen"
+msgstr "Schiebezieh"
 
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
 msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr "Wähle im Menü \"^1Nächstes Spiel^7\" für eine Revanche!"
+msgstr "Wähle im Menü „^1Nächstes Spiel^7“ für eine Revanche!"
 
 #: qcsrc/common/minigames/minigame/pp.qc:444
 #: qcsrc/common/minigames/minigame/pp.qc:450
@@ -1748,11 +1749,11 @@ msgstr "Solitär"
 
 #: qcsrc/common/minigames/minigame/ps.qc:414
 msgid "All pieces cleared!"
-msgstr "Alle Teile abgeräumt!"
+msgstr "Alle Figuren abgeräumt!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:416
 msgid "Remaining pieces:"
-msgstr "Übrige Teile:"
+msgstr "Verbleibende Figuren:"
 
 #: qcsrc/common/minigames/minigame/ps.qc:481
 #, c-format
@@ -1765,11 +1766,11 @@ msgstr "Keine verbleibenden gültigen Züge"
 
 #: qcsrc/common/minigames/minigame/ps.qc:494
 msgid "Well done, you win!"
-msgstr "Gut gemacht, Du gewinnst!"
+msgstr "Gut gemacht, du gewinnst!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:497
 msgid "Jump a piece over another to capture it"
-msgstr "Spring mit einer Spielfigur über einer anderen, um sie zu stehlen"
+msgstr "Spring mit einer Spielfigur über einer anderen, um sie zu schnappen"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:2
 msgid "Tic Tac Toe"
@@ -1832,7 +1833,7 @@ msgstr "Geschwindigkeit"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:43
 msgid "Medic"
-msgstr "Medizin"
+msgstr "Sanitäter"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:54
 msgid "Bash"
@@ -1954,7 +1955,7 @@ msgstr "Spawn-Granate"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:50
 msgid "Heal grenade"
-msgstr "Heilgranate"
+msgstr "Medizingranate"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:58
 msgid "Monster grenade"
@@ -2018,7 +2019,7 @@ msgstr "Gegenstand"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:12
 msgid "Checkpoint"
-msgstr "Checkpoint"
+msgstr "Kontrollpunkt"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:13
 #: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
@@ -2171,7 +2172,7 @@ msgid ""
 "%s^BG's previous record of ^F2%s^BG seconds"
 msgstr ""
 "^BG%s^BG hat die ^TC^TT^BG Flagge in ^F1%s^BG Sekunden erobert, und damit ^BG"
-"%s^BGs Rekord von ^F2%s^BG Sekunden gebrochen"
+"%s^BGs Rekord von ^F2%s^BG Sekunden geschlagen"
 
 #: qcsrc/common/notifications/all.inc:243
 #, c-format
@@ -2190,7 +2191,7 @@ msgid ""
 "^BG%s^BG's previous record of ^F1%s^BG seconds"
 msgstr ""
 "^BG%s^BG hat die ^TC^TT^BG Flagge in ^F1%s^BG Sekunden erobert, konnte "
-"jedoch nicht ^BG%s^BGs Rekord von ^F2%s^BG Sekunden brechen"
+"jedoch nicht ^BG%s^BGs Rekord von ^F2%s^BG Sekunden schlagen"
 
 #: qcsrc/common/notifications/all.inc:246
 msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
@@ -2224,8 +2225,8 @@ msgid ""
 "^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to "
 "base"
 msgstr ""
-"^BGDie ^TC^TT^BG Flagge fiel an einen unerreichbaren Ort und ist daher aus "
-"Langeweile heimgeflogen"
+"^BGDie ^TC^TT^BG Flagge fiel an einen unerreichbaren Ort und ist daher "
+"heimgeflogen"
 
 #: qcsrc/common/notifications/all.inc:253
 msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
@@ -2303,7 +2304,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:271
 msgid "^F1Round already started, you will join the game in the next round"
 msgstr ""
-"^F1Die Runde hat bereits begonnen, daher musst Du auf die nächste Runde "
+"^F1Die Runde hat bereits begonnen, daher musst du auf die nächste Runde "
 "warten"
 
 #: qcsrc/common/notifications/all.inc:272
@@ -2313,13 +2314,13 @@ msgstr "^F2Du wirst in der nächsten Runde zuschauen"
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1 Bonus getötet ^K1%s%s"
+msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1-Bonus getötet ^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
 msgstr ""
-"^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1 Bonus zu Punkten verarbeitet ^K1%s"
+"^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1-Bonus zu Punkten verarbeitet ^K1%s"
 "%s"
 
 #: qcsrc/common/notifications/all.inc:275
@@ -2365,12 +2366,12 @@ msgstr "^BG%s%s^K1 wurde in die Luft gejagt von ^BG%s^K1s Granate%s%s"
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
-msgstr "^BG%s%s^K1 trat einer Napalm-Explosion ein wenig zu nahe%s%s"
+msgstr "^BG%s%s^K1 trat einer Napalmexplosion ein wenig zu nahe%s%s"
 
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
-msgstr "^BG%s%s^K1 wurde von ^BG%s^K1s Napalm-Granate abgefackelt%s%s"
+msgstr "^BG%s%s^K1 wurde von ^BG%s^K1s Napalmgranate abgefackelt%s%s"
 
 #: qcsrc/common/notifications/all.inc:283
 #, c-format
@@ -2605,12 +2606,12 @@ msgstr "^BG%s^K1 meisterte die Kunst der Selbstsprengung%s%s"
 #, c-format
 msgid ""
 "^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s"
-msgstr "^BG%s^K1 wollte sich so eine Napalm-Explosion mal genauer ansehen%s%s"
+msgstr "^BG%s^K1 wollte sich so eine Napalmexplosion mal genauer ansehen%s%s"
 
 #: qcsrc/common/notifications/all.inc:324
 #, c-format
 msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
-msgstr "^BG%s^K1 wurde von der eigenen Napalm-Granate verbrannt%s%s"
+msgstr "^BG%s^K1 wurde von der eigenen Napalmgranate verbrannt%s%s"
 
 #: qcsrc/common/notifications/all.inc:326
 #, c-format
@@ -2625,7 +2626,7 @@ msgstr "^BG%s^K1 erfror durch die eigene Eisgranate%s%s"
 #: qcsrc/common/notifications/all.inc:327
 #, c-format
 msgid "^BG%s^K1's Healing Nade didn't quite heal them%s%s"
-msgstr "^BG%s^K1s Medizin-Granate war nicht sehr heilsam%s%s"
+msgstr "^BG%s^K1s Medizingranate war nicht sehr heilsam%s%s"
 
 #: qcsrc/common/notifications/all.inc:328
 #, c-format
@@ -2782,7 +2783,7 @@ msgstr "^BG%s^K1 konnte keinen Schutz vor der Raserrakete finden%s%s"
 #: qcsrc/common/notifications/all.inc:359
 #, c-format
 msgid "^BG%s^K1 was betrayed by ^BG%s^K1%s%s"
-msgstr "^BG%s^K1 wurde von ^BG%s^K1 betrogen%s%s"
+msgstr "^BG%s^K1 wurde von ^BG%s^K1 verraten%s%s"
 
 #: qcsrc/common/notifications/all.inc:361
 #, c-format
@@ -2792,12 +2793,12 @@ msgstr "^BG%s^BG%s^BG (%s %s alle %s Sekunden)"
 #: qcsrc/common/notifications/all.inc:363
 #, c-format
 msgid "^BG%s^K1 was frozen by ^BG%s"
-msgstr "^BG%s^K1 wurde von ^BG vereist%s"
+msgstr "^BG%s^K1 wurde von ^BG%s^K1 vereist"
 
 #: qcsrc/common/notifications/all.inc:364
 #, c-format
 msgid "^BG%s^K3 was revived by ^BG%s"
-msgstr "^BG%s^K3 wurde von ^BG wiederbelebt%s"
+msgstr "^BG%s^K3 wurde von ^BG%s^K3 wiederbelebt"
 
 #: qcsrc/common/notifications/all.inc:365
 #, c-format
@@ -2844,7 +2845,7 @@ msgstr "^BGDie Runde ist vorbei, aber es gibt keinen Gewinner"
 #: qcsrc/common/notifications/all.inc:375
 #, c-format
 msgid "^BGGodmode saved you %s units of damage, cheater!"
-msgstr "^BGGodmode ersparte Dir %s Schaden, Du Cheater!"
+msgstr "^BGGodmode ersparte dir %s Schaden, du Cheater!"
 
 #: qcsrc/common/notifications/all.inc:377
 #, c-format
@@ -2987,12 +2988,12 @@ msgstr "^BGTeam ^TC^TT^BG hielt den Ball zu lange fest"
 #: qcsrc/common/notifications/all.inc:411
 #, c-format
 msgid "^BG%s^BG captured %s^BG control point"
-msgstr "^BG%s^BG hat einen Kontrollpunkt erobert: %s^BG"
+msgstr "^BG%s^BG hat Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:412
 #, c-format
 msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
-msgstr "^TC^TT^BGEin Kontrollpunkt vom Team %s^BG wurde von %s zerstört"
+msgstr "Team ^TC^TT^BG ihr Kontrollpunkt „%s^BG“ wurde von %s zerstört"
 
 #: qcsrc/common/notifications/all.inc:413
 msgid "^TC^TT^BG generator has been destroyed"
@@ -3039,7 +3040,7 @@ msgid ""
 "^F2You were kicked from the server because you are a spectator and "
 "spectators aren't allowed at the moment."
 msgstr ""
-"^F2Du wurdest vom Server gekickt, weil Du Zuschauer bist, und Beobachter "
+"^F2Du wurdest vom Server gekickt, weil du Zuschauer bist, und Beobachter "
 "sind im Moment nicht erlaubt."
 
 #: qcsrc/common/notifications/all.inc:424
@@ -3060,12 +3061,15 @@ msgstr "^BG%s^BG hat das Rennen aufgegeben"
 #: qcsrc/common/notifications/all.inc:428
 #, c-format
 msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG konnte seinen %s%s^BG Platz nicht brechen von %s%s %s"
+msgstr ""
+"^BG%s^BG konnte den eigenen Rekord auf dem %s%s^BG Platz von %s%s %s nicht "
+"schlagen"
 
 #: qcsrc/common/notifications/all.inc:429
 #, c-format
 msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG konnte den %s%s^BG Platz von %s%s nicht brechen%s"
+msgstr ""
+"^BG%s^BG konnte den Rekord auf dem %s%s^BG Platz von %s%s %s nicht schlagen"
 
 #: qcsrc/common/notifications/all.inc:430
 #, c-format
@@ -3080,7 +3084,8 @@ msgstr "^BG%s^BG brach %s^BGs %s%s^BG Rekord mit %s%s %s"
 #: qcsrc/common/notifications/all.inc:432
 #, c-format
 msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
-msgstr "^BG%s^BG verbesserte seinen %s%s^BG Rekord mit %s%s %s"
+msgstr ""
+"^BG%s^BG verbesserte den eigenen Rekord auf dem %s%s^BG Platz mit %s%s %s"
 
 #: qcsrc/common/notifications/all.inc:433
 #, c-format
@@ -3088,8 +3093,8 @@ msgid ""
 "^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
 "and will be lost."
 msgstr ""
-"^BG%s^BG hat einen neuen Rekord ^F2%s^BG erziehlt, aber unglücklicherweise "
-"hat er keine UID und der Rekord wird verloren gehen."
+"^BG%s^BG hat einen neuen Rekord ^F2%s^BG erzielt, aber unglücklicherweise "
+"ist keine UID vorhanden und der Rekord wird verloren gehen."
 
 #: qcsrc/common/notifications/all.inc:434
 #, c-format
@@ -3097,8 +3102,8 @@ msgid ""
 "^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
 "lost."
 msgstr ""
-"^BG%s^BG hat einen neuen Rekord mit ^F2%s^BG erziehlt, aber er ist "
-"anonymisiert und wird verloren gehen."
+"^BG%s^BG hat einen neuen Rekord mit ^F2%s^BG erzielt, aber er ist anonym und "
+"wird verloren gehen."
 
 #: qcsrc/common/notifications/all.inc:435
 #, c-format
@@ -3124,7 +3129,7 @@ msgid ""
 "^F2You have to become a player within the next %s, otherwise you will be "
 "kicked, because spectating isn't allowed at this time!"
 msgstr ""
-"^F2Du musst in den nächsten %s Spieler werden, oder Du wirst gekickt, denn "
+"^F2Du musst in den nächsten %s Spieler werden, oder du wirst gekickt, denn "
 "zuschauen ist momentan nicht erlaubt."
 
 #: qcsrc/common/notifications/all.inc:443
@@ -3146,7 +3151,7 @@ msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
 "^F2Xonotic %s"
 msgstr ""
-"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s (beta)^BG, Du hast "
+"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s (beta)^BG, du hast "
 "^F2Xonotic %s"
 
 #: qcsrc/common/notifications/all.inc:449
@@ -3154,7 +3159,7 @@ msgstr ""
 msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
 msgstr ""
-"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s^BG, Du hast^F2Xonotic "
+"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s^BG, du hast^F2Xonotic "
 "%s"
 
 #: qcsrc/common/notifications/all.inc:450
@@ -3163,8 +3168,8 @@ msgid ""
 "^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
 "the update from ^F3http://www.xonotic.org/^BG!"
 msgstr ""
-"^F4Anmerkung: ^F1Xonotic %s^BG ist raus und Du hast noch ^F2Xonotic %s^BG - "
-"hol Dir das Update von ^F3http://www.xonotic.org/^BG!"
+"^F4Anmerkung: ^F1Xonotic %s^BG ist raus und du hast noch ^F2Xonotic %s^BG - "
+"hol dir das Update von ^F3http://www.xonotic.org/^BG!"
 
 #: qcsrc/common/notifications/all.inc:452
 #, c-format
@@ -3336,7 +3341,7 @@ msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s Maschinengewehr durchsiebt%s%s"
 #: qcsrc/common/notifications/all.inc:794
 #, c-format
 msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
-msgstr "^BGMehr als ^F2%s^BG Minen kannst Du nicht auf einmal legen"
+msgstr "^BGMehr als ^F2%s^BG Minen kannst du nicht auf einmal legen"
 
 #: qcsrc/common/notifications/all.inc:485
 #, c-format
@@ -3560,7 +3565,7 @@ msgid ""
 msgstr ""
 "^BGDu bist jetzt frei.\n"
 "^BGDu kannst ^F2versuchen^BG, die Flage noch einmal\n"
-"^BGzu erobern, wenn Du glaubst, es zu schaffen."
+"^BGzu erobern, wenn du glaubst, es zu schaffen."
 
 #: qcsrc/common/notifications/all.inc:560
 msgid "^BGThis flag is currently inactive"
@@ -3575,7 +3580,7 @@ msgstr ""
 "^BGDu bist jetzt von der Flagge ^F1abgeschirmt\n"
 "^BGaufgrund ^F2zu vieler fehlgeschlagenen Versuchen^BG,\n"
 "^BGdie Flagge zu erobern. Gewinne Punkte in der Verteidigung,\n"
-"^BGbevor Du es noch einmal versuchst."
+"^BGbevor du es noch einmal versuchst."
 
 #: qcsrc/common/notifications/all.inc:562
 msgid "^BGYou captured the ^TC^TT^BG flag!"
@@ -3583,7 +3588,7 @@ msgstr "^BGDu hast die ^TC^TT^BG Flagge erobert!"
 
 #: qcsrc/common/notifications/all.inc:563
 msgid "^BGYou captured the flag!"
-msgstr "^BGDu hast die Flagge erobert"
+msgstr "^BGDu hast die Flagge erobert!"
 
 #: qcsrc/common/notifications/all.inc:564
 #, c-format
@@ -3618,7 +3623,7 @@ msgstr "^BGDrücke ^F2%s^BG, um die Flagge von %s zu erhalten^BG"
 #: qcsrc/common/notifications/all.inc:570
 #, c-format
 msgid "^BGRequesting %s^BG to pass you the flag"
-msgstr "^BG%s^BG wird darum gebeten, Dir die Flagge zu passen"
+msgstr "^BG%s^BG wird darum gebeten, dir die Flagge zu passen"
 
 #: qcsrc/common/notifications/all.inc:571
 #, c-format
@@ -3671,12 +3676,12 @@ msgstr "^BGDer %sFeind (^BG%s%s)^BG hat die Flagge! Bringt sie zurück!"
 #: qcsrc/common/notifications/all.inc:581
 #, c-format
 msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr "^BGDer %sFeind^BG hat seine Flagge! Hole sie!"
+msgstr "^BGDer %sFeind^BG hat seine Flagge! Hol sie!"
 
 #: qcsrc/common/notifications/all.inc:582
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr "^BGDer %sFeind (^BG%s%s)^BG hat seine Flagge! Hole sie!"
+msgstr "^BGDer %sFeind (^BG%s%s)^BG hat seine Flagge! Hol sie!"
 
 #: qcsrc/common/notifications/all.inc:583
 #, c-format
@@ -3841,7 +3846,7 @@ msgstr "^K1Du wurdest etwas zu knusprig!"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You killed your own dumb self!"
-msgstr "^K1Du hast dich selbst umgebracht, Du Trottel!"
+msgstr "^K1Du hast dich selbst umgebracht, du Trottel!"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You need to be more careful!"
@@ -3869,7 +3874,7 @@ msgstr "^K1Du has vergessen, den Pin wieder reinzustecken!"
 
 #: qcsrc/common/notifications/all.inc:645
 msgid "^K1Hanging around a napalm explosion is bad!"
-msgstr "^K1Bei einer Napalm-Explosion herumzuhängen ist schlecht!"
+msgstr "^K1Es ist schlecht, bei einer Napalmexplosion herumzuhängen!"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You felt a little chilly!"
@@ -3881,19 +3886,19 @@ msgstr "^K1Dir wurde ein wenig zu kalt!"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1Your Healing Nade is a bit defective"
-msgstr "^K1Deine Medizin-Granate ist ein wenig defekt"
+msgstr "^K1Deine Medizingranate ist ein wenig defekt"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You are respawning for running out of ammo..."
-msgstr "^K1Du wirst wiederbelebt, weil Du keine Munition mehr hast …"
+msgstr "^K1Du wirst wiederbelebt, weil du keine Munition mehr hast …"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You were killed for running out of ammo..."
-msgstr "^K1Du wurdest getötet, weil Du keine Munition mehr hast…"
+msgstr "^K1Du wurdest getötet, weil du keine Munition mehr hast …"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You grew too old without taking your medicine"
-msgstr "^K1Du wurdest zu alt, und hast deine Medizin nicht genommen"
+msgstr "^K1Du wurdest zu alt, denn du hast deine Medizin nicht genommen"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You need to preserve your health"
@@ -3989,17 +3994,17 @@ msgstr "^K1Du konntest keinen Schutz vor der Rakete eines Rasers finden!"
 
 #: qcsrc/common/notifications/all.inc:667
 msgid "^K1Watch your step!"
-msgstr "^K1Achte darauf, wo Du hintrittst!"
+msgstr "^K1Achte darauf, wo du hintrittst!"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot! Du hast ^BG%s^K1 getötet, einen Teamkollegen von Dir!"
+msgstr "^K1Idiot! Du hast ^BG%s^K1 getötet, einen Teamkollegen von dir!"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot! Du hast ^BG%s^K1 getroffen, einen Teamkollegen von Dir!"
+msgstr "^K1Idiot! Du hast ^BG%s^K1 getroffen, einen Teamkollegen von dir!"
 
 #: qcsrc/common/notifications/all.inc:670
 #, c-format
@@ -4070,7 +4075,7 @@ msgstr "^K1Du hast dich selbst eingefroren"
 
 #: qcsrc/common/notifications/all.inc:692
 msgid "^K1Round already started, you spawn as frozen"
-msgstr "^K1Die Runde hat bereits begonnen, Du spawnst eingefroren"
+msgstr "^K1Die Runde hat bereits begonnen, du spawnst eingefroren"
 
 #: qcsrc/common/notifications/all.inc:694
 #, c-format
@@ -4108,14 +4113,14 @@ msgstr "^BGDu hast den Ball aufgenommen"
 #: qcsrc/common/notifications/all.inc:713
 msgid "^BGKilling people while you don't have the ball gives no points!"
 msgstr ""
-"^BGSpieler zu töten, während Du den Ball nicht hast, bringt Dir keine Punkte!"
+"^BGSpieler zu töten, während du den Ball nicht hast, bringt dir keine Punkte!"
 
 #: qcsrc/common/notifications/all.inc:715
 msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Help the key carriers to meet!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand deines Teams!\n"
+"^BGDein Team hat alle Schlüssel!\n"
 "Hilf den Schlüsselträgern, sich zu treffen!"
 
 #: qcsrc/common/notifications/all.inc:716
@@ -4123,7 +4128,7 @@ msgid ""
 "^BGAll keys are in ^TC^TT team^BG's hands!\n"
 "Interfere ^F4NOW^BG!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand von Team ^TC^TT^BG!\n"
+"^BGTeam ^TC^TT^BG hat alle Schlüssel!\n"
 "^F4SOFORT^BG eingreifen!"
 
 #: qcsrc/common/notifications/all.inc:717
@@ -4131,8 +4136,8 @@ msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Meet the other key carriers ^F4NOW^BG!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand deines Teams!\n"
-"Triff dich ^F4SOFORT^BG mit den anderen Schlüsselträgern!"
+"^BGDein Team hat alle Schlüssel!\n"
+"Triff ^F4SOFORT^BG die anderen Schlüsselträger!"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^F4Round will start in ^COUNT"
@@ -4166,19 +4171,19 @@ msgstr "^BGEs wird auf %s Spieler gewartet …"
 
 #: qcsrc/common/notifications/all.inc:727
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BGDeine Waffe wurde verschlechtert, bis Du etwas Munition findest!"
+msgstr "^BGDeine Waffe wurde verschlechtert, bis du etwas Munition findest!"
 
 #: qcsrc/common/notifications/all.inc:728
 msgid "^F4^COUNT^BG left to find some ammo!"
-msgstr "^F4^COUNT^BG verbleiben, um etwas Munition zu finden!"
+msgstr "^BGNoch ^F4^COUNT^BG, um etwas Munition zu finden!"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
-msgstr "^BGHole dir etwas Munition oder Du stirbst in ^F4^COUNT^BG!"
+msgstr "^BGHol dir etwas Munition oder du stirbst in ^F4^COUNT^BG!"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
-msgstr "^BGHole dir etwas Munition! ^F4^COUNT^BG übrig!"
+msgstr "^BGHol dir etwas Munition! Noch ^F4^COUNT^BG!"
 
 #: qcsrc/common/notifications/all.inc:730
 #, c-format
@@ -4202,12 +4207,12 @@ msgstr "^F2Aktive Waffe: ^F1%s"
 #: qcsrc/common/notifications/all.inc:737
 #, c-format
 msgid "^BGYou captured %s^BG control point"
-msgstr "^BGDu hast einen Kontrollpunkt erobert: %s^BG"
+msgstr "^BGDu hast Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:738
 #, c-format
 msgid "^TC^TT^BG team captured %s^BG control point"
-msgstr "Team ^TC^TT^BG hat einen Kontrollpunkt erobert: %s^BG"
+msgstr "Team ^TC^TT^BG hat Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:739
 msgid "^BGThis control point currently cannot be captured"
@@ -4361,11 +4366,11 @@ msgstr "^F2Du hast jetzt eine Superwaffe"
 
 #: qcsrc/common/notifications/all.inc:778
 msgid "^K1Changing to ^TC^TT^K1 in ^COUNT"
-msgstr "^K1Dein Team wird zu ^TC^TT^K1 geändert in ^COUNT"
+msgstr "^K1Teamwechsel zu ^TC^TT^K1 in ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:779
 msgid "^K1Changing team in ^COUNT"
-msgstr "^K1Du wechselst das Team in ^COUNT"
+msgstr "^K1Teamwechsel in ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:780
 msgid "^K1Spectating in ^COUNT"
@@ -4581,7 +4586,7 @@ msgstr "%d Punkte hintereinander! "
 #: qcsrc/common/notifications/all.qh:507
 #, c-format
 msgid "%d frag spree! "
-msgstr "%d Kills in Folge!"
+msgstr "%d Kills in Folge! "
 
 #: qcsrc/common/notifications/all.qh:520
 msgid "First blood! "
@@ -4838,15 +4843,15 @@ msgstr "Keine Angabe"
 
 #: qcsrc/common/util.qc:1452
 msgid "<KEY NOT FOUND>"
-msgstr "<KEY NOT FOUND>"
+msgstr "<TASTE NICHT GEFUNDEN>"
 
 #: qcsrc/common/util.qc:1453
 msgid "<UNKNOWN KEYNUM>"
-msgstr "<UNKNOWN KEYNUM>"
+msgstr "<UNBEKANNTE TASTENNR.>"
 
 #: qcsrc/common/util.qc:1458
 msgid "TAB"
-msgstr "TABULATOR"
+msgstr "TAB"
 
 #: qcsrc/common/util.qc:1459 qcsrc/common/util.qc:1530
 #, c-format
@@ -4868,22 +4873,22 @@ msgstr "RÜCKTASTE"
 #: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1521
 #, c-format
 msgid "UPARROW"
-msgstr "PFEIL-NACHOBEN"
+msgstr "PFEIL_RAUF"
 
 #: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1516
 #, c-format
 msgid "DOWNARROW"
-msgstr "PFEIL-NACHUNTEN"
+msgstr "PFEIL_RUNTER"
 
 #: qcsrc/common/util.qc:1466 qcsrc/common/util.qc:1518
 #, c-format
 msgid "LEFTARROW"
-msgstr "PFEIL-LINKS"
+msgstr "PFEIL_LINKS"
 
 #: qcsrc/common/util.qc:1467 qcsrc/common/util.qc:1519
 #, c-format
 msgid "RIGHTARROW"
-msgstr "PFEIL-RECHTS"
+msgstr "PFEIL_RECHTS"
 
 #: qcsrc/common/util.qc:1469
 msgid "ALT"
@@ -4895,7 +4900,7 @@ msgstr "STRG"
 
 #: qcsrc/common/util.qc:1471
 msgid "SHIFT"
-msgstr "UMSCHALTTASTE"
+msgstr "UMSCHALT"
 
 #: qcsrc/common/util.qc:1473 qcsrc/common/util.qc:1514
 #, c-format
@@ -4910,12 +4915,12 @@ msgstr "ENTF"
 #: qcsrc/common/util.qc:1475 qcsrc/common/util.qc:1517
 #, c-format
 msgid "PGDN"
-msgstr "BILD-AB"
+msgstr "BILD_AB"
 
 #: qcsrc/common/util.qc:1476 qcsrc/common/util.qc:1522
 #, c-format
 msgid "PGUP"
-msgstr "BILD-AUF"
+msgstr "BILD_AUF"
 
 #: qcsrc/common/util.qc:1477 qcsrc/common/util.qc:1520
 #, c-format
@@ -4933,7 +4938,7 @@ msgstr "PAUSE"
 
 #: qcsrc/common/util.qc:1482
 msgid "NUMLOCK"
-msgstr "NUM"
+msgstr "NUMLOCK"
 
 #: qcsrc/common/util.qc:1483
 msgid "CAPSLOCK"
@@ -4975,7 +4980,7 @@ msgstr "F%d"
 #: qcsrc/common/util.qc:1509
 #, c-format
 msgid "KP_%d"
-msgstr "KP_%d"
+msgstr "ZB_%d"
 
 #: qcsrc/common/util.qc:1514 qcsrc/common/util.qc:1515
 #: qcsrc/common/util.qc:1516 qcsrc/common/util.qc:1517
@@ -4988,7 +4993,7 @@ msgstr "KP_%d"
 #: qcsrc/common/util.qc:1530 qcsrc/common/util.qc:1531
 #, c-format
 msgid "KP_%s"
-msgstr "KP_%s"
+msgstr "ZB_%s"
 
 #: qcsrc/common/util.qc:1523
 #, c-format
@@ -5023,7 +5028,7 @@ msgstr "PLUS"
 #: qcsrc/common/util.qc:1531
 #, c-format
 msgid "EQUALS"
-msgstr "GLEICHHEITSZEICHEN"
+msgstr "GLEICH"
 
 #: qcsrc/common/util.qc:1536
 msgid "PRINTSCREEN"
@@ -5040,7 +5045,7 @@ msgstr "MRADHOCH"
 
 #: qcsrc/common/util.qc:1542
 msgid "MWHEELDOWN"
-msgstr "MRADHERAB"
+msgstr "MRADRUNTER"
 
 #: qcsrc/common/util.qc:1545
 #, c-format
@@ -5074,7 +5079,7 @@ msgstr "X360_%s"
 #: qcsrc/common/util.qc:1556
 #, c-format
 msgid "DPAD_DOWN"
-msgstr "STEUERKREUZ_HERAB"
+msgstr "STEUERKREUZ_RUNTER"
 
 #: qcsrc/common/util.qc:1557
 #, c-format
@@ -5099,72 +5104,72 @@ msgstr "ZURÜCK"
 #: qcsrc/common/util.qc:1561
 #, c-format
 msgid "LEFT_THUMB"
-msgstr "ANALOGSTICK_LINKS"
+msgstr "LINKER_ANALOGSTICK"
 
 #: qcsrc/common/util.qc:1562
 #, c-format
 msgid "RIGHT_THUMB"
-msgstr "ANALOGSTICK_RECHTS"
+msgstr "RECHTER_ANALOGSTICK"
 
 #: qcsrc/common/util.qc:1563
 #, c-format
 msgid "LEFT_SHOULDER"
-msgstr "SCHULTERTASTE_LINKS"
+msgstr "LINKE_SCHULTERTASTE"
 
 #: qcsrc/common/util.qc:1564
 #, c-format
 msgid "RIGHT_SHOULDER"
-msgstr "SCHULTERTASTE_RECHTS"
+msgstr "RECHTE_SCHULTERTASTE"
 
 #: qcsrc/common/util.qc:1565
 #, c-format
 msgid "LEFT_TRIGGER"
-msgstr "TRIGGERTASTE_LINKS"
+msgstr "LINKER_TRIGGER"
 
 #: qcsrc/common/util.qc:1566
 #, c-format
 msgid "RIGHT_TRIGGER"
-msgstr "TRIGGERTASTE_RECHTS"
+msgstr "RECHTER_TRIGGER"
 
 #: qcsrc/common/util.qc:1567
 #, c-format
 msgid "LEFT_THUMB_UP"
-msgstr "ANALOGSTICK_LINKS_HOCH"
+msgstr "LINKER_ANALOGSTICK_HOCH"
 
 #: qcsrc/common/util.qc:1568
 #, c-format
 msgid "LEFT_THUMB_DOWN"
-msgstr "ANALOGSTICK_LINKS_HERAB"
+msgstr "LINKER_ANALOGSTICK_RUNTER"
 
 #: qcsrc/common/util.qc:1569
 #, c-format
 msgid "LEFT_THUMB_LEFT"
-msgstr "ANALOGSTICK_LINKS_LINKS"
+msgstr "LINKER_ANALOGSTICK_LINKS"
 
 #: qcsrc/common/util.qc:1570
 #, c-format
 msgid "LEFT_THUMB_RIGHT"
-msgstr "ANALOGSTICK_LINKS_RECHTS"
+msgstr "LINKER_ANALOGSTICK_RECHTS"
 
 #: qcsrc/common/util.qc:1571
 #, c-format
 msgid "RIGHT_THUMB_UP"
-msgstr "ANALOGSTICK_RECHTS_HOCH"
+msgstr "RECHTER_ANALOGSTICK_HOCH"
 
 #: qcsrc/common/util.qc:1572
 #, c-format
 msgid "RIGHT_THUMB_DOWN"
-msgstr "ANALOGSTICK_RECHTS_HERAB"
+msgstr "RECHTER_ANALOGSTICK_RUNTER"
 
 #: qcsrc/common/util.qc:1573
 #, c-format
 msgid "RIGHT_THUMB_LEFT"
-msgstr "ANALOGSTICK_RECHTS_LINKS"
+msgstr "RECHTER_ANALOGSTICK_LINKS"
 
 #: qcsrc/common/util.qc:1574
 #, c-format
 msgid "RIGHT_THUMB_RIGHT"
-msgstr "ANALOGSTICK_RECHTS_RECHTS"
+msgstr "RECHTER_ANALOGSTICK_RECHTS"
 
 #: qcsrc/common/util.qc:1584 qcsrc/common/util.qc:1585
 #: qcsrc/common/util.qc:1586 qcsrc/common/util.qc:1587
@@ -5180,7 +5185,7 @@ msgstr "HOCH"
 #: qcsrc/common/util.qc:1585
 #, c-format
 msgid "DOWN"
-msgstr "HERAB"
+msgstr "RUNTER"
 
 #: qcsrc/common/util.qc:1586
 #, c-format
@@ -5537,7 +5542,7 @@ msgid ""
 "Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
 "please file an issue."
 msgstr ""
-"Entity-Feld %s.%s (%s) ist nicht auf der weißen Liste. Falls Du glaubst, "
+"Entity-Feld %s.%s (%s) ist nicht auf der weißen Liste. Falls du glaubst, "
 "dass das ein Programmfehler ist, melde ihn bitte."
 
 #: qcsrc/lib/string.qh:81
@@ -5832,7 +5837,7 @@ msgstr "Leg deinen Namen im Spiel fest"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:69
 msgid "Text language:"
-msgstr "Sprache:"
+msgstr "Textsprache:"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:78
 msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
@@ -6593,7 +6598,7 @@ msgid ""
 "Play online, against your friends in LAN, view demos or change player "
 "settings"
 msgstr ""
-"Spiele online, gegen deine Freunde im LAN, schaue Dir Demos an oder ändere "
+"Spiele online, gegen deine Freunde im LAN, schaue dir Demos an oder ändere "
 "deine Spieler-Einstellungen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
@@ -6851,7 +6856,7 @@ msgstr "Raketenflug"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:217
 msgid "Invincible Projectiles"
-msgstr "Unzerstörbare Schüsse"
+msgstr "Unzerstörbare Projektile"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
@@ -6947,7 +6952,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:183
 msgid "Damage done to your enemy gets added to your own health"
 msgstr ""
-"Der Schaden, dem Du anderen Spielern zufügst, wird Deiner eigenen Gesundheit "
+"Der Schaden, dem du anderen Spielern zufügst, wird deiner eigenen Gesundheit "
 "hinzugefügt"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:188
@@ -7102,7 +7107,7 @@ msgstr "Info …"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:80
 msgid "Show more information about the currently highlighted server"
-msgstr "Lass Dir mehr Informationen über den markierten Server anzeigen"
+msgstr "Lass dir mehr Informationen über den markierten Server anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:85
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
@@ -7253,7 +7258,7 @@ msgstr "Zeitwiederholung"
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:58
 msgid "Benchmark how fast your computer can run the highlighted demo"
 msgstr ""
-"Mach einen Benchmark, mit dem Du testest, wie schnell dein Computer die "
+"Mach einen Benchmark, mit dem du testest, wie schnell dein Computer die "
 "markierte Wiederholung abspielen kann"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:62
@@ -7407,7 +7412,7 @@ msgstr "Geschlecht"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:11
 msgid "Are you sure you want to quit?"
-msgstr "Willst Du das Spiel wirklich beenden?"
+msgstr "Willst du das Spiel wirklich beenden?"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:15
 msgid "Back to work..."
@@ -7507,7 +7512,7 @@ msgstr "Beweglich"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
 msgid "Physical"
-msgstr "Physik-Eigenschaften"
+msgstr "Physisch"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
 msgid "Set scale:"
@@ -7523,15 +7528,15 @@ msgstr "* beanspruchen"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
 msgid "* object info"
-msgstr "* Objekteigeschaften"
+msgstr "* Objektinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
 msgid "* mesh info"
-msgstr "* Modelleigenschaften"
+msgstr "* Modellinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
 msgid "* attachment info"
-msgstr "* Anhängerkupplung"
+msgstr "* Anhangsinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
 msgid "Show help"
@@ -7806,7 +7811,7 @@ msgstr "Sound-Info einblenden"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
 msgid "Are you sure you want to reset all key bindings?"
-msgstr "Willst Du wirklich alle Einstellungen zurücksetzen?"
+msgstr "Willst du wirklich alle Einstellungen zurücksetzen?"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
 msgid "Reset key bindings"
@@ -8228,7 +8233,7 @@ msgid ""
 "models"
 msgstr ""
 "Stelle für jede Waffe ein anderes Fadenkreuz ein. Diese Option ist zu "
-"empfehlen, wenn Du ohne dargestelltes Waffenmodel spielst"
+"empfehlen, wenn du ohne dargestelltes Waffenmodel spielst"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
@@ -8268,7 +8273,7 @@ msgid ""
 msgstr ""
 "Keine: Für das Fadenkreuz keine Treffertests ausführen; TrueAim: Das "
 "Fadenkreuz verschwimmt, wenn ein Hindernis zwischen deiner Waffen und dem "
-"Ziel ist; Feinde: Das Fadenkreuz wird auch vergrößert, wenn Du einen Feind "
+"Ziel ist; Feinde: Das Fadenkreuz wird auch vergrößert, wenn du einen Feind "
 "treffen würdest"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
@@ -8309,7 +8314,7 @@ msgstr "Punktetafel"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
 msgid "Fading speed:"
-msgstr "Ausblendegeschwindigkeit:"
+msgstr "Ausblendgeschwindigkeit:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
 msgid "Enable rows / columns highlighting"
@@ -8342,7 +8347,7 @@ msgstr "Wegpunkte für feste Ziele auf der Karte anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
 msgid "Show various gametype specific waypoints"
-msgstr "Lass Dir verschiedene Spieltyp spezifische Wegpunkte anzeigen"
+msgstr "Lass dir verschiedene Spieltyp spezifische Wegpunkte anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
 msgid "Control transparency of the waypoints"
@@ -8391,7 +8396,7 @@ msgstr "Namen über Spielern anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
 msgid "Max distance:"
-msgstr "Maximale Entferung:"
+msgstr "Max. Entfernung:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
 msgid "Decolorize:"
@@ -8441,7 +8446,7 @@ msgstr "Um den HUD-Editor zu starten, muss ein Spiel gestartet werden."
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
 msgid "Do you wish to start a local game to set up the HUD?"
-msgstr "Willst Du ein lokales Spiel starten, um das HUD zu bearbeiten?"
+msgstr "Willst du ein lokales Spiel starten, um das HUD zu bearbeiten?"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
 msgid "Frag Information"
@@ -8791,7 +8796,7 @@ msgid ""
 "you are carrying"
 msgstr ""
 "Wechsel automatisch zu der neu aufgesammelten Waffe, wenn diese in der Liste "
-"weiter oben steht als die, welche Du gerade trägst"
+"weiter oben steht als die, welche du gerade trägst"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:61
 msgid "Release attack buttons when you switch weapons"
@@ -9074,7 +9079,7 @@ msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:116
 msgid "Idle limit:"
-msgstr "wenn inaktiv:"
+msgstr "Wenn inaktiv:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
 msgid "IDLFPS^Unlimited"
@@ -9135,7 +9140,7 @@ msgstr "Erweiterte Einstellungen …"
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:152
 msgid "Advanced settings where you can tweak every single variable of the game"
 msgstr ""
-"Erweiterte Einstellungen, in denen Du jede beliebige Variable des Spiels "
+"Erweiterte Einstellungen, in denen du jede beliebige Variable des Spiels "
 "ändern kannst"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:157
@@ -9210,7 +9215,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
 msgid "full language changes will take effect starting from the next game"
-msgstr "volle Sprachänderungen finden erst nach dem Neustart des Spiels statt."
+msgstr "volle Sprachänderungen finden erst nach dem Neustart des Spiels statt"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
 msgid "Disconnect now"
@@ -9599,7 +9604,7 @@ msgstr "Dürfen Spielerstatistiken deinen Spitznamen aufnehmen?"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:12
 msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr "Wenn Du „Nein“ sagst, wirst Du als „Anonymer Spieler“ erscheinen"
+msgstr "Wenn du „Nein“ sagst, wirst du als „Anonymer Spieler“ erscheinen"
 
 #: qcsrc/menu/xonotic/gametypelist.qc:87
 msgid "teamplay"
index b2355d5c2c8b9d28a0f3cc04c44777b007a956e6..e76010a6d6ab47802ee43202a90bb7e4cea219ed 100644 (file)
@@ -5,7 +5,7 @@
 # Translators:
 # afba88cf42cbdff57149d4a6d53a94f9, 2018
 # Wuzzy <almikes@aol.com>, 2016-2018
-# Brot Brot <noah.schluessel@gmail.com>, 2015
+# TheTrueBrot <noah.schluessel@gmail.com>, 2015
 # cvcxc <hans.andersen72@yahoo.com>, 2013
 # divVerent <divVerent@xonotic.org>, 2011,2013
 # divVerent <divVerent@xonotic.org>, 2013-2015
@@ -19,6 +19,7 @@
 # divVerent <divVerent@xonotic.org>, 2011
 # Sless <sless@gmx.net>, 2014
 # Sless <sless@gmx.net>, 2014
+# TheTrueBrot <noah.schluessel@gmail.com>, 2015
 # Wuzzy <almikes@aol.com>, 2016
 # Yepoleb <huberg18@gmail.com>, 2013
 msgid ""
@@ -26,8 +27,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-23 12:22+0000\n"
-"Last-Translator: Mirio <opivy@hotmail.de>\n"
+"PO-Revision-Date: 2019-11-09 23:02+0000\n"
+"Last-Translator: Wuzzy <almikes@aol.com>\n"
 "Language-Team: German (http://www.transifex.com/team-xonotic/xonotic/"
 "language/de/)\n"
 "Language: de\n"
@@ -187,7 +188,7 @@ msgstr "Bereit"
 #: qcsrc/client/hud/panel/infomessages.qc:164
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr "%sDrücke ^3%s%s, sobald Du bereit bist"
+msgstr "%sDrücke ^3%s%s, sobald du bereit bist"
 
 #: qcsrc/client/hud/panel/infomessages.qc:169
 msgid "^2Waiting for others to ready up to end warmup..."
@@ -235,7 +236,7 @@ msgstr "^3Doppelklicke ^7ein Panel für Panel-spezifische Optionen."
 
 #: qcsrc/client/hud/panel/infomessages.qc:229
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
-msgstr "^3CTRL^7, um Kollisionstests zu deaktivieren, ^3SHIFT ^7und"
+msgstr "^3STRG^7, um Kollisionstests zu deaktivieren, ^3UMSCHALT ^7und"
 
 #: qcsrc/client/hud/panel/infomessages.qc:230
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
@@ -281,259 +282,259 @@ msgstr "QMCMD^Sende öffentliche Nachricht an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
-msgstr ":-) / gut gemacht"
+msgstr "QMCMD^:-) / gut gemacht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^nice one"
-msgstr "gut gemacht"
+msgstr "QMCMD^Gut gemacht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:784
 msgid "QMCMD^good game"
-msgstr "gutes Spiel"
+msgstr "QMCMD^Gut gespielt"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck"
-msgstr "Hallo / Viel Glück"
+msgstr "QMCMD^Hallo / Viel Glück"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck and have fun"
-msgstr "Hallo / Viel Glück und habt Spass"
+msgstr "QMCMD^Hallo / Viel Glück und habt Spass"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
-msgstr "QMCMD^Sende in Englisch"
+msgstr "QMCMD^Auf Englisch senden"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^Team chat"
-msgstr "Teamchat"
+msgstr "QMCMD^Teamchat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
-msgstr "Quad kommt bald"
+msgstr "QMCMD^Quad kommt bald"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr "freier Gegenstand %x^7 (l:%y^7)"
+msgstr "QMCMD^Freier Gegenstand %x^7 (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item, icon"
-msgstr "freier Gegenstand, Icon"
+msgstr "QMCMD^Freier Gegenstand, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item (l:%l^7)"
-msgstr "Gegenstand genommen (l:%l^7)"
+msgstr "QMCMD^Gegenstand genommen (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item, icon"
-msgstr "Gegenstand genommen, Icon"
+msgstr "QMCMD^Gegenstand genommen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:796
 msgid "QMCMD^negative"
-msgstr "Negativ"
+msgstr "QMCMD^Negativ"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:797
 msgid "QMCMD^positive"
-msgstr "Positiv"
+msgstr "QMCMD^Positiv"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "brauche Hilfe (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Brauche Hilfe (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help, icon"
-msgstr "brauche Hilfe, Icon"
+msgstr "QMCMD^Brauche Hilfe, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen (l:%y^7)"
-msgstr "Gegner gesehen (l:%y^7)"
+msgstr "QMCMD^Gegner gesehen (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen, icon"
-msgstr "Gegner gesehen, icon"
+msgstr "QMCMD^Gegner gesehen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen (l:%y^7)"
-msgstr "Flagge gesehen (l:%y^7)"
+msgstr "QMCMD^Flagge gesehen (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen, icon"
-msgstr "Flagge gesehen, Icon"
+msgstr "QMCMD^Flagge gesehen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "verteidigen (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Verteidigend (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending, icon"
-msgstr "verteidigen, Icon"
+msgstr "QMCMD^Verteidigend, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "wandernd (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Wandernd (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming, icon"
-msgstr "wandernd, Icon"
+msgstr "QMCMD^Wandernd, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "angreifen (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^Angreifend (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking, icon"
-msgstr "angreifen, Icon"
+msgstr "QMCMD^Angreifend, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier (l:%y^7)"
-msgstr "Flaggenträger getötet (l:%y^7)"
+msgstr "QMCMD^Flaggenträger getötet (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier, icon"
-msgstr "Flaggenträger getötet, Icon"
+msgstr "QMCMD^Flaggenträger getötet, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 #, c-format
 msgid "QMCMD^dropped flag (l:%d^7)"
-msgstr "Flagge fallen gelassen (l:%d^7)"
+msgstr "QMCMD^Flagge weggeworfen (l:%d^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 msgid "QMCMD^dropped flag, icon"
-msgstr "Flagge fallen gelassen, Icon"
+msgstr "QMCMD^Flagge weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^drop weapon, icon"
-msgstr "Waffe wegwerfen, Icon"
+msgstr "QMCMD^Waffe weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr "Waffe fallen gelassen %w^7 (l:%l^7)"
+msgstr "QMCMD^Waffe weggeworfen %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^drop flag/key, icon"
-msgstr "Flagge/Schlüssel fallen gelassen, Icon"
+msgstr "QMCMD^Flagge/Schlüssel weggeworfen, Icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
-msgstr "Flagge/Schlüssel fallen gelassen %w^7 (l:%l^7)"
+msgstr "QMCMD^Flagge/Schlüssel weggeworfen %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:811
 msgid "QMCMD^Send private message to"
-msgstr "Sende private Nachricht an"
+msgstr "QMCMD^Sende private Nachricht an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:813
 #: qcsrc/client/hud/panel/quickmenu.qc:848
 msgid "QMCMD^Settings"
-msgstr "Einstellungen"
+msgstr "QMCMD^Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:814
 #: qcsrc/client/hud/panel/quickmenu.qc:821
 msgid "QMCMD^View/HUD settings"
-msgstr "Ansicht/HUD-Einstellungen"
+msgstr "QMCMD^Ansicht/HUD-Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:815
 msgid "QMCMD^3rd person view"
-msgstr "Dritte-Person-Ansicht"
+msgstr "QMCMD^Dritte-Person-Ansicht"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:816
 msgid "QMCMD^Player models like mine"
-msgstr "Spielermodelle wie meins"
+msgstr "QMCMD^Spielermodelle wie meins"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:817
 msgid "QMCMD^Names above players"
-msgstr "Namen über Spieler"
+msgstr "QMCMD^Namen über Spieler"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:818
 msgid "QMCMD^Crosshair per weapon"
-msgstr "Fadenkreuz je nach Waffe"
+msgstr "QMCMD^Fadenkreuz je nach Waffe"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:819
 msgid "QMCMD^FPS"
-msgstr "FPS"
+msgstr "QMCMD^FPS"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:820
 msgid "QMCMD^Net graph"
-msgstr "Netzwerkgraph"
+msgstr "QMCMD^Netzwerkgraph"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:823
 #: qcsrc/client/hud/panel/quickmenu.qc:826
 msgid "QMCMD^Sound settings"
-msgstr "Ton-Einstellungen"
+msgstr "QMCMD^Ton-Einstellungen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:824
 msgid "QMCMD^Hit sound"
-msgstr "Ton bei Treffer"
+msgstr "QMCMD^Ton bei Treffer"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:825
 msgid "QMCMD^Chat sound"
-msgstr "Chat-Ton"
+msgstr "QMCMD^Chat-Ton"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:830
 #: qcsrc/client/hud/panel/quickmenu.qc:834
 msgid "QMCMD^Spectator camera"
-msgstr "Zuschauerkamera"
+msgstr "QMCMD^Zuschauerkamera"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:831
 msgid "QMCMD^1st person"
-msgstr "Ego-Perspektive"
+msgstr "QMCMD^Ego-Perspektive"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:832
 msgid "QMCMD^3rd person around player"
-msgstr "Dritte-Person-Ansicht um Spieler"
+msgstr "QMCMD^Dritte-Person-Ansicht um Spieler"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:833
 msgid "QMCMD^3rd person behind"
-msgstr "Dritte-Person-Ansicht (hinter)"
+msgstr "QMCMD^Dritte-Person-Ansicht (hinter)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:839
 #: qcsrc/client/hud/panel/quickmenu.qc:844
 msgid "QMCMD^Observer camera"
-msgstr "Beobachterkamera"
+msgstr "QMCMD^Beobachterkamera"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:840
 msgid "QMCMD^Increase speed"
-msgstr "Tempo erhöhen"
+msgstr "QMCMD^Tempo erhöhen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:841
 msgid "QMCMD^Decrease speed"
-msgstr "Tempo verringern"
+msgstr "QMCMD^Tempo verringern"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:842
 msgid "QMCMD^Wall collision off"
-msgstr "Wandkollision aus"
+msgstr "QMCMD^Wandkollision aus"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:843
 msgid "QMCMD^Wall collision on"
-msgstr "Wandkollision an"
+msgstr "QMCMD^Wandkollision an"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:847
 msgid "QMCMD^Fullscreen"
-msgstr "Vollbild"
+msgstr "QMCMD^Vollbild"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:850
 #: qcsrc/client/hud/panel/quickmenu.qc:860
 msgid "QMCMD^Call a vote"
-msgstr "Abstimmung starten"
+msgstr "QMCMD^Abstimmung starten"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:851
 msgid "QMCMD^Restart the map"
-msgstr "Karte neustarten"
+msgstr "QMCMD^Karte neustarten"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:852
 msgid "QMCMD^End match"
-msgstr "Spiel beenden"
+msgstr "QMCMD^Spiel beenden"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:855
 msgid "QMCMD^Reduce match time"
-msgstr "Spielzeit verringern"
+msgstr "QMCMD^Spielzeit verringern"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:856
 msgid "QMCMD^Extend match time"
-msgstr "Spielzeit erhöhen"
+msgstr "QMCMD^Spielzeit erhöhen"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:859
 msgid "QMCMD^Shuffle teams"
-msgstr "Teams mischen"
+msgstr "QMCMD^Teams mischen"
 
 #: qcsrc/client/hud/panel/racetimer.qc:54
 #, c-format
@@ -569,7 +570,7 @@ msgstr "STRAFE: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
-msgstr "einen Checkpoint verpasst"
+msgstr "einen Kontrollpunkt verpasst"
 
 #: qcsrc/client/hud/panel/radar.qc:373
 msgid "Click to select teleport destination"
@@ -585,11 +586,11 @@ msgstr "Anzahl an Ballbesitzer-Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "SCO^bckills"
-msgstr "bbkills"
+msgstr "Bbkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "SCO^bctime"
-msgstr "bbzeit"
+msgstr "Bbzeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "Total amount of time holding the ball in Keepaway"
@@ -602,11 +603,11 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "SCO^caps"
-msgstr "caps"
+msgstr "Caps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "SCO^captime"
-msgstr "capzeit"
+msgstr "Capzeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "Time of fastest capture (CTF)"
@@ -618,7 +619,7 @@ msgstr "Anzahl Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
-msgstr "tode"
+msgstr "Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "Number of keys destroyed by pushing them into void"
@@ -631,7 +632,7 @@ msgstr "zerstört"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "SCO^damage"
-msgstr "schaden"
+msgstr "Schaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
@@ -639,11 +640,11 @@ msgstr "Angerichteter Gesamtschaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
-msgstr "scherhal"
+msgstr "Scherhal"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "The total damage taken"
-msgstr "Erhaltenen Gesamtschaden"
+msgstr "Erhaltener Gesamtschaden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "Number of flag drops"
@@ -651,19 +652,19 @@ msgstr "Anzahl fallengelassener Flaggen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "SCO^drops"
-msgstr "fallen"
+msgstr "Falleng"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "Player ELO"
-msgstr "Spieler-ELO"
+msgstr "Spieler-Elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "SCO^elo"
-msgstr "elo"
+msgstr "Elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "SCO^fastest"
-msgstr "schnellste"
+msgstr "Schnellste"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "Time of fastest lap (Race/CTS)"
@@ -683,7 +684,7 @@ msgstr "Anzahl an Flaggenträgerkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:99
 msgid "SCO^fckills"
-msgstr "fckills"
+msgstr "Ftkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "FPS"
@@ -691,7 +692,7 @@ msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "SCO^fps"
-msgstr "fps"
+msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "Number of kills minus suicides"
@@ -699,7 +700,7 @@ msgstr "Anzahl Kills minus Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "SCO^frags"
-msgstr "frags"
+msgstr "Frags"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "Number of goals scored"
@@ -707,7 +708,7 @@ msgstr "Anzahl geschossener Tore"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "SCO^goals"
-msgstr "tore"
+msgstr "Tore"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "Number of keys carrier kills"
@@ -715,11 +716,11 @@ msgstr "Anzahl an Schlüsselträgerkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "SCO^kckills"
-msgstr "kckills"
+msgstr "Stkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:104
 msgid "SCO^k/d"
-msgstr "k/d"
+msgstr "K/T"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:104
 #: qcsrc/client/hud/panel/scoreboard.qc:105
@@ -729,11 +730,11 @@ msgstr "Das Kill-/Tod-Verhältnis"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^kdr"
-msgstr "kdr"
+msgstr "KTV"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "SCO^kdratio"
-msgstr "kdratio"
+msgstr "KT-Verh."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "Number of kills"
@@ -741,7 +742,7 @@ msgstr "Anzahl an Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^kills"
-msgstr "kills"
+msgstr "Kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "Number of laps finished (Race/CTS)"
@@ -749,7 +750,7 @@ msgstr "Anzahl gedrehter Runden (Rennen/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "SCO^laps"
-msgstr "runden"
+msgstr "Runden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "Number of lives (LMS)"
@@ -757,7 +758,7 @@ msgstr "Anzahl Leben (LMS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "SCO^lives"
-msgstr "leben"
+msgstr "Leben"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of times a key was lost"
@@ -765,7 +766,7 @@ msgstr "Wie oft ein Schlüssel verloren wurde"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "SCO^losses"
-msgstr "verloren"
+msgstr "Verlor"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 #: qcsrc/client/hud/panel/scoreboard.qc:112
@@ -774,19 +775,19 @@ msgstr "Spielername"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "SCO^name"
-msgstr "name"
+msgstr "Name"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "SCO^nick"
-msgstr "nick"
+msgstr "Nick"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of objectives destroyed"
-msgstr "Anzahl an zerstörten Zielen"
+msgstr "Anzahl an zerstörten Angriffszielen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^objectives"
-msgstr "ziele"
+msgstr "Ziele"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid ""
@@ -797,7 +798,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid "SCO^pickups"
-msgstr "aufheb"
+msgstr "Aufheb"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "Ping time"
@@ -805,7 +806,7 @@ msgstr "Latenz"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "SCO^ping"
-msgstr "ping"
+msgstr "Ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "Packet loss"
@@ -813,7 +814,7 @@ msgstr "Paketverlust"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "SCO^pl"
-msgstr "pl"
+msgstr "Pv"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of players pushed into void"
@@ -821,7 +822,7 @@ msgstr "Anzahl der Spieler, die in die Leere geschubst wurden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^pushes"
-msgstr "schubser"
+msgstr "Schubser"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "Player rank"
@@ -829,7 +830,7 @@ msgstr "Spielerrang"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "SCO^rank"
-msgstr "rang"
+msgstr "Rang"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of flag returns"
@@ -845,7 +846,7 @@ msgstr "Anzahl Wiederbelebungen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "SCO^revivals"
-msgstr "wiederbelebungen"
+msgstr "Wiederbe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of rounds won"
@@ -853,11 +854,11 @@ msgstr "Anzahl gewonnener Runden"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^rounds won"
-msgstr "gewonnene Runden"
+msgstr "Rundensiege"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "SCO^score"
-msgstr "punkte"
+msgstr "Punkte"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "Total score"
@@ -869,7 +870,7 @@ msgstr "Anzahl Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^suicides"
-msgstr "suizide"
+msgstr "Suizide"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "Number of kills minus deaths"
@@ -877,7 +878,7 @@ msgstr "Anzahl der Kills minus der Tode"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^sum"
-msgstr "summe"
+msgstr "Summe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of domination points taken (Domination)"
@@ -885,7 +886,7 @@ msgstr "Anzahl eroberter Dominationspunkte (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^takes"
-msgstr "takes"
+msgstr "erobert"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of teamkills"
@@ -893,19 +894,19 @@ msgstr "Anzahl der Teamkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^teamkills"
-msgstr "teamkills"
+msgstr "Teamkills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "Number of ticks (Domination)"
-msgstr "Anzahl Ticks (Domination)"
+msgstr "Anzahl der Ticks/Zeiteinheiten (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^ticks"
-msgstr "ticks"
+msgstr "Ticks"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^time"
-msgstr "zeit"
+msgstr "Zeit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "Total time raced (Race/CTS)"
@@ -948,7 +949,7 @@ msgid ""
 "it into the cvar scoreboard_columns so you can edit it"
 msgstr ""
 "^2scoreboard_columns_set ^3expand_default ^7lädt das Standard-Layout und "
-"expandiert es in die cvar scoreboard_columns, damit Du sie bearbeiten kannst"
+"expandiert es in die cvar scoreboard_columns, damit du sie bearbeiten kannst"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:319
 msgid "You can use a ^3|^7 to start the right-aligned fields."
@@ -966,7 +967,7 @@ msgid ""
 "or in all but these game types. You can also specify 'all' as a\n"
 "field to show all fields available for the current game mode."
 msgstr ""
-"Vor einem Feld kannst Du ein Plus- oder Minuszeichen setzen, dann\n"
+"Vor einem Feld kannst du ein Plus- oder Minuszeichen setzen, dann\n"
 "eine kommagetrennte Liste an Spieltypen, dann ein Schrägstrich,\n"
 "um das Feld nur in diesen oder in allen ausser diesen Spieltypen\n"
 "anzuzeigen. Du kannst ausserdem „all“ als ein Feld angeben, um\n"
@@ -1016,7 +1017,7 @@ msgstr "N/V"
 #: qcsrc/client/hud/panel/scoreboard.qc:1188
 #, c-format
 msgid "Accuracy stats (average %d%%)"
-msgstr "Genauigkeit (Durchschn.: %d%%)"
+msgstr "Genauigkeitsstatistik (Durchschnitt: %d%%)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1336
 msgid "Map stats:"
@@ -1047,7 +1048,7 @@ msgstr "^3%1.0f Minuten"
 #: qcsrc/client/hud/panel/scoreboard.qc:1629
 #, c-format
 msgid "^5%s %s"
-msgstr "^5%s%s"
+msgstr "^5%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1623
 #: qcsrc/client/hud/panel/scoreboard.qc:1630
@@ -1061,13 +1062,13 @@ msgstr "Punkte"
 #: qcsrc/client/hud/panel/scoreboard.qc:1643
 #: qcsrc/client/hud/panel/scoreboard.qc:1650
 msgid "SCO^is beaten"
-msgstr "wurde geschlagen"
+msgstr "geschlagen"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1641
 #: qcsrc/client/hud/panel/scoreboard.qc:1648
 #, c-format
 msgid "^2+%s %s"
-msgstr "^2+%s%s"
+msgstr "^2+%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1659
 #, c-format
@@ -1082,7 +1083,7 @@ msgstr "Geschwindigkeitspreis: %d%s ^7(%s^7)"
 #: qcsrc/client/hud/panel/scoreboard.qc:1802
 #, c-format
 msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr "Rekordzeit: %d%s ^7(%s^7)"
+msgstr "Rekordtempo: %d%s ^7(%s^7)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1818
 #, c-format
@@ -1110,7 +1111,7 @@ msgstr "AUFWÄRMPHASE"
 
 #: qcsrc/client/hud/panel/vote.qc:27
 msgid "^1You must answer before entering hud configure mode"
-msgstr "^1Du musst antworten, bevor Du den HUD-Konfigurationsmodus betrittst"
+msgstr "^1Du musst antworten, bevor du den HUD-Konfigurationsmodus betrittst"
 
 #: qcsrc/client/hud/panel/vote.qc:30
 msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
@@ -1253,7 +1254,7 @@ msgstr ""
 
 #: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
 msgid "Ball Stealer"
-msgstr "Ball-Dieb"
+msgstr "Balldieb"
 
 #: qcsrc/common/items/item/ammo.qh:66
 msgid "bullets"
@@ -1581,7 +1582,7 @@ msgstr "Spiel vorbei!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr "Gut gemacht! Klicke 'Nächstes Level' um fortzufahren"
+msgstr "Gut gemacht! Klicke „Nächstes Level“, um fortzufahren"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
@@ -1718,12 +1719,12 @@ msgstr "KI-Spieler entfernen"
 
 #: qcsrc/common/minigames/minigame/pp.qc:2
 msgid "Push-Pull"
-msgstr "Drücken-Ziehen"
+msgstr "Schiebezieh"
 
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
 msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr "Wähle im Menü \"^1Nächstes Spiel^7\" für eine Revanche!"
+msgstr "Wähle im Menü „^1Nächstes Spiel^7“ für eine Revanche!"
 
 #: qcsrc/common/minigames/minigame/pp.qc:444
 #: qcsrc/common/minigames/minigame/pp.qc:450
@@ -1748,11 +1749,11 @@ msgstr "Solitär"
 
 #: qcsrc/common/minigames/minigame/ps.qc:414
 msgid "All pieces cleared!"
-msgstr "Alle Teile abgeräumt!"
+msgstr "Alle Figuren abgeräumt!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:416
 msgid "Remaining pieces:"
-msgstr "Übrige Teile:"
+msgstr "Verbleibende Figuren:"
 
 #: qcsrc/common/minigames/minigame/ps.qc:481
 #, c-format
@@ -1765,11 +1766,11 @@ msgstr "Keine verbleibenden gültigen Züge"
 
 #: qcsrc/common/minigames/minigame/ps.qc:494
 msgid "Well done, you win!"
-msgstr "Gut gemacht, Du gewinnst!"
+msgstr "Gut gemacht, du gewinnst!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:497
 msgid "Jump a piece over another to capture it"
-msgstr "Spring mit einer Spielfigur über einer anderen, um sie zu stehlen"
+msgstr "Spring mit einer Spielfigur über einer anderen, um sie zu schnappen"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:2
 msgid "Tic Tac Toe"
@@ -1832,7 +1833,7 @@ msgstr "Geschwindigkeit"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:43
 msgid "Medic"
-msgstr "Medizin"
+msgstr "Sanitäter"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:54
 msgid "Bash"
@@ -1954,7 +1955,7 @@ msgstr "Spawn-Granate"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:50
 msgid "Heal grenade"
-msgstr "Heilgranate"
+msgstr "Medizingranate"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:58
 msgid "Monster grenade"
@@ -2018,7 +2019,7 @@ msgstr "Gegenstand"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:12
 msgid "Checkpoint"
-msgstr "Checkpoint"
+msgstr "Kontrollpunkt"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:13
 #: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
@@ -2171,7 +2172,7 @@ msgid ""
 "%s^BG's previous record of ^F2%s^BG seconds"
 msgstr ""
 "^BG%s^BG hat die ^TC^TT^BG Flagge in ^F1%s^BG Sekunden erobert, und damit ^BG"
-"%s^BGs Rekord von ^F2%s^BG Sekunden gebrochen"
+"%s^BGs Rekord von ^F2%s^BG Sekunden geschlagen"
 
 #: qcsrc/common/notifications/all.inc:243
 #, c-format
@@ -2190,7 +2191,7 @@ msgid ""
 "^BG%s^BG's previous record of ^F1%s^BG seconds"
 msgstr ""
 "^BG%s^BG hat die ^TC^TT^BG Flagge in ^F1%s^BG Sekunden erobert, konnte "
-"jedoch nicht ^BG%s^BGs Rekord von ^F2%s^BG Sekunden brechen"
+"jedoch nicht ^BG%s^BGs Rekord von ^F2%s^BG Sekunden schlagen"
 
 #: qcsrc/common/notifications/all.inc:246
 msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
@@ -2224,8 +2225,8 @@ msgid ""
 "^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to "
 "base"
 msgstr ""
-"^BGDie ^TC^TT^BG Flagge fiel an einen unerreichbaren Ort und ist daher aus "
-"Langeweile heimgeflogen"
+"^BGDie ^TC^TT^BG Flagge fiel an einen unerreichbaren Ort und ist daher "
+"heimgeflogen"
 
 #: qcsrc/common/notifications/all.inc:253
 msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
@@ -2303,7 +2304,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:271
 msgid "^F1Round already started, you will join the game in the next round"
 msgstr ""
-"^F1Die Runde hat bereits begonnen, daher musst Du auf die nächste Runde "
+"^F1Die Runde hat bereits begonnen, daher musst du auf die nächste Runde "
 "warten"
 
 #: qcsrc/common/notifications/all.inc:272
@@ -2313,13 +2314,13 @@ msgstr "^F2Du wirst in der nächsten Runde zuschauen"
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1 Bonus getötet ^K1%s%s"
+msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1-Bonus getötet ^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
 msgstr ""
-"^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1 Bonus zu Punkten verarbeitet ^K1%s"
+"^BG%s%s^K1 wurde durch ^BG%s^K1s ^BG%s^K1-Bonus zu Punkten verarbeitet ^K1%s"
 "%s"
 
 #: qcsrc/common/notifications/all.inc:275
@@ -2365,12 +2366,12 @@ msgstr "^BG%s%s^K1 wurde in die Luft gejagt von ^BG%s^K1s Granate%s%s"
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
-msgstr "^BG%s%s^K1 trat einer Napalm-Explosion ein wenig zu nahe%s%s"
+msgstr "^BG%s%s^K1 trat einer Napalmexplosion ein wenig zu nahe%s%s"
 
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
-msgstr "^BG%s%s^K1 wurde von ^BG%s^K1s Napalm-Granate abgefackelt%s%s"
+msgstr "^BG%s%s^K1 wurde von ^BG%s^K1s Napalmgranate abgefackelt%s%s"
 
 #: qcsrc/common/notifications/all.inc:283
 #, c-format
@@ -2605,12 +2606,12 @@ msgstr "^BG%s^K1 meisterte die Kunst der Selbstsprengung%s%s"
 #, c-format
 msgid ""
 "^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s"
-msgstr "^BG%s^K1 wollte sich so eine Napalm-Explosion mal genauer ansehen%s%s"
+msgstr "^BG%s^K1 wollte sich so eine Napalmexplosion mal genauer ansehen%s%s"
 
 #: qcsrc/common/notifications/all.inc:324
 #, c-format
 msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
-msgstr "^BG%s^K1 wurde von der eigenen Napalm-Granate verbrannt%s%s"
+msgstr "^BG%s^K1 wurde von der eigenen Napalmgranate verbrannt%s%s"
 
 #: qcsrc/common/notifications/all.inc:326
 #, c-format
@@ -2625,7 +2626,7 @@ msgstr "^BG%s^K1 erfror durch die eigene Eisgranate%s%s"
 #: qcsrc/common/notifications/all.inc:327
 #, c-format
 msgid "^BG%s^K1's Healing Nade didn't quite heal them%s%s"
-msgstr "^BG%s^K1s Medizin-Granate war nicht sehr heilsam%s%s"
+msgstr "^BG%s^K1s Medizingranate war nicht sehr heilsam%s%s"
 
 #: qcsrc/common/notifications/all.inc:328
 #, c-format
@@ -2782,7 +2783,7 @@ msgstr "^BG%s^K1 konnte keinen Schutz vor der Raserrakete finden%s%s"
 #: qcsrc/common/notifications/all.inc:359
 #, c-format
 msgid "^BG%s^K1 was betrayed by ^BG%s^K1%s%s"
-msgstr "^BG%s^K1 wurde von ^BG%s^K1 betrogen%s%s"
+msgstr "^BG%s^K1 wurde von ^BG%s^K1 verraten%s%s"
 
 #: qcsrc/common/notifications/all.inc:361
 #, c-format
@@ -2792,12 +2793,12 @@ msgstr "^BG%s^BG%s^BG (%s %s alle %s Sekunden)"
 #: qcsrc/common/notifications/all.inc:363
 #, c-format
 msgid "^BG%s^K1 was frozen by ^BG%s"
-msgstr "^BG%s^K1 wurde von ^BG vereist%s"
+msgstr "^BG%s^K1 wurde von ^BG%s^K1 vereist"
 
 #: qcsrc/common/notifications/all.inc:364
 #, c-format
 msgid "^BG%s^K3 was revived by ^BG%s"
-msgstr "^BG%s^K3 wurde von ^BG wiederbelebt%s"
+msgstr "^BG%s^K3 wurde von ^BG%s^K3 wiederbelebt"
 
 #: qcsrc/common/notifications/all.inc:365
 #, c-format
@@ -2844,7 +2845,7 @@ msgstr "^BGDie Runde ist vorbei, aber es gibt keinen Gewinner"
 #: qcsrc/common/notifications/all.inc:375
 #, c-format
 msgid "^BGGodmode saved you %s units of damage, cheater!"
-msgstr "^BGGodmode ersparte Dir %s Schaden, Du Cheater!"
+msgstr "^BGGodmode ersparte dir %s Schaden, du Cheater!"
 
 #: qcsrc/common/notifications/all.inc:377
 #, c-format
@@ -2987,12 +2988,12 @@ msgstr "^BGTeam ^TC^TT^BG hielt den Ball zu lange fest"
 #: qcsrc/common/notifications/all.inc:411
 #, c-format
 msgid "^BG%s^BG captured %s^BG control point"
-msgstr "^BG%s^BG hat einen Kontrollpunkt erobert: %s^BG"
+msgstr "^BG%s^BG hat Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:412
 #, c-format
 msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
-msgstr "^TC^TT^BGEin Kontrollpunkt vom Team %s^BG wurde von %s zerstört"
+msgstr "Team ^TC^TT^BG ihr Kontrollpunkt „%s^BG“ wurde von %s zerstört"
 
 #: qcsrc/common/notifications/all.inc:413
 msgid "^TC^TT^BG generator has been destroyed"
@@ -3039,7 +3040,7 @@ msgid ""
 "^F2You were kicked from the server because you are a spectator and "
 "spectators aren't allowed at the moment."
 msgstr ""
-"^F2Du wurdest vom Server gekickt, weil Du Zuschauer bist, und Beobachter "
+"^F2Du wurdest vom Server gekickt, weil du Zuschauer bist, und Beobachter "
 "sind im Moment nicht erlaubt."
 
 #: qcsrc/common/notifications/all.inc:424
@@ -3060,12 +3061,15 @@ msgstr "^BG%s^BG hat das Rennen aufgegeben"
 #: qcsrc/common/notifications/all.inc:428
 #, c-format
 msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG konnte seinen %s%s^BG Platz nicht brechen von %s%s %s"
+msgstr ""
+"^BG%s^BG konnte den eigenen Rekord auf dem %s%s^BG Platz von %s%s %s nicht "
+"schlagen"
 
 #: qcsrc/common/notifications/all.inc:429
 #, c-format
 msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG konnte den %s%s^BG Platz von %s%s nicht brechen%s"
+msgstr ""
+"^BG%s^BG konnte den Rekord auf dem %s%s^BG Platz von %s%s %s nicht schlagen"
 
 #: qcsrc/common/notifications/all.inc:430
 #, c-format
@@ -3080,7 +3084,8 @@ msgstr "^BG%s^BG brach %s^BGs %s%s^BG Rekord mit %s%s %s"
 #: qcsrc/common/notifications/all.inc:432
 #, c-format
 msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
-msgstr "^BG%s^BG verbesserte seinen %s%s^BG Rekord mit %s%s %s"
+msgstr ""
+"^BG%s^BG verbesserte den eigenen Rekord auf dem %s%s^BG Platz mit %s%s %s"
 
 #: qcsrc/common/notifications/all.inc:433
 #, c-format
@@ -3088,8 +3093,8 @@ msgid ""
 "^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
 "and will be lost."
 msgstr ""
-"^BG%s^BG hat einen neuen Rekord ^F2%s^BG erziehlt, aber unglücklicherweise "
-"hat er keine UID und der Rekord wird verloren gehen."
+"^BG%s^BG hat einen neuen Rekord ^F2%s^BG erzielt, aber unglücklicherweise "
+"ist keine UID vorhanden und der Rekord wird verloren gehen."
 
 #: qcsrc/common/notifications/all.inc:434
 #, c-format
@@ -3097,8 +3102,8 @@ msgid ""
 "^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
 "lost."
 msgstr ""
-"^BG%s^BG hat einen neuen Rekord mit ^F2%s^BG erziehlt, aber er ist "
-"anonymisiert und wird verloren gehen."
+"^BG%s^BG hat einen neuen Rekord mit ^F2%s^BG erzielt, aber er ist anonym und "
+"wird verloren gehen."
 
 #: qcsrc/common/notifications/all.inc:435
 #, c-format
@@ -3124,7 +3129,7 @@ msgid ""
 "^F2You have to become a player within the next %s, otherwise you will be "
 "kicked, because spectating isn't allowed at this time!"
 msgstr ""
-"^F2Du musst in den nächsten %s Spieler werden, oder Du wirst gekickt, denn "
+"^F2Du musst in den nächsten %s Spieler werden, oder du wirst gekickt, denn "
 "zuschauen ist momentan nicht erlaubt."
 
 #: qcsrc/common/notifications/all.inc:443
@@ -3146,7 +3151,7 @@ msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
 "^F2Xonotic %s"
 msgstr ""
-"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s (beta)^BG, Du hast "
+"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s (beta)^BG, du hast "
 "^F2Xonotic %s"
 
 #: qcsrc/common/notifications/all.inc:449
@@ -3154,7 +3159,7 @@ msgstr ""
 msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
 msgstr ""
-"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s^BG, Du hast^F2Xonotic "
+"^F4Anmerkung: ^BGDer Server läuft unter ^F1Xonotic %s^BG, du hast^F2Xonotic "
 "%s"
 
 #: qcsrc/common/notifications/all.inc:450
@@ -3163,8 +3168,8 @@ msgid ""
 "^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
 "the update from ^F3http://www.xonotic.org/^BG!"
 msgstr ""
-"^F4Anmerkung: ^F1Xonotic %s^BG ist raus und Du hast noch ^F2Xonotic %s^BG - "
-"hol Dir das Update von ^F3http://www.xonotic.org/^BG!"
+"^F4Anmerkung: ^F1Xonotic %s^BG ist raus und du hast noch ^F2Xonotic %s^BG - "
+"hol dir das Update von ^F3http://www.xonotic.org/^BG!"
 
 #: qcsrc/common/notifications/all.inc:452
 #, c-format
@@ -3336,7 +3341,7 @@ msgstr "^BG%s%s^K1 wurde durch ^BG%s^K1s Maschinengewehr durchsiebt%s%s"
 #: qcsrc/common/notifications/all.inc:794
 #, c-format
 msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
-msgstr "^BGMehr als ^F2%s^BG Minen kannst Du nicht auf einmal legen"
+msgstr "^BGMehr als ^F2%s^BG Minen kannst du nicht auf einmal legen"
 
 #: qcsrc/common/notifications/all.inc:485
 #, c-format
@@ -3561,7 +3566,7 @@ msgid ""
 msgstr ""
 "^BGDu bist jetzt frei.\n"
 "^BGDu kannst ^F2versuchen^BG, die Flage noch einmal\n"
-"^BGzu erobern, wenn Du glaubst, es zu schaffen."
+"^BGzu erobern, wenn du glaubst, es zu schaffen."
 
 #: qcsrc/common/notifications/all.inc:560
 msgid "^BGThis flag is currently inactive"
@@ -3576,7 +3581,7 @@ msgstr ""
 "^BGDu bist jetzt von der Flagge ^F1abgeschirmt\n"
 "^BGaufgrund ^F2zu vieler fehlgeschlagenen Versuchen^BG,\n"
 "^BGdie Flagge zu erobern. Gewinne Punkte in der Verteidigung,\n"
-"^BGbevor Du es noch einmal versuchst."
+"^BGbevor du es noch einmal versuchst."
 
 #: qcsrc/common/notifications/all.inc:562
 msgid "^BGYou captured the ^TC^TT^BG flag!"
@@ -3584,7 +3589,7 @@ msgstr "^BGDu hast die ^TC^TT^BG Flagge erobert!"
 
 #: qcsrc/common/notifications/all.inc:563
 msgid "^BGYou captured the flag!"
-msgstr "^BGDu hast die Flagge erobert"
+msgstr "^BGDu hast die Flagge erobert!"
 
 #: qcsrc/common/notifications/all.inc:564
 #, c-format
@@ -3619,7 +3624,7 @@ msgstr "^BGDrücke ^F2%s^BG, um die Flagge von %s zu erhalten^BG"
 #: qcsrc/common/notifications/all.inc:570
 #, c-format
 msgid "^BGRequesting %s^BG to pass you the flag"
-msgstr "^BG%s^BG wird darum gebeten, Dir die Flagge zu passen"
+msgstr "^BG%s^BG wird darum gebeten, dir die Flagge zu passen"
 
 #: qcsrc/common/notifications/all.inc:571
 #, c-format
@@ -3672,12 +3677,12 @@ msgstr "^BGDer %sFeind (^BG%s%s)^BG hat die Flagge! Bringt sie zurück!"
 #: qcsrc/common/notifications/all.inc:581
 #, c-format
 msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr "^BGDer %sFeind^BG hat seine Flagge! Hole sie!"
+msgstr "^BGDer %sFeind^BG hat seine Flagge! Hol sie!"
 
 #: qcsrc/common/notifications/all.inc:582
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr "^BGDer %sFeind (^BG%s%s)^BG hat seine Flagge! Hole sie!"
+msgstr "^BGDer %sFeind (^BG%s%s)^BG hat seine Flagge! Hol sie!"
 
 #: qcsrc/common/notifications/all.inc:583
 #, c-format
@@ -3842,7 +3847,7 @@ msgstr "^K1Du wurdest etwas zu knusprig!"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You killed your own dumb self!"
-msgstr "^K1Du hast dich selbst umgebracht, Du Trottel!"
+msgstr "^K1Du hast dich selbst umgebracht, du Trottel!"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You need to be more careful!"
@@ -3870,7 +3875,7 @@ msgstr "^K1Du has vergessen, den Pin wieder reinzustecken!"
 
 #: qcsrc/common/notifications/all.inc:645
 msgid "^K1Hanging around a napalm explosion is bad!"
-msgstr "^K1Bei einer Napalm-Explosion herumzuhängen ist schlecht!"
+msgstr "^K1Es ist schlecht, bei einer Napalmexplosion herumzuhängen!"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You felt a little chilly!"
@@ -3882,19 +3887,19 @@ msgstr "^K1Dir wurde ein wenig zu kalt!"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1Your Healing Nade is a bit defective"
-msgstr "^K1Deine Medizin-Granate ist ein wenig defekt"
+msgstr "^K1Deine Medizingranate ist ein wenig defekt"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You are respawning for running out of ammo..."
-msgstr "^K1Du wirst wiederbelebt, weil Du keine Munition mehr hast …"
+msgstr "^K1Du wirst wiederbelebt, weil du keine Munition mehr hast …"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You were killed for running out of ammo..."
-msgstr "^K1Du wurdest getötet, weil Du keine Munition mehr hast…"
+msgstr "^K1Du wurdest getötet, weil du keine Munition mehr hast …"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You grew too old without taking your medicine"
-msgstr "^K1Du wurdest zu alt, und hast deine Medizin nicht genommen"
+msgstr "^K1Du wurdest zu alt, denn du hast deine Medizin nicht genommen"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You need to preserve your health"
@@ -3990,17 +3995,17 @@ msgstr "^K1Du konntest keinen Schutz vor der Rakete eines Rasers finden!"
 
 #: qcsrc/common/notifications/all.inc:667
 msgid "^K1Watch your step!"
-msgstr "^K1Achte darauf, wo Du hintrittst!"
+msgstr "^K1Achte darauf, wo du hintrittst!"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot! Du hast ^BG%s^K1 getötet, einen Teamkollegen von Dir!"
+msgstr "^K1Idiot! Du hast ^BG%s^K1 getötet, einen Teamkollegen von dir!"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot! Du hast ^BG%s^K1 getroffen, einen Teamkollegen von Dir!"
+msgstr "^K1Idiot! Du hast ^BG%s^K1 getroffen, einen Teamkollegen von dir!"
 
 #: qcsrc/common/notifications/all.inc:670
 #, c-format
@@ -4071,7 +4076,7 @@ msgstr "^K1Du hast dich selbst eingefroren"
 
 #: qcsrc/common/notifications/all.inc:692
 msgid "^K1Round already started, you spawn as frozen"
-msgstr "^K1Die Runde hat bereits begonnen, Du spawnst eingefroren"
+msgstr "^K1Die Runde hat bereits begonnen, du spawnst eingefroren"
 
 #: qcsrc/common/notifications/all.inc:694
 #, c-format
@@ -4109,14 +4114,14 @@ msgstr "^BGDu hast den Ball aufgenommen"
 #: qcsrc/common/notifications/all.inc:713
 msgid "^BGKilling people while you don't have the ball gives no points!"
 msgstr ""
-"^BGSpieler zu töten, während Du den Ball nicht hast, bringt Dir keine Punkte!"
+"^BGSpieler zu töten, während du den Ball nicht hast, bringt dir keine Punkte!"
 
 #: qcsrc/common/notifications/all.inc:715
 msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Help the key carriers to meet!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand deines Teams!\n"
+"^BGDein Team hat alle Schlüssel!\n"
 "Hilf den Schlüsselträgern, sich zu treffen!"
 
 #: qcsrc/common/notifications/all.inc:716
@@ -4124,7 +4129,7 @@ msgid ""
 "^BGAll keys are in ^TC^TT team^BG's hands!\n"
 "Interfere ^F4NOW^BG!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand von Team ^TC^TT^BG!\n"
+"^BGTeam ^TC^TT^BG hat alle Schlüssel!\n"
 "^F4SOFORT^BG eingreifen!"
 
 #: qcsrc/common/notifications/all.inc:717
@@ -4132,8 +4137,8 @@ msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Meet the other key carriers ^F4NOW^BG!"
 msgstr ""
-"^BGAlle Schlüssel sind in der Hand deines Teams!\n"
-"Triff dich ^F4SOFORT^BG mit den anderen Schlüsselträgern!"
+"^BGDein Team hat alle Schlüssel!\n"
+"Triff ^F4SOFORT^BG die anderen Schlüsselträger!"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^F4Round will start in ^COUNT"
@@ -4167,19 +4172,19 @@ msgstr "^BGEs wird auf %s Spieler gewartet …"
 
 #: qcsrc/common/notifications/all.inc:727
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BGDeine Waffe wurde verschlechtert, bis Du etwas Munition findest!"
+msgstr "^BGDeine Waffe wurde verschlechtert, bis du etwas Munition findest!"
 
 #: qcsrc/common/notifications/all.inc:728
 msgid "^F4^COUNT^BG left to find some ammo!"
-msgstr "^F4^COUNT^BG verbleiben, um etwas Munition zu finden!"
+msgstr "^BGNoch ^F4^COUNT^BG, um etwas Munition zu finden!"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
-msgstr "^BGHole dir etwas Munition oder Du stirbst in ^F4^COUNT^BG!"
+msgstr "^BGHol dir etwas Munition oder du stirbst in ^F4^COUNT^BG!"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
-msgstr "^BGHole dir etwas Munition! ^F4^COUNT^BG übrig!"
+msgstr "^BGHol dir etwas Munition! Noch ^F4^COUNT^BG!"
 
 #: qcsrc/common/notifications/all.inc:730
 #, c-format
@@ -4203,12 +4208,12 @@ msgstr "^F2Aktive Waffe: ^F1%s"
 #: qcsrc/common/notifications/all.inc:737
 #, c-format
 msgid "^BGYou captured %s^BG control point"
-msgstr "^BGDu hast einen Kontrollpunkt erobert: %s^BG"
+msgstr "^BGDu hast Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:738
 #, c-format
 msgid "^TC^TT^BG team captured %s^BG control point"
-msgstr "Team ^TC^TT^BG hat einen Kontrollpunkt erobert: %s^BG"
+msgstr "Team ^TC^TT^BG hat Kontrollpunkt „%s^BG“ erobert"
 
 #: qcsrc/common/notifications/all.inc:739
 msgid "^BGThis control point currently cannot be captured"
@@ -4362,11 +4367,11 @@ msgstr "^F2Du hast jetzt eine Superwaffe"
 
 #: qcsrc/common/notifications/all.inc:778
 msgid "^K1Changing to ^TC^TT^K1 in ^COUNT"
-msgstr "^K1Dein Team wird zu ^TC^TT^K1 geändert in ^COUNT"
+msgstr "^K1Teamwechsel zu ^TC^TT^K1 in ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:779
 msgid "^K1Changing team in ^COUNT"
-msgstr "^K1Du wechselst das Team in ^COUNT"
+msgstr "^K1Teamwechsel in ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:780
 msgid "^K1Spectating in ^COUNT"
@@ -4582,7 +4587,7 @@ msgstr "%d Punkte hintereinander! "
 #: qcsrc/common/notifications/all.qh:507
 #, c-format
 msgid "%d frag spree! "
-msgstr "%d Kills in Folge!"
+msgstr "%d Kills in Folge! "
 
 #: qcsrc/common/notifications/all.qh:520
 msgid "First blood! "
@@ -4839,15 +4844,15 @@ msgstr "Keine Angabe"
 
 #: qcsrc/common/util.qc:1452
 msgid "<KEY NOT FOUND>"
-msgstr "<KEY NOT FOUND>"
+msgstr "<TASTE NICHT GEFUNDEN>"
 
 #: qcsrc/common/util.qc:1453
 msgid "<UNKNOWN KEYNUM>"
-msgstr "<UNKNOWN KEYNUM>"
+msgstr "<UNBEKANNTE TASTENNR.>"
 
 #: qcsrc/common/util.qc:1458
 msgid "TAB"
-msgstr "TABULATOR"
+msgstr "TAB"
 
 #: qcsrc/common/util.qc:1459 qcsrc/common/util.qc:1530
 #, c-format
@@ -4869,22 +4874,22 @@ msgstr "RÜCKTASTE"
 #: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1521
 #, c-format
 msgid "UPARROW"
-msgstr "PFEIL-NACHOBEN"
+msgstr "PFEIL_RAUF"
 
 #: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1516
 #, c-format
 msgid "DOWNARROW"
-msgstr "PFEIL-NACHUNTEN"
+msgstr "PFEIL_RUNTER"
 
 #: qcsrc/common/util.qc:1466 qcsrc/common/util.qc:1518
 #, c-format
 msgid "LEFTARROW"
-msgstr "PFEIL-LINKS"
+msgstr "PFEIL_LINKS"
 
 #: qcsrc/common/util.qc:1467 qcsrc/common/util.qc:1519
 #, c-format
 msgid "RIGHTARROW"
-msgstr "PFEIL-RECHTS"
+msgstr "PFEIL_RECHTS"
 
 #: qcsrc/common/util.qc:1469
 msgid "ALT"
@@ -4896,7 +4901,7 @@ msgstr "STRG"
 
 #: qcsrc/common/util.qc:1471
 msgid "SHIFT"
-msgstr "UMSCHALTTASTE"
+msgstr "UMSCHALT"
 
 #: qcsrc/common/util.qc:1473 qcsrc/common/util.qc:1514
 #, c-format
@@ -4911,12 +4916,12 @@ msgstr "ENTF"
 #: qcsrc/common/util.qc:1475 qcsrc/common/util.qc:1517
 #, c-format
 msgid "PGDN"
-msgstr "BILD-AB"
+msgstr "BILD_AB"
 
 #: qcsrc/common/util.qc:1476 qcsrc/common/util.qc:1522
 #, c-format
 msgid "PGUP"
-msgstr "BILD-AUF"
+msgstr "BILD_AUF"
 
 #: qcsrc/common/util.qc:1477 qcsrc/common/util.qc:1520
 #, c-format
@@ -4934,7 +4939,7 @@ msgstr "PAUSE"
 
 #: qcsrc/common/util.qc:1482
 msgid "NUMLOCK"
-msgstr "NUM"
+msgstr "NUMLOCK"
 
 #: qcsrc/common/util.qc:1483
 msgid "CAPSLOCK"
@@ -4976,7 +4981,7 @@ msgstr "F%d"
 #: qcsrc/common/util.qc:1509
 #, c-format
 msgid "KP_%d"
-msgstr "KP_%d"
+msgstr "ZB_%d"
 
 #: qcsrc/common/util.qc:1514 qcsrc/common/util.qc:1515
 #: qcsrc/common/util.qc:1516 qcsrc/common/util.qc:1517
@@ -4989,7 +4994,7 @@ msgstr "KP_%d"
 #: qcsrc/common/util.qc:1530 qcsrc/common/util.qc:1531
 #, c-format
 msgid "KP_%s"
-msgstr "KP_%s"
+msgstr "ZB_%s"
 
 #: qcsrc/common/util.qc:1523
 #, c-format
@@ -5024,7 +5029,7 @@ msgstr "PLUS"
 #: qcsrc/common/util.qc:1531
 #, c-format
 msgid "EQUALS"
-msgstr "GLEICHHEITSZEICHEN"
+msgstr "GLEICH"
 
 #: qcsrc/common/util.qc:1536
 msgid "PRINTSCREEN"
@@ -5041,7 +5046,7 @@ msgstr "MRADHOCH"
 
 #: qcsrc/common/util.qc:1542
 msgid "MWHEELDOWN"
-msgstr "MRADHERAB"
+msgstr "MRADRUNTER"
 
 #: qcsrc/common/util.qc:1545
 #, c-format
@@ -5075,7 +5080,7 @@ msgstr "X360_%s"
 #: qcsrc/common/util.qc:1556
 #, c-format
 msgid "DPAD_DOWN"
-msgstr "STEUERKREUZ_HERAB"
+msgstr "STEUERKREUZ_RUNTER"
 
 #: qcsrc/common/util.qc:1557
 #, c-format
@@ -5100,72 +5105,72 @@ msgstr "ZURÜCK"
 #: qcsrc/common/util.qc:1561
 #, c-format
 msgid "LEFT_THUMB"
-msgstr "ANALOGSTICK_LINKS"
+msgstr "LINKER_ANALOGSTICK"
 
 #: qcsrc/common/util.qc:1562
 #, c-format
 msgid "RIGHT_THUMB"
-msgstr "ANALOGSTICK_RECHTS"
+msgstr "RECHTER_ANALOGSTICK"
 
 #: qcsrc/common/util.qc:1563
 #, c-format
 msgid "LEFT_SHOULDER"
-msgstr "SCHULTERTASTE_LINKS"
+msgstr "LINKE_SCHULTERTASTE"
 
 #: qcsrc/common/util.qc:1564
 #, c-format
 msgid "RIGHT_SHOULDER"
-msgstr "SCHULTERTASTE_RECHTS"
+msgstr "RECHTE_SCHULTERTASTE"
 
 #: qcsrc/common/util.qc:1565
 #, c-format
 msgid "LEFT_TRIGGER"
-msgstr "TRIGGERTASTE_LINKS"
+msgstr "LINKER_TRIGGER"
 
 #: qcsrc/common/util.qc:1566
 #, c-format
 msgid "RIGHT_TRIGGER"
-msgstr "TRIGGERTASTE_RECHTS"
+msgstr "RECHTER_TRIGGER"
 
 #: qcsrc/common/util.qc:1567
 #, c-format
 msgid "LEFT_THUMB_UP"
-msgstr "ANALOGSTICK_LINKS_HOCH"
+msgstr "LINKER_ANALOGSTICK_HOCH"
 
 #: qcsrc/common/util.qc:1568
 #, c-format
 msgid "LEFT_THUMB_DOWN"
-msgstr "ANALOGSTICK_LINKS_HERAB"
+msgstr "LINKER_ANALOGSTICK_RUNTER"
 
 #: qcsrc/common/util.qc:1569
 #, c-format
 msgid "LEFT_THUMB_LEFT"
-msgstr "ANALOGSTICK_LINKS_LINKS"
+msgstr "LINKER_ANALOGSTICK_LINKS"
 
 #: qcsrc/common/util.qc:1570
 #, c-format
 msgid "LEFT_THUMB_RIGHT"
-msgstr "ANALOGSTICK_LINKS_RECHTS"
+msgstr "LINKER_ANALOGSTICK_RECHTS"
 
 #: qcsrc/common/util.qc:1571
 #, c-format
 msgid "RIGHT_THUMB_UP"
-msgstr "ANALOGSTICK_RECHTS_HOCH"
+msgstr "RECHTER_ANALOGSTICK_HOCH"
 
 #: qcsrc/common/util.qc:1572
 #, c-format
 msgid "RIGHT_THUMB_DOWN"
-msgstr "ANALOGSTICK_RECHTS_HERAB"
+msgstr "RECHTER_ANALOGSTICK_RUNTER"
 
 #: qcsrc/common/util.qc:1573
 #, c-format
 msgid "RIGHT_THUMB_LEFT"
-msgstr "ANALOGSTICK_RECHTS_LINKS"
+msgstr "RECHTER_ANALOGSTICK_LINKS"
 
 #: qcsrc/common/util.qc:1574
 #, c-format
 msgid "RIGHT_THUMB_RIGHT"
-msgstr "ANALOGSTICK_RECHTS_RECHTS"
+msgstr "RECHTER_ANALOGSTICK_RECHTS"
 
 #: qcsrc/common/util.qc:1584 qcsrc/common/util.qc:1585
 #: qcsrc/common/util.qc:1586 qcsrc/common/util.qc:1587
@@ -5181,7 +5186,7 @@ msgstr "HOCH"
 #: qcsrc/common/util.qc:1585
 #, c-format
 msgid "DOWN"
-msgstr "HERAB"
+msgstr "RUNTER"
 
 #: qcsrc/common/util.qc:1586
 #, c-format
@@ -5538,7 +5543,7 @@ msgid ""
 "Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
 "please file an issue."
 msgstr ""
-"Entity-Feld %s.%s (%s) ist nicht auf der weissen Liste. Falls Du glaubst, "
+"Entity-Feld %s.%s (%s) ist nicht auf der weissen Liste. Falls du glaubst, "
 "dass das ein Programmfehler ist, melde ihn bitte."
 
 #: qcsrc/lib/string.qh:81
@@ -5833,7 +5838,7 @@ msgstr "Leg deinen Namen im Spiel fest"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:69
 msgid "Text language:"
-msgstr "Sprache:"
+msgstr "Textsprache:"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:78
 msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
@@ -6594,7 +6599,7 @@ msgid ""
 "Play online, against your friends in LAN, view demos or change player "
 "settings"
 msgstr ""
-"Spiele online, gegen deine Freunde im LAN, schaue Dir Demos an oder ändere "
+"Spiele online, gegen deine Freunde im LAN, schaue dir Demos an oder ändere "
 "deine Spieler-Einstellungen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
@@ -6852,7 +6857,7 @@ msgstr "Raketenflug"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:217
 msgid "Invincible Projectiles"
-msgstr "Unzerstörbare Schüsse"
+msgstr "Unzerstörbare Projektile"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
@@ -6948,7 +6953,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:183
 msgid "Damage done to your enemy gets added to your own health"
 msgstr ""
-"Der Schaden, dem Du anderen Spielern zufügst, wird Deiner eigenen Gesundheit "
+"Der Schaden, dem du anderen Spielern zufügst, wird deiner eigenen Gesundheit "
 "hinzugefügt"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:188
@@ -7103,7 +7108,7 @@ msgstr "Info …"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:80
 msgid "Show more information about the currently highlighted server"
-msgstr "Lass Dir mehr Informationen über den markierten Server anzeigen"
+msgstr "Lass dir mehr Informationen über den markierten Server anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:85
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
@@ -7254,7 +7259,7 @@ msgstr "Zeitwiederholung"
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:58
 msgid "Benchmark how fast your computer can run the highlighted demo"
 msgstr ""
-"Mach einen Benchmark, mit dem Du testest, wie schnell dein Computer die "
+"Mach einen Benchmark, mit dem du testest, wie schnell dein Computer die "
 "markierte Wiederholung abspielen kann"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:62
@@ -7408,7 +7413,7 @@ msgstr "Geschlecht"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:11
 msgid "Are you sure you want to quit?"
-msgstr "Willst Du das Spiel wirklich beenden?"
+msgstr "Willst du das Spiel wirklich beenden?"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:15
 msgid "Back to work..."
@@ -7508,7 +7513,7 @@ msgstr "Beweglich"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
 msgid "Physical"
-msgstr "Physik-Eigenschaften"
+msgstr "Physisch"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
 msgid "Set scale:"
@@ -7524,15 +7529,15 @@ msgstr "* beanspruchen"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
 msgid "* object info"
-msgstr "* Objekteigeschaften"
+msgstr "* Objektinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
 msgid "* mesh info"
-msgstr "* Modelleigenschaften"
+msgstr "* Modellinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
 msgid "* attachment info"
-msgstr "* Anhängerkupplung"
+msgstr "* Anhangsinfo"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
 msgid "Show help"
@@ -7807,7 +7812,7 @@ msgstr "Sound-Info einblenden"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
 msgid "Are you sure you want to reset all key bindings?"
-msgstr "Willst Du wirklich alle Einstellungen zurücksetzen?"
+msgstr "Willst du wirklich alle Einstellungen zurücksetzen?"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
 msgid "Reset key bindings"
@@ -8229,7 +8234,7 @@ msgid ""
 "models"
 msgstr ""
 "Stelle für jede Waffe ein anderes Fadenkreuz ein. Diese Option ist zu "
-"empfehlen, wenn Du ohne dargestelltes Waffenmodel spielst"
+"empfehlen, wenn du ohne dargestelltes Waffenmodel spielst"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
@@ -8269,7 +8274,7 @@ msgid ""
 msgstr ""
 "Keine: Für das Fadenkreuz keine Treffertests ausführen; TrueAim: Das "
 "Fadenkreuz verschwimmt, wenn ein Hindernis zwischen deiner Waffen und dem "
-"Ziel ist; Feinde: Das Fadenkreuz wird auch vergrössert, wenn Du einen Feind "
+"Ziel ist; Feinde: Das Fadenkreuz wird auch vergrössert, wenn du einen Feind "
 "treffen würdest"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
@@ -8310,7 +8315,7 @@ msgstr "Punktetafel"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
 msgid "Fading speed:"
-msgstr "Ausblendegeschwindigkeit:"
+msgstr "Ausblendgeschwindigkeit:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
 msgid "Enable rows / columns highlighting"
@@ -8343,7 +8348,7 @@ msgstr "Wegpunkte für feste Ziele auf der Karte anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
 msgid "Show various gametype specific waypoints"
-msgstr "Lass Dir verschiedene Spieltyp spezifische Wegpunkte anzeigen"
+msgstr "Lass dir verschiedene Spieltyp spezifische Wegpunkte anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
 msgid "Control transparency of the waypoints"
@@ -8392,7 +8397,7 @@ msgstr "Namen über Spielern anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
 msgid "Max distance:"
-msgstr "Maximale Entferung:"
+msgstr "Max. Entfernung:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
 msgid "Decolorize:"
@@ -8442,7 +8447,7 @@ msgstr "Um den HUD-Editor zu starten, muss ein Spiel gestartet werden."
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
 msgid "Do you wish to start a local game to set up the HUD?"
-msgstr "Willst Du ein lokales Spiel starten, um das HUD zu bearbeiten?"
+msgstr "Willst du ein lokales Spiel starten, um das HUD zu bearbeiten?"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
 msgid "Frag Information"
@@ -8792,7 +8797,7 @@ msgid ""
 "you are carrying"
 msgstr ""
 "Wechsel automatisch zu der neu aufgesammelten Waffe, wenn diese in der Liste "
-"weiter oben steht als die, welche Du gerade trägst"
+"weiter oben steht als die, welche du gerade trägst"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:61
 msgid "Release attack buttons when you switch weapons"
@@ -9075,7 +9080,7 @@ msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:116
 msgid "Idle limit:"
-msgstr "wenn inaktiv:"
+msgstr "Wenn inaktiv:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
 msgid "IDLFPS^Unlimited"
@@ -9136,7 +9141,7 @@ msgstr "Erweiterte Einstellungen …"
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:152
 msgid "Advanced settings where you can tweak every single variable of the game"
 msgstr ""
-"Erweiterte Einstellungen, in denen Du jede beliebige Variable des Spiels "
+"Erweiterte Einstellungen, in denen du jede beliebige Variable des Spiels "
 "ändern kannst"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:157
@@ -9211,7 +9216,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
 msgid "full language changes will take effect starting from the next game"
-msgstr "volle Sprachänderungen finden erst nach dem Neustart des Spiels statt."
+msgstr "volle Sprachänderungen finden erst nach dem Neustart des Spiels statt"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
 msgid "Disconnect now"
@@ -9600,7 +9605,7 @@ msgstr "Dürfen Spielerstatistiken deinen Spitznamen aufnehmen?"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:12
 msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr "Wenn Du „Nein“ sagst, wirst Du als „Anonymer Spieler“ erscheinen"
+msgstr "Wenn du „Nein“ sagst, wirst du als „Anonymer Spieler“ erscheinen"
 
 #: qcsrc/menu/xonotic/gametypelist.qc:87
 msgid "teamplay"
index 065db416ce5e8107fa5bd02ad91982deb1ec90d2..c492575c72a07d30d47966790bb4f563b77ea08e 100644 (file)
@@ -18,7 +18,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-07-14 15:44+0000\n"
+"PO-Revision-Date: 2019-10-06 08:21+0000\n"
 "Last-Translator: Yannick Le Guen <leguen.yannick@gmail.com>\n"
 "Language-Team: French (http://www.transifex.com/team-xonotic/xonotic/"
 "language/fr/)\n"
@@ -143,7 +143,7 @@ msgstr "^1La partie a déjà commencé"
 
 #: qcsrc/client/hud/panel/infomessages.qc:128
 msgid "^1You have no more lives left"
-msgstr "^1Vous n'avez plus aucune vie"
+msgstr "^1Il ne vous reste plus aucune vie"
 
 #: qcsrc/client/hud/panel/infomessages.qc:130
 #: qcsrc/client/hud/panel/infomessages.qc:133
@@ -5332,7 +5332,7 @@ msgstr "%s ans"
 #: qcsrc/lib/counting.qh:12
 #, c-format
 msgid "CI_ZER^%d years"
-msgstr "%d ans"
+msgstr "%d an"
 
 #: qcsrc/lib/counting.qh:13
 #, c-format
@@ -5362,7 +5362,7 @@ msgstr "%s semaines"
 #: qcsrc/lib/counting.qh:21
 #, c-format
 msgid "CI_ZER^%d weeks"
-msgstr "%d semaines"
+msgstr "%d semaine"
 
 #: qcsrc/lib/counting.qh:22
 #, c-format
@@ -5392,7 +5392,7 @@ msgstr "%s jours"
 #: qcsrc/lib/counting.qh:30
 #, c-format
 msgid "CI_ZER^%d days"
-msgstr "%d jours"
+msgstr "%d jour"
 
 #: qcsrc/lib/counting.qh:31
 #, c-format
@@ -5422,7 +5422,7 @@ msgstr "%s heures"
 #: qcsrc/lib/counting.qh:39
 #, c-format
 msgid "CI_ZER^%d hours"
-msgstr "%d heures"
+msgstr "%d heure"
 
 #: qcsrc/lib/counting.qh:40
 #, c-format
@@ -5452,7 +5452,7 @@ msgstr "%s minutes"
 #: qcsrc/lib/counting.qh:49
 #, c-format
 msgid "CI_ZER^%d minutes"
-msgstr "%d minutes"
+msgstr "%d minute"
 
 #: qcsrc/lib/counting.qh:50
 #, c-format
@@ -5482,7 +5482,7 @@ msgstr "%s secondes"
 #: qcsrc/lib/counting.qh:58
 #, c-format
 msgid "CI_ZER^%d seconds"
-msgstr "%d secondes"
+msgstr "%d seconde"
 
 #: qcsrc/lib/counting.qh:59
 #, c-format
@@ -9289,7 +9289,7 @@ msgstr "Retourner la vue horizontalement"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:68
 msgid "Poor man's left handed mode"
-msgstr "Mode mirroir"
+msgstr "Mode miroir"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:71
 msgid "Anisotropy:"
index 3de3a224b3ebdcf03b423656c72bf879ecd3dbe1..16c8890c102b844032da3b58ec33fada7c36afb0 100644 (file)
@@ -7,6 +7,7 @@
 # busterdbk <busterdbk@gmail.com>, 2013
 # busterdbk <busterdbk@gmail.com>, 2013
 # Cuzenco Andrei Robert <cuzencoandreirobert2008@gmail.com>, 2019
+# Iulian Oancea <iulian.o@protonmail.ch>, 2019
 # MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>, 2011
 # Sorin Botirla <sorin.botirla@gmail.com>, 2015
 # Tudor Ionel <tropiko.matrox@gmail.com>, 2015
@@ -15,8 +16,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-07-02 21:28+0000\n"
-"Last-Translator: Cuzenco Andrei Robert <cuzencoandreirobert2008@gmail.com>\n"
+"PO-Revision-Date: 2019-10-09 21:10+0000\n"
+"Last-Translator: Iulian Oancea <iulian.o@protonmail.ch>\n"
 "Language-Team: Romanian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ro/)\n"
 "Language: ro\n"
@@ -30,7 +31,7 @@ msgstr ""
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
 msgstr ""
-"^2Exportat cu succes către %s! (Notă: Fisierul este salvat in data/data)"
+"^2Exportat cu succes către %s! (Notă: Fişierul este salvat în data/data)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
@@ -396,11 +397,11 @@ msgstr "QMCMD^steag scăpat, pictogramă"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^drop weapon, icon"
-msgstr ""
+msgstr "QMCMD^scapă arma, pictogramă"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^armă scăpată %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^drop flag/key, icon"
@@ -558,7 +559,7 @@ msgstr "Intermediar %d"
 #: qcsrc/client/hud/panel/racetimer.qc:262
 #, c-format
 msgid "PENALTY: %.1f (%s)"
-msgstr ""
+msgstr "^1PENALIZARE: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
@@ -591,6 +592,7 @@ msgstr ""
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
 msgstr ""
+"Cât de des un steag (CS) sau o cheie („Vânătoare de chei”) au fost capturate"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "SCO^caps"
@@ -626,7 +628,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
-msgstr ""
+msgstr "Total daună dat"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
@@ -634,7 +636,7 @@ msgstr "SCO^dauneprimite"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "The total damage taken"
-msgstr ""
+msgstr "Total daună primit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "Number of flag drops"
@@ -654,7 +656,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "SCO^fastest"
-msgstr ""
+msgstr "SCO^cel mai rapid"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "Time of fastest lap (Race/CTS)"
index 80089d0c8d7a94ef7080b9adea7d458bb30c3a37..d28163865858cd045fc1931c10dc0b0fa3849f25 100644 (file)
@@ -19,7 +19,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-06-24 06:22+0000\n"
+"PO-Revision-Date: 2019-11-21 19:30+0000\n"
 "Last-Translator: Andrei Stepanov <adem4ik@gmail.com>\n"
 "Language-Team: Russian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ru/)\n"
@@ -551,7 +551,7 @@ msgstr "Линия финиша"
 #: qcsrc/client/hud/panel/racetimer.qc:151
 #, c-format
 msgid "Intermediate %d"
-msgstr "Ð\9fÑ\80омежÑ\83Ñ\82оÑ\87ное %d"
+msgstr "УÑ\87аÑ\81Ñ\82ок %d"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154
 #: qcsrc/client/hud/panel/racetimer.qc:201
@@ -1032,7 +1032,7 @@ msgstr "Рейтинг"
 #: qcsrc/client/hud/panel/scoreboard.qc:1613
 #, c-format
 msgid "^3%1.0f minutes"
-msgstr "^3%1.0f минуты"
+msgstr "^3%1.0f минут(ы)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1622
 #: qcsrc/client/hud/panel/scoreboard.qc:1629
@@ -1155,7 +1155,7 @@ msgstr "Недоступен"
 
 #: qcsrc/client/main.qc:1027
 msgid " qu/s"
-msgstr "юнит/с"
+msgstr " юнит/с"
 
 #: qcsrc/client/main.qc:1029
 msgid " m/s"
@@ -1326,7 +1326,7 @@ msgstr "Щит"
 #: qcsrc/common/mapinfo.qc:626
 #, no-c-format
 msgid "@!#%'n Tuba Throwing"
-msgstr "@!#%'n Ð¨Ð²Ñ\8bÑ\80Ñ\8fние Ð¢Ñ\80Ñ\83бой"
+msgstr "@!#%'n Швыряние Тубой"
 
 #: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:333
 #: qcsrc/common/mapinfo.qh:528
@@ -3024,7 +3024,7 @@ msgstr "^BG%s^BG отказался от гонки"
 #: qcsrc/common/notifications/all.inc:428
 #, c-format
 msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG не смог побить рекорд %s%s^BG места со временем %s%s %s"
+msgstr "^BG%s^BG Ð½Ðµ Ñ\81мог Ð¿Ð¾Ð±Ð¸Ñ\82Ñ\8c Ñ\81вой Ñ\80екоÑ\80д %s%s^BG Ð¼ÐµÑ\81Ñ\82а Ñ\81о Ð²Ñ\80еменем %s%s %s"
 
 #: qcsrc/common/notifications/all.inc:429
 #, c-format
@@ -3933,7 +3933,7 @@ msgstr "^K1Вы не смогли укрыться от ракеты Гонщи
 
 #: qcsrc/common/notifications/all.inc:667
 msgid "^K1Watch your step!"
-msgstr "^K1Смотри под ноги!"
+msgstr "^K1Смотрите под ноги!"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
@@ -4100,7 +4100,7 @@ msgid ""
 "Need active players for: %s"
 msgstr ""
 "^BGОжидание игроков...\n"
-"Активные игроки необходимы для: %s"
+"%s нуждается в активных игроках"
 
 #: qcsrc/common/notifications/all.inc:725
 #, c-format
@@ -4589,19 +4589,19 @@ msgstr " с %d %s"
 
 #: qcsrc/common/teams.qh:31
 msgid "TEAM^Red"
-msgstr "TEAM^Красные"
+msgstr "TEAM^Красная"
 
 #: qcsrc/common/teams.qh:32
 msgid "TEAM^Blue"
-msgstr "TEAM^Синие"
+msgstr "TEAM^Синяя"
 
 #: qcsrc/common/teams.qh:33
 msgid "TEAM^Yellow"
-msgstr "TEAM^Жёлтые"
+msgstr "TEAM^Жёлтая"
 
 #: qcsrc/common/teams.qh:34
 msgid "TEAM^Pink"
-msgstr "TEAM^Розовые"
+msgstr "TEAM^Розовая"
 
 #: qcsrc/common/teams.qh:35
 msgid "Team"
@@ -5260,7 +5260,7 @@ msgstr "Дробовик"
 #: qcsrc/common/weapons/weapon/tuba.qh:18
 #, no-c-format
 msgid "@!#%'n Tuba"
-msgstr "@!#%'n Ð¢Ñ\80Ñ\83ба"
+msgstr "@!#%'n Туба"
 
 #: qcsrc/common/weapons/weapon/vaporizer.qh:19
 msgid "Vaporizer"
@@ -5393,12 +5393,12 @@ msgstr "%d часов"
 #: qcsrc/lib/counting.qh:46
 #, c-format
 msgid "CI_DEC^%s minutes"
-msgstr "%s минут"
+msgstr "%s минут(ы)"
 
 #: qcsrc/lib/counting.qh:49
 #, c-format
 msgid "CI_ZER^%d minutes"
-msgstr "%d минут"
+msgstr "%d минут(ы)"
 
 #: qcsrc/lib/counting.qh:50
 #, c-format
@@ -5408,17 +5408,17 @@ msgstr "%d минута"
 #: qcsrc/lib/counting.qh:51
 #, c-format
 msgid "CI_SEC^%d minutes"
-msgstr "%d минуты"
+msgstr "%d минут(ы)"
 
 #: qcsrc/lib/counting.qh:52
 #, c-format
 msgid "CI_THI^%d minutes"
-msgstr "%d минуты"
+msgstr "%d минут(ы)"
 
 #: qcsrc/lib/counting.qh:53
 #, c-format
 msgid "CI_MUL^%d minutes"
-msgstr "%d минут"
+msgstr "%d минут(ы)"
 
 #: qcsrc/lib/counting.qh:55
 #, c-format
@@ -6564,7 +6564,7 @@ msgstr "Ограничение времени в минутах, после ко
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:82
 #, c-format
 msgid "%d minutes"
-msgstr "%d минуты"
+msgstr "%d минут(ы)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:83
 msgid "TIMLIM^Default"
@@ -9519,7 +9519,7 @@ msgstr "вправо"
 
 #: qcsrc/menu/xonotic/keybinder.qc:40
 msgid "jump / swim"
-msgstr "прыжок / плыть"
+msgstr "пÑ\80Ñ\8bжок / Ð²Ñ\81плÑ\8bÑ\82Ñ\8c"
 
 #: qcsrc/menu/xonotic/keybinder.qc:41
 msgid "crouch / sink"
@@ -9559,7 +9559,7 @@ msgstr "перезарядить"
 
 #: qcsrc/menu/xonotic/keybinder.qc:57
 msgid "drop weapon / throw nade"
-msgstr "бÑ\80оÑ\81иÑ\82Ñ\8c Ð¾Ñ\80Ñ\83жие / ÐºÐ¸Ð½Ñ\83Ñ\82Ñ\8c Ð³Ñ\80анаÑ\82Ñ\83"
+msgstr "бросить оружие / гранату"
 
 #: qcsrc/menu/xonotic/keybinder.qc:86
 msgid "hold zoom"
@@ -9635,7 +9635,7 @@ msgstr "автовыбор команды"
 
 #: qcsrc/menu/xonotic/keybinder.qc:118
 msgid "drop key / drop flag"
-msgstr "бросить ключ или флаг"
+msgstr "бросить ключ / флаг"
 
 #: qcsrc/menu/xonotic/keybinder.qc:122
 msgid "respawn"
index bb401e01bd103446cd117d76fffac92f371a5c5d..5ee89ac01adf346b3b72f99a1f2cff928f24b8b2 100644 (file)
@@ -5,13 +5,14 @@
 # Translators:
 # Çağlar Turalı <caglarturali@gmail.com>, 2018
 # Demiray Muhterem <mdemiray@msn.com>, 2018
+# ibra kap <ibrakap@gmail.com>, 2019
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-09-11 17:17+0000\n"
+"Last-Translator: ibra kap <ibrakap@gmail.com>\n"
 "Language-Team: Turkish (http://www.transifex.com/team-xonotic/xonotic/"
 "language/tr/)\n"
 "Language: tr\n"
@@ -253,7 +254,7 @@ msgstr "Devam..."
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr ""
+msgstr "Sohbet"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
@@ -488,7 +489,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/quickmenu.qc:847
 msgid "QMCMD^Fullscreen"
-msgstr ""
+msgstr "Tam Ekran"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:850
 #: qcsrc/client/hud/panel/quickmenu.qc:860
index 8e7bc9b4f74f414ac766859647221abbdf4ddd5b..47631f0fa6cb70b4a664e493ff5dd06bd300bfae 100644 (file)
@@ -34,7 +34,7 @@ seta crosshair_hitindication_speed 5
 set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
 seta crosshair_hittest 1 "do a crosshair hit evaluation, applying effects from the _blur, _scale, and _showipact cvars"
 seta crosshair_hittest_blur 1 "blur the crosshair if the shot is obstructed"
-seta crosshair_hittest_scale 1.25 "enlarge crosshair if aiming at an enemy, shrink crosshair if shot is obstructed or aiming at a teammate"
+seta crosshair_hittest_scale 1.25 "shrink crosshair if shot is obstructed or aiming at a teammate"
 seta crosshair_hittest_showimpact 0 "move the crosshair to the actual impact location if obstructed"
 
 // change color based on special case
@@ -48,6 +48,10 @@ seta crosshair_per_weapon 1  "when 1, each gun will display a different crosshair
 // side-scrolling crosshair
 seta crosshair_2d 54 "selects crosshair to use in side-scrolling mode (\"\" uses regular crosshair and 0 is none)"
 
+// third person chase-camera crosshair
+seta crosshair_chase 1 "adjust the crosshair while in third person mode to where the shot will actually hit"
+seta crosshair_chase_playeralpha 0.25 "opacity of the player while they obstruct the view when crosshair_chase is enabled, can be a value between 0 and 1"
+
 
 // =========================
 //  Crosshair ring settings
index 282ea40f6c45eb2574eb8377433e81164f805c3f..6d8ee6f07364532ee1ecb47cc6e051b8a4181823 100644 (file)
@@ -57,15 +57,16 @@ alias sv_vote_gametype_hook_rc
 alias sv_vote_gametype_hook_tdm
 alias sv_vote_gametype_hook_duel
 
-// Example preset to allow 1v1ctf to be used for the gametype voting screen
+// Example preset to allow 1v1ctf to be used for the gametype voting screen.
+// Aliases can have max 31 chars so the gametype can have max 9 chars.
 // sv_vote_gametype_*_type Must be set to the name of the gametype the option is based on
 // sv_vote_gametype_*_name Contains a human-readable name of the gametype
 // sv_vote_gametype_*_description Contains a longer description
 //set sv_vote_gametype_1v1ctf_type ctf
 //set sv_vote_gametype_1v1ctf_name "Capture the Flag Duel"
 //set sv_vote_gametype_1v1ctf_description "One vs One match in CTF"
-//alias sv_vote_gametype_hook_all "set g_maxplayers 0"
-//alias sv_vote_gametype_hook_1v1ctf "set g_maxplayers 2"
+//alias sv_vote_gametype_hook_all "g_maxplayers 0"
+//alias sv_vote_gametype_hook_1v1ctf "g_maxplayers 2"
 
 
 // ===========
@@ -226,6 +227,7 @@ set g_ca_round_timelimit 180 "round time limit in seconds"
 set g_ca_teams_override 0
 set g_ca_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
 set g_ca_teams 0
+set g_ca_weaponarena "most" "starting weapons - takes the same options as g_weaponarena"
 
 
 // ==================
@@ -238,7 +240,7 @@ set g_ctf_leaderboard 0 "show top capture times in the scoreboard"
 set g_ctf_flag_return 1 "auto return the flag to base when touched by a teammate"
 set g_ctf_flag_return_carrying 0 "(manual return mode) auto return the flag to base if touched by a flag carrier"
 set g_ctf_flag_return_carried_radius 100 "allow flags to be returned by carrier if base is within this radius"
-set g_ctf_flag_return_time 15 "automatically return the flag to base after this amount of time"
+set g_ctf_flag_return_time 30 "automatically return the flag to base after this amount of time"
 set g_ctf_flag_return_dropped 100 "automatically return the flag to base if dropped within this distance from base (in qu)"
 set g_ctf_flag_return_damage 0 "allow the flag to be damaged, reducing time needed to automatically return to base"
 set g_ctf_flag_return_damage_delay 0 "how much time the flag takes to automatically return to base if it falls into lava/slime/trigger hurt"
@@ -370,24 +372,25 @@ set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen
 set g_freezetag_teams_override 0
 set g_freezetag_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
 set g_freezetag_teams 0
+set g_freezetag_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena"
 
 
 // ==========
 //  keepaway
 // ==========
 set g_keepaway 0 "game mode which focuses around a ball"
-set g_keepaway_score_bckill 5 "points for killing the ball barrier (Ball Carrier Kill)"
-set g_keepaway_score_killac 3 "points for kills while holding the ball (Kill As Carrier)"
+set g_keepaway_score_bckill 1 "points for killing the ball barrier (Ball Carrier Kill)"
+set g_keepaway_score_killac 1 "points for kills while holding the ball (Kill As Carrier)"
 set g_keepaway_score_timeinterval 1 "amount of time it takes between intervals for timepoints to be added to the score"
-set g_keepaway_score_timepoints 1 "points to add to score per timeinterval, 0 for no points"
+set g_keepaway_score_timepoints 0 "points to add to score per timeinterval, 0 for no points"
 set g_keepaway_ballcarrier_effects 8 "Add together the numbers you want: EF_ADDITIVE (32) / EF_NODEPTHTEST (8192) / EF_DIMLIGHT (8)"
-set g_keepaway_ballcarrier_highspeed 1.5 "speed multiplier done to the person holding the ball (recommended when used with some mutators)"
+set g_keepaway_ballcarrier_highspeed 1 "speed multiplier done to the person holding the ball (recommended when used with some mutators)"
 set g_keepaway_ballcarrier_damage      1       "damage multiplier while holding the ball"
 set g_keepaway_ballcarrier_force       1       "force multiplier while holding the ball"
 set g_keepaway_ballcarrier_selfdamage  1       "self damage multiplier while holding the ball"
 set g_keepaway_ballcarrier_selfforce   1       "self force multiplier while holding the ball"
 set g_keepaway_noncarrier_warn 1       "warn players when they kill without holding the ball"
-set g_keepaway_noncarrier_damage       0       "damage done to other players if both you and they don't have the ball"
+set g_keepaway_noncarrier_damage       1       "damage done to other players if both you and they don't have the ball"
 set g_keepaway_noncarrier_force        1       "force done to other players if both you and they don't have the ball"
 set g_keepaway_noncarrier_selfdamage   1       "self damage if you don't have the ball"
 set g_keepaway_noncarrier_selfforce    1       "self force if you don't have the ball"
@@ -433,6 +436,7 @@ set g_lms_extra_lives 0
 set g_lms_regenerate 0
 set g_lms_last_join 3  "if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives"
 set g_lms_join_anytime 1       "if true, new players can join, but get same amount of lives as the worst player"
+set g_lms_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena"
 
 
 // =========
@@ -542,3 +546,4 @@ set g_invasion_type 0 "type of invasion mode - 0: round-based, 1: hunting, 2: co
 set g_duel 0 "Duel: frag the opponent more in a one versus one arena battle"
 //set g_duel_warmup 180 "Have a short warmup period before beginning the actual duel"
 set g_duel_with_powerups 0 "Enable powerups to spawn in the duel gamemode"
+set g_duel_not_dm_maps 0 "when this is set, DM maps will NOT be listed in duel"
index 1bd9e272e2ac44035cc4ade47110cf45495bcd0d..b391d0c8bd248d7858040728b373405ff74c0221 100644 (file)
@@ -1,38 +1,38 @@
 set help_msg_0 "Big Admin is watching you, so please be friendly or feel their almighty ban-hammer!"
-set help_msg_1 "If you want to learn more about Xonotic, read ^1'Halogene's Newbie Corner' (https://xonotic.org/guide) ${help_cfg_prefix}as it contains lots of useful tips and tricks, explains all the weapons and helps to improve your gameplay."
+set help_msg_1 "If you want to become better at Xonotic, read ^1'Halogene's Newbie Corner' (https://xonotic.org/guide) ${help_cfg_prefix}as it explains movement and all the weapons in detail."
 set help_msg_2 "Please watch out for balanced teams and change by pressing F5 (teammenu) or F6 (auto join 'best' team)."
-set help_msg_3 "When trying to bunny-hop you can ^1hold the jump button ${help_cfg_prefix}while you are still in the air, this will make those jumps VERY easy to time and work more reliable."
+set help_msg_3 "When trying to bunny-hop you can simply ^1keep holding the jump button${help_cfg_prefix}. Pressing and releasing it for every jump works but often makes players lose some speed. Holding it also works on stairs."
 set help_msg_4 "When a vote is called you can accept it via F1 or reject it via F2 (default keys)."
-set help_msg_5 "Spectating other (good) players helps to learn new tricks. To spectate press F3 and then Mouse1 to switch between the players you want to spectate. F5, F6 or jump will get you back into the game (default keys)."
-set help_msg_6 "Being a beginner is great! You can learn so many new tricks and improve quickly. Watch others, ask for advice and use your common sense effectively."
+set help_msg_5 "Spectating other (good) players helps to learn new tricks. To spectate press F3 and then Mouse1 to switch between the players you want to spectate."
+set help_msg_6 "Notice what other players do differently. Often winning or losing comes down to more than accuracy and evading the other player's shots. Movement, map knowledge and items are equally important."
 set help_msg_7 "If others are better than you, it does not mean they cheat. Save such complaints for when you have more experience and know what kind of funky stuff is possible."
-set help_msg_8 "In CTF, it's good to move around and get involved in the action. You get fragged quite a bit but you are also most helpful to your team."
-set help_msg_9 "Use the radar to see where your teammates are. Pressing zoom will expand the radar image to give you a better overview."
-set help_msg_10 "Most teammessages display waypoints by default. Use those to guide your teammates. You can also see them and the flagcarrier in the radar."
-set help_msg_11 "Protect your flagcarrier at all cost! Also save health and armor for him, he might need them more than you!"
-set help_msg_12 "You can use the Blaster and most explosive weapons to jump around. Just look 'at your feet' and press fire. If you also jump at the same time, you get even higher."
+set help_msg_8 "Listen and remember that the enemy is listening too. Footsteps and item pickups make sounds that can give away your position."
+set help_msg_9 "Use the radar to see where your teammates are. Try to time returning your flag with your FC (flag carrier) arriving at your base so enemies can't steal it again before the FC caps."
+set help_msg_10 "Xonotic provides a wide array of gamemodes, each rewarding their own unique skills that will help you become the best player you can be. Variety is key, try them all!"
+set help_msg_11 "Protect your FC (flag carrier) at all costs! Save health and armor for them, they need it more than you!"
+set help_msg_12 "Use the Blaster to make very high jumps. Just look 'at your feet' and press fire. Other explosive weapons work too but do a lot more damage."
 set help_msg_13 "Be friendly and helpful to other players! Being angry at others' mistakes is understandable, but nobody is perfect. Try to use calm words when telling them how to correct their mistake."
-set help_msg_14 "You can use the zoom key with all guns, only the Vortex has it as a extra function on Mouse2 (default key)."
-set help_msg_15 "Notice what is happening around you! If your base is empty in CTF, then STAY and defend the flag! Make sure someone defends the flagcarrier or assist him yourself."
+set help_msg_14 "You can use the zoom key with all guns, only the Vortex has it as an extra function on secondary fire."
+set help_msg_15 "Notice what is happening around you! If your base is empty in CTF, then STAY and defend the flag!"
 set help_msg_16 "You can drop the weapon you currently have with Backspace (default key). You can help your unarmed teammates this way."
-set help_msg_17 "Learn to use the team messages! You find them in the Setting/Input menu. Try changing them to keys you can press easier than the defaults."
+set help_msg_17 "When you see the enemy FC, use your 'flag seen' bind to point teammates at them. You can even use the bind after death."
 set help_msg_18 "Gaming should be fun! Try to have a nice time, be helpful, mindful and treat others like you want to be treated."
 set help_msg_19 "Visit the official forum on ^1https://forums.xonotic.org/ ${help_cfg_prefix}and feel free to open a thread if you have questions."
 set help_msg_20 "If you already have a good weapon, it's a great idea to let your teammates get something better than the Shotgun too!"
 set help_msg_21 "Press T to chat with others, press Y for messages to your team only, press TAB to see the scores and U for the chat history (default keys)."
-set help_msg_22 "You can use ^1'suggestmap PART_OF_NAME' ${help_cfg_prefix}to make a map come up at the vote screen after a map was played."
+set help_msg_22 "You can use ^1'suggestmap PART_OF_NAME' ${help_cfg_prefix}to make a map come up at the vote screen after the match."
 set help_msg_23 "The console is accessible through the ~ key or by pressing Shift+ESC. It has many more advanced features, use 'cmdlist' and 'cvarlist' to get a full list of available commands/settings."
-set help_msg_24 "The Blaster is a useful tool for gaining speed and jumping around, but it does little damage."
-set help_msg_25 "The Shotgun's primary firemode has spread and is more useful at a closer distance, use secondary for the melee attack and slap into other players faces!"
-set help_msg_26 "The Machine Gun secondary has a burst fire mode and less spread than the primary mode."
-set help_msg_27 "The Mortar is a good all around gun but takes some practice to aim it, because of the projectile's curve."
+set help_msg_24 "The Blaster is a movement tool more than a weapon. Use it to accelerate by blastering walls - bunny-hop along a wall and shoot it to make the explosion push you."
+set help_msg_25 "The Shotgun's primary is useful at a closer distance, use secondary for the melee attack which is surprisingly strong and has longer reach than you might expect."
+set help_msg_26 "The MachineGun's ^1secondary ${help_cfg_prefix}burst firemode has no spread, use it as a cheap Vortex substitute at long range."
+set help_msg_27 "The Mortar's secondary fire bounces before exploding - useful for hitting enemies around corners and behind obstacles"
 set help_msg_28 "The Electro has a combo attack. Fire the primary mode at the balls from the secondary mode for a huge and powerful explosion."
-set help_msg_29 "The Crylink's primary fire bounces. Both firemodes pull your enemies, making it a great tool to stop a flag carrier."
-set help_msg_30 "The Vortex is a powerful sniper gun. Aim carefully!"
-set help_msg_31 "The Hagar is underestimated, but very powerful if you aim right. The secondary mode charges up to four rockets and causes devasting damage if you release them."
-set help_msg_32 "The Devastator is powerful but slow. Keep Mouse1 pressed to guide the rockets. Secondary firemode makes the rocket(s) explode."
-set help_msg_33 "The Arc is a strong lighting beam, which bends slighty if you move your mouse. The secondary firemode is very strong but short. Both firemodes also heal teammates if you shoot at them."
-set help_msg_34 "By default, explosions go through walls. Be careful when hiding behind walls!"
+set help_msg_29 "The Crylink's primary fire bounces. Both firemodes pull your enemies, making it a great tool for stopping enemy FCs (flag carriers)."
+set help_msg_30 "The Vortex is one of the most powerful weapons in Xonotic. It has barely any competition at long range and can serve as a great combo weapon at mid and short range. Put some effort into mastering it, it'll pay off."
+set help_msg_31 "The Hagar is a powerful weapon in enclosed spaces, to use it effectively aim at the enemy's feet."
+set help_msg_32 "Guide your Devastator rockets by holding primary fire and turning or moving. Secondary fire makes the rocket(s) explode."
+set help_msg_33 "The Arc is a strong lightning beam, which bends slighty if you move your mouse. The secondary firemode is very strong but short. Both firemodes also heal teammates if you shoot at them."
+set help_msg_34 "By default, explosions go through walls and floors. Be careful where you hide!"
 set help_msg_35 "Get on IRC to chat with fellow players. Take a look at ^1https://xonotic.org/chat/${help_cfg_prefix}."
 set help_msg_36 "Don't drink and frag."
 set help_msg_37 "Don't shoot at players who are typing/chatting. You recognize those players by the keyboard symbols above their head."
@@ -40,21 +40,33 @@ set help_msg_38 "'gg' is shorthand for 'Good Game', 'gl' means 'Good luck' and '
 set help_msg_39 "Players with the prefix '$bot_prefix${help_cfg_prefix}' in their nick are bots on this server. There is also a clan named [BOT]."
 set help_msg_40 "You spawn with ^1two ${help_cfg_prefix}weapons. Use the Blaster for much faster movement."
 set help_msg_41 "Visit the stats page at ^1https://stats.xonotic.org/ ${help_cfg_prefix}and check out how you are doing in the rankings!"
-set help_msg_42 "Start playing 1on1 if you want to learn fast"
+set help_msg_42 "Play with fewer players if you want to improve faster. Overcrowded DM has too much randomness so you get too little feedback if you're doing things right or wrong."
 set help_msg_43 "Visit ^1https://xonotic.org/pickup/ ${help_cfg_prefix}to get in touch with the experienced players, ask them stuff and play with them!"
 set help_msg_44 "Look for servers that have a good ping for you. You can't play this game well with a ping > 100. If there are no servers close enough to you, cooperate with your friends to setup one."
 set help_msg_45 "If you want to play the next map you can cast a vote via 'vcall endmatch' in the console. Other players can vote using F1 and F2 (default keys)."
 set help_msg_46 "Always watch your back. Do not just run away, fight back as you retreat. Otherwise, you could be shot in the back."
-set help_msg_47 "Try to get as much armor and health as you can, but remember your teammates need armor and health too."
-set help_msg_48 "Do not attack if you have neither a good weapon, nor health, nor armor."
-set help_msg_49 "Standing still makes you an easy target. You can move around the map faster by bunny hopping."
-set help_msg_50 "You can use the Blaster to climb up walls. Before trying this, become familiar with the basics of Blaster movement."
-set help_msg_51 "You can control your movement in air. Use it to prevent yourself from falling off the map when somebody starts pushing you around."
-set help_msg_52 "Use the Blaster, Mortar or Devastator in space maps to push other players off the map. They will enjoy it."
-set help_msg_53 "You can turn off automatic weapon changing in the Player menu. If you configure your key bindings, manually switching weapons can be faster and easier."
+set help_msg_47 "Get as much armor and health as you can, but remember your teammates need them too."
+set help_msg_48 "In some modes like TDM (Team Deathmatch), getting killed means the enemy gets a point. You should not only focus on getting frags but also on not dying."
+set help_msg_49 "Standing still makes you an easy target. You can move around the map faster by bunny-hopping."
+set help_msg_50 "You can use the Blaster to climb up walls. Have enough health, walk up to a wall and keep shooting downwards at a 45° angle while holding forward (to stay near the wall)."
+set help_msg_51 "You can control your movement in the air. Use it to prevent yourself from falling off the map when somebody starts pushing you around."
+set help_msg_52 "Use the Blaster, Vortex or Devastator on space maps to push other players off the map. They will enjoy it."
+set help_msg_53 "You can turn off automatic weapon changing in the Settings->Game->Weapons menu. If you configure your key bindings, manually switching weapons can be faster and easier."
 set help_msg_54 "Choose the right weapon for the job, not just the one that the game automatically puts in your hand."
 set help_msg_55 "Enter ^1'lsmaps' ${help_cfg_prefix}in the console to get a list of maps configured on the server."
-set help_msg_56 "While you are in the air, release the forward key, press one of the left/right keys and move your mouse in the same direction. This will bend your fly/jump path."
-set help_msg_57 "Hold the jump key to keep on jumping (called ^1'bunny-hopping'${help_cfg_prefix}) which will accelerate your speed."
+set help_msg_56 "While you are bunny-hopping, release forward, press left/right and move your mouse in the same direction to turn much faster than just with mouse and forward."
+set help_msg_57 "You can keep accelerating while in the air, that's why ^1'bunny-hopping'${help_cfg_prefix} can be several times faster than running."
 set help_msg_58 "'xonotic.org/guide changed my life' -- ^x777S^x090Є^x088Є^x000Қ^x900⁻ʸ${help_cfg_prefix}, 2018"
-set help_msg_count 59 // update this when adding messages - it should be the number of messages (which means last message index + 1)
+set help_msg_59 "Always remember to mind your surroundings. You should pick up items ^1while ${help_cfg_prefix}fighting too."
+set help_msg_60 "The Crylink's primary fire's projectiles expand as long as you hold the button, then converge quickly. Time it right so they all hit the enemy."
+set help_msg_61 "The Crylink's secondary mode does little damage but provides strong pull, use it to accelerate together with bunny-hopping."
+set help_msg_62 "You can switch weapons faster than some weapons can shoot. Increase your DPS (damage per second) by switching after every shot. This is called comboing."
+set help_msg_63 "The most common weapons to combo are Mortar, Vortex and Devastator. Bind them close to your movement keys or change the weapon order to make comboing possible."
+set help_msg_64 "You can blaster-jump higher if you're moving fast. Combining it with a regular jump also gets you a bit more height."
+set help_msg_65 "Xonotic is an arena shooter (aFPS) which means it focuses on fast movement and item control (in addition to positioning and aim) more than tactical shooters (tFPSes) do."
+set help_msg_66 "Try to always move with a purpose, usually that is getting more health/armor or a new weapon."
+set help_msg_67 "Clan Arena gives you all weapons, full health/armor and has no selfdamage. It's the ideal mode to learn movement using weapons."
+set help_msg_68 "The Hagar's secondary mode charges up to four rockets, each does more damage than primary. Cancel the charge by pressing primary fire."
+set help_msg_69 "In addition to gamemodes, Xonotic offers multiple rulesets. The default is known as vanilla or simply Xonotic. Xonotic ProMode (XPM) focuses on more competitive play. Other popular rulesets are Instagib, Overkill and Xonotic DeFrag (XDF)."
+set help_msg_70 "You cannot hurt teammates in vanilla Xonotic (as opposed to XPM) but you can push them, so try to avoid hitting them unnecessarily."
+set help_msg_count 71 // update this when adding messages - it should be the number of messages (which means last message index + 1)
index 52cfb09f3377f8cadb963e0577b1b542b7915e20..70b7c8a0f8242dd1391f62421dba748b8d022796 100644 (file)
--- a/help.cfg
+++ b/help.cfg
@@ -1,5 +1,6 @@
 // Simple help message system
-// It prints messages with the configured name
+
+// First exec this file, then the correct help-*.cfg for your ruleset.
 
 // You can start the help system with the command help_loop but this has been found to annoy players.
 // A better way is to put `alias sv_hook_gamestart_all "defer 20 help_next"` into your server.cfg,
index 813ecbaef0df64396789d8115bce2c758deaec4d..d8151425127d8fc80f1cd3e9d7c2250c229e06ad 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0.4"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "1"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "0.8"
 seta hud_panel_weapons_noncurrent_scale "0.9"
 seta hud_panel_weapons_selection_radius "0"
index c5cfe4ac548fdc62e070ac1cda9ed08d4a9c3524..8766bcb24835825fed6417263ba6b169455a38b4 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0.4"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "1"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "1"
 seta hud_panel_weapons_noncurrent_scale "1"
 seta hud_panel_weapons_selection_radius "0"
index b7282584637aba28087bec61f8c071f5ac97df68..02940f8d3ab5b8c1e81e61bc00c4b57381839652 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "1"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "1"
 seta hud_panel_weapons_noncurrent_scale "1"
 seta hud_panel_weapons_selection_radius "0"
index 3bfd694b19cf2f0977c36c437ed7ee5c8220d5f9..41a47d7ab2d77cd1e6cc4d486eb5a0bf924b37f8 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "1"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "1"
 seta hud_panel_weapons_noncurrent_scale "1"
 seta hud_panel_weapons_selection_radius "0"
index c808f62fb5b10ca9f430153f3260821fc0280ff9..f4a5e0441b97f3b5c7c5940330cc2585a9afde01 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "1"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "1"
 seta hud_panel_weapons_noncurrent_scale "1"
 seta hud_panel_weapons_selection_radius "0"
index b0b02d080c6e6517407ca8706a8315bca9160f46..ea5dc69a240f1fee326c3fd58e07b94fc6add213 100644 (file)
@@ -64,6 +64,7 @@ seta hud_panel_weapons_timeout_fadefgmin "0"
 seta hud_panel_weapons_timeout_speed_in "0.25"
 seta hud_panel_weapons_timeout_speed_out "0.75"
 seta hud_panel_weapons_onlyowned "0"
+seta hud_panel_weapons_orderbyimpulse "1"
 seta hud_panel_weapons_noncurrent_alpha "1"
 seta hud_panel_weapons_noncurrent_scale "1"
 seta hud_panel_weapons_selection_radius "0"
index 7a7cff67a422ee7d0eff9d109776cadcb5989896..dddb38ce094fbd87e21baf8c478484a8882e8723 100644 (file)
@@ -4,5 +4,5 @@ sight sound/monsters/zombie/sight 0
 //ranged sound/monsters/zombie/ranged 0
 //melee sound/monsters/zombie/melee 0
 //pain sound/monsters/zombie/pain 0
-spawn sound/monsters/zombie/spawn 0
+//spawn sound/monsters/zombie/spawn 0
 idle sound/monsters/zombie/idle 0
index 2c0bfae53af18d6eaeef96cd896be92d43def1d7..0fcbed2f2e45e5e9b273b92f7b3e2175a5358907 100644 (file)
@@ -111,6 +111,7 @@ set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in
 //  rocket flying
 // ===============
 set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs"
+set g_rocket_flying_disabledelays 1 "disable detonation delays on rockets and mines"
 
 
 // =====================
@@ -302,8 +303,8 @@ set g_new_toys_use_pickupsound 0 "play the 'new toys, new toys!' roflsound when
 // =======
 //  buffs
 // =======
-set cl_buffs_autoreplace 1 "automatically drop current buff when picking up another"
-set g_buffs -1 "enable buffs (requires buff items or powerups)"
+seta cl_buffs_autoreplace 1 "automatically drop current buff when picking up another"
+set g_buffs -1 "enable buffs (requires buff items or powerups on the map)"
 set g_buffs_effects 1 "show particle effects from carried buffs"
 set g_buffs_waypoint_distance 1024 "maximum distance at which buff waypoint can be seen from item"
 set g_buffs_pickup_anyway 0 "instantly respawn the buff when it is picked up, instead of waiting for the player to drop it"
@@ -321,7 +322,7 @@ set g_buffs_ammo 1 "ammo buff: infinite ammunition"
 set g_buffs_ammo_time 60 "ammo buff carry time"
 set g_buffs_resistance 1 "resistance buff: greatly reduces damage taken"
 set g_buffs_resistance_time 60 "resistance buff time"
-set g_buffs_resistance_blockpercent 0.7 "damage reduction multiplier, higher values mean less damage"
+set g_buffs_resistance_blockpercent 0.5 "damage reduction multiplier, higher values mean less damage"
 set g_buffs_medic 1 "medic buff: increased regeneration speed, extra health, chance to survive a fatal attack"
 set g_buffs_medic_time 60 "medic buff carry time"
 set g_buffs_medic_survive_chance 0.6 "multiplier chance of player surviving a fatal hit"
@@ -334,7 +335,7 @@ set g_buffs_medic_heal_range 400 "furthest away players can be from carrier to g
 set g_buffs_medic_heal_delay 1 "delay between team healing"
 set g_buffs_vengeance 1 "vengeance buff: attackers also take damage"
 set g_buffs_vengeance_time 60 "vengeance buff carry time"
-set g_buffs_vengeance_damage_multiplier 0.6 "amount of damage dealt the attacker takes when hitting a target with vengeance"
+set g_buffs_vengeance_damage_multiplier 0.4 "amount of damage dealt the attacker takes when hitting a target with vengeance"
 set g_buffs_bash 1 "bash buff: increased knockback force and immunity to knockback"
 set g_buffs_bash_time 60 "bash buff carry time"
 set g_buffs_bash_force 2 "bash force multiplier"
@@ -354,7 +355,7 @@ set g_buffs_speed_damage_take 1.2 "damage taken multiplier, higher value means m
 set g_buffs_speed_regen 1.2 "regeneration speed multiplier, higher value means faster health regeneration while holding speed buff"
 set g_buffs_vampire 1 "vampire buff: attacks to players and monsters heal the carrier"
 set g_buffs_vampire_time 60 "vampire buff carry time"
-set g_buffs_vampire_damage_steal 0.6 "damage stolen multiplier while holding vampire buff"
+set g_buffs_vampire_damage_steal 0.4 "damage stolen multiplier while holding vampire buff"
 set g_buffs_jump 0 "jump buff: greatly increased jump height"
 set g_buffs_jump_time 60 "jump buff carry time"
 set g_buffs_jump_height 600 "jump height while holding jump buff"
@@ -378,7 +379,7 @@ set g_buffs_magnet_range_buff 100 "range around player that only buffs are picke
 set g_buffs_luck 1 "luck buff: randomly increased damage"
 set g_buffs_luck_time 60 "luck buff carry time"
 set g_buffs_luck_chance 0.15 "chance for 'critical' hit (multiplied damage) with luck buff"
-set g_buffs_luck_damagemultiplier 3 "luck damage multiplier"
+set g_buffs_luck_damagemultiplier 2 "luck damage multiplier"
 set g_buffs_flight 0 "flight buff: crouch jump to reverse your gravity!"
 set g_buffs_flight_time 60 "flight buff carry time"
 
index 55be0a627ec3a20fe9eb36b54d39c1db8fe65e53..80b26a9d8a34151049d24e0a4a9bf007bcd2bf9f 100644 (file)
@@ -102,7 +102,7 @@ seta notification_ANNCE_VOTE_ACCEPT "2" "0 = disabled, 1 = enabled if gentle mod
 seta notification_ANNCE_VOTE_CALL "2" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_VOTE_FAIL "2" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 
-// MSG_INFO notifications (count = 329):
+// MSG_INFO notifications (count = 334):
 seta notification_INFO_CA_JOIN_LATE "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_CA_LEAVE "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_CHAT_NOSPECTATORS "2" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
@@ -251,6 +251,8 @@ seta notification_INFO_MINIGAME_INVITE "1" "0 = off, 1 = print to console, 2 = p
 seta notification_INFO_MONSTERS_DISABLED "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_NEXBALL_RETURN_HELD "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_ONSLAUGHT_CAPTURE "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
+seta notification_INFO_ONSLAUGHT_CAPTURE_NONAME "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
+seta notification_INFO_ONSLAUGHT_CPDESTROYED_NONAME "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_ONSLAUGHT_CPDESTROYED "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_ONSLAUGHT_GENDESTROYED_OVERTIME "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_ONSLAUGHT_GENDESTROYED "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
@@ -349,7 +351,7 @@ seta notification_INFO_WEAPON_TUBA_SUICIDE "1" "0 = off, 1 = print to console, 2
 seta notification_INFO_WEAPON_VAPORIZER_MURDER "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 seta notification_INFO_WEAPON_VORTEX_MURDER "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
 
-// MSG_CENTER notifications (count = 235):
+// MSG_CENTER notifications (count = 239):
 seta notification_CENTER_ALONE "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ASSAULT_ATTACKING "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ASSAULT_DEFENDING "1" "0 = off, 1 = centerprint"
@@ -494,6 +496,8 @@ seta notification_CENTER_NADE_THROW "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_NIX_COUNTDOWN "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_NIX_NEWWEAPON "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ONS_CAPTURE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_ONS_CAPTURE_NONAME "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_ONS_CAPTURE_TEAM_NONAME "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ONS_CAPTURE_TEAM "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ONS_CONTROLPOINT_SHIELDED "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ONS_GENERATOR_SHIELDED "1" "0 = off, 1 = centerprint"
@@ -521,7 +525,6 @@ seta notification_CENTER_ROUND_PLAYER_WIN "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ROUND_TEAM_LOSS "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ROUND_TEAM_WIN "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_ROUND_TIED "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_SECONDARY_NODAMAGE "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_SEQUENCE_COMPLETED "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_SEQUENCE_COUNTER "1" "0 = off, 1 = centerprint"
 seta notification_CENTER_SEQUENCE_COUNTER_FEWMORE "1" "0 = off, 1 = centerprint"
@@ -750,4 +753,4 @@ seta notification_show_sprees_info "3" "Show spree information in MSG_INFO messa
 seta notification_show_sprees_info_newline "1" "Show attacker spree information for MSG_INFO messages on a separate line than the death notification itself"
 seta notification_show_sprees_info_specialonly "1" "Don't show attacker spree information in MSG_INFO messages if it isn't an achievement"
 
-// Notification counts (total = 837): MSG_ANNCE = 89, MSG_INFO = 329, MSG_CENTER = 235, MSG_MULTI = 156, MSG_CHOICE = 28
+// Notification counts (total = 846): MSG_ANNCE = 89, MSG_INFO = 334, MSG_CENTER = 239, MSG_MULTI = 156, MSG_CHOICE = 28
index 3c1614dcd3b1943061a3c35ca3489127fdb7f2e1..ca688cd695136b13fb078f1d49325690ded5c2b9 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index f45a81b7739fb4f55ed8dd63d5504b01c2a6a236..4507cc8c86be91d5301ddf55d058135cfc3da87b 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 1
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index 585262a2ed0080811a1be8d47ac7fa926de4c1b9..a515e9be773b5c6d8d21a2cc2a176c1a4c7688dc 100644 (file)
@@ -33,6 +33,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 1
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index 3ce18b52a98bef30d6c6f32da3ba0fa0a2a22f5d..7b650da38e315d166977fc888f52a2937a1d7367 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index de7352aab54e56de9803d38cdec59a0298038583..c59b8e99e6e4dfc7a7c32fa850a9961368b7d3ff 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index 7705a4d512d70856f008aa0d2c1148d282581525..05ece9bea6e97d557c8917a05d793aefe939c811 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
 sv_warsowbunny_backtosideratio 0.8
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index 9009beab33a14e949a7f0d575d67dc7673617387..4a272261fe173802e4880874a24975a214475208 100644 (file)
@@ -32,6 +32,7 @@ sv_warsowbunny_accel 0.1585
 sv_warsowbunny_topspeed 900
 sv_warsowbunny_backtosideratio 0.9
 sv_friction_on_land 0
+sv_friction_slick 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
index c372be250b5ad0dae82b4b642bdc3c1d32b4e40a..d11355659aa8071a5795e030b555a01361aeeb8b 100644 (file)
@@ -76,7 +76,7 @@ bool autocvar_cl_spawnzoom = 1;
 float autocvar_cl_spawnzoom_speed = 1;
 float autocvar_cl_spawnzoom_factor = 2;
 bool autocvar_cl_stripcolorcodes;
-bool autocvar_cl_vehicles_alarm = true;
+bool autocvar_cl_vehicles_alarm = false;
 bool autocvar_cl_vehicles_hud_tactical = true;
 float autocvar_cl_vehicles_hudscale = 0.5;
 float autocvar_cl_vehicles_notify_time = 15;
@@ -150,6 +150,8 @@ bool autocvar_crosshair_ring_reload;
 float autocvar_crosshair_ring_reload_alpha;
 float autocvar_crosshair_ring_reload_size;
 float autocvar_crosshair_size;
+bool autocvar_crosshair_chase = true;
+float crosshair_chase_playeralpha = 0.25;
 int autocvar_ekg;
 float autocvar_fov;
 bool autocvar_hud_cursormode = true;
@@ -349,6 +351,7 @@ float autocvar_hud_panel_weapons_selection_radius = 0;
 float autocvar_hud_panel_weapons_selection_speed = 10;
 float autocvar_hud_panel_weapons_timeout;
 int autocvar_hud_panel_weapons_timeout_effect;
+bool autocvar_hud_panel_weapons_orderbyimpulse = true;
 float autocvar_hud_panel_weapons_timeout_fadebgmin;
 float autocvar_hud_panel_weapons_timeout_fadefgmin;
 float autocvar_hud_panel_weapons_timeout_speed_in = 0.25;
index 7720f071b912a57c8e4cc2f0088bc689271f5b17..db1a5afacaed87760c210bde6088c475c7dab29c 100644 (file)
@@ -111,9 +111,11 @@ vector w_org, w_backoff;
 
 float autoswitch;
 bool cvar_cl_allow_uid2name;
+bool cvar_cl_allow_uidranking;
 float cvar_cl_autoscreenshot;
 float cvar_cl_autotaunt;
 float cvar_cl_clippedspectating;
+int cvar_cl_gunalign;
 float cvar_cl_handicap;
 float cvar_cl_jetpack_jump;
 float cvar_cl_movement_track_canjump;
@@ -129,9 +131,11 @@ bool cvar_cl_weapon_switch_fallback_to_impulse;
 
 REPLICATE(autoswitch, bool, "cl_autoswitch");
 REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
+REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking");
 REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
 REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
 REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
+REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
 REPLICATE(cvar_cl_handicap, float, "cl_handicap");
 REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
 REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
@@ -145,11 +149,6 @@ REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
 REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
 REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
 /*
-// this is also a STAT
-// pointless sending this cvars since server can't change gun alignment during the match
-int cvar_cl_gunalign;
-REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
-
 // cvar cl_newusekeysupported doesn't exist
 float cvar_cl_newusekeysupported;
 REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
@@ -174,8 +173,9 @@ REPLICATE(cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9");
 
 float bgmtime;
 
-string weaponorder_byimpulse;
+string weaponorder_byimpulse; // NOTE: this is a misnomer, weapon order is not always sorted by impulse
 string weaponorder_bypriority;
+bool weapons_orderbyimpulse; // update priority list when toggling this
 
 float vortex_charge_movingavg;
 
index 3043e6e6860d90a0673829688f681eff6fb44e0d..a6c22c74eee9bf113f4d71570b90ec57f7a33938 100644 (file)
@@ -97,6 +97,7 @@ void HUD_Panel_ExportCfg(string cfgname)
                                        HUD_Write_Cvar("hud_panel_weapons_timeout_speed_in");
                                        HUD_Write_Cvar("hud_panel_weapons_timeout_speed_out");
                                        HUD_Write_Cvar("hud_panel_weapons_onlyowned");
+                                       HUD_Write_Cvar("hud_panel_weapons_orderbyimpulse");
                                        HUD_Write_Cvar("hud_panel_weapons_noncurrent_alpha");
                                        HUD_Write_Cvar("hud_panel_weapons_noncurrent_scale");
                                        HUD_Write_Cvar("hud_panel_weapons_selection_radius");
index bd9aa1a21ca53afe3837d12bdf1fef3771ac4940..95ceced82c74d7ca6a39adc2084de9e950c85a2c 100644 (file)
@@ -177,7 +177,7 @@ void HUD_Ammo()
 
        Weapon wep = wepent.switchweapon;
        int i;
-       bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_WEAPON_AMMO);
+       bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_AMMO);
        row = column = 0;
        if(autocvar_hud_panel_ammo_onlycurrent)
        {
index 0b9c102f7908d830c1a137b9bdb059cee64ce521..3e61f9b5a6c08f9ef62147c60bd9659c7ffa2f55 100644 (file)
@@ -790,7 +790,7 @@ void QuickMenu_Default(string target_submenu)
        if(teamplay)
        {
        QUICKMENU_SMENU(CTX(_("QMCMD^Team chat")), "Team chat")
-               QUICKMENU_ENTRY_TC(CTX(_("QMCMD^quad soon")), "say_team %s", "quad soon", CTX(_("QMCMD^quad soon")))
+               QUICKMENU_ENTRY_TC(CTX(_("QMCMD^strength soon")), "say_team %s", "strength soon", CTX(_("QMCMD^strength soon")))
                QUICKMENU_ENTRY_TC(CTX(_("QMCMD^free item, icon")), "say_team %s; g_waypointsprite_team_here_p", "free item %x^7 (l:%y^7)", CTX(_("QMCMD^free item %x^7 (l:%y^7)")))
                QUICKMENU_ENTRY_TC(CTX(_("QMCMD^took item, icon")), "say_team %s; g_waypointsprite_team_here", "took item (l:%l^7)", CTX(_("QMCMD^took item (l:%l^7)")))
                QUICKMENU_ENTRY_TC(CTX(_("QMCMD^negative")), "say_team %s", "negative", CTX(_("QMCMD^negative")))
@@ -827,11 +827,7 @@ void QuickMenu_Default(string target_submenu)
 
                if(spectatee_status > 0)
                {
-               QUICKMENU_SMENU(CTX(_("QMCMD^Spectator camera")), "Spectator camera")
-                       QUICKMENU_ENTRY(CTX(_("QMCMD^1st person")), "chase_active 0; -use")
-                       QUICKMENU_ENTRY(CTX(_("QMCMD^3rd person around player")), "chase_active 1; +use")
-                       QUICKMENU_ENTRY(CTX(_("QMCMD^3rd person behind")), "chase_active 1; -use")
-               QUICKMENU_SMENU(CTX(_("QMCMD^Spectator camera")), "Spectator camera")
+               QUICKMENU_ENTRY(CTX(_("QMCMD^Change spectator camera")), "dropweapon")
                }
 
                if(spectatee_status == -1)
@@ -839,8 +835,7 @@ void QuickMenu_Default(string target_submenu)
                QUICKMENU_SMENU(CTX(_("QMCMD^Observer camera")), "Observer camera")
                        QUICKMENU_ENTRY(CTX(_("QMCMD^Increase speed")), "weapnext")
                        QUICKMENU_ENTRY(CTX(_("QMCMD^Decrease speed")), "weapprev")
-                       QUICKMENU_ENTRY(CTX(_("QMCMD^Wall collision off")), "+use")
-                       QUICKMENU_ENTRY(CTX(_("QMCMD^Wall collision on")), "-use")
+                       QUICKMENU_ENTRY(CTX(_("QMCMD^Wall collision")), "toggle cl_clippedspectating")
                QUICKMENU_SMENU(CTX(_("QMCMD^Observer camera")), "Observer camera")
                }
 
index ac32e23cb9373195df72860661d9dcce8f2d3f7b..832ffad0b38ca9b27727451808c44570e5d5eb79 100644 (file)
@@ -63,7 +63,7 @@ void HUD_Weapons()
        float when = max(1, autocvar_hud_panel_weapons_complainbubble_time);
        float fadetime = max(0, autocvar_hud_panel_weapons_complainbubble_fadetime);
 
-       bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_WEAPON_AMMO);
+       bool infinite_ammo = (STAT(ITEMS) & IT_UNLIMITED_AMMO);
 
        vector weapon_pos, weapon_size = '0 0 0';
        vector color;
@@ -91,11 +91,15 @@ void HUD_Weapons()
        HUD_Panel_LoadCvars();
 
        // figure out weapon order (how the weapons are sorted) // TODO make this configurable
-       if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
+       if(weaponorder_bypriority != autocvar_cl_weaponpriority || autocvar_hud_panel_weapons_orderbyimpulse != weapons_orderbyimpulse || !weaponorder[0])
        {
                int weapon_cnt;
+               weapons_orderbyimpulse = autocvar_hud_panel_weapons_orderbyimpulse;
                strcpy(weaponorder_bypriority, autocvar_cl_weaponpriority);
-               strcpy(weaponorder_byimpulse, W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
+               string weporder = W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority));
+               if(autocvar_hud_panel_weapons_orderbyimpulse)
+                       weporder = W_FixWeaponOrder_BuildImpulseList(weporder);
+               strcpy(weaponorder_byimpulse, weporder);
                weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
 
                weapon_cnt = 0;
index c8274fe62641070f01f4448acce41d07080b0e9a..b61f425aa6da44b8d9d4f073a7929275f54a5685 100644 (file)
@@ -143,6 +143,8 @@ void CSQC_Init()
        registercvar("cl_weapon_switch_reload", "1");
        registercvar("cl_weapon_switch_fallback_to_impulse", "1");
 
+       registercvar("cl_allow_uidranking", "1");
+
        if(autocvar_cl_lockview)
                cvar_set("cl_lockview", "0");
 
index 8b5825883c7f93208d971a17863fa1008acebd54..4b8bc4899a788de78152dec7a1990b56a1de01c0 100644 (file)
@@ -291,6 +291,7 @@ void viewmodel_draw(entity this)
                return;
        int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL;
        float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha);
+       int wepskin = this.m_skin;
        bool invehicle = player_localentnum > maxclients;
        if (invehicle) a = -1;
        Weapon wep = this.activeweapon;
@@ -304,6 +305,7 @@ void viewmodel_draw(entity this)
        {
                e.drawmask = mask;
                e.alpha = a;
+               e.skin = wepskin;
                e.colormap = 256 + c;  // colormap == 0 is black, c == 0 is white
                e.glowmod = g;
                e.csqcmodel_effects = fx;
@@ -654,6 +656,9 @@ float TrueAimCheck(entity wepent)
 
        traceline(traceorigin, traceorigin + view_forward * max_shot_distance, mv, ta);
        trueaimpoint = trace_endpos;
+       // move trueaimpoint a little bit forward to make the final tracebox reliable
+       // since it sometimes doesn't reach a teammate by a hair
+       trueaimpoint += view_forward;
 
        if(vdist((trueaimpoint - traceorigin), <, g_trueaim_minrange))
                trueaimpoint = traceorigin + view_forward * g_trueaim_minrange;
@@ -713,7 +718,7 @@ vector liquidcolor_prev;
 
 float eventchase_current_distance;
 float eventchase_running;
-int WantEventchase(entity this)
+int WantEventchase(entity this, bool want_vehiclechase)
 {
        if(autocvar_cl_orthoview)
                return 0;
@@ -723,7 +728,7 @@ int WantEventchase(entity this)
                return 1;
        if(spectatee_status >= 0)
        {
-               if(hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0))
+               if(want_vehiclechase)
                        return 1;
                if(MUTATOR_CALLHOOK(WantEventchase, this))
                        return 1;
@@ -973,6 +978,21 @@ void HUD_Crosshair(entity this)
                // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
                if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM))
                        wcross_origin = viewloc_mousepos;
+               else if(autocvar_chase_active > 0 && autocvar_crosshair_chase)
+               {
+                       vector player_org = ((csqcplayer) ? csqcplayer.origin + csqcplayer.view_ofs : view_origin);
+                       if(csqcplayer && crosshair_chase_playeralpha && crosshair_chase_playeralpha < 1)
+                       {
+                               traceline(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL);
+                               float myalpha = (!csqcplayer.m_alpha) ? 1 : csqcplayer.m_alpha;
+                               if(trace_ent == csqcplayer && STAT(HEALTH) > 0)
+                                       csqcplayer.alpha = min(crosshair_chase_playeralpha, myalpha);
+                               else
+                                       csqcplayer.alpha = csqcplayer.m_alpha;
+                       }
+                       traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL);
+                       wcross_origin = project_3d_to_2d(trace_endpos);
+               }
                else
                        wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward);
                wcross_origin.z = 0;
@@ -1078,8 +1098,10 @@ void HUD_Crosshair(entity this)
                        wcross_color.z += sin(hitindication_crosshair_size) * hitindication_color.z;
                }
 
-               if(shottype == SHOTTYPE_HITENEMY)
-                       wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0
+               // no effects needed for targeting enemies, this can't possibly span all valid targets!
+               // just show for teammates to give a sign that they're an invalid target
+               //if(shottype == SHOTTYPE_HITENEMY)
+                       //wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0
                if(shottype == SHOTTYPE_HITTEAM)
                        wcross_scale /= autocvar_crosshair_hittest; // is not queried if hittest is 0
 
@@ -1105,7 +1127,7 @@ void HUD_Crosshair(entity this)
                wcross_alpha_goal_prev = wcross_alpha;
                wcross_color_goal_prev = wcross_color;
 
-               if(spectatee_status == -1 && shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active))
+               if(spectatee_status == 0 && (shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active)))
                {
                        wcross_blur = 1;
                        wcross_alpha *= 0.75;
@@ -1656,7 +1678,7 @@ void CSQC_UpdateView(entity this, float w, float h)
                else if(autocvar_chase_active == -2)
                        cvar_set("chase_active", "0");
 
-               float vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0));
+               bool vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0));
 
                float vehicle_viewdist = 0;
                vector vehicle_viewofs = '0 0 0';
@@ -1668,10 +1690,14 @@ void CSQC_UpdateView(entity this, float w, float h)
                                Vehicle info = Vehicles_from(hud);
                                vehicle_viewdist = info.height;
                                vehicle_viewofs = info.view_ofs;
+                               if(vehicle_viewdist < 0) // when set below 0, this vehicle doesn't use third person view (gunner slots)
+                                       vehicle_chase = false;
                        }
+                       else
+                               vehicle_chase = false;
                }
 
-               int eventchase = WantEventchase(this);
+               int eventchase = WantEventchase(this, vehicle_chase);
                if (eventchase)
                {
                        vector current_view_origin_override = '0 0 0';
index 15c1366ea10bda6d03cc2cda162e8cddbf4fddec..a7e7da546e0b05337766b8247b2832be94c7438c 100644 (file)
@@ -50,6 +50,8 @@ const int SERVERFLAG_PLAYERSTATS = 4;
 // a bit more constant
 const vector PL_MAX_CONST = '16 16 45';
 const vector PL_MIN_CONST = '-16 -16 -24';
+const vector PL_CROUCH_MAX_CONST = '16 16 25';
+const vector PL_CROUCH_MIN_CONST = '-16 -16 -24';
 
 // gametype vote flags
 const int GTV_FORBIDDEN = 0; // Cannot be voted
index 7c5a218b21f15e34ba6ba43ee0d13b4a2b0a801f..96836a38e23c635d00c5c731a3478a6d46d3afb3 100644 (file)
 # define TAG_VIEWLOC_NAME tag_networkviewloc
 # define TAG_VIEWLOC_TYPE int
 .float tag_networkviewloc;
+
+# define ALPHA m_alpha
+.float m_alpha;
 #else
 # define TAG_ENTITY_NAME tag_entity
 # define TAG_ENTITY_TYPE entity
 
 # define TAG_VIEWLOC_NAME viewloc
 # define TAG_VIEWLOC_TYPE entity
+
+# define ALPHA alpha
 #endif
 
 // add properties you want networked to CSQC here
@@ -31,7 +36,7 @@
        CSQCMODEL_PROPERTY(BIT(0), int, ReadShort, WriteShort, colormap) \
        CSQCMODEL_PROPERTY(BIT(1), int, ReadInt24_t, WriteInt24_t, effects) \
        CSQCMODEL_PROPERTY(BIT(2), int, ReadByte, WriteByte, modelflags) \
-       CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, alpha, 254, -1, 254) \
+       CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, ALPHA, 254, -1, 254) \
        CSQCMODEL_PROPERTY(BIT(4), int, ReadByte, WriteByte, skin) \
        CSQCMODEL_PROPERTY(BIT(5), float, ReadApproxPastTime, WriteApproxPastTime, death_time) \
        CSQCMODEL_PROPERTY(BIT(6), float, ReadByte, WriteByte, solid) \
index d851c8e0df17883cc3ba71afc148d83af5ab533f..408a14e0d87fbac00a3dfcc11bd6292997149fe3 100644 (file)
@@ -333,7 +333,7 @@ MUTATOR_HOOKFUNCTION(ca, GiveFragsForKill, CBC_ORDER_FIRST)
 
 MUTATOR_HOOKFUNCTION(ca, SetStartItems)
 {
-       start_items       &= ~IT_UNLIMITED_BOTH;
+       start_items       &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
        start_health       = warmup_start_health       = cvar("g_lms_start_health");
        start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
        start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
@@ -483,11 +483,6 @@ MUTATOR_HOOKFUNCTION(ca, ClientCommand_Spectate)
        return MUT_SPECCMD_CONTINUE;
 }
 
-MUTATOR_HOOKFUNCTION(ca, WantWeapon)
-{
-       M_ARGV(2, bool) = true; // all weapons
-}
-
 MUTATOR_HOOKFUNCTION(ca, HideTeamNagger)
 {
        return true; // doesn't work well with the whole spectator as player thing
@@ -502,8 +497,8 @@ MUTATOR_HOOKFUNCTION(ca, GetPlayerStatus)
 
 MUTATOR_HOOKFUNCTION(ca, SetWeaponArena)
 {
-       // most weapons arena
-       if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") M_ARGV(0, string) = "most";
+       if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
+               M_ARGV(0, string) = autocvar_g_ca_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand)
index e383687fcf44dd2ed3a69efa5b4c357e1e91e746..f6420b85261b7efaa9435db2ae1e8b90e091e0e8 100644 (file)
@@ -12,6 +12,7 @@ bool autocvar_g_ca_team_spawns;
 //int autocvar_g_ca_teams;
 int autocvar_g_ca_teams_override;
 float autocvar_g_ca_warmup;
+string autocvar_g_ca_weaponarena = "most";
 
 
 int ca_teams;
index c6d756fbb8e9acba3d03b73bd08b4620481ed8c8..663a5f829a9273ce3b507754a36994316e683c16 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/ctf/ctf.qc>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/ctf/cl_ctf.qc>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/ctf/ctf.qc b/qcsrc/common/gamemodes/gamemode/ctf/ctf.qc
new file mode 100644 (file)
index 0000000..a6157c5
--- /dev/null
@@ -0,0 +1 @@
+#include "ctf.qh"
index 939c70e29ea858597260439a21ea3db98c19f78c..03b2ec9d1d428a3c7dfce3b0d3cbcb2d5fe05bd1 100644 (file)
@@ -440,7 +440,8 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype)
 
        // reset the flag
        setattachment(flag, NULL, "");
-       setorigin(flag, player.origin + FLAG_DROP_OFFSET);
+       tracebox(player.origin - FLAG_DROP_OFFSET, flag.m_mins, flag.m_maxs, player.origin + FLAG_DROP_OFFSET, MOVE_NOMONSTERS, flag);
+       setorigin(flag, trace_endpos);
        flag.owner.flagcarried = NULL;
        GameRules_scoring_vip(flag.owner, false);
        flag.owner = NULL;
index ccaa150df78903cd843abd28930fe02653bd1f39..a35415a8f3da75cda808a45ea231447ecd936170 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/domination/domination.qc>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/domination/cl_domination.qc>
 #endif
index b48a0a9147d6cc13ef5656fb9556699fbcbf9dca..869273e850a516a22fcbca3603d8ab77ddb91f32 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/domination/domination.qh>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/domination/cl_domination.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/domination/domination.qc b/qcsrc/common/gamemodes/gamemode/domination/domination.qc
new file mode 100644 (file)
index 0000000..3e5beba
--- /dev/null
@@ -0,0 +1 @@
+#include "domination.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/domination/domination.qh b/qcsrc/common/gamemodes/gamemode/domination/domination.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
index 84ee0725f55f2087c56554f4b882b47eeed7645c..54f6268e36da53d537e2effef2c5c72c62afadbf 100644 (file)
@@ -549,7 +549,7 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
 
 MUTATOR_HOOKFUNCTION(ft, SetStartItems)
 {
-       start_items &= ~IT_UNLIMITED_BOTH;
+       start_items &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
        //start_health       = warmup_start_health       = cvar("g_lms_start_health");
        //start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
        start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
@@ -587,9 +587,8 @@ MUTATOR_HOOKFUNCTION(ft, TeamBalance_CheckAllowedTeams, CBC_ORDER_EXCLUSIVE)
 
 MUTATOR_HOOKFUNCTION(ft, SetWeaponArena)
 {
-       // most weapons arena
        if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
-               M_ARGV(0, string) = "most";
+               M_ARGV(0, string) = autocvar_g_freezetag_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(ft, FragCenterMessage)
index df138a93d84f011bf29a51f2cf6135872773e0bb..3eb753020b35a857da4cde61e2b9b95879727c47 100644 (file)
@@ -6,6 +6,8 @@
 int autocvar_g_freezetag_point_limit;
 int autocvar_g_freezetag_point_leadlimit;
 bool autocvar_g_freezetag_team_spawns;
+string autocvar_g_freezetag_weaponarena = "most_available";
+
 void freezetag_Initialize();
 
 REGISTER_MUTATOR(ft, false)
index 2ce6f4493baafb5d52465c0bb4024e4e9084db45..42fb4b0e24b2bd831385ba1c8c545866cb2dee4c 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/keepaway/keepaway.qc>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/keepaway/cl_keepaway.qc>
 #endif
index 8536675f3f188a3dafbbe464002a35fb48c334fa..93eaf396c755e0f01ccf258c712b8ec5cbb341be 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/keepaway/keepaway.qh>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/keepaway/cl_keepaway.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc
new file mode 100644 (file)
index 0000000..fe03dc9
--- /dev/null
@@ -0,0 +1 @@
+#include "keepaway.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
index 14802494b9303156d83401ec48f21262b9e44dca..52b5f0df8f38f9a6b25dd485e2d1ccbe3b3e39b3 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/keyhunt/keyhunt.qc>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc>
 #endif
index defda749783f75f4b5e02c2c11923d1f2a4788d1..46f35788ed794f73c631421f9defa77871347bbd 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/keyhunt/keyhunt.qh>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/keyhunt/cl_keyhunt.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc
new file mode 100644 (file)
index 0000000..724a0e6
--- /dev/null
@@ -0,0 +1 @@
+#include "keyhunt.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
index 4481cf669a23b170060dd35a9577bf24ad1e902b..896937c4e8bc867152dcc40ded80fe8fbcabb6eb 100644 (file)
@@ -1039,7 +1039,7 @@ void havocbot_goalrating_kh(entity this, float ratingscale_team, float ratingsca
                        navigation_routerating(this, head.owner, ratingscale_enemy * 10000, 100000);
        }
 
-       havocbot_goalrating_items(this, 1, this.origin, 10000);
+       havocbot_goalrating_items(this, 80000, this.origin, 10000);
 }
 
 void havocbot_role_kh_carrier(entity this)
index fa76eaf2f6e269e6d8b5fe05557f5231efd42081..d590895a4775bea5a84fe7db05e6082b48ac3ff7 100644 (file)
@@ -323,7 +323,7 @@ MUTATOR_HOOKFUNCTION(lms, GiveFragsForKill)
 
 MUTATOR_HOOKFUNCTION(lms, SetStartItems)
 {
-       start_items &= ~IT_UNLIMITED_BOTH;
+       start_items &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
        start_health       = warmup_start_health       = cvar("g_lms_start_health");
        start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
        start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
@@ -384,7 +384,7 @@ MUTATOR_HOOKFUNCTION(lms, ItemTouch)
 
        if(item.itemdef == ITEM_ExtraLife)
        {
-               Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES);
+               Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES, autocvar_g_lms_extra_lives);
                GameRules_scoring_add(toucher, LMS_LIVES, autocvar_g_lms_extra_lives);
                return MUT_ITEMTOUCH_PICKUP;
        }
@@ -429,9 +429,10 @@ MUTATOR_HOOKFUNCTION(lms, CheckRules_World)
        return true;
 }
 
-MUTATOR_HOOKFUNCTION(lms, WantWeapon)
+MUTATOR_HOOKFUNCTION(lms, SetWeaponArena)
 {
-       M_ARGV(2, bool) = true; // all weapons
+       if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
+               M_ARGV(0, string) = autocvar_g_lms_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(lms, GetPlayerStatus)
index 256620a454bf7f80ad97a095a84b92b6dc094fc8..996d371fe05b84e736283ccc042251aaa60e8a3a 100644 (file)
@@ -2,8 +2,12 @@
 
 #include <common/mutators/base.qh>
 #include <common/scores.qh>
+
 .float lms_spectate_warning;
+
 #define autocvar_g_lms_lives_override cvar("g_lms_lives_override")
+string autocvar_g_lms_weaponarena = "most_available";
+
 void lms_Initialize();
 
 REGISTER_MUTATOR(lms, false)
index b229dcdf50affa7ad43b369781e29e87f9dd8023..4e9fd6b10369b1b482326eb7d4b71a26e5004cfd 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/nexball/nexball.qc>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/nexball/cl_nexball.qc>
 #endif
index 0a3d1e23831f2fd1729cc914bd8a4b33ff63f6c5..657280e6a59dcdd48ec85813a1fac3504eab1d52 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/nexball/nexball.qh>
 #ifdef CSQC
     #include <common/gamemodes/gamemode/nexball/cl_nexball.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc
new file mode 100644 (file)
index 0000000..4b49dba
--- /dev/null
@@ -0,0 +1 @@
+#include "nexball.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
index 1e3127eb5f7e972c130c3c62deb3a2dcc3c1d565..ccabc47a518c502e9196af25e26a632032e23773 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 CLASS(BallStealer, PortoLaunch)
-/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SPECIALATTACK | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
+/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
 /* impulse   */ ATTRIB(BallStealer, impulse, int, 0);
 /* refname   */ ATTRIB(BallStealer, netname, string, "ballstealer");
 /* wepname   */ ATTRIB(BallStealer, m_name, string, _("Ball Stealer"));
index 3128bae26684ecace22264ff3ef5fba9c3bd5d2a..6f12f3cc0deba003059fb4207497a15362c0ed6b 100644 (file)
@@ -411,7 +411,10 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker
        {
                sound(this, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM);
                pointparticles(EFFECT_ROCKET_EXPLODE, this.origin, '0 0 0', 1);
-               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_ONSLAUGHT_CPDESTROYED), this.owner.message, attacker.netname);
+               if (this.owner.message != "")
+                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_ONSLAUGHT_CPDESTROYED), this.owner.message, attacker.netname);
+               else
+                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_ONSLAUGHT_CPDESTROYED_NONAME), attacker.netname);
 
                GameRules_scoring_add(attacker, ONS_TAKES, 1);
                GameRules_scoring_add(attacker, SCORE, 10);
@@ -554,9 +557,18 @@ void ons_ControlPoint_Icon_BuildThink(entity this)
 
                if(IS_PLAYER(this.owner.ons_toucher))
                {
-                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ONSLAUGHT_CAPTURE, this.owner.ons_toucher.netname, this.owner.message);
-                       Send_Notification(NOTIF_ALL_EXCEPT, this.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(this.owner.ons_toucher.team, CENTER_ONS_CAPTURE_TEAM), this.owner.message);
-                       Send_Notification(NOTIF_ONE, this.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE, this.owner.message);
+                       if(this.owner.message != "")
+                       {
+                               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ONSLAUGHT_CAPTURE, this.owner.ons_toucher.netname, this.owner.message);
+                               Send_Notification(NOTIF_ALL_EXCEPT, this.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(this.owner.ons_toucher.team, CENTER_ONS_CAPTURE_TEAM), this.owner.message);
+                               Send_Notification(NOTIF_ONE, this.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE, this.owner.message);
+                       }
+                       else
+                       {
+                               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ONSLAUGHT_CAPTURE_NONAME, this.owner.ons_toucher.netname);
+                               Send_Notification(NOTIF_ALL_EXCEPT, this.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(this.owner.ons_toucher.team, CENTER_ONS_CAPTURE_TEAM_NONAME));
+                               Send_Notification(NOTIF_ONE, this.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE_NONAME);
+                       }
                        GameRules_scoring_add(this.owner.ons_toucher, ONS_CAPS, 1);
                        GameRules_scoring_add_team(this.owner.ons_toucher, SCORE, 10);
                }
@@ -772,8 +784,6 @@ void ons_ControlPoint_Setup(entity cp)
        cp.islinked = false;
        cp.isshielded = true;
 
-       if(cp.message == "") { cp.message = "a"; }
-
        // appearence
        setmodel(cp, MDL_ONS_CP_PAD1);
 
index 623f71b3904ab7654d9e9e88e23291c45d84bb09..3ff4a54155a3cccaf0ea91b69a38a02ac90c15dc 100644 (file)
@@ -4,7 +4,8 @@
 
 #include "item.qh"
 
-REGISTRY(Items, BITS(7))
+// 24 so it matches the limit for the .items field
+REGISTRY(Items, 24)
 #define Items_from(i) _Items_from(i, NULL)
 #ifdef GAMEQC
 REGISTRY_DEPENDS(Items, Models)
index 75abe46cc49e031d22093ec99161644d41828b09..017ada75c0288df84ce093b80dffefa8316a810c 100644 (file)
@@ -15,8 +15,8 @@ ENDCLASS(Inventory)
 
 REGISTER_NET_LINKED(ENT_CLIENT_INVENTORY)
 
-const int Inventory_groups_major = 16;
-const int Inventory_groups_minor = 8; // ceil(Items_MAX / Inventory_groups_major)
+const int Inventory_groups_minor = 8; // exactly 1 byte
+const int Inventory_groups_major = 3; // ceil(Items_MAX / Inventory_groups_minor)
 
 #define G_MAJOR(id) (floor((id) / Inventory_groups_minor))
 #define G_MINOR(id) ((id) % Inventory_groups_minor)
@@ -28,7 +28,7 @@ NET_HANDLE(ENT_CLIENT_INVENTORY, bool isnew)
 {
     make_pure(this);
     g_inventory = this;
-    const int majorBits = ReadShort();
+    const int majorBits = ReadByte();
     for (int i = 0; i < Inventory_groups_major; ++i) {
         if (!(majorBits & BIT(i))) {
             continue;
@@ -50,6 +50,7 @@ NET_HANDLE(ENT_CLIENT_INVENTORY, bool isnew)
 #endif
 
 #ifdef SVQC
+int minorBitsArr[Inventory_groups_major];
 void Inventory_Write(Inventory data)
 {
     if (!data) {
@@ -58,45 +59,37 @@ void Inventory_Write(Inventory data)
     }
     TC(Inventory, data);
 
+       for (int i = 0; i < Inventory_groups_major; ++i)
+               minorBitsArr[i] = 0;
+
     int majorBits = 0;
     FOREACH(Items, true, {
         .int fld = inv_items[it.m_id];
         const bool changed = data.inventory.(fld) != data.(fld);
         if (changed) {
-            majorBits = BITSET(majorBits, BIT(G_MAJOR(it.m_id)), true);
+                       int maj = G_MAJOR(it.m_id);
+                       majorBits = BITSET(majorBits, BIT(maj), true);
+                       minorBitsArr[maj] = BITSET(minorBitsArr[maj], BIT(G_MINOR(it.m_id)), true);
         }
     });
-    WriteShort(MSG_ENTITY, majorBits);
+    WriteByte(MSG_ENTITY, majorBits);
 
-    int minorBits = 0;
-    int lastMaj = 0;
-    int maj = 0;
-    FOREACH(Items, majorBits & BIT(maj = G_MAJOR(it.m_id)), {
-        .int fld = inv_items[it.m_id];
-        const bool changed = data.inventory.(fld) != (data.inventory.(fld) = data.(fld));
-        if (changed) {
-            if (maj != lastMaj) {
-                lastMaj = maj;
-#define X() MACRO_BEGIN \
-    if (minorBits) { \
-        WriteByte(MSG_ENTITY, minorBits); \
-        for (int j = 0; j < Inventory_groups_minor; ++j) { \
-            if (!(minorBits & BIT(j))) { \
-                continue; \
-            } \
-            const entity it = Items_from(Inventory_groups_minor * maj + j); \
-            WriteByte(MSG_ENTITY, data.inv_items[it.m_id]); \
-        } \
-    } \
-MACRO_END
-                X();
-                minorBits = 0;
-            }
-            minorBits = BITSET(minorBits, BIT(G_MINOR(it.m_id)), true);
-        }
-    });
-    X();
-#undef X
+       for (int i = 0; i < Inventory_groups_major; ++i)
+       {
+               if (!(majorBits & BIT(i)))
+                       continue;
+
+               const int minorBits = minorBitsArr[i];
+               WriteByte(MSG_ENTITY, minorBits);
+               for (int j = 0; j < Inventory_groups_minor; ++j)
+               {
+                       if (!(minorBits & BIT(j)))
+                               continue;
+
+                       const entity it = Items_from(Inventory_groups_minor * i + j);
+                       WriteByte(MSG_ENTITY, data.inv_items[it.m_id]);
+               }
+       }
 }
 #endif
 
index 1f01790d24b26ea6609705ea4c07031aad7207e5..8ba0096713342a7c7a5364b95ffe8fb58674c2e2 100644 (file)
@@ -11,7 +11,7 @@
 #include <server/items.qh>
 #endif
 
-const int IT_UNLIMITED_WEAPON_AMMO             =  BIT(0); // when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
+const int IT_UNLIMITED_AMMO                    =  BIT(0); // when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
 const int IT_UNLIMITED_SUPERWEAPONS            =  BIT(1); // when this bit is set, superweapons don't expire. Checkpoints can give this powerup.
 
 const int IT_JETPACK                           =  BIT(2); // actual item
@@ -44,8 +44,7 @@ const int IT_SUPERWEAPON                              = BIT(21); // suit
 const int IT_STRENGTH                                  = BIT(22);
 
 // item masks
-const int IT_UNLIMITED_BOTH                    = IT_UNLIMITED_WEAPON_AMMO | IT_UNLIMITED_SUPERWEAPONS;
-const int IT_PICKUPMASK                        = IT_UNLIMITED_BOTH | IT_JETPACK | IT_FUEL_REGEN; // strength and invincible are handled separately
+const int IT_PICKUPMASK                        = IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS | IT_JETPACK | IT_FUEL_REGEN; // strength and invincible are handled separately
 
 #ifdef SVQC
 const .float strength_finished = _STAT(STRENGTH_FINISHED);
index 3a13a1f81855c51c2eaeea4bea5adda6e10c07b3..739d94aca1e8b3fb9954ce8a278570f96c6363cf 100644 (file)
@@ -2,15 +2,6 @@
 
 #ifdef SVQC
 
-METHOD(Bullets, m_spawnfunc_hookreplace, GameItem(Bullets this, entity e))
-{
-       if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e))
-       {
-               return ITEM_Shells;
-       }
-       return this;
-}
-
 METHOD(Shells, m_spawnfunc_hookreplace, GameItem(Shells this, entity e))
 {
        if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e))
index 617bfe85e2cde2c78d3b0f1c8fd1e617732c34df..3e6478b2db50ca25a54716a137d75ca7ba01e4e6 100644 (file)
@@ -717,9 +717,11 @@ void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s,
                if(type == 0) // server set
                {
                        LOG_TRACE("Applying temporary setting ", t, " := ", s);
+               #if 0
                        if(cvar("g_campaign"))
                                cvar_set(t, s); // this is a wrapper and is always temporary anyway; no need to backup old values then
                        else
+               #endif
                                cvar_settemp(t, s);
                }
                else
index d0683b5314c151d16fe8b99083dee5ab1627184d..b669ba1f7b63aa2a8c74ab7bc7e1f91caaed1de3 100644 (file)
@@ -594,10 +594,13 @@ CLASS(Duel, Gametype)
     }
     METHOD(Duel, m_isForcedSupported, bool(Gametype this))
     {
-        // force all DM maps to work in duel?!
-        // TODO: we should really check the size of maps, some DM maps do not work for duel!
-        if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
-            return true;
+        if(!cvar("g_duel_not_dm_maps"))
+        {
+            // if this is set, all DM maps support duel too
+            // TODO: we should really check the size of maps, some DM maps do not work for duel!
+            if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
+                return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
+        }
         return false;
     }
 ENDCLASS(Duel)
@@ -669,6 +672,8 @@ void MapInfo_Cache_Destroy(); // disable caching
 void MapInfo_Cache_Create(); // enable caching
 void MapInfo_Cache_Invalidate(); // delete cache if any, but keep enabled
 
+void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s, float recurse);
+
 void MapInfo_ClearTemps(); // call this when done with mapinfo for this frame
 
 void MapInfo_Shutdown(); // call this in the shutdown handler
index aa5b54a60ed4ba7ce22dbd761d2321610f989392..e9fd04b7263398217e507800c47261f50ab29696 100644 (file)
@@ -670,10 +670,15 @@ void door_init_shared(entity this)
                precache_sound(this.noise2);
        }
 
-       if (!this.wait)
-       {
-               this.wait = 3;
-       }
+        if(autocvar_sv_doors_always_open)
+        {
+                 this.wait = -1;
+        }
+        else if (!this.wait)
+        {
+               this.wait = 3;
+        }
+
        if (!this.lip)
        {
                this.lip = 8;
@@ -726,10 +731,14 @@ spawnfunc(func_door)
        this.pos1 = this.origin;
        this.pos2 = this.pos1 + this.movedir*(fabs(this.movedir*this.size) - this.lip);
 
-       if (!this.speed)
-       {
-               this.speed = 100;
-       }
+        if(autocvar_sv_doors_always_open)
+        {
+                this.speed = max(750, this.speed);
+        }
+        else if (!this.speed)
+        {
+                this.speed = 100;
+        }
 
        settouch(this, door_touch);
 
index a61935eb8c5633515f95924872fb9daa25a49ccf..f438fbf01f5f8295032f45aa8e76647825377b04 100644 (file)
@@ -339,13 +339,57 @@ bool trigger_push_testorigin_for_item(entity tracetest_ent, entity item, vector
 }
 #endif
 
+#ifdef SVQC
+vector trigger_push_get_start_point(entity this)
+{
+       // calculate a typical start point for the jump
+       vector org = (this.absmin + this.absmax) * 0.5;
+       org.z = this.absmax.z - PL_MIN_CONST.z - 7;
+       return org;
+}
+
+float trigger_push_get_push_time(entity this, vector endpos)
+{
+       vector org = trigger_push_get_start_point(this);
+
+       float grav = PHYS_GRAVITY(NULL);
+
+       entity t = this.enemy;
+       if (t)
+       {
+               entity e = spawn();
+               setsize(e, PL_MIN_CONST, PL_MAX_CONST);
+               e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
+               vector v = trigger_push_calculatevelocity(org, t, this.height, e);
+               vector v2 = trigger_push_calculatevelocity(endpos, t, this.height, e);
+               delete(e);
+               return (v.z + v2.z) / grav;
+       }
+       else if (!(this.target && this.target != ""))
+       {
+               if (!this.team)
+               {
+                       vector v = this.movedir;
+
+                       float t = v.z / grav;
+                       float jump_height = 1/2 * grav * (t ** 2);
+                       float remaining_height = org.z + jump_height - endpos.z;
+                       float v2_z = sqrt(2 * grav * remaining_height);
+
+                       return (v.z + v2_z) / grav;
+               }
+       }
+       return 0;
+}
+#endif
+
 /// if (item != NULL) returns true if the item can be reached by using this jumppad, false otherwise
 /// if (item == NULL) tests jumppad's trajectory and eventually spawns waypoints for it (return value doesn't matter)
 bool trigger_push_test(entity this, entity item)
 {
-       // first calculate a typical start point for the jump
-       vector org = (this.absmin + this.absmax) * 0.5;
-       org.z = this.absmax.z - PL_MIN_CONST.z - 7;
+#ifdef SVQC
+       vector org = trigger_push_get_start_point(this);
+#endif
 
        if (this.target)
        {
index 6bac28c930b56f6a470c980a4e91dbf8fee0e892..ea0c9c368801c4a1f1f63b086ab0288bd141bbaa 100644 (file)
@@ -322,14 +322,14 @@ string ttt_turn_to_string(int turnflags)
        {
                // translator-friendly messages composed of 2 existing messages
                // TODO: proper "you win" banner instead of hijacking the help message
-               if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
-                       strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
+               if ( (turnflags & TTT_TURN_TEAM) != minigame_self.team )
+                       return strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
                return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
        }
 
        if ( turnflags & TTT_TURN_NEXT )
        {
-               if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
+               if ( (turnflags & TTT_TURN_TEAM) != minigame_self.team )
                        return _("Select \"^1Next Match^7\" on the menu to start a new match!");
                return _("Wait for your opponent to confirm the rematch");
        }
index efdd836d21e8af7bedd7de2ebffe8555031e173a..1cba349ed96e39fe5baa594b4f447b04d7af8651 100644 (file)
@@ -12,6 +12,7 @@ METHOD(MageSpike, wr_think, void(MageSpike thiswep, entity actor, .entity weapon
     if (!IS_PLAYER(actor) || weapon_prepareattack(thiswep, actor, weaponentity, false, 0.2)) {
         if (!actor.target_range) actor.target_range = autocvar_g_monsters_target_range;
         actor.enemy = Monster_FindTarget(actor);
+        monster_makevectors(actor, actor.enemy);
         W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_MageSpike_FIRE, CH_WEAPON_B, 0, DEATH_MONSTER_MAGE.m_id);
        if (!IS_PLAYER(actor)) w_shotdir = normalize((actor.enemy.origin + '0 0 10') - actor.origin);
         M_Mage_Attack_Spike(actor, w_shotdir);
index 9390f5d23a74dcc0249f4d395caf2119d944ed30..2e3f02a0623a86f5591c5b922e0f8ce13ee27b7d 100644 (file)
@@ -116,8 +116,6 @@ void M_Shambler_Attack_Lightning_Think(entity this)
 
 void M_Shambler_Attack_Lightning(entity this)
 {
-       monster_makevectors(this, this.enemy);
-
        entity gren = new(grenade);
        gren.owner = gren.realowner = this;
        gren.bot_dodge = true;
index 52bf37f7d2608f175ddc373c060d95c90c28990f..b684af15255e66efc70d9580e34f90c3dea825f4 100644 (file)
@@ -128,8 +128,6 @@ void adaptor_think2use_hittype_splash(entity this);
 
 void M_Spider_Attack_Web(entity this)
 {
-       monster_makevectors(this, this.enemy);
-
        sound(this, CH_SHOTS, SND_ELECTRO_FIRE2, VOL_BASE, ATTEN_NORM);
 
        entity proj = new(plasma);
index 8a4ad160560fa87583ab87a6dd861c7c0f274d54..d07669af0ea1861edcb230d86cc27cb151b5d8d7 100644 (file)
@@ -22,7 +22,6 @@ METHOD(WyvernAttack, wr_think, void(WyvernAttack thiswep, entity actor, .entity
                if (IS_MONSTER(actor)) {
                        actor.attack_finished_single[0] = time + 1.2;
                        actor.anim_finished = time + 1.2;
-                       monster_makevectors(actor, actor.enemy);
                }
 
                entity missile = spawn();
index 0673cd0baf24810d20dc452ce469e73a6ae31a51..4f2139cc170a56c78d49548f47b360e8ca8e78b3 100644 (file)
@@ -189,7 +189,11 @@ void monster_changeteam(entity this, int newteam)
 .void(entity) monster_delayedfunc;
 void Monster_Delay_Action(entity this)
 {
-       if(Monster_ValidTarget(this.owner, this.owner.enemy)) { this.monster_delayedfunc(this.owner); }
+       if(Monster_ValidTarget(this.owner, this.owner.enemy))
+       {
+               monster_makevectors(this.owner, this.owner.enemy);
+               this.monster_delayedfunc(this.owner);
+       }
 
        if(this.cnt > 1)
        {
@@ -359,8 +363,6 @@ bool Monster_Attack_Melee(entity this, entity targ, float damg, vector anim, flo
        else
                this.attack_finished_single[0] = this.anim_finished = time + animtime;
 
-       monster_makevectors(this, targ);
-
        traceline(this.origin + this.view_ofs, this.origin + v_forward * er, 0, this);
 
        if(trace_ent.takedamage)
@@ -424,6 +426,7 @@ void Monster_Attack_Check(entity this, entity targ, .entity weaponentity)
 
        if(vdist(targ.origin - this.origin, <=, this.attack_range))
        {
+               monster_makevectors(this, targ);
                int attack_success = this.monster_attackfunc(MONSTER_ATTACK_MELEE, this, targ, weaponentity);
                if(attack_success == 1)
                        Monster_Sound(this, monstersound_melee, 0, false, CH_VOICE);
@@ -433,6 +436,7 @@ void Monster_Attack_Check(entity this, entity targ, .entity weaponentity)
 
        if(vdist(targ.origin - this.origin, >, this.attack_range))
        {
+               monster_makevectors(this, targ);
                int attack_success = this.monster_attackfunc(MONSTER_ATTACK_RANGED, this, targ, weaponentity);
                if(attack_success == 1)
                        Monster_Sound(this, monstersound_melee, 0, false, CH_VOICE);
index d25c3151f7edac55ee34808e30763b2f8fed6f27..256af90affb3650cfc444b0e9d33827af1504ab1 100644 (file)
@@ -212,7 +212,7 @@ float buff_Available(entity buff)
 {
        if (buff == BUFF_Null)
                return false;
-       if (buff == BUFF_AMMO && ((start_items & IT_UNLIMITED_WEAPON_AMMO) || (start_items & IT_UNLIMITED_BOTH) || (cvar("g_melee_only"))))
+       if (buff == BUFF_AMMO && ((start_items & IT_UNLIMITED_AMMO) || cvar("g_melee_only")))
                return false;
        if (buff == BUFF_VAMPIRE && cvar("g_vampire"))
                return false;
@@ -576,7 +576,6 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerSpawn)
        entity player = M_ARGV(0, entity);
 
        player.oldbuffs = 0;
-       PS(player).buff_shield = time + 0.5; // prevent picking up buffs immediately
        // reset timers here to prevent them continuing after re-spawn
        player.buff_disability_time = 0;
        player.buff_disability_effect_time = 0;
@@ -918,8 +917,8 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerPreThink)
 
                BUFF_ONADD(BUFF_AMMO)
                {
-                       player.buff_ammo_prev_infitems = (player.items & IT_UNLIMITED_WEAPON_AMMO);
-                       player.items |= IT_UNLIMITED_WEAPON_AMMO;
+                       player.buff_ammo_prev_infitems = (player.items & IT_UNLIMITED_AMMO);
+                       player.items |= IT_UNLIMITED_AMMO;
 
                        if(STAT(BUFFS, player) & BUFF_AMMO.m_itemid)
                        {
@@ -937,9 +936,9 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerPreThink)
                BUFF_ONREM(BUFF_AMMO)
                {
                        if(player.buff_ammo_prev_infitems)
-                               player.items |= IT_UNLIMITED_WEAPON_AMMO;
+                               player.items |= IT_UNLIMITED_AMMO;
                        else
-                               player.items &= ~IT_UNLIMITED_WEAPON_AMMO;
+                               player.items &= ~IT_UNLIMITED_AMMO;
 
                        if(STAT(BUFFS, player) & BUFF_AMMO.m_itemid)
                        {
index 99b822d42aa134bd0a029c8273ea1a6b6b0fb379..05ce178bd4e7d0952d3568cc1213f03e406c65b8 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/mutators/mutator/dodging/dodging.qc>
 #ifdef CSQC
     #include <common/mutators/mutator/dodging/cl_dodging.qc>
 #endif
index d2c0d05c7acf80c030e2f1210c9494196674aec4..3b106c653ae04ca2334fbea1d7544000164b461c 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/mutators/mutator/dodging/dodging.qh>
 #ifdef CSQC
     #include <common/mutators/mutator/dodging/cl_dodging.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/dodging/dodging.qc b/qcsrc/common/mutators/mutator/dodging/dodging.qc
new file mode 100644 (file)
index 0000000..9e7ea20
--- /dev/null
@@ -0,0 +1 @@
+#include "dodging.qh"
diff --git a/qcsrc/common/mutators/mutator/dodging/dodging.qh b/qcsrc/common/mutators/mutator/dodging/dodging.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
index 63f3182ea6ba4746abb57d5491c5c97d29294adc..28e4bf92684e752d5cb1ae223b05df92acd10a44 100644 (file)
@@ -82,7 +82,7 @@ void instagib_ammocheck(entity this)
 
        if(IS_DEAD(this) || game_stopped)
                instagib_stop_countdown(this);
-       else if (GetResource(this, RES_CELLS) > 0 || (this.items & IT_UNLIMITED_WEAPON_AMMO) || (this.flags & FL_GODMODE))
+       else if (GetResource(this, RES_CELLS) > 0 || (this.items & IT_UNLIMITED_AMMO) || (this.flags & FL_GODMODE))
                instagib_stop_countdown(this);
        else if(autocvar_g_rm && autocvar_g_rm_laser)
        {
@@ -353,7 +353,6 @@ MUTATOR_HOOKFUNCTION(mutator_instagib, Damage_Calculate)
 
                                if(frag_target != frag_attacker)
                                {
-                                       if(frag_damage <= 0 && GetResource(frag_target, RES_HEALTH) > 0) { Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE); }
                                        if(!autocvar_g_instagib_blaster_keepforce)
                                                frag_force = '0 0 0';
                                }
@@ -386,7 +385,7 @@ MUTATOR_HOOKFUNCTION(mutator_instagib, Damage_Calculate)
        M_ARGV(6, vector) = frag_force;
 }
 
-MUTATOR_HOOKFUNCTION(mutator_instagib, SetStartItems)
+MUTATOR_HOOKFUNCTION(mutator_instagib, SetStartItems, CBC_ORDER_LAST)
 {
        start_health       = warmup_start_health       = 100;
        start_armorvalue   = warmup_start_armorvalue   = 0;
@@ -529,7 +528,7 @@ MUTATOR_HOOKFUNCTION(mutator_instagib, ItemTouch)
        if(item.itemdef == ITEM_ExtraLife)
        {
                GiveResource(toucher, RES_ARMOR, autocvar_g_instagib_extralives);
-               Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES);
+               Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES, autocvar_g_instagib_extralives);
                return MUT_ITEMTOUCH_PICKUP;
        }
 
index d48319a421fa599861a11ba4aaabe1dabe71ac1b..67e3d4ad1c02ccb86afa812b194ada6bf25e43c2 100644 (file)
@@ -1189,7 +1189,6 @@ void nades_CheckThrow(entity this)
                this.nade_altbutton = true;
                if(time > this.nade_refire)
                {
-                       Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_NADE_THROW);
                        nade_prime(this);
                        this.nade_refire = time + autocvar_g_nades_nade_refire;
                }
@@ -1294,7 +1293,10 @@ MUTATOR_HOOKFUNCTION(nades, PlayerPreThink)
                held_nade.angles_y = player.angles.y;
 
                if (time + 0.1 >= held_nade.wait)
+               {
                        toss_nade(player, false, '0 0 0', time + 0.05);
+                       Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_NADE_THROW);
+               }
        }
 
        if(IS_PLAYER(player))
@@ -1453,7 +1455,6 @@ MUTATOR_HOOKFUNCTION(nades, PlayerDies, CBC_ORDER_LAST)
        {
                float killcount_bonus = ((CS(frag_attacker).killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * CS(frag_attacker).killcount, autocvar_g_nades_bonus_score_medium) 
                                                                                                                                        : autocvar_g_nades_bonus_score_minor);
-
                if (SAME_TEAM(frag_attacker, frag_target) || frag_attacker == frag_target)
                        nades_RemoveBonus(frag_attacker);
                else if(GameRules_scoring_is_vip(frag_target))
index efe8ee3aedf2449988527ca916cc77bc2055044e..7214a699e1122e759026f2b5995ee4a99305a943 100644 (file)
@@ -140,7 +140,7 @@ void NIX_GiveCurrentWeapon(entity this)
                SetResource(this, RES_CELLS, 0);
                SetResource(this, RES_PLASMA, 0);
                SetResource(this, RES_FUEL, 0);
-               if(this.items & IT_UNLIMITED_WEAPON_AMMO)
+               if(this.items & IT_UNLIMITED_AMMO)
                {
                        switch (wpn.ammo_type)
                        {
@@ -193,7 +193,7 @@ void NIX_GiveCurrentWeapon(entity this)
                        Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_NIX_COUNTDOWN, nix_nextweapon, dt);
        }
 
-       if(!(this.items & IT_UNLIMITED_WEAPON_AMMO) && time > this.nix_nextincr)
+       if(!(this.items & IT_UNLIMITED_AMMO) && time > this.nix_nextincr)
        {
                switch (wpn.ammo_type)
                {
index 017cc2082adfc7a9468e293dde68c276160abff5..227be462699dbe7c827edbfe2acc682bbebf7608 100644 (file)
@@ -1,15 +1,16 @@
 // generated file; do not modify
+#include <common/mutators/mutator/overkill/okhmg.qc>
+#include <common/mutators/mutator/overkill/okmachinegun.qc>
+#include <common/mutators/mutator/overkill/oknex.qc>
+#include <common/mutators/mutator/overkill/okrpc.qc>
+#include <common/mutators/mutator/overkill/okshotgun.qc>
+#include <common/mutators/mutator/overkill/overkill.qc>
 #ifdef CSQC
     #include <common/mutators/mutator/overkill/cl_overkill.qc>
 #endif
 #ifdef SVQC
     #include <common/mutators/mutator/overkill/sv_overkill.qc>
 #endif
-#include <common/mutators/mutator/overkill/okhmg.qc>
-#include <common/mutators/mutator/overkill/okmachinegun.qc>
-#include <common/mutators/mutator/overkill/oknex.qc>
-#include <common/mutators/mutator/overkill/okrpc.qc>
-#include <common/mutators/mutator/overkill/okshotgun.qc>
 #ifdef SVQC
     #include <common/mutators/mutator/overkill/sv_weapons.qc>
 #endif
index 7731f17e169e9191fb49996c819cdf1ec200faa8..dc2bb0a5b1f7b26baa78c87a38c120791e0792ce 100644 (file)
@@ -1,12 +1,13 @@
 // generated file; do not modify
+#include <common/mutators/mutator/overkill/okhmg.qh>
+#include <common/mutators/mutator/overkill/okmachinegun.qh>
+#include <common/mutators/mutator/overkill/oknex.qh>
+#include <common/mutators/mutator/overkill/okrpc.qh>
+#include <common/mutators/mutator/overkill/okshotgun.qh>
+#include <common/mutators/mutator/overkill/overkill.qh>
 #ifdef CSQC
     #include <common/mutators/mutator/overkill/cl_overkill.qh>
 #endif
 #ifdef SVQC
     #include <common/mutators/mutator/overkill/sv_overkill.qh>
 #endif
-#include <common/mutators/mutator/overkill/okhmg.qh>
-#include <common/mutators/mutator/overkill/okmachinegun.qh>
-#include <common/mutators/mutator/overkill/oknex.qh>
-#include <common/mutators/mutator/overkill/okrpc.qh>
-#include <common/mutators/mutator/overkill/okshotgun.qh>
index bee61f2fea54516c00e7be4088be64b09a8fdab4..df55fb88c42a4663b96b9aaa5a6f3b61d908692f 100644 (file)
@@ -18,7 +18,7 @@ void W_OverkillHeavyMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity
                return;
        }
 
-       if((!thiswep.wr_checkammo1(thiswep, actor, weaponentity) && !(actor.items & IT_UNLIMITED_WEAPON_AMMO)) || (!(actor.items & IT_SUPERWEAPON) && !(actor.items & IT_UNLIMITED_SUPERWEAPONS)))
+       if((!thiswep.wr_checkammo1(thiswep, actor, weaponentity) && !(actor.items & IT_UNLIMITED_AMMO)) || (!(actor.items & IT_SUPERWEAPON) && !(actor.items & IT_UNLIMITED_SUPERWEAPONS)))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
index f8dfa89fe5b5748e72bea985b7349315f1c56780..768e364a78535f8274516388f47519ed4294da21 100644 (file)
@@ -13,7 +13,7 @@ void W_OverkillMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weap
        }
 
        if(!thiswep.wr_checkammo1(thiswep, actor, weaponentity))
-       if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       if(!(actor.items & IT_UNLIMITED_AMMO))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
index cbcc285a54585382d61e0618fa7a2269a8985860..83a3a3cc052c3e9adbaf0143af71242def1946a5 100644 (file)
@@ -221,7 +221,7 @@ METHOD(OverkillNex, wr_think, void(entity thiswep, entity actor, .entity weapone
        //                              if(fire & 2) // only eat ammo when the button is pressed
        //                              {
        //                                      dt = min(dt, (1 - actor.(weaponentity).oknex_charge) / WEP_CVAR(oknex, charge_rate));
-       //                                      if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       //                                      if(!(actor.items & IT_UNLIMITED_AMMO))
        //                                      {
        //                                              // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
        //                                              if(autocvar_g_balance_vortex_reload_ammo)
diff --git a/qcsrc/common/mutators/mutator/overkill/overkill.qc b/qcsrc/common/mutators/mutator/overkill/overkill.qc
new file mode 100644 (file)
index 0000000..3cb64ce
--- /dev/null
@@ -0,0 +1 @@
+#include "overkill.qh"
diff --git a/qcsrc/common/mutators/mutator/overkill/overkill.qh b/qcsrc/common/mutators/mutator/overkill/overkill.qh
new file mode 100644 (file)
index 0000000..3f59c93
--- /dev/null
@@ -0,0 +1,2 @@
+#pragma once
+
index dbcda2d59e1db202a53f5d33cb5a4419609b2731..26cd9c23c863c0edd4732ab0227177ba3fefdaf4 100644 (file)
@@ -81,7 +81,6 @@ MUTATOR_HOOKFUNCTION(ok, Damage_Calculate, CBC_ORDER_LAST)
                if(!STAT(FROZEN, frag_target))
                if(!IS_DEAD(frag_target))
                {
-                       Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE);
                        M_ARGV(6, vector) = '0 0 0'; // force
                }
 
@@ -276,7 +275,7 @@ MUTATOR_HOOKFUNCTION(ok, SetStartItems, CBC_ORDER_LAST)
 
        // this gives unlimited ammo (the 4 types) but not fuel
        // using `g_use_ammunition` instead gives also fuel which is unnecessary and distracting in the HUD
-       start_items |= IT_UNLIMITED_WEAPON_AMMO;
+       start_items |= IT_UNLIMITED_AMMO;
 
        start_weapons = warmup_start_weapons = ok_start_items;
 }
index d3c1922b997c9437ab82ba9f9c27603d1ed14e1f..58e20568eddf02d9d1ddd90616af3890d2e9ceb8 100644 (file)
@@ -1,19 +1,25 @@
 #include "sv_rocketflying.qh"
 
 string autocvar_g_rocket_flying;
+bool autocvar_g_rocket_flying_disabledelays = true;
 REGISTER_MUTATOR(rocketflying, expr_evaluate(autocvar_g_rocket_flying));
 
 MUTATOR_HOOKFUNCTION(rocketflying, EditProjectile)
 {
        entity proj = M_ARGV(1, entity);
 
-       if(proj.classname == "rocket" || proj.classname == "mine")
+       if(autocvar_g_rocket_flying_disabledelays && (proj.classname == "rocket" || proj.classname == "mine"))
        {
                // kill detonate delay of rockets
                proj.spawnshieldtime = time;
        }
 }
 
+MUTATOR_HOOKFUNCTION(rocketflying, AllowRocketJumping)
+{
+       M_ARGV(0, bool) = true; // force rocket jumping
+}
+
 MUTATOR_HOOKFUNCTION(rocketflying, BuildMutatorsString)
 {
        M_ARGV(0, string) = strcat(M_ARGV(0, string), ":RocketFlying");
index 46496895afea6dd3bd9abc45cdaf2cb8db5fb452..e8306ea0818588a106ceafddafd1c4a77a545412 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc>
 #ifdef CSQC
     #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc>
 #endif
index c4cfe5ada918e1968cd7a713ecab726d99cf2656..ea2fd49e6ae15d9e697b4bfa72e2eb804f64e0a3 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh>
 #ifdef CSQC
     #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc
new file mode 100644 (file)
index 0000000..7453747
--- /dev/null
@@ -0,0 +1 @@
+#include "spawn_near_teammate.qh"
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh
new file mode 100644 (file)
index 0000000..3f59c93
--- /dev/null
@@ -0,0 +1,2 @@
+#pragma once
+
index 412521272398e87680d6f793471cf17c1f456ad9..036a8b5e3c74e6391cf1aadec15251ca8b871eb9 100644 (file)
 #define N_GNTLOFF 1
 #define N__ALWAYS 2
 
-#define MULTITEAM_ANNCE2(prefix, default, sound, channel, volume, position) \
-    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), channel, volume, position) \
-    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), channel, volume, position)
-#define MULTITEAM_ANNCE3(prefix, default, sound, channel, volume, position) \
-    MULTITEAM_ANNCE2(prefix, default, sound, channel, volume, position) \
-    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), channel, volume, position)
-#define MULTITEAM_ANNCE4(prefix, default, sound, channel, volume, position) \
-    MULTITEAM_ANNCE3(prefix, default, sound, channel, volume, position) \
-    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), channel, volume, position)
-#define MULTITEAM_ANNCE(prefix, teams, default, sound, channel, volume, position) \
-    NOTIF_ADD_AUTOCVAR(ANNCE_##prefix, default) \
-    MULTITEAM_ANNCE##teams(prefix, default, sound, channel, volume, position)
+#define MULTITEAM_ANNCE(prefix, defaultvalue, sound, channel, volume, position) \
+    NOTIF_ADD_AUTOCVAR(ANNCE_##prefix, defaultvalue) \
+    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), channel, volume, position) \
+    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), channel, volume, position) \
+    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), channel, volume, position) \
+    MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), channel, volume, position)
 
 // MSG_ANNCE_NOTIFICATIONS
     MSG_ANNCE_NOTIF(ACHIEVEMENT_AIRSHOT,        N_GNTLOFF, "airshot",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
 #define N_CONSOLE 1
 #define N_CHATCON 2
 
-#define MULTITEAM_INFO2(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    MSG_INFO_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, type, 1), TCR(gentle, type, 1)) \
-    MSG_INFO_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, type, 2), TCR(gentle, type, 2))
-#define MULTITEAM_INFO3(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    MULTITEAM_INFO2(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    MSG_INFO_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, type, 3), TCR(gentle, type, 3))
-#define MULTITEAM_INFO4(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    MULTITEAM_INFO3(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    MSG_INFO_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, type, 4), TCR(gentle, type, 4))
-#define MULTITEAM_INFO(prefix, teams, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
-    NOTIF_ADD_AUTOCVAR(INFO_##prefix, default) \
-    MULTITEAM_INFO##teams(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type)
+#define MULTITEAM_INFO(prefix, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle, type) \
+    NOTIF_ADD_AUTOCVAR(INFO_##prefix, defaultvalue) \
+    MSG_INFO_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, type, 1), TCR(gentle, type, 1)) \
+    MSG_INFO_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, type, 2), TCR(gentle, type, 2)) \
+    MSG_INFO_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, type, 3), TCR(gentle, type, 3)) \
+    MSG_INFO_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, type, 4), TCR(gentle, type, 4))
 
 // MSG_INFO_NOTIFICATIONS
     MSG_INFO_NOTIF(CHAT_NOSPECTATORS,                       N_CHATCON,  0, 0, "", "",       "",     _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "")
 
-    MULTITEAM_INFO(CTF_CAPTURE, 4,                          N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag"), "", FLAG)
-    MULTITEAM_INFO(CTF_CAPTURE_BROKEN, 4,                   N_CONSOLE,  2, 2, "s1 f1dtime s2 f2dtime", "s1",    "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "", FLAG)
+    MULTITEAM_INFO(CTF_CAPTURE,                             N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag"), "", FLAG)
+    MULTITEAM_INFO(CTF_CAPTURE_BROKEN,                      N_CONSOLE,  2, 2, "s1 f1dtime s2 f2dtime", "s1",    "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "", FLAG)
     MSG_INFO_NOTIF(CTF_CAPTURE_NEUTRAL,                     N_CONSOLE,  1, 0, "s1", "s1",                       "notify_neutral_captured",  _("^BG%s^BG captured the flag"), "")
-    MULTITEAM_INFO(CTF_CAPTURE_TIME, 4,                     N_CONSOLE,  1, 1, "s1 f1dtime", "s1",               "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "", FLAG)
-    MULTITEAM_INFO(CTF_CAPTURE_UNBROKEN, 4,                 N_CONSOLE,  2, 2, "s1 f1dtime s2 f2dtime", "s1",    "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "", FLAG)
-    MULTITEAM_INFO(CTF_FLAGRETURN_ABORTRUN, 4,              N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "", FLAG)
+    MULTITEAM_INFO(CTF_CAPTURE_TIME,                        N_CONSOLE,  1, 1, "s1 f1dtime", "s1",               "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "", FLAG)
+    MULTITEAM_INFO(CTF_CAPTURE_UNBROKEN,                    N_CONSOLE,  2, 2, "s1 f1dtime s2 f2dtime", "s1",    "notify_%s_captured",       _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_ABORTRUN,                 N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_ABORTRUN_NEUTRAL,         N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe flag was returned by its owner"), "")
-    MULTITEAM_INFO(CTF_FLAGRETURN_DAMAGED, 4,               N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_DAMAGED,                  N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_DAMAGED_NEUTRAL,          N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe flag was destroyed and returned to base"), "")
-    MULTITEAM_INFO(CTF_FLAGRETURN_DROPPED, 4,               N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_DROPPED,                  N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_DROPPED_NEUTRAL,          N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe flag was dropped in the base and returned itself"), "")
-    MULTITEAM_INFO(CTF_FLAGRETURN_NEEDKILL, 4,              N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_NEEDKILL,                 N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_NEEDKILL_NEUTRAL,         N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe flag fell somewhere it couldn't be reached and returned to base"), "")
-    MULTITEAM_INFO(CTF_FLAGRETURN_SPEEDRUN, 4,              N_CONSOLE,  0, 1, "f1dtime", "",                    "",                         _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_SPEEDRUN,                 N_CONSOLE,  0, 1, "f1dtime", "",                    "",                         _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_SPEEDRUN_NEUTRAL,         N_CONSOLE,  0, 1, "f1dtime", "",                    "",                         _("^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"), "")
-    MULTITEAM_INFO(CTF_FLAGRETURN_TIMEOUT, 4,               N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag has returned to the base"), "", FLAG)
+    MULTITEAM_INFO(CTF_FLAGRETURN_TIMEOUT,                  N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe ^TC^TT^BG flag has returned to the base"), "", FLAG)
     MSG_INFO_NOTIF(CTF_FLAGRETURN_TIMEOUT_NEUTRAL,          N_CONSOLE,  0, 0, "", "",                           "",                         _("^BGThe flag has returned to the base"), "")
-    MULTITEAM_INFO(CTF_LOST, 4,                             N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_lost",           _("^BG%s^BG lost the ^TC^TT^BG flag"), "", FLAG)
+    MULTITEAM_INFO(CTF_LOST,                                N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_lost",           _("^BG%s^BG lost the ^TC^TT^BG flag"), "", FLAG)
     MSG_INFO_NOTIF(CTF_LOST_NEUTRAL,                        N_CONSOLE,  1, 0, "s1", "s1",                       "notify_neutral_lost",      _("^BG%s^BG lost the flag"), "")
-    MULTITEAM_INFO(CTF_PICKUP, 4,                           N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_taken",          _("^BG%s^BG got the ^TC^TT^BG flag"), "", FLAG)
+    MULTITEAM_INFO(CTF_PICKUP,                              N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_taken",          _("^BG%s^BG got the ^TC^TT^BG flag"), "", FLAG)
     MSG_INFO_NOTIF(CTF_PICKUP_NEUTRAL,                      N_CONSOLE,  1, 0, "s1", "s1",                       "notify_neutral_taken",     _("^BG%s^BG got the flag"), "")
-    MULTITEAM_INFO(CTF_RETURN, 4,                           N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_returned",       _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG)
-    MULTITEAM_INFO(CTF_RETURN_MONSTER, 4,                   N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_returned",       _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG)
+    MULTITEAM_INFO(CTF_RETURN,                              N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_returned",       _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG)
+    MULTITEAM_INFO(CTF_RETURN_MONSTER,                      N_CONSOLE,  1, 0, "s1", "s1",                       "notify_%s_returned",       _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG)
 
     MSG_INFO_NOTIF(COINTOSS,                                N_CHATCON,  1, 0, "s1", "",     "",     _("^F2Throwing coin... Result: %s^F2!"), "")
 
     MSG_INFO_NOTIF(DEATH_SELF_VH_WAKI_ROCKET,               N_CONSOLE,  2, 1, "s1 s2loc spree_lost", "s1",      "notify_death",         _("^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"), "")
     MSG_INFO_NOTIF(DEATH_SELF_VOID,                         N_CONSOLE,  3, 1, "s1 s2 s2loc spree_lost", "s1",   "notify_void",            "^BG%s^K1 %s^K1%s%s", "")
 
-    MULTITEAM_INFO(DEATH_TEAMKILL, 4,                       N_CONSOLE,  3, 1, "s1 s2 s3loc spree_end", "s2 s1",     "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "", NAME)
+    MULTITEAM_INFO(DEATH_TEAMKILL,                          N_CONSOLE,  3, 1, "s1 s2 s3loc spree_end", "s2 s1",     "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "", NAME)
 
     MSG_INFO_NOTIF(DOMINATION_CAPTURE_TIME,                 N_CONSOLE,  2, 2, "s1 s2 f1 f1points f2", "",       "",     _("^BG%s^BG%s^BG (%s %s every %s seconds)"), "")
 
     MSG_INFO_NOTIF(FREEZETAG_AUTO_REVIVED,                  N_CONSOLE,  1, 1, "s1 f1", "",      "",     _("^BG%s^K3 was automatically revived after %s second(s)"), "")
     MSG_INFO_NOTIF(FREEZETAG_SELF,                          N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^K1 froze themself"), "")
 
-    MULTITEAM_INFO(ROUND_TEAM_WIN, 4,                       N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG team wins the round"), "", NAME)
+    MULTITEAM_INFO(ROUND_TEAM_WIN,                          N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG team wins the round"), "", NAME)
     MSG_INFO_NOTIF(ROUND_PLAYER_WIN,                        N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG wins the round"), "")
     MSG_INFO_NOTIF(ROUND_TIED,                              N_CONSOLE,  0, 0, "", "",           "",     _("^BGRound tied"), "")
     MSG_INFO_NOTIF(ROUND_OVER,                              N_CONSOLE,  0, 0, "", "",           "",     _("^BGRound over, there's no winner"), "")
     MSG_INFO_NOTIF(CONNECTING,                              N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG is connecting..."), "")
     MSG_INFO_NOTIF(JOIN_CONNECT,                            N_CHATCON,  1, 0, "s1", "",         "",     _("^BG%s^F3 connected"), "")
     MSG_INFO_NOTIF(JOIN_PLAY,                               N_CHATCON,  1, 0, "s1", "",         "",     _("^BG%s^F3 is now playing"), "")
-    MULTITEAM_INFO(JOIN_PLAY_TEAM, 4,                       N_CHATCON,  1, 0, "s1", "",         "",     _("^BG%s^F3 is now playing on the ^TC^TT team"), "", NAME)
+    MULTITEAM_INFO(JOIN_PLAY_TEAM,                          N_CHATCON,  1, 0, "s1", "",         "",     _("^BG%s^F3 is now playing on the ^TC^TT team"), "", NAME)
 
     MSG_INFO_NOTIF(KEEPAWAY_DROPPED,                        N_CONSOLE,  1, 0, "s1", "s1",       "notify_balldropped",       _("^BG%s^BG has dropped the ball!"), "")
     MSG_INFO_NOTIF(KEEPAWAY_PICKUP,                         N_CONSOLE,  1, 0, "s1", "s1",       "notify_ballpickedup",      _("^BG%s^BG has picked up the ball!"), "")
 
-    MULTITEAM_INFO(KEYHUNT_CAPTURE, 4,                      N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG captured the keys for the ^TC^TT team"), "", NAME)
-    MULTITEAM_INFO(KEYHUNT_DROP, 4,                         N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG dropped the ^TC^TT Key"), "", KEY)
-    MULTITEAM_INFO(KEYHUNT_LOST, 4,                         N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG lost the ^TC^TT Key"), "", KEY)
-    MULTITEAM_INFO(KEYHUNT_PUSHED, 4,                       N_CONSOLE,  2, 0, "s1 s2", "",      "",     _("^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"), "", KEY)
-    MULTITEAM_INFO(KEYHUNT_DESTROYED, 4,                    N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG destroyed the ^TC^TT Key"), "", KEY)
-    MULTITEAM_INFO(KEYHUNT_PICKUP, 4,                       N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG picked up the ^TC^TT Key"), "", KEY)
+    MULTITEAM_INFO(KEYHUNT_CAPTURE,                         N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG captured the keys for the ^TC^TT team"), "", NAME)
+    MULTITEAM_INFO(KEYHUNT_DROP,                            N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG dropped the ^TC^TT Key"), "", KEY)
+    MULTITEAM_INFO(KEYHUNT_LOST,                            N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG lost the ^TC^TT Key"), "", KEY)
+    MULTITEAM_INFO(KEYHUNT_PUSHED,                          N_CONSOLE,  2, 0, "s1 s2", "",      "",     _("^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"), "", KEY)
+    MULTITEAM_INFO(KEYHUNT_DESTROYED,                       N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG destroyed the ^TC^TT Key"), "", KEY)
+    MULTITEAM_INFO(KEYHUNT_PICKUP,                          N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG picked up the ^TC^TT Key"), "", KEY)
 
     MSG_INFO_NOTIF(LMS_FORFEIT,                             N_CHATCON,  1, 0, "s1", "",         "",     _("^BG%s^F3 forfeited"), "")
     MSG_INFO_NOTIF(LMS_NOLIVES,                             N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^F3 has no more lives left"), "")
 
     MSG_INFO_NOTIF(MONSTERS_DISABLED,                       N_CONSOLE,  0, 0, "", "",           "",     _("^BGMonsters are currently disabled"), "")
 
-    MULTITEAM_INFO(NEXBALL_RETURN_HELD, 4,                  N_CONSOLE,  0, 0, "", "",           "",     _("^BGThe ^TC^TT^BG team held the ball for too long"), "", NAME)
+    MULTITEAM_INFO(NEXBALL_RETURN_HELD,                     N_CONSOLE,  0, 0, "", "",           "",     _("^BGThe ^TC^TT^BG team held the ball for too long"), "", NAME)
 
     MSG_INFO_NOTIF(ONSLAUGHT_CAPTURE,                       N_CONSOLE,  2, 0, "s1 s2", "",      "",     _("^BG%s^BG captured %s^BG control point"), "")
-    MULTITEAM_INFO(ONSLAUGHT_CPDESTROYED, 4,                N_CONSOLE,  2, 0, "s1 s2", "",      "",     _("^TC^TT^BG team %s^BG control point has been destroyed by %s"), "", NAME)
-    MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED, 4,               N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG generator has been destroyed"), "", GENERATOR)
-    MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED_OVERTIME, 4,      N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG generator spontaneously combusted due to overtime!"), "", GENERATOR)
+    MSG_INFO_NOTIF(ONSLAUGHT_CAPTURE_NONAME,                N_CONSOLE,  1, 0, "s1", "",         "",     _("^BG%s^BG captured a control point"), "")
+    MULTITEAM_INFO(ONSLAUGHT_CPDESTROYED,                   N_CONSOLE,  2, 0, "s1 s2", "",      "",     _("^TC^TT^BG team %s^BG control point has been destroyed by %s"), "", NAME)
+    MULTITEAM_INFO(ONSLAUGHT_CPDESTROYED_NONAME,            N_CONSOLE,  1, 0, "s1", "",         "",     _("^TC^TT^BG team control point has been destroyed by %s"), "", NAME)
+    MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED,                  N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG generator has been destroyed"), "", GENERATOR)
+    MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED_OVERTIME,         N_CONSOLE,  0, 0, "", "",           "",     _("^TC^TT^BG generator spontaneously combusted due to overtime!"), "", GENERATOR)
 
     MSG_INFO_NOTIF(POWERUP_INVISIBILITY,                    N_CONSOLE,  1, 0, "s1", "s1",       "strength",     _("^BG%s^K1 picked up Invisibility"), "")
     MSG_INFO_NOTIF(POWERUP_SHIELD,                          N_CONSOLE,  1, 0, "s1", "s1",       "shield",       _("^BG%s^K1 picked up Shield"), "")
 
     MULTIICON_INFO(MINIGAME_INVITE,                         N_CONSOLE,  2, 0, "s2 minigame1_name s1", "s2", "minigame1_d", "minigames/%s/icon_notif",   _("^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 (^F1%s^F4)"), "")
 
-    MULTITEAM_INFO(SCORES, 4,                               N_CONSOLE,  0, 0, "", "",           "",                     _("^TC^TT ^BGteam scores!"), "", NAME)
+    MULTITEAM_INFO(SCORES,                                  N_CONSOLE,  0, 0, "", "",           "",                     _("^TC^TT ^BGteam scores!"), "", NAME)
 
     MSG_INFO_NOTIF(SPECTATE_WARNING,                        N_CONSOLE,  0, 1, "f1secs", "",     "",                     _("^F2You have to become a player within the next %s, otherwise you will be kicked, because spectating isn't allowed at this time!"), "")
 
 #define N_DISABL 0
 #define N_ENABLE 1
 
-#define MULTITEAM_CENTER2(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 1), TCR(gentle, type, 1)) \
-    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 2), TCR(gentle, type, 2))
-#define MULTITEAM_CENTER3(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    MULTITEAM_CENTER2(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 3), TCR(gentle, type, 3))
-#define MULTITEAM_CENTER4(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    MULTITEAM_CENTER3(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 4), TCR(gentle, type, 4))
-#define MULTITEAM_CENTER(prefix, teams, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
-    NOTIF_ADD_AUTOCVAR(CENTER_##prefix, default) \
-    MULTITEAM_CENTER##teams(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type)
+#define MULTITEAM_CENTER(prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \
+    NOTIF_ADD_AUTOCVAR(CENTER_##prefix, defaultvalue) \
+    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 1), TCR(gentle, type, 1)) \
+    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 2), TCR(gentle, type, 2)) \
+    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 3), TCR(gentle, type, 3)) \
+    MSG_CENTER_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 4), TCR(gentle, type, 4))
 
 // MSG_CENTER_NOTIFICATIONS
     MSG_CENTER_NOTIF(ALONE,                             N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^F4You are now alone!"), "")
     MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_FREE,            N_ENABLE,    0, 0, "",               CPID_CTF_CAPSHIELD,     "0 0",  _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "")
     MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_INACTIVE,        N_ENABLE,    0, 0, "",               CPID_CTF_CAPSHIELD,     "0 0",  _("^BGThis flag is currently inactive"), "")
     MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_SHIELDED,        N_ENABLE,    0, 0, "",               CPID_CTF_CAPSHIELD,     "0 0",  _("^BGYou are now ^F1shielded^BG from the flag(s)\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "")
-    MULTITEAM_CENTER(CTF_CAPTURE, 4,                    N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou captured the ^TC^TT^BG flag!"), "", FLAG)
+    MULTITEAM_CENTER(CTF_CAPTURE,                       N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou captured the ^TC^TT^BG flag!"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_CAPTURE_NEUTRAL,               N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou captured the flag!"), "")
     MSG_CENTER_NOTIF(CTF_FLAG_THROW_PUNISH,             N_ENABLE,    0, 1, "f1secs",         CPID_CTF_LOWPRIO,       "0 0",  _("^BGToo many flag throws! Throwing disabled for %s."), "")
-    MULTITEAM_CENTER(CTF_PASS_OTHER, 4,                 N_ENABLE,    2, 0, "s1 s2",          CPID_CTF_PASS,          "0 0",  _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PASS_OTHER,                    N_ENABLE,    2, 0, "s1 s2",          CPID_CTF_PASS,          "0 0",  _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_PASS_OTHER_NEUTRAL,            N_ENABLE,    2, 0, "s1 s2",          CPID_CTF_PASS,          "0 0",  _("^BG%s^BG passed the flag to %s"), "")
-    MULTITEAM_CENTER(CTF_PASS_RECEIVED, 4,              N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou received the ^TC^TT^BG flag from %s"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PASS_RECEIVED,                 N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou received the ^TC^TT^BG flag from %s"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_PASS_RECEIVED_NEUTRAL,         N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou received the flag from %s"), "")
     MSG_CENTER_NOTIF(CTF_PASS_REQUESTED,                N_ENABLE,    1, 0, "pass_key s1",    CPID_CTF_PASS,          "0 0",  _("^BGPress ^F2%s^BG to receive the flag from %s^BG"), "")
     MSG_CENTER_NOTIF(CTF_PASS_REQUESTING,               N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGRequesting %s^BG to pass you the flag"), "")
-    MULTITEAM_CENTER(CTF_PASS_SENT, 4,                  N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou passed the ^TC^TT^BG flag to %s"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PASS_SENT,                     N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou passed the ^TC^TT^BG flag to %s"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_PASS_SENT_NEUTRAL,             N_ENABLE,    1, 0, "s1",             CPID_CTF_PASS,          "0 0",  _("^BGYou passed the flag to %s"), "")
-    MULTITEAM_CENTER(CTF_PICKUP, 4,                     N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou got the ^TC^TT^BG flag!"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PICKUP,                        N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou got the ^TC^TT^BG flag!"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_PICKUP_NEUTRAL,                N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou got the flag!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_RETURN,                 N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou got your %steam^BG's flag, return it!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_RETURN_ENEMY,           N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou got the %senemy^BG's flag, return it!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE,  N_ENABLE,    2, 0, "s1 s2 s1",       CPID_CTF_LOWPRIO,       "0 0",  _("^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_TEAM,             N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGThe %senemy^BG got their flag! Retrieve it!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_TEAM_VERBOSE,     N_ENABLE,    2, 0, "s1 s2 s1",       CPID_CTF_LOWPRIO,       "0 0",  _("^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"), "")
-    MULTITEAM_CENTER(CTF_PICKUP_TEAM, 4,                N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG)
-    MULTITEAM_CENTER(CTF_PICKUP_TEAM_VERBOSE, 4,        N_ENABLE,    2, 0, "s1 s2 s1",       CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PICKUP_TEAM,                   N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG)
+    MULTITEAM_CENTER(CTF_PICKUP_TEAM_VERBOSE,           N_ENABLE,    2, 0, "s1 s2 s1",       CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_PICKUP_TEAM_NEUTRAL,           N_ENABLE,    1, 0, "s1",             CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate^BG got the flag! Protect them!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_TEAM_VERBOSE_NEUTRAL,   N_ENABLE,    2, 0, "s1 s2 s1",       CPID_CTF_LOWPRIO,       "0 0",  _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "")
     MSG_CENTER_NOTIF(CTF_PICKUP_VISIBLE,                N_ENABLE,    0, 0, "",               CPID_STALEMATE,         "0 0",  _("^BGEnemies can now see you on radar!"), "")
-    MULTITEAM_CENTER(CTF_RETURN, 4,                     N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou returned the ^TC^TT^BG flag!"), "", FLAG)
+    MULTITEAM_CENTER(CTF_RETURN,                        N_ENABLE,    0, 0, "",               CPID_CTF_LOWPRIO,       "0 0",  _("^BGYou returned the ^TC^TT^BG flag!"), "", FLAG)
     MSG_CENTER_NOTIF(CTF_STALEMATE_CARRIER,             N_ENABLE,    0, 0, "",               CPID_STALEMATE,         "0 0",  _("^BGStalemate! Enemies can now see you on radar!"), "")
     MSG_CENTER_NOTIF(CTF_STALEMATE_OTHER,               N_ENABLE,    0, 0, "",               CPID_STALEMATE,         "0 0",  _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "")
 
     MSG_CENTER_NOTIF(DOOR_LOCKED_ALSONEED,              N_ENABLE,    1, 0, "s1",             CPID_Null,              "0 0",  _("^BGYou also need %s^BG!"), "")
     MSG_CENTER_NOTIF(DOOR_UNLOCKED,                     N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^BGDoor unlocked!"), "")
 
-    MSG_CENTER_NOTIF(EXTRALIVES,                        N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^F2You picked up some extra lives"), "")
+    MSG_CENTER_NOTIF(EXTRALIVES,                        N_ENABLE,    0, 1, "f1",             CPID_Null,              "0 0",  _("^F2Extra lives taken: ^K1%s"), "")
 
     MSG_CENTER_NOTIF(FREEZETAG_REVIVE,                  N_ENABLE,    1, 0, "s1",             CPID_Null,              "0 0",  _("^K3You revived ^BG%s"), "")
     MSG_CENTER_NOTIF(FREEZETAG_REVIVE_SELF,             N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^K3You revived yourself"), "")
 
     MSG_CENTER_NOTIF(GENERATOR_UNDERATTACK,             N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^BGThe generator is under attack!"), "")
 
-    MULTITEAM_CENTER(ROUND_TEAM_LOSS, 4,                N_ENABLE,    0, 0, "",               CPID_ROUND,             "0 0",  _("^TC^TT^BG team loses the round"), "", NAME)
-    MULTITEAM_CENTER(ROUND_TEAM_WIN, 4,                 N_ENABLE,    0, 0, "",               CPID_ROUND,             "0 0",  _("^TC^TT^BG team wins the round"), "", NAME)
+    MULTITEAM_CENTER(ROUND_TEAM_LOSS,                   N_ENABLE,    0, 0, "",               CPID_ROUND,             "0 0",  _("^TC^TT^BG team loses the round"), "", NAME)
+    MULTITEAM_CENTER(ROUND_TEAM_WIN,                    N_ENABLE,    0, 0, "",               CPID_ROUND,             "0 0",  _("^TC^TT^BG team wins the round"), "", NAME)
     MSG_CENTER_NOTIF(ROUND_PLAYER_WIN,                  N_ENABLE,    1, 0, "s1",             CPID_ROUND,             "0 0",  _("^BG%s^BG wins the round"), "")
 
     MSG_CENTER_NOTIF(FREEZETAG_SELF,                    N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^K1You froze yourself"), "")
     MSG_CENTER_NOTIF(KEEPAWAY_WARN,                     N_ENABLE,    0, 0, "",               CPID_KEEPAWAY_WARN,     "0 0",  _("^BGKilling people while you don't have the ball gives no points!"), "")
 
     MSG_CENTER_NOTIF(KEYHUNT_HELP,                      N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGAll keys are in your team's hands!\nHelp the key carriers to meet!"), "")
-    MULTITEAM_CENTER(KEYHUNT_INTERFERE, 4,              N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "", NAME)
+    MULTITEAM_CENTER(KEYHUNT_INTERFERE,                 N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "", NAME)
     MSG_CENTER_NOTIF(KEYHUNT_MEET,                      N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGAll keys are in your team's hands!\nMeet the other key carriers ^F4NOW^BG!"), "")
     MSG_CENTER_NOTIF(KEYHUNT_ROUNDSTART,                N_ENABLE,    0, 1, "",               CPID_KEYHUNT_OTHER,     "1 f1", _("^F4Round will start in ^COUNT"), "")
     MSG_CENTER_NOTIF(KEYHUNT_SCAN,                      N_ENABLE,    0, 1, "",               CPID_KEYHUNT_OTHER,     "f1 0", _("^BGScanning frequency range..."), "")
-    MULTITEAM_CENTER(KEYHUNT_START, 4,                  N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGYou are starting with the ^TC^TT Key"), "", KEY)
+    MULTITEAM_CENTER(KEYHUNT_START,                     N_ENABLE,    0, 0, "",               CPID_KEYHUNT,           "0 0",  _("^BGYou are starting with the ^TC^TT Key"), "", KEY)
 
     MSG_CENTER_NOTIF(LMS_NOLIVES,                       N_ENABLE,    0, 0, "",               CPID_LMS,               "0 0",  _("^BGYou have no lives left, you must wait until the next match"), "")
 
     MSG_CENTER_NOTIF(NIX_NEWWEAPON,                     N_ENABLE,    0, 1, "item_wepname",   CPID_NIX,               "0 0",  _("^F2Active weapon: ^F1%s"), "")
 
     MSG_CENTER_NOTIF(ONS_CAPTURE,                       N_ENABLE,    1, 0, "s1",             CPID_ONSLAUGHT,         "0 0",  _("^BGYou captured %s^BG control point"), "")
-    MULTITEAM_CENTER(ONS_CAPTURE_TEAM, 4,               N_ENABLE,    1, 0, "s1",             CPID_ONSLAUGHT,         "0 0",  _("^TC^TT^BG team captured %s^BG control point"), "", NAME)
+    MSG_CENTER_NOTIF(ONS_CAPTURE_NONAME,                N_ENABLE,    0, 0, "",               CPID_ONSLAUGHT,         "0 0",  _("^BGYou captured a control point"), "")
+    MULTITEAM_CENTER(ONS_CAPTURE_TEAM,                  N_ENABLE,    1, 0, "s1",             CPID_ONSLAUGHT,         "0 0",  _("^TC^TT^BG team captured %s^BG control point"), "", NAME)
+    MULTITEAM_CENTER(ONS_CAPTURE_TEAM_NONAME,           N_ENABLE,    0, 0, "",               CPID_ONSLAUGHT,         "0 0",  _("^TC^TT^BG team captured a control point"), "", NAME)
     MSG_CENTER_NOTIF(ONS_CONTROLPOINT_SHIELDED,         N_ENABLE,    0, 0, "",               CPID_ONS_CAPSHIELD,     "0 0",  _("^BGThis control point currently cannot be captured"), "")
     MSG_CENTER_NOTIF(ONS_GENERATOR_SHIELDED,            N_ENABLE,    0, 0, "",               CPID_ONS_CAPSHIELD,     "0 0",  _("^BGThe enemy generator cannot be destroyed yet\n^F2Capture some control points to unshield it"), "")
-    MULTITEAM_CENTER(ONS_NOTSHIELDED, 4,                N_ENABLE,    0, 0, "",               CPID_ONSLAUGHT,         "0 0",  _("^BGThe ^TCenemy^BG generator is no longer shielded!"), "", NAME)
+    MULTITEAM_CENTER(ONS_NOTSHIELDED,                   N_ENABLE,    0, 0, "",               CPID_ONSLAUGHT,         "0 0",  _("^BGThe ^TCenemy^BG generator is no longer shielded!"), "", NAME)
     MSG_CENTER_NOTIF(ONS_NOTSHIELDED_TEAM,              N_ENABLE,    0, 0, "",               CPID_ONSLAUGHT,         "0 0",  _("^K1Your generator is NOT shielded!\n^BGRe-capture control points to shield it!"), "")
     MSG_CENTER_NOTIF(ONS_TELEPORT,                      N_ENABLE,    0, 0, "pass_key",       CPID_ONSLAUGHT,         "0 0",  _("^BGPress ^F2%s^BG to teleport"), "")
     MSG_CENTER_NOTIF(ONS_TELEPORT_ANTISPAM,             N_ENABLE,    0, 1, "f1secs",         CPID_ONSLAUGHT,         "0 0",  _("^BGTeleporting disabled for %s"), "")
 
     MSG_CENTER_NOTIF(RACE_FINISHLAP,                    N_ENABLE,    0, 0, "",               CPID_RACE_FINISHLAP,    "0 0",  _("^F2The race is over, finish your lap!"), "")
 
-    MSG_CENTER_NOTIF(SECONDARY_NODAMAGE,                N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^BGSecondary fire inflicts no damage!"), "")
-
     MSG_CENTER_NOTIF(SEQUENCE_COMPLETED,                N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^BGSequence completed!"), "")
     MSG_CENTER_NOTIF(SEQUENCE_COUNTER,                  N_ENABLE,    0, 0, "",               CPID_Null,              "0 0",  _("^BGThere are more to go..."), "")
     MSG_CENTER_NOTIF(SEQUENCE_COUNTER_FEWMORE,          N_ENABLE,    0, 1, "f1",             CPID_Null,              "0 0",  _("^BGOnly %s^BG more to go..."), "")
     MSG_CENTER_NOTIF(SUPERWEAPON_LOST,                  N_ENABLE,    0, 0, "",               CPID_POWERUP,           "0 0",  _("^F2Superweapons have been lost"), "")
     MSG_CENTER_NOTIF(SUPERWEAPON_PICKUP,                N_ENABLE,    0, 0, "",               CPID_POWERUP,           "0 0",  _("^F2You now have a superweapon"), "")
 
-    MULTITEAM_CENTER(TEAMCHANGE, 4,                     N_ENABLE,    0, 1, "",               CPID_TEAMCHANGE,        "1 f1", _("^K1Changing to ^TC^TT^K1 in ^COUNT"), "", NAME)
+    MULTITEAM_CENTER(TEAMCHANGE,                        N_ENABLE,    0, 1, "",               CPID_TEAMCHANGE,        "1 f1", _("^K1Changing to ^TC^TT^K1 in ^COUNT"), "", NAME)
     MSG_CENTER_NOTIF(TEAMCHANGE_AUTO,                   N_ENABLE,    0, 1, "",               CPID_TEAMCHANGE,        "1 f1", _("^K1Changing team in ^COUNT"), "")
     MSG_CENTER_NOTIF(TEAMCHANGE_SPECTATE,               N_ENABLE,    0, 1, "",               CPID_TEAMCHANGE,        "1 f1", _("^K1Spectating in ^COUNT"), "")
     MSG_CENTER_NOTIF(TEAMCHANGE_SUICIDE,                N_ENABLE,    0, 1, "",               CPID_TEAMCHANGE,        "1 f1", _("^K1Suicide in ^COUNT"), "")
 #define N_DISABL 0
 #define N_ENABLE 1
 
-#define MULTITEAM_MULTI2(prefix, default, anncepre, infopre, centerpre) \
-    MSG_MULTI_NOTIF(prefix##_RED, default, anncepre##_RED, infopre##_RED, centerpre##_RED) \
-    MSG_MULTI_NOTIF(prefix##_BLUE, default, anncepre##_BLUE, infopre##_BLUE, centerpre##_BLUE)
-#define MULTITEAM_MULTI3(prefix, default, anncepre, infopre, centerpre) \
-    MULTITEAM_MULTI2(prefix, default, anncepre, infopre, centerpre) \
-    MSG_MULTI_NOTIF(prefix##_YELLOW, default, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW)
-#define MULTITEAM_MULTI4(prefix, default, anncepre, infopre, centerpre) \
-    MULTITEAM_MULTI3(prefix, default, anncepre, infopre, centerpre) \
-    MSG_MULTI_NOTIF(prefix##_PINK, default, anncepre##PINK, infopre##PINK, centerpre##PINK)
-#define MULTITEAM_MULTI(prefix, teams, default, anncepre, infopre, centerpre) \
-    MULTITEAM_MULTI##teams(prefix, default, anncepre, infopre, centerpre)
+#define MULTITEAM_MULTI(prefix, defaultvalue, anncepre, infopre, centerpre) \
+    MSG_MULTI_NOTIF(prefix##_RED, defaultvalue, anncepre##_RED, infopre##_RED, centerpre##_RED) \
+    MSG_MULTI_NOTIF(prefix##_BLUE, defaultvalue, anncepre##_BLUE, infopre##_BLUE, centerpre##_BLUE) \
+    MSG_MULTI_NOTIF(prefix##_YELLOW, defaultvalue, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW) \
+    MSG_MULTI_NOTIF(prefix##_PINK, defaultvalue, anncepre##PINK, infopre##PINK, centerpre##PINK)
 
 // MSG_MULTI_NOTIFICATIONS
     MSG_MULTI_NOTIF(DEATH_MURDER_BUFF,                  N_ENABLE,  NULL,           INFO_DEATH_MURDER_BUFF,                 NULL)
     MSG_MULTI_NOTIF(WEAPON_VAPORIZER_MURDER,            N_ENABLE,  NULL,           INFO_WEAPON_VAPORIZER_MURDER,           NULL)
     MSG_MULTI_NOTIF(WEAPON_VORTEX_MURDER,               N_ENABLE,  NULL,           INFO_WEAPON_VORTEX_MURDER,              NULL)
 
-#define MULTITEAM_CHOICE2(prefix, default, challow, chtype, optiona, optionb) \
-    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, challow, chtype, optiona##_RED, optionb##_RED) \
-    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, challow, chtype, optiona##_BLUE, optionb##_BLUE)
-#define MULTITEAM_CHOICE3(prefix, default, challow, chtype, optiona, optionb) \
-    MULTITEAM_CHOICE2(prefix, default, challow, chtype, optiona, optionb) \
-    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, challow, chtype, optiona##_YELLOW, optionb##_YELLOW)
-#define MULTITEAM_CHOICE4(prefix, default, challow, chtype, optiona, optionb) \
-    MULTITEAM_CHOICE3(prefix, default, challow, chtype, optiona, optionb) \
-    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, challow, chtype, optiona##_PINK, optionb##_PINK)
-#define MULTITEAM_CHOICE(prefix, teams, default, challow, chtype, optiona, optionb) \
-    NOTIF_ADD_AUTOCVAR(CHOICE_##prefix, default) \
+#define MULTITEAM_CHOICE(prefix, defaultvalue, challow, chtype, optiona, optionb) \
+    NOTIF_ADD_AUTOCVAR(CHOICE_##prefix, defaultvalue) \
     NOTIF_ADD_AUTOCVAR(CHOICE_##prefix##_ALLOWED, challow) \
-    MULTITEAM_CHOICE##teams(prefix, default, challow, chtype, optiona, optionb)
+    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, challow, chtype, optiona##_RED, optionb##_RED) \
+    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, challow, chtype, optiona##_BLUE, optionb##_BLUE) \
+    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, challow, chtype, optiona##_YELLOW, optionb##_YELLOW) \
+    MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, challow, chtype, optiona##_PINK, optionb##_PINK)
 
 #undef N_DISABL
 #undef N_ENABLE
 #define A_ALWAYS 2
 
 // MSG_CHOICE_NOTIFICATIONS
-    MULTITEAM_CHOICE(CTF_CAPTURE_BROKEN, 4,     N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_BROKEN)
-    MULTITEAM_CHOICE(CTF_CAPTURE_TIME, 4,       N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_TIME)
-    MULTITEAM_CHOICE(CTF_CAPTURE_UNBROKEN, 4,   N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_UNBROKEN)
-    MULTITEAM_CHOICE(CTF_PICKUP_TEAM, 4,        N__NORMAL, A_ALWAYS,  MSG_CENTER, CENTER_CTF_PICKUP_TEAM,             CENTER_CTF_PICKUP_TEAM_VERBOSE)
+    MULTITEAM_CHOICE(CTF_CAPTURE_BROKEN,        N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_BROKEN)
+    MULTITEAM_CHOICE(CTF_CAPTURE_TIME,          N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_TIME)
+    MULTITEAM_CHOICE(CTF_CAPTURE_UNBROKEN,      N_VERBOSE, A_ALWAYS,  MSG_INFO,   INFO_CTF_CAPTURE,                   INFO_CTF_CAPTURE_UNBROKEN)
+    MULTITEAM_CHOICE(CTF_PICKUP_TEAM,           N__NORMAL, A_ALWAYS,  MSG_CENTER, CENTER_CTF_PICKUP_TEAM,             CENTER_CTF_PICKUP_TEAM_VERBOSE)
     MSG_CHOICE_NOTIF(CTF_PICKUP_TEAM_NEUTRAL,   N__NORMAL, A_ALWAYS,  MSG_CENTER, CENTER_CTF_PICKUP_TEAM_NEUTRAL,     CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL)
     MSG_CHOICE_NOTIF(CTF_PICKUP_ENEMY,          N__NORMAL, A_ALWAYS,  MSG_CENTER, CENTER_CTF_PICKUP_ENEMY,            CENTER_CTF_PICKUP_ENEMY_VERBOSE)
     MSG_CHOICE_NOTIF(CTF_PICKUP_ENEMY_NEUTRAL,  N__NORMAL, A_ALWAYS,  MSG_CENTER, CENTER_CTF_PICKUP_ENEMY_NEUTRAL,    CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE)
index b8e0d5c6998c8a37cc8ec5ea9d809116d2c3e235..663269c93558bac46a733f26d6c70a65e8921db7 100644 (file)
@@ -761,7 +761,7 @@ void Create_Notification_Entity_Choice(entity notif,
 #ifdef SVQC
 void Notification_GetCvars(entity this)
 {
-       FOREACH(Notifications, it.nent_type == MSG_CHOICE, {
+       FOREACH(Notifications, it.nent_type == MSG_CHOICE && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
                GetCvars_handleFloat(
                        this,
                        CS(this),
index 2d775d4f219386fe82fc31ab3cc09ef52c53f827..ee39b1881ab100937221ae3604d1cac68bb817ae 100644 (file)
@@ -295,7 +295,7 @@ void Send_Notification_WOCOVA(
 // MAKE SURE THIS IS ALWAYS SYNCHRONIZED WITH THE DUMP
 // NOTIFICATIONS FUNCTION IN THE .QC FILE!
 
-#define NOTIF_ADD_AUTOCVAR(name,default) float autocvar_notification_##name = default;
+#define NOTIF_ADD_AUTOCVAR(name,defaultvalue) float autocvar_notification_##name = defaultvalue;
 
 float autocvar_notification_show_location = false;
 string autocvar_notification_show_location_string = ""; //_(" at the %s");
@@ -699,7 +699,9 @@ REGISTRY_SORT(Notifications);
 STATIC_INIT(Notifications) { FOREACH(Notifications, true, it.m_id = i); }
 REGISTRY_CHECK(Notifications)
 
-const int NOTIF_CHOICE_MAX = 50;
+const int NOTIF_CHOICE_MAX = 20;
+// NOTE: a team choice is actually made of 4 choices (one per team) with the same nent_choice_idx
+// thus they are counted as 1 in nent_choice_count
 int nent_choice_count = 0;
 .int nent_choice_idx;
 .int msg_choice_choices[NOTIF_CHOICE_MAX]; // set on each player containing MSG_CHOICE choices
@@ -707,12 +709,11 @@ int nent_choice_count = 0;
 bool notif_error;
 bool notif_global_error;
 
-STATIC_INIT_LATE(Notif_Choices) {
-       int c = 0;
-       FOREACH(Notifications, it.nent_type == MSG_CHOICE, { c++; });
-       if (c > NOTIF_CHOICE_MAX) {
-               LOG_FATALF("Too many MSG_CHOICE notifications (%d)", c);
-       }
+STATIC_INIT_LATE(Notif_Choices)
+{
+       if (nent_choice_count > NOTIF_CHOICE_MAX)
+               LOG_FATALF("Too many MSG_CHOICE notifications (%d), hit NOTIF_CHOICE_MAX (%d) limit",
+                       nent_choice_count, NOTIF_CHOICE_MAX);
 }
 
 string Get_Notif_CvarName(Notification notif)
@@ -736,16 +737,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
        return it;
 }
 
-#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, default, sound, channel, volume, position) \
-       MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, default, sound, channel, volume, position)
+#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \
+       MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, defaultvalue, sound, channel, volume, position)
 
-#define MSG_ANNCE_NOTIF(name, default, sound, channel, volume, position) \
-       NOTIF_ADD_AUTOCVAR(ANNCE_##name, default) \
-       MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, default, sound, channel, volume, position)
+#define MSG_ANNCE_NOTIF(name, defaultvalue, sound, channel, volume, position) \
+       NOTIF_ADD_AUTOCVAR(ANNCE_##name, defaultvalue) \
+       MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, defaultvalue, sound, channel, volume, position)
 
-#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, default, sound, channel, volume, position) \
+#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \
        REGISTER(Notifications, name, m_id, new_pure(msg_annce_notification)) { \
-               Create_Notification_Entity      (this, default, ACVNN(cvarname), MSG_ANNCE, strtoupper(#name), teamnum); \
+               Create_Notification_Entity      (this, defaultvalue, ACVNN(cvarname), MSG_ANNCE, strtoupper(#name), teamnum); \
                Create_Notification_Entity_Annce(this, ACVNN(cvarname), strtoupper(#name), \
                        channel,   /* channel  */ \
                        sound,     /* snd      */ \
@@ -753,16 +754,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
                        position); /* position */ \
        }
 
-#define MSG_INFO_NOTIF_TEAM(teamnum, name, cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle) \
-       MSG_INFO_NOTIF_(teamnum, INFO_##name, INFO_##cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle)
+#define MSG_INFO_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \
+       MSG_INFO_NOTIF_(teamnum, INFO_##name, INFO_##cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle)
 
-#define MSG_INFO_NOTIF(name, default, strnum, flnum, args, hudargs, icon, normal, gentle) \
-       NOTIF_ADD_AUTOCVAR(INFO_##name, default) \
-       MSG_INFO_NOTIF_(0, INFO_##name, INFO_##name, default, strnum, flnum, args, hudargs, icon, normal, gentle)
+#define MSG_INFO_NOTIF(name, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \
+       NOTIF_ADD_AUTOCVAR(INFO_##name, defaultvalue) \
+       MSG_INFO_NOTIF_(0, INFO_##name, INFO_##name, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle)
 
-#define MSG_INFO_NOTIF_(teamnum, name, cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle) \
+#define MSG_INFO_NOTIF_(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \
        REGISTER(Notifications, name, m_id, new_pure(msg_info_notification)) { \
-               Create_Notification_Entity           (this, default, ACVNN(cvarname), MSG_INFO, strtoupper(#name), teamnum); \
+               Create_Notification_Entity           (this, defaultvalue, ACVNN(cvarname), MSG_INFO, strtoupper(#name), teamnum); \
                Create_Notification_Entity_InfoCenter(this, ACVNN(cvarname), strtoupper(#name), strnum, flnum, \
                        args,     /* args    */ \
                        hudargs,  /* hudargs */ \
@@ -774,12 +775,12 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
        }
 
 .string nent_iconargs;
-#define MULTIICON_INFO(name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \
-       MULTIICON_INFO_(INFO_##name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle)
-#define MULTIICON_INFO_(name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \
-       NOTIF_ADD_AUTOCVAR(name, default) \
+#define MULTIICON_INFO(name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \
+       MULTIICON_INFO_(INFO_##name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle)
+#define MULTIICON_INFO_(name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \
+       NOTIF_ADD_AUTOCVAR(name, defaultvalue) \
        REGISTER(Notifications, name, m_id, new_pure(msg_info_notification)) { \
-               Create_Notification_Entity           (this, default, ACVNN(name), MSG_INFO, strtoupper(#name), 0); \
+               Create_Notification_Entity           (this, defaultvalue, ACVNN(name), MSG_INFO, strtoupper(#name), 0); \
                Create_Notification_Entity_InfoCenter(this, ACVNN(name), strtoupper(#name), strnum, flnum, \
                        args,     /* args    */ \
                        hudargs,  /* hudargs */ \
@@ -791,16 +792,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
                this.nent_iconargs = iconargs; \
        }
 
-#define MSG_CENTER_NOTIF_TEAM(teamnum, name, cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \
-       MSG_CENTER_NOTIF_(teamnum, CENTER_##name, CENTER_##cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle)
+#define MSG_CENTER_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \
+       MSG_CENTER_NOTIF_(teamnum, CENTER_##name, CENTER_##cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle)
 
-#define MSG_CENTER_NOTIF(name, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \
-       NOTIF_ADD_AUTOCVAR(CENTER_##name, default) \
-       MSG_CENTER_NOTIF_(0, CENTER_##name, CENTER_##name, default, strnum, flnum, args, cpid, durcnt, normal, gentle)
+#define MSG_CENTER_NOTIF(name, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \
+       NOTIF_ADD_AUTOCVAR(CENTER_##name, defaultvalue) \
+       MSG_CENTER_NOTIF_(0, CENTER_##name, CENTER_##name, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle)
 
-#define MSG_CENTER_NOTIF_(teamnum, name, cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \
+#define MSG_CENTER_NOTIF_(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \
        REGISTER(Notifications, name, m_id, new_pure(msg_center_notification)) { \
-               Create_Notification_Entity           (this, default, ACVNN(cvarname), MSG_CENTER, strtoupper(#name), teamnum); \
+               Create_Notification_Entity           (this, defaultvalue, ACVNN(cvarname), MSG_CENTER, strtoupper(#name), teamnum); \
                Create_Notification_Entity_InfoCenter(this, ACVNN(cvarname), strtoupper(#name), strnum, flnum, \
                        args,    /* args    */ \
                        "",      /* hudargs */ \
@@ -811,28 +812,30 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
                        gentle); /* gentle  */ \
        }
 
-#define MSG_MULTI_NOTIF(name, default, anncename, infoname, centername) \
-       NOTIF_ADD_AUTOCVAR(name, default) \
+#define MSG_MULTI_NOTIF(name, defaultvalue, anncename, infoname, centername) \
+       NOTIF_ADD_AUTOCVAR(name, defaultvalue) \
        REGISTER(Notifications, name, m_id, new_pure(msg_multi_notification)) { \
-               Create_Notification_Entity      (this, default, ACVNN(name), MSG_MULTI, strtoupper(#name), 0); \
+               Create_Notification_Entity      (this, defaultvalue, ACVNN(name), MSG_MULTI, strtoupper(#name), 0); \
                Create_Notification_Entity_Multi(this, ACVNN(name), strtoupper(#name), \
                        anncename,   /* anncename  */ \
                        infoname,    /* infoname   */ \
                        centername); /* centername */ \
        }
 
-#define MSG_CHOICE_NOTIF_TEAM(teamnum, name, cvarname, default, challow, chtype, optiona, optionb) \
-       MSG_CHOICE_NOTIF_(teamnum, CHOICE_##name, CHOICE_##cvarname, default, challow, chtype, optiona, optionb)
+#define MSG_CHOICE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, challow, chtype, optiona, optionb) \
+       MSG_CHOICE_NOTIF_(teamnum, CHOICE_##name, CHOICE_##cvarname, defaultvalue, challow, chtype, optiona, optionb)
 
-#define MSG_CHOICE_NOTIF(name, default, challow, chtype, optiona, optionb) \
-       NOTIF_ADD_AUTOCVAR(CHOICE_##name, default) \
+#define MSG_CHOICE_NOTIF(name, defaultvalue, challow, chtype, optiona, optionb) \
+       NOTIF_ADD_AUTOCVAR(CHOICE_##name, defaultvalue) \
        NOTIF_ADD_AUTOCVAR(CHOICE_##name##_ALLOWED, challow) \
-       MSG_CHOICE_NOTIF_(0, CHOICE_##name, CHOICE_##name, default, challow, chtype, optiona, optionb)
+       MSG_CHOICE_NOTIF_(0, CHOICE_##name, CHOICE_##name, defaultvalue, challow, chtype, optiona, optionb)
 
-#define MSG_CHOICE_NOTIF_(teamnum, name, cvarname, default, challow, chtype, optiona, optionb) \
+#define MSG_CHOICE_NOTIF_(teamnum, name, cvarname, defaultvalue, challow, chtype, optiona, optionb) \
        REGISTER(Notifications, name, m_id, new_pure(msg_choice_notification)) { \
-               this.nent_choice_idx = nent_choice_count++; \
-               Create_Notification_Entity       (this, default, ACVNN(cvarname), MSG_CHOICE, strtoupper(#name), teamnum); \
+               this.nent_choice_idx = nent_choice_count; \
+               if (!teamnum || teamnum == NUM_TEAM_4) \
+                       nent_choice_count++; \
+               Create_Notification_Entity       (this, defaultvalue, ACVNN(cvarname), MSG_CHOICE, strtoupper(#name), teamnum); \
                Create_Notification_Entity_Choice(this, ACVNN(cvarname), strtoupper(#name), \
                        challow,                                 /* challow_def */ \
                        autocvar_notification_##cvarname##_ALLOWED,  /* challow_var */ \
index 4539466a24feb9f10d97f6652f3eb31c519af490..8eb2277d54ad9cd2b98c2d9dc5d2199725245c7c 100644 (file)
@@ -34,8 +34,10 @@ void _Movetype_WallFriction(entity this, vector stepnormal)  // SV_WallFriction
 }
 
 vector planes[MAX_CLIP_PLANES];
-int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight) // SV_FlyMove
+int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepnormal, float stepheight) // SV_FlyMove
 {
+       move_stepnormal = '0 0 0';
+
        if(dt <= 0)
                return 0;
 
@@ -150,8 +152,8 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma
                        // step - return it to caller
                        blocked |= 2;
                        // save the trace for player extrafriction
-                       if(stepnormal)
-                               stepnormal = trace_plane_normal;
+                       if(applystepnormal)
+                               move_stepnormal = trace_plane_normal;
                }
 
                if(my_trace_fraction >= 0.001)
index 1eb2d95e47b8ab98c8ae6d96e4c24b6135f16b7a..51da5e730c1169de3b2552b93953d0b68b0720b2 100644 (file)
@@ -85,8 +85,11 @@ const int UNSTICK_FINE = 0;
 const int UNSTICK_FIXED = 1;
 const int UNSTICK_STUCK = 2;
 
+// set by _Movetype_FlyMove
+vector move_stepnormal;
+
 void _Movetype_WallFriction(entity this, vector stepnormal);
-int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight);
+int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepnormal, float stepheight);
 void _Movetype_CheckVelocity(entity this);
 void _Movetype_CheckWaterTransition(entity ent);
 void _Movetype_CheckStuck(entity this);
index a41269f79c562122fe8f01e6745cfa7df2180748..30ebe6afadf73a244831de58421d3afe60379066 100644 (file)
@@ -7,14 +7,14 @@ void _Movetype_Physics_Step(entity this, float dt) // SV_Physics_Step
                {
                        UNSET_ONGROUND(this);
                        _Movetype_CheckVelocity(this);
-                       _Movetype_FlyMove(this, dt, true, '0 0 0', 0);
+                       _Movetype_FlyMove(this, dt, true, false, 0);
                        _Movetype_LinkEdict(this, true);
                }
        }
        else
        {
                _Movetype_CheckVelocity(this);
-               _Movetype_FlyMove(this, dt, true, '0 0 0', 0);
+               _Movetype_FlyMove(this, dt, true, false, 0);
                _Movetype_LinkEdict(this, true);
 
                // TODO? movetypesteplandevent
index 5c7ae9ee2a6e2797e7c2b4db9f09d8a42e1c3548..13224f8a3443d022658aa9307dca2f522979d16f 100644 (file)
@@ -1,8 +1,6 @@
 #include "walk.qh"
 void _Movetype_Physics_Walk(entity this, float dt)  // SV_WalkMove
 {
-       vector stepnormal = '0 0 0';
-
        // if frametime is 0 (due to client sending the same timestamp twice), don't move
        if (dt <= 0)
                return;
@@ -28,7 +26,7 @@ void _Movetype_Physics_Walk(entity this, float dt)  // SV_WalkMove
                        this.pm_time -= dt;
        }
 
-       int clip = _Movetype_FlyMove(this, dt, applygravity, stepnormal, GAMEPLAYFIX_STEPMULTIPLETIMES(this) ? PHYS_STEPHEIGHT(this) : 0);
+       int clip = _Movetype_FlyMove(this, dt, applygravity, false, GAMEPLAYFIX_STEPMULTIPLETIMES(this) ? PHYS_STEPHEIGHT(this) : 0);
 
        if (GAMEPLAYFIX_DOWNTRACEONGROUND(this) && !(clip & 1))
        {
@@ -108,7 +106,7 @@ void _Movetype_Physics_Walk(entity this, float dt)  // SV_WalkMove
 
                // move forward
                this.velocity_z = 0;
-               clip = _Movetype_FlyMove(this, dt, applygravity, stepnormal, 0);
+               clip = _Movetype_FlyMove(this, dt, applygravity, true, 0);
                this.velocity_z += start_velocity.z;
                if (clip & 8)
                {
@@ -142,7 +140,7 @@ void _Movetype_Physics_Walk(entity this, float dt)  // SV_WalkMove
 
                // extra friction based on view angle
                if ((clip & 2) && PHYS_WALLFRICTION(this))
-                       _Movetype_WallFriction(this, stepnormal);
+                       _Movetype_WallFriction(this, move_stepnormal);
        }
        // don't do the down move if stepdown is disabled, moving upward, not in water, or the move started offground or ended onground
        else if (!GAMEPLAYFIX_STEPDOWN(this) || this.waterlevel >= 3 || start_velocity.z >= (1.0 / 32.0) || !oldonground || IS_ONGROUND(this))
index acef8c97ad183273d5e944e5c119838bc4d6eb54..5ba6e82685b3204ce2caa5da04c5862253f0c974 100644 (file)
@@ -41,14 +41,18 @@ void Physics_UpdateStats(entity this)
 
        MUTATOR_CALLHOOK(PlayerPhysics_UpdateStats, this);
        float maxspd_mod = PHYS_HIGHSPEED(this);
-
-       STAT(MOVEVARS_AIRACCEL_QW, this) = AdjustAirAccelQW(Physics_ClientOption(this, "airaccel_qw", autocvar_sv_airaccel_qw), maxspd_mod);
-       STAT(MOVEVARS_AIRSTRAFEACCEL_QW, this) = (Physics_ClientOption(this, "airstrafeaccel_qw", autocvar_sv_airstrafeaccel_qw))
-               ? AdjustAirAccelQW(Physics_ClientOption(this, "airstrafeaccel_qw", autocvar_sv_airstrafeaccel_qw), maxspd_mod)
-               : 0;
-       STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, this) = Physics_ClientOption(this, "airspeedlimit_nonqw", autocvar_sv_airspeedlimit_nonqw) * maxspd_mod;
-       STAT(MOVEVARS_MAXSPEED, this) = Physics_ClientOption(this, "maxspeed", autocvar_sv_maxspeed) * maxspd_mod; // also slow walking
-
+        STAT(MOVEVARS_MAXSPEED, this) = Physics_ClientOption(this, "maxspeed", autocvar_sv_maxspeed) * maxspd_mod; // also slow walking
+        if (autocvar_g_movement_highspeed_q3_compat) {
+          STAT(MOVEVARS_AIRACCEL_QW, this) = Physics_ClientOption(this, "airaccel_qw", autocvar_sv_airaccel_qw);
+          STAT(MOVEVARS_AIRSTRAFEACCEL_QW, this) = Physics_ClientOption(this, "airstrafeaccel_qw", autocvar_sv_airstrafeaccel_qw);
+          STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, this) = Physics_ClientOption(this, "airspeedlimit_nonqw", autocvar_sv_airspeedlimit_nonqw);
+        } else {
+          STAT(MOVEVARS_AIRACCEL_QW, this) = AdjustAirAccelQW(Physics_ClientOption(this, "airaccel_qw", autocvar_sv_airaccel_qw), maxspd_mod);
+          STAT(MOVEVARS_AIRSTRAFEACCEL_QW, this) = (Physics_ClientOption(this, "airstrafeaccel_qw", autocvar_sv_airstrafeaccel_qw))
+            ? AdjustAirAccelQW(Physics_ClientOption(this, "airstrafeaccel_qw", autocvar_sv_airstrafeaccel_qw), maxspd_mod)
+            : 0;
+          STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, this) = Physics_ClientOption(this, "airspeedlimit_nonqw", autocvar_sv_airspeedlimit_nonqw) * maxspd_mod;
+        }
        bool vq3compat = autocvar_sv_vq3compat && autocvar_sv_vq3compat_changehitbox; // NOTE: these hitboxes are off by 1 due to engine differences
        STAT(PL_MIN, this) = (vq3compat) ? '-15 -15 -24' : autocvar_sv_player_mins;
        STAT(PL_MAX, this) = (vq3compat) ? '15 15 32' : autocvar_sv_player_maxs;
@@ -61,7 +65,12 @@ void Physics_UpdateStats(entity this)
        // fix some new settings
        STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, this) = Physics_ClientOption(this, "airaccel_qw_stretchfactor", autocvar_sv_airaccel_qw_stretchfactor);
        STAT(MOVEVARS_MAXAIRSTRAFESPEED, this) = Physics_ClientOption(this, "maxairstrafespeed", autocvar_sv_maxairstrafespeed);
-       STAT(MOVEVARS_MAXAIRSPEED, this) = Physics_ClientOption(this, "maxairspeed", autocvar_sv_maxairspeed);
+        if (autocvar_g_movement_highspeed_q3_compat) {
+          STAT(MOVEVARS_MAXAIRSPEED, this) = Physics_ClientOption(this, "maxairspeed", autocvar_sv_maxairspeed) * maxspd_mod;
+        } else {
+          STAT(MOVEVARS_MAXAIRSPEED, this) = Physics_ClientOption(this, "maxairspeed", autocvar_sv_maxairspeed);
+        }
+
        STAT(MOVEVARS_AIRSTRAFEACCELERATE, this) = Physics_ClientOption(this, "airstrafeaccelerate", autocvar_sv_airstrafeaccelerate);
        STAT(MOVEVARS_WARSOWBUNNY_TURNACCEL, this) = Physics_ClientOption(this, "warsowbunny_turnaccel", autocvar_sv_warsowbunny_turnaccel);
        STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, this) = Physics_ClientOption(this, "airaccel_sideways_friction", autocvar_sv_airaccel_sideways_friction);
@@ -472,7 +481,7 @@ void CheckPlayerJump(entity this)
 
                bool air_jump = !playerjump || M_ARGV(2, bool);
                bool activate = JETPACK_JUMP(this) && air_jump && PHYS_INPUT_BUTTON_JUMP(this) || PHYS_INPUT_BUTTON_JETPACK(this);
-               bool has_fuel = !PHYS_JETPACK_FUEL(this) || PHYS_AMMO_FUEL(this) || (ITEMS_STAT(this) & IT_UNLIMITED_WEAPON_AMMO);
+               bool has_fuel = !PHYS_JETPACK_FUEL(this) || PHYS_AMMO_FUEL(this) || (ITEMS_STAT(this) & IT_UNLIMITED_AMMO);
 
                if (!(ITEMS_STAT(this) & ITEM_Jetpack.m_itemid)) { }
                else if (this.jetpack_stopped) { }
@@ -785,7 +794,7 @@ void PM_jetpack(entity this, float maxspd_mod, float dt)
        wishvel_z = (wishvel_z - PHYS_GRAVITY(this)) * fz + PHYS_GRAVITY(this);
 
        fvel = min(1, vlen(wishvel) / best);
-       if (PHYS_JETPACK_FUEL(this) && !(ITEMS_STAT(this) & IT_UNLIMITED_WEAPON_AMMO))
+       if (PHYS_JETPACK_FUEL(this) && !(ITEMS_STAT(this) & IT_UNLIMITED_AMMO))
                f = min(1, PHYS_AMMO_FUEL(this) / (PHYS_JETPACK_FUEL(this) * dt * fvel));
        else
                f = 1;
@@ -798,7 +807,7 @@ void PM_jetpack(entity this, float maxspd_mod, float dt)
                UNSET_ONGROUND(this);
 
 #ifdef SVQC
-               if (!(ITEMS_STAT(this) & IT_UNLIMITED_WEAPON_AMMO))
+               if (!(ITEMS_STAT(this) & IT_UNLIMITED_AMMO))
                        TakeResource(this, RES_FUEL, PHYS_JETPACK_FUEL(this) * dt * fvel * f);
 
                ITEMS_STAT(this) |= IT_USING_JETPACK;
index 2c9bbcde805eb9770015c385877971563b872731..cf272e5635a1eb66e72ec90810b864b10eff9f27 100644 (file)
@@ -152,6 +152,8 @@ void PlayerStats_GameReport_FinalizePlayer(entity p)
                        if(latency)
                                PlayerStats_GameReport_Event_Player(p, PLAYERSTATS_AVGLATENCY, latency);
                }
+
+               db_put(PS_GR_OUT_DB, sprintf("%s:_ranked", p.playerstats_id), ftos(CS(p).cvar_cl_allow_uidranking));
        }
 
        strfree(p.playerstats_id);
@@ -376,6 +378,10 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status)
                                        url_fputs(fh, sprintf("t %s\n", tt));
                                }
 
+                               // elo ranking enabled
+                               nn = db_get(PS_GR_OUT_DB, sprintf("%s:_ranked", p));
+                               if(nn != "") { url_fputs(fh, sprintf("r %s\n", nn)); }
+
                                // output player events
                                for(e = PS_GR_OUT_EVL; (en = db_get(PS_GR_OUT_DB, sprintf("*:%s", e))) != ""; e = en)
                                {
index e35115d3e54a51d8d81fc9e2c7cafd0e89f39f4b..488d44220b19e46ca047d18e11511e3d2d223e0b 100644 (file)
@@ -43,8 +43,12 @@ const int MAX_CL_STATS = 256;
 #endif
 
 #ifdef SVQC
+/// all the weapons actually spawned in the map, does not include filtered items
 vector weaponsInMap;
+/// all the weapons placed by the mapper (weaponreplace applied), ignores most filters
+vector weaponsInMapAll;
 #endif
+
 REGISTER_STAT(WEAPONS, vectori)
 REGISTER_STAT(WEAPONSINMAP, vectori, weaponsInMap)
 
@@ -183,12 +187,12 @@ REGISTER_STAT(BUGRIGS_SPEED_REF, float, g_bugrigs_speed_ref)
 REGISTER_STAT(BUGRIGS_STEER, float, g_bugrigs_steer)
 
 #ifdef SVQC
-int autocvar_sv_gameplayfix_downtracesupportsongroundflag;
-int autocvar_sv_gameplayfix_easierwaterjump;
-int autocvar_sv_gameplayfix_stepdown;
-int autocvar_sv_gameplayfix_stepmultipletimes;
-int autocvar_sv_gameplayfix_unstickplayers;
-int autocvar_sv_gameplayfix_fixedcheckwatertransition;
+int autocvar_sv_gameplayfix_downtracesupportsongroundflag = 1;
+int autocvar_sv_gameplayfix_easierwaterjump = 1;
+int autocvar_sv_gameplayfix_stepdown = 2;
+int autocvar_sv_gameplayfix_stepmultipletimes = 1;
+int autocvar_sv_gameplayfix_unstickplayers = 1;
+int autocvar_sv_gameplayfix_fixedcheckwatertransition = 1;
 #endif
 REGISTER_STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, int, autocvar_sv_gameplayfix_downtracesupportsongroundflag)
 REGISTER_STAT(GAMEPLAYFIX_EASIERWATERJUMP, int, autocvar_sv_gameplayfix_easierwaterjump)
@@ -325,7 +329,7 @@ REGISTER_STAT(MOVEVARS_AIRSTRAFEACCEL_QW, float)
 REGISTER_STAT(MOVEVARS_AIRCONTROL_POWER, float)
 REGISTER_STAT(MOVEVARS_AIRCONTROL_BACKWARDS, bool)
 REGISTER_STAT(MOVEVARS_AIRCONTROL_SIDEWARDS, bool)
-noref bool autocvar_sv_gameplayfix_nogravityonground;
+noref bool autocvar_sv_gameplayfix_nogravityonground = true;
 REGISTER_STAT(MOVEFLAGS, int, MOVEFLAG_VALID
                               | (autocvar_sv_gameplayfix_q2airaccelerate ? MOVEFLAG_Q2AIRACCELERATE : 0)
                               | (autocvar_sv_gameplayfix_nogravityonground ? MOVEFLAG_NOGRAVITYONGROUND : 0)
@@ -370,14 +374,6 @@ int autocvar_sv_wallclip;
 #endif
 REGISTER_STAT(MOVEVARS_WALLCLIP, int, autocvar_sv_wallclip)
 
-
-#ifdef CSQC
-noref int autocvar_cl_gunalign;
-#endif
-#ifdef SVQC
-.int cvar_cl_gunalign;
-#endif
-
 REGISTER_STAT(GUNALIGN, int)
 #ifdef SVQC
 SPECTATE_COPYFIELD(_STAT(GUNALIGN))
index cd3162e5c9809be6517cbc179b1c7b2a0d00d113..9d595b9591df90326e8d188c17ef2abfdc94f6ee 100644 (file)
@@ -356,8 +356,8 @@ bool ItemSend(entity this, entity to, int sf)
        {
                WriteShort(MSG_ENTITY, this.colormap);
                WriteByte(MSG_ENTITY, this.glowmod.x * 255.0);
-        WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
-        WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
+               WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
+               WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
        }
 
        if(sf & ISF_DROP)
@@ -402,7 +402,7 @@ bool have_pickup_item(entity this)
        return true;
 }
 
-void Item_Show (entity e, int mode)
+void Item_Show(entity e, int mode)
 {
        e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST);
        e.ItemStatus &= ~ITS_STAYWEP;
@@ -479,13 +479,13 @@ float Item_ItemsTime_UpdateTime(entity e, float t);
 void Item_ItemsTime_SetTime(entity e, float t);
 void Item_ItemsTime_SetTimesForAllPlayers();
 
-void Item_Respawn (entity this)
+void Item_Respawn(entity this)
 {
        Item_Show(this, 1);
        sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM);     // play respawn sound
        setorigin(this, this.origin);
 
-    if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
+       if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
        {
                float t = Item_ItemsTime_UpdateTime(this, 0);
                Item_ItemsTime_SetTime(this, t);
@@ -499,7 +499,7 @@ void Item_Respawn (entity this)
        Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
 }
 
-void Item_RespawnCountdown (entity this)
+void Item_RespawnCountdown(entity this)
 {
        if(this.item_respawncounter >= ITEM_RESPAWN_TICKS)
        {
@@ -624,7 +624,7 @@ float adjust_respawntime(float normal_respawntime) {
                }
        }
        TeamBalance_Destroy(balance);
-       
+
        if (players >= 2) {
                return normal_respawntime * (r / (players + o) + l);
        } else {
@@ -780,14 +780,14 @@ bool Item_GiveTo(entity item, entity player)
                }
        }
        bool pickedup = false;
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max));
-       pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max));
+       pickedup |= Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max);
+       pickedup |= Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max);
        if (item.itemdef.instanceOfWeaponPickup)
        {
                WepSet w;
@@ -1008,8 +1008,8 @@ void Item_FindTeam(entity this)
                });
 
                e = RandomSelection_chosen_ent;
-               e.state = 0;
-               Item_Show(e, 1);
+               if (!e)
+                       return;
 
                IL_EACH(g_items, it.team == this.team,
                {
@@ -1021,11 +1021,11 @@ void Item_FindTeam(entity this)
                                        Item_Show(it, -1);
                                        it.state = 1; // state 1 = initially hidden item, apparently
                                }
+                               else
+                                       Item_Reset(it);
                                it.effects &= ~EF_NODRAW;
                        }
                });
-
-               Item_Reset(this);
        }
 }
 
@@ -1172,7 +1172,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
 {
        string itemname = def.m_name;
        Model itemmodel = def.m_model;
-    Sound pickupsound = def.m_sound;
+       Sound pickupsound = def.m_sound;
        float(entity player, entity item) pickupevalfunc = def.m_pickupevalfunc;
        float pickupbasevalue = def.m_botvalue;
        int itemflags = def.m_itemflags;
@@ -1180,10 +1180,10 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
        startitem_failed = false;
 
        this.item_model_ent = itemmodel;
-    this.item_pickupsound_ent = pickupsound;
+       this.item_pickupsound_ent = pickupsound;
 
-    if(def.m_iteminit)
-       def.m_iteminit(def, this);
+       if(def.m_iteminit)
+               def.m_iteminit(def, this);
 
        if(!this.respawntime) // both need to be set
        {
@@ -1317,7 +1317,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
                        || (def.instanceOfHealth && def != ITEM_HealthSmall)
                        || (def.instanceOfArmor && def != ITEM_ArmorSmall)
                        || (itemid & (IT_KEY1 | IT_KEY2))
-               ) 
+               )
                {
                        if(!this.target || this.target == "")
                                this.target = "###item###"; // for finding the nearest item using findnearest
@@ -1360,7 +1360,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
        }
 
        this.state = 0;
-       if(this.team) // broken, no idea why.
+       if(this.team)
        {
                if(!this.cnt)
                        this.cnt = 1; // item probability weight
@@ -1477,9 +1477,6 @@ void target_items_use(entity this, entity actor, entity trigger)
 
 spawnfunc(target_items)
 {
-       int n;
-       string s;
-
        this.use = target_items_use;
        if(!this.strength_finished)
                this.strength_finished = autocvar_g_balance_powerup_strength_time;
@@ -1488,7 +1485,7 @@ spawnfunc(target_items)
        if(!this.superweapons_finished)
                this.superweapons_finished = autocvar_g_balance_superweapons_time;
 
-       n = tokenize_console(this.netname);
+       int n = tokenize_console(this.netname);
        if(argv(0) == "give")
        {
                this.netname = substring(this.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1));
@@ -1497,8 +1494,9 @@ spawnfunc(target_items)
        {
                for(int j = 0; j < n; ++j)
                {
-                       if     (argv(j) == "unlimited_ammo")         this.items |= IT_UNLIMITED_BOTH;
-                       else if(argv(j) == "unlimited_weapon_ammo")  this.items |= IT_UNLIMITED_WEAPON_AMMO;
+                       // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
+                       if     (argv(j) == "unlimited_ammo")         this.items |= IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS;
+                       else if(argv(j) == "unlimited_weapon_ammo")  this.items |= IT_UNLIMITED_AMMO;
                        else if(argv(j) == "unlimited_superweapons") this.items |= IT_UNLIMITED_SUPERWEAPONS;
                        else if(argv(j) == "strength")               this.items |= ITEM_Strength.m_itemid;
                        else if(argv(j) == "invincible")             this.items |= ITEM_Shield.m_itemid;
@@ -1509,7 +1507,7 @@ spawnfunc(target_items)
                        {
                                FOREACH(Buffs, it != BUFF_Null,
                                {
-                                       s = Buff_UndeprecateName(argv(j));
+                                       string s = Buff_UndeprecateName(argv(j));
                                        if(s == it.netname)
                                        {
                                                STAT(BUFFS, this) |= (it.m_itemid);
@@ -1519,7 +1517,7 @@ spawnfunc(target_items)
                                        }
                                });
                                FOREACH(Weapons, it != WEP_Null, {
-                                       s = W_UndeprecateName(argv(j));
+                                       string s = W_UndeprecateName(argv(j));
                                        if(s == it.netname)
                                        {
                                                STAT(WEAPONS, this) |= (it.m_wepset);
@@ -1559,7 +1557,7 @@ spawnfunc(target_items)
                }
 
                this.netname = "";
-               this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & IT_UNLIMITED_WEAPON_AMMO), "unlimited_weapon_ammo");
+               this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & IT_UNLIMITED_AMMO), "unlimited_weapon_ammo");
                this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, boolean(this.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons");
                this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, this.strength_finished * boolean(this.items & ITEM_Strength.m_itemid), "strength");
                this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, this.invincible_finished * boolean(this.items & ITEM_Shield.m_itemid), "invincible");
@@ -1584,8 +1582,8 @@ spawnfunc(target_items)
        for(int j = 0; j < n; ++j)
        {
                FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, {
-            it.wr_init(it);
-            break;
+                       it.wr_init(it);
+                       break;
                });
        }
 }
@@ -1763,7 +1761,7 @@ float GiveItems(entity e, float beginarg, float endarg)
                                got += GiveValue(e, strength_finished, op, val);
                                got += GiveValue(e, invincible_finished, op, val);
                                got += GiveValue(e, superweapons_finished, op, val);
-                               got += GiveBit(e, items, IT_UNLIMITED_BOTH, op, val);
+                               got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
                        case "all":
                                got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val);
                                got += GiveResourceValue(e, RES_HEALTH, op, val);
@@ -1781,10 +1779,11 @@ float GiveItems(entity e, float beginarg, float endarg)
                                got += GiveResourceValue(e, RES_FUEL, op, val);
                                break;
                        case "unlimited_ammo":
-                               got += GiveBit(e, items, IT_UNLIMITED_BOTH, op, val);
+                               // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
+                               got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
                                break;
                        case "unlimited_weapon_ammo":
-                               got += GiveBit(e, items, IT_UNLIMITED_WEAPON_AMMO, op, val);
+                               got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
                                break;
                        case "unlimited_superweapons":
                                got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val);
@@ -1847,7 +1846,7 @@ float GiveItems(entity e, float beginarg, float endarg)
 
        POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, SND_ITEMPICKUP, SND_Null);
        POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, SND_POWERUP, SND_POWEROFF);
-       POSTGIVE_BIT(e, items, IT_UNLIMITED_WEAPON_AMMO, SND_POWERUP, SND_POWEROFF);
+       POSTGIVE_BIT(e, items, IT_UNLIMITED_AMMO, SND_POWERUP, SND_POWEROFF);
        POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, SND_ITEMPICKUP, SND_Null);
        FOREACH(Weapons, it != WEP_Null, {
                POSTGIVE_WEAPON(e, it, SND_WEAPONPICKUP, SND_Null);
index a0321c2444961234305f7689ef5d32b8d0008685..5c916866f8691f840d34f43ccdf39a51a7d5f95c 100644 (file)
@@ -1,6 +1,6 @@
 #pragma once
 
-const int AMMO_COUNT = 4; // amount of ammo types to show in the inventory panel
+const int AMMO_COUNT = 4; // amount of ammo types to show in the ammo panel
 
 // item networking
 const int ISF_LOCATION                         = BIT(1);
index 0a3627631139a250552448dbf48f54870ae9a332..6b5b4fae803ce103d0846f783201e27a6c430788 100644 (file)
@@ -42,7 +42,7 @@ METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity
         beam.attack_finished_single[0] = actor.attack_finished_single[0];
         actor.attack_finished_single[0] = time; // + autocvar_sys_ticrate;
 
-        setattachment(beam,actor.tur_head, "tag_fire");
+        setattachment(beam, actor.tur_head, "tag_fire");
 
         soundat (actor, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
         if (!isPlayer)
@@ -53,17 +53,18 @@ METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity
 
 void beam_think(entity this)
 {
-    if ((time > this.cnt) || (IS_DEAD(this.owner)))
+    entity actor = this.owner;
+    if ((time > this.cnt) || (IS_DEAD(actor)))
     {
-        this.owner.attack_finished_single[0] = time + this.owner.shot_refire;
-        this.owner.fireflag = 2;
-        this.owner.tur_head.frame = 10;
+        actor.attack_finished_single[0] = time + actor.shot_refire;
+        actor.fireflag = 2;
+        actor.tur_head.frame = 10;
         sound (this, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
         delete(this);
         return;
     }
 
-    turret_do_updates(this.owner);
+    turret_do_updates(actor);
 
     if (time - this.shot_spread > 0)
     {
@@ -71,20 +72,18 @@ void beam_think(entity this)
         sound (this, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
     }
 
-
     this.nextthink = time + this.ticrate;
 
-    this.owner.attack_finished_single[0] = time + frametime;
-    FireImoBeam (   this.owner, this.tur_shotorg,
-                    this.tur_shotorg + this.tur_shotdir_updated * this.target_range,
-                    '-1 -1 -1' * this.shot_radius,
-                    '1 1 1' * this.shot_radius,
-                    this.shot_force,
+    actor.attack_finished_single[0] = time + frametime;
+    FireImoBeam (   actor, actor.tur_shotorg,
+                    actor.tur_shotorg + actor.tur_shotdir_updated * actor.target_range,
+                    '-1 -1 -1' * actor.shot_radius,
+                    '1 1 1' * actor.shot_radius,
+                    actor.shot_force,
                     this.shot_dmg,
                     0.75,
                     DEATH_TURRET_PHASER.m_id);
-    this.scale = vlen(this.owner.tur_shotorg - trace_endpos) / 256;
-
+    this.scale = vlen(actor.tur_shotorg - trace_endpos) / 256;
 }
 
 #endif
index 817487c6d631d9c023c26d3581abb39244c3f486..6857ccad8dd8bc603637ff112e6e0e0cfc95d443 100644 (file)
@@ -28,72 +28,88 @@ void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax
                                  float bforce, float f_dmg, float f_velfactor, int deathtype)
 
 {
-       vector hitloc, force, endpoint, dir;
-       entity ent;
-
-       dir = normalize(end - start);
-       force = dir * bforce;
+       vector dir = normalize(end - start);
+       vector force = dir * bforce;
 
        // go a little bit into the wall because we need to hit this wall later
        end = end + dir;
 
        // trace multiple times until we hit a wall, each obstacle will be made unsolid.
        // note down which entities were hit so we can damage them later
+       entity o = this;
        while (1)
        {
-               tracebox(start, smin, smax, end, false, this);
+               if(CS(this).antilag_debug)
+                       WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, CS(this).antilag_debug);
+               else
+                       WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, ANTILAG_LATENCY(this));
+               if(o && WarpZone_trace_firstzone)
+               {
+                       o = NULL;
+                       continue;
+               }
 
                // if it is NULL we can't hurt it so stop now
                if (trace_ent == NULL || trace_fraction == 1)
                        break;
 
-               if (trace_ent.solid == SOLID_BSP)
-                       break;
-
                // make the entity non-solid so we can hit the next one
+               IL_PUSH(g_railgunhit, trace_ent);
                trace_ent.railgunhit = true;
                trace_ent.railgunhitloc = end;
                trace_ent.railgunhitsolidbackup = trace_ent.solid;
+               trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start);
+               trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force);
 
                // stop if this is a wall
+               if (trace_ent.solid == SOLID_BSP)
+                       break;
 
                // make the entity non-solid
                trace_ent.solid = SOLID_NOT;
        }
 
-       endpoint = trace_endpos;
+       vector endpoint = trace_endpos;
+       entity endent = trace_ent;
+       float endq3surfaceflags = trace_dphitq3surfaceflags;
 
        // find all the entities the railgun hit and restore their solid state
-       ent = findfloat(NULL, railgunhit, true);
-       while (ent)
+       IL_EACH(g_railgunhit, it.railgunhit,
        {
-               // restore their solid type
-               ent.solid = ent.railgunhitsolidbackup;
-               ent = findfloat(ent, railgunhit, true);
-       }
+               it.solid = it.railgunhitsolidbackup;
+       });
+
+       /*
+               Unlike the railgun, this does NOT check for targets close by
+       */
 
        // find all the entities the railgun hit and hurt them
-       ent = findfloat(NULL, railgunhit, true);
-       while (ent)
+       IL_EACH(g_railgunhit, it.railgunhit,
        {
-               // get the details we need to call the damage function
-               hitloc = ent.railgunhitloc;
-               ent.railgunhitloc = '0 0 0';
-               ent.railgunhitsolidbackup = SOLID_NOT;
-               ent.railgunhit = false;
+               // removal from the list is handled below
+               /* no falloff applied */
 
                // apply the damage
-               if (ent.takedamage)
+               if (it.takedamage)
                {
-                       Damage (ent, this, this, f_dmg, deathtype, DMG_NOWEP, hitloc, force);
-                       ent.velocity = ent.velocity * f_velfactor;
-                       //ent.alpha = 0.25 + random() * 0.75;
+                       Damage(it, this, this, f_dmg, deathtype, DMG_NOWEP, it.railgunhitloc, it.railgunforce);
+                       // slow down the target
+                       it.velocity = it.velocity * f_velfactor;
                }
 
-               // advance to the next entity
-               ent = findfloat(ent, railgunhit, true);
-       }
+               it.railgunhitloc = '0 0 0';
+               it.railgunhitsolidbackup = SOLID_NOT;
+               it.railgunhit = false;
+               it.railgundistance = 0;
+       });
+
+       IL_CLEAR(g_railgunhit);
+
+       /* no accuracy, as a weapon entity is not attached */
+
        trace_endpos = endpoint;
+       trace_ent = endent;
+       trace_dphitq3surfaceflags = endq3surfaceflags;
 }
 
 #ifdef TURRET_DEBUG
index 7713679f3ce57a2cbaa1deb6cd9f663a3245e6d0..d9b9efcde36444c8d06b804b5dd60ad80c0ec237 100644 (file)
@@ -316,20 +316,7 @@ string ScoreString(int pFlags, float pValue)
        if((pValue == 0) && (pFlags & (SFL_HIDE_ZERO | SFL_RANK | SFL_TIME)))
                valstr = "";
        else if(pFlags & SFL_RANK)
-       {
-               valstr = ftos(pValue);
-               l = strlen(valstr);
-               if((l >= 2) && (substring(valstr, l - 2, 1) == "1"))
-                       valstr = strcat(valstr, "th");
-               else if(substring(valstr, l - 1, 1) == "1")
-                       valstr = strcat(valstr, "st");
-               else if(substring(valstr, l - 1, 1) == "2")
-                       valstr = strcat(valstr, "nd");
-               else if(substring(valstr, l - 1, 1) == "3")
-                       valstr = strcat(valstr, "rd");
-               else
-                       valstr = strcat(valstr, "th");
-       }
+               valstr = count_ordinal(pValue);
        else if(pFlags & SFL_TIME)
                valstr = TIME_ENCODED_TOSTRING(pValue);
        else
index 2033aa94b7eeeaa7a226ac516757cfbac84cd0cd..756e02cf51ffeb8aa85970233bfe7007d60818b9 100644 (file)
@@ -201,7 +201,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t
        #else
                #define GENTLE autocvar_sv_gentle
        #endif
-       #define normal_or_gentle(normal, gentle) (GENTLE ? ((gentle != "") ? gentle : normal) : normal)
+       #define normal_or_gentle(normal, gentle) ((GENTLE && (gentle != "")) ? gentle : normal)
 #endif
 
 #ifdef GAMEQC
index c8e47dabc20ea7efdb3b55b6c71ac86fbe49453d..6785a9f21536b0dc1f312cdb65bdae9bdc405f97 100644 (file)
@@ -777,17 +777,12 @@ void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpa
 
        if(this.play_time < time)
        {
-               float wc = vlen(this.velocity - this.oldvelocity);
-               //dprint("oldvel: ", vtos(this.oldvelocity), "\n");
-               //dprint("vel: ", vtos(this.velocity), "\n");
-               if(_minspeed < wc)
+               if(vdist(this.velocity - this.oldvelocity, >, _minspeed))
                {
+                       float wc = vlen(this.velocity - this.oldvelocity);
                        float take = min(_speedfac * wc, _maxpain);
-                       Damage (this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
+                       Damage(this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
                        this.play_time = time + 0.25;
-
-                       //dprint("wc: ", ftos(wc), "\n");
-                       //dprint("take: ", ftos(take), "\n");
                }
        }
 }
@@ -924,12 +919,12 @@ void vehicles_touch(entity this, entity toucher)
        // Vehicle currently in use
        if(this.owner)
        {
-               if(!weaponLocked(this.owner))
                if(toucher != NULL)
                if((this.origin_z + this.maxs_z) > (toucher.origin_z))
                if(vehicles_crushable(toucher))
+               if(!weaponLocked(this.owner))
                {
-                       if(vdist(this.velocity, >=, 30))
+                       if(vdist(this.velocity, >=, autocvar_g_vehicles_crush_minspeed))
                                Damage(toucher, this, this.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, DMG_NOWEP, '0 0 0', normalize(toucher.origin - this.origin) * autocvar_g_vehicles_crush_force);
 
                        return; // Dont do selfdamage when hitting "soft targets".
index 9870814d30e4e3287c39adf4f8fd3938b9b2bd6f..0d707b52fc15af238e7f156772b12a0d58f929fb 100644 (file)
@@ -12,6 +12,7 @@ AUTOCVAR(g_vehicles_steal, bool, true, "allow stealing enemy vehicles in teampla
 AUTOCVAR(g_vehicles_steal_show_waypoint, bool, true, "show a waypoint above the thief");
 float autocvar_g_vehicles_crush_dmg = 70;
 float autocvar_g_vehicles_crush_force = 50;
+float autocvar_g_vehicles_crush_minspeed = 100;
 bool autocvar_g_vehicles_delayspawn = true;
 float autocvar_g_vehicles_delayspawn_jitter = 10;
 float autocvar_g_vehicles_allow_bots;
index 6efb21495bbaed25831066aba3eddc9c91c24c18..5948d6a12e2831e0fcaf2f340cd7ae781ee72ce7 100644 (file)
@@ -232,7 +232,7 @@ void W_Arc_Beam_Think(entity this)
                }
 
                if(this == own.(weaponentity).arc_beam) { own.(weaponentity).arc_beam = NULL; }
-               if(!thiswep.wr_checkammo1(thiswep, own, weaponentity) && !(own.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!thiswep.wr_checkammo1(thiswep, own, weaponentity) && !(own.items & IT_UNLIMITED_AMMO))
                {
                        // note: this doesn't force the switch
                        W_SwitchToOtherWeapon(own, weaponentity);
@@ -244,7 +244,7 @@ void W_Arc_Beam_Think(entity this)
 
        // decrease ammo
        float coefficient = frametime;
-       if(!(own.items & IT_UNLIMITED_WEAPON_AMMO))
+       if(!(own.items & IT_UNLIMITED_AMMO))
        {
                float rootammo;
                if(burst)
index 3589146352e18d6fe74b3616147cc6233b3d7958..a69f43fbd3f7afbdd01bca9d88707ee5255c5729 100644 (file)
@@ -43,9 +43,15 @@ void W_Crylink_Dequeue(entity e)
        W_Crylink_Dequeue_Raw(e.crylink_owner, e.queueprev, e, e.queuenext);
 }
 
+void W_Crylink_DeleteLink(entity this)
+{
+       if(this.classname != "spike_oktoremove")
+               W_Crylink_Dequeue(this);
+       delete_fn(this);
+}
+
 void W_Crylink_Reset(entity this)
 {
-       W_Crylink_Dequeue(this);
        delete(this);
 }
 
@@ -263,7 +269,6 @@ void W_Crylink_Touch(entity this, entity toucher)
        else if(finalhit)
        {
                // just unlink
-               W_Crylink_Dequeue(this);
                delete(this);
                return;
        }
@@ -278,7 +283,6 @@ void W_Crylink_Touch(entity this, entity toucher)
 
 void W_Crylink_Fadethink(entity this)
 {
-       W_Crylink_Dequeue(this);
        delete(this);
 }
 
@@ -308,6 +312,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity)
        for(counter = 0; counter < shots; ++counter)
        {
                proj = new(spike);
+               proj.dtor = W_Crylink_DeleteLink;
                proj.reset = W_Crylink_Reset;
                proj.realowner = proj.owner = actor;
                proj.crylink_owner = actor;
@@ -420,6 +425,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
        for(counter = 0; counter < shots; ++counter)
        {
                proj = new(spike);
+               proj.dtor = W_Crylink_DeleteLink;
                proj.weaponentity_fld = weaponentity;
                proj.reset = W_Crylink_Reset;
                proj.realowner = proj.owner = actor;
@@ -568,7 +574,7 @@ METHOD(Crylink, wr_think, void(entity thiswep, entity actor, .entity weaponentit
             }
             actor.(weaponentity).crylink_waitrelease = 0;
             if(!thiswep.wr_checkammo1(thiswep, actor, weaponentity) && !thiswep.wr_checkammo2(thiswep, actor, weaponentity))
-            if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+            if(!(actor.items & IT_UNLIMITED_AMMO))
             {
                 // ran out of ammo!
                 actor.cnt = thiswep.m_id;
index 5654488ddb065d4e9aeb49b8f95cda1889de2132..fce84c3b8eb88cc3d0b36a37861a361e5810f103 100644 (file)
@@ -47,7 +47,7 @@ void W_Devastator_Explode(entity this, entity directhitentity)
        if(this.realowner.(weaponentity).m_weapon == thiswep)
        {
                if(GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(devastator, ammo))
-               if(!(this.realowner.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!(this.realowner.items & IT_UNLIMITED_AMMO))
                {
                        this.realowner.cnt = thiswep.m_id;
                        ATTACK_FINISHED(this.realowner, weaponentity) = time;
@@ -71,8 +71,11 @@ void W_Devastator_DoRemoteExplode(entity this, .entity weaponentity)
 
        bool handled_as_rocketjump = false;
        entity head = NULL;
+       bool allow_rocketjump = WEP_CVAR(devastator, remote_jump);
+       MUTATOR_CALLHOOK(AllowRocketJumping, allow_rocketjump);
+       allow_rocketjump = M_ARGV(0, bool);
 
-       if(WEP_CVAR(devastator, remote_jump_radius))
+       if(allow_rocketjump && WEP_CVAR(devastator, remote_jump_radius))
        {
                head = WarpZone_FindRadius(
                        this.origin,
@@ -140,7 +143,7 @@ void W_Devastator_DoRemoteExplode(entity this, .entity weaponentity)
        if(this.realowner.(weaponentity).m_weapon == thiswep)
        {
                if(GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(devastator, ammo))
-               if(!(this.realowner.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!(this.realowner.items & IT_UNLIMITED_AMMO))
                {
                        this.realowner.cnt = thiswep.m_id;
                        ATTACK_FINISHED(this.realowner, weaponentity) = time;
@@ -314,7 +317,7 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int
        if(WEP_CVAR(devastator, detonatedelay) >= 0)
                missile.spawnshieldtime = time + WEP_CVAR(devastator, detonatedelay);
        else
-               missile.spawnshieldtime = -1;
+               missile.spawnshieldtime = -1; // NOTE: proximity based when rocket jumping
        missile.pushltime = time + WEP_CVAR(devastator, guidedelay);
        missile.classname = "rocket";
        missile.bot_dodge = true;
index 33814a5e1e0c3c3cda5b384e3fb272e08ee4d3e7..679f75499a3dfd1f4abaf82c64dfb19f4ea276ed 100644 (file)
@@ -40,6 +40,7 @@ CLASS(Devastator, Weapon)
         P(class, prefix, remote_damage, float, NONE) \
         P(class, prefix, remote_edgedamage, float, NONE) \
         P(class, prefix, remote_force, float, NONE) \
+        P(class, prefix, remote_jump, float, NONE) \
         P(class, prefix, remote_jump_damage, float, NONE) \
         P(class, prefix, remote_jump_force, float, NONE) \
         P(class, prefix, remote_jump_radius, float, NONE) \
index 51699bf0cdc560a981cf7cb5d9abdcec4998585c..0ffa0c74d973b92f00f9c5fb4b06b22a522f0704 100644 (file)
@@ -264,7 +264,7 @@ void W_Hagar_Attack2_Load(Weapon thiswep, entity actor, .entity weaponentity)
 
        // this is different than WR_CHECKAMMO when it comes to reloading
        bool enough_ammo;
-       if(actor.items & IT_UNLIMITED_WEAPON_AMMO)
+       if(actor.items & IT_UNLIMITED_AMMO)
                enough_ammo = true;
        else if(autocvar_g_balance_hagar_reload_ammo)
                enough_ammo = actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR_SEC(hagar, ammo);
@@ -352,7 +352,7 @@ void W_Hagar_Attack2_Load(Weapon thiswep, entity actor, .entity weaponentity)
 
                // we aren't checking ammo during an attack, so we must do it here
                if(!(thiswep.wr_checkammo1(thiswep, actor, weaponentity) + thiswep.wr_checkammo2(thiswep, actor, weaponentity)))
-               if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!(actor.items & IT_UNLIMITED_AMMO))
                {
                        // note: this doesn't force the switch
                        W_SwitchToOtherWeapon(actor, weaponentity);
@@ -370,7 +370,7 @@ void W_Hagar_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity, int
        }
 
        if(!thiswep.wr_checkammo1(thiswep, actor, weaponentity))
-       if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       if(!(actor.items & IT_UNLIMITED_AMMO))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
index 8498597634bbcf7c689e1b5adcf2d480b75c0ff1..6511d22b572b4fab5938c035aea73d2e18dec6a2 100644 (file)
@@ -127,7 +127,7 @@ void W_HLAC_Attack_Frame(Weapon thiswep, entity actor, .entity weaponentity, int
        if(PHYS_INPUT_BUTTON_ATCK(actor))
        {
                if(!thiswep.wr_checkammo1(thiswep, actor, weaponentity))
-               if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!(actor.items & IT_UNLIMITED_AMMO))
                {
                        W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                        w_ready(thiswep, actor, weaponentity, fire);
index d8cebd740ac49fc3daf8ec2c5d5111e30f27a740..d9e11dc012fb9d2736a0f04a56853d4ab9c9e14d 100644 (file)
@@ -145,7 +145,7 @@ METHOD(Hook, wr_think, void(entity thiswep, entity actor, .entity weaponentity,
         actor.(weaponentity).hook_refire = max(actor.(weaponentity).hook_refire, time + WEP_CVAR_PRI(hook, refire) * W_WeaponRateFactor(actor));
 
         // hook also inhibits health regeneration, but only for 1 second
-        if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+        if(!(actor.items & IT_UNLIMITED_AMMO))
             actor.pauseregen_finished = max(actor.pauseregen_finished, time + autocvar_g_balance_pause_fuel_regen);
     }
 
@@ -163,7 +163,7 @@ METHOD(Hook, wr_think, void(entity thiswep, entity actor, .entity weaponentity,
         {
             if( time > actor.(weaponentity).hook_time_fueldecrease )
             {
-                if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+                if(!(actor.items & IT_UNLIMITED_AMMO))
                 {
                     if( GetResource(actor, RES_FUEL) >= (time - actor.(weaponentity).hook_time_fueldecrease) * hooked_fuel )
                     {
index 2d88a9deb29fc65189487f9006d34ee6fcba2751..86de79f600603d02f84bab06858b5dc533b42508 100644 (file)
@@ -2,15 +2,6 @@
 
 #ifdef SVQC
 
-METHOD(MachineGun, m_spawnfunc_hookreplace, Weapon(MachineGun this, entity e))
-{
-       if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e))
-       {
-               return WEP_SHOCKWAVE;
-       }
-       return this;
-}
-
 void W_MachineGun_MuzzleFlash_Think(entity this)
 {
        this.frame += 2;
@@ -93,7 +84,7 @@ void W_MachineGun_Attack_Frame(Weapon thiswep, entity actor, .entity weaponentit
        if(PHYS_INPUT_BUTTON_ATCK(actor))
        {
                if(!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
-               if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+               if(!(actor.items & IT_UNLIMITED_AMMO))
                {
                        W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                        w_ready(thiswep, actor, weaponentity, fire);
@@ -119,7 +110,7 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity
        }
 
        if(!thiswep.wr_checkammo1(thiswep, actor, weaponentity))
-       if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       if(!(actor.items & IT_UNLIMITED_AMMO))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
@@ -199,10 +190,14 @@ METHOD(MachineGun, wr_aim, void(entity thiswep, entity actor, .entity weaponenti
 }
 METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
 {
-    if(WEP_CVAR(machinegun, reload_ammo) && actor.(weaponentity).clip_load < min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo))) { // forced reload
+    // forced reload - wait until the bulletcounter is 0 so a burst loop can finish
+    if(WEP_CVAR(machinegun, reload_ammo)
+        && actor.(weaponentity).clip_load < min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo))
+        && actor.(weaponentity).misc_bulletcounter >= 0)
+    {
         thiswep.wr_reload(thiswep, actor, weaponentity);
-    } else
-    if(WEP_CVAR(machinegun, mode) == 1)
+    }
+    else if(WEP_CVAR(machinegun, mode) == 1)
     {
         if(fire & 1)
         if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0))
@@ -211,20 +206,39 @@ METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponen
             W_MachineGun_Attack_Auto(thiswep, actor, weaponentity, fire);
         }
 
+        // You can "shoot" more rounds than what's "used", and vice versa.
         if(fire & 2)
         if(weapon_prepareattack(thiswep, actor, weaponentity, true, 0))
         {
             if(!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
-            if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+            if(!(actor.items & IT_UNLIMITED_AMMO))
             {
                 W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                 w_ready(thiswep, actor, weaponentity, fire);
                 return;
             }
 
-            W_DecreaseAmmo(thiswep, actor, WEP_CVAR(machinegun, burst_ammo), weaponentity);
+            float ammo_available;
+            if (WEP_CVAR(machinegun, reload_ammo) > 0)
+            {
+                ammo_available = actor.(weaponentity).clip_load;
+            }
+            else
+            {
+                ammo_available = GetResource(actor, thiswep.ammo_type);
+            }
 
-            actor.(weaponentity).misc_bulletcounter = WEP_CVAR(machinegun, burst) * -1;
+            // We don't want to shoot 3 rounds if there's 2 left in the mag, so we'll use a fraction.
+            // Also keep the fraction <= 1 otherwise we'd mag dump in one burst.
+            float burst_fraction = min(1, ammo_available / WEP_CVAR(machinegun, burst_ammo));
+            int to_shoot = floor(WEP_CVAR(machinegun, burst) * burst_fraction);
+
+            // We also don't want to use 3 rounds if there's only 2 left.
+            int to_use = min(WEP_CVAR(machinegun, burst_ammo), ammo_available);
+            W_DecreaseAmmo(thiswep, actor, to_use, weaponentity);
+
+            // Bursting counts up to 0 from a negative.
+            actor.(weaponentity).misc_bulletcounter = -to_shoot;
             W_MachineGun_Attack_Burst(thiswep, actor, weaponentity, fire);
         }
     }
@@ -268,15 +282,16 @@ METHOD(MachineGun, wr_checkammo1, bool(entity thiswep, entity actor, .entity wea
 METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor, .entity weaponentity))
 {
     float ammo_amount;
+    float burst_ammo_per_shot = WEP_CVAR(machinegun, burst_ammo) / WEP_CVAR(machinegun, burst);
     if(WEP_CVAR(machinegun, mode) == 1)
-        ammo_amount = GetResource(actor, thiswep.ammo_type) >= WEP_CVAR(machinegun, burst_ammo);
+        ammo_amount = GetResource(actor, thiswep.ammo_type) >= burst_ammo_per_shot;
     else
         ammo_amount = GetResource(actor, thiswep.ammo_type) >= WEP_CVAR(machinegun, first_ammo);
 
     if(WEP_CVAR(machinegun, reload_ammo))
     {
         if(WEP_CVAR(machinegun, mode) == 1)
-            ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR(machinegun, burst_ammo);
+            ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= burst_ammo_per_shot;
         else
             ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR(machinegun, first_ammo);
     }
@@ -284,6 +299,8 @@ METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor, .entity wea
 }
 METHOD(MachineGun, wr_reload, void(entity thiswep, entity actor, .entity weaponentity))
 {
+       if(actor.(weaponentity).misc_bulletcounter < 0)
+               return;
     W_Reload(actor, weaponentity, min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), SND_RELOAD);
 }
 METHOD(MachineGun, wr_suicidemessage, Notification(entity thiswep))
index 648535eac08e29d216ab8d242a75faf3cd51edce..d7ba289f5ca7ee9f1e92669a9fd5098b93791771 100644 (file)
@@ -342,13 +342,11 @@ void W_Seeker_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 
 void W_Seeker_Vollycontroller_Think(entity this) // TODO: Merge this with W_Seeker_Attack
 {
-       float c;
-       entity oldenemy;
        this.cnt = this.cnt - 1;
 
        Weapon thiswep = WEP_SEEKER;
        .entity weaponentity = this.weaponentity_fld;
-       if((!(this.realowner.items & IT_UNLIMITED_BOTH) && GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(seeker, missile_ammo)) || (this.cnt <= -1) || (IS_DEAD(this.realowner)) || (this.realowner.(weaponentity).m_switchweapon != thiswep))
+       if((!(this.realowner.items & IT_UNLIMITED_AMMO) && GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(seeker, missile_ammo)) || (this.cnt <= -1) || (IS_DEAD(this.realowner)) || (this.realowner.(weaponentity).m_switchweapon != thiswep))
        {
                delete(this);
                return;
@@ -358,11 +356,10 @@ void W_Seeker_Vollycontroller_Think(entity this) // TODO: Merge this with W_Seek
 
        entity own = this.realowner;
 
-       oldenemy = own.enemy;
+       entity oldenemy = own.enemy;
        own.enemy = this.enemy;
 
-       c = own.cnt % 4;
-       switch(c)
+       switch(own.cnt % 4)
        {
                case 0:
                        W_Seeker_Fire_Missile(thiswep, own, weaponentity, '-1.25 -3.75 0', own.enemy); // TODO
index 9b1dd6c0b8536b31029d7c87771d4806a6a9ee3b..74986f9cc96be069154ee8c5dd35419cf07c6b85 100644 (file)
@@ -3,6 +3,8 @@
 REGISTER_NET_TEMP(TE_CSQC_SHOCKWAVEPARTICLE)
 
 #ifdef SVQC
+// enable when shockwave replaces shotgun
+#if 0
 METHOD(Shockwave, m_spawnfunc_hookreplace, Weapon(Shockwave this, entity e))
 {
        //if(autocvar_sv_q3acompat_machineshockwaveswap) // WEAPONTODO
@@ -12,6 +14,7 @@ METHOD(Shockwave, m_spawnfunc_hookreplace, Weapon(Shockwave this, entity e))
        }
        return this;
 }
+#endif
 
 const float MAX_SHOCKWAVE_HITS = 10;
 //#define DEBUG_SHOCKWAVE
index a3bf16145ac438c8e5cc9d9150e0a9646f86379b..e2f4b640aa1b818f3a6b7640c9cf7be2d61c93b2 100644 (file)
@@ -2,13 +2,31 @@
 
 #ifdef SVQC
 
+METHOD(Shotgun, m_spawnfunc_hookreplace, Weapon(Shotgun this, entity e))
+{
+       if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e))
+       {
+               return WEP_MACHINEGUN;
+       }
+       return this;
+}
+
 void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float isprimary, float ammocount, float damage, float bullets, float spread, float solidpenetration, float force, entity bullet_trail_effect)
 {
        W_DecreaseAmmo(thiswep, actor, ammocount, weaponentity);
 
        W_SetupShot(actor, weaponentity, true, 5, SND_SHOTGUN_FIRE, ((isprimary) ? CH_WEAPON_A : CH_WEAPON_SINGLE), damage * bullets, thiswep.m_id);
+
+       // TRICK: do the antilag outside the regular fireBullet function, so it isn't performed unnecessarily on every single bullet!
+       float lag = antilag_getlag(actor);
+       if(lag && bullets > 0)
+               antilag_takeback_all(actor, lag);
+
        for(int sc = 0;sc < bullets;sc = sc + 1)
-               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, force, thiswep.m_id, bullet_trail_effect);
+               fireBullet_antilag(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, force, thiswep.m_id, bullet_trail_effect, false);
+       
+       if(lag && bullets > 0)
+               antilag_restore_all(actor);
 
        Send_Effect(EFFECT_SHOTGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, ammocount);
 
@@ -144,7 +162,7 @@ void W_Shotgun_Attack2(Weapon thiswep, entity actor, .entity weaponentity, int f
 void W_Shotgun_Attack3_Frame2(Weapon thiswep, entity actor, .entity weaponentity, int fire)
 {
        if (!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
-       if (!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       if (!(actor.items & IT_UNLIMITED_AMMO))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
@@ -165,7 +183,7 @@ void W_Shotgun_Attack3_Frame2(Weapon thiswep, entity actor, .entity weaponentity
 void W_Shotgun_Attack3_Frame1(Weapon thiswep, entity actor, .entity weaponentity, int fire)
 {
        if (!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
-       if (!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+       if (!(actor.items & IT_UNLIMITED_AMMO))
        {
                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
                w_ready(thiswep, actor, weaponentity, fire);
@@ -245,7 +263,7 @@ METHOD(Shotgun, wr_think, void(entity thiswep, entity actor, .entity weaponentit
     }
     if(actor.(weaponentity).clip_load >= 0) // we are not currently reloading
     if(WEP_CVAR(shotgun, secondary) == 1)
-    if(((fire & 1) && GetResource(actor, thiswep.ammo_type) <= 0 && !(actor.items & IT_UNLIMITED_WEAPON_AMMO)) || (fire & 2))
+    if(((fire & 1) && GetResource(actor, thiswep.ammo_type) <= 0 && !(actor.items & IT_UNLIMITED_AMMO)) || (fire & 2))
     if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(shotgun, refire)))
     {
         // attempt forcing playback of the anim by switching to another anim (that we never play) here...
index af7fac624195caa439ff0b54266f12ac80186353..46fd4d8c0887639b8b8c32e8b116c0f60ff4538e 100644 (file)
@@ -230,7 +230,7 @@ METHOD(Vortex, wr_think, void(entity thiswep, entity actor, .entity weaponentity
                         if(fire & 2) // only eat ammo when the button is pressed
                         {
                             dt = min(dt, (1 - actor.(weaponentity).vortex_charge) / WEP_CVAR(vortex, charge_rate));
-                            if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+                            if(!(actor.items & IT_UNLIMITED_AMMO))
                             {
                                 // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
                                 if(autocvar_g_balance_vortex_reload_ammo)
index 9193c4ef1638af9dd797acfe8e666ae9f2d2c1df..38ef3bd1f7d4c5303e5f639f5c6306711d1385ba 100644 (file)
@@ -73,6 +73,10 @@ MACRO_END
     PROP(false, clip_size, WEPENT_SET_NORMAL, \
        { WriteShort(chan, this.clip_size); }, \
        { (viewmodels[this.m_wepent_slot]).clip_size = ReadShort(); }) \
+    \
+    PROP(false, skin, WEPENT_SET_NORMAL, \
+       { WriteShort(chan, this.skin); }, \
+       { (viewmodels[this.m_wepent_slot]).m_skin = ReadShort(); }) \
     \
        /**/
 
index 556f58194f5ed5298d52f0aad3f4e6ca3f046e2a..6d7128c33ca27323d91cd6ba8685fb6ca61ac0e4 100644 (file)
@@ -37,6 +37,8 @@ REGISTER_NET_TEMP(CLIENT_WEPENT)
 
        .float m_alpha;
 
+       .int m_skin;
+
        // only for Porto
        .bool angles_held_status;
        .vector angles_held;
index 12be0dbaa479c099cc2df23c376a21a1924b43c7..ccf6751171f82522181d75e529d103ac5b848847 100644 (file)
@@ -277,6 +277,9 @@ NET_HANDLE(ENT_CLIENT_MODEL, bool isnew)
                this.csqcmodel_teleported = 1;
        }
 
+       if(sf & BIT(3))
+               this.alpha = this.m_alpha;
+
        if(sf & BIT(14))
                viewloc_SetTags(this);
 
index b5d9f8bd361fff927dc54f70a5632300a64d4360..6211868445b7b65d87390eb7549051f228588e55 100644 (file)
@@ -27,7 +27,8 @@
 #define CSQCMODEL_ENDIF
 #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        .t f;
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       .t f;
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index 584bfc23ff6f0901f524f823e0b6e66465944c1d..70e2c1a15e9bf10f6a4a09bf9378a10f724ba5c8 100644 (file)
@@ -48,7 +48,11 @@ bool CSQCModel_Send(entity this, entity to, int sf)
        { \
                w(MSG_ENTITY, this.csqcmodel_##f); \
        }
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       if(sf & flag) \
+       { \
+               w(MSG_ENTITY, this.csqcmodel_##f); \
+       }
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index e963f12a1bf6ac79d9d3e45bf941e10e92927fef..f70ecea88818c8b46d0dc218faec9b0692749e67 100644 (file)
@@ -34,7 +34,9 @@ void CSQCModel_UnlinkEntity(entity e);
 #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        .t f; \
        .t csqcmodel_##f;
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       .t f; \
+       .t csqcmodel_##f;
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index 841486f5837a9150cf730d77ef23a7d9c8443ca5..cbdf55375922de5420b3c81c51b244acf7f3c024 100644 (file)
@@ -48,8 +48,16 @@ string CTX(string s)
        string c = HM_gets(CTX_cache, s);
        if (c != "") return c;
 #endif
-       int p = strstrofs(s, "^", 0);
-       string ret = (p < 0) ? s : substring(s, p + 1, -1);
+       int caret_ofs = strstrofs(s, "^", 0);
+       string ret = s;
+       // empty (caret_ofs == 0) and one char (caret_ofs == 1) prefixes are invalid
+       if (caret_ofs > 1)
+       {
+               int space_ofs = strstrofs(substring(s, 0, caret_ofs), " ", 0);
+               // prefixes containing a space are invalid (likely the caret is part of a color code)
+               if (space_ofs < 0 || space_ofs > caret_ofs)
+                       ret = substring(s, caret_ofs + 1, -1);
+       }
 #if CTX_CACHE
        LOG_DEBUGF("CTX(\"%s\")", s);
        HM_sets(CTX_cache, s, ret);
index 9105269ff32ebbc00d9c54e832557943412cedd4..cf86d97f9cb5e22e6a2123eaf6f7136630cd590e 100644 (file)
@@ -27,10 +27,13 @@ bool isnan(float e)
        // the sane way to detect NaN is broken because of a compiler bug
        // (works with constants but breaks when assigned to variables)
        // use conversion to string instead
-
        //float f = e;
        //return (e != f);
-       return ftos(e) == "-nan";
+
+       // Negative NaN ("-nan") is much more common but plain "nan" can be created by negating *some* -nans so we need to check both.
+       // DP's QCVM and GMQCC's QCVM behave differently - one needs ftos(-(0.0 / 0.0)), the other ftos(-sqrt(-1)).
+       string s = ftos(e);
+       return s == "nan" || s == "-nan";
 }
 bool isnormal(float e)
 {
index 3889b341b795c1893c81afb2b43c15136c1053db..54f6283b80bb9033a2883d106bd46aabc61781f5 100644 (file)
@@ -1,4 +1,4 @@
-#if 0
+/*
 "Perl code to convert this to a skinvalues.txt file.";
 print "title Generic\n";
 print "author Morphed\n";
@@ -32,7 +32,7 @@ while(<DATA>)
        }
 }
 __DATA__
-#endif
+*/
 SKINBEGIN
        // font sizes (used for everything)
        SKINFLOAT(FONTSIZE_NORMAL, 12);
index 00a9e5403fcd22236a8f2bd77fef45c095eb9b1b..e77af222bcbad51502f4e6f521e2cd19cbca9d6b 100644 (file)
@@ -19,6 +19,7 @@
 #include <menu/xonotic/demolist.qc>
 #include <menu/xonotic/dialog.qc>
 #include <menu/xonotic/dialog_credits.qc>
+#include <menu/xonotic/dialog_disconnect.qc>
 #include <menu/xonotic/dialog_firstrun.qc>
 #include <menu/xonotic/dialog_hudpanel_ammo.qc>
 #include <menu/xonotic/dialog_hudpanel_centerprint.qc>
@@ -59,6 +60,7 @@
 #include <menu/xonotic/dialog_sandboxtools.qc>
 #include <menu/xonotic/dialog_settings.qc>
 #include <menu/xonotic/dialog_settings_audio.qc>
+#include <menu/xonotic/dialog_settings_bindings_reset.qc>
 #include <menu/xonotic/dialog_settings_effects.qc>
 #include <menu/xonotic/dialog_settings_game.qc>
 #include <menu/xonotic/dialog_settings_game_crosshair.qc>
@@ -70,7 +72,6 @@
 #include <menu/xonotic/dialog_settings_game_weapons.qc>
 #include <menu/xonotic/dialog_settings_input.qc>
 #include <menu/xonotic/dialog_settings_input_userbind.qc>
-#include <menu/xonotic/dialog_settings_bindings_reset.qc>
 #include <menu/xonotic/dialog_settings_misc.qc>
 #include <menu/xonotic/dialog_settings_misc_cvars.qc>
 #include <menu/xonotic/dialog_settings_misc_reset.qc>
index 5d72a56171fdb2a1cd0be51d79416815878b6303..50eabce95999675614d4700f4fbea7191adbc6b1 100644 (file)
@@ -19,6 +19,7 @@
 #include <menu/xonotic/demolist.qh>
 #include <menu/xonotic/dialog.qh>
 #include <menu/xonotic/dialog_credits.qh>
+#include <menu/xonotic/dialog_disconnect.qc>
 #include <menu/xonotic/dialog_firstrun.qh>
 #include <menu/xonotic/dialog_hudpanel_ammo.qh>
 #include <menu/xonotic/dialog_hudpanel_centerprint.qh>
@@ -59,6 +60,7 @@
 #include <menu/xonotic/dialog_sandboxtools.qh>
 #include <menu/xonotic/dialog_settings.qh>
 #include <menu/xonotic/dialog_settings_audio.qh>
+#include <menu/xonotic/dialog_settings_bindings_reset.qh>
 #include <menu/xonotic/dialog_settings_effects.qh>
 #include <menu/xonotic/dialog_settings_game.qh>
 #include <menu/xonotic/dialog_settings_game_crosshair.qh>
@@ -70,7 +72,6 @@
 #include <menu/xonotic/dialog_settings_game_weapons.qh>
 #include <menu/xonotic/dialog_settings_input.qh>
 #include <menu/xonotic/dialog_settings_input_userbind.qh>
-#include <menu/xonotic/dialog_settings_bindings_reset.qh>
 #include <menu/xonotic/dialog_settings_misc.qh>
 #include <menu/xonotic/dialog_settings_misc_cvars.qh>
 #include <menu/xonotic/dialog_settings_misc_reset.qh>
diff --git a/qcsrc/menu/xonotic/dialog_disconnect.qc b/qcsrc/menu/xonotic/dialog_disconnect.qc
new file mode 100644 (file)
index 0000000..df19ef2
--- /dev/null
@@ -0,0 +1,25 @@
+#include "dialog_disconnect.qh"
+
+#include "textlabel.qh"
+#include "button.qh"
+
+void Disconnect_Click(entity btn, entity me)
+{
+       localcmd("disconnect");
+       Dialog_Close(btn, me);
+}
+
+void XonoticDisconnectDialog_fill(entity me)
+{
+       entity e;
+       me.TR(me);
+               me.TD(me, 1, 2, makeXonoticTextLabel(0.5, _("Are you sure to disconnect from server?")));
+       me.TR(me);
+       me.TR(me);
+               me.TD(me, 1, 1, e = makeXonoticButton_T(_("Yes"), '1 0 0', _("I would disconnect from server...")));
+                       e.onClick = Disconnect_Click;
+                       e.onClickEntity = me;
+               me.TD(me, 1, 1, e = makeXonoticButton_T(_("No"), '0 1 0', _("I would play more!")));
+                       e.onClick = Dialog_Close;
+                       e.onClickEntity = me;
+}
diff --git a/qcsrc/menu/xonotic/dialog_disconnect.qh b/qcsrc/menu/xonotic/dialog_disconnect.qh
new file mode 100644 (file)
index 0000000..a61dd77
--- /dev/null
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "dialog.qh"
+CLASS(XonoticDisconnectDialog, XonoticDialog)
+       METHOD(XonoticDisconnectDialog, fill, void(entity));
+       ATTRIB(XonoticDisconnectDialog, title, string, _("Disconnect"));
+       ATTRIB(XonoticDisconnectDialog, tooltip, string, _("Disconnect server"));
+       ATTRIB(XonoticDisconnectDialog, color, vector, SKINCOLOR_DIALOG_QUIT);
+       ATTRIB(XonoticDisconnectDialog, intendedWidth, float, 0.5);
+       ATTRIB(XonoticDisconnectDialog, rows, float, 3);
+       ATTRIB(XonoticDisconnectDialog, colums, float, 2);
+       ATTRIB(XonoticDisconnectDialog, name, string, "Disconnect");
+ENDCLASS(XonoticDisconnectDialog)
index 1792ec635b41f1e594e3be4fbf6b455980f9d204..c79b124d66659f43e062e39341d5e4125b86b68e 100644 (file)
@@ -82,10 +82,14 @@ void XonoticServerListTab_fill(entity me)
                        e.onClickEntity = slist;
                        slist.infoButton = e;
        me.TR(me);
+       
+               /*
                me.TD(me, 1, 1, e = makeXonoticCommandButton_T(_("Disconnect"), '0 0 0', "disconnect", 0,
                        _("Disconnect from the server")));
                        slist.disconnectButton = e;
-               me.TD(me, 1, me.columns-1, e = makeXonoticButton(_("Join!"), '0 0 0'));
+               */
+
+               me.TD(me, 1, me.columns, e = makeXonoticButton(_("Join!"), '0 0 0'));
                        e.onClick = ServerList_Connect_Click;
                        e.onClickEntity = slist;
                        slist.connectButton = e;
index f87e0dbbe05f905e761c37918868870f4968837a..4405d98de7d3f34be00cd3ce8fce0ca8c1d655da 100644 (file)
@@ -131,7 +131,12 @@ void XonoticProfileTab_fill(entity me)
                me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uid2name", _("Allow player statistics to use your nickname")));
                        e.sendCvars = true;
                        setDependent(e, "cl_allow_uidtracking", 1, 1);
-       me.gotoRC(me, 4, 3.1); // TOP RIGHT
+       me.TR(me);
+               me.TDempty(me, 0.25);
+               me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uidranking", _("Allow player statistics to rank you in leaderboards")));
+                       e.sendCvars = true;
+                       setDependent(e, "cl_allow_uidtracking", 1, 1);
+       me.gotoRC(me, 4.5, 3.1); // TOP RIGHT
        //me.gotoRC(me, 12.5, 3.1); // BOTTOM RIGHT
        //me.gotoRC(me, 12.5, 0); // BOTTOM LEFT
                me.TDempty(me, 0.25);
index 1c7da72919d68934749d76034cef11cd00ae3b97..ca812d30415bd23c46802c36c0359cc41e0e3bd2 100644 (file)
@@ -36,8 +36,8 @@ void XonoticMiscSettingsTab_fill(entity me)
                        _("Specify your network speed")));
                        e.addValue(e, _("56k"), "4000");
                        e.addValue(e, _("ISDN"), "7000");
-                       e.addValue(e, _("Slow ADSL"), "15000");
-                       e.addValue(e, _("Fast ADSL"), "20000");
+                       e.addValue(e, _("Slow ADSL"), "20000");
+                       e.addValue(e, _("Fast ADSL"), "40000");
                        e.addValue(e, _("Broadband"), "66666");
                        e.configureXonoticTextSliderValues(e);
        me.TR(me);
@@ -87,15 +87,13 @@ void XonoticMiscSettingsTab_fill(entity me)
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Maximum:")));
                me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_maxfps"));
                        ADDVALUE_FPS(30);
-                       ADDVALUE_FPS(40);
-                       ADDVALUE_FPS(50);
                        ADDVALUE_FPS(60);
-                       ADDVALUE_FPS(70);
-                       ADDVALUE_FPS(80);
                        ADDVALUE_FPS(100);
                        ADDVALUE_FPS(125);
                        ADDVALUE_FPS(150);
                        ADDVALUE_FPS(200);
+                       ADDVALUE_FPS(250);
+                       ADDVALUE_FPS(400);
                        e.addValue(e, ZCTX(_("MAXFPS^Unlimited")), "0");
                        e.configureXonoticTextSliderValues(e);
        me.TR(me);
@@ -103,14 +101,13 @@ void XonoticMiscSettingsTab_fill(entity me)
                me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_minfps"));
                        e.addValue(e, ZCTX(_("TRGT^Disabled")), "0");
                        ADDVALUE_FPS(30);
-                       ADDVALUE_FPS(40);
-                       ADDVALUE_FPS(50);
                        ADDVALUE_FPS(60);
-                       ADDVALUE_FPS(80);
                        ADDVALUE_FPS(100);
                        ADDVALUE_FPS(125);
                        ADDVALUE_FPS(150);
                        ADDVALUE_FPS(200);
+                       ADDVALUE_FPS(250);
+                       ADDVALUE_FPS(400);
                        e.configureXonoticTextSliderValues(e);
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Idle limit:")));
index 6e59b8b1fef3825b6267d60821f564a1efe58942..4f6e4a04a6dbe3201e43430975b00ede72e53c6b 100644 (file)
@@ -122,6 +122,7 @@ void KeyBinds_Read()
        KEYBIND_DEF("kill"                                  , _("respawn"));
        KEYBIND_DEF("quickmenu"                             , _("quick menu"));
        KEYBIND_DEF("menu_showsandboxtools"                 , _("sandbox menu"));
+       KEYBIND_DEF("wpeditor_menu"                         , _("waypoint editor menu"));
        KEYBIND_DEF("+button8"                              , _("drag object"));
        KEYBIND_EMPTY_LINE();
 
index 602fcc33cccf5f068995d07a558a3ce376e17c18..55f922929fde71fc0b3670ebde078e19ae7d0efc 100644 (file)
 #include "dialog_credits.qh"
 #include "dialog_quit.qh"
 
+#include "dialog_disconnect.qh"
+
+
+
 void MainWindow_draw(entity me)
 {
        SUPER(MainWindow).draw(me);
@@ -58,6 +62,33 @@ void MainWindow_draw(entity me)
                DialogOpenButton_Click_withCoords(NULL, me.dialogToShow, '0 0 0', eX * conwidth + eY * conheight);
                me.dialogToShow = NULL;
        }
+
+       //-------------------------------------
+       // Part of Disconnect Dialog button:
+       // In case of this function is recalling every time, need to use condition of visibility 
+       
+       if (me.disconnectDialogVisibility && !(gamestatus & (GAME_ISSERVER | GAME_CONNECTED))) 
+       {
+               // If gamestate is not "ingame" (and it is a first "frame" of drawing (or dialog is visible)), 
+               // disconnect button is unnecessary, remove it
+               me.removeItem(me.mainNexposee, me.disconnectDialog);
+               me.disconnectDialogVisibility = 0;
+
+       } else if(!me.disconnectDialogVisibility && (gamestatus & (GAME_ISSERVER | GAME_CONNECTED))) {
+               
+               // If gamestate is "ingame" (and dialog is not visible), 
+               // make disconnect button visible
+               entity n, i;
+               n = me.mainNexposee;
+               i = me.disconnectDialog;
+               n.addItemCentered(n, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+               n.setNexposee(n, i, '0.5 1.2 0.0', SKINALPHAS_MAINMENU_x, SKINALPHAS_MAINMENU_y);
+               me.disconnectDialogVisibility = 1;
+       }
+
+       // I haven't found the best solution for making button visible. 
+       // Alpha channel is the worst thing, because dialog with alpha is also clickable
+       //-------------------------------------
 }
 
 void DemoButton_Click(entity me, entity other)
@@ -245,6 +276,7 @@ void MainWindow_configureMainWindow(entity me)
 
        // main dialogs/windows
        me.mainNexposee = n = NEW(XonoticNexposee);
+       
        /*
                if(checkextension("DP_GECKO_SUPPORT"))
                {
@@ -254,6 +286,7 @@ void MainWindow_configureMainWindow(entity me)
                        n.setNexposee(n, i, '0.1 0.1 0', SKINALPHAS_MAINMENU_x, SKINALPHAS_MAINMENU_y);
                }
        */
+       
                i = NEW(XonoticSingleplayerDialog);
                i.configureDialog(i);
                n.addItemCentered(n, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
@@ -275,6 +308,14 @@ void MainWindow_configureMainWindow(entity me)
                n.setNexposee(n, i, SKINPOSITION_DIALOG_CREDITS, SKINALPHAS_MAINMENU_x, SKINALPHAS_MAINMENU_y);
                n.pullNexposee(n, i, eY * (SKINHEIGHT_TITLE * SKINFONTSIZE_TITLE / conheight));
 
+               //Disconnect dialog at center of screen (between credits and quit)
+               i = NEW(XonoticDisconnectDialog);
+               i.configureDialog(i);
+               n.addItemCentered(n, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+               n.setNexposee(n, i, '0.5 1.2 0.0', SKINALPHAS_MAINMENU_x, SKINALPHAS_MAINMENU_y);
+               n.pullNexposee(n, i, eY * (SKINHEIGHT_TITLE * SKINFONTSIZE_TITLE / conheight));
+               me.disconnectDialog = i;
+       
                i = NEW(XonoticQuitDialog);
                i.configureDialog(i);
                n.addItemCentered(n, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
@@ -285,6 +326,7 @@ void MainWindow_configureMainWindow(entity me)
        me.moveItemAfter(me, n, NULL);
 
        me.initializeDialog(me, n);
+       me.disconnectDialogVisibility = 1;
 
        if(cvar_string("_cl_name") == cvar_defstring("_cl_name"))
                me.dialogToShow = me.firstRunDialog;
index 924f145ba7d5f27143029d03417d8042d2b503e6..1e8afa4a39b1b3344ee7c4990247cdec9acd120e 100644 (file)
@@ -24,4 +24,6 @@ CLASS(MainWindow, ModalController)
        ATTRIB(MainWindow, demostartconfirmDialog, entity);
        ATTRIB(MainWindow, demotimeconfirmDialog, entity);
        ATTRIB(MainWindow, resetDialog, entity);
+       ATTRIB(MainWindow, disconnectDialog, entity);
+       ATTRIB(MainWindow, disconnectDialogVisibility, float, 1);
 ENDCLASS(MainWindow)
index 11266b7c2f9e35948574f54fbd3bd9c5b60e1373..021e9765119d7bf70861a5cdccca8d99c1108280 100644 (file)
@@ -542,7 +542,7 @@ void XonoticServerList_draw(entity me)
        else { me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT); }
 
        me.connectButton.disabled = (me.lockedSelectedItem || (me.nItems == 0 && me.ipAddressBox.text == ""));
-       me.disconnectButton.disabled = (!(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)));
+       //me.disconnectButton.disabled = (!(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)));
        me.infoButton.disabled = (me.lockedSelectedItem || me.nItems == 0 || !owned);
        me.favoriteButton.disabled = (me.lockedSelectedItem || (me.nItems == 0 && me.ipAddressBox.text == ""));
 
index 74f3bd570d5fee88efdcdbab3fbdaa341c2545a6..01b065df78b302d31d160590b7c76489ed19c189 100644 (file)
@@ -52,7 +52,7 @@ CLASS(XonoticServerList, XonoticListBox)
        ATTRIB(XonoticServerList, sortButton4, entity);
        ATTRIB(XonoticServerList, sortButton5, entity);
        ATTRIB(XonoticServerList, connectButton, entity);
-       ATTRIB(XonoticServerList, disconnectButton, entity);
+       //ATTRIB(XonoticServerList, disconnectButton, entity);
        ATTRIB(XonoticServerList, infoButton, entity);
        ATTRIB(XonoticServerList, currentSortOrder, float, 0);
        ATTRIB(XonoticServerList, currentSortField, float, -1);
index 2c600b6f5289e6d92a03569a0c2dabf03cab3ca7..7d19516cf01673cfd38f150a63ab4678de6612ca 100644 (file)
@@ -41,12 +41,11 @@ string XonoticStatsList_convertDate(string input)
                default: return input; // failed, why?
        }
 
-       return sprintf(
-               "%s %s, %d",
-               monthname,
-               count_ordinal(stof(substring(input, 8, 2))),
-               stof(substring(input, 0, 4))
-       );
+       string date = ZCTX(_("DATE^%m %d, %Y"));
+       date = strreplace("%Y", substring(input, 0, 4), date);
+       date = strreplace("%d", ftos(stof(substring(input, 8, 2))), date); // ftos-stof removes leading 0
+       date = strreplace("%m", monthname, date);
+       return date;
 }
 
 void XonoticStatsList_getStats(entity me)
index c6e26e09e8fdbf77e641a6f9937e1ade5e60ac24..93ca6acf93eba5b7204c3dd0d4353a5b4a9901dd 100644 (file)
@@ -148,6 +148,16 @@ void antilag_restore_all(entity ignore)
        });
 }
 
+float antilag_getlag(entity e)
+{
+       float lag = ((IS_REAL_CLIENT(e)) ? ANTILAG_LATENCY(e) : 0);
+       bool noantilag = ((IS_CLIENT(e)) ? CS(e).cvar_cl_noantilag : false);
+       if(autocvar_g_antilag == 0 || noantilag || lag < 0.001)
+               lag = 0;
+
+       return lag;
+}
+
 /*
 ==================
 traceline_antilag
index c3be5553a946837a3f8e7960121fdc0d0681cb66..f02803387dd179c7cb3d8fa9857024bcb3e297b3 100644 (file)
@@ -9,6 +9,8 @@ void antilag_clear(entity e, entity store);
 void antilag_takeback_all(entity ignore, float lag);
 void antilag_restore_all(entity ignore);
 
+float antilag_getlag(entity e); // returns antilag latency for clients, plus any modifiers (such as noantilag)
+
 .float antilag_debug;
 
 #define ANTILAG_LATENCY(e) min(0.4, CS(e).ping * 0.001)
index 21e71c5c65bdd15f7619a21ca5a6af2e853c063b..a783d72314a7a1c571014ce6b5cbe70d2d0ac440 100644 (file)
@@ -158,6 +158,7 @@ bool autocvar_g_maplist_votable_suggestions;
 bool autocvar_g_maplist_votable_suggestions_override_mostrecent;
 float autocvar_g_maplist_votable_timeout;
 bool autocvar_g_maplist_ignore_sizes;
+bool autocvar_g_maplist_sizes_count_bots = true;
 int autocvar_g_maxplayers;
 float autocvar_g_maxplayers_spectator_blocktime;
 float autocvar_g_maxpushtime;
@@ -168,6 +169,7 @@ float autocvar_g_maxspeed;
 bool autocvar_g_mirrordamage_onlyweapons;
 
 float autocvar_g_movement_highspeed = 1;
+bool autocvar_g_movement_highspeed_q3_compat = 0;
 string autocvar_g_mutatormsg;
 //float autocvar_g_nick_flood_penalty;
 int autocvar_g_nick_flood_penalty_red;
@@ -289,6 +291,7 @@ string autocvar_sv_defaultplayermodel_pink;
 string autocvar_sv_defaultplayermodel_red;
 string autocvar_sv_defaultplayermodel_yellow;
 int autocvar_sv_defaultplayerskin;
+bool autocvar_sv_doors_always_open;
 bool autocvar_sv_doublejump;
 bool autocvar_sv_eventlog;
 bool autocvar_sv_eventlog_console;
@@ -299,7 +302,7 @@ string autocvar_sv_eventlog_files_namesuffix;
 bool autocvar_sv_eventlog_files_timestamps;
 float autocvar_sv_friction_on_land;
 var float autocvar_sv_friction_slick = 0.5;
-float autocvar_sv_gameplayfix_q2airaccelerate;
+float autocvar_sv_gameplayfix_q2airaccelerate = 1;
 int autocvar_sv_gentle;
 #define autocvar_sv_gravity cvar("sv_gravity")
 string autocvar_sv_intermission_cdtrack;
@@ -373,8 +376,8 @@ float autocvar_timelimit_overtime;
 int autocvar_timelimit_overtimes;
 float autocvar_timelimit_suddendeath;
 #define autocvar_utf8_enable cvar("utf8_enable")
-float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
-bool autocvar_sv_gameplayfix_upwardvelocityclearsongroundflag;
+bool autocvar_sv_gameplayfix_gravityunaffectedbyticrate = true;
+bool autocvar_sv_gameplayfix_upwardvelocityclearsongroundflag = true;
 float autocvar_g_trueaim_minrange;
 float autocvar_g_grab_range;
 int autocvar_g_max_info_autoscreenshot;
index 35b52e3d9121de10f322853ea0d92d9c14a51e81..f8285f634d82f0b920ead3a79c3af60712a778f6 100644 (file)
@@ -7,13 +7,22 @@
 const int WAYPOINTFLAG_GENERATED = BIT(23);
 const int WAYPOINTFLAG_ITEM = BIT(22);
 const int WAYPOINTFLAG_TELEPORT = BIT(21); // teleports, warpzones and jumppads
-const int WAYPOINTFLAG_NORELINK = BIT(20);
+//const int WAYPOINTFLAG_NORELINK = BIT(20); // deprecated, see explanation below. Do not recycle this bit.
 const int WAYPOINTFLAG_PERSONAL = BIT(19);
 const int WAYPOINTFLAG_PROTECTED = BIT(18);  // Useless WP detection never kills these.
 const int WAYPOINTFLAG_USEFUL = BIT(17);  // Useless WP detection temporary flag.
 const int WAYPOINTFLAG_DEAD_END = BIT(16);  // Useless WP detection temporary flag.
 const int WAYPOINTFLAG_LADDER = BIT(15);
 const int WAYPOINTFLAG_JUMP = BIT(14);
+const int WAYPOINTFLAG_CUSTOM_JP = BIT(13);  // jumppad with different destination waypoint (changed in the editor)
+const int WAYPOINTFLAG_CROUCH = BIT(12);
+const int WAYPOINTFLAG_SUPPORT = BIT(11);
+
+// removed WAYPOINTFLAG_NORELINK since it breaks backward compatibility
+// e.g. support waypoints would have no outgoing links in old Xonotic versions
+// In general, old Xonotic versions should spawn a normal waypoint for each unknown waypoint type
+const int WAYPOINTFLAG_NORELINK__DEPRECATED = BIT(20);
+const int WPFLAGMASK_NORELINK = (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER | WAYPOINTFLAG_JUMP | WAYPOINTFLAG_CUSTOM_JP | WAYPOINTFLAG_SUPPORT);
 
 float bot_custom_weapon;
 float bot_weapons_close[Weapons_MAX];
@@ -48,8 +57,8 @@ float skill;
 .float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost;
 .float wpconsidered;
 .float wpcost;
-.float wphardwired;
 .int wpflags;
+.entity wphw00, wphw01, wphw02, wphw03, wphw04, wphw05, wphw06, wphw07;
 
 bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeedupward, float maxshottime, float applygravity);
 void bot_aim_reset(entity this);
@@ -98,6 +107,7 @@ void navigation_goalrating_timeout_set(entity this);
 void navigation_goalrating_timeout_force(entity this);
 void navigation_goalrating_timeout_expire(entity this, float seconds);
 bool navigation_goalrating_timeout(entity this);
+void navigation_goalrating_timeout_extend_if_needed(entity this, float seconds);
 bool navigation_goalrating_timeout_can_be_anticipated(entity this);
 void navigation_markroutes(entity this, entity fixed_source_waypoint);
 void navigation_markroutes_inverted(entity fixed_source_waypoint);
@@ -118,9 +128,11 @@ void waypoint_spawnforitem(entity e);
 void waypoint_spawnforitem_force(entity e, vector org);
 void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent);
 void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent);
-void waypoint_spawn_fromeditor(entity pl);
+void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp);
 entity waypoint_spawn(vector m1, vector m2, float f);
 void waypoint_unreachable(entity pl);
+void waypoint_start_hardwiredlink(entity pl, bool at_crosshair);
+void waypoint_lock(entity pl);
 
 void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx);
 void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx);
index 90338d20214e1e0ec3132f7af1c3b597bba4f4a3..40afed17990b7e93c40e41e194b5893054c54911 100644 (file)
@@ -580,6 +580,7 @@ void bot_calculate_stepheightvec()
        stepheightvec = autocvar_sv_stepheight * '0 0 1';
        jumpheight_vec = (autocvar_sv_jumpvelocity ** 2) / (2 * autocvar_sv_gravity) * '0 0 1';
        jumpstepheightvec = stepheightvec + jumpheight_vec * 0.85; // reduce it a bit to make the jumps easy
+       jumpheight_time = autocvar_sv_jumpvelocity / autocvar_sv_gravity;
 }
 
 bool bot_fixcount()
@@ -756,7 +757,7 @@ void bot_serverframe()
                if(botframe_cachedwaypointlinks)
                {
                        if(!botframe_loadedforcedlinks)
-                               waypoint_load_links_hardwired();
+                               waypoint_load_hardwiredlinks();
                }
                else
                {
index 2b2dfbf3cf5e86a4d9d3b19af56fd676be07c06b..477d1ec464c9c4af95f10f6dd3d2b260bd5bc6e3 100644 (file)
@@ -89,6 +89,13 @@ void havocbot_ai(entity this)
                bot_strategytoken_taken = true;
        }
 
+       if (this.goalcurrent && wasfreed(this.goalcurrent))
+       {
+               navigation_clearroute(this);
+               navigation_goalrating_timeout_force(this);
+               return;
+       }
+
        if(IS_DEAD(this) || STAT(FROZEN, this))
        {
                if (this.goalcurrent)
@@ -267,7 +274,7 @@ void havocbot_bunnyhop(entity this, vector dir)
        if(this.aistatus & AI_STATUS_ATTACKING)
                return;
 
-       if(IS_PLAYER(this.goalcurrent))
+       if (!this.goalcurrent || IS_PLAYER(this.goalcurrent))
                return;
 
        if((this.aistatus & AI_STATUS_RUNNING) && vdist(this.velocity, <, autocvar_sv_maxspeed * 0.75)
@@ -280,7 +287,7 @@ void havocbot_bunnyhop(entity this, vector dir)
                return;
        }
 
-       if(this.waterlevel > WATERLEVEL_WETFEET)
+       if(this.waterlevel > WATERLEVEL_WETFEET || IS_DUCKED(this))
        {
                this.aistatus &= ~AI_STATUS_RUNNING;
                return;
@@ -292,8 +299,6 @@ void havocbot_bunnyhop(entity this, vector dir)
                this.bot_timelastseengoal = 0;
        }
 
-       vector gco = get_closer_dest(this.goalcurrent, this.origin);
-
        // Run only to visible goals
        if(IS_ONGROUND(this))
        if(vdist(vec2(this.velocity), >=, autocvar_sv_maxspeed))
@@ -304,6 +309,7 @@ void havocbot_bunnyhop(entity this, vector dir)
                // seen it before
                if(this.bot_timelastseengoal)
                {
+                       vector gco = get_closer_dest(this.goalcurrent, this.origin);
                        // for a period of time
                        if(time - this.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay)
                        {
@@ -323,9 +329,10 @@ void havocbot_bunnyhop(entity this, vector dir)
 
                                if(this.aistatus & AI_STATUS_ROAMING)
                                if(this.goalcurrent.classname == "waypoint")
-                               if(!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL))
+                               if (!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL))
                                if(fabs(gco.z - this.origin.z) < this.maxs.z - this.mins.z)
-                               if(this.goalstack01 && !wasfreed(this.goalstack01))
+                               if (this.goalstack01 && !wasfreed(this.goalstack01))
+                               if (!(this.goalstack01.wpflags & WAYPOINTFLAG_JUMP))
                                {
                                        vector gno = (this.goalstack01.absmin + this.goalstack01.absmax) * 0.5;
                                        vector deviation = vectoangles(gno - this.origin) - vectoangles(gco - this.origin);
@@ -372,6 +379,8 @@ void havocbot_bunnyhop(entity this, vector dir)
 // return true when bot isn't getting closer to the current goal
 bool havocbot_checkgoaldistance(entity this, vector gco)
 {
+       if (this.bot_stop_moving_timeout > time)
+               return false;
        float curr_dist_z = max(20, fabs(this.origin.z - gco.z));
        float curr_dist_2d = max(20, vlen(vec2(this.origin - gco)));
        float distance_time = this.goalcurrent_distance_time;
@@ -438,6 +447,8 @@ void havocbot_movetogoal(entity this)
        CS(this).movement = '0 0 0';
        maxspeed = autocvar_sv_maxspeed;
 
+       PHYS_INPUT_BUTTON_CROUCH(this) = boolean(this.goalcurrent.wpflags & WAYPOINTFLAG_CROUCH);
+
        PHYS_INPUT_BUTTON_JETPACK(this) = false;
        // Jetpack navigation
        if(this.navigation_jetpack_goal)
@@ -640,7 +651,8 @@ void havocbot_movetogoal(entity this)
 
                        return;
                }
-               else if(!this.jumppadcount && !this.goalcurrent.wphardwired
+               else if(!this.jumppadcount && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
+                       && !(this.goalcurrent_prev && this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP)
                        && GetResource(this, RES_HEALTH) + GetResource(this, RES_ARMOR) > ROCKETJUMP_DAMAGE())
                {
                        if(this.velocity.z < 0)
@@ -955,7 +967,26 @@ void havocbot_movetogoal(entity this)
                        vector flat_diff = vec2(diff);
                        offset = max(32, current_speed * cos(deviation.y * DEG2RAD) * 0.3) * flatdir;
                        vector actual_destorg = this.origin + offset;
-                       if (!this.goalstack01 || this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER))
+                       if (this.goalcurrent_prev && (this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP))
+                       {
+                               if (time > this.bot_stop_moving_timeout
+                                       && fabs(deviation.y) > 20 && current_speed > maxspeed * 0.4
+                                       && vdist(vec2(this.origin - this.goalcurrent_prev.origin), <, 50))
+                               {
+                                       this.bot_stop_moving_timeout = time + 0.1;
+                               }
+                               if (current_speed > autocvar_sv_maxspeed * 0.9
+                                       && vlen2(flat_diff) < vlen2(vec2(this.goalcurrent_prev.origin - destorg))
+                                       && vdist(vec2(this.origin - this.goalcurrent_prev.origin), >, 50)
+                                       && vdist(vec2(this.origin - this.goalcurrent_prev.origin), <, 150)
+                               )
+                               {
+                                       PHYS_INPUT_BUTTON_JUMP(this) = true;
+                                       // avoid changing route while bot is jumping a gap
+                                       navigation_goalrating_timeout_extend_if_needed(this, 1.5);
+                               }
+                       }
+                       else if (!this.goalstack01 || (this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER)))
                        {
                                if (vlen2(flat_diff) < vlen2(offset))
                                {
@@ -991,10 +1022,20 @@ void havocbot_movetogoal(entity this)
                                turning = true;
                        }
 
-                       LABEL(jump_check);
+                       LABEL(jumpobstacle_check);
                        dir = flatdir = normalize(actual_destorg - this.origin);
 
-                       if (turning || fabs(deviation.y) < 50) // don't even try to jump if deviation is too high
+                       bool jump_forbidden = false;
+                       if (!turning && fabs(deviation.y) > 50)
+                               jump_forbidden = true;
+                       else if (IS_DUCKED(this))
+                       {
+                               tracebox(this.origin, PL_MIN_CONST, PL_MAX_CONST, this.origin, false, this);
+                               if (trace_startsolid)
+                                       jump_forbidden = true;
+                       }
+
+                       if (!jump_forbidden)
                        {
                                tracebox(this.origin, this.mins, this.maxs, actual_destorg, false, this);
                                if (trace_fraction < 1 && trace_plane_normal.z < 0.7)
@@ -1010,7 +1051,7 @@ void havocbot_movetogoal(entity this)
                                                        actual_destorg = destorg;
                                                        turning = false;
                                                        this.bot_tracewalk_time = time + 0.25;
-                                                       goto jump_check;
+                                                       goto jumpobstacle_check;
                                                }
                                                s = trace_fraction;
                                                // don't artificially reduce max jump height in real-time
@@ -1074,7 +1115,9 @@ void havocbot_movetogoal(entity this)
 
                        bool unreachable = false;
                        s = CONTENT_SOLID;
-                       if(trace_fraction == 1 && this.jumppadcount == 0 && !this.goalcurrent.wphardwired )
+                       if (trace_fraction == 1 && !this.jumppadcount
+                               && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
+                               && !(this.goalcurrent_prev && (this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP)))
                        if((IS_ONGROUND(this)) || (this.aistatus & AI_STATUS_RUNNING) || (this.aistatus & AI_STATUS_ROAMING) || PHYS_INPUT_BUTTON_JUMP(this))
                        {
                                // Look downwards
@@ -1121,7 +1164,7 @@ void havocbot_movetogoal(entity this)
                        }
 
                        // slow down if bot is in the air and goal is under it
-                       if (!this.goalcurrent.wphardwired
+                       if (!waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
                                && vdist(flat_diff, <, 250) && this.origin.z - destorg.z > 120
                                && (!IS_ONGROUND(this) || vdist(vec2(this.velocity), >, maxspeed * 0.3)))
                        {
@@ -1216,9 +1259,7 @@ void havocbot_movetogoal(entity this)
                havocbot_keyboard_movement(this, destorg);
 
        // Bunnyhop!
-       //if(this.aistatus & AI_STATUS_ROAMING)
-       if(!bunnyhop_forbidden && this.goalcurrent)
-       if(skill+this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
+       if (!bunnyhop_forbidden && skill + this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
                havocbot_bunnyhop(this, dir);
 
        if (dir * v_up >= autocvar_sv_jumpvelocity * 0.5 && IS_ONGROUND(this))
index d63e158781ea6e2c6bdf83214484a5fc32aa3609..01352d0e4d94ba4702fdb727a8818dc1e946d02b 100644 (file)
@@ -47,6 +47,11 @@ bool navigation_goalrating_timeout(entity this)
        return this.bot_strategytime < time;
 }
 
+void navigation_goalrating_timeout_extend_if_needed(entity this, float seconds)
+{
+       this.bot_strategytime = max(this.bot_strategytime, time + seconds);
+}
+
 #define MAX_CHASE_DISTANCE 700
 bool navigation_goalrating_timeout_can_be_anticipated(entity this)
 {
@@ -916,19 +921,33 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom
        vector pm1 = ent.origin + ent.mins;
        vector pm2 = ent.origin + ent.maxs;
 
-       // do two scans, because box test is cheaper
-       IL_EACH(g_waypoints, it != ent && it != except && !(it.wpflags & WAYPOINTFLAG_TELEPORT),
+       if (autocvar_g_waypointeditor && !IS_BOT_CLIENT(ent))
+       {
+               // this code allows removing waypoints in the air and seeing jumppad/telepport waypoint links
+               // FIXME it causes a bug where a waypoint spawned really close to another one (max 16 qu)
+               // isn't detected as the nearest waypoint
+               IL_EACH(g_waypoints, it != ent && it != except,
+               {
+                       if (boxesoverlap(pm1, pm2, it.absmin, it.absmax))
+                               return it;
+               });
+       }
+       else
        {
-               if(boxesoverlap(pm1, pm2, it.absmin, it.absmax))
+               // do two scans, because box test is cheaper
+               IL_EACH(g_waypoints, it != ent && it != except && !(it.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP)),
                {
-                       if(!autocvar_g_waypointeditor && walkfromwp && !ent.navigation_dynamicgoal)
+                       if(boxesoverlap(pm1, pm2, it.absmin, it.absmax))
                        {
-                               waypoint_clearlinks(ent); // initialize wpXXmincost fields
-                               navigation_item_addlink(it, ent);
+                               if(walkfromwp && !ent.navigation_dynamicgoal)
+                               {
+                                       waypoint_clearlinks(ent); // initialize wpXXmincost fields
+                                       navigation_item_addlink(it, ent);
+                               }
+                               return it;
                        }
-                       return it;
-               }
-       });
+               });
+       }
 
        vector org = ent.origin;
        if (navigation_testtracewalk)
@@ -948,7 +967,7 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom
                waypoint_clearlinks(ent); // initialize wpXXmincost fields
                IL_EACH(g_waypoints, it != ent,
                {
-                       if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK))
+                       if (walkfromwp && (it.wpflags & WPFLAGMASK_NORELINK))
                                continue;
 
                        set_tracewalk_dest(ent, it.origin, false);
@@ -964,7 +983,7 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom
        // box check failed, try walk
        IL_EACH(g_waypoints, it != ent,
        {
-               if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK))
+               if (walkfromwp && (it.wpflags & WPFLAGMASK_NORELINK))
                        continue;
                v = it.origin;
 
@@ -1335,7 +1354,7 @@ void navigation_routerating(entity this, entity e, float f, float rangebias)
                        LOG_DEBUG("jetpack ai: required fuel ", ftos(fuel), ", have ", ftos(GetResource(this, RES_FUEL)));
 
                        // enough fuel ?
-                       if(GetResource(this, RES_FUEL) > fuel || (this.items & IT_UNLIMITED_WEAPON_AMMO))
+                       if(GetResource(this, RES_FUEL) > fuel || (this.items & IT_UNLIMITED_AMMO))
                        {
                                // Estimate cost
                                // (as onground costs calculation is mostly based on distances, here we do the same establishing some relationship
@@ -1577,7 +1596,7 @@ bool navigation_shortenpath(entity this)
 
        next = this.goalstack01;
        // if for some reason the bot is closer to the next goal, pop the current one
-       if (!IS_MOVABLE(next) // already checked in the previous case
+       if (!IS_MOVABLE(next) && !(this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP))
                && vlen2(this.goalcurrent.origin - next.origin) > vlen2(next.origin - this.origin)
                && checkpvs(this.origin + this.view_ofs, next))
        {
@@ -1771,7 +1790,7 @@ entity navigation_get_really_close_waypoint(entity this)
        if(vdist(wp.origin - this.origin, >, 50))
        {
                wp = NULL;
-               IL_EACH(g_waypoints, !(it.wpflags & WAYPOINTFLAG_TELEPORT),
+               IL_EACH(g_waypoints, !(it.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP)),
                {
                        if(vdist(it.origin - this.origin, <, 50))
                        {
index d002ae29db21e138d8632af79056d9c285409cf1..026d326b9e6fba8524b95a73862eb284e3f06d86 100644 (file)
@@ -10,6 +10,7 @@ float navigation_testtracewalk;
 vector jumpstepheightvec;
 vector stepheightvec;
 vector jumpheight_vec;
+float jumpheight_time;
 
 entity navigation_bestgoal;
 
@@ -29,6 +30,8 @@ entity navigation_bestgoal;
 .float goalcurrent_distance_2d;
 .float goalcurrent_distance_time;
 
+// final goal (item, object or player) is also saved in this field
+.entity goalentity;
 .float goalentity_lock_timeout;
 .bool goalentity_shouldbefrozen;
 
index 6bc90770145614828e8c5653794e1d0facfaf1bb..7a40f18e8df56f6e1eacf6e0f242b08b316ee9e6 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <common/constants.qh>
 #include <common/debug.qh>
+#include <common/mapobjects/trigger/jumppads.qh>
 #include <common/net_linked.qh>
 #include <common/physics/player.qh>
 
@@ -259,6 +260,99 @@ vector waypoint_getSymmetricalPoint(vector org, int ctf_flags)
        return new_org;
 }
 
+void crosshair_trace_waypoints(entity pl);
+void waypoint_lock(entity pl)
+{
+       crosshair_trace_waypoints(pl);
+       pl.wp_locked = trace_ent;
+}
+
+bool waypoint_has_hardwiredlinks(entity wp)
+{
+       if (!wp)
+               return false;
+       return (wp.wphw00 != NULL);
+}
+
+bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to)
+{
+       if (!(wp_from && wp_to))
+               return false;
+
+       if (!wp_from.wphw00) return false; else if (wp_from.wphw00 == wp_to) return true;
+       if (!wp_from.wphw01) return false; else if (wp_from.wphw01 == wp_to) return true;
+       if (!wp_from.wphw02) return false; else if (wp_from.wphw02 == wp_to) return true;
+       if (!wp_from.wphw03) return false; else if (wp_from.wphw03 == wp_to) return true;
+       if (!wp_from.wphw04) return false; else if (wp_from.wphw04 == wp_to) return true;
+       if (!wp_from.wphw05) return false; else if (wp_from.wphw05 == wp_to) return true;
+       if (!wp_from.wphw06) return false; else if (wp_from.wphw06 == wp_to) return true;
+       if (!wp_from.wphw07) return false; else if (wp_from.wphw07 == wp_to) return true;
+
+       return false;
+}
+
+void waypoint_setupmodel(entity wp);
+void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to)
+{
+       if (!(wp_from && wp_to))
+               return;
+
+       if (!wp_from.wphw00 || wp_from.wphw00 == wp_to) { wp_from.wphw00 = wp_to; waypoint_setupmodel(wp_from); return; }
+       if (!wp_from.wphw01 || wp_from.wphw01 == wp_to) { wp_from.wphw01 = wp_to; return; }
+       if (!wp_from.wphw02 || wp_from.wphw02 == wp_to) { wp_from.wphw02 = wp_to; return; }
+       if (!wp_from.wphw03 || wp_from.wphw03 == wp_to) { wp_from.wphw03 = wp_to; return; }
+       if (!wp_from.wphw04 || wp_from.wphw04 == wp_to) { wp_from.wphw04 = wp_to; return; }
+       if (!wp_from.wphw05 || wp_from.wphw05 == wp_to) { wp_from.wphw05 = wp_to; return; }
+       if (!wp_from.wphw06 || wp_from.wphw06 == wp_to) { wp_from.wphw06 = wp_to; return; }
+       if (!wp_from.wphw07 || wp_from.wphw07 == wp_to) { wp_from.wphw07 = wp_to; return; }
+
+       return;
+}
+
+void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to)
+{
+       if (!(wp_from && wp_to))
+               return;
+
+       int removed = -1;
+       if (removed < 0 && wp_from.wphw00 == wp_to) removed = 0;
+       if (removed < 0 && wp_from.wphw01 == wp_to) removed = 1;
+       if (removed < 0 && wp_from.wphw02 == wp_to) removed = 2;
+       if (removed < 0 && wp_from.wphw03 == wp_to) removed = 3;
+       if (removed < 0 && wp_from.wphw04 == wp_to) removed = 4;
+       if (removed < 0 && wp_from.wphw05 == wp_to) removed = 5;
+       if (removed < 0 && wp_from.wphw06 == wp_to) removed = 6;
+       if (removed < 0 && wp_from.wphw07 == wp_to) removed = 7;
+
+       if (removed >= 0)
+       {
+               if (removed <= 0) wp_from.wphw00 = wp_from.wphw01;
+               if (removed <= 1) wp_from.wphw01 = wp_from.wphw02;
+               if (removed <= 2) wp_from.wphw02 = wp_from.wphw03;
+               if (removed <= 3) wp_from.wphw03 = wp_from.wphw04;
+               if (removed <= 4) wp_from.wphw04 = wp_from.wphw05;
+               if (removed <= 5) wp_from.wphw05 = wp_from.wphw06;
+               if (removed <= 6) wp_from.wphw06 = wp_from.wphw07;
+               if (removed <= 7) wp_from.wphw07 = NULL;
+               if (!wp_from.wphw00)
+                       waypoint_setupmodel(wp_from);
+       }
+
+       return;
+}
+
+void waypoint_restore_hardwiredlinks(entity wp)
+{
+       if (wp.wphw00) waypoint_addlink(wp, wp.wphw00);
+       if (wp.wphw01) waypoint_addlink(wp, wp.wphw01);
+       if (wp.wphw02) waypoint_addlink(wp, wp.wphw02);
+       if (wp.wphw03) waypoint_addlink(wp, wp.wphw03);
+       if (wp.wphw04) waypoint_addlink(wp, wp.wphw04);
+       if (wp.wphw05) waypoint_addlink(wp, wp.wphw05);
+       if (wp.wphw06) waypoint_addlink(wp, wp.wphw06);
+       if (wp.wphw07) waypoint_addlink(wp, wp.wphw07);
+}
+
 void waypoint_setupmodel(entity wp)
 {
        if (autocvar_g_waypointeditor)
@@ -270,11 +364,23 @@ void waypoint_setupmodel(entity wp)
                setsize(wp, m1, m2);
                wp.effects = EF_LOWPRECISION;
                if (wp.wpflags & WAYPOINTFLAG_ITEM)
-                       wp.colormod = '1 0 0';
+                       wp.colormod = '1 0 0'; // red
                else if (wp.wpflags & WAYPOINTFLAG_GENERATED)
-                       wp.colormod = '1 1 0';
-               else if (wp.wphardwired)
-                       wp.colormod = '0.5 0 1';
+                       wp.colormod = '1 1 0'; // yellow
+               else if (wp.wpflags & WAYPOINTFLAG_SUPPORT)
+                       wp.colormod = '0 1 0'; // green
+               else if (wp.wpflags & WAYPOINTFLAG_CUSTOM_JP)
+                       wp.colormod = '1 0.5 0'; // orange
+               else if (wp.wpflags & WAYPOINTFLAG_TELEPORT)
+                       wp.colormod = '1 0.5 0'; // orange
+               else if (wp.wpflags & WAYPOINTFLAG_LADDER)
+                       wp.colormod = '1 0.5 0'; // orange
+               else if (wp.wpflags & WAYPOINTFLAG_JUMP)
+                       wp.colormod = '1 0.5 0'; // orange
+               else if (wp.wpflags & WAYPOINTFLAG_CROUCH)
+                       wp.colormod = '0 1 1'; // cyan
+               else if (waypoint_has_hardwiredlinks(wp))
+                       wp.colormod = '0.5 0 1'; // purple
                else
                        wp.colormod = '1 1 1';
        }
@@ -282,21 +388,54 @@ void waypoint_setupmodel(entity wp)
                wp.model = "";
 }
 
+string waypoint_get_type_name(entity wp)
+{
+       if (wp.wpflags & WAYPOINTFLAG_ITEM) return "^1Item waypoint";
+       else if (wp.wpflags & WAYPOINTFLAG_CROUCH) return "^5Crouch waypoint";
+       else if (wp.wpflags & WAYPOINTFLAG_JUMP) return "^xf80Jump waypoint";
+       else if (wp.wpflags & WAYPOINTFLAG_SUPPORT) return "^2Support waypoint";
+       else if (waypoint_has_hardwiredlinks(wp)) return "^x80fHardwired waypoint";
+       else if (wp.wpflags & WAYPOINTFLAG_LADDER) return "^3Ladder waypoint";
+       else if (wp.wpflags & WAYPOINTFLAG_TELEPORT)
+       {
+               if (!wp.wpisbox) return "^3Warpzone waypoint";
+               else if (wp.wpflags & WAYPOINTFLAG_CUSTOM_JP) return "^3Custom jumppad waypoint";
+               else
+               {
+                       IL_EACH(g_jumppads, boxesoverlap(wp.absmin, wp.absmax, it.absmin, it.absmax),
+                               { return "^3Jumppad waypoint"; });
+                       return "^3Teleport waypoint";
+               }
+       }
+
+       return "^7Waypoint";
+}
+
+entity waypoint_get(vector m1, vector m2)
+{
+       if (m1 == m2)
+       {
+               m1 -= '8 8 8';
+               m2 += '8 8 8';
+       }
+       IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax), { return it; });
+
+       return NULL;
+}
+
+.float createdtime;
 entity waypoint_spawn(vector m1, vector m2, float f)
 {
        if(!(f & (WAYPOINTFLAG_PERSONAL | WAYPOINTFLAG_GENERATED)) && m1 == m2)
        {
-               vector em1 = m1 - '8 8 8';
-               vector em2 = m2 + '8 8 8';
-               IL_EACH(g_waypoints, boxesoverlap(em1, em2, it.absmin, it.absmax),
-               {
-                       return it;
-               });
+               entity wp_found = waypoint_get(m1, m2);
+               if (wp_found)
+                       return wp_found;
        }
        // spawn only one destination waypoint for teleports teleporting player to the exact same spot
        // otherwise links loaded from file would be applied only to the first destination
        // waypoint since link format doesn't specify waypoint entities but just positions
-       if((f & WAYPOINTFLAG_GENERATED) && !(f & (WAYPOINTFLAG_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2)
+       if((f & WAYPOINTFLAG_GENERATED) && !(f & (WPFLAGMASK_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2)
        {
                IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax),
                {
@@ -309,6 +448,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        w.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
        w.wpflags = f;
        w.solid = SOLID_TRIGGER;
+       w.createdtime = time;
        setorigin(w, (m1 + m2) * 0.5);
        setsize(w, m1 - w.origin, m2 - w.origin);
        if (w.size)
@@ -316,7 +456,10 @@ entity waypoint_spawn(vector m1, vector m2, float f)
 
        if(!w.wpisbox)
        {
-               setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0');
+               if (f & WAYPOINTFLAG_CROUCH)
+                       setsize(w, PL_CROUCH_MIN_CONST - '1 1 0', PL_CROUCH_MAX_CONST + '1 1 0');
+               else
+                       setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0');
                if(!move_out_of_solid(w))
                {
                        if(!(f & WAYPOINTFLAG_GENERATED))
@@ -345,10 +488,114 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        return w;
 }
 
-void waypoint_spawn_fromeditor(entity pl)
+float trigger_push_get_push_time(entity this, vector endpos);
+void waypoint_addlink_for_custom_jumppad(entity wp_from, entity wp_to)
+{
+       entity jp = NULL;
+       IL_EACH(g_jumppads, boxesoverlap(wp_from.absmin, wp_from.absmax, it.absmin, it.absmax),
+       {
+               jp = it;
+               break;
+       });
+       if (!jp)
+               return;
+
+       float cost = trigger_push_get_push_time(jp, wp_to.origin);
+       wp_from.wp00 = wp_to;
+       wp_from.wp00mincost = cost;
+       jp.nearestwaypoint = wp_from;
+       jp.nearestwaypointtimeout = -1;
+}
+
+bool start_wp_is_spawned;
+vector start_wp_origin;
+bool start_wp_is_hardwired;
+bool start_wp_is_support;
+
+void waypoint_clear_start_wp_globals(entity pl, bool warn)
+{
+       start_wp_is_spawned = false;
+       start_wp_origin = '0 0 0';
+       pl.wp_locked = NULL;
+       start_wp_is_hardwired = false;
+       start_wp_is_support = false;
+       if (warn)
+               LOG_INFO("^xf80Start waypoint has been cleared.\n");
+}
+
+void waypoint_start_hardwiredlink(entity pl, bool at_crosshair)
+{
+       entity wp = pl.nearestwaypoint;
+       if (at_crosshair)
+       {
+               crosshair_trace_waypoints(pl);
+               wp = trace_ent;
+       }
+       string err = "";
+       if (start_wp_is_spawned && !start_wp_is_hardwired)
+               err = "can't hardwire while in the process of creating a special link";
+       else if (!wp)
+       {
+               if (at_crosshair)
+                       err = "couldn't find any waypoint at crosshair";
+               else
+                       err = "couldn't find any waypoint nearby";
+       }
+       else if (wp.wpflags & WPFLAGMASK_NORELINK)
+               err = "can't hardwire a waypoint with special links";
+
+       if (err == "")
+       {
+               start_wp_is_hardwired = true;
+               start_wp_is_spawned = true;
+               start_wp_origin = wp.origin;
+               pl.wp_locked = wp;
+               LOG_INFOF("^x80fWaypoint %s marked as hardwired link origin.\n", vtos(wp.origin));
+       }
+       else
+       {
+               start_wp_is_hardwired = false;
+               LOG_INFO("Error: ", err, "\n");
+       }
+}
+
+void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp)
 {
-       entity e;
+       if (WAYPOINT_VERSION < waypoint_version_loaded)
+       {
+               LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
+                       "Update Xonotic to make them editable.", waypoint_version_loaded);
+               return;
+       }
+
+       entity e = NULL, jp = NULL;
        vector org = pl.origin;
+       if (at_crosshair)
+       {
+               crosshair_trace_waypoints(pl);
+               org = trace_endpos;
+               if (!trace_ent)
+                       org.z -= PL_MIN_CONST.z;
+               if (!(start_wp_is_hardwired || start_wp_is_support))
+                       IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
+                       {
+                               jp = it;
+                               break;
+                       });
+               if (!jp && !start_wp_is_spawned && trace_ent)
+               {
+                       if (trace_ent.wpflags & (WAYPOINTFLAG_JUMP))
+                               is_jump_wp = true;
+                       else if (trace_ent.wpflags & (WAYPOINTFLAG_SUPPORT))
+                               is_support_wp = true;
+               }
+       }
+       if (jp || is_jump_wp || is_support_wp)
+       {
+               if (start_wp_is_spawned)
+                       start_wp_is_spawned = false;
+               LOG_INFO("^xf80Spawning start waypoint...\n");
+       }
        int ctf_flags = havocbot_symmetry_origin_order;
        bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2)
                   || (autocvar_g_waypointeditor_symmetrical < 0));
@@ -358,7 +605,7 @@ void waypoint_spawn_fromeditor(entity pl)
                ctf_flags = 2;
        int wp_num = ctf_flags;
 
-       if(!PHYS_INPUT_BUTTON_CROUCH(pl))
+       if(!PHYS_INPUT_BUTTON_CROUCH(pl) && !at_crosshair && !is_jump_wp && !is_support_wp)
        {
                // snap waypoint to item's origin if close enough
                IL_EACH(g_items, true,
@@ -373,18 +620,169 @@ void waypoint_spawn_fromeditor(entity pl)
                });
        }
 
+       vector start_org = '0 0 0';
+       if (start_wp_is_spawned)
+       {
+               if (!start_wp_is_hardwired)
+                       LOG_INFO("^xf80Spawning destination waypoint...\n");
+               start_org = start_wp_origin;
+       }
+
+       // save org as it can be modified spawning symmetrycal waypoints
+       vector initial_origin = '0 0 0';
+       bool initial_origin_is_set = false;
+
        LABEL(add_wp);
-       e = waypoint_spawn(org, org, 0);
+
+       if (jp)
+       {
+               e = NULL;
+               IL_EACH(g_waypoints, (it.wpflags & WPFLAGMASK_NORELINK)
+                       && boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
+               {
+                       e = it; break;
+               });
+               if (!e)
+                       e = waypoint_spawn(jp.absmin - PL_MAX_CONST + '1 1 1', jp.absmax - PL_MIN_CONST + '-1 -1 -1', WAYPOINTFLAG_TELEPORT);
+               if (!pl.wp_locked)
+                       pl.wp_locked = e;
+       }
+       else if (is_jump_wp || is_support_wp)
+       {
+               int type_flag = (is_jump_wp) ? WAYPOINTFLAG_JUMP : WAYPOINTFLAG_SUPPORT;
+
+               entity wp_found = waypoint_get(org, org);
+               if (wp_found && !(wp_found.wpflags & type_flag))
+               {
+                       LOG_INFOF("Error: can't spawn a %s waypoint over an existent waypoint of a different type\n", (is_jump_wp) ? "Jump" : "Support");
+                       return;
+               }
+               e = waypoint_spawn(org, org, type_flag);
+               if (!pl.wp_locked)
+                       pl.wp_locked = e;
+       }
+       else
+               e = waypoint_spawn(org, org, (is_crouch_wp) ? WAYPOINTFLAG_CROUCH : 0);
        if(!e)
        {
                LOG_INFOF("Couldn't spawn waypoint at %v\n", org);
+               if (start_wp_is_spawned)
+                       waypoint_clear_start_wp_globals(pl, true);
                return;
        }
-       waypoint_schedulerelink(e);
-       bprint(strcat("Waypoint spawned at ", vtos(e.origin), "\n"));
-       if(sym)
+
+       if (!initial_origin_is_set)
+       {
+               initial_origin = e.origin;
+               initial_origin_is_set = true;
+       }
+
+       entity start_wp = NULL;
+       if (start_wp_is_spawned)
+       {
+               IL_EACH(g_waypoints, (start_wp_is_hardwired || (it.wpflags & WPFLAGMASK_NORELINK))
+                       && boxesoverlap(start_org, start_org, it.absmin, it.absmax),
+               {
+                       start_wp = it; break;
+               });
+               if(!start_wp)
+               {
+                       // should not happen
+                       LOG_INFOF("Couldn't find start waypoint at %v\n", start_org);
+                       waypoint_clear_start_wp_globals(pl, true);
+                       return;
+               }
+               if (start_wp_is_hardwired)
+               {
+                       if (waypoint_is_hardwiredlink(start_wp, e))
+                       {
+                               waypoint_unmark_hardwiredlink(start_wp, e);
+                               waypoint_removelink(start_wp, e);
+                               string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
+                               LOG_INFOF("^x80fRemoved hardwired link %s.\n", s);
+                       }
+                       else
+                       {
+                               if (e.createdtime == time)
+                               {
+                                       LOG_INFO("Error: hardwired links can be created only between 2 existing (and unconnected) waypoints.\n");
+                                       waypoint_remove(e);
+                                       waypoint_clear_start_wp_globals(pl, true);
+                                       waypoint_spawn_fromeditor(pl, at_crosshair, is_jump_wp, is_crouch_wp, is_support_wp);
+                                       return;
+                               }
+                               if (start_wp == e)
+                               {
+                                       LOG_INFO("Error: start and destination waypoints coincide.\n");
+                                       waypoint_clear_start_wp_globals(pl, true);
+                                       return;
+                               }
+                               if (waypoint_islinked(start_wp, e))
+                               {
+                                       LOG_INFO("Error: waypoints are already linked.\n");
+                                       waypoint_clear_start_wp_globals(pl, true);
+                                       return;
+                               }
+                               waypoint_addlink(start_wp, e);
+                               waypoint_mark_hardwiredlink(start_wp, e);
+                               string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
+                               LOG_INFOF("^x80fAdded hardwired link %s.\n", s);
+                       }
+               }
+               else
+               {
+                       if (start_wp_is_support)
+                       {
+                               if (e.SUPPORT_WP)
+                               {
+                                       LOG_INFOF("Waypoint %v has already a support waypoint, delete it first.\n", e.origin);
+                                       waypoint_clear_start_wp_globals(pl, true);
+                                       return;
+                               }
+                               // clear all links to e
+                               IL_EACH(g_waypoints, it != e,
+                               {
+                                       if (waypoint_islinked(it, e) && !waypoint_is_hardwiredlink(it, e))
+                                               waypoint_removelink(it, e);
+                               });
+                       }
+                       waypoint_addlink(start_wp, e);
+               }
+       }
+
+       if (!(jp || is_jump_wp || is_support_wp || start_wp_is_hardwired))
+               waypoint_schedulerelink(e);
+
+       string wp_type_str = waypoint_get_type_name(e);
+
+       bprint(strcat(wp_type_str, "^7 spawned at ", vtos(e.origin), "\n"));
+
+       if (start_wp_is_spawned)
+       {
+               pl.wp_locked = NULL;
+               if (!start_wp_is_hardwired)
+                       waypoint_schedulerelink(start_wp);
+               if (start_wp.wpflags & WAYPOINTFLAG_TELEPORT)
+               {
+                       if (start_wp.wp00_original == start_wp.wp00)
+                               start_wp.wpflags &= ~WAYPOINTFLAG_CUSTOM_JP;
+                       else
+                               start_wp.wpflags |= WAYPOINTFLAG_CUSTOM_JP;
+               }
+       }
+
+       if (sym)
        {
-               org = waypoint_getSymmetricalPoint(e.origin, ctf_flags);
+               org = waypoint_getSymmetricalPoint(org, ctf_flags);
+               if (jp)
+               {
+                       IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
+                       {
+                               jp = it; break;
+                       });
+               }
+               if (start_wp_is_spawned)
+                       start_org = waypoint_getSymmetricalPoint(start_org, ctf_flags);
                if (vdist(org - pl.origin, >, 32))
                {
                        if(wp_num > 2)
@@ -394,20 +792,52 @@ void waypoint_spawn_fromeditor(entity pl)
                        goto add_wp;
                }
        }
+       if (jp || is_jump_wp || is_support_wp)
+       {
+               if (!start_wp_is_spawned)
+               {
+                       // we've just created a custom jumppad waypoint
+                       // the next one created by the user will be the destination waypoint
+                       start_wp_is_spawned = true;
+                       start_wp_origin = initial_origin;
+                       if (is_support_wp)
+                               start_wp_is_support = true;
+               }
+       }
+       else if (start_wp_is_spawned)
+       {
+               waypoint_clear_start_wp_globals(pl, false);
+       }
 }
 
 void waypoint_remove(entity wp)
 {
        IL_EACH(g_waypoints, it != wp,
        {
+               if (it.SUPPORT_WP == wp)
+               {
+                       it.SUPPORT_WP = NULL;
+                       waypoint_schedulerelink(it); // restore incoming links
+               }
                if (waypoint_islinked(it, wp))
+               {
+                       if (waypoint_is_hardwiredlink(it, wp))
+                               waypoint_unmark_hardwiredlink(it, wp);
                        waypoint_removelink(it, wp);
+               }
        });
        delete(wp);
 }
 
 void waypoint_remove_fromeditor(entity pl)
 {
+       if (WAYPOINT_VERSION < waypoint_version_loaded)
+       {
+               LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
+                       "Update Xonotic to make them editable.", waypoint_version_loaded);
+               return;
+       }
+
        entity e = navigation_findnearestwaypoint(pl, false);
 
        int ctf_flags = havocbot_symmetry_origin_order;
@@ -421,11 +851,17 @@ void waypoint_remove_fromeditor(entity pl)
 
        LABEL(remove_wp);
        if (!e) return;
-       if (e.wpflags & WAYPOINTFLAG_GENERATED) return;
 
-       if (e.wphardwired)
+       if (e.wpflags & WAYPOINTFLAG_GENERATED)
        {
-               LOG_INFO("^1Warning: ^7Removal of hardwired waypoints is not allowed in the editor. Please remove links from/to this waypoint (", vtos(e.origin), ") by hand from maps/", mapname, ".waypoints.hardwired\n");
+               if (start_wp_is_spawned)
+                       waypoint_clear_start_wp_globals(pl, true);
+               return;
+       }
+
+       if (waypoint_has_hardwiredlinks(e))
+       {
+               LOG_INFO("Can't remove a waypoint with hardwired links, remove links with \"wpeditor hardwire\" first\n");
                return;
        }
 
@@ -443,6 +879,7 @@ void waypoint_remove_fromeditor(entity pl)
        }
 
        bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n"));
+       te_explosion(e.origin);
        waypoint_remove(e);
 
        if (sym && wp_sym)
@@ -454,11 +891,14 @@ void waypoint_remove_fromeditor(entity pl)
                        sym = false;
                goto remove_wp;
        }
+
+       if (start_wp_is_spawned)
+               waypoint_clear_start_wp_globals(pl, true);
 }
 
 void waypoint_removelink(entity from, entity to)
 {
-       if (from == to || (from.wpflags & WAYPOINTFLAG_NORELINK))
+       if (from == to || ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))))
                return;
 
        entity fromwp31_prev = from.wp31;
@@ -567,12 +1007,18 @@ float waypoint_getlinearcost(float dist)
                return dist / (autocvar_sv_maxspeed * 1.25);
        return dist / autocvar_sv_maxspeed;
 }
+
 float waypoint_getlinearcost_underwater(float dist)
 {
        // NOTE: underwater speed factor is hardcoded in the engine too, see SV_WaterMove
        return dist / (autocvar_sv_maxspeed * 0.7);
 }
 
+float waypoint_getlinearcost_crouched(float dist)
+{
+       return dist / (autocvar_sv_maxspeed * 0.5);
+}
+
 float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent)
 {
        bool submerged_from = navigation_check_submerged_state(from_ent, from);
@@ -581,19 +1027,32 @@ float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_
        if (submerged_from && submerged_to)
                return waypoint_getlinearcost_underwater(vlen(to - from));
 
+       if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) && (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
+               return waypoint_getlinearcost_crouched(vlen(to - from));
+
        float c = waypoint_getlinearcost(vlen(to - from));
 
        float height = from.z - to.z;
        if(height > jumpheight_vec.z && autocvar_sv_gravity > 0)
        {
-               float height_cost = sqrt(height / (autocvar_sv_gravity / 2));
+               float height_cost; // fall cost
+               if (from_ent.wpflags & WAYPOINTFLAG_JUMP)
+                       height_cost = jumpheight_time + sqrt((height + jumpheight_vec.z) / (autocvar_sv_gravity / 2));
+               else
+                       height_cost = sqrt(height / (autocvar_sv_gravity / 2));
                c = waypoint_getlinearcost(vlen(vec2(to - from))); // xy distance cost
                if(height_cost > c)
                        c = height_cost;
        }
 
+       // consider half path underwater
        if (submerged_from || submerged_to)
                return (c + waypoint_getlinearcost_underwater(vlen(to - from))) / 2;
+
+       // consider half path crouched
+       if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) || (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
+               return (c + waypoint_getlinearcost_crouched(vlen(to - from))) / 2;
+
        return c;
 }
 
@@ -624,7 +1083,7 @@ void waypoint_addlink_customcost(entity from, entity to, float c)
 {
        if (from == to || waypoint_islinked(from, to))
                return;
-       if (c == -1 && (from.wpflags & WAYPOINTFLAG_NORELINK))
+       if (c == -1 && (from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))
                return;
 
        if(c == -1)
@@ -667,7 +1126,13 @@ void waypoint_addlink_customcost(entity from, entity to, float c)
 
 void waypoint_addlink(entity from, entity to)
 {
-       waypoint_addlink_customcost(from, to, -1);
+       if ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))
+               waypoint_addlink_for_custom_jumppad(from, to);
+       else
+               waypoint_addlink_customcost(from, to, -1);
+
+       if (from.wpflags & WAYPOINTFLAG_SUPPORT)
+               to.SUPPORT_WP = from;
 }
 
 // relink this spawnfunc_waypoint
@@ -690,8 +1155,10 @@ void waypoint_think(entity this)
        {
                if (boxesoverlap(this.absmin, this.absmax, it.absmin, it.absmax))
                {
-                       waypoint_addlink(this, it);
-                       waypoint_addlink(it, this);
+                       if (!(this.wpflags & WPFLAGMASK_NORELINK))
+                               waypoint_addlink(this, it);
+                       if (!(it.wpflags & WPFLAGMASK_NORELINK))
+                               waypoint_addlink(it, this);
                }
                else
                {
@@ -711,7 +1178,22 @@ void waypoint_think(entity this)
 
                        dv = ev - sv;
                        dv.z = 0;
-                       if(vdist(dv, >=, 1050)) // max search distance in XY
+                       int maxdist = 1050;
+                       vector m1 = PL_MIN_CONST;
+                       vector m2 = PL_MAX_CONST;
+
+                       if ((this.wpflags & WAYPOINTFLAG_CROUCH) || (it.wpflags & WAYPOINTFLAG_CROUCH))
+                       {
+                               m1 = PL_CROUCH_MIN_CONST;
+                               m2 = PL_CROUCH_MAX_CONST;
+                               // links from crouch wp to normal wp (and viceversa) are very short to avoid creating many links
+                               // that would be wasted due to rough travel cost calculation (the longer link is, the higher cost is)
+                               // links from crouch wp to crouch wp can be as long as normal links
+                               if (!((this.wpflags & WAYPOINTFLAG_CROUCH) && (it.wpflags & WAYPOINTFLAG_CROUCH)))
+                                       maxdist = 100;
+                       }
+
+                       if (vdist(dv, >=, maxdist)) // max search distance in XY
                        {
                                ++relink_lengthculled;
                                continue;
@@ -721,30 +1203,45 @@ void waypoint_think(entity this)
 
                        //traceline(this.origin, it.origin, false, NULL);
                        //if (trace_fraction == 1)
-                       if (this.wpisbox)
+                       if (this.wpisbox || (this.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid outgoing links
+                               || it.SUPPORT_WP) // forbid incoming links
+                       {
                                relink_walkculled += 0.5;
+                       }
                        else
                        {
-                               if (tracewalk(this, sv, PL_MIN_CONST, PL_MAX_CONST, ev2, ev2_height, MOVE_NOMONSTERS))
+                               if (tracewalk(this, sv, m1, m2, ev2, ev2_height, MOVE_NOMONSTERS))
                                        waypoint_addlink(this, it);
                                else
                                        relink_walkculled += 0.5;
                        }
 
-                       if (it.wpisbox)
+                       // reverse direction
+                       if (it.wpisbox || (it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid incoming links
+                               || this.SUPPORT_WP) // forbid outgoing links
+                       {
                                relink_walkculled += 0.5;
+                       }
                        else
                        {
-                               if (tracewalk(this, ev, PL_MIN_CONST, PL_MAX_CONST, sv2, sv2_height, MOVE_NOMONSTERS))
+                               if (tracewalk(this, ev, m1, m2, sv2, sv2_height, MOVE_NOMONSTERS))
                                        waypoint_addlink(it, this);
                                else
                                        relink_walkculled += 0.5;
                        }
                }
        });
+
+       // waypoint_clearlinks preserves references to old hardwired links (.wphwXX links)
+       // so they can be restored here when a wp is spawned over an existing one
+       waypoint_restore_hardwiredlinks(this);
+
        navigation_testtracewalk = 0;
        this.wplinked = true;
        this.dphitcontentsmask = dphitcontentsmask_save;
+
+       setthink(this, func_null);
+       this.nextthink = 0;
 }
 
 void waypoint_clearlinks(entity wp)
@@ -761,6 +1258,8 @@ void waypoint_clearlinks(entity wp)
        wp.wp16mincost = wp.wp17mincost = wp.wp18mincost = wp.wp19mincost = wp.wp20mincost = wp.wp21mincost = wp.wp22mincost = wp.wp23mincost = f;
        wp.wp24mincost = wp.wp25mincost = wp.wp26mincost = wp.wp27mincost = wp.wp28mincost = wp.wp29mincost = wp.wp30mincost = wp.wp31mincost = f;
 
+       // don't remove references to hardwired links (.wphwXX fields)
+
        wp.wplinked = false;
 }
 
@@ -775,7 +1274,7 @@ void waypoint_schedulerelink(entity wp)
        wp.enemy = NULL;
        if (!(wp.wpflags & WAYPOINTFLAG_PERSONAL))
                wp.owner = NULL;
-       if (!(wp.wpflags & WAYPOINTFLAG_NORELINK))
+       if (!(wp.wpflags & WPFLAGMASK_NORELINK))
                waypoint_clearlinks(wp);
        // schedule an actual relink on next frame
        setthink(wp, waypoint_think);
@@ -803,7 +1302,7 @@ void waypoint_schedulerelinkall()
        {
                waypoint_schedulerelink(it);
        });
-       waypoint_load_links_hardwired();
+       waypoint_load_hardwiredlinks();
 }
 
 #define GET_GAMETYPE_EXTENSION() ((g_race) ? ".race" : "")
@@ -933,6 +1432,8 @@ bool waypoint_load_links()
 
                ++c;
                waypoint_addlink(wp_from, wp_to);
+               if (wp_from.wp00_original && wp_from.wp00_original != wp_from.wp00)
+                       wp_from.wpflags |= WAYPOINTFLAG_CUSTOM_JP;
        }
 
        fclose(file);
@@ -955,7 +1456,7 @@ bool waypoint_load_links()
        return true;
 }
 
-void waypoint_load_or_remove_links_hardwired(bool removal_mode)
+void waypoint_load_hardwiredlinks()
 {
        string s;
        float file, tokens, c = 0, found;
@@ -978,11 +1479,11 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode)
 
        if (file < 0)
        {
-               if(!removal_mode)
-                       LOG_TRACE("waypoint links load from ", filename, " failed");
+               LOG_TRACE("waypoint links load from ", filename, " failed");
                return;
        }
 
+       bool is_special = false;
        while ((s = fgets(file)))
        {
                if(substring(s, 0, 2)=="//")
@@ -991,6 +1492,14 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode)
                if(substring(s, 0, 1)=="#")
                        continue;
 
+               // special links start with *, so old xonotic versions don't load them
+               is_special = false;
+               if (substring(s, 0, 1) == "*")
+               {
+                       is_special = true;
+                       s = substring(s, 1, -1);
+               }
+
                tokens = tokenizebyseparator(s, "*");
 
                if (tokens!=2)
@@ -1017,8 +1526,8 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode)
 
                        if(!found)
                        {
-                               if(!removal_mode)
-                                       LOG_INFO("NOTICE: Can not find origin waypoint for the hardwired link ", s, ". Path skipped");
+                               s = strcat(((is_special) ? "special link " : "hardwired link "), s);
+                               LOG_INFO("NOTICE: Can not find origin waypoint of the ", s, ". Path skipped");
                                continue;
                        }
                }
@@ -1039,29 +1548,28 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode)
 
                if(!found)
                {
-                       if(!removal_mode)
-                               LOG_INFO("NOTICE: Can not find destination waypoint for the hardwired link ", s, ". Path skipped");
+                       s = strcat(((is_special) ? "special link " : "hardwired link "), s);
+                       LOG_INFO("NOTICE: Can not find destination waypoint of the ", s, ". Path skipped");
                        continue;
                }
 
                ++c;
-               if(removal_mode)
+
+               if (!is_special)
                {
-                       waypoint_removelink(wp_from, wp_to);
-                       continue;
+                       waypoint_addlink(wp_from, wp_to);
+                       waypoint_mark_hardwiredlink(wp_from, wp_to);
+               } else if (wp_from.wpflags & WPFLAGMASK_NORELINK
+                       && ((wp_from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))
+                               || (wp_from.wpisbox && wp_from.wpflags & WAYPOINTFLAG_TELEPORT)))
+               {
+                       waypoint_addlink(wp_from, wp_to);
                }
-
-               waypoint_addlink(wp_from, wp_to);
-               wp_from.wphardwired = true;
-               wp_to.wphardwired = true;
-               waypoint_setupmodel(wp_from);
-               waypoint_setupmodel(wp_to);
        }
 
        fclose(file);
 
-       LOG_TRACE(((removal_mode) ? "unloaded " : "loaded "),
-               ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired");
+       LOG_TRACE("loaded ", ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired");
 }
 
 entity waypoint_get_link(entity w, float i)
@@ -1104,12 +1612,63 @@ entity waypoint_get_link(entity w, float i)
        }
 }
 
+// Save all hardwired waypoint links to a file
+void waypoint_save_hardwiredlinks()
+{
+       string gt_ext = GET_GAMETYPE_EXTENSION();
+
+       string filename = sprintf("maps/%s.waypoints.hardwired", strcat(mapname, gt_ext));
+       int file = fopen(filename, FILE_WRITE);
+       if (file < 0)
+       {
+               LOG_TRACE("waypoint hardwired links ", filename, " creation failed");
+               return;
+       }
+
+       // write hardwired links to file
+       int count = 0;
+       fputs(file, "// HARDWIRED LINKS\n");
+       IL_EACH(g_waypoints, waypoint_has_hardwiredlinks(it),
+       {
+               for (int j = 0; j < 32; ++j)
+               {
+                       entity link = waypoint_get_link(it, j);
+                       if (waypoint_is_hardwiredlink(it, link))
+                       {
+                               // NOTE: vtos rounds vector components to 1 decimal place
+                               string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n");
+                               fputs(file, s);
+                               ++count;
+                       }
+               }
+       });
+
+       // write special links to file
+       int count2 = 0;
+       fputs(file, "\n// SPECIAL LINKS\n");
+       IL_EACH(g_waypoints, it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP),
+       {
+               for (int j = 0; j < 32; ++j)
+               {
+                       entity link = waypoint_get_link(it, j);
+                       if (link)
+                       {
+                               // NOTE: vtos rounds vector components to 1 decimal place
+                               string s = strcat("*", vtos(it.origin), "*", vtos(link.origin), "\n");
+                               fputs(file, s);
+                               ++count2;
+                       }
+               }
+       });
+
+       fclose(file);
+
+       LOG_INFOF("saved %d hardwired links and %d special links to %s", count, count2, filename);
+}
+
 // Save all waypoint links to a file
 void waypoint_save_links()
 {
-       // temporarily remove hardwired links so they don't get saved among normal links
-       waypoint_remove_links_hardwired();
-
        string gt_ext = GET_GAMETYPE_EXTENSION();
 
        string filename = sprintf("maps/%s.waypoints.cache", strcat(mapname, gt_ext));
@@ -1125,12 +1684,12 @@ void waypoint_save_links()
                fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n"));
 
        int c = 0;
-       IL_EACH(g_waypoints, true,
+       IL_EACH(g_waypoints, !(it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP)),
        {
                for(int j = 0; j < 32; ++j)
                {
                        entity link = waypoint_get_link(it, j);
-                       if(link)
+                       if (link && !waypoint_is_hardwiredlink(it, link))
                        {
                                // NOTE: vtos rounds vector components to 1 decimal place
                                string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n");
@@ -1144,13 +1703,17 @@ void waypoint_save_links()
        botframe_cachedwaypointlinks = true;
 
        LOG_INFOF("saved %d waypoint links to %s", c, filename);
-
-       waypoint_load_links_hardwired();
 }
 
 // save waypoints to gamedir/data/maps/mapname.waypoints
 void waypoint_saveall()
 {
+       if (WAYPOINT_VERSION < waypoint_version_loaded)
+       {
+               LOG_INFOF("^1Overwriting waypoints with a higher version number (%f) is not allowed.\n"
+                       "Update Xonotic to make them editable.", waypoint_version_loaded);
+               return;
+       }
        string gt_ext = GET_GAMETYPE_EXTENSION();
 
        string filename = sprintf("maps/%s.waypoints", strcat(mapname, gt_ext));
@@ -1216,8 +1779,11 @@ void waypoint_saveall()
        });
        fclose(file);
        waypoint_save_links();
+       waypoint_save_hardwiredlinks();
+
        botframe_loadedforcedlinks = false;
 
+       waypoint_version_loaded = WAYPOINT_VERSION;
        LOG_INFOF("saved %d waypoints to %s", c, filename);
 }
 
@@ -1225,7 +1791,7 @@ void waypoint_saveall()
 float waypoint_loadall()
 {
        string s;
-       float file, cwp, cwb, fl;
+       int file, cwp, cwb, fl;
        vector m1, m2;
        cwp = 0;
        cwb = 0;
@@ -1292,6 +1858,7 @@ float waypoint_loadall()
                if (!s)
                        break;
                fl = stof(s);
+               fl &= ~WAYPOINTFLAG_NORELINK__DEPRECATED;
                waypoint_spawn(m1, m2, fl);
                if (m1 == m2)
                        cwp = cwp + 1;
@@ -1299,6 +1866,7 @@ float waypoint_loadall()
                        cwb = cwb + 1;
        }
        fclose(file);
+       waypoint_version_loaded = ver;
        LOG_TRACE("loaded ", ftos(cwp), " waypoints and ", ftos(cwb), " wayboxes from maps/", mapname, ".waypoints");
 
        if (autocvar_g_waypointeditor && autocvar_g_waypointeditor_symmetrical_allowload)
@@ -1333,6 +1901,10 @@ float waypoint_loadall()
                LOG_INFO(strcat("g_waypointeditor_symmetrical", " has been set to ", cvar_string("g_waypointeditor_symmetrical")));
        }
 
+       if (WAYPOINT_VERSION < waypoint_version_loaded)
+               LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
+                       "Update Xonotic to make them editable.", waypoint_version_loaded);
+
        return cwp + cwb;
 }
 
@@ -1393,9 +1965,10 @@ void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1,
 {
        entity w;
        entity dw;
-       w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | teleport_flag | WAYPOINTFLAG_NORELINK);
+       w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | teleport_flag);
        dw = waypoint_spawn(destination1, destination2, WAYPOINTFLAG_GENERATED);
        // one way link to the destination
+       w.wp00_original = dw;
        w.wp00 = dw;
        w.wp00mincost = timetaken; // this is just for jump pads
        // the teleporter's nearest spawnfunc_waypoint is this one
@@ -1472,7 +2045,7 @@ void waypoint_showlink(entity wp1, entity wp2, int display_type)
        if (!(wp1 && wp2))
                return;
 
-       if (wp1.wphardwired && wp2.wphardwired)
+       if (waypoint_is_hardwiredlink(wp1, wp2) || (wp1.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP)))
                te_beam(NULL, wp1.origin, wp2.origin);
        else if (display_type == 1)
                te_lightning2(NULL, wp1.origin, wp2.origin);
@@ -1489,22 +2062,22 @@ void waypoint_showlinks_to(entity wp, int display_type)
 
 void waypoint_showlinks_from(entity wp, int display_type)
 {
-       waypoint_showlink(wp.wp00, wp, display_type); waypoint_showlink(wp.wp16, wp, display_type);
-       waypoint_showlink(wp.wp01, wp, display_type); waypoint_showlink(wp.wp17, wp, display_type);
-       waypoint_showlink(wp.wp02, wp, display_type); waypoint_showlink(wp.wp18, wp, display_type);
-       waypoint_showlink(wp.wp03, wp, display_type); waypoint_showlink(wp.wp19, wp, display_type);
-       waypoint_showlink(wp.wp04, wp, display_type); waypoint_showlink(wp.wp20, wp, display_type);
-       waypoint_showlink(wp.wp05, wp, display_type); waypoint_showlink(wp.wp21, wp, display_type);
-       waypoint_showlink(wp.wp06, wp, display_type); waypoint_showlink(wp.wp22, wp, display_type);
-       waypoint_showlink(wp.wp07, wp, display_type); waypoint_showlink(wp.wp23, wp, display_type);
-       waypoint_showlink(wp.wp08, wp, display_type); waypoint_showlink(wp.wp24, wp, display_type);
-       waypoint_showlink(wp.wp09, wp, display_type); waypoint_showlink(wp.wp25, wp, display_type);
-       waypoint_showlink(wp.wp10, wp, display_type); waypoint_showlink(wp.wp26, wp, display_type);
-       waypoint_showlink(wp.wp11, wp, display_type); waypoint_showlink(wp.wp27, wp, display_type);
-       waypoint_showlink(wp.wp12, wp, display_type); waypoint_showlink(wp.wp28, wp, display_type);
-       waypoint_showlink(wp.wp13, wp, display_type); waypoint_showlink(wp.wp29, wp, display_type);
-       waypoint_showlink(wp.wp14, wp, display_type); waypoint_showlink(wp.wp30, wp, display_type);
-       waypoint_showlink(wp.wp15, wp, display_type); waypoint_showlink(wp.wp31, wp, display_type);
+       waypoint_showlink(wp, wp.wp00, display_type); waypoint_showlink(wp, wp.wp16, display_type);
+       waypoint_showlink(wp, wp.wp01, display_type); waypoint_showlink(wp, wp.wp17, display_type);
+       waypoint_showlink(wp, wp.wp02, display_type); waypoint_showlink(wp, wp.wp18, display_type);
+       waypoint_showlink(wp, wp.wp03, display_type); waypoint_showlink(wp, wp.wp19, display_type);
+       waypoint_showlink(wp, wp.wp04, display_type); waypoint_showlink(wp, wp.wp20, display_type);
+       waypoint_showlink(wp, wp.wp05, display_type); waypoint_showlink(wp, wp.wp21, display_type);
+       waypoint_showlink(wp, wp.wp06, display_type); waypoint_showlink(wp, wp.wp22, display_type);
+       waypoint_showlink(wp, wp.wp07, display_type); waypoint_showlink(wp, wp.wp23, display_type);
+       waypoint_showlink(wp, wp.wp08, display_type); waypoint_showlink(wp, wp.wp24, display_type);
+       waypoint_showlink(wp, wp.wp09, display_type); waypoint_showlink(wp, wp.wp25, display_type);
+       waypoint_showlink(wp, wp.wp10, display_type); waypoint_showlink(wp, wp.wp26, display_type);
+       waypoint_showlink(wp, wp.wp11, display_type); waypoint_showlink(wp, wp.wp27, display_type);
+       waypoint_showlink(wp, wp.wp12, display_type); waypoint_showlink(wp, wp.wp28, display_type);
+       waypoint_showlink(wp, wp.wp13, display_type); waypoint_showlink(wp, wp.wp29, display_type);
+       waypoint_showlink(wp, wp.wp14, display_type); waypoint_showlink(wp, wp.wp30, display_type);
+       waypoint_showlink(wp, wp.wp15, display_type); waypoint_showlink(wp, wp.wp31, display_type);
 }
 
 void crosshair_trace_waypoints(entity pl)
@@ -1515,15 +2088,18 @@ void crosshair_trace_waypoints(entity pl)
                        setsize(it, '-16 -16 -16', '16 16 16');
        });
 
-       crosshair_trace(pl);
+       WarpZone_crosshair_trace(pl);
 
        IL_EACH(g_waypoints, true, {
                it.solid = SOLID_TRIGGER;
                if (!it.wpisbox)
                        setsize(it, '0 0 0', '0 0 0');
        });
+
        if (trace_ent.classname != "waypoint")
                trace_ent = NULL;
+       else if (!trace_ent.wpisbox)
+               trace_endpos = trace_ent.origin;
 }
 
 void botframe_showwaypointlinks()
@@ -1538,8 +2114,6 @@ void botframe_showwaypointlinks()
                        it.wp_aimed = NULL;
                if (wasfreed(it.wp_locked))
                        it.wp_locked = NULL;
-               if (PHYS_INPUT_BUTTON_USE(it))
-                       it.wp_locked = it.wp_aimed;
                entity head = it.wp_locked;
                if (!head)
                        head = navigation_findnearestwaypoint(it, false);
@@ -1547,7 +2121,7 @@ void botframe_showwaypointlinks()
                it.nearestwaypointtimeout = time + 2; // while I'm at it...
                if (IS_ONGROUND(it) || it.waterlevel > WATERLEVEL_NONE || it.wp_locked)
                        display_type = 1; // default
-               else if(head && (head.wphardwired))
+               else if(waypoint_has_hardwiredlinks(head))
                        display_type = 2; // only hardwired
 
                if (display_type)
@@ -1574,13 +2148,14 @@ void botframe_showwaypointlinks()
                                wp = trace_ent;
                                if (wp != it.wp_aimed)
                                {
-                                       str = sprintf("\necho ^2WP info^7: entity: %d, flags: %d, origin: '%s'\n", etof(wp), wp.wpflags, vtos(wp.origin));
+                                       string wp_type_str = waypoint_get_type_name(wp);
+                                       str = sprintf("\necho Entity %d: %s^7, flags: %d, origin: %s\n", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
                                        if (wp.wpisbox)
-                                               str = strcat(str, sprintf("echo \" absmin: '%s', absmax: '%s'\"\n", vtos(wp.absmin), vtos(wp.absmax)));
+                                               str = strcat(str, sprintf("echo \" absmin: %s, absmax: %s\"\n", vtos(wp.absmin), vtos(wp.absmax)));
                                        stuffcmd(it, str);
-                                       str = sprintf("entity: %d\nflags: %d\norigin: \'%s\'", etof(wp), wp.wpflags, vtos(wp.origin));
+                                       str = sprintf("Entity %d: %s^7\nflags: %d\norigin: %s", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
                                        if (wp.wpisbox)
-                                               str = strcat(str, sprintf(" \nabsmin: '%s'\nabsmax: '%s'", vtos(wp.absmin), vtos(wp.absmax)));
+                                               str = strcat(str, sprintf(" \nabsmin: %s\nabsmax: %s", vtos(wp.absmin), vtos(wp.absmax)));
                                        debug_text_3d(wp.origin, str, 0, 7, '0 0 0');
                                }
                        }
@@ -1648,7 +2223,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en
                }
 
                float bestdist = maxdist;
-               IL_EACH(g_waypoints, it != wp && !(it.wpflags & WAYPOINTFLAG_NORELINK),
+               IL_EACH(g_waypoints, it != wp && !(it.wpflags & WPFLAGMASK_NORELINK),
                {
                        float d = vlen(wp.origin - it.origin) + vlen(it.origin - porg);
                        if(d < bestdist)
index 0b69dcbb8bca3e80fa9d543c5fcab6305e1f3b8c..25356446a4d1c05d40ece80c5e6f81f64cbfab7e 100644 (file)
@@ -6,7 +6,8 @@
 // increase by 0.01 when changes require only waypoint relinking
 // increase by 1 when changes require to manually edit waypoints
 // max 2 decimal places, always specified
-const float WAYPOINT_VERSION = 1.02;
+const float WAYPOINT_VERSION = 1.04;
+float waypoint_version_loaded;
 string waypoint_time;
 
 // fields you can query using prvm_global server to get some statistics about waypoint linking culling
@@ -21,23 +22,42 @@ float botframe_cachedwaypointlinks;
 .entity wp00, wp01, wp02, wp03, wp04, wp05, wp06, wp07, wp08, wp09, wp10, wp11, wp12, wp13, wp14, wp15;
 .entity wp16, wp17, wp18, wp19, wp20, wp21, wp22, wp23, wp24, wp25, wp26, wp27, wp28, wp29, wp30, wp31;
 
+// used by jumppads to store original destination wp, used in case it gets changed in the editor
+.entity wp00_original;
+
 .float wp00mincost, wp01mincost, wp02mincost, wp03mincost, wp04mincost, wp05mincost, wp06mincost, wp07mincost;
 .float wp08mincost, wp09mincost, wp10mincost, wp11mincost, wp12mincost, wp13mincost, wp14mincost, wp15mincost;
 .float wp16mincost, wp17mincost, wp18mincost, wp19mincost, wp20mincost, wp21mincost, wp22mincost, wp23mincost;
 .float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost;
 
-.float wpfire, wpcost, wpconsidered, wpisbox, wplinked, wphardwired;
+// hardwired links are saved to the .wpXX fields among normal links
+// AND to the supporting .wphwXX fields to allow identifying them precisely
+// these links are not sorted, unlike normal links
+.entity wphw00, wphw01, wphw02, wphw03, wphw04, wphw05, wphw06, wphw07;
+
+.float wpcost;
+.int wpfire, wpconsidered, wpisbox, wplinked;
 .int wpflags;
 .entity wp_aimed;
 .entity wp_locked;
 
 .vector wpnearestpoint;
 
+// holds reference to the support waypoint, if any
+.entity goalentity;
+#define SUPPORT_WP goalentity
+
 /*
  * Functions
  */
 
 spawnfunc(waypoint);
+
+bool waypoint_has_hardwiredlinks(entity wp);
+bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to);
+void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to);
+void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to);
+
 void waypoint_removelink(entity from, entity to);
 int waypoint_getlinknum(entity from, entity to);
 bool waypoint_islinked(entity from, entity to);
@@ -66,11 +86,9 @@ void botframe_showwaypointlinks();
 
 float waypoint_loadall();
 bool waypoint_load_links();
-#define waypoint_load_links_hardwired() waypoint_load_or_remove_links_hardwired(false)
-#define waypoint_remove_links_hardwired() waypoint_load_or_remove_links_hardwired(true)
-void waypoint_load_or_remove_links_hardwired(bool removal_mode);
+void waypoint_load_hardwiredlinks();
 
-void waypoint_spawn_fromeditor(entity pl);
+void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp);
 entity waypoint_spawn(vector m1, vector m2, float f);
 entity waypoint_spawnpersonal(entity this, vector position);
 
index bdca146c2e549128e2e208fec27f8b118e091af4..a7f8e99f1d7cb7bdc9c9cc6780aae9f5d4fd4883 100644 (file)
@@ -39,6 +39,6 @@ void waypoint_spawnforitem(entity e) { }
 void waypoint_spawnforitem_force(entity e, vector org) { }
 void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent) { }
 void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent) { }
-void waypoint_spawn_fromeditor(entity pl) { }
+void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp) { }
 entity waypoint_spawn(vector m1, vector m2, float f) { return NULL; }
 #endif
index ddc7e47fa6c31386d3ff17c3d9b2d6e0a441ecbc..76e2cdeb8480069230118925719d77d9e105ae5b 100644 (file)
@@ -21,9 +21,11 @@ string campaign_index_var;
 
 float CampaignBailout(string s)
 {
+#if 0
        cvar = cvar_normal;
        cvar_string = cvar_string_normal;
        cvar_set = cvar_set_normal;
+#endif
        cvar_set("g_campaign", "0");
        LOG_INFO("^4campaign initialization failed: ", s);
        if(autocvar__campaign_testrun)
@@ -31,6 +33,7 @@ float CampaignBailout(string s)
        return 1;
 }
 
+#if 0
 string cvar_campaignwrapper_list; // string of format ; var value; var value; var value;
 string cvar_string_campaignwrapper(string theCvar)
 {
@@ -57,6 +60,7 @@ void cvar_set_campaignwrapper(string theCvar, string theValue)
        strunzone(s);
        //print(cvar_campaignwrapper_list, "\n");
 }
+#endif
 
 float Campaign_Invalid()
 {
@@ -104,16 +108,36 @@ void CampaignPreInit()
        cvar_set("sv_public", "0");
        cvar_set("pausable", "1");
 
+#if 0
        cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; "));
+#else
+       string cvar_campaignwrapper_list = strcat("; ", campaign_mutators[0], "; ");
+       int argc = tokenizebyseparator(cvar_campaignwrapper_list, "; ");
+       if(argc > 0)
+       {
+               for(int j = 0; j < argc; ++j)
+               {
+                       string arg = argv(j);
+                       if(arg == "") continue;
+                       _MapInfo_Parse_Settemp(mapname, MAPINFO_SETTEMP_ACL_USER, 0, arg, 0); // no recursion!
+               }
+       }
+#endif
 
+#if 0
        cvar = cvar_campaignwrapper;
        cvar_string = cvar_string_campaignwrapper;
        cvar_set = cvar_set_campaignwrapper;
-
        cvar_set("g_campaign", "1");
        cvar_set("g_dm", "0");
        cvar_set("skill", ftos(baseskill));
        cvar_set("bot_number", ftos(campaign_bots[0]));
+#else
+       cvar_settemp("g_campaign", "1");
+       cvar_settemp("g_dm", "0");
+       cvar_settemp("skill", ftos(baseskill));
+       cvar_settemp("bot_number", ftos(campaign_bots[0]));
+#endif
        MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
 
        // copy sv_gravity cvar, as the engine needs it too (sorry, this will mess
index 0034c2dd9ee3b687a0b600eee0b850cc056dfb89..98616a76341f76ac901e838fdd7b81cb39478911 100644 (file)
@@ -1617,7 +1617,7 @@ void player_regen(entity this)
                        this.event_damage(this, this, this, 1, DEATH_ROT.m_id, DMG_NOWEP, this.origin, '0 0 0');
        }
 
-       if (!(this.items & IT_UNLIMITED_WEAPON_AMMO))
+       if (!(this.items & IT_UNLIMITED_AMMO))
        {
                float minf, maxf, limitf;
 
index bc4a60e1a88d5f55d7688e0b5756d2f06329d885..b20a8af93cdd5a72539e334adaefabf7b47ae3ac 100644 (file)
@@ -98,7 +98,7 @@ CLASS(Client, Object)
     ATTRIB(Client, zoomstate, bool, this.zoomstate);
     ATTRIB(Client, just_joined, bool, this.just_joined);
     ATTRIB(Client, race_completed, bool, this.race_completed);
-    ATTRIBARRAY(Client, msg_choice_choices, int, 50); // TODO: actually NOTIF_CHOICE_MAX
+    ATTRIBARRAY(Client, msg_choice_choices, int, 20); // TODO: actually NOTIF_CHOICE_MAX
     ATTRIB(Client, latency_sum, float, this.latency_sum);
     ATTRIB(Client, latency_cnt, int, this.latency_cnt);
     ATTRIB(Client, latency_time, float, this.latency_time);
index 83c4768332184c2ff6cb30e43e8799c6f929f4cf..6928957d6d812e6f15511d2b82e421d8f0c7f877 100644 (file)
@@ -184,10 +184,11 @@ void ClientCommand_wpeditor(entity caller, int request, int argc)
                        {
                                if (argv(1) == "spawn")
                                {
+                                       string s = argv(2);
                                        if (!IS_PLAYER(caller))
                                                sprint(caller, "ERROR: this command works only if you are player\n");
                                        else
-                                               waypoint_spawn_fromeditor(caller);
+                                               waypoint_spawn_fromeditor(caller, (s == "crosshair"), (s == "jump"), (s == "crouch"), (s == "support"));
                                        return;
                                }
                                else if (argv(1) == "remove")
@@ -198,6 +199,17 @@ void ClientCommand_wpeditor(entity caller, int request, int argc)
                                                waypoint_remove_fromeditor(caller);
                                        return;
                                }
+                               else if (argv(1) == "hardwire")
+                               {
+                                       string s = argv(2);
+                                       waypoint_start_hardwiredlink(caller, (s == "crosshair"));
+                                       return;
+                               }
+                               else if (argv(1) == "lock")
+                               {
+                                       waypoint_lock(caller);
+                                       return;
+                               }
                                else if (argv(1) == "unreachable")
                                {
                                        if (!IS_PLAYER(caller))
@@ -240,13 +252,28 @@ void ClientCommand_wpeditor(entity caller, int request, int argc)
                case CMD_REQUEST_USAGE:
                {
                        sprint(caller, "\nUsage:^3 cmd wpeditor action\n");
-                       sprint(caller, "  Where 'action' can be: spawn, remove, unreachable, saveall, relinkall,\n");
-                       sprint(caller, "   symorigin get|set\n");
-                       sprint(caller, "   symorigin get|set p1 p2 ... pX\n");
-                       sprint(caller, "   symaxis get|set p1 p2\n");
-                       sprint(caller, "    where p1 p2 ... pX are positions \"x y z\" (z can be omitted)\n");
-                       sprint(caller, " symorigin and symaxis commands are useful to determine origin/axis of symmetry"
-                                                       " on maps without ctf flags or where flags aren't perfectly symmetrical\n");
+                       sprint(caller, "  Where 'action' can be:\n");
+                       sprint(caller, "   ^5spawn^7: spawns a waypoint at player's position\n");
+                       sprint(caller, "   ^5remove^7: removes player's nearest waypoint\n");
+                       sprint(caller, "   ^5unreachable^7: reveals waypoints and items unreachable from the current position and spawnpoints without a nearest waypoint\n");
+                       sprint(caller, "   ^5saveall^7: saves all waypoints and links to file\n");
+                       sprint(caller, "   ^5relinkall^7: relinks all waypoints as if they were respawned\n");
+                       sprint(caller, "   ^5spawn crosshair^7: spawns a waypoint at crosshair's position\n");
+                       sprint(caller, "   ^7 in general useful to create special and hardwired links with ease from existing waypoints\n");
+                       sprint(caller, "   ^7 in particular it's the only way to create custom jumppad waypoints (spawn another waypoint to create destination))\n");
+                       sprint(caller, "   ^5spawn jump^7: spawns a jump waypoint (place it at least 60 qu before jump start, spawn another waypoint to create destination)\n");
+                       sprint(caller, "   ^5spawn crouch^7: spawns a crouch waypoint (it links only to very close waypoints)\n");
+                       sprint(caller, "   ^5spawn support^7: spawns a support waypoint (spawn another waypoint to create destination from which all incoming links are removed)\n");
+                       sprint(caller, "   ^7 useful to replace links to problematic jumppad/teleport waypoints\n");
+                       sprint(caller, "   ^5hardwire^7: marks the nearest waypoint as origin of a new hardwired link (spawn another waypoint over an existing one to create destination)\n");
+                       sprint(caller, "   ^5hardwire crosshair^7: marks the waypoint at crosshair instead of the nearest waypoint\n");
+                       sprint(caller, "   ^5lock^7: locks link display of the aimed waypoint (unlocks if no waypoint is found at crosshair's position)\n");
+                       sprint(caller, "   ^5symorigin get|set\n");
+                       sprint(caller, "   ^5symorigin get|set p1 p2 ... pX\n");
+                       sprint(caller, "   ^5symaxis get|set p1 p2\n");
+                       sprint(caller, "   ^7 where p1 p2 ... pX are positions (\"x y z\", z can be omitted) that you know are perfectly symmetrical"
+                                                               " so you can determine origin/axis of symmetry of maps without ctf flags or where flags aren't perfectly symmetrical\n");
+                       sprint(caller, "  See 'wpeditor_menu' for a selectable list of various commands and useful settings to edit waypoints.\n");
                        return;
                }
        }
@@ -735,6 +762,18 @@ void ClientCommand_voice(entity caller, int request, int argc, string command)
                                        sprint(caller, sprintf("Invalid voice. Use one of: %s\n", allvoicesamples));
                                        return;
                                }
+                               if (IS_DEAD(caller))
+                               {
+                                       // don't warn the caller when trying to taunt while dead, just don't play any sounds!
+                                       // we still allow them to see warnings if it's invalid, so a dead player can find out the sounds in peace
+                                       return;
+                               }
+                               if (IS_SPEC(caller) || IS_OBSERVER(caller))
+                               {
+                                       // observers/spectators have no player model of their own to play taunts from
+                                       // again, allow them to see warnings
+                                       return;
+                               }
                                string msg = "";
                                if (argc >= 3)
                                        msg = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
index d79c2418d7adec421473ee7534ea01b9fe553c8c..b611ab2665896975ab0b4ce15c24da2480f61190 100644 (file)
@@ -440,6 +440,8 @@ void ReadyRestart_force()
        restart_mapalreadyrestarted = false; // reset this var, needed when cvar sv_ready_restart_repeatable is in use
 
        // disable the warmup global for the server
+       if(warmup_stage)
+               localcmd("\nsv_hook_warmupend\n");
        warmup_stage = 0;                // once the game is restarted the game is in match stage
 
        // reset the .ready status of all players (also spectators)
@@ -709,7 +711,9 @@ int VoteCommand_parse(entity caller, string vote_command, string vote_list, floa
                        break;
                }
 
-               case "nextmap": // TODO: replicate the old behaviour of being able to vote for maps from different modes on multimode servers (possibly support it in gotomap too), maybe fallback instead of aborting if map name is invalid?
+               // TODO: replicate the old behaviour of being able to vote for maps from different modes on multimode servers (possibly support it in gotomap too)
+               // maybe fallback instead of aborting if map name is invalid?
+               case "nextmap":
                {
                        vote_command = ValidateMap(argv(startpos + 1), caller);
                        if (!vote_command)  return -1;
@@ -719,6 +723,21 @@ int VoteCommand_parse(entity caller, string vote_command, string vote_list, floa
                        break;
                }
 
+               case "timelimit": // include restrictions on the maximum votable time limit
+               {
+                       float timelimit_vote = stof(argv(startpos + 1));
+                       if(timelimit_vote > autocvar_timelimit_max || timelimit_vote < autocvar_timelimit_min)
+                       {
+                               print_to(caller, strcat("Invalid timelimit vote, accepted values are between ", ftos(autocvar_timelimit_min), " and ", ftos(autocvar_timelimit_max), "."));
+                               return -1;
+                       }
+                       timelimit_vote = bound(autocvar_timelimit_min, timelimit_vote, autocvar_timelimit_max);
+                       vote_parsed_command = strcat("timelimit ", ftos(timelimit_vote));
+                       vote_parsed_display = strzone(strcat("^1", vote_parsed_command));
+
+                       break;
+               }
+
                case "restart":
                {
                        // add a delay so that vote result can be seen and announcer can be heard
index db928557e24dad7c0d239d85c45332dc3e6c314a..b1d73f6a3124c87110d254d1f2bc73f739003d38 100644 (file)
@@ -163,6 +163,7 @@ float default_player_alpha;
 float default_weapon_alpha;
 
 .float cvar_cl_handicap;
+.int cvar_cl_gunalign;
 .float cvar_cl_clippedspectating;
 .float cvar_cl_autoscreenshot;
 .float cvar_cl_jetpack_jump;
@@ -181,6 +182,7 @@ float default_weapon_alpha;
 
 .float cvar_cl_allow_uid2name;
 .float cvar_cl_allow_uidtracking;
+.bool cvar_cl_allow_uidranking;
 .string stored_netname;
 
 string gamemode_name;
@@ -190,9 +192,6 @@ string W_Apply_Weaponreplace(string in);
 void FixIntermissionClient(entity e);
 void FixClientCvars(entity e);
 
-// WEAPONTODO: remove this
-//WepSet weaponsInMap;
-
 .float respawn_countdown; // next number to count
 
 float bot_waypoints_for_items;
index 2c5b9dea3231d0025c788e0ab7a20da340c93d8a..0c44a95f17bf5385372fb106e1dd4e37114930ee 100644 (file)
@@ -266,6 +266,7 @@ void cvar_changes_init()
                BADCVAR("g_domination");
                BADCVAR("g_domination_default_teams");
                BADCVAR("g_duel");
+               BADCVAR("g_duel_not_dm_maps");
                BADCVAR("g_freezetag");
                BADCVAR("g_freezetag_teams");
                BADCVAR("g_invasion_teams");
@@ -283,8 +284,10 @@ void cvar_changes_init()
                BADCVAR("g_race_qualifying_timelimit");
                BADCVAR("g_race_qualifying_timelimit_override");
                BADCVAR("g_runematch");
+               BADCVAR("g_shootfromeye");
                BADCVAR("g_snafu");
                BADCVAR("g_tdm");
+               BADCVAR("g_tdm_on_dm_maps");
                BADCVAR("g_tdm_teams");
                BADCVAR("g_vip");
                BADCVAR("leadlimit");
@@ -292,6 +295,8 @@ void cvar_changes_init()
                BADCVAR("teamplay");
                BADCVAR("timelimit");
                BADCVAR("g_mapinfo_ignore_warnings");
+               BADCVAR("g_maplist_ignore_sizes");
+               BADCVAR("g_maplist_sizes_count_bots");
 
                // long
                BADCVAR("hostname");
@@ -320,6 +325,7 @@ void cvar_changes_init()
                BADCVAR("captureleadlimit_override");
                BADCVAR("condump_stripcolors");
                BADCVAR("gameversion");
+               BADCVAR("fs_gamedir");
                BADCVAR("g_allow_oldvortexbeam");
                BADCVAR("g_balance_kill_delay");
                BADCVAR("g_buffs_pickup_anyway");
@@ -339,6 +345,7 @@ void cvar_changes_init()
                BADCVAR("g_jump_grunt");
                BADCVAR("g_keyhunt_point_leadlimit");
                BADCVAR("g_nexball_goalleadlimit");
+               BADCVAR("g_new_toys_autoreplace");
                BADCVAR("g_new_toys_use_pickupsound");
                BADCVAR("g_physics_predictall");
                BADCVAR("g_piggyback");
@@ -353,6 +360,7 @@ void cvar_changes_init()
                BADCVAR("sv_damagetext");
                BADCVAR("sv_db_saveasdump");
                BADCVAR("sv_intermission_cdtrack");
+               BADCVAR("sv_mapchange_delay");
                BADCVAR("sv_minigames");
                BADCVAR("sv_namechangetimer");
                BADCVAR("sv_precacheplayermodels");
@@ -403,6 +411,7 @@ void cvar_changes_init()
                BADCVAR("g_ban_sync_uri");
                BADCVAR("g_buffs");
                BADCVAR("g_ca_teams_override");
+               BADCVAR("g_ctf_fullbrightflags");
                BADCVAR("g_ctf_ignore_frags");
                BADCVAR("g_ctf_leaderboard");
                BADCVAR("g_domination_point_limit");
@@ -422,6 +431,9 @@ void cvar_changes_init()
                BADCVAR("g_physics_clientselect");
                BADCVAR("g_pinata");
                BADCVAR("g_powerups");
+               BADCVAR("g_player_brightness");
+               BADCVAR("g_rocket_flying");
+               BADCVAR("g_rocket_flying_disabledelays");
                BADCVAR("g_spawnshieldtime");
                BADCVAR("g_start_delay");
                BADCVAR("g_superspectate");
@@ -475,6 +487,18 @@ void cvar_changes_init()
                BADCVAR("g_grappling_hook");
                BADCVAR("g_jetpack");
 
+               // temporary for testing
+               // TODO remove before 0.8.3 release
+               BADCVAR("g_ca_weaponarena");
+               BADCVAR("g_freezetag_weaponarena");
+               BADCVAR("g_lms_weaponarena");
+
+               if(cvar_string("g_mod_balance") == "Testing")
+               {
+                       // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed
+                       BADPREFIX("g_balance_");
+               }
+
 #undef BADPRESUFFIX
 #undef BADPREFIX
 #undef BADCVAR
@@ -954,7 +978,7 @@ spawnfunc(worldspawn)
        // physics/balance/config changes that count as mod
        if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
                modname = cvar_string("g_mod_physics");
-       if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance"))
+       if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
                modname = cvar_string("g_mod_balance");
        if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
                modname = cvar_string("g_mod_config");
@@ -1040,18 +1064,21 @@ bool MapHasRightSize(string map)
        // open map size restriction file
        string opensize_msg = strcat("opensize ", map);
        float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+       int pcount = player_count;
+       if(!autocvar_g_maplist_sizes_count_bots)
+               pcount -= currentbots;
        if(fh >= 0)
        {
                opensize_msg = strcat(opensize_msg, ": ok, ");
                int mapmin = stoi(fgets(fh));
                int mapmax = stoi(fgets(fh));
                fclose(fh);
-               if(player_count < mapmin)
+               if(pcount < mapmin)
                {
                        LOG_TRACE(opensize_msg, "not enough");
                        return false;
                }
-               if(mapmax && player_count > mapmax)
+               if(mapmax && pcount > mapmax)
                {
                        LOG_TRACE(opensize_msg, "too many");
                        return false;
@@ -2039,7 +2066,7 @@ string GotoMap(string m)
                return "Map switch will happen after scoreboard.";
 }
 
-bool autocvar_sv_gameplayfix_multiplethinksperframe;
+bool autocvar_sv_gameplayfix_multiplethinksperframe = true;
 void RunThink(entity this)
 {
        // don't let things stay in the past.
@@ -2068,7 +2095,7 @@ void RunThink(entity this)
 }
 
 bool autocvar_sv_freezenonclients;
-bool autocvar_sv_gameplayfix_delayprojectiles;
+bool autocvar_sv_gameplayfix_delayprojectiles = false;
 void Physics_Frame()
 {
        if(autocvar_sv_freezenonclients)
index 7c6fcbafef635c9aff2bddca7ab30ec8c23d45de..9d74477b4846525c3d84dc020a58340c75b2e11e 100644 (file)
@@ -202,12 +202,21 @@ void OnlineBanList_Think(entity this)
        float i, n;
 
        if(autocvar_g_ban_sync_uri == "")
-               goto killme;
+       {
+               delete(this);
+               return;
+       }
        if(autocvar_g_ban_sync_interval == 0) // < 0 is okay, it means "sync on level start only"
-               goto killme;
+       {
+               delete(this);
+               return;
+       }
        argc = tokenize_console(autocvar_g_ban_sync_trusted_servers);
        if(argc == 0)
-               goto killme;
+       {
+               delete(this);
+               return;
+       }
 
        string s = argv(0); for(i = 1; i < argc; ++i) s = strcat(s, ";", argv(i));
        strcpy(OnlineBanList_Servers, s);
@@ -231,14 +240,13 @@ void OnlineBanList_Think(entity this)
                        uri_get(strcat(argv(i), "?", uri), URI_GET_IPBAN + i); // 1000 = "banlist" callback target
        }
 
-       if(autocvar_g_ban_sync_interval > 0)
-               this.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60);
-       else
-               goto killme;
-       return;
+       if(autocvar_g_ban_sync_interval <= 0)
+       {
+               delete(this);
+               return;
+       }
 
-LABEL(killme)
-       delete(this);
+       this.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60);
 }
 
 const float BAN_MAX = 256;
index 6fe927f01a317f8509a6f1991d7f7138cd2b973c..ded47a6387f97920ce32f2fa41851a7b8ec32dea 100644 (file)
@@ -390,6 +390,8 @@ REPLICATE(autoswitch, bool, "cl_autoswitch");
 
 REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
 
+REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking");
+
 REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
 
 REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
@@ -398,6 +400,8 @@ REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
 
 REPLICATE(cvar_cl_handicap, float, "cl_handicap");
 
+REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
+
 REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
 
 REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
@@ -487,13 +491,12 @@ string playername(entity p, bool team_colorize)
         return p.netname;
 }
 
-float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still needs done?
+float want_weapon(entity weaponinfo, float allguns)
 {
-       int i = weaponinfo.m_id;
        int d = 0;
        bool allow_mutatorblocked = false;
 
-       if(!i)
+       if(!weaponinfo.m_id)
                return 0;
 
        bool mutator_returnvalue = MUTATOR_CALLHOOK(WantWeapon, weaponinfo, d, allguns, allow_mutatorblocked);
@@ -511,7 +514,7 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
 
        float t = weaponinfo.weaponstartoverride;
 
-       //print(strcat("want_weapon: ", weaponinfo.netname, " - d: ", ftos(d), ", t: ", ftos(t), ". \n"));
+       //LOG_INFOF("want_weapon: %s - d: %d t: %d\n", weaponinfo.netname, d, t);
 
        // bit order in t:
        // 1: want or not
@@ -525,10 +528,90 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
        return t;
 }
 
+/// Weapons the player normally starts with outside weapon arena.
+WepSet weapons_start()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               int w = want_weapon(it, false);
+               if (w & 1)
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_all()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)))
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_devall()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null,
+       {
+               ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_most()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+void weaponarena_available_all_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_all());
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to all weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_all();
+       }
+}
+
+void weaponarena_available_devall_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | weaponsInMapAll;
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to devall weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_devall();
+       }
+}
+
+void weaponarena_available_most_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_most());
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to most weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_most();
+       }
+}
+
 void readplayerstartcvars()
 {
        float i, t;
-       string s;
 
        // initialize starting values for players
        start_weapons = '0 0 0';
@@ -550,7 +633,7 @@ void readplayerstartcvars()
        g_weaponarena = 0;
        g_weaponarena_weapons = '0 0 0';
 
-       s = cvar_string("g_weaponarena");
+       string s = cvar_string("g_weaponarena");
 
        MUTATOR_CALLHOOK(SetWeaponArena, s);
        s = M_ARGV(0, string);
@@ -567,28 +650,43 @@ void readplayerstartcvars()
        {
                g_weaponarena = 1;
                g_weaponarena_list = "All Weapons";
-               FOREACH(Weapons, it != WEP_Null, {
-                       if(!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)))
-                               g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_weapons = weapons_all();
        }
        else if (s == "devall")
        {
                g_weaponarena = 1;
-               g_weaponarena_list = "All Weapons"; // TODO: report as more than just all weapons?
-               FOREACH(Weapons, it != WEP_Null,
-               {
-                       g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_list = "Dev All Weapons";
+               g_weaponarena_weapons = weapons_devall();
        }
        else if (s == "most")
        {
                g_weaponarena = 1;
                g_weaponarena_list = "Most Weapons";
-               FOREACH(Weapons, it != WEP_Null, {
-                       if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
-                               g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_weapons = weapons_most();
+       }
+       else if (s == "all_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "All Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_all_update, INITPRIO_FINDTARGET);
+       }
+       else if (s == "devall_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "Dev All Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_devall_update, INITPRIO_FINDTARGET);
+       }
+       else if (s == "most_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "Most Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_most_update, INITPRIO_FINDTARGET);
        }
        else if (s == "none")
        {
@@ -617,7 +715,7 @@ void readplayerstartcvars()
        {
                g_weapon_stay = 0; // incompatible
                start_weapons = g_weaponarena_weapons;
-               start_items |= IT_UNLIMITED_BOTH;
+               start_items |= IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS;
        }
        else
        {
@@ -637,9 +735,9 @@ void readplayerstartcvars()
                start_items |= IT_UNLIMITED_SUPERWEAPONS;
 
        if(!cvar("g_use_ammunition"))
-               start_items |= IT_UNLIMITED_WEAPON_AMMO;
+               start_items |= IT_UNLIMITED_AMMO;
 
-       if(start_items & IT_UNLIMITED_WEAPON_AMMO)
+       if(start_items & IT_UNLIMITED_AMMO)
        {
                start_ammo_shells = 999;
                start_ammo_nails = 999;
@@ -657,56 +755,48 @@ void readplayerstartcvars()
                start_ammo_plasma = cvar("g_start_ammo_plasma");
                start_ammo_fuel = cvar("g_start_ammo_fuel");
                random_start_weapons_count = cvar("g_random_start_weapons_count");
-               SetResource(random_start_ammo, RES_SHELLS, cvar(
-                       "g_random_start_shells"));
-               SetResource(random_start_ammo, RES_BULLETS, cvar(
-                       "g_random_start_bullets"));
-               SetResource(random_start_ammo, RES_ROCKETS,
-                       cvar("g_random_start_rockets"));
-               SetResource(random_start_ammo, RES_CELLS, cvar(
-                       "g_random_start_cells"));
-               SetResource(random_start_ammo, RES_PLASMA, cvar(
-                       "g_random_start_plasma"));
+               SetResource(random_start_ammo, RES_SHELLS, cvar("g_random_start_shells"));
+               SetResource(random_start_ammo, RES_BULLETS, cvar("g_random_start_bullets"));
+               SetResource(random_start_ammo, RES_ROCKETS,cvar("g_random_start_rockets"));
+               SetResource(random_start_ammo, RES_CELLS, cvar("g_random_start_cells"));
+               SetResource(random_start_ammo, RES_PLASMA, cvar("g_random_start_plasma"));
        }
 
-       if (warmup_stage)
+       warmup_start_ammo_shells = start_ammo_shells;
+       warmup_start_ammo_nails = start_ammo_nails;
+       warmup_start_ammo_rockets = start_ammo_rockets;
+       warmup_start_ammo_cells = start_ammo_cells;
+       warmup_start_ammo_plasma = start_ammo_plasma;
+       warmup_start_ammo_fuel = start_ammo_fuel;
+       warmup_start_health = start_health;
+       warmup_start_armorvalue = start_armorvalue;
+       warmup_start_weapons = start_weapons;
+       warmup_start_weapons_default = start_weapons_default;
+       warmup_start_weapons_defaultmask = start_weapons_defaultmask;
+
+       if (!g_weaponarena)
        {
-               warmup_start_ammo_shells = start_ammo_shells;
-               warmup_start_ammo_nails = start_ammo_nails;
-               warmup_start_ammo_rockets = start_ammo_rockets;
-               warmup_start_ammo_cells = start_ammo_cells;
-               warmup_start_ammo_plasma = start_ammo_plasma;
-               warmup_start_ammo_fuel = start_ammo_fuel;
-               warmup_start_health = start_health;
-               warmup_start_armorvalue = start_armorvalue;
-               warmup_start_weapons = start_weapons;
-               warmup_start_weapons_default = start_weapons_default;
-               warmup_start_weapons_defaultmask = start_weapons_defaultmask;
-
-               if (!g_weaponarena && !g_ca && !g_freezetag)
-               {
-                       warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
-                       warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
-                       warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
-                       warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
-                       warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma");
-                       warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
-                       warmup_start_health = cvar("g_warmup_start_health");
-                       warmup_start_armorvalue = cvar("g_warmup_start_armor");
-                       warmup_start_weapons = '0 0 0';
-                       warmup_start_weapons_default = '0 0 0';
-                       warmup_start_weapons_defaultmask = '0 0 0';
-                       FOREACH(Weapons, it != WEP_Null, {
-                               int w = want_weapon(it, g_warmup_allguns);
-                               WepSet s = (it.m_wepset);
-                               if(w & 1)
-                                       warmup_start_weapons |= s;
-                               if(w & 2)
-                                       warmup_start_weapons_default |= s;
-                               if(w & 4)
-                                       warmup_start_weapons_defaultmask |= s;
-                       });
-               }
+               warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
+               warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
+               warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
+               warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
+               warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma");
+               warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
+               warmup_start_health = cvar("g_warmup_start_health");
+               warmup_start_armorvalue = cvar("g_warmup_start_armor");
+               warmup_start_weapons = '0 0 0';
+               warmup_start_weapons_default = '0 0 0';
+               warmup_start_weapons_defaultmask = '0 0 0';
+               FOREACH(Weapons, it != WEP_Null, {
+                       int w = want_weapon(it, g_warmup_allguns);
+                       WepSet s = it.m_wepset;
+                       if(w & 1)
+                               warmup_start_weapons |= s;
+                       if(w & 2)
+                               warmup_start_weapons_default |= s;
+                       if(w & 4)
+                               warmup_start_weapons_defaultmask |= s;
+               });
        }
 
        if (g_jetpack)
@@ -727,16 +817,16 @@ void readplayerstartcvars()
        start_ammo_cells = max(0, start_ammo_cells);
        start_ammo_plasma = max(0, start_ammo_plasma);
        start_ammo_fuel = max(0, start_ammo_fuel);
-       SetResource(random_start_ammo, RES_SHELLS, max(0,
-               GetResource(random_start_ammo, RES_SHELLS)));
-       SetResource(random_start_ammo, RES_BULLETS, max(0,
-               GetResource(random_start_ammo, RES_BULLETS)));
-       SetResource(random_start_ammo, RES_ROCKETS, max(0,
-               GetResource(random_start_ammo, RES_ROCKETS)));
-       SetResource(random_start_ammo, RES_CELLS, max(0,
-               GetResource(random_start_ammo, RES_CELLS)));
-       SetResource(random_start_ammo, RES_PLASMA, max(0,
-               GetResource(random_start_ammo, RES_PLASMA)));
+       SetResource(random_start_ammo, RES_SHELLS,
+               max(0, GetResource(random_start_ammo, RES_SHELLS)));
+       SetResource(random_start_ammo, RES_BULLETS,
+               max(0, GetResource(random_start_ammo, RES_BULLETS)));
+       SetResource(random_start_ammo, RES_ROCKETS,
+               max(0, GetResource(random_start_ammo, RES_ROCKETS)));
+       SetResource(random_start_ammo, RES_CELLS,
+               max(0, GetResource(random_start_ammo, RES_CELLS)));
+       SetResource(random_start_ammo, RES_PLASMA,
+               max(0, GetResource(random_start_ammo, RES_PLASMA)));
 
        warmup_start_ammo_shells = max(0, warmup_start_ammo_shells);
        warmup_start_ammo_nails = max(0, warmup_start_ammo_nails);
@@ -751,9 +841,9 @@ void precache_playermodel(string m)
        float globhandle, i, n;
        string f;
 
-       if(substring(m, -9,5) == "_lod1")
+       if(substring(m, -9, 5) == "_lod1")
                return;
-       if(substring(m, -9,5) == "_lod2")
+       if(substring(m, -9, 5) == "_lod2")
                return;
        precache_model(m);
        f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
@@ -1106,11 +1196,6 @@ bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher
                        return false; // no checks here
                else if(this.classname == "grapplinghook")
                        RemoveHook(this);
-               else if(this.classname == "spike")
-               {
-                       W_Crylink_Dequeue(this);
-                       delete(this);
-               }
                else
                        delete(this);
                return true;
index 1ca629078e4a99d27076c5292e1aade918bf5996..a310c6ccadb294c25aad77a6f3900cbb1a96a19a 100644 (file)
@@ -1231,3 +1231,10 @@ MUTATOR_HOOKABLE(GetPlayerLimit, EV_GetPlayerLimit);
     /**/                  o(string, MUTATOR_ARGV_1_string) \
     /**/
 MUTATOR_HOOKABLE(LogDeath_AppendItemCodes, EV_LogDeath_AppendItemCodes);
+
+/** Allows disabling or enabling rocket jumping independently of balance, use the parameter to force a preferred setting */
+#define EV_AllowRocketJumping(i, o) \
+    /** allow_rocketjump */         i(bool, MUTATOR_ARGV_0_bool) \
+    /**/                            o(bool, MUTATOR_ARGV_0_bool) \
+    /**/
+MUTATOR_HOOKABLE(AllowRocketJumping, EV_AllowRocketJumping);
index c39f59e7213d3edad4bcbab165b01e7e091ccff5..9e67050cb654b23c9847c8b2e94bda0f1898b106 100644 (file)
@@ -398,7 +398,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
-               if (save > 10)
+               if (save > 10 && (dh - take) > 0) // don't play armor sound if the attack is fatal
                        sound (this, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM);
                else if (take > 30)
                        sound (this, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM);
index 6b5b19d79ec8a60d141da4248e547b8deaca1480..54c9744332d5033ccbd5518f4f79b29dca36606c 100644 (file)
@@ -324,14 +324,17 @@ void SV_OnEntityPreSpawnFunction(entity this)
        if (this.gametypefilter != "")
        if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, this.gametypefilter))
        {
-               goto cleanup;
+               delete(this);
+               return;
        }
        if (this.cvarfilter != "" && !expr_evaluate(this.cvarfilter)) {
-        goto cleanup;
+               delete(this);
+               return;
        }
 
        if (DoesQ3ARemoveThisEntity(this)) {
-               goto cleanup;
+               delete(this);
+               return;
        }
 
        set_movetype(this, this.movetype);
@@ -356,11 +359,9 @@ void SV_OnEntityPreSpawnFunction(entity this)
     #undef X
 
        if (MUTATOR_CALLHOOK(OnEntityPreSpawn, this)) {
-               goto cleanup;
+               delete(this);
+               return;
        }
-       return;
-LABEL(cleanup)
-    delete(this);
 }
 
 void WarpZone_PostInitialize_Callback()
index d4562dfc22af1ca9397d71b31dd2fb86d536208f..2f7dc88ba1436fffc693778aba98ddcdfad4100e 100644 (file)
@@ -23,7 +23,7 @@ TEST(Weapons, Hurt)
 
     it = a;
     PHYS_INPUT_BUTTON_ATCK(it) = true;
-    it.items |= IT_UNLIMITED_BOTH;
+    it.items |= IT_UNLIMITED_AMMO;
     Weapon wep = WEP_VORTEX;
     W_GiveWeapon(it, wep.m_id);
     W_SwitchWeapon_Force(it, wep, weaponentities[0]);
index 7f9c6ad0d76c379481cb3613fe3b322b0d7ecdff..f1866eab089311a0ce2c2a052d6b9b3fbaf00031 100644 (file)
@@ -70,7 +70,7 @@ bool client_hasweapon(entity this, Weapon wpn, .entity weaponentity, float andam
        {
                if (andammo)
                {
-                       if(this.items & IT_UNLIMITED_WEAPON_AMMO)
+                       if(this.items & IT_UNLIMITED_AMMO)
                        {
                                f = 1;
                        }
index ba17d3f1f893bdb2c42a7aa89fa4e674867ba548..23a3ee67d6aa5ab8d2ba95d302f2b7514ecbdc39 100644 (file)
@@ -26,22 +26,21 @@ string W_Apply_Weaponreplace(string in)
        return out;
 }
 
-void weapon_defaultspawnfunc(entity this, Weapon e)
+void weapon_defaultspawnfunc(entity this, Weapon wpn)
 {
-       Weapon wpn = e;
-       e = wpn = wpn.m_spawnfunc_hookreplace(wpn, this);
+       wpn = wpn.m_spawnfunc_hookreplace(wpn, this);
        this.classname = wpn.m_canonical_spawnfunc;
        if (!Item_IsLoot(this) && !this.m_isreplaced)
        {
-               if (e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
+               if (wpn.spawnflags & WEP_FLAG_MUTATORBLOCKED)
                {
                        LOG_WARNF("Attempted to spawn a mutator-blocked weapon rejected: prvm_edict server %i", this);
                        startitem_failed = true;
                        return;
                }
 
-               string s = W_Apply_Weaponreplace(e.netname);
-               MUTATOR_CALLHOOK(SetWeaponreplace, this, e, s);
+               string s = W_Apply_Weaponreplace(wpn.netname);
+               MUTATOR_CALLHOOK(SetWeaponreplace, this, wpn, s);
                s = M_ARGV(2, string);
                if (s == "")
                {
@@ -79,6 +78,9 @@ void weapon_defaultspawnfunc(entity this, Weapon e)
                }
        }
 
+       if(!Item_IsLoot(this))
+               weaponsInMapAll |= WepSet_FromWeapon(wpn);
+
        if (!Item_IsDefinitionAllowed(wpn.m_pickup))
        {
                delete(this);
index 5bc4a1f8852e41f50317fcef3dd412dcc17c21b0..6209710b6dea85697a40639ebc18c2d7f47d509b 100644 (file)
@@ -330,7 +330,7 @@ void fireBullet_trace_callback(vector start, vector hit, vector end)
        fireBullet_last_hit = NULL;
 }
 
-void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect)
+void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag)
 {
        dir = normalize(dir + randomvec() * spread);
        vector end = start + dir * max_shot_distance;
@@ -342,12 +342,7 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo
        float damage_fraction = 1;
        float total_damage = 0;
 
-       float lag = ((IS_REAL_CLIENT(this)) ? ANTILAG_LATENCY(this) : 0);
-       if(lag < 0.001)
-               lag = 0;
-       bool noantilag = ((IS_CLIENT(this)) ? CS(this).cvar_cl_noantilag : false);
-       if(autocvar_g_antilag == 0 || noantilag)
-               lag = 0; // only do hitscan, but no antilag
+       float lag = ((do_antilag) ? antilag_getlag(this) : 0);
        if(lag)
                antilag_takeback_all(this, lag);
 
@@ -471,3 +466,8 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo
        if(this)
                this.dphitcontentsmask = oldsolid;
 }
+
+void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect)
+{
+       fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, force, dtype, tracer_effect, true);
+}
index 9e39ecc350aef29a8fe369baaba53ff513aa4a49..5acbda9a5ff98788bd7745426de853ebb4d00f94 100644 (file)
@@ -57,4 +57,5 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
 entity fireBullet_trace_callback_eff;
 entity fireBullet_last_hit;
 void fireBullet_trace_callback(vector start, vector hit, vector end);
+void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag);
 void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect);
index 5702c2e3c1bcef94c7b5ecd5ad95c30341dfdb38..6e74738c738eaf5a1bbabcf155bef94c74416ad2 100644 (file)
@@ -163,6 +163,7 @@ void CL_ExteriorWeaponentity_Think(entity this)
     Weapon wep = this.owner.(weaponentity).m_weapon;
        if (wep) this.glowmod = weaponentity_glowmod(wep, this.owner, this.owner.clientcolors, this.owner.(weaponentity));
        this.colormap = this.owner.colormap;
+       this.skin = w_ent.skin;
 
        CSQCMODEL_AUTOUPDATE(this);
 }
@@ -223,7 +224,7 @@ void w_ready(Weapon thiswep, entity actor, .entity weaponentity, int fire)
 .float prevwarntime;
 bool weapon_prepareattack_checkammo(Weapon thiswep, entity actor, bool secondary, .entity weaponentity)
 {
-       if ((actor.items & IT_UNLIMITED_WEAPON_AMMO)) return true;
+       if ((actor.items & IT_UNLIMITED_AMMO)) return true;
        bool ammo = false;
        if (secondary) ammo = thiswep.wr_checkammo2(thiswep, actor, weaponentity);
        else ammo = thiswep.wr_checkammo1(thiswep, actor, weaponentity);
@@ -677,7 +678,7 @@ void W_AttachToShotorg(entity actor, .entity weaponentity, entity flash, vector
 void W_DecreaseAmmo(Weapon wep, entity actor, float ammo_use, .entity weaponentity)
 {
        if (MUTATOR_CALLHOOK(W_DecreaseAmmo, actor, actor.(weaponentity), ammo_use)) return;
-       if ((actor.items & IT_UNLIMITED_WEAPON_AMMO) && !wep.reloading_ammo) return;
+       if ((actor.items & IT_UNLIMITED_AMMO) && !wep.reloading_ammo) return;
 
        ammo_use = M_ARGV(2, float);
 
@@ -724,7 +725,7 @@ void W_ReloadedAndReady(Weapon thiswep, entity actor, .entity weaponentity, int
        w_ent.clip_load = w_ent.old_clip_load;  // restore the ammo counter, in case we still had ammo in the weapon before reloading
 
        // if the gun uses no ammo, max out weapon load, else decrease ammo as we increase weapon load
-       if (!w_ent.reload_ammo_min || (actor.items & IT_UNLIMITED_WEAPON_AMMO) || wpn.ammo_type == RES_NONE)
+       if (!w_ent.reload_ammo_min || (actor.items & IT_UNLIMITED_AMMO) || wpn.ammo_type == RES_NONE)
        {
                w_ent.clip_load = w_ent.reload_ammo_amount;
        }
@@ -780,7 +781,7 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen
        {
                if (!GetResource(actor, e.ammo_type) && this.reload_ammo_min)
                {
-                       if (!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+                       if (!(actor.items & IT_UNLIMITED_AMMO))
                        {
                                if (IS_REAL_CLIENT(actor) && actor.reload_complain < time)
                                {
@@ -798,7 +799,6 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen
                        }
                }
        }
-
        if (this)
        {
                if (this.wframe == WFRAME_RELOAD) return;
index 68f2eb9d5628ae7df244e70e2ef158be1d69124b..7a7ff17b6d554cbe6451ae2dda773ec81b017088 100755 (executable)
@@ -38,7 +38,11 @@ QCCDEFS="${QCCDEFS[@]}"
 
 declare -a QCCFLAGS=(
     -std=gmqcc
-    -O3 # optimization to accept variable initialization inside `if (1)` blocks and avoid warnings
+    # Without -O3, GMQCC thinks some variables are used uninitialized if the initialization is done inside an `if (1)` block
+    # (which is created by e.g. BEGIN_MACRO) which would cause the compilation units test to fail.
+    # There doesn't appear to be any measurable increase in compile time
+    # and it allows us to get rid of some explicit initializations which are just useless noise.
+    -O3
     -Wall -Werror
     -futf8
     -freturn-assignments
index 865e6e592ca48c037932fa643ec80e9dd1b20f83..dfc375bb5a984fab52d12b4720c62b2e7e70c225 100755 (executable)
@@ -20,7 +20,7 @@ function qpp() {
         server) DEFS="-DGAMEQC -DSVQC"
         ;;
     esac
-    >&2 echo + ${CPP} "${@:3}" ${DEFS} "${IN}"
+    #>&2 echo + ${CPP} "${@:3}" ${DEFS} "${IN}"
     set +e
     # additional information
     ${CPP} "${@:3}" ${DEFS} \
@@ -36,7 +36,7 @@ function qpp() {
 }
 
 function qcc() {
-    >&2 echo + $(basename ${QCC}) $@
+    #>&2 echo + $(basename ${QCC}) $@
     # FIXME: relative compiler path is too deep
     (cd tools && ${QCC} "$@")
 }
index 843347eca90813878a3501a4b53a5cf5260742c3..668d10484b461c3503188e346606b2827482fdba 100644 (file)
@@ -12,7 +12,7 @@ g_shootfromcenter 1 // hit where you point at with the crosshair (almost so, no
 g_balance_kill_antispam 0
 g_forced_respawn 1
 // g_playerclip_collisions 0 // do not check playerclips
-g_powerups 0  // set to -1 or patch xonotic
+g_powerups 0
 g_spawnpoints_auto_move_out_of_solid 1
 g_start_delay 3
 g_use_ammunition 0
@@ -20,9 +20,38 @@ g_weapon_stay 1
 teamplay_mode 2 // friendly fire and self damage
 sv_vote_nospectators 1
 timelimit_override 20
-g_buffs_cooldown_respawn 0.1
+
+// general buff settings
+g_buffs_cooldown_activate 0
+g_buffs_cooldown_respawn 0
 g_buffs_randomize 0
 
+// disabled buffs
+g_buffs_ammo 0
+g_buffs_resistance 0
+g_buffs_medic 0
+g_buffs_vengeance 0
+g_buffs_bash 0
+g_buffs_disability 0
+g_buffs_vampire 0
+g_buffs_jump 0
+g_buffs_invisible 0
+g_buffs_inferno 0
+g_buffs_swapper 0
+g_buffs_magnet 0
+g_buffs_luck 0
+g_buffs_flight 0
+
+// speed buff (q3 haste replacement)
+g_movement_highspeed_q3_compat 1
+g_buffs_speed 1
+g_buffs_speed_time 30
+g_buffs_speed_speed 1.3  // q3 haste lasts 30 seconds
+g_buffs_speed_rate 0.7692307692   // 1/1.3
+g_buffs_speed_weaponspeed 1  // do not increase projectile speed
+g_buffs_speed_damage_take 1
+g_buffs_speed_regen 1.2
+
 // game mode settings
 g_cts_finish_kill_delay 2
 g_cts_selfdamage 0
index 5b71bb60a0576d40959a59b0a91d7e3404dc61f4..cb39b2a10ce1a16c1b5cb554be256a42e01c52f5 100644 (file)
@@ -34,5 +34,3 @@ g_spawn_near_teammate "!g_assault !g_freezetag"
 g_spawn_near_teammate_ignore_spawnpoint 1
 g_spawnshieldtime 0.5
 g_respawn_delay_forced 2
-
-g_buffs_resistance_blockpercent 0.5
diff --git a/sound/misc/armor1.ogg b/sound/misc/armor1.ogg
new file mode 100644 (file)
index 0000000..b781feb
Binary files /dev/null and b/sound/misc/armor1.ogg differ
diff --git a/sound/misc/armor1.wav b/sound/misc/armor1.wav
deleted file mode 100644 (file)
index 4ee6230..0000000
Binary files a/sound/misc/armor1.wav and /dev/null differ
diff --git a/sound/misc/armor10.ogg b/sound/misc/armor10.ogg
new file mode 100644 (file)
index 0000000..5f8c142
Binary files /dev/null and b/sound/misc/armor10.ogg differ
diff --git a/sound/misc/armor10.wav b/sound/misc/armor10.wav
deleted file mode 100644 (file)
index 7ba2edf..0000000
Binary files a/sound/misc/armor10.wav and /dev/null differ
diff --git a/sound/misc/armor17_5.ogg b/sound/misc/armor17_5.ogg
new file mode 100644 (file)
index 0000000..6931ed7
Binary files /dev/null and b/sound/misc/armor17_5.ogg differ
diff --git a/sound/misc/armor17_5.wav b/sound/misc/armor17_5.wav
deleted file mode 100644 (file)
index eafad59..0000000
Binary files a/sound/misc/armor17_5.wav and /dev/null differ
diff --git a/sound/misc/armor25.ogg b/sound/misc/armor25.ogg
new file mode 100644 (file)
index 0000000..a5a02fa
Binary files /dev/null and b/sound/misc/armor25.ogg differ
diff --git a/sound/misc/armor25.wav b/sound/misc/armor25.wav
deleted file mode 100644 (file)
index 9aea70c..0000000
Binary files a/sound/misc/armor25.wav and /dev/null differ
diff --git a/sound/misc/armorimpact.ogg b/sound/misc/armorimpact.ogg
new file mode 100644 (file)
index 0000000..9f3274d
Binary files /dev/null and b/sound/misc/armorimpact.ogg differ
diff --git a/sound/misc/armorimpact.wav b/sound/misc/armorimpact.wav
deleted file mode 100644 (file)
index 28c18db..0000000
Binary files a/sound/misc/armorimpact.wav and /dev/null differ
diff --git a/sound/misc/footstep01.ogg b/sound/misc/footstep01.ogg
new file mode 100644 (file)
index 0000000..6091a39
Binary files /dev/null and b/sound/misc/footstep01.ogg differ
diff --git a/sound/misc/footstep01.wav b/sound/misc/footstep01.wav
deleted file mode 100644 (file)
index 5627229..0000000
Binary files a/sound/misc/footstep01.wav and /dev/null differ
diff --git a/sound/misc/footstep02.ogg b/sound/misc/footstep02.ogg
new file mode 100644 (file)
index 0000000..1d6b995
Binary files /dev/null and b/sound/misc/footstep02.ogg differ
diff --git a/sound/misc/footstep02.wav b/sound/misc/footstep02.wav
deleted file mode 100644 (file)
index 736746c..0000000
Binary files a/sound/misc/footstep02.wav and /dev/null differ
diff --git a/sound/misc/footstep03.ogg b/sound/misc/footstep03.ogg
new file mode 100644 (file)
index 0000000..d453ad7
Binary files /dev/null and b/sound/misc/footstep03.ogg differ
diff --git a/sound/misc/footstep03.wav b/sound/misc/footstep03.wav
deleted file mode 100644 (file)
index 2137b65..0000000
Binary files a/sound/misc/footstep03.wav and /dev/null differ
diff --git a/sound/misc/footstep04.ogg b/sound/misc/footstep04.ogg
new file mode 100644 (file)
index 0000000..caacad5
Binary files /dev/null and b/sound/misc/footstep04.ogg differ
diff --git a/sound/misc/footstep04.wav b/sound/misc/footstep04.wav
deleted file mode 100644 (file)
index 06ba93c..0000000
Binary files a/sound/misc/footstep04.wav and /dev/null differ
diff --git a/sound/misc/footstep05.ogg b/sound/misc/footstep05.ogg
new file mode 100644 (file)
index 0000000..4075ed9
Binary files /dev/null and b/sound/misc/footstep05.ogg differ
diff --git a/sound/misc/footstep05.wav b/sound/misc/footstep05.wav
deleted file mode 100644 (file)
index e16d6b3..0000000
Binary files a/sound/misc/footstep05.wav and /dev/null differ
diff --git a/sound/misc/footstep06.ogg b/sound/misc/footstep06.ogg
new file mode 100644 (file)
index 0000000..be9e2b4
Binary files /dev/null and b/sound/misc/footstep06.ogg differ
diff --git a/sound/misc/footstep06.wav b/sound/misc/footstep06.wav
deleted file mode 100644 (file)
index fff0370..0000000
Binary files a/sound/misc/footstep06.wav and /dev/null differ
diff --git a/sound/misc/gib.ogg b/sound/misc/gib.ogg
new file mode 100644 (file)
index 0000000..2b29759
Binary files /dev/null and b/sound/misc/gib.ogg differ
diff --git a/sound/misc/gib.wav b/sound/misc/gib.wav
deleted file mode 100644 (file)
index a26e9ad..0000000
Binary files a/sound/misc/gib.wav and /dev/null differ
diff --git a/sound/misc/gib_splat01.ogg b/sound/misc/gib_splat01.ogg
new file mode 100644 (file)
index 0000000..ba8c8c7
Binary files /dev/null and b/sound/misc/gib_splat01.ogg differ
diff --git a/sound/misc/gib_splat01.wav b/sound/misc/gib_splat01.wav
deleted file mode 100644 (file)
index 9c29b67..0000000
Binary files a/sound/misc/gib_splat01.wav and /dev/null differ
diff --git a/sound/misc/gib_splat02.ogg b/sound/misc/gib_splat02.ogg
new file mode 100644 (file)
index 0000000..de5da8d
Binary files /dev/null and b/sound/misc/gib_splat02.ogg differ
diff --git a/sound/misc/gib_splat02.wav b/sound/misc/gib_splat02.wav
deleted file mode 100644 (file)
index 1b86c1f..0000000
Binary files a/sound/misc/gib_splat02.wav and /dev/null differ
diff --git a/sound/misc/gib_splat03.ogg b/sound/misc/gib_splat03.ogg
new file mode 100644 (file)
index 0000000..8e7a2b4
Binary files /dev/null and b/sound/misc/gib_splat03.ogg differ
diff --git a/sound/misc/gib_splat03.wav b/sound/misc/gib_splat03.wav
deleted file mode 100644 (file)
index a71d8ea..0000000
Binary files a/sound/misc/gib_splat03.wav and /dev/null differ
diff --git a/sound/misc/gib_splat04.ogg b/sound/misc/gib_splat04.ogg
new file mode 100644 (file)
index 0000000..7cf3d76
Binary files /dev/null and b/sound/misc/gib_splat04.ogg differ
diff --git a/sound/misc/gib_splat04.wav b/sound/misc/gib_splat04.wav
deleted file mode 100644 (file)
index 3c1b6d7..0000000
Binary files a/sound/misc/gib_splat04.wav and /dev/null differ
index 8cfae10f605247f87c4f241ed3b62b88928a28f7..816dc141f16c589e6b42c5843d79191afb0b04af 100644 (file)
Binary files a/sound/misc/hitground1.ogg and b/sound/misc/hitground1.ogg differ
index 1f8a7441b43561d064a1d88e30f8466959b94e31..744b19e43569bf64e71b619bc12575913ccaa0d9 100644 (file)
Binary files a/sound/misc/hitground2.ogg and b/sound/misc/hitground2.ogg differ
index 73974a4de470f2f3beab0cb9d150ccb178185fe9..2945bb04f9cbd76b8a474f9452c38b44e8af2253 100644 (file)
Binary files a/sound/misc/hitground3.ogg and b/sound/misc/hitground3.ogg differ
index 0c40620d1604eab1b9c87e1361a99be99bb43f70..d2d8f3bf0c99df83d55fb58357b839125e3b475b 100644 (file)
Binary files a/sound/misc/hitground4.ogg and b/sound/misc/hitground4.ogg differ
index e9a780b6d4fc5d33cf08d3be560ca900706969ad..7ef4ac55db592e5c7b2251818303eb9f06b20957 100644 (file)
Binary files a/sound/misc/itempickup.ogg and b/sound/misc/itempickup.ogg differ
index 503620a8c1b96db78b156de4566401fa5ad45d83..518c7e88cea0e09df4350c62aaf7da49d8e81d0a 100644 (file)
Binary files a/sound/misc/itemrespawn.ogg and b/sound/misc/itemrespawn.ogg differ
index f04e8d619ff495bd938613aee8ecb61897851ca0..c5bc17f678067b18085ff7b2242d5c0389a6afc8 100644 (file)
Binary files a/sound/misc/mediumhealth.ogg and b/sound/misc/mediumhealth.ogg differ
index 6b250ebbd60daaf0538675fb4e04fa314b593b79..c142b5602a46db87f68c7675043aa07febbd9568 100644 (file)
Binary files a/sound/misc/megahealth.ogg and b/sound/misc/megahealth.ogg differ
index 03bee01090caef40675d18674328e41df57edf78..d3cdc975e34cb34979edc94e4dded19dd5bca911 100644 (file)
Binary files a/sound/misc/metalhitground1.ogg and b/sound/misc/metalhitground1.ogg differ
index 50f315f274fc0555e71c49550f3b61a7d979f3f6..70395f197c3493ad9f0de0606cf4f1fe6459ed4b 100644 (file)
Binary files a/sound/misc/metalhitground2.ogg and b/sound/misc/metalhitground2.ogg differ
index 0f3edb1060ff4ee9900e005ebf97a5a863fa4ef4..585df2f457e576da351cfee93dc12fa5d095b35c 100644 (file)
Binary files a/sound/misc/metalhitground3.ogg and b/sound/misc/metalhitground3.ogg differ
index ad2b262557ebfbddfc67c8ec4a553bd4d0e29a1d..2045297aa477adbdbfef54c51338ebabe2e78a57 100644 (file)
Binary files a/sound/misc/metalhitground4.ogg and b/sound/misc/metalhitground4.ogg differ
index 502b34a90da54395e9dd1a9d13a7bf9ab3c0153b..f952a8cdf1a97b8975ff4a56cb712a034ee2be26 100644 (file)
Binary files a/sound/misc/minihealth.ogg and b/sound/misc/minihealth.ogg differ
diff --git a/sound/misc/missile_fly.ogg b/sound/misc/missile_fly.ogg
new file mode 100644 (file)
index 0000000..13e43e6
Binary files /dev/null and b/sound/misc/missile_fly.ogg differ
diff --git a/sound/misc/missile_fly.wav b/sound/misc/missile_fly.wav
deleted file mode 100644 (file)
index a2cd056..0000000
Binary files a/sound/misc/missile_fly.wav and /dev/null differ
diff --git a/sound/misc/poweroff.ogg b/sound/misc/poweroff.ogg
new file mode 100644 (file)
index 0000000..983e241
Binary files /dev/null and b/sound/misc/poweroff.ogg differ
diff --git a/sound/misc/poweroff.wav b/sound/misc/poweroff.wav
deleted file mode 100644 (file)
index 0445276..0000000
Binary files a/sound/misc/poweroff.wav and /dev/null differ
index 517f88bbb1ee50dcaab0aa3e7ce433fe11c9a1d2..f4d9488ac092746a824735f4ad112198a59fb519 100644 (file)
Binary files a/sound/misc/powerup.ogg and b/sound/misc/powerup.ogg differ
index 5169fb1e68487a33932cf99341330d0558a6bb8f..4381a2617e9c174de3fa7b9e933414ba1ac46a0b 100644 (file)
Binary files a/sound/misc/powerup_shield.ogg and b/sound/misc/powerup_shield.ogg differ
diff --git a/sound/misc/shield_respawn.ogg b/sound/misc/shield_respawn.ogg
new file mode 100644 (file)
index 0000000..cb45c9f
Binary files /dev/null and b/sound/misc/shield_respawn.ogg differ
diff --git a/sound/misc/shield_respawn.wav b/sound/misc/shield_respawn.wav
deleted file mode 100644 (file)
index fa0ac1f..0000000
Binary files a/sound/misc/shield_respawn.wav and /dev/null differ
index 2b5664aea5b6a5b36f4901647d41bb7f87c41246..6c9210ef299a9178cf910c85b103a61e43c63d5d 100644 (file)
Binary files a/sound/misc/spawn.ogg and b/sound/misc/spawn.ogg differ
diff --git a/sound/misc/strength_respawn.ogg b/sound/misc/strength_respawn.ogg
new file mode 100644 (file)
index 0000000..fcf5725
Binary files /dev/null and b/sound/misc/strength_respawn.ogg differ
diff --git a/sound/misc/strength_respawn.wav b/sound/misc/strength_respawn.wav
deleted file mode 100644 (file)
index 3f7ffa2..0000000
Binary files a/sound/misc/strength_respawn.wav and /dev/null differ
index 8034299a44ca75d10b9fedeb0ae23833ca0a1452..55680f519695dc919a141e2746ee004c16c8d7e0 100644 (file)
Binary files a/sound/misc/teleport.ogg and b/sound/misc/teleport.ogg differ
diff --git a/sound/misc/typehit.ogg b/sound/misc/typehit.ogg
new file mode 100644 (file)
index 0000000..080e1bd
Binary files /dev/null and b/sound/misc/typehit.ogg differ
diff --git a/sound/misc/typehit.wav b/sound/misc/typehit.wav
deleted file mode 100644 (file)
index c765035..0000000
Binary files a/sound/misc/typehit.wav and /dev/null differ
index 5a16bdfcd19fe1d0a895dab1fa6ac313ae529251..4bac6b03e148723f765bea7ccbfb507fb443c3d1 100644 (file)
Binary files a/sound/nexball/bounce.ogg and b/sound/nexball/bounce.ogg differ
index f77b01b22fe7535f1d4c33edf0e84cf86ee546fb..92fea776344242d996e3018639136ecc856c9f8c 100644 (file)
Binary files a/sound/nexball/drop.ogg and b/sound/nexball/drop.ogg differ
index bb18f53f11617a23513ff6b86eacc7b2d9356010..eef18326a7f6d5de01bbeb0da3dd4ff9db9bab43 100644 (file)
Binary files a/sound/weapons/crylink_fire.ogg and b/sound/weapons/crylink_fire.ogg differ
index f10d6dd0c2aa07835aaa0e5a47736fdb3733bb2d..b2aa78eff1aa4e7fcd1ca5226978c4af76dc9084 100644 (file)
Binary files a/sound/weapons/crylink_fire2.ogg and b/sound/weapons/crylink_fire2.ogg differ
index d60c7bc397fa5d9bbc56a251d1692fdbf6bafa63..5813c4cb6deb9648223c46a841e546a26877d486 100644 (file)
Binary files a/sound/weapons/crylink_impact.ogg and b/sound/weapons/crylink_impact.ogg differ
index 26c7af5d86e90829de6115b71dc7d139aaf8a72c..be84bfe2f939da2d482fba8cf609ec3ee9c18abe 100644 (file)
Binary files a/sound/weapons/crylink_impact2.ogg and b/sound/weapons/crylink_impact2.ogg differ
index 18b3e156d1763f81612ea77a1d72e47d5a95ca1d..ea534b6d507e1ea35b4caf028e20e2d980020a6c 100644 (file)
Binary files a/sound/weapons/electro_fire.ogg and b/sound/weapons/electro_fire.ogg differ
index a7192fa8994a5dc5667d61fe647ece8a9609d422..d501a5bfbef4a12467b29b839d1564b8e082e7f8 100644 (file)
Binary files a/sound/weapons/electro_fire2.ogg and b/sound/weapons/electro_fire2.ogg differ
index 7301d3e0693ffbbf9ce09cb565ed46bbd110bddd..1822e0e6e505691a96f578d84c613bca4805ae42 100644 (file)
Binary files a/sound/weapons/electro_impact_combo.ogg and b/sound/weapons/electro_impact_combo.ogg differ
diff --git a/sound/weapons/fireball_fire.ogg b/sound/weapons/fireball_fire.ogg
new file mode 100644 (file)
index 0000000..01b57ae
Binary files /dev/null and b/sound/weapons/fireball_fire.ogg differ
diff --git a/sound/weapons/fireball_fire.wav b/sound/weapons/fireball_fire.wav
deleted file mode 100644 (file)
index 9f8ca1d..0000000
Binary files a/sound/weapons/fireball_fire.wav and /dev/null differ
diff --git a/sound/weapons/fireball_fire2.ogg b/sound/weapons/fireball_fire2.ogg
new file mode 100644 (file)
index 0000000..13797be
Binary files /dev/null and b/sound/weapons/fireball_fire2.ogg differ
diff --git a/sound/weapons/fireball_fire2.wav b/sound/weapons/fireball_fire2.wav
deleted file mode 100644 (file)
index 34526ae..0000000
Binary files a/sound/weapons/fireball_fire2.wav and /dev/null differ
index 05c6d375f2aacd92468959021d09ce633560b04a..c26c7103c9538bba53a10250ad95295dc02b434d 100644 (file)
Binary files a/sound/weapons/fireball_fly.ogg and b/sound/weapons/fireball_fly.ogg differ
index 4e7a929f35ba0221554e7ccac1e777bbbbe09d72..00da23c24fd1226080d2fe90487d4a5ec71aee31 100644 (file)
Binary files a/sound/weapons/fireball_fly2.ogg and b/sound/weapons/fireball_fly2.ogg differ
diff --git a/sound/weapons/fireball_impact2.ogg b/sound/weapons/fireball_impact2.ogg
new file mode 100644 (file)
index 0000000..9e6c947
Binary files /dev/null and b/sound/weapons/fireball_impact2.ogg differ
diff --git a/sound/weapons/fireball_impact2.wav b/sound/weapons/fireball_impact2.wav
deleted file mode 100644 (file)
index eec5a57..0000000
Binary files a/sound/weapons/fireball_impact2.wav and /dev/null differ
diff --git a/sound/weapons/fireball_prefire2.ogg b/sound/weapons/fireball_prefire2.ogg
new file mode 100644 (file)
index 0000000..a9224fc
Binary files /dev/null and b/sound/weapons/fireball_prefire2.ogg differ
diff --git a/sound/weapons/fireball_prefire2.wav b/sound/weapons/fireball_prefire2.wav
deleted file mode 100644 (file)
index bf76fae..0000000
Binary files a/sound/weapons/fireball_prefire2.wav and /dev/null differ
index 8175cd7aa3afbb1e780564489194593364fee3a1..82da52c1c2fe751725b0ab5877f5a38151fc3cab 100644 (file)
Binary files a/sound/weapons/grenade_impact.ogg and b/sound/weapons/grenade_impact.ogg differ
index fcb68c00ba3c5af7f5745884612ba99dfba8978e..da045a45c8524dbea21d069b402ad6b46ea20b37 100644 (file)
Binary files a/sound/weapons/hagar_fire.ogg and b/sound/weapons/hagar_fire.ogg differ
index eed76405c5a4de7da9bc77f761bf77a717876187..62973e1af68dc2df977b8032b5c7a8057cd67aa8 100644 (file)
Binary files a/sound/weapons/hook_impact.ogg and b/sound/weapons/hook_impact.ogg differ
index 2d2e8a96c27232b675ce2ce7a792f404ece3a975..6cac03be5305a1f38f057eab92123f2ae16cee2c 100644 (file)
Binary files a/sound/weapons/hookbomb_fire.ogg and b/sound/weapons/hookbomb_fire.ogg differ
index ea5122e04e5b3f558891a68d0cb8ee9d7c588107..f837baf6fa98aee87badd052ef4db80607048c1b 100644 (file)
Binary files a/sound/weapons/lasergun_fire.ogg and b/sound/weapons/lasergun_fire.ogg differ
index d08710985743ab7de72c67b14c8d58870001c3d1..1dec6ff826d136049dd895aabb10454c54f9e0bd 100644 (file)
Binary files a/sound/weapons/minstanexfire.ogg and b/sound/weapons/minstanexfire.ogg differ
diff --git a/sound/weapons/missile_fly.ogg b/sound/weapons/missile_fly.ogg
new file mode 100644 (file)
index 0000000..13e43e6
Binary files /dev/null and b/sound/weapons/missile_fly.ogg differ
index 5d28b731cee1f6e8d305958728617bb4c84c7f4b..c576c0a169fbb9d80b2b34bb1d7a80e475ae13f1 100644 (file)
Binary files a/sound/weapons/nexfire.ogg and b/sound/weapons/nexfire.ogg differ
index 948a996388227b59a26d834a5d8157f0dc05af2a..b6476d8bf29d6f66aa18b2e787a846f80956d3a4 100644 (file)
Binary files a/sound/weapons/neximpact.ogg and b/sound/weapons/neximpact.ogg differ
index 36f1183daa35e003b8a7d6f774e7cded07e3ae6b..f0f2b3a207b7994362dade5705b4f770d121844b 100644 (file)
Binary files a/sound/weapons/nexwhoosh1.ogg and b/sound/weapons/nexwhoosh1.ogg differ
index 38ffa22f33090b94b8bb2f3ef3259cd5daa47763..57ac5e60af7fbd383118a9b05f14485b92d84877 100644 (file)
Binary files a/sound/weapons/nexwhoosh2.ogg and b/sound/weapons/nexwhoosh2.ogg differ
index 3db8d4b44605818b3c42508a88bf153e672ca335..a5764f79e8a2b55fb97e49b12160be537f976710 100644 (file)
Binary files a/sound/weapons/nexwhoosh3.ogg and b/sound/weapons/nexwhoosh3.ogg differ
index 2edb3739cc6345759e6621317a23ffcaecfe08ae..ef67597f4439247b3febfd841a930f256ca2fbd6 100644 (file)
Binary files a/sound/weapons/reload.ogg and b/sound/weapons/reload.ogg differ
index 5f2cb3a8348a87c9e0fce9a1a0f2fd2db9b9895f..f0d6b5fbffdd4aea4cbe8986a802b42162f9f5f7 100644 (file)
Binary files a/sound/weapons/rocket_fire.ogg and b/sound/weapons/rocket_fire.ogg differ
index 56b114e65d37e1900f4380f1cb5b26ecc909c8ab..92704cb9c3bc3cf33188d8712c94e6a43f0f7d98 100644 (file)
Binary files a/sound/weapons/rocket_impact.ogg and b/sound/weapons/rocket_impact.ogg differ
index ca1d8cc1e75a4c48a26151aa2d3f062e8a74cfa0..fd02d133c540360eaa6e5bb34ef15e643fe6de43 100644 (file)
Binary files a/sound/weapons/rocket_mode.ogg and b/sound/weapons/rocket_mode.ogg differ
index 8d4f607c742a2b17970129c9d072125bf545f5f1..41e89c348aedffa5ef85a1951ee220a3f3a22f52 100644 (file)
Binary files a/sound/weapons/shotgun_fire.ogg and b/sound/weapons/shotgun_fire.ogg differ
index 0562b559ed6d4280589eecede1610b3a8011902f..cb72feb5955d80eda60971e5a4db3a82326aa73f 100644 (file)
Binary files a/sound/weapons/shotgun_melee.ogg and b/sound/weapons/shotgun_melee.ogg differ
index 8d27e4fde32969d3fce75917edffda68e852f38e..db284e92699d05cbd0d199d59ad8350e24deb30d 100644 (file)
Binary files a/sound/weapons/strength_fire.ogg and b/sound/weapons/strength_fire.ogg differ
diff --git a/sound/weapons/unavailable.ogg b/sound/weapons/unavailable.ogg
new file mode 100644 (file)
index 0000000..7d1bec5
Binary files /dev/null and b/sound/weapons/unavailable.ogg differ
diff --git a/sound/weapons/unavailable.wav b/sound/weapons/unavailable.wav
deleted file mode 100644 (file)
index b75c8c5..0000000
Binary files a/sound/weapons/unavailable.wav and /dev/null differ
index 24c73a4c05affd2ba71965e79720549b92adeef4..9dc389949394ccd2aa53efc2312c30b30aa4f8b9 100644 (file)
Binary files a/sound/weapons/uzi_fire.ogg and b/sound/weapons/uzi_fire.ogg differ
index 5a7756b06cfe328ea6add03a18e82a25031b0911..8c40e1f233173dc735ef49e3a14ddeeb7b0fe0b7 100644 (file)
Binary files a/sound/weapons/weapon_switch.ogg and b/sound/weapons/weapon_switch.ogg differ
index 4e1c1fbd19301115cfba65c882b129d03dacf093..55ee488946ad6f14bd8c5fbb48ade97fcdf1c99e 100644 (file)
Binary files a/sound/weapons/weaponpickup.ogg and b/sound/weapons/weaponpickup.ogg differ
index 824d1fd8f32372d99b97992bf618254b7058c401..d3a2c0bc5658e578f14f4236f97530ddfd5f18cb 100644 (file)
@@ -11,6 +11,7 @@ set g_vehicles_teams 1 "allow team specific vehicles"
 set g_vehicles_teleportable 0
 set g_vehicles_crush_dmg 70
 set g_vehicles_crush_force 50
+set g_vehicles_crush_minspeed 100
 set g_vehicles_allow_bots 0
 set g_vehicles_exit_attempts 25
 set g_vehicles_thinkrate 0.1
@@ -287,7 +288,7 @@ set g_vehicle_spiderbot_minigun_ammo_max 100
 set g_vehicle_spiderbot_minigun_ammo_regen 40
 set g_vehicle_spiderbot_minigun_ammo_regen_pause 1
 set g_vehicle_spiderbot_minigun_force 9
-set g_vehicle_spiderbot_minigun_solidpenetration 80
+set g_vehicle_spiderbot_minigun_solidpenetration 32
 
 set g_vehicle_spiderbot_rocket_damage 50
 set g_vehicle_spiderbot_rocket_force 150
diff --git a/wpeditor.txt b/wpeditor.txt
new file mode 100644 (file)
index 0000000..19d23ff
--- /dev/null
@@ -0,0 +1,26 @@
+// open this quick menu with: quickmenu file "" wpeditor.txt
+"Spawn"                      "wpeditor spawn"
+"Remove"                     "wpeditor remove"
+"Save all"                   "wpeditor saveall"
+"Spawn at crosshair"         "wpeditor spawn crosshair"
+"Spawn jump"                 "wpeditor spawn jump"
+"Spawn crouch"               "wpeditor spawn crouch"
+"Spawn support"              "wpeditor spawn support"
+"Hardwire/Unhw at crosshair" "wpeditor hardwire crosshair"
+"Hardwire/Unhardwire"        "wpeditor hardwire"
+"Lock/Unlock"                "wpeditor lock"
+"Relink all"                 "wpeditor relinkall"
+"Find unreachable"           "wpeditor unreachable"
+"Show help in console"       "cmd help wpeditor"
+"Settings"
+       "Waypoint editor"             "toggle g_waypointeditor"
+       "On screen console messages"  "toggle con_notify 4 0"
+       "Bot in map"                  "toggle bot_number"
+       "Bots can't fire"             "toggle bot_nofire"
+       "Show bot's path to goal"     "toggle bot_debug_goalstack"
+       "Show tracewalk path"         "toggle bot_debug_tracewalk"
+       "No time limit"               "timelimit 0"
+       "Cheats"                      "toggle sv_cheats"
+       "God mode on/off"             "god"
+       "Fly mode on/off"             "fly"
+"Settings"
\ No newline at end of file
index fa9b9ca00f9d395f1d512f1bfcf1b2d38aad9521..a6494cc088a0551d2856b8cfc8c4c3539cc49657 100644 (file)
@@ -166,6 +166,7 @@ seta cl_leanmodel_highpass1 0.2 "gun leaning pre-highpass averaging time"
 seta cl_leanmodel_highpass 0.2 "gun leaning highpass averaging time"
 seta cl_leanmodel_lowpass 0.05 "gun leaning lowpass averaging time"
 
+cl_maxfps_alwayssleep 0 // gives up some processing time to other applications each frame, default is 1 (not necessary since Xonotic caps FPS by default)
 cl_rollangle 0 // amount of view tilt when strafing, default is 2.0
 v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
 gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
@@ -193,7 +194,7 @@ seta cl_autotaunt 0 "automatically taunt enemies when fragging them"
 seta cl_voice_directional 1    "0 = all voices are non-directional, 1 = all voices are directional, 2 = only taunts are directional"
 seta cl_voice_directional_taunt_attenuation 0.5 "this defines the distance from which taunts can be heard"
 
-seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy, 1: same pitch 2: increase pitch with more damage 3: decrease pitch with more damage"
+seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy, 1: same pitch 2: decrease pitch with more damage 3: increase pitch with more damage"
 set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this"
 seta cl_hitsound_min_pitch 0.75 "minimum pitch of hit sound"
 seta cl_hitsound_max_pitch 1.5 "maximum pitch of hit sound"
@@ -233,6 +234,8 @@ cl_movement 1
 cl_movement_track_canjump 0
 cl_stairsmoothspeed 200
 
+alias wpeditor_menu "quickmenu file \"\" wpeditor.txt"
+
 alias g_waypointeditor_spawn         "wpeditor spawn"
 alias g_waypointeditor_remove        "wpeditor remove"
 alias g_waypointeditor_relinkall     "wpeditor relinkall"
@@ -446,7 +449,7 @@ seta cl_damagetext_2d_overlap_offset "0 -15 0" "Offset 2D damage text by this mu
 seta cl_damagetext_2d_close_range 125 "Always use 2D damagetext for hits closer that this"
 seta cl_damagetext_2d_out_of_view 1 "Always use 2D damagetext for hits that occurred off-screen"
 
-seta cl_vehicles_alarm 1 "Play an alarm sound when the vehicle you are driving is heavily damaged"
+seta cl_vehicles_alarm 0 "Play an alarm sound when the vehicle you are driving is heavily damaged"
 seta cl_vehicles_hud_tactical 1
 seta cl_vehicles_hudscale 0.5
 seta cl_vehicles_notify_time 15
@@ -608,6 +611,7 @@ makesaved music_playlist_list0
 makesaved music_playlist_random0
 
 cl_netfps 60 // should match or be a multiple of sys_ticrate
+_cl_rate 40000 // fast adsl
 
 gl_texture_anisotropy 8
 seta gl_texturecompression 0 // FIXME the description is wrong - when this is 0, e.g. gl_texturecompression_sky still takes effect
@@ -618,7 +622,7 @@ gl_texturecompression_lightcubemaps 0
 gl_texturecompression_q3bsplightmaps 0
 gl_texturecompression_sky 1
 
-cl_maxfps 200
+cl_maxfps 250
 
 seta menu_mouse_absolute 1 "use the OS mouse pointer motion for menu"
 seta menu_mouse_speed 1 "speed multiplier for the mouse in the menu (does not affect in-game aiming)"
@@ -807,7 +811,7 @@ set cl_db_saveasdump 0 "write client.db in dump format (loads slower, easier to
 // uid2name
 seta cl_allow_uid2name -1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid2name (allows showing your name in race rankings for instance)"
 seta cl_allow_uidtracking 1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid tracking (allows associating your data with your player ID)"
-// FIXME set to -1 before release, once we have a dialog for this!
+seta cl_allow_uidranking 1 "0 = disable, 1 = enable uid ranking (allows statistics like elo to rank you in leaderboards)"
 
 // polygonoffset for submodel SUCKS SUCKS SUCKS (only a hack for quake1, we don't need that)
 r_polygonoffset_submodel_offset 0
@@ -850,7 +854,7 @@ seta cl_ghost_items 0.45 "enable ghosted items (when between 0 and 1, overrides
 seta cl_ghost_items_color "-1 -1 -1" "color of ghosted items (colormod format: 0 0 0 leaves the color unchanged, negative values allowed)"
 seta cl_simple_items 0 "enable simple items (if server allows)"
 set cl_simpleitems_postfix "_luma" "posfix to add fo model name when simple items are enabled"
-set cl_fullbright_items 0 "enable fullbright items (if server allows, controlled by g_fullbrightitems)"
+set cl_fullbright_items 0 "enable fullbright items (if server allows, controlled by g_fullbrightitems) - items are more visible in shadows"
 set cl_weapon_stay_color "2 0.5 0.5" "Color of picked up weapons when g_weapon_stay > 0 (colormod format: 0 0 0 leaves the color unchanged, negative values allowed)"
 set cl_weapon_stay_alpha 0.75 "Alpha of picked up weapons when g_weapon_stay > 0"
 
index e19a4b22efcbba720b6e84f86e162a83318006e5..e66f051cd848ab7ae05a5544adc6c3f90e9b9cea 100644 (file)
@@ -10,40 +10,42 @@ set sv_autotaunt 1 "allow autotaunts on the server"
 
 // server settings
 hostname "Xonotic $g_xonoticversion Server"
-set sv_mapchange_delay 5
+set sv_mapchange_delay 5 "delay by this many seconds after the match ends before showing selection screen or changing maps"
 set minplayers 0 "fill server with bots to reach this number of players in teamless games (if bot_number is not enough)"
 set minplayers_per_team 0 "fill server with bots to reach this number of players per team (if bot_number is not enough)"
 
 // restart server if all players hit "ready"-button
 set sv_ready_restart 0 "allow a map to be restarted once all players pressed the \"ready\" button"
-set sv_ready_restart_after_countdown 0 "reset players and map items after the countdown ended, instead of at the beginning of the countdown"
-set sv_ready_restart_repeatable 0      "allows the players to restart the game as often as needed"
+set sv_ready_restart_after_countdown 0 "reset players and map items after the countdown ended, instead of at the beginning of the countdown"
+set sv_ready_restart_repeatable 0 "allows the players to restart the game as often as needed"
 
 //nifreks lockonrestart feature, used in team-based game modes, if set to 1 and all players readied up no other player can then join the game anymore, useful to block spectators from joining
 set teamplay_lockonrestart 0 "lock teams once all players readied up and the game restarted (no new players can join after restart unless using the server-command unlockteams)"
 
-set g_maxplayers 0     "maximum number of players allowed to play at the same time, set to 0 to allow all players to join the game"
-set g_maxplayers_spectator_blocktime 5 "if the players voted for the \"nospectators\" command, this setting defines the number of seconds a observer/spectator has time to join the game before he gets kicked"
+set g_maxplayers 0 "maximum number of players allowed to play at the same time, set to 0 to allow all players to join the game"
+set g_maxplayers_spectator_blocktime 5 "if the players voted for the \"nospectators\" command, this setting defines the number of seconds a observer/spectator has time to join the game before he gets kicked"
 
 // tournament mod
-set g_warmup 0 "split the game into a warmup- and match-stage"
-set g_warmup_limit 180 "limit warmup-stage to this time (in seconds); if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage"
-set g_warmup_allow_timeout 0   "allow calling timeouts in the warmup-stage (if sv_timeout is set to 1)"
-set g_warmup_allguns 1 "provide more weapons on start while in warmup: 0 = normal start weapons, 1 = all guns available on the map, 2 = all normal weapons"
+set g_warmup 0 "split the game into a warmup- and match-stage"
+set g_warmup_limit 180 "limit warmup-stage to this time (in seconds); if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage"
+set g_warmup_allow_timeout 0 "allow calling timeouts in the warmup-stage (if sv_timeout is set to 1)"
+set g_warmup_allguns 1 "provide more weapons on start while in warmup: 0 = normal start weapons, 1 = all guns available on the map, 2 = all normal weapons"
 set g_warmup_majority_factor 0.8 "minimum percentage of players ready needed for warmup to end"
 
-set g_chat_nospectators 0      "if 0 spec/observer chat is always visible to the player, if 1 it is never visible to players, if 2 it is only visible to players during warmup stage"
-set sv_vote_nospectators 0     "only players can call a vote (thus spectators and observers can't call a vote): 0 = all people can vote, 1 = spectators can vote in warmup stage, 2 = only players can vote (no exceptions)."
+alias sv_hook_warmupend
+
+set g_chat_nospectators 0 "if 0 spec/observer chat is always visible to the player, if 1 it is never visible to players, if 2 it is only visible to players during warmup stage"
+set sv_vote_nospectators 0 "only players can call a vote (thus spectators and observers can't call a vote): 0 = all people can vote, 1 = spectators can vote in warmup stage, 2 = only players can vote (no exceptions)."
 
 alias g_tourney "g_tourney_$1"
 alias g_tourney_1 "g_warmup 1; g_chat_nospectators 2; sv_vote_nospectators 1"
 alias g_tourney_0 "g_warmup 0; g_chat_nospectators 0; sv_vote_nospectators 0"
 
-set sv_timeout 0       "allow a player to call a timeout, this will pause the game for some time"
-set sv_timeout_length 120      "how long the game will be paused at max, in seconds"
-set sv_timeout_number 2        "how many timeouts one player is allowed to call (gets reset after a restart)"
-set sv_timeout_leadtime 4      "how long the players will be informed that a timeout was called before it starts, in seconds"
-set sv_timeout_resumetime 3    "how long the remaining timeout-time will be after a player called the timein command"
+set sv_timeout 0 "allow a player to call a timeout, this will pause the game for some time"
+set sv_timeout_length 120 "how long the game will be paused at max, in seconds"
+set sv_timeout_number 2 "how many timeouts one player is allowed to call (gets reset after a restart)"
+set sv_timeout_leadtime 4 "how long the players will be informed that a timeout was called before it starts, in seconds"
+set sv_timeout_resumetime 3 "how long the remaining timeout-time will be after a player called the timein command"
 
 set g_allow_oldvortexbeam 1 "If enabled, clients are allowed to use old v2.3 Vortex beam"
 
@@ -90,7 +92,7 @@ set sv_defaultcharacter 0 "master switch, if set to 1 the further configuration
 set sv_defaultcharacterskin 0 "if set to 1 the further configuration for replacing all skins is taken from the sv_defaultplayerskin variables"
 set sv_defaultplayermodel "models/player/erebus.iqm" "default model selection, only works if sv_defaultcharacter is set to 1; you may append a :<skinnumber> suffix to model names; you can specify multiple, separated by space, and a random one will be chosen"
 set sv_defaultplayerskin 0 "each model has 1 or more skins (combination of model and skin = character), set which skin of the model you wish the default character to have, only works if sv_defaultcharacter is set to 1; can be overridden by :<skinnumber> suffix in sv_defaultplayermodel"
-set sv_defaultplayermodel_red ""       "\"\" means see sv_defaultplayermodel"
+set sv_defaultplayermodel_red "" "\"\" means see sv_defaultplayermodel"
 set sv_defaultplayerskin_red 0 "skin to use on the red team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayermodel_blue "" "\"\" means see sv_defaultplayermodel"
 set sv_defaultplayerskin_blue 0 "skin to use on the blue team, set to 0 to instead use sv_defaultplayerskin"
@@ -98,7 +100,7 @@ set sv_defaultplayermodel_yellow "" "\"\" means see sv_defaultplayermodel"
 set sv_defaultplayerskin_yellow 0 "skin to use on the yellow team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayermodel_pink "" "\"\" means see sv_defaultplayermodel"
 set sv_defaultplayerskin_pink 0 "skin to use on the pink team, set to 0 to instead use sv_defaultplayerskin"
-set sv_defaultplayercolors ""  "set to 16*shirt+pants to force a color, note: it does NOT depend on defaultcharacter! Set to \"\" to disable"
+set sv_defaultplayercolors "" "set to 16*shirt+pants to force a color, note: it does NOT depend on defaultcharacter! Set to \"\" to disable"
 set sv_autoscreenshot 0 "if set to 1, the server forces all clients to create a local screenshot once the map ended"
 net_messagetimeout 30
 net_connecttimeout 30
@@ -107,12 +109,13 @@ sv_jumpstep 1 // step up stairs while jumping, makes it easier to reach ledges
 set sv_shownames_cull_distance 2500 "distance after which to not send origin/health/armor of another player"
 
 set bot_config_file bots.txt "Name and path of the bot configuration file"
-set bot_number 0       "Minimum number of bots"
-set bot_usemodelnames 0        "Use player model names for bot names"
-set bot_nofire 0       "When set, bots never fire. Mainly for testing in g_waypointeditor mode"
-set bot_prefix [BOT]   "Prefix in front of the bot names"
-set bot_suffix ""      "Suffix behind the bot names"
-set skill_auto 0       "when 1, \"skill\" gets adjusted to match the best player on the map"
+set bot_number 0 "Minimum number of bots"
+set bot_usemodelnames 0 "Use player model names for bot names"
+set bot_nofire 0 "When set, bots never fire. Mainly for testing in g_waypointeditor mode"
+set bot_prefix [BOT] "Prefix in front of the bot names"
+set bot_suffix "" "Suffix behind the bot names"
+skill 8
+set skill_auto 0 "when 1, \"skill\" gets adjusted to match the best player on the map"
 set bot_debug_tracewalk 0 "Enable visual indicators for short-term navigation. Green: Goal Reached / Yellow: Obstacle found / Red: Unsolvable obstacle found"
 set bot_debug_goalstack 0 "Visualize the current path that each bot is following. Use with as few bots as possible."
 set bot_wander_enable 1 "Have bots wander around if they are unable to reach any useful goal. Disable only for debugging purposes."
@@ -127,7 +130,7 @@ set bot_ai_dodgeupdateinterval 0.2 "How often scan for items to dodge. Currently
 set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the situation will be chosen"
 set bot_ai_dangerdetectioninterval 0.25 "How often scan for waypoints with dangers near"
 set bot_ai_dangerdetectionupdates 64 "How many waypoints will be considered for danger detection"
-set bot_ai_aimskill_blendrate 2        "How much correction will be applied to the aiming angle"
+set bot_ai_aimskill_blendrate 2 "How much correction will be applied to the aiming angle"
 set bot_ai_aimskill_fixedrate 15 "Distance based scale from which correction will be applied to the aiming angle"
 set bot_ai_aimskill_firetolerance 0 "enable fire tolerance"
 set bot_ai_aimskill_firetolerance_distdegrees 100 "Rate at which the aiming angle is updated, scales by skill"
@@ -138,15 +141,15 @@ set bot_ai_keyboard_distance 250 "Keyboard emulation is disabled after this dist
 set bot_ai_keyboard_threshold 0.57
 set bot_ai_aimskill_offset 0.3 "Amount of error induced to the bots aim"
 set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming"
-set bot_ai_custom_weapon_priority_distances "300 850"  "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
-set bot_ai_custom_weapon_priority_far   "vaporizer oknex vortex rifle electro devastator mortar hagar hlac crylink blaster okmachinegun machinegun fireball seeker okshotgun shotgun shockwave tuba minelayer" "Desired weapons for far distances ordered by priority"
-set bot_ai_custom_weapon_priority_mid   "vaporizer devastator oknex vortex fireball seeker mortar electro okmachinegun machinegun arc crylink hlac hagar okshotgun shotgun shockwave blaster rifle tuba minelayer"     "Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "vaporizer oknex vortex okshotgun shotgun shockwave okmachinegun machinegun arc hlac tuba seeker hagar crylink mortar electro devastator blaster fireball rifle minelayer"     "Desired weapons for close distances ordered by priority"
-set bot_ai_weapon_combo 1      "Enable bots to do weapon combos"
-set bot_ai_weapon_combo_threshold 0.4  "Try to make a combo N seconds after the last attack"
-set bot_ai_friends_aware_pickup_radius "500"   "Bots will not pickup items if a team mate is this distance near the item"
-set bot_ai_ignoregoal_timeout 3        "Ignore goals making bots to get stuck in front of a wall for N seconds"
-set bot_ai_bunnyhop_skilloffset 7      "Bots with skill equal or greater than this value will perform the \"bunnyhop\" technique"
+set bot_ai_custom_weapon_priority_distances "300 850" "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
+set bot_ai_custom_weapon_priority_far   "vaporizer oknex vortex rifle electro devastator mortar hagar hlac crylink blaster okmachinegun machinegun fireball seeker okshotgun shotgun shockwave tuba minelayer" "Desired weapons for far distances ordered by priority"
+set bot_ai_custom_weapon_priority_mid   "vaporizer devastator oknex vortex fireball seeker mortar electro okmachinegun machinegun arc crylink hlac hagar okshotgun shotgun shockwave blaster rifle tuba minelayer" "Desired weapons for middle distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "vaporizer oknex vortex okshotgun shotgun shockwave okmachinegun machinegun arc hlac tuba seeker hagar crylink mortar electro devastator blaster fireball rifle minelayer" "Desired weapons for close distances ordered by priority"
+set bot_ai_weapon_combo 1 "Enable bots to do weapon combos"
+set bot_ai_weapon_combo_threshold 0.4 "Try to make a combo N seconds after the last attack"
+set bot_ai_friends_aware_pickup_radius "500" "Bots will not pickup items if a team mate is this distance near the item"
+set bot_ai_ignoregoal_timeout 3 "Ignore goals making bots to get stuck in front of a wall for N seconds"
+set bot_ai_bunnyhop_skilloffset 7 "Bots with skill equal or greater than this value will perform the \"bunnyhop\" technique"
 set bot_ai_bunnyhop_startdistance 200 "Run to goals located further than this distance"
 set bot_ai_bunnyhop_stopdistance 300 "Stop jumping after reaching this distance to the goal"
 set bot_ai_bunnyhop_firstjumpdelay 0.2 "Start running to the goal only if it was seen for more than N seconds"
@@ -175,19 +178,19 @@ set g_waypointeditor_symmetrical_allowload 1 "Allow loading symmetry settings fr
 set g_waypointeditor_symmetrical_origin "0 0" "Custom origin of symmetry (x y)"
 set g_waypointeditor_symmetrical_order 0 "if >= 2 apply rotational symmetry (around origin of symmetry) of this order, otherwise apply autodetected order of symmetry"
 set g_waypointeditor_symmetrical_axis "0 0" "Custom axis of symmetry (m q parameters of y = mx + q)"
-set bot_ignore_bots 0  "When set, bots don't shoot at other bots"
-set bot_join_empty 0   "When set, bots also play if no player has joined the server"
-set bot_vs_human 0     "Bots and humans play in different teams when set. positive values to make an all-bot blue team, set to negative values to make an all-bot red team, the absolute value is the ratio bots vs humans (1 for equal count). Changes will be correctly applied only from the next game"
+set bot_ignore_bots 0 "When set, bots don't shoot at other bots"
+set bot_join_empty 0 "When set, bots also play if no player has joined the server"
+set bot_vs_human 0 "Bots and humans play in different teams when set. positive values to make an all-bot blue team, set to negative values to make an all-bot red team, the absolute value is the ratio bots vs humans (1 for equal count). Changes will be correctly applied only from the next game"
 
 set g_spawnshieldtime 1 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
 set g_spawnshield_blockdamage 1 "how much spawn shield protects you from damage (1 = full protection)"
-set g_antilag 2        "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past)"
+set g_antilag 2 "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past)"
 set g_antilag_nudge 0 "don't touch"
 set g_shootfromeye 0 "shots are fired from your eye/crosshair; visual gun position can still be influenced by cl_gunalign 1 and 2"
 set g_shootfromcenter 0 "weapon gets moved to the center, shots still come from the barrel of your weapon; visual gun position can still be influenced by cl_gunalign 1 and 2"
 set g_shootfromfixedorigin "" "if set to a string like 0 y z, the gun is moved to the given y and z coordinates. If set to a string like x y z, the whole shot origin is used"
 set g_pinata 0 "if set to 1 you will not only drop your current weapon when you are killed, but you will drop all weapons that you possessed"
-set g_weapon_stay 0 "1: ghost weapons can be picked up too but give no ammo, 2: ghost weapons refill ammo to one pickup size, thrown guns have no ammo"
+set g_weapon_stay 0 "1: ghost weapons can be picked up but give no ammo, thrown guns have ammo 2: ghost weapons can be picked up and refill ammo to one pickup size, thrown guns have no ammo (to prevent infinite ammo abuse)"
 set g_weapon_throwable 1 "if set to 1, weapons can be dropped"
 set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default"
 set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammo"
@@ -195,24 +198,25 @@ set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) a
 set g_pickup_respawntime_scaling_reciprocal 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*"
 set g_pickup_respawntime_scaling_offset 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening"
 set g_pickup_respawntime_scaling_linear 1 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly"
-set g_weaponarena "0"  "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
-set g_weaponarena_random "0"   "if set to a number, only that weapon count is given on every spawn (randomly)"
-set g_weaponarena_random_with_blaster "1"      "additionally, always provide the blaster in random weapon arena games"
+set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\", \"most\", \"all_available\" or \"most_available\" (available only gives the weapon if the map normally has it as a pickup item)"
+set g_weaponarena_random "0" "if set to a number, only that weapon count is given on every spawn (randomly)"
+set g_weaponarena_random_with_blaster "1" "additionally, always provide the blaster in random weapon arena games"
 set g_spawnpoints_auto_move_out_of_solid 0 "if set to 1 you will see a warning if a spawn point was placed inside a solid"
 set g_forced_respawn 0 "if set to 1 and a player died, that player gets automatically respawned once <g_respawn_delay> seconds are over"
 set g_fullbrightplayers 0 "brightens up player models (note that the color, skin or model of the players does not change!)"
-set g_fullbrightitems 0 "brightens up items"
+set g_fullbrightitems 0 "allows players to use cl_fullbright_items"
 set g_nodepthtestplayers 0 "disables depth testing on players"
 set g_nodepthtestitems 0 "disables depth testing on items"
 set g_casings 2 "specifies which casings (0: none, 1: only shotgun casings, 2: shotgun and machine gun casings) are sent to the client"
 set g_norecoil 0 "if set to 1 shooting weapons won't make you crosshair to move upwards (recoil)"
 set g_maplist_mostrecent "" "contains the name of the maps that were most recently played"
-set g_maplist_mostrecent_count 3       "number of most recent maps that are blocked from being played again"
-set g_maplist_index 0  "this is used internally for saving position in maplist cycle"
-set g_maplist_selectrandom 0   "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
-set g_maplist_shuffle 1        "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
-set g_maplist_check_waypoints 0        "when 1, maps are skipped if there currently are bots, but the map has no waypoints"
+set g_maplist_mostrecent_count 3 "number of most recent maps that are blocked from being played again"
+set g_maplist_index 0 "this is used internally for saving position in maplist cycle"
+set g_maplist_selectrandom 0 "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
+set g_maplist_shuffle 1 "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
+set g_maplist_check_waypoints 0 "when 1, maps are skipped if there currently are bots, but the map has no waypoints"
 set g_maplist_ignore_sizes 0 "when 1, all maps are shown in the map list regardless of player count"
+set g_maplist_sizes_count_bots 1 "include the number of bots currently in the server when counting the number of players for size restrictions"
 
 set g_items_mindist 4000 "starting distance for the fading of items"
 set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after which it will be invisible"
@@ -221,7 +225,7 @@ set g_grab_range 200 "distance at which dragable objects can be grabbed"
 
 set g_cloaked 0 "display all players mostly invisible"
 set g_player_alpha 1 "default opacity of players"
-set g_player_brightness 0      "set to 2 for brighter players"
+set g_player_brightness 0 "set to 2 for brighter players"
 set g_player_damageforcescale 2 "push multiplier of attacks against players"
 set g_balance_cloaked_alpha 0.25 "opacity of cloaked players"
 
@@ -257,15 +261,15 @@ set g_friendlyfire_virtual_force 1  "for teamplay_mode 4: apply force even thoug
 set g_teamdamage_threshold 40       "for teamplay_mode 4: threshold over which to apply mirror damage"
 set g_teamdamage_resetspeed 20      "for teamplay_mode 4: how fast player's teamdamage count decreases"
 
-set g_balance_teams 1  "automatically balance out players entering instead of asking them for their preferred team"
-set g_balance_teams_prevent_imbalance  1       "prevent players from changing to larger teams"
-set g_changeteam_banned 0      "not allowed to change team"
+set g_balance_teams 1 "automatically balance out players entering instead of asking them for their preferred team"
+set g_balance_teams_prevent_imbalance 1 "prevent players from changing to larger teams"
+set g_changeteam_banned 0 "not allowed to change team"
 
 set sv_teamnagger 1 "enable a nag message when the teams are unbalanced"
 
 set g_bloodloss 0   "amount of health below which blood loss occurs"
 
-set g_footsteps 1      "serverside footstep sounds"
+set g_footsteps 1 "serverside footstep sounds"
 
 set g_throughfloor_debug 0 "enable debugging messages for throughfloor calculations"
 set g_throughfloor_damage_max_stddev 2 "Maximum standard deviation for splash damage"
@@ -295,13 +299,13 @@ set _sv_init 0
 alias startmap_dm "set _sv_init 0; map _init/_init; exec $serverconfig; set _sv_init 1"
 
 // score log
-set sv_logscores_console 0     "print scores to server console"
-set sv_logscores_file 0        "print scores to file"
-set sv_logscores_filename scores.log   "filename"
-set sv_logscores_bots 0        "exclude bots by default"
+set sv_logscores_console 0 "print scores to server console"
+set sv_logscores_file 0 "print scores to file"
+set sv_logscores_filename scores.log "filename"
+set sv_logscores_bots 0 "exclude bots by default"
 
 // spam (frag/capture) log
-set sv_eventlog 0      "the master switch for efficiency reasons"
+set sv_eventlog 0 "the master switch for efficiency reasons"
 set sv_eventlog_console 1 "print event log entries to the console as well"
 set sv_eventlog_files 0 "save the event log to individual files instead of the main server log"
 set sv_eventlog_files_timestamps 1 "include timestamps in the log file names"
@@ -309,10 +313,10 @@ set sv_eventlog_files_counter 0 "internal counter cvar, do not modify"
 set sv_eventlog_files_nameprefix xonotic "prefix of individual log file names"
 set sv_eventlog_files_namesuffix .log "suffix of individual log file names"
 
-set nextmap "" "override the maplist when switching to the next map"
+set nextmap "" "override the maplist when switching to the next map"
 set lastlevel "" "for singleplayer use, shows the menu once the match has ended"
-set quit_when_empty 0  "set to 1, then the server exits when the next level would start but is empty"
-set quit_and_redirect ""       "set to an IP to redirect all players at the end of the match to another server. Set to \"self\" to let all players reconnect at the end of the match (use it to make seamless engine updates)"
+set quit_when_empty 0 "set to 1, then the server exits when the next level would start but is empty"
+set quit_and_redirect "" "set to an IP to redirect all players at the end of the match to another server. Set to \"self\" to let all players reconnect at the end of the match (use it to make seamless engine updates)"
 set quit_and_redirect_timer 1.5 "set to number of seconds after quit before performing the connect operation of quit_and_redirect"
 
 // Green's fullbright skins, updated by Samual
@@ -331,34 +335,34 @@ set sv_curl_serverpackages_auto 1 "automatically add packs with *.serverpackage
 
 set sv_motd "" "additional information to show on the welcome screen that greets joining players"
 
-set g_waypoints_for_items 0    "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
+set g_waypoints_for_items 0 "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
 
-set g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match"
+set g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match, 0 to disable"
 set g_maplist_votable_keeptwotime 15 "show only 2 options after this amount of time during map vote screen"
-set g_maplist_votable_timeout 30       "timeout for the map voting; must be below 50 seconds!"
-set g_maplist_votable_suggestions 2 "number of maps a player is allowed to suggest for the map voting screen"
+set g_maplist_votable_timeout 30 "timeout for the map voting; must be below 50 seconds!"
+set g_maplist_votable_suggestions 2 "number of maps a player is allowed to suggest for the map voting screen using 'suggestmap'"
 set g_maplist_votable_suggestions_override_mostrecent 0 "allow players to suggest maps that have been played recently"
-set g_maplist_votable_nodetail 0       "nodetail only shows total count instead of all vote counts per map, so votes don't influence others that much"
-set g_maplist_votable_abstain 0        "when 1, you can abstain from your vote"
+set g_maplist_votable_nodetail 0 "hide per-map vote counts (to avoid influential first votes)"
+set g_maplist_votable_abstain 0 "offer a "\don't care\" option on the voting screen"
 set g_maplist_votable_screenshot_dir "maps levelshots" "where to look for map screenshots"
 
 set sv_vote_gametype 0 "show a vote screen for gametypes before map vote screen"
 set sv_vote_gametype_keeptwotime 10 "show only 2 options after this amount of time during gametype vote screen"
-set sv_vote_gametype_options "dm tdm ctf" "Keep the identifiers short, otherwise you'll run into issues with too long alias names (max is 31 characters) when using sv_vote_gametype_hook_*"
+set sv_vote_gametype_options "dm tdm ca ctf" "identifiers of gamemodes on the voting screen, can be custom (max 9 chars) - see example in server/server.cfg"
 set sv_vote_gametype_timeout 20 "how long the gametype vote screen lasts"
 set sv_vote_gametype_default_current 1 "Keep the current gametype if no one votes"
 
-set g_chat_flood_spl 3 "normal chat: seconds between lines to not count as flooding"
-set g_chat_flood_lmax 2        "normal chat: maximum number of lines per chat message at once"
-set g_chat_flood_burst 2       "normal chat: allow bursts of so many chat lines"
-set g_chat_flood_spl_team 1    "team chat: seconds between lines to not count as flooding"
-set g_chat_flood_lmax_team 2   "team chat: maximum number of lines per chat message at once"
-set g_chat_flood_burst_team 2  "team chat: allow bursts of so many chat lines"
-set g_chat_flood_spl_tell 1    "private chat: seconds between lines to not count as flooding"
-set g_chat_flood_lmax_tell 2   "private chat: maximum number of lines per chat message at once"
-set g_chat_flood_burst_tell 2  "private chat: allow bursts of so many chat lines"
-set g_chat_flood_notify_flooder 1      "when 0, the flooder still can see his own message"
-set g_chat_teamcolors 0        "colorize nicknames in team color for chat"
+set g_chat_flood_spl 3 "normal chat: seconds between lines to not count as flooding"
+set g_chat_flood_lmax 2 "normal chat: maximum number of lines per chat message at once"
+set g_chat_flood_burst 2 "normal chat: allow bursts of so many chat lines"
+set g_chat_flood_spl_team 1 "team chat: seconds between lines to not count as flooding"
+set g_chat_flood_lmax_team 2 "team chat: maximum number of lines per chat message at once"
+set g_chat_flood_burst_team 2 "team chat: allow bursts of so many chat lines"
+set g_chat_flood_spl_tell 1 "private chat: seconds between lines to not count as flooding"
+set g_chat_flood_lmax_tell 2 "private chat: maximum number of lines per chat message at once"
+set g_chat_flood_burst_tell 2 "private chat: allow bursts of so many chat lines"
+set g_chat_flood_notify_flooder 1 "when 0, the flooder still can see his own message"
+set g_chat_teamcolors 0 "colorize nicknames in team color for chat"
 set g_chat_tellprivacy 1 "when disabled, tell messages are also sent to the server console log... otherwise they're kept private between players."
 set g_nick_flood_timeout 120 "time after which nick flood protection resets (set to 0 to disable nick flood checking)"
 set g_nick_flood_penalty 0.5 "duration of the nick flood penalty"
@@ -371,17 +375,17 @@ set sv_waypointsprite_limitedrange 5120 "default maximum viewing distance of way
 
 set sv_itemstime 1 "enable networking of time left until respawn for items such as mega health/armor and powerups"
 
-set g_ban_default_bantime 5400 "90 minutes"
-set g_ban_default_masksize 3   "masksize 0 means banning by UID only, 1 means banning by /8 (IPv6: /32) network, 2 means banning by /16 (IPv6: /48) network, 3 means banning by /24 (IPv6: /56) network, 4 means banning by single IP (IPv6: /64 network)"
+set g_ban_default_bantime 5400 "90 minutes"
+set g_ban_default_masksize 3 "masksize 0 means banning by UID only, 1 means banning by /8 (IPv6: /32) network, 2 means banning by /16 (IPv6: /48) network, 3 means banning by /24 (IPv6: /56) network, 4 means banning by single IP (IPv6: /64 network)"
 set g_ban_telluser 1 "notify the banned player about it when they try to join"
-set g_banned_list ""   "format: IP remainingtime IP remainingtime ..."
-set g_banned_list_idmode "1"   "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)"
+set g_banned_list "" "format: IP remainingtime IP remainingtime ..."
+set g_banned_list_idmode "1" "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)"
 
 // useful vote aliases
 set timelimit_increment 5 "number of minutes added to the timer when voting for extendmatchtime"
 set timelimit_decrement 5 "number of minutes removed from the timer when voting for reducematchtime"
-set timelimit_min 5 "shortest match time achieveable with reducematchtime votes"
-set timelimit_max 60 "maximum match time achieveable with extendmatchtime votes"
+set timelimit_min 5 "shortest match time achieveable with reducematchtime and timelimit votes"
+set timelimit_max 60 "maximum match time achieveable with extendmatchtime and timelimit votes"
 
 sv_gameplayfix_delayprojectiles 0
 sv_gameplayfix_q2airaccelerate 1
@@ -405,18 +409,18 @@ set sv_maxidle_slots_countbots 1 "count bots as player slots"
 sv_allowdownloads_inarchive 1 // for csprogs.dat
 sv_allowdownloads 0 // download protocol is evil
 
-set g_jump_grunt 0     "Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
+set g_jump_grunt 0 "Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
 
-set g_maplist_allow_hidden 0           "allow hidden maps to be, e.g., voted for and in the maplist"
-set g_maplist_allow_frustrating 0      "allow impossible maps to be, e.g., voted for and in the maplist (if set to 2, ONLY impossible maps are allowed)"
+set g_maplist_allow_hidden 0  "allow hidden maps to be, e.g., voted for and in the maplist"
+set g_maplist_allow_frustrating 0 "allow impossible maps to be, e.g., voted for and in the maplist (if set to 2, ONLY impossible maps are allowed)"
 
-set sv_clones 0        "number of clones a player may make (reset by the \"kill\" command)"
+set sv_clones 0 "number of clones a player may make (reset by the \"kill\" command)"
 
-set g_ban_sync_uri ""  "sync using this ban list provider (empty string to disable)"
-set g_ban_sync_interval 5      "sync every 5 minutes"
-set g_ban_sync_trusted_servers ""      "request ban lists from these xonotic servers (do not include your own server there, or unbanning may fail)"
-set g_ban_sync_timeout 45      "time out in seconds for the ban sync requests"
-set g_ban_sync_trusted_servers_verify 0        "when set to 1, additional bans sent by the servers are ignored, and only bans for the requested IP are used"
+set g_ban_sync_uri "" "sync using this ban list provider (empty string to disable)"
+set g_ban_sync_interval 5 "sync every 5 minutes"
+set g_ban_sync_trusted_servers "" "request ban lists from these xonotic servers (do not include your own server there, or unbanning may fail)"
+set g_ban_sync_timeout 45 "time out in seconds for the ban sync requests"
+set g_ban_sync_trusted_servers_verify 0 "when set to 1, additional bans sent by the servers are ignored, and only bans for the requested IP are used"
 
 set g_showweaponspawns 1 "1: display waypoints for weapon spawns found on the map when a weapon key is pressed and the weapon is not owned; 2: for dropped weapons too; 3: for all the weapons sharing the same impulse"
 
@@ -426,11 +430,11 @@ set g_ballistics_density_corpse 0.10 "how hard corpses are to shoot through comp
 set g_ballistics_penetrate_clips 1 "allow ballistics to pass through weapon clips"
 set g_ballistics_solidpenetration_exponent 0.25 "how fast damage falls off when bullets pass through walls - 1 means linear, lower values mean slower initial falloff but faster once there's little solidpenetration left (damage_fraction = solidpen_fraction^exp for solidpen_fraction between 0 and 1)"
 
-sv_status_show_qcstatus 1      "Xonotic uses this field instead of frags"
-set g_full_getstatus_responses 0       "this currently breaks qstat"
+sv_status_show_qcstatus 1 "Xonotic uses this field instead of frags"
+set g_full_getstatus_responses 0 "this currently breaks qstat"
 
 // "Gentle mode": show no blood
-set sv_gentle 0                "force gentle mode for everyone, also remove references to acts of killing from the messages"
+set sv_gentle 0 "force gentle mode for everyone, also remove references to acts of killing from the messages"
 
 set g_jetpack 0 "Jetpack mutator"
 
@@ -483,12 +487,15 @@ sv_gameplayfix_nogravityonground 1
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping machinegun and shotgun (for Q3A map compatibility in mapinfo files)"
 set sv_vq3compat 0 "toggle for some compatibility hacks (for VQ3 and CPM map compatibility in mapinfo files)"
 
-set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
+set g_movement_highspeed 1 "multiplier scale for movement speed (applies to sv_maxspeed and sv_maxairspeed, also applies to air acceleration when g_movement_highspeed_q3_compat is set to 0)"
+set g_movement_highspeed_q3_compat 0 "apply speed modifiers to air movement in a more Q3-compatible way (only apply speed buffs and g_movement_highspeed to max air speed, not to acceleration)"
 
 set g_maxspeed 0 "player speed limit, faster players are killed (0 for unlimited speed)"
 
 // sv_cullentities_trace is 1, so the client doesn't have to
 sv_cullentities_trace 1
+// due to a bug in the engine, the default setting of this (16) spams the network with item updates
+sv_cullentities_trace_eyejitter 0
 
 // less "lagging" of other players, but also less PL tolerant... let's try this
 sv_clmovement_inputtimeout 0.066 // slightly less than 2 frames, so only one frame can be compensated
@@ -560,3 +567,4 @@ set sv_showspectators 1 "Show who's spectating who in the player info panel when
 set sv_damagetext 2 "<= 0: disabled, >= 1: visible to spectators, >= 2: visible to attacker, >= 3: all players see everyone's damage"
 
 set sv_showfps 5 "Show player's FPS counters in the scoreboard. This setting acts as a delay in seconds between updates"
+set autocvar_sv_doors_always_open 0 "If set to 1 don't close doors which after they were open"