]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/terencehill/hud_skin_files_sync'
authorRudolf Polzer <divverent@alientrap.org>
Thu, 5 Jan 2012 09:36:36 +0000 (10:36 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Thu, 5 Jan 2012 09:36:36 +0000 (10:36 +0100)
250 files changed:
.gitignore
balanceFruit.cfg [deleted file]
balanceFruitieX.cfg [new file with mode: 0644]
balanceLeeStricklin.cfg [deleted file]
balanceXPM.cfg [new file with mode: 0644]
balanceXonotic.cfg
balancetZork.cfg [deleted file]
check-translations.sh
commands.cfg [new file with mode: 0644]
csprogs.dat.de.po
csprogs.dat.pot
ctfscoring-ai.cfg
ctfscoring-alien.cfg
ctfscoring-alpha.cfg
ctfscoring-div0.cfg
ctfscoring-nex242.cfg
ctfscoring-z-lowdeposit.cfg
ctfscoring-z.cfg
defaultXonotic.cfg
gfx/colormap_palette.lmp
gfx/colormap_palette.pl
gfx/crosshair21.tga [new file with mode: 0644]
gfx/crosshair22.tga [new file with mode: 0644]
gfx/crosshair23.tga [new file with mode: 0644]
gfx/crosshair24.tga [new file with mode: 0644]
gfx/crosshair25.tga [new file with mode: 0644]
gfx/crosshair26.tga [new file with mode: 0644]
gfx/menu/luminos/icon_aeslevel0.tga [deleted file]
gfx/menu/luminos/icon_pure0.tga [deleted file]
gfx/menu/luminos/icon_stats1.tga [new file with mode: 0644]
gfx/menu/wickedx/icon_aeslevel0.tga [deleted file]
gfx/menu/wickedx/icon_pure0.tga [deleted file]
gfx/menu/wickedx/icon_stats1.tga [new file with mode: 0644]
gfx/menu/xaw/icon_aeslevel0.tga [deleted file]
gfx/menu/xaw/icon_pure0.tga [deleted file]
gfx/menu/xaw/icon_stats1.tga [new file with mode: 0644]
keybinds.txt.hu [new file with mode: 0644]
keybinds.txt.uk [new file with mode: 0644]
languages.txt
menu.dat.de.po
menu.dat.es.po
menu.dat.hu.po
menu.dat.pot
menu.dat.uk.po [new file with mode: 0644]
models/player/erebus.iqm
models/player/erebus.iqm.framegroups
models/player/erebus_lod1.iqm
models/player/erebus_lod1.iqm.framegroups
models/player/erebus_lod2.iqm
models/player/erebus_lod2.iqm.framegroups
models/player/gak.iqm
models/player/gak.iqm.framegroups
models/player/gak_lod1.iqm
models/player/gak_lod1.iqm.framegroups
models/player/gak_lod2.iqm
models/player/gak_lod2.iqm.framegroups
models/player/gakarmored.iqm
models/player/gakarmored.iqm.framegroups
models/player/gakarmored_lod1.iqm
models/player/gakarmored_lod1.iqm.framegroups
models/player/gakarmored_lod2.iqm
models/player/gakarmored_lod2.iqm.framegroups
models/player/gakmasked.iqm
models/player/gakmasked.iqm.framegroups
models/player/gakmasked_lod1.iqm
models/player/gakmasked_lod1.iqm.framegroups
models/player/gakmasked_lod2.iqm
models/player/gakmasked_lod2.iqm.framegroups
models/player/ignis.iqm
models/player/ignis.iqm.framegroups
models/player/ignis_lod1.iqm
models/player/ignis_lod1.iqm.framegroups
models/player/ignis_lod2.iqm
models/player/ignis_lod2.iqm.framegroups
models/player/ignishalfmasked.iqm
models/player/ignishalfmasked.iqm.framegroups
models/player/ignishalfmasked_lod1.iqm
models/player/ignishalfmasked_lod1.iqm.framegroups
models/player/ignishalfmasked_lod2.iqm
models/player/ignishalfmasked_lod2.iqm.framegroups
models/player/ignismasked.iqm
models/player/ignismasked.iqm.framegroups
models/player/ignismasked_lod1.iqm
models/player/ignismasked_lod1.iqm.framegroups
models/player/ignismasked_lod2.iqm
models/player/ignismasked_lod2.iqm.framegroups
models/player/megaerebus.iqm
models/player/megaerebus.iqm.framegroups
models/player/megaerebus_lod1.iqm
models/player/megaerebus_lod1.iqm.framegroups
models/player/megaerebus_lod2.iqm
models/player/megaerebus_lod2.iqm.framegroups
models/player/nyx.iqm
models/player/nyx.iqm.framegroups
models/player/nyx_lod1.iqm
models/player/nyx_lod1.iqm.framegroups
models/player/nyx_lod2.iqm
models/player/nyx_lod2.iqm.framegroups
models/player/pyria.iqm
models/player/pyria.iqm.framegroups
models/player/pyria_lod1.iqm
models/player/pyria_lod1.iqm.framegroups
models/player/pyria_lod2.iqm
models/player/pyria_lod2.iqm.framegroups
models/player/seraphina.iqm
models/player/seraphina.iqm.framegroups
models/player/seraphina_lod1.iqm
models/player/seraphina_lod1.iqm.framegroups
models/player/seraphina_lod2.iqm
models/player/seraphina_lod2.iqm.framegroups
models/player/seraphinamasked.iqm
models/player/seraphinamasked.iqm.framegroups
models/player/seraphinamasked_lod1.iqm
models/player/seraphinamasked_lod1.iqm.framegroups
models/player/seraphinamasked_lod2.iqm
models/player/seraphinamasked_lod2.iqm.framegroups
models/player/umbra.iqm
models/player/umbra.iqm.framegroups
models/player/umbra_lod1.iqm
models/player/umbra_lod1.iqm.framegroups
models/player/umbra_lod2.iqm
models/player/umbra_lod2.iqm.framegroups
qcsrc/Makefile
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/command/cl_cmd.qc [new file with mode: 0644]
qcsrc/client/command/cl_cmd.qh [new file with mode: 0644]
qcsrc/client/csqcmodel_hooks.qc [new file with mode: 0644]
qcsrc/client/damage.qc
qcsrc/client/gibs.qc
qcsrc/client/hud.qc
qcsrc/client/interpolate.qc [deleted file]
qcsrc/client/interpolate.qh [deleted file]
qcsrc/client/main.qh
qcsrc/client/mapvoting.qc
qcsrc/client/miscfunctions.qc
qcsrc/client/progs.src
qcsrc/client/projectile.qc
qcsrc/client/projectile.qh [new file with mode: 0644]
qcsrc/client/scoreboard.qc
qcsrc/client/tturrets.qc
qcsrc/client/waypointsprites.qc
qcsrc/common/campaign_setup.qc
qcsrc/common/command/generic.qc [new file with mode: 0644]
qcsrc/common/command/generic.qh [new file with mode: 0644]
qcsrc/common/command/markup.qc [new file with mode: 0644]
qcsrc/common/command/markup.qh [new file with mode: 0644]
qcsrc/common/command/rpn.qc [new file with mode: 0644]
qcsrc/common/command/rpn.qh [new file with mode: 0644]
qcsrc/common/command/shared_defs.qh [new file with mode: 0644]
qcsrc/common/constants.qh
qcsrc/common/csqcmodel_settings.qh [new file with mode: 0644]
qcsrc/common/gamecommand.qc [deleted file]
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/csqcmodellib/cl_model.qc [new file with mode: 0644]
qcsrc/csqcmodellib/cl_model.qh [new file with mode: 0644]
qcsrc/csqcmodellib/cl_player.qc [new file with mode: 0644]
qcsrc/csqcmodellib/cl_player.qh [new file with mode: 0644]
qcsrc/csqcmodellib/common.qh [new file with mode: 0644]
qcsrc/csqcmodellib/interpolate.qc [new file with mode: 0644]
qcsrc/csqcmodellib/interpolate.qh [new file with mode: 0644]
qcsrc/csqcmodellib/settings.qh [new file with mode: 0644]
qcsrc/csqcmodellib/sv_model.qc [new file with mode: 0644]
qcsrc/csqcmodellib/sv_model.qh [new file with mode: 0644]
qcsrc/dpdefs/csprogsdefs.qc
qcsrc/dpdefs/dpextensions.qc
qcsrc/dpdefs/menudefs.qc
qcsrc/menu/command/menu_cmd.qc [new file with mode: 0644]
qcsrc/menu/command/menu_cmd.qh [new file with mode: 0644]
qcsrc/menu/gamecommand.qc [deleted file]
qcsrc/menu/gamecommand.qh [deleted file]
qcsrc/menu/menu.qc
qcsrc/menu/progs.src
qcsrc/menu/xonotic/colorbutton.c
qcsrc/menu/xonotic/crosshairbutton.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c
qcsrc/menu/xonotic/dialog_quit.c
qcsrc/menu/xonotic/dialog_singleplayer.c
qcsrc/menu/xonotic/gametypelist.c
qcsrc/menu/xonotic/maplist.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/menu/xonotic/util.qc
qcsrc/menu/xonotic/util.qh
qcsrc/server/antilag.qc
qcsrc/server/assault.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/bot.qc
qcsrc/server/bot/scripting.qc
qcsrc/server/cheats.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_impulse.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/clientcommands.qc [deleted file]
qcsrc/server/command/banning.qc [new file with mode: 0644]
qcsrc/server/command/banning.qh [new file with mode: 0644]
qcsrc/server/command/cmd.qc [new file with mode: 0644]
qcsrc/server/command/cmd.qh [new file with mode: 0644]
qcsrc/server/command/common.qc [new file with mode: 0644]
qcsrc/server/command/common.qh [new file with mode: 0644]
qcsrc/server/command/getreplies.qc [new file with mode: 0644]
qcsrc/server/command/getreplies.qh [new file with mode: 0644]
qcsrc/server/command/radarmap.qc [new file with mode: 0644]
qcsrc/server/command/radarmap.qh [new file with mode: 0644]
qcsrc/server/command/sv_cmd.qc [new file with mode: 0644]
qcsrc/server/command/sv_cmd.qh [new file with mode: 0644]
qcsrc/server/command/vote.qc [new file with mode: 0644]
qcsrc/server/command/vote.qh [new file with mode: 0644]
qcsrc/server/constants.qh
qcsrc/server/ctf.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_models.qc
qcsrc/server/g_subs.qc
qcsrc/server/g_world.qc
qcsrc/server/gamecommand.qc [deleted file]
qcsrc/server/ipban.qc
qcsrc/server/ipban.qh
qcsrc/server/miscfunctions.qc
qcsrc/server/playerstats.qc
qcsrc/server/portals.qc
qcsrc/server/progs.src
qcsrc/server/scores.qc
qcsrc/server/scores.qh
qcsrc/server/scores_rules.qc
qcsrc/server/sv_main.qc
qcsrc/server/t_items.qc
qcsrc/server/t_plats.qc
qcsrc/server/t_teleporters.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/vote.qc [deleted file]
qcsrc/server/vote.qh [deleted file]
tooltips.db.hu [new file with mode: 0644]
tooltips.db.uk [new file with mode: 0644]
xonotic-credits.txt
xonotic-credits.txt.fr
xonotic-credits.txt.hu [new file with mode: 0644]
xonotic-credits.txt.uk [new file with mode: 0644]

index c3e14d318e629e19b2cbe5ed9f996aba8b57965b..77433f6374c29c4437223195b77f85bda33a2146 100644 (file)
@@ -4,3 +4,4 @@ progs.dat
 qcsrc/client/fteqcc.log
 qcsrc/menu/fteqcc.log
 qcsrc/server/fteqcc.log
+weapons.qc.tmp
diff --git a/balanceFruit.cfg b/balanceFruit.cfg
deleted file mode 100644 (file)
index f8bdb2a..0000000
+++ /dev/null
@@ -1,825 +0,0 @@
-// {{{ starting gear
-set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 125
-set g_balance_armor_start 0
-set g_start_ammo_shells 20
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_start_ammo_fuel 0
-set g_warmup_start_health 200 "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 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_cells 50 "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 100
-set g_lms_start_ammo_shells 30
-set g_lms_start_ammo_nails 200
-set g_lms_start_ammo_rockets 150
-set g_lms_start_ammo_cells 150
-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 15
-set g_balance_nix_ammo_nails 45
-set g_balance_nix_ammo_rockets 15
-set g_balance_nix_ammo_cells 15
-set g_balance_nix_ammo_fuel 0
-set g_balance_nix_ammoincr_shells 2
-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_fuel 2
-// }}}
-
-// {{{ pickup items
-set g_pickup_ammo_anyway 1
-set g_pickup_weapons_anyway 1
-set g_pickup_shells 20
-set g_pickup_shells_weapon 10
-set g_pickup_shells_max 45
-set g_pickup_nails 120
-set g_pickup_nails_weapon 60
-set g_pickup_nails_max 300
-set g_pickup_rockets 25
-set g_pickup_rockets_weapon 15
-set g_pickup_rockets_max 150
-set g_pickup_cells 30
-set g_pickup_cells_weapon 20
-set g_pickup_cells_max 150
-set g_pickup_fuel 25
-set g_pickup_fuel_weapon 15
-set g_pickup_fuel_jetpack 50
-set g_pickup_fuel_max 100
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 150
-set g_pickup_armorsmall_anyway 1
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 50
-set g_pickup_armormedium_anyway 0
-set g_pickup_armorbig 50
-set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
-set g_pickup_armorbig_anyway 0
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 150
-set g_pickup_armorlarge_anyway 1
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 250
-set g_pickup_healthsmall_anyway 1
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 100
-set g_pickup_healthmedium_anyway 0
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 150
-set g_pickup_healthlarge_anyway 0
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 250
-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_ammo 25
-set g_pickup_respawntimejitter_short 0
-set g_pickup_respawntimejitter_medium 0
-set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 10
-set g_pickup_respawntimejitter_weapon 0
-set g_pickup_respawntimejitter_ammo 0
-// }}}
-
-// {{{ regen/rot
-set g_balance_health_regen 0.05
-set g_balance_health_regenlinear 0
-set g_balance_pause_health_regen 5
-set g_balance_pause_health_regen_spawn 0
-set g_balance_health_rot 0
-set g_balance_health_rotlinear 1
-set g_balance_pause_health_rot 1
-set g_balance_pause_health_rot_spawn 0
-set g_balance_health_regenstable 100
-set g_balance_health_rotstable 100
-set g_balance_health_limit 999
-set g_balance_armor_regen 0
-set g_balance_armor_regenlinear 0
-set g_balance_armor_rot 0
-set g_balance_armor_rotlinear 1
-set g_balance_pause_armor_rot 1
-set g_balance_pause_armor_rot_spawn 0
-set g_balance_armor_regenstable 100
-set g_balance_armor_rotstable 100
-set g_balance_armor_limit 999
-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 999
-// }}}
-
-// {{{ misc
-set g_balance_selfdamagepercent 0.65
-set g_balance_weaponswitchdelay 0.15
-set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
-set g_weaponratefactor 1 "weapon fire rate multiplier"
-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.7
-set g_throughfloor_force 0.8
-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, minelayer 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_newton_style 2
-// 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)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-set g_projectiles_newton_style_2_minfactor 0.7
-set g_projectiles_newton_style_2_maxfactor 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 150
-set g_balance_falldamage_minspeed 800
-set g_balance_falldamage_factor 0.20
-set g_balance_falldamage_maxdamage 15
-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_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.6
-set g_balance_powerup_invincible_time 30
-set g_balance_powerup_strength_damage 3
-set g_balance_powerup_strength_force 4
-set g_balance_powerup_strength_time 30
-set g_balance_powerup_strength_selfdamage 1.5
-set g_balance_powerup_strength_selfforce 1.5
-// }}}
-
-// {{{ 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 1500 "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_attenuation 2 "jetpack sound attenuation"
-
-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 130
-set g_balance_grapplehook_damagedbycontents 0
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
-set g_balance_laser_primary_edgedamage 20
-set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
-set g_balance_laser_primary_radius 60
-set g_balance_laser_primary_speed 5000
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.6
-set g_balance_laser_primary_animtime 0.4
-set g_balance_laser_primary_lifetime 5
-set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0
-set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 2 // 300 upforce
-set g_balance_laser_primary_force_velocitybias 0.3
-set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 200 // dps
-set g_balance_laser_secondary_edgedamage 0
-set g_balance_laser_secondary_force 1300
-set g_balance_laser_secondary_radius 60
-set g_balance_laser_secondary_speed 0
-set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.066
-set g_balance_laser_secondary_animtime 0.066
-set g_balance_laser_secondary_lifetime 0
-set g_balance_laser_secondary_shotangle 0
-set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 1
-set g_balance_laser_secondary_force_zscale 1.25
-set g_balance_laser_secondary_force_velocitybias 0
-set g_balance_laser_secondary_force_other_scale 0
-set g_balance_laser_reload_ammo 0 //default: 6
-set g_balance_laser_reload_time 2
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 18
-set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
-set g_balance_shotgun_primary_force 20
-set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
-set g_balance_shotgun_primary_refire 1
-set g_balance_shotgun_primary_animtime 0.3
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_primary_speed 12000
-set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary 1
-set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
-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_melee_no_doubleslap 1
-set g_balance_shotgun_secondary_melee_nonplayerdamage 0
-set g_balance_shotgun_secondary_melee_multihit 1
-set g_balance_shotgun_secondary_damage 110
-set g_balance_shotgun_secondary_force 150
-set g_balance_shotgun_secondary_refire 1.1
-set g_balance_shotgun_secondary_animtime 1
-set g_balance_shotgun_reload_ammo 0 //default: 5
-set g_balance_shotgun_reload_time 2
-// }}}
-// {{{ uzi
-set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
-set g_balance_uzi_spread_min 0.02
-set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
-set g_balance_uzi_spread_add 0.008
-
-set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
-set g_balance_uzi_burst_animtime 0.45
-set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.45   // refire after burst
-set g_balance_uzi_burst_spread 0.07
-set g_balance_uzi_burst_damage 25
-set g_balance_uzi_burst_force 50
-set g_balance_uzi_burst_ammo 3
-
-set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
-set g_balance_uzi_first_headshotaddeddamage 0
-set g_balance_uzi_first_force 50
-set g_balance_uzi_first_spread 0.03
-set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 2
-
-set g_balance_uzi_sustained_damage 12   // 120 dps
-set g_balance_uzi_sustained_headshotaddeddamage 0
-set g_balance_uzi_sustained_force 12
-set g_balance_uzi_sustained_spread 0.06
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_uzi_speed 18000
-set g_balance_uzi_bulletconstant 115 // 13.1qu
-
-set g_balance_uzi_reload_ammo 0 //default: 30
-set g_balance_uzi_reload_time 2
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 44
-set g_balance_grenadelauncher_primary_edgedamage 32
-set g_balance_grenadelauncher_primary_force 300
-set g_balance_grenadelauncher_primary_radius 115
-set g_balance_grenadelauncher_primary_speed 1500
-set g_balance_grenadelauncher_primary_speed_up 225
-set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0
-set g_balance_grenadelauncher_primary_lifetime 5
-set g_balance_grenadelauncher_primary_lifetime2 0.65
-set g_balance_grenadelauncher_primary_refire 0.8
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_primary_health 80
-set g_balance_grenadelauncher_primary_damageforcescale 0
-set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
-
-set g_balance_grenadelauncher_secondary_type 1
-set g_balance_grenadelauncher_secondary_damage 62
-set g_balance_grenadelauncher_secondary_edgedamage 32
-set g_balance_grenadelauncher_secondary_force 300
-set g_balance_grenadelauncher_secondary_radius 150
-set g_balance_grenadelauncher_secondary_speed 1000
-set g_balance_grenadelauncher_secondary_speed_up 250
-set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 3
-set g_balance_grenadelauncher_secondary_lifetime_bounce 0
-set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
-set g_balance_grenadelauncher_secondary_refire 0.8
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 40
-set g_balance_grenadelauncher_secondary_damageforcescale 0
-set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
-
-set g_balance_grenadelauncher_bouncefactor 0.5
-set g_balance_grenadelauncher_bouncestop 0.12
-
-set g_balance_grenadelauncher_reload_ammo 0 //default: 12
-set g_balance_grenadelauncher_reload_time 2
-// }}}
-// {{{ minelayer
-set g_balance_minelayer_damage 42
-set g_balance_minelayer_edgedamage 30
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_lifetime_countdown 0
-set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.3
-set g_balance_minelayer_ammo 5
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 3 // 0 disables the limit // LOG: 4 -> 3
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-set g_balance_minelayer_reload_ammo 0 //default: 15
-set g_balance_minelayer_reload_time 2
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 100
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 425
-set g_balance_electro_primary_force_up 125
-set g_balance_electro_primary_radius 850
-set g_balance_electro_primary_comboradius 150
-set g_balance_electro_primary_speed 0
-set g_balance_electro_primary_spread 0
-set g_balance_electro_primary_lifetime 0
-set g_balance_electro_primary_refire 0.4
-set g_balance_electro_primary_animtime 0.2
-set g_balance_electro_primary_ammo 5
-set g_balance_electro_primary_range 800
-set g_balance_electro_primary_falloff_mindist 0
-set g_balance_electro_primary_falloff_maxdist 0
-set g_balance_electro_primary_falloff_halflifedist 0
-set g_balance_electro_secondary_damage 25
-set g_balance_electro_secondary_edgedamage 0
-set g_balance_electro_secondary_force 100
-set g_balance_electro_secondary_radius 100
-set g_balance_electro_secondary_speed 700
-set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_spread 0.08
-set g_balance_electro_secondary_lifetime 3.5
-set g_balance_electro_secondary_refire 0.2
-set g_balance_electro_secondary_refire2 2
-set g_balance_electro_secondary_animtime 0.2
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 10
-set g_balance_electro_secondary_damageforcescale 4
-set g_balance_electro_secondary_damagedbycontents 0
-set g_balance_electro_secondary_count 3
-set g_balance_electro_secondary_bouncefactor 0.5
-set g_balance_electro_secondary_bouncestop 0.075
-set g_balance_electro_combo_damage 50
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 80
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_comboradius 0
-set g_balance_electro_combo_speed 400
-set g_balance_electro_reload_ammo 0 //default: 20
-set g_balance_electro_reload_time 2
-// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
-set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
-set g_balance_crylink_primary_force 35
-set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 1500
-set g_balance_crylink_primary_spread 0.05
-set g_balance_crylink_primary_shots 7
-set g_balance_crylink_primary_bounces 2
-set g_balance_crylink_primary_refire 0.8
-set g_balance_crylink_primary_animtime 0.3
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0.2
-set g_balance_crylink_primary_jointime 0.1
-set g_balance_crylink_primary_joinexplode 0
-set g_balance_crylink_primary_joinexplode_damage 0
-set g_balance_crylink_primary_joinexplode_edgedamage 0
-set g_balance_crylink_primary_joinexplode_radius 0
-set g_balance_crylink_primary_joinexplode_force 0
-set g_balance_crylink_primary_linkexplode 1
-
-set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
-set g_balance_crylink_primary_middle_fadetime 5
-set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
-set g_balance_crylink_primary_other_fadetime 0.25
-
-set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
-set g_balance_crylink_secondary_edgedamage 3
-set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
-set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
-set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
-set g_balance_crylink_secondary_spread 0.1
-set g_balance_crylink_secondary_shots 6
-set g_balance_crylink_secondary_bounces 2
-set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
-set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
-set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
-set g_balance_crylink_secondary_joindelay 0
-set g_balance_crylink_secondary_joinspread 0.2
-set g_balance_crylink_secondary_jointime 0.1
-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_radius 0
-set g_balance_crylink_secondary_joinexplode_force 0
-set g_balance_crylink_secondary_linkexplode 0
-
-set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
-set g_balance_crylink_secondary_middle_fadetime 5
-set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
-set g_balance_crylink_secondary_line_fadetime 0.25
-
-set g_balance_crylink_reload_ammo 0 //default: 10
-set g_balance_crylink_reload_time 2
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 90
-set g_balance_nex_primary_force 500
-set g_balance_nex_primary_refire 1
-set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 0
-set g_balance_nex_primary_damagefalloff_maxdist 0
-set g_balance_nex_primary_damagefalloff_halflife 0
-set g_balance_nex_primary_damagefalloff_forcehalflife 0
-
-set g_balance_nex_secondary 0 // LOG: disable secondary
-set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
-set g_balance_nex_secondary_charge_rate 0.4
-set g_balance_nex_secondary_chargepool 1
-set g_balance_nex_secondary_chargepool_regen 0.25
-set g_balance_nex_secondary_chargepool_pause_regen 2
-set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
-set g_balance_nex_secondary_damage 0
-set g_balance_nex_secondary_force 0
-set g_balance_nex_secondary_refire 0
-set g_balance_nex_secondary_animtime 0
-set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
-set g_balance_nex_secondary_damagefalloff_mindist 0
-set g_balance_nex_secondary_damagefalloff_maxdist 0
-set g_balance_nex_secondary_damagefalloff_halflife 0
-set g_balance_nex_secondary_damagefalloff_forcehalflife 0
-
-set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 20
-set g_balance_nex_charge_start 0.5
-set g_balance_nex_charge_rate 0.5
-set g_balance_nex_charge_animlimit 0.5
-set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
-set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
-set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
-set g_balance_nex_charge_shot_multiplier 0
-set g_balance_nex_charge_velocity_rate 0
-set g_balance_nex_charge_minspeed 600
-set g_balance_nex_charge_maxspeed 1000
-
-set g_balance_nex_reload_ammo 0 //default: 25
-set g_balance_nex_reload_time 2
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.50
-set g_balance_minstanex_ammo 10
-set g_balance_minstanex_laser_ammo 0
-set g_balance_minstanex_reload_ammo 0 //default: 50
-set g_balance_minstanex_reload_time 2
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 14
-set g_balance_hagar_primary_edgedamage 6
-set g_balance_hagar_primary_force 70
-set g_balance_hagar_primary_health 0
-set g_balance_hagar_primary_damageforcescale 0
-set g_balance_hagar_primary_radius 110
-set g_balance_hagar_primary_spread 0.1
-set g_balance_hagar_primary_speed 1800
-set g_balance_hagar_primary_lifetime 5
-set g_balance_hagar_primary_refire 0.12
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 0
-set g_balance_hagar_secondary_load_speed 0.6
-set g_balance_hagar_secondary_load_spread 0.075
-set g_balance_hagar_secondary_load_spread_bias 0.5
-set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 0
-set g_balance_hagar_secondary_load_releasedeath 1
-set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_load_linkexplode 0
-set g_balance_hagar_secondary_load_animtime 0.2
-set g_balance_hagar_secondary_damage 14 // default for _load: 32
-set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
-set g_balance_hagar_secondary_force 70 // default for _load: 160
-set g_balance_hagar_secondary_health 0
-set g_balance_hagar_secondary_damageforcescale 0
-set g_balance_hagar_secondary_radius 125
-set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
-set g_balance_hagar_secondary_speed 1800
-set g_balance_hagar_secondary_lifetime_min 5
-set g_balance_hagar_secondary_lifetime_rand 0
-set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
-set g_balance_hagar_secondary_ammo 1
-set g_balance_hagar_reload_ammo 0 //default: 25
-set g_balance_hagar_reload_time 2
-// }}}
-// {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 82
-set g_balance_rocketlauncher_edgedamage 32
-set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 130
-set g_balance_rocketlauncher_speed 1400
-set g_balance_rocketlauncher_speedaccel 1400
-set g_balance_rocketlauncher_speedstart 800
-set g_balance_rocketlauncher_lifetime 5
-set g_balance_rocketlauncher_refire 1
-set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 0
-set g_balance_rocketlauncher_damageforcescale 0
-set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 42 // max degrees per second
-set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
-set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
-set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
-set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 60
-set g_balance_rocketlauncher_remote_edgedamage 20
-set g_balance_rocketlauncher_remote_radius 120
-set g_balance_rocketlauncher_remote_force 350
-set g_balance_rocketlauncher_reload_ammo 0 //default: 25
-set g_balance_rocketlauncher_reload_time 2
-// }}}
-// {{{ porto
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.2
-set g_balance_porto_primary_speed 2000
-set g_balance_porto_primary_lifetime 5
-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
-// }}}
-// {{{ hook
-set g_balance_hook_primary_fuel 5 // hook monkeys set 0
-set g_balance_hook_primary_refire 0 // hook monkeys set 0
-set g_balance_hook_primary_animtime 0.2 // good shoot anim
-set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
-set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 500 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 50 // a whole pack
-set g_balance_hook_secondary_lifetime 5 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.2 // good shoot anim
-set g_balance_hook_secondary_power 3 // effect behaves like a square function
-set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
-set g_balance_hook_secondary_health 0
-set g_balance_hook_secondary_damageforcescale 0 
-// }}}
-// {{{ hlac
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.075
-set g_balance_hlac_primary_spread_add 0.001
-set g_balance_hlac_primary_spread_crouchmod 0.25
-
-set g_balance_hlac_primary_damage 15
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 70
-set g_balance_hlac_primary_radius 40
-set g_balance_hlac_primary_speed 9000
-set g_balance_hlac_primary_lifetime 5
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.2
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.15
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 13
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 45
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 0.8
-set g_balance_hlac_secondary_animtime 0.4
-set g_balance_hlac_secondary_ammo 4
-set g_balance_hlac_secondary_shots 6
-
-set g_balance_hlac_reload_ammo 0 //default: 20
-set g_balance_hlac_reload_time 2
-// }}}
-// {{{ rifle
-set g_balance_rifle_bursttime 0
-set g_balance_rifle_primary_tracer 1
-set g_balance_rifle_primary_shots 1
-set g_balance_rifle_primary_damage 60
-set g_balance_rifle_primary_headshotaddeddamage 60
-set g_balance_rifle_primary_spread 0
-set g_balance_rifle_primary_force 2
-set g_balance_rifle_primary_speed 40000
-set g_balance_rifle_primary_lifetime 5
-set g_balance_rifle_primary_refire 1.5
-set g_balance_rifle_primary_animtime 1.4
-set g_balance_rifle_primary_ammo 10
-set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_rifle_primary_burstcost 0
-set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_rifle_secondary 1
-set g_balance_rifle_secondary_reload 1
-set g_balance_rifle_secondary_tracer 0
-set g_balance_rifle_secondary_shots 1
-set g_balance_rifle_secondary_damage 42
-set g_balance_rifle_secondary_headshotaddeddamage 42
-set g_balance_rifle_secondary_spread 0
-set g_balance_rifle_secondary_force 2
-set g_balance_rifle_secondary_speed 20000
-set g_balance_rifle_secondary_lifetime 5
-set g_balance_rifle_secondary_refire 1.5
-set g_balance_rifle_secondary_animtime 1.4
-set g_balance_rifle_secondary_ammo 10
-set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_rifle_secondary_burstcost 0
-set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_rifle_reload_ammo 80 //default: 80
-set g_balance_rifle_reload_time 2
-// }}}
-// {{{ tuba
-set g_balance_tuba_refire 0.05
-set g_balance_tuba_animtime 0.05
-set g_balance_tuba_attenuation 0.5
-set g_balance_tuba_volume 1
-set g_balance_tuba_fadetime 0.25
-set g_balance_tuba_damage 5
-set g_balance_tuba_edgedamage 0
-set g_balance_tuba_radius 200
-set g_balance_tuba_force 40
-set g_balance_tuba_pitchstep 6
-// }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 40
-set g_balance_fireball_primary_animtime 0.2
-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 4
-set g_balance_fireball_primary_edgedamage 0
-set g_balance_fireball_primary_force 700
-set g_balance_fireball_primary_health 50
-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 5
-set g_balance_fireball_primary_refire2 0
-set g_balance_fireball_primary_speed 650
-set g_balance_fireball_primary_spread 0
-set g_balance_fireball_secondary_ammo 5
-set g_balance_fireball_secondary_animtime 0.2
-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_force 100
-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 2
-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_reload_ammo 0 //default: 60
-set g_balance_fireball_reload_time 2
-// }}}
-// {{{ seeker
-set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
-set g_balance_seeker_flac_ammo 0.5
-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 // LOG: 8 -> 3
-set g_balance_seeker_missile_damage 30 // LOG: 15 -> 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 // LOG: 100 -> 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_up 300
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1300 // LOG: 1400 -> 1300
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-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 // LOG: 0.7 -> 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_reload_ammo 0 //default: 15
-set g_balance_seeker_reload_time 2
-// End new seeker
diff --git a/balanceFruitieX.cfg b/balanceFruitieX.cfg
new file mode 100644 (file)
index 0000000..f8bdb2a
--- /dev/null
@@ -0,0 +1,825 @@
+// {{{ starting gear
+set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_balance_health_start 125
+set g_balance_armor_start 0
+set g_start_ammo_shells 20
+set g_start_ammo_nails 0
+set g_start_ammo_rockets 0
+set g_start_ammo_cells 0
+set g_start_ammo_fuel 0
+set g_warmup_start_health 200 "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 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_cells 50 "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 100
+set g_lms_start_ammo_shells 30
+set g_lms_start_ammo_nails 200
+set g_lms_start_ammo_rockets 150
+set g_lms_start_ammo_cells 150
+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 15
+set g_balance_nix_ammo_nails 45
+set g_balance_nix_ammo_rockets 15
+set g_balance_nix_ammo_cells 15
+set g_balance_nix_ammo_fuel 0
+set g_balance_nix_ammoincr_shells 2
+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_fuel 2
+// }}}
+
+// {{{ pickup items
+set g_pickup_ammo_anyway 1
+set g_pickup_weapons_anyway 1
+set g_pickup_shells 20
+set g_pickup_shells_weapon 10
+set g_pickup_shells_max 45
+set g_pickup_nails 120
+set g_pickup_nails_weapon 60
+set g_pickup_nails_max 300
+set g_pickup_rockets 25
+set g_pickup_rockets_weapon 15
+set g_pickup_rockets_max 150
+set g_pickup_cells 30
+set g_pickup_cells_weapon 20
+set g_pickup_cells_max 150
+set g_pickup_fuel 25
+set g_pickup_fuel_weapon 15
+set g_pickup_fuel_jetpack 50
+set g_pickup_fuel_max 100
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 150
+set g_pickup_armorsmall_anyway 1
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 50
+set g_pickup_armormedium_anyway 0
+set g_pickup_armorbig 50
+set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
+set g_pickup_armorbig_anyway 0
+set g_pickup_armorlarge 100
+set g_pickup_armorlarge_max 150
+set g_pickup_armorlarge_anyway 1
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 250
+set g_pickup_healthsmall_anyway 1
+set g_pickup_healthmedium 25
+set g_pickup_healthmedium_max 100
+set g_pickup_healthmedium_anyway 0
+set g_pickup_healthlarge 50
+set g_pickup_healthlarge_max 150
+set g_pickup_healthlarge_anyway 0
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 250
+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_ammo 25
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 10
+set g_pickup_respawntimejitter_weapon 0
+set g_pickup_respawntimejitter_ammo 0
+// }}}
+
+// {{{ regen/rot
+set g_balance_health_regen 0.05
+set g_balance_health_regenlinear 0
+set g_balance_pause_health_regen 5
+set g_balance_pause_health_regen_spawn 0
+set g_balance_health_rot 0
+set g_balance_health_rotlinear 1
+set g_balance_pause_health_rot 1
+set g_balance_pause_health_rot_spawn 0
+set g_balance_health_regenstable 100
+set g_balance_health_rotstable 100
+set g_balance_health_limit 999
+set g_balance_armor_regen 0
+set g_balance_armor_regenlinear 0
+set g_balance_armor_rot 0
+set g_balance_armor_rotlinear 1
+set g_balance_pause_armor_rot 1
+set g_balance_pause_armor_rot_spawn 0
+set g_balance_armor_regenstable 100
+set g_balance_armor_rotstable 100
+set g_balance_armor_limit 999
+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 999
+// }}}
+
+// {{{ misc
+set g_balance_selfdamagepercent 0.65
+set g_balance_weaponswitchdelay 0.15
+set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
+set g_weaponratefactor 1 "weapon fire rate multiplier"
+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.7
+set g_throughfloor_force 0.8
+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, minelayer 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_newton_style 2
+// 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)
+// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
+// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
+set g_projectiles_newton_style_2_minfactor 0.7
+set g_projectiles_newton_style_2_maxfactor 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 150
+set g_balance_falldamage_minspeed 800
+set g_balance_falldamage_factor 0.20
+set g_balance_falldamage_maxdamage 15
+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_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.6
+set g_balance_powerup_invincible_time 30
+set g_balance_powerup_strength_damage 3
+set g_balance_powerup_strength_force 4
+set g_balance_powerup_strength_time 30
+set g_balance_powerup_strength_selfdamage 1.5
+set g_balance_powerup_strength_selfforce 1.5
+// }}}
+
+// {{{ 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 1500 "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_attenuation 2 "jetpack sound attenuation"
+
+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 130
+set g_balance_grapplehook_damagedbycontents 0
+// }}}
+
+// {{{ weapon properties
+// {{{ laser
+set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
+set g_balance_laser_primary_edgedamage 20
+set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
+set g_balance_laser_primary_radius 60
+set g_balance_laser_primary_speed 5000
+set g_balance_laser_primary_spread 0
+set g_balance_laser_primary_refire 0.6
+set g_balance_laser_primary_animtime 0.4
+set g_balance_laser_primary_lifetime 5
+set g_balance_laser_primary_shotangle 0
+set g_balance_laser_primary_delay 0
+set g_balance_laser_primary_gauntlet 0
+set g_balance_laser_primary_force_zscale 2 // 300 upforce
+set g_balance_laser_primary_force_velocitybias 0.3
+set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
+set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 200 // dps
+set g_balance_laser_secondary_edgedamage 0
+set g_balance_laser_secondary_force 1300
+set g_balance_laser_secondary_radius 60
+set g_balance_laser_secondary_speed 0
+set g_balance_laser_secondary_spread 0
+set g_balance_laser_secondary_refire 0.066
+set g_balance_laser_secondary_animtime 0.066
+set g_balance_laser_secondary_lifetime 0
+set g_balance_laser_secondary_shotangle 0
+set g_balance_laser_secondary_delay 0
+set g_balance_laser_secondary_gauntlet 1
+set g_balance_laser_secondary_force_zscale 1.25
+set g_balance_laser_secondary_force_velocitybias 0
+set g_balance_laser_secondary_force_other_scale 0
+set g_balance_laser_reload_ammo 0 //default: 6
+set g_balance_laser_reload_time 2
+// }}}
+// {{{ shotgun
+set g_balance_shotgun_primary_bullets 18
+set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
+set g_balance_shotgun_primary_force 20
+set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
+set g_balance_shotgun_primary_refire 1
+set g_balance_shotgun_primary_animtime 0.3
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_speed 12000
+set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
+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_melee_no_doubleslap 1
+set g_balance_shotgun_secondary_melee_nonplayerdamage 0
+set g_balance_shotgun_secondary_melee_multihit 1
+set g_balance_shotgun_secondary_damage 110
+set g_balance_shotgun_secondary_force 150
+set g_balance_shotgun_secondary_refire 1.1
+set g_balance_shotgun_secondary_animtime 1
+set g_balance_shotgun_reload_ammo 0 //default: 5
+set g_balance_shotgun_reload_time 2
+// }}}
+// {{{ uzi
+set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
+set g_balance_uzi_spread_min 0.02
+set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
+set g_balance_uzi_spread_add 0.008
+
+set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
+set g_balance_uzi_burst_animtime 0.45
+set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
+set g_balance_uzi_burst_refire2 0.45   // refire after burst
+set g_balance_uzi_burst_spread 0.07
+set g_balance_uzi_burst_damage 25
+set g_balance_uzi_burst_force 50
+set g_balance_uzi_burst_ammo 3
+
+set g_balance_uzi_first 1
+set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
+set g_balance_uzi_first_headshotaddeddamage 0
+set g_balance_uzi_first_force 50
+set g_balance_uzi_first_spread 0.03
+set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_ammo 2
+
+set g_balance_uzi_sustained_damage 12   // 120 dps
+set g_balance_uzi_sustained_headshotaddeddamage 0
+set g_balance_uzi_sustained_force 12
+set g_balance_uzi_sustained_spread 0.06
+set g_balance_uzi_sustained_refire 0.1
+set g_balance_uzi_sustained_ammo 1
+
+set g_balance_uzi_speed 18000
+set g_balance_uzi_bulletconstant 115 // 13.1qu
+
+set g_balance_uzi_reload_ammo 0 //default: 30
+set g_balance_uzi_reload_time 2
+// }}}
+// {{{ mortar
+set g_balance_grenadelauncher_primary_type 0
+set g_balance_grenadelauncher_primary_damage 44
+set g_balance_grenadelauncher_primary_edgedamage 32
+set g_balance_grenadelauncher_primary_force 300
+set g_balance_grenadelauncher_primary_radius 115
+set g_balance_grenadelauncher_primary_speed 1500
+set g_balance_grenadelauncher_primary_speed_up 225
+set g_balance_grenadelauncher_primary_speed_z 0
+set g_balance_grenadelauncher_primary_spread 0
+set g_balance_grenadelauncher_primary_lifetime 5
+set g_balance_grenadelauncher_primary_lifetime2 0.65
+set g_balance_grenadelauncher_primary_refire 0.8
+set g_balance_grenadelauncher_primary_animtime 0.3
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_primary_health 80
+set g_balance_grenadelauncher_primary_damageforcescale 0
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
+set g_balance_grenadelauncher_secondary_damage 62
+set g_balance_grenadelauncher_secondary_edgedamage 32
+set g_balance_grenadelauncher_secondary_force 300
+set g_balance_grenadelauncher_secondary_radius 150
+set g_balance_grenadelauncher_secondary_speed 1000
+set g_balance_grenadelauncher_secondary_speed_up 250
+set g_balance_grenadelauncher_secondary_speed_z 0
+set g_balance_grenadelauncher_secondary_spread 0
+set g_balance_grenadelauncher_secondary_lifetime 3
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
+set g_balance_grenadelauncher_secondary_refire 0.8
+set g_balance_grenadelauncher_secondary_animtime 0.3
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_secondary_health 40
+set g_balance_grenadelauncher_secondary_damageforcescale 0
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
+
+set g_balance_grenadelauncher_bouncefactor 0.5
+set g_balance_grenadelauncher_bouncestop 0.12
+
+set g_balance_grenadelauncher_reload_ammo 0 //default: 12
+set g_balance_grenadelauncher_reload_time 2
+// }}}
+// {{{ minelayer
+set g_balance_minelayer_damage 42
+set g_balance_minelayer_edgedamage 30
+set g_balance_minelayer_force 250
+set g_balance_minelayer_radius 175
+set g_balance_minelayer_proximityradius 150
+set g_balance_minelayer_speed 750
+set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_lifetime_countdown 0
+set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_animtime 0.3
+set g_balance_minelayer_ammo 5
+set g_balance_minelayer_health 15
+set g_balance_minelayer_limit 3 // 0 disables the limit // LOG: 4 -> 3
+set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
+set g_balance_minelayer_damageforcescale 0
+set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_minelayer_time 0.5
+set g_balance_minelayer_remote_damage 45
+set g_balance_minelayer_remote_edgedamage 40
+set g_balance_minelayer_remote_radius 200
+set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_reload_ammo 0 //default: 15
+set g_balance_minelayer_reload_time 2
+// }}}
+// {{{ electro
+set g_balance_electro_lightning 1
+set g_balance_electro_primary_damage 100
+set g_balance_electro_primary_edgedamage 0
+set g_balance_electro_primary_force 425
+set g_balance_electro_primary_force_up 125
+set g_balance_electro_primary_radius 850
+set g_balance_electro_primary_comboradius 150
+set g_balance_electro_primary_speed 0
+set g_balance_electro_primary_spread 0
+set g_balance_electro_primary_lifetime 0
+set g_balance_electro_primary_refire 0.4
+set g_balance_electro_primary_animtime 0.2
+set g_balance_electro_primary_ammo 5
+set g_balance_electro_primary_range 800
+set g_balance_electro_primary_falloff_mindist 0
+set g_balance_electro_primary_falloff_maxdist 0
+set g_balance_electro_primary_falloff_halflifedist 0
+set g_balance_electro_secondary_damage 25
+set g_balance_electro_secondary_edgedamage 0
+set g_balance_electro_secondary_force 100
+set g_balance_electro_secondary_radius 100
+set g_balance_electro_secondary_speed 700
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_speed_z 0
+set g_balance_electro_secondary_spread 0.08
+set g_balance_electro_secondary_lifetime 3.5
+set g_balance_electro_secondary_refire 0.2
+set g_balance_electro_secondary_refire2 2
+set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_health 10
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_damagedbycontents 0
+set g_balance_electro_secondary_count 3
+set g_balance_electro_secondary_bouncefactor 0.5
+set g_balance_electro_secondary_bouncestop 0.075
+set g_balance_electro_combo_damage 50
+set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_combo_force 80
+set g_balance_electro_combo_radius 250
+set g_balance_electro_combo_comboradius 0
+set g_balance_electro_combo_speed 400
+set g_balance_electro_reload_ammo 0 //default: 20
+set g_balance_electro_reload_time 2
+// }}}
+// {{{ crylink
+set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
+set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
+set g_balance_crylink_primary_force 35
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_speed 1500
+set g_balance_crylink_primary_spread 0.05
+set g_balance_crylink_primary_shots 7
+set g_balance_crylink_primary_bounces 2
+set g_balance_crylink_primary_refire 0.8
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_ammo 2
+set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_jointime 0.1
+set g_balance_crylink_primary_joinexplode 0
+set g_balance_crylink_primary_joinexplode_damage 0
+set g_balance_crylink_primary_joinexplode_edgedamage 0
+set g_balance_crylink_primary_joinexplode_radius 0
+set g_balance_crylink_primary_joinexplode_force 0
+set g_balance_crylink_primary_linkexplode 1
+
+set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
+set g_balance_crylink_primary_middle_fadetime 5
+set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
+set g_balance_crylink_primary_other_fadetime 0.25
+
+set g_balance_crylink_secondary 1
+set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
+set g_balance_crylink_secondary_edgedamage 3
+set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
+set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
+set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
+set g_balance_crylink_secondary_spread 0.1
+set g_balance_crylink_secondary_shots 6
+set g_balance_crylink_secondary_bounces 2
+set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
+set g_balance_crylink_secondary_animtime 0.3
+set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
+set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_joinspread 0.2
+set g_balance_crylink_secondary_jointime 0.1
+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_radius 0
+set g_balance_crylink_secondary_joinexplode_force 0
+set g_balance_crylink_secondary_linkexplode 0
+
+set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
+set g_balance_crylink_secondary_line_fadetime 0.25
+
+set g_balance_crylink_reload_ammo 0 //default: 10
+set g_balance_crylink_reload_time 2
+// }}}
+// {{{ nex
+set g_balance_nex_primary_damage 90
+set g_balance_nex_primary_force 500
+set g_balance_nex_primary_refire 1
+set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_ammo 5
+set g_balance_nex_primary_damagefalloff_mindist 0
+set g_balance_nex_primary_damagefalloff_maxdist 0
+set g_balance_nex_primary_damagefalloff_halflife 0
+set g_balance_nex_primary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_secondary 0 // LOG: disable secondary
+set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
+set g_balance_nex_secondary_charge_rate 0.4
+set g_balance_nex_secondary_chargepool 1
+set g_balance_nex_secondary_chargepool_regen 0.25
+set g_balance_nex_secondary_chargepool_pause_regen 2
+set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
+set g_balance_nex_secondary_damage 0
+set g_balance_nex_secondary_force 0
+set g_balance_nex_secondary_refire 0
+set g_balance_nex_secondary_animtime 0
+set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
+set g_balance_nex_secondary_damagefalloff_mindist 0
+set g_balance_nex_secondary_damagefalloff_maxdist 0
+set g_balance_nex_secondary_damagefalloff_halflife 0
+set g_balance_nex_secondary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_charge 1
+set g_balance_nex_charge_mindmg 20
+set g_balance_nex_charge_start 0.5
+set g_balance_nex_charge_rate 0.5
+set g_balance_nex_charge_animlimit 0.5
+set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
+set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
+set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
+set g_balance_nex_charge_shot_multiplier 0
+set g_balance_nex_charge_velocity_rate 0
+set g_balance_nex_charge_minspeed 600
+set g_balance_nex_charge_maxspeed 1000
+
+set g_balance_nex_reload_ammo 0 //default: 25
+set g_balance_nex_reload_time 2
+// }}}
+// {{{ minstanex
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 0.50
+set g_balance_minstanex_ammo 10
+set g_balance_minstanex_laser_ammo 0
+set g_balance_minstanex_reload_ammo 0 //default: 50
+set g_balance_minstanex_reload_time 2
+// }}}
+// {{{ hagar
+set g_balance_hagar_primary_damage 14
+set g_balance_hagar_primary_edgedamage 6
+set g_balance_hagar_primary_force 70
+set g_balance_hagar_primary_health 0
+set g_balance_hagar_primary_damageforcescale 0
+set g_balance_hagar_primary_radius 110
+set g_balance_hagar_primary_spread 0.1
+set g_balance_hagar_primary_speed 1800
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_refire 0.12
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_secondary 1
+set g_balance_hagar_secondary_load 0
+set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
+set g_balance_hagar_secondary_load_max 4
+set g_balance_hagar_secondary_load_hold 0
+set g_balance_hagar_secondary_load_releasedeath 1
+set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_load_linkexplode 0
+set g_balance_hagar_secondary_load_animtime 0.2
+set g_balance_hagar_secondary_damage 14 // default for _load: 32
+set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
+set g_balance_hagar_secondary_force 70 // default for _load: 160
+set g_balance_hagar_secondary_health 0
+set g_balance_hagar_secondary_damageforcescale 0
+set g_balance_hagar_secondary_radius 125
+set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
+set g_balance_hagar_secondary_speed 1800
+set g_balance_hagar_secondary_lifetime_min 5
+set g_balance_hagar_secondary_lifetime_rand 0
+set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_reload_ammo 0 //default: 25
+set g_balance_hagar_reload_time 2
+// }}}
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 82
+set g_balance_rocketlauncher_edgedamage 32
+set g_balance_rocketlauncher_force 350
+set g_balance_rocketlauncher_radius 130
+set g_balance_rocketlauncher_speed 1400
+set g_balance_rocketlauncher_speedaccel 1400
+set g_balance_rocketlauncher_speedstart 800
+set g_balance_rocketlauncher_lifetime 5
+set g_balance_rocketlauncher_refire 1
+set g_balance_rocketlauncher_animtime 0.3
+set g_balance_rocketlauncher_ammo 3
+set g_balance_rocketlauncher_health 0
+set g_balance_rocketlauncher_damageforcescale 0
+set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_guiderate 42 // max degrees per second
+set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
+set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
+set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
+set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
+set g_balance_rocketlauncher_remote_damage 60
+set g_balance_rocketlauncher_remote_edgedamage 20
+set g_balance_rocketlauncher_remote_radius 120
+set g_balance_rocketlauncher_remote_force 350
+set g_balance_rocketlauncher_reload_ammo 0 //default: 25
+set g_balance_rocketlauncher_reload_time 2
+// }}}
+// {{{ porto
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_animtime 0.2
+set g_balance_porto_primary_speed 2000
+set g_balance_porto_primary_lifetime 5
+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
+// }}}
+// {{{ hook
+set g_balance_hook_primary_fuel 5 // hook monkeys set 0
+set g_balance_hook_primary_refire 0 // hook monkeys set 0
+set g_balance_hook_primary_animtime 0.2 // good shoot anim
+set g_balance_hook_primary_hooked_time_max 0 // infinite
+set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
+set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
+set g_balance_hook_secondary_damage 25 // not much
+set g_balance_hook_secondary_edgedamage 5 // not much
+set g_balance_hook_secondary_radius 500 // LOTS
+set g_balance_hook_secondary_force -2000 // LOTS
+set g_balance_hook_secondary_ammo 50 // a whole pack
+set g_balance_hook_secondary_lifetime 5 // infinite
+set g_balance_hook_secondary_speed 0 // not much throwing
+set g_balance_hook_secondary_gravity 5 // fast falling
+set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
+set g_balance_hook_secondary_animtime 0.2 // good shoot anim
+set g_balance_hook_secondary_power 3 // effect behaves like a square function
+set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
+set g_balance_hook_secondary_health 0
+set g_balance_hook_secondary_damageforcescale 0 
+// }}}
+// {{{ hlac
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_primary_spread_max 0.075
+set g_balance_hlac_primary_spread_add 0.001
+set g_balance_hlac_primary_spread_crouchmod 0.25
+
+set g_balance_hlac_primary_damage 15
+set g_balance_hlac_primary_edgedamage 10
+set g_balance_hlac_primary_force 70
+set g_balance_hlac_primary_radius 40
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_lifetime 5
+
+set g_balance_hlac_primary_refire 0.1
+set g_balance_hlac_primary_animtime 0.2
+set g_balance_hlac_primary_ammo 1
+
+set g_balance_hlac_secondary 1
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+
+set g_balance_hlac_secondary_damage 20
+set g_balance_hlac_secondary_edgedamage 13
+set g_balance_hlac_secondary_force 100
+set g_balance_hlac_secondary_radius 45
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_lifetime 5
+
+set g_balance_hlac_secondary_refire 0.8
+set g_balance_hlac_secondary_animtime 0.4
+set g_balance_hlac_secondary_ammo 4
+set g_balance_hlac_secondary_shots 6
+
+set g_balance_hlac_reload_ammo 0 //default: 20
+set g_balance_hlac_reload_time 2
+// }}}
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 60
+set g_balance_rifle_primary_headshotaddeddamage 60
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 2
+set g_balance_rifle_primary_speed 40000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 1.5
+set g_balance_rifle_primary_animtime 1.4
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 1
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 1
+set g_balance_rifle_secondary_damage 42
+set g_balance_rifle_secondary_headshotaddeddamage 42
+set g_balance_rifle_secondary_spread 0
+set g_balance_rifle_secondary_force 2
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 1.5
+set g_balance_rifle_secondary_animtime 1.4
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
+// }}}
+// {{{ tuba
+set g_balance_tuba_refire 0.05
+set g_balance_tuba_animtime 0.05
+set g_balance_tuba_attenuation 0.5
+set g_balance_tuba_volume 1
+set g_balance_tuba_fadetime 0.25
+set g_balance_tuba_damage 5
+set g_balance_tuba_edgedamage 0
+set g_balance_tuba_radius 200
+set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
+// }}}
+// {{{ fireball
+set g_balance_fireball_primary_ammo 40
+set g_balance_fireball_primary_animtime 0.2
+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 4
+set g_balance_fireball_primary_edgedamage 0
+set g_balance_fireball_primary_force 700
+set g_balance_fireball_primary_health 50
+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 5
+set g_balance_fireball_primary_refire2 0
+set g_balance_fireball_primary_speed 650
+set g_balance_fireball_primary_spread 0
+set g_balance_fireball_secondary_ammo 5
+set g_balance_fireball_secondary_animtime 0.2
+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_force 100
+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 2
+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_reload_ammo 0 //default: 60
+set g_balance_fireball_reload_time 2
+// }}}
+// {{{ seeker
+set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
+set g_balance_seeker_flac_ammo 0.5
+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 // LOG: 8 -> 3
+set g_balance_seeker_missile_damage 30 // LOG: 15 -> 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 // LOG: 100 -> 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_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1300 // LOG: 1400 -> 1300
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+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 // LOG: 0.7 -> 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_reload_ammo 0 //default: 15
+set g_balance_seeker_reload_time 2
+// End new seeker
diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg
deleted file mode 100644 (file)
index bfe7c2f..0000000
+++ /dev/null
@@ -1,825 +0,0 @@
-// {{{ starting gear
-set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 200
-set g_balance_armor_start 115
-set g_start_ammo_shells 45
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_start_ammo_fuel 0
-set g_warmup_start_health 200 "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 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_cells 50 "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 100
-set g_lms_start_ammo_shells 50
-set g_lms_start_ammo_nails 150
-set g_lms_start_ammo_rockets 50
-set g_lms_start_ammo_cells 50
-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 15
-set g_balance_nix_ammo_nails 45
-set g_balance_nix_ammo_rockets 15
-set g_balance_nix_ammo_cells 15
-set g_balance_nix_ammo_fuel 0
-set g_balance_nix_ammoincr_shells 2
-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_fuel 2
-// }}}
-
-// {{{ pickup items
-set g_pickup_ammo_anyway 0
-set g_pickup_weapons_anyway 1
-set g_pickup_shells 20
-set g_pickup_shells_weapon 20
-set g_pickup_shells_max 45
-set g_pickup_nails 120
-set g_pickup_nails_weapon 120
-set g_pickup_nails_max 300
-set g_pickup_rockets 25
-set g_pickup_rockets_weapon 25
-set g_pickup_rockets_max 150
-set g_pickup_cells 25
-set g_pickup_cells_weapon 25
-set g_pickup_cells_max 200
-set g_pickup_fuel 25
-set g_pickup_fuel_weapon 25
-set g_pickup_fuel_jetpack 50
-set g_pickup_fuel_max 999
-set g_pickup_armorsmall 10
-set g_pickup_armorsmall_max 250
-set g_pickup_armorsmall_anyway 1
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 250
-set g_pickup_armormedium_anyway 0
-set g_pickup_armorbig 50
-set g_pickup_armorbig_max 250
-set g_pickup_armorbig_anyway 0
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 250
-set g_pickup_armorlarge_anyway 0
-set g_pickup_healthsmall 10
-set g_pickup_healthsmall_max 300
-set g_pickup_healthsmall_anyway 1
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 300
-set g_pickup_healthmedium_anyway 0
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 300
-set g_pickup_healthlarge_anyway 0
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 300
-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 15
-set g_pickup_respawntime_ammo 15
-set g_pickup_respawntimejitter_short 0
-set g_pickup_respawntimejitter_medium 0
-set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 10
-set g_pickup_respawntimejitter_weapon 0
-set g_pickup_respawntimejitter_ammo 0
-// }}}
-
-// {{{ regen/rot
-set g_balance_health_regen 0
-set g_balance_health_regenlinear 5
-set g_balance_pause_health_regen 5
-set g_balance_pause_health_regen_spawn 0
-set g_balance_health_rot 0
-set g_balance_health_rotlinear 5
-set g_balance_pause_health_rot 3
-set g_balance_pause_health_rot_spawn 1
-set g_balance_health_regenstable 100
-set g_balance_health_rotstable 100
-set g_balance_health_limit 300
-set g_balance_armor_regen 0
-set g_balance_armor_regenlinear 0
-set g_balance_armor_rot 0
-set g_balance_armor_rotlinear 4.86
-set g_balance_pause_armor_rot 1
-set g_balance_pause_armor_rot_spawn 1
-set g_balance_armor_regenstable 100
-set g_balance_armor_rotstable 200
-set g_balance_armor_limit 250
-set g_balance_armor_blockpercent 0.6
-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 100
-set g_balance_fuel_rotstable 999
-set g_balance_fuel_limit 999
-// }}}
-
-// {{{ misc
-set g_balance_selfdamagepercent 0.6
-set g_balance_weaponswitchdelay 0.15
-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.4
-set g_throughfloor_force 0.7
-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, minelayer 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_newton_style 2
-// 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)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-set g_projectiles_newton_style_2_minfactor 0.8
-set g_projectiles_newton_style_2_maxfactor 1.5
-set g_projectiles_spread_style 0
-// 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 150
-set g_balance_falldamage_minspeed 1400
-set g_balance_falldamage_factor 0.15
-set g_balance_falldamage_maxdamage 25
-set g_balance_damagepush_speedfactor 0
-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_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.2
-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
-// }}}
-
-// {{{ 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_attenuation 2 "jetpack sound attenuation"
-
-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 130
-set g_balance_grapplehook_damagedbycontents 0
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-set g_balance_laser_primary_damage 25
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 182 // Original value was insanely low :P
-set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 12000
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.7
-set g_balance_laser_primary_animtime 0.3
-set g_balance_laser_primary_lifetime 30
-set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0.03
-set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 2 // 300 upforce
-set g_balance_laser_primary_force_velocitybias 0.3
-set g_balance_laser_primary_force_other_scale 1
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 200 // dps
-set g_balance_laser_secondary_edgedamage 0
-set g_balance_laser_secondary_force 1300
-set g_balance_laser_secondary_radius 60
-set g_balance_laser_secondary_speed 0
-set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.066
-set g_balance_laser_secondary_animtime 0.066
-set g_balance_laser_secondary_lifetime 0
-set g_balance_laser_secondary_shotangle 0
-set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 1
-set g_balance_laser_secondary_force_zscale 1.25
-set g_balance_laser_secondary_force_velocitybias 0
-set g_balance_laser_secondary_force_other_scale 1
-set g_balance_laser_reload_ammo 0 //default: 6
-set g_balance_laser_reload_time 2
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 5
-set g_balance_shotgun_primary_damage 12
-set g_balance_shotgun_primary_force 40
-set g_balance_shotgun_primary_spread 0.08
-set g_balance_shotgun_primary_refire 0.5
-set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_primary_speed 12000
-set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary 1
-set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
-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_melee_no_doubleslap 1
-set g_balance_shotgun_secondary_melee_nonplayerdamage 0
-set g_balance_shotgun_secondary_melee_multihit 1
-set g_balance_shotgun_secondary_damage 84
-set g_balance_shotgun_secondary_force 147
-set g_balance_shotgun_secondary_refire 1.1
-set g_balance_shotgun_secondary_animtime 1
-set g_balance_shotgun_reload_ammo 0 //default: 5
-set g_balance_shotgun_reload_time 2
-// }}}
-// {{{ uzi
-set g_balance_uzi_mode 0                               // Activates varible spread for sustained & burst mode secondary
-set g_balance_uzi_spread_min 0.02
-set g_balance_uzi_spread_max 0.6
-set g_balance_uzi_spread_add 0.012
-
-set g_balance_uzi_burst 0                              // # of bullets in a burst (if set to 2 or more)
-set g_balance_uzi_burst_animtime 0.75
-set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.75   // refire after burst
-set g_balance_uzi_burst_spread 0.04
-set g_balance_uzi_burst_damage 18              
-set g_balance_uzi_burst_force 50
-set g_balance_uzi_burst_ammo 3
-
-set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 26
-set g_balance_uzi_first_headshotaddeddamage 0
-set g_balance_uzi_first_force -30
-set g_balance_uzi_first_spread 0.01
-set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 1
-
-set g_balance_uzi_sustained_damage 17
-set g_balance_uzi_sustained_headshotaddeddamage 0
-set g_balance_uzi_sustained_force 27
-set g_balance_uzi_sustained_spread 0.05
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_uzi_speed 18000
-set g_balance_uzi_bulletconstant 300 // 13.1qu
-
-set g_balance_uzi_reload_ammo 0 //default: 30
-set g_balance_uzi_reload_time 2
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 65
-set g_balance_grenadelauncher_primary_edgedamage 35
-set g_balance_grenadelauncher_primary_force 310
-set g_balance_grenadelauncher_primary_radius 140
-set g_balance_grenadelauncher_primary_speed 2000
-set g_balance_grenadelauncher_primary_speed_up 200
-set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0
-set g_balance_grenadelauncher_primary_lifetime 30
-set g_balance_grenadelauncher_primary_lifetime2 0.65
-set g_balance_grenadelauncher_primary_refire 0.7
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_primary_health 72
-set g_balance_grenadelauncher_primary_damageforcescale 0
-set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
-
-set g_balance_grenadelauncher_secondary_type 1
-set g_balance_grenadelauncher_secondary_damage 65
-set g_balance_grenadelauncher_secondary_edgedamage 35
-set g_balance_grenadelauncher_secondary_force 320
-set g_balance_grenadelauncher_secondary_radius 140
-set g_balance_grenadelauncher_secondary_speed 1400
-set g_balance_grenadelauncher_secondary_speed_up 200
-set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime_bounce 0
-set g_balance_grenadelauncher_secondary_lifetime_stick 1
-set g_balance_grenadelauncher_secondary_refire 0.6
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 40
-set g_balance_grenadelauncher_secondary_damageforcescale 0
-set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
-
-set g_balance_grenadelauncher_bouncefactor 0.7
-set g_balance_grenadelauncher_bouncestop 0.12
-
-set g_balance_grenadelauncher_reload_ammo 0 //default: 12
-set g_balance_grenadelauncher_reload_time 2
-// }}}
-// {{{ minelayer
-set g_balance_minelayer_damage 65
-set g_balance_minelayer_edgedamage 30
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_lifetime_countdown 0
-set g_balance_minelayer_refire 1.3
-set g_balance_minelayer_animtime 0.4
-set g_balance_minelayer_ammo 5
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 4 // 0 disables the limit
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-set g_balance_minelayer_reload_ammo 0 //default: 15
-set g_balance_minelayer_reload_time 2
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 0
-set g_balance_electro_primary_damage 55
-set g_balance_electro_primary_edgedamage 5
-set g_balance_electro_primary_force 267
-set g_balance_electro_primary_force_up 125
-set g_balance_electro_primary_radius 150
-set g_balance_electro_primary_comboradius 75
-set g_balance_electro_primary_speed 2000
-set g_balance_electro_primary_spread 0
-set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.78
-set g_balance_electro_primary_animtime 0.4
-set g_balance_electro_primary_ammo 2
-set g_balance_electro_primary_range 800
-set g_balance_electro_primary_falloff_mindist 255
-set g_balance_electro_primary_falloff_maxdist 850
-set g_balance_electro_primary_falloff_halflifedist 0
-set g_balance_electro_secondary_damage 60
-set g_balance_electro_secondary_edgedamage 0
-set g_balance_electro_secondary_force 200
-set g_balance_electro_secondary_radius 150
-set g_balance_electro_secondary_speed 900
-set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_spread 0.05
-set g_balance_electro_secondary_lifetime 3
-set g_balance_electro_secondary_refire 0.2
-set g_balance_electro_secondary_refire2 1
-set g_balance_electro_secondary_animtime 0.3
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 10
-set g_balance_electro_secondary_damageforcescale 4
-set g_balance_electro_secondary_damagedbycontents 0
-set g_balance_electro_secondary_count 3
-set g_balance_electro_secondary_bouncefactor 0.5
-set g_balance_electro_secondary_bouncestop 0.075
-set g_balance_electro_combo_damage 70
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 200
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_comboradius 70
-set g_balance_electro_combo_speed 400
-set g_balance_electro_reload_ammo 0 //default: 20
-set g_balance_electro_reload_time 2
-// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 23
-set g_balance_crylink_primary_edgedamage 0
-set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 6820
-set g_balance_crylink_primary_spread 0.03
-set g_balance_crylink_primary_shots 4
-set g_balance_crylink_primary_bounces 2
-set g_balance_crylink_primary_refire 0.4
-set g_balance_crylink_primary_animtime 0.30008
-set g_balance_crylink_primary_ammo 3
-set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0
-set g_balance_crylink_primary_jointime 0
-set g_balance_crylink_primary_joinexplode 0
-set g_balance_crylink_primary_joinexplode_damage 0
-set g_balance_crylink_primary_joinexplode_edgedamage 0
-set g_balance_crylink_primary_joinexplode_radius 0
-set g_balance_crylink_primary_joinexplode_force 0
-set g_balance_crylink_primary_linkexplode 1
-
-set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
-set g_balance_crylink_primary_middle_fadetime 5
-set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
-set g_balance_crylink_primary_other_fadetime 0.25
-
-set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 19
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -55
-set g_balance_crylink_secondary_radius 3
-set g_balance_crylink_secondary_speed 6950
-set g_balance_crylink_secondary_spread 0.08
-set g_balance_crylink_secondary_shots 7
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.5
-set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 3
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joindelay 0
-set g_balance_crylink_secondary_joinspread 0
-set g_balance_crylink_secondary_jointime 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_radius 0
-set g_balance_crylink_secondary_joinexplode_force 0
-set g_balance_crylink_secondary_linkexplode 1
-
-set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
-set g_balance_crylink_secondary_middle_fadetime 5
-set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
-set g_balance_crylink_secondary_line_fadetime 2
-
-set g_balance_crylink_reload_ammo 0 //default: 10
-set g_balance_crylink_reload_time 2
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 72
-set g_balance_nex_primary_force 600
-set g_balance_nex_primary_refire 1.505
-set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 9999999
-set g_balance_nex_primary_damagefalloff_maxdist 9999999
-set g_balance_nex_primary_damagefalloff_halflife 9999999
-set g_balance_nex_primary_damagefalloff_forcehalflife 9999999
-
-set g_balance_nex_secondary 1
-set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.25
-set g_balance_nex_secondary_chargepool 0
-set g_balance_nex_secondary_chargepool_regen 0.15
-set g_balance_nex_secondary_chargepool_pause_regen 1
-set g_balance_nex_secondary_chargepool_pause_health_regen 1
-set g_balance_nex_secondary_damage 80
-set g_balance_nex_secondary_force -500
-set g_balance_nex_secondary_refire 1.25
-set g_balance_nex_secondary_animtime 0.75
-set g_balance_nex_secondary_ammo 2
-set g_balance_nex_secondary_damagefalloff_mindist 9999999
-set g_balance_nex_secondary_damagefalloff_maxdist 9999999
-set g_balance_nex_secondary_damagefalloff_halflife 9999999
-set g_balance_nex_secondary_damagefalloff_forcehalflife 9999999
-
-set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 40
-set g_balance_nex_charge_start 0
-set g_balance_nex_charge_rate 0.1
-set g_balance_nex_charge_animlimit 0.5
-set g_balance_nex_charge_limit 0.5
-set g_balance_nex_charge_rot_rate 0
-set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
-set g_balance_nex_charge_shot_multiplier 0
-set g_balance_nex_charge_velocity_rate 0.2
-set g_balance_nex_charge_minspeed ""
-set g_balance_nex_charge_maxspeed ""
-
-set g_balance_nex_reload_ammo 0 //default: 25
-set g_balance_nex_reload_time 2
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.278
-set g_balance_minstanex_ammo 10
-set g_balance_minstanex_laser_ammo 0
-set g_balance_minstanex_reload_ammo 0 //default: 50
-set g_balance_minstanex_reload_time 2
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 43
-set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 94
-set g_balance_hagar_primary_health 0
-set g_balance_hagar_primary_damageforcescale 0
-set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.010
-set g_balance_hagar_primary_speed 3000
-set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.15
-set g_balance_hagar_primary_ammo 2
-set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 0
-set g_balance_hagar_secondary_load_speed 0.6
-set g_balance_hagar_secondary_load_spread 0.075
-set g_balance_hagar_secondary_load_spread_bias 0.5
-set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 0
-set g_balance_hagar_secondary_load_releasedeath 1
-set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_load_linkexplode 0
-set g_balance_hagar_secondary_load_animtime 0.2
-set g_balance_hagar_secondary_damage 43
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 100
-set g_balance_hagar_secondary_health 0
-set g_balance_hagar_secondary_damageforcescale 0
-set g_balance_hagar_secondary_radius 70
-set g_balance_hagar_secondary_spread 0.015
-set g_balance_hagar_secondary_speed 1400
-set g_balance_hagar_secondary_lifetime_min 5
-set g_balance_hagar_secondary_lifetime_rand 0
-set g_balance_hagar_secondary_refire 0.15
-set g_balance_hagar_secondary_ammo 2
-set g_balance_hagar_reload_ammo 0 //default: 25
-set g_balance_hagar_reload_time 2
-// }}}
-// {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 65
-set g_balance_rocketlauncher_edgedamage 25
-set g_balance_rocketlauncher_force 360
-set g_balance_rocketlauncher_radius 185
-set g_balance_rocketlauncher_speed 900
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 850
-set g_balance_rocketlauncher_lifetime 30
-set g_balance_rocketlauncher_refire 1
-set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 7
-set g_balance_rocketlauncher_health 40
-set g_balance_rocketlauncher_damageforcescale 4
-set g_balance_rocketlauncher_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 65 // max degrees per second
-set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
-set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
-set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
-set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 120
-set g_balance_rocketlauncher_remote_edgedamage 46
-set g_balance_rocketlauncher_remote_radius 185
-set g_balance_rocketlauncher_remote_force 590
-set g_balance_rocketlauncher_reload_ammo 0 //default: 25
-set g_balance_rocketlauncher_reload_time 2
-// }}}
-// {{{ porto
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.3
-set g_balance_porto_primary_speed 5000
-set g_balance_porto_primary_lifetime 30
-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
-// }}}
-// {{{ hook
-set g_balance_hook_primary_fuel 2 // hook monkeys set 0
-set g_balance_hook_primary_refire 0 // hook monkeys set 0
-set g_balance_hook_primary_animtime 0.3 // good shoot anim
-set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
-set g_balance_hook_primary_hooked_fuel 3 // fuel per second hooked
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 500 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 50 // a whole pack
-set g_balance_hook_secondary_lifetime 30 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.3 // good shoot anim
-set g_balance_hook_secondary_power 3 // effect behaves like a square function
-set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
-set g_balance_hook_secondary_health 0
-set g_balance_hook_secondary_damageforcescale 0 
-// }}}
-// {{{ hlac
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.25
-set g_balance_hlac_primary_spread_add 0.0045
-set g_balance_hlac_primary_spread_crouchmod 0.25
-
-set g_balance_hlac_primary_damage 17
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 45
-set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
-set g_balance_hlac_primary_lifetime 5
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.3
-set g_balance_hlac_primary_ammo 3
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.15
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 18
-set g_balance_hlac_secondary_edgedamage 10
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.3
-set g_balance_hlac_secondary_ammo 11
-set g_balance_hlac_secondary_shots 6
-
-set g_balance_hlac_reload_ammo 0 //default: 20
-set g_balance_hlac_reload_time 2
-// }}}
-// {{{ rifle
-set g_balance_rifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_rifle_primary_tracer 0
-set g_balance_rifle_primary_shots 1
-set g_balance_rifle_primary_damage 75
-set g_balance_rifle_primary_headshotaddeddamage 90
-set g_balance_rifle_primary_spread 0
-set g_balance_rifle_primary_force 2
-set g_balance_rifle_primary_speed 35000
-set g_balance_rifle_primary_lifetime 5
-set g_balance_rifle_primary_refire 0.7
-set g_balance_rifle_primary_animtime 0.3
-set g_balance_rifle_primary_ammo 10
-set g_balance_rifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_rifle_primary_burstcost 0 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_rifle_secondary 1
-set g_balance_rifle_secondary_reload 0
-set g_balance_rifle_secondary_tracer 0
-set g_balance_rifle_secondary_shots 1
-set g_balance_rifle_secondary_damage 40
-set g_balance_rifle_secondary_headshotaddeddamage 20
-set g_balance_rifle_secondary_spread 0.008
-set g_balance_rifle_secondary_force 1
-set g_balance_rifle_secondary_speed 20000
-set g_balance_rifle_secondary_lifetime 5
-set g_balance_rifle_secondary_refire 0.0006
-set g_balance_rifle_secondary_animtime 0.1
-set g_balance_rifle_secondary_ammo 10
-set g_balance_rifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_rifle_secondary_burstcost 0
-set g_balance_rifle_secondary_bullethail 0
-set g_balance_rifle_reload_ammo 80 //default: 80
-set g_balance_rifle_reload_time 2
-// }}}
-// {{{ tuba
-set g_balance_tuba_refire 0.05
-set g_balance_tuba_animtime 0.05
-set g_balance_tuba_attenuation 0.5
-set g_balance_tuba_volume 1
-set g_balance_tuba_fadetime 0.25
-set g_balance_tuba_damage 5
-set g_balance_tuba_edgedamage 0
-set g_balance_tuba_radius 200
-set g_balance_tuba_force 40
-set g_balance_tuba_pitchstep 6
-// }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 5
-set g_balance_fireball_primary_animtime 0.3
-set g_balance_fireball_primary_bfgdamage 0
-set g_balance_fireball_primary_bfgforce 0
-set g_balance_fireball_primary_bfgradius 0
-set g_balance_fireball_primary_damage 40
-set g_balance_fireball_primary_damageforcescale 4
-set g_balance_fireball_primary_edgedamage 0
-set g_balance_fireball_primary_force 100
-set g_balance_fireball_primary_health 9999
-set g_balance_fireball_primary_laserburntime 0.5
-set g_balance_fireball_primary_laserdamage 30
-set g_balance_fireball_primary_laseredgedamage 20
-set g_balance_fireball_primary_laserradius 110
-set g_balance_fireball_primary_lifetime 7
-set g_balance_fireball_primary_radius 20
-set g_balance_fireball_primary_refire 2
-set g_balance_fireball_primary_refire2 1.5
-set g_balance_fireball_primary_speed 900
-set g_balance_fireball_primary_spread 0
-set g_balance_fireball_secondary_ammo 25
-set g_balance_fireball_secondary_animtime 0.15
-set g_balance_fireball_secondary_damage 150
-set g_balance_fireball_secondary_damageforcescale 4
-set g_balance_fireball_secondary_damagetime 3
-set g_balance_fireball_secondary_force 700
-set g_balance_fireball_secondary_laserburntime 0.5
-set g_balance_fireball_secondary_laserdamage 30
-set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 256
-set g_balance_fireball_secondary_lifetime 15
-set g_balance_fireball_secondary_refire 0
-set g_balance_fireball_secondary_speed 650
-set g_balance_fireball_secondary_speed_up 0
-set g_balance_fireball_secondary_speed_z 0
-set g_balance_fireball_secondary_spread 0
-set g_balance_fireball_reload_ammo 0 //default: 60
-set g_balance_fireball_reload_time 2
-// }}}
-// {{{ seeker
-set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
-set g_balance_seeker_flac_ammo 0.5
-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 3000
-set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.3
-set g_balance_seeker_missile_count 8
-set g_balance_seeker_missile_damage 25
-set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 6000
-set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_edgedamage 10
-set g_balance_seeker_missile_force 250
-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_up 300
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1250
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.3
-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.7
-set g_balance_seeker_tag_speed 9000
-set g_balance_seeker_tag_spread 0
-set g_balance_seeker_tag_tracker_lifetime 10
-set g_balance_seeker_reload_ammo 0 //default: 15
-set g_balance_seeker_reload_time 2
-// End new seeker
diff --git a/balanceXPM.cfg b/balanceXPM.cfg
new file mode 100644 (file)
index 0000000..8fc0b1c
--- /dev/null
@@ -0,0 +1,825 @@
+// {{{ starting gear
+set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
+set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
+set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_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_fuel 0
+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_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_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_fuel 0
+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_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_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_armorlarge 100
+set g_pickup_armorlarge_max 200
+set g_pickup_armorlarge_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_healthlarge 50
+set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_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_ammo 15
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 30
+set g_pickup_respawntimejitter_weapon 0
+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.04
+set g_balance_health_rotlinear 0.75
+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 999
+set g_balance_armor_regen 0
+set g_balance_armor_regenlinear 0
+set g_balance_armor_rot 0.04
+set g_balance_armor_rotlinear 0.75
+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 999
+set g_balance_armor_blockpercent 0.6
+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 999
+// }}}
+
+// {{{ misc
+set g_balance_selfdamagepercent 0.65
+set g_balance_weaponswitchdelay 0.15
+set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
+set g_weaponratefactor 1 "weapon fire rate multiplier"
+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 1
+// possible values:
+// -2: absolutely no damage to projectiles (no exceptions)
+// -1: no damage other than the exceptions (electro combo, hagar join explode, minelayer 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_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)
+// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
+// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
+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_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.25 // only 1/4th damage is taken
+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
+// }}}
+
+// {{{ 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_attenuation 2 "jetpack sound attenuation"
+
+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
+// }}}
+
+// {{{ weapon properties
+// {{{ laser
+set g_balance_laser_primary_damage 25
+set g_balance_laser_primary_edgedamage 12.5
+set g_balance_laser_primary_force 300
+set g_balance_laser_primary_radius 70
+set g_balance_laser_primary_speed 6000
+set g_balance_laser_primary_spread 0
+set g_balance_laser_primary_refire 0.7
+set g_balance_laser_primary_animtime 0.3
+set g_balance_laser_primary_lifetime 5
+set g_balance_laser_primary_shotangle 0
+set g_balance_laser_primary_delay 0
+set g_balance_laser_primary_gauntlet 0
+set g_balance_laser_primary_force_zscale 1.25
+set g_balance_laser_primary_force_velocitybias 0
+set g_balance_laser_primary_force_other_scale 1
+set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 25
+set g_balance_laser_secondary_edgedamage 12.5
+set g_balance_laser_secondary_force 400
+set g_balance_laser_secondary_radius 70
+set g_balance_laser_secondary_speed 12000
+set g_balance_laser_secondary_spread 0
+set g_balance_laser_secondary_refire 0.7
+set g_balance_laser_secondary_animtime 0.3
+set g_balance_laser_secondary_lifetime 5
+set g_balance_laser_secondary_shotangle -90
+set g_balance_laser_secondary_delay 0
+set g_balance_laser_secondary_gauntlet 0
+set g_balance_laser_secondary_force_zscale 1.25
+set g_balance_laser_secondary_force_velocitybias 0
+set g_balance_laser_secondary_force_other_scale 1
+set g_balance_laser_reload_ammo 0 //default: 6
+set g_balance_laser_reload_time 2
+// }}}
+// {{{ shotgun
+set g_balance_shotgun_primary_bullets 14
+set g_balance_shotgun_primary_damage 4
+set g_balance_shotgun_primary_force 15
+set g_balance_shotgun_primary_spread 0.12
+set g_balance_shotgun_primary_refire 0.75
+set g_balance_shotgun_primary_animtime 0.2
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_speed 8000
+set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
+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_melee_no_doubleslap 1
+set g_balance_shotgun_secondary_melee_nonplayerdamage 40
+set g_balance_shotgun_secondary_melee_multihit 1
+set g_balance_shotgun_secondary_damage 80
+set g_balance_shotgun_secondary_force 200
+set g_balance_shotgun_secondary_refire 1.25
+set g_balance_shotgun_secondary_animtime 1
+set g_balance_shotgun_reload_ammo 0 //default: 5
+set g_balance_shotgun_reload_time 2
+// }}}
+// {{{ uzi
+set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
+set g_balance_uzi_spread_min 0.02
+set g_balance_uzi_spread_max 0.05
+set g_balance_uzi_spread_add 0.012
+
+set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
+set g_balance_uzi_burst_animtime 0.3
+set g_balance_uzi_burst_refire 0.06            // refire between burst bullets
+set g_balance_uzi_burst_refire2 0.45   // refire after burst
+set g_balance_uzi_burst_spread 0.02
+set g_balance_uzi_burst_damage 25              
+set g_balance_uzi_burst_force 20
+set g_balance_uzi_burst_ammo 3
+
+set g_balance_uzi_first 1
+set g_balance_uzi_first_damage 14
+set g_balance_uzi_first_headshotaddeddamage 0
+set g_balance_uzi_first_force 5
+set g_balance_uzi_first_spread 0.03
+set g_balance_uzi_first_refire 0.125
+set g_balance_uzi_first_ammo 1
+
+set g_balance_uzi_sustained_damage 10 // 100 dps
+set g_balance_uzi_sustained_headshotaddeddamage 0
+set g_balance_uzi_sustained_force 5
+set g_balance_uzi_sustained_spread 0.03
+set g_balance_uzi_sustained_refire 0.1
+set g_balance_uzi_sustained_ammo 1
+
+set g_balance_uzi_speed 18000
+set g_balance_uzi_bulletconstant 115 // 13.1qu
+
+set g_balance_uzi_reload_ammo 60 //default: 30
+set g_balance_uzi_reload_time 2
+// }}}
+// {{{ mortar
+set g_balance_grenadelauncher_primary_type 0
+set g_balance_grenadelauncher_primary_damage 50
+set g_balance_grenadelauncher_primary_edgedamage 25
+set g_balance_grenadelauncher_primary_force 250
+set g_balance_grenadelauncher_primary_radius 120
+set g_balance_grenadelauncher_primary_speed 1900
+set g_balance_grenadelauncher_primary_speed_up 225
+set g_balance_grenadelauncher_primary_speed_z 0
+set g_balance_grenadelauncher_primary_spread 0
+set g_balance_grenadelauncher_primary_lifetime 5
+set g_balance_grenadelauncher_primary_lifetime2 1
+set g_balance_grenadelauncher_primary_refire 0.8
+set g_balance_grenadelauncher_primary_animtime 0.3
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_primary_health 15
+set g_balance_grenadelauncher_primary_damageforcescale 0
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
+set g_balance_grenadelauncher_secondary_damage 60
+set g_balance_grenadelauncher_secondary_edgedamage 30
+set g_balance_grenadelauncher_secondary_force 250
+set g_balance_grenadelauncher_secondary_radius 120
+set g_balance_grenadelauncher_secondary_speed 1400
+set g_balance_grenadelauncher_secondary_speed_up 150
+set g_balance_grenadelauncher_secondary_speed_z 0
+set g_balance_grenadelauncher_secondary_spread 0
+set g_balance_grenadelauncher_secondary_lifetime 5
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
+set g_balance_grenadelauncher_secondary_refire 0.7
+set g_balance_grenadelauncher_secondary_animtime 0.3
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_secondary_health 30
+set g_balance_grenadelauncher_secondary_damageforcescale 4
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
+
+set g_balance_grenadelauncher_bouncefactor 0.5
+set g_balance_grenadelauncher_bouncestop 0.075
+
+set g_balance_grenadelauncher_reload_ammo 0 //default: 12
+set g_balance_grenadelauncher_reload_time 2
+// }}}
+// {{{ minelayer
+set g_balance_minelayer_damage 40
+set g_balance_minelayer_edgedamage 20
+set g_balance_minelayer_force 250
+set g_balance_minelayer_radius 175
+set g_balance_minelayer_proximityradius 150
+set g_balance_minelayer_speed 1000
+set g_balance_minelayer_lifetime 10
+set g_balance_minelayer_lifetime_countdown 0.5
+set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_animtime 0.4
+set g_balance_minelayer_ammo 4
+set g_balance_minelayer_health 15
+set g_balance_minelayer_limit 3 // 0 disables the limit
+set g_balance_minelayer_protection 0 // don't explode if the mine would hurt the owner or a team mate
+set g_balance_minelayer_damageforcescale 0
+set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_minelayer_time 0.5
+set g_balance_minelayer_remote_damage 45
+set g_balance_minelayer_remote_edgedamage 40
+set g_balance_minelayer_remote_radius 200
+set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_reload_ammo 0 //default: 15
+set g_balance_minelayer_reload_time 2
+// }}}
+// {{{ electro
+set g_balance_electro_lightning 0
+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_force_up 0
+set g_balance_electro_primary_radius 100
+set g_balance_electro_primary_comboradius 150
+set g_balance_electro_primary_speed 2500
+set g_balance_electro_primary_spread 0
+set g_balance_electro_primary_lifetime 5
+set g_balance_electro_primary_refire 0.6
+set g_balance_electro_primary_animtime 0.1
+set g_balance_electro_primary_ammo 4
+set g_balance_electro_primary_range 0
+set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
+set g_balance_electro_primary_falloff_maxdist 850
+set g_balance_electro_primary_falloff_halflifedist 425
+set g_balance_electro_secondary_damage 40
+set g_balance_electro_secondary_edgedamage 20
+set g_balance_electro_secondary_force 50
+set g_balance_electro_secondary_radius 150
+set g_balance_electro_secondary_speed 900
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_speed_z 0
+set g_balance_electro_secondary_spread 0.05
+set g_balance_electro_secondary_lifetime 3
+set g_balance_electro_secondary_refire 0.2
+set g_balance_electro_secondary_refire2 1.5
+set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_health 5
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_damagedbycontents 1
+set g_balance_electro_secondary_count 3
+set g_balance_electro_secondary_bouncefactor 0.4
+set g_balance_electro_secondary_bouncestop 0.05
+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 175
+set g_balance_electro_combo_comboradius 275
+set g_balance_electro_combo_speed 2000
+set g_balance_electro_reload_ammo 0 //default: 20
+set g_balance_electro_reload_time 2
+// }}}
+// {{{ crylink 
+set g_balance_crylink_primary_damage 10
+set g_balance_crylink_primary_edgedamage 5
+set g_balance_crylink_primary_force -55
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_speed 2000
+set g_balance_crylink_primary_spread 0.08
+set g_balance_crylink_primary_shots 6
+set g_balance_crylink_primary_bounces 1
+set g_balance_crylink_primary_refire 0.7
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_ammo 3
+set g_balance_crylink_primary_bouncedamagefactor 0.5
+set g_balance_crylink_primary_joindelay 0.1
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_jointime 0
+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_radius 0
+set g_balance_crylink_primary_joinexplode_force 0
+set g_balance_crylink_primary_linkexplode 1
+
+set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
+set g_balance_crylink_primary_middle_fadetime 5
+set g_balance_crylink_primary_other_lifetime 5 
+set g_balance_crylink_primary_other_fadetime 5
+
+set g_balance_crylink_secondary 1
+set g_balance_crylink_secondary_damage 5
+set g_balance_crylink_secondary_edgedamage 0
+set g_balance_crylink_secondary_force -40
+set g_balance_crylink_secondary_radius 70
+set g_balance_crylink_secondary_speed 2000
+set g_balance_crylink_secondary_spread 0.02
+set g_balance_crylink_secondary_shots 3
+set g_balance_crylink_secondary_bounces 1
+set g_balance_crylink_secondary_refire 0.2
+set g_balance_crylink_secondary_animtime 0.2
+set g_balance_crylink_secondary_ammo 2
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_joinspread 0
+set g_balance_crylink_secondary_jointime 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_radius 0
+set g_balance_crylink_secondary_joinexplode_force 0
+set g_balance_crylink_secondary_linkexplode 1
+
+set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_line_lifetime 5 
+set g_balance_crylink_secondary_line_fadetime 5
+
+set g_balance_crylink_reload_ammo 0 //default: 10
+set g_balance_crylink_reload_time 2
+// }}}
+// {{{ nex
+set g_balance_nex_primary_damage 90
+set g_balance_nex_primary_force 400
+set g_balance_nex_primary_refire 1.5
+set g_balance_nex_primary_animtime 0.45
+set g_balance_nex_primary_ammo 6
+set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
+set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
+set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
+set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
+
+set g_balance_nex_secondary 0
+set g_balance_nex_secondary_charge 0
+set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_chargepool 0
+set g_balance_nex_secondary_chargepool_regen 0.15
+set g_balance_nex_secondary_chargepool_pause_regen 1
+set g_balance_nex_secondary_chargepool_pause_health_regen 1
+set g_balance_nex_secondary_damage 0
+set g_balance_nex_secondary_force 0
+set g_balance_nex_secondary_refire 0
+set g_balance_nex_secondary_animtime 0
+set g_balance_nex_secondary_ammo 2
+set g_balance_nex_secondary_damagefalloff_mindist 0
+set g_balance_nex_secondary_damagefalloff_maxdist 0
+set g_balance_nex_secondary_damagefalloff_halflife 0
+set g_balance_nex_secondary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_charge 1
+set g_balance_nex_charge_mindmg 40
+set g_balance_nex_charge_start 0.5
+set g_balance_nex_charge_rate 0.4
+set g_balance_nex_charge_animlimit 0.5
+set g_balance_nex_charge_limit 1
+set g_balance_nex_charge_rot_rate 0
+set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
+set g_balance_nex_charge_shot_multiplier 0
+set g_balance_nex_charge_velocity_rate 0
+set g_balance_nex_charge_minspeed 400
+set g_balance_nex_charge_maxspeed 800
+
+set g_balance_nex_reload_ammo 0 //default: 25
+set g_balance_nex_reload_time 2
+// }}}
+// {{{ minstanex
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 0.3
+set g_balance_minstanex_ammo 10
+set g_balance_minstanex_laser_ammo 0
+set g_balance_minstanex_reload_ammo 0 //default: 50
+set g_balance_minstanex_reload_time 2
+// }}}
+// {{{ hagar
+set g_balance_hagar_primary_damage 25
+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_damageforcescale 0
+set g_balance_hagar_primary_radius 65
+set g_balance_hagar_primary_spread 0.04
+set g_balance_hagar_primary_speed 2200
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_refire 0.16667 // 6 rockets per second
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_secondary 1
+set g_balance_hagar_secondary_load 1
+set g_balance_hagar_secondary_load_speed 0.5
+set g_balance_hagar_secondary_load_spread 0.075
+set g_balance_hagar_secondary_load_spread_bias 0.5
+set g_balance_hagar_secondary_load_max 4
+set g_balance_hagar_secondary_load_hold 4
+set g_balance_hagar_secondary_load_releasedeath 0
+set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_load_linkexplode 0
+set g_balance_hagar_secondary_load_animtime 0.2
+set g_balance_hagar_secondary_damage 40
+set g_balance_hagar_secondary_edgedamage 20
+set g_balance_hagar_secondary_force 75
+set g_balance_hagar_secondary_health 15
+set g_balance_hagar_secondary_damageforcescale 0
+set g_balance_hagar_secondary_radius 80
+set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_speed 2000
+set g_balance_hagar_secondary_lifetime_min 10
+set g_balance_hagar_secondary_lifetime_rand 0
+set g_balance_hagar_secondary_refire 0.5
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_reload_ammo 0 //default: 25
+set g_balance_hagar_reload_time 2
+// }}}
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 80
+set g_balance_rocketlauncher_edgedamage 40
+set g_balance_rocketlauncher_force 400
+set g_balance_rocketlauncher_radius 110
+set g_balance_rocketlauncher_speed 1300
+set g_balance_rocketlauncher_speedaccel 1300
+set g_balance_rocketlauncher_speedstart 1000
+set g_balance_rocketlauncher_lifetime 10
+set g_balance_rocketlauncher_refire 1.1
+set g_balance_rocketlauncher_animtime 0.35
+set g_balance_rocketlauncher_ammo 4
+set g_balance_rocketlauncher_health 30 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
+set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
+set g_balance_rocketlauncher_detonatedelay 0.02 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_guiderate 90 // max degrees per second
+set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
+set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
+set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
+set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
+set g_balance_rocketlauncher_remote_damage 70
+set g_balance_rocketlauncher_remote_edgedamage 35
+set g_balance_rocketlauncher_remote_radius 110
+set g_balance_rocketlauncher_remote_force 400
+set g_balance_rocketlauncher_reload_ammo 0 //default: 25
+set g_balance_rocketlauncher_reload_time 2
+// }}}
+// {{{ porto
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_animtime 0.3
+set g_balance_porto_primary_speed 1000
+set g_balance_porto_primary_lifetime 5
+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
+// }}}
+// {{{ hook
+set g_balance_hook_primary_fuel 5 // hook monkeys set 0
+set g_balance_hook_primary_refire 0 // hook monkeys set 0
+set g_balance_hook_primary_animtime 0.3 // good shoot anim
+set g_balance_hook_primary_hooked_time_max 0 // infinite
+set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
+set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
+set g_balance_hook_secondary_damage 25 // not much
+set g_balance_hook_secondary_edgedamage 5 // not much
+set g_balance_hook_secondary_radius 500 // LOTS
+set g_balance_hook_secondary_force -2000 // LOTS
+set g_balance_hook_secondary_ammo 30 // a whole pack
+set g_balance_hook_secondary_lifetime 5 // infinite
+set g_balance_hook_secondary_speed 0 // not much throwing
+set g_balance_hook_secondary_gravity 5 // fast falling
+set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
+set g_balance_hook_secondary_animtime 0.3 // good shoot anim
+set g_balance_hook_secondary_power 3 // effect behaves like a square function
+set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
+set g_balance_hook_secondary_health 15
+set g_balance_hook_secondary_damageforcescale 0 
+// }}}
+// {{{ hlac // TO BE REMOVED
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_primary_spread_max 0.25
+set g_balance_hlac_primary_spread_add 0.0045
+set g_balance_hlac_primary_spread_crouchmod 0.25
+
+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_radius 70
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_lifetime 5
+
+set g_balance_hlac_primary_refire 0.15
+set g_balance_hlac_primary_animtime 0.4
+set g_balance_hlac_primary_ammo 1
+
+set g_balance_hlac_secondary 1
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+
+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_radius 70
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_lifetime 5
+
+set g_balance_hlac_secondary_refire 1
+set g_balance_hlac_secondary_animtime 0.3
+set g_balance_hlac_secondary_ammo 10
+set g_balance_hlac_secondary_shots 6
+
+set g_balance_hlac_reload_ammo 0 //default: 20
+set g_balance_hlac_reload_time 2
+// }}}
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 40
+set g_balance_rifle_primary_headshotaddeddamage 40
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_speed 40000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 1.2
+set g_balance_rifle_primary_animtime 0.4
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 4
+set g_balance_rifle_secondary_damage 10
+set g_balance_rifle_secondary_headshotaddeddamage 20
+set g_balance_rifle_secondary_spread 0.04
+set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 0.9
+set g_balance_rifle_secondary_animtime 0.3
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
+// }}}
+// {{{ tuba
+set g_balance_tuba_refire 0.05
+set g_balance_tuba_animtime 0.05
+set g_balance_tuba_attenuation 0.5
+set g_balance_tuba_volume 1
+set g_balance_tuba_fadetime 0.25
+set g_balance_tuba_damage 5
+set g_balance_tuba_edgedamage 0
+set g_balance_tuba_radius 200
+set g_balance_tuba_force 40
+set g_balance_tuba_pitchstep 6
+// }}}
+// {{{ fireball // this is a superweapon -- lets make it behave as one. 
+set g_balance_fireball_primary_ammo 20
+set g_balance_fireball_primary_animtime 0.2
+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_ammo 5
+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_force 100
+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_reload_ammo 0 //default: 100
+set g_balance_fireball_reload_time 2
+// }}}
+// {{{ seeker
+set g_balance_seeker_type 1 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
+set g_balance_seeker_flac_ammo 0.5
+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_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.2
+set g_balance_seeker_tag_damageforcescale 0
+set g_balance_seeker_tag_health 0
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 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_missile_accel 1500
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.2
+set g_balance_seeker_missile_count 3 // LOG: 8 -> 3
+set g_balance_seeker_missile_damage 16 // LOG: 15 -> 30
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 6000
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 8
+set g_balance_seeker_missile_force 50 // LOG: 100 -> 150
+set g_balance_seeker_missile_health 1
+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 70
+set g_balance_seeker_missile_refire 0.25
+set g_balance_seeker_missile_smart 0
+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 1500
+set g_balance_seeker_missile_speed_up 0
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 2000 // LOG: 1400 -> 1300
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.15
+set g_balance_seeker_reload_ammo 0 //default: 15
+set g_balance_seeker_reload_time 2
+// End new seeker
index e3c0ecff45b358bc23aa789f995e7878e6b1daea..dffc9eab65c6386f97ef2fb830c13a2d58ae7c0e 100644 (file)
@@ -282,7 +282,7 @@ set g_balance_shotgun_secondary_melee_traces 10
 set g_balance_shotgun_secondary_melee_no_doubleslap 1
 set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 set g_balance_shotgun_secondary_melee_multihit 1
-set g_balance_shotgun_secondary_damage 100
+set g_balance_shotgun_secondary_damage 80
 set g_balance_shotgun_secondary_force 200
 set g_balance_shotgun_secondary_refire 1.25
 set g_balance_shotgun_secondary_animtime 1
@@ -309,7 +309,7 @@ set g_balance_uzi_first_damage 14
 set g_balance_uzi_first_headshotaddeddamage 0
 set g_balance_uzi_first_force 5
 set g_balance_uzi_first_spread 0.03
-set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_refire 0.125
 set g_balance_uzi_first_ammo 1
 
 set g_balance_uzi_sustained_damage 10 // 100 dps
@@ -330,11 +330,11 @@ set g_balance_grenadelauncher_primary_type 0
 set g_balance_grenadelauncher_primary_damage 50
 set g_balance_grenadelauncher_primary_edgedamage 25
 set g_balance_grenadelauncher_primary_force 250
-set g_balance_grenadelauncher_primary_radius 130
+set g_balance_grenadelauncher_primary_radius 120
 set g_balance_grenadelauncher_primary_speed 1900
 set g_balance_grenadelauncher_primary_speed_up 225
 set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0.02
+set g_balance_grenadelauncher_primary_spread 0
 set g_balance_grenadelauncher_primary_lifetime 5
 set g_balance_grenadelauncher_primary_lifetime2 1
 set g_balance_grenadelauncher_primary_refire 0.8
@@ -348,11 +348,11 @@ set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 60
 set g_balance_grenadelauncher_secondary_edgedamage 30
 set g_balance_grenadelauncher_secondary_force 250
-set g_balance_grenadelauncher_secondary_radius 130
+set g_balance_grenadelauncher_secondary_radius 120
 set g_balance_grenadelauncher_secondary_speed 1400
 set g_balance_grenadelauncher_secondary_speed_up 150
 set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0.02
+set g_balance_grenadelauncher_secondary_spread 0
 set g_balance_grenadelauncher_secondary_lifetime 5
 set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
 set g_balance_grenadelauncher_secondary_lifetime_stick 0
@@ -445,16 +445,16 @@ set g_balance_crylink_primary_damage 10
 set g_balance_crylink_primary_edgedamage 5
 set g_balance_crylink_primary_force -55
 set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 1800
-set g_balance_crylink_primary_spread 0.075
-set g_balance_crylink_primary_shots 7
+set g_balance_crylink_primary_speed 2000
+set g_balance_crylink_primary_spread 0.08
+set g_balance_crylink_primary_shots 6
 set g_balance_crylink_primary_bounces 1
 set g_balance_crylink_primary_refire 0.7
 set g_balance_crylink_primary_animtime 0.3
 set g_balance_crylink_primary_ammo 3
 set g_balance_crylink_primary_bouncedamagefactor 0.5
-set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0.4
+set g_balance_crylink_primary_joindelay 0.1
+set g_balance_crylink_primary_joinspread 0.2
 set g_balance_crylink_primary_jointime 0
 set g_balance_crylink_primary_joinexplode 1
 set g_balance_crylink_primary_joinexplode_damage 0
@@ -503,7 +503,7 @@ set g_balance_crylink_reload_time 2
 set g_balance_nex_primary_damage 90
 set g_balance_nex_primary_force 400
 set g_balance_nex_primary_refire 1.5
-set g_balance_nex_primary_animtime 0.4
+set g_balance_nex_primary_animtime 0.45
 set g_balance_nex_primary_ammo 6
 set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
@@ -594,17 +594,17 @@ set g_balance_rocketlauncher_damage 80
 set g_balance_rocketlauncher_edgedamage 40
 set g_balance_rocketlauncher_force 400
 set g_balance_rocketlauncher_radius 110
-set g_balance_rocketlauncher_speed 1500
-set g_balance_rocketlauncher_speedaccel 1500
-set g_balance_rocketlauncher_speedstart 800
+set g_balance_rocketlauncher_speed 1300
+set g_balance_rocketlauncher_speedaccel 1300
+set g_balance_rocketlauncher_speedstart 1000
 set g_balance_rocketlauncher_lifetime 10
 set g_balance_rocketlauncher_refire 1.1
-set g_balance_rocketlauncher_animtime 0.3
+set g_balance_rocketlauncher_animtime 0.35
 set g_balance_rocketlauncher_ammo 4
 set g_balance_rocketlauncher_health 30 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
 set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
-set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 110 // max degrees per second
+set g_balance_rocketlauncher_detonatedelay 0.02 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_guiderate 90 // max degrees per second
 set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
diff --git a/balancetZork.cfg b/balancetZork.cfg
deleted file mode 100644 (file)
index 520b96e..0000000
+++ /dev/null
@@ -1,824 +0,0 @@
-// {{{ starting gear
-set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 125
-set g_balance_armor_start 0
-set g_start_ammo_shells 20
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_start_ammo_fuel 0
-set g_warmup_start_health 200 "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 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_cells 50 "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 100
-set g_lms_start_ammo_shells 30
-set g_lms_start_ammo_nails 250
-set g_lms_start_ammo_rockets 100
-set g_lms_start_ammo_cells 200
-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 15
-set g_balance_nix_ammo_nails 45
-set g_balance_nix_ammo_rockets 15
-set g_balance_nix_ammo_cells 15
-set g_balance_nix_ammo_fuel 0
-set g_balance_nix_ammoincr_shells 2
-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_fuel 2
-// }}}
-
-// {{{ pickup items
-set g_pickup_ammo_anyway 1
-set g_pickup_weapons_anyway 1
-set g_pickup_shells 20
-set g_pickup_shells_weapon 10
-set g_pickup_shells_max 50
-set g_pickup_nails 60
-set g_pickup_nails_weapon 60
-set g_pickup_nails_max 300
-set g_pickup_rockets 25
-set g_pickup_rockets_weapon 15
-set g_pickup_rockets_max 150
-set g_pickup_cells 30
-set g_pickup_cells_weapon 20
-set g_pickup_cells_max 300
-set g_pickup_fuel 25
-set g_pickup_fuel_weapon 15
-set g_pickup_fuel_jetpack 50
-set g_pickup_fuel_max 999
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 999
-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 150
-set g_pickup_armorbig_anyway 0
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 999
-set g_pickup_armorlarge_anyway 0
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 999
-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_healthlarge 50
-set g_pickup_healthlarge_max 150
-set g_pickup_healthlarge_anyway 0
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 999
-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 20
-set g_pickup_respawntime_ammo 15
-set g_pickup_respawntimejitter_short 0
-set g_pickup_respawntimejitter_medium 0
-set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 10
-set g_pickup_respawntimejitter_weapon 0
-set g_pickup_respawntimejitter_ammo 0
-// }}}
-
-// {{{ regen/rot
-set g_balance_health_regen 0.1
-set g_balance_health_regenlinear 0
-set g_balance_pause_health_regen 5
-set g_balance_pause_health_regen_spawn 0
-set g_balance_health_rot 0.1
-set g_balance_health_rotlinear 2.5
-set g_balance_pause_health_rot 4
-set g_balance_pause_health_rot_spawn 8
-set g_balance_health_regenstable 100
-set g_balance_health_rotstable 100
-set g_balance_health_limit 999
-set g_balance_armor_regen 0
-set g_balance_armor_regenlinear 0
-set g_balance_armor_rot 0.1
-set g_balance_armor_rotlinear 2.5
-set g_balance_pause_armor_rot 4
-set g_balance_pause_armor_rot_spawn 8
-set g_balance_armor_regenstable 100
-set g_balance_armor_rotstable 100
-set g_balance_armor_limit 999
-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 4
-set g_balance_pause_fuel_rot_spawn 8
-set g_balance_fuel_regenstable 50
-set g_balance_fuel_rotstable 100
-set g_balance_fuel_limit 999
-// }}}
-
-// {{{ misc
-set g_balance_selfdamagepercent 0.6
-set g_balance_weaponswitchdelay 0.15
-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.5
-set g_throughfloor_force 0.7
-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, minelayer 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_newton_style 2
-// 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)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-set g_projectiles_newton_style_2_minfactor 0.7
-set g_projectiles_newton_style_2_maxfactor 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 150
-set g_balance_falldamage_minspeed 800
-set g_balance_falldamage_factor 0.02 // maxspeed = minspeed + maxdamage / factor = 4550
-set g_balance_falldamage_maxdamage 75
-set g_balance_damagepush_speedfactor 0
-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_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.3
-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
-// }}}
-
-// {{{ 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 1500 "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_attenuation 2 "jetpack sound attenuation"
-
-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 130
-set g_balance_grapplehook_damagedbycontents 0
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-set g_balance_laser_primary_damage 20 
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 230
-set g_balance_laser_primary_radius 60
-set g_balance_laser_primary_speed 9000
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.6
-set g_balance_laser_primary_animtime 0.6
-set g_balance_laser_primary_lifetime 5
-set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0
-set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1.2
-set g_balance_laser_primary_force_velocitybias 0
-set g_balance_laser_primary_force_other_scale 1
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 35
-set g_balance_laser_secondary_edgedamage 10
-set g_balance_laser_secondary_force 400
-set g_balance_laser_secondary_radius 70
-set g_balance_laser_secondary_speed 9000
-set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.7
-set g_balance_laser_secondary_animtime 0.3
-set g_balance_laser_secondary_lifetime 30
-set g_balance_laser_secondary_shotangle 0
-set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1
-set g_balance_laser_secondary_force_velocitybias 0
-set g_balance_laser_secondary_force_other_scale 1
-set g_balance_laser_reload_ammo 0 //default: 6
-set g_balance_laser_reload_time 2
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 10
-set g_balance_shotgun_primary_damage 5
-set g_balance_shotgun_primary_force 5
-set g_balance_shotgun_primary_spread 0.07
-set g_balance_shotgun_primary_refire 0.8
-set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_primary_speed 12000
-set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary 1
-set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
-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_melee_no_doubleslap 1
-set g_balance_shotgun_secondary_melee_nonplayerdamage 0
-set g_balance_shotgun_secondary_melee_multihit 1
-set g_balance_shotgun_secondary_damage 110
-set g_balance_shotgun_secondary_force 150
-set g_balance_shotgun_secondary_refire 1.1
-set g_balance_shotgun_secondary_animtime 1
-set g_balance_shotgun_reload_ammo 0 //default: 5
-set g_balance_shotgun_reload_time 2
-// }}}
-// {{{ uzi
-set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
-set g_balance_uzi_spread_min 0.02
-set g_balance_uzi_spread_max 0.6
-set g_balance_uzi_spread_add 0.008
-
-set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
-set g_balance_uzi_burst_animtime 0.4
-set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.4    // refire after burst
-set g_balance_uzi_burst_spread 0.03
-set g_balance_uzi_burst_damage 18              // 90 dps (but 90 dmg deliverd in .25s)
-set g_balance_uzi_burst_force 50
-set g_balance_uzi_burst_ammo 3
-
-set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 30
-set g_balance_uzi_first_headshotaddeddamage 0
-set g_balance_uzi_first_force 50
-set g_balance_uzi_first_spread 0.015
-set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 1
-
-set g_balance_uzi_sustained_damage 14  // 120 dps
-set g_balance_uzi_sustained_headshotaddeddamage 0
-set g_balance_uzi_sustained_force 12
-set g_balance_uzi_sustained_spread 0.02
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_uzi_speed 18000
-set g_balance_uzi_bulletconstant 115 // 13.1qu
-
-set g_balance_uzi_reload_ammo 0 //default: 30
-set g_balance_uzi_reload_time 2
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 50
-set g_balance_grenadelauncher_primary_edgedamage 30
-set g_balance_grenadelauncher_primary_force 250
-set g_balance_grenadelauncher_primary_radius 140
-set g_balance_grenadelauncher_primary_speed 2000
-set g_balance_grenadelauncher_primary_speed_up 200
-set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0
-set g_balance_grenadelauncher_primary_lifetime 30
-set g_balance_grenadelauncher_primary_lifetime2 1
-set g_balance_grenadelauncher_primary_refire 0.8
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_primary_health 25
-set g_balance_grenadelauncher_primary_damageforcescale 4
-set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
-
-set g_balance_grenadelauncher_secondary_type 1
-set g_balance_grenadelauncher_secondary_damage 60
-set g_balance_grenadelauncher_secondary_edgedamage 35
-set g_balance_grenadelauncher_secondary_force 300
-set g_balance_grenadelauncher_secondary_radius 140
-set g_balance_grenadelauncher_secondary_speed 1400
-set g_balance_grenadelauncher_secondary_speed_up 200
-set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime_bounce 0
-set g_balance_grenadelauncher_secondary_lifetime_stick 0
-set g_balance_grenadelauncher_secondary_refire 0.7
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 10
-set g_balance_grenadelauncher_secondary_damageforcescale 4
-set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
-
-set g_balance_grenadelauncher_bouncefactor 0.5
-set g_balance_grenadelauncher_bouncestop 0.075
-
-set g_balance_grenadelauncher_reload_ammo 0 //default: 12
-set g_balance_grenadelauncher_reload_time 2
-// }}}
-// {{{ minelayer
-set g_balance_minelayer_damage 35
-set g_balance_minelayer_edgedamage 30
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_lifetime_countdown 0
-set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.4
-set g_balance_minelayer_ammo 5
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 4 // 0 disables the limit
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-set g_balance_minelayer_reload_ammo 0 //default: 15
-set g_balance_minelayer_reload_time 2
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 0
-set g_balance_electro_primary_damage 35
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 150
-set g_balance_electro_primary_force_up 0
-set g_balance_electro_primary_radius 155
-set g_balance_electro_primary_comboradius 0
-set g_balance_electro_primary_speed 2000
-set g_balance_electro_primary_spread 0
-set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.65
-set g_balance_electro_primary_animtime 0.3
-set g_balance_electro_primary_ammo 2
-set g_balance_electro_primary_range 0
-set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
-set g_balance_electro_primary_falloff_maxdist 850
-set g_balance_electro_primary_falloff_halflifedist 425
-set g_balance_electro_secondary_damage 25
-set g_balance_electro_secondary_edgedamage 0
-set g_balance_electro_secondary_force 50
-set g_balance_electro_secondary_radius 25
-set g_balance_electro_secondary_speed 750
-set g_balance_electro_secondary_speed_up 150
-set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_spread 0.025
-set g_balance_electro_secondary_lifetime 5
-set g_balance_electro_secondary_refire 0.1
-set g_balance_electro_secondary_refire2 2
-set g_balance_electro_secondary_animtime 0.15
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 10
-set g_balance_electro_secondary_damageforcescale 2
-set g_balance_electro_secondary_damagedbycontents 0
-set g_balance_electro_secondary_count 3
-set g_balance_electro_secondary_bouncefactor 0.5
-set g_balance_electro_secondary_bouncestop 0.075
-set g_balance_electro_combo_damage 80
-set g_balance_electro_combo_edgedamage 10
-set g_balance_electro_combo_force 150
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_comboradius 0
-set g_balance_electro_combo_speed 1000
-set g_balance_electro_reload_ammo 0 //default: 20
-set g_balance_electro_reload_time 2
-// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 5
-set g_balance_crylink_primary_edgedamage 3
-set g_balance_crylink_primary_force 10
-set g_balance_crylink_primary_radius 15
-set g_balance_crylink_primary_speed 1500
-set g_balance_crylink_primary_spread 0.1
-set g_balance_crylink_primary_shots 8
-set g_balance_crylink_primary_bounces 1
-set g_balance_crylink_primary_refire 1
-set g_balance_crylink_primary_animtime 0.4
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0.1
-set g_balance_crylink_primary_jointime 0
-set g_balance_crylink_primary_joinexplode 1                            //if != 0 do a extra damage pass when projectiles join
-set g_balance_crylink_primary_joinexplode_damage 100   //Max demage (Determined by % of _primary_shots that joins)
-set g_balance_crylink_primary_joinexplode_edgedamage 20
-set g_balance_crylink_primary_joinexplode_radius 200
-set g_balance_crylink_primary_joinexplode_force 400
-set g_balance_crylink_primary_linkexplode 0
-
-set g_balance_crylink_primary_middle_lifetime 5 
-set g_balance_crylink_primary_middle_fadetime 0.25
-set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
-set g_balance_crylink_primary_other_fadetime 0.25
-
-set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 2
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -20
-set g_balance_crylink_secondary_radius 5
-set g_balance_crylink_secondary_speed 1600
-set g_balance_crylink_secondary_spread 0.03
-set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.15
-set g_balance_crylink_secondary_animtime 0.15
-set g_balance_crylink_secondary_ammo 1
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joindelay 0
-set g_balance_crylink_secondary_joinspread 0
-set g_balance_crylink_secondary_jointime 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_radius 0
-set g_balance_crylink_secondary_joinexplode_force 0
-set g_balance_crylink_secondary_linkexplode 0
-
-set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
-set g_balance_crylink_secondary_middle_fadetime 5
-set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
-set g_balance_crylink_secondary_line_fadetime 2
-set g_balance_crylink_reload_ammo 0 //default: 10
-set g_balance_crylink_reload_time 2
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 100
-set g_balance_nex_primary_force 600
-set g_balance_nex_primary_refire 1
-set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 0
-set g_balance_nex_primary_damagefalloff_maxdist 0
-set g_balance_nex_primary_damagefalloff_halflife 0
-set g_balance_nex_primary_damagefalloff_forcehalflife 0
-
-set g_balance_nex_secondary 1
-set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.55
-set g_balance_nex_secondary_chargepool 0
-set g_balance_nex_secondary_chargepool_regen 0.15
-set g_balance_nex_secondary_chargepool_pause_regen 1
-set g_balance_nex_secondary_chargepool_pause_health_regen 1
-set g_balance_nex_secondary_damage 100
-set g_balance_nex_secondary_force 600
-set g_balance_nex_secondary_refire 1.5
-set g_balance_nex_secondary_animtime 0.3
-set g_balance_nex_secondary_ammo 5
-set g_balance_nex_secondary_damagefalloff_mindist 0
-set g_balance_nex_secondary_damagefalloff_maxdist 0
-set g_balance_nex_secondary_damagefalloff_halflife 0
-set g_balance_nex_secondary_damagefalloff_forcehalflife 0
-
-set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 10
-set g_balance_nex_charge_start 0
-set g_balance_nex_charge_rate 0.35
-set g_balance_nex_charge_animlimit 0.5
-set g_balance_nex_charge_limit 0.5
-set g_balance_nex_charge_rot_rate 0.1
-set g_balance_nex_charge_rot_pause 1 // Dont rot down until this long after release of charge button
-set g_balance_nex_charge_shot_multiplier 0
-set g_balance_nex_charge_velocity_rate 0
-set g_balance_nex_charge_minspeed 400
-set g_balance_nex_charge_maxspeed 1000
-
-set g_balance_nex_reload_ammo 0 //default: 25
-set g_balance_nex_reload_time 2
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-set g_balance_minstanex_laser_ammo 0
-set g_balance_minstanex_reload_ammo 0 //default: 50
-set g_balance_minstanex_reload_time 2
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 25
-set g_balance_hagar_primary_edgedamage 5
-set g_balance_hagar_primary_force 70
-set g_balance_hagar_primary_health 0
-set g_balance_hagar_primary_damageforcescale 0
-set g_balance_hagar_primary_radius 60
-set g_balance_hagar_primary_spread 0.010
-set g_balance_hagar_primary_speed 2500
-set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.2
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 0
-set g_balance_hagar_secondary_load_speed 0.6
-set g_balance_hagar_secondary_load_spread 0.075
-set g_balance_hagar_secondary_load_spread_bias 0.5
-set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 0
-set g_balance_hagar_secondary_load_releasedeath 1
-set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_load_linkexplode 0
-set g_balance_hagar_secondary_load_animtime 0.2
-set g_balance_hagar_secondary_damage 30
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 50
-set g_balance_hagar_secondary_health 0
-set g_balance_hagar_secondary_damageforcescale 0
-set g_balance_hagar_secondary_radius 65
-set g_balance_hagar_secondary_spread 0.015
-set g_balance_hagar_secondary_speed 1400
-set g_balance_hagar_secondary_lifetime_min 30
-set g_balance_hagar_secondary_lifetime_rand 0
-set g_balance_hagar_secondary_refire 0.15
-set g_balance_hagar_secondary_ammo 1
-set g_balance_hagar_reload_ammo 0 //default: 25
-set g_balance_hagar_reload_time 2
-// }}}
-// {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 120
-set g_balance_rocketlauncher_edgedamage 25
-set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 130
-set g_balance_rocketlauncher_speed 900
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 900
-set g_balance_rocketlauncher_lifetime 9
-set g_balance_rocketlauncher_refire 1.2
-set g_balance_rocketlauncher_animtime 0.4
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 10
-set g_balance_rocketlauncher_damageforcescale 0
-set g_balance_rocketlauncher_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 25 // max degrees per second
-set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
-set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
-set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
-set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 90
-set g_balance_rocketlauncher_remote_edgedamage 20
-set g_balance_rocketlauncher_remote_radius 125
-set g_balance_rocketlauncher_remote_force 350
-set g_balance_rocketlauncher_reload_ammo 0 //default: 25
-set g_balance_rocketlauncher_reload_time 2
-// }}}
-// {{{ porto
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.3
-set g_balance_porto_primary_speed 2000
-set g_balance_porto_primary_lifetime 30
-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
-// }}}
-// {{{ hook
-set g_balance_hook_primary_fuel 5 // hook monkeys set 0
-set g_balance_hook_primary_refire 0 // hook monkeys set 0
-set g_balance_hook_primary_animtime 0.3 // good shoot anim
-set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
-set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 500 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 50 // a whole pack
-set g_balance_hook_secondary_lifetime 5 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.3 // good shoot anim
-set g_balance_hook_secondary_power 3 // effect behaves like a square function
-set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
-set g_balance_hook_secondary_health 0
-set g_balance_hook_secondary_damageforcescale 0 
-// }}}
-// {{{ hlac
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.6
-set g_balance_hlac_primary_spread_add 0.01
-set g_balance_hlac_primary_spread_crouchmod 0.5
-
-set g_balance_hlac_primary_damage 22
-set g_balance_hlac_primary_edgedamage 2
-set g_balance_hlac_primary_force -100
-set g_balance_hlac_primary_radius 100
-set g_balance_hlac_primary_speed 15000
-set g_balance_hlac_primary_lifetime 3
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.4
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.2
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 3
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 50
-set g_balance_hlac_secondary_speed 15000
-set g_balance_hlac_secondary_lifetime 3
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.7
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
-
-set g_balance_hlac_reload_ammo 0 //default: 20
-set g_balance_hlac_reload_time 2
-// }}}
-// {{{ rifle
-set g_balance_rifle_bursttime 0
-set g_balance_rifle_primary_tracer 1
-set g_balance_rifle_primary_shots 1
-set g_balance_rifle_primary_damage 40
-set g_balance_rifle_primary_headshotaddeddamage 100
-set g_balance_rifle_primary_spread 0
-set g_balance_rifle_primary_force 2
-set g_balance_rifle_primary_speed 40000
-set g_balance_rifle_primary_lifetime 5
-set g_balance_rifle_primary_refire 0.65
-set g_balance_rifle_primary_animtime 0.6
-set g_balance_rifle_primary_ammo 10
-set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_rifle_primary_burstcost 0
-set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_rifle_secondary 1
-set g_balance_rifle_secondary_reload 0
-set g_balance_rifle_secondary_tracer 0
-set g_balance_rifle_secondary_shots 1
-set g_balance_rifle_secondary_damage 50
-set g_balance_rifle_secondary_headshotaddeddamage 50 // 50 damage only on head
-set g_balance_rifle_secondary_spread 0
-set g_balance_rifle_secondary_force 2
-set g_balance_rifle_secondary_speed 20000
-set g_balance_rifle_secondary_lifetime 5
-set g_balance_rifle_secondary_refire 1.5
-set g_balance_rifle_secondary_animtime 0.6
-set g_balance_rifle_secondary_ammo 10
-set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_rifle_secondary_burstcost 0
-set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_rifle_reload_ammo 80 //default: 80
-set g_balance_rifle_reload_time 2
-// }}}
-// {{{ tuba
-set g_balance_tuba_refire 0.05
-set g_balance_tuba_animtime 0.05
-set g_balance_tuba_attenuation 0.5
-set g_balance_tuba_volume 1
-set g_balance_tuba_fadetime 0.25
-set g_balance_tuba_damage 5
-set g_balance_tuba_edgedamage 0
-set g_balance_tuba_radius 200
-set g_balance_tuba_force 40
-set g_balance_tuba_pitchstep 6
-// }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 40
-set g_balance_fireball_primary_animtime 0.15
-set g_balance_fireball_primary_bfgdamage 150
-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 4
-set g_balance_fireball_primary_edgedamage 0
-set g_balance_fireball_primary_force 700
-set g_balance_fireball_primary_health 50
-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 5
-set g_balance_fireball_primary_refire2 0
-set g_balance_fireball_primary_speed 650
-set g_balance_fireball_primary_spread 0
-set g_balance_fireball_secondary_ammo 5
-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_force 100
-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 2
-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_reload_ammo 0 //default: 60
-set g_balance_fireball_reload_time 2
-// }}}
-// {{{ seeker
-set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
-set g_balance_seeker_flac_ammo 0.5
-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.05
-set g_balance_seeker_flac_lifetime_rand 0.02
-set g_balance_seeker_flac_radius 100
-set g_balance_seeker_flac_refire 0.1
-set g_balance_seeker_flac_speed 5000
-set g_balance_seeker_flac_speed_up 500
-set g_balance_seeker_flac_speed_z 0
-set g_balance_seeker_flac_spread 0.25
-set g_balance_seeker_missile_accel 1400
-set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.3
-set g_balance_seeker_missile_count 4
-set g_balance_seeker_missile_damage 50
-set g_balance_seeker_missile_damageforcescale 2
-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 250
-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_up 300
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1400
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.3
-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 1
-set g_balance_seeker_tag_speed 9000
-set g_balance_seeker_tag_spread 0
-set g_balance_seeker_tag_tracker_lifetime 10
-set g_balance_seeker_reload_ammo 0 //default: 15
-set g_balance_seeker_reload_time 2
-// End new seeker
index 3dc3222838a62f969b6ff0b218439b15bb6eb3e9..99882291aff6a2894c1e0cd8ff44c0531d840df7 100755 (executable)
@@ -3,7 +3,7 @@
 case "$1" in
        pot)
                mode=pot
-               mail=true
+               mail=false
                ;;
        po)
                mode=po
@@ -38,7 +38,12 @@ for VM in menu csprogs; do
                {
                        find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
                        find qcsrc/common -type f -not -name \*.po -not -name \*.txt
-                       find qcsrc/server -type f -name w_\*.qc
+                       if [ x"$VM" = x"csprogs" ]; then
+                               find qcsrc/server -type f -name w_\*.qc
+                       elif [ x"$VM" = x"menu" ]; then
+                               find qcsrc/server -type f -name w_\*.qc | xargs grep ^REGISTER_WEAPON > weapons.qc.tmp
+                               echo "weapons.qc.tmp"
+                       fi
                } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
        fi
 
diff --git a/commands.cfg b/commands.cfg
new file mode 100644 (file)
index 0000000..d5ad783
--- /dev/null
@@ -0,0 +1,293 @@
+// =================================================================
+//  Master config for managing various command aliases and settings
+// =================================================================
+
+// Execute commands based on whether it is dedicated a server or a client.
+alias "_detect_dedicated_$qport" "${* asis}"
+alias "_detect_dedicated_0" ""
+alias _if_dedicated "_detect_dedicated_$qport ${* asis}"
+alias if_client "${* asis}"
+alias if_dedicated "${* asis}"
+_if_dedicated alias if_client ""
+if_client alias if_dedicated ""
+
+if_dedicated "alias" qc_cmd_sv     "sv_cmd $$*"
+if_client    "alias" qc_cmd_sv     "echo This command only works on servers: sv_cmd $${* !}"
+if_dedicated "alias" qc_cmd_cl     "echo This command only works on clients: cl_cmd $${* !}"
+if_client    "alias" qc_cmd_cl     "cl_cmd $$*"
+if_dedicated "alias" qc_cmd_cmd    "echo This command only works on clients: cmd $${* !}"
+if_client    "alias" qc_cmd_cmd    "cmd $$*"
+
+if_dedicated "alias" qc_cmd_svmenu "sv_cmd $$*"
+if_client    "alias" qc_cmd_svmenu "menu_cmd $$*"
+if_dedicated "alias" qc_cmd_svcl   "sv_cmd $$*"
+if_client    "alias" qc_cmd_svcl   "cl_cmd $$*"
+if_dedicated "alias" qc_cmd_svcmd  "sv_cmd $$*"
+if_client    "alias" qc_cmd_svcmd  "cmd $$*"
+
+if_dedicated "alias" help "sv_cmd help"
+if_client    "alias" help "cl_cmd help; cmd help"
+
+
+// ========
+//  common
+// ========
+// networked/server common commands
+alias cvar_changes         "qc_cmd_svcmd  cvar_changes         ${* ?}" // Prints a list of all changed server cvars
+alias cvar_purechanges     "qc_cmd_svcmd  cvar_purechanges     ${* ?}" // Prints a list of all changed gameplay cvars
+alias info                 "qc_cmd_svcmd  info                 ${* ?}" // Request for unique server information set up by admin
+alias ladder               "qc_cmd_svcmd  ladder               ${* ?}" // Get information about top players if supported
+alias lsmaps               "qc_cmd_svcmd  lsmaps               ${* ?}" // List maps which can be used with the current game mode
+alias lsnewmaps            "qc_cmd_svcmd  lsnewmaps            ${* ?}" // List maps which have no records or are seemingly unplayed yet
+alias printmaplist         "qc_cmd_svcmd  printmaplist         ${* ?}" // Display full server maplist reply
+alias rankings             "qc_cmd_svcmd  rankings             ${* ?}" // Print information about rankings
+alias records              "qc_cmd_svcmd  records              ${* ?}" // List top 10 records for the current map
+alias teamstatus           "qc_cmd_svcmd  teamstatus           ${* ?}" // Show information about player and team scores
+alias time                 "qc_cmd_svcmd  time                 ${* ?}" // Print different formats/readouts of time
+alias timein               "qc_cmd_svcmd  timein               ${* ?}" // Resume the game from being paused with a timeout
+alias timeout              "qc_cmd_svcmd  timeout              ${* ?}" // Call a timeout which pauses the game for certain amount of time unless unpaused
+alias vote                 "qc_cmd_svcmd  vote                 ${* ?}" // Request an action to be voted upon by players
+alias who                  "qc_cmd_svcmd  who                  ${* ?}" // Display detailed client information about all players
+
+// generic commands (across all programs)
+alias addtolist            "qc_cmd_svmenu addtolist            ${* ?}" // Add a string to a cvar
+alias dumpcommands         "qc_cmd_svmenu dumpcommands         ${* ?}" // Dump all commands on the program to *_cmd_dump.txt
+alias maplist              "qc_cmd_svmenu maplist              ${* ?}" // Automatic control of maplist
+alias removefromlist       "qc_cmd_svmenu removefromlist       ${* ?}" // Remove a string from a cvar
+alias rpn                  "qc_cmd_svmenu rpn                  ${* ?}" // RPN calculator
+//alias settemp            "qc_cmd_svmenu settemp              ${* ?}" // Temporarily set a value to a cvar which is restored later
+//alias settemp_restore    "qc_cmd_svmenu settemp_restore      ${* ?}" // Restore all cvars set by settemp command
+
+// other aliases for common commands
+alias g_hitplots_add "qc_cmd_svmenu rpn /g_hitplots_individuals g_hitplots_individuals ${1 !} union def"
+alias g_hitplots_remove "qc_cmd_svmenu rpn /g_hitplots_individuals g_hitplots_individuals ${1 !} difference def"
+
+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_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
+
+alias addfav "qc_cmd_svmenu addtolist net_slist_favorites ${* ?}"
+alias addvote "qc_cmd_svmenu addtolist sv_vote_commands ${* ?}"
+
+
+// ========================
+//  engine command aliases
+// ========================
+alias bsp "ls maps/*.bsp"
+alias chmap "changelevel ${* ?}"
+alias clearmap "disconnect"
+alias ply "playdemo $1"
+alias rec "record demos/${1 !}"
+alias search "apropos ${* ?}"
+alias sv_loadconfig "exec $serverconfig"
+alias sv_restart "say \"Server will restart at the end of the match, you will all be reconnected automatically. ${* ?} \"; quit_and_redirect self"
+alias tdem "timedemo $1"
+
+
+// ===============================================
+//  menu_cmd (menu command) - menu/command/menu_cmd.qc
+// ===============================================
+alias menu_showteamselect "menu_cmd directmenu TeamSelect"
+alias menu_showhudexit "menu_cmd directmenu HUDExit"
+alias menu_showhudoptions "menu_cmd directpanelhudmenu ${* ?}"
+alias menu_showsandboxtools "menu_cmd directmenu SandboxTools"
+alias menu_showquitdialog "menu_cmd directmenu Quit"
+
+// command executed before loading a map by the menu
+// makes sure maxplayers is at least minplayers or bot_number + 1
+alias _menu_loadmap_prepare_maxpl "maxplayers $_menu_loadmap_maxplayers"
+alias menu_loadmap_prepare "disconnect; wait; g_campaign 0; menu_cmd rpn /_menu_loadmap_maxplayers menu_maxplayers minplayers bot_number 1 add max max def; _menu_loadmap_prepare_maxpl; g_maplist_shufflenow"
+
+
+// ==========================================================
+//  cl_cmd (client local command) - client/command/cl_cmd.qc
+// ==========================================================
+// commented out commands are really only intended for internal use
+alias blurtest             "qc_cmd_cl     blurtest             ${* ?}" // Feature for testing blur postprocessing
+alias debugmodel           "qc_cmd_cl     debugmodel           ${* ?}" // Spawn a debug model manually
+//alias handlevote         "qc_cmd_cl     handlevote           ${* ?}" // System to handle selecting a vote or option
+alias hud                  "qc_cmd_cl     hud                  ${* ?}" // Commands regarding/controlling the HUD system
+alias localprint           "qc_cmd_cl     localprint           ${* ?}" // Create your own centerprint sent to yourself
+//alias mv_download        "qc_cmd_cl     mv_download          ${* ?}" // Retrieve mapshot picture from the server
+alias sendcvar             "qc_cmd_cl     sendcvar             ${* ?}" // Send a cvar to the server (like weaponpriority)
+//alias vyes               "qc_cmd_cl     vyes                 ${* ?}" // COMPATIBILITY COMMAND FOR 0.5 CLIENTS
+//alias vno                "qc_cmd_cl     vno                  ${* ?}" // COMPATIBILITY COMMAND FOR 0.5 CLIENTS
+
+// other aliases for local commands
+alias hud_configure "qc_cmd_cl hud configure"
+alias hud_save "qc_cmd_cl hud save ${* ?}"
+alias radar "qc_cmd_cl hud radar ${* ?}"
+alias scoreboard_columns_help "qc_cmd_cl hud scoreboard_columns_help"
+alias scoreboard_columns_set "qc_cmd_cl hud scoreboard_columns_set ${* ?}"
+
+// changes a cvar and reports it to the server (for the client to notify the server about changes)
+alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
+
+
+// ========================================================
+//  cmd (client-to-server command) - server/command/cmd.qc
+// ========================================================
+set sv_clientcommand_antispam_time 1 "Amount of seconds after a command before another command can be called again without being considered spam. (Use -1 for no antispam limit)"
+set sv_clientcommand_antispam_count 8 "Amount of commands considered spam before commands are rejected."
+seta sv_status_privacy 1 "hide IP addresses from \"status\" and \"who\" replies shown to clients"
+seta cl_autoswitch 1 "automatically switch to newly picked up weapons if they are better than what you are carrying"
+
+// commented out commands are really only intended for internal use, or already have declaration in the engine
+alias autoswitch           "qc_cmd_cmd    autoswitch           ${* ?}" // Whether or not to switch automatically when getting a better weapon
+alias checkfail            "qc_cmd_cmd    checkfail            ${* ?}" // Report if a client-side check failed
+alias clientversion        "qc_cmd_cmd    clientversion        ${* ?}" // Release version of the game
+//alias mv_getpicture      "qc_cmd_cmd    mv_getpicture        ${* ?}" // Retrieve mapshot picture from the server
+alias join                 "qc_cmd_cmd    join                 ${* ?}" // Become a player in the game
+alias ready                "qc_cmd_cmd    ready                ${* ?}" // Qualify as ready to end warmup stage (or restart server if allowed)
+alias reportcvar           "qc_cmd_cmd    reportcvar           ${* ?}" // Old system for sending a client cvar to the server
+//alias say                "qc_cmd_cmd    say                  ${* ?}" // Print a message to chat to all players
+//alias say_team           "qc_cmd_cmd    say_team             ${* ?}" // Print a message to chat to all team mates
+alias selectteam           "qc_cmd_cmd    selectteam           ${* ?}" // Attempt to choose a team to join into
+alias selfstuff            "qc_cmd_cmd    selfstuff            ${* ?}" // Stuffcmd a command to your own client
+alias sentcvar             "qc_cmd_cmd    sentcvar             ${* ?}" // New system for sending a client cvar to the server
+alias spectate             "qc_cmd_cmd    spectate             ${* ?}" // Become an observer
+alias suggestmap           "qc_cmd_cmd    suggestmap           ${* ?}" // Suggest a map to the mapvote at match end
+//alias tell               "qc_cmd_cmd    tell                 ${* ?}" // Send a message directly to a player
+alias voice                "qc_cmd_cmd    voice                ${* ?}" // Send voice message via sound
+
+// other aliases for client-to-server commands
+alias autoswitch "set cl_autoswitch ${1 ?} ; cmd autoswitch ${1 ?}" // todo
+
+alias team_red "cmd selectteam red; cmd join"
+alias team_blue "cmd selectteam blue; cmd join"
+alias team_pink "cmd selectteam pink; cmd join"
+alias team_yellow "cmd selectteam yellow; cmd join"
+alias team_auto "cmd selectteam auto; cmd join"
+
+alias spec "spectate"
+
+// mutator aliases
+alias sandbox "cmd g_sandbox ${* ?}"
+
+
+// ============================================================
+//  sv_cmd (server console command) - server/command/sv_cmd.qc
+// ============================================================
+alias adminmsg             "qc_cmd_sv     adminmsg             ${* ?}" // Send an admin message to a client directly
+alias allready             "qc_cmd_sv     allready             ${* ?}" // Restart the server and reset the players
+alias allspec              "qc_cmd_sv     allspec              ${* ?}" // Force all players to spectate
+alias anticheat            "qc_cmd_sv     anticheat            ${* ?}" // Create an anticheat report for a client
+alias bbox                 "qc_cmd_sv     bbox                 ${* ?}" // Print detailed information about world size
+alias bot_cmd              "qc_cmd_sv     bot_cmd              ${* ?}" // Control and send commands to bots
+alias cointoss             "qc_cmd_sv     cointoss             ${* ?}" // Flip a virtual coin and give random result
+alias database             "qc_cmd_sv     database             ${* ?}" // Extra controls of the serverprogs database
+alias defer_clear          "qc_cmd_sv     defer_clear          ${* ?}" // Clear all queued defer commands for a specific client
+alias defer_clear_all      "qc_cmd_sv     defer_clear_all      ${* ?}" // Clear all queued defer commands for all clients
+alias delrec               "qc_cmd_sv     delrec               ${* ?}" // Delete race time record for a map
+alias effectindexdump      "qc_cmd_sv     effectindexdump      ${* ?}" // Dump list of effects from code and effectinfo.txt
+alias extendmatchtime      "qc_cmd_sv     extendmatchtime      ${* ?}" // Increase the timelimit value incrementally
+alias find                 "qc_cmd_sv     find                 ${* ?}" // Search through entities for matching classname
+alias gametype             "qc_cmd_sv     gametype             ${* ?}" // Simple command to change the active gametype
+alias gettaginfo           "qc_cmd_sv     gettaginfo           ${* ?}" // Get specific information about a weapon model
+alias gotomap              "qc_cmd_sv     gotomap              ${* ?}" // Simple command to switch to another map
+alias lockteams            "qc_cmd_sv     lockteams            ${* ?}" // Disable the ability for players to switch or enter teams
+alias make_mapinfo         "qc_cmd_sv     make_mapinfo         ${* ?}" // Automatically rebuild mapinfo files
+alias moveplayer           "qc_cmd_sv     moveplayer           ${* ?}" // Change the team/status of a player
+alias nospectators         "qc_cmd_sv     nospectators         ${* ?}" // Automatically remove spectators from a match
+alias playerdemo           "qc_cmd_sv     playerdemo           ${* ?}" // Control the ability to save demos of players
+alias printstats           "qc_cmd_sv     printstats           ${* ?}" // Dump eventlog player stats and other score information
+alias radarmap             "qc_cmd_sv     radarmap             ${* ?}" // Generate a radar image of the map
+alias reducematchtime      "qc_cmd_sv     reducematchtime      ${* ?}" // Decrease the timelimit value incrementally
+alias setbots              "qc_cmd_sv     setbots              ${* ?}" // Adjust how many bots are in the match
+alias shuffleteams         "qc_cmd_sv     shuffleteams         ${* ?}" // Randomly move players to different teams
+alias stuffto              "qc_cmd_sv     stuffto              ${* ?}" // Send a command to be executed on a client
+alias trace                "qc_cmd_sv     trace                ${* ?}" // Various debugging tools with tracing
+alias unlockteams          "qc_cmd_sv     unlockteams          ${* ?}" // Enable the ability for players to switch or enter teams
+alias warp                 "qc_cmd_sv     warp                 ${* ?}" // Choose different level in campaign
+
+// other aliases for server commands
+alias endmatch "timelimit -1"
+
+alias savedb "sv_cmd database save \"${1 ?}\""
+alias dumpdb "sv_cmd database dump \"${1 ?}\""
+alias loaddb "sv_cmd database load \"${1 ?}\""
+
+alias movetored "moveplayer ${1 ?} red"
+alias movetoblue "moveplayer ${1 ?} blue"
+alias movetopink "moveplayer ${1 ?} pink"
+alias movetoyellow "moveplayer ${1 ?} yellow"
+alias movetoauto "moveplayer ${1 ?} auto"
+
+
+// =======================================================
+//  Aliases for settemp subsystem. Warning: Do not touch. 
+//  Usage: settemp variable value, next map resets it.
+// =======================================================
+alias settemp "qc_cmd_svcl settemp $$*"
+alias settemp_restore "qc_cmd_svcl settemp_restore"
+
+
+// ===================================
+//  banning - server/command/ipban.qc
+// ===================================
+alias ban                  "qc_cmd_sv     ban                  ${* ?}" // Ban an IP address or a range of addresses (like 1.2.3)
+alias banlist              "qc_cmd_sv     banlist              ${* ?}" // List all existing bans
+alias kickban              "qc_cmd_sv     kickban              ${* ?}" // Disconnect a client and ban it at the same time
+alias unban                "qc_cmd_sv     unban                ${* ?}" // Remove an existing ban
+
+// other aliases for ban commands
+alias bans "banlist"
+
+
+// =================================
+//  voting - server/command/vote.qc
+// =================================
+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" "these commands can be voted"
+set sv_vote_only_commands ""
+set sv_vote_master_commands "movetored movetoblue movetoyellow movetopink" "Commands which vote masters can execute by themselves" // maybe add kickban here (but then sv_vote_master 0)
+set sv_vote_master 1   "Allows the use of the vote master system"
+set sv_vote_master_callable 1 "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_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"
+set sv_vote_timeout 30 "a vote will timeout after this many seconds"
+set sv_vote_wait 120   "a player can not call a vote again for this many seconds when his vote was not accepted"
+set sv_vote_stop 15    "a player can not call a vote again for this many seconds when he stopped this vote (e.g. to correct it)"
+set sv_vote_majority_factor 0.5        "What percentage of the PLAYERS constitute a majority? (Must be at least 0.5, recommended: 0.5)"
+set sv_vote_majority_factor_of_voted 0.5 "What percentage of the VOTERS constitute a majority too? (Must be at least 0.5, recommended: 0.5)"
+// when disabled, don't allow game type changes "note: set these two equal to JUST support simple majorities"
+set sv_vote_override_mostrecent 0
+
+alias vhelp "cmd vote help"
+alias vstatus "cmd vote status"
+alias vcall "cmd vote call ${* ?}"
+alias vstop "cmd vote stop"
+alias vmaster "cmd vote master"
+alias vlogin "cmd vote login ${* ?}"
+alias vdo "cmd vote do ${* ?}"
+alias vyes "cl_cmd handlevote yes"
+alias vno "cl_cmd handlevote no"
+alias vdontcare "cmd vote dontcare"
+alias vabstain "cmd vote abstain"
+
+alias vmap "vcall gotomap ${1 ?}"
+alias vnextmap "vcall nextmap ${1 ?}"
+alias vkick "vcall kick ${1 ?}"
+alias vkickban "vcall kickban ${1 ?}"
+alias vend "vcall endmatch"
+alias vdomap "vdo gotomap ${1 ?}"
+alias vdokick "vdo kick ${* ?}"
+alias vdokickban "vdo kickban ${* ?}"
+alias vdoend "vdo endmatch"
+
+// ======================
+//  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"
+
+// =============================
+//  other miscellaneous aliases
+// =============================
+alias autoscreenshot "screenshot screenshots/autoscreenshot/${1 !}-${2 !}.jpg; echo \"^5A screenshot has been taken at request of the server.\""
+
index 52a844f0b917c5232d80a1ccd44d9296dacd0ca9..a53553547acbfabf329fe7c370b8e4a4dcf255b7 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-12 12:24+0200\n"
+"POT-Creation-Date: 2011-12-25 22:57+0100\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -20,7 +20,7 @@ msgstr ""
 msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
 msgstr "FEHLER - MENÜ IST SICHTBAR ABER KEIN MENÜ WURDE DEFINIERT!"
 
-#: qcsrc/client/Main.qc:56
+#: qcsrc/client/Main.qc:104
 msgid ""
 "^3Your engine build is outdated\n"
 "^3This Server uses a newer QC VM. Please update!\n"
@@ -28,53 +28,62 @@ msgstr ""
 "^3Diese Engine ist veraltet.\n"
 "^3Dieser Server verwendet eine neuere QC VM. Bitte updaten!\n"
 
-#: qcsrc/client/Main.qc:66
+#: qcsrc/client/Main.qc:114
 #, c-format
 msgid "^4CSQC Build information: ^1%s\n"
 msgstr "^4CSQC Build-Information: ^1%s (deutsch)\n"
 
-#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
+#: qcsrc/client/Main.qc:293 qcsrc/client/Main.qc:309
 #, c-format
 msgid "trying to switch to unsupported team %d\n"
 msgstr "es wurde versucht, in das nicht unterstützte Team %d zu wechseln"
 
-#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
+#: qcsrc/client/Main.qc:424 qcsrc/client/scoreboard.qc:241
 msgid "Usage:\n"
 msgstr "Syntax:\n"
 
-#: qcsrc/client/Main.qc:370
+#: qcsrc/client/Main.qc:425
 msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
 msgstr "hud_save configname   (speichert als hud_skinname_configname.cfg)\n"
 
-#: qcsrc/client/Main.qc:494
+#: qcsrc/client/Main.qc:549
 msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
 msgstr "Syntax: cl_cmd BEFEHL..., wobei mögliche Befehle sind:\n"
 
-#: qcsrc/client/Main.qc:495
+#: qcsrc/client/Main.qc:550
 msgid "  settemp cvar value\n"
 msgstr "  settemp Cvar Wert\n"
 
-#: qcsrc/client/Main.qc:496
+#: qcsrc/client/Main.qc:551
 msgid "  scoreboard_columns_set ...\n"
 msgstr "  scoreboard_columns_set ...\n"
 
-#: qcsrc/client/Main.qc:497
+#: qcsrc/client/Main.qc:552
 msgid "  scoreboard_columns_help\n"
 msgstr "  scoreboard_columns_help\n"
 
-#: qcsrc/client/Main.qc:726
+#: qcsrc/client/Main.qc:788
 #, c-format
 msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
 msgstr ""
 "Ein CSQC-Entity hat seinen Besitzer gewechselt! (edict: %d, classname: %s)\n"
 
-#: qcsrc/client/Main.qc:964
+#: qcsrc/client/Main.qc:1029
 #, c-format
-msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+msgid ""
+"A CSQC entity changed its type! (edict: %d, server: %d, type: %d -> %d)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Typ gewechselt! (edict: %d, server: %d, type: %d -"
+"> %d)\n"
+
+#: qcsrc/client/Main.qc:1038
+#, c-format
+msgid ""
+"A CSQC entity appeared out of nowhere! (edict: %d, server: %d, type: %d)\n"
 msgstr ""
-"Ein CSQC-Entity hat seinen Typ gewechselt! (edict: %d, classname: %s)\n"
+"Ein CSQC-Entity kam aus dem Nichts! (edict: %d, server: %d, type: %d)\n"
 
-#: qcsrc/client/Main.qc:1005
+#: qcsrc/client/Main.qc:1080
 #, c-format
 msgid ""
 "Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
@@ -83,69 +92,52 @@ msgstr ""
 "Unbekannter Entity-Typ in CSQC_Ent_Update (enttype: %d, edict: %d, "
 "classname: %s)\n"
 
-#: qcsrc/client/Main.qc:1451
+#: qcsrc/client/Main.qc:1526
 #, c-format
 msgid "%s (not bound)"
 msgstr "%s (nicht zugewiesen)"
 
-#: qcsrc/client/Main.qc:1456 qcsrc/client/hud.qc:230
+#: qcsrc/client/Main.qc:1531 qcsrc/client/hud.qc:230
 #, c-format
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: qcsrc/client/ctf.qc:35
-msgid "----- Order Menu -----"
-msgstr "----- Auftragsmenü -----"
+#: qcsrc/client/announcer.qc:31
+msgid "^1Begin!"
+msgstr "^1Los!"
 
-#: qcsrc/client/ctf.qc:36
+#: qcsrc/client/announcer.qc:41
 #, c-format
-msgid "Order: %s"
-msgstr "Auftrag: %s"
-
-#: qcsrc/client/ctf.qc:37
-msgid "1) ^3previous page"
-msgstr "1) ^3vorherige Seite"
+msgid "^1Game starts in %d seconds"
+msgstr "^1Das Spiel startet in %d Sekunden"
 
-#: qcsrc/client/ctf.qc:38
-msgid "2) ^3next page"
-msgstr "2) ^3nächste Seite"
+#: qcsrc/client/announcer.qc:153
+msgid "^1RED^7 flag"
+msgstr "^1ROTE^7 Flagge"
 
-#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
-msgid "ESC) Exit Menu"
-msgstr "ESC) Menü verlassen"
+#: qcsrc/client/announcer.qc:158
+msgid "^4BLUE^7 flag"
+msgstr "^4BLAUE^7 Flagge"
 
-#: qcsrc/client/ctf.qc:126
+#: qcsrc/client/announcer.qc:166
 #, c-format
-msgid "Couldn't find player %d\n"
-msgstr "Kann Spieler %d nicht finden\n"
-
-#: qcsrc/client/ctf.qc:154
-msgid "----- Command Menu -----"
-msgstr "---- Befehlsmenü -----"
-
-#: qcsrc/client/ctf.qc:155
-msgid "Issue orders:"
-msgstr "Auftrag geben:"
-
-#: qcsrc/client/ctf.qc:156
-msgid " 1) Attack"
-msgstr " 1) Angreifen"
-
-#: qcsrc/client/ctf.qc:158
-msgid " 2) Defend"
-msgstr " 2) Verteidigen"
+msgid "You picked up the %s!"
+msgstr "Du hast die %s genommen!"
 
-#: qcsrc/client/ctf.qc:160
-msgid "3) Resign from command."
-msgstr "3) Befehlsgewalt abgeben."
+#: qcsrc/client/announcer.qc:170
+#, c-format
+msgid "You got the %s!"
+msgstr "Du hast die %s!"
 
-#: qcsrc/client/ctf.qc:212
-msgid "You're commander!"
-msgstr "Sie sind Befehlshaber!"
+#: qcsrc/client/csqcmodel_hooks.qc:17
+#, c-format
+msgid "Trying to use non existing model %s. "
+msgstr "Modell %s existiert nicht! "
 
-#: qcsrc/client/ctf.qc:215
-msgid "Awaiting orders..."
-msgstr "Warten auf Auftrag..."
+#: qcsrc/client/csqcmodel_hooks.qc:19
+#, c-format
+msgid "Reverted to %s.\n"
+msgstr "Es wird stattdessen %s verwendet.\n"
 
 #: qcsrc/client/hud.qc:160
 msgid "1st"
@@ -192,443 +184,505 @@ msgstr "Zwischenzeit %d"
 msgid "%s (%s %s)"
 msgstr "%s (%s %s)"
 
-#: qcsrc/client/hud.qc:772
+#: qcsrc/client/hud.qc:786
 msgid "Out of ammo"
 msgstr "Keine Munition mehr."
 
-#: qcsrc/client/hud.qc:776
+#: qcsrc/client/hud.qc:790
 msgid "Don't have"
 msgstr "nicht vorhanden"
 
-#: qcsrc/client/hud.qc:780
+#: qcsrc/client/hud.qc:794
 msgid "Unavailable"
 msgstr "nicht verfügbar"
 
-#: qcsrc/client/hud.qc:1520
+#: qcsrc/client/hud.qc:1534
 #, c-format
 msgid "^1%s^1 couldn't take it anymore\n"
 msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
 
-#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
+#: qcsrc/client/hud.qc:1538 qcsrc/client/hud.qc:1887
 #, c-format
 msgid "^1%s^1 died\n"
 msgstr "^1%s^1 ist gestorben\n"
 
-#: qcsrc/client/hud.qc:1528
+#: qcsrc/client/hud.qc:1542
 #, c-format
 msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
 
-#: qcsrc/client/hud.qc:1532
+#: qcsrc/client/hud.qc:1546
 #, c-format
 msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
 
-#: qcsrc/client/hud.qc:1536
+#: qcsrc/client/hud.qc:1550
 #, c-format
 msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
 
-#: qcsrc/client/hud.qc:1540
+#: qcsrc/client/hud.qc:1554
 #, c-format
 msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:1544
+#: qcsrc/client/hud.qc:1558
 #, c-format
 msgid "^1%s^1 burned to death\n"
 msgstr "^1%s^1 brannte zu Tode\n"
 
-#: qcsrc/client/hud.qc:1548
+#: qcsrc/client/hud.qc:1562
 #, c-format
 msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 "^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
 
-#: qcsrc/client/hud.qc:1552
+#: qcsrc/client/hud.qc:1566
 #, c-format
 msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
 
-#: qcsrc/client/hud.qc:1569
+#: qcsrc/client/hud.qc:1583
 #, c-format
 msgid "^1%s^1 took action against a team mate\n"
 msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
 
-#: qcsrc/client/hud.qc:1571
+#: qcsrc/client/hud.qc:1585
 #, c-format
 msgid "^1%s^1 mows down a team mate\n"
 msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
 
-#: qcsrc/client/hud.qc:1576
+#: qcsrc/client/hud.qc:1590
 #, c-format
 msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 "^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem "
 "Mitspieler aus\n"
 
-#: qcsrc/client/hud.qc:1578
+#: qcsrc/client/hud.qc:1592
 #, c-format
 msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
 
-#: qcsrc/client/hud.qc:1582
+#: qcsrc/client/hud.qc:1596
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 "^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
 
-#: qcsrc/client/hud.qc:1584
+#: qcsrc/client/hud.qc:1598
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
 
-#: qcsrc/client/hud.qc:1588
+#: qcsrc/client/hud.qc:1602
 #, c-format
 msgid "^1%s^1 drew first blood\n"
 msgstr "^1%s^1 war der Erste\n"
 
-#: qcsrc/client/hud.qc:1592
+#: qcsrc/client/hud.qc:1606
 #, c-format
 msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
 
-#: qcsrc/client/hud.qc:1594
+#: qcsrc/client/hud.qc:1608
 #, c-format
 msgid "^1%s^1 was telefragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 telefragged\n"
 
-#: qcsrc/client/hud.qc:1599
+#: qcsrc/client/hud.qc:1613
 #, c-format
 msgid "^1%s^1 was drowned by %s\n"
 msgstr "^1%s^1 wurde von %s^1 etränkt\n"
 
-#: qcsrc/client/hud.qc:1604
+#: qcsrc/client/hud.qc:1618
 #, c-format
 msgid "^1%s^1 was slimed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:1609
+#: qcsrc/client/hud.qc:1623
 #, c-format
 msgid "^1%s^1 was cooked by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gebraten\n"
 
-#: qcsrc/client/hud.qc:1614
+#: qcsrc/client/hud.qc:1628
 #, c-format
 msgid "^1%s^1 was grounded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 geerdet\n"
 
-#: qcsrc/client/hud.qc:1619
+#: qcsrc/client/hud.qc:1633
 #, c-format
 msgid "^1%s^1 was shot into space by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
 
-#: qcsrc/client/hud.qc:1624
+#: qcsrc/client/hud.qc:1638
 #, c-format
 msgid "^1%s^1 was conserved by %s\n"
 msgstr "^1%s^1 wurde von %s^1 konserviert\n"
 
-#: qcsrc/client/hud.qc:1630
+#: qcsrc/client/hud.qc:1644
 #, c-format
 msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
 
-#: qcsrc/client/hud.qc:1634
+#: qcsrc/client/hud.qc:1648
 #, c-format
 msgid "^1%s^1 was crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
 
-#: qcsrc/client/hud.qc:1638
+#: qcsrc/client/hud.qc:1652
 #, c-format
 msgid "^1%s^1 got shredded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerstückelt\n"
 
-#: qcsrc/client/hud.qc:1642
+#: qcsrc/client/hud.qc:1656
 #, c-format
 msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Luft gejagt\n"
 
-#: qcsrc/client/hud.qc:1646
+#: qcsrc/client/hud.qc:1660
 #, c-format
 msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr "^1%s^1 wurde von der Explosion von %s^1s Fahrzeug erwischt\n"
 
-#: qcsrc/client/hud.qc:1650
+#: qcsrc/client/hud.qc:1664
 #, c-format
 msgid "^1%s^1 was bolted down by %s\n"
 msgstr "^1%s^1 wurde von %s^1 niedergeschmettert\n"
 
-#: qcsrc/client/hud.qc:1654
+#: qcsrc/client/hud.qc:1668
 #, c-format
 msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr "^1%s^1 fand keine Deckung vor %s^1s Raketen\n"
 
-#: qcsrc/client/hud.qc:1658
+#: qcsrc/client/hud.qc:1672
 #, c-format
 msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Wakizashi.\n"
 
-#: qcsrc/client/hud.qc:1662
+#: qcsrc/client/hud.qc:1676
 #, c-format
 msgid "^1%s^1 nailed to hell by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Hölle geschossen\n"
 
-#: qcsrc/client/hud.qc:1666
+#: qcsrc/client/hud.qc:1680
 #, c-format
 msgid "^1%s^1 cluster crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 total zerstört\n"
 
-#: qcsrc/client/hud.qc:1670
+#: qcsrc/client/hud.qc:1684
 #, c-format
 msgid "^1%s^1 dies when %s^1's raptor dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Raptor.\n"
 
-#: qcsrc/client/hud.qc:1674
+#: qcsrc/client/hud.qc:1688
 #, c-format
 msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins offene Feuer geschubst\n"
 
-#: qcsrc/client/hud.qc:1678
+#: qcsrc/client/hud.qc:1692
 #, c-format
 msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in einen unglücklichen Unfall geschubst\n"
 
-#: qcsrc/client/hud.qc:1682
+#: qcsrc/client/hud.qc:1696
 #, c-format
 msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr "^1%s^1 wurde von %s auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:1686
+#: qcsrc/client/hud.qc:1700
 #, c-format
 msgid "^1%s^1 was burnt to death by %s\n"
 msgstr "^1%s^1 wurde von %s verbrannt\n"
 
-#: qcsrc/client/hud.qc:1698
+#: qcsrc/client/hud.qc:1712
 #, c-format
 msgid "^1%s^1 was fragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gefraggt\n"
 
-#: qcsrc/client/hud.qc:1703
+#: qcsrc/client/hud.qc:1717
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr "^1%s^1's Punkte-Folge wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:1705
+#: qcsrc/client/hud.qc:1719
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr "^1%s^1's Kill-Spree wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:1708
+#: qcsrc/client/hud.qc:1722
 #, c-format
 msgid "^1%s^1 made %s scores in a row\n"
 msgstr "^1%s^1 machte %s Punkte hintereinander\n"
 
-#: qcsrc/client/hud.qc:1710
+#: qcsrc/client/hud.qc:1724
 #, c-format
 msgid "^1%s^1 has %s frags in a row\n"
 msgstr "^1%s^1 hat %s Frags hintereinander\n"
 
-#: qcsrc/client/hud.qc:1713
+#: qcsrc/client/hud.qc:1727
 #, c-format
 msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr "%s^7 hat einen ^1TRIPLE SCORE\n"
 
-#: qcsrc/client/hud.qc:1715
+#: qcsrc/client/hud.qc:1729
 #, c-format
 msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr "%s^7 hat einen ^1TRIPLE FRAG\n"
 
-#: qcsrc/client/hud.qc:1718
+#: qcsrc/client/hud.qc:1732
 #, c-format
 msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr "%s^7 hat ^1PUNKTE-RASEN\n"
 
-#: qcsrc/client/hud.qc:1720
+#: qcsrc/client/hud.qc:1734
 #, c-format
 msgid "%s^7 unleashes ^1RAGE\n"
 msgstr "%s^7 ^1RAST VOR ZORN\n"
 
-#: qcsrc/client/hud.qc:1723
+#: qcsrc/client/hud.qc:1737
 #, c-format
 msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZEHN PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:1725
+#: qcsrc/client/hud.qc:1739
 #, c-format
 msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr "%s^7 beginnt das ^1MASSAKER!\n"
 
-#: qcsrc/client/hud.qc:1728
+#: qcsrc/client/hud.qc:1742
 #, c-format
 msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFZEHN PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1730
+#: qcsrc/client/hud.qc:1744
 #, c-format
 msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr "%s^7 erzeugt das ^1CHAOS!\n"
 
-#: qcsrc/client/hud.qc:1733
+#: qcsrc/client/hud.qc:1747
 #, c-format
 msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZWANZIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1735
+#: qcsrc/client/hud.qc:1749
 #, c-format
 msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr "%s^7 ist ein ^1BERSERKER!\n"
 
-#: qcsrc/client/hud.qc:1738
+#: qcsrc/client/hud.qc:1752
 #, c-format
 msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFUNDZWANZIG PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:1740
+#: qcsrc/client/hud.qc:1754
 #, c-format
 msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr "%s^7 hält ein ^1BLUTBAD!\n"
 
-#: qcsrc/client/hud.qc:1743
+#: qcsrc/client/hud.qc:1757
 #, c-format
 msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1DREISSIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:1745
+#: qcsrc/client/hud.qc:1759
 #, c-format
 msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr "%s^7 lässt die ^1APOKALYPSE^7 los!\n"
 
-#: qcsrc/client/hud.qc:1753
+#: qcsrc/client/hud.qc:1767
 #, c-format
 msgid "^1%s^1 was in the water for too long\n"
 msgstr "^1%s^1 war zu lange im Wasser\n"
 
-#: qcsrc/client/hud.qc:1755
+#: qcsrc/client/hud.qc:1769
 #, c-format
 msgid "^1%s^1 drowned\n"
 msgstr "^1%s^1 ertrank\n"
 
-#: qcsrc/client/hud.qc:1760
+#: qcsrc/client/hud.qc:1774
 #, c-format
 msgid "^1%s^1 was slimed\n"
 msgstr "^1%s^1 wurde im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:1766
+#: qcsrc/client/hud.qc:1780
 #, c-format
 msgid "^1%s^1 found a hot place\n"
 msgstr "^1%s^1 fand einen heißen Ort\n"
 
-#: qcsrc/client/hud.qc:1768
+#: qcsrc/client/hud.qc:1782
 #, c-format
 msgid "^1%s^1 turned into hot slag\n"
 msgstr "^1%s^1 verwandelte sich in heiße Schlacke\n"
 
-#: qcsrc/client/hud.qc:1775
+#: qcsrc/client/hud.qc:1789
 #, c-format
 msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr "^1%s^1 probierte die Gravitation aus (und sie funktionierte)\n"
 
-#: qcsrc/client/hud.qc:1777
+#: qcsrc/client/hud.qc:1791
 #, c-format
 msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr "^1%s^1 landete mit einem Knall auf dem Boden\n"
 
-#: qcsrc/client/hud.qc:1782
+#: qcsrc/client/hud.qc:1796
 #, c-format
 msgid "^1%s^1 became a shooting star\n"
 msgstr "^1%s^1 wurde zu einer Sternschnuppe\n"
 
-#: qcsrc/client/hud.qc:1788
+#: qcsrc/client/hud.qc:1802
 #, c-format
 msgid "^1%s^1 discovered a swamp\n"
 msgstr "^1%s^1 entdeckte einen Sumpf\n"
 
-#: qcsrc/client/hud.qc:1790
+#: qcsrc/client/hud.qc:1804
 #, c-format
 msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr "^1%s^1 ist jetzt für Jahrhunderte konserviert\n"
 
-#: qcsrc/client/hud.qc:1795
+#: qcsrc/client/hud.qc:1811
+#, c-format
+msgid "^1%s^1 ran into a turret\n"
+msgstr "^1%s^1 probierte die Selbstschussanlage aus\n"
+
+#: qcsrc/client/hud.qc:1817
+#, c-format
+msgid "^1%s^1 was laserd down by a eWheel turret \n"
+msgstr "^1%s^1 wurde von einem eWheel gelasert\n"
+
+#: qcsrc/client/hud.qc:1820
+#, c-format
+msgid "^1%s^1 got caught in the flac \n"
+msgstr "^1%s^1 fraß Flac\n"
+
+#: qcsrc/client/hud.qc:1823
+#, c-format
+msgid "^1%s^1 was riddeld full of riddled by a machinegun turret \n"
+msgstr ""
+"^1%s^1 wurde von einer Maschinengewehr-Selbstschussanlage durchlöchert\n"
+
+#: qcsrc/client/hud.qc:1826
 #, c-format
-msgid "^1%s^1 was mowed down by a turret \n"
-msgstr "^1%s^1 wurde von einem Turret niedergemäht\n"
+msgid "^1%s^1 got served a led enrichment by a walker turret \n"
+msgstr "^1%s^1 bekam eine Blei-Überdosis von einem Walker\n"
 
-#: qcsrc/client/hud.qc:1807
+#: qcsrc/client/hud.qc:1829
+#, c-format
+msgid "^1%s^1 was impaled by a walker turret \n"
+msgstr "^1%s^1 wurde von einem Walker aufgepiekst\n"
+
+#: qcsrc/client/hud.qc:1832
+#, c-format
+msgid "^1%s^1 was rocketed to hell by a walker turret \n"
+msgstr "^1%s^1 wurde von einem Walker in die Luft gejagt\n"
+
+#: qcsrc/client/hud.qc:1835
+#, c-format
+msgid "^1%s^1 was blasted away hellion turret \n"
+msgstr "^1%s^1 wurde von einem Hellion weggeblasen\n"
+
+#: qcsrc/client/hud.qc:1838
+#, c-format
+msgid "^1%s^1 could not hide from the hunter turret \n"
+msgstr ""
+"%s konnte sich vor der Selbstschussanlage Marke Hunter nicht verstecken"
+
+#: qcsrc/client/hud.qc:1841
+#, c-format
+msgid "^1%s^1 got turned into smoldering gibs by a mlrs turret \n"
+msgstr "^1%s^1 wurde von einem MLRS-Turret zerstückelt\n"
+
+#: qcsrc/client/hud.qc:1844
+#, c-format
+msgid "^1%s^1 got served some superheated plasma from a plasma turret \n"
+msgstr "^1%s^1 bekam ein wenig heißes Plasma serviert\n"
+
+#: qcsrc/client/hud.qc:1847
+#, c-format
+msgid "^1%s^1 was phased out \n"
+msgstr "^1%s^1 verschwand in der Phasenverschiebung\n"
+
+#: qcsrc/client/hud.qc:1850
+#, c-format
+msgid "^1%s^1 was electrocuted by a tesla turret \n"
+msgstr "^1%s^1 fand Tesla-Turrets elektrisierend\n"
+
+#: qcsrc/client/hud.qc:1866
 #, c-format
 msgid "^1%s^1 died in an accident\n"
 msgstr "^1%s^1 starb an einem Unfall\n"
 
-#: qcsrc/client/hud.qc:1811
+#: qcsrc/client/hud.qc:1870
 #, c-format
 msgid "^1%s^1 was unfairly eliminated\n"
 msgstr "^1%s^1 wurde auf unfaire Weise eliminiert\n"
 
-#: qcsrc/client/hud.qc:1817
+#: qcsrc/client/hud.qc:1876
 #, c-format
 msgid "^1%s^1 felt a little hot\n"
 msgstr "^1%s^1 fand es ein wenig zu warm\n"
 
-#: qcsrc/client/hud.qc:1819
+#: qcsrc/client/hud.qc:1878
 #, c-format
 msgid "^1%s^1 burnt to death\n"
 msgstr "^1%s^1 verbrannte\n"
 
-#: qcsrc/client/hud.qc:1826
+#: qcsrc/client/hud.qc:1885
 #, c-format
 msgid "^1%s^1 needs a restart\n"
 msgstr "^1%s^1 braucht einen Neustart\n"
 
-#: qcsrc/client/hud.qc:1833
+#: qcsrc/client/hud.qc:1892
 #, c-format
 msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr "^1%s^1 braucht einen Neustart nach %d Punkten in Folge\n"
 
-#: qcsrc/client/hud.qc:1835
+#: qcsrc/client/hud.qc:1894
 #, c-format
 msgid "^1%s^1 died with a %d kill spree\n"
 msgstr "^1%s^1 starb mit einer %d-Kill-Spree\n"
 
-#: qcsrc/client/hud.qc:1839
+#: qcsrc/client/hud.qc:1898
 #, c-format
 msgid "%s^7 got the %s\n"
 msgstr "%s^7 bekam die %s\n"
 
-#: qcsrc/client/hud.qc:1842
+#: qcsrc/client/hud.qc:1901
 #, c-format
 msgid "%s^7 lost the %s\n"
 msgstr "%s^7 verlor die %s\n"
 
-#: qcsrc/client/hud.qc:1845
+#: qcsrc/client/hud.qc:1904
 #, c-format
 msgid "%s^7 picked up the %s\n"
 msgstr "%s^7 nahm sich die %s\n"
 
-#: qcsrc/client/hud.qc:1848
+#: qcsrc/client/hud.qc:1907
 #, c-format
 msgid "%s^7 returned the %s\n"
 msgstr "%s^7 brachte die %s^7 zurück\n"
 
-#: qcsrc/client/hud.qc:1851
+#: qcsrc/client/hud.qc:1910
 #, c-format
 msgid "%s^7 captured the %s%s\n"
 msgstr "%s^7 eroberte die %s%s\n"
 
-#: qcsrc/client/hud.qc:1870
+#: qcsrc/client/hud.qc:1929
 #, c-format
 msgid "%s^7 has picked up the ball!\n"
 msgstr "%s^7 hat den Ball genommen!\n"
 
-#: qcsrc/client/hud.qc:1875
+#: qcsrc/client/hud.qc:1934
 #, c-format
 msgid "%s^7 has dropped the ball!\n"
 msgstr "%s^7 hat den Ball verloren!\n"
 
-#: qcsrc/client/hud.qc:1886
+#: qcsrc/client/hud.qc:1945
 #, c-format
 msgid "You are now on: %s"
 msgstr "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:1888
+#: qcsrc/client/hud.qc:1947
 #, c-format
 msgid ""
 "You have been moved into a different team to improve team balance\n"
@@ -637,323 +691,323 @@ msgstr ""
 "Du wurdest in ein anderes Team verschoben, um Team-Balance zu verbessern.\n"
 "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:1891
+#: qcsrc/client/hud.qc:1950
 msgid "^1Reconsider your tactics, camper!"
 msgstr "^1Ändere dein Verhalten, Camper!"
 
-#: qcsrc/client/hud.qc:1893
+#: qcsrc/client/hud.qc:1952
 msgid "^1Die camper!"
 msgstr "^1Stirb, Camper!"
 
-#: qcsrc/client/hud.qc:1896
+#: qcsrc/client/hud.qc:1955
 msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 "^1Du wurdest ins Spiel neu eingesetzt, weil dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:1898
+#: qcsrc/client/hud.qc:1957
 msgid "^1You were killed for running out of ammo..."
 msgstr "^1Du wurdest getötet, da dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:1901
+#: qcsrc/client/hud.qc:1960
 msgid "^1You need to preserve your health"
 msgstr "^1Du solltest deine Gesundheit erhalten"
 
-#: qcsrc/client/hud.qc:1903
+#: qcsrc/client/hud.qc:1962
 msgid "^1You grew too old without taking your medicine"
 msgstr "^1Du wurdest zu alt, und hast nicht deine Medizin genommen"
 
-#: qcsrc/client/hud.qc:1906
+#: qcsrc/client/hud.qc:1965
 msgid "^1Don't go against team mates!"
 msgstr "^1Ärgere deine Teamkollegen nicht!"
 
-#: qcsrc/client/hud.qc:1908
+#: qcsrc/client/hud.qc:1967
 msgid "^1Don't shoot your team mates!"
 msgstr "^1Schieße nicht auf deine Teamkollegen!"
 
-#: qcsrc/client/hud.qc:1913
+#: qcsrc/client/hud.qc:1972
 msgid "^1You need to be more careful!"
 msgstr "^1Sei vorsichtiger!"
 
-#: qcsrc/client/hud.qc:1915
+#: qcsrc/client/hud.qc:1974
 msgid "^1You killed your own dumb self!"
 msgstr "^1Du hast dich selbst umgebracht. Wie blöd."
 
-#: qcsrc/client/hud.qc:1920
+#: qcsrc/client/hud.qc:1979
 #, c-format
 msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:1922
+#: qcsrc/client/hud.qc:1981
 #, c-format
 msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:1926
+#: qcsrc/client/hud.qc:1985
 msgid "^1First score"
 msgstr "^1Erster Punkt"
 
-#: qcsrc/client/hud.qc:1928
+#: qcsrc/client/hud.qc:1987
 msgid "^1First blood"
 msgstr "^1Erstes Blut"
 
-#: qcsrc/client/hud.qc:1932
+#: qcsrc/client/hud.qc:1991
 msgid "^1First casualty"
 msgstr "^1Erster Kollateralschaden"
 
-#: qcsrc/client/hud.qc:1934
+#: qcsrc/client/hud.qc:1993
 msgid "^1First victim"
 msgstr "^1Erstes Opfer"
 
-#: qcsrc/client/hud.qc:1938
+#: qcsrc/client/hud.qc:1997
 #, c-format
 msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr "^1Du hast gegen ^7%s^1 gepunktet, während er am Tippen war!"
 
-#: qcsrc/client/hud.qc:1940
+#: qcsrc/client/hud.qc:1999
 #, c-format
 msgid "^1You typefragged ^7%s"
 msgstr "^1Du hast ^7%s^1 beim Tippen erschossen"
 
-#: qcsrc/client/hud.qc:1944
+#: qcsrc/client/hud.qc:2003
 #, c-format
 msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet, während du am Tippen warst!"
 
-#: qcsrc/client/hud.qc:1946
+#: qcsrc/client/hud.qc:2005
 #, c-format
 msgid "^1You were typefragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 erschossen, während du am Tippen warst"
 
-#: qcsrc/client/hud.qc:1950
+#: qcsrc/client/hud.qc:2009
 #, c-format
 msgid "^4You scored against ^7%s"
 msgstr "^4Du hast gegen ^7%s^4 gepunktet"
 
-#: qcsrc/client/hud.qc:1952
+#: qcsrc/client/hud.qc:2011
 #, c-format
 msgid "^4You fragged ^7%s"
 msgstr "^4Du hast ^7%s^4 getötet"
 
-#: qcsrc/client/hud.qc:1956
+#: qcsrc/client/hud.qc:2015
 #, c-format
 msgid "^1You were scored against by ^7%s"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet"
 
-#: qcsrc/client/hud.qc:1958
+#: qcsrc/client/hud.qc:2017
 #, c-format
 msgid "^1You were fragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 getötet"
 
-#: qcsrc/client/hud.qc:1963
+#: qcsrc/client/hud.qc:2022
 msgid "^1Watch your step!"
 msgstr "^1Achte, wo du hintrittst!"
 
-#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
+#: qcsrc/client/hud.qc:2091 qcsrc/client/hud.qc:2092 qcsrc/client/hud.qc:2598
 #, c-format
 msgid "Player %d"
 msgstr "Spieler %d"
 
-#: qcsrc/client/hud.qc:2823
+#: qcsrc/client/hud.qc:2907
 msgid "^1Intermediate 1 (+15.42)"
 msgstr "^1Intermediate 1 (+15.42)"
 
-#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
+#: qcsrc/client/hud.qc:2909 qcsrc/client/hud.qc:2951 qcsrc/client/hud.qc:2992
 #, c-format
 msgid "^1PENALTY: %.1f (%s)"
 msgstr "^1STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:2910
+#: qcsrc/client/hud.qc:2994
 #, c-format
 msgid "^2PENALTY: %.1f (%s)"
 msgstr "^2STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:2938
+#: qcsrc/client/hud.qc:3022
 msgid "^1You must answer before entering hud configure mode\n"
 msgstr "^1Du musst antworten, bevore das HUD konfiguriert werden kann\n"
 
-#: qcsrc/client/hud.qc:2941
-msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
-msgstr "^2Name^7 statt \"^1Unregistered player^7\" in den Statistiken"
+#: qcsrc/client/hud.qc:3027
+msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
+msgstr "^2Name^7 statt \"^1Anonymous player^7\" in den Statistiken"
 
-#: qcsrc/client/hud.qc:3023
+#: qcsrc/client/hud.qc:3109
 msgid "A vote has been called for:"
 msgstr "Eine Abstimmung wurde initiiert für:"
 
-#: qcsrc/client/hud.qc:3025
+#: qcsrc/client/hud.qc:3111
 msgid "Allow servers to store and display your name?"
 msgstr "Erlaube Servern, deinen Namen zu speichern und später zu zeigen?"
 
-#: qcsrc/client/hud.qc:3029
+#: qcsrc/client/hud.qc:3115
 msgid "^1Configure the HUD"
 msgstr "^1Das HUD konfigurieren"
 
-#: qcsrc/client/hud.qc:3033
+#: qcsrc/client/hud.qc:3119
 #, c-format
 msgid "Yes (%s): %d"
 msgstr "Ja (%s): %d"
 
-#: qcsrc/client/hud.qc:3035
+#: qcsrc/client/hud.qc:3121
 #, c-format
 msgid "No (%s): %d"
 msgstr "Nein (%s): %d"
 
-#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
+#: qcsrc/client/hud.qc:3624 qcsrc/client/hud.qc:3627 qcsrc/client/hud.qc:3629
 msgid "Personal best"
 msgstr "Persönliche Bestzeit"
 
-#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
+#: qcsrc/client/hud.qc:3642 qcsrc/client/hud.qc:3645 qcsrc/client/hud.qc:3647
 msgid "Server best"
 msgstr "Server-Bestzeit"
 
-#: qcsrc/client/hud.qc:3905
+#: qcsrc/client/hud.qc:3993
 msgid "^3Player^7: This is the chat area."
 msgstr "^3Player^7: Das ist der Chat-Bereich."
 
-#: qcsrc/client/hud.qc:3973
+#: qcsrc/client/hud.qc:4061
 #, c-format
 msgid "FPS: %.*f"
 msgstr "FPS: %.*f"
 
-#: qcsrc/client/hud.qc:4040
+#: qcsrc/client/hud.qc:4128
 msgid "^1Observing"
 msgstr "^1Beobachten"
 
-#: qcsrc/client/hud.qc:4042
+#: qcsrc/client/hud.qc:4131 qcsrc/client/hud.qc:4133
 #, c-format
 msgid "^1Spectating: ^7%s"
 msgstr "^1Zuschauen bei: ^7%s"
 
-#: qcsrc/client/hud.qc:4046
+#: qcsrc/client/hud.qc:4138
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
 msgstr "^1Drücke ^3%s^1, um bei jemandem zuzuschauen"
 
-#: qcsrc/client/hud.qc:4048
+#: qcsrc/client/hud.qc:4140
 #, c-format
 msgid "^1Press ^3%s^1 for another player"
 msgstr "^1Drücke ^3%s^1 für einen anderen Spieler"
 
-#: qcsrc/client/hud.qc:4052
+#: qcsrc/client/hud.qc:4144
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr "^1Benutze ^3%s^1 oder ^3%s^1 zum Ändern der Geschwindigkeit"
 
-#: qcsrc/client/hud.qc:4054
+#: qcsrc/client/hud.qc:4146
 #, c-format
 msgid "^1Press ^3%s^1 to observe"
 msgstr "^1Drücke ^3%s^1 zum Beobachten"
 
-#: qcsrc/client/hud.qc:4057
+#: qcsrc/client/hud.qc:4149
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
 msgstr "^1Drücke ^3%s^1 für Spielmodus-Info"
 
-#: qcsrc/client/hud.qc:4061
+#: qcsrc/client/hud.qc:4153
 msgid "^1Wait for your turn to join"
 msgstr "^1Warte, bis du dran bist"
 
-#: qcsrc/client/hud.qc:4067
+#: qcsrc/client/hud.qc:4159
 msgid "^1Match has already begun"
 msgstr "^1Das Match hat bereits begonnen"
 
-#: qcsrc/client/hud.qc:4069
+#: qcsrc/client/hud.qc:4161
 msgid "^1You have no more lives left"
 msgstr "^1Du hast keine Leben mehr übrig"
 
-#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
+#: qcsrc/client/hud.qc:4163 qcsrc/client/hud.qc:4166
 #, c-format
 msgid "^1Press ^3%s^1 to join"
 msgstr "^1Drücke ^3%s^1 zum Mitspielen"
 
-#: qcsrc/client/hud.qc:4082
+#: qcsrc/client/hud.qc:4174
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
 msgstr "^1Das Spiel beginnt in ^3%d^1 Sekunden"
 
-#: qcsrc/client/hud.qc:4089
+#: qcsrc/client/hud.qc:4181
 msgid "^2Currently in ^1warmup^2 stage!"
 msgstr "^2Momentan in der ^1Aufwärmphase!"
 
-#: qcsrc/client/hud.qc:4104
+#: qcsrc/client/hud.qc:4196
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
 msgstr "%sDrücke ^3%s%s um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4106
+#: qcsrc/client/hud.qc:4198
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
 msgstr "%sDrücke ^3%s%s sobald du soweit bist"
 
-#: qcsrc/client/hud.qc:4111
+#: qcsrc/client/hud.qc:4203
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr "^2Warte, bis andere bereit sind, um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4113
+#: qcsrc/client/hud.qc:4205
 msgid "^2Waiting for others to ready up..."
 msgstr "^2Warte, bis andere bereit sind..."
 
-#: qcsrc/client/hud.qc:4119
+#: qcsrc/client/hud.qc:4211
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
 msgstr "^2Drücke ^3%s^2 um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4140
+#: qcsrc/client/hud.qc:4232
 msgid "Teamnumbers are unbalanced!"
 msgstr "Die Teams sind unbalanciert!"
 
-#: qcsrc/client/hud.qc:4145
+#: qcsrc/client/hud.qc:4237
 #, c-format
 msgid " Press ^3%s%s to adjust"
 msgstr "Drücke ^3%s%s um dies zu korrigieren"
 
-#: qcsrc/client/hud.qc:4153
+#: qcsrc/client/hud.qc:4245
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr "^7Drücke ^3ESC^7 um die HUD-Optionen zu zeigen"
 
-#: qcsrc/client/hud.qc:4155
+#: qcsrc/client/hud.qc:4247
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr "^3Doppelklick^7 auf ein Panel für Panel-spezifische Optionen."
 
-#: qcsrc/client/hud.qc:4157
+#: qcsrc/client/hud.qc:4249
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr "^3CTRL^7 um Kollisionstests zu deaktivieren, ^3SHIFT^7 und"
 
-#: qcsrc/client/hud.qc:4159
+#: qcsrc/client/hud.qc:4251
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr "^3ALT^7 + ^3PFEILTASTEN^7 für Feinjustierungen"
 
-#: qcsrc/client/hud.qc:4197
+#: qcsrc/client/hud.qc:4289
 msgid " qu/s"
 msgstr "qu/s"
 
-#: qcsrc/client/hud.qc:4201
+#: qcsrc/client/hud.qc:4293
 msgid " m/s"
 msgstr "m/s"
 
-#: qcsrc/client/hud.qc:4205
+#: qcsrc/client/hud.qc:4297
 msgid " km/h"
 msgstr "km/h"
 
-#: qcsrc/client/hud.qc:4209
+#: qcsrc/client/hud.qc:4301
 msgid " mph"
 msgstr "mph"
 
-#: qcsrc/client/hud.qc:4213
+#: qcsrc/client/hud.qc:4305
 msgid " knots"
 msgstr "Knoten"
 
-#: qcsrc/client/hud.qc:4860
+#: qcsrc/client/hud.qc:4968
 msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
 msgstr "Falsche Panel-Nummern in _hud_panelorder wurden automatisch behoben"
 
-#: qcsrc/client/hud_config.qc:136
+#: qcsrc/client/hud_config.qc:185
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
 msgstr ""
 "^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
 "abgelegt)\n"
 
-#: qcsrc/client/hud_config.qc:140
+#: qcsrc/client/hud_config.qc:189
 #, c-format
 msgid "^1Couldn't write to %s\n"
 msgstr "^1Konnte nicht nach %s schreiben\n"
@@ -994,34 +1048,7 @@ msgstr "^1Fehler:^7 konnte den pak-Index nicht finden.\n"
 msgid "Requesting preview...\n"
 msgstr "Vorschau wird angefordert...\n"
 
-#: qcsrc/client/miscfunctions.qc:23
-msgid "^1Begin!"
-msgstr "^1Los!"
-
-#: qcsrc/client/miscfunctions.qc:34
-#, c-format
-msgid "^1Game starts in %d seconds"
-msgstr "^1Das Spiel startet in %d Sekunden"
-
-#: qcsrc/client/miscfunctions.qc:113
-msgid "^1RED^7 flag"
-msgstr "^1ROTE^7 Flagge"
-
-#: qcsrc/client/miscfunctions.qc:118
-msgid "^4BLUE^7 flag"
-msgstr "^4BLAUE^7 Flagge"
-
-#: qcsrc/client/miscfunctions.qc:126
-#, c-format
-msgid "You picked up the %s!"
-msgstr "Du hast die %s genommen!"
-
-#: qcsrc/client/miscfunctions.qc:130
-#, c-format
-msgid "You got the %s!"
-msgstr "Du hast die %s!"
-
-#: qcsrc/client/miscfunctions.qc:283
+#: qcsrc/client/miscfunctions.qc:100
 msgid "Trying to remove a team which is not in the teamlist!"
 msgstr "Versuchte, ein Team zu löschen, das nicht in der Teamliste ist!"
 
@@ -1194,8 +1221,8 @@ msgid ""
 msgstr "Mit ^3|^7 werden die rechtsbündigen Felder gestartet.\n"
 
 #: qcsrc/client/scoreboard.qc:247
-msgid "^3name^7 or ^3nick^7         Name of a player\n"
-msgstr "^3name^7 or ^3nick^7         Name des Spielers\n"
+msgid "^3name^7 or ^3nick^7             Name of a player\n"
+msgstr "^3name^7 oder ^3nick^7           Name des Spielers\n"
 
 #: qcsrc/client/scoreboard.qc:248
 msgid "^3ping^7                     Ping time\n"
@@ -1387,58 +1414,66 @@ msgstr "Genauigkeit (Durchschn.: %d%%)"
 msgid "%d%%"
 msgstr "%d%%"
 
-#: qcsrc/client/scoreboard.qc:1075
+#: qcsrc/client/scoreboard.qc:1085
+msgid "Map stats:"
+msgstr "Map-Statistiken:"
+
+#: qcsrc/client/scoreboard.qc:1101
+msgid "Secrets found:"
+msgstr "Geheimnisse:"
+
+#: qcsrc/client/scoreboard.qc:1128
 msgid "Rankings"
 msgstr "Platzierungen"
 
-#: qcsrc/client/scoreboard.qc:1170
+#: qcsrc/client/scoreboard.qc:1223
 msgid "Scoreboard"
 msgstr "Tabelle"
 
-#: qcsrc/client/scoreboard.qc:1215
+#: qcsrc/client/scoreboard.qc:1268
 #, c-format
 msgid "Speed award: %d ^7(%s^7)"
 msgstr "Höchstgeschwindigkeit: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1219
+#: qcsrc/client/scoreboard.qc:1272
 #, c-format
 msgid "All-time fastest: %d ^7(%s^7)"
 msgstr "Rekord: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
+#: qcsrc/client/scoreboard.qc:1305 qcsrc/client/teamplay.qc:63
 msgid "Spectators"
 msgstr "Zuschauer"
 
-#: qcsrc/client/scoreboard.qc:1252
+#: qcsrc/client/scoreboard.qc:1311
 #, c-format
 msgid "playing on ^2%s^7"
 msgstr "es wird auf ^2%s^7 gespielt"
 
-#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
+#: qcsrc/client/scoreboard.qc:1318 qcsrc/client/scoreboard.qc:1323
 #, c-format
 msgid " for up to ^1%1.0f minutes^7"
 msgstr " für bis zu ^1%.1f Minuten^7"
 
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
+#: qcsrc/client/scoreboard.qc:1327 qcsrc/client/scoreboard.qc:1346
 msgid " or"
 msgstr " oder"
 
-#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
+#: qcsrc/client/scoreboard.qc:1330 qcsrc/client/scoreboard.qc:1337
 #, c-format
 msgid " until ^3%s %s^7"
 msgstr " bis ^3%s %s^7"
 
-#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
-#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
+#: qcsrc/client/scoreboard.qc:1331 qcsrc/client/scoreboard.qc:1338
+#: qcsrc/client/scoreboard.qc:1350 qcsrc/client/scoreboard.qc:1357
 msgid "SCO^points"
 msgstr "Punkte"
 
-#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
-#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
+#: qcsrc/client/scoreboard.qc:1332 qcsrc/client/scoreboard.qc:1339
+#: qcsrc/client/scoreboard.qc:1351 qcsrc/client/scoreboard.qc:1358
 msgid "SCO^is beaten"
 msgstr "geschlagen wird"
 
-#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
+#: qcsrc/client/scoreboard.qc:1349 qcsrc/client/scoreboard.qc:1356
 #, c-format
 msgid " until a lead of ^3%s %s^7"
 msgstr " bis zu einem Vorsprung von ^3%s %s^7"
@@ -1464,6 +1499,15 @@ msgstr "Gelbes Team"
 msgid "Pink Team"
 msgstr "Pinkes Team"
 
+#: qcsrc/client/tturrets.qc:285 qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
+msgstr "Frühstücksfleisch"
+
+#: qcsrc/client/tturrets.qc:294
+#, c-format
+msgid "%s under attack!"
+msgstr "%s wird angegriffen!"
+
 #: qcsrc/client/waypointsprites.qc:254
 msgid "Push"
 msgstr "Drücken"
@@ -1661,16 +1705,12 @@ msgstr "Getaggt!"
 msgid "Vehicle"
 msgstr "Fahrzeug"
 
-#: qcsrc/client/waypointsprites.qc:590
-msgid "Spam"
-msgstr "Frühstücksfleisch"
-
 #: qcsrc/client/waypointsprites.qc:594
 #, c-format
 msgid "%s needing help!"
 msgstr "%s braucht Hilfe!"
 
-#: qcsrc/common/mapinfo.qc:1092
+#: qcsrc/common/mapinfo.qc:1097
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
@@ -1695,120 +1735,120 @@ msgstr "%s trat %ss Crylink zu nahe"
 msgid "%s took a close look at %s's Crylink"
 msgstr "%s schaute sich %ss Crylink sehr genau an"
 
-#: qcsrc/server/w_electro.qc:574
+#: qcsrc/server/w_electro.qc:581
 #, c-format
-msgid "%s could not remember where they put plasma"
+msgid "%s could not remember where they put their electro plasma"
 msgstr "%s vergaß, wo er das Plasma hingetan hatte"
 
-#: qcsrc/server/w_electro.qc:576
+#: qcsrc/server/w_electro.qc:583
 #, c-format
-msgid "%s played with plasma"
+msgid "%s played with electro plasma"
 msgstr "%s spielte mit Plasma"
 
-#: qcsrc/server/w_electro.qc:583
+#: qcsrc/server/w_electro.qc:590
 #, c-format
-msgid "%s just noticed %s's blue ball"
-msgstr "%s hat gerade %ss blaue Kugel bemerkt"
+msgid "%s just noticed %s's electro plasma"
+msgstr "%s hat gerade %ss Plasma bemerkt"
 
-#: qcsrc/server/w_electro.qc:585
+#: qcsrc/server/w_electro.qc:592
 #, c-format
-msgid "%s got in touch with %s's blue ball"
-msgstr "%s kam mit %ss blauer Kugel in Kontakt"
+msgid "%s got in touch with %s's electro plasma"
+msgstr "%s kam mit %ss Plasma in Kontakt"
 
-#: qcsrc/server/w_electro.qc:590
+#: qcsrc/server/w_electro.qc:597
 #, c-format
-msgid "%s felt the electrifying air of %s's combo"
+msgid "%s felt the electrifying air of %s's electro combo"
 msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
 
-#: qcsrc/server/w_electro.qc:592
+#: qcsrc/server/w_electro.qc:599
 #, c-format
-msgid "%s got too close to %s's blue beam"
+msgid "%s got too close to %s's blue electro bolt"
 msgstr "%s kam zu nah an %ss blauen Strahl"
 
-#: qcsrc/server/w_electro.qc:594
+#: qcsrc/server/w_electro.qc:601
 #, c-format
-msgid "%s was blasted by %s's blue beam"
+msgid "%s was blasted by %s's blue electro bolt"
 msgstr "%s wurde von %ss blauen Strahl erwischt"
 
-#: qcsrc/server/w_fireball.qc:417
+#: qcsrc/server/w_fireball.qc:421
 #, c-format
 msgid "%s forgot about some firemine"
 msgstr "%s hat den Platz einer Feuermine vergessen"
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
+#: qcsrc/server/w_fireball.qc:423 qcsrc/server/w_hlac.qc:240
 #, c-format
 msgid "%s should have used a smaller gun"
 msgstr "%s hätte eine kleinere Waffe nehmen sollen"
 
-#: qcsrc/server/w_fireball.qc:426
+#: qcsrc/server/w_fireball.qc:430
 #, c-format
 msgid "%s tried to catch %s's firemine"
 msgstr "%s hat versucht %ss Feuermine zu fangen"
 
-#: qcsrc/server/w_fireball.qc:428
+#: qcsrc/server/w_fireball.qc:432
 #, c-format
 msgid "%s fatefully ignored %s's firemine"
 msgstr "%s hat tragischerweise %ss Feuermine ignoriert"
 
-#: qcsrc/server/w_fireball.qc:435
+#: qcsrc/server/w_fireball.qc:439
 #, c-format
 msgid "%s could not hide from %s's fireball"
 msgstr "%s konnte sich nicht vor %ss Feuerball verstecken"
 
-#: qcsrc/server/w_fireball.qc:437
+#: qcsrc/server/w_fireball.qc:441
 #, c-format
 msgid "%s saw the pretty lights of %s's fireball"
 msgstr "%s hat die hübschen Lichter von %ss Feuerball gesehen"
 
-#: qcsrc/server/w_fireball.qc:440
+#: qcsrc/server/w_fireball.qc:444
 #, c-format
 msgid "%s got too close to %s's fireball"
 msgstr "%s ist %ss Feuerball zu nahe getreten"
 
-#: qcsrc/server/w_fireball.qc:442
+#: qcsrc/server/w_fireball.qc:446
 #, c-format
 msgid "%s tasted %s's fireball"
 msgstr "%s hat von %ss Feuerball probiert"
 
-#: qcsrc/server/w_grenadelauncher.qc:383
+#: qcsrc/server/w_grenadelauncher.qc:388
 #, c-format
-msgid "%s tried out his own grenade"
-msgstr "%s wollte wissen, ob seine Granate funktioniert"
+msgid "%s didn't see their own grenade"
+msgstr "%s hat die eigene Granate übersehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:385
+#: qcsrc/server/w_grenadelauncher.qc:390
 #, c-format
-msgid "%s detonated"
-msgstr "%s verfing sich in der eigenen Detonation"
+msgid "%s blew themself up with their grenadelauncher"
+msgstr "%s hat sich mit einem Granatenwerfer selbst in die Luft gejagt"
 
-#: qcsrc/server/w_grenadelauncher.qc:391
+#: qcsrc/server/w_grenadelauncher.qc:396
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:393
+#: qcsrc/server/w_grenadelauncher.qc:398
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_grenadelauncher.qc:395
+#: qcsrc/server/w_grenadelauncher.qc:400
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s nahm %ss Granate in den Mund"
 
-#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:462
 #, c-format
-msgid "%s played with tiny rockets"
+msgid "%s played with tiny hagar rockets"
 msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_hagar.qc:399
+#: qcsrc/server/w_hagar.qc:466
 #, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
+msgid "%s was pummeled with a burst of hagar rockets by %s"
+msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
 
-#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:468
 #, c-format
-msgid "%s was pummeled by %s"
-msgstr "^1%s^1 wurde von %s^1 erwischt"
+msgid "%s was pummeled with hagar rockets by %s"
+msgstr "%s wurde von %ss Hagar-Raketen erwischt"
 
 #: qcsrc/server/w_hlac.qc:2
 msgid "Heavy Laser Assault Cannon"
@@ -1816,54 +1856,59 @@ msgstr "Heavy Laser Assault Cannon"
 
 #: qcsrc/server/w_hlac.qc:242
 #, c-format
-msgid "%s was cut down by %s"
-msgstr "^1%s^1 wurde von %s^1 niedergehauen"
+msgid "%s was cut down with a HLAC by %s"
+msgstr "%s wurde von %ss HLAC niedergehauen"
 
 #: qcsrc/server/w_hook.qc:2
 msgid "Grappling Hook"
 msgstr "Enterhaken"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
+#: qcsrc/server/w_hook.qc:286 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s hat das Unmögliche geschafft"
 
-#: qcsrc/server/w_hook.qc:268
+#: qcsrc/server/w_hook.qc:288
 #, c-format
-msgid "%s has run into %s's gravity bomb"
+msgid "%s was caught in %s's hook gravity bomb"
 msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:312
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s hat sich in die Hölle gelasert"
 
-#: qcsrc/server/w_laser.qc:315
+#: qcsrc/server/w_laser.qc:316
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s ist von %ss Gauntlet halbiert worden"
 
-#: qcsrc/server/w_laser.qc:317
+#: qcsrc/server/w_laser.qc:318
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 
-#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
+#: qcsrc/server/w_minelayer.qc:533
+#, c-format
+msgid "%s blew themself up with their minelayer"
+msgstr "%s hat sich mit einem Minenleger selbst in die Luft gejagt"
+
+#: qcsrc/server/w_minelayer.qc:535
 #, c-format
-msgid "%s exploded"
-msgstr "%s ist explodiert"
+msgid "%s forgot about their mine"
+msgstr "%s hat den Platz einer Mine vergessen"
 
-#: qcsrc/server/w_minelayer.qc:527
+#: qcsrc/server/w_minelayer.qc:539
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_minelayer.qc:529
+#: qcsrc/server/w_minelayer.qc:541
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:531
+#: qcsrc/server/w_minelayer.qc:543
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s ist auf %ss Mine gelatscht"
@@ -1873,67 +1918,68 @@ msgid "MinstaNex"
 msgstr "MinstaNex"
 
 #: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
-#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_rifle.qc:232 qcsrc/server/w_shotgun.qc:271
+#: qcsrc/server/w_uzi.qc:318
 #, c-format
 msgid "%s is now thinking with portals"
 msgstr "%s kann jetzt mit Portalen denken"
 
-#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
+#: qcsrc/server/w_minstanex.qc:295
 #, c-format
-msgid "%s has been vaporized by %s"
-msgstr "^1%s^1 wurde von %s^1 vernichtet"
+msgid "%s has been vaporized by %s's minstanex"
+msgstr "%s^1 wurde von %ss MinstaNex vernichtet"
+
+#: qcsrc/server/w_nex.qc:255
+#, c-format
+msgid "%s has been vaporized by %s's nex"
+msgstr "%s^1 wurde von %ss Nex vernichtet"
 
 #: qcsrc/server/w_porto.qc:298
 #, c-format
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
-#: qcsrc/server/w_rifle.qc:233
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_rifle.qc:235
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_rifle.qc:242
+#: qcsrc/server/w_rifle.qc:239
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s failed to hide from %s's rifle bullet hail"
 msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
 
-#: qcsrc/server/w_rifle.qc:244
+#: qcsrc/server/w_rifle.qc:241
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s died in %s's rifle bullet hail"
 msgstr "%s ist in %ss Kugelhagel gefallen"
 
-#: qcsrc/server/w_rifle.qc:251
+#: qcsrc/server/w_rifle.qc:248
 #, c-format
 msgid "%s failed to hide from %s's rifle"
 msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
 
-#: qcsrc/server/w_rifle.qc:256
+#: qcsrc/server/w_rifle.qc:253
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%s got shot in the head with a rifle by %s"
 msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
 
-#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_rifle.qc:255
 #, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
+msgid "%s was sniped with a rifle by %s"
+msgstr "%s wurde von %s fachmännisch erledigt"
 
-#: qcsrc/server/w_rocketlauncher.qc:505
+#: qcsrc/server/w_rocketlauncher.qc:507
+#, c-format
+msgid "%s blew themself up with their rocketlauncher"
+msgstr "%s hat sich mit einem Raketenwerfer selbst in die Luft gejagt"
+
+#: qcsrc/server/w_rocketlauncher.qc:511
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_rocketlauncher.qc:507
+#: qcsrc/server/w_rocketlauncher.qc:513
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_rocketlauncher.qc:509
+#: qcsrc/server/w_rocketlauncher.qc:515
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s hat %ss Rakete in den Mund genommen"
@@ -1942,40 +1988,126 @@ msgstr "%s hat %ss Rakete in den Mund genommen"
 msgid "T.A.G. Seeker"
 msgstr "T.A.G. Seeker"
 
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_seeker.qc:661
 #, c-format
-msgid "%s was tagged by %s"
-msgstr "^1%s^1 wurde von %s^1 getagged"
+msgid "%s played with tiny seeker rockets"
+msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_shotgun.qc:219
+#: qcsrc/server/w_seeker.qc:665
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
+msgid "%s was tagged with a seeker by %s"
+msgstr "%s wurde von %s getagged"
 
-#: qcsrc/server/w_shotgun.qc:221
+#: qcsrc/server/w_seeker.qc:667
 #, c-format
-msgid "%s was gunned by %s"
-msgstr "^1%s^1 wurde von %s^1 erschossen"
+msgid "%s was pummeled with seeker rockets by %s"
+msgstr "%s wurde von %s erwischt"
+
+#: qcsrc/server/w_shotgun.qc:275
+#, c-format
+msgid "%2$s slapped %1$s around a bit with a large shotgun"
+msgstr "%2$s hat %1$s ein wenig mit einer großen Schrotflinte geschlagen"
+
+#: qcsrc/server/w_shotgun.qc:277
+#, c-format
+msgid "%s was gunned down with a shotgun by %s"
+msgstr "%s wurde von %s erschossen"
 
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
 msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:252
+#: qcsrc/server/w_tuba.qc:444
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 "%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:256
+#: qcsrc/server/w_tuba.qc:447
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Accordeon"
+msgstr ""
+"%s haben die Ohren geschmerzt von seinem eigenen Spiel auf dem @!#%%'n "
+"Akkordeon"
+
+#: qcsrc/server/w_tuba.qc:465
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr ""
 "%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
 "%%'n Tuba stammten, gestorben"
 
-#: qcsrc/server/w_uzi.qc:323
+#: qcsrc/server/w_tuba.qc:468
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Accordeon"
+msgstr ""
+"%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf dem @!#"
+"%%'n Akkordeon stammten, gestorben"
+
+#: qcsrc/server/w_uzi.qc:322
 #, c-format
-msgid "%s was riddled full of holes by %s"
+msgid "%s was sniped by %s's machine gun"
+msgstr "%s wurde von %ss Maschinengewehr erledigt"
+
+#: qcsrc/server/w_uzi.qc:324
+#, c-format
+msgid "%s was riddled full of holes by %s's machine gun"
 msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "%s sniped themself somehow"
+#~ msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#~ msgid "%s shot themself automatically"
+#~ msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#~ msgid "%s exploded"
+#~ msgstr "%s ist explodiert"
+
+#~ msgid "%s hoped %s's missiles wouldn't bounce"
+#~ msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
+
+#~ msgid "%s detonated"
+#~ msgstr "%s verfing sich in der eigenen Detonation"
+
+#~ msgid "%s tried out his own grenade"
+#~ msgstr "%s wollte wissen, ob seine Granate funktioniert"
+
+#~ msgid "Awaiting orders..."
+#~ msgstr "Warten auf Auftrag..."
+
+#~ msgid "You're commander!"
+#~ msgstr "Sie sind Befehlshaber!"
+
+#~ msgid "3) Resign from command."
+#~ msgstr "3) Befehlsgewalt abgeben."
+
+#~ msgid " 2) Defend"
+#~ msgstr " 2) Verteidigen"
+
+#~ msgid " 1) Attack"
+#~ msgstr " 1) Angreifen"
+
+#~ msgid "Issue orders:"
+#~ msgstr "Auftrag geben:"
+
+#~ msgid "----- Command Menu -----"
+#~ msgstr "---- Befehlsmenü -----"
+
+#~ msgid "Couldn't find player %d\n"
+#~ msgstr "Kann Spieler %d nicht finden\n"
+
+#~ msgid "ESC) Exit Menu"
+#~ msgstr "ESC) Menü verlassen"
+
+#~ msgid "2) ^3next page"
+#~ msgstr "2) ^3nächste Seite"
+
+#~ msgid "1) ^3previous page"
+#~ msgstr "1) ^3vorherige Seite"
+
+#~ msgid "Order: %s"
+#~ msgstr "Auftrag: %s"
+
+#~ msgid "----- Order Menu -----"
+#~ msgstr "----- Auftragsmenü -----"
index cf220c0943f18b783127c3e30a537dd3f90ecf0a..9b009bda136a63818e6f52e0b344cb25747eee6e 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-12 12:24+0200\n"
+"POT-Creation-Date: 2011-12-25 22:57+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,1921 +17,1988 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/client/mapvoting.qc:28
-msgid " (1 vote)"
+#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
+#, c-format
+msgid "Cannot initialize sound %s\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:30
+#: qcsrc/client/hud_config.qc:185
 #, c-format
-msgid " (%d votes)"
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:113
-msgid "Don't care"
+#: qcsrc/client/hud_config.qc:189
+#, c-format
+msgid "^1Couldn't write to %s\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:194
-msgid "Vote for a map"
+#: qcsrc/client/miscfunctions.qc:100
+msgid "Trying to remove a team which is not in the teamlist!"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:200
+#: qcsrc/client/csqcmodel_hooks.qc:17
 #, c-format
-msgid "%d seconds left"
+msgid "Trying to use non existing model %s. "
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:263
-msgid ""
-"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
+#: qcsrc/client/csqcmodel_hooks.qc:19
+#, c-format
+msgid "Reverted to %s.\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:273
-msgid "^1Error:^7 Couldn't find pak index.\n"
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:282
-msgid "Requesting preview...\n"
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
 msgstr ""
 
-#: qcsrc/client/Main.qc:30
-msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
 msgstr ""
 
-#: qcsrc/client/Main.qc:56
-msgid ""
-"^3Your engine build is outdated\n"
-"^3This Server uses a newer QC VM. Please update!\n"
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
 msgstr ""
 
-#: qcsrc/client/Main.qc:66
-#, c-format
-msgid "^4CSQC Build information: ^1%s\n"
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
 msgstr ""
 
-#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
-#, c-format
-msgid "trying to switch to unsupported team %d\n"
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
 msgstr ""
 
-#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
-msgid "Usage:\n"
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
 msgstr ""
 
-#: qcsrc/client/Main.qc:370
-msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
 msgstr ""
 
-#: qcsrc/client/Main.qc:494
-msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
 msgstr ""
 
-#: qcsrc/client/Main.qc:495
-msgid "  settemp cvar value\n"
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
 msgstr ""
 
-#: qcsrc/client/Main.qc:496
-msgid "  scoreboard_columns_set ...\n"
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
 msgstr ""
 
-#: qcsrc/client/Main.qc:497
-msgid "  scoreboard_columns_help\n"
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
 msgstr ""
 
-#: qcsrc/client/Main.qc:726
-#, c-format
-msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
 msgstr ""
 
-#: qcsrc/client/Main.qc:964
-#, c-format
-msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
 msgstr ""
 
-#: qcsrc/client/Main.qc:1005
-#, c-format
-msgid ""
-"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
-"%s)\n"
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
 msgstr ""
 
-#: qcsrc/client/Main.qc:1451
-#, c-format
-msgid "%s (not bound)"
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
 msgstr ""
 
-#: qcsrc/client/Main.qc:1456 qcsrc/client/hud.qc:230
-#, c-format
-msgid "%s (%s)"
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
 msgstr ""
 
-#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
-#, c-format
-msgid "Cannot initialize sound %s\n"
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
 msgstr ""
 
-#: qcsrc/client/hud.qc:160
-msgid "1st"
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
 msgstr ""
 
-#: qcsrc/client/hud.qc:162
-msgid "2nd"
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
 msgstr ""
 
-#: qcsrc/client/hud.qc:164
-msgid "3rd"
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
 msgstr ""
 
-#: qcsrc/client/hud.qc:166
-#, c-format
-msgid "%dth"
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
 msgstr ""
 
-#: qcsrc/client/hud.qc:198
-#, c-format
-msgid " (-%dL)"
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
 msgstr ""
 
-#: qcsrc/client/hud.qc:203
-#, c-format
-msgid " (+%dL)"
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
 msgstr ""
 
-#: qcsrc/client/hud.qc:219
-msgid "Start line"
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
 msgstr ""
 
-#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
-msgid "Finish line"
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
 msgstr ""
 
-#: qcsrc/client/hud.qc:223
-#, c-format
-msgid "Intermediate %d"
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
 msgstr ""
 
-#: qcsrc/client/hud.qc:232
-#, c-format
-msgid "%s (%s %s)"
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
 msgstr ""
 
-#: qcsrc/client/hud.qc:772
-msgid "Out of ammo"
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
 msgstr ""
 
-#: qcsrc/client/hud.qc:776
-msgid "Don't have"
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/client/hud.qc:780
-msgid "Unavailable"
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1520
-#, c-format
-msgid "^1%s^1 couldn't take it anymore\n"
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1524 qcsrc/client/hud.qc:1828
-#, c-format
-msgid "^1%s^1 died\n"
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1528
-#, c-format
-msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1532
-#, c-format
-msgid "^1%s^1 thought they found a nice camping ground\n"
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1536
-#, c-format
-msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1540
-#, c-format
-msgid "^1%s^1 unfairly eliminated themself\n"
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1544
-#, c-format
-msgid "^1%s^1 burned to death\n"
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1548
-#, c-format
-msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1552
-#, c-format
-msgid "^1%s^1 ended it all after a %d kill spree\n"
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1569
-#, c-format
-msgid "^1%s^1 took action against a team mate\n"
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1571
-#, c-format
-msgid "^1%s^1 mows down a team mate\n"
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1576
-#, c-format
-msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1578
-#, c-format
-msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1582
-#, c-format
-msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1584
-#, c-format
-msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1588
-#, c-format
-msgid "^1%s^1 drew first blood\n"
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1592
-#, c-format
-msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
+#: qcsrc/client/waypointsprites.qc:590 qcsrc/client/tturrets.qc:285
+msgid "Spam"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1594
+#: qcsrc/client/waypointsprites.qc:594
 #, c-format
-msgid "^1%s^1 was telefragged by %s\n"
+msgid "%s needing help!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1599
-#, c-format
-msgid "^1%s^1 was drowned by %s\n"
+#: qcsrc/client/Main.qc:30
+msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1604
-#, c-format
-msgid "^1%s^1 was slimed by %s\n"
+#: qcsrc/client/Main.qc:104
+msgid ""
+"^3Your engine build is outdated\n"
+"^3This Server uses a newer QC VM. Please update!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1609
+#: qcsrc/client/Main.qc:114
 #, c-format
-msgid "^1%s^1 was cooked by %s\n"
+msgid "^4CSQC Build information: ^1%s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1614
+#: qcsrc/client/Main.qc:293 qcsrc/client/Main.qc:309
 #, c-format
-msgid "^1%s^1 was grounded by %s\n"
+msgid "trying to switch to unsupported team %d\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1619
-#, c-format
-msgid "^1%s^1 was shot into space by %s\n"
+#: qcsrc/client/Main.qc:424 qcsrc/client/scoreboard.qc:241
+msgid "Usage:\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1624
-#, c-format
-msgid "^1%s^1 was conserved by %s\n"
+#: qcsrc/client/Main.qc:425
+msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1630
-#, c-format
-msgid "^1%s^1 was thrown into a world of hurt by %s\n"
+#: qcsrc/client/Main.qc:549
+msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1634
-#, c-format
-msgid "^1%s^1 was crushed by %s\n"
+#: qcsrc/client/Main.qc:550
+msgid "  settemp cvar value\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1638
-#, c-format
-msgid "^1%s^1 got shredded by %s\n"
+#: qcsrc/client/Main.qc:551
+msgid "  scoreboard_columns_set ...\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1642
-#, c-format
-msgid "^1%s^1 was blasted to bits by %s\n"
+#: qcsrc/client/Main.qc:552
+msgid "  scoreboard_columns_help\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1646
+#: qcsrc/client/Main.qc:788
 #, c-format
-msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
-msgstr ""
-
-#: qcsrc/client/hud.qc:1650
-#, c-format
-msgid "^1%s^1 was bolted down by %s\n"
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1654
+#: qcsrc/client/Main.qc:1029
 #, c-format
-msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
+msgid ""
+"A CSQC entity changed its type! (edict: %d, server: %d, type: %d -> %d)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1658
+#: qcsrc/client/Main.qc:1038
 #, c-format
-msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
+msgid ""
+"A CSQC entity appeared out of nowhere! (edict: %d, server: %d, type: %d)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1662
+#: qcsrc/client/Main.qc:1080
 #, c-format
-msgid "^1%s^1 nailed to hell by %s\n"
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1666
+#: qcsrc/client/Main.qc:1526
 #, c-format
-msgid "^1%s^1 cluster crushed by %s\n"
+msgid "%s (not bound)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1670
+#: qcsrc/client/Main.qc:1531 qcsrc/client/hud.qc:230
 #, c-format
-msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgid "%s (%s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1674
+#: qcsrc/client/movetypes.qc:163
 #, c-format
-msgid "^1%s^1 was pushed into the line of fire by %s\n"
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1678
+#: qcsrc/client/movetypes.qc:166
 #, c-format
-msgid "^1%s^1 was pushed into an accident by %s\n"
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1682
-#, c-format
-msgid "^1%s^1 was unfairly eliminated by %s\n"
+#: qcsrc/client/scoreboard.qc:19
+msgid "SCO^bckills"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1686
-#, c-format
-msgid "^1%s^1 was burnt to death by %s\n"
+#: qcsrc/client/scoreboard.qc:20
+msgid "SCO^bctime"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1698
-#, c-format
-msgid "^1%s^1 was fragged by %s\n"
+#: qcsrc/client/scoreboard.qc:21
+msgid "SCO^caps"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1703
-#, c-format
-msgid "^1%s^1's %s scoring spree was ended by %s\n"
+#: qcsrc/client/scoreboard.qc:22
+msgid "SCO^deaths"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1705
-#, c-format
-msgid "^1%s^1's %s kill spree was ended by %s\n"
+#: qcsrc/client/scoreboard.qc:23
+msgid "SCO^destroyed"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1708
-#, c-format
-msgid "^1%s^1 made %s scores in a row\n"
+#: qcsrc/client/scoreboard.qc:24
+msgid "SCO^drops"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1710
-#, c-format
-msgid "^1%s^1 has %s frags in a row\n"
+#: qcsrc/client/scoreboard.qc:25
+msgid "SCO^faults"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1713
-#, c-format
-msgid "%s^7 made a ^1TRIPLE SCORE\n"
+#: qcsrc/client/scoreboard.qc:26
+msgid "SCO^fckills"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1715
-#, c-format
-msgid "%s^7 made a ^1TRIPLE FRAG\n"
+#: qcsrc/client/scoreboard.qc:27
+msgid "SCO^goals"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1718
-#, c-format
-msgid "%s^7 unleashes ^1SCORING RAGE\n"
+#: qcsrc/client/scoreboard.qc:28
+msgid "SCO^kckills"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1720
-#, c-format
-msgid "%s^7 unleashes ^1RAGE\n"
+#: qcsrc/client/scoreboard.qc:29
+msgid "SCO^kdratio"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1723
-#, c-format
-msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
+#: qcsrc/client/scoreboard.qc:30
+msgid "SCO^k/d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1725
-#, c-format
-msgid "%s^7 starts the ^1MASSACRE!\n"
+#: qcsrc/client/scoreboard.qc:31
+msgid "SCO^kd"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1728
-#, c-format
-msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
+#: qcsrc/client/scoreboard.qc:32
+msgid "SCO^kdr"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1730
-#, c-format
-msgid "%s^7 executes ^1MAYHEM!\n"
+#: qcsrc/client/scoreboard.qc:33
+msgid "SCO^kills"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1733
-#, c-format
-msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
+#: qcsrc/client/scoreboard.qc:34
+msgid "SCO^laps"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1735
-#, c-format
-msgid "%s^7 is a ^1BERSERKER!\n"
+#: qcsrc/client/scoreboard.qc:35
+msgid "SCO^lives"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1738
-#, c-format
-msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
+#: qcsrc/client/scoreboard.qc:36
+msgid "SCO^losses"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1740
-#, c-format
-msgid "%s^7 inflicts ^1CARNAGE!\n"
+#: qcsrc/client/scoreboard.qc:37
+msgid "SCO^name"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1743
-#, c-format
-msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
+#: qcsrc/client/scoreboard.qc:38
+msgid "SCO^nick"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1745
-#, c-format
-msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
+#: qcsrc/client/scoreboard.qc:39
+msgid "SCO^objectives"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1753
-#, c-format
-msgid "^1%s^1 was in the water for too long\n"
+#: qcsrc/client/scoreboard.qc:40
+msgid "SCO^pickups"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1755
-#, c-format
-msgid "^1%s^1 drowned\n"
+#: qcsrc/client/scoreboard.qc:41
+msgid "SCO^ping"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1760
-#, c-format
-msgid "^1%s^1 was slimed\n"
+#: qcsrc/client/scoreboard.qc:42
+msgid "SCO^pl"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1766
-#, c-format
-msgid "^1%s^1 found a hot place\n"
+#: qcsrc/client/scoreboard.qc:43
+msgid "SCO^pushes"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1768
-#, c-format
-msgid "^1%s^1 turned into hot slag\n"
+#: qcsrc/client/scoreboard.qc:44
+msgid "SCO^rank"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1775
-#, c-format
-msgid "^1%s^1 tested gravity (and it worked)\n"
+#: qcsrc/client/scoreboard.qc:45
+msgid "SCO^returns"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1777
-#, c-format
-msgid "^1%s^1 hit the ground with a crunch\n"
+#: qcsrc/client/scoreboard.qc:46
+msgid "SCO^revivals"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1782
-#, c-format
-msgid "^1%s^1 became a shooting star\n"
+#: qcsrc/client/scoreboard.qc:47
+msgid "SCO^score"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1788
-#, c-format
-msgid "^1%s^1 discovered a swamp\n"
+#: qcsrc/client/scoreboard.qc:48
+msgid "SCO^suicides"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1790
-#, c-format
-msgid "^1%s^1 is now conserved for centuries to come\n"
+#: qcsrc/client/scoreboard.qc:49
+msgid "SCO^takes"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1795
-#, c-format
-msgid "^1%s^1 was mowed down by a turret \n"
+#: qcsrc/client/scoreboard.qc:50
+msgid "SCO^ticks"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1807
-#, c-format
-msgid "^1%s^1 died in an accident\n"
+#: qcsrc/client/scoreboard.qc:239
+msgid ""
+"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1811
-#, c-format
-msgid "^1%s^1 was unfairly eliminated\n"
+#: qcsrc/client/scoreboard.qc:240
+msgid "^3|---------------------------------------------------------------|\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1817
-#, c-format
-msgid "^1%s^1 felt a little hot\n"
+#: qcsrc/client/scoreboard.qc:242
+msgid "^2scoreboard_columns_set default\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1819
-#, c-format
-msgid "^1%s^1 burnt to death\n"
+#: qcsrc/client/scoreboard.qc:243
+msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1826
-#, c-format
-msgid "^1%s^1 needs a restart\n"
+#: qcsrc/client/scoreboard.qc:244
+msgid "The following field names are recognized (case insensitive):\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1833
-#, c-format
-msgid "^1%s^1 needs a restart after a %d scoring spree\n"
+#: qcsrc/client/scoreboard.qc:245
+msgid ""
+"You can use a ^3|^7 to start the right-aligned fields.\n"
+"\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1835
-#, c-format
-msgid "^1%s^1 died with a %d kill spree\n"
+#: qcsrc/client/scoreboard.qc:247
+msgid "^3name^7 or ^3nick^7             Name of a player\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1839
-#, c-format
-msgid "%s^7 got the %s\n"
+#: qcsrc/client/scoreboard.qc:248
+msgid "^3ping^7                     Ping time\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1842
-#, c-format
-msgid "%s^7 lost the %s\n"
+#: qcsrc/client/scoreboard.qc:249
+msgid "^3pl^7                       Packet loss\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1845
-#, c-format
-msgid "%s^7 picked up the %s\n"
+#: qcsrc/client/scoreboard.qc:250
+msgid "^3kills^7                    Number of kills\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1848
-#, c-format
-msgid "%s^7 returned the %s\n"
+#: qcsrc/client/scoreboard.qc:251
+msgid "^3deaths^7                   Number of deaths\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1851
-#, c-format
-msgid "%s^7 captured the %s%s\n"
+#: qcsrc/client/scoreboard.qc:252
+msgid "^3suicides^7                 Number of suicides\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1870
-#, c-format
-msgid "%s^7 has picked up the ball!\n"
+#: qcsrc/client/scoreboard.qc:253
+msgid "^3frags^7                    kills - suicides\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1875
-#, c-format
-msgid "%s^7 has dropped the ball!\n"
+#: qcsrc/client/scoreboard.qc:254
+msgid "^3kd^7                       The kill-death ratio\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1886
-#, c-format
-msgid "You are now on: %s"
+#: qcsrc/client/scoreboard.qc:255
+msgid ""
+"^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "
+"captured\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1888
-#, c-format
+#: qcsrc/client/scoreboard.qc:256
 msgid ""
-"You have been moved into a different team to improve team balance\n"
-"You are now on: %s"
+"^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "
+"ball (Keepaway) was picked up\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1891
-msgid "^1Reconsider your tactics, camper!"
+#: qcsrc/client/scoreboard.qc:257
+msgid "^3fckills^7                  Number of flag carrier kills\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1893
-msgid "^1Die camper!"
+#: qcsrc/client/scoreboard.qc:258
+msgid "^3returns^7                  Number of flag returns\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1896
-msgid "^1You are reinserted into the game for running out of ammo..."
+#: qcsrc/client/scoreboard.qc:259
+msgid "^3drops^7                    Number of flag drops\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1898
-msgid "^1You were killed for running out of ammo..."
+#: qcsrc/client/scoreboard.qc:260
+msgid "^3lives^7                    Number of lives (LMS)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1901
-msgid "^1You need to preserve your health"
+#: qcsrc/client/scoreboard.qc:261
+msgid "^3rank^7                     Player rank\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1903
-msgid "^1You grew too old without taking your medicine"
+#: qcsrc/client/scoreboard.qc:262
+msgid "^3pushes^7                   Number of players pushed into void\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1906
-msgid "^1Don't go against team mates!"
+#: qcsrc/client/scoreboard.qc:263
+msgid ""
+"^3destroyed^7                Number of keys destroyed by pushing them into "
+"void\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1908
-msgid "^1Don't shoot your team mates!"
+#: qcsrc/client/scoreboard.qc:264
+msgid "^3kckills^7                  Number of keys carrier kills\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1913
-msgid "^1You need to be more careful!"
+#: qcsrc/client/scoreboard.qc:265
+msgid "^3losses^7                   Number of times a key was lost\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1915
-msgid "^1You killed your own dumb self!"
+#: qcsrc/client/scoreboard.qc:266
+msgid "^3laps^7                     Number of laps finished (race/cts)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1920
-#, c-format
-msgid "^1Moron! You went against ^7%s^1, a team mate!"
+#: qcsrc/client/scoreboard.qc:267
+msgid "^3time^7                     Total time raced (race/cts)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1922
-#, c-format
-msgid "^1Moron! You fragged ^7%s^1, a team mate!"
+#: qcsrc/client/scoreboard.qc:268
+msgid "^3fastest^7                  Time of fastest lap (race/cts)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1926
-msgid "^1First score"
+#: qcsrc/client/scoreboard.qc:269
+msgid "^3ticks^7                    Number of ticks (DOM)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1928
-msgid "^1First blood"
+#: qcsrc/client/scoreboard.qc:270
+msgid "^3takes^7                    Number of domination points taken (DOM)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1932
-msgid "^1First casualty"
+#: qcsrc/client/scoreboard.qc:271
+msgid "^3bckills^7                  Number of ball carrier kills\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1934
-msgid "^1First victim"
+#: qcsrc/client/scoreboard.qc:272
+msgid ""
+"^3bctime^7                   Total amount of time holding the ball in "
+"Keepaway\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1938
-#, c-format
-msgid "^1You scored against ^7%s^1 who was typing!"
+#: qcsrc/client/scoreboard.qc:273
+msgid ""
+"^3score^7                    Total score\n"
+"\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1940
-#, c-format
-msgid "^1You typefragged ^7%s"
+#: qcsrc/client/scoreboard.qc:275
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"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.\n"
+"\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1944
-#, c-format
-msgid "^1You were scored against by ^7%s^1 while you were typing!"
+#: qcsrc/client/scoreboard.qc:280
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes.\n"
+"\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1946
-#, c-format
-msgid "^1You were typefragged by ^7%s"
+#: qcsrc/client/scoreboard.qc:283
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1950
-#, c-format
-msgid "^4You scored against ^7%s"
+#: qcsrc/client/scoreboard.qc:284
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1952
+#: qcsrc/client/scoreboard.qc:286
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM.\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447
+#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466
+#: qcsrc/client/scoreboard.qc:475
 #, c-format
-msgid "^4You fragged ^7%s"
+msgid "fixed missing field '%s'\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1956
+#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
+msgid "N/A"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:950
 #, c-format
-msgid "^1You were scored against by ^7%s"
+msgid "Accuracy stats (average %d%%)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1958
+#: qcsrc/client/scoreboard.qc:1015
 #, c-format
-msgid "^1You were fragged by ^7%s"
+msgid "%d%%"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1963
-msgid "^1Watch your step!"
+#: qcsrc/client/scoreboard.qc:1085
+msgid "Map stats:"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2032 qcsrc/client/hud.qc:2033 qcsrc/client/hud.qc:2518
-#, c-format
-msgid "Player %d"
+#: qcsrc/client/scoreboard.qc:1101
+msgid "Secrets found:"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2823
-msgid "^1Intermediate 1 (+15.42)"
+#: qcsrc/client/scoreboard.qc:1128
+msgid "Rankings"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2825 qcsrc/client/hud.qc:2867 qcsrc/client/hud.qc:2908
-#, c-format
-msgid "^1PENALTY: %.1f (%s)"
+#: qcsrc/client/scoreboard.qc:1223
+msgid "Scoreboard"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2910
+#: qcsrc/client/scoreboard.qc:1268
 #, c-format
-msgid "^2PENALTY: %.1f (%s)"
+msgid "Speed award: %d ^7(%s^7)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2938
-msgid "^1You must answer before entering hud configure mode\n"
+#: qcsrc/client/scoreboard.qc:1272
+#, c-format
+msgid "All-time fastest: %d ^7(%s^7)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2941
-msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
+#: qcsrc/client/scoreboard.qc:1305 qcsrc/client/teamplay.qc:63
+msgid "Spectators"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3023
-msgid "A vote has been called for:"
+#: qcsrc/client/scoreboard.qc:1311
+#, c-format
+msgid "playing on ^2%s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3025
-msgid "Allow servers to store and display your name?"
+#: qcsrc/client/scoreboard.qc:1318 qcsrc/client/scoreboard.qc:1323
+#, c-format
+msgid " for up to ^1%1.0f minutes^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3029
-msgid "^1Configure the HUD"
+#: qcsrc/client/scoreboard.qc:1327 qcsrc/client/scoreboard.qc:1346
+msgid " or"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3033
+#: qcsrc/client/scoreboard.qc:1330 qcsrc/client/scoreboard.qc:1337
 #, c-format
-msgid "Yes (%s): %d"
+msgid " until ^3%s %s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3035
+#: qcsrc/client/scoreboard.qc:1331 qcsrc/client/scoreboard.qc:1338
+#: qcsrc/client/scoreboard.qc:1350 qcsrc/client/scoreboard.qc:1357
+msgid "SCO^points"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:1332 qcsrc/client/scoreboard.qc:1339
+#: qcsrc/client/scoreboard.qc:1351 qcsrc/client/scoreboard.qc:1358
+msgid "SCO^is beaten"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:1349 qcsrc/client/scoreboard.qc:1356
 #, c-format
-msgid "No (%s): %d"
+msgid " until a lead of ^3%s %s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3538 qcsrc/client/hud.qc:3541 qcsrc/client/hud.qc:3543
-msgid "Personal best"
+#: qcsrc/client/teamplay.qc:64
+msgid "Red Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3556 qcsrc/client/hud.qc:3559 qcsrc/client/hud.qc:3561
-msgid "Server best"
+#: qcsrc/client/teamplay.qc:65
+msgid "Blue Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3905
-msgid "^3Player^7: This is the chat area."
+#: qcsrc/client/teamplay.qc:66
+msgid "Yellow Team"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:67
+msgid "Pink Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3973
+#: qcsrc/client/tturrets.qc:294
 #, c-format
-msgid "FPS: %.*f"
+msgid "%s under attack!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4040
-msgid "^1Observing"
+#: qcsrc/client/mapvoting.qc:28
+msgid " (1 vote)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4042
+#: qcsrc/client/mapvoting.qc:30
 #, c-format
-msgid "^1Spectating: ^7%s"
+msgid " (%d votes)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4046
-#, c-format
-msgid "^1Press ^3%s^1 to spectate"
+#: qcsrc/client/mapvoting.qc:113
+msgid "Don't care"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4048
-#, c-format
-msgid "^1Press ^3%s^1 for another player"
+#: qcsrc/client/mapvoting.qc:194
+msgid "Vote for a map"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4052
+#: qcsrc/client/mapvoting.qc:200
 #, c-format
-msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgid "%d seconds left"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4054
-#, c-format
-msgid "^1Press ^3%s^1 to observe"
+#: qcsrc/client/mapvoting.qc:263
+msgid ""
+"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4057
-#, c-format
-msgid "^1Press ^3%s^1 for gamemode info"
+#: qcsrc/client/mapvoting.qc:273
+msgid "^1Error:^7 Couldn't find pak index.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4061
-msgid "^1Wait for your turn to join"
+#: qcsrc/client/mapvoting.qc:282
+msgid "Requesting preview...\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4067
-msgid "^1Match has already begun"
+#: qcsrc/client/announcer.qc:31
+msgid "^1Begin!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4069
-msgid "^1You have no more lives left"
+#: qcsrc/client/announcer.qc:41
+#, c-format
+msgid "^1Game starts in %d seconds"
+msgstr ""
+
+#: qcsrc/client/announcer.qc:153
+msgid "^1RED^7 flag"
+msgstr ""
+
+#: qcsrc/client/announcer.qc:158
+msgid "^4BLUE^7 flag"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4071 qcsrc/client/hud.qc:4074
+#: qcsrc/client/announcer.qc:166
 #, c-format
-msgid "^1Press ^3%s^1 to join"
+msgid "You picked up the %s!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4082
+#: qcsrc/client/announcer.qc:170
 #, c-format
-msgid "^1Game starts in ^3%d^1 seconds"
+msgid "You got the %s!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4089
-msgid "^2Currently in ^1warmup^2 stage!"
+#: qcsrc/client/hud.qc:160
+msgid "1st"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4104
+#: qcsrc/client/hud.qc:162
+msgid "2nd"
+msgstr ""
+
+#: qcsrc/client/hud.qc:164
+msgid "3rd"
+msgstr ""
+
+#: qcsrc/client/hud.qc:166
 #, c-format
-msgid "%sPress ^3%s%s to end warmup"
+msgid "%dth"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4106
+#: qcsrc/client/hud.qc:198
 #, c-format
-msgid "%sPress ^3%s%s once you are ready"
+msgid " (-%dL)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4111
-msgid "^2Waiting for others to ready up to end warmup..."
+#: qcsrc/client/hud.qc:203
+#, c-format
+msgid " (+%dL)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4113
-msgid "^2Waiting for others to ready up..."
+#: qcsrc/client/hud.qc:219
+msgid "Start line"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4119
-#, c-format
-msgid "^2Press ^3%s^2 to end warmup"
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
+msgid "Finish line"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4140
-msgid "Teamnumbers are unbalanced!"
+#: qcsrc/client/hud.qc:223
+#, c-format
+msgid "Intermediate %d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4145
+#: qcsrc/client/hud.qc:232
 #, c-format
-msgid " Press ^3%s%s to adjust"
+msgid "%s (%s %s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4153
-msgid "^7Press ^3ESC ^7to show HUD options."
+#: qcsrc/client/hud.qc:786
+msgid "Out of ammo"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4155
-msgid "^3Doubleclick ^7a panel for panel-specific options."
+#: qcsrc/client/hud.qc:790
+msgid "Don't have"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4157
-msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+#: qcsrc/client/hud.qc:794
+msgid "Unavailable"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4159
-msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+#: qcsrc/client/hud.qc:1534
+#, c-format
+msgid "^1%s^1 couldn't take it anymore\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4197
-msgid " qu/s"
+#: qcsrc/client/hud.qc:1538 qcsrc/client/hud.qc:1887
+#, c-format
+msgid "^1%s^1 died\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4201
-msgid " m/s"
+#: qcsrc/client/hud.qc:1542
+#, c-format
+msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4205
-msgid " km/h"
+#: qcsrc/client/hud.qc:1546
+#, c-format
+msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4209
-msgid " mph"
+#: qcsrc/client/hud.qc:1550
+#, c-format
+msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4213
-msgid " knots"
+#: qcsrc/client/hud.qc:1554
+#, c-format
+msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4860
-msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+#: qcsrc/client/hud.qc:1558
+#, c-format
+msgid "^1%s^1 burned to death\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:254
-msgid "Push"
+#: qcsrc/client/hud.qc:1562
+#, c-format
+msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:255
-msgid "Destroy"
+#: qcsrc/client/hud.qc:1566
+#, c-format
+msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:256
-msgid "Defend"
+#: qcsrc/client/hud.qc:1583
+#, c-format
+msgid "^1%s^1 took action against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:257
-msgid "Blue base"
+#: qcsrc/client/hud.qc:1585
+#, c-format
+msgid "^1%s^1 mows down a team mate\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:258
-msgid "DANGER"
+#: qcsrc/client/hud.qc:1590
+#, c-format
+msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:259
-msgid "Flag carrier"
+#: qcsrc/client/hud.qc:1592
+#, c-format
+msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:260
-msgid "Dropped flag"
+#: qcsrc/client/hud.qc:1596
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:261
-msgid "Help me!"
+#: qcsrc/client/hud.qc:1598
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:262
-msgid "Here"
+#: qcsrc/client/hud.qc:1602
+#, c-format
+msgid "^1%s^1 drew first blood\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:263
-msgid "Dropped key"
+#: qcsrc/client/hud.qc:1606
+#, c-format
+msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
-#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
-#: qcsrc/client/waypointsprites.qc:269
-msgid "Key carrier"
+#: qcsrc/client/hud.qc:1608
+#, c-format
+msgid "^1%s^1 was telefragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:265
-msgid "Run here"
+#: qcsrc/client/hud.qc:1613
+#, c-format
+msgid "^1%s^1 was drowned by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:270
-msgid "Red base"
+#: qcsrc/client/hud.qc:1618
+#, c-format
+msgid "^1%s^1 was slimed by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:271
-msgid "Waypoint"
+#: qcsrc/client/hud.qc:1623
+#, c-format
+msgid "^1%s^1 was cooked by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
-#: qcsrc/client/waypointsprites.qc:274
-msgid "Generator"
+#: qcsrc/client/hud.qc:1628
+#, c-format
+msgid "^1%s^1 was grounded by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
-#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
-#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
-#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
-#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
-#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
-#: qcsrc/client/waypointsprites.qc:310
-msgid "Control point"
+#: qcsrc/client/hud.qc:1633
+#, c-format
+msgid "^1%s^1 was shot into space by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:283
-msgid "Checkpoint"
+#: qcsrc/client/hud.qc:1638
+#, c-format
+msgid "^1%s^1 was conserved by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
-msgid "Finish"
+#: qcsrc/client/hud.qc:1644
+#, c-format
+msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
-msgid "Start"
+#: qcsrc/client/hud.qc:1648
+#, c-format
+msgid "^1%s^1 was crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
-msgid "Ball"
+#: qcsrc/client/hud.qc:1652
+#, c-format
+msgid "^1%s^1 got shredded by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:289
-msgid "Ball carrier"
+#: qcsrc/client/hud.qc:1656
+#, c-format
+msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
-msgid "Laser"
+#: qcsrc/client/hud.qc:1660
+#, c-format
+msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
+#: qcsrc/client/hud.qc:1664
+#, c-format
+msgid "^1%s^1 was bolted down by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
+#: qcsrc/client/hud.qc:1668
+#, c-format
+msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
+#: qcsrc/client/hud.qc:1672
+#, c-format
+msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
-msgid "Electro"
+#: qcsrc/client/hud.qc:1676
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
+#: qcsrc/client/hud.qc:1680
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
-msgid "Nex"
+#: qcsrc/client/hud.qc:1684
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
+#: qcsrc/client/hud.qc:1688
+#, c-format
+msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/client/hud.qc:1692
+#, c-format
+msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
+#: qcsrc/client/hud.qc:1696
+#, c-format
+msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:300
-msgid "Minstanex"
+#: qcsrc/client/hud.qc:1700
+#, c-format
+msgid "^1%s^1 was burnt to death by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:301
-msgid "Hook"
+#: qcsrc/client/hud.qc:1712
+#, c-format
+msgid "^1%s^1 was fragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
+#: qcsrc/client/hud.qc:1717
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:303
-msgid "HLAC"
+#: qcsrc/client/hud.qc:1719
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
-msgid "Rifle"
+#: qcsrc/client/hud.qc:1722
+#, c-format
+msgid "^1%s^1 made %s scores in a row\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
+#: qcsrc/client/hud.qc:1724
+#, c-format
+msgid "^1%s^1 has %s frags in a row\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:311
-msgid "Invisibility"
+#: qcsrc/client/hud.qc:1727
+#, c-format
+msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:312
-msgid "Extra life"
+#: qcsrc/client/hud.qc:1729
+#, c-format
+msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:313
-msgid "Speed"
+#: qcsrc/client/hud.qc:1732
+#, c-format
+msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:314
-msgid "Strength"
+#: qcsrc/client/hud.qc:1734
+#, c-format
+msgid "%s^7 unleashes ^1RAGE\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:315
-msgid "Shield"
+#: qcsrc/client/hud.qc:1737
+#, c-format
+msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:316
-msgid "Fuel regen"
+#: qcsrc/client/hud.qc:1739
+#, c-format
+msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:317
-msgid "Jet Pack"
+#: qcsrc/client/hud.qc:1742
+#, c-format
+msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:1744
+#, c-format
+msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:318
-msgid "Frozen!"
+#: qcsrc/client/hud.qc:1747
+#, c-format
+msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:319
-msgid "Tagged"
+#: qcsrc/client/hud.qc:1749
+#, c-format
+msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:320
-msgid "Vehicle"
+#: qcsrc/client/hud.qc:1752
+#, c-format
+msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:590
-msgid "Spam"
+#: qcsrc/client/hud.qc:1754
+#, c-format
+msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr ""
 
-#: qcsrc/client/waypointsprites.qc:594
+#: qcsrc/client/hud.qc:1757
 #, c-format
-msgid "%s needing help!"
+msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/hud_config.qc:136
+#: qcsrc/client/hud.qc:1759
 #, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr ""
 
-#: qcsrc/client/hud_config.qc:140
+#: qcsrc/client/hud.qc:1767
 #, c-format
-msgid "^1Couldn't write to %s\n"
+msgid "^1%s^1 was in the water for too long\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:19
-msgid "SCO^bckills"
+#: qcsrc/client/hud.qc:1769
+#, c-format
+msgid "^1%s^1 drowned\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:20
-msgid "SCO^bctime"
+#: qcsrc/client/hud.qc:1774
+#, c-format
+msgid "^1%s^1 was slimed\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:21
-msgid "SCO^caps"
+#: qcsrc/client/hud.qc:1780
+#, c-format
+msgid "^1%s^1 found a hot place\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:22
-msgid "SCO^deaths"
+#: qcsrc/client/hud.qc:1782
+#, c-format
+msgid "^1%s^1 turned into hot slag\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:23
-msgid "SCO^destroyed"
+#: qcsrc/client/hud.qc:1789
+#, c-format
+msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:24
-msgid "SCO^drops"
+#: qcsrc/client/hud.qc:1791
+#, c-format
+msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:25
-msgid "SCO^faults"
+#: qcsrc/client/hud.qc:1796
+#, c-format
+msgid "^1%s^1 became a shooting star\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:26
-msgid "SCO^fckills"
+#: qcsrc/client/hud.qc:1802
+#, c-format
+msgid "^1%s^1 discovered a swamp\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:27
-msgid "SCO^goals"
+#: qcsrc/client/hud.qc:1804
+#, c-format
+msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:28
-msgid "SCO^kckills"
+#: qcsrc/client/hud.qc:1811
+#, c-format
+msgid "^1%s^1 ran into a turret\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:29
-msgid "SCO^kdratio"
+#: qcsrc/client/hud.qc:1817
+#, c-format
+msgid "^1%s^1 was laserd down by a eWheel turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:30
-msgid "SCO^k/d"
+#: qcsrc/client/hud.qc:1820
+#, c-format
+msgid "^1%s^1 got caught in the flac \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:31
-msgid "SCO^kd"
+#: qcsrc/client/hud.qc:1823
+#, c-format
+msgid "^1%s^1 was riddeld full of riddled by a machinegun turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:32
-msgid "SCO^kdr"
+#: qcsrc/client/hud.qc:1826
+#, c-format
+msgid "^1%s^1 got served a led enrichment by a walker turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:33
-msgid "SCO^kills"
+#: qcsrc/client/hud.qc:1829
+#, c-format
+msgid "^1%s^1 was impaled by a walker turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:34
-msgid "SCO^laps"
+#: qcsrc/client/hud.qc:1832
+#, c-format
+msgid "^1%s^1 was rocketed to hell by a walker turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:35
-msgid "SCO^lives"
+#: qcsrc/client/hud.qc:1835
+#, c-format
+msgid "^1%s^1 was blasted away hellion turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:36
-msgid "SCO^losses"
+#: qcsrc/client/hud.qc:1838
+#, c-format
+msgid "^1%s^1 could not hide from the hunter turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:37
-msgid "SCO^name"
+#: qcsrc/client/hud.qc:1841
+#, c-format
+msgid "^1%s^1 got turned into smoldering gibs by a mlrs turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:38
-msgid "SCO^nick"
+#: qcsrc/client/hud.qc:1844
+#, c-format
+msgid "^1%s^1 got served some superheated plasma from a plasma turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:39
-msgid "SCO^objectives"
+#: qcsrc/client/hud.qc:1847
+#, c-format
+msgid "^1%s^1 was phased out \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:40
-msgid "SCO^pickups"
+#: qcsrc/client/hud.qc:1850
+#, c-format
+msgid "^1%s^1 was electrocuted by a tesla turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:41
-msgid "SCO^ping"
+#: qcsrc/client/hud.qc:1866
+#, c-format
+msgid "^1%s^1 died in an accident\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:42
-msgid "SCO^pl"
+#: qcsrc/client/hud.qc:1870
+#, c-format
+msgid "^1%s^1 was unfairly eliminated\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:43
-msgid "SCO^pushes"
+#: qcsrc/client/hud.qc:1876
+#, c-format
+msgid "^1%s^1 felt a little hot\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:44
-msgid "SCO^rank"
+#: qcsrc/client/hud.qc:1878
+#, c-format
+msgid "^1%s^1 burnt to death\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:45
-msgid "SCO^returns"
+#: qcsrc/client/hud.qc:1885
+#, c-format
+msgid "^1%s^1 needs a restart\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:46
-msgid "SCO^revivals"
+#: qcsrc/client/hud.qc:1892
+#, c-format
+msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:47
-msgid "SCO^score"
+#: qcsrc/client/hud.qc:1894
+#, c-format
+msgid "^1%s^1 died with a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:48
-msgid "SCO^suicides"
+#: qcsrc/client/hud.qc:1898
+#, c-format
+msgid "%s^7 got the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:49
-msgid "SCO^takes"
+#: qcsrc/client/hud.qc:1901
+#, c-format
+msgid "%s^7 lost the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:50
-msgid "SCO^ticks"
+#: qcsrc/client/hud.qc:1904
+#, c-format
+msgid "%s^7 picked up the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:239
-msgid ""
-"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
+#: qcsrc/client/hud.qc:1907
+#, c-format
+msgid "%s^7 returned the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:240
-msgid "^3|---------------------------------------------------------------|\n"
+#: qcsrc/client/hud.qc:1910
+#, c-format
+msgid "%s^7 captured the %s%s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:242
-msgid "^2scoreboard_columns_set default\n"
+#: qcsrc/client/hud.qc:1929
+#, c-format
+msgid "%s^7 has picked up the ball!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7field1 field2 ...\n"
+#: qcsrc/client/hud.qc:1934
+#, c-format
+msgid "%s^7 has dropped the ball!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:244
-msgid "The following field names are recognized (case insensitive):\n"
+#: qcsrc/client/hud.qc:1945
+#, c-format
+msgid "You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:245
+#: qcsrc/client/hud.qc:1947
+#, c-format
 msgid ""
-"You can use a ^3|^7 to start the right-aligned fields.\n"
-"\n"
+"You have been moved into a different team to improve team balance\n"
+"You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:247
-msgid "^3name^7 or ^3nick^7         Name of a player\n"
+#: qcsrc/client/hud.qc:1950
+msgid "^1Reconsider your tactics, camper!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:248
-msgid "^3ping^7                     Ping time\n"
+#: qcsrc/client/hud.qc:1952
+msgid "^1Die camper!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:249
-msgid "^3pl^7                       Packet loss\n"
+#: qcsrc/client/hud.qc:1955
+msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:250
-msgid "^3kills^7                    Number of kills\n"
+#: qcsrc/client/hud.qc:1957
+msgid "^1You were killed for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:251
-msgid "^3deaths^7                   Number of deaths\n"
+#: qcsrc/client/hud.qc:1960
+msgid "^1You need to preserve your health"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:252
-msgid "^3suicides^7                 Number of suicides\n"
+#: qcsrc/client/hud.qc:1962
+msgid "^1You grew too old without taking your medicine"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:253
-msgid "^3frags^7                    kills - suicides\n"
+#: qcsrc/client/hud.qc:1965
+msgid "^1Don't go against team mates!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:254
-msgid "^3kd^7                       The kill-death ratio\n"
+#: qcsrc/client/hud.qc:1967
+msgid "^1Don't shoot your team mates!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:255
-msgid ""
-"^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "
-"captured\n"
+#: qcsrc/client/hud.qc:1972
+msgid "^1You need to be more careful!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:256
-msgid ""
-"^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "
-"ball (Keepaway) was picked up\n"
+#: qcsrc/client/hud.qc:1974
+msgid "^1You killed your own dumb self!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:257
-msgid "^3fckills^7                  Number of flag carrier kills\n"
+#: qcsrc/client/hud.qc:1979
+#, c-format
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:258
-msgid "^3returns^7                  Number of flag returns\n"
+#: qcsrc/client/hud.qc:1981
+#, c-format
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:259
-msgid "^3drops^7                    Number of flag drops\n"
+#: qcsrc/client/hud.qc:1985
+msgid "^1First score"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:260
-msgid "^3lives^7                    Number of lives (LMS)\n"
+#: qcsrc/client/hud.qc:1987
+msgid "^1First blood"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:261
-msgid "^3rank^7                     Player rank\n"
+#: qcsrc/client/hud.qc:1991
+msgid "^1First casualty"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:262
-msgid "^3pushes^7                   Number of players pushed into void\n"
+#: qcsrc/client/hud.qc:1993
+msgid "^1First victim"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:263
-msgid ""
-"^3destroyed^7                Number of keys destroyed by pushing them into "
-"void\n"
+#: qcsrc/client/hud.qc:1997
+#, c-format
+msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:264
-msgid "^3kckills^7                  Number of keys carrier kills\n"
+#: qcsrc/client/hud.qc:1999
+#, c-format
+msgid "^1You typefragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:265
-msgid "^3losses^7                   Number of times a key was lost\n"
+#: qcsrc/client/hud.qc:2003
+#, c-format
+msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:266
-msgid "^3laps^7                     Number of laps finished (race/cts)\n"
+#: qcsrc/client/hud.qc:2005
+#, c-format
+msgid "^1You were typefragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:267
-msgid "^3time^7                     Total time raced (race/cts)\n"
+#: qcsrc/client/hud.qc:2009
+#, c-format
+msgid "^4You scored against ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:268
-msgid "^3fastest^7                  Time of fastest lap (race/cts)\n"
+#: qcsrc/client/hud.qc:2011
+#, c-format
+msgid "^4You fragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:269
-msgid "^3ticks^7                    Number of ticks (DOM)\n"
+#: qcsrc/client/hud.qc:2015
+#, c-format
+msgid "^1You were scored against by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:270
-msgid "^3takes^7                    Number of domination points taken (DOM)\n"
+#: qcsrc/client/hud.qc:2017
+#, c-format
+msgid "^1You were fragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:271
-msgid "^3bckills^7                  Number of ball carrier kills\n"
+#: qcsrc/client/hud.qc:2022
+msgid "^1Watch your step!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:272
-msgid ""
-"^3bctime^7                   Total amount of time holding the ball in "
-"Keepaway\n"
+#: qcsrc/client/hud.qc:2091 qcsrc/client/hud.qc:2092 qcsrc/client/hud.qc:2598
+#, c-format
+msgid "Player %d"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:273
-msgid ""
-"^3score^7                    Total score\n"
-"\n"
+#: qcsrc/client/hud.qc:2907
+msgid "^1Intermediate 1 (+15.42)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:275
-msgid ""
-"Before a field you can put a + or - sign, then a comma separated list\n"
-"of game types, then a slash, to make the field show up only in these\n"
-"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.\n"
-"\n"
+#: qcsrc/client/hud.qc:2909 qcsrc/client/hud.qc:2951 qcsrc/client/hud.qc:2992
+#, c-format
+msgid "^1PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:280
-msgid ""
-"The special game type names 'teams' and 'noteams' can be used to\n"
-"include/exclude ALL teams/noteams game modes.\n"
-"\n"
+#: qcsrc/client/hud.qc:2994
+#, c-format
+msgid "^2PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:283
-msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+#: qcsrc/client/hud.qc:3022
+msgid "^1You must answer before entering hud configure mode\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:284
-msgid ""
-"will display name, ping and pl aligned to the left, and the fields\n"
-"right of the vertical bar aligned to the right.\n"
+#: qcsrc/client/hud.qc:3027
+msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:286
-msgid ""
-"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
-"other gamemodes except DM.\n"
+#: qcsrc/client/hud.qc:3109
+msgid "A vote has been called for:"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447
-#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466
-#: qcsrc/client/scoreboard.qc:475
-#, c-format
-msgid "fixed missing field '%s'\n"
+#: qcsrc/client/hud.qc:3111
+msgid "Allow servers to store and display your name?"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
-msgid "N/A"
+#: qcsrc/client/hud.qc:3115
+msgid "^1Configure the HUD"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:950
+#: qcsrc/client/hud.qc:3119
 #, c-format
-msgid "Accuracy stats (average %d%%)"
+msgid "Yes (%s): %d"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1015
+#: qcsrc/client/hud.qc:3121
 #, c-format
-msgid "%d%%"
+msgid "No (%s): %d"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1075
-msgid "Rankings"
+#: qcsrc/client/hud.qc:3624 qcsrc/client/hud.qc:3627 qcsrc/client/hud.qc:3629
+msgid "Personal best"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1170
-msgid "Scoreboard"
+#: qcsrc/client/hud.qc:3642 qcsrc/client/hud.qc:3645 qcsrc/client/hud.qc:3647
+msgid "Server best"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1215
-#, c-format
-msgid "Speed award: %d ^7(%s^7)"
+#: qcsrc/client/hud.qc:3993
+msgid "^3Player^7: This is the chat area."
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1219
+#: qcsrc/client/hud.qc:4061
 #, c-format
-msgid "All-time fastest: %d ^7(%s^7)"
+msgid "FPS: %.*f"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
-msgid "Spectators"
+#: qcsrc/client/hud.qc:4128
+msgid "^1Observing"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1252
+#: qcsrc/client/hud.qc:4131 qcsrc/client/hud.qc:4133
 #, c-format
-msgid "playing on ^2%s^7"
+msgid "^1Spectating: ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
+#: qcsrc/client/hud.qc:4138
 #, c-format
-msgid " for up to ^1%1.0f minutes^7"
+msgid "^1Press ^3%s^1 to spectate"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
-msgid " or"
+#: qcsrc/client/hud.qc:4140
+#, c-format
+msgid "^1Press ^3%s^1 for another player"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
+#: qcsrc/client/hud.qc:4144
 #, c-format
-msgid " until ^3%s %s^7"
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
-#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
-msgid "SCO^points"
+#: qcsrc/client/hud.qc:4146
+#, c-format
+msgid "^1Press ^3%s^1 to observe"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
-#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
-msgid "SCO^is beaten"
+#: qcsrc/client/hud.qc:4149
+#, c-format
+msgid "^1Press ^3%s^1 for gamemode info"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
-#, c-format
-msgid " until a lead of ^3%s %s^7"
+#: qcsrc/client/hud.qc:4153
+msgid "^1Wait for your turn to join"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:23
-msgid "^1Begin!"
+#: qcsrc/client/hud.qc:4159
+msgid "^1Match has already begun"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4161
+msgid "^1You have no more lives left"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:34
+#: qcsrc/client/hud.qc:4163 qcsrc/client/hud.qc:4166
 #, c-format
-msgid "^1Game starts in %d seconds"
+msgid "^1Press ^3%s^1 to join"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:113
-msgid "^1RED^7 flag"
+#: qcsrc/client/hud.qc:4174
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:118
-msgid "^4BLUE^7 flag"
+#: qcsrc/client/hud.qc:4181
+msgid "^2Currently in ^1warmup^2 stage!"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:126
+#: qcsrc/client/hud.qc:4196
 #, c-format
-msgid "You picked up the %s!"
+msgid "%sPress ^3%s%s to end warmup"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:130
+#: qcsrc/client/hud.qc:4198
 #, c-format
-msgid "You got the %s!"
+msgid "%sPress ^3%s%s once you are ready"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:283
-msgid "Trying to remove a team which is not in the teamlist!"
+#: qcsrc/client/hud.qc:4203
+msgid "^2Waiting for others to ready up to end warmup..."
 msgstr ""
 
-#: qcsrc/client/ctf.qc:35
-msgid "----- Order Menu -----"
+#: qcsrc/client/hud.qc:4205
+msgid "^2Waiting for others to ready up..."
 msgstr ""
 
-#: qcsrc/client/ctf.qc:36
+#: qcsrc/client/hud.qc:4211
 #, c-format
-msgid "Order: %s"
+msgid "^2Press ^3%s^2 to end warmup"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:37
-msgid "1) ^3previous page"
+#: qcsrc/client/hud.qc:4232
+msgid "Teamnumbers are unbalanced!"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:38
-msgid "2) ^3next page"
+#: qcsrc/client/hud.qc:4237
+#, c-format
+msgid " Press ^3%s%s to adjust"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
-msgid "ESC) Exit Menu"
+#: qcsrc/client/hud.qc:4245
+msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr ""
 
-#: qcsrc/client/ctf.qc:126
-#, c-format
-msgid "Couldn't find player %d\n"
+#: qcsrc/client/hud.qc:4247
+msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr ""
 
-#: qcsrc/client/ctf.qc:154
-msgid "----- Command Menu -----"
+#: qcsrc/client/hud.qc:4249
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:155
-msgid "Issue orders:"
+#: qcsrc/client/hud.qc:4251
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr ""
 
-#: qcsrc/client/ctf.qc:156
-msgid " 1) Attack"
+#: qcsrc/client/hud.qc:4289
+msgid " qu/s"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:158
-msgid " 2) Defend"
+#: qcsrc/client/hud.qc:4293
+msgid " m/s"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:160
-msgid "3) Resign from command."
+#: qcsrc/client/hud.qc:4297
+msgid " km/h"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:212
-msgid "You're commander!"
+#: qcsrc/client/hud.qc:4301
+msgid " mph"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:215
-msgid "Awaiting orders..."
+#: qcsrc/client/hud.qc:4305
+msgid " knots"
 msgstr ""
 
-#: qcsrc/client/movetypes.qc:163
-#, c-format
-msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+#: qcsrc/client/hud.qc:4968
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
 msgstr ""
 
-#: qcsrc/client/movetypes.qc:166
+#: qcsrc/common/mapinfo.qc:1097
 #, c-format
-msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
-msgstr ""
-
-#: qcsrc/client/teamplay.qc:64
-msgid "Red Team"
+msgid "%s: %s"
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:65
-msgid "Blue Team"
+#: qcsrc/server/w_crylink.qc:666
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:66
-msgid "Yellow Team"
+#: qcsrc/server/w_crylink.qc:671
+#, c-format
+msgid "%s could not hide from %s's Crylink"
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:67
-msgid "Pink Team"
+#: qcsrc/server/w_crylink.qc:673
+#, c-format
+msgid "%s was too close to %s's Crylink"
 msgstr ""
 
-#: qcsrc/common/mapinfo.qc:1092
+#: qcsrc/server/w_crylink.qc:675
 #, c-format
-msgid "%s: %s"
+msgid "%s took a close look at %s's Crylink"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:417
-#, c-format
-msgid "%s forgot about some firemine"
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
+#: qcsrc/server/w_hlac.qc:240 qcsrc/server/w_fireball.qc:423
 #, c-format
 msgid "%s should have used a smaller gun"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:426
+#: qcsrc/server/w_hlac.qc:242
 #, c-format
-msgid "%s tried to catch %s's firemine"
+msgid "%s was cut down with a HLAC by %s"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:428
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:271 qcsrc/server/w_rifle.qc:232
+#: qcsrc/server/w_uzi.qc:318
 #, c-format
-msgid "%s fatefully ignored %s's firemine"
+msgid "%s is now thinking with portals"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:435
+#: qcsrc/server/w_minstanex.qc:295
 #, c-format
-msgid "%s could not hide from %s's fireball"
+msgid "%s has been vaporized by %s's minstanex"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:437
+#: qcsrc/server/w_grenadelauncher.qc:388
 #, c-format
-msgid "%s saw the pretty lights of %s's fireball"
+msgid "%s didn't see their own grenade"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:440
+#: qcsrc/server/w_grenadelauncher.qc:390
 #, c-format
-msgid "%s got too close to %s's fireball"
+msgid "%s blew themself up with their grenadelauncher"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:442
+#: qcsrc/server/w_grenadelauncher.qc:396
 #, c-format
-msgid "%s tasted %s's fireball"
+msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_shotgun.qc:215
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:293
+#: qcsrc/server/w_grenadelauncher.qc:398
 #, c-format
-msgid "%s is now thinking with portals"
+msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:255 qcsrc/server/w_minstanex.qc:295
+#: qcsrc/server/w_grenadelauncher.qc:400
 #, c-format
-msgid "%s has been vaporized by %s"
+msgid "%s ate %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:312
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:315
+#: qcsrc/server/w_laser.qc:316
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:317
+#: qcsrc/server/w_laser.qc:318
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:219
+#: qcsrc/server/w_nex.qc:255
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s has been vaporized by %s's nex"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:221
-#, c-format
-msgid "%s was gunned by %s"
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:258
+#: qcsrc/server/w_hook.qc:286 qcsrc/server/w_porto.qc:296
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s did the impossible"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:323
+#: qcsrc/server/w_hook.qc:288
 #, c-format
-msgid "%s was riddled full of holes by %s"
+msgid "%s was caught in %s's hook gravity bomb"
 msgstr ""
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
+#: qcsrc/server/w_rocketlauncher.qc:507
+#, c-format
+msgid "%s blew themself up with their rocketlauncher"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:574
+#: qcsrc/server/w_rocketlauncher.qc:511
 #, c-format
-msgid "%s could not remember where they put plasma"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:576
+#: qcsrc/server/w_rocketlauncher.qc:513
 #, c-format
-msgid "%s played with plasma"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:583
+#: qcsrc/server/w_rocketlauncher.qc:515
 #, c-format
-msgid "%s just noticed %s's blue ball"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:585
+#: qcsrc/server/w_porto.qc:298
 #, c-format
-msgid "%s got in touch with %s's blue ball"
+msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:590
+#: qcsrc/server/w_electro.qc:581
 #, c-format
-msgid "%s felt the electrifying air of %s's combo"
+msgid "%s could not remember where they put their electro plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:592
+#: qcsrc/server/w_electro.qc:583
 #, c-format
-msgid "%s got too close to %s's blue beam"
+msgid "%s played with electro plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:594
+#: qcsrc/server/w_electro.qc:590
 #, c-format
-msgid "%s was blasted by %s's blue beam"
+msgid "%s just noticed %s's electro plasma"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:2
+#: qcsrc/server/w_electro.qc:592
 #, c-format
-msgid "@!#%'n Tuba"
+msgid "%s got in touch with %s's electro plasma"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:252
+#: qcsrc/server/w_electro.qc:597
 #, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgid "%s felt the electrifying air of %s's electro combo"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:256
+#: qcsrc/server/w_electro.qc:599
 #, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgid "%s got too close to %s's blue electro bolt"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#: qcsrc/server/w_electro.qc:601
 #, c-format
-msgid "%s did the impossible"
+msgid "%s was blasted by %s's blue electro bolt"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:298
+#: qcsrc/server/w_hagar.qc:462
 #, c-format
-msgid "%s felt %s doing the impossible to him"
+msgid "%s played with tiny hagar rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:466
 #, c-format
-msgid "%s played with tiny rockets"
+msgid "%s was pummeled with a burst of hagar rockets by %s"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:399
+#: qcsrc/server/w_hagar.qc:468
 #, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
+msgid "%s was pummeled with hagar rockets by %s"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_shotgun.qc:275
 #, c-format
-msgid "%s was pummeled by %s"
+msgid "%2$s slapped %1$s around a bit with a large shotgun"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:666
+#: qcsrc/server/w_shotgun.qc:277
 #, c-format
-msgid "%s succeeded at self-destructing themself with the Crylink"
+msgid "%s was gunned down with a shotgun by %s"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:671
+#: qcsrc/server/w_tuba.qc:2
 #, c-format
-msgid "%s could not hide from %s's Crylink"
+msgid "@!#%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/server/w_tuba.qc:444
 #, c-format
-msgid "%s was too close to %s's Crylink"
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:675
+#: qcsrc/server/w_tuba.qc:447
 #, c-format
-msgid "%s took a close look at %s's Crylink"
+msgid "%s hurt his own ears with the @!#%%'n Accordeon"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
+#: qcsrc/server/w_tuba.qc:465
 #, c-format
-msgid "%s exploded"
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:505
+#: qcsrc/server/w_tuba.qc:468
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s died of %s's great playing on the @!#%%'n Accordeon"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:507
+#: qcsrc/server/w_minelayer.qc:533
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s blew themself up with their minelayer"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:509
+#: qcsrc/server/w_minelayer.qc:535
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s forgot about their mine"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
+#: qcsrc/server/w_minelayer.qc:539
+#, c-format
+msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:268
+#: qcsrc/server/w_minelayer.qc:541
 #, c-format
-msgid "%s has run into %s's gravity bomb"
+msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:527
+#: qcsrc/server/w_minelayer.qc:543
 #, c-format
-msgid "%s got too close to %s's mine"
+msgid "%s stepped on %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:529
+#: qcsrc/server/w_rifle.qc:239
 #, c-format
-msgid "%s almost dodged %s's mine"
+msgid "%s failed to hide from %s's rifle bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:531
+#: qcsrc/server/w_rifle.qc:241
 #, c-format
-msgid "%s stepped on %s's mine"
+msgid "%s died in %s's rifle bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:233
+#: qcsrc/server/w_rifle.qc:248
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:235
+#: qcsrc/server/w_rifle.qc:253
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got shot in the head with a rifle by %s"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:242
+#: qcsrc/server/w_rifle.qc:255
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s was sniped with a rifle by %s"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:244
+#: qcsrc/server/w_uzi.qc:322
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s was sniped by %s's machine gun"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:251
+#: qcsrc/server/w_uzi.qc:324
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was riddled full of holes by %s's machine gun"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:256
+#: qcsrc/server/w_fireball.qc:421
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%s forgot about some firemine"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_fireball.qc:430
+#, c-format
+msgid "%s tried to catch %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_fireball.qc:432
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s fatefully ignored %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:383
+#: qcsrc/server/w_fireball.qc:439
 #, c-format
-msgid "%s tried out his own grenade"
+msgid "%s could not hide from %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:385
+#: qcsrc/server/w_fireball.qc:441
 #, c-format
-msgid "%s detonated"
+msgid "%s saw the pretty lights of %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:391
+#: qcsrc/server/w_fireball.qc:444
 #, c-format
-msgid "%s didn't see %s's grenade"
+msgid "%s got too close to %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:393
+#: qcsrc/server/w_fireball.qc:446
 #, c-format
-msgid "%s almost dodged %s's grenade"
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:395
+#: qcsrc/server/w_seeker.qc:661
 #, c-format
-msgid "%s ate %s's grenade"
+msgid "%s played with tiny seeker rockets"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
+#: qcsrc/server/w_seeker.qc:665
+#, c-format
+msgid "%s was tagged with a seeker by %s"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:242
+#: qcsrc/server/w_seeker.qc:667
 #, c-format
-msgid "%s was cut down by %s"
+msgid "%s was pummeled with seeker rockets by %s"
 msgstr ""
index 28ed89dd5f554bb54b01136190854a475400b5de..711373647864160c111a36aec9e7295409e1a6bd 100644 (file)
@@ -1,22 +1,3 @@
-set g_ctf_flagscore_pickup_base                   1
-set g_ctf_flagscore_pickup_dropped_early          0
-set g_ctf_flagscore_pickup_dropped_late           1
-set g_ctf_flagscore_capture                      20
-set g_ctf_flagscore_kill                          2
-set g_ctf_flagpenalty_drop                        0
-set g_ctf_flagpenalty_suicidedrop                 1
-set g_ctf_flagpenalty_returned                    0
-set g_ctf_flagscore_return                        3
-set g_ctf_flagscore_return_rogue                  3
-set g_ctf_flagscore_return_by_killer              5
-set g_ctf_flagscore_return_rogue_by_killer        5
-
-// succeeded capture (pickup capture)            21 (0 for enemy)
-// failed capture (pickup kill drop return)       1 (8 for enemy)
-// failed (shot into void) (pickup kill drop)     1 (2 for enemy)
-// capture retry (kill drop pickup)               0..1 (2 for enemy)
-// suicide, then retake (suicidedrop pickup)     -1 (0 for enemy)
-
 set g_ctf_personalscore_pickup_base                   1
 set g_ctf_personalscore_pickup_dropped_early          0
 set g_ctf_personalscore_pickup_dropped_late           1
index a32ffda130ded00a02ada24b159bf01977b7ad2f..dd5758d495c44bad11517007f4c5b0cf60839229 100644 (file)
@@ -1,21 +1,3 @@
-set g_ctf_flagscore_pickup_base                   1
-set g_ctf_flagscore_pickup_dropped_early          1
-set g_ctf_flagscore_pickup_dropped_late           1
-set g_ctf_flagscore_capture                      30
-set g_ctf_flagscore_kill                          1
-set g_ctf_flagpenalty_drop                        2
-set g_ctf_flagpenalty_suicidedrop                 2
-set g_ctf_flagpenalty_returned                    0
-set g_ctf_flagscore_return                        5
-set g_ctf_flagscore_return_rogue                 10
-set g_ctf_flagscore_return_by_killer              6
-set g_ctf_flagscore_return_rogue_by_killer       11
-// succeeded capture (pickup capture)            31 (0 for enemy)
-// failed capture (pickup kill drop return)      -1 (6 or 7 for enemy)
-// failed (shot into void) (pickup kill drop)     1 (1 for enemy)
-// capture retry (kill drop pickup)              -1 (1 for enemy)
-// suicide, then retake (suicidedrop pickup)     -1 (0 for enemy)
-
 set g_ctf_personalscore_pickup_base                   1
 set g_ctf_personalscore_pickup_dropped_early          1
 set g_ctf_personalscore_pickup_dropped_late           1
index a97bd6e64b5796dde691e1d8ff2f1324200b8f23..c15cee8dab3e26c19333c61b934638374b5c9f0b 100644 (file)
@@ -1,21 +1,3 @@
-set g_ctf_flagscore_pickup_base                   0
-set g_ctf_flagscore_pickup_dropped_early          0
-set g_ctf_flagscore_pickup_dropped_late           0
-set g_ctf_flagscore_capture                      20
-set g_ctf_flagscore_kill                          0
-set g_ctf_flagpenalty_drop                        0
-set g_ctf_flagpenalty_suicidedrop                 0
-set g_ctf_flagpenalty_returned                    0
-set g_ctf_flagscore_return                        5
-set g_ctf_flagscore_return_rogue                 10
-set g_ctf_flagscore_return_by_killer              5
-set g_ctf_flagscore_return_rogue_by_killer       10
-// succeeded capture (pickup capture)            20 (0 for enemy)
-// failed capture (pickup kill drop return)       0 (5 for enemy)
-// failed (shot into void) (pickup kill drop)     0 (0 for enemy)
-// capture retry (kill drop pickup)               0 (0 for enemy)
-// suicide, then retake (suicidedrop pickup)      0 (0 for enemy)
-
 set g_ctf_personalscore_pickup_base                   0
 set g_ctf_personalscore_pickup_dropped_early          0
 set g_ctf_personalscore_pickup_dropped_late           0
index d36d0ad10fe98b24faee9ccbe43382860f4b8585..33c8ab1b72bd9f7d7b7c0da352db959719a74a43 100644 (file)
@@ -1,22 +1,3 @@
-set g_ctf_flagscore_pickup_base                   0
-set g_ctf_flagscore_pickup_dropped_early          1
-set g_ctf_flagscore_pickup_dropped_late           1
-set g_ctf_flagscore_capture                      25
-set g_ctf_flagscore_kill                          3
-set g_ctf_flagpenalty_drop                        2
-set g_ctf_flagpenalty_suicidedrop                 2
-set g_ctf_flagpenalty_returned                    1
-set g_ctf_flagscore_return                        5 // not adjusted as this would suck for team game
-set g_ctf_flagscore_return_rogue                 10
-set g_ctf_flagscore_return_by_killer              5
-set g_ctf_flagscore_return_rogue_by_killer       10
-
-// succeeded capture (pickup capture)            25 (0 for enemy)
-// failed capture (pickup kill drop return)      -3 (8 for enemy)
-// failed (shot into void) (pickup kill drop)    -2 (3 for enemy)
-// capture retry (kill drop pickup)              -1 (3 for enemy)
-// suicide, then retake (suicidedrop pickup)     -1 (0 for enemy)
-
 set g_ctf_personalscore_pickup_base                   0
 set g_ctf_personalscore_pickup_dropped_early          1
 set g_ctf_personalscore_pickup_dropped_late           1
index 193cc183fbb64172f94d58f7893e4f85b4a3669f..861ead4613d165ecef7681adb90dc87f691dc2bb 100644 (file)
@@ -1,21 +1,3 @@
-set g_ctf_flagscore_pickup_base                   1
-set g_ctf_flagscore_pickup_dropped_early          1
-set g_ctf_flagscore_pickup_dropped_late           1
-set g_ctf_flagscore_capture                      20
-set g_ctf_flagscore_kill                          1
-set g_ctf_flagpenalty_drop                        0
-set g_ctf_flagpenalty_suicidedrop                 1
-set g_ctf_flagpenalty_returned                    0
-set g_ctf_flagscore_return                        5
-set g_ctf_flagscore_return_rogue                 10
-set g_ctf_flagscore_return_by_killer              5
-set g_ctf_flagscore_return_rogue_by_killer       10
-// succeeded capture (pickup capture)            21 (0 for enemy)
-// failed capture (pickup kill drop return)       1 (6 for enemy)
-// failed (shot into void) (pickup kill drop)     1 (1 for enemy)
-// capture retry (kill drop pickup)               1 (1 for enemy)
-// suicide, then retake (suicidedrop pickup)      0 (0 for enemy)
-
 set g_ctf_personalscore_pickup_base                   1
 set g_ctf_personalscore_pickup_dropped_early          1
 set g_ctf_personalscore_pickup_dropped_late           1
index 52acece12f1c26bb33c8244ab883586300b53936..c75b30680604af8d657bdeed7cd2e3ac64182325 100644 (file)
@@ -1,5 +1,3 @@
-exec ctfscoring-ai.cfg // fall back to ai's scoring for flag scores, if g_ctf_win_mode is 2, as this system is highly broken in that mode
-
 set g_ctf_personalscore_pickup_base                  -1
 set g_ctf_personalscore_pickup_dropped_early          5
 set g_ctf_personalscore_pickup_dropped_late           9
index bffe0d0561104f474f88b057e096a4e96d7e8f9a..e45bdd93a38b94e353be2573edf4f3090c7e2e24 100644 (file)
@@ -1,5 +1,3 @@
-exec ctfscoring-ai.cfg // fall back to ai's scoring for flag scores, if g_ctf_win_mode is 2, as this system is highly broken in that mode
-
 set g_ctf_personalscore_pickup_base                  -5
 set g_ctf_personalscore_pickup_dropped_early          1
 set g_ctf_personalscore_pickup_dropped_late           5
index 1044e8abfa4a745a370c2345346b28320251b1c1..75950a9cd7fec160222a90d1ef53e615d065c6b0 100644 (file)
@@ -22,22 +22,9 @@ gameversion_max 65535 // git builds see all versions
 //   gameversion_min = (gameversion / 100) * 100 - 100
 //   gameversion_max = (gameversion / 100) * 100 + 199
 
-// changes a cvar and reports it to the server (for the menu to notify the
-// server about changes)
-alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
-
 seta cl_firststart "" "how many times the client has been run"
 seta cl_startcount 0 "how many times the client has been run"
 
-// detect dedicated server or client
-alias "_detect_dedicated_$qport" "${* asis}"
-alias "_detect_dedicated_0" ""
-alias _if_dedicated "_detect_dedicated_$qport ${* asis}"
-alias if_client "${* asis}"
-alias if_dedicated "${* asis}"
-_if_dedicated alias if_client ""
-if_client alias if_dedicated ""
-
 seta g_configversion 0 "Configuration file version (used to upgrade settings) 0: first run, or previous start was <2.4.1  Later, it's overridden by config.cfg, version ranges are defined in config_update.cfg"
 
 // say aliases
@@ -53,39 +40,15 @@ alias asay_drop "say_team (%l) dropped %w ; impulse 17"
 alias +hook +button6
 alias -hook -button6
 alias use "impulse 21"
-alias ready "cmd ready"
-alias lockteams "sv_cmd lockteams"
-alias unlockteams "sv_cmd unlockteams"
-alias nospectators "sv_cmd nospectators"
-alias cointoss "sv_cmd cointoss"
-alias timeout "cmd timeout" //use this command to call a timeout
-alias timein "cmd timein" //use this command to resume the game before timeout is finished
-
-alias bsp "ls maps/*.bsp"
-alias chmap "changelevel $*"
-alias gotomap "sv_cmd gotomap \"$1\""
-
-alias rec "record demos/$1"
-alias ply "playdemo $1"
-alias tdem "timedemo $1"
+
+// for backwards compatibility
 
 alias dropweapon "impulse 17"
 alias +show_info +button7
 alias -show_info -button7
 
-alias team_red "cmd selectteam red; cmd join"
-alias team_blue "cmd selectteam blue; cmd join"
-alias team_pink "cmd selectteam pink; cmd join"
-alias team_yellow "cmd selectteam yellow; cmd join"
-alias team_auto "cmd selectteam auto; cmd join"
 bind f6 team_auto
 
-alias movetoteam_red "sv_cmd movetoteam $1 red"
-alias movetoteam_blue "sv_cmd movetoteam $1 blue"
-alias movetoteam_pink "sv_cmd movetoteam $1 pink"
-alias movetoteam_yellow "sv_cmd movetoteam $1 yellow"
-alias movetoteam_auto "sv_cmd movetoteam $1 auto"
-
 // merge lightmaps up to 2048x2048 textures
 mod_q3bsp_lightmapmergepower 4
 
@@ -330,11 +293,12 @@ set teamplay_lockonrestart 0 "it set to 1 in a team-based game, the teams are lo
 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
+// tournament mod
 set g_warmup 0 "split the game into a warmup- and match-stage when set to 1"
-set g_warmup_limit 60  "if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage, otherwise warmup will be limited to this time in SECONDS (useful for public matches)"
+set g_warmup_limit   "if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage, otherwise warmup will be limited to this time in SECONDS (useful for public matches)"
 set g_warmup_allow_timeout 0   "if set to 1 timeouts can also be called in the warmup-stage, when sv_timeout is set to 1"
-set g_warmup_allguns 0 "if set players start with all guns in warmup mode"
+set g_warmup_allguns 1 "if set players start with all guns in warmup mode"
+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     "if set only players can call a vote (thus spectators and observers can't call a vote)"
@@ -415,9 +379,6 @@ cl_movement 1
 cl_movement_track_canjump 0
 cl_stairsmoothspeed 200
 
-seta cl_autoswitch 1 "automatically switch to newly picked up weapons if they are better than what you are carrying"
-alias autoswitch "set cl_autoswitch $1 ; cmd autoswitch $1"
-
 set bot_config_file bots.txt "Name and path of the bot configuration file"
 set bot_number 0       "Minimum number of bots"
 seta bot_usemodelnames 0       "Use player model names for bot names"
@@ -498,14 +459,11 @@ set g_shootfromeye 0 "shots are fired from your eye/crosshair; visual gun positi
 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 "if set to 1 or 2, weapons stay after they were picked up (1: weapons you don't have yet give you ammo of their type and they can not be dropped, 2: weapons don't give ammo, but instead players start with one pickup-load of ammo by default, 3: weapons give ammo, weapons only stay as ammo-less ghosts)"
+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_throwable 1 "if set to 1, weapons can be dropped"
-set g_powerup_superhealth 1 "if set to 0 the mega health powerup will not spawn on the map"
-set g_powerup_strength 1 "if set to 0 the strength powerup will not spawn on the map"
-set g_powerup_shield 1 "if set to 0 the shield (invincibility) powerup will not spawn on the map"
-set g_balance_powerup_timer 1 "if set to 0 the powerups dont wear off"
+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 ammunition"
-set g_pickup_items 1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map"
+set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
 set g_minstagib 0      "enable minstagib"
 set g_minstagib_extralives 2   "how many extra lives you will get per powerup"
 set g_minstagib_ammo_start 10  "starting ammo"
@@ -573,7 +531,6 @@ seta menu_sandbox_edit_physics 1
 seta menu_sandbox_edit_force 1
 seta menu_sandbox_edit_material ""
 
-alias menu_showsandboxtools "menu_cmd directmenu SandboxTools"
 bind f7 menu_showsandboxtools
 
 set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
@@ -581,8 +538,6 @@ set g_botclip_collisions 1 "0 = disable collision testing against botclips, migh
 
 set welcome_message_time 8
 
-alias clearmap "disconnect"
-
 set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up"
 
 set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in all balance configs, regardless of g_projectiles_damage"
@@ -609,8 +564,6 @@ seta fraglimit_override -1  "Frag limit overriding the mapinfo specified one (use
 seta leadlimit_override -1     "Lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta capturelimit_override -1  "Capture limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta captureleadlimit_override -1      "Capture llead imit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
-seta g_ctf_capture_limit -1    "CTF capture limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
-seta g_ctf_capture_leadlimit -1        "CTF capture lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_arena_point_limit -1    "Arena point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_arena_point_leadlimit -1        "Arena point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_domination_point_limit -1       "Domination point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
@@ -623,7 +576,6 @@ seta g_race_laps_limit -1   "Race laps limit overriding the mapinfo specified one
 seta g_nexball_goallimit -1 "Nexball goal limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_nexball_goalleadlimit -1 "Nexball goal lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 
-seta g_ctf_win_mode 0  "0: captures only, 1: captures, then points, 2: points only"
 seta g_ctf_ignore_frags 0      "1: regular frags give no points"
 
 set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze teammates by standing next to them"
@@ -689,7 +641,7 @@ set g_cts_respawn_waves 0
 set g_cts_respawn_delay 0
 set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
 set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
-set g_cts_weapon_stay 1
+set g_cts_weapon_stay 2
 set g_freezetag_respawn_waves 0
 set g_freezetag_respawn_delay 0
 set g_freezetag_weapon_stay 0
@@ -838,7 +790,6 @@ set g_arena 0 "Arena: many one-on-one rounds are played to find the winner"
 set g_arena_maxspawned 2       "maximum number of players to spawn at once (the rest is spectating, waiting for their turn)"
 set g_arena_roundbased 1       "if disabled, the next player will spawn as soon as someone dies"
 set g_arena_warmup 5   "time, newly spawned players have to prepare themselves in round based matches"
-set g_arena_powerups 0 "enables powerups (superhealth, strength and shield), which are removed by default"
 
 // ca
 set g_ca 0 "Clan Arena: Played in rounds, once you're dead you're out! The team with survivors wins the round."
@@ -999,9 +950,8 @@ seta cl_notify_carried_items "3" "notify you of carried items when you obtain th
 
 // startmap_dm is used when running with the -listen or -dedicated commandline options
 set serverconfig server.cfg
-alias startmap_dm "set _sv_init 0; map _init/_init; exec $serverconfig; set _sv_init 1; map _init/_init"
-alias sv_loadconfig "exec $serverconfig"
-alias sv_restart "say \"Server will restart at the end of the match, you will all be reconnected automatically. $* \"; quit_and_redirect self"
+set _sv_init 0
+alias startmap_dm "set _sv_init 0; map _init/_init; exec $serverconfig; set _sv_init 1"
 
 // aliases:
 alias +fire +attack
@@ -1031,8 +981,6 @@ alias togglezoom "${_togglezoom}zoom"
 
 alias reload "impulse 20"
 
-alias sandbox "cmd g_sandbox $*"
-
 // movement
 bind w +forward
 bind a +moveleft
@@ -1095,7 +1043,7 @@ bind u "+con_chat_maximize"
 bind m +hud_panel_radar_maximized
 bind i +show_info
 bind PAUSE pause
-bind F10 quit
+bind F10 menu_showquitdialog
 bind F11 disconnect
 bind F12 screenshot
 bind F4 ready
@@ -1149,51 +1097,10 @@ bind kp_enter "+userbind 16"
 bind kp_plus "+userbind 17"
 bind kp_minus "+userbind 18"
 
-set sv_vote_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoteam_auto" "these commands can be voted"
-set sv_vote_only_commands ""
-set sv_vote_master_commands "movetoteam_red movetoteam_blue movetoteam_yellow movetoteam_pink" "maybe add kickban here (but then sv_vote_master 0)"
-set rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban *\" status \"sv_cmd teamstatus\" movetoteam_auto movetoteam_red movetoteam_blue movetoteam_yellow movetoteam_pink"
-set sv_vote_call 1     "users can call a vote for the above commands"
-set sv_vote_master 1   "users can call a vote to become master"
-set sv_vote_master_password "" "when set, users can use \"vlogin PASSWORD\" to log in as master"
-set sv_vote_change 1   "set to 1 to allow to change you vote/mind"
-set sv_vote_singlecount 0      "set to 1 to count votes once after timeout or to 0 to count with every vote"
-set sv_vote_timeout 30 "a vote will timeout after this many seconds"
-set sv_vote_wait 120   "a player can not call a vote again for this many seconds when his vote was not accepted"
-set sv_vote_stop 15    "a player can not call a vote again for this many seconds when he stopped this vote (e.g. to correct it)"
-set sv_vote_majority_factor 0.5        "which quotient of the PLAYERS constitute a majority? (try: 0.666, 0.75 when using the above)"
-set sv_vote_simple_majority_factor 0.666       "which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)"
-// when disabled, don't allow game type changes "note: set these two equal to JUST support simple majorities"
-set sv_vote_override_mostrecent 0
-alias vhelp "cmd vote help"
-alias vstatus "cmd vote status"
-alias vcall "cmd vote call $*"
-alias vstop "cmd vote stop"
-alias vmaster "cmd vote master"
-alias vlogin "cmd vote login $*"
-alias vdo "cmd vote do $*"
-alias vyes "cl_cmd vyes"
-alias vno "cl_cmd vno"
-alias vdontcare "cmd vote dontcare"
-alias vabstain "cmd vote abstain"
-
-alias vmap "vcall gotomap $1"
-alias vnextmap "vcall nextmap $1"
-alias vkick "vcall kick $1"
-alias vkickban "vcall kickban $1"
-alias vend "vcall endmatch"
-alias vdomap "vdo gotomap $1"
-alias vdokick "vdo kick $*"
-alias vdokickban "vdo kickban $*"
-alias vdoend "vdo endmatch"
-
-alias lsmaps "cmd lsmaps" // lists all maps on server (for vmap, suggestmap, vnextmap)
-alias lsnewmaps "cmd lsnewmaps" // lists all maps on server that do not yet have a record set (race/cts)
 bind F1 vyes
 bind F2 vno
 
 //used for spectate/observer mode
-alias spec "cmd spectate"
 bind F3 spec
 
 // NIX (No Items Xonotic) - at each time, everyone uses the same weapon,
@@ -1228,26 +1135,27 @@ set g_campaign 0
 set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
 seta g_campaign_name "xonoticbeta"
 set g_campaign_skill 0
-alias warp "sv_cmd warp $*"
 
 alias singleplayer_start "g_campaign_index 0; set scmenu_campaign_goto 0"
 alias singleplayer_continue "set scmenu_campaign_goto -1"
 alias singleplayer_levellist "set scmenu_campaign_dump 1; togglemenu; wait; togglemenu"
 
-// Green's fullbright skins
-alias cl_fbskin_green "playermodel models/player/erebus.iqm; playerskin 1; color 3 3"
-alias cl_fbskin_red "playermodel models/player/erebus.iqm; playerskin 1; color 4 4"
-alias cl_fbskin_orange "playermodel models/player/erebus.iqm; playerskin 1; color 14 14"
-alias cl_fbskin_off "playermodel models/player/erebus.iqm; playerskin 0"
+// Green's fullbright skins, updated by Samual
+alias sv_fbskin_unique "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors \"\""
 alias sv_fbskin_green "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 51"
 alias sv_fbskin_red "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 68"
 alias sv_fbskin_orange "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 238"
+alias sv_fbskin_rainbow "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 95"
+
 alias sv_fbskin_off "sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultplayercolors \"\""
 
 seta sv_servermodelsonly 1
 
 cl_curl_enabled 1
-cl_curl_maxspeed 400
+cl_curl_maxspeed 500
+cl_curl_useragent 1
+cl_curl_useragent_append "$g_xonoticversion"
+
 sv_curl_defaulturl "http://www.xonotic.org/contentdownload/getmap.php?file="
 set sv_curl_serverpackages_auto 1 "automatically add packs with *.serverpackage files to sv_curl_serverpackages"
 
@@ -1263,7 +1171,6 @@ seta g_maplist_votable_suggestions_override_mostrecent 0
 seta g_maplist_votable_nodetail 1      "nodetail only shows total count instead of all vote counts per map, so votes don't influence others that much"
 seta g_maplist_votable_abstain 0       "when 1, you can abstain from your vote"
 seta g_maplist_votable_screenshot_dir "maps levelshots"        "where to look for map screenshots"
-alias suggestmap "cmd suggestmap $1"
 
 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"
@@ -1328,21 +1235,6 @@ seta cl_hidewaypoints 0 "disable static waypoints, only show team waypoints"
 seta g_waypointsprites_turrets 1 "disable turret waypoints"
 seta g_waypointsprites_turrets_maxdist 4000 "max distace for turret sprites"
 
-// command extension
-alias qc_cmd   "sv_cmd $*" // menu QC will override this to menu_cmd
-alias adminmsg "sv_cmd adminmsg $*"
-alias teamstatus       "cmd teamstatus; sv_cmd teamstatus" // yes, it is broken on listen servers that way, but well, who cares :P
-alias printstats       "sv_cmd printstats" // print status on demand
-alias g_maplist_add    "qc_cmd maplist add $*"
-alias g_maplist_remove "qc_cmd maplist remove $*"
-alias g_maplist_putfirst       "qc_cmd maplist remove $* ; qc_cmd maplist add $*"
-alias g_maplist_shufflenow     "qc_cmd maplist shuffle"
-alias g_maplist_cleanup        "qc_cmd maplist cleanup" // removes maps that don't exist from the map list
-alias gametype "sv_cmd gametype $*"
-
-alias addfav "qc_cmd addtolist net_slist_favorites $*"
-alias addvote "qc_cmd addtolist sv_vote_commands $*"
-
 // key hunt
 set g_keyhunt 0 "Key Hunt: collect all keys from the enemies and bring them together to score"
 set g_balance_keyhunt_delay_return 60
@@ -1395,23 +1287,9 @@ 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_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)"
-alias bans "sv_cmd bans"
-alias ban "sv_cmd ban $*"         // usage: ban address(maybe incomplete, like 1.2.3) bantime(seconds)
-alias kickban "sv_cmd kickban $*" // usage: kickban # playerno bantime(seconds) masksize(bytes)
-alias unban "sv_cmd unban $*"     // usage: unban 3 (number from bans)
 
 r_labelsprites_scale 0.40625 // labels sprites get displayed at 0.5x from 640x480 to 1280x1024, and at 1x from 1600x1200 onwards
 
-// settemp subsystem. Do not touch. Usage: settemp variable value, next map resets it.
-set settemp_list 0
-set settemp_idx 0
-set _settemp_var UNUSED
-alias settemp "_settemp_var \"_settemp_x$settemp_idx\"; qc_cmd rpn /settemp_idx settemp_idx 1 add def; _settemp \"$1\" \"$2\""
-alias _settemp "settemp_list \"1 $1 $_settemp_var $settemp_list\"; set $_settemp_var \"${$1}\"; $1 \"$2\""
-alias settemp_restore "_settemp_restore_${settemp_list asis}"
-alias _settemp_restore_0 "set settemp_var 0; set settemp_list 0"
-alias _settemp_restore_1 "$1 \"${$2}\"; _settemp_restore_${3- asis}"
-
 // 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 "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"
@@ -1514,19 +1392,11 @@ set menu_weaponarena_with_laser 0 "also enable the Laser in this weapon arena"
 
 seta menu_maxplayers 16 "maxplayers value when the menu starts a game"
 
-// command executed before loading a map by the menu
-// makes sure maxplayers is at least minplayers or bot_number + 1
-alias _menu_loadmap_prepare_maxpl "maxplayers $_menu_loadmap_maxplayers"
-alias menu_loadmap_prepare "disconnect; wait; g_campaign 0; menu_cmd rpn /_menu_loadmap_maxplayers menu_maxplayers minplayers bot_number 1 add max max def; _menu_loadmap_prepare_maxpl; g_maplist_shufflenow"
-
 // useful vote aliases
 set timelimit_increment 5
 set timelimit_decrement 5
 set timelimit_min 5
 set timelimit_max 60
-alias extendmatchtime "sv_cmd extendmatchtime"
-alias reducematchtime "sv_cmd reducematchtime"
-alias endmatch "timelimit -1"
 
 // useful keybind to maximize the chat area temporarily
 // HUD code takes care of many of these now...
@@ -1572,6 +1442,8 @@ seta skill 4
 seta gl_finish $gl_finish
 seta v_kicktime $v_kicktime
 seta r_subdivisions_tolerance $r_subdivisions_tolerance
+seta vid_gl20 $vid_gl20
+seta vid_gl13 $vid_gl13
 
 // ticrate
 //sys_ticrate 0.0166667
@@ -1632,14 +1504,13 @@ set capturelimit 0
 // these entities are not referenced by anything directly, they just represent
 // teams and are found by find() when needed
 prvm_leaktest_ignore_classnames "ctf_team dom_team tdm_team"
+prvm_backtraceforwarnings 1
 
 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?"
 
-alias allready "sv_cmd allready"
-
 seta cl_weaponpriority "minstanex nex fireball grenadelauncher uzi hagar rifle electro rocketlauncher crylink minelayer shotgun hlac tuba laser porto seeker hook" "weapon priority list"
 seta cl_weaponpriority_useforcycling 0 "when set, weapon cycling by the mouse wheel makes use of the weapon priority list (the special value 2 uses the weapon ID list for cycling)"
 seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun.  Default value: explosives"
@@ -1654,18 +1525,9 @@ seta cl_weaponpriority8 "" "use impulse 208 for prev gun from this list, 218 for
 seta cl_weaponpriority9 "" "use impulse 209 for prev gun from this list, 219 for best gun, 229 for next gun"
 seta cl_weaponimpulsemode 0 "0: only cycle between currently usable weapons in weapon priority order; 1: cycle between all possible weapons on a key in weapon priority order"
 
-seta sv_status_privacy 1       "hide IP addresses from \"status\" replies shown to clients"
-
 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)"
 
-if_client set g_start_delay 0  "delay before the game starts, so everyone can join; recommended to set this to like 15 on a public server"
-if_dedicated set g_start_delay 15      "delay before the game starts, so everyone can join; recommended to set this to like 15 on a public server"
-
-alias radar "cl_cmd hud_panel_radar_maximized"
-alias scoreboard_columns_set  "" // aliased later
-alias scoreboard_columns_help "cl_cmd scoreboard_columns_help $*"
-
 alias _gl_flashblend_update_00 "gl_flashblend 1"
 alias _gl_flashblend_update_10 "gl_flashblend 0"
 alias _gl_flashblend_update_01 "gl_flashblend 0"
@@ -1682,9 +1544,6 @@ seta cl_autoscreenshot 0 "client option to automatically take a screenshot once
 
 // must be at the bottom of this file:
 // alias for switching the teamselect menu
-alias menu_showteamselect "menu_cmd directmenu TeamSelect"
-alias menu_showhudexit "menu_cmd directmenu HUDExit"
-alias menu_showhudoptions "menu_cmd directpanelhudmenu $*"
 bind f5 menu_showteamselect
 
 set g_bugrigs 0
@@ -1717,10 +1576,6 @@ set g_ban_sync_trusted_servers_verify 0  "when set to 1, additional bans sent by
 
 set g_showweaponspawns 1       "display sprites for weapon spawns found on the map when a weapon key is pressed and the weapon is not available"
 
-alias records "cmd records"
-alias rankings "cmd rankings"
-alias ladder "cmd ladder"
-
 // ballistics use physical units, but qu based
 //   Quake-Newton: 1 qN  = 1 qu * 1 g / 1 s^2
 //   Quake-Joule:  1 qJ  = 1 qN * 1 qu
@@ -1782,6 +1637,11 @@ seta cl_gentle_damage 0          "client side gentle mode (only replaces damage flash);
 set g_jetpack 0 "Jetpack mutator (uses the hook's button, can't coexist with the offhand hook, but only with the onhand one)"
 
 set g_running_guns 0 "... or wonder, till it drives you mad, what would have followed if you had."
+set g_bastet 0 "don't try"
+set g_loituma 0 "no, really"
+
+set _urllib_nextslot 0 "temp variable"
+set cl_warpzone_usetrace 1 "do not touch"
 
 set cl_effects_lightningarc_simple 0
 set cl_effects_lightningarc_segmentlength 64
@@ -1792,24 +1652,12 @@ set cl_effects_lightningarc_branchfactor_add 0.1
 
 set g_hitplots 0 "when set to 1, hitplots are stored by the server to provide a means of proving that a triggerbot was used"
 seta g_hitplots_individuals "" "the individuals, by IP, that should have their hitplots recorded"
-alias g_hitplots_add "qc_cmd rpn /g_hitplots_individuals g_hitplots_individuals $1 union def"
-alias g_hitplots_remove "qc_cmd rpn /g_hitplots_individuals g_hitplots_individuals $1 difference def"
-
-alias mute "prvm_edictset server $1 muted 1" // I am lazy and not making an actual command of this
-alias unmute "prvm_edictset server $1 muted 0" // dito
-
-rcon_secure 1
 
 set menu_updatecheck 1
 
 set bot_navigation_ignoreplayers 0 // FIXME remove this once the issue is solved
 set bot_sound_monopoly 0 "when enabled, only bots can make any noise"
 
-// broken, sorry (cannot handle weapon attachment properly)
-//seta cl_forceplayermodels 0 "force all players to look like you; WARNING: animations can look very bad with this"
-//seta cl_forceplayermodelsfromxonotic 0 "force models coming from xonotic; WARNING: animations can look very bad with this"
-//set sv_clforceplayermodels 1 "allow clients to use cl_forcemodels"
-
 set sv_loddistance1 1024
 set sv_loddistance2 4096
 seta cl_playerdetailreduction 0        "the higher, the less detailed player models are displayed (LOD)"
@@ -1887,8 +1735,8 @@ set g_triggerimpulse_directional_multiplier 1 "trigger_impulse directional field
 set g_triggerimpulse_radial_multiplier 1 "trigger_impulse radial field multiplier"
 set the_goggles "they do nothing" "but the googles, they do"
 
-seta g_ghost_items 1 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
-seta g_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
+set g_ghost_items 1 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
+set g_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
 
 set sv_weaponstats_file "" "when set to a file name, per-weapon stats get written to that file"
 
@@ -1900,7 +1748,7 @@ set sv_pitch_fixyaw 0 "workaround to fix the aiming direction on stupidly made p
 
 set rescan_pending 0 "set to 1 to schedule a fs_rescan at the end of this match"
 
-seta g_mapinfo_allow_unsupported_modes_and_let_stuff_break "0" "set to 1 to be able to force game types using g_ cvars even if the map does not support them"
+set g_mapinfo_allow_unsupported_modes_and_let_stuff_break "0" "set to 1 to be able to force game types using g_ cvars even if the map does not support them"
 
 // weapon accuracy stats
 set sv_accuracy_data_share 1 "1 send weapon accuracy data statistics to spectating clients, depends on cl_accuracy_data_share"
@@ -1919,6 +1767,13 @@ set developer_shtest 0 "experimental speedhack detection"
 set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code"
 set g_debug_bot_commands 0 "print scripted bot commands before executing"
 set g_debug_defaultsounds 0 "always use default sounds"
+set sv_use_csqc_players 1 "set to 0 to disable CSQC players for better Xonotic 0.5 compat"
+set cl_precacheplayermodels 0 "TODO please check if this needs to be 1 or if precaching a model the server already requested is fast enough to do it at runtime"
+seta cl_forceplayermodels 0 "make everyone look like your own model (requires server to have sv_use_csqc_players 1 and sv_defaultcharacter 0)"
+seta cl_forceplayercolors 0 "make everyone look like your own color (requires server to have sv_use_csqc_players 1 and sv_defaultcharacter 0, and is ignored in teamplay)"
+seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
+seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
+seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (requires server to have sv_use_csqc_players 1, and is ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
 
 // debug cvars for keyhunt attaching
 set _angles "0 0 0"
@@ -1948,6 +1803,9 @@ sv_gameplayfix_consistentplayerprethink 1
 // support Q1BSP maps
 mod_q1bsp_polygoncollisions 1
 
+// match q3map2
+mod_obj_orientation 0
+
 // improve some minor details
 sv_gameplayfix_gravityunaffectedbyticrate 1
 sv_gameplayfix_nogravityonground 1
@@ -2134,6 +1992,9 @@ exec physicsX.cfg
 exec turrets.cfg
 exec vehicles.cfg
 
+// load console command aliases and settings
+exec commands.cfg
+
 // hud cvar descriptions and common settings
 exec _hud_common.cfg
 exec _hud_descriptions.cfg
@@ -2141,6 +2002,12 @@ exec _hud_descriptions.cfg
 // please add any new cvars into the hud_save script in qcsrc/client/hud_config.qc for consistency
 exec hud_luminos.cfg
 
+
+// ... and now that everything is configured/aliased, we can do some things: 
+
+// Change g_start_delay based upon if the server is local or not.
+if_client set g_start_delay 0  "delay before the game starts, so everyone can join; recommended to set this to like 15 on a public server"
+if_dedicated set g_start_delay 15      "delay before the game starts, so everyone can join; recommended to set this to like 15 on a public server"
+
 // enable menu syncing
 alias menu_sync "menu_cmd sync"
-alias scoreboard_columns_set  "cl_cmd scoreboard_columns_set $*"
index 5450eedccb108be6620d160edec6bedd08398144..f798c8cc845b97fa0d56481a369f1976ce859a9c 100644 (file)
Binary files a/gfx/colormap_palette.lmp and b/gfx/colormap_palette.lmp differ
index 47986f9f30a2b6208967448f2373ec5f9be112ab..07ad2de1142c640f30c387b969c2f97d86523c5e 100644 (file)
@@ -1,29 +1,43 @@
 use strict;
 use warnings;
 
+# Colors:
+#   red
+#   ORANGE1
+#   ORANGE2
+#   yellow
+#   yellowgreen
+#   green
+#   cyangreen
+#   cyan
+#   CYANBLUE1
+#   CYANBLUE2
+#   blue
+#   bluemagenta
+#   magenta
+#   redmagenta
+
 my @colors = (
-       'cccccc',
-       '996600',
-       '00ff80',
-       '00ff00',
-       'ff0000',
-       '00a8ff', # was: 0080ff, green increased
-       '00ffff',
-       '80ff00',
-       '8000ff',
-       'ff00ff',
-       'ff0080',
-       '999999',
-       'ffff00',
-       '0050ff', # was: 0000ff, green increased so the color is perceptively just as bright as red (for teamplay)
-       'ff8000',
-       '000000'
+       'ffffff', # white
+       'ff5500', # orange1
+       '00ff80', # cyangreen
+       '00ff00', # green
+       'ff0000', # red
+       '00aaff', # cyanblue1
+       '00ffff', # cyan
+       '80ff00', # yellowgreen
+       '8000ff', # bluemagenta
+       'ff00ff', # magenta
+       'ff0080', # redmagenta
+       '0000ff', # blue
+       'ffff00', # yellow
+       '0055ff', # cyanblue2
+       'ffaa00', # orange2
+       '000000' # unused
 );
 
 my $value_min = 0x0F;
 my $value_max = 0xFF;
-my $value_smin = 0x00;
-my $value_smax = 0xB3;
 
 my $i = 0;
 my $pal_colormap = "";
@@ -35,9 +49,8 @@ for(@colors)
        my $g = hex $2;
        my $b = hex $3;
        $pal_colormap .= sprintf "%c%c%c", map { int(0.5 + $value_min + ($_ * 1.0 / 0xFF) * ($value_max - $value_min)) } $r, $g, $b;
-       $pal_scoreboard .= sprintf "%c%c%c", map { int(0.5 + $value_smin + ($_ * 1.0 / 0xFF) * ($value_smax - $value_smin)) } $r, $g, $b;
        printf STDERR "\t\tcase %2d: return '%f %f %f';\n", $i, $r / 0xFF, $g / 0xFF, $b / 0xFF;
        ++$i;
 }
 
-print "$pal_colormap$pal_scoreboard$pal_colormap$pal_scoreboard";
+print "$pal_colormap$pal_colormap$pal_colormap$pal_colormap";
diff --git a/gfx/crosshair21.tga b/gfx/crosshair21.tga
new file mode 100644 (file)
index 0000000..17e186b
Binary files /dev/null and b/gfx/crosshair21.tga differ
diff --git a/gfx/crosshair22.tga b/gfx/crosshair22.tga
new file mode 100644 (file)
index 0000000..4dbecc7
Binary files /dev/null and b/gfx/crosshair22.tga differ
diff --git a/gfx/crosshair23.tga b/gfx/crosshair23.tga
new file mode 100644 (file)
index 0000000..26328f4
Binary files /dev/null and b/gfx/crosshair23.tga differ
diff --git a/gfx/crosshair24.tga b/gfx/crosshair24.tga
new file mode 100644 (file)
index 0000000..94c928f
Binary files /dev/null and b/gfx/crosshair24.tga differ
diff --git a/gfx/crosshair25.tga b/gfx/crosshair25.tga
new file mode 100644 (file)
index 0000000..495ba6b
Binary files /dev/null and b/gfx/crosshair25.tga differ
diff --git a/gfx/crosshair26.tga b/gfx/crosshair26.tga
new file mode 100644 (file)
index 0000000..6d49c7e
Binary files /dev/null and b/gfx/crosshair26.tga differ
diff --git a/gfx/menu/luminos/icon_aeslevel0.tga b/gfx/menu/luminos/icon_aeslevel0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/luminos/icon_aeslevel0.tga and /dev/null differ
diff --git a/gfx/menu/luminos/icon_pure0.tga b/gfx/menu/luminos/icon_pure0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/luminos/icon_pure0.tga and /dev/null differ
diff --git a/gfx/menu/luminos/icon_stats1.tga b/gfx/menu/luminos/icon_stats1.tga
new file mode 100644 (file)
index 0000000..4d8688d
Binary files /dev/null and b/gfx/menu/luminos/icon_stats1.tga differ
diff --git a/gfx/menu/wickedx/icon_aeslevel0.tga b/gfx/menu/wickedx/icon_aeslevel0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/wickedx/icon_aeslevel0.tga and /dev/null differ
diff --git a/gfx/menu/wickedx/icon_pure0.tga b/gfx/menu/wickedx/icon_pure0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/wickedx/icon_pure0.tga and /dev/null differ
diff --git a/gfx/menu/wickedx/icon_stats1.tga b/gfx/menu/wickedx/icon_stats1.tga
new file mode 100644 (file)
index 0000000..4d8688d
Binary files /dev/null and b/gfx/menu/wickedx/icon_stats1.tga differ
diff --git a/gfx/menu/xaw/icon_aeslevel0.tga b/gfx/menu/xaw/icon_aeslevel0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/xaw/icon_aeslevel0.tga and /dev/null differ
diff --git a/gfx/menu/xaw/icon_pure0.tga b/gfx/menu/xaw/icon_pure0.tga
deleted file mode 100644 (file)
index 5c9e66a..0000000
Binary files a/gfx/menu/xaw/icon_pure0.tga and /dev/null differ
diff --git a/gfx/menu/xaw/icon_stats1.tga b/gfx/menu/xaw/icon_stats1.tga
new file mode 100644 (file)
index 0000000..4d8688d
Binary files /dev/null and b/gfx/menu/xaw/icon_stats1.tga differ
diff --git a/keybinds.txt.hu b/keybinds.txt.hu
new file mode 100644 (file)
index 0000000..d20eec6
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "Mozgás"
+"+forward"                              "előre"
+"+back"                                 "hátra"
+"+moveleft"                             "balra lépés"
+"+moveright"                            "jobbra lépés"
+"+jump"                                 "ugrás / úszás"
+"+crouch"                               "guggolás / süllyedés"
+"+hook"                                 "kézi kampó / rakéta puttony"
+""                                      ""
+""                                      "Tüzelés"
+"+fire"                                 "Elsődleges"
+"+fire2"                                "Másodlagos"
+""                                      ""
+""                                      "Fegyverváltás"
+"weapprev"                              "előző"
+"weapnext"                              "következő"
+"weaplast"                              "előzőleg használt"
+"weapbest"                              "legjobb"
+"reload"                                "újratöltés"
+"weapon_group_1"                        "Lézer"
+"weapon_group_2"                        "Vadászpuska"
+"weapon_group_3"                        "Géppuska"
+"weapon_group_4"                        "Mortar / Aknavető"
+"weapon_group_5"                        "Electro"
+"weapon_group_6"                        "Crylink / HLAC"
+"weapon_group_7"                        "Nex / MinstaNex / Puska"
+"weapon_group_8"                        "Hagar / Seeker"
+"weapon_group_9"                        "Rakétavető / Tűzlabda"
+"weapon_group_0"                        "Port-O-Launch / Kampó"
+""                                      ""
+""                                      "Nézet"
+"+zoom"                                 "nagyítás tartás"
+"togglezoom"                            "nagyítás váltás"
+"+showscores"                           "pontszámok"
+"screenshot"                            "kép mentés"
+""                                      ""
+""                                      "Kommunikáció"
+"messagemode"                           "nyilvános beszélgetés"
+"messagemode2"                          "csapat beszélgetés"
+"+con_chat_maximize"                    "beszélgetés történet"
+"vyes"                                  "IGEN szavazat"
+"vno"                                   "NEM szavazat"
+"ready"                                 "kész"
+""                                      ""
+""                                      "Kliens"
+"+show_info"                            "kiszolgáló info"
+"toggleconsole"                         "konzolba lépés"
+"disconnect"                            "lekapcsolodás"
+"quit"                                  "kilépés"
+""                                      ""
+""                                      "Csapatjáték"
+"messagemode2"                          "csapat beszélgetés"
+"team_auto"                             "automatikus csapatválasztás"
+"menu_showteamselect"                   "csapat menü"
+"spec"                                  "belépés néző módba"
+"dropweapon"                            "fegyver eldobás"
+"+use"                                  "kulcs / zászló eldobás"
+""                                      ""
+""                                      "Felhasználói hozzárendelések"
+"+userbind 1"                           "$userbind1"
+"+userbind 2"                           "$userbind2"
+"+userbind 3"                           "$userbind3"
+"+userbind 4"                           "$userbind4"
+"+userbind 5"                           "$userbind5"
+"+userbind 6"                           "$userbind6"
+"+userbind 7"                           "$userbind7"
+"+userbind 8"                           "$userbind8"
+"+userbind 9"                           "$userbind9"
+"+userbind 10"                          "$userbind10"
+"+userbind 11"                          "$userbind11"
+"+userbind 12"                          "$userbind12"
+"+userbind 13"                          "$userbind13"
+"+userbind 14"                          "$userbind14"
+"+userbind 15"                          "$userbind15"
+"+userbind 16"                          "$userbind16"
+"+userbind 17"                          "$userbind17"
+"+userbind 18"                          "$userbind18"
+"+userbind 19"                          "$userbind19"
+"+userbind 20"                          "$userbind20"
+"+userbind 21"                          "$userbind21"
+"+userbind 22"                          "$userbind22"
+"+userbind 23"                          "$userbind23"
+"+userbind 24"                          "$userbind24"
+"+userbind 25"                          "$userbind25"
+"+userbind 26"                          "$userbind26"
+"+userbind 27"                          "$userbind27"
+"+userbind 28"                          "$userbind28"
+"+userbind 29"                          "$userbind29"
+"+userbind 30"                          "$userbind30"
+"+userbind 31"                          "$userbind31"
+"+userbind 32"                          "$userbind32"
diff --git a/keybinds.txt.uk b/keybinds.txt.uk
new file mode 100644 (file)
index 0000000..2772c16
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "Рух"
+"+forward"                              "вперед"
+"+back"                                 "назад"
+"+moveleft"                             "крок ліворуч"
+"+moveright"                            "крок праворуч"
+"+jump"                                 "стрибок / плисти нагору"
+"+crouch"                               "присідання / занурення"
+"+hook"                                 "гак / реактивний ранець"
+""                                      ""
+""                                      "Бій"
+"+fire"                                 "основний вогонь"
+"+fire2"                                "альтернативний вогонь"
+""                                      ""
+""                                      "Вибір зброї"
+"weapprev"                              "попередня"
+"weapnext"                              "наступна"
+"weaplast"                              "використана раніше"
+"weapbest"                              "найкраща"
+"reload"                                "перезарядити"
+"weapon_group_1"                        "Лазер"
+"weapon_group_2"                        "Рушниця"
+"weapon_group_3"                        "Автомат"
+"weapon_group_4"                        "Мортира / Міноукладчик"
+"weapon_group_5"                        "Електро"
+"weapon_group_6"                        "Крайлінк / ВЛШГ"
+"weapon_group_7"                        "Некс / МінстаНекс / Гвинтівка"
+"weapon_group_8"                        "Хейгар / Шукач"
+"weapon_group_9"                        "Ракетна гармата / Метеор"
+"weapon_group_0"                        "Портал-О-Пуск / Гак"
+""                                      ""
+""                                      "Вид"
+"+zoom"                                 "утримувати для зуму"
+"togglezoom"                            "увімк / вимк зум"
+"+showscores"                           "показати рахунок"
+"screenshot"                            "скриншот"
+""                                      ""
+""                                      "Спілкування"
+"messagemode"                           "публічний чат"
+"messagemode2"                          "командний чат"
+"+con_chat_maximize"                    "показувати історію чату"
+"vyes"                                  "проголосувати ТАК"
+"vno"                                   "проголосувати НІ"
+"ready"                                 "готовий"
+""                                      ""
+""                                      "Клієнт"
+"+show_info"                            "відомості про сервер"
+"toggleconsole"                         "увійти в консоль"
+"disconnect"                            "роз'єднатися"
+"quit"                                  "вийти"
+""                                      ""
+""                                      "Командна гра"
+"messagemode2"                          "командний чат"
+"team_auto"                             "автовибір команди"
+"menu_showteamselect"                   "командне меню"
+"spec"                                  "увійти в режим спостерігача"
+"dropweapon"                            "викинути зброю"
+"+use"                                  "викинути ключ / прапор"
+""                                      ""
+""                                      "Визначені користувачем"
+"+userbind 1"                           "$userbind1"
+"+userbind 2"                           "$userbind2"
+"+userbind 3"                           "$userbind3"
+"+userbind 4"                           "$userbind4"
+"+userbind 5"                           "$userbind5"
+"+userbind 6"                           "$userbind6"
+"+userbind 7"                           "$userbind7"
+"+userbind 8"                           "$userbind8"
+"+userbind 9"                           "$userbind9"
+"+userbind 10"                          "$userbind10"
+"+userbind 11"                          "$userbind11"
+"+userbind 12"                          "$userbind12"
+"+userbind 13"                          "$userbind13"
+"+userbind 14"                          "$userbind14"
+"+userbind 15"                          "$userbind15"
+"+userbind 16"                          "$userbind16"
+"+userbind 17"                          "$userbind17"
+"+userbind 18"                          "$userbind18"
+"+userbind 19"                          "$userbind19"
+"+userbind 20"                          "$userbind20"
+"+userbind 21"                          "$userbind21"
+"+userbind 22"                          "$userbind22"
+"+userbind 23"                          "$userbind23"
+"+userbind 24"                          "$userbind24"
+"+userbind 25"                          "$userbind25"
+"+userbind 26"                          "$userbind26"
+"+userbind 27"                          "$userbind27"
+"+userbind 28"                          "$userbind28"
+"+userbind 29"                          "$userbind29"
+"+userbind 30"                          "$userbind30"
+"+userbind 31"                          "$userbind31"
+"+userbind 32"                          "$userbind32"
index ded133b3c495bb9065850bc0ae6030d00223f1d7..0551db87833d4038d074150e128a1582a4da3d7b 100644 (file)
@@ -10,3 +10,4 @@ pt Portuguese "Português"
 ro Romanian "Romana"
 ru Russian "Русский"
 fi Finnish "Suomi"
+uk Ukrainian "Українська"
index 09051a381ce47d56bb53426ef3aef704c4a29ac4..9951f0cab3a0a25e971a488a7c957366b1a35530 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-12 12:24+0200\n"
+"POT-Creation-Date: 2011-12-25 22:57+0100\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#: qcsrc/common/mapinfo.qc:1097 qcsrc/menu/xonotic/skinlist.c:163
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
@@ -26,23 +26,23 @@ msgstr "%s: %s"
 msgid "error: status is %d\n"
 msgstr "Fehler: Status ist %d\n"
 
-#: qcsrc/menu/gamecommand.qc:65
+#: qcsrc/menu/gamecommand.qc:70
 msgid "Usage: menu_cmd command..., where possible commands are:\n"
 msgstr "Syntax: menu_cmd Befehl..., wobei mögliche Befehle sind:\n"
 
-#: qcsrc/menu/gamecommand.qc:66
+#: qcsrc/menu/gamecommand.qc:71
 msgid "  sync - reloads all cvars on the current menu page\n"
 msgstr "  sync - lädt alle Variablen auf der aktuellen Menüseite neu\n"
 
-#: qcsrc/menu/gamecommand.qc:67
+#: qcsrc/menu/gamecommand.qc:72
 msgid "  directmenu ITEM - select a menu item as main item\n"
 msgstr "  directmenu ELEMENT - springt zu einem Menüelement"
 
-#: qcsrc/menu/gamecommand.qc:193
+#: qcsrc/menu/gamecommand.qc:185
 msgid "error creating curl handle\n"
 msgstr "Fehler beim Erstellen eines curl-Handles\n"
 
-#: qcsrc/menu/gamecommand.qc:239
+#: qcsrc/menu/gamecommand.qc:192
 msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
 msgstr ""
 "Ungültiger Befehl. Eine Liste der unterstützten Befehle wird von menu_cmd "
@@ -73,7 +73,7 @@ msgstr "%d (%s)"
 msgid "custom"
 msgstr "benutzerdefiniert"
 
-#: qcsrc/menu/menu.qc:29
+#: qcsrc/menu/menu.qc:37
 #, c-format
 msgid "^4MQC Build information: ^1%s\n"
 msgstr "^4MQC Build-Information: ^1%s (deutsch)\n"
@@ -114,9 +114,10 @@ msgstr "Entwickler"
 
 #: qcsrc/menu/xonotic/dialog_credits.c:21
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:277
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:35
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:89
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -463,8 +464,8 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:612
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+#: qcsrc/menu/xonotic/util.qc:623
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -529,6 +530,7 @@ msgid "Rankings:"
 msgstr "Platzierungen:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
 msgid "Off"
 msgstr "Aus"
 
@@ -569,7 +571,6 @@ msgid "Fade out after:"
 msgstr "Ausblenden nach:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
 msgid "Never"
 msgstr "Nie"
 
@@ -646,24 +647,24 @@ msgstr "HUD-Konfiguration"
 msgid "Panel background defaults:"
 msgstr "Panel-Standardhintergrund:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:598
 msgid "Background:"
 msgstr "Hintergrund:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
-#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:617 qcsrc/menu/xonotic/util.qc:634
 msgid "Disable"
 msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:606
 msgid "Color:"
 msgstr "Farbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:614
 msgid "Border size:"
 msgstr "Rahmengröße:"
 
@@ -672,11 +673,11 @@ msgstr "Rahmengröße:"
 msgid "Team color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:640
 msgid "Test team color in configure mode"
 msgstr "Teamfarbe bei Konfiguration testen"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:643
 msgid "Padding:"
 msgstr "Abstand:"
 
@@ -806,6 +807,7 @@ msgid "You might win"
 msgstr "Könntest gewinnen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:62
 msgid "Advanced"
 msgstr "Fortgeschritten"
 
@@ -834,7 +836,7 @@ msgid "Mutators..."
 msgstr "Mutators..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
 msgid "Advanced settings..."
 msgstr "Erweiterte Einstellungen..."
 
@@ -991,7 +993,7 @@ msgid "Game types:"
 msgstr "Spieltyp:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
 msgid "Close"
 msgstr "Schließen"
 
@@ -1017,108 +1019,121 @@ msgid "%s Arena"
 msgstr "%s-Arena"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
 msgid "Dodging"
 msgstr "Ausweichen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:258
 msgid "MinstaGib"
 msgstr "MinstaGib"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:261
 msgid "NIX"
 msgstr "NIX"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:213
 msgid "Rocket Flying"
 msgstr "Raketen-Fliegen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:210
+msgid "Invincible Projectiles"
+msgstr "Unzerstörbare Schüsse"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:272
 msgid "No start weapons"
 msgstr "Ohne Waffen starten"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:195
 msgid "Low gravity"
 msgstr "Wenig Schwerkraft"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
 msgid "Cloaked"
 msgstr "Tarnung"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
 msgid "Hook"
 msgstr "Enterhaken"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:179
 msgid "Midair"
 msgstr "in der Luft"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:182
 msgid "Vampire"
 msgstr "Vampir"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:216
 msgid "Piñata"
 msgstr "Piñata"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:219
 msgid "Weapons stay"
 msgstr "Waffen bleiben"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:186
 msgid "Blood loss"
 msgstr "Blutverlust"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:207
 msgid "Jet pack"
 msgstr "Jetpack"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:100
+msgid "No powerups"
+msgstr "Keine Boni"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:102
+msgid "Powerups"
+msgstr "Boni"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:104
 msgid "MUT^None"
 msgstr "keiner"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
 msgid "Gameplay mutators:"
 msgstr "Spielmechanik-Mutators:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:201
 msgid "Weapon & item mutators:"
 msgstr "Waffen/Gegenstände-Mutators:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:204
 msgid "Grappling hook"
 msgstr "Enterhaken"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:223
 msgid "Weapon arenas:"
 msgstr "Waffen-Arenen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:226
 msgid "Regular (no arena)"
 msgstr "Normal (keine Arena)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
 msgid "with laser"
 msgstr "mit Laser"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:255
 msgid "Special arenas:"
 msgstr "Spezielle Arenen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:268
 msgid "Most weapons"
 msgstr "Viele Waffen"
 
@@ -1175,7 +1190,7 @@ msgid "Info..."
 msgstr "Info..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:320
 msgid "Join!"
 msgstr "Verbinden!"
 
@@ -1185,244 +1200,249 @@ msgstr "Server-Information"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:186
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:192
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:202
 msgid "N/A"
 msgstr "-"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:161
 #, c-format
 msgid "%d/%d, %d free player slots"
 msgstr "%d/%d, %d freie Slots"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:175
 #, c-format
 msgid "%d modified settings"
 msgstr "%d veränderte Einstellungen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:175
 msgid "Official settings"
 msgstr "Offizielle Einstellungen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:200
 msgid "N/A (can't connect)"
 msgstr "- (nicht kompatibel)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:208
 msgid "not supported (can't connect)"
 msgstr "nicht unterstützt (nicht kompatibel)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:210
 msgid "not supported (won't encrypt)"
 msgstr "nicht untersützt (nicht aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:214
 msgid "supported (will encrypt)"
 msgstr "unterstützt (aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:216
 msgid "supported (won't encrypt)"
 msgstr "unterstützt (nicht aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:220
 msgid "requested (will encrypt)"
 msgstr "erwünscht (aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:222
 msgid "requested (won't encrypt)"
 msgstr "erwünscht (nicht aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:226
 msgid "required (can't connect)"
 msgstr "notwendig (nicht kompatibel)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:228
 msgid "required (will encrypt)"
 msgstr "notwendig (aktiv)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:249
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:272
 msgid "Players:"
 msgstr "Spieler:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:257
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
 msgid "Type:"
 msgstr "Typ:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:262
 msgid "Map:"
 msgstr "Map:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:267
 msgid "Gameplay:"
 msgstr "Spielregeln:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:277
 msgid "Bots:"
 msgstr "Bots:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:282
 msgid "Mod:"
 msgstr "Mod:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:287
 msgid "Version:"
 msgstr "Version:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:292
 msgid "Ping:"
 msgstr "Ping:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:298
 msgid "CA:"
 msgstr "CA:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:304
 msgid "Key:"
 msgstr "Schlüssel:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:310
 msgid "Encryption:"
 msgstr "Krypto:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:19
 msgid "Model:"
 msgstr "Modell:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:87
+msgid "Force player models to mine"
+msgstr "Alle Spieler als mein Modell zeigen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:90
 msgid "Field of view:"
 msgstr "Sichtfeld:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:94
 msgid "View bobbing:"
 msgstr "Sicht-Wackeln:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:98
 msgid "Zoom factor:"
 msgstr "Vergrößerungsfaktor:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:102
 msgid "Zoom speed:"
 msgstr "Vergrößerungsgeschwindigkeit:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:105
 msgid "Weapon settings..."
 msgstr "Waffeneinstellungen..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:112
 msgid "Crosshair:"
 msgstr "Fadenkreuz:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:113
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:141
 msgid "Per weapon"
 msgstr "pro Waffe"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:132
 msgid "Crosshair size:"
 msgstr "Größe:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:136
 msgid "Crosshair alpha:"
 msgstr "Alpha:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
 msgid "Crosshair color:"
 msgstr "Farbe:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:142
 msgid "By health"
 msgstr "je nach Health"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
 msgid "Custom"
 msgstr "benutzerdefiniert"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:150
 msgid "Enable center dot"
 msgstr "Punkt in der Mitte aktivieren"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:153
 msgid "Size:"
 msgstr "Größe:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
 msgid "Hit test:"
 msgstr "Treffer-Test:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
 msgid "HTST^None"
 msgstr "Aus"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:162
 msgid "TrueAim"
 msgstr "TrueAim"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:163
 msgid "Enemies"
 msgstr "Gegner"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:166
 msgid "Waypoints setup..."
 msgstr "Wegpunkt-Einstellungen..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:171
 msgid "Enter HUD editor"
 msgstr "HUD-Editor starten"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
 msgid "Force models:"
 msgstr "Modell erzwingen:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
 msgid "MDL^None"
 msgstr "keine"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:178
 msgid "MDL^Custom"
 msgstr "inoffizielle"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
 msgid "MDL^All"
 msgstr "alle"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
 msgid "Disable gore effects"
 msgstr "Gewalteffekte deaktivieren"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
 msgid "Gibs:"
 msgstr "Fleischteile:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
 msgid "GIBS^None"
 msgstr "Aus"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
 msgid "GIBS^Few"
 msgstr "Wenige"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:188
 msgid "GIBS^Many"
 msgstr "Einige"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:189
 msgid "GIBS^Lots"
 msgstr "Viele"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:193
 msgid "Damage splash:"
 msgstr "Schadenseffekt:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:197
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:195
 #: qcsrc/menu/xonotic/dialog_settings_input.c:74
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:109
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Apply immediately"
 msgstr "Sofort anwenden"
 
@@ -1442,17 +1462,9 @@ msgstr "Wegpunkt-Skalierung:"
 msgid "Waypoint alpha:"
 msgstr "Wegpunkt-Alpha:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
-msgid "Show names:"
-msgstr "Namen anzeigen:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
-msgid "Teammates"
-msgstr "Mitspieler"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
-msgid "All players"
-msgstr "Alle Spieler"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:33
+msgid "Show names above players"
+msgstr "Namen über Spielern anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
 msgid "Weapon settings"
@@ -1510,6 +1522,134 @@ msgstr "Ja"
 msgid "No"
 msgstr "Nein"
 
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:4
+msgid "Sandbox Tools"
+msgstr "Sandbox-Tools"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:24
+msgid "Spawn"
+msgstr "Neu"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:25
+msgid "Remove *"
+msgstr "Entfernen *"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:27
+msgid "Copy *"
+msgstr "Kopieren *"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:28
+msgid "Paste"
+msgstr "Einfügen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:30
+msgid "Bone:"
+msgstr "Knochen:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:35
+msgid "Set * as child"
+msgstr "* als Kind festlegen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:36
+msgid "Attach to *"
+msgstr "An * anhängen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:38
+msgid "Detach from *"
+msgstr "Von * abhängen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:41
+msgid "Visual object properties for *:"
+msgstr "Visuelle Eigenschaften von *:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:43
+msgid "Set skin:"
+msgstr "Skin:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:45
+msgid "Set alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:48
+msgid "Set color main:"
+msgstr "Hauptfarbe:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:50
+msgid "Set color glow:"
+msgstr "Leuchtfarbe:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:54
+msgid "Set frame:"
+msgstr "Frame:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:58
+msgid "Physical object properties for *:"
+msgstr "Physikalische Eigenschaften von *:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:60
+msgid "Set material:"
+msgstr "Material:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:66
+msgid "Set solidity:"
+msgstr "Festigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:67
+msgid "Non-solid"
+msgstr "Gasförmig"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:68
+msgid "Solid"
+msgstr "Fest"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:69
+msgid "Set physics:"
+msgstr "Physik:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:70
+msgid "Static"
+msgstr "Statisch"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:71
+msgid "Movable"
+msgstr "Beweglich"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:72
+msgid "Physical"
+msgstr "Physik-Eigenschaften"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:74
+msgid "Set scale:"
+msgstr "Größe:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:76
+msgid "Set force:"
+msgstr "Kraft:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:80
+msgid "Claim *"
+msgstr "* nehmen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:82
+msgid "* object info"
+msgstr "* Objekteigeschaften"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:83
+msgid "* mesh info"
+msgstr "* Modelleigenschaften"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:84
+msgid "* attachment info"
+msgstr "* Anhängerkupplung"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:85
+msgid "Show help"
+msgstr "Hilfe anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:86
+msgid "* is the object you are facing"
+msgstr "* ist das Objekt vor deiner Nase"
+
 #: qcsrc/menu/xonotic/dialog_settings.c:4
 msgid "Settings"
 msgstr "Einstellungen"
@@ -1585,7 +1725,7 @@ msgid "Weapons:"
 msgstr "Waffen:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:98
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:158
 msgid "Frequency:"
 msgstr "Frequenz:"
 
@@ -1666,74 +1806,78 @@ msgid "Headphone friendly mode"
 msgstr "Kopfhörer-Modus"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:131
+msgid "New style sound attenuation"
+msgstr "Neue Sound-Distanzformel"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "Spatial voices:"
 msgstr "Räumliche Sprachnachrichten:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^None"
 msgstr "keine"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:135
 msgid "VOCS^Taunts"
 msgstr "nur Spott"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
 msgid "VOCS^All"
 msgstr "alle"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
 msgid "Taunt range:"
 msgstr "Spott-Radius:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Very short"
 msgstr "Sehr klein"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Short"
 msgstr "Klein"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
 msgid "RNG^Long"
 msgstr "Groß"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
 msgid "RNG^Full"
 msgstr "Sehr groß"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:153
 msgid "Automatic taunts"
 msgstr "Automatischer Spott"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "Time warning:"
 msgstr "Zeitwarnung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "WRN^None"
 msgstr "keine"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "1 minute"
 msgstr "1 Minute"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:166
 msgid "5 minutes"
 msgstr "5 Minuten"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
 msgid "WRN^Both"
 msgstr "beide"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Hit indicator"
 msgstr "Treffer-Indikator"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:172
 msgid "Menu sounds"
 msgstr "Menü-Sounds"
 
@@ -1806,178 +1950,178 @@ msgid "AA^Disabled"
 msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:65
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
 msgid "2x"
 msgstr "2x"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:66
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:107
 msgid "4x"
 msgstr "4x"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "High-quality frame buffer"
+msgstr "Genauerer Framebuffer"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
 msgid "Texture resolution:"
 msgstr "Texturauflösung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
 msgid "RES^Leet"
 msgstr "Leet"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
 msgid "RES^Lowest"
 msgstr "Sehr niedrig"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
 msgid "RES^Low"
 msgstr "Niedrig"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:79
 msgid "RES^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:80
 msgid "RES^Good"
 msgstr "Gut"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:81
 msgid "RES^Best"
 msgstr "Sehr gut"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:97
 msgid "Avoid lossy texture compression"
 msgstr "Texturkompression vermeiden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
 msgid "Anisotropy:"
 msgstr "Anisotropie:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
 msgid "ANISO^Disabled"
 msgstr "Aus"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:108
 msgid "8x"
 msgstr "8x"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:109
 msgid "16x"
 msgstr "16x"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
 msgid "Particle quality:"
 msgstr "Partikelqualität:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:116
 msgid "Particle distance:"
 msgstr "Partikeldistanz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
 msgid "Decals"
 msgstr "Einschusslöcher"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:121
 msgid "Decals on models"
 msgstr "auch auf Objekten"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:125
 msgid "Distance:"
 msgstr "Distanz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:131
 msgid "Time:"
 msgstr "Zeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Use lightmaps"
 msgstr "Lightmaps verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
 msgid "Deluxe mapping"
 msgstr "Deluxemapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Gloss"
 msgstr "Glanz"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
 msgid "Offset mapping"
 msgstr "Offsetmapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Relief mapping"
 msgstr "Reliefmapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Reflections:"
 msgstr "Reflexionen:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:151
 msgid "Blurred"
 msgstr "Schwammig"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:152
 msgid "REFL^Good"
 msgstr "Gut"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
 msgid "Sharp"
 msgstr "Scharf"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:158
 msgid "Show surfaces"
 msgstr "Oberflächen anzeigen"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
 msgid "No dynamic lighting"
 msgstr "Kein dynamisches Licht"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
 msgid "Flash blend approximation"
 msgstr "Flash-Blend-Näherung"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
 msgid "Realtime dynamic lighting"
 msgstr "Dynamisches Licht in Echtzeit"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:169
 msgid "Shadows"
 msgstr "Schatten"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
 msgid "Realtime world lighting"
 msgstr "Map-Licht in Echtzeit"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
 msgid "Use normal maps"
 msgstr "Normalmaps verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Soft shadows"
 msgstr "Weiche Schatten"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Coronas"
 msgstr "Koronas"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:179
 msgid "Use Occlusion Queries"
 msgstr "Occlusion Queries verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
-msgid "Bloom"
-msgstr "Überstrahlung"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:181
 msgid "High Dynamic Range (HDR)"
 msgstr "Lichtdynamik (HDR)"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:185
 msgid "Motion blur:"
 msgstr "Bewegungsunschärfe:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:190
 msgid "Blur and sharpen postprocessing"
 msgstr "Schärfeeffekte"
 
@@ -2067,6 +2211,14 @@ msgstr "Frames pro Sekunde anzeigen"
 msgid "Minimize input latency"
 msgstr "Eingabelatenz minimieren"
 
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:59
+msgid "Menu Tooltips:"
+msgstr "Menü-Tooltips:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:61
+msgid "Standard"
+msgstr "Standard"
+
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
 msgid "Advanced settings"
 msgstr "Erweiterte Einstellungen"
@@ -2195,83 +2347,79 @@ msgstr "Vollbild"
 msgid "Vertical Synchronization"
 msgstr "Vertikale Synchronisation"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+#: qcsrc/menu/xonotic/dialog_settings_video.c:48
 msgid "Use OpenGL 2.0 shaders (GLSL)"
 msgstr "OpenGL 2.0 Shaders verwenden (GLSL)"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+#: qcsrc/menu/xonotic/dialog_settings_video.c:51
 msgid "Use GLSL to handle color control"
 msgstr "GLSL für Farbregelung verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+#: qcsrc/menu/xonotic/dialog_settings_video.c:55
 msgid "Vertex Buffer Objects (VBOs)"
 msgstr "Vertex Buffer Objects (VBOs)"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+#: qcsrc/menu/xonotic/dialog_settings_video.c:58
 msgid "VBO^Off"
 msgstr "Aus"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
 msgid "Vertices, some Tris (compatible)"
 msgstr "Ecken, einige Dreiecke (kompatibel)"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+#: qcsrc/menu/xonotic/dialog_settings_video.c:62
 msgid "Vertices"
 msgstr "Ecken"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
 msgid "Vertices and Triangles"
 msgstr "Ecken und Dreiecke"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+#: qcsrc/menu/xonotic/dialog_settings_video.c:66
 msgid "Depth first:"
 msgstr "Tiefe zuerst rendern:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#: qcsrc/menu/xonotic/dialog_settings_video.c:68
 msgid "DF^Disabled"
 msgstr "Aus"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
 msgid "DF^World"
 msgstr "nur Map"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
 msgid "DF^All"
 msgstr "Immer"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:75
-msgid "Disable multithreaded OpenGL"
-msgstr "OpenGL-Multithreading deaktivieren"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+#: qcsrc/menu/xonotic/dialog_settings_video.c:73
 msgid "Wait for GPU to finish each frame"
 msgstr "Bei jedem Frame auf die Grafikkarte warten"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+#: qcsrc/menu/xonotic/dialog_settings_video.c:76
 msgid "Brightness:"
 msgstr "Helligkeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+#: qcsrc/menu/xonotic/dialog_settings_video.c:79
 msgid "Contrast:"
 msgstr "Kontrast:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+#: qcsrc/menu/xonotic/dialog_settings_video.c:82
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+#: qcsrc/menu/xonotic/dialog_settings_video.c:87
 msgid "Contrast boost:"
 msgstr "Kontrasterhöhung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:96
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
 msgid "Saturation:"
 msgstr "Sättigung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:102
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
 msgid "LIT^Ambient:"
 msgstr "Umgebungslicht:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
 msgid "Intensity:"
 msgstr "Lichtstärke:"
 
@@ -2354,23 +2502,23 @@ msgstr "Vergessen"
 msgid "Bookmark"
 msgstr "Speichern"
 
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:548
 msgid "Ping"
 msgstr "Ping"
 
-#: qcsrc/menu/xonotic/serverlist.c:528
+#: qcsrc/menu/xonotic/serverlist.c:549
 msgid "Host name"
 msgstr "Servername"
 
-#: qcsrc/menu/xonotic/serverlist.c:529
+#: qcsrc/menu/xonotic/serverlist.c:550
 msgid "Map"
 msgstr "Map"
 
-#: qcsrc/menu/xonotic/serverlist.c:530
+#: qcsrc/menu/xonotic/serverlist.c:551
 msgid "Type"
 msgstr "Typ"
 
-#: qcsrc/menu/xonotic/serverlist.c:531
+#: qcsrc/menu/xonotic/serverlist.c:552
 msgid "Players"
 msgstr "Spieler"
 
@@ -2400,25 +2548,25 @@ msgstr "%s dB"
 msgid "%dx%d"
 msgstr "%dx%d"
 
-#: qcsrc/menu/xonotic/util.qc:271
+#: qcsrc/menu/xonotic/util.qc:276
 #, c-format
 msgid "Received HTTP request data for an invalid id %d.\n"
 msgstr "HTTP-Antwort für ungültige ID %d erhalten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:286
+#: qcsrc/menu/xonotic/util.qc:291
 #, c-format
 msgid "error receiving update notification: status is %d\n"
 msgstr "Fehler beim Empfang von Update-Information (Status: %d)\n"
 
-#: qcsrc/menu/xonotic/util.qc:291
+#: qcsrc/menu/xonotic/util.qc:296
 msgid "error: received HTML instead of an update notification\n"
 msgstr "Fehler: HTML statt Update-Information erhalten\n"
 
-#: qcsrc/menu/xonotic/util.qc:296
+#: qcsrc/menu/xonotic/util.qc:301
 msgid "error: received carriage returns from update notification server\n"
 msgstr "Fehler: Carriage-Returns in Update-Information enthalten\n"
 
-#: qcsrc/menu/xonotic/util.qc:317
+#: qcsrc/menu/xonotic/util.qc:322
 #, c-format
 msgid ""
 "Update can be downloaded at:\n"
@@ -2428,21 +2576,21 @@ msgstr ""
 "%s\n"
 "heruntergeladen werden.\n"
 
-#: qcsrc/menu/xonotic/util.qc:340
+#: qcsrc/menu/xonotic/util.qc:351
 msgid "Autogenerating mapinfo for newly added maps..."
 msgstr "Automatische Generierung von mapinfo-Dateien..."
 
-#: qcsrc/menu/xonotic/util.qc:370
+#: qcsrc/menu/xonotic/util.qc:381
 #, c-format
 msgid "^1%s TEST BUILD"
 msgstr "^1%s TESTVERSION"
 
-#: qcsrc/menu/xonotic/util.qc:428
+#: qcsrc/menu/xonotic/util.qc:439
 #, c-format
 msgid "Update to %s now!"
 msgstr "Jetzt auf %s updaten!"
 
-#: qcsrc/menu/xonotic/util.qc:513
+#: qcsrc/menu/xonotic/util.qc:524
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2450,452 +2598,386 @@ msgstr ""
 "^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
 "^1Darstellungsprobleme sind zu erwarten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:546
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:547
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:548
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:549
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:550
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:551
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:552
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:553
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:554
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:555
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:556
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:557
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:547
+#: qcsrc/menu/xonotic/util.qc:558
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:548
+#: qcsrc/menu/xonotic/util.qc:559
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:549
+#: qcsrc/menu/xonotic/util.qc:560
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:550
+#: qcsrc/menu/xonotic/util.qc:561
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:569
+#: qcsrc/menu/xonotic/util.qc:580
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba-Werfen"
 
-#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
-#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
-#: qcsrc/menu/xonotic/util.qc:634
+#: qcsrc/menu/xonotic/util.qc:600 qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:625 qcsrc/menu/xonotic/util.qc:633
+#: qcsrc/menu/xonotic/util.qc:645
 msgid "Default"
 msgstr "Standard"
 
-#: qcsrc/menu/xonotic/util.qc:600
+#: qcsrc/menu/xonotic/util.qc:611
 msgid "Use default"
 msgstr "Standard verwenden"
 
-#: qcsrc/menu/xonotic/util.qc:620
+#: qcsrc/menu/xonotic/util.qc:631
 msgid "Team Color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/util.qh:47
+#: qcsrc/menu/xonotic/util.qh:48
 msgid "Enable panel"
 msgstr "Panel aktivieren"
 
-#: qcsrc/server/w_crylink.qc:2
+#: weapons.qc.tmp:1
 msgid "Crylink"
 msgstr "Crylink"
 
-#: qcsrc/server/w_crylink.qc:666
-#, c-format
-msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr "%s zerstörte sich selbst erfolgreich mit der Crylink"
+#: weapons.qc.tmp:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
 
-#: qcsrc/server/w_crylink.qc:671
-#, c-format
-msgid "%s could not hide from %s's Crylink"
-msgstr "%s konnte sich nicht vor %ss Crylink verstecken"
+#: weapons.qc.tmp:3
+msgid "MinstaNex"
+msgstr "MinstaNex"
 
-#: qcsrc/server/w_crylink.qc:673
-#, c-format
-msgid "%s was too close to %s's Crylink"
-msgstr "%s trat %ss Crylink zu nahe"
+#: weapons.qc.tmp:4
+msgid "Mortar"
+msgstr "Mortar"
 
-#: qcsrc/server/w_crylink.qc:675
-#, c-format
-msgid "%s took a close look at %s's Crylink"
-msgstr "%s schaute sich %ss Crylink sehr genau an"
+#: weapons.qc.tmp:5
+msgid "Laser"
+msgstr "Laser"
 
-#: qcsrc/server/w_electro.qc:2
+#: weapons.qc.tmp:6
+msgid "Nex"
+msgstr "Nex"
+
+#: weapons.qc.tmp:7
+msgid "Grappling Hook"
+msgstr "Enterhaken"
+
+#: weapons.qc.tmp:8
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: weapons.qc.tmp:9
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: weapons.qc.tmp:10
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:574
-#, c-format
-msgid "%s could not remember where they put plasma"
-msgstr "%s vergaß, wo er das Plasma hingetan hatte"
-
-#: qcsrc/server/w_electro.qc:576
-#, c-format
-msgid "%s played with plasma"
-msgstr "%s spielte mit Plasma"
+#: weapons.qc.tmp:11
+msgid "Hagar"
+msgstr "Hagar"
 
-#: qcsrc/server/w_electro.qc:583
-#, c-format
-msgid "%s just noticed %s's blue ball"
-msgstr "%s hat gerade %ss blaue Kugel bemerkt"
+#: weapons.qc.tmp:12
+msgid "Shotgun"
+msgstr "Shotgun"
 
-#: qcsrc/server/w_electro.qc:585
+#: weapons.qc.tmp:13
 #, c-format
-msgid "%s got in touch with %s's blue ball"
-msgstr "%s kam mit %ss blauer Kugel in Kontakt"
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_electro.qc:590
-#, c-format
-msgid "%s felt the electrifying air of %s's combo"
-msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
+#: weapons.qc.tmp:14
+msgid "Mine Layer"
+msgstr "Mine Layer"
 
-#: qcsrc/server/w_electro.qc:592
-#, c-format
-msgid "%s got too close to %s's blue beam"
-msgstr "%s kam zu nah an %ss blauen Strahl"
+#: weapons.qc.tmp:15
+msgid "Rifle"
+msgstr "Gewehr"
 
-#: qcsrc/server/w_electro.qc:594
-#, c-format
-msgid "%s was blasted by %s's blue beam"
-msgstr "%s wurde von %ss blauen Strahl erwischt"
+#: weapons.qc.tmp:16
+msgid "Machine Gun"
+msgstr "Machine Gun"
 
-#: qcsrc/server/w_fireball.qc:2
+#: weapons.qc.tmp:17
 msgid "Fireball"
 msgstr "Fireball"
 
-#: qcsrc/server/w_fireball.qc:417
-#, c-format
-msgid "%s forgot about some firemine"
-msgstr "%s hat den Platz einer Feuermine vergessen"
+#: weapons.qc.tmp:18
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
-msgstr "%s hätte eine kleinere Waffe nehmen sollen"
+#~ msgid "Powerup sharpen"
+#~ msgstr "Bonus-Schärfe"
 
-#: qcsrc/server/w_fireball.qc:426
-#, c-format
-msgid "%s tried to catch %s's firemine"
-msgstr "%s hat versucht %ss Feuermine zu fangen"
+#~ msgid "Damage & water blur"
+#~ msgstr "Schadens-Unschärfe"
 
-#: qcsrc/server/w_fireball.qc:428
-#, c-format
-msgid "%s fatefully ignored %s's firemine"
-msgstr "%s hat tragischerweise %ss Feuermine ignoriert"
+#~ msgid "%s sniped themself somehow"
+#~ msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
 
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
-msgstr "%s konnte sich nicht vor %ss Feuerball verstecken"
+#~ msgid "%s shot themself automatically"
+#~ msgstr "%s hat sich vollautomatisch selbst erschossen"
 
-#: qcsrc/server/w_fireball.qc:437
-#, c-format
-msgid "%s saw the pretty lights of %s's fireball"
-msgstr "%s hat die hübschen Lichter von %ss Feuerball gesehen"
+#~ msgid "%s exploded"
+#~ msgstr "%s ist explodiert"
 
-#: qcsrc/server/w_fireball.qc:440
-#, c-format
-msgid "%s got too close to %s's fireball"
-msgstr "%s ist %ss Feuerball zu nahe getreten"
+#~ msgid "%s hoped %s's missiles wouldn't bounce"
+#~ msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
 
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
-msgstr "%s hat von %ss Feuerball probiert"
+#~ msgid "%s detonated"
+#~ msgstr "%s verfing sich in der eigenen Detonation"
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
+#~ msgid "%s tried out his own grenade"
+#~ msgstr "%s wollte wissen, ob seine Granate funktioniert"
 
-#: qcsrc/server/w_grenadelauncher.qc:383
-#, c-format
-msgid "%s tried out his own grenade"
-msgstr "%s wollte wissen, ob seine Granate funktioniert"
+#~ msgid "Disable multithreaded OpenGL"
+#~ msgstr "OpenGL-Multithreading deaktivieren"
 
-#: qcsrc/server/w_grenadelauncher.qc:385
-#, c-format
-msgid "%s detonated"
-msgstr "%s verfing sich in der eigenen Detonation"
+#~ msgid "Bloom"
+#~ msgstr "Überstrahlung"
 
-#: qcsrc/server/w_grenadelauncher.qc:391
-#, c-format
-msgid "%s didn't see %s's grenade"
-msgstr "%s hat %ss Granate nicht gesehen"
+#~ msgid "All players"
+#~ msgstr "Alle Spieler"
 
-#: qcsrc/server/w_grenadelauncher.qc:393
-#, c-format
-msgid "%s almost dodged %s's grenade"
-msgstr "%s ist fast %ss Granate ausgewichen"
+#~ msgid "Teammates"
+#~ msgstr "Mitspieler"
 
-#: qcsrc/server/w_grenadelauncher.qc:395
-#, c-format
-msgid "%s ate %s's grenade"
-msgstr "%s nahm %ss Granate in den Mund"
+#~ msgid "Show names:"
+#~ msgstr "Namen anzeigen:"
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
+#~ msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+#~ msgstr ""
+#~ "%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
+#~ "%%'n Tuba stammten, gestorben"
 
-#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
-#, c-format
-msgid "%s played with tiny rockets"
-msgstr "%s hat mit kleinen Raketen gespielt"
+#~ msgid "%s hurt his own ears with the @!#%%'n Tuba"
+#~ msgstr ""
+#~ "%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n "
+#~ "Tuba"
 
-#: qcsrc/server/w_hagar.qc:399
-#, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
+#~ msgid "%s ate %s's rocket"
+#~ msgstr "%s hat %ss Rakete in den Mund genommen"
 
-#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
-#, c-format
-msgid "%s was pummeled by %s"
-msgstr "^1%s^1 wurde von %s^1 erwischt"
+#~ msgid "%s almost dodged %s's rocket"
+#~ msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
-msgstr "Heavy Laser Assault Cannon"
+#~ msgid "%s got too close to %s's rocket"
+#~ msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_hlac.qc:242
-#, c-format
-msgid "%s was cut down by %s"
-msgstr "^1%s^1 wurde von %s^1 niedergehauen"
+#~ msgid "%s failed to hide from %s's rifle"
+#~ msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
-msgstr "Enterhaken"
+#~ msgid "%s felt %s doing the impossible to him"
+#~ msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
-#, c-format
-msgid "%s did the impossible"
-msgstr "%s hat das Unmögliche geschafft"
+#~ msgid "%s is now thinking with portals"
+#~ msgstr "%s kann jetzt mit Portalen denken"
 
-#: qcsrc/server/w_hook.qc:268
-#, c-format
-msgid "%s has run into %s's gravity bomb"
-msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
+#~ msgid "%s stepped on %s's mine"
+#~ msgstr "%s ist auf %ss Mine gelatscht"
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
+#~ msgid "%s almost dodged %s's mine"
+#~ msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_laser.qc:311
-#, c-format
-msgid "%s lasered themself to hell"
-msgstr "%s hat sich in die Hölle gelasert"
+#~ msgid "%s got too close to %s's mine"
+#~ msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_laser.qc:315
-#, c-format
-msgid "%s was cut in half by %s's gauntlet"
-msgstr "%s ist von %ss Gauntlet halbiert worden"
+#~ msgid "%s was lasered to death by %s"
+#~ msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 
-#: qcsrc/server/w_laser.qc:317
-#, c-format
-msgid "%s was lasered to death by %s"
-msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
+#~ msgid "%s was cut in half by %s's gauntlet"
+#~ msgstr "%s ist von %ss Gauntlet halbiert worden"
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
+#~ msgid "%s lasered themself to hell"
+#~ msgstr "%s hat sich in die Hölle gelasert"
 
-#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
-#, c-format
-msgid "%s exploded"
-msgstr "%s ist explodiert"
+#~ msgid "%s did the impossible"
+#~ msgstr "%s hat das Unmögliche geschafft"
 
-#: qcsrc/server/w_minelayer.qc:527
-#, c-format
-msgid "%s got too close to %s's mine"
-msgstr "%s ist %ss Mine zu nahe getreten"
+#~ msgid "%s ate %s's grenade"
+#~ msgstr "%s nahm %ss Granate in den Mund"
 
-#: qcsrc/server/w_minelayer.qc:529
-#, c-format
-msgid "%s almost dodged %s's mine"
-msgstr "%s ist fast %ss Mine ausgewichen"
+#~ msgid "%s almost dodged %s's grenade"
+#~ msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:531
-#, c-format
-msgid "%s stepped on %s's mine"
-msgstr "%s ist auf %ss Mine gelatscht"
+#~ msgid "%s didn't see %s's grenade"
+#~ msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
-msgstr "MinstaNex"
+#~ msgid "%s tasted %s's fireball"
+#~ msgstr "%s hat von %ss Feuerball probiert"
 
-#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
-#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
-#, c-format
-msgid "%s is now thinking with portals"
-msgstr "%s kann jetzt mit Portalen denken"
+#~ msgid "%s got too close to %s's fireball"
+#~ msgstr "%s ist %ss Feuerball zu nahe getreten"
 
-#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
-#, c-format
-msgid "%s has been vaporized by %s"
-msgstr "^1%s^1 wurde von %s^1 vernichtet"
+#~ msgid "%s saw the pretty lights of %s's fireball"
+#~ msgstr "%s hat die hübschen Lichter von %ss Feuerball gesehen"
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
+#~ msgid "%s could not hide from %s's fireball"
+#~ msgstr "%s konnte sich nicht vor %ss Feuerball verstecken"
 
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
+#~ msgid "%s fatefully ignored %s's firemine"
+#~ msgstr "%s hat tragischerweise %ss Feuermine ignoriert"
 
-#: qcsrc/server/w_porto.qc:298
-#, c-format
-msgid "%s felt %s doing the impossible to him"
-msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
+#~ msgid "%s tried to catch %s's firemine"
+#~ msgstr "%s hat versucht %ss Feuermine zu fangen"
 
-#: qcsrc/server/w_rifle.qc:2
-msgid "Rifle"
-msgstr "Gewehr"
+#~ msgid "%s should have used a smaller gun"
+#~ msgstr "%s hätte eine kleinere Waffe nehmen sollen"
 
-#: qcsrc/server/w_rifle.qc:233
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
+#~ msgid "%s forgot about some firemine"
+#~ msgstr "%s hat den Platz einer Feuermine vergessen"
 
-#: qcsrc/server/w_rifle.qc:235
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+#~ msgid "%s took a close look at %s's Crylink"
+#~ msgstr "%s schaute sich %ss Crylink sehr genau an"
 
-#: qcsrc/server/w_rifle.qc:242
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+#~ msgid "%s was too close to %s's Crylink"
+#~ msgstr "%s trat %ss Crylink zu nahe"
 
-#: qcsrc/server/w_rifle.qc:244
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
+#~ msgid "%s could not hide from %s's Crylink"
+#~ msgstr "%s konnte sich nicht vor %ss Crylink verstecken"
 
-#: qcsrc/server/w_rifle.qc:251
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+#~ msgid "%s succeeded at self-destructing themself with the Crylink"
+#~ msgstr "%s zerstörte sich selbst erfolgreich mit der Crylink"
 
-#: qcsrc/server/w_rifle.qc:256
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+#~ msgid "%s was riddled full of holes by %s's machine gun"
+#~ msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
 
-#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
+#~ msgid "%s was sniped by %s's machine gun"
+#~ msgstr "%s wurde von %ss Maschinengewehr erledigt"
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#~ msgid "%s died of %s's great playing on the @!#%%'n Accordeon"
+#~ msgstr ""
+#~ "%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf dem @!#"
+#~ "%%'n Akkordeon stammten, gestorben"
 
-#: qcsrc/server/w_rocketlauncher.qc:505
-#, c-format
-msgid "%s got too close to %s's rocket"
-msgstr "%s ist %ss Rakete zu nahe getreten"
+#~ msgid "%s hurt his own ears with the @!#%%'n Accordeon"
+#~ msgstr ""
+#~ "%s haben die Ohren geschmerzt von seinem eigenen Spiel auf dem @!#%%'n "
+#~ "Akkordeon"
 
-#: qcsrc/server/w_rocketlauncher.qc:507
-#, c-format
-msgid "%s almost dodged %s's rocket"
-msgstr "%s ist fast %ss Rakete ausgewichen"
+#~ msgid "%s was gunned down with a shotgun by %s"
+#~ msgstr "%s wurde von %s erschossen"
 
-#: qcsrc/server/w_rocketlauncher.qc:509
-#, c-format
-msgid "%s ate %s's rocket"
-msgstr "%s hat %ss Rakete in den Mund genommen"
+#~ msgid "%2$s slapped %1$s around a bit with a large shotgun"
+#~ msgstr "%2$s hat %1$s ein wenig mit einer großen Schrotflinte geschlagen"
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
+#~ msgid "%s was pummeled with seeker rockets by %s"
+#~ msgstr "%s wurde von %s erwischt"
 
-#: qcsrc/server/w_seeker.qc:659
-#, c-format
-msgid "%s was tagged by %s"
-msgstr "^1%s^1 wurde von %s^1 getagged"
+#~ msgid "%s was tagged with a seeker by %s"
+#~ msgstr "%s wurde von %s getagged"
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
+#~ msgid "%s played with tiny seeker rockets"
+#~ msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_shotgun.qc:219
-#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
+#~ msgid "%s was sniped with a rifle by %s"
+#~ msgstr "%s wurde von %s fachmännisch erledigt"
 
-#: qcsrc/server/w_shotgun.qc:221
-#, c-format
-msgid "%s was gunned by %s"
-msgstr "^1%s^1 wurde von %s^1 erschossen"
+#~ msgid "%s got shot in the head with a rifle by %s"
+#~ msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
 
-#: qcsrc/server/w_tuba.qc:2
-#, c-format
-msgid "@!#%'n Tuba"
-msgstr "@!#%'n Tuba"
+#~ msgid "%s died in %s's rifle bullet hail"
+#~ msgstr "%s ist in %ss Kugelhagel gefallen"
 
-#: qcsrc/server/w_tuba.qc:252
-#, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
-msgstr ""
-"%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
+#~ msgid "%s failed to hide from %s's rifle bullet hail"
+#~ msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
 
-#: qcsrc/server/w_tuba.qc:256
-#, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
-msgstr ""
-"%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
-"%%'n Tuba stammten, gestorben"
+#~ msgid "%s has been vaporized by %s's nex"
+#~ msgstr "%s^1 wurde von %ss Nex vernichtet"
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
+#~ msgid "%s has been vaporized by %s's minstanex"
+#~ msgstr "%s^1 wurde von %ss MinstaNex vernichtet"
 
-#: qcsrc/server/w_uzi.qc:323
-#, c-format
-msgid "%s was riddled full of holes by %s"
-msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+#~ msgid "%s forgot about their mine"
+#~ msgstr "%s hat den Platz einer Mine vergessen"
 
-#~ msgid "Damage & water blur"
-#~ msgstr "Schadens-Unschärfe"
+#~ msgid "%s was caught in %s's hook gravity bomb"
+#~ msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
 
-#~ msgid "Powerup sharpen"
-#~ msgstr "Bonus-Schärfe"
+#~ msgid "%s was cut down with a HLAC by %s"
+#~ msgstr "%s wurde von %ss HLAC niedergehauen"
+
+#~ msgid "%s was pummeled with hagar rockets by %s"
+#~ msgstr "%s wurde von %ss Hagar-Raketen erwischt"
+
+#~ msgid "%s was pummeled with a burst of hagar rockets by %s"
+#~ msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "%s played with tiny hagar rockets"
+#~ msgstr "%s hat mit kleinen Raketen gespielt"
+
+#~ msgid "%s didn't see their own grenade"
+#~ msgstr "%s hat die eigene Granate übersehen"
+
+#~ msgid "%s was blasted by %s's blue electro bolt"
+#~ msgstr "%s wurde von %ss blauen Strahl erwischt"
+
+#~ msgid "%s got too close to %s's blue electro bolt"
+#~ msgstr "%s kam zu nah an %ss blauen Strahl"
+
+#~ msgid "%s felt the electrifying air of %s's electro combo"
+#~ msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
+
+#~ msgid "%s got in touch with %s's electro plasma"
+#~ msgstr "%s kam mit %ss Plasma in Kontakt"
+
+#~ msgid "%s just noticed %s's electro plasma"
+#~ msgstr "%s hat gerade %ss Plasma bemerkt"
+
+#~ msgid "%s played with electro plasma"
+#~ msgstr "%s spielte mit Plasma"
+
+#~ msgid "%s could not remember where they put their electro plasma"
+#~ msgstr "%s vergaß, wo er das Plasma hingetan hatte"
index 47ba9ac194d249a281b9ffddab4668f9c5d98155..65636cfccf65d6e119114112b0160f6aec01e31b 100644 (file)
@@ -8,7 +8,8 @@ msgstr ""
 "Project-Id-Version: Xonotic 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-09-02 07:51+0200\n"
-"Last-Translator: Rodrigo Mouton Laudin <ratogenesis@gmail.com>\n"
+"Author: Rodrigo Mouton Laudin <ratogenesis@gmail.com>\n"
+"Last-Translator: mand1nga <mand1nga@xonotic.org>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
index 36dd7ff70074eab6976f5d65cedb23d1f5d563b0..7d04e238af62cb5108367fc1046a95e77f7c259b 100644 (file)
@@ -1,7 +1,10 @@
-# SOME DESCRIPTIVE TITLE.
+# SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR: xaN1C4n3 <robalm@freemail.hu>, 2011.
+# FIRST AUTHOR: xaN1C4n3 <robalm@freemail.hu>, 2011.01.19
+# corrected by xaN1C4n3, 2011.12.20.
+# further corrected by C.Brutail, 2011.12.28.
+#      version 2.1
 #
 #, fuzzy
 msgid ""
@@ -12,7 +15,7 @@ msgstr ""
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"Language:\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -56,7 +59,7 @@ msgstr "A böngésző nem indult el!"
 #: qcsrc/menu/item/label.c:63
 #, c-format
 msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
-msgstr "MEGJEGYZÉS: a %s szöveg túl széles címkének, csökkentsd %f-el\n"
+msgstr "MEGJEGYZÉS: a(z) %s szöveg túl széles címkének, csökkentsd %f-el\n"
 
 #: qcsrc/menu/item/listbox.c:300
 #, c-format
@@ -75,7 +78,7 @@ msgstr "egyéni"
 #: qcsrc/menu/menu.qc:29
 #, fuzzy, c-format
 msgid "^4MQC Build information: ^1%s\n"
-msgstr "^4MQC Épitési információ: %s\n"
+msgstr "^4MQC Build információ: %s\n"
 
 #: qcsrc/menu/xonotic/campaign.c:284
 #: qcsrc/menu/xonotic/dialog_singleplayer.c:134
@@ -89,7 +92,7 @@ msgstr "Szint %d: %s"
 
 #: qcsrc/menu/xonotic/cvarlist.c:85
 msgid "will be saved to config.cfg"
-msgstr "A config.cfg-ba lesz mentve"
+msgstr "A config.cfg-be lesz mentve"
 
 #: qcsrc/menu/xonotic/cvarlist.c:87
 msgid "will not be saved"
@@ -101,7 +104,7 @@ msgstr "magán"
 
 #: qcsrc/menu/xonotic/cvarlist.c:91
 msgid "engine setting"
-msgstr "motor beállítás"
+msgstr "grafikus motor beállítás"
 
 #: qcsrc/menu/xonotic/cvarlist.c:93
 msgid "read only"
@@ -109,7 +112,7 @@ msgstr "csak olvasható"
 
 #: qcsrc/menu/xonotic/dialog_credits.c:5
 msgid "Credits"
-msgstr "Köszönetek"
+msgstr "Közreműködők"
 
 #: qcsrc/menu/xonotic/dialog_credits.c:21
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
@@ -130,7 +133,9 @@ msgid ""
 "Welcome to Xonotic, please select your language preference and enter your "
 "player name to get started.  You can change these options later through the "
 "menu system."
-msgstr ""
+msgstr "Üdvözlünk a Xonotic-ban! Kérjük, a kezdéshez válaszd ki a használni kívánt nyelvet "
+"és írd be a játékos nevedet! Később ezeket meg is tudod változtatni "
+"a menürendszerben."
 
 #: qcsrc/menu/xonotic/dialog_firstrun.c:38
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:35
@@ -145,7 +150,7 @@ msgstr "Név:"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.c:69
 msgid "Save settings"
-msgstr "A beállítások mentése"
+msgstr "Beállítások mentése"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
 msgid "Ammo Panel"
@@ -161,7 +166,7 @@ msgstr "Csak az aktuális lőszer típus megjelenítése"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
 msgid "Align icon:"
-msgstr ""
+msgstr "Ikon sorrend:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
@@ -183,7 +188,7 @@ msgstr "Jobb"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
 msgid "Centerprint"
-msgstr ""
+msgstr "Közép"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
 #, fuzzy
@@ -193,27 +198,27 @@ msgstr "Színtelítettség:"
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
 #, fuzzy
 msgid "Fade time:"
-msgstr "Bejegyzés halványulási idő:"
+msgstr "Bejegyzés elhalványulási ideje:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
 #, fuzzy
 msgid "Flip messages order"
-msgstr "Értesítés rend megfordítás"
+msgstr "Értesítési sorrend megfordítása"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
 #, fuzzy
 msgid "Text alignment:"
-msgstr "Ikon igazítás:"
+msgstr "Szöveg igazítás:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
 msgid "Center"
-msgstr ""
+msgstr "Közép"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
 #, fuzzy
 msgid "Font scale:"
-msgstr "Útpont részletesség:"
+msgstr "Betűméret:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
 msgid "Chat Panel"
@@ -237,11 +242,11 @@ msgstr "Csevely sípszó"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
 msgid "Engine Info Panel"
-msgstr "Motor Információs panel"
+msgstr "Grafikus motor információs panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
 msgid "Engine info:"
-msgstr "Motor Információ:"
+msgstr "Grafikus motor Információ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
 msgid "Use an averaging algorithm for fps"
@@ -282,19 +287,19 @@ msgstr "Ikon igazítás:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
 msgid "Flip health and armor positions"
-msgstr "Életerő és páncél poziciójának cseréje"
+msgstr "Életerő és páncél pozíciójának cseréje"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
 msgid "Info Messages Panel"
-msgstr "Info üzenetek lapja"
+msgstr "Infó üzenetek panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
 msgid "Info messages:"
-msgstr "Info üzenetek:"
+msgstr "Infó üzenetek:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
 msgid "Flip align"
-msgstr "Flip összehangolása"
+msgstr "Fordított igazítás"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
 msgid "Mod Icons Panel"
@@ -310,24 +315,24 @@ msgstr "Értesítések:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
 msgid "Also print notifications to the console"
-msgstr "Az értesítéseket a konzolra is kiirja"
+msgstr "Az értesítéseket a konzolra is kiírja"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
 msgid "Flip notify order"
-msgstr "Értesítés rend megfordítás"
+msgstr "Értesítési sorrend megfordítása"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
 msgid "Entry lifetime:"
-msgstr "Bejegyzés élettartam:"
+msgstr "Bejegyzés élettartama:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
 msgid "Entry fadetime:"
-msgstr "Bejegyzés halványulási idő:"
+msgstr "Bejegyzés elhalványulási ideje:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
 #, fuzzy
 msgid "Physics Panel"
-msgstr "Csevely Panel"
+msgstr "Fizika Panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
@@ -338,32 +343,32 @@ msgstr "Panel kikapcsolva"
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
 #, fuzzy
 msgid "Panel enabled"
-msgstr "Panel kikapcsolva"
+msgstr "Panel engedélyezése"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
 #, fuzzy
 msgid "Panel enabled even observing"
-msgstr "Panel engedélyezett, ha csak néző vagy"
+msgstr "Panel engedélyezett, még nézőként is"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
 #, fuzzy
 msgid "Panel enabled only in Race/CTS"
-msgstr "Panel engedélyezve a csapatjátékokban"
+msgstr "Panel csak Verseny/CTS-ben engedélyezett"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
 #, fuzzy
 msgid "Status bar"
-msgstr "Állapotsor engedélyezése"
+msgstr "Állapotsor"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
 msgid "Left align"
-msgstr "Balra igazítása"
+msgstr "Balra igazít"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
 msgid "Right align"
-msgstr "Jobbra igazított"
+msgstr "Jobbra igazít"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
 #, fuzzy
@@ -378,7 +383,7 @@ msgstr "Kifelé"
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
 #, fuzzy
 msgid "Flip speed/acceleration positions"
-msgstr "Életerő és páncél poziciójának cseréje"
+msgstr "Sebesség/gyorsulás poziciójának cseréje"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
 #, fuzzy
@@ -387,11 +392,11 @@ msgstr "Sebesség (kB/s):"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
 msgid "Include vertical speed"
-msgstr ""
+msgstr "Függőleges sebességet is"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
 msgid "Speed unit:"
-msgstr ""
+msgstr "Sebesség mértékegysége:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
 msgid "qu/s"
@@ -416,25 +421,25 @@ msgstr "csomó"
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
 #, fuzzy
 msgid "Show"
-msgstr "Lőszer mutatása"
+msgstr "Mutasd"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
 #, fuzzy
 msgid "Top speed"
-msgstr "Nagyítás sebesség:"
+msgstr "Csúcssebesség"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
 #, fuzzy
 msgid "Acceleration:"
-msgstr "Tükrözödés:"
+msgstr "Gyorsulás:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
 msgid "Include vertical acceleration"
-msgstr ""
+msgstr "Függőleges sebességet is"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
-msgstr "Powerups Panel"
+msgstr "Powerupok Panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
 msgid "Flip strength and shield positions"
@@ -446,7 +451,7 @@ msgstr "Lenyomott gombok lapja"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
-msgstr "Panel engedélyezett, ha csak néző vagy"
+msgstr "Panel csak nézőként engedélyezett"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
@@ -455,7 +460,7 @@ msgstr "Panel mindig látható"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
-msgstr ""
+msgstr "Kényszerített nézőpont:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
 msgid "Race Timer Panel"
@@ -467,7 +472,7 @@ msgstr "Radar Panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
 msgid "Panel enabled in teamgames"
-msgstr "Panel engedélyezve a csapatjátékokban"
+msgstr "Panel csapatjátékokban engedélyezve"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
 msgid "Radar:"
@@ -479,7 +484,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
 #: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
-msgstr "Alpha:"
+msgstr "Átlátszóság:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
 msgid "Rotation:"
@@ -507,7 +512,7 @@ msgstr "Észak"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
 msgid "Scale:"
-msgstr "Arány:"
+msgstr "Méret:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
 msgid "Zoom mode:"
@@ -531,32 +536,32 @@ msgstr "Sohasem nagyított"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
 msgid "Score Panel"
-msgstr "Ponttáblázat"
+msgstr "Pontjelző panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
 msgid "Score:"
-msgstr ""
+msgstr "Pont:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
 msgid "Rankings:"
-msgstr ""
+msgstr "Helyezés:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
 #, fuzzy
 msgid "Off"
-msgstr "VBO^Off"
+msgstr "Kikapcsolva"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
 msgid "And me"
-msgstr ""
+msgstr "És nekem"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
 msgid "Pure"
-msgstr ""
+msgstr "Tiszta"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
-msgstr "Időtáblázat"
+msgstr "Időmérő panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
 msgid "Timer:"
@@ -568,15 +573,15 @@ msgstr "Eltelt idő mutatása"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
 msgid "Vote Panel"
-msgstr "Szavazati tábla"
+msgstr "Szavazó panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
 msgid "Alpha after voting:"
-msgstr "Alpha a szavazás után:"
+msgstr "Átlátszóság szavazat után:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
 msgid "Weapons Panel"
-msgstr "Fegyverek lapja"
+msgstr "Fegyver panel"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
 msgid "Fade out after:"
@@ -594,7 +599,7 @@ msgstr "%ds"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
 msgid "Fade effect:"
-msgstr "Halványulás hatás:"
+msgstr "Elhalványulás hatása:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
@@ -602,11 +607,11 @@ msgstr "EF^Nincs"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
-msgstr "Csúszás"
+msgstr "Becsúszó"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
 msgid "Alpha"
-msgstr "Alpha"
+msgstr "Halványuló"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
 #, fuzzy
@@ -619,19 +624,19 @@ msgstr "Fegyver ikonok:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
-msgstr "A Fegyver azonosító megjelenítés eszerint:"
+msgstr "A Fegyver ID megjelenítése mint:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
-msgstr "Nincs"
+msgstr "Sehogy"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
-msgstr "Szám"
+msgstr "Számmal"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
-msgstr "Hozzárendelés"
+msgstr "Billentyű"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
@@ -647,15 +652,15 @@ msgstr "Lőszer jelző színe:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
-msgstr "Lőszer jelző alpha:"
+msgstr "Lőszer jelző átlátszósága:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
 msgid "Panel HUD Setup"
-msgstr "HUD panel beállítás"
+msgstr "HUD panel beállítása"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
 msgid "Panel background defaults:"
-msgstr "Panel háttér alapértelmezett:"
+msgstr "Alapértelmezett panel háttér:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
 msgid "Background:"
@@ -685,19 +690,19 @@ msgstr "Csapat szín:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
-msgstr "Csapat szín ellenörzés konfigurációs módban"
+msgstr "Csapat szín tesztelés beállítás közben"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
-msgstr "Padding:"
+msgstr "Kitöltés:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
 msgid "HUD Dock:"
-msgstr "HUD rögzités:"
+msgstr "HUD rögzítők:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
 msgid "DOCK^Disabled"
-msgstr "Letiltott"
+msgstr "Letiltva"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
 msgid "DOCK^Small"
@@ -733,15 +738,15 @@ msgstr "Y:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
 msgid "Exit setup"
-msgstr "Kilépés a beállitásokból"
+msgstr "Kilépés a beállításokból"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.c:4
 msgid "Multiplayer"
-msgstr "Többjátékos"
+msgstr "Többjátékos mód"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.c:18
 msgid "Servers"
-msgstr "Kiszolgálók"
+msgstr "Szerverek"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.c:19
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
@@ -755,11 +760,11 @@ msgstr "Demók"
 #: qcsrc/menu/xonotic/dialog_multiplayer.c:21
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
 msgid "Player Setup"
-msgstr "Játékos beállítás"
+msgstr "Játékos beállítások"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
 msgid "Game type:"
-msgstr "Játék típus:"
+msgstr "Játék típusa:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
 msgid "Match settings:"
@@ -767,12 +772,12 @@ msgstr "Meccs beállítások:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
 msgid "Time limit:"
-msgstr "Idő határ:"
+msgstr "Időhatár:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
 msgid "Use map specified default"
-msgstr "Térképhez tartozó alapérték használata"
+msgstr "Pályához tartozó alapérték használata"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
@@ -782,11 +787,11 @@ msgstr "Térképhez tartozó alapérték használata"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
 msgid "Point limit:"
-msgstr "Pont határ:"
+msgstr "Ponthatár:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
 msgid "Player slots:"
-msgstr "Összes játékos:"
+msgstr "Maximális játékosszám"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
 msgid "Number of bots:"
@@ -807,7 +812,7 @@ msgstr "Kezdő"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You will win"
-msgstr "Biztosan te nyersz"
+msgstr "Te fogsz nyerni"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "You can win"
@@ -815,7 +820,7 @@ msgstr "Nyerhetsz"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "You might win"
-msgstr "Még legyőzheted"
+msgstr "Talán győzhetsz"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Advanced"
@@ -831,7 +836,7 @@ msgstr "Hivatásos"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Assassin"
-msgstr "Orgyilkos"
+msgstr "Gyilkológép"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
 msgid "Unhuman"
@@ -839,24 +844,24 @@ msgstr "Embertelen"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
 msgid "Godlike"
-msgstr "Isteni"
+msgstr "MAGA AZ ISTEN"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
 msgid "Mutators..."
-msgstr "Mutatorok..."
+msgstr "Módosítók..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
-msgstr "Különleges beállítások ..."
+msgstr "Haladó beállítások..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
 msgid "Map list:"
-msgstr "Térkép lista:"
+msgstr "Pályalista:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
 msgid "Select all"
-msgstr "Az összes kiválasztása"
+msgstr "Az összes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
 msgid "Select none"
@@ -864,11 +869,11 @@ msgstr "Egyik sem"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
 msgid "Start Multiplayer!"
-msgstr "Többjátékos indítása"
+msgstr "Többjátékos indítása!"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 msgid "Capture limit:"
-msgstr "Rablás határérték:"
+msgstr "Zászlórablások száma:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Lives:"
@@ -884,15 +889,15 @@ msgstr "Célok:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Frag limit:"
-msgstr "Frag határérték:"
+msgstr "Gyilok határérték:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
 msgid "Advanced server settings"
-msgstr "Speciális kiszolgáló beállítások"
+msgstr "Haladó szerver beállítások"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
 msgid "Game settings:"
-msgstr "Játék beállításai:"
+msgstr "Játék beállítások:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
 msgid "Allow spectating"
@@ -904,7 +909,7 @@ msgstr "Páncél megjelenés:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
 msgid "Game speed:"
-msgstr "Játék sebesség:"
+msgstr "Játék sebessége:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
 msgid "Teamplay settings:"
@@ -912,19 +917,19 @@ msgstr "Csapatjáték beállítások:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
 msgid "Friendly fire scale:"
-msgstr "Baráti tűz mértéke:"
+msgstr "Csapattárs sebzés mértéke:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
 msgid "Virtual friendly fire (effect only)"
-msgstr "Látszólagos baráti tűz (csak hatás)"
+msgstr "Látszólagos csapattárs sebzés (csak látvány)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
 msgid "Friendly fire penalty:"
-msgstr "Baráti tűz büntetés:"
+msgstr "Csapattárs megsebzésének büntetése:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
 msgid "Virtual penalty (effect only)"
-msgstr "Látszólagos büntetés (csak hatás)"
+msgstr "Látszólagos büntetés (csak látvány)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
 msgid "Teams:"
@@ -932,7 +937,7 @@ msgstr "Csapatok:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
 msgid "Map voting:"
-msgstr "Térkép szavazás:"
+msgstr "Pálya szavazás:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
 msgid "No voting"
@@ -976,7 +981,7 @@ msgstr "Egyszerű többség nyer"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
 msgid "Map Information"
-msgstr "Térkép Információ"
+msgstr "Pálya Információ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
 msgid "Full item placement"
@@ -1005,16 +1010,16 @@ msgstr "Játék típusok:"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
 msgid "Close"
-msgstr "Zárt"
+msgstr "Bezár"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
 #, fuzzy
 msgid "MAP^Play"
-msgstr "Játék"
+msgstr "Indítás"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
 msgid "Mutators"
-msgstr "Mutatorok"
+msgstr "Módosítók"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
 msgid "All Weapons Arena"
@@ -1032,7 +1037,7 @@ msgstr "%s Aréna"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
 msgid "Dodging"
-msgstr "Kitérés"
+msgstr "Félreugrás"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
@@ -1066,12 +1071,12 @@ msgstr "Álcázott"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
 msgid "Hook"
-msgstr "Horog"
+msgstr "Kampó"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
 msgid "Midair"
-msgstr "Levegőben"
+msgstr "Sebzés csak levegőben"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
@@ -1104,15 +1109,15 @@ msgstr "Nincs"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
 msgid "Gameplay mutators:"
-msgstr "Játékmenet mutatorok:"
+msgstr "Játékmenet módosítók:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
 msgid "Weapon & item mutators:"
-msgstr "Fegyver és tárgy mutatorok:"
+msgstr "Fegyver és tárgy módosítók:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
 msgid "Grappling hook"
-msgstr "Ragadós horog"
+msgstr "Vonóhorog"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
 msgid "Weapon arenas:"
@@ -1120,7 +1125,7 @@ msgstr "Fegyver Arénák:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
 msgid "Regular (no arena)"
-msgstr "Hagyományos (nincs aréna)"
+msgstr "Hagyományos (nincs módosítás)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
@@ -1137,11 +1142,11 @@ msgstr "A legtöbb fegyver"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
 msgid "Demo"
-msgstr "Demó"
+msgstr "Demók"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
 msgid "Record demos while playing"
-msgstr "Játék közben rögzitse a demókat"
+msgstr "Játék közben demók rögzítése"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
@@ -1157,12 +1162,12 @@ msgstr "Törlés"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
 msgid "Timedemo"
-msgstr "Demó időmérés"
+msgstr "Időmérés"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
 #, fuzzy
 msgid "DEMO^Play"
-msgstr "Játék"
+msgstr "Lejátszás"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
 msgid "Join"
@@ -1186,12 +1191,12 @@ msgstr "Cím:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
 msgid "Info..."
-msgstr "Info..."
+msgstr "Infó..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
 msgid "Join!"
-msgstr "Csatlakozz!"
+msgstr "Csatlakozok!"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
 msgid "Server Information"
@@ -1208,12 +1213,12 @@ msgstr "N/A"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
 #, c-format
 msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d szabad férőhely"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
 #, c-format
 msgid "%d modified settings"
-msgstr "%d módosított beállításai"
+msgstr "%d módosított beállítások"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
 msgid "Official settings"
@@ -1221,39 +1226,39 @@ msgstr "Hivatalos beállítások"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
 msgid "N/A (can't connect)"
-msgstr "N/A (nem tud csatlakozni)"
+msgstr "N/A (nem tudok csatlakozni)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
 msgid "not supported (can't connect)"
-msgstr "nem támogatott (nem tud csatlakozni)"
+msgstr "nem támogatott (nem tudok csatlakozni)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
 msgid "not supported (won't encrypt)"
-msgstr "nem támogatott (nem ellenörzött)"
+msgstr "nem támogatott (nem titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
 msgid "supported (will encrypt)"
-msgstr "támogatott (ellenörzött)"
+msgstr "támogatott (titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
 msgid "supported (won't encrypt)"
-msgstr "támogatott (nem ellenörzött)"
+msgstr "támogatott (nem titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
 msgid "requested (will encrypt)"
-msgstr "kért (ellenörzött)"
+msgstr "kért (titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
 msgid "requested (won't encrypt)"
-msgstr "kért (nem ellenörzött)"
+msgstr "kért (nem titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
 msgid "required (can't connect)"
-msgstr "szükséges (nem tud csatlakozni)"
+msgstr "szükséges (nem tudok csatlakozni)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
 msgid "required (will encrypt)"
-msgstr "szükséges (ellenörzött)"
+msgstr "szükséges (titkosított)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
@@ -1271,7 +1276,7 @@ msgstr "Pálya:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
 msgid "Gameplay:"
-msgstr "Játék:"
+msgstr "Játékmenet:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
 msgid "Bots:"
@@ -1305,25 +1310,29 @@ msgstr "Titkosítás:"
 msgid "Model:"
 msgstr "Modell:"
 
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:87
+msgid "Force player models to mine"
+msgstr "Ellenség modelljeinek kényszerítése az enyémmel megegyezőre"
+
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
 msgid "Field of view:"
 msgstr "Látómező:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
 msgid "View bobbing:"
-msgstr "Nézet döntés:"
+msgstr "Fej biccenés:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
 msgid "Zoom factor:"
-msgstr "Nagyítás szorzó:"
+msgstr "Nagyítási szorzó:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
 msgid "Zoom speed:"
-msgstr "Nagyítás sebesség:"
+msgstr "Nagyítás sebessége:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
 msgid "Weapon settings..."
-msgstr "Fegyver beállítások..."
+msgstr "Fegyverzet beállítások..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
 msgid "Crosshair:"
@@ -1340,7 +1349,7 @@ msgstr "Célkereszt mérete:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
 msgid "Crosshair alpha:"
-msgstr "Célkereszt alpha:"
+msgstr "Célkereszt átlátszósága:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
 msgid "Crosshair color:"
@@ -1348,16 +1357,16 @@ msgstr "Célkereszt színe:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
 msgid "By health"
-msgstr ""
+msgstr "Életerőtől függ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
 #, fuzzy
 msgid "Custom"
-msgstr "egyéni"
+msgstr "Egyéni"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
 msgid "Enable center dot"
-msgstr "Középpont engedélyezése"
+msgstr "Középső pont engedélyezése"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
 msgid "Size:"
@@ -1381,7 +1390,7 @@ msgstr "Ellenségek"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
 msgid "Waypoints setup..."
-msgstr "Útpontok beállítása..."
+msgstr "Iránypontok beállítása..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
 msgid "Enter HUD editor"
@@ -1405,7 +1414,7 @@ msgstr "MDL^Mind"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
 msgid "Disable gore effects"
-msgstr "Sérülés hatások letiltása"
+msgstr "Véres hatások letiltása"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
 msgid "Gibs:"
@@ -1429,7 +1438,7 @@ msgstr "GIBS^Rengeteg"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
 msgid "Damage splash:"
-msgstr "Sérülés szórás:"
+msgstr "Sérülési rázkódás:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:173
@@ -1442,19 +1451,19 @@ msgstr "Azonnali alkalmazás"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
 msgid "Waypoints"
-msgstr "Útpontok"
+msgstr "Iránypontok"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
 msgid "Show base waypoints"
-msgstr "Alap útpontok mutatása"
+msgstr "Bázis-iránypontok mutatása"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
 msgid "Waypoint scale:"
-msgstr "Útpont részletesség:"
+msgstr "Iránypontok mérete:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
 msgid "Waypoint alpha:"
-msgstr "Útpont alpha:"
+msgstr "Iránypontok átlátszósága:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
 msgid "Show names:"
@@ -1486,7 +1495,7 @@ msgstr "Le"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
 msgid "Use priority list for weapon cycling"
-msgstr "Az elsőbbségi listát használja a fegyverváltáshoz"
+msgstr "Az elsőbbségi listát használom a fegyverváltáshoz"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
 msgid "Auto switch weapons on pickup"
@@ -1494,11 +1503,11 @@ msgstr "Automatikus váltás a felvett fegyverre"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
 msgid "Draw 1st person weapon model"
-msgstr "1.személyű fegyver modell kirajzolása"
+msgstr "Kézben tartott fegyver kirajzolása"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
-msgstr "A nézet horizontális döntése"
+msgstr "A képernyő vízszintes tükrözése"
 
 #: qcsrc/menu/xonotic/dialog_news.c:4
 msgid "News"
@@ -1514,7 +1523,7 @@ msgstr "Kilépés"
 
 #: qcsrc/menu/xonotic/dialog_quit.c:17
 msgid "Are you sure you want to quit?"
-msgstr "Biztos vagy benne, hogy kilépsz?"
+msgstr "Biztos ki szeretnél lépni?"
 
 #: qcsrc/menu/xonotic/dialog_quit.c:20
 msgid "Yes"
@@ -1560,7 +1569,7 @@ msgstr "Egyéb"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:27
 msgid "Master:"
-msgstr "Mester:"
+msgstr "Általános:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:33
 msgid "Music:"
@@ -1568,7 +1577,7 @@ msgstr "Zene:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
-msgstr "VOL^Környezet:"
+msgstr "VOL^Háttérzajok:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:48
 msgid "Info:"
@@ -1584,7 +1593,7 @@ msgstr "Fájdalom:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
-msgstr "Játékos:"
+msgstr "Játékosok:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
@@ -1592,7 +1601,7 @@ msgstr "Lövések:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
-msgstr "Hang:"
+msgstr "Beszéd:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
@@ -1673,7 +1682,7 @@ msgstr "7.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
-msgstr "Sztereó megcserélése"
+msgstr "Sztereó felcserélése"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
@@ -1681,7 +1690,7 @@ msgstr "Fejhallgató barát mód"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
-msgstr "Térbeli hangok:"
+msgstr "Utasítások:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
@@ -1689,7 +1698,7 @@ msgstr "VOCS^Nincs"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
-msgstr "VOCS^Bekiabálások"
+msgstr "VOCS^Gúnyolódás"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
@@ -1697,15 +1706,15 @@ msgstr "VOCS^Minden"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
-msgstr "Bekiabálás terület:"
+msgstr "Gúnyolódások hallhatósága:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
-msgstr "RNG^Nagyon rövid"
+msgstr "RNG^Közvetlen közelről"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
-msgstr "RNG^Rövid"
+msgstr "RNG^Közelről"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
@@ -1713,23 +1722,23 @@ msgstr "RNG^Normál"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
-msgstr "RNG^Hosszú"
+msgstr "RNG^Távolról is"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
-msgstr "RNG^Teljes"
+msgstr "RNG^Teljes pályán"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
-msgstr "Automatikus bekiabálások"
+msgstr "Automatikus gúnyolódás"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
-msgstr "Idő figyelmeztetés:"
+msgstr "Időre figyelmeztetés:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
-msgstr "Nincs"
+msgstr "Kikapcsolva"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
@@ -1753,11 +1762,11 @@ msgstr "Menü hangok"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:38
 msgid "Quality preset:"
-msgstr "Minőség sablon:"
+msgstr "Grafikai részletesség:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:41
 msgid "PRE^OMG!"
-msgstr "PRE^OMG!"
+msgstr "PRE^ATYAÉG!"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:42
 msgid "PRE^Low"
@@ -1777,7 +1786,7 @@ msgstr "PRE^Magas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:46
 msgid "PRE^Ultra"
-msgstr "PRE^Szélsőséges"
+msgstr "PRE^Nagyon magas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:48
 msgid "PRE^Ultimate"
@@ -1785,7 +1794,7 @@ msgstr "PRE^Végső"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:52
 msgid "Geometry detail:"
-msgstr "Geometria részletesség:"
+msgstr "Geometriai részletesség:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:54
 msgid "DET^Lowest"
@@ -1805,11 +1814,11 @@ msgstr "DET^Jó"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:58
 msgid "DET^Best"
-msgstr "DET^Még jobb"
+msgstr "DET^Magas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:59
 msgid "DET^Insane"
-msgstr "DET^Őrült magas"
+msgstr "DET^Nagyon magas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:62
 msgid "Antialiasing:"
@@ -1860,7 +1869,7 @@ msgstr "RES^Legjobb"
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:91
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:94
 msgid "Avoid lossy texture compression"
-msgstr "Kerülje a veszteséges textúra tömörítést"
+msgstr "Veszteséges textúra tömörítés kikapcsolása"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:100
 msgid "Anisotropy:"
@@ -1880,27 +1889,27 @@ msgstr "16x"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:110
 msgid "Particle quality:"
-msgstr "Részecske minőség:"
+msgstr "Részecskék minősége:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:113
 msgid "Particle distance:"
-msgstr "Részecske távolság:"
+msgstr "Részecskék megjelenítése:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:117
 msgid "Decals"
-msgstr "Dekorációk"
+msgstr "Vér- és égésnyomok"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:118
 msgid "Decals on models"
-msgstr ""
+msgstr "Foltok a modelleken"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
-msgstr "Távolság:"
+msgstr "Megjelenítés távolsága:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
-msgstr "Idő:"
+msgstr "Eltűnés ideje"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
@@ -1912,7 +1921,7 @@ msgstr "Deluxe mapping"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
-msgstr "Fényes"
+msgstr "Csillogás"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
@@ -1924,7 +1933,7 @@ msgstr "Relief mapping"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
-msgstr "Tükrözödés:"
+msgstr "Tükröződés:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
@@ -1948,7 +1957,7 @@ msgstr "Nincsenek dinamikus fények"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
-msgstr "Közelítő villanás keverés"
+msgstr "Elnagyolt villanások"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
@@ -1961,11 +1970,11 @@ msgstr "Árnyékok"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
-msgstr "Valós idejű világ fényhatások"
+msgstr "Valósidejű világ fények"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
-msgstr "Normál map használata"
+msgstr "Normal map használata"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
@@ -1973,15 +1982,15 @@ msgstr "Lágy árnyékok"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
-msgstr "Fénykörök"
+msgstr "Fényudvarok"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
-msgstr "Use Occlusion Queries"
+msgstr "Láthatósági ellenőrzés"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
-msgstr "Virágzás"
+msgstr "Ragyogás"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
@@ -1989,19 +1998,19 @@ msgstr "Magas dinamika tartomány (HDR)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
-msgstr "Mozgási elmosás:"
+msgstr "Mozgási elmosódás:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:189
 msgid "Blur and sharpen postprocessing"
-msgstr ""
+msgstr "Elmosás és élesítés"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
-msgstr "Billentyű hozzárendelések:"
+msgstr "Billentyűzet-kiosztás:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:31
 msgid "Change key..."
-msgstr "Billentyű változtatás..."
+msgstr "Megváltoztatás..."
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:35
 msgid "Edit..."
@@ -2013,20 +2022,20 @@ msgstr "Érzékenység:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
-msgstr "UI egér sebesség:"
+msgstr "Menü egér sebessége:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
-msgstr "Egér szürés"
+msgstr "Egérmozgás simítása"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
-msgstr "Forditott egér"
+msgstr "Fordított egérmozgás"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:60
 #: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
-msgstr "Joystick bemenet használata"
+msgstr "Botkormány bemenet használata"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:65
 #: qcsrc/menu/xonotic/dialog_settings_input.c:67
@@ -2039,7 +2048,7 @@ msgstr "\"belépés a konzolba\" zár is"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
 msgid "User defined key bind"
-msgstr "Felhasználó által beállított billentyű"
+msgstr "Felhasználó által beállított parancsok"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
 msgid "Command when pressed:"
@@ -2063,15 +2072,15 @@ msgstr "Menü felületek:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:47
 msgid "Show current time"
-msgstr "Aktuális idő mutatása"
+msgstr "Jelenlegi idő mutatása"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:49
 msgid "Show current date"
-msgstr "Aktuális dátum mutatása"
+msgstr "Mai dátum mutatása"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:51
 msgid "Show frames per second"
-msgstr "A képkocka/s mutatása"
+msgstr "A képkocka/másodperc mutatása"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
 msgid "Minimize input latency"
@@ -2079,7 +2088,7 @@ msgstr "Bemeneti késleltetés minimalizása"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
 msgid "Advanced settings"
-msgstr "További beállítások"
+msgstr "Haladó beállítások"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
 msgid "Cvar filter:"
@@ -2099,7 +2108,7 @@ msgstr "Leírás:"
 
 #: qcsrc/menu/xonotic/dialog_settings_network.c:26
 msgid "Client-side movement prediction"
-msgstr "Kliens-oldali mozgás előrejelzés"
+msgstr "Kliens-oldali mozgásbecslés"
 
 #: qcsrc/menu/xonotic/dialog_settings_network.c:30
 msgid "Show netgraph"
@@ -2107,7 +2116,7 @@ msgstr "Hálózat forgalom megjelenítése"
 
 #: qcsrc/menu/xonotic/dialog_settings_network.c:33
 msgid "Network speed:"
-msgstr "Hálózati sebesség:"
+msgstr "Hálózat sebessége:"
 
 #: qcsrc/menu/xonotic/dialog_settings_network.c:35
 msgid "56k"
@@ -2155,7 +2164,7 @@ msgstr "Felbontás:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:29
 msgid "Font/UI size:"
-msgstr "Font/UI méret:"
+msgstr "Betük/Menü mérete:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:31
 msgid "SZ^Unreadable"
@@ -2203,11 +2212,11 @@ msgstr "Teljes képernyő"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:46
 msgid "Vertical Synchronization"
-msgstr "Szinkonizálás a képfrissítéshez"
+msgstr "Szinkonizálás a képernyő frissítéshez"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:49
 msgid "Use OpenGL 2.0 shaders (GLSL)"
-msgstr "OpenGL 2.0 árnyalók (GLSL) használata"
+msgstr "OpenGL 2.0 shaderek (GLSL) használata"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:52
 msgid "Use GLSL to handle color control"
@@ -2255,7 +2264,7 @@ msgstr "Többszálú OpenGL letiltása"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:77
 msgid "Wait for GPU to finish each frame"
-msgstr "Várakozás minden képkockánál, hogy a GPU végezzen"
+msgstr "Várakozás a GPU-ra minden képkockánál"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:80
 msgid "Brightness:"
@@ -2287,7 +2296,7 @@ msgstr "Erősség:"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.c:4
 msgid "Singleplayer"
-msgstr "Egyjátékos"
+msgstr "Egyjátékos mód"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.c:127
 msgid "Instant action! (random map with bots)"
@@ -2303,31 +2312,31 @@ msgstr "Győztes"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:5
 msgid "Team Selection"
-msgstr "Csapat választás"
+msgstr "Válassz csapatot!"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:41
 msgid "join 'best' team (auto-select)"
-msgstr "Csatlakozás a 'legjobb' csapathoz (auto-választás)"
+msgstr "Csatlakozás a 'legjobb' csapathoz (automatikus-választás)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:45
 msgid "red"
-msgstr "vörös"
+msgstr "Vörös"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:46
 msgid "blue"
-msgstr "kék"
+msgstr "Kék"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:47
 msgid "yellow"
-msgstr "sárga"
+msgstr "Sárga"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:48
 msgid "pink"
-msgstr "rózsaszín"
+msgstr "Rózsaszín"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.c:51
 msgid "spectate"
-msgstr "néző"
+msgstr "Nézőként csatlakozok"
 
 #: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
 msgid "Do not press this button again!"
@@ -2337,13 +2346,13 @@ msgstr "Ne nyomd meg újra ezt a gombot!"
 msgid ""
 "Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
 msgstr ""
-"Jajj? Ezzel nem lehet játszani (m is NULL). Állítsd át a szürést, hogy ne "
+"Jajj? Ezzel nem lehet játszani (m is NULL). Állítsd át a szűrést, hogy ne "
 "ismétlődjön meg!\n"
 
 #: qcsrc/menu/xonotic/maplist.c:286
 #, c-format
 msgid "%s's Xonotic Server"
-msgstr "%s Xonotic kiszolgálója"
+msgstr "%s Xonotic szervere"
 
 #: qcsrc/menu/xonotic/maplist.c:291
 msgid ""
@@ -2351,7 +2360,7 @@ msgid ""
 "again.\n"
 msgstr ""
 "Jajj? Ezzel nem lehet játszani (érvénytelen játék típus). Állítsd át a "
-"szürést, hogy ne ismétlődjön meg!\n"
+"szűrést, hogy ne ismétlődjön meg!\n"
 "."
 
 #: qcsrc/menu/xonotic/playermodel.c:174
@@ -2376,7 +2385,7 @@ msgstr "Gazda név"
 
 #: qcsrc/menu/xonotic/serverlist.c:529
 msgid "Map"
-msgstr "Térkép"
+msgstr "Pálya"
 
 #: qcsrc/menu/xonotic/serverlist.c:530
 msgid "Type"
@@ -2396,11 +2405,11 @@ msgstr "<SZERZŐ>"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:50
 msgid "VOL^OFF"
-msgstr "Hangerő ki"
+msgstr "Kikapcsolva"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:52
 msgid "VOL^MAX"
-msgstr "Hangerő maximum"
+msgstr "Maximum hangerő"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:53
 #, c-format
@@ -2441,17 +2450,17 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/util.qc:337
 msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "Önállóan előállitott MapInfo az újonnan hozzáadott térképekhez..."
+msgstr "MapInfo készítése az újonnan hozzáadott pályákhoz..."
 
 #: qcsrc/menu/xonotic/util.qc:367
 #, c-format
 msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s TEST BUILD"
 
 #: qcsrc/menu/xonotic/util.qc:432
 #, c-format
 msgid "Update to %s now!"
-msgstr "Most frissítsd %s-re!"
+msgstr "Most frissítsd %s-re/ra!"
 
 #: qcsrc/menu/xonotic/util.qc:501
 msgid ""
@@ -2459,7 +2468,7 @@ msgid ""
 "^1Expect visual problems.\n"
 msgstr ""
 "^1Hiba: textúra tömörítés szükséges, de nem támogatott.\n"
-"^1Gondok lehetnek a látvánnyal.\n"
+"^1Gondok lehetnek a megjelenítéssel.\n"
 
 #: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
@@ -2471,7 +2480,7 @@ msgstr "Ostrom"
 
 #: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
-msgstr "Szerezd meg a zászlót"
+msgstr "Zászlórablás"
 
 #: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
@@ -2479,7 +2488,7 @@ msgstr "Klán Aréna"
 
 #: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
-msgstr "Mindenki mindenki ellen"
+msgstr "Haláljátszma"
 
 #: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
@@ -2487,19 +2496,19 @@ msgstr "Uralom"
 
 #: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
-msgstr "Freeze Tag"
+msgstr "Fagyasztás"
 
 #: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
-msgstr "Keepaway"
+msgstr "Önzőség"
 
 #: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
-msgstr "Kulcs vadászat"
+msgstr "Kulcsvadászat"
 
 #: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
-msgstr "Last Man Standing"
+msgstr "Csak egy maradhat"
 
 #: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
@@ -2511,11 +2520,11 @@ msgstr "Támadás"
 
 #: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
-msgstr "Futam"
+msgstr "Verseny"
 
 #: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
-msgstr "Race CTS"
+msgstr "Ügyességi verseny"
 
 #: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
@@ -2523,7 +2532,7 @@ msgstr "Rúnameccs"
 
 #: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
-msgstr "Csapatos öldöklés"
+msgstr "Csapat[os] öldöklés "
 
 #: qcsrc/menu/xonotic/util.qc:557
 #, c-format
@@ -2546,233 +2555,233 @@ msgstr "Csapat színe:"
 
 #: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
-msgstr "Panel engedélyezés"
+msgstr "Panel engedélyezése"
 
 #: qcsrc/server/w_crylink.qc:2
 msgid "Crylink"
-msgstr ""
+msgstr "Crylink"
 
 #: qcsrc/server/w_crylink.qc:666
 #, c-format
 msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr ""
+msgstr "%s sikeres öngyikosságot követett el Crylinkkel"
 
 #: qcsrc/server/w_crylink.qc:671
 #, c-format
 msgid "%s could not hide from %s's Crylink"
-msgstr ""
+msgstr "%s nem menekülhetett %s Crylinkje elől"
 
 #: qcsrc/server/w_crylink.qc:673
 #, c-format
 msgid "%s was too close to %s's Crylink"
-msgstr ""
+msgstr "%s túl közel hajolt %s Crylinkjéhez"
 
 #: qcsrc/server/w_crylink.qc:675
 #, c-format
 msgid "%s took a close look at %s's Crylink"
-msgstr ""
+msgstr "%s  közelebbről megleste %s Crylinkjét"
 
 #: qcsrc/server/w_electro.qc:2
 msgid "Electro"
-msgstr ""
+msgstr "Electro"
 
 #: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
-msgstr ""
+msgstr "%s nem tudja, hogy mire való a plazma"
 
 #: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
-msgstr ""
+msgstr "%s  plazmával játszadozott"
 
 #: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
-msgstr ""
+msgstr "%s csak most vette észre %s kék golyóját"
 
 #: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
-msgstr ""
+msgstr "%s lefejelte %s kék golyóját"
 
 #: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
-msgstr ""
+msgstr "%s felvillanyozódott %s kombójától"
 
 #: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
-msgstr ""
+msgstr "%s túl közel került %s kék sugarához"
 
 #: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
-msgstr ""
+msgstr "%s megsemmisült %s kék sugarától"
 
 #: qcsrc/server/w_fireball.qc:2
 #, fuzzy
 msgid "Fireball"
-msgstr "Nexball"
+msgstr "Tűzgolyó"
 
 #: qcsrc/server/w_fireball.qc:417
 #, c-format
 msgid "%s forgot about some firemine"
-msgstr ""
+msgstr "%s megfeledkezett pár gyújtóbombáról"
 
 #: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
 #, c-format
 msgid "%s should have used a smaller gun"
-msgstr ""
+msgstr "%s játszott volna vízipisztollyal "
 
 #: qcsrc/server/w_fireball.qc:426
 #, c-format
 msgid "%s tried to catch %s's firemine"
-msgstr ""
+msgstr "%s  megpróbálta elkapni %s gyújtóbombáját"
 
 #: qcsrc/server/w_fireball.qc:428
 #, c-format
 msgid "%s fatefully ignored %s's firemine"
-msgstr ""
+msgstr "%s már tudja, hogy %s gyújtóbombájának figyelmen kívül hagyása végzetes."
 
 #: qcsrc/server/w_fireball.qc:435
 #, c-format
 msgid "%s could not hide from %s's fireball"
-msgstr ""
+msgstr "%s nem tudott elbújni %s tűzgolyójától"
 
 #: qcsrc/server/w_fireball.qc:437
 #, c-format
 msgid "%s saw the pretty lights of %s's fireball"
-msgstr ""
+msgstr "%s látthatta %s tűzgolyójának csinos fényeit"
 
 #: qcsrc/server/w_fireball.qc:440
 #, c-format
 msgid "%s got too close to %s's fireball"
-msgstr ""
+msgstr "%s túl közel merészkedett  %s tűzgolyójához"
 
 #: qcsrc/server/w_fireball.qc:442
 #, c-format
 msgid "%s tasted %s's fireball"
-msgstr ""
+msgstr "%s megízlelte %s tűzgolyóját"
 
 #: qcsrc/server/w_grenadelauncher.qc:2
 #, fuzzy
 msgid "Mortar"
-msgstr "Előre"
+msgstr "Mortar"
 
 #: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
-msgstr ""
+msgstr "%s kipróbálta saját gránátját"
 
 #: qcsrc/server/w_grenadelauncher.qc:385
 #, fuzzy, c-format
 msgid "%s detonated"
-msgstr "néző"
+msgstr "%s  felrobbant"
 
 #: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
-msgstr ""
+msgstr "%s nem látta %s gránátját"
 
 #: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
-msgstr ""
+msgstr "%s majdnem kicselezte %s gránátját"
 
 #: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
-msgstr ""
+msgstr "%s bekapta %s gránátját"
 
 #: qcsrc/server/w_hagar.qc:2
 msgid "Hagar"
-msgstr ""
+msgstr "Hagar"
 
 #: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
-msgstr ""
+msgstr "%s  kis rakétákkal játszott"
 
 #: qcsrc/server/w_hagar.qc:399
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr ""
+msgstr "%s remélte, hogy %s rakétája nem éri el"
 
 #: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
-msgstr ""
+msgstr "%s -t ledarálta %s Hagarja"
 
 #: qcsrc/server/w_hlac.qc:2
 msgid "Heavy Laser Assault Cannon"
-msgstr ""
+msgstr "Nehéz Lézer Roham Ágyú"
 
 #: qcsrc/server/w_hlac.qc:242
 #, c-format
 msgid "%s was cut down by %s"
-msgstr ""
+msgstr "%s -t feldarabolta %s"
 
 #: qcsrc/server/w_hook.qc:2
 #, fuzzy
 msgid "Grappling Hook"
-msgstr "Ragadós horog"
+msgstr "Vonóhorog"
 
 #: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
-msgstr ""
+msgstr "%s megcsinálta a lehetetlent"
 
 #: qcsrc/server/w_hook.qc:268
 #, c-format
 msgid "%s has run into %s's gravity bomb"
-msgstr ""
+msgstr "%s beleszalad %s gravitációs bombájába"
 
 #: qcsrc/server/w_laser.qc:2
 #, fuzzy
 msgid "Laser"
-msgstr "Mester:"
+msgstr "Lézer"
 
 #: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
-msgstr ""
+msgstr "%s magán lézershowja rosszul sült el"
 
 #: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
-msgstr ""
+msgstr "%s -t félbevágta %s kesztyűje"
 
 #: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
-msgstr ""
+msgstr "%s meghalt %s lézere által"
 
 #: qcsrc/server/w_minelayer.qc:2
 #, fuzzy
 msgid "Mine Layer"
-msgstr "Egyjátékos"
+msgstr "Aknavető"
 
 #: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
-msgstr ""
+msgstr "%s felrobbant"
 
 #: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
-msgstr ""
+msgstr "%s túl közel került %s aknájához"
 
 #: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
-msgstr ""
+msgstr "%s majdnem elkerülte %s aknáját"
 
 #: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
-msgstr ""
+msgstr "%s rálépett %s aknájára"
 
 #: qcsrc/server/w_minstanex.qc:2
 #, fuzzy
@@ -2783,108 +2792,108 @@ msgstr "MinstaGib"
 #: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
 #, c-format
 msgid "%s is now thinking with portals"
-msgstr ""
+msgstr "%s most már portálokkal mereng"
 
 #: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
-msgstr ""
+msgstr "%s -t gázzá vált %s által"
 
 #: qcsrc/server/w_nex.qc:2
 #, fuzzy
 msgid "Nex"
-msgstr "Nexball"
+msgstr "Nex"
 
 #: qcsrc/server/w_porto.qc:2
 msgid "Port-O-Launch"
-msgstr ""
+msgstr "Port-O-Launch"
 
 #: qcsrc/server/w_porto.qc:298
 #, c-format
 msgid "%s felt %s doing the impossible to him"
-msgstr ""
+msgstr "%s érezte, hogy %s lehetetlen tett vele"
 
 #: qcsrc/server/w_rifle.qc:2
 msgid "Rifle"
-msgstr ""
+msgstr "Puska"
 
 #: qcsrc/server/w_rifle.qc:233
 #, c-format
 msgid "%s shot themself automatically"
-msgstr ""
+msgstr "%s saját magát lőtte agyon"
 
 #: qcsrc/server/w_rifle.qc:235
 #, c-format
 msgid "%s sniped themself somehow"
-msgstr ""
+msgstr "%s-t levadászta saját magát valahogy"
 
 #: qcsrc/server/w_rifle.qc:242
 #, c-format
 msgid "%s failed to hide from %s's bullet hail"
-msgstr ""
+msgstr "%s -nak nem sikerült elbújnia %s golyózápora elől "
 
 #: qcsrc/server/w_rifle.qc:244
 #, c-format
 msgid "%s died in %s's bullet hail"
-msgstr ""
+msgstr "%s meghalt %s golyózáporában"
 
 #: qcsrc/server/w_rifle.qc:251
 #, c-format
 msgid "%s failed to hide from %s's rifle"
-msgstr ""
+msgstr "%s -nak nem sikerült elbújnia %s puskája elöl"
 
 #: qcsrc/server/w_rifle.qc:256
 #, c-format
 msgid "%s got hit in the head by %s"
-msgstr ""
+msgstr "%s -t fejen találta %s"
 
 #: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
 msgid "%s was sniped by %s"
-msgstr ""
+msgstr "%s -t levadászta %s"
 
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
-msgstr ""
+msgstr "Rakétavető"
 
 #: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
-msgstr ""
+msgstr "%s túl közel kerül %s rakétájához"
 
 #: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
-msgstr ""
+msgstr "%s majdnem kicselezte %s rakétáját"
 
 #: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
-msgstr ""
+msgstr "%s megette %s rakétáját"
 
 #: qcsrc/server/w_seeker.qc:2
 msgid "T.A.G. Seeker"
-msgstr ""
+msgstr "T.A.G. Seeker"
 
 #: qcsrc/server/w_seeker.qc:659
 #, c-format
 msgid "%s was tagged by %s"
-msgstr ""
+msgstr "%s-t megjelölte %s"
 
 #: qcsrc/server/w_shotgun.qc:2
 #, fuzzy
 msgid "Shotgun"
-msgstr "Lövések:"
+msgstr "Vadászpuska"
 
 #: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr ""
+msgstr "%2$s ^7úgy elverte %1$s -t ^7 a ^2puskályával, mintha ^7szívlapáttal csapta volna agyon"
 
 #: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
-msgstr ""
+msgstr "%s-t lelőtte %s"
 
 #: qcsrc/server/w_tuba.qc:2
 #, fuzzy, c-format
@@ -2894,29 +2903,29 @@ msgstr "@!#%'n Tuba Dobás"
 #: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
-msgstr ""
+msgstr "%s se bírta tovább a @!#%%'n Tuba hangját"
 
 #: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
-msgstr ""
+msgstr "%s meghalt %s nagyszerű  @!#%%'n Tuba játékától"
 
 #: qcsrc/server/w_uzi.qc:2
 msgid "Machine Gun"
-msgstr ""
+msgstr "Gépfegyver"
 
 #: qcsrc/server/w_uzi.qc:323
 #, c-format
 msgid "%s was riddled full of holes by %s"
-msgstr ""
+msgstr "%s -t %s szitává lyuggatta"
 
 #, fuzzy
 #~ msgid "Damage & water blur"
-#~ msgstr "Sérülés elmosás:"
+#~ msgstr "Sérülés és víz elmosás"
 
 #, fuzzy
 #~ msgid "Powerup sharpen"
-#~ msgstr "Powerups Panel"
+#~ msgstr "Powerup élesítés"
 
 #~ msgid "Speedometer"
 #~ msgstr "Sebességmérő"
@@ -2936,7 +2945,7 @@ msgstr ""
 #~ "A jobb játékélmény érdekében, kérlek, válaszolj pár inditó kérdésre!"
 
 #~ msgid "Waypoint settings:"
-#~ msgstr "Útpont beállítások:"
+#~ msgstr "Iránypont beállítások:"
 
 #~ msgid "%d/%d"
 #~ msgstr "%d/%d"
index a64c1ac323a1a200c6ee50e0cc4aac9e31cc45e7..f300f549fa8aae208a17acb33359f4f882b59cfc 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-12 12:24+0200\n"
+"POT-Creation-Date: 2011-12-25 22:57+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,57 +17,232 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/menu/menu.qc:29
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started.  You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+msgid "Name:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
+msgid "Left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
+msgid "Right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:276
 #, c-format
-msgid "^4MQC Build information: ^1%s\n"
+msgid "Received HTTP request data for an invalid id %d.\n"
 msgstr ""
 
-#: qcsrc/menu/item/slider.c:64
+#: qcsrc/menu/xonotic/util.qc:291
 #, c-format
-msgid "%d (%s)"
+msgid "error receiving update notification: status is %d\n"
 msgstr ""
 
-#: qcsrc/menu/item/label.c:63
+#: qcsrc/menu/xonotic/util.qc:296
+msgid "error: received HTML instead of an update notification\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:301
+msgid "error: received carriage returns from update notification server\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:322
 #, c-format
-msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
 msgstr ""
 
-#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
-msgid "custom"
+#: qcsrc/menu/xonotic/util.qc:351
+msgid "Autogenerating mapinfo for newly added maps..."
 msgstr ""
 
-#: qcsrc/menu/item/gecko.c:49
-msgid "Browser not initialized!"
+#: qcsrc/menu/xonotic/util.qc:381
+#, c-format
+msgid "^1%s TEST BUILD"
 msgstr ""
 
-#: qcsrc/menu/item/listbox.c:300
+#: qcsrc/menu/xonotic/util.qc:439
 #, c-format
-msgid "Item %d"
+msgid "Update to %s now!"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:47
+#: qcsrc/menu/xonotic/util.qc:524
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:547
+msgid "Assault"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:548
+msgid "Capture The Flag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:549
+msgid "Clan Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:550
+msgid "Deathmatch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:551
+msgid "Domination"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:552
+msgid "Freeze Tag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:553
+msgid "Keepaway"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:554
+msgid "Key Hunt"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:555
+msgid "Last Man Standing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:556
+msgid "Nexball"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:557
+msgid "Onslaught"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:558
+msgid "Race"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:559
+msgid "Race CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:560
+msgid "Runematch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:561
+msgid "Team Deathmatch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:580
 #, c-format
-msgid "error: status is %d\n"
+msgid "@!#%'n Tuba Throwing"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:65
-msgid "Usage: menu_cmd command..., where possible commands are:\n"
+#: qcsrc/menu/xonotic/util.qc:598 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23
+msgid "Background:"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:66
-msgid "  sync - reloads all cvars on the current menu page\n"
+#: qcsrc/menu/xonotic/util.qc:600 qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:625 qcsrc/menu/xonotic/util.qc:633
+#: qcsrc/menu/xonotic/util.qc:645
+msgid "Default"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:67
-msgid "  directmenu ITEM - select a menu item as main item\n"
+#: qcsrc/menu/xonotic/util.qc:601 qcsrc/menu/xonotic/util.qc:617
+#: qcsrc/menu/xonotic/util.qc:634 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91
+msgid "Disable"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:193
-msgid "error creating curl handle\n"
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77
+msgid "Color:"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:239
-msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+#: qcsrc/menu/xonotic/util.qc:611
+msgid "Use default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35
+msgid "Border size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:623 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "Alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:631
+msgid "Team Color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:640 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58
+msgid "Test team color in configure mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:643 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61
+msgid "Padding:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:4
@@ -131,412 +306,381 @@ msgstr ""
 msgid "Vertical Synchronization"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+#: qcsrc/menu/xonotic/dialog_settings_video.c:48
 msgid "Use OpenGL 2.0 shaders (GLSL)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+#: qcsrc/menu/xonotic/dialog_settings_video.c:51
 msgid "Use GLSL to handle color control"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+#: qcsrc/menu/xonotic/dialog_settings_video.c:55
 msgid "Vertex Buffer Objects (VBOs)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+#: qcsrc/menu/xonotic/dialog_settings_video.c:58
 msgid "VBO^Off"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
 msgid "Vertices, some Tris (compatible)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+#: qcsrc/menu/xonotic/dialog_settings_video.c:62
 msgid "Vertices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
 msgid "Vertices and Triangles"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+#: qcsrc/menu/xonotic/dialog_settings_video.c:66
 msgid "Depth first:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#: qcsrc/menu/xonotic/dialog_settings_video.c:68
 msgid "DF^Disabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
 msgid "DF^World"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
 msgid "DF^All"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:75
-msgid "Disable multithreaded OpenGL"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+#: qcsrc/menu/xonotic/dialog_settings_video.c:73
 msgid "Wait for GPU to finish each frame"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+#: qcsrc/menu/xonotic/dialog_settings_video.c:76
 msgid "Brightness:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+#: qcsrc/menu/xonotic/dialog_settings_video.c:79
 msgid "Contrast:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+#: qcsrc/menu/xonotic/dialog_settings_video.c:82
 msgid "Gamma:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+#: qcsrc/menu/xonotic/dialog_settings_video.c:87
 msgid "Contrast boost:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:96
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
 msgid "Saturation:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:102
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
 msgid "LIT^Ambient:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
 msgid "Intensity:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:109
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 #: qcsrc/menu/xonotic/dialog_settings_input.c:74
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:195
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:197
 msgid "Apply immediately"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
-msgid "Panel HUD Setup"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
-msgid "Panel background defaults:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
-msgid "Background:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
-#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
-msgid "Disable"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+msgid "Clear"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
-msgid "Color:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
-msgid "Border size:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:257
+msgid "Type:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:612
-msgid "Alpha:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
-msgid "Team color:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
-msgid "Test team color in configure mode"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:35
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:89
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:277
+msgid "OK"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
-msgid "Padding:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
-msgid "HUD Dock:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+msgid "Enable status bar"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-msgid "DOCK^Disabled"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+msgid "Status bar alignment:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-msgid "DOCK^Small"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+msgid "Inward"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-msgid "DOCK^Medium"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-msgid "DOCK^Large"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
-msgid "Grid settings:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
-msgid "Snap panels to grid"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+msgid "Outward"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
-msgid "Grid size:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+msgid "Icon alignment:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
-msgid "X:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
-msgid "Y:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
-msgid "Exit setup"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+msgid "Panel disabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
-msgid "Vote Panel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
-msgid "Alpha after voting:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
-msgid "Mod Icons Panel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
-msgid "Info Messages Panel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
-msgid "Info messages:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
-msgid "Flip align"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
-msgid "Waypoints"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
-msgid "Show base waypoints"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
-msgid "Waypoint scale:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
-msgid "Waypoint alpha:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
-msgid "Show names:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
-msgid "Never"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
-msgid "Teammates"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
-msgid "All players"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_credits.c:21
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
-msgid "OK"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_credits.c:5
-msgid "Credits"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
-msgid "Advanced settings"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
-msgid "Cvar filter:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
-#: qcsrc/menu/xonotic/dialog_settings_input.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
-msgid "Clear"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
-msgid "Setting:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
-msgid "Type:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
-msgid "Value:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
-msgid "Description:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
-msgid "Pressed Keys Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
-msgid "Panel enabled when spectating"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
-msgid "Forced aspect:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:5
-msgid "Team Selection"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+msgid "Center"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:41
-msgid "join 'best' team (auto-select)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+msgid "Flip view horizontally"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:45
-msgid "red"
+#: qcsrc/menu/xonotic/serverlist.c:185
+msgid "Remove"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:46
-msgid "blue"
+#: qcsrc/menu/xonotic/serverlist.c:187
+msgid "Bookmark"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:47
-msgid "yellow"
+#: qcsrc/menu/xonotic/serverlist.c:548
+msgid "Ping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:48
-msgid "pink"
+#: qcsrc/menu/xonotic/serverlist.c:549
+msgid "Host name"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:51
-msgid "spectate"
+#: qcsrc/menu/xonotic/serverlist.c:550
+msgid "Map"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_resolution.c:65
-#, c-format
-msgid "%dx%d"
+#: qcsrc/menu/xonotic/serverlist.c:551
+msgid "Type"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:4
-msgid "Settings"
+#: qcsrc/menu/xonotic/serverlist.c:552
+msgid "Players"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:18
-#: qcsrc/menu/xonotic/dialog_settings_input.c:4
-msgid "Input"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:20
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
-msgid "Effects"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:21
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
-msgid "Audio"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:22
-#: qcsrc/menu/xonotic/dialog_settings_network.c:4
-msgid "Network"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:23
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
-msgid "Misc"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:4
-msgid "Welcome"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:33
-msgid ""
-"Welcome to Xonotic, please select your language preference and enter your "
-"player name to get started.  You can change these options later through the "
-"menu system."
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:38
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
-msgid "Text language:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:47
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
-msgid "Name:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "Off"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:69
-msgid "Save settings"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
 msgstr ""
 
-#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
-msgid "???"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
 msgstr ""
 
-#: qcsrc/menu/xonotic/campaign.c:285
-#, c-format
-msgid "Level %d: %s"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+msgid "Input"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
@@ -585,183 +729,33 @@ msgstr ""
 msgid "Holding jump key keeps jumping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
-msgid "Weapons Panel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
-msgid "Fade out after:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
-#, c-format
-msgid "%ds"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
-msgid "Fade effect:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
-msgid "EF^None"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
-msgid "Slide"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
-msgid "Alpha"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
-msgid "EF^Both"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
-msgid "Weapon icons:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
-msgid "Show only owned weapons"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
-msgid "Show weapon ID as:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
-msgid "SHOWAS^None"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
-msgid "Number"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
-msgid "Bind"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
-msgid "Show Accuracy"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
-msgid "Show Ammo"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
-msgid "Ammo bar color:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
-msgid "Ammo bar alpha:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
-msgid "Do not press this button again!"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
-msgid "Engine Info Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
-msgid "Engine info:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
-msgid "Use an averaging algorithm for fps"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
-msgid "Physics Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
-msgid "Panel enabled"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
-msgid "Panel enabled even observing"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
-msgid "Panel enabled only in Race/CTS"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
-msgid "Status bar"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
-msgid "Right align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
-msgid "Inward align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
-msgid "Outward align"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
-msgid "Flip speed/acceleration positions"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
-msgid "Speed:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
-msgid "Include vertical speed"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
-msgid "Speed unit:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
-msgid "qu/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
-msgid "m/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
-msgid "km/h"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
-msgid "mph"
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
-msgid "knots"
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
-msgid "Show"
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
-msgid "Top speed"
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
-msgid "Acceleration:"
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
-msgid "Include vertical acceleration"
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_quit.c:4
@@ -780,1141 +774,1029 @@ msgstr ""
 msgid "No"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
-msgid "Join"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
-msgid "Filter:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
-msgid "SRVS^Empty"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
-msgid "SRVS^Full"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
-msgid "Pause"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
-msgid "Address:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
-msgid "Info..."
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
-msgid "Join!"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
-msgid "Notification Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
-msgid "Notifications:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
-msgid "Also print notifications to the console"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
-msgid "Flip notify order"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
-msgid "Entry lifetime:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
-msgid "Entry fadetime:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/util.qh:47
-msgid "Enable panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
-msgid "Menu skins:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
-msgid "Show current time"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
-msgid "Show current date"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
-msgid "Show frames per second"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Minimize input latency"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
-msgid "Advanced settings..."
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
-msgid "Singleplayer"
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
-msgid "Instant action! (random map with bots)"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
-msgid "Start Singleplayer!"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:105
-msgid "<TITLE>"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:106
-msgid "<AUTHOR>"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:163 qcsrc/common/mapinfo.qc:1092
-#, c-format
-msgid "%s: %s"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_news.c:4
-msgid "News"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_news.c:18
-msgid "http://www.xonotic.org/team/blog/"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
-msgid "Server Information"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
-msgid "N/A"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
-#, c-format
-msgid "%d/%d, %d free player slots"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-msgid "Official settings"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-#, c-format
-msgid "%d modified settings"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
-msgid "N/A (can't connect)"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
-msgid "not supported (can't connect)"
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
-msgid "not supported (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
-msgid "supported (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
-msgid "supported (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+msgid "Panel always enabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
-msgid "requested (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
-msgid "requested (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
-msgid "required (can't connect)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
-msgid "required (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
-msgid "Players:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
-msgid "Map:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
-msgid "Gameplay:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
-msgid "Bots:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
-msgid "Mod:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
-msgid "Version:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
-msgid "Ping:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
-msgid "CA:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
-msgid "Key:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
-msgid "Encryption:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+msgid "Audio"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
-msgid "Close"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:50
-msgid "VOL^OFF"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:52
-msgid "VOL^MAX"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
+msgid "VOL^Ambient:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:53
-#, c-format
-msgid "%s dB"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
-msgid "Mutators"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
+msgid "Items:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
-msgid "All Weapons Arena"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
+msgid "Pain:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
-msgid "Most Weapons Arena"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
+msgid "Player:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
-#, c-format
-msgid "%s Arena"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
+msgid "Shots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
-msgid "Dodging"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
+msgid "Voice:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
-msgid "MinstaGib"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
+msgid "Weapons:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
-msgid "NIX"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:158
+msgid "Frequency:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
-msgid "Rocket Flying"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
+msgid "8 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
-msgid "No start weapons"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
+msgid "11.025 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
-msgid "Low gravity"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
+msgid "16 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
-msgid "Cloaked"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+msgid "22.05 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
-msgid "Hook"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
+msgid "24 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
-msgid "Midair"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "32 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
-msgid "Vampire"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "44.1 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
-msgid "Piñata"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "48 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
-msgid "Weapons stay"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "Channels:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
-msgid "Blood loss"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "Mono"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
-msgid "Jet pack"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
+msgid "Stereo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
-msgid "MUT^None"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
+msgid "2.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
-msgid "Gameplay mutators:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "4"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
-msgid "Weapon & item mutators:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
+msgid "5"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
-msgid "Grappling hook"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "5.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
-msgid "Weapon arenas:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "6.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
-msgid "Regular (no arena)"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "7.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
-msgid "with laser"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "Swap Stereo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
-msgid "Special arenas:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
+msgid "Headphone friendly mode"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
-msgid "Most weapons"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
+msgid "New style sound attenuation"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
-msgid "Radar Panel"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
+msgid "Spatial voices:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
-msgid "Panel enabled in teamgames"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
+msgid "VOCS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
-msgid "Radar:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:135
+msgid "VOCS^Taunts"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
-msgid "Rotation:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "VOCS^All"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
-msgid "Forward"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "Taunt range:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
-msgid "West"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "RNG^Very short"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
-msgid "South"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
+msgid "RNG^Short"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
-msgid "East"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
+msgid "RNG^Normal"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
-msgid "North"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Long"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
-msgid "Scale:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Full"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
-msgid "Zoom mode:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:153
+msgid "Automatic taunts"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
-msgid "Zoomed in"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
+msgid "Time warning:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
-msgid "Zoomed out"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
+msgid "WRN^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
-msgid "Always zoomed"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "1 minute"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
-msgid "Never zoomed"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:166
+msgid "5 minutes"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
-msgid "Race Timer Panel"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^Both"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
-msgid "Chat Panel"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "Hit indicator"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
-msgid "Chat entries:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:172
+msgid "Menu sounds"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
-msgid "Chat size:"
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
-msgid "Chat lifetime:"
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
-msgid "Chat beep sound"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
-msgid "Create"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
-msgid "Game type:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
-msgid "Match settings:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
-msgid "Time limit:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
-msgid "Use map specified default"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-msgid "Point limit:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
-msgid "Player slots:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
-msgid "Number of bots:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
-msgid "Bot skill:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
-msgid "Botlike"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
-msgid "Beginner"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
-msgid "You will win"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
-msgid "You can win"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
-msgid "You might win"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
-msgid "Advanced"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
-msgid "Expert"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
-msgid "Pro"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
-msgid "Assassin"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
-msgid "Unhuman"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
-msgid "Godlike"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
-msgid "Mutators..."
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
-msgid "Map list:"
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
-msgid "Select all"
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
-msgid "Select none"
+#: qcsrc/menu/xonotic/skinlist.c:163 qcsrc/common/mapinfo.qc:1097
+#, c-format
+msgid "%s: %s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
-msgid "Start Multiplayer!"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
-msgid "Capture limit:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+msgid "Filter:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
-msgid "Lives:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
-msgid "Laps:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
-msgid "Goals:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
-msgid "Frag limit:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
-msgid "Winner"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
+msgid "Info..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
-msgid "User defined key bind"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:320
+msgid "Join!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
-msgid "Command when pressed:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
-msgid "Command when released:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
-msgid "Save"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+msgid "Never"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
-msgid "Cancel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
-msgid "Player Setup"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
-msgid "Model:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "EF^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
-msgid "Field of view:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
+msgid "Slide"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
-msgid "View bobbing:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
-msgid "Zoom factor:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
-msgid "Zoom speed:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
+msgid "Weapon icons:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
-msgid "Weapon settings..."
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
-msgid "Crosshair:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+msgid "Show weapon ID as:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139
-msgid "Per weapon"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "SHOWAS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
-msgid "Crosshair size:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Number"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
-msgid "Crosshair alpha:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+msgid "Bind"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
-msgid "Crosshair color:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
+msgid "Show Accuracy"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
-msgid "By health"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+msgid "Show Ammo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-msgid "Custom"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
+msgid "Ammo bar color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
-msgid "Enable center dot"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
+msgid "Ammo bar alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
-msgid "Size:"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
-msgid "Hit test:"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
+msgid "Instant action! (random map with bots)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
-msgid "HTST^None"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
+#: qcsrc/menu/xonotic/campaign.c:284
+msgid "???"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
-msgid "TrueAim"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
+msgid "Start Singleplayer!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
-msgid "Enemies"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
-msgid "Waypoints setup..."
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
-msgid "Enter HUD editor"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
-msgid "Force models:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
-msgid "MDL^None"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
-msgid "MDL^Custom"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
-msgid "MDL^All"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
-msgid "Disable gore effects"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Close"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
-msgid "Gibs:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
-msgid "GIBS^None"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
-msgid "GIBS^Few"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
-msgid "GIBS^Many"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
-msgid "GIBS^Lots"
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
-msgid "Damage splash:"
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:85
-msgid "will be saved to config.cfg"
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:87
-msgid "will not be saved"
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:89
-msgid "private"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:91
-msgid "engine setting"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:93
-msgid "read only"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
-msgid "Centerprint"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
-msgid "Message duration:"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
-msgid "Fade time:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
-msgid "Flip messages order"
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
-msgid "Text alignment:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
-msgid "Left"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
+msgid "Game type:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Center"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
+msgid "Match settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
-msgid "Right"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
+msgid "Time limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
-msgid "Font scale:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
+msgid "Use map specified default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
-msgid "Score Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+msgid "Point limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
-msgid "Score:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
+msgid "Player slots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
-msgid "Rankings:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
+msgid "Number of bots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
-msgid "Off"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
+msgid "Bot skill:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
-msgid "And me"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
+msgid "Botlike"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
-msgid "Pure"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Beginner"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
-msgid "Timer Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "You will win"
 msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
-msgid "Timer:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You can win"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
-msgid "Show elapsed time"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You might win"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
-msgid "Map Information"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:62
+msgid "Advanced"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "Full item placement"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Expert"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "MinstaGib only"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Pro"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
-msgid "Title:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Assassin"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
-msgid "Author:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Unhuman"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
-msgid "Features:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Godlike"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
-msgid "Game types:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
+msgid "Mutators..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
-msgid "MAP^Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "Advanced settings..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
-msgid "Advanced server settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
+msgid "Map list:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
-msgid "Game settings:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
+msgid "Select all"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
-msgid "Allow spectating"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
+msgid "Select none"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
-msgid "Spawn shield:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
+msgid "Start Multiplayer!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
-msgid "Game speed:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
+msgid "Capture limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
-msgid "Teamplay settings:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+msgid "Lives:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
-msgid "Friendly fire scale:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Laps:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
-msgid "Virtual friendly fire (effect only)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Goals:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
-msgid "Friendly fire penalty:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Frag limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
-msgid "Virtual penalty (effect only)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
-msgid "Teams:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
-msgid "Map voting:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
-msgid "No voting"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
-msgid "2 choices"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:33
+msgid "Show names above players"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
-msgid "3 choices"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
-msgid "4 choices"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
-msgid "5 choices"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
-msgid "6 choices"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
-msgid "7 choices"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
-msgid "8 choices"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
-msgid "9 choices"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Minimize input latency"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
-msgid "Simple majority wins vcall"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:59
+msgid "Menu Tooltips:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:271
-#, c-format
-msgid "Received HTTP request data for an invalid id %d.\n"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:61
+msgid "Standard"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:286
-#, c-format
-msgid "error receiving update notification: status is %d\n"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:291
-msgid "error: received HTML instead of an update notification\n"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:296
-msgid "error: received carriage returns from update notification server\n"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:317
-#, c-format
-msgid ""
-"Update can be downloaded at:\n"
-"%s\n"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:340
-msgid "Autogenerating mapinfo for newly added maps..."
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:370
-#, c-format
-msgid "^1%s TEST BUILD"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:428
-#, c-format
-msgid "Update to %s now!"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:513
-msgid ""
-"^1ERROR: Texture compression is required but not supported.\n"
-"^1Expect visual problems.\n"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:535
-msgid "Arena"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:536
-msgid "Assault"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:537
-msgid "Capture The Flag"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:538
-msgid "Clan Arena"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:539
-msgid "Deathmatch"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:540
-msgid "Domination"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:541
-msgid "Freeze Tag"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:542
-msgid "Keepaway"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:543
-msgid "Key Hunt"
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:544
-msgid "Last Man Standing"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:545
-msgid "Nexball"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:186
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:192
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:202
+msgid "N/A"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:546
-msgid "Onslaught"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:161
+#, c-format
+msgid "%d/%d, %d free player slots"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:547
-msgid "Race"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:175
+msgid "Official settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:548
-msgid "Race CTS"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:175
+#, c-format
+msgid "%d modified settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:549
-msgid "Runematch"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:200
+msgid "N/A (can't connect)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:550
-msgid "Team Deathmatch"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:208
+msgid "not supported (can't connect)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:569
-#, c-format
-msgid "@!#%'n Tuba Throwing"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:210
+msgid "not supported (won't encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
-#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
-#: qcsrc/menu/xonotic/util.qc:634
-msgid "Default"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:214
+msgid "supported (will encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:600
-msgid "Use default"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:216
+msgid "supported (won't encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:620
-msgid "Team Color:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:220
+msgid "requested (will encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/playermodel.c:174
-msgid "<no model found>"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:222
+msgid "requested (won't encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
-msgid "Ammo Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:226
+msgid "required (can't connect)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
-msgid "Ammunition display:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:228
+msgid "required (will encrypt)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
-msgid "Show only current ammo type"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:249
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:272
+msgid "Players:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
-msgid "Align icon:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:262
+msgid "Map:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
-msgid "Weapon settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:267
+msgid "Gameplay:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
-msgid "Weapon priority list:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:277
+msgid "Bots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
-msgid "Up"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:282
+msgid "Mod:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
-msgid "Down"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:287
+msgid "Version:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
-msgid "Use priority list for weapon cycling"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:292
+msgid "Ping:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
-msgid "Auto switch weapons on pickup"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:298
+msgid "CA:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
-msgid "Draw 1st person weapon model"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:304
+msgid "Key:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
-msgid "Flip view horizontally"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:310
+msgid "Encryption:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:38
@@ -1986,893 +1868,877 @@ msgid "AA^Disabled"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:65
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
 msgid "2x"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:66
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:107
 msgid "4x"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:70
-msgid "Texture resolution:"
+msgid "High-quality frame buffer"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "Texture resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
 msgid "RES^Leet"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
 msgid "RES^Lowest"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
 msgid "RES^Low"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:79
 msgid "RES^Normal"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:80
 msgid "RES^Good"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:81
 msgid "RES^Best"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:97
 msgid "Avoid lossy texture compression"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
 msgid "Anisotropy:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
 msgid "ANISO^Disabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:108
 msgid "8x"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:109
 msgid "16x"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
 msgid "Particle quality:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:116
 msgid "Particle distance:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
 msgid "Decals"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:121
 msgid "Decals on models"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:125
 msgid "Distance:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:131
 msgid "Time:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Use lightmaps"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
 msgid "Deluxe mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Gloss"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
 msgid "Offset mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Relief mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Reflections:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:151
 msgid "Blurred"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:152
 msgid "REFL^Good"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
 msgid "Sharp"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:158
 msgid "Show surfaces"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
 msgid "No dynamic lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
 msgid "Flash blend approximation"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
 msgid "Realtime dynamic lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:169
 msgid "Shadows"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
 msgid "Realtime world lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
 msgid "Use normal maps"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Soft shadows"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Coronas"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:179
 msgid "Use Occlusion Queries"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
-msgid "Bloom"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:181
 msgid "High Dynamic Range (HDR)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:185
 msgid "Motion blur:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:190
 msgid "Blur and sharpen postprocessing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:26
-msgid "Client-side movement prediction"
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:30
-msgid "Show netgraph"
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:33
-msgid "Network speed:"
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:35
-msgid "56k"
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:36
-msgid "ISDN"
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:37
-msgid "Slow ADSL"
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:38
-msgid "Fast ADSL"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:39
-msgid "Broadband"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:42
-msgid "Input packets/s:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:46
-msgid "HTTP downloads:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:49
-msgid "Downloads:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:53
-msgid "Speed (kB/s):"
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:57
-msgid "Client UDP port:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:4
+msgid "Sandbox Tools"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:185
-msgid "Remove"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:187
-msgid "Bookmark"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:24
+msgid "Spawn"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:527
-msgid "Ping"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:25
+msgid "Remove *"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:528
-msgid "Host name"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:27
+msgid "Copy *"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:529
-msgid "Map"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:28
+msgid "Paste"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:530
-msgid "Type"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:30
+msgid "Bone:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/serverlist.c:531
-msgid "Players"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:35
+msgid "Set * as child"
 msgstr ""
 
-#: qcsrc/menu/xonotic/maplist.c:278
-msgid ""
-"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:36
+msgid "Attach to *"
 msgstr ""
 
-#: qcsrc/menu/xonotic/maplist.c:286
-#, c-format
-msgid "%s's Xonotic Server"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:38
+msgid "Detach from *"
 msgstr ""
 
-#: qcsrc/menu/xonotic/maplist.c:291
-msgid ""
-"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
-"again.\n"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:41
+msgid "Visual object properties for *:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
-msgid "Demo"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:43
+msgid "Set skin:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
-msgid "Record demos while playing"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:45
+msgid "Set alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
-msgid "Timedemo"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:48
+msgid "Set color main:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "DEMO^Play"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:50
+msgid "Set color glow:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
-msgid "Powerups Panel"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:54
+msgid "Set frame:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
-msgid "Enable status bar"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:58
+msgid "Physical object properties for *:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
-msgid "Status bar alignment:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:60
+msgid "Set material:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
-msgid "Inward"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:66
+msgid "Set solidity:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
-msgid "Outward"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:67
+msgid "Non-solid"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
-msgid "Icon alignment:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:68
+msgid "Solid"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
-msgid "Flip strength and shield positions"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:69
+msgid "Set physics:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
-msgid "Master:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:70
+msgid "Static"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
-msgid "Music:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:71
+msgid "Movable"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
-msgid "VOL^Ambient:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:72
+msgid "Physical"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
-msgid "Info:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:74
+msgid "Set scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
-msgid "Items:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:76
+msgid "Set force:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
-msgid "Pain:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:80
+msgid "Claim *"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
-msgid "Player:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:82
+msgid "* object info"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
-msgid "Shots:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:83
+msgid "* mesh info"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
-msgid "Voice:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:84
+msgid "* attachment info"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
-msgid "Weapons:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:85
+msgid "Show help"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
-msgid "Frequency:"
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:86
+msgid "* is the object you are facing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
-msgid "8 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:87
+msgid "Force player models to mine"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
-msgid "11.025 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:90
+msgid "Field of view:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
-msgid "16 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:94
+msgid "View bobbing:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-msgid "22.05 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:98
+msgid "Zoom factor:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
-msgid "24 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:102
+msgid "Zoom speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
-msgid "32 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:105
+msgid "Weapon settings..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
-msgid "44.1 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:112
+msgid "Crosshair:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
-msgid "48 kHz"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:113
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:141
+msgid "Per weapon"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
-msgid "Channels:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:132
+msgid "Crosshair size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
-msgid "Mono"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:136
+msgid "Crosshair alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
-msgid "Stereo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
+msgid "Crosshair color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
-msgid "2.1"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:142
+msgid "By health"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
-msgid "4"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Custom"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
-msgid "5"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:150
+msgid "Enable center dot"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
-msgid "5.1"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:153
+msgid "Size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
-msgid "6.1"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
+msgid "Hit test:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
-msgid "7.1"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "HTST^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
-msgid "Swap Stereo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:162
+msgid "TrueAim"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
-msgid "Headphone friendly mode"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:163
+msgid "Enemies"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
-msgid "Spatial voices:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:166
+msgid "Waypoints setup..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
-msgid "VOCS^None"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:171
+msgid "Enter HUD editor"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
-msgid "VOCS^Taunts"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "Force models:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:178
+msgid "MDL^Custom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "MDL^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
+msgid "Disable gore effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "Gibs:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
+msgid "GIBS^Few"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
-msgid "VOCS^All"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:188
+msgid "GIBS^Many"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
-msgid "Taunt range:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:189
+msgid "GIBS^Lots"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
-msgid "RNG^Very short"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:193
+msgid "Damage splash:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
-msgid "RNG^Short"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
-msgid "RNG^Normal"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
-msgid "RNG^Long"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
-msgid "RNG^Full"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
-msgid "Automatic taunts"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
-msgid "Time warning:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
-msgid "WRN^None"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
-msgid "1 minute"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
-msgid "5 minutes"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
-msgid "WRN^Both"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
-msgid "Hit indicator"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
-msgid "Menu sounds"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
-msgid "Multiplayer"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
-msgid "Servers"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
-msgid "Demos"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
-msgid "Health/Armor Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
-msgid "Flip health and armor positions"
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:417
+#: qcsrc/menu/xonotic/maplist.c:286
 #, c-format
-msgid "%s forgot about some firemine"
+msgid "%s's Xonotic Server"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:426
-#, c-format
-msgid "%s tried to catch %s's firemine"
+#: qcsrc/menu/xonotic/util.qh:48
+msgid "Enable panel"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:428
-#, c-format
-msgid "%s fatefully ignored %s's firemine"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:437
-#, c-format
-msgid "%s saw the pretty lights of %s's fireball"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:440
-#, c-format
-msgid "%s got too close to %s's fireball"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_shotgun.qc:215
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:293
-#, c-format
-msgid "%s is now thinking with portals"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:255 qcsrc/server/w_minstanex.qc:295
-#, c-format
-msgid "%s has been vaporized by %s"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
-#, c-format
-msgid "%s lasered themself to hell"
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:315
-#, c-format
-msgid "%s was cut in half by %s's gauntlet"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:317
-#, c-format
-msgid "%s was lasered to death by %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:219
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s Arena"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:221
-#, c-format
-msgid "%s was gunned by %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Dodging"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:258
+msgid "MinstaGib"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_rifle.qc:258
-#, c-format
-msgid "%s was sniped by %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:261
+msgid "NIX"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:323
-#, c-format
-msgid "%s was riddled full of holes by %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:213
+msgid "Rocket Flying"
 msgstr ""
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:210
+msgid "Invincible Projectiles"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:272
+msgid "No start weapons"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:574
-#, c-format
-msgid "%s could not remember where they put plasma"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:195
+msgid "Low gravity"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:576
-#, c-format
-msgid "%s played with plasma"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Cloaked"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:583
-#, c-format
-msgid "%s just noticed %s's blue ball"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+msgid "Hook"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:585
-#, c-format
-msgid "%s got in touch with %s's blue ball"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:179
+msgid "Midair"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:590
-#, c-format
-msgid "%s felt the electrifying air of %s's combo"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:182
+msgid "Vampire"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:592
-#, c-format
-msgid "%s got too close to %s's blue beam"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:216
+msgid "Piñata"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:594
-#, c-format
-msgid "%s was blasted by %s's blue beam"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:219
+msgid "Weapons stay"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:2
-#, c-format
-msgid "@!#%'n Tuba"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:186
+msgid "Blood loss"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:252
-#, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:207
+msgid "Jet pack"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:256
-#, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:100
+msgid "No powerups"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:102
+msgid "Powerups"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
-#, c-format
-msgid "%s did the impossible"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:104
+msgid "MUT^None"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:298
-#, c-format
-msgid "%s felt %s doing the impossible to him"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Gameplay mutators:"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:201
+msgid "Weapon & item mutators:"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
-#, c-format
-msgid "%s played with tiny rockets"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:204
+msgid "Grappling hook"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:399
-#, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:223
+msgid "Weapon arenas:"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
-#, c-format
-msgid "%s was pummeled by %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:226
+msgid "Regular (no arena)"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "with laser"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:666
-#, c-format
-msgid "%s succeeded at self-destructing themself with the Crylink"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:255
+msgid "Special arenas:"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:671
-#, c-format
-msgid "%s could not hide from %s's Crylink"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:268
+msgid "Most weapons"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:673
+#: qcsrc/menu/gamecommand.qc:47
 #, c-format
-msgid "%s was too close to %s's Crylink"
+msgid "error: status is %d\n"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:675
-#, c-format
-msgid "%s took a close look at %s's Crylink"
+#: qcsrc/menu/gamecommand.qc:70
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/menu/gamecommand.qc:71
+msgid "  sync - reloads all cvars on the current menu page\n"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
-#, c-format
-msgid "%s exploded"
+#: qcsrc/menu/gamecommand.qc:72
+msgid "  directmenu ITEM - select a menu item as main item\n"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:505
-#, c-format
-msgid "%s got too close to %s's rocket"
+#: qcsrc/menu/gamecommand.qc:185
+msgid "error creating curl handle\n"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:507
-#, c-format
-msgid "%s almost dodged %s's rocket"
+#: qcsrc/menu/gamecommand.qc:192
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:509
+#: qcsrc/menu/menu.qc:37
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "^4MQC Build information: ^1%s\n"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:268
+#: qcsrc/menu/item/slider.c:64
 #, c-format
-msgid "%s has run into %s's gravity bomb"
+msgid "%d (%s)"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:527
+#: qcsrc/menu/item/listbox.c:300
 #, c-format
-msgid "%s got too close to %s's mine"
+msgid "Item %d"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:529
-#, c-format
-msgid "%s almost dodged %s's mine"
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:531
-#, c-format
-msgid "%s stepped on %s's mine"
+#: weapons.qc.tmp:1
+msgid "Crylink"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:2
-msgid "Rifle"
+#: weapons.qc.tmp:2
+msgid "Heavy Laser Assault Cannon"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:233
-#, c-format
-msgid "%s shot themself automatically"
+#: weapons.qc.tmp:3
+msgid "MinstaNex"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:235
-#, c-format
-msgid "%s sniped themself somehow"
+#: weapons.qc.tmp:4
+msgid "Mortar"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:242
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
+#: weapons.qc.tmp:5
+msgid "Laser"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:244
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: weapons.qc.tmp:6
+msgid "Nex"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:251
-#, c-format
-msgid "%s failed to hide from %s's rifle"
+#: weapons.qc.tmp:7
+msgid "Grappling Hook"
 msgstr ""
 
-#: qcsrc/server/w_rifle.qc:256
-#, c-format
-msgid "%s got hit in the head by %s"
+#: weapons.qc.tmp:8
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: weapons.qc.tmp:9
+msgid "Port-O-Launch"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:659
-#, c-format
-msgid "%s was tagged by %s"
+#: weapons.qc.tmp:10
+msgid "Electro"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
+#: weapons.qc.tmp:11
+msgid "Hagar"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:383
-#, c-format
-msgid "%s tried out his own grenade"
+#: weapons.qc.tmp:12
+msgid "Shotgun"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:385
+#: weapons.qc.tmp:13
 #, c-format
-msgid "%s detonated"
+msgid "@!#%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:391
-#, c-format
-msgid "%s didn't see %s's grenade"
+#: weapons.qc.tmp:14
+msgid "Mine Layer"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:393
-#, c-format
-msgid "%s almost dodged %s's grenade"
+#: weapons.qc.tmp:15
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:395
-#, c-format
-msgid "%s ate %s's grenade"
+#: weapons.qc.tmp:16
+msgid "Machine Gun"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
+#: weapons.qc.tmp:17
+msgid "Fireball"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:242
-#, c-format
-msgid "%s was cut down by %s"
+#: weapons.qc.tmp:18
+msgid "T.A.G. Seeker"
 msgstr ""
diff --git a/menu.dat.uk.po b/menu.dat.uk.po
new file mode 100644 (file)
index 0000000..f7768ec
--- /dev/null
@@ -0,0 +1,2895 @@
+# Xonotic Menu Ukrainian Translation.
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the Xonotic package.
+# Harmata <cigariscigar@gmail.com>, 2011.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.5\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-09-12 12:24+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Harmata <cigariscigar@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "помилка: статус %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Використання: menu_cmd команда..., де можливі такі команди:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid "  sync - reloads all cvars on the current menu page\n"
+msgstr "  sync - перезавантажує усі cvars на поточній сторінці меню\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid "  directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITEM - обрати компонент меню як головний компонент\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "помилка під час створення curl handle\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Невірна команда. Щоб побачити список доступних команд спробуйте menu_cmd "
+"help.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Браузер не ініціалізовано!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr "ПРИМІТКА: текст ярлика %s надто широкий для нього, зменшений на %f\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Предмет %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "особливо"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: ^1%s\n"
+msgstr "^4Відомості про збірку MQC: ^1%s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Рівень %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "буде збережено в config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "не буде збережено"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "приватно"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "налаштування рушія"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "тільки читання"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Розробники"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "Гаразд"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Вітаємо"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started.  You can change these options later through the "
+"menu system."
+msgstr ""
+"Вітаємо у Xonotic! Будь ласка, для початку оберіть свою мову та вкажіть своє "
+"ім'я. Ви зможете змінити їх через систему меню потім."
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Мова тексту:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Ім'я:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Зберегти налаштування"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Панель боєзапасу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Показ амуніції:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Показувати тільки поточний тип боєприпасів"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Вирівнювання іконок:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Ліворуч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Праворуч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Основні повідомлення"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Тривалість існування повідомлень:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Час зникнення:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Поміняти місцями порядок повідомлень"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Вирівнювання тексту:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "По центру"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Масштаб шрифту:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Панель чату"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Кількість записів:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Розмір чату:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Тривалість чату:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Звук чату:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Панель інформації рушія"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Інформація про рушій:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Використовувати усереднюючий алгоритм для кадрів за секунду"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Панель здоров'я та броні"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Увімкнути смугу статусу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Вирівнювання смуги статусу:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Всередину"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Назовні"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Вирівнювання іконок:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Поміняти місцями позиції здоров'я та броні"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Панель інформаційних повідомлень"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Інформаційні повідомлення:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Поміняти місцями вирівнювання"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Панель іконок модів"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Панель сповіщень"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Сповіщення:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Також друкувати сповіщення до консолі"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Поміняти місцями порядок сповіщень"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Час існування запису:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Час зникнення запису:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Панель фізики"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Панель вимкнута"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Увімкнути панель"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Увімкнути панель під час спостерігання"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Увімкнути панель тільки під час Гонки/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Смуга статусу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Вирівнювати ліворуч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Вирівнювати праворуч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Вирівнювати всередину"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Вирівнюванти назовні"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Поміняти місцями позиції швидкості та акселерації"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Швидкість:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Включаючи вертикальну швидкість"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Одиниця швидкості:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/с"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "м/с"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "км/с"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "милі"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "вузли"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Показувати"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Найвища швидкість"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Прискорення:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Включаючи вертикальне прискорення"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Панель підсилень"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Поміняти місцями позиції Сили та Щита"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Панель натиснутих клавіш"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Панель працює під час спостерігання"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Панель завжди працює"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Примусовий аспект:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Панель таймера гонки"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Панель радару"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Панель працюватиме у командних матчах"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Радар:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
+#: qcsrc/menu/xonotic/util.qc:612
+msgid "Alpha:"
+msgstr "Прозорість:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Обертання:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Вперед"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Захід"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Південь"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Схід"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Північ"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Масштаб:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Спосіб зуму:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Наближення"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Віддалення"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Завжди із зумом"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Ніколи із зумом"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Панель рахунку"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Рахунок:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Місця:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "І я"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Чистий"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Панель таймеру"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Таймер:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Показувати час що минув"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Панель голосування"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Прозорість після голосування:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Панель зброї"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Зникати після:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Ніколи"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Ефект зникнення:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "EF^None"
+msgstr "EF^Немає"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
+msgid "Slide"
+msgstr "Ковзання"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Прозорість"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "EF^Ковзання та прозорість"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
+msgid "Weapon icons:"
+msgstr "Іконки зброї:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr "Показувати тільки зброю в наявності"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+msgid "Show weapon ID as:"
+msgstr "Ідентифікувати зброю за:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "SHOWAS^None"
+msgstr "SHOWAS^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Number"
+msgstr "Номером"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+msgid "Bind"
+msgstr "Клавішею"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
+msgid "Show Accuracy"
+msgstr "Показувати влучність"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+msgid "Show Ammo"
+msgstr "Показувати боєзапас"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
+msgid "Ammo bar color:"
+msgstr "Колір смуги боєприпасів:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
+msgid "Ammo bar alpha:"
+msgstr "Прозорість смуги боєприпасів:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Налаштування панелі HUD"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Фон панелі за замовчуванням:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:587
+msgid "Background:"
+msgstr "Фон:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:590
+#: qcsrc/menu/xonotic/util.qc:606 qcsrc/menu/xonotic/util.qc:623
+msgid "Disable"
+msgstr "Вимкнути"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:595
+msgid "Color:"
+msgstr "Колір:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:603
+msgid "Border size:"
+msgstr "Розмір обвідки:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Колір команди:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:629
+msgid "Test team color in configure mode"
+msgstr "Протестувати колір команди у конфігураційному режимі"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:632
+msgid "Padding:"
+msgstr "Підкладка:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Док HUD:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "DOCK^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "DOCK^Маленький"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "DOCK^Середній"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "DOCK^Великий"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Налаштування решітки:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Прікріпляти панелі до решітки"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Розмір решітки:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Вийти з налаштувань"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Мультиплеєр"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Сервери"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Створити"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Демо"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Гравець"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
+msgid "Game type:"
+msgstr "Тип гри:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
+msgid "Match settings:"
+msgstr "Налаштування матчу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
+msgid "Time limit:"
+msgstr "Ліміт часу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
+msgid "Use map specified default"
+msgstr "Використати налаштування мапи"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+msgid "Point limit:"
+msgstr "Ліміт очок:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
+msgid "Player slots:"
+msgstr "Місць для гравців:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
+msgid "Number of bots:"
+msgstr "Кількість ботів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
+msgid "Bot skill:"
+msgstr "Майстерність ботів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
+msgid "Botlike"
+msgstr "Ботоподібний"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Beginner"
+msgstr "Початківець"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "You will win"
+msgstr "Ви переможете"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You can win"
+msgstr "Ви можете перемогти"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You might win"
+msgstr "Ви переможете... можливо"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "Advanced"
+msgstr "Удосконалений"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Expert"
+msgstr "Експерт"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Pro"
+msgstr "Професіонал"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Assassin"
+msgstr "Убивця"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Unhuman"
+msgstr "Нелюд"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Godlike"
+msgstr "Богоподібний"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
+msgid "Mutators..."
+msgstr "Мутатори..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
+msgid "Advanced settings..."
+msgstr "Додадкові налаштування:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
+msgid "Map list:"
+msgstr "Список мап:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
+msgid "Select all"
+msgstr "Вибрати все"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
+msgid "Select none"
+msgstr "Вибрати нічого"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
+msgid "Start Multiplayer!"
+msgstr "Почати Мультиплеєр!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
+msgid "Capture limit:"
+msgstr "Ліміт захоплень:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+msgid "Lives:"
+msgstr "Життів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Laps:"
+msgstr "Кругів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Goals:"
+msgstr "Голів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Frag limit:"
+msgstr "Ліміт фрагів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Додаткові налаштування сервера"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Налаштування гри:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Дозволити спостерігання"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Створювати Щит:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Швидкість гри:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Налаштування командної гри:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Масштаб дружньої шкоди:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Псевдо-дружня шкода (тільки ефект)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Штраф за дружню шкоду:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Псевдо-штраф (тільки ефект)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Команди:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Голосування щодо мап:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Без голосування"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 вибори"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 вибори"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 вибори"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 виборів"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 виборів"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 виборів"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 виборів"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 виборів"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Проста більшість перемагає в голосуванні"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Інформація про мапу"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Вся зброя"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Тільки МінстаДжиб"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Назва:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Автор:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Деталі:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Типи гри:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Закрити"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
+msgstr "MAP^Грати"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Мутатори"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Арена зі всією зброєю"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Арена з більшістю зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s Арена"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Ухилення"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "МінстаДжиб"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "Нікс"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Політ за допомогою ракет"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Без стартової зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Низька гравітація"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Маскування"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Гак"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Мід-ейр"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Вампір"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Піньята"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Зброя залишається"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Втрата крові"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Реактивний ранець"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "MUT^Жодного"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Мутатори ігрового процесу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Мутатори зброї та предметів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Гак"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Арени:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Звичайно (не арена)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "з лазером"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Спеціальні арени:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Більшість зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Демо"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Записувати демо під час гри"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Фільтр:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Очистити"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Тест продуктивності"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "DEMO^Переглянути"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Приєднатися"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "SRVS^Порожні"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "SRVS^Повні"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Пауза"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Адреса:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
+msgid "Info..."
+msgstr "Відомості..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Приєднатися!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Інформація сервера"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "Н/Д"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr "%d/%d, %d вільних місць для гравців"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d змінених налаштувань"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Офіційні налаштування"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "Н/Д (неможливо з'єднатися)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "не підтримується (неможливо з'єднатися)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "не підтримується (не буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "підтримується (буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "підтримується (не буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "запитано (не буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "запитано (буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "обов'язкове (неможливо з'єднатися)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "обов'язкове (буде шифрувати)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Гравці:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Тип:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Мапа:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Ігровий процес:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Боти:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Мод:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Версія:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Пінг:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Ключ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Кодування:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Модель:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Поле зору:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Гойдання поля зору:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Сила зуму:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Швидкість зуму:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Налаштування зброї..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Приціл:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139
+msgid "Per weapon"
+msgstr "Для кожної зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Розмір прицілу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Прозорість прицілу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Колір прицілу:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
+msgid "By health"
+msgstr "Залежно від здоров'я"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Custom"
+msgstr "Вибрати"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Enable center dot"
+msgstr "Увімкнути центральну крапку"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+msgid "Size:"
+msgstr "Розмір:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Hit test:"
+msgstr "Тест на влучання:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
+msgid "HTST^None"
+msgstr "HTST^Жодного"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Enemies"
+msgstr "Вороги"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
+msgid "Waypoints setup..."
+msgstr "Налаштування дороговказів..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
+msgid "Enter HUD editor"
+msgstr "Редактор HUD"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Примусово використовувати одну модель:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "MDL^Жодну"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "MDL^Особливу"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "MDL^Всі"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
+msgid "Disable gore effects"
+msgstr "Вимкнути криваві ефекти"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
+msgid "Gibs:"
+msgstr "Шматки тіл:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^None"
+msgstr "GIBS^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Few"
+msgstr "GIBS^Мало"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Many"
+msgstr "GIBS^Більше"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
+msgid "GIBS^Lots"
+msgstr "GIBS^Багато"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
+msgid "Damage splash:"
+msgstr "Червоний сплеск від шкоди:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_input.c:74
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
+msgid "Apply immediately"
+msgstr "Вжити негайно"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Дороговкази"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Показувати основні дороговкази"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Розмір дороговказів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Прозорість дороговказів:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Показувати імена:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Гравців команди"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Всіх гравців"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Налаштування зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Список пріоритетів зброї:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Нагору"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Вниз"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Використовувати список приоритетів для прокрутки зброї"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Автоматично перемикатись на підняту зброю"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Показувати модель зброї у першій особі"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+msgid "Flip view horizontally"
+msgstr "Поміняти місцями вид горизонтально"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Новини"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Вийти"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Ви дійсно хочете вийти?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Так"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Ні"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Налаштування"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Керування"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Відео"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Ефекти"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Звук"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Мережа"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Різне"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Гучність:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Музика:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
+msgid "VOL^Ambient:"
+msgstr "VOL^Навколишні звуки:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Інформація:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
+msgid "Items:"
+msgstr "Предмети:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
+msgid "Pain:"
+msgstr "Біль:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
+msgid "Player:"
+msgstr "Гравці:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
+msgid "Shots:"
+msgstr "Постріли:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
+msgid "Voice:"
+msgstr "Голоси:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
+msgid "Weapons:"
+msgstr "Зброя:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Frequency:"
+msgstr "Частота:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+msgid "22.05 kHz"
+msgstr "22.05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "Channels:"
+msgstr "Канали:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "Mono"
+msgstr "Моно"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
+msgid "Stereo"
+msgstr "Стерео"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "Swap Stereo"
+msgstr "Інвертувати стерео"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
+msgid "Headphone friendly mode"
+msgstr "Дружній режим для навушників"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
+msgid "Spatial voices:"
+msgstr "Просторові звуки:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "VOCS^None"
+msgstr "VOCS^Жодних"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
+msgid "VOCS^Taunts"
+msgstr "VOCS^Глузування"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
+msgid "VOCS^All"
+msgstr "VOCS^Всі"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "Taunt range:"
+msgstr "Дальність глузувань:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
+msgid "RNG^Very short"
+msgstr "RNG^Дуже коротка"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
+msgid "RNG^Short"
+msgstr "RNG^Коротка"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "RNG^Normal"
+msgstr "RNG^Нормальна"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
+msgid "RNG^Long"
+msgstr "RNG^Велика"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
+msgid "RNG^Full"
+msgstr "RNG^Повна"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
+msgid "Automatic taunts"
+msgstr "Автоматичні глузування"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
+msgid "Time warning:"
+msgstr "Попередження про час:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
+msgid "WRN^None"
+msgstr "WRN^Жодного"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
+msgid "1 minute"
+msgstr "1 хвилина"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
+msgid "5 minutes"
+msgstr "5 хвилин"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "WRN^Both"
+msgstr "WRN^1 і 5 хвилин"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "Hit indicator"
+msgstr "Покажчик влучень"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "Menu sounds"
+msgstr "Звуки меню"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Шаблон якості:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "PRE^О БОЖЕ!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "PRE^Низька"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "PRE^Середня"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "PRE^Нормальна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "PRE^Висока"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "PRE^Ультра"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "PRE^Максимальна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Деталізація геометрії:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "DET^Найнижча"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "DET^Низька"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "DET^Нормальна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "DET^Добра"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "DET^Найкраща"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "DET^Божевільна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Антиаліасінг:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "AA^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Роздільність текстур:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "RES^Елітна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "RES^Найнижча"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "RES^Низька"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "RES^Нормальна"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "RES^Добра"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "RES^Найкраща"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Уникати компресії текстур із втратами"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Анізотропна фільтрація:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "ANISO^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Якість часток:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Відстань часток:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Сліди"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Сліди на моделях"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
+msgid "Distance:"
+msgstr "Відстань:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
+msgid "Time:"
+msgstr "Час:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
+msgid "Use lightmaps"
+msgstr "Мапи освітлення"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Deluxe mapping"
+msgstr "Текстурування deluxe"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
+msgid "Gloss"
+msgstr "Блиск"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Offset mapping"
+msgstr "Офсетне текстурування"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
+msgid "Relief mapping"
+msgstr "Рельєфне текстурування"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
+msgid "Reflections:"
+msgstr "Віддзеркалення:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Blurred"
+msgstr "Розмиті"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
+msgid "REFL^Good"
+msgstr "REFL^Добрі"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
+msgid "Sharp"
+msgstr "Чіткі"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "Show surfaces"
+msgstr "Показувати поверхні"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "No dynamic lighting"
+msgstr "Без динамічного освітлення"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Flash blend approximation"
+msgstr "Приблинзні розрахунки змішуванянн спалахів"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
+msgid "Realtime dynamic lighting"
+msgstr "Динамаічне освітлення у реальному часі"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
+msgid "Shadows"
+msgstr "Тіні"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+msgid "Realtime world lighting"
+msgstr "Освітлення світу у реальному часі"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Use normal maps"
+msgstr "Використовувати карти нормалів"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
+msgid "Soft shadows"
+msgstr "М'які тіні"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
+msgid "Coronas"
+msgstr "Корони"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Use Occlusion Queries"
+msgstr "Використовувати Occlusion Queries"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "Bloom"
+msgstr "Ефект bloom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
+msgid "High Dynamic Range (HDR)"
+msgstr "High Dynamic Range (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
+msgid "Motion blur:"
+msgstr "Ефект motion blur:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Післяобробка"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Клавіши керування:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Змінити клавішу..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Редагувати..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Чутливість:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
+msgid "UI mouse speed:"
+msgstr "Швидкість миші в інтерфейсі"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
+msgid "Mouse filter"
+msgstr "Фільтр миші"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+msgid "Invert mouse"
+msgstr "Інвертувати мишу"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+msgid "Use joystick input"
+msgstr "Використовувати джойстик"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
+msgid "Turn off OS mouse acceleration"
+msgstr "Вимкнути прискорення миші операційною системою"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
+msgid "\"enter console\" also closes"
+msgstr "\"увійти в консоль\" також закриває консоль"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:72
+msgid "Holding jump key keeps jumping"
+msgstr "Утримування клавіши стрибка продовжує стрибання"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Клавіші визначені користувачем"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Команда коли натиснута:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Команда коли відпущена:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Зберегти"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Відміна"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Вигляд меню:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Показувати поточний час"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Показувати поточну дату"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Показувати кількість кадрів в секунду"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Minimize input latency"
+msgstr "Зменшувати затримку вводу"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Додаткові налаштування"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Фільтр cvar:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Налаштування:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Значення:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Опис:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Передбачення руху зі сторони клієнта"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Показувати графік мережі"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Швидкість мережі:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Повільний ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Швидкій ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Широкополосний доступ"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Вхідні пакети:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "Завантаження через HTTP:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Завантажень:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Швидкість (кб/с):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "UDP порт клієнта:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Роздільність:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Розмір шрифту/інтерфейсу:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "SZ^Нечитабельний"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "SZ^Дуже маленький"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "SZ^Маленький"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "SZ^Невеликий"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "SZ^Середній"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "SZ^Великий"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "SZ^Величезний"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "SZ^Велетенський"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "SZ^Колосальний"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Глибина кольору:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "На повний екран"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Вертикальна синхронізація"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Використовувати шейдери OpenGL 2.0 (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Використовувати GLSL для управління кольором"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Objects (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "VBO^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Вершини, деякі трикутники (сумісний)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Вершини"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Вершини та трикутники"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Глибина спершу:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "DF^Вимкнуто"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "DF^Світ"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "DF^Все"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Вимкнути багатопотоковий OpenGL"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Чекати поки GPU закінчить кожний кадр"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Яскравість:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Контраст:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Гамма:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+msgid "Contrast boost:"
+msgstr "Підсилення контрасту:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
+msgid "Saturation:"
+msgstr "Насиченість:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
+msgid "LIT^Ambient:"
+msgstr "Навколишне освітлення:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Intensity:"
+msgstr "Інтенсивність:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Одиночна гра"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
+msgid "Instant action! (random map with bots)"
+msgstr "Миттєвий бій! (випадкова мапа з ботами)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
+msgid "Start Singleplayer!"
+msgstr "Почати Одиночну гру!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Переможець"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Вибір команди"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "обрати підхожу команду (автовибір)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "червона"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "синя"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "жовта"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "рожева"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "спостерігати"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Більше не натискайте цю клавішу!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Шо? В це неможливо грати (m is NULL). Зроблю фільтрацію ще раз, щоб такого "
+"більше не траплялось.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "Сервер Xonotic від %s"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Шо? В це неможливо грати (невірний режим гри). Зроблю фільтрацію ще раз, щоб "
+"такого більше не траплялось.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<модель не знайдена>"
+
+#: qcsrc/menu/xonotic/serverlist.c:185
+msgid "Remove"
+msgstr "Прибрати"
+
+#: qcsrc/menu/xonotic/serverlist.c:187
+msgid "Bookmark"
+msgstr "Закладка"
+
+#: qcsrc/menu/xonotic/serverlist.c:527
+msgid "Ping"
+msgstr "Пінг"
+
+#: qcsrc/menu/xonotic/serverlist.c:528
+msgid "Host name"
+msgstr "Ім'я сервера"
+
+#: qcsrc/menu/xonotic/serverlist.c:529
+msgid "Map"
+msgstr "Мапа"
+
+#: qcsrc/menu/xonotic/serverlist.c:530
+msgid "Type"
+msgstr "Тип"
+
+#: qcsrc/menu/xonotic/serverlist.c:531
+msgid "Players"
+msgstr "Гравці"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<Назва>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<Автор>"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "VOL^Вимкнуто"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "VOL^Максимум"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s дБ"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:271
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Отримано дані запиту HTTP для невірного id %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:286
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "помилка під час отримання сповіщення про оновлення: статус %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:291
+msgid "error: received HTML instead of an update notification\n"
+msgstr "помилка: отримано HTML замість сповіщення про оновлення\n"
+
+#: qcsrc/menu/xonotic/util.qc:296
+msgid "error: received carriage returns from update notification server\n"
+msgstr ""
+"помилка: отримані символи повернення каретки від сервера сповіщення про "
+"оновлення\n"
+
+#: qcsrc/menu/xonotic/util.qc:317
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Оновлення можливо завантажити тут:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:340
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Створення відомостей про нові мапи..."
+
+#: qcsrc/menu/xonotic/util.qc:370
+#, c-format
+msgid "^1%s TEST BUILD"
+msgstr "^1%s ТЕСТОВА ЗБІРКА"
+
+#: qcsrc/menu/xonotic/util.qc:428
+#, c-format
+msgid "Update to %s now!"
+msgstr "Негайно обновіть версію до %s !"
+
+#: qcsrc/menu/xonotic/util.qc:513
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1Помилка: Компресія текстур обов'язкова але не підтримується.\n"
+"^1Очікуйте візуальних проблем.\n"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Arena"
+msgstr "Арена"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Assault"
+msgstr "Атака"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Capture The Flag"
+msgstr "Захоплення прапору"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Clan Arena"
+msgstr "Арена кланів"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Deathmatch"
+msgstr "Десматч"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Domination"
+msgstr "Панування"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Freeze Tag"
+msgstr "Морозко"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Keepaway"
+msgstr "Тримання осторонь"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Key Hunt"
+msgstr "Полювання за ключами"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Last Man Standing"
+msgstr "Останній виживший"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Nexball"
+msgstr "Нексбол"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Onslaught"
+msgstr "Штурм"
+
+#: qcsrc/menu/xonotic/util.qc:547
+msgid "Race"
+msgstr "Гонка"
+
+#: qcsrc/menu/xonotic/util.qc:548
+msgid "Race CTS"
+msgstr "Гонка CTS"
+
+#: qcsrc/menu/xonotic/util.qc:549
+msgid "Runematch"
+msgstr "Рунний матч"
+
+#: qcsrc/menu/xonotic/util.qc:550
+msgid "Team Deathmatch"
+msgstr "Командний десматч"
+
+#: qcsrc/menu/xonotic/util.qc:569
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "Кидання @!#%'ї Туби"
+
+#: qcsrc/menu/xonotic/util.qc:589 qcsrc/menu/xonotic/util.qc:605
+#: qcsrc/menu/xonotic/util.qc:614 qcsrc/menu/xonotic/util.qc:622
+#: qcsrc/menu/xonotic/util.qc:634
+msgid "Default"
+msgstr "За замовчуванням"
+
+#: qcsrc/menu/xonotic/util.qc:600
+msgid "Use default"
+msgstr "Використовувати за замовчуванням"
+
+#: qcsrc/menu/xonotic/util.qc:620
+msgid "Team Color:"
+msgstr "Колір команди:"
+
+#: qcsrc/menu/xonotic/util.qh:47
+msgid "Enable panel"
+msgstr "Увімкнути панель"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Крайлінк"
+
+#: qcsrc/server/w_crylink.qc:666
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr "%s успішно самознищив себе за допомогою Крайлінка"
+
+#: qcsrc/server/w_crylink.qc:671
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr "%s не зміг сховатися від Крайлінка %s's"
+
+#: qcsrc/server/w_crylink.qc:673
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr "%s був надто близько до Крайлінка %s's"
+
+#: qcsrc/server/w_crylink.qc:675
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr "%s роздивився Крайлінк %s's з близька"
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Електро"
+
+#: qcsrc/server/w_electro.qc:574
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr "%s не зміг згадати куди вони поклали плазму"
+
+#: qcsrc/server/w_electro.qc:576
+#, c-format
+msgid "%s played with plasma"
+msgstr "%s догрався з плазмою"
+
+#: qcsrc/server/w_electro.qc:583
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr "%s тільк-но помітив блакитну кулю %s's"
+
+#: qcsrc/server/w_electro.qc:585
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr "%s доторкнувся до блакитної кулі %s's"
+
+#: qcsrc/server/w_electro.qc:590
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr "%s відчув наелектризоване повітря від комбо %s's"
+
+#: qcsrc/server/w_electro.qc:592
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr "%s опинився надто близько до блакитного проміння %s's"
+
+#: qcsrc/server/w_electro.qc:594
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr "%s був знищений блакитним промінням %s's"
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Метеор"
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr "%s забув про вогняну міну"
+
+#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr "%s треба було використати меншу гармату"
+
+#: qcsrc/server/w_fireball.qc:426
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr "%s спробував піймати вогняну міну %s's"
+
+#: qcsrc/server/w_fireball.qc:428
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr "%s фатально проґавив метеор %s's"
+
+#: qcsrc/server/w_fireball.qc:435
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr "%s не зміг сховатися від метеора %s's"
+
+#: qcsrc/server/w_fireball.qc:437
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr "%s побачив гарненькі вогники метеора %s's"
+
+#: qcsrc/server/w_fireball.qc:440
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr "%s підійшов надто близько до метеора %s's"
+
+#: qcsrc/server/w_fireball.qc:442
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr "%s скуштував метеор %s's"
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Мортира"
+
+#: qcsrc/server/w_grenadelauncher.qc:383
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr "%s скуштував свою власну гранату"
+
+#: qcsrc/server/w_grenadelauncher.qc:385
+#, c-format
+msgid "%s detonated"
+msgstr "%s вибухнув"
+
+#: qcsrc/server/w_grenadelauncher.qc:391
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr "%s не побачив гранату %s's"
+
+#: qcsrc/server/w_grenadelauncher.qc:393
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr "%s майже ухилився від гранати %s's"
+
+#: qcsrc/server/w_grenadelauncher.qc:395
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr "%s з'їв гранату %s's"
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Хейгар"
+
+#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr "%s догрався з маленькими ракетами"
+
+#: qcsrc/server/w_hagar.qc:399
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr "%s понадіявся що ракета %s's не відскочить"
+
+#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr "%s був віддубасений %s"
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Важка Лазерна Штурмова Гармата"
+
+#: qcsrc/server/w_hlac.qc:242
+#, c-format
+msgid "%s was cut down by %s"
+msgstr "%s був підрізаний %s"
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Гак"
+
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
+#, c-format
+msgid "%s did the impossible"
+msgstr "%s зробив неможливе"
+
+#: qcsrc/server/w_hook.qc:268
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr "%s вбіг у гравітаційну бомбу %s's"
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Лазер"
+
+#: qcsrc/server/w_laser.qc:311
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr "%s відправив себе лазером прямо в пекло"
+
+#: qcsrc/server/w_laser.qc:315
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr "%s був розрізаний навпіл рукавицею %s's"
+
+#: qcsrc/server/w_laser.qc:317
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr "%s згорів від лазеру %s"
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Міноукладчик"
+
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
+#, c-format
+msgid "%s exploded"
+msgstr "%s вибухнув"
+
+#: qcsrc/server/w_minelayer.qc:527
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr "%s опинився надто близько до міни %s's"
+
+#: qcsrc/server/w_minelayer.qc:529
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr "%s майже ухилився від міни %s's"
+
+#: qcsrc/server/w_minelayer.qc:531
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr "%s наступив на міну %s's"
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "МінстаНекс"
+
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s тепер думає з порталами у голові"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr "%s був випаровуваний %s"
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Некс"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Портал-О-Пуск"
+
+#: qcsrc/server/w_porto.qc:298
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr "%s відчув як %s зробив з ним неможливе"
+
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Гвинтівка"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s пристрелив себе несвідомо"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s примудрився пристрелити себе"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s не зміг сховатися від граду куль %s's"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s помер у граді куль %s's"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s не зміг сховатися від гвинтівки %s's"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s втратив голову від кулі %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s був підстрелений %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Ракетна гармата"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr "%s опинився надто близько до ракети %s's"
+
+#: qcsrc/server/w_rocketlauncher.qc:507
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr "%s майже ухилився від ракети %s's"
+
+#: qcsrc/server/w_rocketlauncher.qc:509
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr "%s з'їв ракету %s's"
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "Шукач T.A.G."
+
+#: qcsrc/server/w_seeker.qc:659
+#, c-format
+msgid "%s was tagged by %s"
+msgstr "%s був мічений %s"
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Рушниця"
+
+#: qcsrc/server/w_shotgun.qc:219
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr "%2$s ^7прибив %1$s ^7великою ^2рушницею"
+
+#: qcsrc/server/w_shotgun.qc:221
+#, c-format
+msgid "%s was gunned by %s"
+msgstr "%s був пристрелений %s"
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'а Туба"
+
+#: qcsrc/server/w_tuba.qc:252
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr "%s шкодить своїм вухам власною @!#%%'ю Тубою"
+
+#: qcsrc/server/w_tuba.qc:256
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr "%s помер від чудової гри %s's на @!#%%'й Тубі"
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Автомат"
+
+#: qcsrc/server/w_uzi.qc:323
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr "%s виглядає як решето завдяки %s"
+
+#~ msgid "Pinata"
+#~ msgstr "Піньята"
index 106333058667c5c8c90a7c1351adf7f74746ac4d..bdfc95832d698f8ab6ad1f04542ce607e4affbc8 100644 (file)
Binary files a/models/player/erebus.iqm and b/models/player/erebus.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index fc3fc19fa1e669b7142a35426c70ff42f539f6c2..5a9ec52554d07910051db16b44bb6bda031ba4ea 100644 (file)
Binary files a/models/player/erebus_lod1.iqm and b/models/player/erebus_lod1.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 159dee54e16a97f1ba0be19fddf4454126329f54..add024d0f8f703ffca5d4454a043b58b018a1e0e 100644 (file)
Binary files a/models/player/erebus_lod2.iqm and b/models/player/erebus_lod2.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index c423ecd41fcd00017c9b0a73be8f4c6d8980f648..275921e1dc1bb68b87de60d7fed4d2d111c4d15f 100644 (file)
Binary files a/models/player/gak.iqm and b/models/player/gak.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 8b4b72dc7c2b6410d343f7ef179cfb4eedf2b182..a9e08062af42d4157fc62e0d05bc2814ed8b5032 100644 (file)
Binary files a/models/player/gak_lod1.iqm and b/models/player/gak_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index f4a8080440607c8bc5e79a9f0d9684abf2db9904..d7033e8d01409819cfd64f03aeece248d2005663 100644 (file)
Binary files a/models/player/gak_lod2.iqm and b/models/player/gak_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 400812c5be3db15d34380370567d7c54fa988b3b..824e52ae6c14de97f55c805ea5a7d22cfa8f8144 100644 (file)
Binary files a/models/player/gakarmored.iqm and b/models/player/gakarmored.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 27f7e03a7c694250d2cb2add36d89362cc8e1b40..bbf00f7018b936ce8d52525310a329fffe623d22 100644 (file)
Binary files a/models/player/gakarmored_lod1.iqm and b/models/player/gakarmored_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 2d8fa0d64466e8fd7eb262d73e8d9f26e99033c0..8fdbceffad1b4e089a67cff15700de95d35e94d4 100644 (file)
Binary files a/models/player/gakarmored_lod2.iqm and b/models/player/gakarmored_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 2c283abffb1e3bfb41c16e28a6c1bdfd1361b6e9..ac94551a64b727abe7b5c1235284673a0b1d1b7f 100644 (file)
Binary files a/models/player/gakmasked.iqm and b/models/player/gakmasked.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index e5e58a762a00696ff5404393fbc8455315de20a2..444dab1d6d94b4aa868bcb5fbefdd950abacc5a3 100644 (file)
Binary files a/models/player/gakmasked_lod1.iqm and b/models/player/gakmasked_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 142e28a579a1c995335988427d30594f98ea0ecf..466e3a5d0e45fabc98991c3538117728a7c538da 100644 (file)
Binary files a/models/player/gakmasked_lod2.iqm and b/models/player/gakmasked_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..98eabd70b57cda07a588b88d9c31f184ced4ff0e 100644 (file)
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 21 30.000000 1 // duckwalkbackwards
+91 21 30.000000 1 // duckwalkstrafeleft
+91 21 30.000000 1 // duckwalkstraferight
+91 21 30.000000 1 // duckwalkforwardright
+91 21 30.000000 1 // duckwalkforwardleft
+593 21 30.000000 1 // duckwalkbackright
+593 21 30.000000 1 // duckwalkbackleft
\ No newline at end of file
index 692be86d8efdfd2ee2740e7d35d2cbd1602bef56..3e65b336a7766fcff862a18ecd6c088ec732cc60 100644 (file)
Binary files a/models/player/ignis.iqm and b/models/player/ignis.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 15fd6e2dc27ab14b2afbc11860d87a4378a761ef..d1f5c4524e788da3fc3f910d1026f50051a3a47b 100644 (file)
Binary files a/models/player/ignis_lod1.iqm and b/models/player/ignis_lod1.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index caa5ebe19366f7305803eee0144a3bc53e8474b2..cbe75b6f4e48d6325dace6a66fe7d1a7d5774c9e 100644 (file)
Binary files a/models/player/ignis_lod2.iqm and b/models/player/ignis_lod2.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 98ee7cf7c6a5a195b8759380f41572a593dd0a9a..7b11d80edb99b7cc5eccadd45dc371151527758c 100644 (file)
Binary files a/models/player/ignishalfmasked.iqm and b/models/player/ignishalfmasked.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index a1421f17a582a345e876b90dabae3536afed6545..e3877a753ce6ef2b9c5fd8fc58c689a0d9e155b8 100644 (file)
Binary files a/models/player/ignishalfmasked_lod1.iqm and b/models/player/ignishalfmasked_lod1.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index cbb13f4acab95d7f7affcf0032db52efc101ffd8..48b0696de9db49f4ad2cc169db2827e0082dabd1 100644 (file)
Binary files a/models/player/ignishalfmasked_lod2.iqm and b/models/player/ignishalfmasked_lod2.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index abcc4f3728a8263b1c887397c43af81b37d2f690..43b17c488c32ae87faa8eb99a616ba8f5e846fc7 100644 (file)
Binary files a/models/player/ignismasked.iqm and b/models/player/ignismasked.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 2cd6aa1a8651c8dd830eb94fdd6b3975514161a6..10e4fc4165696c53711e4a4107f070e4d06e8a17 100644 (file)
Binary files a/models/player/ignismasked_lod1.iqm and b/models/player/ignismasked_lod1.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 0c0cf7058b5a0e355c3793c0980520d309a15fc4..823915ed6dc420e4ebb44eb9d7bebc3ca8231069 100644 (file)
Binary files a/models/player/ignismasked_lod2.iqm and b/models/player/ignismasked_lod2.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 52698300919884c1f65e87489f7ab7c14f38b71e..5033b641111180a07be4fd625f4f76faa799e695 100644 (file)
Binary files a/models/player/megaerebus.iqm and b/models/player/megaerebus.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 7cf73126f9ea21f2713fd216631e22035e6b4080..3054e6a217c26e7c380cd6de3234e1e66a6a5a17 100644 (file)
Binary files a/models/player/megaerebus_lod1.iqm and b/models/player/megaerebus_lod1.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 7d05b660312e719fe10d687fc1cd0b308bd83a35..70d59851de3b502ff46e2b7fa843be42a63d67f0 100644 (file)
Binary files a/models/player/megaerebus_lod2.iqm and b/models/player/megaerebus_lod2.iqm differ
index 07516e08cdcc1ffc7269d55c3b95da44a9c48673..6432971bbe017e9c126cf3be188d826d6ac04ff1 100644 (file)
@@ -2,9 +2,9 @@
 36 20 25.000000 0 // dietwo
 56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 10.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 24.000000 0 // painone
 530 20 29.000000 1 // backright
 551 20 29.000000 1 // backleft
 572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+656 20 32.000000 1 // duckwalkforwardright
+677 20 32.000000 1 // duckwalkforwardleft
+698 20 32.000000 1 // duckwalkbackright
+719 20 32.000000 1 // duckwalkbackleft
index 24cc947bf13ea2a690b6f92f9c9f0b2f007479e7..5e2217836e5586e0a1728b9af30048bf1e0dfaf8 100644 (file)
Binary files a/models/player/nyx.iqm and b/models/player/nyx.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 27a418a382f5ab79dc5b3d3be46c92c75192b29e..c7561d985c78436308ded6cd752e1a896cf6cbb3 100644 (file)
Binary files a/models/player/nyx_lod1.iqm and b/models/player/nyx_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 82d48b6c9d4c6558f7ae78bd00b7273cb20a1e38..5a67b3556268c266e040f582fbd3c554d488919e 100644 (file)
Binary files a/models/player/nyx_lod2.iqm and b/models/player/nyx_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 4dad4b7985199d32192a3c8eb98c9e5e74591ce5..c8c47c0599d10a07ba3d7564815d9d5c666a8477 100644 (file)
Binary files a/models/player/pyria.iqm and b/models/player/pyria.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index 037b6598795dfc49b2b922046c2f4758b6632542..590b7faa967f5badb0d41b7f1d2ed6c95aef5033 100644 (file)
Binary files a/models/player/pyria_lod1.iqm and b/models/player/pyria_lod1.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index 383060331b6dc2796b541ab97871cda68dc574d0..4d93562028dfc8c757ea74242aed5bc933f36754 100644 (file)
Binary files a/models/player/pyria_lod2.iqm and b/models/player/pyria_lod2.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index 95c46a3a5005417c6bdd8574b4acb31fd5105838..66f54687ec1d45e4a2758c7b285dc9a73df5b7c4 100644 (file)
Binary files a/models/player/seraphina.iqm and b/models/player/seraphina.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index cd8ff803036b04cf7922fdf5bdff09877401459e..5faffe632ca6743ee9b08cfbb655e4ddc38ba02e 100644 (file)
Binary files a/models/player/seraphina_lod1.iqm and b/models/player/seraphina_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 118efe6fd93c50fac4c407951fea7214b06ea0a2..f880197c6c1d312b570b4c59a8a48cbe5678e368 100644 (file)
Binary files a/models/player/seraphina_lod2.iqm and b/models/player/seraphina_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 185263d6243a35bec0cf5d3813b50aecbf8e7420..47f243d91def41abc6194badd3a5836481fd5fc4 100644 (file)
Binary files a/models/player/seraphinamasked.iqm and b/models/player/seraphinamasked.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 4b1ea685bc9a4b0dd1a208cd6c67b91904a5ef1d..d8e40ab7f66cb2ba7de364edc226c30211b517ee 100644 (file)
Binary files a/models/player/seraphinamasked_lod1.iqm and b/models/player/seraphinamasked_lod1.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 58fe05c4f42c3d8d4b76edaad9a24419730ffc9a..acad8aa1f04e905a589a0d931210a6029877b5ed 100644 (file)
Binary files a/models/player/seraphinamasked_lod2.iqm and b/models/player/seraphinamasked_lod2.iqm differ
index 2eb4618a43e0d301d0d5cebf321bd98296dbf874..70edc357e616d04bf9875dfdc5b5c7c3fde91d05 100644 (file)
@@ -2,9 +2,9 @@
 36 20 15.000000 0 // dietwo
 56 15 15.000000 1 // draw
 71 20 15.000000 1 // duck
-91 21 30.000000 1 // duckwalk
+91 20 32.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
-128 15 5.000000 1 // duckidle
+128 15 8.000000 1 // duckidle
 143 41 5.000000 1 // idle
 184 160 25.000000 0 // jump
 344 15 15.000000 0 // painone
 509 21 35.000000 1 // forwardleft
 530 21 35.000000 1 // backright
 551 21 30.000000 1 // backleft
-572 21 20.000000 0 // melee
\ No newline at end of file
+572 21 20.000000 0 // melee
+593 20 32.000000 1 // duckwalkbackwards
+614 20 32.000000 1 // duckwalkstrafeleft
+635 20 32.000000 1 // duckwalkstraferight
+91 20 32.000000 1 // duckwalkforwardright
+91 20 32.000000 1 // duckwalkforwardleft
+593 20 32.000000 1 // duckwalkbackright
+593 20 32.000000 1 // duckwalkbackleft
\ No newline at end of file
index 07f73615b59cafed9fa0ee7866dbd4e78dfc702f..17ce3dd099e9298d565739e81e194a0f63314426 100644 (file)
Binary files a/models/player/umbra.iqm and b/models/player/umbra.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index 1173db86bb8dbcea34901bb67ecb97fd04396106..281f949da01a15a541a429de5defc0b500447b1b 100644 (file)
Binary files a/models/player/umbra_lod1.iqm and b/models/player/umbra_lod1.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index b47ac76f0fb1570d8afd2e4c17f56bea6092af71..e90367714ed46fb77f59b7aa550ab28275642edf 100644 (file)
Binary files a/models/player/umbra_lod2.iqm and b/models/player/umbra_lod2.iqm differ
index 686dd60cef5afdd8ce051d191baed2e12a781354..73cd958b0c184589075950a445016c4ce4ffe6eb 100644 (file)
 483 21 40.000000 1 // forwardleft
 504 21 40.000000 1 // backright
 525 21 40.000000 1 // backleft
-546 21 20.000000 0 // melee
\ No newline at end of file
+546 21 20.000000 0 // melee
+567 11 15.000000 1 // duckwalkbackwards
+98 11 15.000000 1 // duckwalkstrafeleft
+98 11 15.000000 1 // duckwalkstraferight
+98 11 15.000000 1 // duckwalkforwardright
+98 11 15.000000 1 // duckwalkforwardleft
+567 11 15.000000 1 // duckwalkbackright
+567 11 15.000000 1 // duckwalkbackleft
\ No newline at end of file
index e2be8a841bac1d411537784bfdcfc01b263a6217..a05d13ff841e2c09a12ce3318baefa9d51540ca3 100644 (file)
@@ -3,7 +3,7 @@ FTEQCC ?= fteqcc
 PERL ?= perl
 
 FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"$(shell git describe)"' -DCVAR_POPCON
-FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
+FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs -fno-fastarrays $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
 FTEQCCFLAGS_PROGS ?=
 FTEQCCFLAGS_MENU ?=
 
@@ -27,12 +27,12 @@ qc-recursive: ../menu.dat ../progs.dat ../csprogs.dat
 clean:
        rm -f ../progs.dat ../menu.dat ../csprogs.dat
 
-FILES_CSPROGS = $(shell find client common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
+FILES_CSPROGS = $(shell find client common warpzonelib csqcmodellib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
 ../csprogs.dat: $(FILES_CSPROGS)
        @echo make[1]: Entering directory \`$(PWD)/client\'
        cd client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
 
-FILES_PROGS = $(shell find server common warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
+FILES_PROGS = $(shell find server common warpzonelib csqcmodellib -type f -not -name fteqcc.log -not -name qc.asm) $(wildcard server/w_*.qc)
 ../progs.dat: $(FILES_PROGS)
        @echo make[1]: Entering directory \`$(PWD)/server\'
        cd server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
index 901380c1bb28e130df82c992a1a33a27f289892d..5282910a2ad6288f756e48f599f539bc9e153ac8 100644 (file)
@@ -238,6 +238,9 @@ float servertime, serverprevtime, serverdeltatime;
 float ticrate;
 
 .float damageforcescale;
+#define MIN_DAMAGEEXTRARADIUS 2
+#define MAX_DAMAGEEXTRARADIUS 16
+.float damageextraradius;
 .void(float thisdmg, float hittype, vector org, vector thisforce) event_damage;
 
 // only for Porto
index 2252f6f61cec427d69ebe63d9a26eca8394955f3..3798edf8a78ca20cb03853a05ccd57b6c614b926 100644 (file)
@@ -3,28 +3,6 @@
 //include "main.qh"
 
 #define DP_CSQC_ENTITY_REMOVE_IS_B0RKED
-
-void cvar_clientsettemp(string cv, string val)
-{
-       entity e;
-       for(e = world; (e = find(e, classname, "saved_cvar_value")); )
-               if(e.netname == cv)
-                       goto saved;
-       e = spawn();
-       e.classname = "saved_cvar_value";
-       e.netname = strzone(cv);
-       e.message = strzone(cvar_string(cv));
-:saved
-       cvar_set(cv, val);
-}
-
-void cvar_clientsettemp_restore()
-{
-       entity e;
-       for(e = world; (e = find(e, classname, "saved_cvar_value")); )
-                       cvar_set(e.netname, e.message);
-}
-
 void menu_show_error()
 {
        drawstring('0 200 0', _("ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"), '8 8 0', '1 0 0', 1, 0);
@@ -41,8 +19,58 @@ void menu_sub_null()
 float __engine_check;
 #endif
 
+void precache_playermodel(string m)
+{
+       string f;
+
+       if(substring(m, -9,5) == "_lod1")
+               return;
+       if(substring(m, -9,5) == "_lod2")
+               return;
+       precache_model(m);
+       f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
+       if(fexists(f))
+               precache_model(f);
+       f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1));
+       if(fexists(f))
+               precache_model(f);
+
+       /*
+       float globhandle, i, n;
+       globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
+               //print(search_getfilename(globhandle, i), "\n");
+               f = search_getfilename(globhandle, i);
+               PrecachePlayerSounds(f);
+       }
+       search_end(globhandle);
+       */
+}
+void precache_all_playermodels(string pattern)
+{
+       float globhandle, i, n;
+       string f;
+
+       globhandle = search_begin(pattern, TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
+               //print(search_getfilename(globhandle, i), "\n");
+               f = search_getfilename(globhandle, i);
+               precache_playermodel(f);
+       }
+       search_end(globhandle);
+}
+
 string forcefog;
 void WaypointSprite_Load();
+void ConsoleCommand_macro_init();
 void CSQC_Init(void)
 {
        prvm_language = cvar_string("prvm_language");
@@ -87,28 +115,12 @@ void CSQC_Init(void)
                        break;
        maxclients = i;
 
-       registercommand("hud_configure");
-       registercommand("hud_save");
+       //registercommand("hud_configure");
+       //registercommand("hud_save");
        //registercommand("menu_action");
+       
+       ConsoleCommand_macro_init();
 
-       registercommand("+showscores");registercommand("-showscores");
-       registercommand("+showaccuracy");registercommand("-showaccuracy");
-
-#ifndef CAMERATEST
-       if(isdemo())
-       {
-#endif
-               registercommand("+forward");registercommand("-forward");
-               registercommand("+back");registercommand("-back");
-               registercommand("+moveup");registercommand("-moveup");
-               registercommand("+movedown");registercommand("-movedown");
-               registercommand("+moveright");registercommand("-moveright");
-               registercommand("+moveleft");registercommand("-moveleft");
-               registercommand("+roll_right");registercommand("-roll_right");
-               registercommand("+roll_left");registercommand("-roll_left");
-#ifndef CAMERATEST
-       }
-#endif
        registercvar("hud_usecsqc", "1");
        registercvar("scoreboard_columns", "default");
 
@@ -127,7 +139,9 @@ void CSQC_Init(void)
 
        GetTeam(COLOR_SPECTATOR, true); // add specs first
 
+       // needs to be done so early because of the constants they create
        RegisterWeapons();
+       RegisterGametypes();
 
        WaypointSprite_Load();
 
@@ -135,6 +149,15 @@ void CSQC_Init(void)
        precache_model("null");
        precache_sound("misc/hit.wav");
        precache_sound("misc/typehit.wav");
+       if (autocvar_cl_precacheplayermodels)
+       {
+               precache_all_playermodels("models/player/*.zym");
+               precache_all_playermodels("models/player/*.dpm");
+               precache_all_playermodels("models/player/*.md3");
+               precache_all_playermodels("models/player/*.psk");
+               precache_all_playermodels("models/player/*.iqm");
+       }
+
        Projectile_Precache();
        Hook_Precache();
        GibSplash_Precache();
@@ -176,7 +199,7 @@ void CSQC_Init(void)
 }
 
 // CSQC_Shutdown : Called every time the CSQC code is shutdown (changing maps, quitting, etc)
-void CSQC_Shutdown(void)
+void Shutdown(void)
 {
 #ifdef USE_FTE
 #pragma TARGET id
@@ -197,8 +220,6 @@ void CSQC_Shutdown(void)
                db_save(ClientProgsDB, "client.db");
        db_close(ClientProgsDB);
 
-       cvar_clientsettemp_restore();
-
        if(camera_active)
                cvar_set("chase_active",ftos(chase_active_backup));
 
@@ -343,294 +364,7 @@ void PostInit(void)
        postinit = true;
 }
 
-// CSQC_ConsoleCommand : Used to parse commands in the console that have been registered with the "registercommand" function
-// Return value should be 1 if CSQC handled the command, otherwise return 0 to have the engine handle it.
 float button_zoom;
-void Cmd_HUD_SetFields(float);
-void Cmd_HUD_Help(float);
-float CSQC_ConsoleCommand(string strMessage)
-{
-       float argc;
-       // Tokenize String
-       argc = tokenize_console(strMessage);
-
-       // Acquire Command
-       string strCmd;
-       strCmd = argv(0);
-
-       if(strCmd == "hud_configure") { // config hud
-               cvar_set("_hud_configure", ftos(!autocvar__hud_configure));
-               return true;
-       } else if(strCmd == "hud_save") { // save hud config
-               if(argv(1) == "" || argv(2)) {
-                       print(_("Usage:\n"));
-                       print(_("hud_save configname   (saves to hud_skinname_configname.cfg)\n"));
-               }
-               else
-                       HUD_Panel_ExportCfg(argv(1));
-               return true;
-       } else if(strCmd == "+showscores") {
-               scoreboard_showscores = true;
-               return true;
-       } else if(strCmd == "-showscores") {
-               scoreboard_showscores = false;
-               return true;
-       } else if(strCmd == "+showaccuracy") {
-               scoreboard_showaccuracy = true;
-               return true;
-       } else if(strCmd == "-showaccuracy") {
-               scoreboard_showaccuracy = false;
-               return true;
-       }
-
-       if(camera_active)
-       if(strCmd == "+forward" || strCmd == "-back") {
-               ++camera_direction_x;
-               return true;
-       } else if(strCmd == "-forward" || strCmd == "+back") {
-               --camera_direction_x;
-               return true;
-       } else if(strCmd == "+moveright" || strCmd == "-moveleft") {
-               --camera_direction_y;
-               return true;
-       } else if(strCmd == "-moveright" || strCmd == "+moveleft") {
-               ++camera_direction_y;
-               return true;
-       } else if(strCmd == "+moveup" || strCmd == "-movedown") {
-               ++camera_direction_z;
-               return true;
-       } else if(strCmd == "-moveup" || strCmd == "+movedown") {
-               --camera_direction_z;
-               return true;
-       } else if(strCmd == "+roll_right" || strCmd == "-roll_left") {
-               ++camera_roll;
-               return true;
-       } else if(strCmd == "+roll_left" || strCmd == "-roll_right") {
-               --camera_roll;
-               return true;
-       }
-
-       return false;
-}
-
-.vector view_ofs;
-entity debug_shotorg;
-void ShotOrg_Draw()
-{
-       self.origin = view_origin + view_forward * self.view_ofs_x + view_right * self.view_ofs_y + view_up * self.view_ofs_z;
-       self.angles = view_angles;
-       self.angles_x = -self.angles_x;
-       if not(self.cnt)
-               self.drawmask = MASK_NORMAL;
-       else
-               self.drawmask = 0;
-}
-void ShotOrg_Draw2D()
-{
-       vector coord2d_topleft, coord2d_topright, coord2d;
-       string s;
-       vector fs;
-
-       s = vtos(self.view_ofs);
-       s = substring(s, 1, strlen(s) - 2);
-       if(tokenize_console(s) == 3)
-               s = strcat(argv(0), " ", argv(1), " ", argv(2));
-
-       coord2d_topleft = project_3d_to_2d(self.origin + view_up * 4 - view_right * 4);
-       coord2d_topright = project_3d_to_2d(self.origin + view_up * 4 + view_right * 4);
-
-       fs = '1 1 0' * ((coord2d_topright_x - coord2d_topleft_x) / stringwidth(s, FALSE, '8 8 0'));
-
-       coord2d = coord2d_topleft;
-       if(fs_x < 8)
-       {
-               coord2d_x += (coord2d_topright_x - coord2d_topleft_x) * (1 - 8 / fs_x) * 0.5;
-               fs = '8 8 0';
-       }
-       coord2d_y -= fs_y;
-       coord2d_z = 0;
-       drawstring(coord2d, s, fs, '1 1 1', 1, 0);
-}
-
-void ShotOrg_Spawn()
-{
-       debug_shotorg = spawn();
-       debug_shotorg.draw = ShotOrg_Draw;
-       debug_shotorg.draw2d = ShotOrg_Draw2D;
-       debug_shotorg.renderflags = RF_VIEWMODEL;
-       debug_shotorg.effects = EF_FULLBRIGHT;
-       precache_model("models/shotorg_adjuster.md3");
-       setmodel(debug_shotorg, "models/shotorg_adjuster.md3");
-       debug_shotorg.scale = 2;
-       debug_shotorg.view_ofs = '25 8 -8';
-}
-
-void DrawDebugModel()
-{
-       if(time - floor(time) > 0.5)
-       {
-               PolyDrawModel(self);
-               self.drawmask = 0;
-       }
-       else
-       {
-               self.renderflags = 0;
-               self.drawmask = MASK_NORMAL;
-       }
-}
-
-void GameCommand(string msg)
-{
-       string s;
-       float argc;
-       entity e;
-       argc = tokenize_console(msg);
-
-       if(argv(0) == "help" || argc == 0)
-       {
-               print(_("Usage: cl_cmd COMMAND..., where possible commands are:\n"));
-               print(_("  settemp cvar value\n"));
-               print(_("  scoreboard_columns_set ...\n"));
-               print(_("  scoreboard_columns_help\n"));
-               GameCommand_Generic("help");
-               return;
-       }
-
-       if(GameCommand_Generic(msg))
-               return;
-
-       string cmd;
-       cmd = argv(0);
-       if(cmd == "mv_download") {
-               Cmd_MapVote_MapDownload(argc);
-       }
-       else if(cmd == "hud_panel_radar_maximized")
-       {
-               if(argc == 1)
-                       hud_panel_radar_maximized = !hud_panel_radar_maximized;
-               else
-                       hud_panel_radar_maximized = (stof(argv(1)) != 0);
-       }
-       else if(cmd == "settemp") {
-               cvar_clientsettemp(argv(1), argv(2));
-       }
-       else if(cmd == "scoreboard_columns_set") {
-               Cmd_HUD_SetFields(argc);
-       }
-       else if(cmd == "scoreboard_columns_help") {
-               Cmd_HUD_Help(argc);
-       }
-#ifdef BLURTEST
-       else if(cmd == "blurtest") {
-               blurtest_time0 = time;
-               blurtest_time1 = time + stof(argv(1));
-               blurtest_radius = stof(argv(2));
-               blurtest_power = stof(argv(3));
-       }
-#endif
-       else if(cmd == "shotorg_move") {
-               if(!debug_shotorg)
-                       ShotOrg_Spawn();
-               else
-                       debug_shotorg.view_ofs = debug_shotorg.view_ofs + stov(argv(1));
-               localcmd("sv_cmd debug_shotorg \"", vtos(debug_shotorg.view_ofs), "\"\n");
-       }
-       else if(cmd == "shotorg_movez") {
-               if(!debug_shotorg)
-                       ShotOrg_Spawn();
-               else
-                       debug_shotorg.view_ofs = debug_shotorg.view_ofs + stof(argv(1)) * (debug_shotorg.view_ofs * (1 / debug_shotorg.view_ofs_x)); // closer/farther, same xy pos
-               localcmd("sv_cmd debug_shotorg \"", vtos(debug_shotorg.view_ofs), "\"\n");
-       }
-       else if(cmd == "shotorg_set") {
-               if(!debug_shotorg)
-                       ShotOrg_Spawn();
-               else
-                       debug_shotorg.view_ofs = stov(argv(1));
-               localcmd("sv_cmd debug_shotorg \"", vtos(debug_shotorg.view_ofs), "\"\n");
-       }
-       else if(cmd == "shotorg_setz") {
-               if(!debug_shotorg)
-                       ShotOrg_Spawn();
-               else
-                       debug_shotorg.view_ofs = debug_shotorg.view_ofs * (stof(argv(1)) / debug_shotorg.view_ofs_x); // closer/farther, same xy pos
-               localcmd("sv_cmd debug_shotorg \"", vtos(debug_shotorg.view_ofs), "\"\n");
-       }
-       else if(cmd == "shotorg_toggle_hide") {
-               if(debug_shotorg)
-               {
-                       debug_shotorg.cnt = !debug_shotorg.cnt;
-               }
-       }
-       else if(cmd == "shotorg_end") {
-               if(debug_shotorg)
-               {
-                       print(vtos(debug_shotorg.view_ofs), "\n");
-                       remove(debug_shotorg);
-                       debug_shotorg = world;
-               }
-               localcmd("sv_cmd debug_shotorg\n");
-       }
-       else if(cmd == "sendcvar") {
-               // W_FixWeaponOrder will trash argv, so save what we need.
-               string thiscvar;
-               thiscvar = strzone(argv(1));
-               s = cvar_string(thiscvar);
-               if(thiscvar == "cl_weaponpriority")
-                       s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
-               else if(substring(thiscvar, 0, 17) == "cl_weaponpriority" && strlen(thiscvar) == 18)
-                       s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
-               localcmd("cmd sentcvar ", thiscvar, " \"", s, "\"\n");
-               strunzone(thiscvar);
-       }
-       else if(cmd == "spawn") {
-               s = argv(1);
-               e = spawn();
-               precache_model(s);
-               setmodel(e, s);
-               setorigin(e, view_origin);
-               e.angles = view_angles;
-               e.draw = DrawDebugModel;
-               e.classname = "debugmodel";
-       }
-    else if(cmd == "vyes")
-    {
-        if(uid2name_dialog)
-        {
-            vote_active = 0; // force the panel to disappear right as we have selected the value (to prevent it from fading out in the normal vote panel pos)
-            vote_prev = 0;
-            localcmd("setreport cl_allow_uid2name 1\n");
-            vote_change = -9999;
-                       uid2name_dialog = 0;
-        }
-        else
-        {
-            localcmd("cmd vote yes\n");
-        }
-    }
-    else if(cmd == "vno")
-    {
-        if(uid2name_dialog)
-        {
-            vote_active = 0;
-            vote_prev = 0;
-            localcmd("setreport cl_allow_uid2name 0\n");
-            vote_change = -9999;
-                       uid2name_dialog = 0;
-        }
-        else
-        {
-            localcmd("cmd vote no\n");
-        }
-    }
-
-       else
-       {
-               print("Invalid command. For a list of supported commands, try cl_cmd help.\n");
-       }
-
-       return;
-}
 
 // CSQC_InputEvent : Used to perform actions based on any key pressed, key released and mouse on the client.
 // Return value should be 1 if CSQC handled the input, otherwise return 0 to have the input passed to the engine.
@@ -1016,6 +750,7 @@ void CSQC_Ent_Update(float bIsNewEntity)
                case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
                case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
                case ENT_CLIENT_TURRET: ent_turret(); break; 
+               case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break; 
                default:
                        //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
                        error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
@@ -1050,7 +785,7 @@ void Gamemode_Init()
 {
        if not(isdemo())
        {
-               localcmd("\n_cl_hook_gamestart ", GametypeNameFromType(gametype), "\n");
+               localcmd("\n_cl_hook_gamestart ", MapInfo_Type_ToString(gametype), "\n");
                calledhooks |= HOOK_START;
        }
 }
@@ -1086,7 +821,7 @@ void Ent_ScoresInfo()
 {
        float i;
        self.classname = "ent_client_scores_info";
-       gametype = ReadByte();
+       gametype = ReadInt24_t();
        for(i = 0; i < MAX_SCORE; ++i)
        {
                scores_label[i] = strzone(ReadString());
index d9f6df7ee77281fdf2e52b650d25680dec5f72a9..556859a466ed66828f27fb6c72229b2653dd8126 100644 (file)
@@ -10,7 +10,7 @@ void Porto_Draw()
        vector p, dir, ang, q, nextdir;
        float idx, portal_number, portal1_idx;
 
-       if(activeweapon != WEP_PORTO || spectatee_status || gametype == GAME_NEXBALL)
+       if(activeweapon != WEP_PORTO || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL)
                return;
        if(intermission == 1)
                return;
@@ -408,6 +408,8 @@ void CSQC_UpdateView(float w, float h)
 
        WaypointSprite_Load();
 
+       CSQCPlayer_SetCamera();
+
 #ifdef COMPAT_XON050_ENGINE
        if(spectatee_status)
                myteam = GetPlayerColor(spectatee_status - 1);
@@ -959,7 +961,7 @@ void CSQC_UpdateView(float w, float h)
        if(menu_visible)
                menu_show();
 
-       /*if(gametype == GAME_CTF)
+       /*if(gametype == MAPINFO_TYPE_CTF)
          {
          ctf_view();
          } else */
@@ -993,7 +995,7 @@ void CSQC_UpdateView(float w, float h)
 
        //else
        {
-               if(gametype == GAME_FREEZETAG)
+               if(gametype == MAPINFO_TYPE_FREEZETAG)
                {
                        if(getstati(STAT_FROZEN))
                                drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
@@ -1448,7 +1450,7 @@ void CSQC_common_hud(void)
 {
     // do some accuracy var caching
     float i;
-    if(!(gametype == GAME_RACE || gametype == GAME_CTS))
+    if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS))
     {
         if(autocvar_accuracy_color_levels != acc_color_levels)
         {
index e18433e9666465ef36702c7ba10637eb4e3d1a6a..31fe318458f3af5a07e5114d6108b4094292c34f 100644 (file)
@@ -373,3 +373,14 @@ var float autocvar_cl_eventchase_distance = 140;
 var float autocvar_cl_eventchase_speed = 1.3;
 float autocvar_cl_lerpexcess;
 string autocvar__togglezoom;
+float autocvar_cl_playerdetailreduction;
+float autocvar_cl_loddistance1 = 1024;
+float autocvar_cl_loddistance2 = 4096;
+float autocvar_cl_forceplayermodels;
+float autocvar_cl_forceplayercolors;
+string autocvar_cl_forcemyplayermodel;
+float autocvar_cl_forcemyplayerskin;
+float autocvar_cl_forcemyplayercolors;
+float autocvar__cl_playerskin;
+string autocvar__cl_playermodel;
+float autocvar_cl_precacheplayermodels;
diff --git a/qcsrc/client/command/cl_cmd.qc b/qcsrc/client/command/cl_cmd.qc
new file mode 100644 (file)
index 0000000..77cbddd
--- /dev/null
@@ -0,0 +1,527 @@
+// ==============================================
+//  CSQC client commands code, written by Samual
+//  Last updated: December 28th, 2011
+// ==============================================
+
+void DrawDebugModel()
+{
+       if(time - floor(time) > 0.5)
+       {
+               PolyDrawModel(self);
+               self.drawmask = 0;
+       }
+       else
+       {
+               self.renderflags = 0;
+               self.drawmask = MASK_NORMAL;
+       }
+}
+
+
+// =======================
+//  Command Sub-Functions
+// =======================
+
+void LocalCommand_blurtest(float request)
+{
+       // Simple command to work with postprocessing temporarily... possibly completely pointless, the glsl shader is used for a real feature now...
+       // Anyway, to enable it, just compile the client with -DBLURTEST and then you can use the command.
+       
+       #ifdef BLURTEST
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       blurtest_time0 = time;
+                       blurtest_time1 = time + stof(argv(1));
+                       blurtest_radius = stof(argv(2));
+                       blurtest_power = stof(argv(3));
+                       print("Enabled blurtest\n");
+                       return; 
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd blurtest\n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+       #else
+       if(request)
+       {
+               print("Blurtest is not enabled on this client.\n");
+               return;
+       }
+       #endif
+}
+
+void LocalCommand_debugmodel(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       string modelname = argv(1);
+                       entity debugmodel_entity;
+                       
+                       debugmodel_entity = spawn();
+                       precache_model(modelname);
+                       setmodel(debugmodel_entity, modelname);
+                       setorigin(debugmodel_entity, view_origin);
+                       debugmodel_entity.angles = view_angles;
+                       debugmodel_entity.draw = DrawDebugModel;
+                       debugmodel_entity.classname = "debugmodel";
+                       
+                       return; 
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd debugmodel model\n");
+                       print("  Where 'model' is a string of the model name to use for the debug model.\n");
+                       return;
+               }
+       }
+}
+
+void LocalCommand_handlevote(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float vote_selection;
+                       string vote_string;
+                       
+                       if(InterpretBoolean(argv(1)))
+                       {
+                               vote_selection = 2; 
+                               vote_string = "yes";
+                       }
+                       else
+                       {
+                               vote_selection = 1; 
+                               vote_string = "no"; 
+                       }
+                       
+                       if(vote_selection)
+                       {
+                               if(uid2name_dialog) // handled by "uid2name" option
+                               {
+                                       vote_active = 0;
+                                       vote_prev = 0;
+                                       vote_change = -9999;
+                                       localcmd(strcat("setreport cl_allow_uid2name ", ftos(vote_selection - 1), "\n"));
+                                       uid2name_dialog = 0;
+                               }
+                               else { localcmd(strcat("cmd vote ", vote_string, "\n")); }
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2handlevote^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd handlevote vote\n");
+                       print("  Where 'vote' is the selection for either the current poll or uid2name.\n");
+                       return;
+               }
+       }
+}
+
+void LocalCommand_hud(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       switch(argv(1))
+                       {
+                               case "configure":
+                               {
+                                       cvar_set("_hud_configure", ftos(!autocvar__hud_configure));
+                                       return;
+                               }
+                               
+                               case "save":
+                               {
+                                       if(argv(2))
+                                       {
+                                               HUD_Panel_ExportCfg(argv(2));
+                                               return;
+                                       }
+                                       else
+                                       {
+                                               break; // go to usage, we're missing the paramater needed here.
+                                       }
+                               }
+                               
+                               case "scoreboard_columns_set":
+                               {
+                                       Cmd_HUD_SetFields(argc); 
+                                       return;
+                               }
+
+                               case "scoreboard_columns_help":
+                               {
+                                       Cmd_HUD_Help();
+                                       return;
+                               }
+                               
+                               case "radar":
+                               {
+                                       hud_panel_radar_maximized = (argv(2) ? InterpretBoolean(argv(2)) : !hud_panel_radar_maximized);
+                                       return;
+                               }
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2hud^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd hud action [configname | radartoggle | layout]\n");
+                       print("  Where 'action' is the command to complete,\n");
+                       print("  'configname' is the name to save to for \"save\" action,\n");
+                       print("  'radartoggle' is to control hud_panel_radar_maximized for \"radar\" action,\n");
+                       print("  and 'layout' is how to organize the scoreboard columns for the set action.\n");
+                       print("  Full list of commands here: \"configure, save, scoreboard_columns_help, scoreboard_columns_set, radar.\"\n");
+                       return;
+               }
+       }
+}
+
+void LocalCommand_localprint(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               centerprint_hud(argv(1));
+                               return; 
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2localprint^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd localprint \"message\"\n");
+                       print("  'message' is the centerprint message to send to yourself.\n");
+                       return;
+               }
+       }
+}
+
+void LocalCommand_mv_download(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               Cmd_MapVote_MapDownload(argc);
+                               return; 
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2mv_download^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd mv_download mapid\n");
+                       print("  Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.\n");
+                       return;
+               }
+       }
+}
+
+void LocalCommand_sendcvar(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               // W_FixWeaponOrder will trash argv, so save what we need.
+                               string thiscvar = strzone(argv(1));
+                               string s = cvar_string(thiscvar);
+                               
+                               if(thiscvar == "cl_weaponpriority")
+                                       s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
+                               else if(substring(thiscvar, 0, 17) == "cl_weaponpriority" && strlen(thiscvar) == 18)
+                                       s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
+                                       
+                               localcmd("cmd sentcvar ", thiscvar, " \"", s, "\"\n");
+                               strunzone(thiscvar);
+                               return; 
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2sendcvar^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd sendcvar <cvar>\n");
+                       print("  Where 'cvar' is the cvar plus arguments to send to the server.\n");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void LocalCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return; 
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 cl_cmd \n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+*/
+
+
+// ==================================
+//  Macro system for client commands
+// ==================================
+
+// Normally do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+// but for 0.5 compat, we need vyes and vno here as they were replaced... REMOVE THEM AFTER 0.6 RELEASE!!!!
+#define CLIENT_COMMANDS(request,arguments) \
+       CLIENT_COMMAND("blurtest", LocalCommand_blurtest(request), "Feature for testing blur postprocessing") \
+       CLIENT_COMMAND("debugmodel", LocalCommand_debugmodel(request, arguments), "Spawn a debug model manually") \
+       CLIENT_COMMAND("handlevote", LocalCommand_handlevote(request, arguments), "System to handle selecting a vote or option") \
+       CLIENT_COMMAND("hud", LocalCommand_hud(request, arguments), "Commands regarding/controlling the HUD system") \
+       CLIENT_COMMAND("localprint", LocalCommand_localprint(request, arguments), "Create your own centerprint sent to yourself") \
+       CLIENT_COMMAND("mv_download", LocalCommand_mv_download(request, arguments), "Retrieve mapshot picture from the server") \
+       CLIENT_COMMAND("sendcvar", LocalCommand_sendcvar(request, arguments), "Send a cvar to the server (like weaponpriority)") \
+       CLIENT_COMMAND("vyes", LocalCommand_handlevote(request, tokenize_console("handlevote yes")), "") \
+       CLIENT_COMMAND("vno", LocalCommand_handlevote(request, tokenize_console("handlevote no")), "") \
+       /* nothing */
+       
+void LocalCommand_macro_help()
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { if(strtolower(description) != string_null) { print("  ^2", name, "^7: ", description, "\n"); } }
+               
+       CLIENT_COMMANDS(0, 0)
+       #undef CLIENT_COMMAND
+       
+       return;
+}
+
+float LocalCommand_macro_command(float argc)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       CLIENT_COMMANDS(CMD_REQUEST_COMMAND, argc)
+       #undef CLIENT_COMMAND
+       
+       return FALSE;
+}
+
+float LocalCommand_macro_usage(float argc)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       CLIENT_COMMANDS(CMD_REQUEST_USAGE, argc)
+       #undef CLIENT_COMMAND
+       
+       return FALSE;
+}
+
+void LocalCommand_macro_write_aliases(float fh)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_cl", name, description); }
+               
+       CLIENT_COMMANDS(0, 0)
+       #undef CLIENT_COMMAND
+       
+       return;
+}
+
+
+// =========================================
+//  Main Function Called By Engine (cl_cmd)
+// =========================================
+// If this function exists, client code handles gamecommand instead of the engine code.
+
+void GameCommand(string command)
+{
+       float argc = tokenize_console(command);
+
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+
+       if(strtolower(argv(0)) == "help") 
+       {
+               if(argc == 1) 
+               {
+                       print("\nClient console commands:\n");
+                       LocalCommand_macro_help();
+
+                       print("\nGeneric commands shared by all programs:\n");
+                       GenericCommand_macro_help();
+                       
+                       print("\nUsage:^3 cl_cmd COMMAND...^7, where possible commands are listed above.\n");
+                       print("For help about a specific command, type cl_cmd help COMMAND\n");
+                       
+                       return;
+               } 
+               else if(GenericCommand_macro_usage(argc)) // Instead of trying to call a command, we're going to see detailed information about it
+               {
+                       return;
+               }
+               else if(LocalCommand_macro_usage(argc)) // now try for normal commands too
+               {
+                       return;
+               }
+       } 
+       else if(GenericCommand(command)) 
+       {
+               return; // handled by common/command/generic.qc
+       }
+       else if(LocalCommand_macro_command(argc)) // continue as usual and scan for normal commands
+       {
+               return; // handled by one of the above LocalCommand_* functions
+       }
+       
+       // nothing above caught the command, must be invalid
+       print(((command != "") ? strcat("Unknown client command \"", command, "\"") : "No command provided"), ". For a list of supported commands, try cl_cmd help.\n");
+       
+       return;
+}
+
+
+// ===================================
+//  Macro system for console commands
+// ===================================
+
+// These functions are here specifically to add special + - commands to the game, and are not really normal commands.
+// Please add client commands to the function above this, as this is only for special reasons.
+#define CONSOLE_COMMANDS_NORMAL \
+       CONSOLE_COMMAND("+showscores", { scoreboard_showscores = TRUE; }) \
+       CONSOLE_COMMAND("-showscores", { scoreboard_showscores = FALSE; }) \
+       CONSOLE_COMMAND("+showaccuracy", { scoreboard_showaccuracy = TRUE; }) \
+       CONSOLE_COMMAND("-showaccuracy", { scoreboard_showaccuracy = FALSE; }) \
+       /* nothing */
+       
+#define CONSOLE_COMMANDS_MOVEMENT \
+       CONSOLE_COMMAND("+forward", { ++camera_direction_x; }) \
+       CONSOLE_COMMAND("-forward", { --camera_direction_x; }) \
+       CONSOLE_COMMAND("+back", { --camera_direction_x; }) \
+       CONSOLE_COMMAND("-back", { ++camera_direction_x; }) \
+       CONSOLE_COMMAND("+moveup", { ++camera_direction_z; }) \
+       CONSOLE_COMMAND("-moveup", { --camera_direction_z; }) \
+       CONSOLE_COMMAND("+movedown", { --camera_direction_z; }) \
+       CONSOLE_COMMAND("-movedown", { ++camera_direction_z; }) \
+       CONSOLE_COMMAND("+moveright", { --camera_direction_y; }) \
+       CONSOLE_COMMAND("-moveright", { ++camera_direction_y; }) \
+       CONSOLE_COMMAND("+moveleft", { ++camera_direction_y; }) \
+       CONSOLE_COMMAND("-moveleft", { --camera_direction_y; }) \
+       CONSOLE_COMMAND("+roll_right", { ++camera_roll; }) \
+       CONSOLE_COMMAND("-roll_right", { --camera_roll; }) \
+       CONSOLE_COMMAND("+roll_left", { --camera_roll; }) \
+       CONSOLE_COMMAND("-roll_left", { ++camera_roll; }) \
+       /* nothing */
+
+void ConsoleCommand_macro_init()
+{
+       // first init normal commands
+       #define CONSOLE_COMMAND(name,execution) \
+               { registercommand(name); }
+
+       CONSOLE_COMMANDS_NORMAL
+       #undef CONSOLE_COMMAND
+       
+       // then init movement commands
+       #ifndef CAMERATEST
+       if(isdemo())
+       {
+       #endif
+               #define CONSOLE_COMMAND(name,execution) \
+                       { registercommand(name); }
+
+               CONSOLE_COMMANDS_MOVEMENT
+               #undef CONSOLE_COMMAND
+       #ifndef CAMERATEST
+       }
+       #endif
+       
+       return;
+}
+
+float ConsoleCommand_macro_normal(float argc)
+{
+       #define CONSOLE_COMMAND(name,execution) \
+               { if(name == strtolower(argv(0))) { { execution } return TRUE; } }
+               
+       CONSOLE_COMMANDS_NORMAL
+       #undef CONSOLE_COMMAND
+       
+       return FALSE;
+}
+
+float ConsoleCommand_macro_movement(float argc)
+{
+       if(camera_active)
+       {
+               #define CONSOLE_COMMAND(name,execution) \
+                       { if(name == strtolower(argv(0))) { { execution } return TRUE; } }
+
+               CONSOLE_COMMANDS_MOVEMENT
+               #undef CONSOLE_COMMAND
+       }
+       
+       return FALSE;
+}
+
+
+// ======================================================
+//  Main Function Called By Engine (registered commands)
+// ======================================================
+// Used to parse commands in the console that have been registered with the "registercommand" function
+
+float CSQC_ConsoleCommand(string command)
+{
+       float argc = tokenize_console(command);
+
+       if(ConsoleCommand_macro_normal(argc))
+       {
+               return TRUE;
+       }
+       else if(ConsoleCommand_macro_movement(argc))
+       {
+               return TRUE;
+       }
+       
+       // Return value should be 1 if CSQC handled the command, otherwise return 0 to have the engine handle it.
+
+       return FALSE;
+}
\ No newline at end of file
diff --git a/qcsrc/client/command/cl_cmd.qh b/qcsrc/client/command/cl_cmd.qh
new file mode 100644 (file)
index 0000000..f2db76a
--- /dev/null
@@ -0,0 +1,10 @@
+// ==============================================
+//  CSQC client commands code, written by Samual
+//  Last updated: December 17th, 2011
+// ==============================================
+
+void Cmd_HUD_SetFields(float);
+void Cmd_HUD_Help();
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void LocalCommand_macro_write_aliases(float fh);
\ No newline at end of file
diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc
new file mode 100644 (file)
index 0000000..92b8983
--- /dev/null
@@ -0,0 +1,460 @@
+.float isplayermodel;
+
+// FEATURE: LOD
+.float lodmodelindex0;
+.float lodmodelindex1;
+.float lodmodelindex2;
+void CSQCPlayer_LOD_Apply(void)
+{
+       // LOD model loading
+       if(self.lodmodelindex0 != self.modelindex)
+       {
+               string modelname = self.model;
+               string s;
+
+               if(!fexists(modelname))
+               {
+                       print(sprintf(_("Trying to use non existing model %s. "), modelname));
+                       modelname = cvar_defstring("_cl_playermodel");
+                       print(sprintf(_("Reverted to %s.\n"), modelname));
+               }
+
+               // set modelindex
+               self.lodmodelindex0 = self.modelindex;
+               self.lodmodelindex1 = self.modelindex;
+               self.lodmodelindex2 = self.modelindex;
+
+               // FIXME: this only supports 3-letter extensions
+               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
+               if(fexists(s))
+               {
+                       precache_model(s);
+                       setmodel(self, s);
+                       if(self.modelindex)
+                               self.lodmodelindex1 = self.modelindex;
+               }
+
+               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
+               if(fexists(s))
+               {
+                       precache_model(s);
+                       setmodel(self, s);
+                       if(self.modelindex)
+                               self.lodmodelindex2 = self.modelindex;
+               }
+
+               setmodel(self, modelname); // make everything normal again
+       }
+
+       // apply LOD
+       if(autocvar_cl_playerdetailreduction <= 0)
+       {
+               if(autocvar_cl_playerdetailreduction <= -2)
+                       self.modelindex = self.lodmodelindex2;
+               else if(autocvar_cl_playerdetailreduction <= -1)
+                       self.modelindex = self.lodmodelindex1;
+               else
+                       self.modelindex = self.lodmodelindex0;
+       }
+       else
+       {
+               float distance = vlen(self.origin - other.origin);
+               float f = (distance + 100.0) * autocvar_cl_playerdetailreduction;
+               f *= 1.0 / bound(0.01, view_quality, 1);
+               if(f > autocvar_cl_loddistance2)
+                       self.modelindex = self.lodmodelindex2;
+               else if(f > autocvar_cl_loddistance1)
+                       self.modelindex = self.lodmodelindex1;
+               else
+                       self.modelindex = self.lodmodelindex0;
+       }
+}
+
+// FEATURE: forcemodel (MUST be called BEFORE LOD!)
+string forceplayermodels_model;
+float forceplayermodels_modelindex;
+float forceplayermodels_skin;
+
+string forceplayermodels_mymodel;
+float forceplayermodels_mymodelindex;
+
+float forceplayermodels_attempted;
+.string forceplayermodels_savemodel;
+.float forceplayermodels_savemodelindex;
+.float forceplayermodels_saveskin;
+.float forceplayermodels_savecolormap;
+void CSQCPlayer_ForceModel_PreUpdate(void)
+{
+       self.model = self.forceplayermodels_savemodel;
+       self.modelindex = self.forceplayermodels_savemodelindex;
+       self.skin = self.forceplayermodels_saveskin;
+       self.colormap = self.forceplayermodels_savecolormap;
+}
+void CSQCPlayer_ForceModel_PostUpdate(void)
+{
+       self.forceplayermodels_savemodel = self.model;
+       self.forceplayermodels_savemodelindex = self.modelindex;
+       self.forceplayermodels_saveskin = self.skin;
+       self.forceplayermodels_savecolormap = self.colormap;
+}
+void CSQCPlayer_ForceModel_Apply(float islocalplayer)
+{
+       // first, try finding it from the server
+
+       if(self.forceplayermodels_savemodelindex && self.forceplayermodels_savemodel != "null")
+       {
+               if(islocalplayer)
+               {
+                       // trust server's idea of "own player model"
+                       forceplayermodels_model = self.model;
+                       forceplayermodels_modelindex = self.modelindex;
+                       forceplayermodels_skin = self.skin;
+                       forceplayermodels_attempted = 1;
+               }
+       }
+
+       // forcemodel finding
+       if(!forceplayermodels_attempted)
+       {
+               forceplayermodels_attempted = 1;
+
+               // only if this failed, find it out on our own
+               entity e;
+               e = spawn();
+               setmodel(e, autocvar__cl_playermodel); // this is harmless, see below
+               forceplayermodels_model = e.model;
+               forceplayermodels_modelindex = e.modelindex;
+               forceplayermodels_skin = autocvar__cl_playerskin;
+               remove(e);
+       }
+
+       if(autocvar_cl_forcemyplayermodel != "" && autocvar_cl_forcemyplayermodel != forceplayermodels_mymodel)
+       {
+               entity e;
+               e = spawn();
+               setmodel(e, autocvar_cl_forcemyplayermodel); // this is harmless, see below
+               forceplayermodels_mymodel = e.model;
+               forceplayermodels_mymodelindex = e.modelindex;
+               remove(e);
+       }
+
+       // apply it
+       if(autocvar_cl_forcemyplayermodel != "" && forceplayermodels_mymodelindex && self.entnum == player_localnum + 1)
+       {
+               self.model = forceplayermodels_mymodel;
+               self.modelindex = forceplayermodels_mymodelindex;
+               self.skin = autocvar_cl_forcemyplayerskin;
+       }
+       else if(autocvar_cl_forceplayermodels && forceplayermodels_modelindex)
+       {
+               self.model = forceplayermodels_model;
+               self.modelindex = forceplayermodels_modelindex;
+               self.skin = forceplayermodels_skin;
+       }
+       else
+       {
+               self.model = self.forceplayermodels_savemodel;
+               self.modelindex = self.forceplayermodels_savemodelindex;
+               self.skin = self.forceplayermodels_saveskin;
+       }
+
+       // forceplayercolors too
+       if(!teamplay)
+       {
+               if(autocvar_cl_forcemyplayercolors && self.entnum == player_localnum + 1)
+                       self.colormap = 1024 + autocvar_cl_forcemyplayercolors;
+               else if(autocvar_cl_forceplayercolors)
+                       self.colormap = player_localnum + 1;
+       }
+}
+
+// FEATURE: fallback frames
+.float csqcmodel_saveframe;
+.float csqcmodel_saveframe2;
+.float csqcmodel_saveframe3;
+.float csqcmodel_saveframe4;
+.float csqcmodel_framecount;
+void CSQCPlayer_FallbackFrame_PreUpdate(void)
+{
+       self.frame = self.csqcmodel_saveframe;
+       self.frame2 = self.csqcmodel_saveframe2;
+       self.frame3 = self.csqcmodel_saveframe3;
+       self.frame4 = self.csqcmodel_saveframe4;
+}
+void CSQCPlayer_FallbackFrame_PostUpdate(float isnew)
+{
+       self.csqcmodel_saveframe = self.frame;
+       self.csqcmodel_saveframe2 = self.frame2;
+       self.csqcmodel_saveframe3 = self.frame3;
+       self.csqcmodel_saveframe4 = self.frame4;
+
+       // hack for death animations: set their frametime to zero in case a
+       // player "pops in"
+       if(isnew)
+       {
+#define FIX_FRAMETIME(f,ft) \
+               switch(self.f) \
+               { \
+                       case 0: \
+                       case 1: \
+                               self.ft = 0; \
+                               break; \
+               }
+               FIX_FRAMETIME(frame, frame1time)
+               FIX_FRAMETIME(frame2, frame2time)
+               FIX_FRAMETIME(frame3, frame3time)
+               FIX_FRAMETIME(frame4, frame4time)
+       }
+}
+float CSQCPlayer_FallbackFrame(float f)
+{
+       if(frameduration(self.modelindex, f) > 0)
+               return f; // goooooood
+       switch(f)
+       {
+               case 23: return 11; // anim_melee -> anim_shoot
+               case 24: return 4; // anim_duckwalkbackwards -> anim_duckwalk
+               case 25: return 4; // anim_duckwalkstrafeleft -> anim_duckwalk
+               case 26: return 4; // anim_duckwalkstraferight -> anim_duckwalk
+               case 27: return 4; // anim_duckwalkforwardright -> anim_duckwalk
+               case 28: return 4; // anim_duckwalkforwardleft -> anim_duckwalk
+               case 29: return 4; // anim_duckwalkbackright -> anim_duckwalk
+               case 30: return 4; // anim_duckwalkbackleft -> anim_duckwalk
+       }
+       print(sprintf("Frame %d missing in model %s, and we have no fallback - FAIL!\n", f, self.model));
+       return f;
+}
+void CSQCPlayer_FallbackFrame_Apply(void)
+{
+       self.frame = CSQCPlayer_FallbackFrame(self.frame);
+       self.frame2 = CSQCPlayer_FallbackFrame(self.frame2);
+       self.frame3 = CSQCPlayer_FallbackFrame(self.frame3);
+       self.frame4 = CSQCPlayer_FallbackFrame(self.frame4);
+}
+
+// FEATURE: auto glowmod
+.vector glowmod;
+void CSQCPlayer_GlowMod_Apply(void)
+{
+       if(self.colormap > 0)
+               self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? self.colormap : stof(getplayerkeyvalue(self.colormap - 1, "colors"))) & 0x0F, TRUE) * 2;
+       else
+               self.glowmod = '1 1 1';
+}
+
+// FEATURE: auto tag_index
+.entity tag_entity;
+.float tag_entity_lastmodelindex;
+.float tag_index;
+void CSQCModel_AutoTagIndex_Apply(void)
+{
+       if(self.tag_entity && wasfreed(self.tag_entity))
+               self.tag_entity = world;
+
+       if(self.tag_networkentity)
+       {
+               // we are ATTACHED!
+               float changed = 0;
+               if(self.tag_entity.entnum != self.tag_networkentity)
+               {
+                       self.tag_entity = findfloat(world, entnum, self.tag_networkentity);
+                       changed = 1;
+               }
+               if(self.tag_entity.modelindex != self.tag_entity_lastmodelindex)
+               {
+                       self.tag_entity_lastmodelindex = self.tag_entity.modelindex;
+                       changed = 1;
+               }
+               if(changed)
+               {
+                       if(self.tag_entity)
+                       {
+                               // the best part is: IT EXISTS
+                               if(substring(self.model, 0, 17) == "models/weapons/v_")
+                                       if(substring(self.tag_entity.model, 0, 17) == "models/weapons/h_")
+                                       {
+                                               self.tag_index = gettagindex(self.tag_entity, "weapon");
+                                               if(!self.tag_index)
+                                                       self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
+                                               if(!self.tag_index)
+                                               {
+                                                       // we need to prevent this from 'appening
+                                                       self.tag_entity = world;
+                                                       self.drawmask = 0;
+                                                       dprint("h_ model lacks weapon attachment, but v_ model is attached to it\n");
+                                               }
+                                       }
+
+                               if(substring(self.model, 0, 17) == "models/weapons/v_")
+                                       if(substring(self.tag_entity.model, 0, 14) == "models/player/")
+                                       {
+                                               self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
+                                               if(!self.tag_index)
+                                                       self.tag_index = gettagindex(self.tag_entity, "bip01 r hand");
+                                       }
+
+                               if(substring(self.tag_entity.model, 0, 17) == "models/weapons/v_")
+                               {
+                                       self.tag_index = gettagindex(self.tag_entity, "shot");
+                                       if(!self.tag_index)
+                                               self.tag_index = gettagindex(self.tag_entity, "tag_shot");
+                               }
+                       }
+                       else
+                       {
+                               // damn, see you next frame
+                               self.drawmask = 0;
+                       }
+               }
+       }
+}
+
+// FEATURE: EF_NODRAW workalike
+float EF_BRIGHTFIELD   = 1;
+float EF_BRIGHTLIGHT   = 4;
+float EF_DIMLIGHT      = 8;
+float EF_DOUBLESIDED = 32768;
+float EF_NOSELFSHADOW = 65536;
+float EF_DYNAMICMODELLIGHT = 131072;
+float MF_ROCKET  =   1; // leave a trail
+float MF_GRENADE =   2; // leave a trail
+float MF_GIB     =   4; // leave a trail
+float MF_ROTATE  =   8; // rotate (bonus items)
+float MF_TRACER  =  16; // green split trail
+float MF_ZOMGIB  =  32; // small blood trail
+float MF_TRACER2 =  64; // orange split trail
+float MF_TRACER3 = 128; // purple trail
+.float csqcmodel_effects;
+.float csqcmodel_modelflags;
+void CSQCModel_Effects_PreUpdate(void)
+{
+       self.effects = self.csqcmodel_effects;
+       self.modelflags = self.csqcmodel_modelflags;
+}
+void CSQCModel_Effects_PostUpdate(void)
+{
+       self.csqcmodel_effects = self.effects;
+       self.csqcmodel_modelflags = self.modelflags;
+       self.effects = 0;
+       self.modelflags = 0;
+       if(self.csqcmodel_teleported)
+               Projectile_ResetTrail(self.origin);
+}
+void CSQCModel_Effects_Apply(void)
+{
+       float eff = self.csqcmodel_effects;
+       eff &~= CSQCMODEL_EF_INVISIBLE;
+
+       self.renderflags &~= (RF_DEPTHHACK | RF_ADDITIVE | RF_FULLBRIGHT | EF_NOSHADOW | RF_USEAXIS);
+       self.effects = 0;
+       self.traileffect = 0;
+                       
+       if(eff & EF_BRIGHTFIELD)
+               self.traileffect = particleeffectnum("TR_NEXUIZPLASMA");
+       // ignoring EF_MUZZLEFLASH
+       if(eff & EF_BRIGHTLIGHT)
+               adddynamiclight(self.origin, 400, '3 3 3');
+       if(eff & EF_DIMLIGHT)
+               adddynamiclight(self.origin, 200, '1.5 1.5 1.5');
+       if((eff & EF_NODRAW) || (self.csqcmodel_effects & CSQCMODEL_EF_INVISIBLE) || (self.alpha < 0))
+               self.drawmask = 0;
+       if(eff & EF_ADDITIVE)
+               self.renderflags |= RF_ADDITIVE;
+       if(eff & EF_BLUE)
+               adddynamiclight(self.origin, 200, '0.15 0.15 1.5');
+       if(eff & EF_RED)
+               adddynamiclight(self.origin, 200, '1.5 0.15 0.15');
+       // ignoring EF_NOGUNBOB
+       if(eff & EF_FULLBRIGHT)
+               self.renderflags |= RF_FULLBRIGHT;
+       if(eff & EF_FLAME)
+               pointparticles(particleeffectnum("EF_FLAME"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       if(eff & EF_STARDUST)
+               pointparticles(particleeffectnum("EF_STARDUST"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       if(eff & EF_NOSHADOW)
+               self.renderflags |= RF_NOSHADOW;
+       if(eff & EF_NODEPTHTEST)
+               self.renderflags |= RF_DEPTHHACK;
+       // ignoring EF_SELECTABLE
+       if(eff & EF_DOUBLESIDED)
+               self.effects |= EF_DOUBLESIDED;
+       if(eff & EF_NOSELFSHADOW)
+               self.effects |= EF_NOSELFSHADOW;
+       if(eff & EF_DYNAMICMODELLIGHT)
+               self.renderflags |= RF_DYNAMICMODELLIGHT;
+       // ignoring EF_UNUSED18, EF_UNUSED19, EF_RESTARTANIM_BIT, EF_TELEPORT_BIT, EF_LOWPRECISION
+       if(self.csqcmodel_modelflags & MF_ROCKET)
+               self.traileffect = particleeffectnum("TR_ROCKET");
+       if(self.csqcmodel_modelflags & MF_GRENADE)
+               self.traileffect = particleeffectnum("TR_GRENADE");
+       if(self.csqcmodel_modelflags & MF_GIB)
+               self.traileffect = particleeffectnum("TR_BLOOD");
+       if(self.csqcmodel_modelflags & MF_ROTATE)
+       {
+               self.renderflags |= RF_USEAXIS;
+               makevectors(self.angles + '0 100 0' * fmod(time, 3.6));
+       }
+       if(self.csqcmodel_modelflags & MF_TRACER)
+               self.traileffect = particleeffectnum("TR_WIZSPIKE");
+       if(self.csqcmodel_modelflags & MF_ZOMGIB)
+               self.traileffect = particleeffectnum("TR_SLIGHTBLOOD");
+       if(self.csqcmodel_modelflags & MF_TRACER2)
+               self.traileffect = particleeffectnum("TR_KNIGHTSPIKE");
+       if(self.csqcmodel_modelflags & MF_TRACER3)
+               self.traileffect = particleeffectnum("TR_VORESPIKE");
+
+       if(self.drawmask)
+               Projectile_DrawTrail(self.origin);
+       else
+               Projectile_ResetTrail(self.origin);
+}
+
+// general functions
+void CSQCModel_Hook_PreDraw(float isplayer, float islocalplayer)
+{
+       if(!self.modelindex || self.model == "null")
+       {
+               self.drawmask = 0;
+               return;
+       }
+       else
+               self.drawmask = MASK_NORMAL;
+
+       if(self.isplayermodel) // this checks if it's a player MODEL!
+       {
+               CSQCPlayer_GlowMod_Apply();
+               CSQCPlayer_ForceModel_Apply(islocalplayer);
+               CSQCPlayer_LOD_Apply();
+               CSQCPlayer_FallbackFrame_Apply();
+       }
+
+       if(!isplayer) // this checks if it's a player SLOT!
+               CSQCModel_AutoTagIndex_Apply();
+
+       CSQCModel_Effects_Apply();
+}
+
+void CSQCModel_Hook_PreUpdate(float isnew, float isplayer, float islocalplayer)
+{
+       // revert to values from server
+       CSQCModel_Effects_PreUpdate();
+       if(self.isplayermodel)
+       {
+               CSQCPlayer_FallbackFrame_PreUpdate();
+               CSQCPlayer_ForceModel_PreUpdate();
+       }
+}
+
+void CSQCModel_Hook_PostUpdate(float isnew, float isplayer, float islocalplayer)
+{
+       // is it a player model? (shared state)
+       self.isplayermodel = (substring(self.model, 0, 14) == "models/player/");
+
+       // save values set by server
+       if(self.isplayermodel)
+       {
+               CSQCPlayer_ForceModel_PostUpdate();
+               CSQCPlayer_FallbackFrame_PostUpdate(isnew);
+       }
+       CSQCModel_Effects_PostUpdate();
+}
index 51029396a299e46ce1270781b905ed7c9db99f25..5910dba3e41d13f4cf4636e34cf1983de9b9f5ef 100644 (file)
@@ -30,13 +30,16 @@ void Ent_DamageInfo(float isNew)
        else
                forcemul = 1;
        
-       for(self = findradius(w_org, rad); self; self = self.chain)
+       for(self = findradius(w_org, rad + MAX_DAMAGEEXTRARADIUS); self; self = self.chain)
        {
+               vector nearest = NearestPointOnBox(self, w_org);
                if(rad)
                {
-                       thisdmg = vlen(self.origin - w_org) / rad;
+                       thisdmg = ((vlen (nearest - w_org) - bound(MIN_DAMAGEEXTRARADIUS, self.damageextraradius, MAX_DAMAGEEXTRARADIUS)) / rad);
                        if(thisdmg >= 1)
                                continue;
+                       if(thisdmg < 0)
+                               thisdmg = 0;
                        if(dmg)
                        {
                                thisdmg = dmg + (edge - dmg) * thisdmg;
@@ -50,6 +53,9 @@ void Ent_DamageInfo(float isNew)
                }
                else
                {
+                       if(vlen(nearest - w_org) > bound(MIN_DAMAGEEXTRARADIUS, self.damageextraradius, MAX_DAMAGEEXTRARADIUS))
+                               continue;
+
                        thisdmg = dmg;
                        thisforce = forcemul * force;
                }
index 67fa4b3b9ab8f93020918530322cd981ee7f84a1..6f6316bec1d4c46e2fd474e874316b8563f0af29 100644 (file)
@@ -89,6 +89,7 @@ void Gib_Draw()
                return;
 
        if(self.touch == Gib_Touch) // don't do this for the "chunk" thingie...
+               // TODO somehow make it spray in a direction dependent on self.angles
                trailparticles(self, particleeffectnum(strcat(species_prefix(self.cnt), "TR_SLIGHTBLOOD")), oldorg, self.origin);
        else
                trailparticles(self, particleeffectnum(strcat(species_prefix(self.cnt), "TR_BLOOD")), oldorg, self.origin);
index 86b49761e5ca59cd34e978073f82e79ad9ddf395..ce9c29cd4068c4190ee0722f195a59f2288d19f4 100644 (file)
@@ -959,7 +959,7 @@ void HUD_Ammo(void)
                        DrawAmmoItem(pos, ammo_size, 2, true, FALSE); //show rockets
                        return;
                }
-               stat_items = getstati(STAT_ITEMS);
+               stat_items = getstati(STAT_ITEMS, 0, 24);
                if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
                        infinite_ammo = TRUE;
                for (i = 0; i < AMMO_COUNT; ++i) {
@@ -973,7 +973,7 @@ void HUD_Ammo(void)
                return; // nothing to display
        }
 
-       stat_items = getstati(STAT_ITEMS);
+       stat_items = getstati(STAT_ITEMS, 0, 24);
        if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
                infinite_ammo = TRUE;
        for (i = 0; i < AMMO_COUNT; ++i) {
@@ -1082,7 +1082,7 @@ void HUD_Powerups(void)
        {
                if(!autocvar_hud_panel_powerups) return;
                if(spectatee_status == -1) return;
-               if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE)) return;
+               if not(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE)) return;
                if (getstati(STAT_HEALTH) <= 0) return;
 
                strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99);
@@ -1519,7 +1519,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
        alsoprint = (autocvar_hud_panel_notify_print || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled
        gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
        
-       if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == GAME_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel
+       if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == MAPINFO_TYPE_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel
                return;
 
        if(msg == MSG_SUICIDE) {
@@ -1567,11 +1567,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
        } else if(msg == MSG_KILL) {
                w = DEATH_WEAPONOF(type);
                if(WEP_VALID(w)) {
-                       if((w == WEP_RIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here
-                               HUD_KillNotify_Push(s1, s2, 1, DEATH_HEADSHOT);
-                       else
-                               HUD_KillNotify_Push(s1, s2, 1, type);
-
+                       HUD_KillNotify_Push(s1, s2, 1, type);
                        if (alsoprint)
                                print("^1", sprintf(Weapon_KillMessage(type), strcat(s2, "^1"), strcat(s1, "^1")), "\n"); // default order: victim, killer
                }
@@ -2066,7 +2062,7 @@ void HUD_Notify (void)
        float width_attacker;
        string attacker, victim;
 
-       float i, j, w, step, limit;
+       float i, j, w, type, step, limit;
        if(autocvar_hud_panel_notify_flip) //order items from the top down
        {
                i = 0;
@@ -2115,63 +2111,63 @@ void HUD_Notify (void)
 
                s = "";
 
-               w = -1;
-               w = DEATH_WEAPONOF(killnotify_deathtype[j]);
+               type = killnotify_deathtype[j];
+               w = DEATH_WEAPONOF(type);
 
                // TODO: maybe print in team colors?
                //
                // Y [used by] X
                if(killnotify_actiontype[j] == 0) 
                {
-                       if(killnotify_deathtype[j] == DEATH_GENERIC)
+                       if(type == DEATH_GENERIC)
                        {
                                s = "notify_death";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_NOAMMO)
+                       else if(type == DEATH_NOAMMO)
                        {
                                s = "notify_outofammo";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_KILL)
+                       else if(type == DEATH_KILL)
                        {
                                s = "notify_selfkill";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_CAMP)
+                       else if(type == DEATH_CAMP)
                        {
                                s = "notify_camping";
                        }
-                       else if(killnotify_deathtype[j] == KILL_TEAM_RED)
+                       else if(type == KILL_TEAM_RED)
                        {
                                s = "notify_teamkill_red";
                        }
-                       else if(killnotify_deathtype[j] == KILL_TEAM_BLUE)
+                       else if(type == KILL_TEAM_BLUE)
                        {
                                s = "notify_teamkill_blue";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_DROWN)
+                       else if(type == DEATH_DROWN)
                        {
                                s = "notify_water";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_SLIME)
+                       else if(type == DEATH_SLIME)
                        {
                                s = "notify_slime";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_LAVA)
+                       else if(type == DEATH_LAVA)
                        {
                                s = "notify_lava";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_FALL)
+                       else if(type == DEATH_FALL)
                        {
                                s = "notify_fall";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_SHOOTING_STAR)
+                       else if(type == DEATH_SHOOTING_STAR)
                        {
                                s = "notify_shootingstar";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_HURTTRIGGER || killnotify_deathtype[j] == DEATH_CUSTOM)
+                       else if(type == DEATH_HURTTRIGGER || type == DEATH_CUSTOM)
                        {
                                s = "notify_death";
                        }
-                       else if(killnotify_deathtype[j] == INFO_GOTFLAG)
+                       else if(type == INFO_GOTFLAG)
                        {
                                if(killnotify_victims[j] == "^1RED^7 flag")
                                {
@@ -2182,7 +2178,7 @@ void HUD_Notify (void)
                                        s = "notify_blue_taken";
                                }
                        }
-                       else if(killnotify_deathtype[j] == INFO_RETURNFLAG)
+                       else if(type == INFO_RETURNFLAG)
                        {
                                if(killnotify_victims[j] == "^1RED^7 flag")
                                {
@@ -2193,7 +2189,7 @@ void HUD_Notify (void)
                                        s = "notify_blue_returned";
                                }
                        }
-                       else if(killnotify_deathtype[j] == INFO_LOSTFLAG)
+                       else if(type == INFO_LOSTFLAG)
                        {
                                if(killnotify_victims[j] == "^1RED^7 flag")
                                {
@@ -2204,7 +2200,7 @@ void HUD_Notify (void)
                                        s = "notify_blue_lost";
                                }
                        }
-                       else if(killnotify_deathtype[j] == INFO_CAPTUREFLAG)
+                       else if(type == INFO_CAPTUREFLAG)
                        {
                                if(killnotify_victims[j] == "^1RED^7 flag")
                                {
@@ -2215,11 +2211,11 @@ void HUD_Notify (void)
                                        s = "notify_blue_captured";
                                }
                        }
-                       else if(killnotify_deathtype[j] == KA_DROPBALL)
+                       else if(type == KA_DROPBALL)
                        {
                                s = "notify_balldropped";
                        }
-                       else if(killnotify_deathtype[j] == KA_PICKUPBALL)
+                       else if(type == KA_PICKUPBALL)
                        {
                                s = "notify_ballpickedup";
                        }
@@ -2237,72 +2233,72 @@ void HUD_Notify (void)
                // X [did action to] Y
                else
                {
-                       if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_LASER)
+                       if(type & HITTYPE_SECONDARY && w == WEP_LASER)
                        {
                                s = "notify_melee_laser";
                        }
-                       else if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_SHOTGUN)
+                       else if(type & HITTYPE_SECONDARY && w == WEP_SHOTGUN)
                        {
                                s = "notify_melee_shotgun";
                        }
+                       else if(type & HITTYPE_HEADSHOT && (w == WEP_RIFLE || w == WEP_MINSTANEX)) // all headshot weapons go here
+                       {
+                               s = "notify_headshot";
+                       }
                        else if(WEP_VALID(w))
                        {
                                self = get_weaponinfo(w);
                                s = strcat("weapon", self.netname);
                        }
-                       else if(killnotify_deathtype[j] == KILL_TEAM_RED)
+                       else if(type == KILL_TEAM_RED)
                        {
                                s = "notify_teamkill_red";
                        }
-                       else if(killnotify_deathtype[j] == KILL_TEAM_BLUE)
+                       else if(type == KILL_TEAM_BLUE)
                        {
                                s = "notify_teamkill_red";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_TELEFRAG)
+                       else if(type == DEATH_TELEFRAG)
                        {
                                s = "notify_telefrag";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_DROWN)
+                       else if(type == DEATH_DROWN)
                        {
                                s = "notify_water";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_SLIME)
+                       else if(type == DEATH_SLIME)
                        {
                                s = "notify_slime";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_LAVA)
+                       else if(type == DEATH_LAVA)
                        {
                                s = "notify_lava";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_FALL)
+                       else if(type == DEATH_FALL)
                        {
                                s = "notify_fall";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_SHOOTING_STAR)
+                       else if(type == DEATH_SHOOTING_STAR)
                        {
                                s = "notify_shootingstar";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_HURTTRIGGER || killnotify_deathtype[j] == DEATH_CUSTOM) // DEATH_CUSTOM is also void, right?
+                       else if(type == DEATH_HURTTRIGGER || type == DEATH_CUSTOM) // DEATH_CUSTOM is also void, right?
                        {
                                s = "notify_void";
                        }
-                       else if(killnotify_deathtype[j] == DEATH_HEADSHOT)
-                       {
-                               s = "notify_headshot";
-                       }
-                       else if(killnotify_deathtype[j] == RACE_SERVER_RECORD)
+                       else if(type == RACE_SERVER_RECORD)
                        {
                                s = "race_newrecordserver";
                        }
-                       else if(killnotify_deathtype[j] == RACE_NEW_RANK)
+                       else if(type == RACE_NEW_RANK)
                        {
                                s = "race_newrankyellow";
                        }
-                       else if(killnotify_deathtype[j] == RACE_NEW_TIME)
+                       else if(type == RACE_NEW_TIME)
                        {
                                s = "race_newtime";
                        }
-                       else if(killnotify_deathtype[j] == RACE_FAIL)
+                       else if(type == RACE_FAIL)
                        {
                                s = "race_newfail";
                        }
@@ -2672,7 +2668,7 @@ void HUD_Score(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_score) return;
-               if(spectatee_status == -1 && (gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(spectatee_status == -1 && (gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_SCORE;
@@ -2860,7 +2856,7 @@ void HUD_RaceTimer (void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_racetimer) return;
-               if(!(gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
                if(spectatee_status == -1) return;
        }
        else
@@ -3012,7 +3008,7 @@ float vote_change; // "time" when vote_active changed
 
 void HUD_VoteWindow(void) 
 {
-       if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
+       if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
        {
                vote_active = 1;
                if (autocvar__hud_configure)
@@ -3204,7 +3200,7 @@ void HUD_Mod_CTF(vector pos, vector mySize)
        float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime; // time since the status changed
        float stat_items;
 
-       stat_items = getstati(STAT_ITEMS);
+       stat_items = getstati(STAT_ITEMS, 0, 24);
        redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
        blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
        
@@ -3496,7 +3492,7 @@ void HUD_Mod_Keepaway(vector pos, vector mySize)
        float BLINK_FREQ = 5; 
        float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
        
-       float stat_items = getstati(STAT_ITEMS);
+       float stat_items = getstati(STAT_ITEMS, 0, 24);
        float kaball = (stat_items/IT_KEY1) & 1;
        
        if(kaball != kaball_prevstatus)
@@ -3531,7 +3527,7 @@ void HUD_Mod_NexBall(vector pos, vector mySize)
 {
        float stat_items, nb_pb_starttime, dt, p;
 
-       stat_items = getstati(STAT_ITEMS);
+       stat_items = getstati(STAT_ITEMS, 0, 24);
        nb_pb_starttime = getstatf(STAT_NB_METERSTART);
 
        if (stat_items & IT_KEY1)
@@ -3583,7 +3579,7 @@ void HUD_Mod_Race(vector pos, vector mySize)
 
        // clientside personal record
        string rr;
-       if(gametype == GAME_CTS)
+       if(gametype == MAPINFO_TYPE_CTS)
                rr = CTS_RECORD;
        else
                rr = RACE_RECORD;
@@ -3811,7 +3807,7 @@ void HUD_ModIcons(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_modicons) return;
-               if (gametype != GAME_CTF && gametype != GAME_KEYHUNT && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && gametype != GAME_DOMINATION) return;
+               if (gametype != MAPINFO_TYPE_CTF && gametype != MAPINFO_TYPE_KEYHUNT && gametype != MAPINFO_TYPE_NEXBALL && gametype != MAPINFO_TYPE_CTS && gametype != MAPINFO_TYPE_RACE && gametype != MAPINFO_TYPE_CA && gametype != MAPINFO_TYPE_FREEZETAG && gametype != MAPINFO_TYPE_KEEPAWAY && gametype != MAPINFO_TYPE_DOMINATION) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_MODICONS;
@@ -3842,19 +3838,19 @@ void HUD_ModIcons(void)
        }
 
        // these MUST be ran in order to update mod_active
-       if(gametype == GAME_KEYHUNT)
+       if(gametype == MAPINFO_TYPE_KEYHUNT)
                HUD_Mod_KH(pos, mySize);
-       else if(gametype == GAME_CTF || autocvar__hud_configure)
+       else if(gametype == MAPINFO_TYPE_CTF || autocvar__hud_configure)
                HUD_Mod_CTF(pos, mySize); // forcealpha only needed for ctf icons, as only they are shown in config mode
-       else if(gametype == GAME_NEXBALL)
+       else if(gametype == MAPINFO_TYPE_NEXBALL)
                HUD_Mod_NexBall(pos, mySize);
-       else if(gametype == GAME_CTS || gametype == GAME_RACE)
+       else if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE)
                HUD_Mod_Race(pos, mySize);
-       else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
+       else if(gametype == MAPINFO_TYPE_CA || gametype == MAPINFO_TYPE_FREEZETAG)
                HUD_Mod_CA(pos, mySize);
-       else if(gametype == GAME_DOMINATION)
+       else if(gametype == MAPINFO_TYPE_DOMINATION)
                HUD_Mod_Dom(pos, mySize);
-       else if(gametype == GAME_KEEPAWAY)
+       else if(gametype == MAPINFO_TYPE_KEEPAWAY)
                HUD_Mod_Keepaway(pos, mySize);
 }
 
@@ -4149,9 +4145,9 @@ void HUD_InfoMessages(void)
                        s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey("server info", "+show_info"));
                        drawInfoMessage(s)
 
-                       if(gametype == GAME_ARENA)
+                       if(gametype == MAPINFO_TYPE_ARENA)
                                s = _("^1Wait for your turn to join");
-                       else if(gametype == GAME_LMS)
+                       else if(gametype == MAPINFO_TYPE_LMS)
                        {
                                entity sk;
                                sk = playerslots[player_localnum];
@@ -4212,7 +4208,7 @@ void HUD_InfoMessages(void)
                        drawInfoMessage(s)
                }
 
-               if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
+               if(teamplay && !intermission && !spectatee_status && gametype != MAPINFO_TYPE_CA && teamnagger)
                {
                        float ts_min, ts_max;
                        tm = teams.sort_next;
@@ -4263,7 +4259,7 @@ void HUD_Physics(void)
        {
                if(!autocvar_hud_panel_physics) return;
                if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
-               if(autocvar_hud_panel_physics == 3 && !(gametype == GAME_RACE || gametype == GAME_CTS)) return;
+               if(autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_PHYSICS;
@@ -4787,9 +4783,9 @@ Main HUD system
 void HUD_Reset (void)
 {
        // reset gametype specific icons
-       if(gametype == GAME_KEYHUNT)
+       if(gametype == MAPINFO_TYPE_KEYHUNT)
                HUD_Mod_KH_Reset();
-       else if(gametype == GAME_CTF)
+       else if(gametype == MAPINFO_TYPE_CTF)
                HUD_Mod_CTF_Reset();
 }
 
diff --git a/qcsrc/client/interpolate.qc b/qcsrc/client/interpolate.qc
deleted file mode 100644 (file)
index 3d6a103..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-// FIXME make this generic code, to be used for other entities too?
-.vector iorigin1, iorigin2;
-.vector ivelocity1, ivelocity2;
-.vector iforward1, iforward2;
-.vector iup1, iup2;
-.float itime1, itime2;
-void InterpolateOrigin_Reset()
-{
-       self.iflags &~= IFLAG_INTERNALMASK;
-       self.itime1 = self.itime2 = 0;
-}
-void InterpolateOrigin_Note()
-{
-       float dt;
-       float f0;
-
-       dt = time - self.itime2;
-
-       f0 = self.iflags;
-       if(self.iflags & IFLAG_PREVALID)
-               self.iflags |= IFLAG_VALID;
-       else
-               self.iflags |= IFLAG_PREVALID;
-
-       self.iorigin1 = self.iorigin2;
-       self.iorigin2 = self.origin;
-
-       if(self.iflags & IFLAG_AUTOANGLES)
-               if(self.iorigin2 != self.iorigin1)
-                       self.angles = vectoangles(self.iorigin2 - self.iorigin1);
-
-       if(self.iflags & IFLAG_ANGLES)
-       {
-               fixedmakevectors(self.angles);
-               if(f0 & IFLAG_VALID)
-               {
-                       self.iforward1 = self.iforward2;
-                       self.iup1 = self.iup2;
-               }
-               else
-               {
-                       self.iforward1 = v_forward;
-                       self.iup1 = v_up;
-               }
-               self.iforward2 = v_forward;
-               self.iup2 = v_up;
-       }
-
-       if(self.iflags & IFLAG_VELOCITY)
-       {
-               self.ivelocity1 = self.ivelocity2;
-               self.ivelocity2 = self.velocity;
-       }
-
-       if(vlen(self.iorigin2 - self.iorigin1) > 1000)
-       {
-               self.itime1 = self.itime2 = time; // don't lerp
-       }
-
-       if((self.iflags & IFLAG_VELOCITY) && (vlen(self.ivelocity2 - self.ivelocity1) > 1000))
-       {
-               self.itime1 = self.itime2 = time; // don't lerp
-       }
-
-       if(dt < 0.2)
-       {
-               self.itime1 = serverprevtime;
-               self.itime2 = time;
-       }
-       else
-       {
-               // don't lerp
-               self.itime1 = self.itime2 = time;
-       }
-}
-void InterpolateOrigin_Do()
-{
-       vector forward, up;
-       if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
-       {
-               float f;
-               f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
-               self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2;
-               if(self.iflags & IFLAG_ANGLES)
-               {
-                       forward = (1 - f) * self.iforward1 + f * self.iforward2;
-                       up = (1 - f) * self.iup1 + f * self.iup2;
-                       self.angles = fixedvectoangles2(forward, up);
-               }
-               if(self.iflags & IFLAG_VELOCITY)
-                       self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2;
-       }
-}
-void InterpolateOrigin_Undo()
-{
-       self.origin = self.iorigin2;
-       if(self.iflags & IFLAG_ANGLES)
-               self.angles = fixedvectoangles2(self.iforward2, self.iup2);
-       if(self.iflags & IFLAG_VELOCITY)
-               self.velocity = self.ivelocity2;
-}
-
diff --git a/qcsrc/client/interpolate.qh b/qcsrc/client/interpolate.qh
deleted file mode 100644 (file)
index a048803..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-.float iflags;
-#define IFLAG_VELOCITY 1
-#define IFLAG_ANGLES 2
-#define IFLAG_AUTOANGLES 4
-#define IFLAG_VALID 8
-#define IFLAG_PREVALID 16
-#define IFLAG_INTERNALMASK (IFLAG_VALID | IFLAG_PREVALID)
-
-// call this BEFORE reading an entity update
-void InterpolateOrigin_Undo();
-
-// call this AFTER receiving an entity update
-void InterpolateOrigin_Note();
-
-// call this when the entity got teleported, before InterpolateOrigin_Note
-void InterpolateOrigin_Reset();
-
-// call this BEFORE drawing
-void InterpolateOrigin_Do();
index bd9ffe64c58967841650baf971d1ec65fbad948f..9349d9c5c4ce2bb13be2dba55659580467f4bcf2 100644 (file)
@@ -158,5 +158,3 @@ entity entcs_receiver[255]; // 255 is the engine limit on maxclients
 
 float hud;
 float view_quality;
-
-void cvar_clientsettemp(string cv, string val);
index 0af74018eeb58406ed398d38033ce24773674cad..769b921a43fd39d3fe5bf2937b0505d542561eed 100644 (file)
@@ -280,7 +280,7 @@ void Cmd_MapVote_MapDownload(float argc)
                return;
        } else {
                print(_("Requesting preview...\n"));
-               localcmd(strcat("\ncmd mv_getpic ", ftos(id), "\n"));
+               localcmd(strcat("\ncmd mv_getpicture ", ftos(id), "\n"));
        }
 }
 
index 5ed3ab2e78fc6184186f1d43faeb58e32c0ca096..2bc20e9510f17f1c4513521e9cd9a217dca9933d 100644 (file)
@@ -575,9 +575,15 @@ vector getplayerorigin(float pl)
        string s;
        entity e;
 
+       e = CSQCModel_server2csqc(pl + 1);
+       if(e)
+               return e.origin;
+
+#ifndef NO_LEGACY_NETWORKING
        s = getplayerkeyvalue(pl, "TEMPHACK_origin");
        if(s != "")
                return stov(s);
+#endif
 
        e = entcs_receiver[pl];
        if(e)
index 06b3e8b7b751469e5d126a7aeb22bb9f3cb8e552..a33570a2f9c3291b7402ea61a7d9eb6a39914e9a 100644 (file)
@@ -17,12 +17,17 @@ Defs.qc
 ../common/util.qh
 ../common/items.qh
 ../common/explosion_equation.qh
-
 ../common/mapinfo.qh
+../common/command/markup.qh
+../common/command/rpn.qh
+../common/command/generic.qh
+../common/command/shared_defs.qh
+
+command/cl_cmd.qh
 
 autocvars.qh
 
-interpolate.qh
+../csqcmodellib/interpolate.qh
 teamradar.qh
 hud.qh
 scoreboard.qh
@@ -37,6 +42,11 @@ tturrets.qh
 ../server/movelib.qc
 main.qh
 vehicles/vehicles.qh
+../common/csqcmodel_settings.qh
+../csqcmodellib/common.qh
+../csqcmodellib/cl_model.qh
+../csqcmodellib/cl_player.qh
+projectile.qh
 
 sortlist.qc
 miscfunctions.qc
@@ -47,6 +57,7 @@ hud_config.qc
 hud.qc
 scoreboard.qc
 mapvoting.qc
+csqcmodel_hooks.qc
 
 rubble.qc
 hook.qc
@@ -56,6 +67,8 @@ projectile.qc
 gibs.qc
 damage.qc
 casings.qc
+../csqcmodellib/cl_model.qc
+../csqcmodellib/cl_player.qc
 effects.qc
 wall.qc
 modeleffects.qc
@@ -69,7 +82,7 @@ shownames.qc
 announcer.qc
 Main.qc
 View.qc
-interpolate.qc
+../csqcmodellib/interpolate.qc
 waypointsprites.qc
 movetypes.qc
 prandom.qc
@@ -77,12 +90,16 @@ bgmscript.qc
 noise.qc
 
 ../common/util.qc
-../common/gamecommand.qc
+../common/command/markup.qc
+../common/command/rpn.qc
+../common/command/generic.qc
 ../common/mapinfo.qc
 ../common/items.qc
 ../server/w_all.qc
 ../common/explosion_equation.qc
 
+command/cl_cmd.qc
+
 ../warpzonelib/anglestransform.qc
 ../warpzonelib/mathlib.qc
 ../warpzonelib/common.qc
index 426ef78250a6d49909e36dafb3a71a5096e6483f..85d5aedcb5f0bd7f638ff4517342c4bfa6bf30a6 100644 (file)
@@ -20,7 +20,6 @@ void SUB_Stop()
 .float gravity;
 .float snd_looping;
 .float silent;
-.float traileffect;
 
 void Projectile_ResetTrail(vector to)
 {
diff --git a/qcsrc/client/projectile.qh b/qcsrc/client/projectile.qh
new file mode 100644 (file)
index 0000000..70c8ba0
--- /dev/null
@@ -0,0 +1,3 @@
+.float traileffect;
+void Projectile_ResetTrail(vector to);
+void Projectile_DrawTrail(vector to);
index 3124b4b9b4d68056f968c4ca87f15c993edf8c99..05c8df88cfc68f767c1eb268bab64044dc9ef4fa 100644 (file)
@@ -234,7 +234,7 @@ void HUD_UpdateTeamPos(entity Team)
        }
 }
 
-void Cmd_HUD_Help(float argc)
+void Cmd_HUD_Help()
 {
        print(_("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"));
        print(_("^3|---------------------------------------------------------------|\n"));
@@ -308,17 +308,17 @@ void Cmd_HUD_SetFields(float argc)
        float missing;
 
        // TODO: re enable with gametype dependant cvars?
-       if(argc < 2) // no arguments provided
+       if(argc < 3) // no arguments provided
                argc = tokenizebyseparator(strcat("x ", autocvar_scoreboard_columns), " ");
 
-       if(argc < 2)
+       if(argc < 3)
                argc = tokenizebyseparator(strcat("x ", HUD_DefaultColumnLayout()), " ");
 
-       if(argc == 2)
+       if(argc == 3)
        {
-               if(argv(1) == "default")
+               if(argv(2) == "default")
                        argc = tokenizebyseparator(strcat("x ", HUD_DefaultColumnLayout()), " ");
-               else if(argv(1) == "all")
+               else if(argv(2) == "all")
                {
                        string s;
                        s = "ping pl color name |";
@@ -924,7 +924,7 @@ float HUD_WouldDrawScoreboard() {
                return 1;
        else if (intermission == 2)
                return 0;
-       else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS)
+       else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS)
                return 1;
        else if (scoreboard_showscores_force)
                return 1;
@@ -1263,7 +1263,7 @@ void HUD_DrawScoreboard()
                }
        }
 
-       if(gametype == GAME_CTS || gametype == GAME_RACE) {
+       if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE) {
                if(race_speedaward) {
                        drawcolorcodedstring(pos, sprintf(_("Speed award: %d ^7(%s^7)"), race_speedaward, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                        pos_y += 1.25 * hud_fontsize_y;
@@ -1312,7 +1312,7 @@ void HUD_DrawScoreboard()
        tl = getstatf(STAT_TIMELIMIT);
        fl = getstatf(STAT_FRAGLIMIT);
        ll = getstatf(STAT_LEADLIMIT);
-       if(gametype == GAME_LMS)
+       if(gametype == MAPINFO_TYPE_LMS)
        {
                if(tl > 0)
                        str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl));
index 89f1be7fa826d008d2cf2795408a3385ee37e375..2b9ec0297b2ef63411d210cc8a8597bc8438691f 100644 (file)
@@ -604,6 +604,9 @@ void ent_turret()
     
     if(sf & TNSF_ANG)
     {
+        if(self.tur_head == world) // aparenly this can happpen before TNSF_SETUP. great.
+            self.tur_head = spawn();
+            
         self.tur_head.move_angles_x = ReadShort();
         self.tur_head.move_angles_y = ReadShort();
         //self.tur_head.angles = self.angles + self.tur_head.move_angles;
@@ -612,6 +615,9 @@ void ent_turret()
     
     if(sf & TNSF_AVEL)
     {
+        if(self.tur_head == world) // aparenly this can happpen before TNSF_SETUP. great.
+            self.tur_head = spawn();
+            
         self.tur_head.move_avelocity_x = ReadShort();
         self.tur_head.move_avelocity_y = ReadShort();            
     }
@@ -643,7 +649,7 @@ void ent_turret()
     if(sf & TNSF_STATUS)
     {
         float _tmp;
-        _tmp = ReadByte();        
+        _tmp = ReadByte();
         if(_tmp != self.team)
         {            
             self.team = _tmp;                
index 6d9b0ee8bd7fee0f2112cf77686f6a25111dce6b..78ddc8b793c22f4b080100ace1df2a94538979be 100644 (file)
@@ -216,7 +216,7 @@ float spritelookupblinkvalue(string s)
                case "item-extralife":   return 2;
                case "item-speed":       return 2;
                case "item-strength":    return 2;
-               case "item-shueld":      return 2;
+               case "item-shield":      return 2;
                case "item-fuelregen":   return 2;
                case "item-jetpack":     return 2;
                case "tagged-target":    return 2;
index 3aae078adbf3431be6a8f57d45bde85eee207cd9..525b2856d45e661c73aaae69d329ff3495daad42 100644 (file)
@@ -8,5 +8,5 @@ void CampaignSetup(float n)
                localcmd(ftos(campaign_offset + n));
                localcmd("\n");
        localcmd("disconnect\nmaxplayers 16\n");
-       MapInfo_LoadMap(campaign_mapname[n]);
+       MapInfo_LoadMap(campaign_mapname[n], 1);
 }
diff --git a/qcsrc/common/command/generic.qc b/qcsrc/common/command/generic.qc
new file mode 100644 (file)
index 0000000..8cf7f5a
--- /dev/null
@@ -0,0 +1,492 @@
+// =========================================================
+//  Generic program common command code, written by Samual
+//  Last updated: December 28th, 2011
+// =========================================================
+
+// used by generic commands for better help/usage information
+string GetProgramCommandPrefix(void)
+{
+       #ifdef SVQC
+       return "sv_cmd";
+       #endif
+       #ifdef CSQC
+       return "cl_cmd";
+       #endif
+       #ifdef MENUQC
+       return "menu_cmd";
+       #endif
+}
+
+
+// =======================
+//  Command Sub-Functions
+// =======================
+
+void GenericCommand_addtolist(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float i;
+                       
+                       if(argc >= 2)
+                       {
+                               string original_cvar = argv(1);
+                               string tmp_string = argv(2);
+                               
+                               if(cvar_string(original_cvar) == "") // cvar was empty
+                               {
+                                       cvar_set(original_cvar, tmp_string);
+                               }
+                               else // add it to the end of the list if the list doesn't already have it
+                               {
+                                       argc = tokenizebyseparator(cvar_string(original_cvar), " ");
+                                       
+                                       for(i = 0; i < argc; ++i)
+                                               if(argv(i) == tmp_string)
+                                                       return; // already in list
+                                                       
+                                       cvar_set(original_cvar, strcat(tmp_string, " ", cvar_string(original_cvar)));
+                               }
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2addtolist^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " addtolist variable value"));
+                       print("  Where 'variable' is what to add 'value' to.\n");
+                       print("See also: ^2removefromlist^7\n");
+                       return;
+               }
+       }
+}
+
+void GenericCommand_dumpcommands(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float fh;
+                       string filename = strcat(GetProgramCommandPrefix(), "_dump.txt");
+                       fh = fopen(filename, FILE_WRITE);
+                       
+                       if(fh >= 0)
+                       {
+                               #ifdef SVQC
+                                       CMD_Write("dump of server console commands:\n");
+                                       GameCommand_macro_write_aliases(fh);
+                                       
+                                       CMD_Write("\ndump of networked client only commands:\n");
+                                       ClientCommand_macro_write_aliases(fh);
+                                       
+                                       CMD_Write("\ndump of common commands:\n");
+                                       CommonCommand_macro_write_aliases(fh);
+
+                                       CMD_Write("\ndump of ban commands:\n");
+                                       BanCommand_macro_write_aliases(fh);
+                               #endif
+                                                               
+                               #ifdef CSQC
+                                       CMD_Write("dump of client commands:\n");
+                                       LocalCommand_macro_write_aliases(fh);
+                               #endif
+                               
+                               CMD_Write("\ndump of generic commands:\n");
+                               GenericCommand_macro_write_aliases(fh);
+                               
+                               print("Completed dump of aliases in ^2data/data/", GetProgramCommandPrefix(), "_dump.txt^7.\n");
+                               
+                               fclose(fh);
+                       }
+                       else
+                       {
+                               print("^1Error: ^7Could not dump to file!\n");
+                       }
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpcommands"));
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void GenericCommand_maplist(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       string tmp_string;
+                       float i;
+                       
+                       switch(argv(1))
+                       {
+                               case "add": // appends new maps to the maplist
+                               {
+                                       if(argc == 3)
+                                       {
+                                               if (!fexists(strcat("maps/", argv(2), ".bsp")))
+                                               {
+                                                       print("maplist: ERROR: ", argv(2), " does not exist!\n");
+                                                       break;
+                                               }
+                                               
+                                               if(cvar_string("g_maplist") == "")
+                                                       cvar_set("g_maplist", argv(2));
+                                               else
+                                                       cvar_set("g_maplist", strcat(argv(2), " ", cvar_string("g_maplist")));
+                                                       
+                                               return;
+                                       }
+                                       break; // go to usage
+                               }
+                               
+                               case "cleanup": // scans maplist and only adds back the ones which are really usable
+                               {
+                                       MapInfo_Enumerate();
+                                       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+                                       argc = tokenizebyseparator(cvar_string("g_maplist"), " ");
+                                       
+                                       for(i = 0; i < argc; ++i)
+                                               if(MapInfo_CheckMap(argv(i)))
+                                                       tmp_string = strcat(tmp_string, " ", argv(i));
+                                                       
+                                       tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1);
+                                       cvar_set("g_maplist", tmp_string);
+                                       
+                                       return;
+                               }
+                               
+                               case "remove": // scans maplist and only adds back whatever maps were not provided in argv(2)
+                               {
+                                       if(argc == 3)
+                                       {
+                                               argc = tokenizebyseparator(cvar_string("g_maplist"), " ");
+                                               
+                                               for(i = 0; i < argc; ++i)
+                                                       if(argv(i) != argv(2))
+                                                               tmp_string = strcat(tmp_string, " ", argv(i));
+                                                               
+                                               tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1);
+                                               cvar_set("g_maplist", tmp_string);
+                                               
+                                               return;
+                                       }
+                                       break; // go to usage
+                               }
+                               
+                               case "shuffle": // randomly shuffle the maplist
+                               {
+                                       cvar_set("g_maplist", shufflewords(cvar_string("g_maplist")));
+                                       return;
+                               }
+                                       
+                               default: break;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2maplist^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " maplist action [map]"));
+                       print("  Where 'action' is the command to complete,\n");
+                       print("  and 'map' is what it acts upon (if required).\n");
+                       print("  Full list of commands here: \"add, cleanup, remove, shuffle.\"\n");
+                       return;
+               }
+       }
+}
+
+void GenericCommand_removefromlist(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc == 3)
+                       {
+                               float i;
+                               string original_cvar = argv(1);
+                               string removal = argv(2);
+                               string tmp_string;
+                               
+                               argc = tokenizebyseparator(cvar_string(original_cvar), " ");
+                               
+                               for(i = 0; i < argc; ++i)
+                                       if(argv(i) != removal)
+                                               tmp_string = strcat(tmp_string, " ", argv(i));
+                                               
+                               tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1);
+                               cvar_set(original_cvar, tmp_string);
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2removefromlist^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " removefromlist variable value"));
+                       print("  Where 'variable' is what cvar to remove 'value' from.\n");
+                       print("See also: ^2addtolist^7\n");
+                       return;
+               }
+       }
+}
+
+void GenericCommand_settemp(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 3)
+                       {
+                               if(cvar_settemp(argv(1), argv(2)))
+                                       dprint("Creating new settemp tracker for ", argv(1), " and setting it to \"", argv(2), "\" temporarily.\n"); 
+                               else
+                                       dprint("Already had a tracker for ", argv(1), ", updating it to \"", argv(2), "\".\n");
+                       
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2settemp^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp \"cvar\" \"arguments\"\n"));
+                       print("  Where 'cvar' is the cvar you want to temporarily set with 'arguments'.\n");
+                       print("See also: ^2settemp_restore^7\n");
+                       return;
+               }
+       }
+}
+
+void GenericCommand_settemp_restore(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float i = cvar_settemp_restore();
+                       
+                       if(i)
+                               dprint("Restored ", ftos(i), " temporary cvar settings to their original values.\n");
+                       else
+                               dprint("Nothing to restore.\n");
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp_restore\n"));
+                       print("  No arguments required.\n");
+                       print("See also: ^2settemp^7\n");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void GenericCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " "));
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+*/
+
+// ==================================
+//  Macro system for server commands
+// ==================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+#define GENERIC_COMMANDS(request,arguments,command) \
+       GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \
+       GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \
+       GENERIC_COMMAND("maplist", GenericCommand_maplist(request, arguments), "Automatic control of maplist") \
+       GENERIC_COMMAND("removefromlist", GenericCommand_removefromlist(request, arguments), "Remove a string from a cvar") \
+       GENERIC_COMMAND("rpn", GenericCommand_rpn(request, arguments, command), "RPN calculator") \
+       GENERIC_COMMAND("settemp", GenericCommand_settemp(request, arguments), "Temporarily set a value to a cvar which is restored later") \
+       GENERIC_COMMAND("settemp_restore", GenericCommand_settemp_restore(request, arguments), "Restore all cvars set by settemp command") \
+       /* nothing */
+
+void GenericCommand_macro_help()
+{
+       #define GENERIC_COMMAND(name,function,description) \
+               { print("  ^2", name, "^7: ", description, "\n"); }
+               
+       GENERIC_COMMANDS(0, 0, "")
+       #undef GENERIC_COMMAND
+       
+       return;
+}
+
+float GenericCommand_macro_command(float argc, string command)
+{
+       #define GENERIC_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       GENERIC_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
+       #undef GENERIC_COMMAND
+       
+       return FALSE;
+}
+
+float GenericCommand_macro_usage(float argc)
+{
+       #define GENERIC_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       GENERIC_COMMANDS(CMD_REQUEST_USAGE, argc, "")
+       #undef GENERIC_COMMAND
+       
+       return FALSE;
+}
+
+void GenericCommand_macro_write_aliases(float fh)
+{
+       #define GENERIC_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_svmenu", name, description); }
+       
+       GENERIC_COMMANDS(0, 0, "")
+       #undef GENERIC_COMMAND
+       
+       return;
+}
+       
+
+// ===========================================
+//  Main Common Function For Generic Commands
+// ===========================================
+// Commands spread out among all programs (menu, client, and server) 
+
+float GenericCommand(string command)
+{
+       float argc = tokenize_console(command);
+       float n, j, f, i;
+       string s, s2, c;
+       vector rgb;
+
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+       
+       if(GenericCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
+       {
+               return TRUE; // handled by one of the above GenericCommand_* functions
+       }
+       else if(argc >= 3 && argv(0) == "red")
+       {
+               s = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
+               localcmd(strcat(argv(1), " ", GenericCommand_markup(s)));
+               return TRUE;
+       }
+       else if(argc >= 3 && crc16(0, argv(0)) == 38566 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 59830)
+       {
+               // other test case
+               s = strconv(2, 0, 0, substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
+
+               n = floor(random() * 6 + 2);
+
+               s2 = "";
+               for(i = 0; i < n; ++i)
+               {
+                       s2 = strcat(s2, "AH");
+               }
+
+               if(random() < 0.1)
+                       s2 = strcat(substring(s2, 1, strlen(s2) - 1), "A");
+
+               if(s == "")
+                       s = s2;
+               else
+                       if(random() < 0.8)
+                               s = strcat(s, " ", s2);
+                       else
+                               s = strcat(s2, " ", s);
+
+               s2 = substring(s, strlen(s) - 2, 2);
+               if(s2 == "AH" || s2 == "AY")
+                       s = strcat(s, "))");
+               else
+                       s = strcat(s, " ))");
+
+               if(random() < 0.1)
+                       s = substring(s, 0, strlen(s) - 1);
+
+               if(random() < 0.1)
+                       s = strconv(1, 0, 0, s);
+
+               localcmd(strcat(argv(1), " ", s));
+
+               return TRUE;
+       }
+       else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55790)
+       {
+               // test case for terencehill's color codes
+               s = strdecolorize(substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
+               s2 = "";
+               
+               n = strlen(s);
+               j = ((6 * max(1, floor(strlen(s)/32 + random() * 2 - 1))) / n) * (1 - 2 * (random() > 0.5));
+               f = random() * 6;
+
+               for(i = 0; i < n; ++i)
+               {
+                       c = substring(s, i, 1);
+
+                       if(c == ";")
+                               c = ":";
+                       else if(c == "^")
+                       {
+                               c = "^^";
+                               if(substring(s, i+1, 1) == "^")
+                                       ++i;
+                       }
+
+                       if(c != " ")
+                       {
+                               rgb = hsl_to_rgb('1 0 0' * (j * i + f) + '0 1 .5');
+                               c = strcat(rgb_to_hexcolor(rgb), c);
+                       }
+                       s2 = strcat(s2, c);
+               }
+
+               localcmd(strcat(argv(1), " ", s2));
+
+               return TRUE;
+       }
+
+       return FALSE;
+}
diff --git a/qcsrc/common/command/generic.qh b/qcsrc/common/command/generic.qh
new file mode 100644 (file)
index 0000000..3078a0f
--- /dev/null
@@ -0,0 +1,17 @@
+// =========================================================
+//  Declarations for common command code, written by Samual
+//  Last updated: December 28th, 2011
+// =========================================================
+
+// Used by other game command systems for common commands,
+// and it returns true if handled, false if not. 
+// Note: It tokenizes its input, so be careful!
+float GenericCommand(string command);
+
+// Returns command prefix specific for whatever program it is compiled in
+string GetProgramCommandPrefix(void); 
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+#define CMD_Write(s) fputs(fh, s)
+#define CMD_Write_Alias(execute,command,description) CMD_Write(sprintf("alias %-20s \"%-13s %-20s ${* ?}\" // %s\n", command, execute, command, description))
+void GenericCommand_macro_write_aliases(float fh);
\ No newline at end of file
diff --git a/qcsrc/common/command/markup.qc b/qcsrc/common/command/markup.qc
new file mode 100644 (file)
index 0000000..cb1a8cc
--- /dev/null
@@ -0,0 +1,111 @@
+// =========================================================
+//  Markup chat characters command code, reworked by Samual
+//  Last updated: December 28th, 2011
+// =========================================================
+
+void GenericCommand_markup_init()
+{
+       float i;
+       if (markup_init)
+               return;
+       markup_init = 1;
+       i = 0;
+       markup_from[i] = "&alien"; markup_to[i] = "\x12"; ++i;
+       markup_from[i] = "&:-)"; markup_to[i] = "\x13"; ++i;
+       markup_from[i] = "&:-("; markup_to[i] = "\x14"; ++i;
+       markup_from[i] = "&x-P"; markup_to[i] = "\x15"; ++i;
+       markup_from[i] = "&:-/"; markup_to[i] = "\x16"; ++i;
+       markup_from[i] = "&:-D"; markup_to[i] = "\x17"; ++i;
+       markup_from[i] = "&<<"; markup_to[i] = "\x18"; ++i;
+       markup_from[i] = "&>>"; markup_to[i] = "\x19"; ++i;
+       markup_from[i] = "&dot"; markup_to[i] = "\x1a"; ++i;
+       markup_from[i] = "&^_"; markup_to[i] = "\x1b"; ++i;
+       markup_from[i] = "&ysplat"; markup_to[i] = "\x1c"; ++i;
+       markup_from[i] = "&-]"; markup_to[i] = "\x1d"; ++i;
+       markup_from[i] = "&--"; markup_to[i] = "\x1e"; ++i;
+       markup_from[i] = "&[-"; markup_to[i] = "\x1f"; ++i;
+       markup_from[i] = "&s<"; markup_to[i] = "\x2c"; ++i;
+       markup_from[i] = "&s>"; markup_to[i] = "\x2e"; ++i;
+       markup_from[i] = "&<-"; markup_to[i] = "\x7f"; ++i;
+       markup_from[i] = "&[="; markup_to[i] = "\x80"; ++i;
+       markup_from[i] = "&=="; markup_to[i] = "\x81"; ++i;
+       markup_from[i] = "&=]"; markup_to[i] = "\x82"; ++i;
+       markup_from[i] = "&r!"; markup_to[i] = "\x84"; ++i;
+       markup_from[i] = "&|o|"; markup_to[i] = "\x85"; ++i;
+       markup_from[i] = "&|u|"; markup_to[i] = "\x86"; ++i;
+       markup_from[i] = "&|i|"; markup_to[i] = "\x87"; ++i;
+       markup_from[i] = "&|c|"; markup_to[i] = "\x88"; ++i;
+       markup_from[i] = "&[c]"; markup_to[i] = "\x89"; ++i;
+       markup_from[i] = "&[n]"; markup_to[i] = "\x8a"; ++i;
+       markup_from[i] = "&[]"; markup_to[i] = "\x8b"; ++i;
+       markup_from[i] = "&r?"; markup_to[i] = "\x8c"; ++i;
+       markup_from[i] = "&|>"; markup_to[i] = "\x8d"; ++i;
+       markup_from[i] = "&splat0"; markup_to[i] = "\x8e"; ++i;
+       markup_from[i] = "&splat1"; markup_to[i] = "\x8f"; ++i;
+       markup_from[i] = "&[["; markup_to[i] = "\x90"; ++i;
+       markup_from[i] = "&]]"; markup_to[i] = "\x91"; ++i;
+       markup_from[i] = "&splat2"; markup_to[i] = "\x9a"; ++i;
+       markup_from[i] = "&)("; markup_to[i] = "\x9b"; ++i;
+       markup_from[i] = "&splat3"; markup_to[i] = "\x9c"; ++i;
+       markup_from[i] = "&(."; markup_to[i] = "\x9d"; ++i;
+       markup_from[i] = "&.."; markup_to[i] = "\x9e"; ++i;
+       markup_from[i] = "&.)"; markup_to[i] = "\x9f"; ++i;
+       markup_from[i] = "&<|"; markup_to[i] = "\xff"; ++i;
+}
+
+string GenericCommand_markup(string s2)
+{
+       float red, ccase, i, j;
+       string s, s3;
+
+       GenericCommand_markup_init();
+
+       s = "";
+
+       red = 0;
+       ccase = 0;
+       for(i = 0; i < strlen(s2); ++i)
+       {
+               for(j = 0; j < NUM_MARKUPS; ++j)
+               {
+                       s3 = substring(s2, i, strlen(markup_from[j]));
+                       if (s3 == markup_from[j])
+                       {
+                               s = strcat(s, markup_to[j]);
+                               i += strlen(markup_from[j]) - 1;
+                               break;
+                       }
+               }
+
+               if(j == NUM_MARKUPS)
+               {
+                       if(substring(s2, i, 2) == "&&")
+                       {
+                               s = strcat(s, strconv(ccase, red, red, "&"));
+                               ++i;
+                       }
+                       else if(substring(s2, i, 2) == "&d")
+                       {
+                               red = 2;
+                               ccase = 0;
+                               ++i;
+                       }
+                       else if(substring(s2, i, 2) == "&a")
+                       {
+                               red = 2;
+                               ccase = 2;
+                               ++i;
+                       }
+                       else if(substring(s2, i, 2) == "&n")
+                       {
+                               red = 0;
+                               ccase = 0;
+                               ++i;
+                       }
+                       else
+                               s = strcat(s, strconv(ccase, red, red, substring(s2, i, 1)));
+               }
+       }
+
+       return s;
+}
diff --git a/qcsrc/common/command/markup.qh b/qcsrc/common/command/markup.qh
new file mode 100644 (file)
index 0000000..6cf09d3
--- /dev/null
@@ -0,0 +1,9 @@
+// ==========================================================
+//  Declarations for markup command code, reworked by Samual
+//  Last updated: December 28th, 2011
+// ==========================================================
+
+#define NUM_MARKUPS    41
+float markup_init;
+string markup_from[NUM_MARKUPS];
+string markup_to[NUM_MARKUPS];
diff --git a/qcsrc/common/command/rpn.qc b/qcsrc/common/command/rpn.qc
new file mode 100644 (file)
index 0000000..d6c624b
--- /dev/null
@@ -0,0 +1,559 @@
+// ========================================
+//  RPN command code, written by divVerent
+//  Last updated: December 28th, 2011
+// ========================================
+
+string rpn_pop() 
+{
+       if(rpn_sp > 0) {
+               --rpn_sp;
+               return rpn_stack[rpn_sp];
+       } else {
+               print("rpn: stack underflow\n");
+               rpn_error = TRUE;
+               return "";
+       }
+}
+void rpn_push(string s) 
+{
+       if(rpn_sp < MAX_RPN_STACK) {
+               rpn_stack[rpn_sp] = s;
+               ++rpn_sp;
+       } else {
+               print("rpn: stack overflow\n");
+               rpn_error = TRUE;
+       }
+}
+string rpn_get() 
+{
+       if(rpn_sp > 0) {
+               return rpn_stack[rpn_sp - 1];
+       } else {
+               print("rpn: empty stack\n");
+               rpn_error = TRUE;
+               return "";
+       }
+}
+void rpn_set(string s) 
+{
+       if(rpn_sp > 0) {
+               rpn_stack[rpn_sp - 1] = s;
+       } else {
+               print("rpn: empty stack\n");
+               rpn_error = TRUE;
+       }
+}
+
+float rpn_getf() { return stof(rpn_get()); }
+float rpn_popf() { return stof(rpn_pop()); }
+void rpn_pushf(float f) { return rpn_push(ftos(f)); }
+void rpn_setf(float f) { return rpn_set(ftos(f)); }
+
+void GenericCommand_rpn(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float i, j, f, n, f2, f3, rpnpos;
+                       vector rgb;
+                       string s, s2, c, rpncmd;
+                       
+                       if(!rpn_db)
+                       {
+                               rpn_db = db_create();
+                               db_put(rpn_db, "stack.pointer", "0");
+                               db_put(rpn_db, "stack.pos", "-1");
+                       }
+                       
+                       if(argc >= 2)
+                       {
+                               rpn_sp = 0;
+                               rpn_error = FALSE;
+                               for(rpnpos = 1; rpnpos < argc; ++rpnpos)
+                               {
+                                       rpncmd = argv(rpnpos);
+                                       f = strlen(rpncmd);
+                                       if(rpncmd == "") {
+                                       } else if(stof(substring(rpncmd, 0, 1)) > 0) {
+                                               rpn_push(rpncmd);
+                                       } else if(substring(rpncmd, 0, 1) == "0") {
+                                               rpn_push(rpncmd);
+                                       } else if(f >= 2 && substring(rpncmd, 0, 1) == "+") {
+                                               rpn_push(rpncmd);
+                                       } else if(f >= 2 && substring(rpncmd, 0, 1) == "-") {
+                                               rpn_push(rpncmd);
+                                       } else if(f >= 2 && substring(rpncmd, 0, 1) == "/") {
+                                               rpn_push(substring(rpncmd, 1, strlen(rpncmd) - 1));
+                                       } else if(rpncmd == "clear") {
+                                               rpn_sp = 0;
+                                       } else if(rpncmd == "def" || rpncmd == "=") {
+                                               s = rpn_pop();
+                                               s2 = rpn_pop();
+
+                                               if(s2 != "")
+                                               {
+                                                       #ifdef MENUQC
+                                                       registercvar(s2, "", 0);
+                                                       #else
+                                                       registercvar(s2, "");
+                                                       #endif
+                                                       if(!rpn_error) // don't change cvars if a stack error had happened!
+                                                               cvar_set(s2, s);
+                                               }
+                                               else
+                                               {
+                                                       print("rpn: empty cvar name for 'def'\n");
+                                                       rpn_error = TRUE;
+                                               }
+                                       } else if(rpncmd == "defs" || rpncmd == "@") {
+                                               s = "";
+                                               i = rpn_popf();
+                                               j = (i == 0);
+                                               while(rpn_sp > 1 && (j || i > 0))
+                                               {
+                                                       s = strcat("/", rpn_pop(), " ", s);
+                                                       --i;
+                                               }
+                                               s2 = rpn_pop();
+                                               if(s2 != "")
+                                               {
+                                                       #ifdef MENUQC
+                                                       registercvar(s2, "", 0);
+                                                       #else
+                                                       registercvar(s2, "");
+                                                       #endif
+                                                       if(!rpn_error) // don't change cvars if a stack error had happened!
+                                                               cvar_set(s2, s);
+                                               }
+                                               else
+                                               {
+                                                       print("rpn: empty cvar name for 'defs'\n");
+                                                       rpn_error = TRUE;
+                                               }
+                                       } else if(rpncmd == "load") {
+                                               rpn_set(cvar_string(rpn_get()));
+                                       } else if(rpncmd == "exch") {
+                                               s = rpn_pop();
+                                               s2 = rpn_get();
+                                               rpn_set(s);
+                                               rpn_push(s2);
+                                       } else if(rpncmd == "dup") {
+                                               rpn_push(rpn_get());
+                                       } else if(rpncmd == "pop") {
+                                               rpn_pop();
+                                       } else if(rpncmd == "add" || rpncmd == "+") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() + f);
+                                       } else if(rpncmd == "sub" || rpncmd == "-") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() - f);
+                                       } else if(rpncmd == "mul" || rpncmd == "*") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() * f);
+                                       } else if(rpncmd == "div" || rpncmd == "/") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() / f);
+                                       } else if(rpncmd == "mod" || rpncmd == "%") {
+                                               f = rpn_popf();
+                                               f2 = rpn_getf();
+                                               rpn_setf(f2 - f * floor(f2 / f));
+                                       } else if(rpncmd == "abs") {
+                                               rpn_setf(fabs(rpn_getf()));
+                                       } else if(rpncmd == "sgn") {
+                                               f = rpn_getf();
+                                               if(f < 0)
+                                                       rpn_set("-1");
+                                               else if(f > 0)
+                                                       rpn_set("1");
+                                               else
+                                                       rpn_set("0");
+                                       } else if(rpncmd == "neg" || rpncmd == "~") {
+                                               rpn_setf(-rpn_getf());
+                                       } else if(rpncmd == "floor" || rpncmd == "f") {
+                                               rpn_setf(floor(rpn_getf()));
+                                       } else if(rpncmd == "ceil" || rpncmd == "c") {
+                                               rpn_setf(ceil(rpn_getf()));
+                                       } else if(rpncmd == "max") {
+                                               f = rpn_popf();
+                                               f2 = rpn_getf();
+                                               rpn_setf(max(f2, f));
+                                       } else if(rpncmd == "min") {
+                                               f = rpn_popf();
+                                               f2 = rpn_getf();
+                                               rpn_setf(min(f2, f));
+                                       } else if(rpncmd == "bound") {
+                                               f = rpn_popf();
+                                               f2 = rpn_popf();
+                                               f3 = rpn_getf();
+                                               rpn_setf(bound(f3, f2, f));
+                                       } else if(rpncmd == "when") {
+                                               f = rpn_popf();
+                                               f2 = rpn_popf();
+                                               f3 = rpn_getf();
+                                               if(f)
+                                                       rpn_setf(f3);
+                                               else
+                                                       rpn_setf(f2);
+                                       } else if(rpncmd == ">" || rpncmd == "gt") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() > f);
+                                       } else if(rpncmd == "<" || rpncmd == "lt") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() < f);
+                                       } else if(rpncmd == "==" || rpncmd == "eq") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() == f);
+                                       } else if(rpncmd == ">=" || rpncmd == "ge") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() >= f);
+                                       } else if(rpncmd == "<=" || rpncmd == "le") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() <= f);
+                                       } else if(rpncmd == "!=" || rpncmd == "ne") {
+                                               f = rpn_popf();
+                                               rpn_setf(rpn_getf() != f);
+                                       } else if(rpncmd == "rand") {
+                                               rpn_setf(ceil(random() * rpn_getf()) - 1);
+                                       } else if(rpncmd == "crc16") {
+                                               rpn_setf(crc16(FALSE, rpn_get()));
+                                       } else if(rpncmd == "put") {
+                                               s2 = rpn_pop();
+                                               if (!rpn_error)
+                                               {
+                                                       s = rpn_pop();
+                                                       if (!rpn_error)
+                                                               db_put(rpn_db, s, s2);
+                                               }
+                                       } else if(rpncmd == "get") {
+                                               s = rpn_pop();
+                                               if (!rpn_error)
+                                                       rpn_push(db_get(rpn_db, s));
+                                       } else if(rpncmd == "dbpush") {
+                                               s = rpn_pop();
+                                               if(!rpn_error)
+                                               {
+                                                       i = stof(db_get(rpn_db, "stack.pointer"));
+                                                       db_put(rpn_db, "stack.pointer", ftos(i+1));
+                                                       db_put(rpn_db, strcat("stack.", ftos(i)), s);
+                                               }
+                                               if(!i)
+                                                       db_put(rpn_db, "stack.pos", "0");
+                                       } else if(rpncmd == "dbpop") {
+                                               i = stof(db_get(rpn_db, "stack.pointer"));
+                                               if(i)
+                                               {
+                                                       s = ftos(i-1);
+                                                       db_put(rpn_db, "stack.pointer", s);
+                                                       rpn_push(db_get(rpn_db, strcat("stack.", s)));
+                                                       j = stof(db_get(rpn_db, "stack.pos"));
+                                                       if(j >= i)
+                                                               db_put(rpn_db, "stack.pos", ftos(i-2));
+                                               } else {
+                                                       rpn_error = 1;
+                                                       print("rpn: database underflow\n");
+                                               }
+                                       } else if(rpncmd == "dbget") {
+                                               
+                                               i = stof(db_get(rpn_db, "stack.pointer"));
+                                               if(i)
+                                               {
+                                                       rpn_push(db_get(rpn_db, strcat("stack.", ftos(i-1))));
+                                               } else {
+                                                       rpn_error = 1;
+                                                       print("rpn: database empty\n");
+                                               }
+                                       } else if(rpncmd == "dblen") {
+                                               rpn_push(db_get(rpn_db, "stack.pointer"));
+                                       } else if(rpncmd == "dbclr") {
+                                               db_close(rpn_db);
+                                               rpn_db = db_create();
+                                               db_put(rpn_db, "stack.pointer", "0");
+                                               db_put(rpn_db, "stack.pos", "-1");
+                                       } else if(rpncmd == "dbsave") {
+                                               s = rpn_pop();
+                                               if(!rpn_error)
+                                                       db_save(rpn_db, s);
+                                       } else if(rpncmd == "dbload") {
+                                               s = rpn_pop();
+                                               if(!rpn_error)
+                                               {
+                                                       db_close(rpn_db);
+                                                       rpn_db = db_load(s);
+                                               }
+                                       } else if(rpncmd == "dbins") {
+                                               s = rpn_pop();
+                                               if(!rpn_error)
+                                                       //if(rpn_sp > 0)
+                                               {
+                                                       j = stof(db_get(rpn_db, "stack.pointer"));
+                                                       i = stof(db_get(rpn_db, "stack.pos"));
+                                                       
+                                                       if(i < 0)
+                                                       {
+                                                               i = 0;
+                                                               db_put(rpn_db, "stack.pos", "0");
+                                                       }
+                                                       
+                                                       db_put(rpn_db, "stack.pointer", ftos(j+1));
+                                                       for(--j; j >= i; --j)
+                                                       {
+                                                               db_put(rpn_db, strcat("stack.", ftos(j+1)),
+                                                                                        db_get(rpn_db, (strcat("stack.", ftos(j))))
+                                                                       );
+                                                       }
+                                                       db_put(rpn_db, strcat("stack.", ftos(i)), s);
+                                               }
+                                       } else if(rpncmd == "dbext") {
+                                               j = stof(db_get(rpn_db, "stack.pointer"));
+                                               i = stof(db_get(rpn_db, "stack.pos"));
+                                               if(!j)
+                                               {
+                                                       rpn_error = TRUE;
+                                                       print("rpn: empty database\n");
+                                               } else {
+                                                       --j;
+                                                       rpn_push(db_get(rpn_db, strcat("stack.", ftos(i))));
+                                                       db_put(rpn_db, "stack.pointer", ftos(j));
+                                                       if(i == j)
+                                                       {
+                                                               db_put(rpn_db, "stack.pos", ftos(j-1));
+                                                       } else {
+                                                               while(i < j)
+                                                               {
+                                                                       db_put(rpn_db, strcat("stack.", ftos(i)),
+                                                                                                db_get(rpn_db, (strcat("stack.", ftos(i+1))))
+                                                                               );
+                                                                       ++i;
+                                                               }
+                                                       }
+                                               }
+                                       } else if(rpncmd == "dbread") {
+                                               s = db_get(rpn_db, "stack.pos");
+                                               if(stof(s) >= 0)
+                                               {
+                                                       rpn_push(db_get(rpn_db, strcat("stack.", s)));
+                                               } else {
+                                                       rpn_error = 1;
+                                                       print("rpn: empty database\n");
+                                               }
+                                       } else if(rpncmd == "dbat") {
+                                               rpn_push(db_get(rpn_db, "stack.pos"));
+                                       } else if(rpncmd == "dbmov") {
+                                               j = stof(db_get(rpn_db, "stack.pointer"));
+                                               i = stof(db_get(rpn_db, "stack.pos"));
+                                               i += rpn_popf();
+                                               if(!rpn_error)
+                                               {
+                                                       if(i < 0 || i >= j)
+                                                       {
+                                                               print("rpn: database cursor out of bounds\n");
+                                                               rpn_error = TRUE;
+                                                       }
+                                                       if(!rpn_error)
+                                                       {
+                                                               db_put(rpn_db, "stack.pos", ftos(i));
+                                                       }
+                                               }
+                                       } else if(rpncmd == "dbgoto") {
+                                               s = rpn_pop();
+                                               j = stof(db_get(rpn_db, "stack.pointer"));
+                                               if(!j)
+                                               {
+                                                       rpn_error = TRUE;
+                                                       print("rpn: empty database, cannot move cursor\n");
+                                               }
+                                               if(!rpn_error)
+                                               {
+                                                       if(s == "end")
+                                                               i = stof(db_get(rpn_db, "stack.pointer"))-1;
+                                                       else if(s == "beg")
+                                                               i = 0;
+                                                       else
+                                                               i = stof(s);
+                                                       
+                                                       j = stof(db_get(rpn_db, "stack.pointer"));
+                                                       if(i < 0 || i >= j)
+                                                       {
+                                                               print("rpn: database cursor destination out of bounds\n");
+                                                               rpn_error = TRUE;
+                                                       }
+                                                       if(!rpn_error)
+                                                       {
+                                                               db_put(rpn_db, "stack.pos", ftos(i));
+                                                       }
+                                               }
+                                       } else if(rpncmd == "union") {
+                                               // s s2 union
+                                               s2 = rpn_pop();
+                                               s = rpn_get();
+                                               f = tokenize_console(s);
+                                               f2 = tokenize_console(strcat(s, " ", s2));
+                                               // tokens 0..(f-1) represent s
+                                               // tokens f..f2 represent s2
+                                               // UNION: add all tokens to s that are in s2 but not in s
+                                               s = "";
+                                               for(i = 0; i < f; ++i)  
+                                                       s = strcat(s, " ", argv(i));
+                                               for(i = f; i < f2; ++i) {
+                                                       for(j = 0; j < f; ++j)
+                                                               if(argv(i) == argv(j))
+                                                                       goto skip_union;
+                                                       s = strcat(s, " ", argv(i));
+                                                       :skip_union
+                                               }
+                                               if(substring(s, 0, 1) == " ")
+                                                       s = substring(s, 1, 99999);
+                                               rpn_set(s);
+                                               tokenize_console(command);
+                                       } else if(rpncmd == "intersection") {
+                                               // s s2 intersection
+                                               s2 = rpn_pop();
+                                               s = rpn_get();
+                                               f = tokenize_console(s);
+                                               f2 = tokenize_console(strcat(s, " ", s2));
+                                               // tokens 0..(f-1) represent s
+                                               // tokens f..f2 represent s2
+                                               // INTERSECTION: keep only the tokens from s that are also in s2
+                                               s = "";
+                                               for(i = 0; i < f; ++i) {
+                                                       for(j = f; j < f2; ++j)
+                                                               if(argv(i) == argv(j))
+                                                               {
+                                                                       s = strcat(s, " ", argv(i));
+                                                                       break;
+                                                               }
+                                               }
+                                               if(substring(s, 0, 1) == " ")
+                                                       s = substring(s, 1, 99999);
+                                               rpn_set(s);
+                                               tokenize_console(command);
+                                       } else if(rpncmd == "difference") {
+                                               // s s2 difference
+                                               s2 = rpn_pop();
+                                               s = rpn_get();
+                                               f = tokenize_console(s);
+                                               f2 = tokenize_console(strcat(s, " ", s2));
+                                               // tokens 0..(f-1) represent s
+                                               // tokens f..f2 represent s2
+                                               // DIFFERENCE: keep only the tokens from s that are not in s2
+                                               s = "";
+                                               for(i = 0; i < f; ++i) {
+                                                       for(j = f; j < f2; ++j)
+                                                               if(argv(i) == argv(j))
+                                                                       goto skip_difference;
+                                                       s = strcat(s, " ", argv(i));
+                                                       :skip_difference
+                                               }
+                                               if(substring(s, 0, 1) == " ")
+                                                       s = substring(s, 1, 99999);
+                                               rpn_set(s);
+                                               tokenize_console(command);
+                                       } else if(rpncmd == "shuffle") {
+                                               // s shuffle
+                                               s = rpn_get();
+                                               f = tokenize_console(s);
+
+                                               for(i = 0; i < f - 1; ++i) {
+                                                       // move a random item from i..f-1 to position i
+                                                       s = "";
+                                                       f2 = floor(random() * (f - i) + i);
+                                                       for(j = 0; j < i; ++j)
+                                                               s = strcat(s, " ", argv(j));
+                                                       s = strcat(s, " ", argv(f2));
+                                                       for(j = i; j < f; ++j)
+                                                               if(j != f2)
+                                                                       s = strcat(s, " ", argv(j));
+                                                       f = tokenize_console(s);
+                                               }
+
+                                               if(substring(s, 0, 1) == " ")
+                                                       s = substring(s, 1, 99999);
+                                               rpn_set(s);
+                                               tokenize_console(command);
+                                       } else if(rpncmd == "fexists_assert") {
+                                               s = rpn_pop();
+                                               if(!rpn_error)
+                                               {
+                                                       if (!fexists(s))
+                                                       {
+                                                               print("rpn: ERROR: ", s, " does not exist!\n");
+                                                               rpn_error = TRUE;
+                                                       }
+                                               }
+                                       } else if(rpncmd == "fexists") {
+                                               s = rpn_get();
+                                               if(!rpn_error)
+                                               {
+                                                       if (fexists(s))
+                                                               rpn_setf(1);
+                                                       else
+                                                               rpn_setf(0);
+                                               }
+                                       } else if(rpncmd == "localtime") {
+                                               rpn_set(strftime(TRUE, rpn_get()));
+                                       } else if(rpncmd == "gmtime") {
+                                               rpn_set(strftime(FALSE, rpn_get()));
+                                       } else if(rpncmd == "time") {
+                                               rpn_pushf(time);
+                                       } else if(rpncmd == "digest") {
+                                               s = rpn_pop();
+                                               rpn_set(digest_hex(s, rpn_get()));
+                                       } else if(rpncmd == "sprintf1s") {
+                                               s = rpn_pop();
+                                               rpn_set(sprintf(s, rpn_get()));
+                                       } else {
+                                               rpn_push(cvar_string(rpncmd));
+                                       }
+                                       if(rpn_error)
+                                               break;
+                               }
+                               while(rpn_sp > 0)
+                               {
+                                       s = rpn_pop();
+                                       print("rpn: still on stack: ", s, "\n");
+                               }
+                       }
+
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " rpn EXPRESSION...\n"));
+                       print("    Operator description (x: string, s: set, f: float):\n");
+                       print("    x pop ----------------------------->     : removes the top\n");
+                       print("    x dup -----------------------------> x x : duplicates the top\n");
+                       print("    x x exch --------------------------> x x : swap the top two\n");
+                       print("    /cvarname load --------------------> x   : loads a cvar\n");
+                       print("    /cvarname x def ------------------->     : writes to a cvar\n");
+                       print("    f f add|sub|mul|div|mod|max|min ---> f   : adds/... two numbers\n");
+                       print("    f f eq|ne|gt|ge|lt|le -------------> f   : compares two numbers\n");
+                       print("    f neg|abs|sgn|rand|floor|ceil------> f   : negates/... a number\n");
+                       print("    f f f bound -----------------------> f   : bounds the middle number\n");
+                       print("    f1 f2 b when ----------------------> f   : f1 if b, f2 otherwise\n");
+                       print("    s s union|intersection|difference -> s   : set operations\n");
+                       print("    s shuffle -------------------------> s   : randomly arrange elements\n");
+                       print("    /key /value put ------------------->     : set a database key\n");
+                       print("    /key get --------------------------> s   : get a database value\n");
+                       print("    x dbpush -------------------------->     : pushes the top onto the database\n");
+                       print("    dbpop|dbget -----------------------> x   : removes/reads DB's top\n");
+                       print("    dblen|dbat ------------------------> f   : gets the DB's size/cursor pos\n");
+                       print("    dbclr ----------------------------->     : clear the DB\n");
+                       print("    s dbsave|dbload-------------------->     : save/load the DB to/from a file\n");
+                       print("    x dbins --------------------------->     : moves the top into the DB\n");
+                       print("    dbext|dbread ----------------------> x   : extract/get from the DB's cursor\n");
+                       print("    f dbmov|dbgoto -------------------->     : move or set the DB's cursor\n");
+                       print("    s localtime -----------------------> s   : formats the current local time\n");
+                       print("    s gmtime --------------------------> s   : formats the current UTC time\n");
+                       print("    time ------------------------------> f   : seconds since VM start\n");
+                       print("    s /MD4 digest ---------------------> s   : MD4 digest\n");
+                       print("    s /SHA256 digest ------------------> s   : SHA256 digest\n");
+                       print("    s /formatstring sprintf1s ---------> s   : sprintf with 1 string (pad, cut)\n");
+                       print("    Set operations operate on 'such''strings'.\n");
+                       print("    Unknown tokens insert their cvar value.\n");
+                       return;
+               }
+       }
+}
\ No newline at end of file
diff --git a/qcsrc/common/command/rpn.qh b/qcsrc/common/command/rpn.qh
new file mode 100644 (file)
index 0000000..6ffc5e1
--- /dev/null
@@ -0,0 +1,10 @@
+// =========================================================
+//  Declarations for RPN command code, written by divVerent
+//  Last updated: December 28th, 2011
+// =========================================================
+
+#define MAX_RPN_STACK 16
+float rpn_db;
+float rpn_error;
+float rpn_sp;
+string rpn_stack[MAX_RPN_STACK];
\ No newline at end of file
diff --git a/qcsrc/common/command/shared_defs.qh b/qcsrc/common/command/shared_defs.qh
new file mode 100644 (file)
index 0000000..f06ee32
--- /dev/null
@@ -0,0 +1,8 @@
+// =========================================================
+//  Shared declarations for all commands, written by Samual
+//  Last updated: December 13th, 2011
+// =========================================================
+
+// identifiers for subfunction requests by the command code structure
+#define CMD_REQUEST_COMMAND 1
+#define CMD_REQUEST_USAGE 2
\ No newline at end of file
index 7e5e99edbf9a5a2c64476c7e526c305a70284c6f..7532b3f50b0a85a25dab66ae98a40ccc79dff39c 100644 (file)
 // Revision 22: hook shot origin
 #define CSQC_REVISION 22
 
-// probably put these in common/
-// so server/ and client/ can be synced better
-const float GAME_DEATHMATCH            = 1;
-const float GAME_TEAM_DEATHMATCH       = 2;
-const float GAME_DOMINATION            = 3;
-const float GAME_CTF                   = 4;
-const float GAME_RUNEMATCH             = 5;
-const float GAME_LMS                   = 6;
-const float GAME_ARENA         = 7;
-const float GAME_KEYHUNT               = 8;
-const float GAME_ASSAULT               = 9;
-const float GAME_ONSLAUGHT     = 10;
-const float GAME_RACE  = 11;
-const float GAME_NEXBALL = 12;
-const float GAME_CTS = 13;
-const float GAME_CA            = 14;
-const float GAME_FREEZETAG             = 15;
-const float GAME_KEEPAWAY              = 16;
-
 const float AS_STRING          = 1;
 const float AS_INT             = 2;
 const float AS_FLOAT_TRUNCATED = 2;
@@ -114,6 +95,7 @@ const float ENT_CLIENT_GAUNTLET = 29;
 const float ENT_CLIENT_ACCURACY = 30;
 const float ENT_CLIENT_SHOWNAMES = 31;
 const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
+const float ENT_CLIENT_MODEL = 33;
 
 const float ENT_CLIENT_TURRET = 40;
 const float ENT_CLIENT_AUXILIARYXHAIR = 50;
@@ -392,7 +374,6 @@ float DEATH_TOUCHEXPLODE = 10015;
 float DEATH_CHEAT = 10016;
 float DEATH_FIRE = 10017;
 float DEATH_QUIET = 10021;
-float DEATH_HEADSHOT = 10022;
 
 float  DEATH_VHFIRST       = 10030;
 float  DEATH_VHCRUSH       = 10030;
@@ -483,38 +464,38 @@ float MSG_INFO = 5;
 float MSG_KA = 6;
 float MSG_RACE = 10;
 
-float KILL_TEAM_RED = 10301;
-float KILL_TEAM_BLUE = 10302;
-float KILL_TEAM_SPREE = 10303;
-float KILL_FIRST_BLOOD = 10304;
-float KILL_FIRST_VICTIM = 10305;
-float KILL_TYPEFRAG = 10306;
-float KILL_TYPEFRAGGED = 10307;
-float KILL_FRAG = 10308;
-float KILL_FRAGGED = 10309;
-float KILL_SPREE = 10310;
-float KILL_END_SPREE = 10311;
-float KILL_SPREE_3 = 10312;
-float KILL_SPREE_5 = 10313;
-float KILL_SPREE_10 = 10314;
-float KILL_SPREE_15 = 10315;
-float KILL_SPREE_20 = 10316;
-float KILL_SPREE_25 = 10317;
-float KILL_SPREE_30 = 10318;
-
-float INFO_GOTFLAG = 10319;
-float INFO_PICKUPFLAG = 10320;
-float INFO_LOSTFLAG = 10321;
-float INFO_RETURNFLAG = 10322;
-float INFO_CAPTUREFLAG = 10323;
-
-float KA_PICKUPBALL = 10350;
-float KA_DROPBALL = 10351;
-
-float RACE_SERVER_RECORD = 10400;
-float RACE_NEW_TIME = 10401;
-float RACE_NEW_RANK = 10402;
-float RACE_FAIL = 10403;
+float KILL_TEAM_RED = 12001;
+float KILL_TEAM_BLUE = 12002;
+float KILL_TEAM_SPREE = 12003;
+float KILL_FIRST_BLOOD = 12004;
+float KILL_FIRST_VICTIM = 12005;
+float KILL_TYPEFRAG = 12006;
+float KILL_TYPEFRAGGED = 12007;
+float KILL_FRAG = 12008;
+float KILL_FRAGGED = 12009;
+float KILL_SPREE = 12010;
+float KILL_END_SPREE = 12011;
+float KILL_SPREE_3 = 12012;
+float KILL_SPREE_5 = 12013;
+float KILL_SPREE_10 = 12014;
+float KILL_SPREE_15 = 12015;
+float KILL_SPREE_20 = 12016;
+float KILL_SPREE_25 = 12017;
+float KILL_SPREE_30 = 12018;
+
+float INFO_GOTFLAG = 13001;
+float INFO_PICKUPFLAG = 13002;
+float INFO_LOSTFLAG = 13003;
+float INFO_RETURNFLAG = 13004;
+float INFO_CAPTUREFLAG = 13005;
+
+float KA_PICKUPBALL = 14001;
+float KA_DROPBALL = 14002;
+
+float RACE_SERVER_RECORD = 15001;
+float RACE_NEW_TIME = 15002;
+float RACE_NEW_RANK = 15003;
+float RACE_FAIL = 15004;
 
 // weapon requests
 float WR_SETUP         = 1; // (SVQC) setup weapon data
@@ -575,6 +556,32 @@ float HUD_MENU_ENABLE              = 0;
 #define SERVERFLAG_TEAMPLAY 2
 #define SERVERFLAG_PLAYERSTATS 4
 
+var vector autocvar_sv_player_maxs = '16 16 45';
+var vector autocvar_sv_player_mins = '-16 -16 -24';
+var vector autocvar_sv_player_viewoffset = '0 0 20';
+var vector autocvar_sv_player_crouch_maxs = '16 16 25';
+var vector autocvar_sv_player_crouch_mins = '-16 -16 -24';
+var vector autocvar_sv_player_crouch_viewoffset = '0 0 20';
+noref var vector autocvar_sv_player_headsize = '24 24 12';
+
+#define PL_VIEW_OFS autocvar_sv_player_viewoffset
+#define PL_MIN autocvar_sv_player_mins
+#define PL_MAX autocvar_sv_player_maxs
+#define PL_CROUCH_VIEW_OFS autocvar_sv_player_crouch_viewoffset
+#define PL_CROUCH_MIN autocvar_sv_player_crouch_mins
+#define PL_CROUCH_MAX autocvar_sv_player_crouch_maxs
+#define PL_HEAD autocvar_sv_player_headsize
+
+// helpers
+#define PL_VIEW_OFS_z autocvar_sv_player_viewoffset_z
+#define PL_MIN_z autocvar_sv_player_mins_z
+#define PL_MAX_z autocvar_sv_player_maxs_z
+#define PL_CROUCH_VIEW_OFS_z autocvar_sv_player_crouch_viewoffset_z
+#define PL_CROUCH_MIN_z autocvar_sv_player_mins_z
+#define PL_HEAD_x autocvar_sv_player_headsize_x
+#define PL_HEAD_y autocvar_sv_player_headsize_y
+#define PL_HEAD_z autocvar_sv_player_headsize_z
+
 // spawnpoint prios
 #define SPAWN_PRIO_NEAR_TEAMMATE_FOUND    200
 #define SPAWN_PRIO_NEAR_TEAMMATE_SAMETEAM 100
diff --git a/qcsrc/common/csqcmodel_settings.qh b/qcsrc/common/csqcmodel_settings.qh
new file mode 100644 (file)
index 0000000..e0dfce4
--- /dev/null
@@ -0,0 +1,85 @@
+// define this if svqc code wants to use .frame2 and .lerpfrac
+#define CSQCMODEL_HAVE_TWO_FRAMES
+
+// don't define this ever
+//#define CSQCMODEL_SUPPORT_GETTAGINFO_BEFORE_DRAW
+
+// a hack for Xonotic
+#ifdef CSQC
+# define TAG_ENTITY_NAME tag_networkentity
+# define TAG_ENTITY_TYPE float
+.float tag_networkentity;
+#else
+# define TAG_ENTITY_NAME tag_entity
+# define TAG_ENTITY_TYPE entity
+#endif
+
+// add properties you want networked to CSQC here
+#define CSQCMODEL_EXTRAPROPERTIES \
+       CSQCMODEL_PROPERTY(1, float, ReadShort, WriteShort, colormap) \
+       CSQCMODEL_PROPERTY(2, float, ReadInt24_t, WriteInt24_t, effects) \
+       CSQCMODEL_PROPERTY(4, float, ReadByte, WriteByte, modelflags) \
+       CSQCMODEL_PROPERTY_SCALED(8, float, ReadByte, WriteByte, alpha, 254, -1, 254) \
+       CSQCMODEL_PROPERTY(16, float, ReadByte, WriteByte, skin) \
+       CSQCMODEL_IF(isplayer) \
+       CSQCMODEL_ENDIF \
+       CSQCMODEL_IF(!isplayer) \
+               CSQCMODEL_PROPERTY(32, TAG_ENTITY_TYPE, ReadShort, WriteEntity, TAG_ENTITY_NAME) \
+               CSQCMODEL_PROPERTY_SCALED(64, float, ReadByte, WriteByte, glowmod_x, 255, 0, 255) \
+               CSQCMODEL_PROPERTY_SCALED(64, float, ReadByte, WriteByte, glowmod_y, 255, 0, 255) \
+               CSQCMODEL_PROPERTY_SCALED(64, float, ReadByte, WriteByte, glowmod_z, 255, 0, 255) \
+       CSQCMODEL_ENDIF
+// TODO get rid of colormod/glowmod here, find good solution for nex charge glowmod hack; also get rid of some useless properties on non-players that only exist for CopyBody
+
+// add hook function calls here
+#define CSQCMODEL_HOOK_PREUPDATE \
+       CSQCModel_Hook_PreUpdate(isnew, isplayer, islocalplayer);
+#define CSQCMODEL_HOOK_POSTUPDATE \
+       CSQCModel_Hook_PostUpdate(isnew, isplayer, islocalplayer);
+#define CSQCMODEL_HOOK_PREDRAW \
+       CSQCModel_Hook_PreDraw(isplayer, islocalplayer);
+#define CSQCPLAYER_HOOK_POSTCAMERASETUP
+
+// force updates of player entities that often even if unchanged
+#define CSQCPLAYER_FORCE_UPDATES 0.25
+
+// mod must define:
+//vector PL_MIN  = ...;
+//vector PL_MAX  = ...;
+//vector PL_VIEW_OFS  = ...;
+//vector PL_CROUCH_MIN  = ...;
+//vector PL_CROUCH_MAX  = ...;
+//vector PL_CROUCH_VIEW_OFS  = ...;
+
+#ifdef SVQC
+# ifdef NO_LEGACY_NETWORKING
+#  define CSQCMODEL_AUTOINIT() CSQCModel_LinkEntity()
+#  define CSQCMODEL_AUTOUPDATE() CSQCModel_CheckUpdate()
+# else
+.float iscsqcmodel;
+float autocvar_sv_use_csqc_players;
+#  define CSQCMODEL_AUTOINIT() \
+       if(autocvar_sv_use_csqc_players) \
+       { \
+               CSQCModel_LinkEntity(); \
+               self.iscsqcmodel = 1; \
+       } \
+       else \
+               self.iscsqcmodel = 0
+#  define CSQCMODEL_AUTOUPDATE() \
+       if(autocvar_sv_use_csqc_players && !self.iscsqcmodel) \
+       { \
+               CSQCModel_LinkEntity(); \
+               self.iscsqcmodel = 1; \
+       } \
+       if(!autocvar_sv_use_csqc_players && self.iscsqcmodel) \
+       { \
+               CSQCModel_UnlinkEntity(); \
+               self.iscsqcmodel = 0; \
+       } \
+       if(self.iscsqcmodel) \
+               CSQCModel_CheckUpdate()
+# endif
+#endif
+
+#define CSQCMODEL_EF_INVISIBLE EF_SELECTABLE
diff --git a/qcsrc/common/gamecommand.qc b/qcsrc/common/gamecommand.qc
deleted file mode 100644 (file)
index 9595ed5..0000000
+++ /dev/null
@@ -1,853 +0,0 @@
-#define MAX_RPN_STACK 16
-float rpn_db;
-float rpn_error;
-float rpn_sp;
-string rpn_stack[MAX_RPN_STACK];
-string rpn_pop() {
-       if(rpn_sp > 0) {
-               --rpn_sp;
-               return rpn_stack[rpn_sp];
-       } else {
-               print("rpn: stack underflow\n");
-               rpn_error = TRUE;
-               return "";
-       }
-}
-void rpn_push(string s) {
-       if(rpn_sp < MAX_RPN_STACK) {
-               rpn_stack[rpn_sp] = s;
-               ++rpn_sp;
-       } else {
-               print("rpn: stack overflow\n");
-               rpn_error = TRUE;
-       }
-}
-string rpn_get() {
-       if(rpn_sp > 0) {
-               return rpn_stack[rpn_sp - 1];
-       } else {
-               print("rpn: empty stack\n");
-               rpn_error = TRUE;
-               return "";
-       }
-}
-void rpn_set(string s) {
-       if(rpn_sp > 0) {
-               rpn_stack[rpn_sp - 1] = s;
-       } else {
-               print("rpn: empty stack\n");
-               rpn_error = TRUE;
-       }
-}
-float rpn_getf() { return stof(rpn_get()); }
-float rpn_popf() { return stof(rpn_pop()); }
-void rpn_pushf(float f) { return rpn_push(ftos(f)); }
-void rpn_setf(float f) { return rpn_set(ftos(f)); }
-
-#define NUM_MARKUPS    41
-float markup_init;
-string markup_from[NUM_MARKUPS];
-string markup_to[NUM_MARKUPS];
-void GameCommand_MarkupInit()
-{
-       float i;
-       if (markup_init)
-               return;
-       markup_init = 1;
-       i = 0;
-       markup_from[i] = "&alien"; markup_to[i] = "\x12"; ++i;
-       markup_from[i] = "&:-)"; markup_to[i] = "\x13"; ++i;
-       markup_from[i] = "&:-("; markup_to[i] = "\x14"; ++i;
-       markup_from[i] = "&x-P"; markup_to[i] = "\x15"; ++i;
-       markup_from[i] = "&:-/"; markup_to[i] = "\x16"; ++i;
-       markup_from[i] = "&:-D"; markup_to[i] = "\x17"; ++i;
-       markup_from[i] = "&<<"; markup_to[i] = "\x18"; ++i;
-       markup_from[i] = "&>>"; markup_to[i] = "\x19"; ++i;
-       markup_from[i] = "&dot"; markup_to[i] = "\x1a"; ++i;
-       markup_from[i] = "&^_"; markup_to[i] = "\x1b"; ++i;
-       markup_from[i] = "&ysplat"; markup_to[i] = "\x1c"; ++i;
-       markup_from[i] = "&-]"; markup_to[i] = "\x1d"; ++i;
-       markup_from[i] = "&--"; markup_to[i] = "\x1e"; ++i;
-       markup_from[i] = "&[-"; markup_to[i] = "\x1f"; ++i;
-       markup_from[i] = "&s<"; markup_to[i] = "\x2c"; ++i;
-       markup_from[i] = "&s>"; markup_to[i] = "\x2e"; ++i;
-       markup_from[i] = "&<-"; markup_to[i] = "\x7f"; ++i;
-       markup_from[i] = "&[="; markup_to[i] = "\x80"; ++i;
-       markup_from[i] = "&=="; markup_to[i] = "\x81"; ++i;
-       markup_from[i] = "&=]"; markup_to[i] = "\x82"; ++i;
-       markup_from[i] = "&r!"; markup_to[i] = "\x84"; ++i;
-       markup_from[i] = "&|o|"; markup_to[i] = "\x85"; ++i;
-       markup_from[i] = "&|u|"; markup_to[i] = "\x86"; ++i;
-       markup_from[i] = "&|i|"; markup_to[i] = "\x87"; ++i;
-       markup_from[i] = "&|c|"; markup_to[i] = "\x88"; ++i;
-       markup_from[i] = "&[c]"; markup_to[i] = "\x89"; ++i;
-       markup_from[i] = "&[n]"; markup_to[i] = "\x8a"; ++i;
-       markup_from[i] = "&[]"; markup_to[i] = "\x8b"; ++i;
-       markup_from[i] = "&r?"; markup_to[i] = "\x8c"; ++i;
-       markup_from[i] = "&|>"; markup_to[i] = "\x8d"; ++i;
-       markup_from[i] = "&splat0"; markup_to[i] = "\x8e"; ++i;
-       markup_from[i] = "&splat1"; markup_to[i] = "\x8f"; ++i;
-       markup_from[i] = "&[["; markup_to[i] = "\x90"; ++i;
-       markup_from[i] = "&]]"; markup_to[i] = "\x91"; ++i;
-       markup_from[i] = "&splat2"; markup_to[i] = "\x9a"; ++i;
-       markup_from[i] = "&)("; markup_to[i] = "\x9b"; ++i;
-       markup_from[i] = "&splat3"; markup_to[i] = "\x9c"; ++i;
-       markup_from[i] = "&(."; markup_to[i] = "\x9d"; ++i;
-       markup_from[i] = "&.."; markup_to[i] = "\x9e"; ++i;
-       markup_from[i] = "&.)"; markup_to[i] = "\x9f"; ++i;
-       markup_from[i] = "&<|"; markup_to[i] = "\xff"; ++i;
-}
-
-string GameCommand_Markup(string s2)
-{
-       float red, ccase, i, j;
-       string s, s3;
-
-       GameCommand_MarkupInit();
-
-       s = "";
-
-       red = 0;
-       ccase = 0;
-       for(i = 0; i < strlen(s2); ++i)
-       {
-               for(j = 0; j < NUM_MARKUPS; ++j)
-               {
-                       s3 = substring(s2, i, strlen(markup_from[j]));
-                       if (s3 == markup_from[j])
-                       {
-                               s = strcat(s, markup_to[j]);
-                               i += strlen(markup_from[j]) - 1;
-                               break;
-                       }
-               }
-
-               if(j == NUM_MARKUPS)
-               {
-                       if(substring(s2, i, 2) == "&&")
-                       {
-                               s = strcat(s, strconv(ccase, red, red, "&"));
-                               ++i;
-                       }
-                       else if(substring(s2, i, 2) == "&d")
-                       {
-                               red = 2;
-                               ccase = 0;
-                               ++i;
-                       }
-                       else if(substring(s2, i, 2) == "&a")
-                       {
-                               red = 2;
-                               ccase = 2;
-                               ++i;
-                       }
-                       else if(substring(s2, i, 2) == "&n")
-                       {
-                               red = 0;
-                               ccase = 0;
-                               ++i;
-                       }
-                       else
-                               s = strcat(s, strconv(ccase, red, red, substring(s2, i, 1)));
-               }
-       }
-
-       return s;
-}
-
-float GameCommand_Generic(string command)
-{
-       float argc;
-       float i, j, f, n;
-       vector rgb;
-       string s, s2, c;
-       argc = tokenize_console(command);
-       if(argv(0) == "help")
-       {
-               print("  rpn EXPRESSION... - a RPN calculator.\n");
-               print("    Operator description (x: string, s: set, f: float):\n");
-               print("    x pop ----------------------------->     : removes the top\n");
-               print("    x dup -----------------------------> x x : duplicates the top\n");
-               print("    x x exch --------------------------> x x : swap the top two\n");
-               print("    /cvarname load --------------------> x   : loads a cvar\n");
-               print("    /cvarname x def ------------------->     : writes to a cvar\n");
-               print("    f f add|sub|mul|div|mod|max|min ---> f   : adds/... two numbers\n");
-               print("    f f eq|ne|gt|ge|lt|le -------------> f   : compares two numbers\n");
-               print("    f neg|abs|sgn|rand|floor|ceil------> f   : negates/... a number\n");
-               print("    f f f bound -----------------------> f   : bounds the middle number\n");
-               print("    f1 f2 b when ----------------------> f   : f1 if b, f2 otherwise\n");
-               print("    s s union|intersection|difference -> s   : set operations\n");
-               print("    s shuffle -------------------------> s   : randomly arrange elements\n");
-               print("    /key /value put ------------------->     : set a database key\n");
-               print("    /key get --------------------------> s   : get a database value\n");
-               print("    x dbpush -------------------------->     : pushes the top onto the database\n");
-               print("    dbpop|dbget -----------------------> x   : removes/reads DB's top\n");
-               print("    dblen|dbat ------------------------> f   : gets the DB's size/cursor pos\n");
-               print("    dbclr ----------------------------->     : clear the DB\n");
-               print("    s dbsave|dbload-------------------->     : save/load the DB to/from a file\n");
-               print("    x dbins --------------------------->     : moves the top into the DB\n");
-               print("    dbext|dbread ----------------------> x   : extract/get from the DB's cursor\n");
-               print("    f dbmov|dbgoto -------------------->     : move or set the DB's cursor\n");
-               print("    s localtime -----------------------> s   : formats the current local time\n");
-               print("    s gmtime --------------------------> s   : formats the current UTC time\n");
-               print("    time ------------------------------> f   : seconds since VM start\n");
-               print("    s /MD4 digest ---------------------> s   : MD4 digest\n");
-               print("    s /SHA256 digest ------------------> s   : SHA256 digest\n");
-               print("    s /formatstring sprintf1s ---------> s   : sprintf with 1 string (pad, cut)\n");
-               print("    Set operations operate on 'such''strings'.\n");
-               print("    Unknown tokens insert their cvar value.\n");
-               print("  maplist add map\n");
-               print("  maplist remove map\n");
-               print("  maplist shuffle\n");
-               print("  maplist cleanup\n");
-               print("  maplist maplist\n");
-               print("  maplist lsmaps\n");
-               print("  maplist lsnewmaps\n");
-               print("  addtolist variable addedvalue\n");
-               print("  records\n");
-               print("  rankings (map argument optional)\n");
-               return TRUE;
-       }
-       
-       if(argv(0) == "maplist")
-       {
-               if(argv(1) == "add" && argc == 3)
-               {
-                       if (!fexists(strcat("maps/", argv(2), ".bsp")))
-                       {
-                               print("maplist: ERROR: ", argv(2), " does not exist!\n");
-                               return TRUE;
-                       }
-                       if(cvar_string("g_maplist") == "")
-                               cvar_set("g_maplist", argv(2));
-                       else
-                               cvar_set("g_maplist", strcat(argv(2), " ", cvar_string("g_maplist")));
-                       return TRUE;
-               }
-               else if(argv(1) == "remove" && argc == 3)
-               {
-                       s = argv(2);
-                       n = tokenizebyseparator(cvar_string("g_maplist"), " ");
-                       s2 = "";
-                       for(i = 0; i < n; ++i)
-                               if(argv(i) != s)
-                                       s2 = strcat(s2, " ", argv(i));
-                       s2 = substring(s2, 1, strlen(s2) - 1);
-                       cvar_set("g_maplist", s2);
-                       return TRUE;
-               }
-               else if(argv(1) == "shuffle" && argc == 2)
-               {
-                       cvar_set("g_maplist", shufflewords(cvar_string("g_maplist")));
-                       return TRUE;
-               }
-               else if(argv(1) == "cleanup")
-               {
-                       MapInfo_Enumerate();
-                       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-                       n = tokenizebyseparator(cvar_string("g_maplist"), " ");
-                       s2 = "";
-                       for(i = 0; i < n; ++i)
-                               if(MapInfo_CheckMap(argv(i)))
-                                       s2 = strcat(s2, " ", argv(i));
-                       s2 = substring(s2, 1, strlen(s2) - 1);
-                       cvar_set("g_maplist", s2);
-                       return TRUE;
-               }
-               else if(argv(1) == "maplist") {
-                       print(maplist_reply);
-                       return TRUE;
-               }
-               else if(argv(1) == "lsmaps") {
-                       print(lsmaps_reply);
-                       return TRUE;
-               }
-               else if(argv(1) == "lsnewmaps") {
-                       print(lsnewmaps_reply);
-                       return TRUE;
-               }
-       }
-       else if(argc >= 3 && argv(0) == "red")
-       {
-               s = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
-               localcmd(strcat(argv(1), " ", GameCommand_Markup(s)));
-               return TRUE;
-       }
-       else if(argc >= 3 && crc16(0, argv(0)) == 38566 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 59830)
-       {
-               // other test case
-               s = strconv(2, 0, 0, substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
-
-               n = floor(random() * 6 + 2);
-
-               s2 = "";
-               for(i = 0; i < n; ++i)
-               {
-                       s2 = strcat(s2, "AH");
-               }
-
-               if(random() < 0.1)
-                       s2 = strcat(substring(s2, 1, strlen(s2) - 1), "A");
-
-               if(s == "")
-                       s = s2;
-               else
-                       if(random() < 0.8)
-                               s = strcat(s, " ", s2);
-                       else
-                               s = strcat(s2, " ", s);
-
-               s2 = substring(s, strlen(s) - 2, 2);
-               if(s2 == "AH" || s2 == "AY")
-                       s = strcat(s, "))");
-               else
-                       s = strcat(s, " ))");
-
-               if(random() < 0.1)
-                       s = substring(s, 0, strlen(s) - 1);
-
-               if(random() < 0.1)
-                       s = strconv(1, 0, 0, s);
-
-               localcmd(strcat(argv(1), " ", s));
-
-               return TRUE;
-       }
-       else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55790)
-       {
-               // test case for terencehill's color codes
-               s = strdecolorize(substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
-               s2 = "";
-               
-               n = strlen(s);
-               j = ((6 * max(1, floor(strlen(s)/32 + random() * 2 - 1))) / n) * (1 - 2 * (random() > 0.5));
-               f = random() * 6;
-
-               for(i = 0; i < n; ++i)
-               {
-                       c = substring(s, i, 1);
-
-                       if(c == ";")
-                               c = ":";
-                       else if(c == "^")
-                       {
-                               c = "^^";
-                               if(substring(s, i+1, 1) == "^")
-                                       ++i;
-                       }
-
-                       if(c != " ")
-                       {
-                               rgb = hsl_to_rgb('1 0 0' * (j * i + f) + '0 1 .5');
-                               c = strcat(rgb_to_hexcolor(rgb), c);
-                       }
-                       s2 = strcat(s2, c);
-               }
-
-               localcmd(strcat(argv(1), " ", s2));
-
-               return TRUE;
-       }
-       else if(argv(0) == "rpn")
-       {
-               if(!rpn_db)
-               {
-                       rpn_db = db_create();
-                       db_put(rpn_db, "stack.pointer", "0");
-                       db_put(rpn_db, "stack.pos", "-1");
-               }
-               if(argc >= 2)
-               {
-                       float rpnpos;
-                       string rpncmd;
-                       float f2, f3;
-                       rpn_sp = 0;
-                       rpn_error = FALSE;
-                       for(rpnpos = 1; rpnpos < argc; ++rpnpos)
-                       {
-                               rpncmd = argv(rpnpos);
-                               f = strlen(rpncmd);
-                               if(rpncmd == "") {
-                               } else if(stof(substring(rpncmd, 0, 1)) > 0) {
-                                       rpn_push(rpncmd);
-                               } else if(substring(rpncmd, 0, 1) == "0") {
-                                       rpn_push(rpncmd);
-                               } else if(f >= 2 && substring(rpncmd, 0, 1) == "+") {
-                                       rpn_push(rpncmd);
-                               } else if(f >= 2 && substring(rpncmd, 0, 1) == "-") {
-                                       rpn_push(rpncmd);
-                               } else if(f >= 2 && substring(rpncmd, 0, 1) == "/") {
-                                       rpn_push(substring(rpncmd, 1, strlen(rpncmd) - 1));
-                               } else if(rpncmd == "clear") {
-                                       rpn_sp = 0;
-                               } else if(rpncmd == "def" || rpncmd == "=") {
-                                       s = rpn_pop();
-                                       s2 = rpn_pop();
-
-                                       if(s2 != "")
-                                       {
-#ifdef MENUQC
-                                               registercvar(s2, "", 0);
-#else
-                                               registercvar(s2, "");
-#endif
-                                               if(!rpn_error) // don't change cvars if a stack error had happened!
-                                                       cvar_set(s2, s);
-                                       }
-                                       else
-                                       {
-                                               print("rpn: empty cvar name for 'def'\n");
-                                               rpn_error = TRUE;
-                                       }
-                               } else if(rpncmd == "defs" || rpncmd == "@") {
-                                       s = "";
-                                       i = rpn_popf();
-                                       j = (i == 0);
-                                       while(rpn_sp > 1 && (j || i > 0))
-                                       {
-                                               s = strcat("/", rpn_pop(), " ", s);
-                                               --i;
-                                       }
-                                       s2 = rpn_pop();
-                                       if(s2 != "")
-                                       {
-#ifdef MENUQC
-                                               registercvar(s2, "", 0);
-#else
-                                               registercvar(s2, "");
-#endif
-                                               if(!rpn_error) // don't change cvars if a stack error had happened!
-                                                       cvar_set(s2, s);
-                                       }
-                                       else
-                                       {
-                                               print("rpn: empty cvar name for 'defs'\n");
-                                               rpn_error = TRUE;
-                                       }
-                               } else if(rpncmd == "load") {
-                                       rpn_set(cvar_string(rpn_get()));
-                               } else if(rpncmd == "exch") {
-                                       s = rpn_pop();
-                                       s2 = rpn_get();
-                                       rpn_set(s);
-                                       rpn_push(s2);
-                               } else if(rpncmd == "dup") {
-                                       rpn_push(rpn_get());
-                               } else if(rpncmd == "pop") {
-                                       rpn_pop();
-                               } else if(rpncmd == "add" || rpncmd == "+") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() + f);
-                               } else if(rpncmd == "sub" || rpncmd == "-") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() - f);
-                               } else if(rpncmd == "mul" || rpncmd == "*") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() * f);
-                               } else if(rpncmd == "div" || rpncmd == "/") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() / f);
-                               } else if(rpncmd == "mod" || rpncmd == "%") {
-                                       f = rpn_popf();
-                                       f2 = rpn_getf();
-                                       rpn_setf(f2 - f * floor(f2 / f));
-                               } else if(rpncmd == "abs") {
-                                       rpn_setf(fabs(rpn_getf()));
-                               } else if(rpncmd == "sgn") {
-                                       f = rpn_getf();
-                                       if(f < 0)
-                                               rpn_set("-1");
-                                       else if(f > 0)
-                                               rpn_set("1");
-                                       else
-                                               rpn_set("0");
-                               } else if(rpncmd == "neg" || rpncmd == "~") {
-                                       rpn_setf(-rpn_getf());
-                               } else if(rpncmd == "floor" || rpncmd == "f") {
-                                       rpn_setf(floor(rpn_getf()));
-                               } else if(rpncmd == "ceil" || rpncmd == "c") {
-                                       rpn_setf(ceil(rpn_getf()));
-                               } else if(rpncmd == "max") {
-                                       f = rpn_popf();
-                                       f2 = rpn_getf();
-                                       rpn_setf(max(f2, f));
-                               } else if(rpncmd == "min") {
-                                       f = rpn_popf();
-                                       f2 = rpn_getf();
-                                       rpn_setf(min(f2, f));
-                               } else if(rpncmd == "bound") {
-                                       f = rpn_popf();
-                                       f2 = rpn_popf();
-                                       f3 = rpn_getf();
-                                       rpn_setf(bound(f3, f2, f));
-                               } else if(rpncmd == "when") {
-                                       f = rpn_popf();
-                                       f2 = rpn_popf();
-                                       f3 = rpn_getf();
-                                       if(f)
-                                               rpn_setf(f3);
-                                       else
-                                               rpn_setf(f2);
-                               } else if(rpncmd == ">" || rpncmd == "gt") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() > f);
-                               } else if(rpncmd == "<" || rpncmd == "lt") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() < f);
-                               } else if(rpncmd == "==" || rpncmd == "eq") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() == f);
-                               } else if(rpncmd == ">=" || rpncmd == "ge") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() >= f);
-                               } else if(rpncmd == "<=" || rpncmd == "le") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() <= f);
-                               } else if(rpncmd == "!=" || rpncmd == "ne") {
-                                       f = rpn_popf();
-                                       rpn_setf(rpn_getf() != f);
-                               } else if(rpncmd == "rand") {
-                                       rpn_setf(ceil(random() * rpn_getf()) - 1);
-                               } else if(rpncmd == "crc16") {
-                                       rpn_setf(crc16(FALSE, rpn_get()));
-                               } else if(rpncmd == "put") {
-                                       s2 = rpn_pop();
-                                       if (!rpn_error)
-                                       {
-                                               s = rpn_pop();
-                                               if (!rpn_error)
-                                                       db_put(rpn_db, s, s2);
-                                       }
-                               } else if(rpncmd == "get") {
-                                       s = rpn_pop();
-                                       if (!rpn_error)
-                                               rpn_push(db_get(rpn_db, s));
-                               } else if(rpncmd == "dbpush") {
-                                       s = rpn_pop();
-                                       if(!rpn_error)
-                                       {
-                                               i = stof(db_get(rpn_db, "stack.pointer"));
-                                               db_put(rpn_db, "stack.pointer", ftos(i+1));
-                                               db_put(rpn_db, strcat("stack.", ftos(i)), s);
-                                       }
-                                       if(!i)
-                                               db_put(rpn_db, "stack.pos", "0");
-                               } else if(rpncmd == "dbpop") {
-                                       i = stof(db_get(rpn_db, "stack.pointer"));
-                                       if(i)
-                                       {
-                                               s = ftos(i-1);
-                                               db_put(rpn_db, "stack.pointer", s);
-                                               rpn_push(db_get(rpn_db, strcat("stack.", s)));
-                                               j = stof(db_get(rpn_db, "stack.pos"));
-                                               if(j >= i)
-                                                       db_put(rpn_db, "stack.pos", ftos(i-2));
-                                       } else {
-                                               rpn_error = 1;
-                                               print("rpn: database underflow\n");
-                                       }
-                               } else if(rpncmd == "dbget") {
-                                       
-                                       i = stof(db_get(rpn_db, "stack.pointer"));
-                                       if(i)
-                                       {
-                                               rpn_push(db_get(rpn_db, strcat("stack.", ftos(i-1))));
-                                       } else {
-                                               rpn_error = 1;
-                                               print("rpn: database empty\n");
-                                       }
-                               } else if(rpncmd == "dblen") {
-                                       rpn_push(db_get(rpn_db, "stack.pointer"));
-                               } else if(rpncmd == "dbclr") {
-                                       db_close(rpn_db);
-                                       rpn_db = db_create();
-                                       db_put(rpn_db, "stack.pointer", "0");
-                                       db_put(rpn_db, "stack.pos", "-1");
-                               } else if(rpncmd == "dbsave") {
-                                       s = rpn_pop();
-                                       if(!rpn_error)
-                                               db_save(rpn_db, s);
-                               } else if(rpncmd == "dbload") {
-                                       s = rpn_pop();
-                                       if(!rpn_error)
-                                       {
-                                               db_close(rpn_db);
-                                               rpn_db = db_load(s);
-                                       }
-                               } else if(rpncmd == "dbins") {
-                                       s = rpn_pop();
-                                       if(!rpn_error)
-                                               //if(rpn_sp > 0)
-                                       {
-                                               j = stof(db_get(rpn_db, "stack.pointer"));
-                                               i = stof(db_get(rpn_db, "stack.pos"));
-                                               
-                                               if(i < 0)
-                                               {
-                                                       i = 0;
-                                                       db_put(rpn_db, "stack.pos", "0");
-                                               }
-                                               
-                                               db_put(rpn_db, "stack.pointer", ftos(j+1));
-                                               for(--j; j >= i; --j)
-                                               {
-                                                       db_put(rpn_db, strcat("stack.", ftos(j+1)),
-                                                              db_get(rpn_db, (strcat("stack.", ftos(j))))
-                                                               );
-                                               }
-                                               db_put(rpn_db, strcat("stack.", ftos(i)), s);
-                                       }
-                               } else if(rpncmd == "dbext") {
-                                       j = stof(db_get(rpn_db, "stack.pointer"));
-                                       i = stof(db_get(rpn_db, "stack.pos"));
-                                       if(!j)
-                                       {
-                                               rpn_error = TRUE;
-                                               print("rpn: empty database\n");
-                                       } else {
-                                               --j;
-                                               rpn_push(db_get(rpn_db, strcat("stack.", ftos(i))));
-                                               db_put(rpn_db, "stack.pointer", ftos(j));
-                                               if(i == j)
-                                               {
-                                                       db_put(rpn_db, "stack.pos", ftos(j-1));
-                                               } else {
-                                                       while(i < j)
-                                                       {
-                                                               db_put(rpn_db, strcat("stack.", ftos(i)),
-                                                                      db_get(rpn_db, (strcat("stack.", ftos(i+1))))
-                                                                       );
-                                                               ++i;
-                                                       }
-                                               }
-                                       }
-                               } else if(rpncmd == "dbread") {
-                                       s = db_get(rpn_db, "stack.pos");
-                                       if(stof(s) >= 0)
-                                       {
-                                               rpn_push(db_get(rpn_db, strcat("stack.", s)));
-                                       } else {
-                                               rpn_error = 1;
-                                               print("rpn: empty database\n");
-                                       }
-                               } else if(rpncmd == "dbat") {
-                                       rpn_push(db_get(rpn_db, "stack.pos"));
-                               } else if(rpncmd == "dbmov") {
-                                       j = stof(db_get(rpn_db, "stack.pointer"));
-                                       i = stof(db_get(rpn_db, "stack.pos"));
-                                       i += rpn_popf();
-                                       if(!rpn_error)
-                                       {
-                                               if(i < 0 || i >= j)
-                                               {
-                                                       print("rpn: database cursor out of bounds\n");
-                                                       rpn_error = TRUE;
-                                               }
-                                               if(!rpn_error)
-                                               {
-                                                       db_put(rpn_db, "stack.pos", ftos(i));
-                                               }
-                                       }
-                               } else if(rpncmd == "dbgoto") {
-                                       s = rpn_pop();
-                                       j = stof(db_get(rpn_db, "stack.pointer"));
-                                       if(!j)
-                                       {
-                                               rpn_error = TRUE;
-                                               print("rpn: empty database, cannot move cursor\n");
-                                       }
-                                       if(!rpn_error)
-                                       {
-                                               if(s == "end")
-                                                       i = stof(db_get(rpn_db, "stack.pointer"))-1;
-                                               else if(s == "beg")
-                                                       i = 0;
-                                               else
-                                                       i = stof(s);
-                                               
-                                               j = stof(db_get(rpn_db, "stack.pointer"));
-                                               if(i < 0 || i >= j)
-                                               {
-                                                       print("rpn: database cursor destination out of bounds\n");
-                                                       rpn_error = TRUE;
-                                               }
-                                               if(!rpn_error)
-                                               {
-                                                       db_put(rpn_db, "stack.pos", ftos(i));
-                                               }
-                                       }
-                               } else if(rpncmd == "union") {
-                                       // s s2 union
-                                       s2 = rpn_pop();
-                                       s = rpn_get();
-                                       f = tokenize_console(s);
-                                       f2 = tokenize_console(strcat(s, " ", s2));
-                                       // tokens 0..(f-1) represent s
-                                       // tokens f..f2 represent s2
-                                       // UNION: add all tokens to s that are in s2 but not in s
-                                       s = "";
-                                       for(i = 0; i < f; ++i)  
-                                               s = strcat(s, " ", argv(i));
-                                       for(i = f; i < f2; ++i) {
-                                               for(j = 0; j < f; ++j)
-                                                       if(argv(i) == argv(j))
-                                                               goto skip_union;
-                                               s = strcat(s, " ", argv(i));
-:skip_union
-                                       }
-                                       if(substring(s, 0, 1) == " ")
-                                               s = substring(s, 1, 99999);
-                                       rpn_set(s);
-                                       tokenize_console(command);
-                               } else if(rpncmd == "intersection") {
-                                       // s s2 intersection
-                                       s2 = rpn_pop();
-                                       s = rpn_get();
-                                       f = tokenize_console(s);
-                                       f2 = tokenize_console(strcat(s, " ", s2));
-                                       // tokens 0..(f-1) represent s
-                                       // tokens f..f2 represent s2
-                                       // INTERSECTION: keep only the tokens from s that are also in s2
-                                       s = "";
-                                       for(i = 0; i < f; ++i) {
-                                               for(j = f; j < f2; ++j)
-                                                       if(argv(i) == argv(j))
-                                                       {
-                                                               s = strcat(s, " ", argv(i));
-                                                               break;
-                                                       }
-                                       }
-                                       if(substring(s, 0, 1) == " ")
-                                               s = substring(s, 1, 99999);
-                                       rpn_set(s);
-                                       tokenize_console(command);
-                               } else if(rpncmd == "difference") {
-                                       // s s2 difference
-                                       s2 = rpn_pop();
-                                       s = rpn_get();
-                                       f = tokenize_console(s);
-                                       f2 = tokenize_console(strcat(s, " ", s2));
-                                       // tokens 0..(f-1) represent s
-                                       // tokens f..f2 represent s2
-                                       // DIFFERENCE: keep only the tokens from s that are not in s2
-                                       s = "";
-                                       for(i = 0; i < f; ++i) {
-                                               for(j = f; j < f2; ++j)
-                                                       if(argv(i) == argv(j))
-                                                               goto skip_difference;
-                                               s = strcat(s, " ", argv(i));
-:skip_difference
-                                       }
-                                       if(substring(s, 0, 1) == " ")
-                                               s = substring(s, 1, 99999);
-                                       rpn_set(s);
-                                       tokenize_console(command);
-                               } else if(rpncmd == "shuffle") {
-                                       // s shuffle
-                                       s = rpn_get();
-                                       f = tokenize_console(s);
-
-                                       for(i = 0; i < f - 1; ++i) {
-                                               // move a random item from i..f-1 to position i
-                                               s = "";
-                                               f2 = floor(random() * (f - i) + i);
-                                               for(j = 0; j < i; ++j)
-                                                       s = strcat(s, " ", argv(j));
-                                               s = strcat(s, " ", argv(f2));
-                                               for(j = i; j < f; ++j)
-                                                       if(j != f2)
-                                                               s = strcat(s, " ", argv(j));
-                                               f = tokenize_console(s);
-                                       }
-
-                                       if(substring(s, 0, 1) == " ")
-                                               s = substring(s, 1, 99999);
-                                       rpn_set(s);
-                                       tokenize_console(command);
-                               } else if(rpncmd == "fexists_assert") {
-                                       s = rpn_pop();
-                                       if(!rpn_error)
-                                       {
-                                               if (!fexists(s))
-                                               {
-                                                       print("rpn: ERROR: ", s, " does not exist!\n");
-                                                       rpn_error = TRUE;
-                                               }
-                                       }
-                               } else if(rpncmd == "fexists") {
-                                       s = rpn_get();
-                                       if(!rpn_error)
-                                       {
-                                               if (fexists(s))
-                                                       rpn_setf(1);
-                                               else
-                                                       rpn_setf(0);
-                                       }
-                               } else if(rpncmd == "localtime") {
-                                       rpn_set(strftime(TRUE, rpn_get()));
-                               } else if(rpncmd == "gmtime") {
-                                       rpn_set(strftime(FALSE, rpn_get()));
-                               } else if(rpncmd == "time") {
-                                       rpn_pushf(time);
-                               } else if(rpncmd == "digest") {
-                                       s = rpn_pop();
-                                       rpn_set(digest_hex(s, rpn_get()));
-                               } else if(rpncmd == "sprintf1s") {
-                                       s = rpn_pop();
-                                       rpn_set(sprintf(s, rpn_get()));
-                               } else {
-                                       rpn_push(cvar_string(rpncmd));
-                               }
-                               if(rpn_error)
-                                       break;
-                       }
-                       while(rpn_sp > 0)
-                       {
-                               s = rpn_pop();
-                               print("rpn: still on stack: ", s, "\n");
-                       }
-                       return TRUE;
-               }
-       } else if(argv(0) == "addtolist") {
-               if(argc >= 2)
-               {
-                       s = argv(1);
-                       s2 = argv(2);
-                       if(cvar_string(s) == "")
-                               cvar_set(s, s2);
-                       else {
-                               n = tokenizebyseparator(cvar_string(s), " ");
-                               for(i = 0; i < n; ++i)
-                                       if(argv(i) == s2)
-                                               return TRUE; // already in list
-                               cvar_set(s, strcat(s2, " ", cvar_string(s)));
-                       }
-               }
-               return TRUE;
-       }
-       else if(argv(0) == "records") {
-               print(records_reply);
-               return TRUE;
-       }
-       else if(argv(0) == "ladder") {
-               print(ladder_reply);
-               return TRUE;
-       }
-       else if(argv(0) == "rankings") {
-               print(rankings_reply);
-               return TRUE;
-#ifdef MENUQC
-       } else if(argv(0) == "cp") {
-               if(argc >= 2)
-               {
-                       s = argv(1);
-                       for(i = 2; i < argc; ++i)
-                               s = strcat(s, " ", argv(i));
-                       centerprint(unescape(s));
-               }
-               return TRUE;
-#endif
-       }
-
-       return FALSE;
-}
index aad95a1fe5421c38ae4169ae282bb8c42978e079..1b32c9d1d5a076c3825f5ea9900522282f7abd40 100644 (file)
@@ -472,8 +472,7 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType, fl
        {
                sa = car(s);
                if(sa != "")
-                       if(cvar("g_ctf_win_mode") < 2)
-                               cvar_set("fraglimit", sa);
+                       cvar_set("fraglimit", sa);
                s = cdr(s);
        }
 
@@ -535,26 +534,11 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType, fl
 
 string _MapInfo_GetDefaultEx(float t)
 {
-       switch(t)
-       {
-               case MAPINFO_TYPE_DEATHMATCH:      return "timelimit=20 pointlimit=30 leadlimit=0";
-               case MAPINFO_TYPE_TEAM_DEATHMATCH: return "timelimit=20 pointlimit=50 teams=2 leadlimit=0";
-               case MAPINFO_TYPE_DOMINATION:      return "timelimit=20 pointlimit=200 teams=2 leadlimit=0";
-               case MAPINFO_TYPE_CTF:             return "timelimit=20 pointlimit=300 caplimit=10 leadlimit=0";
-               case MAPINFO_TYPE_RUNEMATCH:       return "timelimit=20 pointlimit=200 leadlimit=0";
-               case MAPINFO_TYPE_LMS:             return "timelimit=20 lives=9 leadlimit=0";
-               case MAPINFO_TYPE_ARENA:           return "timelimit=20 pointlimit=10 leadlimit=0";
-               case MAPINFO_TYPE_CA:              return "timelimit=20 pointlimit=10 leadlimit=0";
-               case MAPINFO_TYPE_KEYHUNT:         return "timelimit=20 pointlimit=1000 teams=3 leadlimit=0";
-               case MAPINFO_TYPE_ASSAULT:         return "timelimit=20";
-               case MAPINFO_TYPE_RACE:            return "timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0";
-               case MAPINFO_TYPE_ONSLAUGHT:       return "timelimit=20";
-               case MAPINFO_TYPE_NEXBALL:         return "timelimit=20 pointlimit=5 leadlimit=0";
-               case MAPINFO_TYPE_CTS:             return "timelimit=20 skill=-1";
-               case MAPINFO_TYPE_FREEZETAG:       return "timelimit=20 pointlimit=10 teams=2 leadlimit=0";
-               case MAPINFO_TYPE_KEEPAWAY:        return "timelimit=20 pointlimit=30";
-               default:                           return "";
-       }
+       entity e;
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               if(t == e.weapons)
+                       return e.model2;
+       return "";
 }
 
 void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
@@ -562,7 +546,6 @@ void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
        string sa, k, v;
        float p;
        string fraglimit_normal;
-       string fraglimit_caps;
        string fraglimit_teams;
 
        MapInfo_Map_supportedGametypes |= pThisType;
@@ -580,7 +563,6 @@ void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
        cvar_set("g_race_qualifying_timelimit", cvar_defstring("g_race_qualifying_timelimit"));
 
        fraglimit_normal = string_null;
-       fraglimit_caps = string_null;
        fraglimit_teams = string_null;
 
        s = strcat(_MapInfo_GetDefaultEx(pWantedType), " ", s);
@@ -612,14 +594,10 @@ void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
                {
                        cvar_set("leadlimit", v);
                }
-               else if(k == "pointlimit" || k == "fraglimit" || k == "lives" || k == "laplimit")
+               else if(k == "pointlimit" || k == "fraglimit" || k == "lives" || k == "laplimit" || k == "caplimit")
                {
                        fraglimit_normal = v;
                }
-               else if(k == "caplimit")
-               {
-                       fraglimit_caps = v;
-               }
                else if(k == "teampointlimit" || k == "teamlaplimit")
                {
                        fraglimit_teams = v;
@@ -644,12 +622,7 @@ void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
                }
        }
 
-       if(pWantedType == MAPINFO_TYPE_CTF && cvar("g_ctf_win_mode") < 2)
-       {
-               if(fraglimit_caps)
-                       cvar_set("fraglimit", fraglimit_caps);
-       }
-       else if(pWantedType == MAPINFO_TYPE_RACE && cvar("g_race_teams") >= 2)
+       if(pWantedType == MAPINFO_TYPE_RACE && cvar("g_race_teams") >= 2)
        {
                if(fraglimit_teams)
                        cvar_set("fraglimit", fraglimit_teams);
@@ -663,46 +636,33 @@ void _MapInfo_Map_ApplyGametypeEx(string s, float pWantedType, float pThisType)
 
 float MapInfo_Type_FromString(string t)
 {
-       if     (t == "dm")      return MAPINFO_TYPE_DEATHMATCH;
-       else if(t == "tdm")     return MAPINFO_TYPE_TEAM_DEATHMATCH;
-       else if(t == "dom")     return MAPINFO_TYPE_DOMINATION;
-       else if(t == "ctf")     return MAPINFO_TYPE_CTF;
-       else if(t == "rune")    return MAPINFO_TYPE_RUNEMATCH;
-       else if(t == "lms")     return MAPINFO_TYPE_LMS;
-       else if(t == "arena")   return MAPINFO_TYPE_ARENA;
-       else if(t == "ca")      return MAPINFO_TYPE_CA;
-       else if(t == "kh")      return MAPINFO_TYPE_KEYHUNT;
-       else if(t == "as")      return MAPINFO_TYPE_ASSAULT;
-       else if(t == "ons")     return MAPINFO_TYPE_ONSLAUGHT;
-       else if(t == "rc")      return MAPINFO_TYPE_RACE;
-       else if(t == "nexball") return MAPINFO_TYPE_NEXBALL;
-       else if(t == "cts")     return MAPINFO_TYPE_CTS;
-       else if(t == "freezetag")       return MAPINFO_TYPE_FREEZETAG;
-       else if(t == "keepaway") return MAPINFO_TYPE_KEEPAWAY;
-       else if(t == "all")     return MAPINFO_TYPE_ALL;
-       else                    return 0;
+       entity e;
+       if(t == "all")
+               return MAPINFO_TYPE_ALL;
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               if(t == e.mdl)
+                       return e.weapons;
+       return 0;
 }
 
 string MapInfo_Type_ToString(float t)
 {
-       if     (t == MAPINFO_TYPE_DEATHMATCH)      return "dm";
-       else if(t == MAPINFO_TYPE_TEAM_DEATHMATCH) return "tdm";
-       else if(t == MAPINFO_TYPE_DOMINATION)      return "dom";
-       else if(t == MAPINFO_TYPE_CTF)             return "ctf";
-       else if(t == MAPINFO_TYPE_RUNEMATCH)       return "rune";
-       else if(t == MAPINFO_TYPE_LMS)             return "lms";
-       else if(t == MAPINFO_TYPE_ARENA)           return "arena";
-       else if(t == MAPINFO_TYPE_CA)              return "ca";
-       else if(t == MAPINFO_TYPE_KEYHUNT)         return "kh";
-       else if(t == MAPINFO_TYPE_ASSAULT)         return "as";
-       else if(t == MAPINFO_TYPE_ONSLAUGHT)       return "ons";
-       else if(t == MAPINFO_TYPE_RACE)            return "rc";
-       else if(t == MAPINFO_TYPE_NEXBALL)         return "nexball";
-       else if(t == MAPINFO_TYPE_CTS)             return "cts";
-       else if(t == MAPINFO_TYPE_FREEZETAG)       return "freezetag";
-       else if(t == MAPINFO_TYPE_KEEPAWAY)        return "keepaway";
-       else if(t == MAPINFO_TYPE_ALL)             return "all";
-       else                                       return "";
+       entity e;
+       if(t == MAPINFO_TYPE_ALL)     
+               return "all";
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               if(t == e.weapons)
+                       return e.mdl;
+       return "";
+}
+
+string MapInfo_Type_ToText(float t)
+{
+       entity e;
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               if(t == e.weapons)
+                       return e.message;
+       return _("@!#%'n Tuba Throwing");
 }
 
 void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s, float recurse)
@@ -1192,38 +1152,16 @@ float MapInfo_CurrentFeatures()
 
 float MapInfo_CurrentGametype()
 {
-       if(cvar("g_domination"))
-               return MAPINFO_TYPE_DOMINATION;
-       else if(cvar("g_ctf"))
-               return MAPINFO_TYPE_CTF;
-       else if(cvar("g_runematch"))
-               return MAPINFO_TYPE_RUNEMATCH;
-       else if(cvar("g_tdm"))
-               return MAPINFO_TYPE_TEAM_DEATHMATCH;
-       else if(cvar("g_assault"))
-               return MAPINFO_TYPE_ASSAULT;
-       else if(cvar("g_lms"))
-               return MAPINFO_TYPE_LMS;
-       else if(cvar("g_arena"))
-               return MAPINFO_TYPE_ARENA;
-       else if(cvar("g_ca"))
-               return MAPINFO_TYPE_CA; 
-       else if(cvar("g_keyhunt"))
-               return MAPINFO_TYPE_KEYHUNT;
-       else if(cvar("g_onslaught"))
-               return MAPINFO_TYPE_ONSLAUGHT;
-       else if(cvar("g_race"))
-               return MAPINFO_TYPE_RACE;
-       else if(cvar("g_nexball"))
-               return MAPINFO_TYPE_NEXBALL;
-       else if(cvar("g_cts"))
-               return MAPINFO_TYPE_CTS;
-       else if(cvar("g_freezetag"))
-               return MAPINFO_TYPE_FREEZETAG;
-       else if(cvar("g_keepaway"))
-               return MAPINFO_TYPE_KEEPAWAY;
-       else
-               return MAPINFO_TYPE_DEATHMATCH;
+       float prev;
+       entity e;
+       prev = cvar("gamecfg");
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               if(cvar(e.netname))
+                       if(prev != e.weapons)
+                               return e.weapons;
+       if(prev)
+               return prev;
+       return MAPINFO_TYPE_DEATHMATCH;
 }
 
 float _MapInfo_CheckMap(string s) // returns 0 if the map can't be played with the current settings, 1 otherwise
@@ -1245,52 +1183,14 @@ float MapInfo_CheckMap(string s) // returns 0 if the map can't be played with th
        return r;
 }
 
-string MapInfo_GetGameTypeCvar(float t)
-{
-       switch(t)
-       {
-               case MAPINFO_TYPE_DEATHMATCH: return "g_dm";
-               case MAPINFO_TYPE_TEAM_DEATHMATCH: return "g_tdm";
-               case MAPINFO_TYPE_DOMINATION: return "g_domination";
-               case MAPINFO_TYPE_CTF: return "g_ctf";
-               case MAPINFO_TYPE_RUNEMATCH: return "g_runematch";
-               case MAPINFO_TYPE_LMS: return "g_lms";
-               case MAPINFO_TYPE_ARENA: return "g_arena";
-               case MAPINFO_TYPE_CA: return "g_ca";
-               case MAPINFO_TYPE_KEYHUNT: return "g_kh";
-               case MAPINFO_TYPE_ASSAULT: return "g_assault";
-               case MAPINFO_TYPE_ONSLAUGHT: return "g_onslaught";
-               case MAPINFO_TYPE_RACE: return "g_race";
-               case MAPINFO_TYPE_NEXBALL: return "g_nexball";
-               case MAPINFO_TYPE_FREEZETAG: return "g_freezetag";
-               case MAPINFO_TYPE_CTS: return "g_cts";
-               case MAPINFO_TYPE_KEEPAWAY:             return "g_keepaway";
-               default: return "";
-       }
-}
-
 void MapInfo_SwitchGameType(float t)
 {
-       cvar_set("gamecfg",      "0");
-       cvar_set("g_dm",         (t == MAPINFO_TYPE_DEATHMATCH)      ? "1" : "0");
-       cvar_set("g_tdm",        (t == MAPINFO_TYPE_TEAM_DEATHMATCH) ? "1" : "0");
-       cvar_set("g_domination", (t == MAPINFO_TYPE_DOMINATION)      ? "1" : "0");
-       cvar_set("g_ctf",        (t == MAPINFO_TYPE_CTF)             ? "1" : "0");
-       cvar_set("g_runematch",  (t == MAPINFO_TYPE_RUNEMATCH)       ? "1" : "0");
-       cvar_set("g_lms",        (t == MAPINFO_TYPE_LMS)             ? "1" : "0");
-       cvar_set("g_arena",      (t == MAPINFO_TYPE_ARENA)           ? "1" : "0");
-       cvar_set("g_ca",         (t == MAPINFO_TYPE_CA)              ? "1" : "0");
-       cvar_set("g_keyhunt",    (t == MAPINFO_TYPE_KEYHUNT)         ? "1" : "0");
-       cvar_set("g_assault",    (t == MAPINFO_TYPE_ASSAULT)         ? "1" : "0");
-       cvar_set("g_onslaught",  (t == MAPINFO_TYPE_ONSLAUGHT)       ? "1" : "0");
-       cvar_set("g_race",       (t == MAPINFO_TYPE_RACE)            ? "1" : "0");
-       cvar_set("g_nexball",    (t == MAPINFO_TYPE_NEXBALL)         ? "1" : "0");
-       cvar_set("g_cts",        (t == MAPINFO_TYPE_CTS)             ? "1" : "0");
-       cvar_set("g_freezetag",  (t == MAPINFO_TYPE_FREEZETAG)       ? "1" : "0");
-       cvar_set("g_keepaway",   (t == MAPINFO_TYPE_KEEPAWAY)        ? "1" : "0");
+       entity e;
+       for(e = MapInfo_Type_first; e; e = e.enemy)
+               cvar_set(e.netname, (t == e.weapons) ? "1" : "0");
 }
 
-void MapInfo_LoadMap(string s)
+void MapInfo_LoadMap(string s, float reinit)
 {
        MapInfo_Map_supportedGametypes = 0;
        // we shouldn't need this, as LoadMapSettings already fixes the gametype
@@ -1299,7 +1199,12 @@ void MapInfo_LoadMap(string s)
        //      print("EMERGENCY: can't play the selected map in the given game mode. Falling back to DM.\n");
        //      MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
        //}
-       localcmd(strcat("\nsettemp_restore\nchangelevel ", s, "\n"));
+       
+       cvar_settemp_restore();
+       if(reinit)
+               localcmd(strcat("\nmap ", s, "\n"));
+       else
+               localcmd(strcat("\nchangelevel ", s, "\n"));
 }
 
 string MapInfo_ListAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
@@ -1335,16 +1240,35 @@ string MapInfo_ListAllAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
        return substring(out, 1, strlen(out) - 1);
 }
 
+void MapInfo_LoadMapSettings_SaveGameType(float t)
+{
+       MapInfo_SwitchGameType(t);
+       cvar_set("gamecfg", ftos(t));
+       MapInfo_LoadedGametype = t;
+}
+
 void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
 {
-       float t, t0;
+       float t;
+
+       t = MapInfo_CurrentGametype();
+       MapInfo_LoadMapSettings_SaveGameType(t);
+
        if(!_MapInfo_CheckMap(s)) // with underscore, it keeps temps
        {
+               if(cvar("g_mapinfo_allow_unsupported_modes_and_let_stuff_break"))
+               {
+                       print("EMERGENCY: can't play the selected map in the given game mode. Working with only the override settings.\n");
+                       _MapInfo_Map_ApplyGametypeEx("", t, t);
+                       return; // do not call Get_ByName!
+               }
+
                if(MapInfo_Map_supportedGametypes == 0)
                {
                        print("Mapinfo system is not functional at all. Assuming deathmatch.\n");
                        MapInfo_Map_supportedGametypes = MAPINFO_TYPE_DEATHMATCH;
-                       _MapInfo_Map_ApplyGametypeEx("", t0, t0);
+                       MapInfo_LoadMapSettings_SaveGameType(MAPINFO_TYPE_DEATHMATCH);
+                       _MapInfo_Map_ApplyGametypeEx("", MAPINFO_TYPE_DEATHMATCH, MAPINFO_TYPE_DEATHMATCH);
                        return; // do not call Get_ByName!
                }
 
@@ -1354,23 +1278,12 @@ void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
                        t *= 2;
                        MapInfo_Map_supportedGametypes = floor(MapInfo_Map_supportedGametypes / 2);
                }
+
                // t is now a supported mode!
-               t0 = MapInfo_CurrentGametype();
-               if(cvar("g_mapinfo_allow_unsupported_modes_and_let_stuff_break"))
-               {
-                       print("EMERGENCY: can't play the selected map in the given game mode. Working with only the override settings.\n");
-                       cvar_settemp_restore();
-                       _MapInfo_Map_ApplyGametypeEx("", t0, t0);
-                       return; // do not call Get_ByName!
-               }
-               else
-               {
-                       print("EMERGENCY: can't play the selected map in the given game mode. Falling back to a supported mode.\n");
-                       MapInfo_SwitchGameType(t);
-               }
+               print("EMERGENCY: can't play the selected map in the given game mode. Falling back to a supported mode.\n");
+               MapInfo_LoadMapSettings_SaveGameType(t);
        }
-       cvar_settemp_restore();
-       MapInfo_Get_ByName(s, 1, MapInfo_CurrentGametype());
+       MapInfo_Get_ByName(s, 1, t);
 }
 
 void MapInfo_ClearTemps()
index ebfc0e4438e2c6426671a26dd09373221288b418..e47a28369f783589cfae824b6b603a61e0b91a03 100644 (file)
@@ -1,20 +1,85 @@
-float MAPINFO_TYPE_DEATHMATCH          = 1;
-float MAPINFO_TYPE_LMS                 = 2;
-float MAPINFO_TYPE_ARENA               = 4;
-float MAPINFO_TYPE_RUNEMATCH           = 8;
-float MAPINFO_TYPE_RACE                        = 16;
-float MAPINFO_TYPE_CTS                 = 32;
-float MAPINFO_TYPE_TEAM_DEATHMATCH     = 64;
-float MAPINFO_TYPE_CTF                 = 128;
-float MAPINFO_TYPE_CA                  = 256;
-float MAPINFO_TYPE_DOMINATION          = 512;
-float MAPINFO_TYPE_KEYHUNT             = 1024;
-float MAPINFO_TYPE_ASSAULT             = 2048;
-float MAPINFO_TYPE_ONSLAUGHT           = 4096;
-float MAPINFO_TYPE_NEXBALL             = 8192;
-float MAPINFO_TYPE_FREEZETAG           = 16384;
-float MAPINFO_TYPE_KEEPAWAY    = 32768;
-float MAPINFO_TYPE_ALL                 = 65535; // this has to include all above bits
+var float MAPINFO_TYPE_ALL = 0;
+entity MapInfo_Type_first;
+entity MapInfo_Type_last;
+.entity enemy; // internal next pointer
+
+.float weapons; // game type ID
+.string netname; // game type name as in cvar (with g_ prefix)
+.string mdl; // game type short name
+.string message; // human readable name
+.string model2; // game type defaults
+
+#define REGISTER_GAMETYPE(hname,sname,g_name,NAME,defaults) \
+       var float MAPINFO_TYPE_##NAME; \
+       var entity MapInfo_Type##g_name; \
+       void RegisterGametypes_##g_name() \
+       { \
+               MAPINFO_TYPE_##NAME = MAPINFO_TYPE_ALL + 1; \
+               MAPINFO_TYPE_ALL |= MAPINFO_TYPE_##NAME; \
+               MapInfo_Type##g_name = spawn(); \
+               MapInfo_Type##g_name.weapons = MAPINFO_TYPE_##NAME; \
+               MapInfo_Type##g_name.netname = #g_name; \
+               MapInfo_Type##g_name.mdl = #sname; \
+               MapInfo_Type##g_name.message = hname; \
+               MapInfo_Type##g_name.model2 = defaults; \
+               if(!MapInfo_Type_first) \
+                       MapInfo_Type_first = MapInfo_Type##g_name; \
+               if(MapInfo_Type_last) \
+                       MapInfo_Type_last.enemy = MapInfo_Type##g_name; \
+               MapInfo_Type_last = MapInfo_Type##g_name; \
+       } \
+       ACCUMULATE_FUNCTION(RegisterGametypes, RegisterGametypes_##g_name)
+
+#define IS_GAMETYPE(NAME) \
+       (MapInfo_LoadedGametype == MAPINFO_TYPE_##NAME)
+
+REGISTER_GAMETYPE(_("Deathmatch"),dm,g_dm,DEATHMATCH,"timelimit=20 pointlimit=30 leadlimit=0")
+#define g_dm IS_GAMETYPE(DEATHMATCH)
+
+REGISTER_GAMETYPE(_("Last Man Standing"),lms,g_lms,LMS,"timelimit=20 lives=9 leadlimit=0")
+#define g_lms IS_GAMETYPE(LMS)
+
+REGISTER_GAMETYPE(_("Arena"),arena,g_arena,ARENA,"timelimit=20 pointlimit=10 leadlimit=0")
+#define g_arena IS_GAMETYPE(ARENA)
+
+REGISTER_GAMETYPE(_("Runematch"),rune,g_runematch,RUNEMATCH,"timelimit=20 pointlimit=200 leadlimit=0")
+#define g_runematch IS_GAMETYPE(RUNEMATCH)
+
+REGISTER_GAMETYPE(_("Race"),rc,g_race,RACE,"timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0")
+#define g_race IS_GAMETYPE(RACE)
+
+REGISTER_GAMETYPE(_("Race CTS"),cts,g_cts,CTS,"timelimit=20 skill=-1")
+#define g_cts IS_GAMETYPE(CTS)
+
+REGISTER_GAMETYPE(_("Team Deathmatch"),tdm,g_tdm,TEAM_DEATHMATCH,"timelimit=20 pointlimit=50 teams=2 leadlimit=0")
+#define g_tdm IS_GAMETYPE(TEAM_DEATHMATCH)
+
+REGISTER_GAMETYPE(_("Capture the Flag"),ctf,g_ctf,CTF,"timelimit=20 caplimit=10 leadlimit=0")
+#define g_ctf IS_GAMETYPE(CTF)
+
+REGISTER_GAMETYPE(_("Clan Arena"),ca,g_ca,CA,"timelimit=20 pointlimit=10 leadlimit=0")
+#define g_ca IS_GAMETYPE(CA)
+
+REGISTER_GAMETYPE(_("Domination"),dom,g_domination,DOMINATION,"timelimit=20 pointlimit=200 teams=2 leadlimit=0")
+#define g_domination IS_GAMETYPE(DOMINATION)
+
+REGISTER_GAMETYPE(_("Key Hunt"),kh,g_keyhunt,KEYHUNT,"timelimit=20 pointlimit=1000 teams=3 leadlimit=0")
+#define g_keyhunt IS_GAMETYPE(KEYHUNT)
+
+REGISTER_GAMETYPE(_("Assault"),as,g_assault,ASSAULT,"timelimit=20")
+#define g_assault IS_GAMETYPE(ASSAULT)
+
+REGISTER_GAMETYPE(_("Onslaught"),ons,g_onslaught,ONSLAUGHT,"timelimit=20")
+#define g_onslaught IS_GAMETYPE(ONSLAUGHT)
+
+REGISTER_GAMETYPE(_("Nexball"),nexball,g_nexball,NEXBALL,"timelimit=20 pointlimit=5 leadlimit=0")
+#define g_nexball IS_GAMETYPE(NEXBALL)
+
+REGISTER_GAMETYPE(_("Freeze Tag"),freezetag,g_freezetag,FREEZETAG,"timelimit=20 pointlimit=10 teams=2 leadlimit=0")
+#define g_freezetag IS_GAMETYPE(FREEZETAG)
+
+REGISTER_GAMETYPE(_("Keepaway"),keepaway,g_keepaway,KEEPAWAY,"timelimit=20 pointlimit=30")
+#define g_keepaway IS_GAMETYPE(KEEPAWAY)
 
 float MAPINFO_FEATURE_WEAPONS       = 1; // not defined for minstagib-only maps
 float MAPINFO_FEATURE_VEHICLES      = 2;
@@ -67,7 +132,7 @@ string MapInfo_FixName(string s);
 
 // play a map
 float MapInfo_CheckMap(string s); // returns 0 if the map can't be played with the current settings
-void MapInfo_LoadMap(string s);
+void MapInfo_LoadMap(string s, float reinit);
 
 // list all maps for the current game type
 string MapInfo_ListAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
@@ -77,11 +142,12 @@ string MapInfo_ListAllAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
 // gets a gametype from a string
 float MapInfo_Type_FromString(string t);
 string MapInfo_Type_ToString(float t);
-string MapInfo_GetGameTypeCvar(float t);
+string MapInfo_Type_ToText(float t);
 void MapInfo_SwitchGameType(float t);
 
 // to be called from worldspawn to set up cvars
 void MapInfo_LoadMapSettings(string s);
+float MapInfo_LoadedGametype; // game type that was active during map load
 
 void MapInfo_Cache_Destroy(); // disable caching
 void MapInfo_Cache_Create(); // enable caching
@@ -92,4 +158,4 @@ void MapInfo_ClearTemps(); // call this when done with mapinfo for this frame
 void MapInfo_Shutdown(); // call this in the shutdown handler
 
 #define MAPINFO_SETTEMP_ACL_USER cvar_string("g_mapinfo_settemp_acl")
-#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -settemp_* -_* -g_ban* +*"
+#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -_* -g_ban* +*"
index 10e4e345b28298ead91a5420e4c0c11da92dc36b..19339a36e99635908c379b21383ceff01d7dc42a 100644 (file)
@@ -195,21 +195,21 @@ vector colormapPaletteColor(float c, float isPants)
 {
        switch(c)
        {
-               case  0: return '0.800000 0.800000 0.800000';
-               case  1: return '0.600000 0.400000 0.000000';
+               case  0: return '1.000000 1.000000 1.000000';
+               case  1: return '1.000000 0.333333 0.000000';
                case  2: return '0.000000 1.000000 0.501961';
                case  3: return '0.000000 1.000000 0.000000';
                case  4: return '1.000000 0.000000 0.000000';
-               case  5: return '0.000000 0.658824 1.000000';
+               case  5: return '0.000000 0.666667 1.000000';
                case  6: return '0.000000 1.000000 1.000000';
                case  7: return '0.501961 1.000000 0.000000';
                case  8: return '0.501961 0.000000 1.000000';
                case  9: return '1.000000 0.000000 1.000000';
                case 10: return '1.000000 0.000000 0.501961';
-               case 11: return '0.600000 0.600000 0.600000';
+               case 11: return '0.000000 0.000000 1.000000';
                case 12: return '1.000000 1.000000 0.000000';
-               case 13: return '0.000000 0.313725 1.000000';
-               case 14: return '1.000000 0.501961 0.000000';
+               case 13: return '0.000000 0.333333 1.000000';
+               case 14: return '1.000000 0.666667 0.000000';
                case 15:
                        if(isPants)
                                return
@@ -396,27 +396,6 @@ void buf_save(float buf, string pFilename)
        fclose(fh);
 }
 
-string GametypeNameFromType(float g)
-{
-       if      (g == GAME_DEATHMATCH) return "dm";
-       else if (g == GAME_TEAM_DEATHMATCH) return "tdm";
-       else if (g == GAME_DOMINATION) return "dom";
-       else if (g == GAME_CTF) return "ctf";
-       else if (g == GAME_RUNEMATCH) return "rune";
-       else if (g == GAME_LMS) return "lms";
-       else if (g == GAME_ARENA) return "arena";
-       else if (g == GAME_CA) return "ca";
-       else if (g == GAME_KEYHUNT) return "kh";
-       else if (g == GAME_ONSLAUGHT) return "ons";
-       else if (g == GAME_ASSAULT) return "as";
-       else if (g == GAME_RACE) return "rc";
-       else if (g == GAME_NEXBALL) return "nexball";
-       else if (g == GAME_CTS) return "cts";
-       else if (g == GAME_FREEZETAG) return "freezetag";
-       else if (g == GAME_KEEPAWAY) return "ka";
-       return "dm";
-}
-
 string mmsss(float tenths)
 {
        float minutes;
@@ -523,31 +502,31 @@ float invertLengthLog(float x)
 vector decompressShortVector(float data)
 {
        vector out;
-       float pitch, yaw, len;
+       float p, y, len;
        if(data == 0)
                return '0 0 0';
-       pitch = (data & 0xF000) / 0x1000;
-       yaw =   (data & 0x0F80) / 0x80;
-       len =   (data & 0x007F);
+       p   = (data & 0xF000) / 0x1000;
+       y   = (data & 0x0F80) / 0x80;
+       len = (data & 0x007F);
 
-       //print("\ndecompress: pitch ", ftos(pitch)); print("yaw ", ftos(yaw)); print("len ", ftos(len), "\n");
+       //print("\ndecompress: p ", ftos(p)); print("y ", ftos(y)); print("len ", ftos(len), "\n");
 
-       if(pitch == 0)
+       if(p == 0)
        {
                out_x = 0;
                out_y = 0;
-               if(yaw == 31)
+               if(y == 31)
                        out_z = -1;
                else
                        out_z = +1;
        }
        else
        {
-               yaw   = .19634954084936207740 * yaw;
-               pitch = .19634954084936207740 * pitch - 1.57079632679489661922;
-               out_x = cos(yaw) *  cos(pitch);
-               out_y = sin(yaw) *  cos(pitch);
-               out_z =            -sin(pitch);
+               y   = .19634954084936207740 * y;
+               p = .19634954084936207740 * p - 1.57079632679489661922;
+               out_x = cos(y) *  cos(p);
+               out_y = sin(y) *  cos(p);
+               out_z =          -sin(p);
        }
 
        //print("decompressed: ", vtos(out), "\n");
@@ -558,7 +537,7 @@ vector decompressShortVector(float data)
 float compressShortVector(vector vec)
 {
        vector ang;
-       float pitch, yaw, len;
+       float p, y, len;
        if(vlen(vec) == 0)
                return 0;
        //print("compress: ", vtos(vec), "\n");
@@ -570,21 +549,21 @@ float compressShortVector(vector vec)
                error("BOGUS vectoangles");
        //print("angles: ", vtos(ang), "\n");
 
-       pitch = floor(0.5 + (ang_x + 90) * 16 / 180) & 15; // -90..90 to 0..14
-       if(pitch == 0)
+       p = floor(0.5 + (ang_x + 90) * 16 / 180) & 15; // -90..90 to 0..14
+       if(p == 0)
        {
                if(vec_z < 0)
-                       yaw = 31;
+                       y = 31;
                else
-                       yaw = 30;
+                       y = 30;
        }
        else
-               yaw = floor(0.5 + ang_y * 32 / 360)          & 31; // 0..360 to 0..32
+               y = floor(0.5 + ang_y * 32 / 360)          & 31; // 0..360 to 0..32
        len = invertLengthLog(vlen(vec));
 
-       //print("compressed: pitch ", ftos(pitch)); print("yaw ", ftos(yaw)); print("len ", ftos(len), "\n");
+       //print("compressed: p ", ftos(p)); print("y ", ftos(y)); print("len ", ftos(len), "\n");
 
-       return (pitch * 0x1000) + (yaw * 0x80) + len;
+       return (p * 0x1000) + (y * 0x80) + len;
 }
 
 void compressShortVector_init()
@@ -863,45 +842,49 @@ void get_mi_min_max_texcoords(float mode)
 }
 #endif
 
-#ifdef CSQC
-void cvar_settemp(string pKey, string pValue)
-{
-       error("cvar_settemp called from CSQC - use cvar_clientsettemp instead!");
-}
-void cvar_settemp_restore()
-{
-       error("cvar_settemp_restore called from CSQC - use cvar_clientsettemp instead!");
-}
-#else
-void cvar_settemp(string pKey, string pValue)
+float cvar_settemp(string tmp_cvar, string tmp_value)
 {
-       float i;
-       string settemp_var;
-       if(cvar_string(pKey) == pValue)
-               return;
-       i = cvar("settemp_idx");
-       cvar_set("settemp_idx", ftos(i+1));
-       settemp_var = strcat("_settemp_x", ftos(i));
-#ifdef MENUQC
-       registercvar(settemp_var, "", 0);
-#else
-       registercvar(settemp_var, "");
-#endif
-       cvar_set("settemp_list", strcat("1 ", pKey, " ", settemp_var, " ", cvar_string("settemp_list")));
-       cvar_set(settemp_var, cvar_string(pKey));
-       cvar_set(pKey, pValue);
+       float created_saved_value;
+       entity e;
+       
+       if not(tmp_cvar || tmp_value)
+       {
+               dprint("Error: Invalid usage of cvar_settemp(string, string); !\n");
+               return FALSE;
+       }
+       
+       for(e = world; (e = find(e, classname, "saved_cvar_value")); )
+               if(e.netname == tmp_cvar)
+                       goto saved; // skip creation
+                       
+       // creating a new entity to keep track of this cvar
+       e = spawn();
+       e.classname = "saved_cvar_value";
+       e.netname = strzone(tmp_cvar);
+       e.message = strzone(cvar_string(tmp_cvar));
+       created_saved_value = TRUE;
+       
+       // an entity for this cvar already exists
+       :saved
+       
+       // update the cvar to the value given
+       cvar_set(tmp_cvar, tmp_value);
+       
+       return created_saved_value;
 }
 
-void cvar_settemp_restore()
+float cvar_settemp_restore()
 {
-       // undo what cvar_settemp did
-       float n, i;
-       n = tokenize_console(cvar_string("settemp_list"));
-       for(i = 0; i < n - 3; i += 3)
-               cvar_set(argv(i + 1), cvar_string(argv(i + 2)));
-       cvar_set("settemp_list", "0");
+       float i;
+       entity e;
+       while((e = find(world, classname, "saved_cvar_value")))
+       {
+               cvar_set(e.netname, e.message);
+               remove(e);
+       }
+       
+       return i;
 }
-#endif
 
 float almost_equals(float a, float b)
 {
@@ -1426,7 +1409,7 @@ string textShortenToLength(string theText, float maxWidth, textLengthUpToLength_
 float isGametypeInFilter(float gt, float tp, float ts, string pattern)
 {
        string subpattern, subpattern2, subpattern3, subpattern4;
-       subpattern = strcat(",", GametypeNameFromType(gt), ",");
+       subpattern = strcat(",", MapInfo_Type_ToString(gt), ",");
        if(tp)
                subpattern2 = ",teams,";
        else
@@ -1435,7 +1418,7 @@ float isGametypeInFilter(float gt, float tp, float ts, string pattern)
                subpattern3 = ",teamspawns,";
        else
                subpattern3 = ",noteamspawns,";
-       if(gt == GAME_RACE || gt == GAME_CTS)
+       if(gt == MAPINFO_TYPE_RACE || gt == MAPINFO_TYPE_CTS)
                subpattern4 = ",race,";
        else
                subpattern4 = string_null;
@@ -1757,11 +1740,11 @@ float ReadInt24_t()
        return v;
 }
 #else
-void WriteInt24_t(float dest, float val)
+void WriteInt24_t(float dst, float val)
 {
        float v;
-       WriteShort(dest, (v = floor(val / 256)));
-       WriteByte(dest, val - v * 256); // 0..255
+       WriteShort(dst, (v = floor(val / 256)));
+       WriteByte(dst, val - v * 256); // 0..255
 }
 #endif
 #endif
@@ -2107,3 +2090,77 @@ float lowestbit(float f)
        f &~= f * 65536;
        return f;
 }
+
+/*
+string strlimitedlen(string input, string truncation, float strip_colors, float limit)
+{
+       if(strlen((strip_colors ? strdecolorize(input) : input)) <= limit)
+               return input;
+       else
+               return strcat(substring(input, 0, (strlen(input) - strlen(truncation))), truncation);
+}*/
+
+// escape the string to make it safe for consoles
+string MakeConsoleSafe(string input)
+{
+       input = strreplace("\n", "", input);
+       input = strreplace("\\", "\\\\", input);
+       input = strreplace("$", "$$", input);
+       input = strreplace("\"", "\\\"", input);
+       return input;
+}
+
+#ifndef MENUQC
+// get true/false value of a string with multiple different inputs
+float InterpretBoolean(string input)
+{
+       switch(strtolower(input))
+       {
+               case "yes":
+               case "true":
+               case "on":
+                       return TRUE;
+               
+               case "no":
+               case "false":
+               case "off":
+                       return FALSE;
+               
+               default: return stof(input);
+       }
+}
+#endif
+
+#ifdef CSQC
+entity ReadCSQCEntity()
+{
+       float f;
+       f = ReadShort();
+       if(f == 0)
+               return world;
+       return findfloat(world, entnum, f);
+}
+#endif
+
+float shutdown_running;
+#ifdef SVQC
+void SV_Shutdown()
+#endif
+#ifdef CSQC
+void CSQC_Shutdown()
+#endif
+#ifdef MENUQC
+void m_shutdown()
+#endif
+{
+       if(shutdown_running)
+       {
+               print("Recursive shutdown detected! Only restoring cvars...\n");
+       }
+       else
+       {
+               shutdown_running = 1;
+               Shutdown();
+       }
+       cvar_settemp_restore(); // this must be done LAST, but in any case
+}
index b2e77484e398695ea3b2febb290bd217cdf83af5..a8dd88c2f05b7b7490bd989a8015969533dc3106 100644 (file)
@@ -20,10 +20,6 @@ void wordwrap_sprint(string s, float l);
 #endif
 void wordwrap_cb(string s, float l, void(string) callback)
 
-float GameCommand_Generic(string cmd);
-// returns TRUE if handled, FALSE otherwise
-// tokenizes its input!
-
 // iterative depth-first search, with fields that go "up", "down left" and "right" in a tree
 // for each element, funcPre is called first, then funcPre and funcPost for all its children, and funcPost last
 void depthfirst(entity start, .entity up, .entity downleft, .entity right, void(entity, entity) funcPre, void(entity, entity) funcPost, entity pass);
@@ -59,7 +55,6 @@ void buf_save(float buf, string filename);
 float mod(float a, float b) { return a - (floor(a / b) * b); }   
 #endif
 
-string GametypeNameFromType(float g);
 #define TIME_TO_NTHS(t,n) floor((t) * (n) + 0.4)
 string mmsss(float t);
 string mmssss(float t);
@@ -85,12 +80,13 @@ float CheckWireframeBox(entity forent, vector v0, vector dvx, vector dvy, vector
 #endif
 
 string fixPriorityList(string pl, float from, float to, float subtract, float complete);
+string mapPriorityList(string order, string(string) mapfunc);
 string swapInPriorityList(string order, float i, float j);
 
 float cvar_value_issafe(string s);
 
-void cvar_settemp(string pKey, string pValue);
-void cvar_settemp_restore();
+float cvar_settemp(string pKey, string pValue);
+float cvar_settemp_restore();
 
 #ifndef MENUQC
 // modes: 0 = trust q3map2 (_mini images)
@@ -270,3 +266,22 @@ float xdecode(string s);
 #ifndef COMPAT_XON010_CHANNELS
 #define sound(e,c,s,v,a) sound7(e,c,s,v,a,0,0)
 #endif
+
+float lowestbit(float f);
+
+#ifdef CSQC
+entity ReadCSQCEntity()
+#endif
+
+#ifndef MENUQC
+string strtolower(string s);
+#endif
+
+string MakeConsoleSafe(string input);
+
+#ifndef MENUQC
+float InterpretBoolean(string input);
+#endif
+
+// generic shutdown handler
+void Shutdown();
diff --git a/qcsrc/csqcmodellib/cl_model.qc b/qcsrc/csqcmodellib/cl_model.qc
new file mode 100644 (file)
index 0000000..b77507b
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+var float autocvar_cl_lerpanim_maxdelta_framegroups = 0.1;
+var float autocvar_cl_nolerp = 0;
+
+.float csqcmodel_lerpfrac;
+.float csqcmodel_lerpfrac2;
+.float csqcmodel_lerpfractime;
+.float csqcmodel_lerpfrac2time;
+
+void CSQCModel_InterpolateAnimation_PreNote(float sf)
+{
+#ifdef CSQCMODEL_HAVE_TWO_FRAMES
+       if(sf & CSQCMODEL_PROPERTY_FRAME)
+       {
+               self.frame3 = self.frame;
+               self.frame3time = self.frame1time;
+       }
+       if(sf & CSQCMODEL_PROPERTY_FRAME2)
+       {
+               self.frame4 = self.frame2;
+               self.frame4time = self.frame2time;
+       }
+       if(sf & CSQCMODEL_PROPERTY_LERPFRAC)
+       {
+               self.csqcmodel_lerpfrac2 = self.csqcmodel_lerpfrac;
+               self.csqcmodel_lerpfrac2time = self.csqcmodel_lerpfractime;
+               self.lerpfrac = self.csqcmodel_lerpfrac;
+       }
+#else
+       if(sf & CSQCMODEL_PROPERTY_FRAME)
+       {
+               self.frame2 = self.frame;
+               self.frame2time = self.frame1time;
+       }
+#endif
+}
+
+void CSQCModel_InterpolateAnimation_Note(float sf)
+{
+#ifdef CSQCMODEL_HAVE_TWO_FRAMES
+       if(sf & CSQCMODEL_PROPERTY_FRAME)
+       {
+               self.frame1time = time;
+       }
+       if(sf & CSQCMODEL_PROPERTY_FRAME2)
+       {
+               self.frame2time = time;
+       }
+       if(sf & CSQCMODEL_PROPERTY_LERPFRAC)
+       {
+               self.csqcmodel_lerpfrac = self.lerpfrac;
+               self.csqcmodel_lerpfractime = time;
+       }
+#else
+       if(sf & CSQCMODEL_PROPERTY_FRAME)
+       {
+               self.frame1time = time;
+       }
+#endif
+}
+
+void CSQCModel_InterpolateAnimation_Do()
+{
+#ifdef CSQCMODEL_HAVE_TWO_FRAMES
+       if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0))
+       {
+               self.lerpfrac = self.csqcmodel_lerpfrac;
+               self.lerpfrac3 = 0;
+               self.lerpfrac4 = 0;
+       }
+       else
+       {
+               float l13, l24, llf;
+               float l24_13;
+
+               if(self.frame3time == 0) // if frame1/3 were not previously displayed, only frame1 can make sense
+                       l13 = 1;
+               else
+                       l13 = bound(0, (time - self.frame1time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1);
+
+               if(self.frame4time == 0) // if frame2/4 were not previously displayed, only frame2 can make sense
+                       l24 = 1;
+               else
+                       l24 = bound(0, (time - self.frame2time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1);
+
+               if(self.csqcmodel_lerpfrac2time == 0) // if there is no old lerpfrac (newly displayed model), only lerpfrac makes sense
+                       llf = 1;
+               else
+                       llf = bound(0, (time - self.csqcmodel_lerpfractime) / autocvar_cl_lerpanim_maxdelta_framegroups, 1);
+
+               l24_13 = self.csqcmodel_lerpfrac * llf + self.csqcmodel_lerpfrac2 * (1 - llf);
+
+               self.lerpfrac  = l24 * l24_13;
+               self.lerpfrac4 = (1 - l24) * l24_13;
+               self.lerpfrac3 = (1 - l13) * (1 - l24_13);
+
+               if(l24_13 == 0) // if frames 2/4 are not displayed, clear their frametime
+               {
+                       self.frame2time = 0;
+                       self.frame4time = 0;
+               }
+
+               if(l24_13 == 1) // if frames 1/3 are not displayed, clear their frametime
+               {
+                       self.frame1time = 0;
+                       self.frame3time = 0;
+               }
+       }
+#else
+       if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0))
+       {
+               self.lerpfrac = 0;
+       }
+       else
+       {
+               self.lerpfrac = 1 - bound(0, (time - self.frame1time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1);
+       }
+#endif
+}
+
+void CSQCModel_Draw()
+{
+       // some nice flags for CSQCMODEL_IF and the hooks
+       float isplayer = (self.entnum >= 1 && self.entnum <= maxclients);
+       float islocalplayer = (self.entnum == player_localnum + 1);
+       float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1));
+
+       // we don't do this for the local player as that one is already handled
+       // by CSQCPlayer_SetCamera()
+       if(!CSQCPlayer_IsLocalPlayer())
+               InterpolateOrigin_Do();
+
+       // TODO csqcplayers: run prediction here too
+       CSQCModel_InterpolateAnimation_Do();
+
+       { CSQCMODEL_HOOK_PREDRAW }
+
+       // inherit draw flags easily
+       entity root = self;
+       while(root.tag_entity)
+               root = root.tag_entity;
+       if(self != root)
+       {
+               self.renderflags &~= RF_EXTERNALMODEL | RF_VIEWMODEL;
+               self.renderflags |= (root.renderflags & (RF_EXTERNALMODEL | RF_VIEWMODEL));
+       }
+
+       // we're drawn, now teleporting is over
+       self.csqcmodel_teleported = 0;
+}
+
+void CSQCModel_Read(float isnew)
+{
+       float sf;
+       sf = ReadShort();
+
+       // some nice flags for CSQCMODEL_IF and the hooks
+       float isplayer = (self.entnum >= 1 && self.entnum <= maxclients);
+       float islocalplayer = (self.entnum == player_localnum + 1);
+       float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1));
+
+       self.iflags |= IFLAG_ANGLES; // interpolate angles too
+
+       { CSQCMODEL_HOOK_PREUPDATE }
+
+       CSQCPlayer_PreUpdate();
+       InterpolateOrigin_Undo();
+       CSQCModel_InterpolateAnimation_PreNote(sf);
+
+#define CSQCMODEL_IF(cond) if(cond) {
+#define CSQCMODEL_ENDIF }
+#define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
+       if(sf & flag) \
+               self.f = r();
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       if(sf & flag) \
+               self.f = (r() + mi) / s;
+       ALLPROPERTIES
+#undef CSQCMODEL_PROPERTY_SCALED
+#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
+
+       if(sf & CSQCMODEL_PROPERTY_MODELINDEX)
+               setmodelindex(self, self.modelindex); // this retrieves the .model key and sets mins/maxs/absmin/absmax
+
+       if(sf & CSQCMODEL_PROPERTY_TELEPORTED)
+       {
+               self.iflags |= IFLAG_TELEPORTED;
+               self.csqcmodel_teleported = 1;
+       }
+       
+       CSQCModel_InterpolateAnimation_Note(sf);
+       InterpolateOrigin_Note();
+       CSQCPlayer_PostUpdate();
+
+       { CSQCMODEL_HOOK_POSTUPDATE }
+
+#ifdef CSQCMODEL_SUPPORT_GETTAGINFO_BEFORE_DRAW
+       InterpolateOrigin_Do();
+       CSQCModel_InterpolateAnimation_Do();
+#endif
+
+       // relink
+       setorigin(self, self.origin);
+
+       // set obvious render flags
+#ifdef COMPAT_XON050_ENGINE
+       if(self.entnum == player_localentnum || self.entnum == spectatee_status)
+#else
+       if(self.entnum == player_localentnum)
+#endif
+               self.renderflags |= RF_EXTERNALMODEL;
+       else
+               self.renderflags &~= RF_EXTERNALMODEL;
+
+       // draw it
+       self.drawmask = MASK_NORMAL;
+       self.predraw = CSQCModel_Draw;
+}
+
+entity CSQCModel_server2csqc(float pl)
+{
+       return findfloat(world, entnum, pl); // FIXME optimize this using an array
+}
diff --git a/qcsrc/csqcmodellib/cl_model.qh b/qcsrc/csqcmodellib/cl_model.qh
new file mode 100644 (file)
index 0000000..e8ea901
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+void CSQCModel_Read(float isnew);
+
+#define CSQCMODEL_IF(cond)
+#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)
+       ALLPROPERTIES
+#undef CSQCMODEL_PROPERTY_SCALED
+#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
+
+entity CSQCModel_server2csqc(float pl);
+.float csqcmodel_teleported;
diff --git a/qcsrc/csqcmodellib/cl_player.qc b/qcsrc/csqcmodellib/cl_player.qc
new file mode 100644 (file)
index 0000000..ec7fe0d
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+var float autocvar_cl_predictionerrorcompensation = 0;
+
+// engine stuff
+.float pmove_flags;
+float pmove_onground; // weird engine flag we shouldn't really use but have to for now
+#define PMF_JUMP_HELD 1
+#define PMF_DUCKED 4
+#define PMF_ONGROUND 8
+#define REFDEFFLAG_TELEPORTED 1
+#define REFDEFFLAG_JUMPING 2
+
+entity csqcplayer;
+vector csqcplayer_origin, csqcplayer_velocity;
+float csqcplayer_sequence, player_pmflags;
+float csqcplayer_moveframe;
+vector csqcplayer_predictionerror;
+float csqcplayer_predictionerrortime;
+
+vector CSQCPlayer_GetPredictionError()
+{
+       if(!autocvar_cl_predictionerrorcompensation)
+               return '0 0 0';
+       if(time < csqcplayer_predictionerrortime)
+               return csqcplayer_predictionerror * (csqcplayer_predictionerrortime - time) * autocvar_cl_predictionerrorcompensation;
+       return '0 0 0';
+}
+
+void CSQCPlayer_SetPredictionError(vector v)
+{
+       if(!autocvar_cl_predictionerrorcompensation)
+               return;
+       csqcplayer_predictionerror = (csqcplayer_predictionerrortime - time) * autocvar_cl_predictionerrorcompensation * csqcplayer_predictionerror + v;
+       csqcplayer_predictionerrortime = time + 1.0 / autocvar_cl_predictionerrorcompensation;
+}
+
+void CSQCPlayer_Unpredict()
+{
+       if(csqcplayer_status == CSQCPLAYERSTATUS_UNPREDICTED)
+               return;
+       if(csqcplayer_status != CSQCPLAYERSTATUS_PREDICTED)
+               error("Cannot unpredict in current status");
+       self.origin = csqcplayer_origin;
+       self.velocity = csqcplayer_velocity;
+       csqcplayer_moveframe = csqcplayer_sequence+1; //+1 because the recieved frame has the move already done (server side)
+       self.pmove_flags = player_pmflags;
+}
+
+void CSQCPlayer_SetMinsMaxs()
+{
+       if(self.pmove_flags & PMF_DUCKED)
+       {
+               self.mins = PL_CROUCH_MIN;
+               self.maxs = PL_CROUCH_MAX;
+               self.view_ofs = PL_CROUCH_VIEW_OFS;
+       }
+       else
+       {
+               self.mins = PL_MIN;
+               self.maxs = PL_MAX;
+               self.view_ofs = PL_VIEW_OFS;
+       }
+}
+
+void CSQCPlayer_SavePrediction()
+{
+       player_pmflags = self.pmove_flags;
+       csqcplayer_origin = self.origin;
+       csqcplayer_velocity = self.velocity;
+       csqcplayer_sequence = servercommandframe;
+       csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED;
+}
+
+void CSQCPlayer_PredictTo(float endframe)
+{
+       CSQCPlayer_Unpredict();
+       CSQCPlayer_SetMinsMaxs();
+
+       csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED;
+
+       if (getstatf(STAT_HEALTH) <= 0)
+       {
+               csqcplayer_moveframe = clientcommandframe;
+               getinputstate(csqcplayer_moveframe-1);
+               return;
+       }
+
+       while(csqcplayer_moveframe < endframe)
+       {
+               if (!getinputstate(csqcplayer_moveframe))
+               {
+                       break;
+               }
+               runstandardplayerphysics(self);
+               CSQCPlayer_SetMinsMaxs();
+               csqcplayer_moveframe++;
+       }
+
+       //add in anything that was applied after (for low packet rate protocols)
+       input_angles = view_angles;
+}
+
+float CSQCPlayer_IsLocalPlayer()
+{
+       return (self == csqcplayer);
+}
+
+void(entity e, float fl) V_CalcRefdef = #640; // DP_CSQC_V_CALCREFDEF
+
+void CSQCPlayer_SetCamera()
+{
+       if(csqcplayer)
+       {
+               entity oldself;
+               oldself = self;
+               self = csqcplayer;
+
+#ifdef COMPAT_XON050_ENGINE
+               if(servercommandframe == 0 || clientcommandframe == 0 || !(checkextension("DP_CSQC_V_CALCREFDEF") || checkextension("DP_CSQC_V_CALCREFDEF_WIP1")))
+#else
+               if(servercommandframe == 0 || clientcommandframe == 0)
+#endif
+               {
+                       InterpolateOrigin_Do();
+                       self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
+
+                       // get crouch state from the server
+                       if(getstati(STAT_VIEWHEIGHT) == PL_VIEW_OFS_z)
+                               self.pmove_flags &~= PMF_DUCKED;
+                       else if(getstati(STAT_VIEWHEIGHT) == PL_CROUCH_VIEW_OFS_z)
+                               self.pmove_flags |= PMF_DUCKED;
+
+                       // get onground state from the server
+                       if(pmove_onground)
+                               self.pmove_flags |= PMF_ONGROUND;
+                       else
+                               self.pmove_flags &~= PMF_ONGROUND;
+
+                       CSQCPlayer_SetMinsMaxs();
+
+                       // override it back just in case
+                       self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
+               }
+               else
+               {
+                       if(csqcplayer_status == CSQCPLAYERSTATUS_FROMSERVER)
+                       {
+                               vector o, v;
+                               o = self.origin;
+                               v = pmove_vel; // TRICK: pmove_vel is set by the engine when we get here. No need to network velocity
+                               csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED;
+                               CSQCPlayer_PredictTo(servercommandframe + 1);
+                               CSQCPlayer_SetPredictionError(o - self.origin);
+                               self.origin = o;
+                               self.velocity = v;
+
+                               // get crouch state from the server
+                               if(getstati(STAT_VIEWHEIGHT) == PL_VIEW_OFS_z)
+                                       self.pmove_flags &~= PMF_DUCKED;
+                               else if(getstati(STAT_VIEWHEIGHT) == PL_CROUCH_VIEW_OFS_z)
+                                       self.pmove_flags |= PMF_DUCKED;
+
+                               // get onground state from the server
+                               if(pmove_onground)
+                                       self.pmove_flags |= PMF_ONGROUND;
+                               else
+                                       self.pmove_flags &~= PMF_ONGROUND;
+
+                               CSQCPlayer_SavePrediction();
+                       }
+                       CSQCPlayer_PredictTo(clientcommandframe + 1);
+
+                       CSQCPlayer_SetMinsMaxs();
+
+                       self.angles_y = input_angles_y;
+               }
+
+               // relink
+               setorigin(self, self.origin);
+
+               self = oldself;
+       }
+
+       entity view;
+#ifdef COMPAT_XON050_ENGINE
+       view = CSQCModel_server2csqc((spectatee_status > 0) ? spectatee_status : player_localentnum);
+#else
+       view = CSQCModel_server2csqc(player_localentnum);
+#endif
+
+       if(view && view != csqcplayer)
+       {
+               entity oldself = self;
+               self = view;
+               InterpolateOrigin_Do();
+               self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
+               self = oldself;
+       }
+
+#ifdef COMPAT_XON050_ENGINE
+       if(view && !(checkextension("DP_CSQC_V_CALCREFDEF") || checkextension("DP_CSQC_V_CALCREFDEF_WIP1")))
+       {
+               // legacy code, not totally correct, but good enough for not having V_CalcRefdef
+               setproperty(VF_ORIGIN, view.origin + '0 0 1' * getstati(STAT_VIEWHEIGHT));
+               setproperty(VF_ANGLES, view_angles);
+       }
+       else
+#endif
+       if(view)
+       {
+               var float refdefflags = 0;
+
+               if(view.csqcmodel_teleported)
+                       refdefflags |= REFDEFFLAG_TELEPORTED;
+
+               if(input_buttons & 4)
+                       refdefflags |= REFDEFFLAG_JUMPING;
+
+               V_CalcRefdef(view, refdefflags);
+       }
+       else
+       {
+               // FIXME by CSQC spec we have to do this:
+               // but it breaks chase cam
+               /*
+               setproperty(VF_ORIGIN, pmove_org + '0 0 1' * getstati(STAT_VIEWHEIGHT));
+               setproperty(VF_ANGLES, view_angles);
+               */
+       }
+
+       { CSQCPLAYER_HOOK_POSTCAMERASETUP }
+}
+
+void CSQCPlayer_Remove()
+{
+       csqcplayer = world;
+       cvar_settemp("cl_movement_replay", "1");
+}
+
+float CSQCPlayer_PreUpdate()
+{
+       if(self != csqcplayer)
+               return 0;
+       if(csqcplayer_status != CSQCPLAYERSTATUS_FROMSERVER)
+               CSQCPlayer_Unpredict();
+       return 1;
+}
+
+float CSQCPlayer_PostUpdate()
+{
+       if(self.entnum != player_localnum + 1)
+               return 0;
+       csqcplayer = self;
+       csqcplayer_status = CSQCPLAYERSTATUS_FROMSERVER;
+       cvar_settemp("cl_movement_replay", "0");
+       self.entremove = CSQCPlayer_Remove;
+       return 1;
+}
diff --git a/qcsrc/csqcmodellib/cl_player.qh b/qcsrc/csqcmodellib/cl_player.qh
new file mode 100644 (file)
index 0000000..0eecabe
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+float csqcplayer_status;
+#define CSQCPLAYERSTATUS_UNPREDICTED 0
+#define CSQCPLAYERSTATUS_FROMSERVER 1
+#define CSQCPLAYERSTATUS_PREDICTED 2
+
+void CSQCPlayer_SetCamera();
+float CSQCPlayer_PreUpdate();
+float CSQCPlayer_PostUpdate();
+float CSQCPlayer_IsLocalPlayer();
diff --git a/qcsrc/csqcmodellib/common.qh b/qcsrc/csqcmodellib/common.qh
new file mode 100644 (file)
index 0000000..587645c
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+noref string csqcmodel_license = "\
+Copyright (c) 2011 Rudolf Polzer\
+\
+Permission is hereby granted, free of charge, to any person obtaining a copy\
+of this software and associated documentation files (the \"Software\"), to\
+deal in the Software without restriction, including without limitation the\
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\
+sell copies of the Software, and to permit persons to whom the Software is\
+furnished to do so, subject to the following conditions:\
+\
+The above copyright notice and this permission notice shall be included in\
+all copies or substantial portions of the Software.\
+\
+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\
+IN THE SOFTWARE.\
+";
+
+.vector glowmod;
+.vector view_ofs;
+.float frame;
+.float frame1time;
+.float frame2;
+.float frame2time;
+.float lerpfrac;
+
+#define CSQCMODEL_PROPERTY_FRAME 32768
+#define CSQCMODEL_PROPERTY_FRAME2 16384
+#define CSQCMODEL_PROPERTY_LERPFRAC 8192
+#define CSQCMODEL_PROPERTY_TELEPORTED 4096 // the "teleport bit" cancelling interpolation
+#define CSQCMODEL_PROPERTY_MODELINDEX 2048
+#define CSQCMODEL_PROPERTY_ORIGIN 1024
+#define CSQCMODEL_PROPERTY_YAW 512
+#define CSQCMODEL_PROPERTY_PITCHROLL 256
+
+#define ALLPROPERTIES_COMMON \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_FRAME, float, ReadByte, WriteByte, frame) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_MODELINDEX, float, ReadShort, WriteShort, modelindex) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_ORIGIN, float, ReadCoord, WriteCoord, origin_x) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_ORIGIN, float, ReadCoord, WriteCoord, origin_y) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_ORIGIN, float, ReadCoord, WriteCoord, origin_z) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_PITCHROLL, float, ReadAngle, WriteAngle, angles_x) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_YAW, float, ReadAngle, WriteAngle, angles_y) \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_PITCHROLL, float, ReadAngle, WriteAngle, angles_z) \
+       CSQCMODEL_EXTRAPROPERTIES
+
+#ifdef CSQCMODEL_HAVE_TWO_FRAMES
+.float frame3;
+.float frame3time;
+.float lerpfrac3;
+.float frame4;
+.float frame4time;
+.float lerpfrac4;
+#define ALLPROPERTIES ALLPROPERTIES_COMMON \
+       CSQCMODEL_PROPERTY(CSQCMODEL_PROPERTY_FRAME2, float, ReadByte, WriteByte, frame2) \
+       CSQCMODEL_PROPERTY_SCALED(CSQCMODEL_PROPERTY_LERPFRAC, float, ReadByte, WriteByte, lerpfrac, 255, 0, 255)
+#else
+#define ALLPROPERTIES ALLPROPERTIES_COMMON
+#endif
diff --git a/qcsrc/csqcmodellib/interpolate.qc b/qcsrc/csqcmodellib/interpolate.qc
new file mode 100644 (file)
index 0000000..ac0ba6e
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+.vector iorigin1, iorigin2;
+.vector ivelocity1, ivelocity2;
+.vector iforward1, iforward2;
+.vector iup1, iup2;
+.float itime1, itime2;
+void InterpolateOrigin_Reset()
+{
+       self.iflags &~= IFLAG_INTERNALMASK;
+       self.itime1 = self.itime2 = 0;
+}
+void InterpolateOrigin_Note()
+{
+       float dt;
+       float f0;
+
+       dt = time - self.itime2;
+
+       f0 = self.iflags;
+       if(self.iflags & IFLAG_PREVALID)
+               self.iflags |= IFLAG_VALID;
+       else
+               self.iflags |= IFLAG_PREVALID;
+
+       self.iorigin1 = self.iorigin2;
+       self.iorigin2 = self.origin;
+
+       if(self.iflags & IFLAG_AUTOANGLES)
+               if(self.iorigin2 != self.iorigin1)
+                       self.angles = vectoangles(self.iorigin2 - self.iorigin1);
+
+       if(self.iflags & IFLAG_ANGLES)
+       {
+               fixedmakevectors(self.angles);
+               if(f0 & IFLAG_VALID)
+               {
+                       self.iforward1 = self.iforward2;
+                       self.iup1 = self.iup2;
+               }
+               else
+               {
+                       self.iforward1 = v_forward;
+                       self.iup1 = v_up;
+               }
+               self.iforward2 = v_forward;
+               self.iup2 = v_up;
+       }
+
+       if(self.iflags & IFLAG_VELOCITY)
+       {
+               self.ivelocity1 = self.ivelocity2;
+               self.ivelocity2 = self.velocity;
+       }
+
+       if(self.iflags & IFLAG_TELEPORTED)
+       {
+               self.iflags &~= IFLAG_TELEPORTED;
+               self.itime1 = self.itime2 = time; // don't lerp
+       }
+       else if(vlen(self.iorigin2 - self.iorigin1) > 1000)
+       {
+               self.itime1 = self.itime2 = time; // don't lerp
+       }
+       else if((self.iflags & IFLAG_VELOCITY) && (vlen(self.ivelocity2 - self.ivelocity1) > 1000))
+       {
+               self.itime1 = self.itime2 = time; // don't lerp
+       }
+       else if(dt >= 0.2)
+       {
+               self.itime1 = self.itime2 = time;
+       }
+       else
+       {
+               self.itime1 = serverprevtime;
+               self.itime2 = time;
+       }
+}
+void InterpolateOrigin_Do()
+{
+       vector forward, up;
+       if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
+       {
+               float f;
+               f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
+               self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2;
+               if(self.iflags & IFLAG_ANGLES)
+               {
+                       forward = (1 - f) * self.iforward1 + f * self.iforward2;
+                       up = (1 - f) * self.iup1 + f * self.iup2;
+                       self.angles = fixedvectoangles2(forward, up);
+               }
+               if(self.iflags & IFLAG_VELOCITY)
+                       self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2;
+       }
+}
+void InterpolateOrigin_Undo()
+{
+       self.origin = self.iorigin2;
+       if(self.iflags & IFLAG_ANGLES)
+               self.angles = fixedvectoangles2(self.iforward2, self.iup2);
+       if(self.iflags & IFLAG_VELOCITY)
+               self.velocity = self.ivelocity2;
+}
+
diff --git a/qcsrc/csqcmodellib/interpolate.qh b/qcsrc/csqcmodellib/interpolate.qh
new file mode 100644 (file)
index 0000000..8254fae
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+.float iflags;
+#define IFLAG_VELOCITY 1
+#define IFLAG_ANGLES 2
+#define IFLAG_AUTOANGLES 4
+#define IFLAG_VALID 8
+#define IFLAG_PREVALID 16
+#define IFLAG_TELEPORTED 32
+#define IFLAG_INTERNALMASK (IFLAG_VALID | IFLAG_PREVALID)
+
+// call this BEFORE reading an entity update
+void InterpolateOrigin_Undo();
+
+// call this AFTER receiving an entity update
+void InterpolateOrigin_Note();
+
+// call this when the entity got teleported, before InterpolateOrigin_Note
+void InterpolateOrigin_Reset();
+
+// call this BEFORE drawing
+void InterpolateOrigin_Do();
diff --git a/qcsrc/csqcmodellib/settings.qh b/qcsrc/csqcmodellib/settings.qh
new file mode 100644 (file)
index 0000000..aab2a56
--- /dev/null
@@ -0,0 +1,27 @@
+// define this if svqc code wants to use .frame2 and .lerpfrac
+//#define CSQCMODEL_HAVE_TWO_FRAMES
+
+// don't define this ever
+//#define CSQCMODEL_SUPPORT_GETTAGINFO_BEFORE_DRAW
+
+// add properties you want networked to CSQC here
+#define CSQCMODEL_EXTRAPROPERTIES \
+       /* CSQCMODEL_PROPERTY(1, float, ReadShort, WriteShort, colormap) */ \
+       /* CSQCMODEL_PROPERTY(2, float, ReadInt24_t, WriteInt24_t, effects) */
+
+// add hook function calls here
+#define CSQCMODEL_HOOK_PREUPDATE
+#define CSQCMODEL_HOOK_POSTUPDATE
+#define CSQCMODEL_HOOK_PREDRAW
+#define CSQCPLAYER_HOOK_POSTCAMERASETUP
+
+// force updates of player entities that often even if unchanged
+#define CSQCPLAYER_FORCE_UPDATES 0.25
+
+// mod must define:
+//vector PL_MIN  = ...;
+//vector PL_MAX  = ...;
+//vector PL_VIEW_OFS  = ...;
+//vector PL_CROUCH_MIN  = ...;
+//vector PL_CROUCH_MAX  = ...;
+//vector PL_CROUCH_VIEW_OFS  = ...;
diff --git a/qcsrc/csqcmodellib/sv_model.qc b/qcsrc/csqcmodellib/sv_model.qc
new file mode 100644 (file)
index 0000000..bf6eefa
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+// generic CSQC model code
+
+float CSQCModel_Send(entity to, float sf)
+{
+       // some nice flags for CSQCMODEL_IF
+       float isplayer = (self.flags & FL_CLIENT);
+       float islocalplayer = (self == to);
+       float isnolocalplayer = (isplayer && (self != to));
+
+       WriteByte(MSG_ENTITY, ENT_CLIENT_MODEL);
+       WriteShort(MSG_ENTITY, sf);
+
+#define CSQCMODEL_IF(cond) if(cond) {
+#define CSQCMODEL_ENDIF }
+#define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
+       if(sf & flag) \
+       { \
+               w(MSG_ENTITY, self.csqcmodel_##f); \
+       }
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+       ALLPROPERTIES
+#undef CSQCMODEL_PROPERTY_SCALED
+#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
+
+       return TRUE;
+}
+
+#ifdef CSQCPLAYER_FORCE_UPDATES
+.float csqcmodel_nextforcedupdate;
+#endif
+void CSQCModel_CheckUpdate()
+{
+       // some nice flags for CSQCMODEL_IF
+       float isplayer = (self.flags & FL_CLIENT);
+       float islocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
+       float isnolocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
+
+#ifdef CSQCPLAYER_FORCE_UPDATES
+       if(isplayer && time > self.csqcmodel_nextforcedupdate)
+       {
+               self.SendFlags |= CSQCMODEL_PROPERTY_ORIGIN;
+               self.csqcmodel_nextforcedupdate = time + CSQCPLAYER_FORCE_UPDATES * (0.5 + random()); // ensure about 4 origin sends per sec
+       }
+#endif
+
+       if(self.effects & EF_RESTARTANIM_BIT)
+       {
+               self.SendFlags |= CSQCMODEL_PROPERTY_FRAME | CSQCMODEL_PROPERTY_FRAME2; // full anim resend please
+               self.effects &~= EF_RESTARTANIM_BIT;
+       }
+
+       if(self.effects & EF_TELEPORT_BIT)
+       {
+               self.SendFlags |= CSQCMODEL_PROPERTY_TELEPORTED; // no interpolation please
+               self.effects &~= EF_TELEPORT_BIT;
+       }
+
+#define CSQCMODEL_IF(cond) if(cond) {
+#define CSQCMODEL_ENDIF }
+#define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
+       { \
+               t tmp = self.f; \
+               if(tmp != self.csqcmodel_##f) \
+               { \
+                       self.csqcmodel_##f = tmp; \
+                       self.SendFlags |= flag; \
+               } \
+       }
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       { \
+               t tmp = bound(mi, s * self.f, ma) - mi; \
+               if(tmp != self.csqcmodel_##f) \
+               { \
+                       self.csqcmodel_##f = tmp; \
+                       self.SendFlags |= flag; \
+               } \
+       }
+       ALLPROPERTIES
+#undef CSQCMODEL_PROPERTY_SCALED
+#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
+}
+
+void CSQCModel_LinkEntity()
+{
+       self.SendEntity = CSQCModel_Send;
+       self.SendFlags = 0xFFFFFF;
+       CSQCModel_CheckUpdate();
+}
+
+void CSQCModel_UnlinkEntity()
+{
+       self.SendEntity = func_null;
+}
diff --git a/qcsrc/csqcmodellib/sv_model.qh b/qcsrc/csqcmodellib/sv_model.qh
new file mode 100644 (file)
index 0000000..3c4ce2b
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011 Rudolf Polzer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+// generic CSQC model code
+
+void CSQCModel_CheckUpdate();
+void CSQCModel_LinkEntity();
+void CSQCModel_UnlinkEntity();
+
+#define CSQCMODEL_IF(cond)
+#define CSQCMODEL_ENDIF
+#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)
+       ALLPROPERTIES
+#undef CSQCMODEL_PROPERTY_SCALED
+#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
index bb5f2137f47a19c5872ef2e8e6feb7fbaeec0501..0d3088f9cfc3acb83e10eae556dea6acd0d748aa 100644 (file)
@@ -166,7 +166,7 @@ const float MASK_NORMAL                     = 4;
 const float RF_VIEWMODEL       = 1;
 const float RF_EXTERNALMODEL   = 2;
 const float RF_DEPTHHACK       = 4;
-const float RF_ADDATIVE                = 8;
+const float RF_ADDITIVE                = 8;
 const float RF_USEAXIS         = 16;
 
 const float VF_MIN             = 1;    //(vector)
@@ -484,7 +484,7 @@ float(vector position, string text, vector scale, float alpha, float flag) drawc
 vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2 = #326;
 
 float(float stnum) getstatf = #330;
-float(float stnum) getstati = #331;
+float(float stnum, ...) getstati = #331; // can optionally take first bit and count
 string(float firststnum) getstats = #332;
 void(entity e, float mdlindex) setmodelindex = #333;
 string(float mdlindex) modelnameforindex = #334;
@@ -1204,6 +1204,191 @@ float log(float f) = #532;
 //description:
 //logarithm
 
+//FTE_CSQC_SKELETONOBJECTS
+//idea: Spike, LordHavoc
+//darkplaces implementation: LordHavoc
+//builtin definitions:
+// all skeleton numbers are 1-based (0 being no skeleton)
+// all bone numbers are 1-based (0 being invalid)
+float(float modlindex) skel_create = #263; // create a skeleton (be sure to assign this value into .skeletonindex for use), returns skeleton index (1 or higher) on success, returns 0 on failure (for example if the modelindex is not skeletal), it is recommended that you create a new skeleton if you change modelindex, as the skeleton uses the hierarchy from the model.
+float(float skel, entity ent, float modlindex, float retainfrac, float firstbone, float lastbone) skel_build = #264; // blend in a percentage of standard animation, 0 replaces entirely, 1 does nothing, 0.5 blends half, etc, and this only alters the bones in the specified range for which out of bounds values like 0,100000 are safe (uses .frame, .frame2, .frame3, .frame4, .lerpfrac, .lerpfrac3, .lerpfrac4, .frame1time, .frame2time, .frame3time, .frame4time), returns skel on success, 0 on failure
+float(float skel) skel_get_numbones = #265; // returns how many bones exist in the created skeleton, 0 if skeleton does not exist
+string(float skel, float bonenum) skel_get_bonename = #266; // returns name of bone (as a tempstring), "" if invalid bonenum (< 1 for example) or skeleton does not exist
+float(float skel, float bonenum) skel_get_boneparent = #267; // returns parent num for supplied bonenum, 0 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
+float(float skel, string tagname) skel_find_bone = #268; // get number of bone with specified name, 0 on failure, bonenum (1-based) on success, same as using gettagindex but takes modelindex instead of entity
+vector(float skel, float bonenum) skel_get_bonerel = #269; // get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone)
+vector(float skel, float bonenum) skel_get_boneabs = #270; // get matrix of bone in skeleton in model space - sets v_forward, v_right, v_up, returns origin (relative to entity)
+void(float skel, float bonenum, vector org) skel_set_bone = #271; // set matrix of bone relative to its parent, reads v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
+void(float skel, float bonenum, vector org) skel_mul_bone = #272; // transform bone matrix (relative to its parent) by the supplied matrix in v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
+void(float skel, float startbone, float endbone, vector org) skel_mul_bones = #273; // transform bone matrices (relative to their parents) by the supplied matrix in v_forward, v_right, v_up, takes origin as parameter (relative to parent bones)
+void(float skeldst, float skelsrc, float startbone, float endbone) skel_copybones = #274; // copy bone matrices (relative to their parents) from one skeleton to another, useful for copying a skeleton to a corpse
+void(float skel) skel_delete = #275; // deletes skeleton at the beginning of the next frame (you can add the entity, delete the skeleton, renderscene, and it will still work)
+float(float modlindex, string framename) frameforname = #276; // finds number of a specified frame in the animation, returns -1 if no match found
+float(float modlindex, float framenum) frameduration = #277; // returns the intended play time (in seconds) of the specified framegroup, if it does not exist the result is 0, if it is a single frame it may be a small value around 0.1 or 0.
+//fields:
+.float skeletonindex; // active skeleton overriding standard animation on model
+.float frame; // primary framegroup animation (strength = 1 - lerpfrac - lerpfrac3 - lerpfrac4)
+.float frame2; // secondary framegroup animation (strength = lerpfrac)
+.float frame3; // tertiary framegroup animation (strength = lerpfrac3)
+.float frame4; // quaternary framegroup animation (strength = lerpfrac4)
+.float lerpfrac; // strength of framegroup blend
+.float lerpfrac3; // strength of framegroup blend
+.float lerpfrac4; // strength of framegroup blend
+.float frame1time; // start time of framegroup animation
+.float frame2time; // start time of framegroup animation
+.float frame3time; // start time of framegroup animation
+.float frame4time; // start time of framegroup animation
+//description:
+//this extension provides a way to do complex skeletal animation on an entity.
+//
+//see also DP_SKELETONOBJECTS (this extension implemented on server as well as client)
+//
+//notes:
+//each model contains its own skeleton, reusing a skeleton with incompatible models will yield garbage (or not render).
+//each model contains its own animation data, you can use animations from other model files (for example saving out all character animations as separate model files).
+//if an engine supports loading an animation-only file format such as .md5anim in FTEQW, it can be used to animate any model with a compatible skeleton.
+//proper use of this extension may require understanding matrix transforms (v_forward, v_right, v_up, origin), and you must keep in mind that v_right is negative for this purpose.
+//
+//features include:
+//multiple animations blended together.
+//animating a model with animations from another model with a compatible skeleton.
+//restricting animation blends to certain bones of a model - for example independent animation of legs, torso, head.
+//custom bone controllers - for example making eyes track a target location.
+//
+//
+//
+//example code follows...
+//
+//this helper function lets you identify (by parentage) what group a bone
+//belongs to - for example "torso", "leftarm", would return 1 ("torso") for
+//all children of the bone named "torso", unless they are children of
+//"leftarm" (which is a child of "torso") which would return 2 instead...
+float(float skel, float bonenum, string g1, string g2, string g3, string g4, string g5, string g6) example_skel_findbonegroup =
+{
+       local string bonename;
+       while (bonenum >= 0)
+       {
+               bonename = skel_get_bonename(skel, bonenum);
+               if (bonename == g1) return 1;
+               if (bonename == g2) return 2;
+               if (bonename == g3) return 3;
+               if (bonename == g4) return 4;
+               if (bonename == g5) return 5;
+               if (bonename == g6) return 6;
+               bonenum = skel_get_boneparent(skel, bonenum);
+       }
+       return 0;
+};
+// create a skeletonindex for our player using current modelindex
+void() example_skel_player_setup =
+{
+       self.skeletonindex = skel_create(self.modelindex);
+};
+// setup bones of skeleton based on an animation
+// note: animmodelindex can be a different model than self.modelindex
+void(float animmodelindex, float framegroup, float framegroupstarttime) example_skel_player_update_begin =
+{
+       // start with our standard animation
+       self.frame = framegroup;
+       self.frame2 = 0;
+       self.frame3 = 0;
+       self.frame4 = 0;
+       self.frame1time = framegroupstarttime;
+       self.frame2time = 0;
+       self.frame3time = 0;
+       self.frame4time = 0;
+       self.lerpfrac = 0;
+       self.lerpfrac3 = 0;
+       self.lerpfrac4 = 0;
+       skel_build(self.skeletonindex, self, animmodelindex, 0, 0, 100000);
+};
+// apply a different framegroup animation to bones with a specified parent
+void(float animmodelindex, float framegroup, float framegroupstarttime, float blendalpha, string groupbonename, string excludegroupname1, string excludegroupname2) example_skel_player_update_applyoverride =
+{
+       local float bonenum;
+       local float numbones;
+       self.frame = framegroup;
+       self.frame2 = 0;
+       self.frame3 = 0;
+       self.frame4 = 0;
+       self.frame1time = framegroupstarttime;
+       self.frame2time = 0;
+       self.frame3time = 0;
+       self.frame4time = 0;
+       self.lerpfrac = 0;
+       self.lerpfrac3 = 0;
+       self.lerpfrac4 = 0;
+       bonenum = 0;
+       numbones = skel_get_numbones(self.skeletonindex);
+       while (bonenum < numbones)
+       {
+               if (example_skel_findbonegroup(self.skeletonindex, bonenum, groupbonename, excludegroupname1, excludegroupname2, "", "", "") == 1)
+                       skel_build(self.skeletonindex, self, animmodelindex, 1 - blendalpha, bonenum, bonenum + 1);
+               bonenum = bonenum + 1;
+       }
+};
+// make eyes point at a target location, be sure v_forward, v_right, v_up are set correctly before calling
+void(vector eyetarget, string bonename) example_skel_player_update_eyetarget =
+{
+       local float bonenum;
+       local vector ang;
+       local vector oldforward, oldright, oldup;
+       local vector relforward, relright, relup, relorg;
+       local vector boneforward, boneright, boneup, boneorg;
+       local vector parentforward, parentright, parentup, parentorg;
+       local vector u, v;
+       local vector modeleyetarget;
+       bonenum = skel_find_bone(self.skeletonindex, bonename) - 1;
+       if (bonenum < 0)
+               return;
+       oldforward = v_forward;
+       oldright = v_right;
+       oldup = v_up;
+       v = eyetarget - self.origin;
+       modeleyetarget_x =   v * v_forward;
+       modeleyetarget_y = 0-v * v_right;
+       modeleyetarget_z =   v * v_up;
+       // this is an eyeball, make it point at the target location
+       // first get all the data we can...
+       relorg = skel_get_bonerel(self.skeletonindex, bonenum);
+       relforward = v_forward;
+       relright = v_right;
+       relup = v_up;
+       boneorg = skel_get_boneabs(self.skeletonindex, bonenum);
+       boneforward = v_forward;
+       boneright = v_right;
+       boneup = v_up;
+       parentorg = skel_get_boneabs(self.skeletonindex, skel_get_boneparent(self.skeletonindex, bonenum));
+       parentforward = v_forward;
+       parentright = v_right;
+       parentup = v_up;
+       // get the vector from the eyeball to the target
+       u = modeleyetarget - boneorg;
+       // now transform it inversely by the parent matrix to produce new rel vectors
+       v_x = u * parentforward;
+       v_y = u * parentright;
+       v_z = u * parentup;
+       ang = vectoangles2(v, relup);
+       ang_x = 0 - ang_x;
+       makevectors(ang);
+       // set the relative bone matrix
+       skel_set_bone(self.skeletonindex, bonenum, relorg);
+       // restore caller's v_ vectors
+       v_forward = oldforward;
+       v_right = oldright;
+       v_up = oldup;
+};
+// delete skeleton when we're done with it
+// note: skeleton remains valid until next frame when it is really deleted
+void() example_skel_player_delete =
+{
+       skel_delete(self.skeletonindex);
+       self.skeletonindex = 0;
+};
+//
+// END OF EXAMPLES FOR FTE_CSQC_SKELETONOBJECTS
+//
+
 // assorted builtins
 const float            STAT_MOVEVARS_TICRATE           = 240;
 const float            STAT_MOVEVARS_TIMESCALE         = 241;
@@ -1217,3 +1402,6 @@ float PARTICLES_USECOLOR = 2;
 vector particles_colormin, particles_colormax;
 void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, float flags) boxparticles = #502;
 float trace_networkentity;
+const float RF_FULLBRIGHT      = 256;
+const float RF_NOSHADOW        = 512;
+float RF_DYNAMICMODELLIGHT = 8192;
index 9f2911a190114f23a5fb5e59f4cb5d9f61aa9090..0acf262b113f212500a08f2e511bb1b81510e569 100644 (file)
@@ -113,6 +113,14 @@ float EF_DOUBLESIDED = 32768;
 //description:
 //render entity as double sided (backfaces are visible, I.E. you see the 'interior' of the model, rather than just the front), can be occasionally useful on transparent stuff.
 
+//DP_EF_DYNAMICMODELLIGHT
+//idea: C.Brutail, divVerent, maikmerten
+//darkplaces implementation: divVerent
+//effects bit:
+float   EF_DYNAMICMODELLIGHT     = 131072;
+//description:
+//force dynamic model light on the entity, even if it's a BSP model (or anything else with lightmaps or light colors)
+
 //DP_EF_FLAME
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -1027,7 +1035,9 @@ string(string format, ...) sprintf = #627;
 //    For conversions s and c, the flag # makes precision and width interpreted
 //      as byte count, by default it is interpreted as character count in UTF-8
 //      enabled engines. No other conversions can create wide characters, and #
-//      has another meaning in these.
+//      has another meaning in these. When in character count mode, color codes
+//      are ignored. To get UTF-8 semantics WITHOUT color code parsing, use
+//      the + flag.
 
 //DP_QC_STRFTIME
 //idea: LordHavoc
@@ -1663,22 +1673,44 @@ void(float effectnum, vector org, vector vel, float howmany) pointparticles = #3
 //globals:
 //new movetypes:
 const float MOVETYPE_PHYSICS = 32; // need to be set before any physics_* builtins applied
-//new solid types:
+//new solid types (deprecated):
 const float SOLID_PHYSICS_BOX = 32;
 const float SOLID_PHYSICS_SPHERE = 33;
 const float SOLID_PHYSICS_CAPSULE = 34;
 const float SOLID_PHYSICS_TRIMESH = 35;
 const float SOLID_PHYSICS_CYLINDER = 36;
-//SOLID_BSP;
+//geometry types:
+const float GEOMTYPE_NONE = -1;       // entity will be entirely skipped by ODE
+const float GEOMTYPE_SOLID = 0;       // geometry type will be set based on .solid field
+const float GEOMTYPE_BOX = 1;         // entity bound box
+const float GEOMTYPE_SPHERE = 2;      // sphere with radius picked from x axis of entity bound box
+const float GEOMTYPE_CAPSULE = 3;     // with leading axis automatically determined from longest one, radius is picked as minimal of the rest 2 axes
+const float GEOMTYPE_TRIMESH = 4;     // triangle mesh
+const float GEOMTYPE_CYLINDER = 5;    // like capsule but not capped
+                                      // note that ODE's builtin cylinder support is experimental, somewhat bugged and unfinished (no cylinder-cylinder collision)
+                                                                         // to use properly working cylinder should build ODE with LIBCCD extension
+const float GEOMTYPE_CAPSULE_X = 6;   // capsule with fixed leading axis
+const float GEOMTYPE_CAPSULE_Y = 7;
+const float GEOMTYPE_CAPSULE_Z = 8;
+const float GEOMTYPE_CYLINDER_X        = 9;  // cylinder with fixed leading axis
+const float GEOMTYPE_CYLINDER_Y        = 10;
+const float GEOMTYPE_CYLINDER_Z        = 11;
 //joint types:
+const float JOINTTYPE_NONE = 0;
 const float JOINTTYPE_POINT = 1;
 const float JOINTTYPE_HINGE = 2;
 const float JOINTTYPE_SLIDER = 3;
 const float JOINTTYPE_UNIVERSAL = 4;
 const float JOINTTYPE_HINGE2 = 5;
 const float JOINTTYPE_FIXED = -1;
+//force types:
+const float FORCETYPE_NONE = 0;
+const float FORCETYPE_FORCE = 1; // applied at center of mass
+const float FORCETYPE_FORCEATPOS = 2;
+const float FORCETYPE_TORQUE = 3;
 // common joint properties:
-// .entity aiment, enemy; // connected objects
+// .entity aiment; // connected objects
+// .entity enemy; // connected objects, forces
 // .vector movedir;
 //   for a spring:
 //     movedir_x = spring constant (force multiplier, must be > 0)
@@ -1689,17 +1721,26 @@ const float JOINTTYPE_FIXED = -1;
 //     movedir_y = -1 * max motor force to use
 //     movedir_z = stop position (+/-), set to 0 for no stop
 //   note that ODE does not support both in one anyway
+//   for a force:
+//     force vector to apply
 //field definitions:
-.float mass; // ODE mass, standart value is 1
-.vector massofs; // offsets a mass center out of object center, if not set a center of model bounds is used
-.float friction;
-.float bouncefactor;
-.float bouncestop;
-.float jointtype;
+.float  geomtype;     // see GEOMTYPE_*, a more correct way to set collision shape, allows to set SOLID_CORPSE and trimesh collisions
+.float  maxcontacts;  // maximum number of contacts to make for this object, lesser = faster (but setting it too low will could make object pass though walls), default is 16, maximum is 32
+.float  mass;         // ODE mass, standart value is 1
+.vector massofs;      // offsets a mass center out of object center, if not set a center of model bounds is used
+.float  friction;     // a friction of object, get multiplied by second objects's friction on contact
+.float  bouncefactor;
+.float  bouncestop; 
+.float  jointtype;    // type of joint
+.float  forcetype;    // type of force
+.float  erp;          // error restitution parameter, makes ODE solver attempt to fix errors in contacts, 
+                      // bringing together 2 joints or fixing object being stuch in other object, 
+                                 // a value of 0.1 will fix slightly, a value of 1.0 attempts to fix whole error in one frame
+                                 // use with care as high values makes system unstable and likely to explode
 //builtin definitions:
 void(entity e, float physics_enabled) physics_enable = #540; // enable or disable physics on object
-void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
-void(entity e, vector torque) physics_addtorque = #542; // add relative torque
+void(entity e, vector force, vector force_pos) physics_addforce = #541; // deprecated, apply a force from certain origin, length of force vector is power of force
+void(entity e, vector torque) physics_addtorque = #542; // deprecated, add relative torque
 //description: provides Open Dynamics Engine support, requires extenal dll to be present or engine compiled with statical link option
 //be sure to checkextension for it to know if library is loaded and ready, also to enable physics set "physics_ode" cvar to 1
 //note: this extension is highly experimental and may be unstable
index 4b56257a09a42e475e367a3c1aab853eb3079393..74bfdc8602384bd24bdbce931a55f51e357a599c 100644 (file)
@@ -202,7 +202,7 @@ float       stof(string val,...)  = #21;
 entity spawn(void)             = #22;
 void   remove(entity e)        = #23;
 
-entity findstring(entity start, .string field, string match)   = #24;
+entity find(entity start, .string field, string match)         = #24;
 entity findfloat(entity start, .float field, float match)      = #25;
 entity findentity(entity start, .entity field, entity match)   = #25;
 
@@ -356,6 +356,11 @@ string(string serveraddress) crypto_getidfp = #634; // retrieves the cached host
 string(string serveraddress) crypto_getencryptlevel = #635; // 0 if never encrypting, 1 supported, 2 requested, 3 required, appended by list of allowed methods in order of preference ("AES128"), preceded by a space each
 string(float i) crypto_getmykeyfp = #636; // retrieves the CA key fingerprint of a given CA slot, or "" if slot is unused but more to come, or string_null if end of list
 string(float i) crypto_getmyidfp = #637; // retrieves the ID fingerprint of a given CA slot, or "" if slot is unused but more to come, or string_null if end of list
+float CRYPTO_IDSTATUS_OUTOFRANGE = -1;
+float CRYPTO_IDSTATUS_EMPTY = 0;
+float CRYPTO_IDSTATUS_UNSIGNED = 1;
+float CRYPTO_IDSTATUS_SIGNED = 2;
+float(float i) crypto_getmyidstatus = #641; // retrieves the ID's status of a given CA slot, or 0 if slot is unused but more to come, or -1 if end of list
 float(string url, float id, string content_type, string delim, float buf, float keyid) crypto_uri_postbuf = #513;
 //description:
 //use -1 as buffer handle to justs end delim as postdata
@@ -431,6 +436,15 @@ float(float bufhandle, string str, float order) bufstr_add = #448;
 void(float bufhandle, float string_index) bufstr_free = #449;
 void(float bufhandle, string pattern, string antipattern) buf_cvarlist = #517;
 
+//DP_QC_STRING_CASE_FUNCTIONS
+//idea: Dresk
+//darkplaces implementation: LordHavoc / Dresk
+//builtin definitions:
+string(string s) strtolower = #480; // returns the passed in string in pure lowercase form
+string(string s) strtoupper = #481; // returns the passed in string in pure uppercase form
+//description:
+//provides simple string uppercase and lowercase functions
+
 //DP_QC_CVAR_DESCRIPTION
 //idea: divVerent
 //DarkPlaces implementation: divVerent
diff --git a/qcsrc/menu/command/menu_cmd.qc b/qcsrc/menu/command/menu_cmd.qc
new file mode 100644 (file)
index 0000000..3be6edc
--- /dev/null
@@ -0,0 +1,187 @@
+string _dumptree_space;
+void _dumptree_open(entity pass, entity me)
+{
+       string s;
+       s = me.toString(me);
+       if(s == "")
+               s = me.classname;
+       else
+               s = strcat(me.classname, ": ", s);
+       print(_dumptree_space, etos(me), " (", s, ")");
+       if(me.firstChild)
+       {
+               print(" {\n");
+               _dumptree_space = strcat(_dumptree_space, "  ");
+       }
+       else
+               print("\n");
+}
+void _dumptree_close(entity pass, entity me)
+{
+       if(me.firstChild)
+       {
+               _dumptree_space = substring(_dumptree_space, 0, strlen(_dumptree_space) - 2);
+               print(_dumptree_space, "}\n");
+       }
+}
+
+float curl_uri_get_pos;
+float curl_uri_get_exec[URI_GET_CURL_END - URI_GET_CURL + 1];
+string curl_uri_get_cvar[URI_GET_CURL_END - URI_GET_CURL + 1];
+void Curl_URI_Get_Callback(float id, float status, string data)
+{
+       float i;
+       float do_exec;
+       string do_cvar;
+       i = id - URI_GET_CURL;
+       do_exec = curl_uri_get_exec[i];
+       do_cvar = curl_uri_get_cvar[i];
+       if(status != 0)
+       {
+               print(sprintf(_("error: status is %d\n"), status));
+               if(do_cvar)
+                       strunzone(do_cvar);
+               return;
+       }
+       if(do_exec)
+               localcmd(data);
+       if(do_cvar)
+       {
+               cvar_set(do_cvar, data);
+               strunzone(do_cvar);
+       }
+       if(!do_exec && !do_cvar)
+               print(data);
+}
+
+void GameCommand(string theCommand)
+{
+       float argc;
+       argc = tokenize_console(theCommand);
+
+       if(argv(0) == "help" || argc == 0)
+       {
+               print(_("Usage: menu_cmd command..., where possible commands are:\n"));
+               print(_("  sync - reloads all cvars on the current menu page\n"));
+               print(_("  directmenu ITEM - select a menu item as main item\n"));
+               GenericCommand("help");
+               return;
+       }
+
+       if(GenericCommand(theCommand))
+               return;
+
+       if(argv(0) == "sync")
+       {
+               m_sync();
+               return;
+       }
+
+       if(argv(0) == "directmenu") if(argc == 2)
+       {
+               // switch to a menu item
+               if(!isdemo()) // don't allow this command in demos
+                       m_goto(argv(1));
+               return;
+       }
+
+       if(argv(0) == "directpanelhudmenu")
+       {
+               // switch to a menu item
+               m_goto(strcat("HUD", argv(1)));
+               return;
+       }
+
+       if(argv(0) == "skinselect")
+       {
+               m_goto_skin_selector();
+               return;
+       }
+
+       if(argv(0) == "languageselect")
+       {
+               m_goto_language_selector();
+               return;
+       }
+
+       if(argv(0) == "videosettings")
+       {
+               m_goto_video_settings();
+               return;
+       }
+
+       if(argv(0) == "dumptree")
+       {
+               _dumptree_space = "";
+               depthfirst(main, parent, firstChild, nextSibling, _dumptree_open, _dumptree_close, NULL);
+               return;
+       }
+
+       if(argv(0) == "curl")
+       {
+               float do_exec;
+               string do_cvar;
+               float key;
+               float i, j;
+               string url;
+               float buf;
+               float r;
+
+               do_exec = FALSE;
+               do_cvar = string_null;
+               key = -1;
+
+               for(i = 1; i+1 < argc; ++i)
+               {
+                       if(argv(i) == "--cvar" && i+2 < argc)
+                       {
+                               ++i;
+                               do_cvar = strzone(argv(i));
+                               continue;
+                       }
+                       if(argv(i) == "--exec")
+                       {
+                               do_exec = TRUE;
+                               continue;
+                       }
+                       if(argv(i) == "--key" && i+2 < argc)
+                       {
+                               ++i;
+                               key = stof(argv(i));
+                               continue;
+                       }
+                       break;
+               }
+
+               // now, argv(i) is the URL
+               // following args may be POST parameters
+               url = argv(i);
+               ++i;
+               buf = buf_create();
+               j = 0;
+               for(; i+1 < argc; i += 2)
+                       bufstr_set(buf, ++j, sprintf("%s=%s", uri_escape(argv(i)), uri_escape(argv(i+1))));
+               if(i < argc)
+                       bufstr_set(buf, ++j, sprintf("submit=%s", uri_escape(argv(i))));
+
+               if(j == 0) // no args: GET
+                       r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, string_null, string_null, -1, key);
+               else // with args: POST
+                       r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, "application/x-www-form-urlencoded", "&", buf, key);
+
+               if(r)
+               {
+                       curl_uri_get_exec[curl_uri_get_pos] = do_exec;
+                       curl_uri_get_cvar[curl_uri_get_pos] = do_cvar;
+                       curl_uri_get_pos = mod(curl_uri_get_pos + 1, URI_GET_CURL_END - URI_GET_CURL + 1);
+               }
+               else
+                       print(_("error creating curl handle\n"));
+
+               buf_del(buf);
+
+               return;
+       }
+
+       print(_("Invalid command. For a list of supported commands, try menu_cmd help.\n"));
+}
diff --git a/qcsrc/menu/command/menu_cmd.qh b/qcsrc/menu/command/menu_cmd.qh
new file mode 100644 (file)
index 0000000..7a18fe2
--- /dev/null
@@ -0,0 +1 @@
+void GameCommand(string command);
diff --git a/qcsrc/menu/gamecommand.qc b/qcsrc/menu/gamecommand.qc
deleted file mode 100644 (file)
index ea2e403..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-void GameCommand_Init()
-{
-       // make gg call menu QC theCommands
-       localcmd("alias qc_cmd \"menu_cmd $*\"\n");
-}
-
-string _dumptree_space;
-void _dumptree_open(entity pass, entity me)
-{
-       string s;
-       s = me.toString(me);
-       if(s == "")
-               s = me.classname;
-       else
-               s = strcat(me.classname, ": ", s);
-       print(_dumptree_space, etos(me), " (", s, ")");
-       if(me.firstChild)
-       {
-               print(" {\n");
-               _dumptree_space = strcat(_dumptree_space, "  ");
-       }
-       else
-               print("\n");
-}
-void _dumptree_close(entity pass, entity me)
-{
-       if(me.firstChild)
-       {
-               _dumptree_space = substring(_dumptree_space, 0, strlen(_dumptree_space) - 2);
-               print(_dumptree_space, "}\n");
-       }
-}
-
-float curl_uri_get_pos;
-float curl_uri_get_exec[URI_GET_CURL_END - URI_GET_CURL + 1];
-string curl_uri_get_cvar[URI_GET_CURL_END - URI_GET_CURL + 1];
-void Curl_URI_Get_Callback(float id, float status, string data)
-{
-       float i;
-       float do_exec;
-       string do_cvar;
-       i = id - URI_GET_CURL;
-       do_exec = curl_uri_get_exec[i];
-       do_cvar = curl_uri_get_cvar[i];
-       if(status != 0)
-       {
-               print(sprintf(_("error: status is %d\n"), status));
-               if(do_cvar)
-                       strunzone(do_cvar);
-               return;
-       }
-       if(do_exec)
-               localcmd(data);
-       if(do_cvar)
-       {
-               cvar_set(do_cvar, data);
-               strunzone(do_cvar);
-       }
-       if(!do_exec && !do_cvar)
-               print(data);
-}
-
-void GameCommand(string theCommand)
-{
-       float argc;
-       argc = tokenize_console(theCommand);
-
-       if(argv(0) == "help" || argc == 0)
-       {
-               print(_("Usage: menu_cmd command..., where possible commands are:\n"));
-               print(_("  sync - reloads all cvars on the current menu page\n"));
-               print(_("  directmenu ITEM - select a menu item as main item\n"));
-               GameCommand_Generic("help");
-               return;
-       }
-
-       if(GameCommand_Generic(theCommand))
-               return;
-
-       if(argv(0) == "sync")
-       {
-               m_sync();
-               return;
-       }
-
-       if(argv(0) == "directmenu") if(argc == 2)
-       {
-               // switch to a menu item
-               if(!isdemo()) // don't allow this command in demos
-                       m_goto(argv(1));
-               return;
-       }
-
-       if(argv(0) == "directpanelhudmenu")
-       {
-               // switch to a menu item
-               m_goto(strcat("HUD", argv(1)));
-               return;
-       }
-
-       if(argv(0) == "skinselect")
-       {
-               m_goto_skin_selector();
-               return;
-       }
-
-       if(argv(0) == "languageselect")
-       {
-               m_goto_language_selector();
-               return;
-       }
-
-       if(argv(0) == "videosettings")
-       {
-               m_goto_video_settings();
-               return;
-       }
-
-       if(argv(0) == "dumptree")
-       {
-               _dumptree_space = "";
-               depthfirst(main, parent, firstChild, nextSibling, _dumptree_open, _dumptree_close, NULL);
-               return;
-       }
-
-       if(argv(0) == "curl")
-       {
-               float do_exec;
-               string do_cvar;
-               float key;
-               float i, j;
-               string url;
-               float buf;
-               float r;
-
-               do_exec = FALSE;
-               do_cvar = string_null;
-               key = -1;
-
-               for(i = 1; i+1 < argc; ++i)
-               {
-                       if(argv(i) == "--cvar" && i+2 < argc)
-                       {
-                               ++i;
-                               do_cvar = strzone(argv(i));
-                               continue;
-                       }
-                       if(argv(i) == "--exec")
-                       {
-                               do_exec = TRUE;
-                               continue;
-                       }
-                       if(argv(i) == "--key" && i+2 < argc)
-                       {
-                               ++i;
-                               key = stof(argv(i));
-                               continue;
-                       }
-                       break;
-               }
-
-               // now, argv(i) is the URL
-               // following args may be POST parameters
-               url = argv(i);
-               ++i;
-               buf = buf_create();
-               j = 0;
-               for(; i+1 < argc; i += 2)
-                       bufstr_set(buf, ++j, sprintf("%s=%s", uri_escape(argv(i)), uri_escape(argv(i+1))));
-               if(i < argc)
-                       bufstr_set(buf, ++j, sprintf("submit=%s", uri_escape(argv(i))));
-
-               if(j == 0) // no args: GET
-                       r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, string_null, string_null, -1, key);
-               else // with args: POST
-                       r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, "application/x-www-form-urlencoded", "&", buf, key);
-
-               if(r)
-               {
-                       curl_uri_get_exec[curl_uri_get_pos] = do_exec;
-                       curl_uri_get_cvar[curl_uri_get_pos] = do_cvar;
-                       curl_uri_get_pos = mod(curl_uri_get_pos + 1, URI_GET_CURL_END - URI_GET_CURL + 1);
-               }
-               else
-                       print(_("error creating curl handle\n"));
-
-               buf_del(buf);
-
-               return;
-       }
-
-       print(_("Invalid command. For a list of supported commands, try menu_cmd help.\n"));
-}
diff --git a/qcsrc/menu/gamecommand.qh b/qcsrc/menu/gamecommand.qh
deleted file mode 100644 (file)
index 33eb053..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-void GameCommand_Init();
-void GameCommand(string command);
index 2b0a636bb5593307a0aff0404be495b2b9b3743c..536295fc2f479f66dbdd08641c10a4a49330bac6 100644 (file)
@@ -50,6 +50,10 @@ void m_init()
                        dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
                }
        }
+
+       // needs to be done so early because of the constants they create
+       RegisterWeapons();
+       RegisterGametypes();
 }
 
 float MENU_ASPECT = 1.25; // 1280x1024
@@ -116,9 +120,6 @@ void m_init_delayed()
        if(!preMenuInit())
                return;
        menuInitialized = 1;
-       GameCommand_Init();
-
-       RegisterWeapons();
 
        fh = -1;
        if(cvar_string("menu_skin") != "")
@@ -835,7 +836,7 @@ void m_toggle(float mode)
        }
 }
 
-void m_shutdown()
+void Shutdown()
 {
        entity e;
 
@@ -919,7 +920,7 @@ void m_goto(string itemname)
        }
        else
        {
-               for(e = NULL; (e = findstring(e, name, itemname)); )
+               for(e = NULL; (e = find(e, name, itemname)); )
                        if(e.classname != "vtbl")
                                break;
                if(e)
index 979ae519f77b4ca2ebb4ecb25fb641b9387365c6..1f70e0e7be2f0ce5aef5c87d036d36c696e3122c 100644 (file)
@@ -15,8 +15,12 @@ oo/base.h
 ../common/mapinfo.qh
 ../common/campaign_common.qh
 ../common/items.qh
+../common/command/markup.qh
+../common/command/rpn.qh
+../common/command/generic.qh
+../common/command/shared_defs.qh
 
-gamecommand.qh
+command/menu_cmd.qh
 menu.qh
 draw.qh
 skin.qh
@@ -28,8 +32,10 @@ oo/implementation.h
        classes.c
 
 ../common/util.qc
-../common/gamecommand.qc
-gamecommand.qc
+../common/command/markup.qc
+../common/command/rpn.qc
+../common/command/generic.qc
+command/menu_cmd.qc
 menu.qc
 draw.qc
 xonotic/util.qc
index 2ca8c86c4078d056c86ba0d8512709b7d45b5df8..4e81a4acc24d2aa7d5ecce525e54d15090e307ce 100644 (file)
@@ -28,6 +28,27 @@ entity makeXonoticColorButton(float theGroup, float theColor, float theValue)
 }
 void XonoticColorButton_configureXonoticColorButton(entity me, float theGroup, float theColor, float theValue)
 {
+       switch(theValue)
+       {
+               // rearrange 1..14 for rainbow order
+               case  1: theValue = 10; break;
+               case  2: theValue =  4; break;
+               case  3: theValue =  1; break;
+               case  4: theValue = 14; break;
+               case  5: theValue = 12; break;
+               case  6: theValue =  7; break;
+               case  7: theValue =  3; break;
+               case  8: theValue =  2; break;
+               case  9: theValue =  6; break;
+               case 10: theValue =  5; break;
+               case 11: theValue = 13; break;
+               case 12: theValue = 11; break;
+               case 13: theValue =  8; break;
+               case 14: theValue =  9; break;
+               default:
+                       // no change
+                       break;
+       }
        me.cvarName = "_cl_color";
        me.cvarValueFloat = theValue;
        me.cvarPart = theColor;
index caaa1232211c8cd51b84dc7c5af073e2de0d7bed..9456cd66da2d2f22fdb48dd0db6d9560e1ccc086 100644 (file)
@@ -69,12 +69,20 @@ void XonoticCrosshairButton_draw(entity me)
        vector sz, rgb;
        float a;
 
-       rgb = stov(cvar_string("crosshair_color"));
-       a = cvar("crosshair_alpha");
 
-       if(!me.checked && !me.focused && me.cvarValueFloat != -1)
+       if(me.cvarValueFloat == -1)
+       {
+               rgb = stov(cvar_string("crosshair_color"));
+               a = cvar("crosshair_alpha");
+       }
+       else if(me.checked || me.focused)
        {
-               a *= me.disabledAlpha;
+               a = 1;
+               rgb = '1 1 1';
+       }
+       else
+       {
+               a = me.disabledAlpha;
                rgb = '1 1 1';
        }
 
@@ -90,17 +98,23 @@ void XonoticCrosshairButton_draw(entity me)
        SUPER(XonoticCrosshairButton).draw(me);
 
        sz = draw_PictureSize(me.src3);
-       sz = globalToBoxSize(sz, draw_scale);
+       sz = globalToBoxSize(sz, me.size);
        if(me.cvarValueFloat == -1)
        {
-               sz = (6 * '1 1 0' + sz * cvar("crosshair_size")) * 0.08; // (6 * '1 1 0' + ...) * 0.08 here to make visible size changes happen also at bigger sizes
+               sz = sz * cvar("crosshair_size"); // (6 * '1 1 0' + ...) * 0.08 here to make visible size changes happen also at bigger sizes
+               /*
                if(sz_x > 0.95)
                        sz = sz * (0.95 / sz_x);
                if(sz_y > 0.95)
                        sz = sz * (0.95 / sz_y);
+               */
        }
        else // show the crosshair picker at full size
-               sz = '0.95 0.95 0';
+       {
+               sz = sz * (0.95 / sz_x);
+               if(sz_y > 0.95)
+                       sz = sz * (0.95 / sz_y);
+       }
 
        draw_Picture('0.5 0.5 0' - 0.5 * sz, me.src3, sz, rgb, a);
        if(cvar("crosshair_dot"))
index e242b6667546e5576444ccee6fa668908693be3f..31ea3e084bbe8f67623e7bd3f2c3bf1fa4922267 100644 (file)
@@ -103,7 +103,7 @@ void XonoticMapInfoDialog_fill(entity me)
                        me.TR(me);
                        me.TDempty(me, 0.2);
                }
-               me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, GameType_GetName(i)));
+               me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, MapInfo_Type_ToText(GameType_GetID(i))));
                        me.(typeLabels[i]) = e;
        }
 
index 2711c57e7f1eb53789d075a560557c870e5fdddc..ac2d71e4811aed58b51f6954b6e6e04afd29b8e0 100644 (file)
@@ -96,6 +96,10 @@ string XonoticMutatorsDialog_toString(entity me)
                s = strcat(s, ", ", _("Blood loss"));
        if(cvar("g_jetpack"))
                s = strcat(s, ", ", _("Jet pack"));
+       if(cvar("g_powerups") == 0)
+               s = strcat(s, ", ", _("No powerups"));
+       if(cvar("g_powerups") > 0)
+               s = strcat(s, ", ", _("Powerups"));
        if(s == "")
                return ZCTX(_("MUT^None"));
        else
@@ -212,7 +216,7 @@ void XonoticMutatorsDialog_fill(entity me)
                me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_pinata", _("Piñata")));
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(2, 0, "g_weapon_stay", _("Weapons stay")));
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_weapon_stay", _("Weapons stay")));
        me.TR(me);
 
        me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
index d396e7bbcc747a449a2cd482c743ca5564b0d582..8bf090fe4b7320062c97628fff5427d8651f6f62 100644 (file)
@@ -56,7 +56,7 @@ void Join_Click(entity btn, entity me);
 #ifdef IMPLEMENTATION
 void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
 {
-       float m, pure, freeslots, j, numh, maxp, numb;
+       float m, pure, freeslots, j, numh, maxp, numb, sflags;
        string s, typestr, versionstr, k, v;
 
        if(me.currentServerName)
@@ -124,6 +124,7 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
                versionstr = argv(1);
        }
        freeslots = -1;
+       sflags = -1;
        for(j = 2; j < m; ++j)
        {
                if(argv(j) == "")
@@ -134,6 +135,8 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
                        pure = stof(v);
                else if(k == "S")
                        freeslots = stof(v);
+               else if(k == "F")
+                       sflags = stof(v);
        }
 
        me.currentServerType = strzone(typestr);
index 6748ef875f75f9e1627dda3b7c8d2072e70f6450..fde65aa5e338d1664cf44b397875f0ba284ac260 100644 (file)
@@ -64,13 +64,13 @@ void XonoticPlayerSettingsTab_fill(entity me)
                me.TD(me, 1, 0.3, e = makeXonoticButton("<<", '0 0 0'));
                        e.onClick = PlayerModelSelector_Prev_Click;
                        e.onClickEntity = pms;
-               me.TD(me, me.rows - me.currentRow - 1, 1.8, pms);
+               me.TD(me, me.rows - (me.currentRow + 3), 1.8, pms);
                me.TD(me, 1, 0.3, e = makeXonoticButton(">>", '0 0 0'));
                        e.onClick = PlayerModelSelector_Next_Click;
                        e.onClickEntity = pms;
        me.TR(me);
                r = me.currentRow;
-               m = me.rows - r - 2;
+               m = me.rows - (r + 4);
                n = 16 - !cvar("developer");
                m = m / (n - 1);
                for(i = 0; i < n; ++i)
@@ -83,6 +83,10 @@ void XonoticPlayerSettingsTab_fill(entity me)
                        me.gotoRC(me, r + i * m, 0.4);
                        me.TDNoMargin(me, m, 0.2, e = makeXonoticColorButton(2, 1, i), '0 1 0');
                }
+       me.gotoRC(me, me.rows - 3, 0);
+               me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_forceplayermodels", _("Force player models to mine")));
+       me.TR(me);
+               me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_forceplayercolors", _("Force player colors to mine")));
 
        me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Field of view:")));
@@ -111,8 +115,8 @@ void XonoticPlayerSettingsTab_fill(entity me)
                me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "crosshair_per_weapon", _("Per weapon")));
        me.TR(me);
                me.TDempty(me, 0.2);
-               for(i = 1; i <= 10; ++i) {
-                       me.TDNoMargin(me, 1, 2 / 10, e = makeXonoticCrosshairButton(3, i), '1 1 0');
+               for(i = 1; i <= 13; ++i) {
+                       me.TDNoMargin(me, 1, 2 / 13, e = makeXonoticCrosshairButton(3, i), '1 1 0');
                        setDependent(e, "crosshair_per_weapon", 0, 0);
                }
                // show a larger preview of the selected crosshair
@@ -121,14 +125,14 @@ void XonoticPlayerSettingsTab_fill(entity me)
                setDependent(e, "crosshair_per_weapon", 0, 0);
        me.TR(me);
                me.TDempty(me, 0.2);
-               for(i = 11; i <= 20; ++i) {
-                       me.TDNoMargin(me, 1, 2 / 10, e = makeXonoticCrosshairButton(3, i), '1 1 0');
+               for(i = 14; i <= 26; ++i) {
+                       me.TDNoMargin(me, 1, 2 / 13, e = makeXonoticCrosshairButton(3, i), '1 1 0');
                        setDependent(e, "crosshair_per_weapon", 0, 0);
                }
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair size:")));
-               me.TD(me, 1, 1.8, e = makeXonoticSlider(0.10, 1.5, 0.05, "crosshair_size"));
+               me.TD(me, 1, 1.8, e = makeXonoticSlider(0.1, 1.0, 0.01, "crosshair_size"));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair alpha:")));
index 6d9dde47b30d80dd2be57c1b396dde04e13f192f..fd84711861d76cf5b1f4cd3545420f07662b1959 100644 (file)
@@ -6,6 +6,7 @@ CLASS(XonoticQuitDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticQuitDialog, intendedWidth, float, 0.5)
        ATTRIB(XonoticQuitDialog, rows, float, 3)
        ATTRIB(XonoticQuitDialog, columns, float, 2)
+       ATTRIB(XonoticQuitDialog, name, string, "Quit")
 ENDCLASS(XonoticQuitDialog)
 #endif
 
index aff39ec174ec9ff7405080b3e6ddf0f6e374064a..6e1be0067a075606c74b13fba4aafabe8d63788b 100644 (file)
@@ -94,7 +94,7 @@ void InstantAction_LoadMap(entity btn, entity dummy)
                s = MapInfo_BSPName_ByID(m);
        }
        while(!fexists(sprintf("maps/%s.waypoints", s)));
-       MapInfo_LoadMap(s);
+       MapInfo_LoadMap(s, 1);
 
        // configure bots
        float p;
index ec21c65b97c4fd6b6be2466c96a922c5e89b3bef..cbc239946a70112b25f1818756dbf930b4c63a2a 100644 (file)
@@ -70,7 +70,7 @@ void XonoticGametypeList_drawListBoxItem(entity me, float i, vector absSize, flo
        string s;
        if(isSelected)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
-       s = GameType_GetName(i);
+       s = MapInfo_Type_ToText(GameType_GetID(i));
        draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
 }
 void XonoticGametypeList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
index 9ce298082c2fca2f236ba1ea987ebe001005a1f4..650e343c6b29f6c07db10bd00b91983054a3247a 100644 (file)
@@ -284,7 +284,7 @@ void MapList_LoadMap(entity btn, entity me)
                localcmd("\nmenu_loadmap_prepare\n");
                if(cvar("menu_use_default_hostname"))
                        localcmd("hostname \"", sprintf(_("%s's Xonotic Server"), strdecolorize(cvar_string("_cl_name"))), "\"\n");
-               MapInfo_LoadMap(m);
+               MapInfo_LoadMap(m, 1);
        }
        else
        {
index f02d747cc91f1f0e229c56074c217dc2609e2c5e..82fdbfb5eb40d4bcfcefb45cd47c383a5421710c 100644 (file)
@@ -427,24 +427,24 @@ void ServerList_TypeSort_Click(entity btn, entity me)
        else
                s = "";
 
-       for(i = 1; ; ++i) // 20 modes ought to be enough for anyone
+       for(i = 1; ; i *= 2) // 20 modes ought to be enough for anyone
        {
-               t = GametypeNameFromType(i);
+               t = MapInfo_Type_ToString(i);
                if(i > 1)
-                       if(t == GametypeNameFromType(0)) // it repeats (default case)
+                       if(t == "") // it repeats (default case)
                        {
                                // no type was found
                                // choose the first one
-                               s = t;
+                               s = MapInfo_Type_ToString(1);
                                break;
                        }
-               if(s == GametypeNameFromType(i))
+               if(s == t)
                {
                        // the type was found
                        // choose the next one
-                       s = GametypeNameFromType(i + 1);
-                       if(s == GametypeNameFromType(0))
-                               s = "";
+                       s = MapInfo_Type_ToString(i * 2);
+                       if(s == "")
+                               s = MapInfo_Type_ToString(1);
                        break;
                }
        }
@@ -533,7 +533,7 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
        me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
 
        me.columnIconsOrigin = 0;
-       me.columnIconsSize = me.realFontSize_x * 3 * me.iconsSizeFactor;
+       me.columnIconsSize = me.realFontSize_x * 4 * me.iconsSizeFactor;
        me.columnPingSize = me.realFontSize_x * 3;
        me.columnMapSize = me.realFontSize_x * 10;
        me.columnTypeSize = me.realFontSize_x * 4;
@@ -595,18 +595,42 @@ void XonoticServerList_clickListBoxItem(entity me, float i, vector where)
 void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
 {
        // layout: Ping, Server name, Map name, NP, TP, MP
-       string s;
        float p, q;
        float isv4, isv6;
        vector theColor;
        float theAlpha;
+       float m, pure, freeslots, j, sflags;
+       string s, typestr, versionstr, k, v;
 
        if(isSelected)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
 
+       s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
+       m = tokenizebyseparator(s, ":");
+       if(m >= 2)
+       {
+               typestr = argv(0);
+               versionstr = argv(1);
+       }
+       freeslots = -1;
+       sflags = -1;
+       for(j = 2; j < m; ++j)
+       {
+               if(argv(j) == "")
+                       break;
+               k = substring(argv(j), 0, 1);
+               v = substring(argv(j), 1, -1);
+               if(k == "P")
+                       pure = stof(v);
+               else if(k == "S")
+                       freeslots = stof(v);
+               else if(k == "F")
+                       sflags = stof(v);
+       }
+
        if(gethostcachenumber(SLIST_FIELD_FREESLOTS, i) <= 0)
                theAlpha = SKINALPHA_SERVERLIST_FULL;
-       else if(strstrofs(gethostcachestring(SLIST_FIELD_QCSTATUS, i), ":S0:", 0) >= 0)
+       else if(freeslots == 0)
                theAlpha = SKINALPHA_SERVERLIST_FULL; // g_maxplayers support
        else if not(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
                theAlpha = SKINALPHA_SERVERLIST_EMPTY;
@@ -671,7 +695,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        }
        if(q == 3)
                q = 5;
-       if(q >= 3)
+       else if(q >= 3)
                q -= 2;
        // possible status:
        // 0: crypto off
@@ -681,7 +705,6 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        // 4: AES recommended and will be used
        // 5: AES required
 
-       s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
        {
                vector iconSize;
                iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
@@ -704,10 +727,16 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                        iconPos_x += iconSize_x;
                }
 
-               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), iconSize, '1 1 1', 1);
+               if(q > 0)
+                       draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), iconSize, '1 1 1', 1);
+               iconPos_x += iconSize_x;
+
+               if(pure == 0)
+                       draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_pure1"), iconSize, '1 1 1', 1);
                iconPos_x += iconSize_x;
 
-               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_pure", ftos(strstrofs(s, ":P0:", 0) >= 0)), iconSize, '1 1 1', 1);
+               if(sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS))
+                               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_stats1"), iconSize, '1 1 1', 1);
                iconPos_x += iconSize_x;
        }
 
@@ -717,13 +746,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
        s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
-       s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
-       p = strstrofs(s, ":", 0);
-       if(p >= 0)
-               s = substring(s, 0, p);
-       else
-               s = "";
-       s = draw_TextShortenToWidth(s, me.columnMapSize, 0, me.realFontSize);
+       s = draw_TextShortenToWidth(typestr, me.columnTypeSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + (me.columnTypeOrigin + (me.columnTypeSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
        s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
        draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
index b8215d52cac6c97150ea863fa05c7dd885d02a25..74fe810fe74759d9d015e69f1248c4207e4cb8a4 100644 (file)
@@ -543,47 +543,38 @@ float updateCompression()
 
 // note: include only those that should be in the menu!
 #define GAMETYPES \
-       GAMETYPE(MAPINFO_TYPE_ARENA, _("Arena")) \
-       GAMETYPE(MAPINFO_TYPE_ASSAULT, _("Assault")) \
-       GAMETYPE(MAPINFO_TYPE_CTF, _("Capture The Flag")) \
-       GAMETYPE(MAPINFO_TYPE_CA, _("Clan Arena")) \
-       GAMETYPE(MAPINFO_TYPE_DEATHMATCH, _("Deathmatch")) \
-       GAMETYPE(MAPINFO_TYPE_DOMINATION, _("Domination")) \
-       GAMETYPE(MAPINFO_TYPE_FREEZETAG, _("Freeze Tag")) \
-       GAMETYPE(MAPINFO_TYPE_KEEPAWAY, _("Keepaway")) \
-       GAMETYPE(MAPINFO_TYPE_KEYHUNT, _("Key Hunt")) \
-       GAMETYPE(MAPINFO_TYPE_LMS, _("Last Man Standing")) \
-       GAMETYPE(MAPINFO_TYPE_NEXBALL, _("Nexball")) \
-       GAMETYPE(MAPINFO_TYPE_ONSLAUGHT, _("Onslaught")) \
-       GAMETYPE(MAPINFO_TYPE_RACE, _("Race")) \
-       GAMETYPE(MAPINFO_TYPE_CTS, _("Race CTS")) \
-       GAMETYPE(MAPINFO_TYPE_RUNEMATCH, _("Runematch")) \
-       GAMETYPE(MAPINFO_TYPE_TEAM_DEATHMATCH, _("Team Deathmatch")) \
+       GAMETYPE(MAPINFO_TYPE_ARENA) \
+       GAMETYPE(MAPINFO_TYPE_ASSAULT) \
+       GAMETYPE(MAPINFO_TYPE_CTF) \
+       GAMETYPE(MAPINFO_TYPE_CA) \
+       GAMETYPE(MAPINFO_TYPE_DEATHMATCH) \
+       GAMETYPE(MAPINFO_TYPE_DOMINATION) \
+       GAMETYPE(MAPINFO_TYPE_FREEZETAG) \
+       GAMETYPE(MAPINFO_TYPE_KEEPAWAY) \
+       GAMETYPE(MAPINFO_TYPE_KEYHUNT) \
+       GAMETYPE(MAPINFO_TYPE_LMS) \
+       GAMETYPE(MAPINFO_TYPE_NEXBALL) \
+       GAMETYPE(MAPINFO_TYPE_ONSLAUGHT) \
+       GAMETYPE(MAPINFO_TYPE_RACE) \
+       GAMETYPE(MAPINFO_TYPE_CTS) \
+       GAMETYPE(MAPINFO_TYPE_RUNEMATCH) \
+       GAMETYPE(MAPINFO_TYPE_TEAM_DEATHMATCH) \
        /* nothing */
 
 float GameType_GetID(float cnt)
 {
        float i;
        i = 0;
-#define GAMETYPE(id,name) if(i++ == cnt) return id;
+#define GAMETYPE(id) if(i++ == cnt) return id;
        GAMETYPES
 #undef GAMETYPE
        return 0;
 }
-string GameType_GetName(float cnt)
-{
-       float i;
-       i = 0;
-#define GAMETYPE(id,name) if(i++ == cnt) return name;
-       GAMETYPES
-#undef GAMETYPE
-       return _("@!#%'n Tuba Throwing");
-}
 float GameType_GetCount()
 {
        float i;
        i = 0;
-#define GAMETYPE(id,name) ++i;
+#define GAMETYPE(id) ++i;
        GAMETYPES
 #undef GAMETYPE
        return i;
index d8f66f4e967ec242cafb3da865da541619a2ac9f..6165fb3606b945968910c437bf76732d931c3ad5 100644 (file)
@@ -37,7 +37,6 @@ void URI_Get_Callback(float id, float status, string data);
 // game type list box stuff (does not NEED to contain all game types, other
 // types stay available via console)
 float GameType_GetID(float cnt);
-string GameType_GetName(float cnt);
 float GameType_GetCount();
 
 void dialog_hudpanel_common_notoggle(entity me, string panelname);
index 3db0540fc83f424f08d16340f80a18c52f0c6bf8..68ec68324d78f785ff84fde5167d7a44a0b1493a 100644 (file)
@@ -66,9 +66,11 @@ vector antilag_takebackorigin(entity e, float t)
        i0 = antilag_find(e, t);
        if(i0 < 0)
        {
-               i0 = e.antilag_index - 1;
-               if(i0 < 0)
-                       i0 = ANTILAG_MAX_ORIGINS - 1;
+               // IN THE PRESENT
+               if(e.antilag_takenback)
+                       return e.antilag_saved_origin;
+               else
+                       return e.origin;
        }
        i1 = i0 + 1;
        if(i1 >= ANTILAG_MAX_ORIGINS)
@@ -122,5 +124,5 @@ void antilag_clear(entity e)
                e.(antilag_times[i]) = -2342;
                e.(antilag_origins[i]) = self.origin;
        }
-       e.antilag_index = 0;
+       e.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0
 }
index 425bbf77933892791bf46b5c96219b50daec758e..2562dca3df803fa93725204eb01f7059ef1cd189 100644 (file)
@@ -372,5 +372,5 @@ void assault_new_round()
 
        // reset the level with a countdown
        cvar_set("timelimit", ftos(ceil(time - game_starttime) / 60));
-       ReadyRestartForce(); // sets game_starttime
+       ReadyRestart_force(); // sets game_starttime
 }
index 8f45f5367e2ae88756d0fef15a65ea961cb5ab87..36e66ff38d35f5e6c7c7a7e4ef730294ceeffcb7 100644 (file)
@@ -73,7 +73,6 @@ float autocvar_g_antilag_nudge;
 float autocvar_g_arena_maxspawned;
 float autocvar_g_arena_point_leadlimit;
 float autocvar_g_arena_point_limit;
-float autocvar_g_arena_powerups;
 float autocvar_g_arena_roundbased;
 float autocvar_g_arena_warmup;
 float autocvar_g_assault;
@@ -566,7 +565,6 @@ float autocvar_g_balance_powerup_strength_force;
 float autocvar_g_balance_powerup_strength_selfdamage;
 float autocvar_g_balance_powerup_strength_selfforce;
 float autocvar_g_balance_powerup_strength_time;
-float autocvar_g_balance_powerup_timer;
 float autocvar_g_balance_rocketlauncher_ammo;
 float autocvar_g_balance_rocketlauncher_animtime;
 float autocvar_g_balance_rocketlauncher_damage;
@@ -759,8 +757,6 @@ float autocvar_g_chat_flood_spl_tell;
 float autocvar_g_chat_nospectators;
 float autocvar_g_chat_teamcolors;
 float autocvar_g_ctf_captimerecord_always;
-float autocvar_g_ctf_capture_leadlimit;
-float autocvar_g_ctf_capture_limit;
 float autocvar_g_ctf_dynamiclights;
 string autocvar_g_ctf_flag_blue_model;
 float autocvar_g_ctf_flag_blue_skin;
@@ -779,7 +775,6 @@ float autocvar_g_ctf_shield_max_ratio;
 float autocvar_g_ctf_shield_min_negscore;
 float autocvar_g_cts_finish_kill_delay;
 float autocvar_g_cts_selfdamage;
-float autocvar_g_deathglow;
 float autocvar_g_debug_bot_commands;
 float autocvar_g_domination_default_teams;
 float autocvar_g_domination_disable_frags;
@@ -925,9 +920,7 @@ float autocvar_g_player_alpha;
 float autocvar_g_player_brightness;
 float autocvar_g_playerclip_collisions;
 string autocvar_g_playerstats_uri;
-float autocvar_g_powerup_shield;
-float autocvar_g_powerup_strength;
-float autocvar_g_powerup_superhealth;
+float autocvar_g_powerups;
 float autocvar_g_projectiles_damage;
 float autocvar_g_projectiles_newton_style;
 float autocvar_g_projectiles_newton_style_2_maxfactor;
@@ -1040,7 +1033,6 @@ float autocvar_g_weapon_charge_colormod_red_half;
 float autocvar_g_weapon_throwable;
 #define autocvar_g_weaponarena cvar_string("g_weaponarena")
 string autocvar_g_xonoticversion;
-float autocvar_gamecfg;
 float autocvar_gameversion;
 float autocvar_gameversion_min;
 float autocvar_gameversion_max;
@@ -1081,6 +1073,8 @@ float autocvar_sv_airstrafeaccel_qw;
 float autocvar_sv_airstrafeaccelerate;
 float autocvar_sv_autoscreenshot;
 float autocvar_sv_cheats;
+float autocvar_sv_clientcommand_antispam_time;
+float autocvar_sv_clientcommand_antispam_count;
 float autocvar_sv_curl_serverpackages_auto;
 float autocvar_sv_db_saveasdump;
 float autocvar_sv_defaultcharacter;
@@ -1129,13 +1123,6 @@ float autocvar_sv_maxairspeed;
 float autocvar_sv_maxairstrafespeed;
 float autocvar_sv_maxspeed;
 string autocvar_sv_motd;
-string autocvar_sv_player_crouch_maxs;
-string autocvar_sv_player_crouch_mins;
-string autocvar_sv_player_crouch_viewoffset;
-string autocvar_sv_player_headsize;
-string autocvar_sv_player_maxs;
-string autocvar_sv_player_mins;
-string autocvar_sv_player_viewoffset;
 float autocvar_sv_player_jumpanim_minfall;
 float autocvar_sv_precacheplayermodels;
 float autocvar_sv_precacheweapons;
@@ -1146,6 +1133,7 @@ float autocvar_sv_ready_restart_repeatable;
 float autocvar_sv_servermodelsonly;
 float autocvar_sv_spectate;
 float autocvar_sv_spectator_speed_multiplier;
+float autocvar_sv_status_privacy;
 float autocvar_sv_stepheight;
 float autocvar_sv_stopspeed;
 float autocvar_sv_strengthsound_antispam_refire_threshold;
@@ -1160,13 +1148,16 @@ float autocvar_sv_vote_call;
 float autocvar_sv_vote_change;
 string autocvar_sv_vote_commands;
 float autocvar_sv_vote_majority_factor;
+float autocvar_sv_vote_majority_factor_of_voted;
 float autocvar_sv_vote_master;
+float autocvar_sv_vote_master_callable;
 string autocvar_sv_vote_master_commands;
 string autocvar_sv_vote_master_password;
+float autocvar_sv_vote_master_playerlimit;
+float autocvar_sv_vote_no_stops_vote;
 float autocvar_sv_vote_nospectators;
 string autocvar_sv_vote_only_commands;
 float autocvar_sv_vote_override_mostrecent;
-float autocvar_sv_vote_simple_majority_factor;
 float autocvar_sv_vote_singlecount;
 float autocvar_sv_vote_stop;
 float autocvar_sv_vote_timeout;
index 7bb507579a529f618e8a8c3ea45c38c17eba1291..1658d7fac4f3c6de0c1313c7780258492b273914 100644 (file)
@@ -375,7 +375,8 @@ void bot_clientdisconnect()
        self.netname_freeme = string_null;
        self.playermodel_freeme = string_null;
        self.playerskin_freeme = string_null;
-       remove(self.bot_cmd_current);
+       if(self.bot_cmd_current)
+               remove(self.bot_cmd_current);
        if(bot_waypoint_queue_owner==self)
                bot_waypoint_queue_owner = world;
 }
index 4b73ec14b62cae43f8f52eb0295e3ac1f8df8c71..2fdbdd3f4fe8c0a1a7ea237ec1725cf3d1459c72 100644 (file)
@@ -494,7 +494,7 @@ void bot_list_commands()
                bot_commands_init();
 
        print("List of all available commands:\n");
-       print(" Command\t\t\t\tParameter Type\n");
+       print("  Command - Parameter Type\n");
 
        for(i=1;i<BOT_CMD_COUNTER;++i)
        {
@@ -513,7 +513,7 @@ void bot_list_commands()
                                ptype = "none";
                                break;
                }
-               print(strcat(" ",bot_cmd_string[i],"\t\t\t\t<",ptype,"> \n"));
+               print(strcat("  ",bot_cmd_string[i]," - <",ptype,"> \n"));
        }
 }
 
index fc484066d5d7a0268dec4bf971fa8402239f20ba..57a09fe3808ac8997b2a557010fb442e24827dc8 100644 (file)
@@ -228,7 +228,7 @@ float CheatImpulse(float i)
                        IS_CHEAT(i, 0, 0);
                        FOR_EACH_PLAYER(e)
                        {
-                               get_model_parameters(e.playermodel, e.skinindex);
+                               get_model_parameters(e.playermodel, e.skin);
                                if(get_model_parameters_sex == "Female")
                                {
                                        makevectors(e.angles);
index 3d393755a0f3749d33793dc7b6de1e574c1284c2..0b583279d6d6dbc5a92bc5e4c4629ac53a5a4904 100644 (file)
@@ -311,7 +311,7 @@ entity SelectSpawnPoint (float anypoint)
        if (!spot)
        {
                if(autocvar_spawn_debug)
-                       GotoNextMap();
+                       GotoNextMap(0);
                else
                {
                        if(some_spawn_has_been_used)
@@ -341,160 +341,36 @@ string CheckPlayerModel(string plyermodel) {
                // to change a cvar default, we'll have a small leak here.
                FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel"));
        }
-       if(strlen(plyermodel) < 4)
-               return FallbackPlayerModel;
+       // only in right path
        if( substring(plyermodel,0,14) != "models/player/")
                return FallbackPlayerModel;
-       else if(autocvar_sv_servermodelsonly)
+       // only good file extensions
+       if(substring(plyermodel,-4,4) != ".zym")
+       if(substring(plyermodel,-4,4) != ".dpm")
+       if(substring(plyermodel,-4,4) != ".iqm")
+       if(substring(plyermodel,-4,4) != ".md3")
+       if(substring(plyermodel,-4,4) != ".psk")
+               return FallbackPlayerModel;
+       // forbid the LOD models
+       if(substring(plyermodel, -9,5) == "_lod1")
+               return FallbackPlayerModel;
+       if(substring(plyermodel, -9,5) == "_lod2")
+               return FallbackPlayerModel;
+       if(plyermodel != strtolower(plyermodel))
+               return FallbackPlayerModel;
+       // also, restrict to server models
+       if(autocvar_sv_servermodelsonly)
        {
-               if(substring(plyermodel,-4,4) != ".zym")
-               if(substring(plyermodel,-4,4) != ".dpm")
-               if(substring(plyermodel,-4,4) != ".iqm")
-               if(substring(plyermodel,-4,4) != ".md3")
-               if(substring(plyermodel,-4,4) != ".psk")
-                       return FallbackPlayerModel;
-               // forbid the LOD models
-               if(substring(plyermodel, -9,5) == "_lod1")
-                       return FallbackPlayerModel;
-               if(substring(plyermodel, -9,5) == "_lod2")
-                       return FallbackPlayerModel;
-               if(plyermodel != strtolower(plyermodel))
-                       return FallbackPlayerModel;
                if(!fexists(plyermodel))
                        return FallbackPlayerModel;
        }
        return plyermodel;
 }
 
-/*
-=============
-Client_customizeentityforclient
-
-LOD reduction
-=============
-*/
-void Client_uncustomizeentityforclient()
+void setplayermodel(entity e, string modelname)
 {
-       if(self.modelindex == 0) // no need to uncustomize then
-               return;
-       self.modelindex = self.modelindex_lod0;
-       self.skin = self.skinindex;
-}
-
-float Client_customizeentityforclient()
-{
-       entity modelsource;
-
-       if(self.modelindex == 0)
-               return TRUE;
-
-       // forcemodel stuff
-
-#ifdef PROFILING
-       float t0;
-       t0 = gettime(GETTIME_HIRES); // reference
-#endif
-
-       modelsource = self;
-
-#ifdef ALLOW_FORCEMODELS
-       if(other.cvar_cl_forceplayermodelsfromxonotic)
-               if not(self.modelindex_lod0_from_xonotic)
-                       modelsource = other;
-       if(other.cvar_cl_forceplayermodels && sv_clforceplayermodels)
-               modelsource = other;
-#endif
-
-       self.skin = modelsource.skinindex;
-
-#if 0
-       if(modelsource == self)
-               self.skin = modelsource.skinindex;
-       else
-               self.skin = mod(modelsource.skinindex, 3); // forbid the fbskins as forced skins
-#endif
-
-       // self: me
-       // other: the player viewing me
-       float distance;
-       float f;
-
-       if(other.cvar_cl_playerdetailreduction <= 0)
-       {
-               if(other.cvar_cl_playerdetailreduction <= -2)
-                       self.modelindex = modelsource.modelindex_lod2;
-               else if(other.cvar_cl_playerdetailreduction <= -1)
-                       self.modelindex = modelsource.modelindex_lod1;
-               else
-                       self.modelindex = modelsource.modelindex_lod0;
-       }
-       else
-       {
-               distance = vlen(self.origin - other.origin);
-               f = (distance + 100.0) * other.cvar_cl_playerdetailreduction;
-               if(f > sv_loddistance2)
-                       self.modelindex = modelsource.modelindex_lod2;
-               else if(f > sv_loddistance1)
-                       self.modelindex = modelsource.modelindex_lod1;
-               else
-                       self.modelindex = modelsource.modelindex_lod0;
-       }
-
-#ifdef PROFILING
-       float t1;
-       t1 = gettime(GETTIME_HIRES); // reference
-       client_cefc_accumulator += (t1 - t0);
-#endif
-
-       return TRUE;
-}
-
-void setmodel_lod(entity e, string modelname)
-{
-       string s;
-
-       if(sv_loddistance1)
-       {
-               // FIXME: this only supports 3-letter extensions
-               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
-               if(fexists(s))
-               {
-                       setmodel(e, s); // players have high precision
-                       self.modelindex_lod1 = self.modelindex;
-               }
-               else
-                       self.modelindex_lod1 = -1;
-
-               s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
-               if(fexists(s))
-               {
-                       setmodel(e, s); // players have high precision
-                       self.modelindex_lod2 = self.modelindex;
-               }
-               else
-                       self.modelindex_lod2 = -1;
-
-               precache_model(modelname);
-               setmodel(e, modelname); // players have high precision
-               self.modelindex_lod0 = self.modelindex;
-
-               if(self.modelindex_lod1 < 0)
-                       self.modelindex_lod1 = self.modelindex;
-
-               if(self.modelindex_lod2 < 0)
-                       self.modelindex_lod2 = self.modelindex;
-       }
-       else
-       {
-               precache_model(modelname);
-               setmodel(e, modelname); // players have high precision
-               self.modelindex_lod0 = self.modelindex;
-                       // save it for possible player model forcing
-       }
-
-       s = whichpack(self.model);
-       self.modelindex_lod0_from_xonotic = ((s == "") || (substring(s, 0, 4) == "data"));
-
+       precache_model(modelname);
+       setmodel(e, modelname);
        player_setupanimsformodel();
        UpdatePlayerSounds();
 }
@@ -590,7 +466,6 @@ void PutObserverInServer (void)
        self.pauseregen_finished = 0;
        self.damageforcescale = 0;
        self.death_time = 0;
-       self.dead_frame = 0;
        self.alpha = 0;
        self.scale = 0;
        self.fade_time = 0;
@@ -609,16 +484,18 @@ void PutObserverInServer (void)
        self.fixangle = TRUE;
        self.crouch = FALSE;
 
-       self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
        setorigin (self, spot.origin);
-       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
        self.prevorigin = self.origin;
        self.items = 0;
        self.weapons = 0;
        self.model = "";
        FixPlayermodel();
-       self.model = "";
-       self.modelindex = 0;
+       setmodel(self, "null");
+       self.drawonlytoclient = self;
+
+       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
+       self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
+
        self.weapon = 0;
        self.weaponname = "";
        self.switchingweapon = 0;
@@ -633,9 +510,6 @@ void PutObserverInServer (void)
        self.oldvelocity = self.velocity;
        self.fire_endtime = -1;
 
-       if(sv_loddistance1)
-               SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient);
-
        if(g_arena)
        {
                if(self.version_mismatch)
@@ -709,42 +583,35 @@ void FixPlayermodel()
                }
        }
 
-       if(self.modelindex == 0 && self.deadflag == DEAD_NO)
-       {
-               if(self.model != "")
-                       bprint("\{1}^1Player ", self.netname, "^1 has a zero modelindex, trying to fix...\n");
-               self.model = ""; // force the != checks to return true
-       }
-
        if(defaultmodel != "")
        {
                if (defaultmodel != self.model)
                {
                        m1 = self.mins;
                        m2 = self.maxs;
-                       setmodel_lod (self, defaultmodel);
+                       setplayermodel (self, defaultmodel);
                        setsize (self, m1, m2);
                        chmdl = TRUE;
                }
 
-               oldskin = self.skinindex;
-               self.skinindex = defaultskin;
+               oldskin = self.skin;
+               self.skin = defaultskin;
        } else {
                if (self.playermodel != self.model || self.playermodel == "")
                {
                        self.playermodel = CheckPlayerModel(self.playermodel); // this is never "", so no endless loop
                        m1 = self.mins;
                        m2 = self.maxs;
-                       setmodel_lod (self, self.playermodel);
+                       setplayermodel (self, self.playermodel);
                        setsize (self, m1, m2);
                        chmdl = TRUE;
                }
 
-               oldskin = self.skinindex;
-               self.skinindex = stof(self.playerskin);
+               oldskin = self.skin;
+               self.skin = stof(self.playerskin);
        }
 
-       if(chmdl || oldskin != self.skinindex)
+       if(chmdl || oldskin != self.skin)
                self.species = player_getspecies(); // model or skin has changed
 
        if(!teamplay)
@@ -849,6 +716,7 @@ void PutClientInServer (void)
                        self.effects = EF_FULLBRIGHT;
                else
                        self.effects = 0;
+               self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT;
                self.air_finished = time + 12;
                self.dmg = 2;
                if(autocvar_g_balance_nex_charge)
@@ -907,8 +775,6 @@ void PutClientInServer (void)
                }
                self.damageforcescale = 2;
                self.death_time = 0;
-               self.dead_frame = 0;
-               self.alpha = 0;
                self.scale = 0;
                self.fade_time = 0;
                self.pain_frame = 0;
@@ -946,11 +812,9 @@ void PutClientInServer (void)
                        WriteByte(MSG_ONE, TE_CSQC_SPAWN);
                });
 
-               if(sv_loddistance1)
-                       SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient);
-
                self.model = "";
                FixPlayermodel();
+               self.drawonlytoclient = world;
 
                self.crouch = FALSE;
                self.view_ofs = PL_VIEW_OFS;
@@ -1249,7 +1113,7 @@ void KillIndicator_Think()
                return;
        }
 
-       if (!self.owner.modelindex)
+       if (self.owner.alpha < 0)
        {
                self.owner.killindicator = world;
                remove(self);
@@ -1309,13 +1173,13 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
 
     if(!self.killindicator)
        {
-               if(self.modelindex && self.deadflag == DEAD_NO)
+               if(self.deadflag == DEAD_NO)
                {
                        killtime = max(killtime, self.clientkill_nexttime - time);
                        self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam;
                }
 
-               if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO)
+               if(killtime <= 0 || self.classname != "player" || self.deadflag != DEAD_NO)
                {
                        ClientKill_Now();
                }
@@ -1637,8 +1501,6 @@ void ClientConnect (void)
        else
                stuffcmd(self, "set _teams_available 0\n");
 
-       stuffcmd(self, strcat("set gametype ", ftos(game), "\n"));
-
        if(g_arena || g_ca)
        {
                self.classname = "observer";
@@ -1661,7 +1523,7 @@ void ClientConnect (void)
        }
 
        self.jointime = time;
-       self.allowedTimeouts = autocvar_sv_timeout_number;
+       self.allowed_timeouts = autocvar_sv_timeout_number;
 
        if(clienttype(self) == CLIENTTYPE_REAL)
        {
@@ -1723,6 +1585,8 @@ void ClientConnect (void)
        if(!autocvar_g_campaign)
                Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0);
 
+       CSQCMODEL_AUTOINIT();
+
        self.model_randomizer = random();
 }
 
@@ -1831,7 +1695,7 @@ void ClientDisconnect (void)
 void ChatBubbleThink()
 {
        self.nextthink = time;
-       if (!self.owner.modelindex || self.owner.chatbubbleentity != self)
+       if ((self.owner.alpha < 0) || self.owner.chatbubbleentity != self)
        {
                if(self.owner) // but why can that ever be world?
                        self.owner.chatbubbleentity = world;
@@ -1850,7 +1714,7 @@ void ChatBubbleThink()
 
 void UpdateChatBubble()
 {
-       if (!self.modelindex)
+       if (self.alpha < 0)
                return;
        // spawn a chatbubble entity if needed
        if (!self.chatbubbleentity)
@@ -1890,7 +1754,7 @@ void UpdateChatBubble()
 .float oldcolormap;
 void respawn(void)
 {
-       if(self.modelindex != 0 && autocvar_g_respawn_ghosts)
+       if(self.alpha >= 0 && autocvar_g_respawn_ghosts)
        {
                self.solid = SOLID_NOT;
                self.takedamage = DAMAGE_NO;
@@ -1939,9 +1803,9 @@ void player_powerups (void)
                self.modelflags &~= MF_ROCKET;
        }
 
-       self.effects &~= (EF_DIMLIGHT | EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
+       self.effects &~= (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
 
-       if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
+       if(self.alpha < 0 || self.deadflag) // don't apply the flags if the player is gibbed
                return;
 
        Fire_ApplyDamage(self);
@@ -1976,7 +1840,7 @@ void player_powerups (void)
                if (self.items & IT_INVINCIBLE)
                {
                        play_countdown(self.invincible_finished, "misc/poweroff.wav");
-                       if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
+                       if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
                                sprint(self, "^3Speed has worn off\n");
@@ -1997,7 +1861,7 @@ void player_powerups (void)
                {
                        play_countdown(self.strength_finished, "misc/poweroff.wav");
                        self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
-                       if (time > self.strength_finished && autocvar_g_balance_powerup_timer)
+                       if (time > self.strength_finished)
                        {
                                self.items = self.items - (self.items & IT_STRENGTH);
                                sprint(self, "^3Strength has worn off\n");
@@ -2015,7 +1879,7 @@ void player_powerups (void)
                {
                        play_countdown(self.invincible_finished, "misc/poweroff.wav");
                        self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
-                       if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
+                       if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
                                sprint(self, "^3Shield has worn off\n");
@@ -2734,7 +2598,7 @@ void PlayerPreThink (void)
                }
 
                //don't allow the player to turn around while game is paused!
-               if(timeoutStatus == 2) {
+               if(timeout_status == TIMEOUT_ACTIVE) {
                        // FIXME turn this into CSQC stuff
                        self.v_angle = self.lastV_angle;
                        self.angles = self.lastV_angle;
@@ -2743,42 +2607,26 @@ void PlayerPreThink (void)
 
                if(frametime)
                {
-                       if(self.health <= 0 && autocvar_g_deathglow)
-                       {
-                               if(self.glowmod_x > 0)
-                                       self.glowmod_x -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_x = -1;
-                               if(self.glowmod_y > 0)
-                                       self.glowmod_y -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_y = -1;
-                               if(self.glowmod_z > 0)
-                                       self.glowmod_z -= autocvar_g_deathglow * frametime;
-                               else
-                                       self.glowmod_z = -1;
-                       }
-                       else
+#ifndef NO_LEGACY_NETWORKING
+                       self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+#endif
+
+                       if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge)
                        {
-                               // set weapon and player glowmod
-                               self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+                               self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+                               self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+                               self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
 
-                               if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge)
+                               if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit)
                                {
-                                       self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-                                       self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-                                       self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
-
-                                       if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit)
-                                       {
-                                               self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                               self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                               self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
-                                       }
+                                       self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+                                       self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+                                       self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
                                }
-                               else
-                                       self.weaponentity_glowmod = self.glowmod;
                        }
+                       else
+                               self.weaponentity_glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+
                        player_powerups();
                }
 
@@ -3070,10 +2918,8 @@ void PlayerPostThink (void)
                stuffcmd(self, strcat("name ", self.netname, substring(ftos(random()), 2, -1), "\n"));
        }
 
-       if(sv_maxidle && frametime)
+       if(sv_maxidle && frametime) // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
        {
-               // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
-               float timeleft;
                if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10
                {
                        if(self.idlekick_lasttimeleft)
@@ -3081,34 +2927,37 @@ void PlayerPostThink (void)
                                Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING);
                                self.idlekick_lasttimeleft = 0;
                        }
-                       return;
                }
-               timeleft = ceil(sv_maxidle - (time - self.parm_idlesince));
-               if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10
-               {
-                       if(!self.idlekick_lasttimeleft)
-                               Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft);
-               }
-               if(timeleft <= 0)
-               {
-                       bprint("^3", self.netname, "^3 was kicked for idling.\n");
-                       AnnounceTo(self, "terminated");
-                       dropclient(self);
-                       return;
-               }
-               else if(timeleft <= 10)
+               else
                {
-                       if(timeleft != self.idlekick_lasttimeleft)
-                               AnnounceTo(self, ftos(timeleft));
-                       self.idlekick_lasttimeleft = timeleft;
+                       float timeleft;
+                       timeleft = ceil(sv_maxidle - (time - self.parm_idlesince));
+                       if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10
+                       {
+                               if(!self.idlekick_lasttimeleft)
+                                       Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft);
+                       }
+                       if(timeleft <= 0)
+                       {
+                               bprint("^3", self.netname, "^3 was kicked for idling.\n");
+                               AnnounceTo(self, "terminated");
+                               dropclient(self);
+                               return;
+                       }
+                       else if(timeleft <= 10)
+                       {
+                               if(timeleft != self.idlekick_lasttimeleft)
+                                       AnnounceTo(self, ftos(timeleft));
+                               self.idlekick_lasttimeleft = timeleft;
+                       }
                }
        }
 
 #ifdef TETRIS
        if(self.impulse == 100)
                ImpulseCommands();
-       if (TetrisPostFrame())
-               return;
+       if (!TetrisPostFrame())
+       {
 #endif
 
        CheatFrame();
@@ -3129,6 +2978,10 @@ void PlayerPostThink (void)
                //do nothing
        }
        
+#ifdef TETRIS
+       }
+#endif
+
        /*
        float i;
        for(i = 0; i < 1000; ++i)
@@ -3191,4 +3044,6 @@ void PlayerPostThink (void)
        if(g_race)
                dprint(sprintf("%f %.6f\n", time, race_GetFractionalLapCount(self)));
        */
+
+       CSQCMODEL_AUTOUPDATE();
 }
index 9e662bb848e204b1a5b59dcd283424247d396951..524e796af2e32859054ee3a82522eae1ddb85147 100644 (file)
@@ -46,7 +46,7 @@ void ImpulseCommands (void)
                return;
        self.impulse = 0;
 
-       if (timeoutStatus == 2) //don't allow any impulses while the game is paused
+       if (timeout_status == TIMEOUT_ACTIVE) //don't allow any impulses while the game is paused
                return;
 
        if(CheatImpulse(imp))
index b675c56e962ed9d94a5f8fddbdd01c3d619ff073..79087eb8a366e9a5ed91c67de9024d058ef3140f 100644 (file)
@@ -882,6 +882,10 @@ void SV_PlayerPhysics()
                swampspd_mod = self.swamp_slowdown; //cvar("g_balance_swamp_moverate");
        }
 
+       // conveyors: first fix velocity
+       if(self.conveyor.state)
+               self.velocity -= self.conveyor.movedir;
+
        if(self.classname != "player")
        {
                maxspd_mod = autocvar_sv_spectator_speed_multiplier;
@@ -1211,6 +1215,28 @@ void SV_PlayerPhysics()
                                self.velocity = self.velocity * f;
                        else
                                self.velocity = '0 0 0';
+                       /*
+                          Mathematical analysis time!
+
+                          Our goal is to invert this mess.
+
+                          For the two cases we get:
+                               v = v0 * (1 - frametime * (autocvar_sv_stopspeed / v0) * autocvar_sv_friction)
+                                 = v0 - frametime * autocvar_sv_stopspeed * autocvar_sv_friction
+                               v0 = v + frametime * autocvar_sv_stopspeed * autocvar_sv_friction
+                          and
+                               v = v0 * (1 - frametime * autocvar_sv_friction)
+                               v0 = v / (1 - frametime * autocvar_sv_friction)
+
+                          These cases would be chosen ONLY if:
+                               v0 < autocvar_sv_stopspeed
+                               v + frametime * autocvar_sv_stopspeed * autocvar_sv_friction < autocvar_sv_stopspeed
+                               v < autocvar_sv_stopspeed * (1 - frametime * autocvar_sv_friction)
+                          and, respectively:
+                               v0 >= autocvar_sv_stopspeed
+                               v / (1 - frametime * autocvar_sv_friction) >= autocvar_sv_stopspeed
+                               v >= autocvar_sv_stopspeed * (1 - frametime * autocvar_sv_friction)
+                        */
                }
 
                // acceleration
@@ -1339,6 +1365,10 @@ void SV_PlayerPhysics()
        if(self.flags & FL_ONGROUND)
                self.lastground = time;
 
+       // conveyors: then break velocity again
+       if(self.conveyor.state)
+               self.velocity += self.conveyor.movedir;
+
        self.lastflags = self.flags;
        self.lastclassname = self.classname;
 }
index 2b3e4d4db1995400d26feaeeaa73af814b8c8e74..04ad12c6ef66b0a8685b8e55ef277b0fe19e9c6a 100644 (file)
@@ -124,6 +124,22 @@ void WeaponStats_LogKill(float awep, float abot, float vwep, float vbot)
 .entity pusher;
 .float pushltime;
 
+.float CopyBody_nextthink;
+.void(void) CopyBody_think;
+void CopyBody_Think(void)
+{
+       if(self.CopyBody_nextthink && time > self.CopyBody_nextthink)
+       {
+               self.CopyBody_think();
+               if(wasfreed(self))
+                       return;
+               self.CopyBody_nextthink = self.nextthink;
+               self.CopyBody_think = self.think;
+               self.think = CopyBody_Think;
+       }
+       CSQCMODEL_AUTOUPDATE();
+       self.nextthink = time;
+}
 void CopyBody(float keepvelocity)
 {
        entity oldself;
@@ -134,7 +150,6 @@ void CopyBody(float keepvelocity)
        self.enemy = oldself;
        self.lip = oldself.lip;
        self.colormap = oldself.colormap;
-       self.glowmod = oldself.glowmod;
        self.iscreature = oldself.iscreature;
        self.damagedbycontents = oldself.damagedbycontents;
        self.angles = oldself.angles;
@@ -142,6 +157,7 @@ void CopyBody(float keepvelocity)
        self.classname = "body";
        self.damageforcescale = oldself.damageforcescale;
        self.effects = oldself.effects;
+       self.glowmod = oldself.glowmod;
        self.event_damage = oldself.event_damage;
        self.animstate_startframe = oldself.animstate_startframe;
        self.animstate_numframes = oldself.animstate_numframes;
@@ -151,31 +167,25 @@ void CopyBody(float keepvelocity)
        self.animstate_override = oldself.animstate_override;
        self.animstate_looping = oldself.animstate_looping;
        self.frame = oldself.frame;
-       self.dead_frame = oldself.dead_frame;
        self.pain_finished = oldself.pain_finished;
        self.health = oldself.health;
        self.armorvalue = oldself.armorvalue;
        self.armortype = oldself.armortype;
        self.model = oldself.model;
        self.modelindex = oldself.modelindex;
-       self.modelindex_lod0 = oldself.modelindex_lod0;
-       self.modelindex_lod0_from_xonotic = oldself.modelindex_lod0_from_xonotic;
-       self.modelindex_lod1 = oldself.modelindex_lod1;
-       self.modelindex_lod2 = oldself.modelindex_lod2;
-       self.skinindex = oldself.skinindex;
+       self.skin = oldself.skin;
        self.species = oldself.species;
        self.movetype = oldself.movetype;
-       self.nextthink = oldself.nextthink;
        self.solid = oldself.solid;
        self.ballistics_density = oldself.ballistics_density;
        self.takedamage = oldself.takedamage;
-       self.think = oldself.think;
        self.customizeentityforclient = oldself.customizeentityforclient;
        self.uncustomizeentityforclient = oldself.uncustomizeentityforclient;
        self.uncustomizeentityforclient_set = oldself.uncustomizeentityforclient_set;
        if (keepvelocity == 1)
                self.velocity = oldself.velocity;
        self.oldvelocity = self.velocity;
+       self.alpha = oldself.alpha;
        self.fade_time = oldself.fade_time;
        self.fade_rate = oldself.fade_rate;
        //self.weapon = oldself.weapon;
@@ -187,7 +197,13 @@ void CopyBody(float keepvelocity)
        Drag_MoveDrag(oldself, self);
 
        if(self.colormap <= maxclients && self.colormap > 0)
-               self.colormap = 1024 + self.clientcolors;
+               self.colormap = 1024 + oldself.clientcolors;
+
+       CSQCMODEL_AUTOINIT();
+       self.CopyBody_nextthink = oldself.nextthink;
+       self.CopyBody_think = oldself.think;
+       self.nextthink = time;
+       self.think = CopyBody_Think;
 
        self = oldself;
 }
@@ -195,7 +211,7 @@ void CopyBody(float keepvelocity)
 float player_getspecies()
 {
        float s;
-       get_model_parameters(self.model, self.skinindex);
+       get_model_parameters(self.model, self.skin);
        s = get_model_parameters_species;
        get_model_parameters(string_null, 0);
        if(s < 0)
@@ -223,20 +239,20 @@ void player_setupanimsformodel()
        self.anim_runbackwards = animfixfps(self, '14 1 1');
        self.anim_strafeleft = animfixfps(self, '15 1 1');
        self.anim_straferight = animfixfps(self, '16 1 1');
-       self.anim_dead1 = animfixfps(self, '17 1 1');
-       self.anim_dead2 = animfixfps(self, '18 1 1');
+       //self.anim_dead1 = animfixfps(self, '17 1 1');
+       //self.anim_dead2 = animfixfps(self, '18 1 1');
        self.anim_forwardright = animfixfps(self, '19 1 1');
        self.anim_forwardleft = animfixfps(self, '20 1 1');
        self.anim_backright = animfixfps(self, '21 1 1');
        self.anim_backleft  = animfixfps(self, '22 1 1');
-       self.anim_melee = animfixfps2(self, '23 1 1', '11 1 5');
-       self.anim_duckwalkbackwards = animfixfps2(self, '24 1 1', '4 1 1');
-       self.anim_duckwalkstrafeleft = animfixfps2(self, '25 1 1', '4 1 1');
-       self.anim_duckwalkstraferight = animfixfps2(self, '26 1 1', '4 1 1');
-       self.anim_duckwalkforwardright = animfixfps2(self, '27 1 1', '4 1 1');
-       self.anim_duckwalkforwardleft = animfixfps2(self, '28 1 1', '4 1 1');
-       self.anim_duckwalkbackright = animfixfps2(self, '29 1 1', '4 1 1');
-       self.anim_duckwalkbackleft  = animfixfps2(self, '30 1 1', '4 1 1');
+       self.anim_melee = animfixfps(self, '23 1 1');
+       self.anim_duckwalkbackwards = animfixfps(self, '24 1 1');
+       self.anim_duckwalkstrafeleft = animfixfps(self, '25 1 1');
+       self.anim_duckwalkstraferight = animfixfps(self, '26 1 1');
+       self.anim_duckwalkforwardright = animfixfps(self, '27 1 1');
+       self.anim_duckwalkforwardleft = animfixfps(self, '28 1 1');
+       self.anim_duckwalkbackright = animfixfps(self, '29 1 1');
+       self.anim_duckwalkbackleft  = animfixfps(self, '30 1 1');
        // TODO introspect models for finding right "fps" value (1/duration)
        // reset animstate now
        setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
@@ -249,18 +265,7 @@ void player_anim (void)
                updateanim(self.weaponentity);
 
        if (self.deadflag != DEAD_NO)
-       {
-               if (time > self.animstate_endtime)
-               {
-                       if (self.maxs_z > 5)
-                       {
-                               self.maxs_z = 5;
-                               setsize(self, self.mins, self.maxs);
-                       }
-                       self.frame = self.dead_frame;
-               }
                return;
-       }
 
        if (!self.animstate_override)
        {
@@ -404,16 +409,15 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
        self.dmg_inflictor = inflictor;
 
-       if (self.health <= -autocvar_sv_gibhealth && self.modelindex != 0)
+       if (self.health <= -autocvar_sv_gibhealth && self.alpha >= 0)
        {
                // don't use any animations as a gib
                self.frame = 0;
-               self.dead_frame = 0;
                // view just above the floor
                self.view_ofs = '0 0 4';
 
                Violence_GibSplash(self, 1, 1, attacker);
-               self.modelindex = 0; // restore later
+               self.alpha = -1;
                self.solid = SOLID_NOT; // restore later
        }
 }
@@ -653,7 +657,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                if(!g_freezetag)
                {
                        // become fully visible
-                       self.alpha = 1;
+                       self.alpha = default_player_alpha;
                        // throw a weapon
                        SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
                }
@@ -667,8 +671,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
         float w;
         w = DEATH_WEAPONOF(deathtype);
         if(WEP_VALID(w))
-        if(self.classname == "player")
-        if(self != attacker)
+       if(accuracy_isgooddamage(attacker, self))
         attacker.accuracy.(accuracy_frags[w-1]) += 1;
 
                if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
@@ -763,14 +766,13 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                else
                        self.respawn_countdown = -1; // do not count down
                if (random() < 0.5)
-               {
                        setanim(self, self.anim_die1, FALSE, TRUE, TRUE);
-                       self.dead_frame = self.anim_dead1_x;
-               }
                else
-               {
                        setanim(self, self.anim_die2, FALSE, TRUE, TRUE);
-                       self.dead_frame = self.anim_dead2_x;
+               if (self.maxs_z > 5)
+               {
+                       self.maxs_z = 5;
+                       setsize(self, self.mins, self.maxs);
                }
                // set damage function to corpse damage
                self.event_damage = PlayerCorpseDamage;
@@ -947,7 +949,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
                                flood = 1;
                }
 
-               if (timeoutStatus == 2) //when game is paused, no flood protection
+               if (timeout_status == TIMEOUT_ACTIVE) // when game is paused, no flood protection
                        source.flood_field = flood = 0;
        }
 
@@ -1170,18 +1172,18 @@ float LoadPlayerSounds(string f, float first)
 }
 
 .float modelindex_for_playersound;
-.float skinindex_for_playersound;
+.float skin_for_playersound;
 void UpdatePlayerSounds()
 {
        if(self.modelindex == self.modelindex_for_playersound)
-       if(self.skinindex == self.skinindex_for_playersound)
+       if(self.skin == self.skin_for_playersound)
                return;
        self.modelindex_for_playersound = self.modelindex;
-       self.skinindex_for_playersound = self.skinindex;
+       self.skin_for_playersound = self.skin;
        ClearPlayerSounds();
        LoadPlayerSounds("sound/player/default.sounds", 1);
        if(!autocvar_g_debug_defaultsounds)
-               if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
+               if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skin, "sounds"), 0))
                        LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
 }
 
index edf5b1f5e5c697d07087509075ef53edc2af5bd0..b1f6aabba106d9728c27f967dab608f6a365a0ad 100644 (file)
@@ -220,7 +220,25 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                self = oldself;
                if(startitem_failed)
                        return string_null;
-               if(doreduce)
+               if(doreduce && g_weapon_stay == 2)
+               {
+                       for(i = 0, j = 1; i < 24; ++i, j *= 2)
+                       {
+                               if(wa & j)
+                               {
+                                       ammofield = Item_CounterField(j);
+                                       wep.ammofield = 0;
+
+                                       // if our weapon is loaded, give its load back to the player
+                                       if(self.(weapon_load[self.weapon]) > 0)
+                                       {
+                                               own.ammofield += self.(weapon_load[self.weapon]);
+                                               self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading
+                                       }
+                               }
+                       }
+               }
+               else if(doreduce)
                {
                        for(i = 0, j = 1; i < 24; ++i, j *= 2)
                        {
@@ -245,6 +263,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
                wep.glowmod = own.weaponentity_glowmod;
                wep.think = thrown_wep_think;
                wep.nextthink = time + 0.5;
+               wep.pickup_anyway = TRUE; // these are ALWAYS pickable
                return s;
        }
 }
@@ -297,8 +316,6 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
                return;
        if(!autocvar_g_weapon_throwable)
                return;
-       if(autocvar_g_weapon_stay == 1)
-               return;
        if(self.weaponentity.state != WS_READY)
                return;
        if(!W_IsWeaponThrowable(w))
index 4acb8da891fa4fa4158b5ef01b7026a176cced5e..e049ef8588e2ca97501451d092149e9b037c7679 100644 (file)
@@ -185,8 +185,6 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
                vecs = ent.weaponentity.movedir;
        else
                vecs = '0 0 0';
-       if(debug_shotorg != '0 0 0')
-               vecs = debug_shotorg;
 
        dv = v_right * -vecs_y + v_up * vecs_z;
        w_shotorg = ent.origin + ent.view_ofs + dv;
@@ -681,6 +679,8 @@ void CL_ExteriorWeaponentity_Think()
 
        self.glowmod = self.owner.weaponentity_glowmod;
        self.colormap = self.owner.colormap;
+
+       CSQCMODEL_AUTOUPDATE();
 }
 
 // spawning weaponentity for client
@@ -708,6 +708,13 @@ void CL_SpawnWeaponentity()
        self.exteriorweaponentity.angles = '0 0 0';
        self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think;
        self.exteriorweaponentity.nextthink = time;
+
+       {
+               entity oldself = self;
+               self = self.exteriorweaponentity;
+               CSQCMODEL_AUTOINIT();
+               self = oldself;
+       }
 }
 
 void Send_WeaponComplain (entity e, float wpn, string wpnname, float type)
@@ -906,7 +913,7 @@ float weapon_prepareattack_check(float secondary, float attacktime)
                return FALSE;
        }
 
-       if (timeoutStatus == 2) //don't allow the player to shoot while game is paused
+       if (timeout_status == TIMEOUT_ACTIVE) //don't allow the player to shoot while game is paused
                return FALSE;
 
        // do not even think about shooting if switching
diff --git a/qcsrc/server/clientcommands.qc b/qcsrc/server/clientcommands.qc
deleted file mode 100644 (file)
index 7f52f8f..0000000
+++ /dev/null
@@ -1,665 +0,0 @@
-entity nagger;
-float readycount;
-
-float Nagger_SendEntity(entity to, float sendflags)
-{
-       float nags, i, f, b;
-       entity e;
-       WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER);
-
-       // bits:
-       //   1 = ready
-       //   2 = player needs to ready up
-       //   4 = vote
-       //   8 = player needs to vote
-       //  16 = warmup
-       // sendflags:
-       //  64 = vote counts
-       // 128 = vote string
-
-       nags = 0;
-       if(readycount)
-       {
-               nags |= 1;
-               if(to.ready == 0)
-                       nags |= 2;
-       }
-       if(votecalled)
-       {
-               nags |= 4;
-               if(to.vote_vote == 0)
-                       nags |= 8;
-       }
-       if(inWarmupStage)
-               nags |= 16;
-
-       if(sendflags & 64)
-               nags |= 64;
-
-       if(sendflags & 128)
-               nags |= 128;
-
-       if(!(nags & 4)) // no vote called? send no string
-               nags &~= (64 | 128);
-
-       WriteByte(MSG_ENTITY, nags);
-
-       if(nags & 64)
-       {
-               WriteByte(MSG_ENTITY, vote_yescount);
-               WriteByte(MSG_ENTITY, vote_nocount);
-               WriteByte(MSG_ENTITY, vote_needed_absolute);
-               WriteChar(MSG_ENTITY, to.vote_vote);
-       }
-
-       if(nags & 128)
-               WriteString(MSG_ENTITY, votecalledvote_display);
-
-       if(nags & 1)
-       {
-               for(i = 1; i <= maxclients; i += 8)
-               {
-                       for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e))
-                               if(clienttype(e) != CLIENTTYPE_REAL || e.ready)
-                                       f |= b;
-                       WriteByte(MSG_ENTITY, f);
-               }
-       }
-
-       return TRUE;
-}
-void Nagger_Init()
-{
-       Net_LinkEntity(nagger = spawn(), FALSE, 0, Nagger_SendEntity);
-}
-void Nagger_VoteChanged()
-{
-       if(nagger)
-               nagger.SendFlags |= 128;
-}
-void Nagger_VoteCountChanged()
-{
-       if(nagger)
-               nagger.SendFlags |= 64;
-}
-void Nagger_ReadyCounted()
-{
-       if(nagger)
-               nagger.SendFlags |= 1;
-}
-
-void ReadyCount();
-string MapVote_Suggest(string m);
-
-entity GetPlayer(string name)
-{
-       float num;
-       entity e;
-       string ns;
-
-       if(substring(name, 0, 1) == "#") {
-               num = stof(substring(name, 1, 999));
-               if(num >= 1 && num <= maxclients) {
-                       for((e = world); num > 0; --num, (e = nextent(e)))
-                               ;
-                       //if(clienttype(e) == CLIENTTYPE_REAL)
-                       if(e.classname == "player")
-                               return e;
-               }
-       } else {
-               ns = strdecolorize(name);
-               FOR_EACH_REALPLAYER(e) {
-                       if(!strcasecmp(strdecolorize(e.netname), ns)) {
-                               return e;
-                       }
-               }
-       }
-       return world;
-}
-
-//float ctf_clientcommand();
-float readyrestart_happened;
-.float lms_spectate_warning;
-void spawnfunc_func_breakable();
-
-.float cmd_floodtime;
-.float cmd_floodcount;
-float cmd_floodcheck()
-{
-       if (timeoutStatus != 2)
-       {
-               if(time == self.cmd_floodtime)
-               {
-                       self.cmd_floodcount += 1;
-                       if(self.cmd_floodcount > 8)
-                               return TRUE;
-               }
-               else
-               {
-                       self.cmd_floodtime = time;
-                       self.cmd_floodcount = 1;
-               }
-       }
-       return FALSE;
-}
-
-.float checkfail;
-void SV_ParseClientCommand(string s) {
-       float i;
-       entity e;
-
-       cmd_argc = tokenize_console(s);
-       cmd_string = s;
-       cmd_name = strtolower(argv(0));
-       if(cmd_name != "reportcvar")
-       if(cmd_name != "sentcvar")
-       if(cmd_name != "pause")
-       if(cmd_name != "prespawn")
-       if(cmd_name != "spawn")
-       if(cmd_name != "begin")
-       {
-               if(cmd_floodcheck())
-                       return;
-       }
-
-       if(MUTATOR_CALLHOOK(SV_ParseClientCommand))
-               return; // already handled
-       
-       if(GameCommand_Vote(s, self)) {
-               return;
-       } else if(GameCommand_MapVote(argv(0))) {
-               return;
-       } else if(cmd_name == "checkfail") {
-               print(sprintf("CHECKFAIL: %s (%s) epically failed check %s\n", self.netname, self.netaddress, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))));
-               self.checkfail = 1;
-       } else if(cmd_name == "autoswitch") {
-               // be backwards compatible with older clients (enabled)
-               self.autoswitch = ("0" != argv(1));
-               string autoswitchmsg;
-               if (self.autoswitch) {
-                       autoswitchmsg = "on";
-               } else {
-                       autoswitchmsg = "off";
-               }
-               sprint(self, strcat("^1autoswitch turned ", autoswitchmsg, "\n"));
-       } else if(cmd_name == "clientversion") {
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if (argv(1) == "$gameversion") {
-                       //versionmsg = "^1client is too old to get versioninfo.\nUPDATE!!! (http://www.xonotic.com)^8";
-                       // either that or someone wants to be funny
-                       self.version = 1;
-               } else {
-                       self.version = stof(argv(1));
-               }
-               if(self.version < autocvar_gameversion_min || self.version > autocvar_gameversion_max)
-               {
-                       self.version_mismatch = 1;
-                       ClientKill_TeamChange(-2); // observe
-               } else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) {
-                       //JoinBestTeam(self, FALSE, TRUE);
-               } else if(teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) {
-                       self.classname = "observer";
-                       stuffcmd(self,"menu_showteamselect\n");
-               }
-       } else if(cmd_name == "reportcvar") { // old system
-               if(substring(argv(2), 0, 1) == "$") // undefined cvar: use the default value on the server then
-               {
-                       s = strcat(substring(s, argv_start_index(0), argv_end_index(1) - argv_start_index(0)), " \"", cvar_defstring(argv(1)), "\"");
-                       cmd_argc = tokenize_console(s);
-               }
-               GetCvars(1);
-       } else if(cmd_name == "sentcvar") { // new system
-               if(cmd_argc == 2) // undefined cvar: use the default value on the server then
-               {
-                       s = strcat(substring(s, argv_start_index(0), argv_end_index(1) - argv_start_index(0)), " \"", cvar_defstring(argv(1)), "\"");
-                       cmd_argc = tokenize_console(s);
-               }
-               GetCvars(1);
-       } else if(cmd_name == "spectate") {
-               if(cmd_floodcheck())
-                       return;
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if(g_arena)
-                       return;
-               if(g_lms)
-               {
-                       if(self.lms_spectate_warning)
-                       {
-                               // mark player as spectator
-                               PlayerScore_Add(self, SP_LMS_RANK, 666 - PlayerScore_Add(self, SP_LMS_RANK, 0));
-                       }
-                       else
-                       {
-                               self.lms_spectate_warning = 1;
-                               sprint(self, "WARNING: you won't be able to enter the game again after spectating in LMS. Use the same command again to spectate anyway.\n");
-                               return;
-                       }
-               }
-               if(self.classname == "player" && autocvar_sv_spectate == 1) {
-                       ClientKill_TeamChange(-2); // observe
-               }
-               if(g_ca && self.caplayer && (self.classname == "spectator" || self.classname == "observer")) {
-                       // in CA, allow a dead player to move to spectatators (without that, caplayer!=0 will be moved back to the player list)
-                       sprint(self, "WARNING: you will spectate in the next round.\n");
-                       self.caplayer = 0;
-               }
-       } else if(cmd_name == "join") {
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if(!g_arena)
-               if (self.classname != "player" && !lockteams)
-               {
-                       if(nJoinAllowed(1)) {
-                               self.classname = "player";
-                               if(g_ca)
-                                       self.caplayer = 1;
-                               PlayerScore_Clear(self);
-                               bprint ("^4", self.netname, "^4 is playing now\n");
-                               PutClientInServer();
-                               if(autocvar_g_campaign)
-                                       campaign_bots_may_start = 1;
-                       }
-                       else {
-                               //player may not join because of g_maxplayers is set
-                               centerprint(self, PREVENT_JOIN_TEXT);
-                       }
-               }
-       } else if( cmd_name == "selectteam" ) {
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if( !teamplay ) {
-                       sprint( self, "selectteam can only be used in teamgames\n");
-               } else if(autocvar_g_campaign) {
-                       //JoinBestTeam(self, 0);
-               } else if(self.team_forced > 0) {
-                       sprint( self, "selectteam can not be used as your team is forced\n");
-               } else if(lockteams) {
-                       sprint( self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n");
-               } else if( argv(1) == "red" ) {
-                       if(self.team == COLOR_TEAM1 && self.deadflag == DEAD_NO)
-                               sprint( self, "^7You already are on that team.\n");
-                       else if (self.wasplayer && autocvar_g_changeteam_banned)
-                               sprint( self, "^1You cannot change team, forbidden by the server.\n");
-                       else
-                               ClientKill_TeamChange(COLOR_TEAM1);
-               } else if( argv(1) == "blue" ) {
-                       if(self.team == COLOR_TEAM2 && self.deadflag == DEAD_NO)
-                               sprint( self, "^7You already are on that team.\n");
-                       else if (self.wasplayer && autocvar_g_changeteam_banned)
-                               sprint( self, "^1You cannot change team, forbidden by the server.\n");
-                       else
-                               ClientKill_TeamChange(COLOR_TEAM2);
-               } else if( argv(1) == "yellow" ) {
-                       if(self.team == COLOR_TEAM3 && self.deadflag == DEAD_NO)
-                               sprint( self, "^7You already are on that team.\n");
-                       else if (self.wasplayer && autocvar_g_changeteam_banned)
-                               sprint( self, "^1You cannot change team, forbidden by the server.\n");
-                       else
-                               ClientKill_TeamChange(COLOR_TEAM3);
-               } else if( argv(1) == "pink" ) {
-                       if(self.team == COLOR_TEAM4 && self.deadflag == DEAD_NO)
-                               sprint( self, "^7You already are on that team.\n");
-                       else if (self.wasplayer && autocvar_g_changeteam_banned)
-                               sprint( self, "^1You cannot change team, forbidden by the server.\n");
-                       else
-                               ClientKill_TeamChange(COLOR_TEAM4);
-               } else if( argv(1) == "auto" ) {
-                       ClientKill_TeamChange(-1);
-               } else {
-                       sprint( self, strcat( "selectteam none/red/blue/yellow/pink/auto - \"", argv(1), "\" not recognised\n" ) );
-               }
-       } else if(cmd_name == "ready") {
-               if not(self.flags & FL_CLIENT)
-                       return;
-
-               if((inWarmupStage)
-                  || autocvar_sv_ready_restart || g_race_qualifying == 2)
-               {
-                       if(!readyrestart_happened || autocvar_sv_ready_restart_repeatable)
-                       {
-                               if (self.ready) // toggle
-                               {
-                                       self.ready = FALSE;
-                                       bprint(self.netname, "^2 is ^1NOT^2 ready\n");
-                               }
-                               else
-                               {
-                                       self.ready = TRUE;
-                                       bprint(self.netname, "^2 is ready\n");
-                               }
-
-                               // cannot reset the game while a timeout is active!
-                               if(!timeoutStatus)
-                                       ReadyCount();
-                       } else {
-                               sprint(self, "^1Game has already been restarted\n");
-                       }
-               }
-       } else if(cmd_name == "maplist") {
-               sprint(self, maplist_reply);
-       } else if(cmd_name == "lsmaps") {
-               sprint(self, lsmaps_reply);
-       } else if(cmd_name == "lsnewmaps") {
-               sprint(self, lsnewmaps_reply);
-       } else if(cmd_name == "records") {
-               for(i = 0; i < 10; ++i)
-                       sprint(self, records_reply[i]);
-       } else if(cmd_name == "ladder") {
-               sprint(self, ladder_reply);
-       } else if(cmd_name == "rankings") {
-               sprint(self, rankings_reply);
-       } else if(cmd_name == "voice") {
-               if(cmd_argc >= 3)
-                       VoiceMessage(argv(1), substring(s, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
-               else
-                       VoiceMessage(argv(1), "");
-       } else if(cmd_name == "say") {
-               if(cmd_argc >= 2)
-                       Say(self, FALSE, world, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1);
-               //clientcommand(self, formatmessage(s));
-       } else if(cmd_name == "say_team") {
-               if(cmd_argc >= 2)
-                       Say(self, TRUE, world, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1);
-               //clientcommand(self, formatmessage(s));
-       } else if(cmd_name == "selfstuff") {
-               // this command mainly serves to embed a command to be executed into a demo (HINT: use settemp)
-               stuffcmd(self, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
-       } else if(cmd_name == "tell") {
-               e = GetCommandPlayerSlotTargetFromTokenizedCommand(cmd_argc, 1);
-               if(e && cmd_argc > ParseCommandPlayerSlotTarget_firsttoken)
-               {
-                       Say(self, FALSE, e, substring(s, argv_start_index(ParseCommandPlayerSlotTarget_firsttoken), argv_end_index(-1) - argv_start_index(ParseCommandPlayerSlotTarget_firsttoken)), TRUE);
-               }
-               else
-               {
-                       if(cmd_argc > ParseCommandPlayerSlotTarget_firsttoken)
-                               trigger_magicear_processmessage_forallears(self, -1, world, substring(s, argv_start_index(ParseCommandPlayerSlotTarget_firsttoken), argv_end_index(-1) - argv_start_index(ParseCommandPlayerSlotTarget_firsttoken)));
-                       sprint(self, "ERROR: usage: tell # playerid text...\n");
-               }
-               //clientcommand(self, formatmessage(s));
-       } else if(cmd_name == "info") {
-               cmd_name = builtin_cvar_string(strcat("sv_info_", argv(1))); // This needed fixed for the cvar check
-               if(cmd_name == "")
-                       sprint(self, "ERROR: unsupported info command\n");
-               else
-                       wordwrap_sprint(cmd_name, 1111);
-       } else if(cmd_name == "suggestmap") {
-               sprint(self, strcat(MapVote_Suggest(argv(1)), "\n"));
-       } else if(cmd_name == "timeout") {
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if(autocvar_sv_timeout) {
-                       if(self.classname == "player") {
-                               if(votecalled)
-                                       sprint(self, "^7Error: you can not call a timeout while a vote is active!\n");
-                               else
-                                       evaluateTimeout();
-                       }
-                       else
-                               sprint(self, "^7Error: only players can call a timeout!\n");
-               }
-       } else if(cmd_name == "timein") {
-               if not(self.flags & FL_CLIENT)
-                       return;
-               if(autocvar_sv_timeout) {
-                       evaluateTimein();
-               }
-       } else if(cmd_name == "teamstatus") {
-               Score_NicePrint(self);
-       } else if(cmd_name == "cvar_changes") {
-               sprint(self, cvar_changes);
-       } else if(cmd_name == "cvar_purechanges") {
-               sprint(self, cvar_purechanges);
-       } else if(CheatCommand(cmd_argc)) {
-       } else {
-#if 0
-               //if(ctf_clientcommand())
-               //      return;
-               // grep for Cmd_AddCommand_WithClientCommand to find them all
-               if(cmd_name != "status")
-               //if(cmd_name != "say") // handled above
-               //if(cmd_name != "say_team") // handled above
-               if(cmd_name != "kill")
-               if(cmd_name != "pause")
-               if(cmd_name != "ping")
-               if(cmd_name != "name")
-               if(cmd_name != "color")
-               if(cmd_name != "rate")
-               if(cmd_name != "pmodel")
-               if(cmd_name != "playermodel")
-               if(cmd_name != "playerskin")
-               if(cmd_name != "prespawn")
-               if(cmd_name != "spawn")
-               if(cmd_name != "begin")
-               if(cmd_name != "pings")
-               if(cmd_name != "sv_startdownload")
-               if(cmd_name != "download")
-               {
-                       print("WARNING: Invalid clientcommand by ", self.netname, ": ", s, "\n");
-                       return;
-               }
-#endif
-
-               if(self.jointime > 0 && time > self.jointime + 10 && time > self.nickspamtime) // allow any changes in the first 10 seconds since joining
-               if(cmd_name == "name" || cmd_name == "playermodel") // TODO also playerskin and color?
-               {
-                       if(self.nickspamtime == 0 || time > self.nickspamtime + autocvar_g_nick_flood_timeout)
-                               // good, no serious flood
-                               self.nickspamcount = 1;
-                       else
-                               self.nickspamcount += 1;
-                       self.nickspamtime = time + autocvar_g_nick_flood_penalty;
-
-                       if (timeoutStatus == 2) //when game is paused, no flood protection
-                               self.nickspamcount = self.nickspamtime = 0;
-               }
-
-               clientcommand(self,s);
-       }
-}
-
-void ReadyRestartForce()
-{
-       entity e;
-
-       bprint("^1Server is restarting...\n");
-
-       VoteReset();
-
-       // clear overtime
-       if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) {
-               //we have to decrease timelimit to its original value again!!
-               float newTL;
-               newTL = autocvar_timelimit;
-               newTL -= checkrules_overtimesadded * autocvar_timelimit_overtime;
-               cvar_set("timelimit", ftos(newTL));
-       }
-
-       checkrules_suddendeathend = checkrules_overtimesadded = checkrules_suddendeathwarning = 0;
-
-
-       readyrestart_happened = 1;
-       game_starttime = time;
-       if(!g_ca && !g_arena)
-               game_starttime += RESTART_COUNTDOWN;
-       restart_mapalreadyrestarted = 0; //reset this var, needed when cvar sv_ready_restart_repeatable is in use
-
-       inWarmupStage = 0; //once the game is restarted the game is in match stage
-
-       //reset the .ready status of all players (also spectators)
-       FOR_EACH_CLIENTSLOT(e)
-               e.ready = 0;
-       readycount = 0;
-       Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client
-
-       if(autocvar_teamplay_lockonrestart && teamplay) {
-               lockteams = 1;
-               bprint("^1The teams are now locked.\n");
-       }
-
-       //initiate the restart-countdown-announcer entity
-       if(autocvar_sv_ready_restart_after_countdown && !g_ca && !g_arena)
-       {
-               restartTimer = spawn();
-               restartTimer.think = restartTimer_Think;
-               restartTimer.nextthink = game_starttime;
-       }
-
-       //after a restart every players number of allowed timeouts gets reset, too
-       if(autocvar_sv_timeout)
-       {
-               FOR_EACH_REALPLAYER(e)
-                       e.allowedTimeouts = autocvar_sv_timeout_number;
-       }
-
-       //reset map immediately if this cvar is not set
-       if (!autocvar_sv_ready_restart_after_countdown)
-               reset_map(TRUE);
-
-       if(autocvar_sv_eventlog)
-               GameLogEcho(":restart");
-}
-
-void ReadyRestart()
-{
-       // no arena, assault support yet...
-       if(g_arena | g_assault | gameover | intermission_running | race_completing)
-               localcmd("restart\n");
-       else
-               localcmd("\nsv_hook_gamerestart\n");
-
-       ReadyRestartForce();
-
-       // reset ALL scores, but only do that at the beginning
-       //of the countdown if sv_ready_restart_after_countdown is off!
-       //Otherwise scores could be manipulated during the countdown!
-       if (!autocvar_sv_ready_restart_after_countdown)
-               Score_ClearAll();
-}
-
-/**
- * Counts how many players are ready. If not enough players are ready, the function
- * does nothing. If all players are ready, the timelimit will be extended and the
- * restart_countdown variable is set to allow other functions like PlayerPostThink
- * to detect that the countdown is now active. If the cvar sv_ready_restart_after_countdown
- * is not set the map will be resetted.
- *
- * Function is called after the server receives a 'ready' sign from a player.
- */
-void ReadyCount()
-{
-       entity e;
-       float r, p;
-
-       r = p = 0;
-
-       FOR_EACH_REALPLAYER(e)
-       {
-               p += 1;
-               if(e.ready)
-                       r += 1;
-       }
-
-       readycount = r;
-
-       Nagger_ReadyCounted();
-
-       if(r) // at least one is ready
-       if(r == p) // and, everyone is ready
-               ReadyRestart();
-}
-
-/**
- * Restarts the map after the countdown is over (and cvar sv_ready_restart_after_countdown
- * is set)
- */
-void restartTimer_Think() {
-       restart_mapalreadyrestarted = 1;
-       reset_map(TRUE);
-       Score_ClearAll();
-       remove(self);
-       return;
-}
-
-/**
- * Checks whether the player who calls the timeout is allowed to do so.
- * If so, it initializes the timeout countdown. It also checks whether another
- * timeout was already running at this time and reacts correspondingly.
- *
- * affected globals/fields: .allowedTimeouts, remainingTimeoutTime, remainingLeadTime,
- *                          timeoutInitiator, timeoutStatus, timeoutHandler
- *
- * This function is called when a player issues the calltimeout command.
- */
-void evaluateTimeout() {
-       if (inWarmupStage && !g_warmup_allow_timeout)
-               return sprint(self, "^7Error: You can not call a timeout in warmup-stage!\n");
-       if (time < game_starttime )
-               return sprint(self, "^7Error: You can not call a timeout while the map is being restarted!\n");
-       if (timeoutStatus != 2) {
-               //if the map uses a timelimit make sure that timeout cannot be called right before the map ends
-               if (autocvar_timelimit) {
-                       //a timelimit was used
-                       float myTl;
-                       myTl = autocvar_timelimit;
-
-                       float lastPossibleTimeout;
-                       lastPossibleTimeout = (myTl*60) - autocvar_sv_timeout_leadtime - 1;
-
-                       if (lastPossibleTimeout < time - game_starttime)
-                               return sprint(self, "^7Error: It is too late to call a timeout now!\n");
-               }
-       }
-       //player may not call a timeout if he has no calls left
-       if (self.allowedTimeouts < 1)
-               return sprint(self, "^7Error: You already used all your timeout calls for this map!\n");
-       //now all required checks are passed
-       self.allowedTimeouts -= 1;
-       bprint(self.netname, " ^7called a timeout (", ftos(self.allowedTimeouts), " timeouts left)!\n"); //write a bprint who started the timeout (and how many he has left)
-       remainingTimeoutTime = autocvar_sv_timeout_length;
-       remainingLeadTime = autocvar_sv_timeout_leadtime;
-       timeoutInitiator = self;
-       if (timeoutStatus == 0) { //if another timeout was already active, don't change its status (which was 1 or 2) to 1, only change it to 1 if no timeout was active yet
-               timeoutStatus = 1;
-               //create the timeout indicator which centerprints the information to all players and takes care of pausing/unpausing
-               timeoutHandler = spawn();
-               timeoutHandler.think = timeoutHandler_Think;
-       }
-       timeoutHandler.nextthink = time; //always let the entity think asap
-
-       //inform all connected clients about the timeout call
-       Announce("timeoutcalled");
-}
-
-/**
- * Checks whether a player is allowed to resume the game. If he is allowed to do it,
- * and the lead time for the timeout is still active, this countdown just will be aborted (the
- * game will never be paused). Otherwise the remainingTimeoutTime will be set to the corresponding
- * value of the cvar sv_timeout_resumetime.
- *
- * This function is called when a player issues the resumegame command.
- */
-void evaluateTimein() {
-       if (!timeoutStatus)
-               return sprint(self, "^7Error: There is no active timeout which could be aborted!\n");
-       if (self != timeoutInitiator)
-               return sprint(self, "^7Error: You may not abort the active timeout. Only the player who called it can do that!\n");
-       if (timeoutStatus == 1) {
-               remainingTimeoutTime = timeoutStatus = 0;
-               timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately
-               bprint(strcat("^7The timeout was aborted by ", self.netname, " !\n"));
-       }
-       else if (timeoutStatus == 2) {
-               //only shorten the remainingTimeoutTime if it makes sense
-               if( remainingTimeoutTime > (autocvar_sv_timeout_resumetime + 1) ) {
-                       bprint(strcat("^1Attention: ^7", self.netname, " resumed the game! Prepare for battle!\n"));
-                       remainingTimeoutTime = autocvar_sv_timeout_resumetime;
-                       timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately
-               }
-               else
-                       sprint(self, "^7Error: Your resumegame call was discarded!\n");
-
-       }
-}
diff --git a/qcsrc/server/command/banning.qc b/qcsrc/server/command/banning.qc
new file mode 100644 (file)
index 0000000..2fbdd27
--- /dev/null
@@ -0,0 +1,229 @@
+// =====================================================
+//  Banning and kicking command code, written by Samual
+//  Last updated: December 29th, 2011
+// =====================================================
+
+void BanCommand_ban(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2)
+                       {
+                               string ip = argv(1);
+                               float reason_arg, bantime;
+                               string reason;
+                               
+                               reason_arg = 2; 
+                               
+                               GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
+                               GET_BAN_REASON(reason, "No reason provided");
+
+                               Ban_Insert(ip, bantime, reason, 1);
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2ban^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd ban address [bantime] [reason]\n");
+                       print("  'address' is the IP address or range of the player to ban,\n");
+                       print("  'bantime' is the amount of time that the ban is active (default if not provided),\n");
+                       print("  and 'reason' is the string to label the ban with as reason for banning.\n");
+                       print("See also: ^2banlist, kickban, unban^7\n");
+                       return;
+               }
+       }
+}
+
+void BanCommand_banlist(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       Ban_View();
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd banlist\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2ban, kickban, unban^7\n");
+                       return;
+               }
+       }
+}
+
+void BanCommand_kickban(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2)
+                       {
+                               entity client = GetIndexedEntity(argc, 1);
+                               float accepted = VerifyClientEntity(client, TRUE, FALSE);
+                               float reason_arg, bantime, masksize;
+                               string reason;
+                               
+                               if(accepted > 0) 
+                               {
+                                       reason_arg = next_token; 
+
+                                       GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
+                                       GET_BAN_ARG(masksize, autocvar_g_ban_default_masksize);
+                                       GET_BAN_REASON(reason, "No reason provided");
+
+                                       Ban_KickBanClient(client, bantime, masksize, reason);
+                                       
+                                       return;
+                               }
+                               else
+                               {
+                                       print("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n"); 
+                               }
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2kickban^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd kickban client [bantime] [masksize] [reason]\n");
+                       print("  'client' is the entity number or name of the player to ban,\n");
+                       print("  'bantime' is the amount of time that the ban is active (default if not provided),\n");
+                       print("  'masksize' is the range of the IP address (1-thru-4, default if not provided),\n");
+                       print("  and 'reason' is the string to label the ban with as reason for banning.\n");
+                       print("See also: ^2ban, banlist, unban^7\n");
+                       return;
+               }
+       }
+}
+
+void BanCommand_unban(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               Ban_Delete(stof(argv(1)));
+                               return;
+                       }
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd unban banid\n");
+                       print("  Where 'banid' is the ID of the ban of which to remove.\n");
+                       print("See also: ^2ban, banlist, kickban^7\n");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void BanCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd \n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+*/
+
+
+// ==================================
+//  Macro system for server commands
+// ==================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+#define BAN_COMMANDS(request,arguments,command) \
+       BAN_COMMAND("ban", BanCommand_ban(request, arguments, command), "Ban an IP address or a range of addresses (like 1.2.3)") \
+       BAN_COMMAND("banlist", BanCommand_banlist(request), "List all existing bans") \
+       BAN_COMMAND("kickban", BanCommand_kickban(request, arguments, command), "Disconnect a client and ban it at the same time") \
+       BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
+       /* nothing */
+
+void BanCommand_macro_help()
+{
+       #define BAN_COMMAND(name,function,description) \
+               { print("  ^2", name, "^7: ", description, "\n"); }
+               
+       BAN_COMMANDS(0, 0, "")
+       #undef BAN_COMMAND
+       
+       return;
+}
+
+float BanCommand_macro_command(float argc, string command)
+{
+       #define BAN_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
+       #undef BAN_COMMAND
+       
+       return FALSE;
+}
+
+float BanCommand_macro_usage(float argc)
+{
+       #define BAN_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "")
+       #undef BAN_COMMAND
+       
+       return FALSE;
+}
+
+void BanCommand_macro_write_aliases(float fh)
+{
+       #define BAN_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_sv", name, description); }
+       
+       BAN_COMMANDS(0, 0, "")
+       #undef BAN_COMMAND
+       
+       return;
+}
+
+float BanCommand(string command)
+{
+       float argc = tokenize_console(command);
+       
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+
+       if(BanCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
+       {
+               return TRUE; // handled by one of the above GenericCommand_* functions
+       }
+       
+       return FALSE;
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/banning.qh b/qcsrc/server/command/banning.qh
new file mode 100644 (file)
index 0000000..7a61382
--- /dev/null
@@ -0,0 +1,15 @@
+// ====================================
+//  Declarations for kick/ban commands
+//  Last updated: December 29th, 2011
+// =====================================
+
+#define GET_BAN_ARG(v,d) if((argc > reason_arg) && ((v = stof(argv(reason_arg))) != 0)) ++reason_arg; else v = d
+#define GET_BAN_REASON(v,d) if(argc > reason_arg) v = substring(command, argv_start_index(reason_arg), strlen(command) - argv_start_index(reason_arg)); else v = d
+
+void Ban_KickBanClient(entity client, float bantime, float masksize, string reason);
+void Ban_View();
+float Ban_Insert(string ip, float bantime, string reason, float dosync);
+float Ban_Delete(float i);
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void BanCommand_macro_write_aliases(float fh)
\ No newline at end of file
diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc
new file mode 100644 (file)
index 0000000..5a7eb03
--- /dev/null
@@ -0,0 +1,730 @@
+// =========================================================
+//  Server side networked commands code, reworked by Samual
+//  Last updated: December 28th, 2011
+// =========================================================
+
+float SV_ParseClientCommand_floodcheck()
+{
+       if not(timeout_status) // not while paused
+       {
+               if(time <= (self.cmd_floodtime + autocvar_sv_clientcommand_antispam_time))
+               {
+                       self.cmd_floodcount += 1;
+                       if(self.cmd_floodcount > autocvar_sv_clientcommand_antispam_count) { return FALSE; } // too much spam, halt
+               }
+               else
+               {
+                       self.cmd_floodtime = time;
+                       self.cmd_floodcount = 1;
+               }
+       }
+       return TRUE; // continue, as we're not flooding yet
+}
+
+
+// =======================
+//  Command Sub-Functions
+// =======================
+
+void ClientCommand_autoswitch(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               self.autoswitch = InterpretBoolean(argv(1));
+                               sprint(self, strcat("^1autoswitch is currently turned ", (self.autoswitch ? "on" : "off"), ".\n"));
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2autoswitch^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd autoswitch selection\n");
+                       sprint(self, "  Where 'selection' controls if autoswitch is on or off.\n"); 
+                       return;
+               }
+       }
+}
+
+void ClientCommand_checkfail(float request, string command) // internal command, used only by code
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print(sprintf("CHECKFAIL: %s (%s) epically failed check %s\n", self.netname, self.netaddress, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))));
+                       self.checkfail = 1;
+                       return; // never fall through to usage
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2checkfail^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd checkfail <message>\n");
+                       sprint(self, "  Where 'message' is the message reported by client about the fail.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_clientversion(float request, float argc) // internal command, used only by code
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               if(self.flags & FL_CLIENT)
+                               {
+                                       self.version = ((argv(1) == "$gameversion") ? 1 : stof(argv(1)));
+                                       
+                                       if(self.version < autocvar_gameversion_min || self.version > autocvar_gameversion_max)
+                                       {
+                                               self.version_mismatch = 1;
+                                               ClientKill_TeamChange(-2); // observe
+                                       } 
+                                       else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) 
+                                       {
+                                               //JoinBestTeam(self, FALSE, TRUE);
+                                       } 
+                                       else if(teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) 
+                                       {
+                                               self.classname = "observer"; // really?
+                                               stuffcmd(self, "menu_showteamselect\n");
+                                       }
+                               }
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2clientversion^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd clientversion version\n");
+                       sprint(self, "  Where 'version' is the game version reported by self.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_mv_getpicture(float request, float argc) // internal command, used only by code
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               if(intermission_running)                                
+                                       MapVote_SendPicture(stof(argv(1)));
+
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2mv_getpicture^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd mv_getpicture mapid\n");
+                       sprint(self, "  Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_join(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(self.flags & FL_CLIENT)
+                       {
+                               if(self.classname != "player" && !lockteams && !g_arena)
+                               {
+                                       if(nJoinAllowed(1)) 
+                                       {
+                                               if(g_ca) { self.caplayer = 1; }
+                                               if(autocvar_g_campaign) { campaign_bots_may_start = 1; }
+                                               
+                                               self.classname = "player";
+                                               PlayerScore_Clear(self);
+                                               bprint ("^4", self.netname, "^4 is playing now\n");
+                                               PutClientInServer();
+                                       }
+                                       else 
+                                       {
+                                               //player may not join because of g_maxplayers is set
+                                               centerprint(self, PREVENT_JOIN_TEXT);
+                                       }
+                               }
+                       }
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd join\n");
+                       sprint(self, "  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_ready(float request) // todo: anti-spam for toggling readyness
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(self.flags & FL_CLIENT)
+                       {
+                               if(inWarmupStage || autocvar_sv_ready_restart || g_race_qualifying == 2)
+                               {
+                                       if(!readyrestart_happened || autocvar_sv_ready_restart_repeatable)
+                                       {
+                                               if (self.ready) // toggle
+                                               {
+                                                       self.ready = FALSE;
+                                                       bprint(self.netname, "^2 is ^1NOT^2 ready\n");
+                                               }
+                                               else
+                                               {
+                                                       self.ready = TRUE;
+                                                       bprint(self.netname, "^2 is ready\n");
+                                               }
+
+                                               // cannot reset the game while a timeout is active!
+                                               if not(timeout_status)
+                                                       ReadyCount();
+                                       } else {
+                                               sprint(self, "^1Game has already been restarted\n");
+                                       }
+                               }
+                       }
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd ready\n");
+                       sprint(self, "  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_reportcvar(float request, float argc, string command)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               float tokens;
+                               string s;
+                               
+                               if(substring(argv(2), 0, 1) == "$") // undefined cvar: use the default value on the server then
+                               {
+                                       s = strcat(substring(command, argv_start_index(0), argv_end_index(1) - argv_start_index(0)), " \"", cvar_defstring(argv(1)), "\"");
+                                       tokens = tokenize_console(s);
+                               }
+                               
+                               GetCvars(1);
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2reportcvar^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd reportcvar <cvar>\n");
+                       sprint(self, "  Where 'cvar' is the cvar plus arguments to send to the server.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_say(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2) { Say(self, FALSE, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); }
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd say <message>\n");
+                       sprint(self, "  Where 'message' is the string of text to say.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_say_team(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2) { Say(self, TRUE, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); }
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd say_team <message>\n");
+                       sprint(self, "  Where 'message' is the string of text to say.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_selectteam(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               if(self.flags & FL_CLIENT)
+                               {
+                                       if(teamplay)
+                                               if not(self.team_forced > 0) 
+                                                       if not(lockteams) 
+                                                       {
+                                                               float selection;
+                                                               
+                                                               switch(argv(1))
+                                                               {
+                                                                       case "red": selection = COLOR_TEAM1; break;
+                                                                       case "blue": selection = COLOR_TEAM2; break;
+                                                                       case "yellow": selection = COLOR_TEAM3; break;
+                                                                       case "pink": selection = COLOR_TEAM4; break;
+                                                                       case "auto": selection = (-1); break;
+                                                                       
+                                                                       default: break;
+                                                               }
+                                                               
+                                                               if(selection)
+                                                               {
+                                                                       if(self.team == selection && self.deadflag == DEAD_NO)
+                                                                               sprint(self, "^7You already are on that team.\n");
+                                                                       else if(self.wasplayer && autocvar_g_changeteam_banned)
+                                                                               sprint(self, "^1You cannot change team, forbidden by the server.\n");
+                                                                       else
+                                                                               ClientKill_TeamChange(selection);
+                                                               }
+                                                       }
+                                                       else
+                                                               sprint(self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n");
+                                               else
+                                                       sprint(self, "^7selectteam can not be used as your team is forced\n");
+                                       else
+                                               sprint(self, "^7selectteam can only be used in teamgames\n");
+                               }
+                               return; 
+                       }
+               }
+
+               default:
+                       sprint(self, "Incorrect parameters for ^2selectteam^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd selectteam team\n");
+                       sprint(self, "  Where 'team' is the prefered team to try and join.\n");
+                       sprint(self, "  Full list of options here: \"red, blue, yellow, pink, auto\"\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_selfstuff(float request, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               stuffcmd(self, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2selectteam^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd selfstuff <command>\n");
+                       sprint(self, "  Where 'command' is the string to be stuffed to your client.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_sentcvar(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               float tokens;
+                               string s;
+                               
+                               if(argc == 2) // undefined cvar: use the default value on the server then
+                               {
+                                       s = strcat(substring(command, argv_start_index(0), argv_end_index(1) - argv_start_index(0)), " \"", cvar_defstring(argv(1)), "\"");
+                                       tokens = tokenize_console(s);
+                               }
+                               
+                               GetCvars(1);
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2sentcvar^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd sentcvar <cvar>\n");
+                       sprint(self, "  Where 'cvar' is the cvar plus arguments to send to the server.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_spectate(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(self.flags & FL_CLIENT)
+                       {
+                               if(g_arena) { return; } 
+                               if(g_lms)
+                               {
+                                       if(self.lms_spectate_warning)
+                                       {
+                                               // mark player as spectator
+                                               PlayerScore_Add(self, SP_LMS_RANK, 666 - PlayerScore_Add(self, SP_LMS_RANK, 0));
+                                       }
+                                       else
+                                       {
+                                               self.lms_spectate_warning = 1;
+                                               sprint(self, "WARNING: you won't be able to enter the game again after spectating in LMS. Use the same command again to spectate anyway.\n");
+                                               return;
+                                       }
+                               }
+                               
+                               if(self.classname == "player" && autocvar_sv_spectate == 1) 
+                                       ClientKill_TeamChange(-2); // observe
+                               
+                               // in CA, allow a dead player to move to spectatators (without that, caplayer!=0 will be moved back to the player list)
+                               // note: if arena game mode is ever done properly, this needs to be removed.
+                               if(g_ca && self.caplayer && (self.classname == "spectator" || self.classname == "observer"))
+                               {
+                                       sprint(self, "WARNING: you will spectate in the next round.\n");
+                                       self.caplayer = 0;
+                               }
+                       }
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd spectate\n");
+                       sprint(self, "  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_suggestmap(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               sprint(self, strcat(MapVote_Suggest(argv(1)), "\n"));
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2suggestmap^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd suggestmap map\n");
+                       sprint(self, "  Where 'map' is the name of the map to suggest.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_tell(float request, float argc, string command)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 3)
+                       {
+                               entity tell_to = GetIndexedEntity(argc, 1);
+                               float tell_accepted = VerifyClientEntity(tell_to, TRUE, FALSE);
+                               
+                               if(tell_accepted > 0) // the target is a real client
+                               {
+                                       if(tell_to != self) // and we're allowed to send to them :D
+                                       {
+                                               Say(self, FALSE, tell_to, substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)), TRUE);
+                                               return;
+                                       }
+                                       else { print_to(self, "You can't ^2tell^7 a message to yourself."); return; }
+                               }
+                               else if(strtolower(argv(1)) == "world") 
+                               { 
+                                       trigger_magicear_processmessage_forallears(self, -1, world, substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)));
+                                       return;
+                               }
+                               else { print_to(self, strcat("tell: ", GetClientErrorString(tell_accepted, argv(1)), ".")); return; }
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2tell^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd tell client <message>\n");
+                       sprint(self, "  Where 'client' is the entity number or name of the player to send 'message' to.\n");
+                       return;
+               }
+       }
+}
+
+void ClientCommand_voice(float request, float argc, string command) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               if(argc >= 3)
+                                       VoiceMessage(argv(1), substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
+                               else
+                                       VoiceMessage(argv(1), "");
+                                       
+                               return;
+                       }
+               }
+                       
+               default:
+                       sprint(self, "Incorrect parameters for ^2voice^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd voice messagetype <soundname>\n");
+                       sprint(self, "  'messagetype' is the type of broadcast to do, like team only or such,\n");
+                       sprint(self, "  and 'soundname' is the string/filename of the sound/voice message to play.\n");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void ClientCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       sprint(self, "\nUsage:^3 cmd \n");
+                       sprint(self, "  No arguments required.\n");
+                       return;
+               }
+       }
+}
+*/
+
+
+// =====================================
+//  Macro system for networked commands
+// =====================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+#define CLIENT_COMMANDS(request,arguments,command) \
+       CLIENT_COMMAND("autoswitch", ClientCommand_autoswitch(request, arguments), "Whether or not to switch automatically when getting a better weapon") \
+       CLIENT_COMMAND("checkfail", ClientCommand_checkfail(request, command), "Report if a client-side check failed") \
+       CLIENT_COMMAND("clientversion", ClientCommand_clientversion(request, arguments), "Release version of the game") \
+       CLIENT_COMMAND("mv_getpicture", ClientCommand_mv_getpicture(request, arguments), "Retrieve mapshot picture from the server") \
+       CLIENT_COMMAND("join", ClientCommand_join(request), "Become a player in the game") \
+       CLIENT_COMMAND("ready", ClientCommand_ready(request), "Qualify as ready to end warmup stage (or restart server if allowed)") \
+       CLIENT_COMMAND("reportcvar", ClientCommand_reportcvar(request, arguments, command), "Old system for sending a client cvar to the server") \
+       CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \
+       CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command), "Print a message to chat to all team mates") \
+       CLIENT_COMMAND("selectteam", ClientCommand_selectteam(request, arguments), "Attempt to choose a team to join into") \
+       CLIENT_COMMAND("selfstuff", ClientCommand_selfstuff(request, command), "Stuffcmd a command to your own client") \
+       CLIENT_COMMAND("sentcvar", ClientCommand_sentcvar(request, arguments, command), "New system for sending a client cvar to the server") \
+       CLIENT_COMMAND("spectate", ClientCommand_spectate(request), "Become an observer") \
+       CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments), "Suggest a map to the mapvote at match end") \
+       CLIENT_COMMAND("tell", ClientCommand_tell(request, arguments, command), "Send a message directly to a player") \
+       CLIENT_COMMAND("voice", ClientCommand_voice(request, arguments, command), "Send voice message via sound") \
+       /* nothing */
+       
+void ClientCommand_macro_help()
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { sprint(self, "  ^2", name, "^7: ", description, "\n"); }
+               
+       CLIENT_COMMANDS(0, 0, "")
+       #undef CLIENT_COMMAND
+       
+       return;
+}
+
+float ClientCommand_macro_command(float argc, string command)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       CLIENT_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
+       #undef CLIENT_COMMAND
+       
+       return FALSE;
+}
+
+float ClientCommand_macro_usage(float argc)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       CLIENT_COMMANDS(CMD_REQUEST_USAGE, argc, "")
+       #undef CLIENT_COMMAND
+       
+       return FALSE;
+}
+
+void ClientCommand_macro_write_aliases(float fh)
+{
+       #define CLIENT_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_cmd", name, description); } 
+               
+       CLIENT_COMMANDS(0, 0, "")
+       #undef CLIENT_COMMAND
+       
+       return;
+}
+
+// ======================================
+//  Main Function Called By Engine (cmd)
+// ======================================
+// If this function exists, server game code parses clientcommand before the engine code gets it.
+
+void SV_ParseClientCommand(string command)
+{
+       float argc = tokenize_console(command);
+       
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+       
+       // for floodcheck
+       switch(strtolower(argv(0)))
+       {
+               // exempt commands which are not subject to floodcheck
+               case "begin": break; // handled by engine in host_cmd.c
+               case "download": break; // handled by engine in cl_parse.c
+               case "mv_getpicture": break; // handled by server in this file
+               case "pause": break; // handled by engine in host_cmd.c
+               case "prespawn": break; // handled by engine in host_cmd.c
+               case "reportcvar": break; // handled by server in this file
+               case "sentcvar": break; // handled by server in this file
+               case "spawn": break; // handled by engine in host_cmd.c
+               
+               default: 
+                       if(SV_ParseClientCommand_floodcheck())
+                               break; // "TRUE": continue, as we're not flooding yet
+                       else
+                               return; // "FALSE": not allowed to continue, halt // print("^1ERROR: ^7ANTISPAM CAUGHT: ", command, ".\n");
+       }
+       
+       /* NOTE: should this be disabled? It can be spammy perhaps, but hopefully it's okay for now */
+       if(argv(0) == "help") 
+       {
+               if(argc == 1) 
+               {
+                       sprint(self, "\nClient networked commands:\n");
+                       ClientCommand_macro_help();
+                       
+                       sprint(self, "\nCommon networked commands:\n");
+                       CommonCommand_macro_help(self);
+                       
+                       sprint(self, "\nUsage:^3 cmd COMMAND...^7, where possible commands are listed above.\n");
+                       sprint(self, "For help about a specific command, type cmd help COMMAND\n");
+                       return;
+               } 
+               else if(CommonCommand_macro_usage(argc, self)) // Instead of trying to call a command, we're going to see detailed information about it
+               {
+                       return;
+               }
+               else if(ClientCommand_macro_usage(argc)) // same, but for normal commands now
+               {
+                       return;
+               }
+       } 
+       else if(MUTATOR_CALLHOOK(SV_ParseClientCommand))
+       {
+               return; // handled by a mutator
+       }
+       else if(CheatCommand(argc)) 
+       {
+               return; // handled by server/cheats.qc
+       }
+       else if(CommonCommand_macro_command(argc, self, command))
+       {
+               return; // handled by server/command/common.qc
+       }
+       else if(ClientCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
+       {
+               return; // handled by one of the above ClientCommand_* functions
+       }
+       else
+               clientcommand(self, command);
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/cmd.qh b/qcsrc/server/command/cmd.qh
new file mode 100644 (file)
index 0000000..e64cbc2
--- /dev/null
@@ -0,0 +1,14 @@
+// =================================================
+//  Declarations for server side networked commands
+//  Last updated: December 26th, 2011
+// =================================================
+
+.float cmd_floodtime;
+.float cmd_floodcount;
+.float lms_spectate_warning;
+.float checkfail;
+
+string MapVote_Suggest(string m);
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void ClientCommand_macro_write_aliases(float fh);
\ No newline at end of file
diff --git a/qcsrc/server/command/common.qc b/qcsrc/server/command/common.qc
new file mode 100644 (file)
index 0000000..3b71e3d
--- /dev/null
@@ -0,0 +1,762 @@
+// ====================================================
+//  Shared code for server commands, written by Samual
+//  Last updated: December 27th, 2011
+// ====================================================
+
+// select the proper prefix for usage and other messages
+string GetCommandPrefix(entity caller)
+{
+       if(caller)
+               return "cmd";
+       else
+               return "sv_cmd";
+}
+
+// if client return player nickname, or if server return admin nickname
+string GetCallerName(entity caller)
+{
+       if(caller)
+               return caller.netname;
+       else
+               return admin_name(); //((autocvar_sv_adminnick != "") ? autocvar_sv_adminnick : autocvar_hostname);
+}
+
+// verify that the client provided is acceptable for use
+float VerifyClientEntity(entity client, float must_be_real, float must_be_bots)
+{
+       if not(client.flags & FL_CLIENT)
+               return CLIENT_DOESNT_EXIST;
+       else if(must_be_real && (clienttype(client) != CLIENTTYPE_REAL))
+               return CLIENT_NOT_REAL;
+       else if(must_be_bots && (clienttype(client) != CLIENTTYPE_BOT))
+               return CLIENT_NOT_BOT;
+               
+       return CLIENT_ACCEPTABLE;
+}
+
+// if the client is not acceptable, return a string to be used for error messages
+string GetClientErrorString(float clienterror, string original_input)
+{
+       switch(clienterror)
+       {
+               case CLIENT_DOESNT_EXIST: { return strcat("Client '", original_input, "' doesn't exist"); }
+               case CLIENT_NOT_REAL: { return strcat("Client '", original_input, "' is not real"); }
+               case CLIENT_NOT_BOT: { return strcat("Client '", original_input, "' is not a bot"); }
+               default: { return "Incorrect usage of GetClientErrorString"; }
+       }
+}
+
+// is this entity number even in the possible range of entities?
+float VerifyClientNumber(float tmp_number)
+{
+       if((tmp_number < 1) || (tmp_number > maxclients))
+               return FALSE;
+       else
+               return TRUE;
+}
+
+entity GetIndexedEntity(float argc, float start_index)
+{
+       entity tmp_player, selection;
+       float tmp_number, index;
+       string tmp_string;
+       
+       next_token = -1;
+       index = start_index;
+       
+       if(argc > start_index)
+       {
+               if(substring(argv(index), 0, 1) == "#")
+               {
+                       tmp_string = substring(argv(index), 1, -1);
+                       ++index;
+                       
+                       if(tmp_string != "") // is it all one token? like #1
+                       {
+                               tmp_number = stof(tmp_string);
+                       }
+                       else if(argc > index) // no, it's two tokens? # 1
+                       {
+                               tmp_number = stof(argv(index));
+                               ++index;
+                       }
+               }
+               else // maybe it's ONLY a number?
+               {
+                       tmp_number = stof(argv(index));
+                       ++index;
+               }
+               
+               if(VerifyClientNumber(tmp_number))
+               {
+                       selection = edict_num(tmp_number); // yes, it was a number
+               }
+               else // no, maybe it's a name?
+               {
+                       FOR_EACH_CLIENT(tmp_player)
+                               if (strdecolorize(tmp_player.netname) == strdecolorize(argv(start_index)))
+                                       selection = tmp_player;
+                                       
+                       index = (start_index + 1);
+               }
+       }
+       
+       next_token = index;
+       print(strcat("start_index: ", ftos(start_index), ", next_token: ", ftos(next_token), ", edict: ", ftos(num_for_edict(selection)), ".\n"));
+       return selection;
+}
+
+// find a player which matches the input string, and return their entity
+entity GetFilteredEntity(string input)
+{
+       entity tmp_player, selection;
+       float tmp_number;
+       
+       if(substring(input, 0, 1) == "#")
+               tmp_number = stof(substring(input, 1, -1));
+       else
+               tmp_number = stof(input);
+       
+       if(VerifyClientNumber(tmp_number))
+       {
+               selection = edict_num(tmp_number);
+       }
+       else
+       {
+               FOR_EACH_CLIENT(tmp_player)
+                       if (strdecolorize(tmp_player.netname) == strdecolorize(input))
+                               selection = tmp_player;
+       }
+       
+       return selection;
+}
+
+// same thing, but instead return their edict number
+float GetFilteredNumber(string input)
+{
+       entity selection = GetFilteredEntity(input);
+       float output;
+       
+       if(selection) { output = num_for_edict(selection); }
+
+       return output;
+}
+
+// switch between sprint and print depending on whether the reciever is the server or a player
+void print_to(entity to, string input)
+{
+    if(to)
+        sprint(to, strcat(input, "\n"));
+    else
+        print(input, "\n");
+}
+
+// ==========================================
+//  Supporting functions for common commands
+// ==========================================
+
+// used by CommonCommand_timeout() and CommonCommand_timein() to handle game pausing and messaging and such.
+void timeout_handler_reset()
+{
+       entity tmp_player;
+       
+       timeout_caller = world;
+       timeout_time = 0;
+       timeout_leadtime = 0;
+       
+       FOR_EACH_REALPLAYER(tmp_player)
+               Send_CSQC_Centerprint_Generic_Expire(tmp_player, CPID_TIMEOUT_COUNTDOWN);
+                               
+       remove(self);
+}
+
+void timeout_handler_think() 
+{
+       entity tmp_player;
+       
+       switch(timeout_status)
+       {
+               case TIMEOUT_ACTIVE:
+               {
+                       if(timeout_time > 0) // countdown is still going
+                       {
+                               FOR_EACH_REALPLAYER(tmp_player)
+                                       Send_CSQC_Centerprint_Generic(tmp_player, CPID_TIMEOUT_COUNTDOWN, "Timeout ends in %d seconds!", 1, timeout_time);
+
+                               if(timeout_time == autocvar_sv_timeout_resumetime) // play a warning sound when only <sv_timeout_resumetime> seconds are left
+                                       Announce("prepareforbattle");
+
+                               self.nextthink = time + TIMEOUT_SLOWMO_VALUE; // think again in one second
+                               timeout_time -= 1; // decrease the time counter
+                       }
+                       else // time to end the timeout
+                       {
+                               timeout_status = TIMEOUT_INACTIVE;
+                               
+                               // reset the slowmo value back to normal
+                               cvar_set("slowmo", ftos(orig_slowmo));
+                               
+                               // unlock the view for players so they can move around again
+                               FOR_EACH_REALPLAYER(tmp_player) 
+                                       tmp_player.fixangle = FALSE;
+                                       
+                               timeout_handler_reset();
+                       }
+                       
+                       return;
+               }
+               
+               case TIMEOUT_LEADTIME:
+               {
+                       if(timeout_leadtime > 0) // countdown is still going
+                       {
+                               // centerprint the information to every player
+                               FOR_EACH_REALPLAYER(tmp_player) 
+                                       Send_CSQC_Centerprint_Generic(tmp_player, CPID_TIMEOUT_COUNTDOWN, "Timeout begins in %d seconds!", 1, timeout_leadtime);
+                               
+                               self.nextthink = time + 1; // think again in one second
+                               timeout_leadtime -= 1; // decrease the time counter
+                       }
+                       else // time to begin the timeout
+                       {
+                               timeout_status = TIMEOUT_ACTIVE;
+                               
+                               // set the slowmo value to the timeout default slowmo value
+                               cvar_set("slowmo", ftos(TIMEOUT_SLOWMO_VALUE));
+                               
+                               // reset all the flood variables
+                               FOR_EACH_CLIENT(tmp_player)
+                                       tmp_player.nickspamcount = tmp_player.nickspamtime = tmp_player.floodcontrol_chat =
+                                       tmp_player.floodcontrol_chatteam = tmp_player.floodcontrol_chattell = 
+                                       tmp_player.floodcontrol_voice = tmp_player.floodcontrol_voiceteam = 0;
+                                       
+                               // copy .v_angle to .lastV_angle for every player in order to fix their view during pause (see PlayerPreThink)
+                               FOR_EACH_REALPLAYER(tmp_player) 
+                                       tmp_player.lastV_angle = tmp_player.v_angle;
+                               
+                               self.nextthink = time; // think again next frame to handle it under TIMEOUT_ACTIVE code
+                       }
+                       
+                       return;
+               }
+               
+               
+               case TIMEOUT_INACTIVE:
+               default:
+               {
+                       timeout_handler_reset();
+                       return;
+               }
+       }
+}
+
+
+
+// ===================================================
+//  Common commands used in both sv_cmd.qc and cmd.qc
+// ===================================================
+
+void CommonCommand_cvar_changes(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, cvar_changes);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " cvar_changes"));
+                       print_to(caller, "  No arguments required.");
+                       print_to(caller, "See also: ^2cvar_purechanges^7");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_cvar_purechanges(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, cvar_purechanges);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " cvar_purechanges"));
+                       print_to(caller, "  No arguments required.");
+                       print_to(caller, "See also: ^2cvar_changes^7");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_info(float request, entity caller, float argc) 
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       string command = builtin_cvar_string(strcat("sv_info_", argv(1))); 
+                       
+                       if(command)
+                               wordwrap_sprint(command, 1000); 
+                       else
+                               print_to(caller, "ERROR: unsupported info command");
+                               
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " info request"));
+                       print_to(caller, "  Where 'request' is the suffixed string appended onto the request for cvar.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_ladder(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, ladder_reply);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " ladder"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_lsmaps(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, lsmaps_reply);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " lsmaps"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_lsnewmaps(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, lsnewmaps_reply);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " lsnewmaps"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_printmaplist(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, maplist_reply);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " printmaplist"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_rankings(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, rankings_reply);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " rankings"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_records(float request, entity caller)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float i;
+                       
+                       for(i = 0; i < 10; ++i)
+                               if(records_reply[i])
+                                       print_to(caller, records_reply[i]);
+                               
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " records"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_teamstatus(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       Score_NicePrint(caller);
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " teamstatus"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_time(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print_to(caller, strcat("time = ", ftos(time)));
+                       print_to(caller, strcat("frame start = ", ftos(gettime(GETTIME_FRAMESTART))));
+                       print_to(caller, strcat("realtime = ", ftos(gettime(GETTIME_REALTIME))));
+                       print_to(caller, strcat("hires = ", ftos(gettime(GETTIME_HIRES))));
+                       print_to(caller, strcat("uptime = ", ftos(gettime(GETTIME_UPTIME))));
+                       print_to(caller, strcat("localtime = ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y")));
+                       print_to(caller, strcat("gmtime = ", strftime(FALSE, "%a %b %e %H:%M:%S %Z %Y")));
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " time"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_timein(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(!caller || autocvar_sv_timeout)
+                       {
+                               if not(timeout_status) { print_to(caller, "^7Error: There is no active timeout called."); }
+                               else if(caller && (caller != timeout_caller)) { print_to(caller, "^7Error: You are not allowed to stop the active timeout."); }
+                                       
+                               else // everything should be okay, continue aborting timeout
+                               {
+                                       switch(timeout_status)
+                                       {
+                                               case TIMEOUT_LEADTIME:
+                                               {
+                                                       timeout_status = TIMEOUT_INACTIVE;
+                                                       timeout_time = 0;
+                                                       timeout_handler.nextthink = time; // timeout_handler has to take care of it immediately
+                                                       bprint(strcat("^7The timeout was aborted by ", GetCallerName(caller), " !\n"));
+                                                       return;
+                                               }
+                                               
+                                               case TIMEOUT_ACTIVE:
+                                               {
+                                                       timeout_time = autocvar_sv_timeout_resumetime;
+                                                       timeout_handler.nextthink = time; // timeout_handler has to take care of it immediately
+                                                       bprint(strcat("^1Attention: ^7", GetCallerName(caller), " resumed the game! Prepare for battle!\n"));
+                                                       return;
+                                               }
+                                               
+                                               default: dprint("timeout status was inactive, but this code was executed anyway?"); return;
+                                       }
+                               }
+                       }
+                       else { print_to(caller, "^1Timeins are not allowed to be called, enable them with sv_timeout 1.\n"); }
+                       
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " timein"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_timeout(float request, entity caller) // DEAR GOD THIS COMMAND IS TERRIBLE.
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(!caller || autocvar_sv_timeout)
+                       {
+                               float last_possible_timeout = ((autocvar_timelimit * 60) - autocvar_sv_timeout_leadtime - 1);
+                               
+                               if(timeout_status) { print_to(caller, "^7Error: A timeout is already active."); }
+                               else if(vote_called) { print_to(caller, "^7Error: You can not call a timeout while a vote is active."); }
+                               else if(inWarmupStage && !g_warmup_allow_timeout) { print_to(caller, "^7Error: You can not call a timeout in warmup-stage."); }
+                               else if(time < game_starttime) { print_to(caller, "^7Error: You can not call a timeout while the map is being restarted."); }
+                               else if(caller && (caller.allowed_timeouts < 1)) { print_to(caller, "^7Error: You already used all your timeout calls for this map."); }
+                               else if(caller && (caller.classname != "player")) { print_to(caller, "^7Error: You must be a player to call a timeout."); }
+                               else if((autocvar_timelimit) && (last_possible_timeout < time - game_starttime)) { print_to(caller, "^7Error: It is too late to call a timeout now!"); }
+                               
+                               else // everything should be okay, proceed with starting the timeout
+                               {                                       
+                                       if(caller) { caller.allowed_timeouts -= 1; }
+                                       
+                                       bprint(GetCallerName(caller), " ^7called a timeout", (caller ? strcat(" (", ftos(caller.allowed_timeouts), " timeout(s) left)") : string_null), "!\n"); // write a bprint who started the timeout (and how many they have left)
+                                       
+                                       timeout_status = TIMEOUT_LEADTIME;
+                                       timeout_caller = caller;
+                                       timeout_time = autocvar_sv_timeout_length;
+                                       timeout_leadtime = autocvar_sv_timeout_leadtime;
+                                       
+                                       timeout_handler = spawn();
+                                       timeout_handler.think = timeout_handler_think;
+                                       timeout_handler.nextthink = time; // always let the entity think asap
+
+                                       Announce("timeoutcalled");
+                               }
+                       }
+                       else { print_to(caller, "^1Timeouts are not allowed to be called, enable them with sv_timeout 1.\n"); }
+                       
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " timeout"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void CommonCommand_who(float request, entity caller, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float total_listed_players, tmp_hours, tmp_minutes, tmp_seconds, is_bot;
+                       entity tmp_player;
+                       
+                       float privacy = (caller && autocvar_sv_status_privacy);
+                       string separator = strreplace("%", " ", strcat((argv(1) ? argv(1) : " "), "^7"));
+                       string tmp_netaddress, tmp_crypto_idfp;
+                       
+                       print_to(caller, strcat("List of client information", (privacy ? " (some data is hidden for privacy)" : string_null), ":"));
+                       print_to(caller, sprintf(strreplace(" ", separator, " %-4s %-20s %-5s %-3s %-9s %-16s %s "), 
+                               "ent", "nickname", "ping", "pl", "time", "ip", "crypto_id"));
+                       
+                       FOR_EACH_CLIENT(tmp_player)
+                       {
+                               is_bot = (clienttype(tmp_player) == CLIENTTYPE_BOT);
+                               
+                               if(is_bot)
+                               {
+                                       tmp_netaddress = "null/botclient";
+                                       tmp_crypto_idfp = "null/botclient";
+                               }
+                               else if(privacy)
+                               {
+                                       tmp_netaddress = "hidden";
+                                       tmp_crypto_idfp = "hidden";
+                               }
+                               else
+                               {
+                                       tmp_netaddress = tmp_player.netaddress;
+                                       tmp_crypto_idfp = tmp_player.crypto_idfp;
+                               }
+                               
+                               tmp_hours = tmp_minutes = tmp_seconds = 0;
+                               
+                               tmp_seconds = floor(time - tmp_player.jointime);
+                               tmp_minutes = floor(tmp_seconds / 60);
+                               tmp_hours = floor(tmp_minutes / 60);
+
+                               if(tmp_minutes) { tmp_seconds -= (tmp_minutes * 60); }                          
+                               if(tmp_hours) { tmp_minutes -= (tmp_hours * 60); }
+
+                               print_to(caller, sprintf(strreplace(" ", separator, " #%-3d %-20.20s %-5d %-3d %-9s %-16s %s "), 
+                                       num_for_edict(tmp_player), 
+                                       tmp_player.netname,
+                                       tmp_player.ping, 
+                                       tmp_player.ping_packetloss, 
+                                       sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds),
+                                       tmp_netaddress,
+                                       tmp_crypto_idfp));
+                               
+                               ++total_listed_players;
+                       }
+                       
+                       print_to(caller, strcat("Finished listing ", ftos(total_listed_players), " client(s) out of ", ftos(maxclients), " slots."));
+                       
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " who [separator]"));
+                       print_to(caller, "  Where 'separator' is the optional string to separate the values with, default is a space.");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void CommonCommand_(float request, entity caller)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return; // never fall through to usage
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " "));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+*/
+
+
+// ==================================
+//  Macro system for common commands
+// ==================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+#define COMMON_COMMANDS(request,caller,arguments,command) \
+       COMMON_COMMAND("cvar_changes", CommonCommand_cvar_changes(request, caller), "Prints a list of all changed server cvars") \
+       COMMON_COMMAND("cvar_purechanges", CommonCommand_cvar_purechanges(request, caller), "Prints a list of all changed gameplay cvars") \
+       COMMON_COMMAND("info", CommonCommand_info(request, caller, arguments), "Request for unique server information set up by admin") \
+       COMMON_COMMAND("ladder", CommonCommand_ladder(request, caller), "Get information about top players if supported") \
+       COMMON_COMMAND("lsmaps", CommonCommand_lsmaps(request, caller), "List maps which can be used with the current game mode") \
+       COMMON_COMMAND("lsnewmaps", CommonCommand_lsnewmaps(request, caller), "List maps which have no records or are seemingly unplayed yet") \
+       COMMON_COMMAND("printmaplist", CommonCommand_printmaplist(request, caller), "Display full server maplist reply") \
+       COMMON_COMMAND("rankings", CommonCommand_rankings(request, caller), "Print information about rankings") \
+       COMMON_COMMAND("records", CommonCommand_records(request, caller), "List top 10 records for the current map") \
+       COMMON_COMMAND("teamstatus", CommonCommand_teamstatus(request, caller), "Show information about player and team scores") \
+       COMMON_COMMAND("time", CommonCommand_time(request, caller), "Print different formats/readouts of time") \
+       COMMON_COMMAND("timein", CommonCommand_timein(request, caller), "Resume the game from being paused with a timeout") \
+       COMMON_COMMAND("timeout", CommonCommand_timeout(request, caller), "Call a timeout which pauses the game for certain amount of time unless unpaused") \
+       COMMON_COMMAND("vote", VoteCommand(request, caller, arguments, command), "Request an action to be voted upon by players") \
+       COMMON_COMMAND("who", CommonCommand_who(request, caller, arguments), "Display detailed client information about all players") \
+       /* nothing */
+
+void CommonCommand_macro_help(entity caller)
+{
+       #define COMMON_COMMAND(name,function,description) \
+               { print_to(caller, strcat("  ^2", name, "^7: ", description)); }
+               
+       COMMON_COMMANDS(0, caller, 0, "")
+       #undef COMMON_COMMAND
+       
+       return;
+}
+
+float CommonCommand_macro_command(float argc, entity caller, string command)
+{
+       #define COMMON_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       COMMON_COMMANDS(CMD_REQUEST_COMMAND, caller, argc, command)
+       #undef COMMON_COMMAND
+       
+       return FALSE;
+}
+
+float CommonCommand_macro_usage(float argc, entity caller)
+{
+       #define COMMON_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       COMMON_COMMANDS(CMD_REQUEST_USAGE, caller, argc, "")
+       #undef COMMON_COMMAND
+       
+       return FALSE;
+}
+
+void CommonCommand_macro_write_aliases(float fh)
+{
+       #define COMMON_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_svcmd", name, description); }
+               
+       COMMON_COMMANDS(0, world, 0, "")
+       #undef COMMON_COMMAND
+       
+       return;
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/common.qh b/qcsrc/server/command/common.qh
new file mode 100644 (file)
index 0000000..589388b
--- /dev/null
@@ -0,0 +1,38 @@
+// ============================================================
+//  Shared declarations for server commands, written by Samual
+//  Last updated: December 30th, 2011
+// ============================================================
+
+// client verification results
+#define CLIENT_ACCEPTABLE 1
+#define CLIENT_DOESNT_EXIST -1
+#define CLIENT_NOT_REAL -2
+#define CLIENT_NOT_BOT -3
+
+// definitions for timeouts
+#define TIMEOUT_INACTIVE 0
+#define TIMEOUT_LEADTIME 1
+#define TIMEOUT_ACTIVE 2
+
+// timeout which pauses the game by setting the slowmo value extremely low.
+#define TIMEOUT_SLOWMO_VALUE 0.0001
+
+// global timeout information declarations
+entity timeout_caller; // contains the entity of the player who started the last timeout
+entity timeout_handler; // responsible for centerprinting the timeout countdowns and playing sounds
+float sys_frametime; // gets initialised in worldspawn, saves the value from autocvar_sys_ticrate
+float orig_slowmo; // contains the value of autocvar_slowmo so that, after timeout finished, it isn't set to slowmo 1 necessarily
+float timeout_time; // contains the time in seconds that the active timeout has left
+float timeout_leadtime; // contains the number of seconds left of the leadtime (before the timeout starts)
+float timeout_status; // (values: 0, 1, 2) contains whether a timeout is not active (0), was called but still at leadtime (1) or is active (2)
+.float allowed_timeouts; // contains the number of allowed timeouts for each player
+.vector lastV_angle; //used when pausing the game in order to force the player to keep his old view angle fixed
+
+// allow functions to be used in other code like g_world.qc and teamplay.qc
+void timeout_handler_think();
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void CommonCommand_macro_write_aliases(float fh);
+
+// keep track of the next token to use for argc
+float next_token;
\ No newline at end of file
diff --git a/qcsrc/server/command/getreplies.qc b/qcsrc/server/command/getreplies.qc
new file mode 100644 (file)
index 0000000..29b707b
--- /dev/null
@@ -0,0 +1,284 @@
+// =========================================================
+//  Reply messages for common commands, re-worked by Samual
+//  Last updated: December 30th, 2011
+// =========================================================
+
+// These strings are set usually during init in g_world.qc,
+// or also by some game modes or other functions manually,
+// and their purpose is to output information to clients
+// without using any extra processing time.
+
+// See common.qc for their proper commands
+       
+string getrecords(float page) // 50 records per page
+{      
+       float rec, r, i;
+       string h, s;
+
+       if (g_ctf)
+       {
+               for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
+               {
+                       if (MapInfo_Get_ByID(i))
+                       {
+                               r = stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/time")));
+                               
+                               if (r == 0)
+                                       continue;
+                                       
+                               // TODO: uid2name
+                               h = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/netname"));
+                               s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-6, ftos_decimals(r, 2)), " ", h, "\n");
+                               ++rec;
+                       }
+               }
+       }
+
+       if (g_race)
+       {
+               for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
+               {
+                       if (MapInfo_Get_ByID(i))
+                       {
+                               r = race_readTime(MapInfo_Map_bspname, 1);
+                               
+                               if (r == 0)
+                                       continue;
+                                       
+                               h = race_readName(MapInfo_Map_bspname, 1);
+                               s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n");
+                               ++rec;
+                       }
+               }
+       }
+
+       if (g_cts)
+       {
+               for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
+               {
+                       if (MapInfo_Get_ByID(i))
+                       {
+                               r = race_readTime(MapInfo_Map_bspname, 1);
+                               
+                               if (r == 0)
+                                       continue;
+                                       
+                               h = race_readName(MapInfo_Map_bspname, 1);
+                               s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n");
+                               ++rec;
+                       }
+               }
+       }
+
+       MapInfo_ClearTemps();
+
+       if (s == "" && page == 0)
+               return "No records are available on this server.\n";
+       else
+               return s;
+}
+
+string getrankings()
+{
+       float t, i;
+       string n, s, p, map;
+
+       map = GetMapname();
+
+       for (i = 1; i <= RANKINGS_CNT; ++i)
+       {
+               t = race_readTime(map, i);
+               
+               if (t == 0)
+                       continue;
+                       
+               n = race_readName(map, i);
+               p = race_placeName(i);
+               s = strcat(s, strpad(8, p), " ", strpad(-8, TIME_ENCODED_TOSTRING(t)), " ", n, "\n");
+       }
+
+       MapInfo_ClearTemps();
+
+       if (s == "")
+               return strcat("No records are available for the map: ", map, "\n");
+       else
+               return strcat("Records for ", map, ":\n", s);
+}
+
+string getladder()
+{
+       float i, j, k, uidcnt, thiscnt;
+       string s, temp_s, rr, myuid, thisuid;
+       
+       if(g_cts)
+               rr = CTS_RECORD;
+       else
+               rr = RACE_RECORD;
+
+       for(k = 0; k < MapInfo_count; ++k)
+       {
+               if(MapInfo_Get_ByID(k))
+               {
+                       for(i = 0; i <= LADDER_CNT; ++i) // i = 0 because it is the speed award
+                       {
+                               if(i == 0) // speed award
+                               {
+                                       if(stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/speed"))) == 0)
+                                               continue;
+
+                                       myuid = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/crypto_idfp"));
+                               }
+                               else // normal record, if it exists (else break)
+                               {
+                                       if(race_readTime(MapInfo_Map_bspname, i) == 0)
+                                               continue;
+
+                                       myuid = race_readUID(MapInfo_Map_bspname, i);
+                               }
+
+                               // string s contains:
+                               // arg 0 = # of speed recs
+                               // arg 1 = # of 1st place recs
+                               // arg 2 = # of 2nd place recs
+                               // ... etc
+                               // LADDER_CNT+1 = total points
+
+                               temp_s = db_get(TemporaryDB, strcat("ladder", myuid));
+                               
+                               if(temp_s == "")
+                               {
+                                       db_put(TemporaryDB, strcat("uid", ftos(uidcnt)), myuid);
+                                       ++uidcnt;
+                                       
+                                       for(j = 0; j <= LADDER_CNT + 1; ++j)
+                                       {
+                                               if(j != LADDER_CNT + 1)
+                                                       temp_s = strcat(temp_s, "0 ");
+                                               else
+                                                       temp_s = strcat(temp_s, "0");
+                                       }
+                               }
+
+                               tokenize_console(temp_s);
+                               s = "";
+
+                               if(i == 0) // speed award
+                               {
+                                       for(j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
+                                       {
+                                               if(j == 0) // speed award
+                                                       s = strcat(s, ftos(stof(argv(j)) +1)); // add 1 to speed rec count and write
+                                               else
+                                                       s = strcat(s, " ", argv(j)); // just copy over everything else
+                                       }
+                               }
+                               else // record
+                               {
+                                       for(j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
+                                       {
+                                               if(j == 0)
+                                                       s = strcat(s, argv(j)); // speed award, dont prefix with " "
+                                               else if(j == i) // wanted rec!
+                                                       s = strcat(s, " ", ftos(stof(argv(j)) +1)); // update argv(j)
+                                               else
+                                                       s = strcat(s, " ", argv(j)); // just copy over everything else
+                                       }
+                               }
+
+                               // total points are (by default) calculated like this:
+                               // speedrec = floor(100 / 10) = 10 points
+                               // 1st place = floor(100 / 1) = 100 points
+                               // 2nd place = floor(100 / 2) = 50 points
+                               // 3rd place = floor(100 / 3) = 33 points
+                               // 4th place = floor(100 / 4) = 25 points
+                               // 5th place = floor(100 / 5) = 20 points
+                               // ... etc
+
+                               if(i == 0)
+                                       s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + LADDER_FIRSTPOINT / 10)); // speed award, add LADDER_FIRSTPOINT / 10 points
+                               else
+                                       s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + floor(LADDER_FIRSTPOINT / i))); // record, add LADDER_FIRSTPOINT / i points
+
+                               db_put(TemporaryDB, strcat("ladder", myuid), s);
+                       }
+               }
+       }
+
+       for(i = 0; i <= uidcnt; ++i) // for each known uid
+       {
+               thisuid = db_get(TemporaryDB, strcat("uid", ftos(i)));
+               temp_s = db_get(TemporaryDB, strcat("ladder", thisuid));
+               tokenize_console(temp_s);
+               thiscnt = stof(argv(LADDER_CNT+1));
+
+               if(thiscnt > top_scores[LADDER_SIZE-1])
+               {
+                       for(j = 0; j < LADDER_SIZE; ++j) // for each place in ladder
+                       {
+                               if(thiscnt > top_scores[j])
+                               {
+                                       for(k = LADDER_SIZE-1; k >= j; --k)
+                                       {
+                                               top_uids[k] = top_uids[k-1];
+                                               top_scores[k] = top_scores[k-1];
+                                       }
+                                       
+                                       top_uids[j] = thisuid;
+                                       top_scores[j] = thiscnt;
+                                       break;
+                               }
+                       }
+               }
+       }
+       
+       s = "^3-----------------------\n\n";
+       
+       s = strcat(s, "Pos ^3|");
+       s = strcat(s, " ^7Total  ^3|");
+       
+       for(i = 1; i <= LADDER_CNT; ++i)
+               { s = strcat(s, " ^7", race_placeName(i), " ^3|"); }
+       
+       s = strcat(s, " ^7Speed awards ^3| ^7Name");
+       s = strcat(s, "\n^3----+--------");
+       
+       for(i = 1; i <= min(9, LADDER_CNT); ++i)
+               { s = strcat(s, "+-----"); }
+               
+       #if LADDER_CNT > 9
+       for(i = 1; i <= LADDER_CNT - 9; ++i)
+               { s = strcat(s, "+------"); }
+       #endif
+
+       s = strcat(s, "+--------------+--------------------\n");
+
+       for(i = 0; i < LADDER_SIZE; ++i)
+       {
+               temp_s = db_get(TemporaryDB, strcat("ladder", top_uids[i]));
+               tokenize_console(temp_s);
+               
+               if(argv(LADDER_CNT+1) == "") // total is 0, skip
+                       continue;
+                       
+               s = strcat(s, strpad(4, race_placeName(i+1)), "^3| ^7"); // pos
+               s = strcat(s, strpad(7, argv(LADDER_CNT+1)), "^3| ^7"); // total
+               
+               for(j = 1; j <= min(9, LADDER_CNT); ++j)
+                       { s = strcat(s, strpad(4, argv(j)), "^3| ^7"); } // 1st, 2nd, 3rd etc cnt
+                       
+               #if LADDER_CNT > 9
+               for(j = 10; j <= LADDER_CNT; ++j)
+                       { s = strcat(s, strpad(4, argv(j)), " ^3| ^7"); } // 1st, 2nd, 3rd etc cnt
+               #endif
+
+               s = strcat(s, strpad(13, argv(0)), "^3| ^7"); // speed award cnt
+               s = strcat(s, uid2name(top_uids[i]), "\n"); // name
+       }
+
+       MapInfo_ClearTemps();
+
+       if(s == "")
+               return "No ladder on this server!\n";
+       else
+               return strcat("Top ", ftos(LADDER_SIZE), " ladder rankings:\n", s);
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/getreplies.qh b/qcsrc/server/command/getreplies.qh
new file mode 100644 (file)
index 0000000..af941a7
--- /dev/null
@@ -0,0 +1,17 @@
+// ======================================================
+//  Declarations for reply messages, re-worked by Samual
+//  Last updated: December 30th, 2011
+// ======================================================
+
+// ladder bullshit todo
+#define LADDER_FIRSTPOINT 100
+#define LADDER_CNT 10 // position X still gives LADDER_FIRSTPOINT/X points
+#define LADDER_SIZE 30         // ladder shows the top X players
+
+string top_uids[LADDER_SIZE];
+float top_scores[LADDER_SIZE];
+
+// allow functions to be used in other code like g_world.qc and race.qc
+string getrecords(float page);
+string getrankings(void);
+string getladder(void);
\ No newline at end of file
diff --git a/qcsrc/server/command/radarmap.qc b/qcsrc/server/command/radarmap.qc
new file mode 100644 (file)
index 0000000..16f3212
--- /dev/null
@@ -0,0 +1,427 @@
+// ===============================================
+//     Generates radar map images for use in the HUD
+// ===============================================
+
+float FullTraceFraction(vector a, vector mi, vector ma, vector b)
+{
+       vector c;
+       float white, black;
+
+       white = 0.001;
+       black = 0.001;
+
+       c = a;
+
+       float n, m;
+       n = m = 0;
+
+       while(vlen(c - b) > 1)
+       {
+               ++m;
+
+               tracebox(c, mi, ma, b, MOVE_WORLDONLY, world);
+               ++n;
+
+               if(!trace_startsolid)
+               {
+                       black += vlen(trace_endpos - c);
+                       c = trace_endpos;
+               }
+
+               n += tracebox_inverted(c, mi, ma, b, MOVE_WORLDONLY, world);
+
+               white += vlen(trace_endpos - c);
+               c = trace_endpos;
+       }
+
+       if(n > 200)
+               dprint("HOLY SHIT! FullTraceFraction: ", ftos(n), " total traces, ", ftos(m), " iterations\n");
+
+       return white / (black + white);
+}
+float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+       vector a, b, mi, ma;
+
+       mi = '0 0 0';
+       ma = '1 0 0' * w + '0 1 0' * h;
+       a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+       b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * (zsize + zmin);
+
+       return FullTraceFraction(a, mi, ma, b);
+}
+float RadarMapAtPoint_LineBlock(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+       vector o, mi, ma;
+       float i, r;
+       vector dz;
+
+       q = 256 * q - 1;
+       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
+
+       mi = '0 0 0';
+       dz = (zsize / q) * '0 0 1';
+       ma = '1 0 0' * w + '0 1 0' * h + dz;
+       o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+
+       if(x < world.absmin_x - w)
+               return 0;
+       if(y < world.absmin_y - h)
+               return 0;
+       if(x > world.absmax_x)
+               return 0;
+       if(y > world.absmax_y)
+               return 0;
+
+       r = 0;
+       for(i = 0; i < q; ++i)
+       {
+               vector v1, v2;
+               v1 = v2 = o + dz * i + mi;
+               v1_x += random() * (ma_x - mi_x);
+               v1_y += random() * (ma_y - mi_y);
+               v1_z += random() * (ma_z - mi_z);
+               v2_x += random() * (ma_x - mi_x);
+               v2_y += random() * (ma_y - mi_y);
+               v2_z += random() * (ma_z - mi_z);
+               traceline(v1, v2, MOVE_WORLDONLY, world);
+               if(trace_startsolid || trace_fraction < 1)
+                       ++r;
+       }
+       return r / q;
+}
+float RadarMapAtPoint_Block(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+       vector o, mi, ma;
+       float i, r;
+       vector dz;
+
+       q = 256 * q - 1;
+       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
+
+       mi = '0 0 0';
+       dz = (zsize / q) * '0 0 1';
+       ma = '1 0 0' * w + '0 1 0' * h + dz;
+       o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+
+       if(x < world.absmin_x - w)
+               return 0;
+       if(y < world.absmin_y - h)
+               return 0;
+       if(x > world.absmax_x)
+               return 0;
+       if(y > world.absmax_y)
+               return 0;
+
+       r = 0;
+       for(i = 0; i < q; ++i)
+       {
+               tracebox(o + dz * i, mi, ma, o + dz * i, MOVE_WORLDONLY, world);
+               if(trace_startsolid)
+                       ++r;
+       }
+       return r / q;
+}
+float RadarMapAtPoint_Sample(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+       vector a, b, mi, ma;
+
+       q *= 4; // choose q so it matches the regular algorithm in speed
+
+       q = 256 * q - 1;
+       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
+
+       mi = '0 0 0';
+       ma = '1 0 0' * w + '0 1 0' * h;
+       a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+       b = '1 0 0' * w + '0 1 0' * h + '0 0 1' * zsize;
+
+       float c, i;
+       c = 0;
+
+       for(i = 0; i < q; ++i)
+       {
+               vector v;
+               v_x = a_x + random() * b_x;
+               v_y = a_y + random() * b_y;
+               v_z = a_z + random() * b_z;
+               traceline(v, v, MOVE_WORLDONLY, world);
+               if(trace_startsolid)
+                       ++c;
+       }
+
+       return c / q;
+}
+void sharpen_set(float x, float v)
+{
+       sharpen_buffer[x + 2 * RADAR_WIDTH_MAX] = v;
+}
+float sharpen_getpixel(float x, float y)
+{
+       if(x < 0)
+               return 0;
+       if(x >= RADAR_WIDTH_MAX)
+               return 0;
+       if(y < 0)
+               return 0;
+       if(y > 2)
+               return 0;
+       return sharpen_buffer[x + y * RADAR_WIDTH_MAX];
+}
+float sharpen_get(float x, float a)
+{
+       float sum;
+       sum = sharpen_getpixel(x, 1);
+       if(a == 0)
+               return sum;
+       sum *= (8 + 1/a);
+       sum -= sharpen_getpixel(x - 1, 0);
+       sum -= sharpen_getpixel(x - 1, 1);
+       sum -= sharpen_getpixel(x - 1, 2);
+       sum -= sharpen_getpixel(x + 1, 0);
+       sum -= sharpen_getpixel(x + 1, 1);
+       sum -= sharpen_getpixel(x + 1, 2);
+       sum -= sharpen_getpixel(x, 0);
+       sum -= sharpen_getpixel(x, 2);
+       return bound(0, sum * a, 1);
+}
+void sharpen_shift(float w)
+{
+       float i;
+       for(i = 0; i < w; ++i)
+       {
+               sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH_MAX];
+               sharpen_buffer[i + RADAR_WIDTH_MAX] = sharpen_buffer[i + 2 * RADAR_WIDTH_MAX];
+               sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
+       }
+}
+void sharpen_init(float w)
+{
+       float i;
+       for(i = 0; i < w; ++i)
+       {
+               sharpen_buffer[i] = 0;
+               sharpen_buffer[i + RADAR_WIDTH_MAX] = 0;
+               sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
+       }
+}
+void RadarMap_Next()
+{
+       if(radarmapper.count & 4)
+       {
+               localcmd("quit\n");
+       }
+       else if(radarmapper.count & 2)
+       {
+               localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(radarmapper.count), strcat(" --res ", ftos(radarmapper.size_x), " ", ftos(radarmapper.size_y), " --sharpen ", ftos(radarmapper.ltime), " --qual ", ftos(radarmapper.size_z)), "\"\n"));
+               GotoNextMap(0);
+       }
+       remove(radarmapper);
+       radarmapper = world;
+}
+void RadarMap_Think()
+{
+       // rough map entity
+       //   cnt: current line
+       //   size: pixel width/height
+       //   maxs: cell width/height
+       //   frame: counter
+       
+       float i, x, l;
+       string si;
+
+       if(self.frame == 0)
+       {
+               // initialize
+               get_mi_min_max_texcoords(1);
+               self.mins = mi_picmin;
+               self.maxs_x = (mi_picmax_x - mi_picmin_x) / self.size_x;
+               self.maxs_y = (mi_picmax_y - mi_picmin_y) / self.size_y;
+               self.maxs_z = mi_max_z - mi_min_z;
+               print("Picture mins/maxs: ", ftos(self.maxs_x), " and ", ftos(self.maxs_y), " should match\n");
+               self.netname = strzone(strcat("gfx/", mi_shortname, "_radar.xpm"));
+               if(!(self.count & 1))
+               {
+                       self.cnt = fopen(self.netname, FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.tga"), FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.png"), FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.jpg"), FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.tga"), FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.png"), FILE_READ);
+                       if(self.cnt < 0)
+                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.jpg"), FILE_READ);
+                       if(self.cnt >= 0)
+                       {
+                               fclose(self.cnt);
+
+                               print(self.netname, " already exists, aborting (you may want to specify --force)\n");
+                               RadarMap_Next();
+                               return;
+                       }
+               }
+               self.cnt = fopen(self.netname, FILE_WRITE);
+               if(self.cnt < 0)
+               {
+                       print("Error writing ", self.netname, "\n");
+                       remove(self);
+                       radarmapper = world;
+                       return;
+               }
+               print("Writing to ", self.netname, "...\n");
+               fputs(self.cnt, "/* XPM */\n");
+               fputs(self.cnt, "static char *RadarMap[] = {\n");
+               fputs(self.cnt, "/* columns rows colors chars-per-pixel */\n");
+               fputs(self.cnt, strcat("\"", ftos(self.size_x), " ", ftos(self.size_y), " 256 2\",\n"));
+               for(i = 0; i < 256; ++i)
+               {
+                       si = substring(doublehex, i*2, 2);
+                       fputs(self.cnt, strcat("\"", si, " c #", si, si, si, "\",\n"));
+               }
+               self.frame += 1;
+               self.nextthink = time;
+               sharpen_init(self.size_x);
+       }
+       else if(self.frame <= self.size_y)
+       {
+               // fill the sharpen buffer with this line
+               sharpen_shift(self.size_x);
+               i = self.count & 24;
+
+               switch(i)
+               {
+                       case 0:
+                       default:
+                               for(x = 0; x < self.size_x; ++x)
+                               {
+                                       l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+                                       sharpen_set(x, l);
+                               }
+                               break;
+                       case 8:
+                               for(x = 0; x < self.size_x; ++x)
+                               {
+                                       l = RadarMapAtPoint_Trace(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+                                       sharpen_set(x, l);
+                               }
+                               break;
+                       case 16:
+                               for(x = 0; x < self.size_x; ++x)
+                               {
+                                       l = RadarMapAtPoint_Sample(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+                                       sharpen_set(x, l);
+                               }
+                               break;
+                       case 24:
+                               for(x = 0; x < self.size_x; ++x)
+                               {
+                                       l = RadarMapAtPoint_LineBlock(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+                                       sharpen_set(x, l);
+                               }
+                               break;
+               }
+
+               // do we have enough lines?
+               if(self.frame >= 2)
+               {
+                       // write a pixel line
+                       fputs(self.cnt, "\"");
+                       for(x = 0; x < self.size_x; ++x)
+                       {
+                               l = sharpen_get(x, self.ltime);
+                               fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
+                       }
+                       if(self.frame == self.size_y)
+                               fputs(self.cnt, "\"\n");
+                       else
+                       {
+                               fputs(self.cnt, "\",\n");
+                               print(ftos(self.size_y - self.frame), " lines left\n");
+                       }
+               }
+
+               // is this the last line? then write back the missing line
+               if(self.frame == self.size_y)
+               {
+                       sharpen_shift(self.size_x);
+                       // write a pixel line
+                       fputs(self.cnt, "\"");
+                       for(x = 0; x < self.size_x; ++x)
+                       {
+                               l = sharpen_get(x, self.ltime);
+                               fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
+                       }
+                       if(self.frame == self.size_y)
+                               fputs(self.cnt, "\"\n");
+                       else
+                       {
+                               fputs(self.cnt, "\",\n");
+                               print(ftos(self.size_y - self.frame), " lines left\n");
+                       }
+               }
+
+               self.frame += 1;
+               self.nextthink = time;
+       }
+       else
+       {
+               // close the file
+               fputs(self.cnt, "};\n");
+               fclose(self.cnt);
+               print("Finished. Please edit data/", self.netname, " with an image editing application and place it in the TGA format in the gfx folder.\n");
+               RadarMap_Next();
+       }
+}
+
+float RadarMap_Make(float argc)
+{
+       float i;
+       
+       if(!radarmapper)
+       {
+               radarmapper = spawn();
+               radarmapper.classname = "radarmapper";
+               radarmapper.think = RadarMap_Think;
+               radarmapper.nextthink = time;
+               radarmapper.count = 8; // default to the --trace method, as it is faster now
+               radarmapper.ltime = 1;
+               radarmapper.size = '512 512 1';
+               for(i = 1; i < argc; ++i)
+               {
+                       switch(argv(i))
+                       {
+                               case "--force": { radarmapper.count |= 1; break; }
+                               case "--loop": { radarmapper.count |= 2; break; }
+                               case "--quit": { radarmapper.count |= 4; break; }
+                               case "--block": { radarmapper.count &~= 24; break; }
+                               case "--trace": { radarmapper.count &~= 24; radarmapper.count |= 8; break; }
+                               case "--sample": { radarmapper.count &~= 24; radarmapper.count |= 16; break; }
+                               case "--lineblock": { radarmapper.count |= 24; break; }
+                               case "--flags": { ++i; radarmapper.count = stof(argv(i)); break; } // for the recursive call
+                               case "--sharpen": { ++i; radarmapper.ltime = stof(argv(i)); break; } // for the recursive call
+                               case "--res": // minor alias
+                               case "--resolution": { ++i; radarmapper.size_x = stof(argv(i)); ++i; radarmapper.size_y = stof(argv(i)); break; }
+                               case "--qual": // minor alias
+                               case "--quality": { ++i; radarmapper.size_z = stof(argv(i)); break; }
+                               
+                               default: 
+                                       i = argc; 
+                                       remove(radarmapper);
+                                       radarmapper = world;
+                                       break;
+                       }
+               }
+                               
+               if(radarmapper) // after doing the arguments, see if we successfully went forward. 
+               {
+                       print("Radarmap entity spawned.\n");
+                       return TRUE; // if so, don't print usage.
+               }
+       }
+       
+       return FALSE;
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/radarmap.qh b/qcsrc/server/command/radarmap.qh
new file mode 100644 (file)
index 0000000..b92d846
--- /dev/null
@@ -0,0 +1,13 @@
+// ===========================================
+//     Declarations for radarmap generation code
+// ===========================================
+
+entity radarmapper;
+
+float RADAR_WIDTH_MAX = 512;
+float RADAR_HEIGHT_MAX = 512;
+float sharpen_buffer[RADAR_WIDTH_MAX * 3];
+
+string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF";
+// FF is contained twice, to map 256 to FF too
+// removes the need to bound()
diff --git a/qcsrc/server/command/sv_cmd.qc b/qcsrc/server/command/sv_cmd.qc
new file mode 100644 (file)
index 0000000..98d877c
--- /dev/null
@@ -0,0 +1,1806 @@
+// =====================================================
+//  Server side game commands code, reworked by Samual
+//  Last updated: December 29th, 2011
+// =====================================================
+
+//  used by GameCommand_make_mapinfo()
+void make_mapinfo_Think()
+{
+       if(MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
+       {
+               print("Done rebuiling mapinfos.\n");
+               MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+               remove(self);
+       }
+       else
+       {
+               self.think = make_mapinfo_Think;
+               self.nextthink = time;
+       }
+}
+
+//  used by GameCommand_extendmatchtime() and GameCommand_reducematchtime()
+void changematchtime(float delta, float mi, float ma)
+{
+       float cur;
+       float new;
+       float lim;
+
+       if(delta == 0)
+               return;
+       if(autocvar_timelimit < 0)
+               return;
+
+       if(mi <= 10)
+               mi = 10; // at least ten sec in the future
+       cur = time - game_starttime;
+       if(cur > 0)
+               mi += cur; // from current time!
+
+       lim = autocvar_timelimit * 60;
+
+       if(delta > 0)
+       {
+               if(lim == 0)
+                       return; // cannot increase any further
+               else if(lim < ma)
+                       new = min(ma, lim + delta);
+               else // already above maximum: FAIL
+                       return;
+       }
+       else
+       {
+               if(lim == 0) // infinite: try reducing to max, if we are allowed to
+                       new = max(mi, ma);
+               else if(lim > mi) // above minimum: decrease
+                       new = max(mi, lim + delta);
+               else // already below minimum: FAIL
+                       return;
+       }
+
+       cvar_set("timelimit", ftos(new / 60));
+}
+
+
+// =======================
+//  Command Sub-Functions
+// =======================
+
+void GameCommand_adminmsg(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       float accepted;
+                       
+                       string targets = strreplace(",", " ", argv(1));
+                       string original_targets = strreplace(" ", ", ", targets);
+                       string admin_message = argv(2);
+                       float infobartime = stof(argv(3));
+                       
+                       string successful, t;
+                       
+                       if((targets) && (admin_message))
+                       {
+                               for(;targets;)
+                               {
+                                       t = car(targets); targets = cdr(targets);
+                                       
+                                       // Check to see if the player is a valid target
+                                       client = GetFilteredEntity(t);
+                                       accepted = VerifyClientEntity(client, TRUE, FALSE);
+                                       
+                                       if not(accepted > 0) 
+                                       {
+                                               print("adminmsg: ", GetClientErrorString(accepted, t), (targets ? ", skipping to next player.\n" : ".\n")); 
+                                               continue;
+                                       }
+                                       
+                                       // send the centerprint/console print or infomessage
+                                       if(infobartime)
+                                       {
+                                               stuffcmd(client, sprintf("\ninfobar %f \"%s\"\n", infobartime, MakeConsoleSafe(admin_message)));
+                                       }
+                                       else
+                                       {
+                                               centerprint(client, strcat("^3", admin_name(), ":\n^7", admin_message));
+                                               sprint(client, strcat("\{1}\{13}^3", admin_name(), "^7: ", admin_message, "\n"));
+                                       }
+                                       
+                                       successful = strcat(successful, (successful ? ", " : ""), client.netname);
+                                       dprint("Message sent to ", client.netname, "\n");
+                                       continue;
+                               }
+                               
+                               if(successful)
+                                       bprint("Successfully sent message '", admin_message, "' to ", successful, ".\n");
+                               else
+                                       print("No players given (", original_targets, ") could recieve the message.\n");
+                                       
+                               return;
+                       }
+               }
+               
+               default:
+                       print("Incorrect parameters for ^2adminmsg^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd adminmsg clients \"message\" [infobartime]\n");
+                       print("  'clients' is a list (separated by commas) of player entity ID's or nicknames\n");
+                       print("  If infobartime is provided, the message will be sent to infobar.\n");
+                       print("  Otherwise, it will just be sent as a centerprint message.\n");
+                       print("Examples: adminmsg 2,4 \"this infomessage will last for ten seconds\" 10\n");
+                       print("          adminmsg 2,5 \"this message will be a centerprint\"\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_allready(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       ReadyRestart();
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd allready\n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_allspec(float request, float argc)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       string reason = argv(1);
+                       float i;
+                       
+                       FOR_EACH_REALPLAYER(client)
+                       {
+                               self = client;
+                               PutObserverInServer();
+                               ++i;
+                       }
+                       if(i) { bprint(strcat("Successfully forced all (", ftos(i), ") players to spectate", (reason ? strcat(" for reason: '", reason, "'") : ""), ".\n")); }
+                       else { print("No players found to spectate.\n"); }
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd allspec [reason]\n");
+                       print("  Where 'reason' is an optional argument for explanation of allspec command.\n");
+                       print("See also: ^2moveplayer, shuffleteams^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_anticheat(float request, float argc) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client = GetIndexedEntity(argc, 1);
+                       float accepted = VerifyClientEntity(client, FALSE, FALSE);
+                       
+                       if(accepted > 0) 
+                       {
+                               self = client;
+                               anticheat_report();
+                               return;
+                       }
+                       else
+                       {
+                               print("anticheat: ", GetClientErrorString(accepted, argv(1)), ".\n"); 
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2anticheat^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd anticheat client\n");
+                       print("  'client' is the entity number or name of the player.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_bbox(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       print("Original size: ", ftos(world.absmin_x), " ", ftos(world.absmin_y), " ", ftos(world.absmin_z));
+                       print(" ", ftos(world.absmax_x), " ", ftos(world.absmax_y), " ", ftos(world.absmax_z), "\n");
+                       print("Currently set size: ", ftos(world.mins_x), " ", ftos(world.mins_y), " ", ftos(world.mins_z));
+                       print(" ", ftos(world.maxs_x), " ", ftos(world.maxs_y), " ", ftos(world.maxs_z), "\n");
+                       print("Solid bounding box size:");
+
+                       tracebox('1 0 0' * world.absmin_x,
+                                                       '0 1 0' * world.absmin_y + '0 0 1' * world.absmin_z,
+                                                       '0 1 0' * world.absmax_y + '0 0 1' * world.absmax_z,
+                                                       '1 0 0' * world.absmax_x,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmin_x));
+                       else
+                               print(" ", ftos(trace_endpos_x));
+
+                       tracebox('0 1 0' * world.absmin_y,
+                                                       '1 0 0' * world.absmin_x + '0 0 1' * world.absmin_z,
+                                                       '1 0 0' * world.absmax_x + '0 0 1' * world.absmax_z,
+                                                       '0 1 0' * world.absmax_y,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmin_y));
+                       else
+                               print(" ", ftos(trace_endpos_y));
+
+                       tracebox('0 0 1' * world.absmin_z,
+                                                       '1 0 0' * world.absmin_x + '0 1 0' * world.absmin_y,
+                                                       '1 0 0' * world.absmax_x + '0 1 0' * world.absmax_y,
+                                                       '0 0 1' * world.absmax_z,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmin_z));
+                       else
+                               print(" ", ftos(trace_endpos_z));
+
+                       tracebox('1 0 0' * world.absmax_x,
+                                                       '0 1 0' * world.absmin_y + '0 0 1' * world.absmin_z,
+                                                       '0 1 0' * world.absmax_y + '0 0 1' * world.absmax_z,
+                                                       '1 0 0' * world.absmin_x,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmax_x));
+                       else
+                               print(" ", ftos(trace_endpos_x));
+
+                       tracebox('0 1 0' * world.absmax_y,
+                                                       '1 0 0' * world.absmin_x + '0 0 1' * world.absmin_z,
+                                                       '1 0 0' * world.absmax_x + '0 0 1' * world.absmax_z,
+                                                       '0 1 0' * world.absmin_y,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmax_y));
+                       else
+                               print(" ", ftos(trace_endpos_y));
+
+                       tracebox('0 0 1' * world.absmax_z,
+                                                       '1 0 0' * world.absmin_x + '0 1 0' * world.absmin_y,
+                                                       '1 0 0' * world.absmax_x + '0 1 0' * world.absmax_y,
+                                                       '0 0 1' * world.absmin_z,
+                                       MOVE_WORLDONLY,
+                                       world);
+                       if(trace_startsolid)
+                               print(" ", ftos(world.absmax_z));
+                       else
+                               print(" ", ftos(trace_endpos_z));
+                               
+                       print("\n");
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd bbox\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2gettaginfo, trace^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_bot_cmd(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity bot;
+                       
+                       if(argv(1) == "reset")
+                       {
+                               bot_resetqueues();
+                               return;
+                       }
+                       else if(argv(1) == "load" && argc == 3)
+                       {
+                               float fh, i;
+                               string s;
+                               fh = fopen(argv(2), FILE_READ);
+                               if(fh < 0)
+                               {
+                                       print("cannot open the file\n");
+                                       return;
+                               }
+
+                               i = 0;
+                               while((s = fgets(fh)))
+                               {
+                                       argc = tokenize_console(s);
+
+                                       if(argc >= 3 && argv(0) == "sv_cmd" && argv(1) == "bot_cmd")
+                                       {
+                                               if(argv(2) == "reset")
+                                               {
+                                                       bot_resetqueues();
+                                               }
+                                               else if(argv(2) == "setbots")
+                                               {
+                                                       cvar_settemp("minplayers", "0");
+                                                       cvar_settemp("bot_number", argv(3));
+                                                       if(!bot_fixcount())
+                                                               print("Sorry, could not set requested bot count\n");
+                                               }
+                                               else
+                                               {
+                                                       // let's start at token 2 so we can skip sv_cmd bot_cmd
+                                                       bot = find_bot_by_number(stof(argv(2)));
+                                                       if(bot == world)
+                                                               bot = find_bot_by_name(argv(2));
+                                                       if(bot)
+                                                               bot_queuecommand(bot, strcat(argv(3), " ", argv(4)));
+                                               }
+                                       }
+                                       else
+                                               localcmd(strcat(s, "\n"));
+
+                                       ++i;
+                               }
+                               print(ftos(i), " commands read\n");
+                               fclose(fh);
+                               return;
+                       }
+                       else if(argv(1) == "help")
+                       {
+                               if(argv(2))
+                                       bot_cmdhelp(argv(2));
+                               else
+                                       bot_list_commands();
+                               return;
+                       }
+                       else if(argc >= 3) // this comes last
+                       {
+                               bot = find_bot_by_number(stof(argv(1)));
+                               if(bot == world)
+                                       bot = find_bot_by_name(argv(1));
+                               if(bot)
+                               {
+                                       print(strcat("Command '", strcat(argv(2), " ", argv(3)), "' sent to bot ", bot.netname, "\n"));
+                                       bot_queuecommand(bot, strcat(argv(2), " ", argv(3)));
+                                       return;
+                               }
+                               else
+                                       print(strcat("Error: Can't find bot with the name or id '", argv(1),"' - Did you mistype the command?\n")); // don't return so that usage is shown
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2bot_cmd^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd bot_cmd client command [argument]\n");
+                       print("  'client' can be either the name or entity id of the bot\n");
+                       print("  For full list of commands, see bot_cmd help [command].\n");
+                       print("Examples: sv_cmd bot_cmd client cc \"say something\"\n");
+                       print("          sv_cmd bot_cmd client presskey jump\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_cointoss(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       string result1 = (argv(2) ? strcat("^7", argv(1), "^3!\n") : "^1HEADS^3!\n");
+                       string result2 = (argv(2) ? strcat("^7", argv(2), "^3!\n") : "^4TAILS^3!\n");
+                       string choice = ((random() > 0.5) ? result1 : result2);
+                       
+                       FOR_EACH_CLIENT(client)
+                               centerprint(client, strcat("^3Throwing coin... Result: ", choice));
+                       bprint(strcat("^3Throwing coin... Result: ", choice));
+                       return;
+               }
+               
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd cointoss [result1 result2]\n");
+                       print("  Where 'result1' and 'result2' are user created options.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_database(float request, float argc) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc == 3)
+                       {
+                               if(argv(1) == "save")
+                               {
+                                       db_save(ServerProgsDB, argv(2));
+                                       print(strcat("Copied serverprogs database to '", argv(2), "' in the data directory.\n"));
+                                       return;
+                               }
+                               else if(argv(1) == "dump")
+                               {
+                                       db_dump(ServerProgsDB, argv(2));
+                                       print("DB dumped.\n"); // wtf does this do?
+                                       return;
+                               }
+                               else if(argv(1) == "load")
+                               {
+                                       db_close(ServerProgsDB);
+                                       ServerProgsDB = db_load(argv(2));
+                                       print(strcat("Loaded '", argv(2), "' as new serverprogs database.\n"));
+                                       return;
+                               }
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2database^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd database action filename\n");
+                       print("  Where 'action' is the command to complete,\n");
+                       print("  and 'filename' is what it acts upon.\n");
+                       print("  Full list of commands here: \"save, dump, load.\"\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_defer_clear(float request, float argc)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       float accepted;
+                       
+                       if(argc >= 2)
+                       {
+                               client = GetIndexedEntity(argc, 1);
+                               accepted = VerifyClientEntity(client, TRUE, FALSE);
+                               
+                               if(accepted > 0)
+                               {
+                                       stuffcmd(client, "defer clear\n");
+                                       print("defer clear stuffed to ", client.netname, "\n");
+                               }
+                               else { print("defer_clear: ", GetClientErrorString(accepted, argv(1)), ".\n"); }
+                               
+                               return;
+                       }
+               }
+               
+               default:
+                       print("Incorrect parameters for ^2defer_clear^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd defer_clear client\n");
+                       print("  'client' is the entity number or name of the player.\n");
+                       print("See also: ^2defer_clear_all^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_defer_clear_all(float request)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       float i;
+                       float argc;
+                       
+                       FOR_EACH_CLIENT(client)
+                       {
+                               argc = tokenize_console(strcat("defer_clear ", ftos(num_for_edict(client))));
+                               GameCommand_defer_clear(CMD_REQUEST_COMMAND, argc);     
+                               ++i;
+                       }
+                       if(i) { print(strcat("Successfully stuffed defer clear to all clients (", ftos(i), ")\n")); } // should a message be added if no players were found? 
+                       return;
+               }
+               
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd defer_clear_all\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2defer_clear^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_delrec(float request, float argc)  // perhaps merge later with records and printstats and such?
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               if(argv(2))
+                                       race_deleteTime(argv(2), stof(argv(1)));
+                               else
+                                       race_deleteTime(GetMapname(), stof(argv(1)));
+                               return;
+                       }
+               }       
+               
+               default:
+                       print("Incorrect parameters for ^2delrec^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd delrec ranking [map]\n");
+                       print("  'ranking' is which ranking level to clear up to, \n");
+                       print("  it will clear all records up to nth place.\n");
+                       print("  if 'map' is not provided it will use current map.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_effectindexdump(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float fh, d;
+                       string s;
+                       
+                       d = db_create();
+                       print("begin of effects list\n");
+                       db_put(d, "TE_GUNSHOT", "1"); print("effect TE_GUNSHOT is ", ftos(particleeffectnum("TE_GUNSHOT")), "\n");
+                       db_put(d, "TE_GUNSHOTQUAD", "1"); print("effect TE_GUNSHOTQUAD is ", ftos(particleeffectnum("TE_GUNSHOTQUAD")), "\n");
+                       db_put(d, "TE_SPIKE", "1"); print("effect TE_SPIKE is ", ftos(particleeffectnum("TE_SPIKE")), "\n");
+                       db_put(d, "TE_SPIKEQUAD", "1"); print("effect TE_SPIKEQUAD is ", ftos(particleeffectnum("TE_SPIKEQUAD")), "\n");
+                       db_put(d, "TE_SUPERSPIKE", "1"); print("effect TE_SUPERSPIKE is ", ftos(particleeffectnum("TE_SUPERSPIKE")), "\n");
+                       db_put(d, "TE_SUPERSPIKEQUAD", "1"); print("effect TE_SUPERSPIKEQUAD is ", ftos(particleeffectnum("TE_SUPERSPIKEQUAD")), "\n");
+                       db_put(d, "TE_WIZSPIKE", "1"); print("effect TE_WIZSPIKE is ", ftos(particleeffectnum("TE_WIZSPIKE")), "\n");
+                       db_put(d, "TE_KNIGHTSPIKE", "1"); print("effect TE_KNIGHTSPIKE is ", ftos(particleeffectnum("TE_KNIGHTSPIKE")), "\n");
+                       db_put(d, "TE_EXPLOSION", "1"); print("effect TE_EXPLOSION is ", ftos(particleeffectnum("TE_EXPLOSION")), "\n");
+                       db_put(d, "TE_EXPLOSIONQUAD", "1"); print("effect TE_EXPLOSIONQUAD is ", ftos(particleeffectnum("TE_EXPLOSIONQUAD")), "\n");
+                       db_put(d, "TE_TAREXPLOSION", "1"); print("effect TE_TAREXPLOSION is ", ftos(particleeffectnum("TE_TAREXPLOSION")), "\n");
+                       db_put(d, "TE_TELEPORT", "1"); print("effect TE_TELEPORT is ", ftos(particleeffectnum("TE_TELEPORT")), "\n");
+                       db_put(d, "TE_LAVASPLASH", "1"); print("effect TE_LAVASPLASH is ", ftos(particleeffectnum("TE_LAVASPLASH")), "\n");
+                       db_put(d, "TE_SMALLFLASH", "1"); print("effect TE_SMALLFLASH is ", ftos(particleeffectnum("TE_SMALLFLASH")), "\n");
+                       db_put(d, "TE_FLAMEJET", "1"); print("effect TE_FLAMEJET is ", ftos(particleeffectnum("TE_FLAMEJET")), "\n");
+                       db_put(d, "EF_FLAME", "1"); print("effect EF_FLAME is ", ftos(particleeffectnum("EF_FLAME")), "\n");
+                       db_put(d, "TE_BLOOD", "1"); print("effect TE_BLOOD is ", ftos(particleeffectnum("TE_BLOOD")), "\n");
+                       db_put(d, "TE_SPARK", "1"); print("effect TE_SPARK is ", ftos(particleeffectnum("TE_SPARK")), "\n");
+                       db_put(d, "TE_PLASMABURN", "1"); print("effect TE_PLASMABURN is ", ftos(particleeffectnum("TE_PLASMABURN")), "\n");
+                       db_put(d, "TE_TEI_G3", "1"); print("effect TE_TEI_G3 is ", ftos(particleeffectnum("TE_TEI_G3")), "\n");
+                       db_put(d, "TE_TEI_SMOKE", "1"); print("effect TE_TEI_SMOKE is ", ftos(particleeffectnum("TE_TEI_SMOKE")), "\n");
+                       db_put(d, "TE_TEI_BIGEXPLOSION", "1"); print("effect TE_TEI_BIGEXPLOSION is ", ftos(particleeffectnum("TE_TEI_BIGEXPLOSION")), "\n");
+                       db_put(d, "TE_TEI_PLASMAHIT", "1"); print("effect TE_TEI_PLASMAHIT is ", ftos(particleeffectnum("TE_TEI_PLASMAHIT")), "\n");
+                       db_put(d, "EF_STARDUST", "1"); print("effect EF_STARDUST is ", ftos(particleeffectnum("EF_STARDUST")), "\n");
+                       db_put(d, "TR_ROCKET", "1"); print("effect TR_ROCKET is ", ftos(particleeffectnum("TR_ROCKET")), "\n");
+                       db_put(d, "TR_GRENADE", "1"); print("effect TR_GRENADE is ", ftos(particleeffectnum("TR_GRENADE")), "\n");
+                       db_put(d, "TR_BLOOD", "1"); print("effect TR_BLOOD is ", ftos(particleeffectnum("TR_BLOOD")), "\n");
+                       db_put(d, "TR_WIZSPIKE", "1"); print("effect TR_WIZSPIKE is ", ftos(particleeffectnum("TR_WIZSPIKE")), "\n");
+                       db_put(d, "TR_SLIGHTBLOOD", "1"); print("effect TR_SLIGHTBLOOD is ", ftos(particleeffectnum("TR_SLIGHTBLOOD")), "\n");
+                       db_put(d, "TR_KNIGHTSPIKE", "1"); print("effect TR_KNIGHTSPIKE is ", ftos(particleeffectnum("TR_KNIGHTSPIKE")), "\n");
+                       db_put(d, "TR_VORESPIKE", "1"); print("effect TR_VORESPIKE is ", ftos(particleeffectnum("TR_VORESPIKE")), "\n");
+                       db_put(d, "TR_NEHAHRASMOKE", "1"); print("effect TR_NEHAHRASMOKE is ", ftos(particleeffectnum("TR_NEHAHRASMOKE")), "\n");
+                       db_put(d, "TR_NEXUIZPLASMA", "1"); print("effect TR_NEXUIZPLASMA is ", ftos(particleeffectnum("TR_NEXUIZPLASMA")), "\n");
+                       db_put(d, "TR_GLOWTRAIL", "1"); print("effect TR_GLOWTRAIL is ", ftos(particleeffectnum("TR_GLOWTRAIL")), "\n");
+                       db_put(d, "TR_SEEKER", "1"); print("effect TR_SEEKER is ", ftos(particleeffectnum("TR_SEEKER")), "\n");
+                       db_put(d, "SVC_PARTICLE", "1"); print("effect SVC_PARTICLE is ", ftos(particleeffectnum("SVC_PARTICLE")), "\n");
+
+                       fh = fopen("effectinfo.txt", FILE_READ);
+                       while((s = fgets(fh)))
+                       {
+                               tokenize_console(s);
+                               if(argv(0) == "effect")
+                               {
+                                       if(db_get(d, argv(1)) != "1")
+                                       {
+                                               if(particleeffectnum(argv(1)) >= 0)
+                                                       print("effect ", argv(1), " is ", ftos(particleeffectnum(argv(1))), "\n");
+                                               db_put(d, argv(1), "1");
+                                       }
+                               }
+                       }
+                       print("end of effects list\n");
+
+                       db_close(d);
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd effectindexdump\n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_extendmatchtime(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       changematchtime(autocvar_timelimit_increment * 60, autocvar_timelimit_min * 60, autocvar_timelimit_max * 60);
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd extendmatchtime\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2reducematchtime^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_find(float request, float argc)  // is this even needed? We have prvm_edicts command and such ANYWAY
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity client;
+                       
+                       for(client = world; (client = find(client, classname, argv(1))); )
+                               print(etos(client), "\n");
+                               
+                       return;
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2find^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd find classname\n");
+                       print("  Where 'classname' is the classname to search for.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_gametype(float request, float argc) 
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1) != "")
+                       {
+                               string s = argv(1);
+                               float t = MapInfo_Type_FromString(s), tsave = MapInfo_CurrentGametype();
+                               
+                               if(t)
+                               {
+                                       MapInfo_SwitchGameType(t);
+                                       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+                                       if(MapInfo_count > 0)
+                                               bprint("Game type successfully switched to ", s, "\n");
+                                       else
+                                       {
+                                               bprint("Cannot use this game type: no map for it found\n");
+                                               MapInfo_SwitchGameType(tsave);
+                                               MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+                                       }
+                               }
+                               else
+                                       bprint("Game type switch to ", s, " failed: this type does not exist!\n");
+                                       
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2gametype^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd gametype mode\n");
+                       print("  Where 'mode' is the gametype mode to switch to.\n");
+                       print("See also: ^2gotomap^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_gettaginfo(float request, float argc) 
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity tmp_entity;
+                       float i;
+                       vector v;
+                       
+                       if(argc >= 4)
+                       {
+                               tmp_entity = spawn();
+                               if(argv(1) == "w")
+                                       setmodel(tmp_entity, (nextent(world)).weaponentity.model);
+                               else
+                               {
+                                       precache_model(argv(1));
+                                       setmodel(tmp_entity, argv(1));
+                               }
+                               tmp_entity.frame = stof(argv(2));
+                               if(substring(argv(3), 0, 1) == "#")
+                                       i = stof(substring(argv(3), 1, -1));
+                               else
+                                       i = gettagindex(tmp_entity, argv(3));
+                               if(i)
+                               {
+                                       v = gettaginfo(tmp_entity, i);
+                                       print("model ", tmp_entity.model, " frame ", ftos(tmp_entity.frame), " tag ", gettaginfo_name);
+                                       print(" index ", ftos(i), " parent ", ftos(gettaginfo_parent), "\n");
+                                       print(" vector = ", ftos(v_x), " ", ftos(v_y), " ", ftos(v_z), "\n");
+                                       print(" offset = ", ftos(gettaginfo_offset_x), " ", ftos(gettaginfo_offset_y), " ", ftos(gettaginfo_offset_z), "\n");
+                                       print(" forward = ", ftos(gettaginfo_forward_x), " ", ftos(gettaginfo_forward_y), " ", ftos(gettaginfo_forward_z), "\n");
+                                       print(" right = ", ftos(gettaginfo_right_x), " ", ftos(gettaginfo_right_y), " ", ftos(gettaginfo_right_z), "\n");
+                                       print(" up = ", ftos(gettaginfo_up_x), " ", ftos(gettaginfo_up_y), " ", ftos(gettaginfo_up_z), "\n");
+                                       if(argc >= 6)
+                                       {
+                                               v_y = -v_y;
+                                               localcmd(strcat(argv(4), vtos(v), argv(5), "\n"));
+                                       }
+                               }
+                               else
+                                       print("bone not found\n");
+                                       
+                               remove(tmp_entity);
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2gettaginfo^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd gettaginfo model frame index [command one] [command two]\n");
+                       print("See also: ^2bbox, trace^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_gotomap(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(1))
+                       {
+                               print(GotoMap(argv(1)), "\n");
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2gotomap^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd gotomap map\n");
+                       print("  Where 'map' is the *.bsp file to change to.\n");
+                       print("See also: ^2gametype^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_lockteams(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(teamplay)
+                       {
+                               lockteams = 1;
+                               bprint("^1The teams are now locked.\n");
+                       }
+                       else
+                       {
+                               bprint("lockteams command can only be used in a team-based gamemode.\n");
+                       }
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd lockteams\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2unlockteams^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_make_mapinfo(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               { 
+                       entity tmp_entity;
+                       
+                       tmp_entity = spawn();
+                       tmp_entity.classname = "make_mapinfo";
+                       tmp_entity.think = make_mapinfo_Think;
+                       tmp_entity.nextthink = time;
+                       MapInfo_Enumerate();
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd make_mapinfo\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2radarmap^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_moveplayer(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float accepted;
+                       entity client;
+       
+                       string targets = strreplace(",", " ", argv(1));
+                       string original_targets = strreplace(" ", ", ", targets);
+                       string destination = argv(2);
+                       string notify = argv(3);
+                       
+                       string successful, t;
+                       
+                       // lets see if the target(s) even actually exist.
+                       if((targets) && (destination))
+                       { 
+                               for(;targets;)
+                               {
+                                       t = car(targets); targets = cdr(targets);
+
+                                       // Check to see if the player is a valid target
+                                       client = GetFilteredEntity(t);
+                                       accepted = VerifyClientEntity(client, FALSE, FALSE);
+                                       
+                                       if not(accepted > 0) 
+                                       {
+                                               print("moveplayer: ", GetClientErrorString(accepted, t), (targets ? ", skipping to next player.\n" : ".\n")); 
+                                               continue;
+                                       }
+                                       
+                                       // Where are we putting this player?
+                                       if(destination == "spec" || destination == "spectator") 
+                                       {
+                                               if(client.classname != "spectator" && client.classname != "observer")
+                                               {
+                                                       self = client;
+                                                       PutObserverInServer();
+                                                       
+                                                       successful = strcat(successful, (successful ? ", " : ""), client.netname);
+                                               }
+                                               else
+                                               {
+                                                       print("Player ", ftos(GetFilteredNumber(t)), " (", client.netname, ") is already spectating.\n");
+                                               }
+                                               continue;
+                                       }
+                                       else
+                                       {
+                                               if(client.classname != "spectator" && client.classname != "observer")
+                                               {
+                                                       if(teamplay)
+                                                       {
+                                                               // set up
+                                                               float team_color;
+                                                               float save = client.team_forced;
+                                                               client.team_forced = 0;
+
+                                                               // find the team to move the player to
+                                                               team_color = ColourToNumber(destination);
+                                                               if(team_color == client.team) // already on the destination team
+                                                               {
+                                                                       // keep the forcing undone
+                                                                       print("Player ", ftos(GetFilteredNumber(t)), " (", client.netname, ") is already on the ", ColoredTeamName(client.team), (targets ? ", skipping to next player.\n" : ".\n"));
+                                                                       continue;
+                                                               } 
+                                                               else if(team_color == 0)  // auto team
+                                                               {
+                                                                       team_color = NumberToTeamNumber(FindSmallestTeam(client, FALSE));
+                                                               }
+                                                               else
+                                                               {
+                                                                       CheckAllowedTeams(client);
+                                                               }
+                                                               client.team_forced = save;
+                                                               
+                                                               // Check to see if the destination team is even available
+                                                               switch(team_color) 
+                                                               {
+                                                                       case COLOR_TEAM1: if(c1 == -1) { print("Sorry, can't move player to red team if it doesn't exist.\n"); return; } break;
+                                                                       case COLOR_TEAM2: if(c2 == -1) { print("Sorry, can't move player to blue team if it doesn't exist.\n"); return; } break;
+                                                                       case COLOR_TEAM3: if(c3 == -1) { print("Sorry, can't move player to yellow team if it doesn't exist.\n"); return; } break;
+                                                                       case COLOR_TEAM4: if(c4 == -1) { print("Sorry, can't move player to pink team if it doesn't exist.\n"); return; } break;
+                                                                       
+                                                                       default: print("Sorry, can't move player here if team ", destination, " doesn't exist.\n"); return;
+                                                               }
+                                                               
+                                                               // If so, lets continue and finally move the player
+                                                               client.team_forced = 0;
+                                                               MoveToTeam(client, team_color, 6, stof(notify));
+                                                               successful = strcat(successful, (successful ? ", " : ""), client.netname);
+                                                               print("Player ", ftos(GetFilteredNumber(t)), " (", client.netname, ") has been moved to the ", ColoredTeamName(team_color), ".\n");
+                                                               continue;
+                                                       }
+                                                       else
+                                                       {
+                                                               print("Can't change teams when currently not playing a team game.\n");
+                                                               return;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       print("Can't change teams if the player isn't in the game.\n"); // well technically we could, but should we allow that? :P 
+                                                       return;
+                                               }
+                                       }
+                               }
+                               
+                               if(successful)
+                                       bprint("Successfully moved players ", successful, " to destination ", destination, ".\n");
+                               else
+                                       print("No players given (", original_targets, ") are able to move.\n");
+                                       
+                               return; // still correct parameters so return to avoid usage print
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2moveplayer^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd moveplayer clients destination [notify]\n");
+                       print("  'clients' is a list (separated by commas) of player entity ID's or nicknames\n");
+                       print("  'destination' is what to send the player to, be it team or spectating\n");
+                       print("  Full list of destinations here: \"spec, spectator, red, blue, yellow, pink, auto.\"\n");
+                       print("  'notify' is whether or not to send messages notifying of the move. Detail below.\n");
+                       print("    0 (00) automove centerprint, admin message; 1 (01) automove centerprint, no admin message\n");
+                       print("    2 (10) no centerprint, admin message; 3 (11) no centerprint, no admin message\n");
+                       print("Examples: sv_cmd moveplayer 1,3,5 red 3\n");
+                       print("          sv_cmd moveplayer 2 spec \n");
+                       print("See also: ^2allspec, shuffleteams^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_nospectators(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       blockSpectators = 1;
+                       entity plr;
+                       FOR_EACH_CLIENT(plr) //give every spectator <g_maxplayers_spectator_blocktime> seconds time to become a player
+                       {
+                               if(plr.classname == "spectator" || plr.classname == "observer")
+                               {
+                                       plr.spectatortime = time;
+                                       sprint(plr, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
+                               }
+                       }
+                       bprint(strcat("^7All spectators will be automatically kicked when not joining the game after ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds!\n"));
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd nospectators\n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_playerdemo(float request, float argc)
+{      
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(2) && argv(3))
+                       {
+                               entity client;
+                               float i, n, accepted;
+                               
+                               switch(argv(1))
+                               {
+                                       case "read":
+                                       {
+                                               client = GetIndexedEntity(argc, 2);
+                                               accepted = VerifyClientEntity(client, FALSE, TRUE);
+                                               
+                                               if not(accepted > 0) 
+                                               {
+                                                       print("playerdemo: read: ", GetClientErrorString(accepted, argv(2)), ".\n"); 
+                                                       return;
+                                               }
+                                               
+                                               self = client;
+                                               playerdemo_open_read(argv(next_token));
+                                               return;
+                                       }
+                                       
+                                       case "write":
+                                       {
+                                               client = GetIndexedEntity(argc, 2);
+                                               accepted = VerifyClientEntity(client, FALSE, FALSE);
+                                               
+                                               if not(accepted > 0) 
+                                               {
+                                                       print("playerdemo: write: ", GetClientErrorString(accepted, argv(2)), ".\n"); 
+                                                       return;
+                                               }
+                                               
+                                               self = client;
+                                               playerdemo_open_write(argv(next_token));
+                                               return;
+                                       }
+                                       
+                                       case "auto_read_and_write":
+                                       {
+                                               n = GetFilteredNumber(argv(3));
+                                               cvar_set("bot_number", ftos(n));
+                                               
+                                               localcmd("wait; wait; wait\n");
+                                               for(i = 0; i < n; ++i) { localcmd("sv_cmd playerdemo read ", ftos(i+2), " ", argv(2), ftos(i+1), "\n"); }
+                                               
+                                               localcmd("sv_cmd playerdemo write 1 ", ftos(n+1), "\n");
+                                               return;
+                                       }
+                                       
+                                       case "auto_read":
+                                       {
+                                               n = GetFilteredNumber(argv(3));
+                                               cvar_set("bot_number", ftos(n));
+                                               
+                                               localcmd("wait; wait; wait\n");
+                                               for(i = 0; i < n; ++i) { localcmd("sv_cmd playerdemo read ", ftos(i+2), " ", argv(2), ftos(i+1), "\n"); }
+                                               return;
+                                       }
+                               }
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2playerdemo^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd playerdemo command (entitynumber filename | entitynumber botnumber)\n");
+                       print("  Full list of commands here: \"read, write, auto_read_and_write, auto_read.\"\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_printstats(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       DumpStats(FALSE);
+                       print("stats dumped.\n");
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd printstats\n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_radarmap(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(RadarMap_Make(argc))
+                               return;
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2radarmap^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample | --lineblock] [--sharpen N] [--res W H] [--qual Q]\n");
+                       print("  The quality factor Q is roughly proportional to the time taken.\n");
+                       print("  trace supports no quality factor; its result should look like --block with infinite quality factor.\n");
+                       print("See also: ^2make_mapinfo^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_reducematchtime(float request) 
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       changematchtime(autocvar_timelimit_decrement *-60, autocvar_timelimit_min * 60, autocvar_timelimit_max * 60);
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd reducematchtime\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2extendmatchtime^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_setbots(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2)
+                       {
+                               cvar_settemp("minplayers", "0");
+                               cvar_settemp("bot_number", argv(1));
+                               bot_fixcount();
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2setbots^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd setbots botnumber\n");
+                       print("  Where 'botnumber' is the amount of bots to set bot_number cvar to.\n");
+                       print("See also: ^2bot_cmd^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_shuffleteams(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(teamplay)
+                       {
+                               entity tmp_player, client;
+                               float i, x, z, t_teams, t_players, team_color, accepted;
+
+                               // count the total amount of players and total amount of teams
+                               FOR_EACH_PLAYER(tmp_player)
+                               {
+                                       CheckAllowedTeams(tmp_player);
+                                       
+                                       if(c1 >= 0) t_teams = max(1, t_teams);
+                                       if(c2 >= 0) t_teams = max(2, t_teams);
+                                       if(c3 >= 0) t_teams = max(3, t_teams);
+                                       if(c4 >= 0) t_teams = max(4, t_teams);
+                                       
+                                       ++t_players;
+                               }
+                               
+                               // build a list of the players in a random order
+                               FOR_EACH_PLAYER(tmp_player)
+                               {
+                                       for(;;)
+                                       {
+                                               i = bound(1, floor(random() * maxclients) + 1, maxclients);
+                                               
+                                               if(shuffleteams_players[i])
+                                               {
+                                                       continue; // a player is already assigned to this slot
+                                               }
+                                               else
+                                               {
+                                                       shuffleteams_players[i] = num_for_edict(tmp_player);
+                                                       break;
+                                               }
+                                       }
+                               }
+
+                               // finally, from the list made earlier, re-join the players in different order. 
+                               for(i = 1; i <= t_teams; ++i)
+                               {
+                                       // find out how many players to assign to this team
+                                       x = (t_players / t_teams);
+                                       x = ((i == 1) ? ceil(x) : floor(x));
+                                       
+                                       team_color = NumberToTeamNumber(i);
+                                       
+                                       // sort through the random list of players made earlier 
+                                       for(z = 1; z <= maxclients; ++z)
+                                       {                                                       
+                                               if not(shuffleteams_teams[i] >= x)
+                                               {
+                                                       if not(shuffleteams_players[z])
+                                                               continue; // not a player, move on to next random slot
+                                                               
+                                                       if(VerifyClientNumber(shuffleteams_players[z]))
+                                                               self = edict_num(shuffleteams_players[z]);
+
+                                                       if(self.team != team_color) 
+                                                               MoveToTeam(self, team_color, 6, 0);
+
+                                                       shuffleteams_players[z] = 0;
+                                                       shuffleteams_teams[i] = shuffleteams_teams[i] + 1;
+                                               }
+                                               else
+                                               {
+                                                       break; // move on to next team
+                                               }
+                                       }
+                               }
+                               
+                               bprint("Successfully shuffled the players around randomly.\n");
+                               
+                               // clear the buffers now
+                               for (i=0; i<SHUFFLETEAMS_MAX_PLAYERS; ++i)
+                                       shuffleteams_players[i] = 0;
+                               
+                               for (i=0; i<SHUFFLETEAMS_MAX_TEAMS; ++i)
+                                       shuffleteams_teams[i] = 0;
+                       }
+                       else
+                       {
+                               print("Can't shuffle teams when currently not playing a team game.\n");
+                       }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd shuffleteams\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2moveplayer, allspec^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_stuffto(float request, float argc)
+{
+       // This... is a fairly dangerous and powerful command... - It allows any arguments to be sent to a client via rcon.
+       // Because of this, it is disabled by default and must be enabled by the server owner when doing compilation. That way,
+       // we can be certain they understand the risks of it... So to enable, compile server with -DSTUFFTO_ENABLED argument.
+       
+       #ifdef STUFFTO_ENABLED
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argv(2))
+                       {
+                               entity client = GetIndexedEntity(argc, 1));
+                               float accepted = VerifyClientEntity(client, TRUE, FALSE);
+                               
+                               if(accepted > 0)
+                               {
+                                       stuffcmd(client, strcat("\n", argv(next_token), "\n"));
+                                       print(strcat("Command: \"", argv(next_token), "\" sent to ", GetCallerName(client), " (", argv(1) ,").\n"));
+                               }
+                               else
+                                       print("stuffto: ", GetClientErrorString(accepted, argv(1)), ".\n"); 
+                               
+                               return;
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2stuffto^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd stuffto client \"command\"\n");
+                       print("  'client' is the entity number or name of the player,\n");
+                       print("  and 'command' is the command to be sent to that player.\n");
+                       return;
+               }
+       }
+       #else
+       if(request)
+       {
+               print("stuffto command is not enabled on this server.\n");
+               return;
+       }
+       #endif
+}
+
+void GameCommand_trace(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       entity e;
+                       vector org, delta, start, end, p, q, q0, pos, vv, dv;
+                       float i, f, safe, unsafe, dq, dqf;
+       
+                       switch(argv(1))
+                       {
+                               case "debug":
+                               {
+                                       print("TEST CASE. If this returns the runaway loop counter error, possibly everything is oaky.\n");
+                                       for(;;)
+                                       {
+                                               org = world.mins;
+                                               delta = world.maxs - world.mins;
+
+                                               start_x = org_x + random() * delta_x;
+                                               start_y = org_y + random() * delta_y;
+                                               start_z = org_z + random() * delta_z;
+
+                                               end_x = org_x + random() * delta_x;
+                                               end_y = org_y + random() * delta_y;
+                                               end_z = org_z + random() * delta_z;
+
+                                               start = stov(vtos(start));
+                                               end = stov(vtos(end));
+
+                                               tracebox(start, PL_MIN, PL_MAX, end, MOVE_NOMONSTERS, world);
+                                               if(!trace_startsolid)
+                                               {
+                                                       p = trace_endpos;
+                                                       tracebox(p, PL_MIN, PL_MAX, p, MOVE_NOMONSTERS, world);
+                                                       if(trace_startsolid || trace_fraction == 1)
+                                                       {
+                                                               rint(42); // do an engine breakpoint on VM_rint so you can get the trace that errnoeously returns startsolid
+                                                               tracebox(start, PL_MIN, PL_MAX, end, MOVE_NOMONSTERS, world);
+                                                               tracebox(p, PL_MIN, PL_MAX, q, MOVE_NOMONSTERS, world);
+
+                                                               if(trace_startsolid)
+                                                               {
+                                                                       // how much do we need to back off?
+                                                                       safe = 1;
+                                                                       unsafe = 0;
+                                                                       for(;;)
+                                                                       {
+                                                                               pos = p * (1 - (safe + unsafe) * 0.5) + start * ((safe + unsafe) * 0.5);
+                                                                               tracebox(pos, PL_MIN, PL_MAX, pos, MOVE_NOMONSTERS, world);
+                                                                               if(trace_startsolid)
+                                                                               {
+                                                                                       if((safe + unsafe) * 0.5 == unsafe)
+                                                                                               break;
+                                                                                       unsafe = (safe + unsafe) * 0.5;
+                                                                               }
+                                                                               else
+                                                                               {
+                                                                                       if((safe + unsafe) * 0.5 == safe)
+                                                                                               break;
+                                                                                       safe = (safe + unsafe) * 0.5;
+                                                                               }
+                                                                       }
+
+                                                                       print("safe distance to back off: ", ftos(safe * vlen(p - start)), "qu\n");
+                                                                       print("unsafe distance to back off: ", ftos(unsafe * vlen(p - start)), "qu\n");
+
+                                                                       tracebox(p, PL_MIN + '0.1 0.1 0.1', PL_MAX - '0.1 0.1 0.1', p, MOVE_NOMONSTERS, world);
+                                                                       if(trace_startsolid)
+                                                                               print("trace_endpos much in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
+                                                                       else
+                                                                               print("trace_endpos just in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
+                                                                       break;
+                                                               }
+
+                                                               q0 = p;
+                                                               dq = 0;
+                                                               dqf = 1;
+                                                               for(;;)
+                                                               {
+                                                                       q = p + normalize(end - p) * (dq + dqf);
+                                                                       if(q == q0)
+                                                                               break;
+                                                                       tracebox(p, PL_MIN, PL_MAX, q, MOVE_NOMONSTERS, world);
+                                                                       if(trace_startsolid)
+                                                                               error("THIS ONE cannot happen");
+                                                                       if(trace_fraction > 0)
+                                                                               dq += dqf * trace_fraction;
+                                                                       dqf *= 0.5;
+                                                                       q0 = q;
+                                                               }
+                                                               if(dq > 0)
+                                                               {
+                                                                       print("trace_endpos still before solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
+                                                                       print("could go ", ftos(dq), " units further to ", vtos(q), "\n");
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       return;
+                               }
+                                       
+                               case "debug2":
+                               {
+                                       e = nextent(world);
+                                       tracebox(e.origin + '0 0 32', e.mins, e.maxs, e.origin + '0 0 -1024', MOVE_NORMAL, e);
+                                       vv = trace_endpos;
+                                       if(trace_fraction == 1)
+                                       {
+                                               print("not above ground, aborting\n");
+                                               return;
+                                       }
+                                       f = 0;
+                                       for(i = 0; i < 100000; ++i)
+                                       {
+                                               dv = randomvec();
+                                               if(dv_z > 0)
+                                                       dv = -1 * dv;
+                                               tracebox(vv, e.mins, e.maxs, vv + dv, MOVE_NORMAL, e);
+                                               if(trace_startsolid)
+                                                       print("bug 1\n");
+                                               if(trace_fraction == 1)
+                                               if(dv_z < f)
+                                               {
+                                                       print("bug 2: ", ftos(dv_x), " ", ftos(dv_y), " ", ftos(dv_z));
+                                                       print(" (", ftos(asin(dv_z / vlen(dv)) * 180 / M_PI), " degrees)\n");
+                                                       f = dv_z;
+                                               }
+                                       }
+                                       print("highest possible dist: ", ftos(f), "\n");
+                                       return;
+                               }
+                               
+                               case "walk":
+                               {
+                                       if(argc == 3)
+                                       {
+                                               e = nextent(world);
+                                               if(tracewalk(e, stov(argv(1)), e.mins, e.maxs, stov(argv(2)), MOVE_NORMAL))
+                                                       print("can walk\n");
+                                               else
+                                                       print("cannot walk\n");
+                                               return;
+                                       }
+                               }
+                               
+                               case "showline":
+                               {
+                                       if(argc == 3)
+                                       {
+                                               vv = stov(argv(1));
+                                               dv = stov(argv(2));
+                                               traceline(vv, dv, MOVE_NORMAL, world);
+                                               trailparticles(world, particleeffectnum("TR_NEXUIZPLASMA"), vv, trace_endpos);
+                                               trailparticles(world, particleeffectnum("TR_CRYLINKPLASMA"), trace_endpos, dv);
+                                               return;
+                                       }
+                               }
+                               
+                               // no default case, just go straight to invalid
+                       }
+               }
+                       
+               default:
+                       print("Incorrect parameters for ^2trace^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd trace command (startpos endpos)\n");
+                       print("  Full list of commands here: \"debug, debug2, walk, showline.\"\n");
+                       print("See also: ^2bbox, gettaginfo^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_unlockteams(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(teamplay)
+                       {
+                               lockteams = 0;
+                               bprint("^1The teams are now unlocked.\n");
+                       }
+                       else
+                       {
+                               bprint("unlockteams command can only be used in a team-based gamemode.\n");
+                       }
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd unlockteams\n");
+                       print("  No arguments required.\n");
+                       print("See also: ^2lockteams^7\n");
+                       return;
+               }
+       }
+}
+
+void GameCommand_warp(float request, float argc)
+{
+       switch (request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(autocvar_g_campaign)
+                       {
+                               if(argc >= 2)
+                               {
+                                       CampaignLevelWarp(stof(argv(1)));
+                                       print("Successfully warped to campaign level ", stof(argv(1)), ".\n");
+                               }       
+                               else
+                               {
+                                       CampaignLevelWarp(-1);
+                                       print("Successfully warped to next campaign level.\n");
+                               }
+                       }
+                       else
+                               print("Not in campaign, can't level warp\n");
+                       return;
+               }
+               
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd level\n");
+                       print("  'level' is the level to change campaign mode to.\n");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void GameCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd \n");
+                       print("  No arguments required.\n");
+                       return;
+               }
+       }
+}
+*/
+
+
+// ==================================
+//  Macro system for server commands
+// ==================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+// Common commands have double indentation to separate them a bit.
+#define SERVER_COMMANDS(request,arguments,command) \
+       SERVER_COMMAND("adminmsg", GameCommand_adminmsg(request, arguments), "Send an admin message to a client directly") \
+       SERVER_COMMAND("allready", GameCommand_allready(request), "Restart the server and reset the players") \
+       SERVER_COMMAND("allspec", GameCommand_allspec(request, arguments), "Force all players to spectate") \
+       SERVER_COMMAND("anticheat", GameCommand_anticheat(request, arguments), "Create an anticheat report for a client") \
+       SERVER_COMMAND("bbox", GameCommand_bbox(request), "Print detailed information about world size") \
+       SERVER_COMMAND("bot_cmd", GameCommand_bot_cmd(request, arguments), "Control and send commands to bots") \
+       SERVER_COMMAND("cointoss", GameCommand_cointoss(request, arguments), "Flip a virtual coin and give random result") \
+       SERVER_COMMAND("database", GameCommand_database(request, arguments), "Extra controls of the serverprogs database") \
+       SERVER_COMMAND("defer_clear", GameCommand_defer_clear(request, arguments), "Clear all queued defer commands for a specific client") \
+       SERVER_COMMAND("defer_clear_all", GameCommand_defer_clear_all(request), "Clear all queued defer commands for all clients") \
+       SERVER_COMMAND("delrec", GameCommand_delrec(request, arguments), "Delete race time record for a map") \
+       SERVER_COMMAND("effectindexdump", GameCommand_effectindexdump(request), "Dump list of effects from code and effectinfo.txt") \
+       SERVER_COMMAND("extendmatchtime", GameCommand_extendmatchtime(request), "Increase the timelimit value incrementally") \
+       SERVER_COMMAND("find", GameCommand_find(request, arguments), "Search through entities for matching classname") \
+       SERVER_COMMAND("gametype", GameCommand_gametype(request, arguments), "Simple command to change the active gametype") \
+       SERVER_COMMAND("gettaginfo", GameCommand_gettaginfo(request, arguments), "Get specific information about a weapon model") \
+       SERVER_COMMAND("gotomap", GameCommand_gotomap(request, arguments), "Simple command to switch to another map") \
+       SERVER_COMMAND("lockteams", GameCommand_lockteams(request), "Disable the ability for players to switch or enter teams") \
+       SERVER_COMMAND("make_mapinfo", GameCommand_make_mapinfo(request), "Automatically rebuild mapinfo files") \
+       SERVER_COMMAND("moveplayer", GameCommand_moveplayer(request, arguments), "Change the team/status of a player") \
+       SERVER_COMMAND("nospectators", GameCommand_nospectators(request), "Automatically remove spectators from a match") \
+       SERVER_COMMAND("playerdemo", GameCommand_playerdemo(request, arguments), "Control the ability to save demos of players") \
+       SERVER_COMMAND("printstats", GameCommand_printstats(request), "Dump eventlog player stats and other score information") \
+       SERVER_COMMAND("radarmap", GameCommand_radarmap(request, arguments), "Generate a radar image of the map") \
+       SERVER_COMMAND("reducematchtime", GameCommand_reducematchtime(request), "Decrease the timelimit value incrementally") \
+       SERVER_COMMAND("setbots", GameCommand_setbots(request, arguments), "Adjust how many bots are in the match") \
+       SERVER_COMMAND("shuffleteams", GameCommand_shuffleteams(request), "Randomly move players to different teams") \
+       SERVER_COMMAND("stuffto", GameCommand_stuffto(request, arguments), "Send a command to be executed on a client") \
+       SERVER_COMMAND("trace", GameCommand_trace(request, arguments), "Various debugging tools with tracing") \
+       SERVER_COMMAND("unlockteams", GameCommand_unlockteams(request), "Enable the ability for players to switch or enter teams") \
+       SERVER_COMMAND("warp", GameCommand_warp(request, arguments), "Choose different level in campaign") \
+       /* nothing */
+
+void GameCommand_macro_help()
+{
+       #define SERVER_COMMAND(name,function,description) \
+               { print("  ^2", name, "^7: ", description, "\n"); }
+               
+       SERVER_COMMANDS(0, 0, "")
+       #undef SERVER_COMMAND
+       
+       return;
+}
+
+float GameCommand_macro_command(float argc, string command)
+{
+       #define SERVER_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(0))) { function; return TRUE; } }
+               
+       SERVER_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
+       #undef SERVER_COMMAND
+       
+       return FALSE;
+}
+
+float GameCommand_macro_usage(float argc)
+{
+       #define SERVER_COMMAND(name,function,description) \
+               { if(name == strtolower(argv(1))) { function; return TRUE; } }
+               
+       SERVER_COMMANDS(CMD_REQUEST_USAGE, argc, "")
+       #undef SERVER_COMMAND
+       
+       return FALSE;
+}
+
+void GameCommand_macro_write_aliases(float fh)
+{
+       #define SERVER_COMMAND(name,function,description) \
+               { CMD_Write_Alias("qc_cmd_sv", name, description); }
+               
+       SERVER_COMMANDS(0, 0, "")
+       #undef SERVER_COMMAND
+       
+       return;
+}
+       
+
+// =========================================
+//  Main Function Called By Engine (sv_cmd)
+// =========================================
+// If this function exists, game code handles gamecommand instead of the engine code.
+
+void GameCommand(string command)
+{
+       float argc = tokenize_console(command);
+       
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+
+       if(strtolower(argv(0)) == "help") 
+       {
+               if(argc == 1) 
+               {
+                       print("\nServer console commands:\n");
+                       GameCommand_macro_help();
+                       
+                       print("\nBanning commands:\n");
+                       BanCommand_macro_help();
+                       
+                       print("\nCommon networked commands:\n");
+                       CommonCommand_macro_help(world);
+                       
+                       print("\nGeneric commands shared by all programs:\n");
+                       GenericCommand_macro_help();
+                       
+                       print("\nUsage:^3 sv_cmd COMMAND...^7, where possible commands are listed above.\n");
+                       print("For help about a specific command, type sv_cmd help COMMAND\n");
+                       
+                       return;
+               } 
+               else if(BanCommand_macro_usage(argc)) // Instead of trying to call a command, we're going to see detailed information about it
+               {
+                       return;
+               }
+               else if(CommonCommand_macro_usage(argc, world)) // same here, but for common commands instead
+               {
+                       return;
+               }
+               else if(GenericCommand_macro_usage(argc)) // same here, but for generic commands instead
+               {
+                       return;
+               }
+               else if(GameCommand_macro_usage(argc)) // finally try for normal commands too
+               {
+                       return;
+               }
+       } 
+       else if(BanCommand(command)) 
+       {
+               return; // handled by server/command/ipban.qc
+       }
+       else if(CommonCommand_macro_command(argc, world, command))
+       {
+               return; // handled by server/command/common.qc
+       }
+       else if(GenericCommand(command)) 
+       {
+               return; // handled by common/command/generic.qc
+       }
+       else if(GameCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
+       {
+               return; // handled by one of the above GameCommand_* functions
+       }
+       
+       // nothing above caught the command, must be invalid
+       print(((command != "") ? strcat("Unknown server command \"", command, "\"") : "No command provided"), ". For a list of supported commands, try sv_cmd help.\n");
+       
+       return;
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/sv_cmd.qh b/qcsrc/server/command/sv_cmd.qh
new file mode 100644 (file)
index 0000000..03bd80c
--- /dev/null
@@ -0,0 +1,16 @@
+// =================================================
+//  Declarations for server side game commands
+//  Last updated: December 25th, 2011
+// =================================================
+
+string GotoMap(string m);
+
+void race_deleteTime(string map, float pos);
+
+#define SHUFFLETEAMS_MAX_PLAYERS 255
+#define SHUFFLETEAMS_MAX_TEAMS 4
+float shuffleteams_players[SHUFFLETEAMS_MAX_PLAYERS]; // maximum of 255 player slots
+float shuffleteams_teams[SHUFFLETEAMS_MAX_TEAMS]; // maximum of 4 teams
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void GameCommand_macro_write_aliases(float fh);
\ No newline at end of file
diff --git a/qcsrc/server/command/vote.qc b/qcsrc/server/command/vote.qc
new file mode 100644 (file)
index 0000000..f3e8461
--- /dev/null
@@ -0,0 +1,988 @@
+// =============================================
+//  Server side voting code, reworked by Samual
+//  Last updated: December 27th, 2011
+// =============================================
+
+//  Nagger for players to know status of voting
+float Nagger_SendEntity(entity to, float sendflags)
+{
+       float nags, i, f, b;
+       entity e;
+       WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER);
+
+       // bits:
+       //   1 = ready
+       //   2 = player needs to ready up
+       //   4 = vote
+       //   8 = player needs to vote
+       //  16 = warmup
+       // sendflags:
+       //  64 = vote counts
+       // 128 = vote string
+
+       nags = 0;
+       if(readycount)
+       {
+               nags |= 1;
+               if(to.ready == 0)
+                       nags |= 2;
+       }
+       if(vote_called)
+       {
+               nags |= 4;
+               if(to.vote_selection == 0)
+                       nags |= 8;
+       }
+       if(inWarmupStage)
+               nags |= 16;
+
+       if(sendflags & 64)
+               nags |= 64;
+
+       if(sendflags & 128)
+               nags |= 128;
+
+       if(!(nags & 4)) // no vote called? send no string
+               nags &~= (64 | 128);
+
+       WriteByte(MSG_ENTITY, nags);
+
+       if(nags & 64)
+       {
+               WriteByte(MSG_ENTITY, vote_accept_count);
+               WriteByte(MSG_ENTITY, vote_reject_count);
+               WriteByte(MSG_ENTITY, vote_needed_overall);
+               WriteChar(MSG_ENTITY, to.vote_selection);
+       }
+
+       if(nags & 128)
+               WriteString(MSG_ENTITY, vote_called_display);
+
+       if(nags & 1)
+       {
+               for(i = 1; i <= maxclients; i += 8)
+               {
+                       for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e))
+                               if(clienttype(e) != CLIENTTYPE_REAL || e.ready)
+                                       f |= b;
+                       WriteByte(MSG_ENTITY, f);
+               }
+       }
+
+       return TRUE;
+}
+
+void Nagger_Init()
+{
+       Net_LinkEntity(nagger = spawn(), FALSE, 0, Nagger_SendEntity);
+}
+
+void Nagger_VoteChanged()
+{
+       if(nagger)
+               nagger.SendFlags |= 128;
+}
+
+void Nagger_VoteCountChanged()
+{
+       if(nagger)
+               nagger.SendFlags |= 64;
+}
+
+void Nagger_ReadyCounted()
+{
+       if(nagger)
+               nagger.SendFlags |= 1;
+}
+
+
+// =======================
+//  Game logic for voting
+// =======================
+
+void VoteReset() 
+{
+       entity tmp_player;
+
+       FOR_EACH_CLIENT(tmp_player) { tmp_player.vote_selection = 0; }
+
+       if(vote_called)
+       {
+               strunzone(vote_called_command);
+               strunzone(vote_called_display);
+       }
+
+       vote_called = VOTE_NULL;
+       vote_caller = world;
+       vote_endtime = 0;
+       
+       vote_called_command = string_null;
+       vote_called_display = string_null;
+       
+       vote_parsed_command = string_null;
+       vote_parsed_display = string_null;
+
+       Nagger_VoteChanged();
+}
+
+void VoteStop(entity stopper) 
+{
+       bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", GetCallerName(vote_caller), "^2's vote\n");
+       if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid))); }
+       
+       // Don't force them to wait for next vote, this way they can e.g. correct their vote.
+       if((vote_caller) && (stopper == vote_caller)) { vote_caller.vote_waittime = time + autocvar_sv_vote_stop; }
+
+       VoteReset();
+}
+
+void VoteAccept() 
+{
+       bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ^1", vote_called_display, "^2 was accepted\n");
+       
+       if((vote_called == VOTE_MASTER) && vote_caller)
+               vote_caller.vote_master = 1;
+       else
+               localcmd(strcat(vote_called_command, "\n"));
+       
+       if(vote_caller) { vote_caller.vote_waittime = 0; } // people like your votes, you don't need to wait to vote again
+
+       VoteReset();
+       Announce("voteaccept");
+}
+
+void VoteReject() 
+{
+       bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 was rejected\n");
+       VoteReset();
+       Announce("votefail");
+}
+
+void VoteTimeout() 
+{
+       bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 timed out\n");
+       VoteReset();
+       Announce("votefail");
+}
+
+void VoteSpam(float notvoters, float mincount, string result)
+{
+       bprint(strcat(
+               strcat("\{1}^2* vote results: ^1", ftos(vote_accept_count)),
+               strcat("^2:^1", ftos(vote_reject_count)),
+               ((mincount >= 0) ? strcat("^2 (^1", ftos(mincount), "^2 needed)") : "^2"),
+               strcat(", ^1", ftos(vote_abstain_count), "^2 didn't care"),
+               strcat(", ^1", ftos(notvoters), strcat("^2 didn't ", ((mincount >= 0) ? string_null : "have to "), "vote\n"))));
+       
+       if(autocvar_sv_eventlog)
+       {
+               GameLogEcho(strcat(
+                       strcat(":vote:v", result, ":", ftos(vote_accept_count)),
+                       strcat(":", ftos(vote_reject_count)),
+                       strcat(":", ftos(vote_abstain_count)),
+                       strcat(":", ftos(notvoters)),
+                       strcat(":", ftos(mincount))));
+       }
+}
+
+void VoteCount() 
+{
+       // declarations
+       vote_accept_count = vote_reject_count = vote_abstain_count = 0;
+       
+       float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) 
+                               || ((autocvar_sv_vote_nospectators == 1) && inWarmupStage) 
+                               || (autocvar_sv_vote_nospectators == 0));
+                               
+       float vote_player_count, is_player, notvoters;
+       float vote_real_player_count, vote_real_accept_count;
+       float vote_real_reject_count, vote_real_abstain_count;
+       float vote_needed_of_voted, final_needed_votes;
+       float vote_factor_overall, vote_factor_of_voted;
+       
+       entity tmp_player;
+
+       Nagger_VoteCountChanged();
+       
+       // add up all the votes from each connected client
+       FOR_EACH_REALCLIENT(tmp_player)
+       {
+               is_player = (tmp_player.classname == "player");
+               
+               ++vote_player_count;
+               if(is_player) { ++vote_real_player_count; }
+               
+               switch(tmp_player.vote_selection)
+               {
+                       case VOTE_SELECT_REJECT: { ++vote_reject_count; { if(is_player) ++vote_real_reject_count; } break; }
+                       case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(is_player) ++vote_real_reject_count; } break; }
+                       case VOTE_SELECT_ABSTAIN: { ++vote_abstain_count; { if(is_player) ++vote_real_abstain_count; } break; }
+                       default: break;
+               }
+       }
+       
+       // Check to see if there are enough players on the server to allow master voting... otherwise, vote master could be used for evil.
+       if((vote_called == VOTE_MASTER) && autocvar_sv_vote_master_playerlimit > vote_player_count) 
+       {
+               if(vote_caller) { vote_caller.vote_waittime = 0; }
+               print_to(vote_caller, "^1There are not enough players on this server to allow you to become vote master.");
+               VoteReset();
+               return;
+       }
+       
+       // if spectators aren't allowed to vote and there are players in a match, then only count the players in the vote and ignore spectators. 
+       if(!spectators_allowed && (vote_real_player_count > 0))
+       {
+               vote_accept_count = vote_real_accept_count;
+               vote_reject_count = vote_real_reject_count;
+               vote_abstain_count = vote_real_abstain_count;
+               vote_player_count = vote_real_player_count;
+       }
+       
+       // people who have no opinion in any way :D
+       notvoters = (vote_player_count - vote_accept_count - vote_reject_count - vote_abstain_count);
+
+       // determine the goal for the vote to be passed or rejected normally
+       vote_factor_overall = bound(0.5, autocvar_sv_vote_majority_factor, 0.999);
+       vote_needed_overall = floor((vote_player_count - vote_abstain_count) * vote_factor_overall) + 1;
+       
+       // if the vote times out, determine the amount of votes needed of the people who actually already voted
+       vote_factor_of_voted = bound(0.5, autocvar_sv_vote_majority_factor_of_voted, 0.999);
+       vote_needed_of_voted = floor((vote_accept_count + vote_reject_count) * vote_factor_of_voted) + 1;
+       
+       
+       // finally calculate the result of the vote     
+       if(vote_accept_count >= vote_needed_overall)
+       {
+               VoteSpam(notvoters, -1, "yes"); // there is enough acceptions to pass the vote
+               VoteAccept();
+               return;
+       }
+       
+       if(vote_reject_count > vote_player_count - vote_abstain_count - vote_needed_overall)
+       {
+               VoteSpam(notvoters, -1, "no"); // there is enough rejections to deny the vote
+               VoteReject();
+               return;
+       }
+       
+       // there is not enough votes in either direction, now lets just calculate what the voters have said
+       if(time > vote_endtime)
+       {
+               final_needed_votes = vote_needed_overall;
+               
+               if(autocvar_sv_vote_majority_factor_of_voted)
+               {
+                       if(vote_accept_count >= vote_needed_of_voted)
+                       {
+                               VoteSpam(notvoters, min(vote_needed_overall, vote_needed_of_voted), "yes");
+                               VoteAccept();
+                               return;
+                       }
+                       
+                       if(vote_accept_count + vote_reject_count > 0)
+                       {
+                               VoteSpam(notvoters, min(vote_needed_overall, vote_needed_of_voted), "no");
+                               VoteReject();
+                               return;
+                       }
+                       
+                       final_needed_votes = min(vote_needed_overall, vote_needed_of_voted);
+               }
+
+               // it didn't pass or fail, so not enough votes to even make a decision. 
+               VoteSpam(notvoters, final_needed_votes, "timeout");
+               VoteTimeout();
+       }
+}
+
+void VoteThink() 
+{
+       if(vote_endtime > 0) // a vote was called
+       if(time > vote_endtime) // time is up
+       {
+               VoteCount();
+       }
+       
+       return;
+}
+
+
+// =======================
+//  Game logic for warmup
+// =======================
+
+// Restarts the map after the countdown is over (and cvar sv_ready_restart_after_countdown is set)
+void ReadyRestart_think() 
+{
+       restart_mapalreadyrestarted = 1;
+       reset_map(TRUE);
+       Score_ClearAll();
+       remove(self);
+       
+       return;
+}
+
+// Forces a restart of the game without actually reloading the map // this is a mess...
+void ReadyRestart_force()
+{
+       entity tmp_player, restart_timer;
+
+       bprint("^1Server is restarting...\n");
+
+       VoteReset();
+
+       // clear overtime, we have to decrease timelimit to its original value again.
+       if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) { cvar_set("timelimit", ftos(autocvar_timelimit - (checkrules_overtimesadded * autocvar_timelimit_overtime))); }
+
+       checkrules_suddendeathend = checkrules_overtimesadded = checkrules_suddendeathwarning = 0;
+
+       readyrestart_happened = 1;
+       game_starttime = time;
+       if(!g_ca && !g_arena) { game_starttime += RESTART_COUNTDOWN; }
+               
+       restart_mapalreadyrestarted = 0; // reset this var, needed when cvar sv_ready_restart_repeatable is in use
+
+       // disable the warmup global for the server
+       inWarmupStage = 0; // once the game is restarted the game is in match stage
+
+       // reset the .ready status of all players (also spectators)
+       FOR_EACH_CLIENTSLOT(tmp_player) { tmp_player.ready = 0; }
+       readycount = 0;
+       Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client
+
+       // lock teams with lockonrestart
+       if(autocvar_teamplay_lockonrestart && teamplay) 
+       {
+               lockteams = 1;
+               bprint("^1The teams are now locked.\n");
+       }
+
+       //initiate the restart-countdown-announcer entity
+       if(autocvar_sv_ready_restart_after_countdown && !g_ca && !g_arena)
+       {
+               restart_timer = spawn();
+               restart_timer.think = ReadyRestart_think;
+               restart_timer.nextthink = game_starttime;
+       }
+
+       // after a restart every players number of allowed timeouts gets reset, too
+       if(autocvar_sv_timeout) { FOR_EACH_REALPLAYER(tmp_player) { tmp_player.allowed_timeouts = autocvar_sv_timeout_number; } }
+
+       //reset map immediately if this cvar is not set
+       if not(autocvar_sv_ready_restart_after_countdown) { reset_map(TRUE); }
+
+       if(autocvar_sv_eventlog) { GameLogEcho(":restart"); }
+}
+
+void ReadyRestart()
+{
+       // no arena, assault support yet...
+       if(g_arena | g_assault | gameover | intermission_running | race_completing)
+               localcmd("restart\n");
+       else
+               localcmd("\nsv_hook_gamerestart\n");
+
+       // Reset ALL scores, but only do that at the beginning of the countdown if sv_ready_restart_after_countdown is off!
+       // Otherwise scores could be manipulated during the countdown.
+       if not(autocvar_sv_ready_restart_after_countdown) { Score_ClearAll(); }
+
+       ReadyRestart_force();
+       
+       return;
+}
+
+// Count the players who are ready and determine whether or not to restart the match
+void ReadyCount()
+{
+       entity tmp_player;
+       float ready_needed_factor, ready_needed_count;
+       float t_ready, t_players;
+
+       FOR_EACH_REALPLAYER(tmp_player)
+       {
+               ++t_players;
+               if(tmp_player.ready) { ++t_ready; }
+       }
+
+       readycount = t_ready;
+
+       Nagger_ReadyCounted();
+
+       ready_needed_factor = bound(0.5, cvar("g_warmup_majority_factor"), 0.999);
+       ready_needed_count = floor(t_players * ready_needed_factor) + 1;
+       
+       if(readycount >= ready_needed_count)
+       {
+               ReadyRestart();
+       }
+               
+       return;
+}
+
+
+// ======================================
+//  Supporting functions for VoteCommand
+// ======================================
+
+float Votecommand_check_assignment(entity caller, float assignment)
+{
+       float from_server = (!caller);
+       
+       if((assignment == VC_ASGNMNT_BOTH) 
+               || ((!from_server && assignment == VC_ASGNMNT_CLIENTONLY) 
+               || (from_server && assignment == VC_ASGNMNT_SERVERONLY)))
+       {
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+string VoteCommand_extractcommand(string input, float startpos, float argc) 
+{
+       string output;
+       
+       if((argc - 1) < startpos)
+               output = "";
+       else
+               output = substring(input, argv_start_index(startpos), argv_end_index(-1) - argv_start_index(startpos));
+               
+       return output;
+}
+
+float VoteCommand_checknasty(string vote_command)
+{
+       if((strstrofs(vote_command, ";", 0) >= 0)
+               || (strstrofs(vote_command, "\n", 0) >= 0)
+               || (strstrofs(vote_command, "\r", 0) >= 0)
+               || (strstrofs(vote_command, "$", 0) >= 0))
+               return FALSE;
+               
+       return TRUE;
+}
+
+float VoteCommand_checkinlist(string vote_command, string list)
+{
+       string l = strcat(" ", list, " ");
+       
+       if(strstrofs(l, strcat(" ", vote_command, " "), 0) >= 0)
+               return TRUE;
+       
+       // if gotomap is allowed, chmap is too, and vice versa
+       if(vote_command == "gotomap")
+               if(strstrofs(l, " chmap ", 0) >= 0)
+                       return TRUE;
+                       
+       if(vote_command == "chmap")
+               if(strstrofs(l, " gotomap ", 0) >= 0)
+                       return TRUE;
+       
+       return FALSE;
+}
+
+string ValidateMap(string validated_map, entity caller)
+{
+       validated_map = MapInfo_FixName(validated_map);
+       
+       if(!validated_map)
+       {
+               print_to(caller, "This map is not available on this server.");
+               return string_null;
+       }
+       
+       if(!autocvar_sv_vote_override_mostrecent && caller)
+       {
+               if(Map_IsRecent(validated_map))
+               {
+                       print_to(caller, "This server does not allow for recent maps to be played again. Please be patient for some rounds.");
+                       return string_null;
+               }
+       }
+       
+       if(!MapInfo_CheckMap(validated_map))
+       {
+               print_to(caller, strcat("^1Invalid mapname, \"^3", validated_map, "^1\" does not support the current game mode."));
+               return string_null;
+       }
+
+       return validated_map;
+}
+
+float VoteCommand_parse(entity caller, string vote_command, string vote_list, float startpos, float argc)
+{
+       string first_command;
+       
+       first_command = argv(startpos);
+
+       if not(VoteCommand_checkinlist(first_command, vote_list))
+               return FALSE;
+
+       if(argc < startpos) // These commands won't work without arguments
+       {
+               switch(first_command)
+               {
+                       case "map":
+                       case "chmap":
+                       case "gotomap":
+                       case "kick":
+                       case "kickban":
+                               return FALSE;
+                               
+                       default: { break; }
+               }
+       }
+       
+       switch(first_command) // now go through and parse the proper commands to adjust as needed.
+       {
+               case "kick":
+               case "kickban": // catch all kick/kickban commands
+               {
+                       entity victim = GetIndexedEntity(argc, (startpos + 1));
+                       float accepted = VerifyClientEntity(victim, TRUE, FALSE);
+                       
+                       if(accepted > 0)
+                       {
+                               string reason = ((argc > next_token) ? substring(vote_command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)) : "No reason provided");
+                               string command_arguments;
+                               
+                               if(first_command == "kickban")
+                                       command_arguments = strcat(ftos(autocvar_g_ban_default_bantime), " ", ftos(autocvar_g_ban_default_masksize), " ~");
+                               else
+                                       command_arguments = reason;
+                               
+                               vote_parsed_command = strcat(first_command, " # ", ftos(num_for_edict(victim)), " ", command_arguments);
+                               vote_parsed_display = strcat("^1", vote_command, " (^7", victim.netname, "^1): ", reason);
+                       }
+                       else { print_to(caller, strcat("vcall: ", GetClientErrorString(accepted, argv(startpos + 1)), ".\n")); return FALSE; }
+                       
+                       break;
+               }
+               
+               case "map":
+               case "chmap":
+               case "gotomap": // re-direct all map selection commands to gotomap
+               {
+                       vote_command = ValidateMap(argv(startpos + 1), caller);
+                       if not(vote_command) { return FALSE; }
+                       vote_parsed_command = strcat("gotomap ", vote_command);
+                       vote_parsed_display = strzone(strcat("^1", vote_parsed_command));
+                       
+                       break;
+               }
+               
+               default: 
+               { 
+                       vote_parsed_command = vote_command;
+                       vote_parsed_display = strzone(strcat("^1", vote_command));
+                       
+                       break; 
+               }
+       }
+
+       return TRUE;
+}
+
+
+// =======================
+//  Command Sub-Functions
+// =======================
+
+void VoteCommand_abstain(float request, entity caller) // CLIENT ONLY
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if not(vote_called) { print_to(caller, "^1No vote called."); }
+                       else if not(caller.vote_selection == VOTE_SELECT_NULL || autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); }
+                       
+                       else // everything went okay, continue changing vote
+                       {
+                               print_to(caller, "^1You abstained from your vote.");
+                               caller.vote_selection = VOTE_SELECT_ABSTAIN;
+                               msg_entity = caller;
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                       }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote abstain"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void VoteCommand_call(float request, entity caller, float argc, string vote_command) // BOTH
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) 
+                               || ((autocvar_sv_vote_nospectators == 1) && inWarmupStage) 
+                               || (autocvar_sv_vote_nospectators == 0));
+                               
+                       float tmp_playercount;
+                       entity tmp_player;
+                       
+                       vote_command = VoteCommand_extractcommand(vote_command, 2, argc);
+                       
+                       if not(autocvar_sv_vote_call || !caller) { print_to(caller, "^1Vote calling is not allowed."); }
+                       else if(vote_called) { print_to(caller, "^1There is already a vote called."); }
+                       else if(!spectators_allowed && (caller && (caller.classname != "player"))) { print_to(caller, "^1Only players can call a vote."); }
+                       else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); }
+                       else if(caller && (time < caller.vote_waittime)) { print_to(caller, strcat("^1You have to wait ^2", ftos(ceil(caller.vote_waittime - time)), "^1 seconds before you can again call a vote.")); }
+                       else if not(VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); }
+                       else if not(VoteCommand_parse(caller, vote_command, autocvar_sv_vote_commands, 2, argc)) { print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); }
+
+                       else // everything went okay, continue with calling the vote
+                       {
+                               vote_caller = caller; // remember who called the vote
+                               vote_called = VOTE_NORMAL;
+                               vote_called_command = strzone(vote_parsed_command);
+                               vote_called_display = strzone(vote_parsed_display);
+                               vote_endtime = time + autocvar_sv_vote_timeout;
+                               
+                               if(caller)
+                               {
+                                       caller.vote_selection = VOTE_SELECT_ACCEPT;
+                                       caller.vote_waittime = time + autocvar_sv_vote_wait;
+                                       msg_entity = caller;
+                               }
+                               
+                               FOR_EACH_REALCLIENT(tmp_player) { ++tmp_playercount; }
+                               if(tmp_playercount > 1) { Announce("votecall"); } // don't announce a "vote now" sound if player is alone
+                               
+                               bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote for ", vote_called_display, "\n");
+                               if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
+                               Nagger_VoteChanged();
+                               VoteCount(); // needed if you are the only one
+                       }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote call command"));
+                       print_to(caller, "  Where 'command' is the command to request a vote upon.");
+                       print_to(caller, strcat("Examples: ", GetCommandPrefix(caller), " vote call gotomap dance"));
+                       print_to(caller, strcat("          ", GetCommandPrefix(caller), " vote call endmatch"));
+                       return;
+               }
+       }
+}
+
+void VoteCommand_master(float request, entity caller, float argc, string vote_command) // CLIENT ONLY
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(autocvar_sv_vote_master)
+                       {
+                               switch(strtolower(argv(2)))
+                               {
+                                       case "do":
+                                       {
+                                               vote_command = VoteCommand_extractcommand(vote_command, 3, argc);
+                                               
+                                               if not(caller.vote_master) { print_to(caller, "^1You do not have vote master privelages."); }
+                                               else if not(VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); }
+                                               else if not(VoteCommand_parse(caller, vote_command, autocvar_sv_vote_master_commands, 3, argc)) { print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); }
+                                               
+                                               else // everything went okay, proceed with command
+                                               {
+                                                       localcmd(strcat(vote_parsed_command, "\n"));
+                                                       print_to(caller, strcat("Executing command '", vote_parsed_display, "' on server."));
+                                                       bprint("\{1}^2* ^3", GetCallerName(caller), "^2 used their ^3master^2 status to do \"^2", vote_parsed_display, "^2\".\n");
+                                                       if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vdo:", ftos(caller.playerid), ":", vote_parsed_display)); }
+                                               }
+                                               
+                                               return;
+                                       }
+                                       
+                                       case "login":
+                                       {
+                                               if not(autocvar_sv_vote_master_password != "") { print_to(caller, "^1Login to vote master is not allowed."); }
+                                               else if(caller.vote_master) { print_to(caller, "^1You are already logged in as vote master."); }
+                                               else if not(autocvar_sv_vote_master_password == argv(3)) { print_to(caller, strcat("Rejected vote master login from ", GetCallerName(caller))); }
+
+                                               else // everything went okay, proceed with giving this player master privilages
+                                               {
+                                                       caller.vote_master = TRUE;
+                                                       print_to(caller, strcat("Accepted vote master login from ", GetCallerName(caller)));
+                                                       bprint("\{1}^2* ^3", GetCallerName(caller), "^2 logged in as ^3master^2\n");
+                                                       if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vlogin:", ftos(caller.playerid))); }
+                                               }
+                                               
+                                               return;
+                                       }
+                                       
+                                       default: // calling a vote for master
+                                       {
+                                               if not(autocvar_sv_vote_master_callable) { print_to(caller, "^1Vote to become vote master is not allowed."); }
+                                               else if(vote_called) { print_to(caller, "^1There is already a vote called."); }
+                                               else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); }
+                                               
+                                               else // everything went okay, continue with creating vote
+                                               {
+                                                       vote_caller = caller;
+                                                       vote_called = VOTE_MASTER;
+                                                       vote_called_command = strzone("XXX");
+                                                       vote_called_display = strzone("^3master");
+                                                       vote_endtime = time + autocvar_sv_vote_timeout;
+                                                       
+                                                       caller.vote_selection = VOTE_SELECT_ACCEPT;
+                                                       caller.vote_waittime = time + autocvar_sv_vote_wait;
+                                                       
+                                                       bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote to become ^3master^2.\n");
+                                                       if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
+                                                       Nagger_VoteChanged();
+                                                       VoteCount(); // needed if you are the only one
+                                               }
+                                               
+                                               return;
+                                       }
+                               }
+                       }
+                       else { print_to(caller, "^1Master control of voting is not allowed."); }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote master [action [command | password]]"));
+                       print_to(caller, "  If action is left blank, it calls a vote for you to become master.");
+                       print_to(caller, "  Otherwise the actions are either 'do' a command or 'login' as master.");
+                       return;
+               }
+       }
+}
+
+void VoteCommand_no(float request, entity caller) // CLIENT ONLY
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if not(vote_called) { print_to(caller, "^1No vote called."); }
+                       else if not(caller.vote_selection == VOTE_SELECT_NULL || autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); }
+                       else if(((caller == vote_caller) || caller.vote_master) && autocvar_sv_vote_no_stops_vote) { VoteStop(caller); }
+                       
+                       else // everything went okay, continue changing vote
+                       {
+                               print_to(caller, "^1You rejected the vote.");
+                               caller.vote_selection = VOTE_SELECT_REJECT;
+                               msg_entity = caller;
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                       }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote no"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void VoteCommand_status(float request, entity caller) // BOTH
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(vote_called)
+                               print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", GetCallerName(vote_caller), "^7."));
+                       else
+                               print_to(caller, "^1No vote called.");
+                               
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote status"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void VoteCommand_stop(float request, entity caller) // BOTH
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if not(vote_called) { print_to(caller, "^1No vote called."); }
+                       else if((caller == vote_caller) || !caller || caller.vote_master) { VoteStop(caller); }
+                       else { print_to(caller, "^1You are not allowed to stop that vote."); }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote stop"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+void VoteCommand_yes(float request, entity caller) // CLIENT ONLY
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if not(vote_called) { print_to(caller, "^1No vote called."); }
+                       else if not(caller.vote_selection == VOTE_SELECT_NULL || autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); }
+                       
+                       else // everything went okay, continue changing vote
+                       {
+                               print_to(caller, "^1You accepted the vote.");
+                               caller.vote_selection = VOTE_SELECT_ACCEPT;
+                               msg_entity = caller;
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                       }
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote yes"));
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void VoteCommand_(float request)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       
+                       return;
+               }
+                       
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote ");
+                       print_to(caller, "  No arguments required.");
+                       return;
+               }
+       }
+}
+*/
+
+
+// ================================
+//  Macro system for vote commands
+// ================================
+
+// Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+#define VOTE_COMMANDS(request,caller,arguments,command) \
+       VOTE_COMMAND("abstain", VoteCommand_abstain(request, caller), "Abstain your vote in current vote", VC_ASGNMNT_CLIENTONLY) \
+       VOTE_COMMAND("call", VoteCommand_call(request, caller, arguments, command), "Create a new vote for players to decide on", VC_ASGNMNT_BOTH) \
+       VOTE_COMMAND("help", VoteCommand_macro_help(caller, arguments), "Shows this information", VC_ASGNMNT_BOTH) \
+       VOTE_COMMAND("master", VoteCommand_master(request, caller, arguments, command), "Full control over all voting and vote commands", VC_ASGNMNT_CLIENTONLY) \
+       VOTE_COMMAND("no", VoteCommand_no(request, caller), "Select no in current vote", VC_ASGNMNT_CLIENTONLY) \
+       VOTE_COMMAND("status", VoteCommand_status(request, caller), "Prints information about current vote", VC_ASGNMNT_BOTH) \
+       VOTE_COMMAND("stop", VoteCommand_stop(request, caller), "Immediately end a vote", VC_ASGNMNT_BOTH) \
+       VOTE_COMMAND("yes", VoteCommand_yes(request, caller), "Select yes in current vote", VC_ASGNMNT_CLIENTONLY) \
+       /* nothing */
+
+void VoteCommand_macro_help(entity caller, float argc)
+{
+       string command_origin = GetCommandPrefix(caller);
+       
+       if(argc == 2) // help display listing all commands
+       {
+               print_to(caller, "\nVoting commands:\n");
+               #define VOTE_COMMAND(name,function,description,assignment) \
+                       { if(Votecommand_check_assignment(caller, assignment)) { print_to(caller, strcat("  ^2", name, "^7: ", description)); } }
+                       
+               VOTE_COMMANDS(0, caller, 0, "")
+               #undef VOTE_COMMAND
+               
+               print_to(caller, strcat("\nUsage:^3 ", command_origin, " vote COMMAND...^7, where possible commands are listed above.\n"));
+               print_to(caller, strcat("For help about a specific command, type ", command_origin, " vote help COMMAND"));
+               print_to(caller, strcat("\n^7You can call a vote for or execute these commands: ^3", autocvar_sv_vote_commands, "^7 and maybe further ^3arguments^7"));
+       }
+       else // usage for individual command
+       {
+               #define VOTE_COMMAND(name,function,description,assignment) \
+                       { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(2))) { function; return; } } }
+                       
+               VOTE_COMMANDS(CMD_REQUEST_USAGE, caller, argc, "")
+               #undef VOTE_COMMAND
+       }
+       
+       return;
+}
+
+float VoteCommand_macro_command(entity caller, float argc, string vote_command)
+{
+       #define VOTE_COMMAND(name,function,description,assignment) \
+               { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(1))) { function; return TRUE; } } }
+               
+       VOTE_COMMANDS(CMD_REQUEST_COMMAND, caller, argc, vote_command)
+       #undef VOTE_COMMAND
+       
+       return FALSE;
+}
+
+
+// ======================================
+//  Main function handling vote commands
+// ======================================
+
+void VoteCommand(float request, entity caller, float argc, string vote_command) 
+{
+       // Guide for working with argc arguments by example:
+       // argc:   1    - 2      - 3     - 4
+       // argv:   0    - 1      - 2     - 3 
+       // cmd     vote - master - login - password
+       
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(VoteCommand_macro_command(caller, argc, vote_command))
+                               return;
+               }
+                       
+               default:
+                       print_to(caller, strcat(((argv(1) != "") ? strcat("Unknown vote command \"", argv(1), "\"") : "No command provided"), ". For a list of supported commands, try ", GetCommandPrefix(caller), " vote help.\n"));
+               case CMD_REQUEST_USAGE:
+               {
+                       VoteCommand_macro_help(caller, argc);
+                       return;
+               }
+       }
+}
\ No newline at end of file
diff --git a/qcsrc/server/command/vote.qh b/qcsrc/server/command/vote.qh
new file mode 100644 (file)
index 0000000..748b7ce
--- /dev/null
@@ -0,0 +1,50 @@
+// ================================================
+//  Declarations for the vote system/vote commands
+//  Last updated: December 14th, 2011
+// ================================================
+
+// definitions for command selection between progs
+#define VC_ASGNMNT_BOTH 1
+#define VC_ASGNMNT_CLIENTONLY 2
+#define VC_ASGNMNT_SERVERONLY 3
+
+// vote selection definitions
+#define VOTE_SELECT_ABSTAIN -2
+#define VOTE_SELECT_REJECT -1
+#define VOTE_SELECT_NULL 0
+#define VOTE_SELECT_ACCEPT 1
+
+// different statuses of the current vote
+#define VOTE_NULL 0
+#define VOTE_NORMAL 1
+#define VOTE_MASTER 2
+
+// global vote information declarations
+entity vote_caller; // original caller of the current vote
+float vote_called; // stores status of current vote (See VOTE_*)
+float vote_endtime; // time when the vote is finished
+float vote_accept_count; // total amount of players who accept the vote (counted by VoteCount() function)
+float vote_reject_count; // same as above, but rejected
+float vote_abstain_count; // same as above, but abstained
+float vote_needed_overall; // total amount of players NEEDED for a vote to pass (based on sv_vote_majority_factor)
+.float vote_master; // flag for if the player has vote master privelages 
+.float vote_waittime; // flag for how long the player must wait before they can vote again
+.float vote_selection; // flag for which vote selection the player has made (See VOTE_SELECT_*)
+string vote_called_command; // command sent by client
+string vote_called_display; // visual string of command sent by client
+string vote_parsed_command; // command which is fixed after being parsed
+string vote_parsed_display; // visual string which is fixed after being parsed
+
+// allow functions to be used in other code like g_world.qc and teamplay.qc
+void VoteThink();
+void VoteReset();
+void VoteCommand(float request, entity caller, float argc, string vote_command);
+
+// warmup and nagger stuff
+#define RESTART_COUNTDOWN 10
+entity nagger;
+float readycount; // amount of players who are ready
+float readyrestart_happened; // keeps track of whether a restart has already happened
+float restart_mapalreadyrestarted; // bool, indicates whether reset_map() was already executed
+.float ready; // flag for if a player is ready
+void ReadyCount();
\ No newline at end of file
index 5e18a5cc60c55bb4936887ab9fab6f8b80153105..b95c7261366b099902f2bb67ac4730661c024db7 100644 (file)
@@ -125,13 +125,6 @@ float      MSG_ALL                                 = 2; // reliable
 float  MSG_INIT                                = 3; // initialization
 float  MSG_ENTITY                              = 5; // csqc
 
-vector PL_VIEW_OFS                             = '0 0 35';
-vector PL_MIN                                  = '-16 -16 -24';
-vector PL_MAX                                  = '16 16 45';
-vector PL_CROUCH_VIEW_OFS                      = '0 0 15';
-vector PL_CROUCH_MIN                           = '-16 -16 -24';
-vector PL_CROUCH_MAX                           = '16 16 25';
-
 // Sajt - added these, just as constants. Not sure how you want them actually put in the game, but I just
 // did this so at least they worked
 // NOTE: instagib IS NOT compatible with rocket-arena, so make sure to prevent selecting both in a menu
@@ -140,8 +133,6 @@ vector      PL_CROUCH_MAX                           = '16 16 25';
 //float        GAME_FULLBRIGHT_PLAYERS                 = 64; /// makes the players model fullbright
 //float        GAME_TEAMS                              = 128; /// Teams, red/green/yellow/blue
 
-float  game;   // set to "gamecfg" on spawnfunc_worldspawn
-
 
 //float        POWERUP_STRENGTH_DAMAGE                 = 2; // damage multiplier for strength powerup
 //float        POWERUP_STRENGTH_FORCE                  = 4; // force multiplier for strength powerup
index 6f7198c2a9f225e803fe7f63d5faa557063262a6..f5835377d982ea2ded4998baf629d3711883b787 100644 (file)
@@ -135,10 +135,7 @@ void ctf_flag_spawnstuff()
 
 float ctf_score_value(string parameter)
 {
-       if(g_ctf_win_mode != 2)
-               return cvar(strcat("g_ctf_personal", parameter));
-       else
-               return cvar(strcat("g_ctf_flag", parameter));
+       return cvar(strcat("g_ctf_personal", parameter));
 }
 
 void FakeTimeLimit(entity e, float t)
@@ -1012,11 +1009,6 @@ void ctf_init()
        captureshield_min_negscore = autocvar_g_ctf_shield_min_negscore;
        captureshield_max_ratio = autocvar_g_ctf_shield_max_ratio;
        captureshield_force = autocvar_g_ctf_shield_force;
-
-
-//#NO AUTOCVARS START
-       g_ctf_win_mode = cvar("g_ctf_win_mode");
-//#NO AUTOCVARS END
 }
 
 void ctf_setstatus2(entity flag, float shift)
index ae8be3f9d609a26668c4b855490475e583abe4c5..cced98bd2a734c5815545c88c0d27b92b17b5ff4 100644 (file)
@@ -18,12 +18,10 @@ noref float require_spawnfunc_prefix; // if this float exists, only functions wi
 
 float ctf_score_value(string parameter);
 
-float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts, g_freezetag, g_keepaway;
 float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_minstagib_invis_alpha, g_bloodloss;
 float g_warmup_limit;
 float g_warmup_allguns;
 float g_warmup_allow_timeout;
-float g_ctf_win_mode;
 float g_ctf_ignore_frags;
 float g_ctf_reverse;
 float g_race_qualifying;
@@ -107,7 +105,6 @@ float maxclients;
 
 .float play_time;
 .float death_time;
-.float dead_frame;
 .float fade_time;
 .float fade_rate;
 
@@ -142,8 +139,8 @@ float maxclients;
 .vector anim_runbackwards; // player running backward
 .vector anim_strafeleft; // player shuffling left quickly
 .vector anim_straferight; // player shuffling right quickly
-.vector anim_dead1; // player dead (must be identical to last frame of die1)
-.vector anim_dead2; // player dead (must be identical to last frame of die2)
+//.vector anim_dead1; // player dead (must be identical to last frame of die1)
+//.vector anim_dead2; // player dead (must be identical to last frame of die2)
 .vector anim_forwardright; // player running forward and right
 .vector anim_forwardleft; // player running forward and left
 .vector anim_backright; // player running backward and right
@@ -179,6 +176,9 @@ void setanim(entity e, vector anim, float looping, float override, float restart
 //.float       chasecam;
 
 .float damageforcescale;
+#define MIN_DAMAGEEXTRARADIUS 2
+#define MAX_DAMAGEEXTRARADIUS 16
+.float damageextraradius;
 
 //.float          gravity;
 
@@ -273,11 +273,6 @@ float alreadychangedlevel;
 // footstep interval
 .float nextstep;
 
-.float ready;
-#define RESTART_COUNTDOWN 10
-float restart_mapalreadyrestarted; //bool, indicates whether reset_map() was already executed
-entity restartTimer;
-void restartTimer_Think();
 float blockSpectators; //if set, new or existing spectators or observers will be removed unless they become a player within g_maxplayers_spectator_blocktime seconds
 .float spectatortime; //point in time since the client is spectating or observing
 void checkSpectatorBlock();
@@ -289,21 +284,6 @@ void checkSpectatorBlock();
 float nJoinAllowed(float includeMe);
 #define PREVENT_JOIN_TEXT "^1You may not join the game at this time.\n\nThe player limit reached maximum capacity."
 
-//sv_timeout: pauses the game by setting the gamespeed to a really low value (see TIMEOUT_SLOWMO_VALUE)
-#define TIMEOUT_SLOWMO_VALUE 0.0001
-float sys_frametime; // gets initialised in worlspawn, saves the value from autocvar_sys_ticrate
-float remainingTimeoutTime; // contains the time in seconds that the active timeout has left
-float remainingLeadTime; // contains the number of seconds left of the leadtime (before the timeout starts)
-float timeoutStatus; // (values: 0, 1, 2) contains whether a timeout is not active (0), was called but still at leadtime (1) or is active (2)
-.float allowedTimeouts; // contains the number of allowed timeouts for each player
-entity timeoutInitiator; // contains the entity of the player who started the last timeout
-float orig_slowmo; // contains the value of autocvar_slowmo so that, after timeout finished, it isn't set to slowmo 1 necessarily
-.vector lastV_angle; //used when pausing the game in order to force the player to keep his old view angle fixed
-entity timeoutHandler; //responsible for centerprinting the timeout countdowns and playing sounds
-void timeoutHandler_Think();
-void evaluateTimeout();
-void evaluateTimein();
-
 .float spawnshieldtime;
 
 .float lms_nextcheck;
@@ -327,7 +307,6 @@ float default_weapon_alpha;
 
 .float() customizeentityforclient;
 .float cvar_cl_handicap;
-.float cvar_cl_playerdetailreduction;
 .float cvar_cl_clippedspectating;
 .float cvar_cl_autoscreenshot;
 .float cvar_cl_movement_track_canjump;
@@ -341,8 +320,6 @@ float default_weapon_alpha;
 .float cvar_cl_forceplayermodelsfromxonotic;
 float sv_clforceplayermodels;
 #endif
-float sv_loddistance1;
-float sv_loddistance2;
 .float cvar_cl_gunalign;
 .float cvar_cl_noantilag;
 
@@ -357,12 +334,6 @@ void AnnounceTo(entity e, string snd);
 
 .float version_nagtime;
 
-.float modelindex_lod0;
-.float modelindex_lod0_from_xonotic;
-.float skinindex;
-.float modelindex_lod1;
-.float modelindex_lod2;
-
 #define NUM_JUMPPADSUSED 3
 .float jumppadcount;
 .entity jumppadsused[NUM_JUMPPADSUSED];
@@ -682,3 +653,5 @@ void PlayerUseKey();
 
 typedef vector(entity player, entity spot, vector current) spawn_evalfunc_t;
 .spawn_evalfunc_t spawn_evalfunc;
+
+.entity conveyor;
index 170793a5524b0621760b283023dbee138a205132..dde85328364070819a7b8ccdcf56398b7ac3fc81 100644 (file)
@@ -230,25 +230,25 @@ string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
 
        // health/armor of attacker (person who killed you)
        if(autocvar_sv_fraginfo_stats && (player.health >= 1))
-               if((autocvar_sv_fraginfo_stats == 2) || !inWarmupStage)
+               if((autocvar_sv_fraginfo_stats == 2) || inWarmupStage)
                        health_output = strcat("^7(Health ^1", ftos(rint(player.health)), "^7 / Armor ^2", ftos(rint(player.armorvalue)), "^7)");
        
        // ping display
        if(autocvar_sv_fraginfo_ping)
-               ping_output = ((clienttype(player) == CLIENTTYPE_BOT) ? "^2Bot" : strcat("Ping ", ((player.ping >= 150) ? "^1" : "^2"), ftos(player.ping), "ms"));
+               ping_output = ((clienttype(player) == CLIENTTYPE_BOT) ? "^2Bot" : strcat("Ping ", ((player.ping >= 150) ? "^1" : "^2"), ftos(rint(player.ping)), "ms"));
                
        // handicap display 
        if(autocvar_sv_fraginfo_handicap) 
        {
                if(autocvar_sv_fraginfo_handicap == 2)  
-                       handicap_output = strcat(output, strcat("Handicap ^2", ((player.cvar_cl_handicap <= 1) ? "Off" : ftos(player.cvar_cl_handicap))));
+                       handicap_output = strcat(output, strcat("Handicap ^2", ((player.cvar_cl_handicap <= 1) ? "Off" : ftos(rint(player.cvar_cl_handicap)))));
                else if(player.cvar_cl_handicap) // with _handicap 1, only show this if there actually is a handicap enabled.   
-                       handicap_output = strcat("Handicap ^2", ftos(player.cvar_cl_handicap));
+                       handicap_output = strcat("Handicap ^2", ftos(rint(player.cvar_cl_handicap)));
        }
        
        // format the string
-       output = strcat(health_output, (health_output ? " ^7(" : ((ping_output || handicap_output) ? "^7(" : "")), 
-               ping_output, ((ping_output && handicap_output) ? "^7 / " : ""), 
+       output = strcat(health_output, (health_output ? ((ping_output || handicap_output) ? " ^7(" : "") : ((ping_output || handicap_output) ? "^7(" : "")), 
+               ping_output, (handicap_output ? "^7 / " : ""), 
                handicap_output, ((ping_output || handicap_output) ? "^7)" : ""));
        
        // add new line to the beginning if there is a message
@@ -1001,7 +1001,7 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
 
        stat_damagedone = 0;
 
-       targ = WarpZone_FindRadius (blastorigin, rad, FALSE);
+       targ = WarpZone_FindRadius (blastorigin, rad + MAX_DAMAGEEXTRARADIUS, FALSE);
        while (targ)
        {
                next = targ.chain;
@@ -1014,7 +1014,7 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
                                diff = targ.WarpZone_findradius_dist;
                                // round up a little on the damage to ensure full damage on impacts
                                // and turn the distance into a fraction of the radius
-                               power = 1 - ((vlen (diff) - 2) / rad);
+                               power = 1 - ((vlen (diff) - bound(MIN_DAMAGEEXTRARADIUS, targ.damageextraradius, MAX_DAMAGEEXTRARADIUS)) / rad);
                                //bprint(" ");
                                //bprint(ftos(power));
                                //if (targ == attacker)
index 84ea0210184792e0f313df1b4e089925f6872359..370f2fb9878041cea1bac0cd540d82d2c450a231 100644 (file)
@@ -382,7 +382,7 @@ void FireGrapplingHook (void)
 
 void GrapplingHookFrame()
 {
-       if(g_grappling_hook && timeoutStatus != 2 && self.weapon != WEP_HOOK)
+       if(g_grappling_hook && timeout_status != TIMEOUT_ACTIVE && self.weapon != WEP_HOOK)
        {
                // offhand hook controls
                if(self.BUTTON_HOOK)
index 690fd752d7fe237241099f571b6db4602727cb05..befdb9bcc437e552e423d8489ac81f14cfec7d26 100644 (file)
@@ -128,15 +128,15 @@ float g_clientmodel_genericsendentity (entity to, float sf)
 
 
 #define G_MODEL_INIT(sol) \
-       SetBrushEntityModel(); \
        if(!self.scale) self.scale = self.modelscale; \
+       SetBrushEntityModel(); \
        self.use = g_model_setcolormaptoactivator; \
        InitializeEntity(self, g_model_dropbyspawnflags, INITPRIO_DROPTOFLOOR); \
        if(!self.solid) self.solid = (sol); else if(self.solid < 0) self.solid = SOLID_NOT;
 
 #define G_CLIENTMODEL_INIT(sol) \
-       SetBrushEntityModel(); \
        if(!self.scale) self.scale = self.modelscale; \
+       SetBrushEntityModel(); \
        self.use = g_clientmodel_setcolormaptoactivator; \
        InitializeEntity(self, g_clientmodel_dropbyspawnflags, INITPRIO_DROPTOFLOOR); \
        if(!self.solid) self.solid = (sol); else if(self.solid < 0) self.solid = SOLID_NOT; \
index a331da4f0961676e43a7d0ab90f76b6059322861..e119e5aba40040a359eca73d26d6a909f6f5d128 100644 (file)
@@ -71,24 +71,6 @@ vector animfixfps(entity e, vector a)
        return a;
 }
 
-vector animfixfps2(entity e, vector a, vector b)
-{
-       // multi-frame anim: keep as-is
-       float dur;
-       dur = frameduration(e.modelindex, a_x);
-       if(dur <= 0)
-       {
-               a = b;
-               dur = frameduration(e.modelindex, a_x);
-       }
-       if(a_y == 1)
-       {
-               if(dur > 0)
-                       a_z = 1.0 / dur;
-       }
-       return a;
-}
-
 /*
 ==================
 SUB_Remove
@@ -128,7 +110,7 @@ void SUB_VanishOrRemove (entity ent)
        if (ent.flags & FL_CLIENT)
        {
                // vanish
-               ent.model = "";
+               ent.alpha = -1;
                ent.effects = 0;
                ent.glow_size = 0;
                ent.pflags = 0;
@@ -142,12 +124,15 @@ void SUB_VanishOrRemove (entity ent)
 
 void SUB_SetFade_Think (void)
 {
+       if(self.alpha == 0)
+               self.alpha = 1;
        self.think = SUB_SetFade_Think;
-       self.nextthink = self.fade_time;
-       self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
+       self.nextthink = time;
+       self.alpha -= frametime * self.fade_rate;
        if (self.alpha < 0.01)
                SUB_VanishOrRemove(self);
-       self.alpha = bound(0.01, self.alpha, 1);
+       else
+               self.nextthink = time;
 }
 
 /*
@@ -163,7 +148,6 @@ void SUB_SetFade (entity ent, float when, float fadetime)
        //      return;
        //ent.alpha = 1;
        ent.fade_rate = 1/fadetime;
-       ent.fade_time = when;
        ent.think = SUB_SetFade_Think;
        ent.nextthink = when;
 }
index d0474b8ed4e92633c8ee3a83747db22eff59ea99..17b68d4f405960a0f1fd714a4e6b172fade71c24 100644 (file)
@@ -44,9 +44,9 @@ float world_initialized;
 
 string GetMapname();
 string GetGametype();
-void GotoNextMap();
+void GotoNextMap(float reinit);
 void ShuffleMaplist()
-float() DoNextMapOverride;
+float(float reinit) DoNextMapOverride;
 
 void SetDefaultAlpha()
 {
@@ -95,83 +95,6 @@ void fteqcc_testbugs()
        world.cnt = 0;
 }
 
-/**
- * Takes care of pausing and unpausing the game.
- * Centerprints the information about an upcoming or active timeout to all active
- * players. Also plays reminder sounds.
- */
-void timeoutHandler_Think() {
-       entity plr;
-       if (timeoutStatus == 1) {
-               if (remainingLeadTime > 0) {
-                       //centerprint the information to every player
-                       FOR_EACH_REALCLIENT(plr) {
-                               if(plr.classname == "player") {
-                                       Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout begins in %d seconds!", 1, remainingLeadTime);
-                               }
-                       }
-                       remainingLeadTime -= 1;
-                       //think again in 1 second:
-                       self.nextthink = time + 1;
-               }
-               else {
-                       //now pause the game:
-                       timeoutStatus = 2;
-                       //reset all the flood variables
-                       FOR_EACH_CLIENT(plr) {
-                               plr.nickspamcount = plr.nickspamtime = plr.floodcontrol_chat = plr.floodcontrol_chatteam = plr.floodcontrol_chattell = plr.floodcontrol_voice = plr.floodcontrol_voiceteam = 0;
-                       }
-                       cvar_set("slowmo", ftos(TIMEOUT_SLOWMO_VALUE));
-                       //copy .v_angle to .lastV_angle for every player in order to fix their view during pause (see PlayerPreThink)
-                       FOR_EACH_REALPLAYER(plr) {
-                               plr.lastV_angle = plr.v_angle;
-                       }
-                       self.nextthink = time;
-               }
-       }
-       else if (timeoutStatus == 2) {
-               if (remainingTimeoutTime > 0) {
-                       FOR_EACH_REALCLIENT(plr) {
-                               if(plr.classname == "player") {
-                                       Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout ends in %d seconds!", 1, remainingTimeoutTime);
-                               }
-                       }
-                       if(remainingTimeoutTime == autocvar_sv_timeout_resumetime) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
-                               Announce("prepareforbattle");
-                       }
-                       remainingTimeoutTime -= 1;
-                       self.nextthink = time + TIMEOUT_SLOWMO_VALUE;
-               }
-               else {
-                       //unpause the game again
-                       remainingTimeoutTime = timeoutStatus = 0;
-                       cvar_set("slowmo", ftos(orig_slowmo));
-                       //and unlock the fixed view again once there is no timeout active anymore
-                       FOR_EACH_REALPLAYER(plr) {
-                               plr.fixangle = FALSE;
-                       }
-                       //get rid of the countdown message
-                       FOR_EACH_REALCLIENT(plr) {
-                               if(plr.classname == "player") {
-                                       Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
-                               }
-                       }
-                       remove(self);
-                       return;
-               }
-
-       }
-       else if (timeoutStatus == 0) { //if a player called the resumegame command (which set timeoutStatus to 0 already)
-               FOR_EACH_REALCLIENT(plr) {
-                       if(plr.classname == "player") {
-                               Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
-                       }
-               }
-               remove(self);
-               return;
-       }
-}
-
 void GotoFirstMap()
 {
        float n;
@@ -189,8 +112,8 @@ void GotoFirstMap()
                MapInfo_Enumerate();
                MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
 
-               if(!DoNextMapOverride())
-                       GotoNextMap();
+               if(!DoNextMapOverride(1))
+                       GotoNextMap(1);
 
                return;
        }
@@ -297,11 +220,12 @@ void cvar_changes_init()
                BADPREFIX("g_ban_");
                BADPREFIX("g_banned_list");
                BADPREFIX("g_chat_flood_");
+               BADPREFIX("g_ghost_items");
                BADPREFIX("g_playerstats_");
+               BADPREFIX("g_respawn_ghosts");
                BADPREFIX("g_voice_flood_");
                BADPREFIX("rcon_");
-               BADPREFIX("settemp_");
-               BADPREFIX("sv_allowdownloads_");
+               BADPREFIX("sv_allowdownloads");
                BADPREFIX("sv_autodemo");
                BADPREFIX("sv_curl_");
                BADPREFIX("sv_eventlog");
@@ -371,7 +295,6 @@ void cvar_changes_init()
                BADCVAR("g_balance_kill_delay");
                BADCVAR("g_ca_point_leadlimit");
                BADCVAR("g_ctf_captimerecord_always");
-               BADCVAR("g_ctf_capture_leadlimit");
                BADCVAR("g_ctf_flag_capture_effects");
                BADCVAR("g_ctf_flag_glowtrails");
                BADCVAR("g_ctf_flag_pickup_effects");
@@ -386,6 +309,7 @@ void cvar_changes_init()
                BADCVAR("sv_allow_fullbright");
                BADCVAR("sv_checkforpacketsduringsleep");
                BADCVAR("sv_timeout");
+               BADPREFIX("sv_timeout_");
                BADCVAR("welcome_message_time");
                BADPREFIX("crypto_");
                BADPREFIX("g_chat_");
@@ -402,6 +326,9 @@ void cvar_changes_init()
                BADCVAR("gameversion");
                BADPREFIX("gameversion_");
                BADCVAR("sv_namechangetimer");
+#ifndef NO_LEGACY_NETWORKING
+               BADCVAR("sv_use_csqc_players"); // transition
+#endif
 
                // allowed changes to server admins (please sync this to server.cfg)
                // vi commands:
@@ -410,10 +337,10 @@ void cvar_changes_init()
                //   :%s,//\([^ ]*\).*,BADCVAR("\1");,
                //   :%!sort
                // yes, this does contain some redundant stuff, don't really care
+               BADCVAR("bot_config_file");
                BADCVAR("bot_number");
                BADCVAR("bot_prefix");
                BADCVAR("bot_suffix");
-               BADCVAR("bot_config_file");
                BADCVAR("capturelimit_override");
                BADCVAR("fraglimit_override");
                BADCVAR("gametype");
@@ -422,9 +349,7 @@ void cvar_changes_init()
                BADCVAR("g_balance_teams_force");
                BADCVAR("g_ban_sync_trusted_servers");
                BADCVAR("g_ban_sync_uri");
-               BADCVAR("g_ctf_capture_limit");
                BADCVAR("g_ctf_ignore_frags");
-               BADCVAR("g_ctf_win_mode");
                BADCVAR("g_domination_point_limit");
                BADCVAR("g_friendlyfire");
                BADCVAR("g_fullbrightitems");
@@ -444,6 +369,7 @@ void cvar_changes_init()
                BADCVAR("g_minstagib");
                BADCVAR("g_mirrordamage");
                BADCVAR("g_nexball_goallimit");
+               BADCVAR("g_powerups");
                BADCVAR("g_runematch_point_limit");
                BADCVAR("g_start_delay");
                BADCVAR("g_warmup");
@@ -460,6 +386,7 @@ void cvar_changes_init()
                BADCVAR("skill");
                BADCVAR("sv_adminnick");
                BADCVAR("sv_autoscreenshot");
+               BADCVAR("sv_autotaunt");
                BADCVAR("sv_curl_defaulturl");
                BADCVAR("sv_defaultcharacter");
                BADCVAR("sv_defaultplayercolors");
@@ -471,6 +398,7 @@ void cvar_changes_init()
                BADCVAR("sv_public");
                BADCVAR("sv_ready_restart");
                BADCVAR("sv_status_privacy");
+               BADCVAR("sv_taunt");
                BADCVAR("sv_vote_call");
                BADCVAR("sv_vote_commands");
                BADCVAR("sv_vote_majority_factor");
@@ -481,7 +409,9 @@ void cvar_changes_init()
                BADCVAR("sys_ticrate");
                BADCVAR("teamplay_mode");
                BADCVAR("timelimit_override");
+               BADCVAR("g_spawnshieldtime");
                BADPREFIX("g_warmup_");
+               BADPREFIX("sv_ready_restart_");
 
                if(autocvar_g_minstagib)
                {
@@ -601,6 +531,10 @@ void spawnfunc___init_dedicated_server(void)
 
        self.classname = "worldspawn"; // safeguard against various stuff ;)
 
+       // needs to be done so early because of the constants they create
+       RegisterWeapons();
+       RegisterGametypes();
+
        MapInfo_Enumerate();
        MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
 }
@@ -644,8 +578,9 @@ void spawnfunc_worldspawn (void)
                head = nextent(head);
        }
 
-       // needs to be done so early as they would still spawn
+       // needs to be done so early because of the constants they create
        RegisterWeapons();
+       RegisterGametypes();
 
        ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
 
@@ -743,8 +678,10 @@ void spawnfunc_worldspawn (void)
                        s = strcat(s, ":no_use_ammunition");
 
                // initialiation stuff, not good in the mutator system
-               if(!autocvar_g_pickup_items)
+               if(autocvar_g_pickup_items == 0)
                        s = strcat(s, ":no_pickup_items");
+               if(autocvar_g_pickup_items > 0)
+                       s = strcat(s, ":pickup_items");
 
                // initialiation stuff, not good in the mutator system
                if(autocvar_g_weaponarena != "0")
@@ -762,6 +699,12 @@ void spawnfunc_worldspawn (void)
                if(autocvar_g_minstagib)
                        s = strcat(s, ":minstagib");
 
+               // TODO to mutator system
+               if(autocvar_g_powerups == 0)
+                       s = strcat(s, ":no_powerups");
+               if(autocvar_g_powerups > 0)
+                       s = strcat(s, ":powerups");
+
                GameLogEcho(s);
                GameLogEcho(":gameinfo:end");
        }
@@ -870,7 +813,8 @@ void spawnfunc_worldspawn (void)
        next_pingtime = time + 5;
 
        detect_maptype();
-
+       
+       // set up information replies for clients and server to use
        lsmaps_reply = "^7Maps available: ";
        lsnewmaps_reply = "^7Maps without a record set: ";
        for(i = 0, j = 0; i < MapInfo_count; ++i)
@@ -882,18 +826,20 @@ void spawnfunc_worldspawn (void)
                                        col = "^2";
                                else
                                        col = "^3";
+                                       
                                ++j;
+                               
                                lsmaps_reply = strcat(lsmaps_reply, col, MapInfo_Map_bspname, " ");
+                               
                                if(g_race && !stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, RACE_RECORD, "time"))))
                                        lsnewmaps_reply = strcat(lsnewmaps_reply, col, MapInfo_Map_bspname, " ");
                                else if(g_cts && !stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, CTS_RECORD, "time"))))
                                        lsnewmaps_reply = strcat(lsnewmaps_reply, col, MapInfo_Map_bspname, " ");
                        }
        }
+       
        lsmaps_reply = strzone(strcat(lsmaps_reply, "\n"));
-       if (!g_race && !g_cts)
-               lsnewmaps_reply = "Need to be playing race or CTS for lsnewmaps to work.";
-       lsnewmaps_reply = strzone(strcat(lsnewmaps_reply, "\n"));
+       lsnewmaps_reply = strzone(strcat(((!g_race && !g_cts) ? "Need to be playing race or CTS for lsnewmaps to work." : lsnewmaps_reply), "\n"));
 
        maplist_reply = "^7Maps in list: ";
        n = tokenize_console(autocvar_g_maplist);
@@ -916,11 +862,12 @@ void spawnfunc_worldspawn (void)
        {
                records_reply[i] = strzone(getrecords(i));
        }
-       if(g_cts)
-               ladder_reply = strzone(getladder());
+       
+       ladder_reply = strzone(getladder());
 
        rankings_reply = strzone(getrankings());
 
+       // begin other init
        ClientInit_Spawn();
        RandomSeed_Spawn();
        PingPLReport_Spawn();
@@ -935,8 +882,17 @@ void spawnfunc_worldspawn (void)
                s = "";
                n = tokenize_console(cvar_string("sv_curl_serverpackages"));
                for(i = 0; i < n; ++i)
-                       if(substring(argv(i), -14, -1) != ".serverpackage")
+                       if(substring(argv(i), -14, -1) != "-serverpackage.txt")
+                       if(substring(argv(i), -14, -1) != ".serverpackage") // OLD legacy
                                s = strcat(s, " ", argv(i));
+               fd = search_begin("*-serverpackage.txt", TRUE, FALSE);
+               if(fd >= 0)
+               {
+                       j = search_getsize(fd);
+                       for(i = 0; i < j; ++i)
+                               s = strcat(s, " ", search_getfilename(fd, i));
+                       search_end(fd);
+               }
                fd = search_begin("*.serverpackage", TRUE, FALSE);
                if(fd >= 0)
                {
@@ -961,7 +917,7 @@ void spawnfunc_light (void)
 
 string GetGametype()
 {
-       return GametypeNameFromType(game);
+       return MapInfo_Type_ToString(MapInfo_LoadedGametype);
 }
 
 string getmapname_stored;
@@ -1109,16 +1065,9 @@ void Map_Goto_SetFloat(float position)
        Map_Goto_SetStr(argv(position));
 }
 
-void GameResetCfg()
-{
-       // settings persist, except...
-       localcmd("\nsettemp_restore\n");
-}
-
-void Map_Goto()
+void Map_Goto(float reinit)
 {
-       GameResetCfg();
-       MapInfo_LoadMap(getmapname_stored);
+       MapInfo_LoadMap(getmapname_stored, reinit);
 }
 
 // return codes of map selectors:
@@ -1254,7 +1203,7 @@ string GetNextMap()
        return "";
 }
 
-float DoNextMapOverride()
+float DoNextMapOverride(float reinit)
 {
        if(autocvar_g_campaign)
        {
@@ -1287,21 +1236,21 @@ float DoNextMapOverride()
                if(MapInfo_CheckMap(autocvar_nextmap))
                {
                        Map_Goto_SetStr(autocvar_nextmap);
-                       Map_Goto();
+                       Map_Goto(reinit);
                        alreadychangedlevel = TRUE;
                        return TRUE;
                }
        if(autocvar_lastlevel)
        {
-               GameResetCfg();
-               localcmd("set lastlevel 0\ntogglemenu\n");
+               cvar_settemp_restore();
+               localcmd("set lastlevel 0\ntogglemenu 1\n");
                alreadychangedlevel = TRUE;
                return TRUE;
        }
        return FALSE;
 }
 
-void GotoNextMap()
+void GotoNextMap(float reinit)
 {
        //string nextmap;
        //float n, nummaps;
@@ -1333,7 +1282,7 @@ void GotoNextMap()
                                error("Everything is broken - not even the default map list works. Please report this to the developers.");
                        }
                }
-               Map_Goto();
+               Map_Goto(reinit);
        }
 }
 
@@ -1357,8 +1306,7 @@ void IntermissionThink()
                && ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) )
        {
                self.autoscreenshot = -1;
-               if(clienttype(self) == CLIENTTYPE_REAL)
-                       stuffcmd(self, "\nscreenshot\necho \"^5A screenshot has been taken at request of the server.\"\n");
+               if(clienttype(self) == CLIENTTYPE_REAL) { stuffcmd(self, sprintf("\nautoscreenshot \"%s\" \"%s\"\n", GetMapname(), strftime(FALSE, "%s"))); }
                return;
        }
 
@@ -2026,7 +1974,6 @@ float WinningCondition_Race(float fraglimit)
        return wc;
 }
 
-void ReadyRestart();
 float WinningCondition_QualifyingThenRace(float limit)
 {
        float wc;
@@ -2116,6 +2063,7 @@ CheckRules_World
 Exit deathmatch games upon conditions
 ============
 */
+void ReadyRestart();
 void CheckRules_World()
 {
        float timelimit;
@@ -2312,7 +2260,7 @@ float mapvote_maps_suggested[MAPVOTE_COUNT];
 string mapvote_suggestions[MAPVOTE_COUNT];
 float mapvote_suggestion_ptr;
 float mapvote_voters;
-float mapvote_votes[MAPVOTE_COUNT];
+float mapvote_selections[MAPVOTE_COUNT];
 float mapvote_run;
 float mapvote_detail;
 float mapvote_abstain;
@@ -2469,20 +2417,6 @@ void MapVote_SendPicture(float id)
        WritePicture(MSG_ONE, strcat(mapvote_screenshot_dirs[mapvote_maps_screenshot_dir[id]], "/", mapvote_maps[id]), 3072);
 }
 
-float GameCommand_MapVote(string cmd)
-{
-       if(!intermission_running)
-               return FALSE;
-
-       if(cmd == "mv_getpic")
-       {
-               MapVote_SendPicture(stof(argv(1)));
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
 float MapVote_GetMapMask()
 {
        float mask, i, power;
@@ -2550,7 +2484,7 @@ float MapVote_SendEntity(entity to, float sf)
                if(mapvote_detail)
                        for(i = 0; i < mapvote_count; ++i)
                                if(mapvote_maps[i] != "")
-                                       WriteByte(MSG_ENTITY, mapvote_votes[i]);
+                                       WriteByte(MSG_ENTITY, mapvote_selections[i]);
 
                WriteByte(MSG_ENTITY, to.mapvote);
        }
@@ -2582,16 +2516,16 @@ float MapVote_Finished(float mappos)
        if(autocvar_sv_eventlog)
        {
                result = strcat(":vote:finished:", mapvote_maps[mappos]);
-               result = strcat(result, ":", ftos(mapvote_votes[mappos]), "::");
+               result = strcat(result, ":", ftos(mapvote_selections[mappos]), "::");
                didntvote = mapvote_voters;
                for(i = 0; i < mapvote_count; ++i)
                        if(mapvote_maps[i] != "")
                        {
-                               didntvote -= mapvote_votes[i];
+                               didntvote -= mapvote_selections[i];
                                if(i != mappos)
                                {
                                        result = strcat(result, ":", mapvote_maps[i]);
-                                       result = strcat(result, ":", ftos(mapvote_votes[i]));
+                                       result = strcat(result, ":", ftos(mapvote_selections[i]));
                                }
                        }
                result = strcat(result, ":didn't vote:", ftos(didntvote));
@@ -2605,7 +2539,7 @@ float MapVote_Finished(float mappos)
                FixClientCvars(other);
 
        Map_Goto_SetStr(mapvote_maps[mappos]);
-       Map_Goto();
+       Map_Goto(0);
        alreadychangedlevel = TRUE;
        return TRUE;
 }
@@ -2616,7 +2550,7 @@ void MapVote_CheckRules_1()
        for(i = 0; i < mapvote_count; ++i) if(mapvote_maps[i] != "")
        {
                //dprint("Map ", ftos(i), ": "); dprint(mapvote_maps[i], "\n");
-               mapvote_votes[i] = 0;
+               mapvote_selections[i] = 0;
        }
 
        mapvote_voters = 0;
@@ -2627,7 +2561,7 @@ void MapVote_CheckRules_1()
                {
                        i = other.mapvote - 1;
                        //dprint("Player ", other.netname, " vote = ", ftos(other.mapvote - 1), "\n");
-                       mapvote_votes[i] = mapvote_votes[i] + 1;
+                       mapvote_selections[i] = mapvote_selections[i] + 1;
                }
        }
 }
@@ -2645,11 +2579,11 @@ float MapVote_CheckRules_2()
 
        mapvote_voters_real = mapvote_voters;
        if(mapvote_abstain)
-               mapvote_voters_real -= mapvote_votes[mapvote_count - 1];
+               mapvote_voters_real -= mapvote_selections[mapvote_count - 1];
 
        RandomSelection_Init();
        for(i = 0; i < mapvote_count_real; ++i) if(mapvote_maps[i] != "")
-               RandomSelection_Add(world, i, string_null, 1, mapvote_votes[i]);
+               RandomSelection_Add(world, i, string_null, 1, mapvote_selections[i]);
        firstPlace = RandomSelection_chosen_float;
        firstPlaceVotes = RandomSelection_best_priority;
        //dprint("First place: ", ftos(firstPlace), "\n");
@@ -2658,7 +2592,7 @@ float MapVote_CheckRules_2()
        RandomSelection_Init();
        for(i = 0; i < mapvote_count_real; ++i) if(mapvote_maps[i] != "")
                if(i != firstPlace)
-                       RandomSelection_Add(world, i, string_null, 1, mapvote_votes[i]);
+                       RandomSelection_Add(world, i, string_null, 1, mapvote_selections[i]);
        secondPlace = RandomSelection_chosen_float;
        secondPlaceVotes = RandomSelection_best_priority;
        //dprint("Second place: ", ftos(secondPlace), "\n");
@@ -2685,12 +2619,12 @@ float MapVote_CheckRules_2()
                        for(i = 0; i < mapvote_count; ++i)
                                if(mapvote_maps[i] != "")
                                {
-                                       didntvote -= mapvote_votes[i];
+                                       didntvote -= mapvote_selections[i];
                                        if(i != firstPlace)
                                                if(i != secondPlace)
                                                {
                                                        result = strcat(result, ":", mapvote_maps[i]);
-                                                       result = strcat(result, ":", ftos(mapvote_votes[i]));
+                                                       result = strcat(result, ":", ftos(mapvote_selections[i]));
                                                        if(i < mapvote_count_real)
                                                        {
                                                                strunzone(mapvote_maps[i]);
@@ -2801,11 +2735,11 @@ void MapVote_Think()
                }
 
                mapvote_initialized = TRUE;
-               if(DoNextMapOverride())
+               if(DoNextMapOverride(0))
                        return;
                if(!autocvar_g_maplist_votable || player_count <= 0)
                {
-                       GotoNextMap();
+                       GotoNextMap(0);
                        return;
                }
                MapVote_Init();
@@ -2822,7 +2756,7 @@ string GotoMap(string m)
        cvar_set("timelimit", "-1");
        if(mapvote_initialized || alreadychangedlevel)
        {
-               if(DoNextMapOverride())
+               if(DoNextMapOverride(0))
                        return "Map switch initiated.";
                else
                        return "Hm... no. For some reason I like THIS map more.";
@@ -2932,14 +2866,11 @@ void RestoreGame()
        TargetMusic_RestoreGame();
 }
 
-void SV_Shutdown()
+void Shutdown()
 {
        entity e;
 
-       if(gameover > 1) // shutting down already?
-               return;
-
-       gameover = 2; // 2 = server shutting down
+       gameover = 2;
 
        if(world_initialized > 0)
        {
diff --git a/qcsrc/server/gamecommand.qc b/qcsrc/server/gamecommand.qc
deleted file mode 100644 (file)
index 986f2dd..0000000
+++ /dev/null
@@ -1,1529 +0,0 @@
-string GotoMap(string m);
-void race_deleteTime(string map, float pos);
-
-float FullTraceFraction(vector a, vector mi, vector ma, vector b)
-{
-       vector c;
-       float white, black;
-
-       white = 0.001;
-       black = 0.001;
-
-       c = a;
-
-       float n, m;
-       n = m = 0;
-
-       while(vlen(c - b) > 1)
-       {
-               ++m;
-
-               tracebox(c, mi, ma, b, MOVE_WORLDONLY, world);
-               ++n;
-
-               if(!trace_startsolid)
-               {
-                       black += vlen(trace_endpos - c);
-                       c = trace_endpos;
-               }
-
-               n += tracebox_inverted(c, mi, ma, b, MOVE_WORLDONLY, world);
-
-               white += vlen(trace_endpos - c);
-               c = trace_endpos;
-       }
-
-       if(n > 200)
-               dprint("HOLY SHIT! FullTraceFraction: ", ftos(n), " total traces, ", ftos(m), " iterations\n");
-
-       return white / (black + white);
-}
-
-float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize, float q)
-{
-       vector a, b, mi, ma;
-
-       mi = '0 0 0';
-       ma = '1 0 0' * w + '0 1 0' * h;
-       a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
-       b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * (zsize + zmin);
-
-       return FullTraceFraction(a, mi, ma, b);
-}
-float RadarMapAtPoint_LineBlock(float x, float y, float w, float h, float zmin, float zsize, float q)
-{
-       vector o, mi, ma;
-       float i, r;
-       vector dz;
-
-       q = 256 * q - 1;
-       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
-
-       mi = '0 0 0';
-       dz = (zsize / q) * '0 0 1';
-       ma = '1 0 0' * w + '0 1 0' * h + dz;
-       o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
-
-       if(x < world.absmin_x - w)
-               return 0;
-       if(y < world.absmin_y - h)
-               return 0;
-       if(x > world.absmax_x)
-               return 0;
-       if(y > world.absmax_y)
-               return 0;
-
-       r = 0;
-       for(i = 0; i < q; ++i)
-       {
-               vector v1, v2;
-               v1 = v2 = o + dz * i + mi;
-               v1_x += random() * (ma_x - mi_x);
-               v1_y += random() * (ma_y - mi_y);
-               v1_z += random() * (ma_z - mi_z);
-               v2_x += random() * (ma_x - mi_x);
-               v2_y += random() * (ma_y - mi_y);
-               v2_z += random() * (ma_z - mi_z);
-               traceline(v1, v2, MOVE_WORLDONLY, world);
-               if(trace_startsolid || trace_fraction < 1)
-                       ++r;
-       }
-       return r / q;
-}
-float RadarMapAtPoint_Block(float x, float y, float w, float h, float zmin, float zsize, float q)
-{
-       vector o, mi, ma;
-       float i, r;
-       vector dz;
-
-       q = 256 * q - 1;
-       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
-
-       mi = '0 0 0';
-       dz = (zsize / q) * '0 0 1';
-       ma = '1 0 0' * w + '0 1 0' * h + dz;
-       o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
-
-       if(x < world.absmin_x - w)
-               return 0;
-       if(y < world.absmin_y - h)
-               return 0;
-       if(x > world.absmax_x)
-               return 0;
-       if(y > world.absmax_y)
-               return 0;
-
-       r = 0;
-       for(i = 0; i < q; ++i)
-       {
-               tracebox(o + dz * i, mi, ma, o + dz * i, MOVE_WORLDONLY, world);
-               if(trace_startsolid)
-                       ++r;
-       }
-       return r / q;
-}
-float RadarMapAtPoint_Sample(float x, float y, float w, float h, float zmin, float zsize, float q)
-{
-       vector a, b, mi, ma;
-
-       q *= 4; // choose q so it matches the regular algorithm in speed
-
-       q = 256 * q - 1;
-       // 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
-
-       mi = '0 0 0';
-       ma = '1 0 0' * w + '0 1 0' * h;
-       a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
-       b = '1 0 0' * w + '0 1 0' * h + '0 0 1' * zsize;
-
-       float c, i;
-       c = 0;
-
-       for(i = 0; i < q; ++i)
-       {
-               vector v;
-               v_x = a_x + random() * b_x;
-               v_y = a_y + random() * b_y;
-               v_z = a_z + random() * b_z;
-               traceline(v, v, MOVE_WORLDONLY, world);
-               if(trace_startsolid)
-                       ++c;
-       }
-
-       return c / q;
-}
-
-// FF is contained twice, to map 256 to FF too
-// removes the need to bound()
-string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF";
-
-float RADAR_WIDTH_MAX = 512;
-float RADAR_HEIGHT_MAX = 512;
-float sharpen_buffer[RADAR_WIDTH_MAX * 3];
-
-void sharpen_set(float x, float v)
-{
-       sharpen_buffer[x + 2 * RADAR_WIDTH_MAX] = v;
-}
-
-float sharpen_getpixel(float x, float y)
-{
-       if(x < 0)
-               return 0;
-       if(x >= RADAR_WIDTH_MAX)
-               return 0;
-       if(y < 0)
-               return 0;
-       if(y > 2)
-               return 0;
-       return sharpen_buffer[x + y * RADAR_WIDTH_MAX];
-}
-
-float sharpen_get(float x, float a)
-{
-       float sum;
-       sum = sharpen_getpixel(x, 1);
-       if(a == 0)
-               return sum;
-       sum *= (8 + 1/a);
-       sum -= sharpen_getpixel(x - 1, 0);
-       sum -= sharpen_getpixel(x - 1, 1);
-       sum -= sharpen_getpixel(x - 1, 2);
-       sum -= sharpen_getpixel(x + 1, 0);
-       sum -= sharpen_getpixel(x + 1, 1);
-       sum -= sharpen_getpixel(x + 1, 2);
-       sum -= sharpen_getpixel(x, 0);
-       sum -= sharpen_getpixel(x, 2);
-       return bound(0, sum * a, 1);
-}
-
-void sharpen_shift(float w)
-{
-       float i;
-       for(i = 0; i < w; ++i)
-       {
-               sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH_MAX];
-               sharpen_buffer[i + RADAR_WIDTH_MAX] = sharpen_buffer[i + 2 * RADAR_WIDTH_MAX];
-               sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
-       }
-}
-
-void sharpen_init(float w)
-{
-       float i;
-       for(i = 0; i < w; ++i)
-       {
-               sharpen_buffer[i] = 0;
-               sharpen_buffer[i + RADAR_WIDTH_MAX] = 0;
-               sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
-       }
-}
-
-entity radarmapper;
-void RadarMap_Next()
-{
-       if(radarmapper.count & 4)
-       {
-               localcmd("quit\n");
-       }
-       else if(radarmapper.count & 2)
-       {
-               localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(radarmapper.count), strcat(" --res ", ftos(radarmapper.size_x), " ", ftos(radarmapper.size_y), " --sharpen ", ftos(radarmapper.ltime), " --qual ", ftos(radarmapper.size_z)), "\"\n"));
-               GotoNextMap();
-       }
-       remove(radarmapper);
-       radarmapper = world;
-}
-
-// rough map entity
-//   cnt: current line
-//   size: pixel width/height
-//   maxs: cell width/height
-//   frame: counter
-void RadarMap_Think()
-{
-       float i, x, l;
-       string si;
-
-       if(self.frame == 0)
-       {
-               // initialize
-               get_mi_min_max_texcoords(1);
-               self.mins = mi_picmin;
-               self.maxs_x = (mi_picmax_x - mi_picmin_x) / self.size_x;
-               self.maxs_y = (mi_picmax_y - mi_picmin_y) / self.size_y;
-               self.maxs_z = mi_max_z - mi_min_z;
-               print("Picture mins/maxs: ", ftos(self.maxs_x), " and ", ftos(self.maxs_y), " should match\n");
-               self.netname = strzone(strcat("gfx/", mi_shortname, "_radar.xpm"));
-               if(!(self.count & 1))
-               {
-                       self.cnt = fopen(self.netname, FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.tga"), FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.png"), FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.jpg"), FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.tga"), FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.png"), FILE_READ);
-                       if(self.cnt < 0)
-                               self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.jpg"), FILE_READ);
-                       if(self.cnt >= 0)
-                       {
-                               fclose(self.cnt);
-
-                               print(self.netname, " already exists, aborting (you may want to specify --force)\n");
-                               RadarMap_Next();
-                               return;
-                       }
-               }
-               self.cnt = fopen(self.netname, FILE_WRITE);
-               if(self.cnt < 0)
-               {
-                       print("Error writing ", self.netname, "\n");
-                       remove(self);
-                       radarmapper = world;
-                       return;
-               }
-               print("Writing to ", self.netname, "...\n");
-               fputs(self.cnt, "/* XPM */\n");
-               fputs(self.cnt, "static char *RadarMap[] = {\n");
-               fputs(self.cnt, "/* columns rows colors chars-per-pixel */\n");
-               fputs(self.cnt, strcat("\"", ftos(self.size_x), " ", ftos(self.size_y), " 256 2\",\n"));
-               for(i = 0; i < 256; ++i)
-               {
-                       si = substring(doublehex, i*2, 2);
-                       fputs(self.cnt, strcat("\"", si, " c #", si, si, si, "\",\n"));
-               }
-               self.frame += 1;
-               self.nextthink = time;
-               sharpen_init(self.size_x);
-       }
-       else if(self.frame <= self.size_y)
-       {
-               // fill the sharpen buffer with this line
-               sharpen_shift(self.size_x);
-               i = self.count & 24;
-
-               switch(i)
-               {
-                       case 0:
-                       default:
-                               for(x = 0; x < self.size_x; ++x)
-                               {
-                                       l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
-                                       sharpen_set(x, l);
-                               }
-                               break;
-                       case 8:
-                               for(x = 0; x < self.size_x; ++x)
-                               {
-                                       l = RadarMapAtPoint_Trace(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
-                                       sharpen_set(x, l);
-                               }
-                               break;
-                       case 16:
-                               for(x = 0; x < self.size_x; ++x)
-                               {
-                                       l = RadarMapAtPoint_Sample(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
-                                       sharpen_set(x, l);
-                               }
-                               break;
-                       case 24:
-                               for(x = 0; x < self.size_x; ++x)
-                               {
-                                       l = RadarMapAtPoint_LineBlock(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
-                                       sharpen_set(x, l);
-                               }
-                               break;
-               }
-
-               // do we have enough lines?
-               if(self.frame >= 2)
-               {
-                       // write a pixel line
-                       fputs(self.cnt, "\"");
-                       for(x = 0; x < self.size_x; ++x)
-                       {
-                               l = sharpen_get(x, self.ltime);
-                               fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
-                       }
-                       if(self.frame == self.size_y)
-                               fputs(self.cnt, "\"\n");
-                       else
-                       {
-                               fputs(self.cnt, "\",\n");
-                               print(ftos(self.size_y - self.frame), " lines left\n");
-                       }
-               }
-
-               // is this the last line? then write back the missing line
-               if(self.frame == self.size_y)
-               {
-                       sharpen_shift(self.size_x);
-                       // write a pixel line
-                       fputs(self.cnt, "\"");
-                       for(x = 0; x < self.size_x; ++x)
-                       {
-                               l = sharpen_get(x, self.ltime);
-                               fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
-                       }
-                       if(self.frame == self.size_y)
-                               fputs(self.cnt, "\"\n");
-                       else
-                       {
-                               fputs(self.cnt, "\",\n");
-                               print(ftos(self.size_y - self.frame), " lines left\n");
-                       }
-               }
-
-               self.frame += 1;
-               self.nextthink = time;
-       }
-       else
-       {
-               // close the file
-               fputs(self.cnt, "}\n");
-               fclose(self.cnt);
-               print("Finished. Please edit data/", self.netname, " with an image editing application and place it in the TGA format in the gfx folder.\n");
-               RadarMap_Next();
-       }
-}
-
-void RadarMap(float argc)
-{
-       if(radarmapper)
-               return;
-       float i;
-       radarmapper = spawn();
-       radarmapper.classname = "radarmapper";
-       radarmapper.think = RadarMap_Think;
-       radarmapper.nextthink = time;
-       radarmapper.count = 8; // default to the --trace method, as it is faster now
-       radarmapper.ltime = 1;
-       radarmapper.size_x = 512;
-       radarmapper.size_y = 512;
-       radarmapper.size_z = 1;
-
-       for(i = 1; i < argc; ++i)
-       {
-               if(argv(i) == "--force")
-                       radarmapper.count |= 1;
-               else if(argv(i) == "--loop")
-                       radarmapper.count |= 2;
-               else if(argv(i) == "--quit")
-                       radarmapper.count |= 4;
-               else if(argv(i) == "--block")
-               {
-                       radarmapper.count &~= 24;
-               }
-               else if(argv(i) == "--trace")
-               {
-                       radarmapper.count &~= 24;
-                       radarmapper.count |= 8;
-               }
-               else if(argv(i) == "--sample")
-               {
-                       radarmapper.count &~= 24;
-                       radarmapper.count |= 16;
-               }
-               else if(argv(i) == "--lineblock")
-               {
-                       radarmapper.count |= 24;
-               }
-               else if(argv(i) == "--flags") // for the recursive call
-               {
-                       ++i;
-                       radarmapper.count = stof(argv(i));
-               }
-               else if(argv(i) == "--sharpen") // for the recursive call
-               {
-                       ++i;
-                       radarmapper.ltime = stof(argv(i));
-               }
-               else if(argv(i) == "--res") // resolution
-               {
-                       ++i;
-                       radarmapper.size_x = stof(argv(i));
-                       ++i;
-                       radarmapper.size_y = stof(argv(i));
-               }
-               else if(argv(i) == "--qual") // quality multiplier
-               {
-                       ++i;
-                       radarmapper.size_z = stof(argv(i));
-               }
-               else
-               {
-                       remove(radarmapper);
-                       radarmapper = world;
-                       print("Usage: sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample | --lineblock] [--sharpen N] [--res W H] [--qual Q]\n");
-                       print("The quality factor Q is roughly proportional to the time taken.\n");
-                       print("--trace supports no quality factor; its result should look like --block with infinite quality factor.\n");
-                       print("--block \n");
-                       return;
-               }
-       }
-
-       print("Radarmap entity spawned.\n");
-}
-
-void BBox()
-{
-       print("Original size: ", ftos(world.absmin_x), " ", ftos(world.absmin_y), " ", ftos(world.absmin_z));
-       print(" ", ftos(world.absmax_x), " ", ftos(world.absmax_y), " ", ftos(world.absmax_z), "\n");
-       print("Currently set size: ", ftos(world.mins_x), " ", ftos(world.mins_y), " ", ftos(world.mins_z));
-       print(" ", ftos(world.maxs_x), " ", ftos(world.maxs_y), " ", ftos(world.maxs_z), "\n");
-       print("Solid bounding box size:");
-
-       tracebox('1 0 0' * world.absmin_x,
-                '0 1 0' * world.absmin_y + '0 0 1' * world.absmin_z,
-                '0 1 0' * world.absmax_y + '0 0 1' * world.absmax_z,
-                '1 0 0' * world.absmax_x,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmin_x));
-       else
-               print(" ", ftos(trace_endpos_x));
-
-       tracebox('0 1 0' * world.absmin_y,
-                '1 0 0' * world.absmin_x + '0 0 1' * world.absmin_z,
-                '1 0 0' * world.absmax_x + '0 0 1' * world.absmax_z,
-                '0 1 0' * world.absmax_y,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmin_y));
-       else
-               print(" ", ftos(trace_endpos_y));
-
-       tracebox('0 0 1' * world.absmin_z,
-                '1 0 0' * world.absmin_x + '0 1 0' * world.absmin_y,
-                '1 0 0' * world.absmax_x + '0 1 0' * world.absmax_y,
-                '0 0 1' * world.absmax_z,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmin_z));
-       else
-               print(" ", ftos(trace_endpos_z));
-
-       tracebox('1 0 0' * world.absmax_x,
-                '0 1 0' * world.absmin_y + '0 0 1' * world.absmin_z,
-                '0 1 0' * world.absmax_y + '0 0 1' * world.absmax_z,
-                '1 0 0' * world.absmin_x,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmax_x));
-       else
-               print(" ", ftos(trace_endpos_x));
-
-       tracebox('0 1 0' * world.absmax_y,
-                '1 0 0' * world.absmin_x + '0 0 1' * world.absmin_z,
-                '1 0 0' * world.absmax_x + '0 0 1' * world.absmax_z,
-                '0 1 0' * world.absmin_y,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmax_y));
-       else
-               print(" ", ftos(trace_endpos_y));
-
-       tracebox('0 0 1' * world.absmax_z,
-                '1 0 0' * world.absmin_x + '0 1 0' * world.absmin_y,
-                '1 0 0' * world.absmax_x + '0 1 0' * world.absmax_y,
-                '0 0 1' * world.absmin_z,
-                        MOVE_WORLDONLY,
-                        world);
-       if(trace_startsolid)
-               print(" ", ftos(world.absmax_z));
-       else
-               print(" ", ftos(trace_endpos_z));
-
-       print("\n");
-}
-
-void EffectIndexDump()
-{
-       float d;
-       float fh;
-       string s;
-
-       d = db_create();
-
-       print("begin of effects list\n");
-       db_put(d, "TE_GUNSHOT", "1"); print("effect TE_GUNSHOT is ", ftos(particleeffectnum("TE_GUNSHOT")), "\n");
-       db_put(d, "TE_GUNSHOTQUAD", "1"); print("effect TE_GUNSHOTQUAD is ", ftos(particleeffectnum("TE_GUNSHOTQUAD")), "\n");
-       db_put(d, "TE_SPIKE", "1"); print("effect TE_SPIKE is ", ftos(particleeffectnum("TE_SPIKE")), "\n");
-       db_put(d, "TE_SPIKEQUAD", "1"); print("effect TE_SPIKEQUAD is ", ftos(particleeffectnum("TE_SPIKEQUAD")), "\n");
-       db_put(d, "TE_SUPERSPIKE", "1"); print("effect TE_SUPERSPIKE is ", ftos(particleeffectnum("TE_SUPERSPIKE")), "\n");
-       db_put(d, "TE_SUPERSPIKEQUAD", "1"); print("effect TE_SUPERSPIKEQUAD is ", ftos(particleeffectnum("TE_SUPERSPIKEQUAD")), "\n");
-       db_put(d, "TE_WIZSPIKE", "1"); print("effect TE_WIZSPIKE is ", ftos(particleeffectnum("TE_WIZSPIKE")), "\n");
-       db_put(d, "TE_KNIGHTSPIKE", "1"); print("effect TE_KNIGHTSPIKE is ", ftos(particleeffectnum("TE_KNIGHTSPIKE")), "\n");
-       db_put(d, "TE_EXPLOSION", "1"); print("effect TE_EXPLOSION is ", ftos(particleeffectnum("TE_EXPLOSION")), "\n");
-       db_put(d, "TE_EXPLOSIONQUAD", "1"); print("effect TE_EXPLOSIONQUAD is ", ftos(particleeffectnum("TE_EXPLOSIONQUAD")), "\n");
-       db_put(d, "TE_TAREXPLOSION", "1"); print("effect TE_TAREXPLOSION is ", ftos(particleeffectnum("TE_TAREXPLOSION")), "\n");
-       db_put(d, "TE_TELEPORT", "1"); print("effect TE_TELEPORT is ", ftos(particleeffectnum("TE_TELEPORT")), "\n");
-       db_put(d, "TE_LAVASPLASH", "1"); print("effect TE_LAVASPLASH is ", ftos(particleeffectnum("TE_LAVASPLASH")), "\n");
-       db_put(d, "TE_SMALLFLASH", "1"); print("effect TE_SMALLFLASH is ", ftos(particleeffectnum("TE_SMALLFLASH")), "\n");
-       db_put(d, "TE_FLAMEJET", "1"); print("effect TE_FLAMEJET is ", ftos(particleeffectnum("TE_FLAMEJET")), "\n");
-       db_put(d, "EF_FLAME", "1"); print("effect EF_FLAME is ", ftos(particleeffectnum("EF_FLAME")), "\n");
-       db_put(d, "TE_BLOOD", "1"); print("effect TE_BLOOD is ", ftos(particleeffectnum("TE_BLOOD")), "\n");
-       db_put(d, "TE_SPARK", "1"); print("effect TE_SPARK is ", ftos(particleeffectnum("TE_SPARK")), "\n");
-       db_put(d, "TE_PLASMABURN", "1"); print("effect TE_PLASMABURN is ", ftos(particleeffectnum("TE_PLASMABURN")), "\n");
-       db_put(d, "TE_TEI_G3", "1"); print("effect TE_TEI_G3 is ", ftos(particleeffectnum("TE_TEI_G3")), "\n");
-       db_put(d, "TE_TEI_SMOKE", "1"); print("effect TE_TEI_SMOKE is ", ftos(particleeffectnum("TE_TEI_SMOKE")), "\n");
-       db_put(d, "TE_TEI_BIGEXPLOSION", "1"); print("effect TE_TEI_BIGEXPLOSION is ", ftos(particleeffectnum("TE_TEI_BIGEXPLOSION")), "\n");
-       db_put(d, "TE_TEI_PLASMAHIT", "1"); print("effect TE_TEI_PLASMAHIT is ", ftos(particleeffectnum("TE_TEI_PLASMAHIT")), "\n");
-       db_put(d, "EF_STARDUST", "1"); print("effect EF_STARDUST is ", ftos(particleeffectnum("EF_STARDUST")), "\n");
-       db_put(d, "TR_ROCKET", "1"); print("effect TR_ROCKET is ", ftos(particleeffectnum("TR_ROCKET")), "\n");
-       db_put(d, "TR_GRENADE", "1"); print("effect TR_GRENADE is ", ftos(particleeffectnum("TR_GRENADE")), "\n");
-       db_put(d, "TR_BLOOD", "1"); print("effect TR_BLOOD is ", ftos(particleeffectnum("TR_BLOOD")), "\n");
-       db_put(d, "TR_WIZSPIKE", "1"); print("effect TR_WIZSPIKE is ", ftos(particleeffectnum("TR_WIZSPIKE")), "\n");
-       db_put(d, "TR_SLIGHTBLOOD", "1"); print("effect TR_SLIGHTBLOOD is ", ftos(particleeffectnum("TR_SLIGHTBLOOD")), "\n");
-       db_put(d, "TR_KNIGHTSPIKE", "1"); print("effect TR_KNIGHTSPIKE is ", ftos(particleeffectnum("TR_KNIGHTSPIKE")), "\n");
-       db_put(d, "TR_VORESPIKE", "1"); print("effect TR_VORESPIKE is ", ftos(particleeffectnum("TR_VORESPIKE")), "\n");
-       db_put(d, "TR_NEHAHRASMOKE", "1"); print("effect TR_NEHAHRASMOKE is ", ftos(particleeffectnum("TR_NEHAHRASMOKE")), "\n");
-       db_put(d, "TR_NEXUIZPLASMA", "1"); print("effect TR_NEXUIZPLASMA is ", ftos(particleeffectnum("TR_NEXUIZPLASMA")), "\n");
-       db_put(d, "TR_GLOWTRAIL", "1"); print("effect TR_GLOWTRAIL is ", ftos(particleeffectnum("TR_GLOWTRAIL")), "\n");
-       db_put(d, "TR_SEEKER", "1"); print("effect TR_SEEKER is ", ftos(particleeffectnum("TR_SEEKER")), "\n");
-       db_put(d, "SVC_PARTICLE", "1"); print("effect SVC_PARTICLE is ", ftos(particleeffectnum("SVC_PARTICLE")), "\n");
-
-       fh = fopen("effectinfo.txt", FILE_READ);
-       while((s = fgets(fh)))
-       {
-               tokenize_console(s);
-               if(argv(0) == "effect")
-               {
-                       if(db_get(d, argv(1)) != "1")
-                       {
-                               if(particleeffectnum(argv(1)) >= 0)
-                                       print("effect ", argv(1), " is ", ftos(particleeffectnum(argv(1))), "\n");
-                               db_put(d, argv(1), "1");
-                       }
-               }
-       }
-       print("end of effects list\n");
-
-       db_close(d);
-}
-
-void make_mapinfo_Think()
-{
-       if(MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
-       {
-               print("Done rebuiling mapinfos.\n");
-               MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-               remove(self);
-       }
-       else
-       {
-               self.think = make_mapinfo_Think;
-               self.nextthink = time;
-       }
-}
-
-void changematchtime(float delta, float mi, float ma)
-{
-       float cur;
-       float new;
-       float lim;
-
-       if(delta == 0)
-               return;
-       if(autocvar_timelimit < 0)
-               return;
-
-       if(mi <= 10)
-               mi = 10; // at least ten sec in the future
-       cur = time - game_starttime;
-       if(cur > 0)
-               mi += cur; // from current time!
-
-       lim = autocvar_timelimit * 60;
-
-       if(delta > 0)
-       {
-               if(lim == 0)
-                       return; // cannot increase any further
-               else if(lim < ma)
-                       new = min(ma, lim + delta);
-               else // already above maximum: FAIL
-                       return;
-       }
-       else
-       {
-               if(lim == 0) // infinite: try reducing to max, if we are allowed to
-                       new = max(mi, ma);
-               else if(lim > mi) // above minimum: decrease
-                       new = max(mi, lim + delta);
-               else // already below minimum: FAIL
-                       return;
-       }
-
-       cvar_set("timelimit", ftos(new / 60));
-}
-
-float g_clientmodel_genericsendentity (entity to, float sf);
-void modelbug_make_svqc();
-void modelbug_make_csqc()
-{
-       Net_LinkEntity(self, TRUE, 0, g_clientmodel_genericsendentity);
-       self.think = modelbug_make_svqc;
-       self.nextthink = time + 1;
-       setorigin(self, self.origin - '0 0 8');
-}
-void modelbug_make_svqc()
-{
-       self.SendEntity = func_null;
-       self.think = modelbug_make_csqc;
-       self.nextthink = time + 1;
-       setorigin(self, self.origin + '0 0 8');
-}
-
-void modelbug()
-{
-       entity e;
-       e = spawn();
-       setorigin(e, nextent(world).origin);
-       precache_model("models/portal.md3");
-       setmodel(e, "models/portal.md3");
-       e.think = modelbug_make_svqc;
-       e.nextthink = time + 1;
-}
-
-void GameCommand(string command)
-{
-       float argc;
-       entity client, e;
-       vector v;
-       float entno, i, n;
-       string s;
-       argc = tokenize_console(command);
-
-       if(argv(0) == "help" || argc == 0)
-       {
-               print("Usage: sv_cmd COMMAND..., where possible commands are:\n");
-               print("  adminmsg clientnumber \"message\" [infobartime]\n");
-               print("  teamstatus\n");
-               print("  printstats\n");
-               print("  make_mapinfo\n");
-               print("  gametype dm|ctf|...\n");
-               print("  savedb filename\n");
-               print("  dumpdb filename\n");
-               print("  loaddb filename\n");
-               print("  allready\n");
-               print("  effectindexdump\n");
-               print("  radarmap [--force] [--quit | --loop] [sharpness]\n");
-               print("  bbox\n");
-               print("  cvar_changes\n");
-               print("  cvar_purechanges\n");
-               print("  find classname\n");
-               print("  extendmatchtime\n");
-               print("  reducematchtime\n");
-               print("  warp [level]\n");
-               GameCommand_Vote("help", world);
-               GameCommand_Ban("help");
-               GameCommand_Generic("help");
-               return;
-       }
-
-       if(GameCommand_Vote(command, world))
-               return;
-
-       if(GameCommand_Ban(command))
-               return;
-
-       if(GameCommand_Generic(command))
-               return;
-
-       if(argv(0) == "printstats")
-       {
-               DumpStats(FALSE);
-               return;
-       }
-
-       if(argv(0) == "make_mapinfo")
-       {
-               e = spawn();
-               e.classname = "make_mapinfo";
-               e.think = make_mapinfo_Think;
-               e.nextthink = time;
-               MapInfo_Enumerate();
-               return;
-       }
-
-       if(argv(0) == "gotomap") if(argc == 2)
-       {
-               print(GotoMap(argv(1)), "\n");
-               return;
-       }
-
-       if(argv(0) == "gametype") if(argc == 2)
-       {
-               float t, tsave;
-               s = argv(1);
-               t = MapInfo_Type_FromString(s);
-               tsave = MapInfo_CurrentGametype();
-               if(t)
-               {
-                       MapInfo_SwitchGameType(t);
-                       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-                       if(MapInfo_count > 0)
-                       {
-                               bprint("Game type successfully switched to ", s, "\n");
-                       }
-                       else
-                       {
-                               bprint("Cannot use this game type: no map for it found\n");
-                               MapInfo_SwitchGameType(tsave);
-                               MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-                       }
-               }
-               else
-                       bprint("Game type switch to ", s, " failed: this type does not exist!\n");
-               return;
-       }
-
-       if(argv(0) == "adminmsg")
-       if(argc >= 3 && argc <= 4)
-       {
-               entno = stof(argv(1));
-
-               if((entno < 0) | (entno > maxclients)) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-
-               n = 0;
-               for(i = (entno ? entno : 1); i <= (entno ? entno : maxclients); ++i)
-               {
-                       client = edict_num(i);
-                       if(client.flags & FL_CLIENT)
-                       {
-                               if(argc == 4)
-                               {
-                                       s = argv(2);
-                                       s = strreplace("\n", "", s);
-                                       s = strreplace("\\", "\\\\", s);
-                                       s = strreplace("$", "$$", s);
-                                       s = strreplace("\"", "\\\"", s);
-                                       stuffcmd(client, sprintf("\ninfobar %f \"%s\"\n", stof(argv(3)), s));
-                               }
-                               else
-                               {
-                                       centerprint(client, strcat("^3", admin_name(), ":\n\n^7", argv(2)));
-                                       sprint(client, strcat("\{1}\{13}^3", admin_name(), "^7: ", argv(2), "\n"));
-                               }
-                               print("Message sent to ", client.netname, "\n");
-                               ++n;
-                       }
-               }
-               if(!n)
-                       print("Client not found\n");
-
-               return;
-       }
-
-       if(argv(0) == "savedb") if(argc == 2)
-       {
-               db_save(ServerProgsDB, argv(1));
-               print("DB saved.\n");
-               return;
-       }
-
-       if(argv(0) == "dumpdb") if(argc == 2)
-       {
-               db_dump(ServerProgsDB, argv(1));
-               print("DB dumped.\n");
-               return;
-       }
-
-       if(argv(0) == "loaddb") if(argc == 2)
-       {
-               db_close(ServerProgsDB);
-               ServerProgsDB = db_load(argv(1));
-               print("DB loaded.\n");
-               return;
-       }
-
-       if (argv(0) == "nospectators")
-       {
-               blockSpectators = 1;
-               entity plr;
-               FOR_EACH_CLIENT(plr) //give every spectator <g_maxplayers_spectator_blocktime> seconds time to become a player
-               {
-                       if(plr.classname == "spectator" || plr.classname == "observer")
-                       {
-                               plr.spectatortime = time;
-                               sprint(plr, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
-                       }
-               }
-               bprint(strcat("^7All spectators will be automatically kicked when not joining the game after ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds!\n"));
-               return;
-       }
-
-       if (argv(0) == "lockteams")
-       {
-               if(teamplay)
-               {
-                       lockteams = 1;
-                       bprint("^1The teams are now locked.\n");
-               }
-               else
-                       bprint("That command can only be used in a team-based gamemode.\n");
-               return;
-       }
-
-       if (argv(0) == "unlockteams")
-       {
-               if(teamplay)
-               {
-                       lockteams = 0;
-                       bprint("^1The teams are now unlocked.\n");
-               }
-               else
-                       bprint("That command can only be used in a team-based gamemode.\n");
-               return;
-       }
-       if(argv(0) == "movetoteam") if(argc == 3 || argc == 4) {
-               //      sv_cmd movetoteam  player_id  team_colour
-               //      sv_cmd movetoteam  player_id  team_colour  type_of_move
-
-               //      type of move
-               //      0 (00) automove centerprint, admin message
-               //      1 (01) automove centerprint, no admin message
-               //      2 (10) no centerprint, admin message
-               //      3 (11) no centerprint, no admin message
-
-               if(!teamplay) {  // death match
-                       print("Currently not playing a team game\n");
-                       return;
-               }
-
-               entno = stof(argv(1));
-
-               // player_id is out of range
-               if((entno < 1) | (entno > maxclients)) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-
-               client = edict_num(entno);
-
-               // player entity is not a client
-               if not(client.flags & FL_CLIENT) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-
-               // find the team to move the player to
-               float team_colour;
-               float save;
-
-               save = client.team_forced;
-               client.team_forced = 0;
-
-               team_colour = ColourToNumber(argv(2));
-
-               if(team_colour == client.team) {  // player already on the team
-                       print("Player ", argv(1), " (", client.netname, ") is already on the ", ColoredTeamName(client.team), "\n");
-                       // keep the forcing undone
-                       return;
-               } else if(team_colour == 0)  // auto team
-                       team_colour = NumberToTeamNumber(FindSmallestTeam(client, FALSE));
-               else
-                       CheckAllowedTeams(client);
-
-               client.team_forced = save;
-
-               switch(team_colour) {
-                       case COLOR_TEAM1:
-                               if(c1 == -1) {
-                                       print("Sorry, there isn't a red team\n");
-                                       return;
-                               }
-                               break;
-
-                       case COLOR_TEAM2:
-                               if(c2 == -1) {
-                                       print("Sorry, there isn't a blue team\n");
-                                       return;
-                               }
-                               break;
-
-                       case COLOR_TEAM3:
-                               if(c3 == -1) {
-                                       print("Sorry, there isn't a yellow team\n");
-                                       return;
-                               }
-                               break;
-
-                       case COLOR_TEAM4:
-                               if(c4 == -1) {
-                                       print("Sorry, there isn't a pink team\n");
-                                       return;
-                               }
-                               break;
-
-                       default:
-                               print("Sorry, team ", argv(2), " doesn't exist\n");
-                               return;
-               }
-               print("Player ", argv(1), " (", client.netname, ") has been moved to the ", ColoredTeamName(team_colour), "\n");
-
-               client.team_forced = 0;
-               MoveToTeam(client, team_colour, 6, stof(argv(3)));
-
-               return;
-       }
-       if (argv(0) == "teamstatus")
-       {
-               Score_NicePrint(world);
-               return;
-       }
-       if (argv(0) == "allready")
-       {
-               ReadyRestart();
-               return;
-       }
-       if (argv(0) == "effectindexdump")
-       {
-               EffectIndexDump();
-               return;
-       }
-       if (argv(0) == "radarmap")
-       {
-               RadarMap(argc);
-               return;
-       }
-       if (argv(0) == "bbox")
-       {
-               BBox();
-               return;
-       }
-       if (argv(0) == "cvar_changes")
-       {
-               print(cvar_changes);
-               return;
-       }
-       if (argv(0) == "cvar_purechanges")
-       {
-               print(cvar_purechanges);
-               return;
-       }
-       if (argv(0) == "find") if(argc == 2)
-       {
-               for(client = world; (client = find(client, classname, argv(1))); )
-                       print(etos(client), "\n");
-               return;
-       }
-       if (argv(0) == "records")
-       {
-               for (i = 0; i < 10; ++i)
-                       print(records_reply[i]);
-               return;
-       }
-       if (argv(0) == "ladder")
-       {
-               print(ladder_reply);
-               return;
-       }
-       if (argv(0) == "rankings")
-       {
-               strunzone(rankings_reply);
-               rankings_reply = strzone(getrankings());
-               print(rankings_reply);
-               return;
-       }
-
-       if(argv(0) == "cointoss")
-       {
-               bprint("^3Throwing coin... Result: ");
-               if (random() > 0.5)
-                       bprint("^1heads ^3!\n");
-               else
-                       bprint("^1tails ^3!\n");
-               return;
-       }
-
-       if(argv(0) == "__FORCE_READY_RESTART")
-       {
-               reset_map(FALSE);
-               return;
-       }
-
-       if(argv(0) == "debug_shotorg")
-       {
-               debug_shotorg = stov(argv(1));
-               debug_shotorg_y = -debug_shotorg_y;
-               return;
-       }
-
-       if(argv(0) == "gettaginfo") if(argc >= 4)
-       {
-               e = spawn();
-               if(argv(1) == "w")
-                       setmodel(e, (nextent(world)).weaponentity.model);
-               else
-               {
-                       precache_model(argv(1));
-                       setmodel(e, argv(1));
-               }
-               e.frame = stof(argv(2));
-               if(substring(argv(3), 0, 1) == "#")
-                       i = stof(substring(argv(3), 1, -1));
-               else
-                       i = gettagindex(e, argv(3));
-               if(i)
-               {
-                       v = gettaginfo(e, i);
-                       print("model ", e.model, " frame ", ftos(e.frame), " tag ", gettaginfo_name);
-                       print(" index ", ftos(i), " parent ", ftos(gettaginfo_parent), "\n");
-                       print(" vector = ", ftos(v_x), " ", ftos(v_y), " ", ftos(v_z), "\n");
-                       print(" offset = ", ftos(gettaginfo_offset_x), " ", ftos(gettaginfo_offset_y), " ", ftos(gettaginfo_offset_z), "\n");
-                       print(" forward = ", ftos(gettaginfo_forward_x), " ", ftos(gettaginfo_forward_y), " ", ftos(gettaginfo_forward_z), "\n");
-                       print(" right = ", ftos(gettaginfo_right_x), " ", ftos(gettaginfo_right_y), " ", ftos(gettaginfo_right_z), "\n");
-                       print(" up = ", ftos(gettaginfo_up_x), " ", ftos(gettaginfo_up_y), " ", ftos(gettaginfo_up_z), "\n");
-                       if(argc >= 6)
-                       {
-                               v_y = -v_y;
-                               localcmd(strcat(argv(4), vtos(v), argv(5), "\n"));
-                       }
-               }
-               else
-                       print("bone not found\n");
-               remove(e);
-               return;
-       }
-
-       if(argv(0) == "time")
-       {
-               print("time = ", ftos(time), "\n");
-               print("frame start = ", ftos(gettime(GETTIME_FRAMESTART)), "\n");
-               print("realtime = ", ftos(gettime(GETTIME_REALTIME)), "\n");
-               print("hires = ", ftos(gettime(GETTIME_HIRES)), "\n");
-               print("uptime = ", ftos(gettime(GETTIME_UPTIME)), "\n");
-               print("localtime = ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n");
-               print("gmtime = ", strftime(FALSE, "%a %b %e %H:%M:%S %Z %Y"), "\n");
-               return;
-       }
-
-       if(argv(0) == "tracebug")
-       {
-               print("TEST CASE. If this returns the runaway loop counter error, possibly everything is oaky.\n");
-               for(;;)
-               {
-                       vector org, delta, start, end, p, q, q0, pos;
-                       float safe, unsafe, dq, dqf;
-
-                       org = world.mins;
-                       delta = world.maxs - world.mins;
-
-                       start_x = org_x + random() * delta_x;
-                       start_y = org_y + random() * delta_y;
-                       start_z = org_z + random() * delta_z;
-
-                       end_x = org_x + random() * delta_x;
-                       end_y = org_y + random() * delta_y;
-                       end_z = org_z + random() * delta_z;
-
-                       start = stov(vtos(start));
-                       end = stov(vtos(end));
-
-                       tracebox(start, PL_MIN, PL_MAX, end, MOVE_NOMONSTERS, world);
-                       if(!trace_startsolid)
-                       {
-                               p = trace_endpos;
-                               tracebox(p, PL_MIN, PL_MAX, p, MOVE_NOMONSTERS, world);
-                               if(trace_startsolid || trace_fraction == 1)
-                               {
-                                       rint(42); // do an engine breakpoint on VM_rint so you can get the trace that errnoeously returns startsolid
-                                       tracebox(start, PL_MIN, PL_MAX, end, MOVE_NOMONSTERS, world);
-                                       tracebox(p, PL_MIN, PL_MAX, q, MOVE_NOMONSTERS, world);
-
-                                       if(trace_startsolid)
-                                       {
-                                               // how much do we need to back off?
-                                               safe = 1;
-                                               unsafe = 0;
-                                               for(;;)
-                                               {
-                                                       pos = p * (1 - (safe + unsafe) * 0.5) + start * ((safe + unsafe) * 0.5);
-                                                       tracebox(pos, PL_MIN, PL_MAX, pos, MOVE_NOMONSTERS, world);
-                                                       if(trace_startsolid)
-                                                       {
-                                                               if((safe + unsafe) * 0.5 == unsafe)
-                                                                       break;
-                                                               unsafe = (safe + unsafe) * 0.5;
-                                                       }
-                                                       else
-                                                       {
-                                                               if((safe + unsafe) * 0.5 == safe)
-                                                                       break;
-                                                               safe = (safe + unsafe) * 0.5;
-                                                       }
-                                               }
-
-                                               print("safe distance to back off: ", ftos(safe * vlen(p - start)), "qu\n");
-                                               print("unsafe distance to back off: ", ftos(unsafe * vlen(p - start)), "qu\n");
-
-                                               tracebox(p, PL_MIN + '0.1 0.1 0.1', PL_MAX - '0.1 0.1 0.1', p, MOVE_NOMONSTERS, world);
-                                               if(trace_startsolid)
-                                                       print("trace_endpos much in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
-                                               else
-                                                       print("trace_endpos just in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
-                                               break;
-                                       }
-
-                                       q0 = p;
-                                       dq = 0;
-                                       dqf = 1;
-                                       for(;;)
-                                       {
-                                               q = p + normalize(end - p) * (dq + dqf);
-                                               if(q == q0)
-                                                       break;
-                                               tracebox(p, PL_MIN, PL_MAX, q, MOVE_NOMONSTERS, world);
-                                               if(trace_startsolid)
-                                                       error("THIS ONE cannot happen");
-                                               if(trace_fraction > 0)
-                                                       dq += dqf * trace_fraction;
-                                               dqf *= 0.5;
-                                               q0 = q;
-                                       }
-                                       if(dq > 0)
-                                       {
-                                               print("trace_endpos still before solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(p), "\n");
-                                               print("could go ", ftos(dq), " units further to ", vtos(q), "\n");
-                                               break;
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if(argv(0) == "tracebug2")
-       {
-               e = nextent(world);
-               float f;
-               vector vv, dv;
-               tracebox(e.origin + '0 0 32', e.mins, e.maxs, e.origin + '0 0 -1024', MOVE_NORMAL, e);
-               vv = trace_endpos;
-               if(trace_fraction == 1)
-               {
-                       print("not above ground, aborting\n");
-                       return;
-               }
-               f = 0;
-               for(i = 0; i < 100000; ++i)
-               {
-                       dv = randomvec();
-                       if(dv_z > 0)
-                               dv = -1 * dv;
-                       tracebox(vv, e.mins, e.maxs, vv + dv, MOVE_NORMAL, e);
-                       if(trace_startsolid)
-                               print("bug 1\n");
-                       if(trace_fraction == 1)
-                       if(dv_z < f)
-                       {
-                               print("bug 2: ", ftos(dv_x), " ", ftos(dv_y), " ", ftos(dv_z));
-                               print(" (", ftos(asin(dv_z / vlen(dv)) * 180 / M_PI), " degrees)\n");
-                               f = dv_z;
-                       }
-               }
-               print("highest possible dist: ", ftos(f), "\n");
-               return;
-       }
-
-       if(argv(0) == "tracewalk")
-       {
-               e = nextent(world);
-               if(tracewalk(e, stov(argv(1)), e.mins, e.maxs, stov(argv(2)), MOVE_NORMAL))
-                       print("can walk\n");
-               else
-                       print("cannot walk\n");
-               return;
-       }
-
-       if(argv(0) == "onslaught_updatelinks")
-       {
-               onslaught_updatelinks();
-               print("ONS links updated\n");
-               return;
-       }
-
-       if(argv(0) == "bot_cmd")
-       {
-               entity bot;
-
-               if(argv(1) == "help")
-               {
-                       if(argc==2)
-                       {
-                               bot_list_commands();
-                               print("\nsv_cmd bot_cmd reset          #Clear the cmd queues of all bots\n");
-                               print("sv_cmd bot_cmd load <file>    #Load script file\n");
-                               print("\nUse sv_cmd bot_cmd help <command> for more\n\n");
-                               return;
-                       }
-
-                       bot_cmdhelp(argv(2));
-                       return;
-               }
-
-               // Clear all bot queues
-               if(argv(1) == "reset")
-               {
-                       bot_resetqueues();
-                       return;
-               }
-
-               // set bot count
-               if(argv(1) == "setbots")
-               {
-                       if(argc >= 3 && argv(1) == "setbots")
-                       {
-                               cvar_settemp("minplayers", "0");
-                               cvar_settemp("bot_number", argv(2));
-                               bot_fixcount();
-                       }
-               }
-
-               // Load cmds from file
-               if(argv(1) == "load" && argc == 3)
-               {
-                       float fh;
-                       fh = fopen(argv(2), FILE_READ);
-                       if(fh < 0)
-                       {
-                               print("cannot open the file\n");
-                               return;
-                       }
-
-                       i = 0;
-                       while((s = fgets(fh)))
-                       {
-                               argc = tokenize_console(s);
-
-                               if(argc >= 3 && argv(0) == "sv_cmd" && argv(1) == "bot_cmd")
-                               {
-                                       if(argv(2) == "reset")
-                                       {
-                                               bot_resetqueues();
-                                       }
-                                       else if(argv(2) == "setbots")
-                                       {
-                                               cvar_settemp("minplayers", "0");
-                                               cvar_settemp("bot_number", argv(3));
-                                               if(!bot_fixcount())
-                                                       print("Sorry, could not set requested bot count\n");
-                                       }
-                                       else
-                                       {
-                                               // let's start at token 2 so we can skip sv_cmd bot_cmd
-                                               bot = find_bot_by_number(stof(argv(2)));
-                                               if(bot == world)
-                                                       bot = find_bot_by_name(argv(2));
-                                               if(bot)
-                                                       bot_queuecommand(bot, strcat(argv(3), " ", argv(4)));
-                                       }
-                               }
-                               else
-                                       localcmd(strcat(s, "\n"));
-
-                               ++i;
-                       }
-
-                       print(ftos(i), " commands read\n");
-
-                       fclose(fh);
-
-                       return;
-               }
-
-               if(argc < 3)
-               {
-                       print("Usage: sv_cmd bot_cmd <bot name or number> <command> [argument]\n");
-                       print("Examples: bot_cmd <id> cc \"say something\"\n");
-                       print("          bot_cmd <id> presskey jump\n");
-                       print("          .. or sv_cmd bot_cmd help <command> for more\n");
-                       return;
-               }
-
-               bot = find_bot_by_number(stof(argv(1)));
-               if(bot == world)
-                       bot = find_bot_by_name(argv(1));
-
-               if(bot)
-                       bot_queuecommand(bot, strcat(argv(2), " ", argv(3)));
-               else
-                       print(strcat("Error: Unable to find a bot with the name or number '",argv(1),"'\n"));
-
-               return;
-       }
-
-       if(argv(0) == "playerdemo")
-       {
-               if(argv(1) == "read")
-               {
-                       entno = stof(argv(2));
-                       if((entno < 1) | (entno > maxclients)) {
-                               print("Player ", argv(2), " doesn't exist\n");
-                               return;
-                       }
-                       client = edict_num(entno);
-                       if(clienttype(client) != CLIENTTYPE_BOT) {
-                               print("Player ", client.netname, " is not a bot\n");
-                               return;
-                       }
-                       self = client;
-                       playerdemo_open_read(argv(3));
-                       return;
-               }
-               else if(argv(1) == "write")
-               {
-                       entno = stof(argv(2));
-                       if((entno < 1) | (entno > maxclients)) {
-                               print("Player ", argv(2), " doesn't exist\n");
-                               return;
-                       }
-                       client = edict_num(entno);
-                       self = client;
-                       playerdemo_open_write(argv(3));
-                       return;
-               }
-               else if(argv(1) == "auto_read_and_write")
-               {
-                       s = argv(2);
-                       n = stof(argv(3));
-                       cvar_set("bot_number", ftos(n));
-                       localcmd("wait; wait; wait\n");
-                       for(i = 0; i < n; ++i)
-                               localcmd("sv_cmd playerdemo read ", ftos(i+2), " ", s, ftos(i+1), "\n");
-                       localcmd("sv_cmd playerdemo write 1 ", ftos(n+1), "\n");
-                       return;
-               }
-               else if(argv(1) == "auto_read")
-               {
-                       s = argv(2);
-                       n = stof(argv(3));
-                       cvar_set("bot_number", ftos(n));
-                       localcmd("wait; wait; wait\n");
-                       for(i = 0; i < n; ++i)
-                               localcmd("sv_cmd playerdemo read ", ftos(i+2), " ", s, ftos(i+1), "\n");
-                       return;
-               }
-       }
-
-       if(argv(0) == "anticheat")
-       {
-               entno = stof(argv(1));
-               if((entno < 1) | (entno > maxclients)) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-               client = edict_num(entno);
-               if(clienttype(client) != CLIENTTYPE_REAL && clienttype(client) != CLIENTTYPE_BOT) {
-                       print("Player ", client.netname, " is not active\n");
-                       return;
-               }
-               self = client;
-               anticheat_report();
-               return;
-       }
-
-       if(argv(0) == "defer_clear")
-       if(argc == 2)
-       {
-               entno = stof(argv(1));
-
-               // player_id is out of range
-               if((entno < 1) | (entno > maxclients)) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-
-               client = edict_num(entno);
-
-               if not(client.flags & FL_CLIENT) {
-                       print("Player ", argv(1), " doesn't exist\n");
-                       return;
-               }
-
-               if(clienttype(client) == CLIENTTYPE_BOT) {
-                       print("Player ", argv(1), " (", client.netname, ") is a bot\n");
-                       return;
-               }
-
-               stuffcmd(client, "defer clear\n");
-               print("defer clear stuffed to ", argv(1), " (", client.netname, ")\n");
-               return;
-       }
-
-       if(argv(0) == "defer_clear_all")
-       {
-               FOR_EACH_CLIENTSLOT(client)
-                       GameCommand(strcat("defer_clear ", ftos(num_for_edict(client))));       
-
-               return;
-       }
-       if(argv(0) == "delrec")
-       {
-               if(argv(2) != "")
-                       race_deleteTime(argv(2), stof(argv(1)));
-               else
-                       race_deleteTime(GetMapname(), stof(argv(1)));
-
-               return;
-       }
-
-       if(argv(0) == "showtraceline")
-       {
-               vector src, dst;
-               src = stov(argv(1));
-               dst = stov(argv(2));
-               traceline(src, dst, MOVE_NORMAL, world);
-               trailparticles(world, particleeffectnum("TR_NEXUIZPLASMA"), src, trace_endpos);
-               trailparticles(world, particleeffectnum("TR_CRYLINKPLASMA"), trace_endpos, dst);
-               return;
-       }
-
-       if(argv(0) == "extendmatchtime")
-       {
-               changematchtime(autocvar_timelimit_increment* 60, autocvar_timelimit_min*60, autocvar_timelimit_max*60);
-               return;
-       }
-
-       if(argv(0) == "reducematchtime")
-       {
-               changematchtime(autocvar_timelimit_decrement*-60, autocvar_timelimit_min*60, autocvar_timelimit_max*60);
-               return;
-       }
-
-       if(argv(0) == "modelbug")
-       {
-               modelbug();
-               return;
-       }
-
-       if(argv(0) == "warp")
-       {
-               if(autocvar_g_campaign)
-               {
-                       if(argc >= 2)
-                               CampaignLevelWarp(stof(argv(1)));
-                       else
-                               CampaignLevelWarp(-1);
-               }
-               else
-                       print("Not in campaign, can't level warp\n");
-       }
-
-       print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
-}
-
index 66e5a97e5e817670566c84846573debf29d6dbbe..b40a1e3a289ad682f95cfe8a96b35e83d84a9aa3 100644 (file)
@@ -317,17 +317,26 @@ void Ban_LoadBans()
 
 void Ban_View()
 {
-       float i;
+       float i, n;
        string msg;
+       
+       print("^2Listing all existing active bans:\n");
+       
        for(i = 0; i < ban_count; ++i)
        {
                if(time > ban_expire[i])
                        continue;
+                       
+               ++n; // total number of existing bans
+                       
                msg = strcat("#", ftos(i), ": ");
                msg = strcat(msg, ban_ip[i], " is still banned for ");
                msg = strcat(msg, ftos(ban_expire[i] - time), " seconds");
-               print(msg, "\n");
+               
+               print("  ", msg, "\n");
        }
+       
+       print("^2Done listing all active (", ftos(n), ") bans.\n");
 }
 
 float Ban_GetClientIP(entity client)
@@ -574,79 +583,3 @@ void Ban_KickBanClient(entity client, float bantime, float masksize, string reas
        dropclient(client);
         */
 }
-
-float GameCommand_Ban(string command)
-{
-       float argc;
-       float bantime;
-       entity client;
-       float entno;
-       float masksize;
-       string reason;
-       float reasonarg;
-
-       argc = tokenize_console(command);
-       if(argv(0) == "help")
-       {
-               print("  kickban # n m p reason - kickban player n for m seconds, using mask size p (1 to 4)\n");
-               print("  ban ip m reason - ban an IP or range (incomplete IP, like 1.2.3) for m seconds\n");
-               print("  bans - list all existing bans\n");
-               print("  unban n - delete the entry #n from the bans list\n");
-               return TRUE;
-       }
-       if(argv(0) == "kickban")
-       {
-#define INITARG(c) reasonarg = c
-#define GETARG(v,d) if((argc > reasonarg) && ((v = stof(argv(reasonarg))) != 0)) ++reasonarg; else v = d
-#define RESTARG(v) if(argc > reasonarg) v = substring(command, argv_start_index(reasonarg), strlen(command) - argv_start_index(reasonarg)); else v = ""
-               if(argc >= 3)
-               {
-                       entno = stof(argv(2));
-                       if(entno > maxclients || entno < 1)
-                               return TRUE;
-                       client = edict_num(entno);
-
-                       INITARG(3);
-                       GETARG(bantime, autocvar_g_ban_default_bantime);
-                       GETARG(masksize, autocvar_g_ban_default_masksize);
-                       RESTARG(reason);
-
-                       Ban_KickBanClient(client, bantime, masksize, reason);
-                       return TRUE;
-               }
-       }
-       else if(argv(0) == "ban")
-       {
-               if(argc >= 2)
-               {
-                       string ip;
-                       ip = argv(1);
-
-                       INITARG(2);
-                       GETARG(bantime, autocvar_g_ban_default_bantime);
-                       RESTARG(reason);
-
-                       Ban_Insert(ip, bantime, reason, 1);
-                       return TRUE;
-               }
-#undef INITARG
-#undef GETARG
-#undef RESTARG
-       }
-       else if(argv(0) == "bans")
-       {
-               Ban_View();
-               return TRUE;
-       }
-       else if(argv(0) == "unban")
-       {
-               if(argc >= 2)
-               {
-                       float who;
-                       who = stof(argv(1));
-                       Ban_Delete(who);
-                       return TRUE;
-               }
-       }
-       return FALSE;
-}
index 961ca05a809ad1581c3f7d7e6cc5b44a6dfd769b..15939464e00a8579053039af9336e4c814377f3c 100644 (file)
@@ -1,6 +1,6 @@
 void Ban_SaveBans();
 void Ban_LoadBans();
 float Ban_MaybeEnforceBan(entity client);
-float GameCommand_Ban(string command);
+float BanCommand(string command);
 
 void OnlineBanList_URI_Get_Callback(float id, float status, string data);
index 60644e6f20a4c1e6fda54f09532602865e1b36e5..4babf32b22eb8c9e8cb8db51b5c7b066b488becf 100644 (file)
@@ -151,25 +151,9 @@ void GameLogClose()
     }
 }
 
-vector PL_VIEW_OFS;
-vector PL_MIN;
-vector PL_MAX;
-vector PL_HEAD;
-vector PL_CROUCH_VIEW_OFS;
-vector PL_CROUCH_MIN;
-vector PL_CROUCH_MAX;
-
 float spawnpoint_nag;
 void relocate_spawnpoint()
 {
-    PL_VIEW_OFS                             = stov(autocvar_sv_player_viewoffset);
-    PL_MIN                                  = stov(autocvar_sv_player_mins);
-    PL_MAX                                  = stov(autocvar_sv_player_maxs);
-    PL_HEAD                                 = stov(autocvar_sv_player_headsize);
-    PL_CROUCH_VIEW_OFS                      = stov(autocvar_sv_player_crouch_viewoffset);
-    PL_CROUCH_MIN                           = stov(autocvar_sv_player_crouch_mins);
-    PL_CROUCH_MAX                           = stov(autocvar_sv_player_crouch_maxs);
-
     // nudge off the floor
     setorigin(self, self.origin + '0 0 1');
 
@@ -552,7 +536,6 @@ void GetCvars(float f)
        MUTATOR_CALLHOOK(GetCvars);
        GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
        GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot");
-       GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
        GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
        GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
        GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating");
@@ -1022,20 +1005,6 @@ void readplayerstartcvars()
        if (g_jetpack)
                start_items |= IT_JETPACK;
 
-       if (g_weapon_stay == 2)
-       {
-               if (!start_ammo_shells) start_ammo_shells = g_pickup_shells;
-               if (!start_ammo_nails) start_ammo_nails = g_pickup_nails;
-               if (!start_ammo_cells) start_ammo_cells = g_pickup_cells;
-               if (!start_ammo_rockets) start_ammo_rockets = g_pickup_rockets;
-               if (!start_ammo_fuel) start_ammo_fuel = g_pickup_fuel;
-               if (!warmup_start_ammo_shells) warmup_start_ammo_shells = g_pickup_shells;
-               if (!warmup_start_ammo_nails) warmup_start_ammo_nails = g_pickup_nails;
-               if (!warmup_start_ammo_cells) warmup_start_ammo_cells = g_pickup_cells;
-               if (!warmup_start_ammo_rockets) warmup_start_ammo_rockets = g_pickup_rockets;
-               if (!warmup_start_ammo_fuel) warmup_start_ammo_fuel = g_pickup_fuel;
-       }
-
        MUTATOR_CALLHOOK(SetStartItems);
 
        for (i = WEP_FIRST; i <= WEP_LAST; ++i)
@@ -1136,11 +1105,6 @@ void readlevelcvars(void)
 #ifdef ALLOW_FORCEMODELS
        sv_clforceplayermodels = cvar("sv_clforceplayermodels");
 #endif
-       sv_loddistance1 = cvar("sv_loddistance1");
-       sv_loddistance2 = cvar("sv_loddistance2");
-
-       if(sv_loddistance2 <= sv_loddistance1)
-               sv_loddistance2 = 1073741824; // enough to turn off LOD 2 reliably
 
        sv_clones = cvar("sv_clones");
        sv_gentle = cvar("sv_gentle");
@@ -1466,15 +1430,12 @@ void precache_playermodel(string m)
        if(substring(m, -9,5) == "_lod2")
                return;
        precache_model(m);
-       if(sv_loddistance1)
-       {
-               f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
-               if(fexists(f))
-                       precache_model(f);
-               f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1));
-               if(fexists(f))
-                       precache_model(f);
-       }
+       f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
+       if(fexists(f))
+               precache_model(f);
+       f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1));
+       if(fexists(f))
+               precache_model(f);
 
        globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
        if (globhandle < 0)
@@ -2048,14 +2009,6 @@ void URI_Get_Callback(float id, float status, string data)
     }
 }
 
-void print_to(entity e, string s)
-{
-    if (e)
-        sprint(e, strcat(s, "\n"));
-    else
-        print(s, "\n");
-}
-
 string uid2name(string myuid) {
        string s;
        s = db_get(ServerProgsDB, strcat("/uid2name/", myuid));
@@ -2168,292 +2121,6 @@ string race_placeName(float pos) {
        else
                return strcat(ftos(pos), "th");
 }
-string getrecords(float page) // 50 records per page
-{
-    float rec;
-    string h;
-    float r;
-    float i;
-    string s;
-
-    rec = 0;
-
-    s = "";
-
-    if (g_ctf)
-    {
-        for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
-        {
-            if (MapInfo_Get_ByID(i))
-            {
-                r = stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/time")));
-                if (r == 0)
-                    continue;
-               // TODO: uid2name
-                h = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/netname"));
-                s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-6, ftos_decimals(r, 2)), " ", h, "\n");
-                ++rec;
-            }
-        }
-    }
-
-    if (g_race)
-    {
-        for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
-        {
-            if (MapInfo_Get_ByID(i))
-            {
-               r = race_readTime(MapInfo_Map_bspname, 1);
-                if (r == 0)
-                    continue;
-               h = race_readName(MapInfo_Map_bspname, 1);
-                s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n");
-                ++rec;
-            }
-        }
-    }
-
-    if (g_cts)
-    {
-        for (i = page * 200; i < MapInfo_count && i < page * 200 + 200; ++i)
-        {
-            if (MapInfo_Get_ByID(i))
-            {
-               r = race_readTime(MapInfo_Map_bspname, 1);
-                if (r == 0)
-                    continue;
-               h = race_readName(MapInfo_Map_bspname, 1);
-                s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n");
-                ++rec;
-            }
-        }
-    }
-
-    MapInfo_ClearTemps();
-
-    if (s == "" && page == 0)
-        return "No records are available on this server.\n";
-    else
-        return s;
-}
-
-string getrankings()
-{
-    string n;
-    float t;
-    float i;
-    string s;
-    string p;
-    string map;
-
-    s = "";
-
-    map = GetMapname();
-
-    for (i = 1; i <= RANKINGS_CNT; ++i)
-    {
-        t = race_readTime(map, i);
-       if (t == 0)
-           continue;
-       n = race_readName(map, i);
-       p = race_placeName(i);
-        s = strcat(s, strpad(8, p), " ", strpad(-8, TIME_ENCODED_TOSTRING(t)), " ", n, "\n");
-    }
-
-    MapInfo_ClearTemps();
-
-    if (s == "")
-        return strcat("No records are available for the map: ", map, "\n");
-    else
-        return strcat("Records for ", map, ":\n", s);
-}
-
-#define LADDER_FIRSTPOINT 100
-#define LADDER_CNT 10
-       // position X still gives LADDER_FIRSTPOINT/X points
-#define LADDER_SIZE 30
-       // ladder shows the top X players
-string top_uids[LADDER_SIZE];
-float top_scores[LADDER_SIZE];
-string getladder()
-{
-    float i, j, k, uidcnt;
-    string s, temp_s;
-
-    s = "";
-    temp_s = "";
-
-    string rr;
-    if(g_cts)
-       rr = CTS_RECORD;
-    else
-       rr = RACE_RECORD;
-
-    string myuid;
-
-    for (k = 0; k < MapInfo_count; ++k)
-    {
-        if (MapInfo_Get_ByID(k))
-       {
-               for (i = 0; i <= LADDER_CNT; ++i) { // i = 0 because it is the speed award
-                       if(i == 0) // speed award
-                       {
-                               if(stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/speed"))) == 0)
-                                       continue;
-
-                               myuid = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/crypto_idfp"));
-                       }
-                       else // normal record, if it exists (else break)
-                       {
-                               if(race_readTime(MapInfo_Map_bspname, i) == 0)
-                                       continue;
-
-                               myuid = race_readUID(MapInfo_Map_bspname, i);
-                       }
-
-                       // string s contains:
-                       // arg 0 = # of speed recs
-                       // arg 1 = # of 1st place recs
-                       // arg 2 = # of 2nd place recs
-                       // ... etc
-                       // LADDER_CNT+1 = total points
-
-                       temp_s = db_get(TemporaryDB, strcat("ladder", myuid));
-                       if (temp_s == "")
-                       {
-                           db_put(TemporaryDB, strcat("uid", ftos(uidcnt)), myuid);
-                           ++uidcnt;
-                           for (j = 0; j <= LADDER_CNT + 1; ++j)
-                           {
-                               if(j != LADDER_CNT + 1)
-                                   temp_s = strcat(temp_s, "0 ");
-                               else
-                                   temp_s = strcat(temp_s, "0");
-                           }
-                       }
-
-                       tokenize_console(temp_s);
-                       s = "";
-
-                       if(i == 0) // speed award
-                           for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
-                           {
-                               if(j == 0) // speed award
-                                   s = strcat(s, ftos(stof(argv(j)) +1)); // add 1 to speed rec count and write
-                               else
-                                   s = strcat(s, " ", argv(j)); // just copy over everything else
-                           }
-                       else // record
-                           for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
-                           {
-                               if(j == 0)
-                                   s = strcat(s, argv(j)); // speed award, dont prefix with " "
-                               else if(j == i) // wanted rec!
-                                   s = strcat(s, " ", ftos(stof(argv(j)) +1)); // update argv(j)
-                               else
-                                   s = strcat(s, " ", argv(j)); // just copy over everything else
-                           }
-
-                       // total points are (by default) calculated like this:
-                       // speedrec = floor(100 / 10) = 10 points
-                       // 1st place = floor(100 / 1) = 100 points
-                       // 2nd place = floor(100 / 2) = 50 points
-                       // 3rd place = floor(100 / 3) = 33 points
-                       // 4th place = floor(100 / 4) = 25 points
-                       // 5th place = floor(100 / 5) = 20 points
-                       // ... etc
-
-                       if(i == 0)
-                           s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + LADDER_FIRSTPOINT / 10)); // speed award, add LADDER_FIRSTPOINT / 10 points
-                       else
-                           s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + floor(LADDER_FIRSTPOINT / i))); // record, add LADDER_FIRSTPOINT / i points
-
-                       db_put(TemporaryDB, strcat("ladder", myuid), s);
-               }
-       }
-    }
-
-    float thiscnt;
-    string thisuid;
-    for (i = 0; i <= uidcnt; ++i) // for each known uid
-    {
-       thisuid = db_get(TemporaryDB, strcat("uid", ftos(i)));
-       temp_s = db_get(TemporaryDB, strcat("ladder", thisuid));
-       tokenize_console(temp_s);
-        thiscnt = stof(argv(LADDER_CNT+1));
-
-       if(thiscnt > top_scores[LADDER_SIZE-1])
-       for (j = 0; j < LADDER_SIZE; ++j) // for each place in ladder
-       {
-           if(thiscnt > top_scores[j])
-           {
-               for (k = LADDER_SIZE-1; k >= j; --k)
-               {
-                   top_uids[k] = top_uids[k-1];
-                   top_scores[k] = top_scores[k-1];
-               }
-               top_uids[j] = thisuid;
-               top_scores[j] = thiscnt;
-               break;
-           }
-       }
-    }
-
-    s = "^3-----------------------\n\n";
-
-    s = strcat(s, "Pos ^3|");
-    s = strcat(s, " ^7Total  ^3|");
-    for (i = 1; i <= LADDER_CNT; ++i)
-    {
-       s = strcat(s, " ^7", race_placeName(i), " ^3|");
-    }
-    s = strcat(s, " ^7Speed awards ^3| ^7Name");
-
-    s = strcat(s, "\n^3----+--------");
-    for (i = 1; i <= min(9, LADDER_CNT); ++i)
-    {
-       s = strcat(s, "+-----");
-    }
-#if LADDER_CNT > 9
-    for (i = 1; i <= LADDER_CNT - 9; ++i)
-    {
-       s = strcat(s, "+------");
-    }
-#endif
-
-    s = strcat(s, "+--------------+--------------------\n");
-
-    for (i = 0; i < LADDER_SIZE; ++i)
-    {
-       temp_s = db_get(TemporaryDB, strcat("ladder", top_uids[i]));
-       tokenize_console(temp_s);
-       if (argv(LADDER_CNT+1) == "") // total is 0, skip
-           continue;
-       s = strcat(s, strpad(4, race_placeName(i+1)), "^3| ^7"); // pos
-       s = strcat(s, strpad(7, argv(LADDER_CNT+1)), "^3| ^7"); // total
-       for (j = 1; j <= min(9, LADDER_CNT); ++j)
-       {
-           s = strcat(s, strpad(4, argv(j)), "^3| ^7"); // 1st, 2nd, 3rd etc cnt
-       }
-#if LADDER_CNT > 9
-       for (j = 10; j <= LADDER_CNT; ++j)
-       {
-           s = strcat(s, strpad(4, argv(j)), " ^3| ^7"); // 1st, 2nd, 3rd etc cnt
-       }
-#endif
-
-       s = strcat(s, strpad(13, argv(0)), "^3| ^7"); // speed award cnt
-       s = strcat(s, uid2name(top_uids[i]), "\n"); // name
-    }
-
-    MapInfo_ClearTemps();
-
-    if (s == "")
-       return "No ladder on this server!\n";
-    else
-        return strcat("Top ", ftos(LADDER_SIZE), " ladder rankings:\n", s);
-}
-
 
 float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
 {
@@ -2843,71 +2510,6 @@ void SoundEntity_Detach(entity pl)
         SoundEntity_StopSound(pl, i);
 }
 
-
-float ParseCommandPlayerSlotTarget_firsttoken;
-entity GetCommandPlayerSlotTargetFromTokenizedCommand(float tokens, float idx) // idx = start index
-{
-       string s;
-       entity e, head;
-       float n;
-
-       s = string_null;
-
-       ParseCommandPlayerSlotTarget_firsttoken = -1;
-
-       if (tokens > idx)
-       {
-               if (substring(argv(idx), 0, 1) == "#")
-               {
-                       s = substring(argv(idx), 1, -1);
-                       ++idx;
-                       if (s == "") if (tokens > idx)
-                       {
-                               s = argv(idx);
-                               ++idx;
-                       }
-                       ParseCommandPlayerSlotTarget_firsttoken = idx;
-                       n = stof(s);
-                       if (s == ftos(n) && n > 0 && n <= maxclients)
-                       {
-                               e = edict_num(n);
-                               if (e.flags & FL_CLIENT)
-                                       return e;
-                       }
-               }
-               else
-               {
-                       // it must be a nick name
-                       s = argv(idx);
-                       ++idx;
-                       ParseCommandPlayerSlotTarget_firsttoken = idx;
-
-                       n = 0;
-                       FOR_EACH_CLIENT(head)
-                               if (head.netname == s)
-                               {
-                                       e = head;
-                                       ++n;
-                               }
-                       if (n == 1)
-                               return e;
-
-                       s = strdecolorize(s);
-                       n = 0;
-                       FOR_EACH_CLIENT(head)
-                               if (strdecolorize(head.netname) == s)
-                               {
-                                       e = head;
-                                       ++n;
-                               }
-                       if (n == 1)
-                               return e;
-               }
-       }
-
-       return world;
-}
-
 .float scale2;
 
 float modeleffect_SendEntity(entity to, float sf)
index 2eeb5682a418b7ea2017326b57fb5e2c18cdb2af..672b031c119bccaedca248dbce5fd408b31f44ca 100644 (file)
@@ -56,17 +56,28 @@ void PlayerStats_Init()
 
 void PlayerStats_AddPlayer(entity e)
 {
+       string s;
+
        if(playerstats_db < 0)
                return;
        if(e.playerstats_id)
                return;
 
+       s = string_null;
        if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
-               e.playerstats_id = strzone(e.crypto_idfp);
+               s = e.crypto_idfp;
        else if(clienttype(e) == CLIENTTYPE_BOT)
-               e.playerstats_id = strzone(sprintf("bot#%d", e.playerid));
-       else
-               e.playerstats_id = strzone(sprintf("player#%d", e.playerid));
+               s = sprintf("bot#%g#%s", skill, e.cleanname);
+
+       if(!s || find(world, playerstats_id, s)) // already have one of the ID - next one can't be tracked then!
+       {
+               if(clienttype(e) == CLIENTTYPE_BOT)
+                       s = sprintf("bot#%d", e.playerid);
+               else
+                       s = sprintf("player#%d", e.playerid);
+       }
+
+       e.playerstats_id = strzone(s);
 
        string key;
        key = sprintf("%s:*", e.playerstats_id);
index 461f475c7818787f113386378b1a4e09159fa46d..bf50c9d3cada867c7d4d2034244a5a75a0d8caa4 100644 (file)
@@ -7,6 +7,7 @@
 .vector portal_safe_origin;
 .float portal_wants_to_vanish;
 .float portal_activatetime;
+.float savemodelindex;
 
 float PlayerEdgeDistance(entity p, vector v)
 {
@@ -479,7 +480,7 @@ float Portal_Customize()
                other = other.enemy;
        if(other == self.aiment)
        {
-               self.modelindex = self.modelindex_lod0;
+               self.modelindex = self.savemodelindex;
        }
        else if(IS_INDEPENDENT_PLAYER(other) || IS_INDEPENDENT_PLAYER(self.aiment))
        {
@@ -487,7 +488,7 @@ float Portal_Customize()
        }
        else
        {
-               self.modelindex = self.modelindex_lod0;
+               self.modelindex = self.savemodelindex;
        }
        return TRUE;
 }
@@ -617,7 +618,7 @@ entity Portal_Spawn(entity own, vector org, vector ang)
        portal.fade_time = time + autocvar_g_balance_portal_lifetime;
        portal.health = autocvar_g_balance_portal_health;
        setmodel(portal, "models/portal.md3");
-       portal.modelindex_lod0 = portal.modelindex;
+       portal.savemodelindex = portal.modelindex;
        portal.customizeentityforclient = Portal_Customize;
 
        if(!Portal_FindSafeOrigin(portal))
index 6dd08bb1bcab2f0cee10cb2963da90edd8475478..9a459c5fd464c0ef0249a39717a1a0e5335856d3 100644 (file)
@@ -17,6 +17,10 @@ sys-post.qh
 ../common/items.qh
 ../common/explosion_equation.qh
 ../common/urllib.qh
+../common/command/markup.qh
+../common/command/rpn.qh
+../common/command/generic.qh
+../common/command/shared_defs.qh
 
 autocvars.qh
 constants.qh
@@ -34,10 +38,20 @@ vehicles/vehicles_def.qh
 campaign.qh
 ../common/campaign_common.qh
 ../common/mapinfo.qh
-../common/util.qc
+
+command/common.qh
+command/banning.qh
+command/radarmap.qh
+command/vote.qh
+command/getreplies.qh
+command/cmd.qh
+command/sv_cmd.qh
 
 accuracy.qh
 csqcprojectile.qh
+../common/csqcmodel_settings.qh
+../csqcmodellib/common.qh
+../csqcmodellib/sv_model.qh
 csqceffects.qc
 
 anticheat.qh
@@ -58,8 +72,6 @@ race.qh
 
 antilag.qh
 
-vote.qh
-
 playerdemo.qh
 
 // singleplayer stuff
@@ -132,17 +144,21 @@ g_hook.qc
 
 t_swamp.qc
 
-clientcommands.qc
-
-vote.qc
-
 campaign.qc
 ../common/campaign_file.qc
 ../common/campaign_setup.qc
 ../common/urllib.qc
 
-../common/gamecommand.qc
-gamecommand.qc
+../common/command/markup.qc
+../common/command/rpn.qc
+../common/command/generic.qc
+command/common.qc
+command/banning.qc
+command/radarmap.qc
+command/vote.qc
+command/getreplies.qc
+command/cmd.qc
+command/sv_cmd.qc
 
 assault.qc
 
@@ -150,9 +166,6 @@ ipban.qc
 
 ../common/mapinfo.qc
 
-
-
-
 t_quake3.qc
 t_halflife.qc
 t_quake.qc
@@ -176,6 +189,7 @@ target_music.qc
 
 
 accuracy.qc
+../csqcmodellib/sv_model.qc
 csqcprojectile.qc
 
 playerdemo.qc
@@ -204,4 +218,6 @@ mutators/sandbox.qc
 ../warpzonelib/util_server.qc
 ../warpzonelib/server.qc
 
+../common/util.qc
+
 ../common/if-this-file-errors-scroll-up-and-fix-the-warnings.fteqccfail
index 782c567ceb09ab92b9c94cf5a00522a0aec71ed0..b56065deda01461475cc383317f147b8d4ef9dd7 100644 (file)
@@ -173,7 +173,7 @@ float ScoreInfo_SendEntity(entity to, float sf)
 {
        float i;
        WriteByte(MSG_ENTITY, ENT_CLIENT_SCORES_INFO);
-       WriteByte(MSG_ENTITY, game);
+       WriteInt24_t(MSG_ENTITY, MapInfo_LoadedGametype);
        for(i = 0; i < MAX_SCORE; ++i)
        {
                WriteString(MSG_ENTITY, scores_label[i]);
@@ -337,8 +337,8 @@ float PlayerScore_Add(entity player, float scorefield, float score)
        if(score)
                if(scores_label[scorefield] != "")
                        s.SendFlags |= pow(2, scorefield);
-       PlayerStats_Event(s.owner, strcat(PLAYERSTATS_TOTAL, scores_label[scorefield]), score);
-       s.(scores_accumulated[scorefield]) += score;
+       if(!inWarmupStage)
+               PlayerStats_Event(s.owner, strcat(PLAYERSTATS_TOTAL, scores_label[scorefield]), score);
        return (s.(scores[scorefield]) += score);
 }
 
@@ -386,6 +386,7 @@ void WinningConditionHelper()
        s = strcat(s, ":", autocvar_g_xonoticversion);
        s = strcat(s, ":P", ftos(cvar_purechanges_count));
        s = strcat(s, ":S", ftos(nJoinAllowed(0)));
+       s = strcat(s, ":F", ftos(serverflags));
        s = strcat(s, "::", GetPlayerScoreString(world, 1)); // make this 1 once we can, note: this doesn't contain any :<letter>
 
        fullstatus = autocvar_g_full_getstatus_responses;
index f94b683323dfb8b57d974c7d2b2dd683ace5d90b..3ac0b03b5577dd49cf5dbb5eea7e1ad7e2fd02e6 100644 (file)
@@ -2,8 +2,6 @@ entity scores_initialized; // non-world when scores labels/rules have been set
 .float scores[MAX_SCORE];
 .float teamscores[MAX_TEAMSCORE];
 
-.float scores_accumulated[MAX_SCORE]; // for player stats only
-
 /**
  * Attaches a PlayerScore entity to a player. Use that in ClientConnect.
  * Remember to detach it in ClientDisconnect!
index eb7205e9c3859bf5d3c2977d8bde069bd31993d7..806e2450792d356ff0c1298bcbdc53fefd614780 100644 (file)
@@ -53,27 +53,9 @@ void ScoreRules_generic()
 #define SP_CTF_RETURNS 8
 void ScoreRules_ctf()
 {
-       float sp_score, sp_caps;
-       sp_score = sp_caps = 0;
-       switch(g_ctf_win_mode)
-       {
-               case 0: // caps only
-                       sp_caps = SFL_SORT_PRIO_PRIMARY;
-                       break;
-               case 1: // caps, then score
-                       sp_caps = SFL_SORT_PRIO_PRIMARY;
-                       sp_score = SFL_SORT_PRIO_SECONDARY;
-                       break;
-               case 2: // score only
-               default:
-                       sp_caps = SFL_SORT_PRIO_SECONDARY; // looks better ;)
-                       sp_score = SFL_SORT_PRIO_PRIMARY;
-                       break;
-       }
-
        CheckAllowedTeams(world);
-       ScoreRules_basics(2 + (c3>=0), SFL_SORT_PRIO_PRIMARY, sp_score, TRUE); // NOTE this assumes that the rogue team is team 3
-       ScoreInfo_SetLabel_TeamScore  (ST_CTF_CAPS,     "caps",      sp_caps);
+       ScoreRules_basics(2 + (c3>=0), SFL_SORT_PRIO_PRIMARY, 0, TRUE); // NOTE this assumes that the rogue team is team 3
+       ScoreInfo_SetLabel_TeamScore  (ST_CTF_CAPS,     "caps",      SFL_SORT_PRIO_PRIMARY);
        ScoreInfo_SetLabel_PlayerScore(SP_CTF_CAPS,     "caps",      SFL_SORT_PRIO_SECONDARY);
        ScoreInfo_SetLabel_PlayerScore(SP_CTF_PICKUPS,  "pickups",   0);
        ScoreInfo_SetLabel_PlayerScore(SP_CTF_FCKILLS,  "fckills",   0);
index 7ec4b49d671db22414e9f5b043b9071de1c3a735..73c444afec7b8637e0481ecb18ba133d01f471a1 100644 (file)
@@ -196,7 +196,7 @@ void StartFrame (void)
        if(sys_frametime <= 0)
                sys_frametime = 1.0 / 60.0; // somewhat safe fallback
 
-       if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2)
+       if (timeout_status == TIMEOUT_LEADTIME) // just before the timeout (when timeout_status will be TIMEOUT_ACTIVE)
                orig_slowmo = autocvar_slowmo; // slowmo will be restored after the timeout
 
        skill = autocvar_skill;
@@ -245,8 +245,9 @@ void StartFrame (void)
 float DoesQ3ARemoveThisEntity();
 void SV_OnEntityPreSpawnFunction()
 {
-       if(self.gametypefilter != "")
-       if not(isGametypeInFilter(game, teamplay, have_team_spawns, self.gametypefilter))
+       if (self)
+       if (self.gametypefilter != "")
+       if not(isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, self.gametypefilter))
        {
                remove(self);
                return;
index f7a8d2aec157a966e0299a89402e2b280af92721..79c39ae95d7998899e99529451df30ff22b05fed 100644 (file)
@@ -1,3 +1,40 @@
+float have_pickup_item(void)
+{
+       // minstagib: only allow filtered items
+       if(g_minstagib)
+               if(self.classname != "minstagib")
+                       return FALSE;
+
+       if(self.flags & FL_POWERUP)
+       {
+               if(autocvar_g_powerups > 0)
+                       return TRUE;
+               if(autocvar_g_powerups == 0)
+                       return FALSE;
+               if(g_lms)
+                       return FALSE;
+               if(g_ca)
+                       return FALSE;
+               if(g_arena)
+                       return FALSE;
+       }
+       else
+       {
+               if(autocvar_g_pickup_items > 0)
+                       return TRUE;
+               if(autocvar_g_pickup_items == 0)
+                       return FALSE;
+               if(g_lms)
+                       return FALSE;
+               if(g_ca)
+                       return FALSE;
+               if(g_weaponarena)
+                       if((self.weapons & WEPBIT_ALL) || (self.items & IT_AMMO))
+                               return FALSE;
+       }
+       return TRUE;
+}
+
 #define ITEM_RESPAWN_TICKS 10
 
 #define ITEM_RESPAWNTIME(i)         ((i).respawntime + crandom() * (i).respawntimejitter)
@@ -94,7 +131,7 @@ void Item_Show (entity e, float mode)
 
                e.spawnshieldtime = 1;
        }
-       else if((e.flags & FL_WEAPON) && (g_weapon_stay == 3))
+       else if((e.flags & FL_WEAPON) && g_weapon_stay)
        {
                // make the item translucent and not touchable
                e.model = e.mdl;
@@ -196,6 +233,11 @@ void Item_RespawnCountdown (void)
                                case IT_FUEL_REGEN:     name = "item-fuelregen"; rgb = '1 0.5 0'; break;
                                case IT_JETPACK:        name = "item-jetpack"; rgb = '0.5 0.5 0.5'; break;
                        }
+                       if(!name)
+                       {
+                               print("Unknown powerup-marked item is wanting to respawn\n");
+                               localcmd(sprintf("prvm_edict server %d\n", num_for_edict(self)));
+                       }
                        if(name)
                        {
                                WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
@@ -244,6 +286,53 @@ void Item_ScheduleInitialRespawn(entity e)
        Item_ScheduleRespawnIn(e, game_starttime - time + ITEM_RESPAWNTIME_INITIAL(e));
 }
 
+float ITEM_MODE_NONE = 0;
+float ITEM_MODE_HEALTH = 1;
+float ITEM_MODE_ARMOR = 2;
+float ITEM_MODE_FUEL = 3;
+float Item_GiveAmmoTo(entity item, entity player, .float ammofield, float ammomax, float mode)
+{
+       if (!item.ammofield)
+               return FALSE;
+
+       if (item.spawnshieldtime)
+       {
+               if ((player.ammofield < ammomax) || item.pickup_anyway)
+               {
+                       player.ammofield = bound(player.ammofield, ammomax, player.ammofield + item.ammofield);
+                       goto YEAH;
+               }
+       }
+       else if(g_weapon_stay == 2)
+       {
+               float mi = min(item.ammofield, ammomax);
+               if (player.ammofield < mi)
+               {
+                       player.ammofield = mi;
+                       goto YEAH;
+               }
+       }
+
+       return FALSE;
+
+:YEAH
+       switch(mode)
+       {
+               case ITEM_MODE_FUEL:
+                       player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
+                       break;
+               case ITEM_MODE_HEALTH:
+                       player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
+                       break;
+               case ITEM_MODE_ARMOR:
+                       player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot);
+                       break;
+               default:
+                       break;
+       }
+       return TRUE;
+}
+
 float Item_GiveTo(entity item, entity player)
 {
        float _switchweapon;
@@ -258,92 +347,71 @@ float Item_GiveTo(entity item, entity player)
 
        if (g_minstagib)
        {
-               if(item.spawnshieldtime)
+               float prevcells = player.ammo_cells;
+
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, 999, ITEM_MODE_NONE);
+
+               if(player.ammo_cells > prevcells)
                {
-                       if (item.ammo_fuel)
-                       if (player.ammo_fuel < g_pickup_fuel_max)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
-                               player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
-                       }
-                       if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
+                       _switchweapon = TRUE;
+
+                       // play some cool sounds ;)
+                       if (clienttype(player) == CLIENTTYPE_REAL)
                        {
-                               pickedup = TRUE;
-                               player.items |= it;
-                               sprint (player, strcat("You got the ^2", item.netname, "\n"));
+                               if(player.health <= 5)
+                                       AnnounceTo(player, "lastsecond");
+                               else if(player.health < 50)
+                                       AnnounceTo(player, "narrowly");
                        }
+                       // sound not available
+                       // else if(item.items == IT_CELLS)
+                       //      AnnounceTo(player, "ammo");
 
-                       _switchweapon = TRUE;
+                       if (item.weapons & WEPBIT_MINSTANEX)
+                               W_GiveWeapon (player, WEP_MINSTANEX, item.netname);
                        if (item.ammo_cells)
-                       {
-                               pickedup = TRUE;
-                               // play some cool sounds ;)
-                               if (clienttype(player) == CLIENTTYPE_REAL)
-                               {
-                                       if(player.health <= 5)
-                                               AnnounceTo(player, "lastsecond");
-                                       else if(player.health < 50)
-                                               AnnounceTo(player, "narrowly");
-                               }
-                               // sound not available
-                               // else if(item.items == IT_CELLS)
-                               //      AnnounceTo(player, "ammo");
-
-                               if (item.weapons & WEPBIT_MINSTANEX)
-                                       W_GiveWeapon (player, WEP_MINSTANEX, item.netname);
-                               if (item.ammo_cells)
-                                       player.ammo_cells = bound(player.ammo_cells, 999, player.ammo_cells + autocvar_g_minstagib_ammo_drop);
-                               player.health = 100;
-                       }
+                               player.ammo_cells = bound(player.ammo_cells, 999, player.ammo_cells + autocvar_g_minstagib_ammo_drop);
+                       player.health = 100;
+               }
 
-                       // extralife powerup
-                       if (item.max_health)
-                       {
-                               pickedup = TRUE;
-                               // sound not available
-                               // AnnounceTo(player, "_lives");
-                               player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives);
-                               sprint(player, "^3You picked up some extra lives\n");
-                       }
+               if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
+               {
+                       pickedup = TRUE;
+                       player.items |= it;
+                       sprint (player, strcat("You got the ^2", item.netname, "\n"));
+               }
 
-                       // invis powerup
-                       if (item.strength_finished)
-                       {
-                               pickedup = TRUE;
-                               // sound not available
-                               // AnnounceTo(player, "invisible");
-                               player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
-                       }
+               // extralife powerup
+               if (item.max_health)
+               {
+                       pickedup = TRUE;
+                       // sound not available
+                       // AnnounceTo(player, "_lives");
+                       player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives);
+                       sprint(player, "^3You picked up some extra lives\n");
+               }
 
-                       // speed powerup
-                       if (item.invincible_finished)
-                       {
-                               pickedup = TRUE;
-                               // sound not available
-                               // AnnounceTo(player, "speed");
-                               player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_strength_time;
-                       }
+               // invis powerup
+               if (item.strength_finished)
+               {
+                       pickedup = TRUE;
+                       // sound not available
+                       // AnnounceTo(player, "invisible");
+                       player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
+               }
+
+               // speed powerup
+               if (item.invincible_finished)
+               {
+                       pickedup = TRUE;
+                       // sound not available
+                       // AnnounceTo(player, "speed");
+                       player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_strength_time;
                }
        }
        else
        {
-               if (g_weapon_stay == 1)
-               if not(item.flags & FL_NO_WEAPON_STAY)
-               if (item.flags & FL_WEAPON)
-               {
-                       if(item.classname == "droppedweapon")
-                       {
-                               if (player.weapons & item.weapons)      // don't let players stack ammo by tossing weapons
-                                       goto skip;
-                       }
-                       else
-                       {
-                               if (player.weapons & item.weapons)
-                                       goto skip;
-                       }
-               }
-
                // in case the player has autoswitch enabled do the following:
                // if the player is using their best weapon before items are given, they
                // probably want to switch to an even better weapon after items are given
@@ -354,43 +422,16 @@ float Item_GiveTo(entity item, entity player)
                if not(player.weapons & W_WeaponBit(player.switchweapon))
                        _switchweapon = TRUE;
 
-               if(item.spawnshieldtime)
-               {
-                       if (item.ammo_shells)
-                       if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_shells = bound(player.ammo_shells, g_pickup_shells_max, player.ammo_shells + item.ammo_shells);
-                       }
-                       if (item.ammo_nails)
-                       if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_nails = bound(player.ammo_nails, g_pickup_nails_max, player.ammo_nails + item.ammo_nails);
-                       }
-                       if (item.ammo_rockets)
-                       if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_rockets = bound(player.ammo_rockets, g_pickup_rockets_max, player.ammo_rockets + item.ammo_rockets);
-                       }
-                       if (item.ammo_cells)
-                       if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.ammo_cells);
-                       }
-                       if (item.ammo_fuel)
-                       if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
-                               player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
-                       }
-               }
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE);
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
+               pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
+               pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
+               pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
 
                if (item.flags & FL_WEAPON)
-                       if ((it = item.weapons - (item.weapons & player.weapons)) || (g_pickup_weapons_anyway && g_weapon_stay == 0))
+               if ((it = item.weapons - (item.weapons & player.weapons)) || (item.spawnshieldtime && g_pickup_weapons_anyway))
                {
                        pickedup = TRUE;
                        for(i = WEP_FIRST; i <= WEP_LAST; ++i)
@@ -408,33 +449,15 @@ float Item_GiveTo(entity item, entity player)
                        sprint (player, strcat("You got the ^2", item.netname, "\n"));
                }
 
-               if(item.spawnshieldtime)
+               if (item.strength_finished)
                {
-                       if (item.strength_finished)
-                       {
-                               pickedup = TRUE;
-                               player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
-                       }
-                       if (item.invincible_finished)
-                       {
-                               pickedup = TRUE;
-                               player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
-                       }
-
-                       if (item.health)
-                       if ((player.health < item.max_health) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.health = bound(player.health, item.max_health, player.health + item.health);
-                               player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
-                       }
-                       if (item.armorvalue)
-                       if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway)
-                       {
-                               pickedup = TRUE;
-                               player.armorvalue = bound(player.armorvalue, item.max_armorvalue, player.armorvalue + item.armorvalue);
-                               player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot);
-                       }
+                       pickedup = TRUE;
+                       player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
+               }
+               if (item.invincible_finished)
+               {
+                       pickedup = TRUE;
+                       player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
                }
        }
 
@@ -484,8 +507,6 @@ void Item_Touch (void)
                remove (self);
        else if not(self.spawnshieldtime)
                return;
-       else if((self.flags & FL_WEAPON) && !(self.flags & FL_NO_WEAPON_STAY) && (g_weapon_stay == 1 || g_weapon_stay == 2))
-               return;
        else
        {
                if(self.team)
@@ -569,7 +590,7 @@ float weapon_pickupevalfunc(entity player, entity item)
        if(player.weapons & item.weapons == item.weapons)
        {
                // If I can pick it up
-               if(g_weapon_stay == 1 || g_weapon_stay == 2 || !item.spawnshieldtime)
+               if(!item.spawnshieldtime)
                        c = 0;
                else if(player.ammo_cells || player.ammo_shells || player.ammo_nails || player.ammo_rockets)
                {
@@ -679,6 +700,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
 
        self.items = itemid;
        self.weapons = weaponid;
+       self.flags = FL_ITEM | itemflags;
 
        // is it a dropped weapon?
        if (self.classname == "droppedweapon")
@@ -707,6 +729,13 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                        return;
                }
 
+               if(!have_pickup_item())
+               {
+                       startitem_failed = TRUE;
+                       remove (self);
+                       return;
+               }
+
                self.reset = Item_Reset;
                // it's a level item
                if(self.spawnflags & 1)
@@ -759,35 +788,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                        self.is_item = TRUE;
                }
 
-               if(g_lms || g_ca)
-               {
-                       startitem_failed = TRUE;
-                       remove(self);
-                       return;
-               }
-               else if (g_weaponarena && ((weaponid & WEPBIT_ALL) || (itemid & IT_AMMO)))
-               {
-                       startitem_failed = TRUE;
-                       remove(self);
-                       return;
-               }
-               else if (g_minstagib)
-               {
-                       // don't remove dropped items and powerups
-                       if (self.classname != "minstagib")
-                       {
-                               startitem_failed = TRUE;
-                               remove (self);
-                               return;
-                       }
-               }
-               else if (!autocvar_g_pickup_items && itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
-               {
-                       startitem_failed = TRUE;
-                       remove (self);
-                       return;
-               }
-
                weaponsInMap |= weaponid;
 
                precache_model (itemmodel);
@@ -817,7 +817,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                self.respawntimejitter = defaultrespawntimejitter;
        }
        self.netname = itemname;
-       self.flags = FL_ITEM | itemflags;
        self.touch = Item_Touch;
        setmodel (self, self.mdl); // precision set below
        self.effects |= EF_LOWPRECISION;
@@ -861,7 +860,7 @@ void minstagib_items (float itemid)
        // replace rocket launchers and nex guns with ammo cells
        if (itemid == IT_CELLS)
        {
-               self.ammo_cells = 1;
+               self.ammo_cells = autocvar_g_minstagib_ammo_drop;
                StartItem ("models/items/a_cells.md3",
                        "misc/itempickup.wav", 45, 0,
                        "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100);
@@ -1024,16 +1023,6 @@ void weapon_defaultspawnfunc(float wpn)
        if(self.team)
                self.flags |= FL_NO_WEAPON_STAY;
 
-       if(g_weapon_stay == 2 && self.classname != "droppedweapon")
-       {
-               self.ammo_shells = 0;
-               self.ammo_nails = 0;
-               self.ammo_cells = 0;
-               self.ammo_rockets = 0;
-               // weapon stay 2: don't use ammo on weapon pickups; instead
-               // initialize all ammo types to the pickup ammo unless set by g_start_ammo_*
-       }
-
        StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapons, FL_WEAPON, weapon_pickupevalfunc, e.bot_pickupbasevalue);
        if (self.modelindex) // don't precache if self was removed
                weapon_action(e.weapon, WR_PRECACHE);
@@ -1220,12 +1209,6 @@ void spawnfunc_item_health_large (void) {
 }
 
 void spawnfunc_item_health_mega (void) {
-       if(!autocvar_g_powerup_superhealth)
-               return;
-
-       if((g_arena || g_ca) && !autocvar_g_arena_powerups)
-               return;
-
        if(g_minstagib) {
                minstagib_items(IT_NAILS);
        } else {
@@ -1247,12 +1230,6 @@ void spawnfunc_item_health25() { spawnfunc_item_health_medium(); }
 void spawnfunc_item_health100() { spawnfunc_item_health_mega(); }
 
 void spawnfunc_item_strength (void) {
-       if(!autocvar_g_powerup_strength)
-               return;
-
-       if((g_arena || g_ca) && !autocvar_g_arena_powerups)
-               return;
-
        if(g_minstagib) {
                minstagib_items(IT_STRENGTH);
        } else {
@@ -1263,12 +1240,6 @@ void spawnfunc_item_strength (void) {
 }
 
 void spawnfunc_item_invincible (void) {
-       if(!autocvar_g_powerup_shield)
-               return;
-
-       if((g_arena || g_ca) && !autocvar_g_arena_powerups)
-               return;
-
        if(g_minstagib) {
                minstagib_items(IT_INVINCIBLE);
        } else {
index f44dcb7b9476be220390010163dd175108282428..a556d6d0bb192dd72d9417d2535a7eafa3e82aac 100644 (file)
@@ -175,11 +175,6 @@ void plat_reset()
 void spawnfunc_path_corner() { }
 void spawnfunc_func_plat()
 {
-       if (!self.t_length)
-               self.t_length = 80;
-       if (!self.t_width)
-               self.t_width = 10;
-
        if (self.sounds == 0)
                self.sounds = 2;
 
@@ -231,10 +226,14 @@ void spawnfunc_func_plat()
 
        if (!self.speed)
                self.speed = 150;
+       if (!self.lip)
+               self.lip = 16;
+       if (!self.height)
+               self.height = self.size_z - self.lip;
 
        self.pos1 = self.origin;
        self.pos2 = self.origin;
-       self.pos2_z = self.origin_z - self.size_z + 8;
+       self.pos2_z = self.origin_z - self.height;
 
        plat_spawn_inside_trigger ();   // the "start moving" trigger
 
@@ -2055,3 +2054,91 @@ void spawnfunc_func_vectormamamam()
 
        InitializeEntity(self, func_vectormamamam_findtarget, INITPRIO_FINDTARGET);
 }
+
+void conveyor_think()
+{
+       entity e;
+
+       // set myself as current conveyor where possible
+       for(e = world; (e = findentity(e, conveyor, self)); )
+               e.conveyor = world;
+
+       if(self.state)
+       {
+               for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5); e; e = e.chain)
+                       if(!e.conveyor.state)
+                               if(isPushable(e))
+                               {
+                                       vector emin = e.absmin;
+                                       vector emax = e.absmax;
+                                       if(self.solid == SOLID_BSP)
+                                       {
+                                               emin -= '1 1 1';
+                                               emax += '1 1 1';
+                                       }
+                                       if(boxesoverlap(emin, emax, self.absmin, self.absmax)) // quick
+                                               if(WarpZoneLib_BoxTouchesBrush(emin, emax, self, e)) // accurate
+                                                       e.conveyor = self;
+                               }
+
+               for(e = world; (e = findentity(e, conveyor, self)); )
+               {
+                       if(e.flags & FL_CLIENT) // doing it via velocity has quite some advantages
+                               continue; // done in SV_PlayerPhysics
+
+                       setorigin(e, e.origin + self.movedir * sys_frametime);
+                       move_out_of_solid(e);
+                       UpdateCSQCProjectile(e);
+                       /*
+                       // stupid conveyor code
+                       tracebox(e.origin, e.mins, e.maxs, e.origin + self.movedir * sys_frametime, MOVE_NORMAL, e);
+                       if(trace_fraction > 0)
+                               setorigin(e, trace_endpos);
+                       */
+               }
+       }
+
+       self.nextthink = time;
+}
+
+void conveyor_use()
+{
+       self.state = !self.state;
+}
+
+void conveyor_reset()
+{
+       self.state = (self.spawnflags & 1);
+}
+
+void conveyor_init()
+{
+       if (!self.speed)
+               self.speed = 200;
+       self.movedir = self.movedir * self.speed;
+       self.think = conveyor_think;
+       self.nextthink = time;
+       IFTARGETED
+       {
+               self.use = conveyor_use;
+               self.reset = conveyor_reset;
+               conveyor_reset();
+       }
+       else
+               self.state = 1;
+}
+
+void spawnfunc_trigger_conveyor()
+{
+       SetMovedir();
+       EXACTTRIGGER_INIT;
+       conveyor_init();
+}
+
+void spawnfunc_func_conveyor()
+{
+       SetMovedir();
+       InitMovingBrushTrigger();
+       self.movetype = MOVETYPE_NONE;
+       conveyor_init();
+}
index 5d5b0a02c49bc2014ce502800254af43cc56384c..1705d8f8ea705edc6f71d4c5490bb32cd5d40c76 100644 (file)
@@ -201,7 +201,13 @@ void Teleport_Touch (void)
        // for gameplay: vehicles can't teleport
        if (other.vehicle_flags & VHF_ISVEHICLE)
                return;
-
+    
+    if(other.vehicle)
+        return;
+        
+    if(other.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+        return;
+        
        if (other.deadflag != DEAD_NO)
                return;
 
index 3d65d760d3af9604921342e4b811dc6619329d0c..f0ce8fd142ec4027b10c524db8b97297a90a8968 100644 (file)
@@ -85,68 +85,6 @@ void LogTeamchange(float player_id, float team_number, float type)
        GameLogEcho(strcat(":team:", ftos(player_id), ":", ftos(team_number), ":", ftos(type)));
 }
 
-void WriteGameCvars()
-{
-       cvar_set("g_dm", ftos(g_dm));
-       cvar_set("g_tdm", ftos(g_tdm));
-       cvar_set("g_domination", ftos(g_domination));
-       cvar_set("g_ctf", ftos(g_ctf));
-       cvar_set("g_runematch", ftos(g_runematch));
-       cvar_set("g_lms", ftos(g_lms));
-       cvar_set("g_arena", ftos(g_arena));
-       cvar_set("g_ca", ftos(g_ca));
-       cvar_set("g_keyhunt", ftos(g_keyhunt));
-       cvar_set("g_assault", ftos(g_assault));
-       cvar_set("g_onslaught", ftos(g_onslaught));
-       cvar_set("g_race", ftos(g_race));
-       cvar_set("g_nexball", ftos(g_nexball));
-       cvar_set("g_cts", ftos(g_cts));
-       cvar_set("g_freezetag", ftos(g_freezetag));
-       cvar_set("g_keepaway", ftos(g_keepaway));
-}
-
-void ReadGameCvars()
-{
-       float found;
-       float prev;
-       float i;
-
-       found = 0;
-       prev = autocvar_gamecfg;
-       for(i = 0; i < 2; ++i)
-       {
-//#NO AUTOCVARS START
-               found += (g_dm = (!found && (prev != GAME_DEATHMATCH) && cvar("g_dm")));
-               found += (g_tdm = (!found && (prev != GAME_TEAM_DEATHMATCH) && cvar("g_tdm")));
-               found += (g_domination = (!found && (prev != GAME_DOMINATION) && cvar("g_domination")));
-               found += (g_ctf = (!found && (prev != GAME_CTF) && cvar("g_ctf")));
-               found += (g_runematch = (!found && (prev != GAME_RUNEMATCH) && cvar("g_runematch")));
-               found += (g_lms = (!found && (prev != GAME_LMS) && cvar("g_lms")));
-               found += (g_arena = (!found && (prev != GAME_ARENA) && cvar("g_arena")));
-               found += (g_ca = (!found && (prev != GAME_CA) && cvar("g_ca")));
-               found += (g_keyhunt = (!found && (prev != GAME_KEYHUNT) && cvar("g_keyhunt")));
-               found += (g_assault = (!found && (prev != GAME_ASSAULT) && cvar("g_assault")));
-               found += (g_onslaught = (!found && (prev != GAME_ONSLAUGHT) && cvar("g_onslaught")));
-               found += (g_race = (!found && (prev != GAME_RACE) && cvar("g_race")));
-               found += (g_nexball = (!found && (prev != GAME_NEXBALL) && cvar("g_nexball")));
-               found += (g_cts = (!found && (prev != GAME_CTS) && cvar("g_cts")));
-               found += (g_freezetag = (!found && (prev != GAME_FREEZETAG) && cvar("g_freezetag")));
-               found += (g_keepaway = (!found && (prev != GAME_KEEPAWAY) && cvar("g_keepaway")));
-//#NO AUTOCVARS END
-
-               if(found)
-                       break;
-
-               prev = -1; // second attempt takes place WITHOUT prev set
-       }
-
-       if(!found)
-               g_dm = 1;
-
-       teamplay = 0;
-       serverflags &~= SERVERFLAG_TEAMPLAY;
-}
-
 void default_delayedinit()
 {
        if(!scores_initialized)
@@ -167,16 +105,14 @@ void InitGameplayMode()
 
        VoteReset();
 
-       // make sure only ONE type is selected
-       ReadGameCvars();
-       WriteGameCvars();
-
        // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
        get_mi_min_max(1);
        world.mins = mi_min;
        world.maxs = mi_max;
 
        MapInfo_LoadMapSettings(mapname);
+       teamplay = 0;
+       serverflags &~= SERVERFLAG_TEAMPLAY;
 
        if not(cvar_value_issafe(world.fog))
        {
@@ -192,24 +128,18 @@ void InitGameplayMode()
 
        MapInfo_ClearTemps();
 
-       // in case mapinfo switched the type
-       ReadGameCvars();
-
        // set both here, gamemode can override it later
        timelimit_override = autocvar_timelimit_override;
        fraglimit_override = autocvar_fraglimit_override;
        leadlimit_override = autocvar_leadlimit_override;
+       gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype);
 
        if(g_dm)
        {
-               game = GAME_DEATHMATCH;
-               gamemode_name = "Deathmatch";
        }
 
        if(g_tdm)
        {
-               game = GAME_TEAM_DEATHMATCH;
-               gamemode_name = "Team Deathmatch";
                ActivateTeamplay();
                tdm_init();
                if(autocvar_g_tdm_team_spawns)
@@ -218,8 +148,6 @@ void InitGameplayMode()
 
        if(g_domination)
        {
-               game = GAME_DOMINATION;
-               gamemode_name = "Domination";
                ActivateTeamplay();
                fraglimit_override = autocvar_g_domination_point_limit;
                leadlimit_override = autocvar_g_domination_point_leadlimit;
@@ -229,28 +157,16 @@ void InitGameplayMode()
 
        if(g_ctf)
        {
-               game = GAME_CTF;
-               gamemode_name = "Capture the Flag";
                ActivateTeamplay();
                g_ctf_ignore_frags = autocvar_g_ctf_ignore_frags;
-               if(g_ctf_win_mode == 2)
-               {
-                       fraglimit_override = autocvar_g_ctf_capture_limit;
-                       leadlimit_override = autocvar_g_ctf_capture_leadlimit;
-               }
-               else
-               {
-                       fraglimit_override = autocvar_capturelimit_override;
-                       leadlimit_override = autocvar_captureleadlimit_override;
-               }
+               fraglimit_override = autocvar_capturelimit_override;
+               leadlimit_override = autocvar_captureleadlimit_override;
                ctf_init();
                have_team_spawns = -1; // request team spawns
        }
 
        if(g_runematch)
        {
-               game = GAME_RUNEMATCH;
-               gamemode_name = "Rune Match";
                // ActivateTeamplay();
                fraglimit_override = autocvar_g_runematch_point_limit;
                leadlimit_override = autocvar_g_runematch_point_leadlimit;
@@ -259,8 +175,6 @@ void InitGameplayMode()
 
        if(g_lms)
        {
-               game = GAME_LMS;
-               gamemode_name = "Last Man Standing";
                fraglimit_override = autocvar_g_lms_lives_override;
                leadlimit_override = 0; // not supported by LMS
                if(fraglimit_override == 0)
@@ -272,8 +186,6 @@ void InitGameplayMode()
 
        if(g_arena)
        {
-               game = GAME_ARENA;
-               gamemode_name = "Arena";
                fraglimit_override = autocvar_g_arena_point_limit;
                leadlimit_override = autocvar_g_arena_point_leadlimit;
                maxspawned = autocvar_g_arena_maxspawned;
@@ -284,8 +196,6 @@ void InitGameplayMode()
 
        if(g_ca)
        {
-               game = GAME_CA;
-               gamemode_name = "Clan Arena";
                ActivateTeamplay();
                fraglimit_override = autocvar_g_ca_point_limit;
                leadlimit_override = autocvar_g_ca_point_leadlimit;
@@ -294,8 +204,6 @@ void InitGameplayMode()
        }
        if(g_keyhunt)
        {
-               game = GAME_KEYHUNT;
-               gamemode_name = "Key Hunt";
                ActivateTeamplay();
                fraglimit_override = autocvar_g_keyhunt_point_limit;
                leadlimit_override = autocvar_g_keyhunt_point_leadlimit;
@@ -304,8 +212,6 @@ void InitGameplayMode()
 
        if(g_freezetag)
        {
-               game = GAME_FREEZETAG;
-               gamemode_name = "Freeze Tag";
                ActivateTeamplay();
                fraglimit_override = autocvar_g_freezetag_point_limit;
                leadlimit_override = autocvar_g_freezetag_point_leadlimit;
@@ -314,8 +220,6 @@ void InitGameplayMode()
 
        if(g_assault)
        {
-               game = GAME_ASSAULT;
-               gamemode_name = "Assault";
                ActivateTeamplay();
                ScoreRules_assault();
                have_team_spawns = -1; // request team spawns
@@ -323,16 +227,12 @@ void InitGameplayMode()
 
        if(g_onslaught)
        {
-               game = GAME_ONSLAUGHT;
-               gamemode_name = "Onslaught";
                ActivateTeamplay();
                have_team_spawns = -1; // request team spawns
        }
 
        if(g_race)
        {
-               game = GAME_RACE;
-               gamemode_name = "Race";
 
                if(autocvar_g_race_teams)
                {
@@ -350,8 +250,6 @@ void InitGameplayMode()
 
        if(g_cts)
        {
-               game = GAME_CTS;
-               gamemode_name = "CTS";
                g_race_qualifying = 1;
                fraglimit_override = 0;
                leadlimit_override = 0;
@@ -359,8 +257,6 @@ void InitGameplayMode()
 
        if(g_nexball)
        {
-               game = GAME_NEXBALL;
-               gamemode_name = "Nexball";
                fraglimit_override = autocvar_g_nexball_goallimit;
                leadlimit_override = autocvar_g_nexball_goalleadlimit;
                ActivateTeamplay();
@@ -370,17 +266,12 @@ void InitGameplayMode()
 
        if(g_keepaway)
        {
-               game = GAME_KEEPAWAY;
-               gamemode_name = "Keepaway";
                MUTATOR_ADD(gamemode_keepaway);
        }
 
        if(teamplay)
                entcs_init();
 
-       // save it (for the next startup)
-       cvar_set("gamecfg", ftos(game));
-
        cache_mutatormsg = strzone("");
        cache_lastmutatormsg = strzone("");
 
@@ -478,6 +369,10 @@ string getwelcomemessage(void)
                modifications = strcat(modifications, ", Blood loss");
        if(g_jetpack)
                modifications = strcat(modifications, ", Jet pack");
+       if(autocvar_g_powerups == 0)
+               modifications = strcat(modifications, ", No powerups");
+       if(autocvar_g_powerups > 0)
+               modifications = strcat(modifications, ", Powerups");
        modifications = substring(modifications, 2, strlen(modifications) - 2);
 
        string versionmessage;
index b1a97ba44649ea4cd616650513c15a4ef9312528..7247a3a3476816e6c116019903975c4e48365661 100644 (file)
@@ -381,7 +381,7 @@ void turret_stdproc_track()
             }
             
             // CSQC
-            self.SendFlags  = TNSF_ANG;
+            self.SendFlags  |= TNSF_ANG;
             
             return;
 
diff --git a/qcsrc/server/vote.qc b/qcsrc/server/vote.qc
deleted file mode 100644 (file)
index 3043cea..0000000
+++ /dev/null
@@ -1,649 +0,0 @@
-float VoteCheckNasty(string cmd)
-{
-       if(strstrofs(cmd, ";", 0) >= 0)
-               return TRUE;
-       if(strstrofs(cmd, "\n", 0) >= 0)
-               return TRUE;
-       if(strstrofs(cmd, "\r", 0) >= 0)
-               return TRUE;
-       if(strstrofs(cmd, "$", 0) >= 0)
-               return TRUE;
-       return FALSE;
-}
-
-string GetKickVoteVictim_newcommand;
-string GetKickVoteVictim_reason;
-
-entity GetKickVoteVictim(string vote, string cmd, entity caller)
-{
-       float tokens;
-       string ns;
-       entity e;
-       string reason;
-
-       tokens = tokenize_console(vote);
-       ns = "";
-
-       e = GetCommandPlayerSlotTargetFromTokenizedCommand(tokens, 1);
-       if(e)
-       {
-               if(ParseCommandPlayerSlotTarget_firsttoken < tokens)
-                       GetKickVoteVictim_reason = substring(vote, argv_start_index(ParseCommandPlayerSlotTarget_firsttoken), argv_end_index(-1) - argv_start_index(ParseCommandPlayerSlotTarget_firsttoken));
-               else
-                       GetKickVoteVictim_reason = "";
-
-               reason = "";
-               if(cmd != "vdo" || GetKickVoteVictim_reason == "")
-                       reason = "~"; // by convention, ~ prefixes a "unverified" kickban which will not be networked
-
-               if(substring(GetKickVoteVictim_reason, 0, 1) == "~")
-               {
-                       reason = "~";
-                       GetKickVoteVictim_reason = substring(GetKickVoteVictim_reason, 1, strlen(GetKickVoteVictim_reason) - 1);
-               }
-
-               if(caller)
-                       reason = strcat(reason, "player ", strdecolorize(caller.netname));
-               else
-                       reason = strcat(reason, "console vote");
-               if(GetKickVoteVictim_reason != "")
-                       reason = strcat(reason, ": ", strdecolorize(GetKickVoteVictim_reason));
-
-               if not(cvar_value_issafe(reason))
-                       reason = uri_escape(reason);
-
-               GetKickVoteVictim_newcommand = strcat(argv(0), " # ", ftos(num_for_edict(e)));
-               if(argv(0) == "kickban")
-               {
-                       GetKickVoteVictim_newcommand = strcat(GetKickVoteVictim_newcommand, " ", ftos(autocvar_g_ban_default_bantime), " ", ftos(autocvar_g_ban_default_masksize), " ", reason);
-               }
-               else if(argv(0) == "kick")
-               {
-                       GetKickVoteVictim_newcommand = strcat(GetKickVoteVictim_newcommand, " ", reason);
-               }
-               return e;
-       }
-
-       print_to(caller, strcat("Usage: ", cmd, " ", argv(0), " #playernumber (as in \"status\")\n"));
-       return world;
-}
-
-string RemapVote_display;
-string RemapVote_vote;
-float RemapVote(string vote, string cmd, entity e)
-{
-       float vote_argc;
-       entity victim;
-       vote_argc = tokenize_console(vote);
-
-       if(!VoteAllowed(argv(0), cmd))
-               return FALSE;
-
-       // VoteAllowed tokenizes!
-       vote_argc = tokenize_console(vote);
-
-       // remap chmap to gotomap (forces intermission)
-       if(vote_argc < 2)
-               if(argv(0) == "chmap" || argv(0) == "gotomap" || argv(0) == "kick" || argv(0) == "kickban") // won't work without arguments
-                       return FALSE;
-       if(argv(0) == "chmap")
-       {
-               vote = strcat("gotomap ", substring(vote, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
-               vote_argc = tokenize_console(vote);
-       }
-       if(argv(0) == "gotomap")
-       {
-               if(!(vote = ValidateMap(substring(vote, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), e)))
-                       return FALSE;
-               vote = strcat("gotomap ", vote);
-               vote_argc = tokenize_console(vote); // ValidateMap may have done some stuff to it
-       }
-
-       // make kick and kickban votes a bit nicer (and reject them if formatted badly)
-       if(argv(0) == "kick" || argv(0) == "kickban")
-       {
-               if(!(victim = GetKickVoteVictim(vote, cmd, e)))
-                       return FALSE;
-               RemapVote_vote = GetKickVoteVictim_newcommand;
-               RemapVote_display = strcat("^1", vote, " (^7", victim.netname, "^1): ", GetKickVoteVictim_reason);
-       }
-       else
-       {
-               RemapVote_vote = vote;
-               RemapVote_display = strzone(strcat("^1", vote));
-       }
-
-       return TRUE;
-}
-
-float GameCommand_Vote(string s, entity e) {
-       float playercount;
-       float argc;
-       argc = tokenize_console(s);
-       if(argv(0) == "help") {
-               print_to(e, "  vote COMMANDS ARGUMENTS. See 'vhelp' for more info.");
-               return TRUE;
-       } else if(argv(0) == "vote") {
-               if(argv(1) == "") {
-                       print_to(e, "^1You have to supply a vote command. See 'vhelp' for more info.");
-               } else if(argv(1) == "help") {
-                       VoteHelp(e);
-               } else if(argv(1) == "status") {
-                       if(votecalled) {
-                               print_to(e, strcat("^7Vote for ", votecalledvote_display, "^7 called by ^7", VoteNetname(votecaller), "^7."));
-                       } else {
-                               print_to(e, "^1No vote called.");
-                       }
-               } else if(argv(1) == "call") {
-                       if(!e || autocvar_sv_vote_call) {
-                               if(autocvar_sv_vote_nospectators && e && e.classname != "player") {
-                                       print_to(e, "^1Error: Only players can call a vote."); // TODO invent a cvar name for allowing votes by spectators during warmup anyway
-                               }
-                               else if(timeoutStatus) { //don't allow a vote call during a timeout
-                                       print_to(e, "^1Error: You can not call a vote while a timeout is active.");
-                               }
-                               else if(votecalled) {
-                                       print_to(e, "^1There is already a vote called.");
-                               } else {
-                                       string vote;
-                                       vote = VoteParse(s, argc);
-                                       if(vote == "") {
-                                               print_to(e, "^1Your vote is empty. See 'vhelp' for more info.");
-                                       } else if(e
-                                                       && time < e.vote_next) {
-                                               print_to(e, strcat("^1You have to wait ^2", ftos(ceil(e.vote_next - time)), "^1 seconds before you can again call a vote."));
-                                       } else if(VoteCheckNasty(vote)) {
-                                               print_to(e, "Syntax error in command. See 'vhelp' for more info.");
-                                       } else if(RemapVote(vote, "vcall", e)) {
-                                               votecalledvote = strzone(RemapVote_vote);
-                                               votecalledvote_display = strzone(RemapVote_display);
-                                               votecalled = TRUE;
-                                               votecalledmaster = FALSE;
-                                               votefinished = time + autocvar_sv_vote_timeout;
-                                               votecaller = e; // remember who called the vote
-                                               if(e) {
-                                                       e.vote_vote = 1; // of course you vote yes
-                                                       e.vote_next = time + autocvar_sv_vote_wait;
-                                               }
-                                               bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote for ", votecalledvote_display, "\n");
-                                               if(autocvar_sv_eventlog)
-                                                       GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
-                                               Nagger_VoteChanged();
-                                               VoteCount(); // needed if you are the only one
-                                               msg_entity = e;
-
-                                               entity player;
-                                               FOR_EACH_REALCLIENT(player)
-                                               {
-                                                       ++playercount;
-                                               }
-                                               if(playercount > 1) // don't announce a "vote now" sound if player is alone
-                                                       Announce("votecall");
-                                       } else {
-                                               print_to(e, "^1This vote is not ok. See 'vhelp' for more info.");
-                                       }
-                               }
-                       } else {
-                               print_to(e, "^1Vote calling is NOT allowed.");
-                       }
-               } else if(argv(1) == "stop") {
-                       if(!votecalled) {
-                               print_to(e, "^1No vote called.");
-                       } else if(e == votecaller) { // the votecaller can stop a vote
-                               VoteStop(e);
-                       } else if(!e) { // server admin / console can too
-                               VoteStop(e);
-                       } else if(e.vote_master) { // masters can too
-                               VoteStop(e);
-                       } else {
-                               print_to(e, "^1You are not allowed to stop that Vote.");
-                       }
-               } else if(argv(1) == "master") {
-                       if(autocvar_sv_vote_master) {
-                               if(votecalled) {
-                                       print_to(e, "^1There is already a vote called.");
-                               } else {
-                                       votecalled = TRUE;
-                                       votecalledmaster = TRUE;
-                                       votecalledvote = strzone("XXX");
-                                       votecalledvote_display = strzone("^3master");
-                                       votefinished = time + autocvar_sv_vote_timeout;
-                                       votecaller = e; // remember who called the vote
-                                       if(e) {
-                                               e.vote_vote = 1; // of course you vote yes
-                                               e.vote_next = time + autocvar_sv_vote_wait;
-                                       }
-                                       bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote to become ^3master^2.\n");
-                                       if(autocvar_sv_eventlog)
-                                               GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
-                                       Nagger_VoteChanged();
-                                       VoteCount(); // needed if you are the only one
-                               }
-                       } else {
-                               print_to(e, "^1Vote to become master is NOT allowed.");
-                       }
-               } else if(argv(1) == "do") {
-                       if(!e || e.vote_master) {
-                               string dovote;
-                               dovote = VoteParse(s, argc);
-                               if(dovote == "") {
-                                       print_to(e, "^1Your command was empty. See 'vhelp' for more info.");
-                               } else if(VoteCheckNasty(dovote)) {
-                                       print_to(e, "Syntax error in command. See 'vhelp' for more info.");
-                               } else if(RemapVote(dovote, "vdo", e)) { // strcat seems to be necessary
-                                       bprint("\{1}^2* ^3", VoteNetname(e), "^2 used their ^3master^2 status to do \"^2", RemapVote_display, "^2\".\n");
-                                       if(autocvar_sv_eventlog)
-                                               GameLogEcho(strcat(":vote:vdo:", ftos(e.playerid), ":", RemapVote_display));
-                                       localcmd(strcat(RemapVote_vote, "\n"));
-                               } else {
-                                       print_to(e, "^1This command is not ok. See 'vhelp' for more info.");
-                               }
-                       } else {
-                               print_to(e, "^1You are NOT a master.  You might need to login or vote to become master first. See 'vhelp' for more info.");
-                       }
-               } else if(argv(1) == "login") {
-                       string masterpwd;
-                       masterpwd = autocvar_sv_vote_master_password;
-                       if(masterpwd != "") {
-                               float granted;
-                               granted = (masterpwd == argv(2));
-                               if (e)
-                                       e.vote_master = granted;
-                               if(granted) {
-                                       print("Accepted master login from ", VoteNetname(e), "\n");
-                                       bprint("\{1}^2* ^3", VoteNetname(e), "^2 logged in as ^3master^2\n");
-                                       if(autocvar_sv_eventlog)
-                                               GameLogEcho(strcat(":vote:vlogin:", ftos(e.playerid)));
-                               }
-                               else
-                                       print("REJECTED master login from ", VoteNetname(e), "\n");
-                       }
-                       else
-                               print_to(e, "^1Login to become master is NOT allowed.");
-               } else if(argv(1) == "yes") {
-                       if(!votecalled) {
-                               print_to(e, "^1No vote called.");
-                       } else if (!e) {
-                               print_to(e, "^1You can't vote from the server console.");
-                       } else if(e.vote_vote == 0
-                                 || autocvar_sv_vote_change) {
-                               msg_entity = e;
-                               print_to(e, "^1You accepted the vote.");
-                               e.vote_vote = 1;
-                               if(!autocvar_sv_vote_singlecount) {
-                                       VoteCount();
-                               }
-                       } else {
-                               print_to(e, "^1You have already voted.");
-                       }
-               } else if(argv(1) == "no") {
-                       if(!votecalled) {
-                               print_to(e, "^1No vote called.");
-                       } else if (!e) {
-                               print_to(e, "^1You can't vote from the server console.");
-                       } else if(e.vote_vote == 0
-                                 || autocvar_sv_vote_change) {
-                               msg_entity = e;
-                               print_to(e, "^1You rejected the vote.");
-                               e.vote_vote = -1;
-                               if(!autocvar_sv_vote_singlecount) {
-                                       VoteCount();
-                               }
-                       } else {
-                               print_to(e, "^1You have already voted.");
-                       }
-               } else if(argv(1) == "abstain" || argv(1) == "dontcare") {
-                       if(!votecalled) {
-                               print_to(e, "^1No vote called.");
-                       } else if (!e) {
-                               print_to(e, "^1You can't vote from the server console.");
-                       } else if(e.vote_vote == 0
-                                 || autocvar_sv_vote_change) {
-                               msg_entity = e;
-                               print_to(e, "^1You abstained from your vote.");
-                               e.vote_vote = -2;
-                               if(!autocvar_sv_vote_singlecount) {
-                                       VoteCount();
-                               }
-                       } else {
-                               print_to(e, "^1You have already voted.");
-                       }
-               } else {
-                       // ignore this?
-                       print_to(e, "^1Unknown vote command.");
-               }
-               return TRUE;
-       }
-       return FALSE;
-}
-
-void VoteHelp(entity e) {
-       string vmasterdis;
-       if(!autocvar_sv_vote_master) {
-               vmasterdis = " ^1(disabled)";
-       }
-
-       string vlogindis;
-       if("" == autocvar_sv_vote_master_password) {
-               vlogindis = " ^1(disabled)";
-       }
-
-       string vcalldis;
-       if(!autocvar_sv_vote_call) {
-               vcalldis = " ^1(disabled)";
-       }
-
-       print_to(e, "^7You can use voting with \"^2cmd vote help^7\" \"^2cmd vote status^7\" \"^2cmd vote call ^3COMMAND ARGUMENTS^7\" \"^2cmd vote stop^7\" \"^2cmd vote master^7\" \"^2cmd vote login^7\" \"^2cmd vote do ^3COMMAND ARGUMENTS^7\" \"^2cmd vote yes^7\" \"^2cmd vote no^7\" \"^2cmd vote abstain^7\" \"^2cmd vote dontcare^7\".");
-       print_to(e, "^7Or if your version is up to date you can use these aliases \"^2vhelp^7\" \"^2vstatus^7\" \"^2vcall ^3COMMAND ARGUMENTS^7\" \"^2vstop^7\" \"^2vmaster^7\" \"^2vlogin^7\" \"^2vdo ^3COMMAND ARGUMENTS^7\" \"^2vyes^7\" \"^2vno^7\" \"^2abstain^7\" \"^2vdontcare^7\".");
-       print_to(e, "^7\"^2help^7\" shows this info.");
-       print_to(e, "^7\"^2status^7\" shows if there is a vote called and who called it.");
-       print_to(e, strcat("^7\"^2call^7\" is used to call a vote. See the list of allowed commands.", vcalldis, "^7"));
-       print_to(e, "^7\"^2stop^7\" can be used by the vote caller or an admin to stop a vote and maybe correct it.");
-       print_to(e, strcat("^7\"^2master^7\" call a vote to become master who can execute commands without a vote", vmasterdis, "^7"));
-       print_to(e, strcat("^7\"^2login^7\" login to become master who can execute commands without a vote.", vlogindis, "^7"));
-       print_to(e, "^7\"^2do^7\" executes a command if you are a master. See the list of allowed commands.");
-       print_to(e, "^7\"^2yes^7\", \"^2no^7\", \"^2abstain^7\" and \"^2dontcare^7\" to make your vote.");
-       print_to(e, "^7If enough of the players vote yes the vote is accepted.");
-       print_to(e, "^7If enough of the players vote no the vote is rejected.");
-       print_to(e, strcat("^7If neither the vote will timeout after ", ftos(autocvar_sv_vote_timeout), "^7 seconds."));
-       print_to(e, "^7You can call a vote for or execute these commands:");
-       print_to(e, strcat("^3", autocvar_sv_vote_commands, "^7 and maybe further ^3arguments^7"));
-}
-
-string VoteNetname(entity e)
-{
-       if(e) {
-               return e.netname;
-       } else {
-               if(autocvar_sv_adminnick != "") {
-                       return autocvar_sv_adminnick;
-               } else {
-                       return autocvar_hostname;
-               }
-       }
-}
-
-string ValidateMap(string m, entity e)
-{
-       m = MapInfo_FixName(m);
-       if(!m)
-       {
-               print_to(e, "This map is not available on this server.");
-               return string_null;
-       }
-       if(!autocvar_sv_vote_override_mostrecent)
-               if(Map_IsRecent(m))
-               {
-                       print_to(e, "This server does not allow for recent maps to be played again. Please be patient for some rounds.");
-                       return string_null;
-               }
-       if(!MapInfo_CheckMap(m))
-       {
-               print_to(e, strcat("^1Invalid mapname, \"^3", m, "^1\" does not support the current game mode."));
-               return string_null;
-       }
-
-       return m;
-}
-
-
-void VoteThink() {
-       if(votefinished > 0) // a vote was called
-       if(time > votefinished) // time is up
-       {
-               VoteCount();
-       }
-}
-
-string VoteParse(string all, float argc) {
-       if(argc < 3)
-               return "";
-       return substring(all, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
-}
-
-float VoteCommandInList(string votecommand, string list)
-{
-       string l;
-       l = strcat(" ", list, " ");
-       
-       if(strstrofs(l, strcat(" ", votecommand, " "), 0) >= 0)
-               return TRUE;
-       
-       // if gotomap is allowed, chmap is too, and vice versa
-       if(votecommand == "gotomap")
-               if(strstrofs(l, " chmap ", 0) >= 0)
-                       return TRUE;
-       if(votecommand == "chmap")
-               if(strstrofs(l, " gotomap ", 0) >= 0)
-                       return TRUE;
-       
-       return FALSE;
-}
-
-float VoteAllowed(string votecommand, string cmd) {
-       if(VoteCommandInList(votecommand, autocvar_sv_vote_commands))
-               return TRUE;
-
-       if(cmd == "vdo")
-       {
-               if(VoteCommandInList(votecommand, autocvar_sv_vote_master_commands))
-                       return TRUE;
-       }
-       else
-       {
-               if(VoteCommandInList(votecommand, autocvar_sv_vote_only_commands))
-                       return TRUE;
-       }
-
-       return FALSE;
-}
-
-void VoteReset() {
-       entity player;
-
-       FOR_EACH_CLIENT(player)
-       {
-               player.vote_vote = 0;
-       }
-
-       if(votecalled)
-       {
-               strunzone(votecalledvote);
-               strunzone(votecalledvote_display);
-       }
-
-       votecalled = FALSE;
-       votecalledmaster = FALSE;
-       votefinished = 0;
-       votecalledvote = string_null;
-       votecalledvote_display = string_null;
-
-       Nagger_VoteChanged();
-}
-
-void VoteAccept() {
-       bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2's vote for ^1", votecalledvote_display, "^2 was accepted\n");
-       if(votecalledmaster)
-       {
-               if(votecaller) {
-                       votecaller.vote_master = 1;
-               }
-       } else {
-               localcmd(strcat(votecalledvote, "\n"));
-       }
-       if(votecaller) {
-               votecaller.vote_next = 0; // people like your votes,
-                                         // no wait for next vote
-       }
-       VoteReset();
-       Announce("voteaccept");
-}
-
-void VoteReject() {
-       bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2's vote for ", votecalledvote_display, "^2 was rejected\n");
-       VoteReset();
-       Announce("votefail");
-}
-
-void VoteTimeout() {
-       bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2's vote for ", votecalledvote_display, "^2 timed out\n");
-       VoteReset();
-       Announce("votefail");
-}
-
-void VoteStop(entity stopper) {
-       bprint("\{1}^2* ^3", VoteNetname(stopper), "^2 stopped ^3", VoteNetname(votecaller), "^2's vote\n");
-       if(autocvar_sv_eventlog)
-               GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid)));
-       if(stopper == votecaller) {
-               // no wait for next vote so you can correct your vote
-               if(votecaller) {
-                       votecaller.vote_next = time + autocvar_sv_vote_stop;
-               }
-       }
-       VoteReset();
-}
-
-void VoteSpam(float notvoters, float mincount, string result)
-{
-       string s;
-       if(mincount >= 0)
-       {
-               s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
-               s = strcat(s, ftos(vote_nocount), "^2 (^1");
-               s = strcat(s, ftos(mincount), "^2 needed), ^1");
-               s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
-               s = strcat(s, ftos(notvoters), "^2 didn't vote\n");
-       }
-       else
-       {
-               s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
-               s = strcat(s, ftos(vote_nocount), "^2, ^1");
-               s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
-               s = strcat(s, ftos(notvoters), "^2 didn't have to vote\n");
-       }
-       bprint(s);
-       if(autocvar_sv_eventlog)
-       {
-               s = strcat(":vote:v", result, ":", ftos(vote_yescount));
-               s = strcat(s, ":", ftos(vote_nocount));
-               s = strcat(s, ":", ftos(vote_abstaincount));
-               s = strcat(s, ":", ftos(notvoters));
-               s = strcat(s, ":", ftos(mincount));
-               GameLogEcho(s);
-       }
-}
-
-void VoteCount() {
-       float playercount;
-       playercount = 0;
-       vote_yescount = 0;
-       vote_nocount = 0;
-       vote_abstaincount = 0;
-       entity player;
-       //same for real players
-       float realplayercount;
-       float realplayeryescount;
-       float realplayernocount;
-       float realplayerabstaincount;
-       realplayercount = realplayernocount = realplayerabstaincount = realplayeryescount = 0;
-
-       Nagger_VoteCountChanged();
-
-       FOR_EACH_REALCLIENT(player)
-       {
-               if(player.vote_vote == -1) {
-                       ++vote_nocount;
-               } else if(player.vote_vote == 1) {
-                       ++vote_yescount;
-               } else if(player.vote_vote == -2) {
-                       ++vote_abstaincount;
-               }
-               ++playercount;
-               //do the same for real players
-               if(player.classname == "player") {
-                       if(player.vote_vote == -1) {
-                               ++realplayernocount;
-                       } else if(player.vote_vote == 1) {
-                               ++realplayeryescount;
-                       } else if(player.vote_vote == -2) {
-                               ++realplayerabstaincount;
-                       }
-                       ++realplayercount;
-               }
-       }
-
-       //in tournament mode, if we have at least one player then don't make the vote dependent on spectators (so specs don't have to press F1)
-       if(autocvar_sv_vote_nospectators)
-       if(realplayercount > 0) {
-               vote_yescount = realplayeryescount;
-               vote_nocount = realplayernocount;
-               vote_abstaincount = realplayerabstaincount;
-               playercount = realplayercount;
-       }
-
-       float votefactor, simplevotefactor;
-       votefactor = bound(0.5, autocvar_sv_vote_majority_factor, 0.999);
-       simplevotefactor = autocvar_sv_vote_simple_majority_factor;
-
-       // FIXME this number is a guess
-       vote_needed_absolute = floor((playercount - vote_abstaincount) * votefactor) + 1;
-       if(simplevotefactor)
-       {
-               simplevotefactor = bound(votefactor, simplevotefactor, 0.999);
-               vote_needed_simple = floor((vote_yescount + vote_nocount) * simplevotefactor) + 1;
-       }
-       else
-               vote_needed_simple = 0;
-
-       if(votecalledmaster
-          && playercount == 1) {
-               // if only one player is on the server becoming vote
-               // master is not allowed.  This could be used for
-               // trolling or worse. 'self' is the user who has
-               // called the vote because this function is called
-               // by SV_ParseClientCommand. Maybe all voting should
-               // be disabled for a single player?
-               print_to(votecaller, "^1You are the only player on this server so you can not become vote master.");
-               if(votecaller) {
-                       votecaller.vote_next = 0;
-               }
-               VoteReset();
-       } else {
-               if(vote_yescount >= vote_needed_absolute)
-               {
-                       VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "yes");
-                       VoteAccept();
-               }
-               else if(vote_nocount > playercount - vote_abstaincount - vote_needed_absolute) // that means, vote_yescount cannot reach vote_needed_absolute any more
-               {
-                       VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "no");
-                       VoteReject();
-               }
-               else if(time > votefinished)
-               {
-                       if(simplevotefactor)
-                       {
-                               string result;
-                               if(vote_yescount >= vote_needed_simple)
-                                       result = "yes";
-                               else if(vote_yescount + vote_nocount > 0)
-                                       result = "no";
-                               else
-                                       result = "timeout";
-                               VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, min(vote_needed_absolute, vote_needed_simple), result);
-                               if(result == "yes")
-                                       VoteAccept();
-                               else if(result == "no")
-                                       VoteReject();
-                               else
-                                       VoteTimeout();
-                       }
-                       else
-                       {
-                               VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, vote_needed_absolute, "timeout");
-                               VoteTimeout();
-                       }
-               }
-       }
-}
diff --git a/qcsrc/server/vote.qh b/qcsrc/server/vote.qh
deleted file mode 100644 (file)
index 75eda98..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-float votecalled;
-string votecalledvote;
-string votecalledvote_display;
-float votecalledmaster;
-entity votecaller;
-float votefinished;
-.float vote_master;
-.float vote_next;
-.float vote_vote;
-float vote_yescount;
-float vote_nocount;
-float vote_abstaincount;
-float vote_needed_absolute;
-float vote_needed_simple;
-
-float VoteCheckNasty(string cmd);
-entity GetKickVoteVictim(string vote, string cmd, entity caller);
-float GameCommand_Vote(string s, entity e);
-void VoteHelp(entity e);
-string VoteNetname(entity e);
-string ValidateMap(string m, entity e);
-void VoteThink();
-string VoteParse(string s, float tokens);
-float VoteAllowed(string vote, string cmd);
-void VoteReset();
-void VoteAccept();
-void VoteReject();
-void VoteTimeout();
-void VoteStop(entity stopper);
-void VoteSpam(float notvoters, float mincount, string result);
-void VoteCount();
diff --git a/tooltips.db.hu b/tooltips.db.hu
new file mode 100644 (file)
index 0000000..dffb185
--- /dev/null
@@ -0,0 +1,203 @@
+0
+\XonoticSingleplayerDialog\Egyjátékos mód vagy azonnali játék gépi vezérlésű botok ellen
+
+
+\XonoticMultiplayerDialog\Meccsek neten, a barátaid elleni helyi hálózaton, demó nézés, vagy a karaktered beállításainak finomítása
+\XonoticMultiplayerDialog/Szerverek keresése a játékhoz
+\menu_slist_showempty\Üres szerverek mutatása 
+\menu_slist_showfull\Teli szerverek is mutatása, amelyeken nincs már szabad férőhely
+\net_slist_pause\Megállítja a szerver lista frissítését, hogy a szerverek ne 'ugráljanak össze-vissza' a listában
+\XonoticMultiplayerDialog/Adatok...\Több adat az éppen kiválasztott szerverről
+\XonoticMultiplayerDialog/Könyvjelzők\Az éppen kiválasztott szerver megjelölése, hogy a jövőben könnyebben megtalálható legyen
+\XonoticMultiplayerDialog/Létrehozás\Saját játékszerver indítása
+\XonoticMultiplayerDialog/Demók\Demók böngészése és megtekintése
+\XonoticMultiplayerDialog/Játékos beállítások\Játékoskarakter testreszabása 
+
+\XonoticTeamSelectDialog/A 'legjobb' csapathoz csatlakozás (auto-választás)\Önműködő csapatválasztás (ajánlott)
+\XonoticTeamSelectDialog/piros\Csatlakozás a vörös csapathoz
+\XonoticTeamSelectDialog/kék\Csatlakozás a kék csapathoz
+\XonoticTeamSelectDialog/sárga\Csatlakozás a sárga csapathoz
+\XonoticTeamSelectDialog/rózsaszín\Csatlakozás a rózsaszín csapathoz
+
+\timelimit_override\Időhatár percben, aminek elérése után vége a meccsnek
+\fraglimit_override\Gyilokok száma, amit a meccs vége előtt el kell érni
+\menu_maxplayers\A játékosok és botok maximális összszáma, ahányan egyszerre a szerverre csatlakozhatnak
+\bot_number\Botok száma a szervereden
+\skill\A botok ügyességi szintjének meghatározása
+\g_maplist_votable\Pályaválasztásnál megjelenő lehetőségek száma egy meccs után
+\sv_vote_simple_majority_factor\Egyszerű többség nyerjen egy szavazásban
+\XonoticMultiplayerDialog/Haladó beállítások...\Haladó szerverbeállítások
+\XonoticMultiplayerDialog/Módosítók...\Módosítók és fegyverarénák
+\g_dodging\El tudsz szökkenni jobbra-balra a lövések elől
+\g_cloaked\Minden játékos majdnem láthatatlan
+\g_footsteps\Lépészaj engedélyezése
+\g_midair\Csak addig tudod az ellenséged megsebezni, amíg az levegőben tartózkodik
+\g_vampire\Annyi pont adódik életerődhöz, amennyi sebzést a másiknak okozol
+\g_bloodloss\Életerőpont, ami alatt a játékos elkábul a vérveszteségtől
+\sv_gravity\A tárgyak lassabban esnek a földre, kisebb érték alacsonyabb gravitációt jelent
+\g_grappling_hook\A játékosok arzenáljában a vonóhorog is szerepelni fog 
+\g_jetpack\A játékosok hátán sugárhajtóműves hátizsák van
+\g_pinata\A játékosok eldobnak minden fegyvert, amit birtokoltak a haláluk előtt
+\g_weapon_stay\A fegyverek a helyükön maradnak, még azután is, hogy valaki felvette őket
+\g_weaponarena\ A kiválasztott fegyver aréna minden játékosnak ugyanazt a fegyvert biztosítja korlátlan lőszerrel, és letiltja minden más fegyver felvételét
+\menu_weaponarena_with_laser\A lézer is engedélyezett a fegyver arénában
+\g_minstagib\A játékosok egy Minstanex-et kapnak, ami egy azonnal ölő mesterlövész fegyver. Ha a játékos kifogy a lőszerből, 10 másodperce van muníciót találni, vagy meghal. A másodlagos tűz mód a lézer, amely nem okoz kárt, de jól jön trükkös ugrások végrehajtásánál
+\g_nix\Xonotic felvehető fegyverek nélkül – Mindenki ugyanazzal a fegyverrel játszik. Kis idő után visszaszámlálás indul, amely végén mindenki fegyvert vált
+\g_nix_with_laser\Mindig legyen a lézer a Nix mellett kiegészítésül 
+\XonoticMultiplayerDialog/Mind jelölve\Minden pálya kiválasztása
+\XonoticMultiplayerDialog/Egyet se jelölj be\Egyik pálya sincs kiválasztva
+
+
+\XonoticMultiplayerDialog/Timedemo\Leméri, hogy a számítógéped milyen gyorsan képes futtatni a kiválasztott demót. 
+
+\fov\A látószög fokban mérve 60-tól 130-ig, alapérték 90
+\cl_bobcycle\A megjelenített kép biccentése járás közben.
+\cl_zoomfactor\A nagyítási szorzó a ráközelítés gomb megnyomása esetén
+\cl_zoomsensitivity\Mennyire változtatja a nagyítás az egér érzékenységet, 0-tól (kisebb érzékenység) 1-ig (nem változik az érzékenység)
+\cl_zoomspeed\Milyen gyorsan hajtsa végre a távcső a nagyítást. Tiltás esetén a nagyítás azonnal végbemegy
+\XonoticMultiplayerDialog/Fegyver beállítások...\A legkedveltebb fegyver, önműködő fegyverváltás és fegyvermodell pozíciójának beállításai 
+
+\cl_weaponpriority_useforcycling\A fenti lista használata, amikor az egérgörgővel lépkedsz a fegyverek között 
+\cl_autoswitch\Önmagától átvált az újonnan felvett fegyverekre, ha azok jobbak az addig használtnál
+\r_drawviewmodel\Fegyvermodell kirajzolása
+\cl_gunalign\Fegyvermodell helyzete; játék közben újracsatlakozás szükséges az adott szerverhez
+
+\crosshair_per_weapon\Különböző célkeresztek beállítása az éppen kézben tartott fegyverhez; hasznos lehet fegyvermodell nélküli játék során
+\crosshair_color_per_weapon\A célkereszt színének változtatása az éppen kézben tartott fegyvertől függően
+\crosshair_size\ A célkereszt méretének megváltoztatása
+\crosshair_alpha\A célkereszt átlátszóságának megváltoztatása
+\crosshair_color\A célkereszt színének megváltoztatása 
+\sbar_hudselector\A régi HUD elrendezés használata
+\XonoticMultiplayerDialog/Irányjelzők beállításai...\-
+\_cl_name\A név, amivel szerepelsz a játékban
+
+\XonoticSettingsDialog\A beállítások megváltoztatása
+\XonoticCreditsDialog\A Xonotic készítőinek és segítségnyújtóinak listája
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Kilépés a játékból
+\XonoticQuitDialog/Igen\Vissza a munkához...
+\XonoticQuitDialog/Nem\A mészárlás folytatódik!
+
+\XonoticSettingsDialog/Bemenet\Bemenet szabályozása
+\sensitivity\Egér sebesség többszörözése
+\menu_mouse_speed\Egér sebessége a menüben, nincs hatással a játékbeli célzásra
+\m_filter\Elsimítja az egérmozgást, de a célzás érzékenység némiképp csökken
+\m_pitch\Fordított egérmozgás az Y-tengely mentén
+\vid_dgamouse\Segíti a DGA egér bemenet használatát
+\con_closeontoggleconsole\Lehetővé teszi, hogy a konzolnyitó billentyű, a következő megnyomásra visszazárja azt
+
+\XonoticSettingsDialog/Kép\Kép beállítások
+\vid_width\Képernyő felbontás
+\vid_bitsperpixel\Hány bit per pixel(BPP)-el jelenítse meg a képet, 32 az ajánlott
+\vid_fullscreen\Teljes képernyős mód engedélyezése (alapértelmezett: engedélyezve)
+\vid_vsync\A függőleges szinkronizáció engedélyezése, hogy  megelőzze a kép szétesését, a másodpercenkénti képkockák számát a képernyő frissítési rátához igazítja (alapértelmezett: letiltva)
+\r_glsl\Az OpenGL 2.0 pixel árnyalók  alkalmazása a világításhoz (alapértelmezett: engedélyezve)
+\gl_vbo\A statikus geometriákhoz Vertex Buffer Object-eket  használ a videómemóriában a gyorsabb számítás érdekében (alapértelmezett: Csúcspontok és háromszögek)
+\r_depthfirst\Eltávolítja a kép csak a távolban tartozó részeit, mielőtt a normál számítás kezdődne (alapértelmezett: letiltva)
+\gl_texturecompression\Textúrák tömörítése, hogy a videokártyán található memóriából kevesebbet használjon (alapértelmezett: nem)
+\gl_finish\A CPU megvárja amíg a GPU befejezi a képkockát leképzését, ez segít egyes gépeken jelentkező furcsa bemeneti és videó késés elkerülésében (alapértelmezett: letiltva)
+\v_brightness\A fekete fényessége (alapérték: 0)
+\v_contrast\A fehér fényessége (alapérték: 1)
+\v_gamma\Fordított gamma korrekciós érték, egy fényességi hatás , ami nem befolyásolja a fehéret vagy feketét (alapérték: 1.125)
+\v_contrastboost\Milyen mértékben erősítse a sötét területek kontrasztját (alapérték: 1)
+\r_glsl_saturation\Színtelítettség beállítása  (0 = szürke, 1 = normál, 2 = túltelített ), GLSL színkezelés szükséges (alapérték: 1)
+\v_glslgamma\A GLSL alkalmazása a gamma korrekcióhoz, Megjegyzendő, hogy jelentősen csökkenheti a teljesítményt  (alapértelmezett: letiltva)
+\r_ambient\Környezeti világítás, ha túl magasra van állítva a térkép fakónak és laposnak tűnhet (alapérték: 4)
+\r_hdr_scenebrightness\Általános  számítási világosság  (alapérték: 1)
+\vid_samples\Élsimítás engedélyezés, 3D-s tárgyak szélének csipkézettségét csökkenti. Megjegyzendő, hogy jelentősen csökkenheti a teljesítményt  (alapértelmezett: letiltva)
+\v_flipped\Szegény ember bal kezes módja (alapértelmezett: ki)
+
+****
+\XonoticSettingsDialog/Hatások\Hatások beállítása
+\r_subdivisions_tolerance\Az ívek finomságának változtatása a pályán (alapértelmezett: normál)
+\gl_picmip\ A textúrák élességének változtatása. Kisebb érték hatásosan csökkenti a textúra memória használatot, de a textúrák megjelenése homályosabb lehet. (alapértelmezett: jó)
+\r_picmipworld\Ha ha be van állítva, csak a modellek textúra minősége csökken (alapértelmezett: engedélyezve)
+\mod_q3bsp_nolightmaps\Magas felbontású fény térképek használata, ami szépen néz ki, de megemeli a szükséges videó memória mennyiségét (alapértelmezett: engedélyezve)
+\cl_particles_quality\A részecskék számának megtöbbszörözése. Kisebb érték kevesebb részecskét jelent, ami jobb teljesítményt ad (alapérték: 0,5)
+\r_drawparticles_drawdistance\A részecskék csak eddig a távolsági rajzolódnak ki  (alapérték: 1000)
+\cl_decals\Foltok engedélyzése (égési és robbanási nyomok, vérfoltok)  (alapértelmezett: engedélyezve)
+\r_drawdecals_drawdistance\A minták csak eddig a távolsági rajzolódnak ki (alapérték: 300)
+\cl_decals_time\A foltok eltűnésének kezdetének időtartama másodpercben (alapérték: 2)
+\cl_gentle\Kicseréli a vért és húscafatokat olyan tartalomra, ami nem tartalmaz vérontást (alapértelmezett: letiltva)
+\cl_nogibs\A húscafatok mennyiségének csökkentése vagy teljesen eltávolítása (alapértelmezett: sok)
+\v_kicktime\Mennyi ideig legyen a kép kiütve a  sérülés után (alapérték: 0)
+\gl_texture_anisotropy\Anizotropikus  szűrés minősége (alapérték: 1x)
+\r_glsl_deluxemapping\Képpontokkénti világítás hatások használata (alapértelmezett: engedélyezve)
+\r_shadow_gloss\Csillogás a textúrákon, amik támogatják azt (alapértelmezett: engedélyezve)
+\gl_flashblend\A gyorsabb, de csúnyább dinamikus fények engedélyezése a világos fénykörök számításához, a valós dinamikus világítás helyett (alapértelmezett: letiltva)
+\r_shadow_realtime_dlight\A dinamikus világítások engedélyezése, mint robbanások és rakéták fényei (alapértelmezett: engedélyezve)
+\r_shadow_realtime_dlight_shadows\Árnyékok számítása a dinamikus fényekből (alapértelmezett: letiltva)
+\r_shadow_realtime_world\A teljes valósidejű világ világítások engedélyezése azokon a térképeken, amik támogatják Megjegyzendő, hogy jelentősen csökkenheti a teljesítményt  (alapértelmezett: letiltva)
+\r_shadow_realtime_world_shadows\A valósidejű világ fényekhez tartozó árnyékok engedélyezése (alapértelmezett: letiltva)
+\r_shadow_usenormalmap\Irányított árnyékok használatának engedélye a textúrákon (alapértelmezett: engedélyezve)
+\r_showsurfaces\Textúra összetettség letiltása nagyon lassú gépeken. Ez egy  nagy gyorsulást hozz a teljesítményben, de nagyon csúnyán néz ki. (alapértelmezett: letiltva)
+\r_glsl_offsetmapping\Offset mapping hatás , ami rücskössé teszi a textúrák megjelenését, mintha kiállna a 2D-s felületből (alapértelmezett: letiltva)
+\r_glsl_offsetmapping_reliefmapping\Magasabb minőségű offset mapping, ami szintén óriási hatása van a teljesítményre   (alapértelmezett: letiltva)
+\r_water\Tükröződések és fénytörések minősége, óriási hatással van a teljesítményre azokon a pályákon, ahol vannak tükröződő felületek (alapértelmezett: letiltva)
+\r_water_resolutionmultiplier\Tükröződések/fénytörések felbontása (alapértelmezett: jó)
+\r_coronas\A fényudvar engedélyezése bizonyos világítás körül. (alapértelmezett: engedélyezve)
+\r_coronas_occlusionquery\A fényudvar elhalványodik a láthatósága szerint (alapértelmezett: engedélyezve)
+\r_bloom\A bloom hatás engedélyezése, aminél a nagyon világos pixelek növelik a szomszédaik világosságát is. Nagy hatással van a teljesítményre. (alapértelmezett: letiltva)
+\r_hdr\A bloom magas minőségű verziója, ami óriási hatással van a teljesítményre. (alapértelmezett: letiltva)
+\r_motionblur\Mozgási elmosódás nagysága - ajánlott értéke 0.5
+\r_damageblur\Mozgási elmosódás mértéke sérülés esetén – ajánlott értéke 0.4 
+
+****
+\XonoticSettingsDialog/Hang\Hang beállítás
+\mastervolume\-
+\bgmvolume\-
+\snd_staticvolume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
+\snd_speed\Hang kimenet frekvenciája
+\snd_channels\A hang kimenet csatornáinak száma 
+\snd_swapstereo\Jobb/bal csatorna felcserélése
+\snd_spatialization_control\Közelítés engedélyezése (kissé összemossa a jobb és bal csatornát, hogy csökkentse a sztereó szétválasztást a fejhallgatókban)
+\cl_voice_directional\Irányított hangok engedélyezése
+\cl_voice_directional_taunt_attenuation\A távolság, ahonnan a gúnyolódás még hallható
+\cl_autotaunt\Az ellenség mindig gúnyolódik, ha legyüröd
+\cl_sound_maptime_warning\Kihirdető hang, ami a meccsből hátralévő percekről tájékoztat
+\cl_hitsound\Egy találatjelző hang, ha sikeres lövés vittél be az ellenségre
+\menu_sounds\Hang lejátszás, ha klikkelsz vagy a menüpontok fölött siklasz
+
+\XonoticSettingsDialog/Hálózat\Hálózat beállítások
+\cl_movement\Kliensoldali mozgás jóslás engedélyezés
+\cl_nolerp\Engedélyezi a hálózat frissítés simítását
+\shownetgraph\Csomagméret és egyéb információk grafikonjának kirajzolása
+\_cl_rate\A hálózat sebessége határozható meg ezzel a csúszkával
+\cl_netfps\A szervernek küldött bemeneti csomagot másodpercenkénti száma 
+\cl_curl_maxdownloads\Az egyszerre futó HTTP/FTP letöltések maximális száma
+\cl_curl_maxspeed\Maximum letöltési sebesség
+\cl_port\Kényszeríti a klienst, hogy a választott portot használja, amíg nem 0 az érték
+
+\XonoticSettingsDialog/Egyéb\Egyéb beállítások
+\showtime\Az aktuális időt mutatja, kép mentésekor hasznos
+\showdate\Az aktuális dátumot mutatja, kép mentésekor hasznos
+\showfps\A másodpercenként megjelenített képkockák száma
+
+\XonoticSettingsDialog/Haladó beállítások...\Haladó beállítások, ahol finomíthatod a játék minden egyes változóját
+\g_friendlyfire\Sérülés százaléka, amit a csapattársadnak okozol
+\g_mirrordamage\Általad okozott csapatsérülés százaléka, amit te szenvedsz el
+\g_tdm_teams_override\Csapatjátékban felülbírálja a csapatok számának alapbeállítását
+
+\viewsize\HUD háttér engedélyezés/letiltás
+\cl_hidewaypoints\Különböző játéktípus specifikus iránypontok mutatása
+\g_waypointsprite_scale\Az iránypontok szorzódásának mértéke
+\g_waypointsprite_alpha\Az iránypontok átlátszóságának ellenőrzése
+\cl_shownames\Az éppen célba vett játékos nevének mutatása
+
+\crosshair_hittest\Nincs: a találat nincs hatással a célkeresztre; Valós célzás: elmossa a célkeresztet, mikor nem a falat találod el; Ellenségek: Fel is nagyítja a célkeresztet, mikor egy ellenfelet találsz el
diff --git a/tooltips.db.uk b/tooltips.db.uk
new file mode 100644 (file)
index 0000000..97dec8c
--- /dev/null
@@ -0,0 +1,201 @@
+0
+\XonoticSingleplayerDialog\Почніть одиночну кампанію або випадковий бій проти ботів
+
+
+\XonoticMultiplayerDialog\Грайте по інтернету, локальній мережі, переглядайте демо та змінюйте налаштування гравця
+\XonoticMultiplayerDialog/Сервери\Знайти сервери для гри
+\menu_slist_showempty\Показувати порожні сервери
+\menu_slist_showfull\Показувати повні сервери без вільних місць
+\net_slist_pause\Призупинити оновлення списку серверів для зручнішого вибору
+\XonoticMultiplayerDialog/Відомості...\Показати більше інформації про виділений сервер
+\XonoticMultiplayerDialog/Закладка\Зробити закладку на цьому сервері для того, щоб потім знаходити його швидше
+\XonoticMultiplayerDialog/Створити\Почніть свою власну гру
+\XonoticMultiplayerDialog/Демо\Знайдіть та перегляньте демо записи
+\XonoticMultiplayerDialog/Гравець\Налаштування вашого гравця
+
+\XonoticTeamSelectDialog/обрати підхожу команду (автовибір)\Автоматично обрати команду (рекомендується)
+\XonoticTeamSelectDialog/червона\Приєднатися до червоної команди
+\XonoticTeamSelectDialog/синя\Приєднатися до синьої команди
+\XonoticTeamSelectDialog/жовта\Приєднатися до жовтої команди
+\XonoticTeamSelectDialog/рожева\Приєднатися до рожевої команди
+
+\timelimit_override\Час, після якого матч закінчиться
+\fraglimit_override\Кількість фрагів, яка потрібна для закінчення матчу
+\menu_maxplayers\Максимальна кількість гравців та ботів на вашому сервері
+\bot_number\Кількість ботів на вашому сервері
+\skill\Вкажіть досвідченість ботів
+\g_maplist_votable\Кількість мап які будуть доступні для голосування у кінці матчу
+\sv_vote_simple_majority_factor\Проста більшість перемагає в голосуванні
+\XonoticMultiplayerDialog/Додаткові налаштування...\Додаткові налаштування сервера
+\XonoticMultiplayerDialog/Мутатори...\Мутатори і арени
+\g_dodging\Вмикає ухилення
+\g_cloaked\Всі гравці майже невидимі
+\g_footsteps\Вмикає звуки кроків
+\g_midair\Шкоду можливо нанести тільки коли ворог у повітрі
+\g_vampire\Шкода яку ви наносите ворогам додається до вашого здоров'я
+\g_bloodloss\Кількість здоров'я, нижче за яку гравець буде паралізований від втрати крові
+\sv_gravity\Предмети падатимуть повільніше, менше значення робить гравітацію нижче
+\g_grappling_hook\Гравці отримують гак
+\g_jetpack\Гравці отримують реактивний ранець
+\g_pinata\Після того, як гравця вб'ють, з нього випаде вся зброя яку він мав
+\g_weapon_stay\Зброя залишається після того, як була підібраною
+\g_weaponarena\Вибір арени з окремою зброєю дасть гравцям цю зброю і необмежену кількість боєприпасів до неї, і прибере з мапи всю іншу зброю
+\menu_weaponarena_with_laser\Зробити лазер доступним на аренах
+\g_minstagib\Гравці отримують МінстаНекс, рейкову гармату яка вбиває одним пострілом. Якщо гравець витратить усі боєприпаси, у нього буде десять секунд щоб поновити його, інакше він загине. Альтернативний вогонь гармати це лазер який не наносить шкоди, корисний для трюків
+\g_nix\Нікс (No items Xonotic) - замість того щоб підбирати предмети, всі гравці грають з однією зброєю. Через деякий час почнеться відлік, і зброя у всіх зміниться на іншу
+\g_nix_with_laser\Зробити лазер доступним у Нікс
+\XonoticMultiplayerDialog/Обрати все\Обрати всі мапи
+\XonoticMultiplayerDialog/Обрати нічого\Зняти вибір з усіх мап
+
+
+\XonoticMultiplayerDialog/Тест продуктивності\Перевірте як швидко ваш комп'ютер зможе програти обране демо
+
+\fov\Поле огляду у градусах, від 60 до 130, 90 за замовчуванням
+\cl_bobcycle\Частота гойдання, вимкнути щоб прибрати гойдання
+\cl_zoomfactor\Сила зуму коли натиснута клавіша
+\cl_zoomsensitivity\Як зум змінює чутливість миші, від 0 (зменшує чутливість) до 1 (без змін)
+\cl_zoomspeed\Швидкість зуму, вимкніть щоб збільшувати зображення миттєво
+\XonoticMultiplayerDialog/Налаштування зброї...\Вкажіть зброю якій ви надаєте перевагу, налаштуйте автоматичне перемикання та моделі зброї
+
+\cl_weaponpriority_useforcycling\Використовувати список вгорі під час вибору зброї колесиком миші
+\cl_autoswitch\Автоматично перемикатися на щойно підняту зброю, якщо вона краща за ту, що ви тримаєте у руках
+\r_drawviewmodel\Показувати модель зброї
+\cl_gunalign\Положення моделі зброї, потрібно буде з'єднатися знову
+
+\crosshair_per_weapon\Встановити приціл для кожної зброї окремо, корисно для гри без моделей зброї
+\crosshair_color_per_weapon\Колір прицілу буде залежати від кожної окремої зброї
+\crosshair_size\Встановити розмір прицілу
+\crosshair_alpha\Встановити прозорість прицілу
+\crosshair_color\Встановити колір прицілу
+\sbar_hudselector\Використовувати старе розміщення HUD
+\XonoticMultiplayerDialog/Налаштування дороговказів...\-
+\_cl_name\Ім'я під яким ви з'явитесь у грі
+
+\XonoticSettingsDialog\Змінити налаштування гри
+\XonoticCreditsDialog\Розробники Xonotic
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Вийти з гри
+\XonoticQuitDialog/Так\Назад до роботи...
+\XonoticQuitDialog/Ні\На мене чекають ще кілька фрагів!
+
+\XonoticSettingsDialog/Керування\Налаштування керування
+\sensitivity\Швидкість миші
+\menu_mouse_speed\Швидкість миші у меню, не впливає на ігровий процес
+\m_filter\Згладжування руху миші
+\m_pitch\Інвертувати рух миші по осі Y
+\vid_dgamouse\Використовувати ввід DGA для миші
+\con_closeontoggleconsole\Дозволяє закривати і відкривати консоль однією клавішею
+
+\XonoticSettingsDialog/Відео\Налаштування відео
+\vid_width\Роздільність екрану
+\vid_bitsperpixel\Скільки використовувати бітів на піксель (BPP), рекомендується 32
+\vid_fullscreen\На повний екран (за замовчуванням: увімкнуто)
+\vid_vsync\Вмикає вертикальну синхронізацію щоб запобігти розривам зображення, ваші FPS не будуть підніматися вище швидкості оновлення монітору (за замовчуванням: увімкнуто)
+\r_glsl\Вмикає піксельні шейдери OpenGL 2.0 для освітлення (за замовчуванням: увімкнуто)
+\gl_vbo\Використовувати Vertex Buffer Objects щоб зберігати нерухому геометрію у відеопам'яті для прискорення рендеренгу (за замовчуванням: вершини та трикутники)
+\r_depthfirst\Прибирає перекриття одних пікселів іншими створюючи спочатку версію сцени з лише глибиною (за замовчуванням: вимкнуто)
+\gl_texturecompression\Стискати текстури для відеокарт з малою кількістю відеопам'яті (за замовчуванням: вимкнуто)
+\gl_finish\Центральний процесор буде чекати, поки GPU відеокарти не закінчить кадр, може допомогти на деяких системах при деяких проблемах (за замовчуванням: вимкнуто)
+\v_brightness\Яскравіcть чорного (за замовчуванням: 0)
+\v_contrast\Яскравість білого (за замовчуванням: 1)
+\v_gamma\Яскравість що не впливає на білий та чорний колір (за замовчуванням: 1.125)
+\v_contrastboost\На скільки збільшувати контраст в темних місцях (за замовчуванням: 1)
+\r_glsl_saturation\Корекція насиченості (0 = чорно-біла, 1 = нормальна, 2 = перенасичена), необхідно використовувати шейдери GLSL для контролю кольором (за замовчуванням: 1)
+\v_glslgamma\Вмикає GLSL для використання корекції гамми, може мати сильній вплив на продуктивність (за замовчуванням: вимкнуто)
+\r_ambient\Навколишнє освітлення, якщо значення надто високе, то освітлення на мапах стає приглушеним та плоским (за замовчуванням: 4)
+\r_hdr_scenebrightness\Яскравість (за замовчуванням: 1)
+\vid_samples\Увімкнути антиаліасинг, який буде згладжувати грані 3D поверхонь. Прийміть до уваги, що це може сильно зменшити продуктивність. (за замовчуванням: вимкнуто)
+\v_flipped\Простий режим для лівші (за замовчуванням: вимкнуто)
+
+\XonoticSettingsDialog/Ефекти\Налаштування ефектів
+\r_subdivisions_tolerance\Змінити рівність кривих на мапі (за замовчуванням: нормально)
+\gl_picmip\Чіткість текстур. Зниження параметру зменшить використання відеопам'яті, але зробить текстури нечіткими (за замовчуванням: добре)
+\r_picmipworld\Знижує якість текстур тільки на моделях (за замовчуванням: увімкнуто)
+\mod_q3bsp_nolightmaps\Використовувати мапи освітлення з високою роздільністю, красиві, але використовують більше відеопам'яті (за замовчуванням: увімкнуто)
+\cl_particles_quality\Кількість часток, чим менша кількість тим менший вплив на продуктивність (за замовчуванням: 0.5)
+\r_drawparticles_drawdistance\Частки на відстані більшій ніж ця не будуть створюватись (за замовчуванням: 1000)
+\cl_decals\Сліди від куль та пострілів (за замовчуванням: увімкнуто)
+\r_drawdecals_drawdistance\Сліди на відстані більшій ніж ця не будуть створюватись (за замовчуванням: 300)
+\cl_decals_time\Час у секундах після якого сліди зникатимуть (за замовчуванням: 2)
+\cl_gentle\Замінити шматки тіла та кров не жорстокими елементами (за замовчуванням: вимкнуто)
+\cl_nogibs\Зменшити кількість шматків тіла, або відключити їх зовсім (за замовчуванням: багато)
+\v_kicktime\Як довго триватиме поштовх від ураження (за замовчуванням: 0)
+\gl_texture_anisotropy\Якість анізотропної фільтрації (за замовчуванням: 1x)
+\r_glsl_deluxemapping\Використовувати попіксельні ефекти освітлення (за замовчуванням: увімкнуто)
+\r_shadow_gloss\Вмикає використання мап блиску на текстурах, які їх підтримують (за замовчуванням: увімкнуто)
+\gl_flashblend\Вмикає швидкіше, але не таке гарне динамічне освітлення за допомогою яскравих корон, а не справжніх динамічних вогнів (за замовчуванням: вимкнуто)
+\r_shadow_realtime_dlight\Вмикає рендеринг динамічних вогнів від вибухів та ракет (за замовчуванням: увімкнуто)
+\r_shadow_realtime_dlight_shadows\Вмикає тіні від динамічних джерел освітлення (за замовчуванням: вимкнуто)
+\r_shadow_realtime_world\Вмикає повний рендеринг динамічного освітлення світу, може мати сильний вплив на продуктивність. (за замовчуванням: вимкнуто)
+\r_shadow_realtime_world_shadows\Вмикає тіні від динамічних джерел освітлення світу (за замовчуванням: увімкнуто)
+\r_shadow_usenormalmap\Вмикає використання directional shading на текстурах (за замовчуванням: увімкнуто)
+\r_showsurfaces\Вимикає текстури повністю, для дуже слабких систем. Покращує продуктивність, але виглядає погано (за замовчуванням: вимкнуто)
+\r_glsl_offsetmapping\Офсетне текстурування, що змусить текстури з мапами висот виглядати об'ємними (за замовчуванням: вимкнуто)
+\r_glsl_offsetmapping_reliefmapping\Якісніше офсетне текстурування, має великий вплив на продуктивність (за замовчуванням: вимкнуто)
+\r_water\Якість віддзеркалень та заломлень, сильно впливає на продуктивність на мапах, де є дзеркальні поверхні (за замовчуванням: вимкнуто)
+\r_water_resolutionmultiplier\Роздільність віддзеркалень/заломлень (за замовчуванням: увімкнуто)
+\r_coronas\Увімкнути сонячні корони навколо деяких джерел освітлення (за замовчуванням: увімкнуто)
+\r_coronas_occlusionquery\Прибирати корони відповідно з видимістю (за замовчуванням: увімкнуто)
+\r_bloom\Увімкнути ефект bloom, який освітлює ближні пікселі дуже яскравих пікселів. Має сильний вплив на продуктивність (за замовчуванням: вимкнуто)
+\r_hdr\Якісніша версія ефекту bloom, сильно впливає на продуктивність (за замовчуванням: вимкнуто)
+\r_motionblur\Сила ефекту motion blur - рекомендується 0.5
+\r_damageblur\Кількість motion blur під час поранення - рекомендується 0.4
+
+\XonoticSettingsDialog/Звук\Налаштування аудіо
+\mastervolume\-
+\bgmvolume\-
+\snd_staticvolume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
+\snd_speed\Частотність звуку
+\snd_channels\Кількість каналів
+\snd_swapstereo\Поміняти місцями лівий та правий канал
+\snd_spatialization_control\Злегка змішати правий та лівий канали щоб трохи зменшити розділення стерео для навушників
+\cl_voice_directional\Вмикає просторові голоси
+\cl_voice_directional_taunt_attenuation\Відстань на якій можливо почути глузування
+\cl_autotaunt\Автоматично глузувати над ворогами після того, як ви вбили їх
+\cl_sound_maptime_warning\Увімкнути попередження про те, скільки залишилося часу до кінця матчу
+\cl_hitsound\Грати спеціальний звук коли ви влучаєте у ворога
+\menu_sounds\Увімкнути звуки меню
+
+\XonoticSettingsDialog/Мережа\Налаштування мережі
+\cl_movement\Увімкнути передбачення руху зі сторони клієнта
+\cl_nolerp\Увімкнути згладжування оновлення мережі
+\shownetgraph\Показувати графік розмірів пакетів та іншої інформації
+\_cl_rate\Вкажіть швидкість вашої мережі
+\cl_netfps\Скільки вхідних пакетів посилати серверу кожну секунду
+\cl_curl_maxdownloads\Максимальна кількість одночасних HTTP/FTP завантажень
+\cl_curl_maxspeed\Максимальна швидкість завантаження
+\cl_port\Змушувати клієнта використовувати обраний порт, але тільки якщо значення не 0
+
+\XonoticSettingsDialog/Різне\Різні налаштування
+\showtime\Показувати поточний час, корисно для скриншотів
+\showdate\Показувати поточну дату, корисно для скриншотів
+\showfps\Показувати лічильник кадрів за секунду
+
+\XonoticSettingsDialog/Додаткові налаштування...\Тут ви зможете змінити будь-які деталі гри
+\g_friendlyfire\Процент шкоди яку ви будете наносити товаришам по команді 
+\g_mirrordamage\Процент від шкоди що ви нанесли товаришу по команді який буде віддзеркалений вам
+\g_tdm_teams_override\Переписати клькість команд за замовчуванням в командних іграх
+
+\viewsize\Увімкнути/вимкнути фон HUD
+\cl_hidewaypoints\Показувати дороговкази різний ігрових режимів
+\g_waypointsprite_scale\Вкажіть розмір дороговказів
+\g_waypointsprite_alpha\Вкажіть прозорість дороговказів
+\cl_shownames\Показувати ім'я гравця в якого ви цілитися
+
+\crosshair_hittest\Жодного: не проводити тест на влучання для прицілу; TrueAim: робити приціл нечітким коли ви не влучите у стіну; Вороги: також збільшувати приціл коли ви влучите у ворога
index 485c84d143d3b0849b2ee278a4c5be576deabe1e..2e60c679fc341d4b3cf000f758b1e84ee8b9bad8 100644 (file)
@@ -32,6 +32,7 @@ nifrek
 FruitieX
 MirceaKitsune
 Jakob "tZork" Markström Gröhn
+Ruszkai "C.Brutail" Ákos
 
 *Music / Sound FX
 mand1nga
@@ -51,6 +52,7 @@ Jakob "tZork" Markström Gröhn
 *Marketing / PR
 Tyler "-z-" Mulligan
 mand1nga
+Ruszkai "C.Brutail" Ákos
 
 *Legal
 Rudolf "divVerent" Polzer
@@ -81,6 +83,7 @@ Maxime "Taximus" Paradis
 
 *Hungarian
 xaN1C4n3
+Ruszkai "C.Brutail" Ákos
 
 *Italian
 Antonio "terencehill" Piu
@@ -102,6 +105,9 @@ Rodrigo Mouton Laudin
 *Swedish
 marcus256
 
+*Ukrainian
+Vasyl "Harmata" Melnyk
+
 **Other Active Contributors
 Akari
 Ant "Antibody" Zucaro
@@ -126,7 +132,6 @@ parasti
 Paul Scott
 PlasmaSheep
 Przemysław "atheros" Grzywacz
-Ruszkai "C.Brutail" Ákos
 {SC0RP} - Ian "ID" Dorrell
 Severin "sev" Meyer
 SoulKeeper_p
index 470aabad9ee9a33128f6f926b530b2039c260bab..ec2d299a80928cfd63bb5b59af455ebf95036ee1 100644 (file)
@@ -27,6 +27,7 @@ Pearce "theShadow" Michal
 *Création des cartes
 FruitieX
 MirceaKitsune
+Ruszkai "C.Brutail" Ákos
 
 *Musique / Sons
 mand1nga
@@ -44,6 +45,7 @@ tZork
 *Marketing / Management du Projet
 Tyler "-z-" Mulligan
 mand1nga
+Ruszkai "C.Brutail" Ákos
 
 *Légalité
 Rudolf "divVerent" Polzer
@@ -88,7 +90,6 @@ Kristian "morfar" Johansson
 kojn
 Maik "SavageX" Merten
 MrBougo
-Ruszkai "C.Brutail" Ákos
 Samual Lenks
 Severin "sev" Meyer
 Stephan "esteel" Stahl
diff --git a/xonotic-credits.txt.hu b/xonotic-credits.txt.hu
new file mode 100644 (file)
index 0000000..faf205b
--- /dev/null
@@ -0,0 +1,207 @@
+**A Csapat magja - Team Xonotic
+
+Rudolf "divVerent" Polzer
+Tyler "-z-" Mulligan
+Merlijn Hofstra
+morphed
+Samual "Ares" Lenks
+Saulo "mand1nga" Gil
+Jakob "tZork" Markström Gröhn
+
+**Feladat felelősök
+
+*Művészet
+Sahil "DiaboliK" Singhal
+
+*2D Művészet / Web
+Tyler "-z-" Mulligan (web / game)
+FruitieX (game / web)
+
+*3D Művészet
+morphed
+
+*Művészeti elképzelés
+LJFHutch
+Pearce "theShadow" Michal
+
+*Animáció
+Sahil "DiaboliK" Singhal
+nifrek
+
+*Pálya tervezés
+FruitieX
+MirceaKitsune
+Jakob "tZork" Markström Gröhn
+Ruszkai "C.Brutail" Ákos
+
+*Zene / Hang effekt
+mand1nga
+Merlijn Hofstra
+remaxim
+Stephan
+
+*Játék motor kiegészitések
+Rudolf "divVerent" Polzer
+
+*Játék kód
+Rudolf "divVerent" Polzer
+FruitieX
+Jakob "tZork" Markström Gröhn
+
+*Marketing / PR
+Tyler "-z-" Mulligan
+mand1nga
+Ruszkai "C.Brutail" Ákos
+
+*Jogi engedélyek
+Rudolf "divVerent" Polzer
+Merlijn Hofstra
+
+**Játék motor
+DarkPlaces
+by Forest "LordHavoc" Hale
+
+
+**Fordítók
+
+*Finn
+Henry "Exitium" Sanmark
+
+*Francia
+Calinou
+Maxime "Taximus" Paradis
+
+*Holland
+Alexander "freefang" van Dam
+PinkRobot
+
+*Magyar
+xaN1C4n3
+Ruszkai "C.Brutail" Ákos
+
+*Német
+Rudolf "divVerent" Polzer
+
+*Olasz
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
+*Orosz
+Lord Canistra
+Nikoli
+
+*Portugál
+Ricardo "Hellgardia" Silva
+
+*Román
+MirceaKitsune
+
+*Spanyol
+Rodrigo Mouton Laudin
+
+*Svéd
+marcus256
+
+**További aktív résztvevők
+Akari
+Ant "Antibody" Zucaro
+Antonio "terencehill" Piu
+atheros
+Ben "MooKow" Banker
+blkrbt
+Calinou
+chooksta
+cortez
+Cuinn "Cuinnton" Herrick
+Florian Paul "lda17h" Schmidt
+kojn
+Kristian "morfar" Johansson
+kuniuthefrogg
+magorian
+Maik "SavageX" Merten
+Marvin "Mirio" Beck
+Mick Rippon
+MrBougo
+parasti
+Paul Scott
+PlasmaSheep
+Przemysław "atheros" Grzywacz
+{SC0RP} - Ian "ID" Dorrell
+Severin "sev" Meyer
+SoulKeeper_p
+Stephan "esteel" Stahl
+The player with the unnecessarily long name
+Wolfgang "Blub\0" Bumiller
+
+**Múltbeli résztvevők
+Alexander "motorsep" Zubov
+Amos "torus" Dudley
+Andreas "Black" Kirsch
+Attila "WW3" Houtkooper
+BigMac
+Braden "meoblast001" Walters
+Brain Younds
+Chris "amethyst7" Matz
+Christian Ice
+Clinton "Kaziganthe" Freeman
+Dan "Digger" Korostelev
+Dan "Wazat" Hale
+Donkey
+dstrek
+Dustin Geeraert
+Edgenetwork
+Edward "Ed" Holness
+Eric "Munyul Verminard" Sambach
+Fabien "H. Reaper" Tschirhart
+FrikaC
+Garth "Zombie" Hendy
+Gerd "Elysis" Raudenbusch
+Gottfried "Toddd" Hofmann
+Henning "Tymo" Janssen
+"Innovati"
+Jitspoe
+Jody Gallagher
+Juergen "LowDragon" Timm
+KadaverJack
+Kevin "Tyrann" Shanahan
+Kurt Dereli
+lcatlnx
+Lee David Ash
+Lee Vermeulen
+leileilol
+Marius "GreEn`mArine" Shekow
+Marko "Urre" Permanto
+Mathieu "Elric" Olivier
+Mattrew "Tronyn" Rye
+MauveBib
+Mephisto
+michaelb
+Michael "Tenshihan" Quinn
+Munyul
+Netzwerg
+NoelCower
+Parapraxis
+Paul "Strahlemann" Evers
+Petithomme
+Q1 Retexturing Project
+Qantourisc
+Rick "Rat" Kelley
+Robert "ai" Kuroto
+Ronan
+Sajt
+Shaggy
+Shank
+Simon O'Callaghan
+SomeGuy
+Spike
+Spirit
+Steve Vermeulen
+Supajoe
+Tei
+Tomaz
+Ulrich Galbraith
+Vortex
+William Libert
+William "Willis" Weilep
+Yves "EviLair" Allaire
+Zenex
diff --git a/xonotic-credits.txt.uk b/xonotic-credits.txt.uk
new file mode 100644 (file)
index 0000000..1b3351d
--- /dev/null
@@ -0,0 +1,208 @@
+**Ядро команди
+
+Rudolf "divVerent" Polzer
+Tyler "-z-" Mulligan
+Merlijn Hofstra
+morphed
+Samual "Ares" Lenks
+Saulo "mand1nga" Gil
+Jakob "tZork" Markström Gröhn
+
+**Координатори
+
+*Художній координатор
+Sahil "DiaboliK" Singhal
+
+*2D контент / Сайт
+Tyler "-z-" Mulligan (сайт / гра)
+FruitieX (гра / сайт)
+
+*3D контент
+morphed
+
+*Концепт-арт
+LJFHutch
+Pearce "theShadow" Michal
+
+*Анімація
+Sahil "DiaboliK" Singhal
+nifrek
+
+*Дизайн рівнів
+FruitieX
+MirceaKitsune
+Jakob "tZork" Markström Gröhn
+Ruszkai "C.Brutail" Ákos
+
+*Музика / Звукові ефекти
+mand1nga
+Merlijn Hofstra
+remaxim
+Stephan
+
+*Додатки до коду рушія та контроль якості
+Rudolf "divVerent" Polzer
+
+*Код гри
+Rudolf "divVerent" Polzer
+FruitieX
+Jakob "tZork" Markström Gröhn
+
+*Маркетинг / PR
+Tyler "-z-" Mulligan
+mand1nga
+Ruszkai "C.Brutail" Ákos
+
+*Правові питання
+Rudolf "divVerent" Polzer
+Merlijn Hofstra
+
+**Ігровий рушій
+DarkPlaces
+by Forest "LordHavoc" Hale
+
+**Перекладачі
+
+*Голландська мова
+Alexander "freefang" van Dam
+PinkRobot
+
+*Німецька мова
+Rudolf "divVerent" Polzer
+
+*Фінська мова
+Henry "Exitium" Sanmark
+
+*Французька мова
+Calinou
+Maxime "Taximus" Paradis
+
+*Угорська мова
+xaN1C4n3
+
+*Італійська мова
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
+*Португальська мова
+Ricardo "Hellgardia" Silva
+
+*Румунська мова
+MirceaKitsune
+
+*Російська мова
+Lord Canistra
+Nikoli
+
+*Іспанська мова
+Rodrigo Mouton Laudin
+
+*Шведська мова
+marcus256
+
+*Українська мова
+Василь "Harmata" Мельник
+
+**Інші активні помічники
+Akari
+Ant "Antibody" Zucaro
+Antonio "terencehill" Piu
+atheros
+Ben "MooKow" Banker
+blkrbt
+Calinou
+chooksta
+cortez
+Cuinn "Cuinnton" Herrick
+Florian Paul "lda17h" Schmidt
+kojn
+Kristian "morfar" Johansson
+kuniuthefrogg
+magorian
+Maik "SavageX" Merten
+Marvin "Mirio" Beck
+Mick Rippon
+MrBougo
+parasti
+Paul Scott
+PlasmaSheep
+Przemysław "atheros" Grzywacz
+{SC0RP} - Ian "ID" Dorrell
+Severin "sev" Meyer
+SoulKeeper_p
+Stephan "esteel" Stahl
+The player with the unnecessarily long name
+Wolfgang "Blub\0" Bumiller
+
+**Колишні помічники
+Alexander "motorsep" Zubov
+Amos "torus" Dudley
+Andreas "Black" Kirsch
+Attila "WW3" Houtkooper
+BigMac
+Braden "meoblast001" Walters
+Brain Younds
+Chris "amethyst7" Matz
+Christian Ice
+Clinton "Kaziganthe" Freeman
+Dan "Digger" Korostelev
+Dan "Wazat" Hale
+Donkey
+dstrek
+Dustin Geeraert
+Edgenetwork
+Edward "Ed" Holness
+Eric "Munyul Verminard" Sambach
+Fabien "H. Reaper" Tschirhart
+FrikaC
+Garth "Zombie" Hendy
+Gerd "Elysis" Raudenbusch
+Gottfried "Toddd" Hofmann
+Henning "Tymo" Janssen
+"Innovati"
+Jitspoe
+Jody Gallagher
+Juergen "LowDragon" Timm
+KadaverJack
+Kevin "Tyrann" Shanahan
+Kurt Dereli
+lcatlnx
+Lee David Ash
+Lee Vermeulen
+leileilol
+Marius "GreEn`mArine" Shekow
+Marko "Urre" Permanto
+Mathieu "Elric" Olivier
+Mattrew "Tronyn" Rye
+MauveBib
+Mephisto
+michaelb
+Michael "Tenshihan" Quinn
+Munyul
+Netzwerg
+NoelCower
+Parapraxis
+Paul "Strahlemann" Evers
+Petithomme
+Q1 Retexturing Project
+Qantourisc
+Rick "Rat" Kelley
+Robert "ai" Kuroto
+Ronan
+Sajt
+Shaggy
+Shank
+Simon O'Callaghan
+SomeGuy
+Spike
+Spirit
+Steve Vermeulen
+Supajoe
+Tei
+Tomaz
+Ulrich Galbraith
+Vortex
+William Libert
+William "Willis" Weilep
+Yves "EviLair" Allaire
+Zenex