]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Lyberta/TeamplayOverhaul
authorLyberta <lyberta@lyberta.net>
Thu, 8 Mar 2018 15:15:36 +0000 (18:15 +0300)
committerLyberta <lyberta@lyberta.net>
Thu, 8 Mar 2018 15:15:36 +0000 (18:15 +0300)
105 files changed:
.gitlab-ci.yml
.tx/merge-base
bal-wep-xonotic.cfg
common.cs.po
common.gd.po
common.ru.po
effectinfo.txt
gfx/menu/luma/skinvalues.txt
gfx/menu/luminos/skinvalues.txt
gfx/menu/wickedx/skinvalues.txt
gfx/menu/xaw/skinvalues.txt
languages.txt
mutators.cfg
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/main.qc
qcsrc/client/view.qc
qcsrc/common/debug.qh
qcsrc/common/effects/effectinfo.inc
qcsrc/common/mapinfo.qc
qcsrc/common/mutators/mutator/buffs/sv_buffs.qh
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/net_linked.qh
qcsrc/common/physics/player.qc
qcsrc/common/scores.qh
qcsrc/common/stats.qh
qcsrc/common/triggers/trigger/heal.qc
qcsrc/common/triggers/triggers.qc
qcsrc/common/triggers/triggers.qh
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/all.qh
qcsrc/common/weapons/weapon/arc.qc
qcsrc/common/weapons/weapon/hagar.qc
qcsrc/common/wepent.qc
qcsrc/lib/net.qh
qcsrc/lib/string.qh
qcsrc/lib/warpzone/server.qc
qcsrc/menu/anim/animation.qc
qcsrc/menu/anim/animation.qh
qcsrc/menu/item/listbox.qc
qcsrc/menu/item/slider.qh
qcsrc/menu/skin-customizables.inc
qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc
qcsrc/menu/xonotic/dialog_hudpanel_ammo.qh
qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc
qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh
qcsrc/menu/xonotic/dialog_hudpanel_chat.qc
qcsrc/menu/xonotic/dialog_hudpanel_chat.qh
qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc
qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh
qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc
qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh
qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc
qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh
qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc
qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh
qcsrc/menu/xonotic/dialog_hudpanel_modicons.qc
qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh
qcsrc/menu/xonotic/dialog_hudpanel_notification.qc
qcsrc/menu/xonotic/dialog_hudpanel_notification.qh
qcsrc/menu/xonotic/dialog_hudpanel_physics.qc
qcsrc/menu/xonotic/dialog_hudpanel_physics.qh
qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc
qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh
qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc
qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh
qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc
qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh
qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qc
qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh
qcsrc/menu/xonotic/dialog_hudpanel_radar.qc
qcsrc/menu/xonotic/dialog_hudpanel_radar.qh
qcsrc/menu/xonotic/dialog_hudpanel_score.qc
qcsrc/menu/xonotic/dialog_hudpanel_score.qh
qcsrc/menu/xonotic/dialog_hudpanel_timer.qc
qcsrc/menu/xonotic/dialog_hudpanel_timer.qh
qcsrc/menu/xonotic/dialog_hudpanel_vote.qc
qcsrc/menu/xonotic/dialog_hudpanel_vote.qh
qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc
qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc
qcsrc/menu/xonotic/listbox.qh
qcsrc/menu/xonotic/slider.qh
qcsrc/menu/xonotic/statslist.qc
qcsrc/menu/xonotic/textslider.qh
qcsrc/menu/xonotic/util.qc
qcsrc/menu/xonotic/util.qh
qcsrc/server/autocvars.qh
qcsrc/server/client.qc
qcsrc/server/client.qh
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/miscfunctions.qh
qcsrc/server/mutators/events.qh
qcsrc/server/mutators/mutator/gamemode_ca.qc
qcsrc/server/player.qc
qcsrc/server/race.qc
qcsrc/server/scores.qc
qcsrc/server/scores.qh
qcsrc/server/scores_rules.qc
qcsrc/server/spawnpoints.qc
qcsrc/server/weapons/accuracy.qc
qcsrc/server/weapons/selection.qc
qcsrc/server/weapons/tracing.qc
xonotic-server.cfg

index e6ecbcbcb368d095e679623ac0320a490e3a0072..6a842143433c4aad65a2cdaae25dd6aca2212806 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
     - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
     - make
-    - EXPECT=d1a65371174a5210320fa85b3f059d0f
+    - EXPECT=eb10d49149a894afd1c3e8af610dc98f
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index c0ddb1d5fcf165824eec0aa7cb56ef6d8153110a..f60d2b8f88b73fa9b90c0e97acacb0922b866b6e 100644 (file)
@@ -1 +1 @@
-Wed Feb 14 07:23:42 CET 2018
+Mon Mar  5 07:23:48 CET 2018
index ac5be34f3783b822759d7b26922629c1adedd52b..6d81b309f0821d3f2cfce7633c2b6a725d28a3c6 100644 (file)
@@ -750,11 +750,11 @@ set g_balance_arc_beam_heat 0
 set g_balance_arc_burst_heat 5
 set g_balance_arc_beam_maxangle 10
 set g_balance_arc_beam_nonplayerdamage 80
-set g_balance_arc_beam_range 1000
+set g_balance_arc_beam_range 2000
 set g_balance_arc_beam_refire 0.25
 set g_balance_arc_beam_returnspeed 8
-set g_balance_arc_beam_tightness 0.5
-set g_balance_arc_bolt 0
+set g_balance_arc_beam_tightness 0.95
+set g_balance_arc_bolt 1
 set g_balance_arc_bolt_ammo 1
 set g_balance_arc_bolt_damage 25
 set g_balance_arc_bolt_damageforcescale 0
index 50459f52a781624829862800fe7075d476b5b737..5413fe14141f3cbed89c4740f39a0a60bf3b8c5a 100644 (file)
@@ -3,7 +3,8 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# a b <taibr.martin@gmail.com>, 2017
+# Martin Taibr <taibr.martin@gmail.com>, 2017
+# Martin Taibr <taibr.martin@gmail.com>, 2017
 # NONE <nechtom@gmail.com>, 2015
 # Tomáš Volavka <czheron@gmail.com>, 2015
 # Tomáš Volavka <czheron@gmail.com>, 2015
index 60eae07c73420fd7ddc38c637e678578860eacd7..d8a7b894d1a45f21b8a19837945fb2ee5c512ab0 100644 (file)
@@ -3,7 +3,7 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# GunChleoc, 2017
+# GunChleoc, 2017-2018
 # GunChleoc, 2017
 # GunChleoc, 2017
 msgid ""
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-07-09 00:35+0200\n"
-"PO-Revision-Date: 2017-12-08 17:43+0000\n"
+"PO-Revision-Date: 2018-02-28 14:07+0000\n"
 "Last-Translator: GunChleoc\n"
 "Language-Team: Gaelic, Scottish (http://www.transifex.com/team-xonotic/"
 "xonotic/language/gd/)\n"
@@ -1318,7 +1318,7 @@ msgstr "An geama làithreach"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:403
 msgid "Exit Menu"
-msgstr ""
+msgstr "Fàg an clàr-taice"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:415
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
index e6e06c60ff1fa47ca5dbb1d52e4bfb51252889ff..6d72e0a5fb673c3f388f65d134311021610138d6 100644 (file)
@@ -18,7 +18,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-07-09 00:35+0200\n"
-"PO-Revision-Date: 2018-02-13 16:58+0000\n"
+"PO-Revision-Date: 2018-03-04 20:57+0000\n"
 "Last-Translator: Andrei Stepanov\n"
 "Language-Team: Russian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ru/)\n"
@@ -102,12 +102,12 @@ msgstr "бросить оружие"
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #: qcsrc/menu/xonotic/keybinder.qc:41
 msgid "secondary fire"
-msgstr "вÑ\82оÑ\80иÑ\87ный огонь"
+msgstr "алÑ\8cÑ\82еÑ\80наÑ\82ивный огонь"
 
 #: qcsrc/client/hud/panel/infomessages.qc:111
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
-msgstr "^1Нажмите ^3%s^1 для показа информации о режиме игры"
+msgstr "^1Нажмите ^3%s^1 для показа сведений о режиме игры"
 
 #: qcsrc/client/hud/panel/infomessages.qc:111
 #: qcsrc/menu/xonotic/keybinder.qc:94
@@ -120,7 +120,7 @@ msgstr "^1Матч уже начался"
 
 #: qcsrc/client/hud/panel/infomessages.qc:126
 msgid "^1You have no more lives left"
-msgstr "^1У Ð\92ас закончились жизни"
+msgstr "^1У Ð²ас закончились жизни"
 
 #: qcsrc/client/hud/panel/infomessages.qc:128
 #: qcsrc/client/hud/panel/infomessages.qc:131
@@ -136,7 +136,7 @@ msgstr "прыжок"
 #: qcsrc/client/hud/panel/infomessages.qc:139
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
-msgstr "^1Ð\9dаÑ\87ало игры через ^3%d^1 секунд"
+msgstr "^1СÑ\82аÑ\80Ñ\82 игры через ^3%d^1 секунд"
 
 #: qcsrc/client/hud/panel/infomessages.qc:145
 msgid "^2Currently in ^1warmup^2 stage!"
@@ -157,7 +157,7 @@ msgstr "готовность"
 #: qcsrc/client/hud/panel/infomessages.qc:162
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr "%sÐ\9fо Ð³Ð¾Ñ\82овноÑ\81Ñ\82и Ð½Ð°Ð¶Ð¼Ð¸Ñ\82е ^3%s%s"
+msgstr "%sÐ\9dажмиÑ\82е ^3%s%s Ð¿Ð¾ Ð³Ð¾Ñ\82овноÑ\81Ñ\82и"
 
 #: qcsrc/client/hud/panel/infomessages.qc:167
 msgid "^2Waiting for others to ready up to end warmup..."
@@ -174,7 +174,7 @@ msgstr "^2Нажмите ^3%s^2 для завершения разминки"
 
 #: qcsrc/client/hud/panel/infomessages.qc:196
 msgid "Teamnumbers are unbalanced!"
-msgstr "Команды не равны!"
+msgstr "Команды не равны по составу!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:199
 #, c-format
@@ -550,7 +550,7 @@ msgstr "SCO^время"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:80
 msgid "SCO^caps"
-msgstr "SCO^захваты"
+msgstr "SCO^захватов"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:81
 msgid "SCO^captime"
@@ -709,7 +709,7 @@ msgstr "^2scoreboard_columns_set ^7поле1 поле2 ...\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:300
 msgid "The following field names are recognized (case insensitive):\n"
-msgstr "Ð\91Ñ\8bли Ñ\80аÑ\81познанÑ\8b Ñ\81ледÑ\83Ñ\8eÑ\89ие Ð¸Ð¼ÐµÐ½Ð° Ð¿Ð¾Ð»ÐµÐ¹ (без Ñ\83Ñ\87ета регистра):\n"
+msgstr "РаÑ\81познанÑ\8b Ñ\81ледÑ\83Ñ\8eÑ\89ие Ð¸Ð¼ÐµÐ½Ð° Ð¿Ð¾Ð»ÐµÐ¹ (без Ñ\83Ñ\87Ñ\91та регистра):\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:301
 msgid "You can use a ^3|^7 to start the right-aligned fields.\n"
@@ -767,27 +767,29 @@ msgstr "^3сумма^7 фраги - смерти\n"
 msgid ""
 "^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "
 "captured\n"
-msgstr "^3caps^7 Как часто флаг (CTF) или ключ (KeyHunt) был захвачен\n"
+msgstr ""
+"^3caps^7 Как часто флаг (Захват флага) или ключ (Охота за ключами) был "
+"захвачен\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:317
 msgid ""
 "^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "
 "ball (Keepaway) was picked up\n"
 msgstr ""
-"^3pickups^7 Как часто флаг (CTF) или ключ (KeyHunt) или мяч (Keepaway) были "
-"подобраны\n"
+"^3pickups^7 Как часто флаг (Захват флага) или ключ (Охота за ключами) или "
+"мÑ\8fÑ\87 (Ð\9fÑ\80Ñ\8fÑ\82ки) Ð±Ñ\8bли Ð¿Ð¾Ð´Ð¾Ð±Ñ\80анÑ\8b\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:318
 msgid "^3captime^7                  Time of fastest cap (CTF)\n"
-msgstr "^3captime^7 Ð\92Ñ\80емÑ\8f Ð½Ð°Ð¸Ð±Ñ\8bÑ\81Ñ\82Ñ\80ейÑ\88его Ð·Ð°Ñ\85ваÑ\82а(CTF)\n"
+msgstr "^3captime^7 Ð\92Ñ\80емÑ\8f Ð±Ñ\8bÑ\81Ñ\82Ñ\80ейÑ\88его Ð·Ð°Ñ\85ваÑ\82а (CTF)\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:319
 msgid "^3fckills^7                  Number of flag carrier kills\n"
-msgstr "^3фубийств^7 Число убийств флагоносцев\n"
+msgstr "^3фубийств^7 Число убитых флагоносцев\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:320
 msgid "^3returns^7                  Number of flag returns\n"
-msgstr "^3returns^7 Число возращённых флагов\n"
+msgstr "^3returns^7 Число возвращённых флагов\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:321
 msgid "^3drops^7                    Number of flag drops\n"
@@ -847,7 +849,7 @@ msgstr "^3нмубийств^7 Число убийств носителей мя
 msgid ""
 "^3bctime^7                   Total amount of time holding the ball in "
 "Keepaway\n"
-msgstr "^3bctime^7 Общее число продержанных мячей в режиме Keepaway\n"
+msgstr "^3bctime^7 Общее число продержанных мячей в режиме Прятки\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:335
 msgid "^3score^7                    Total score\n"
@@ -873,7 +875,7 @@ msgid ""
 "\n"
 msgstr ""
 "Специальные имена типов игры 'teams' и 'noteams' могут быть\n"
-"иÑ\81полÑ\8cзованÑ\8b Ð´Ð»Ñ\8f Ð²ÐºÐ»Ñ\8eÑ\87ениÑ\8f²Ñ\8bключения ВСЕХ командных/не\n"
+"иÑ\81полÑ\8cзованÑ\8b Ð´Ð»Ñ\8f Ð²ÐºÐ»Ñ\8eÑ\87ениÑ\8f¾Ñ\82ключения ВСЕХ командных/не\n"
 "командных игровых режимов.\n"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:346
@@ -911,7 +913,7 @@ msgstr "Н/Д"
 #: qcsrc/client/hud/panel/scoreboard.qc:1156
 #, c-format
 msgid "Accuracy stats (average %d%%)"
-msgstr "СÑ\82аÑ\82иÑ\81Ñ\82ика Ñ\82оÑ\87ноÑ\81Ñ\82и (средняя %d%%)"
+msgstr "ТоÑ\87ноÑ\81Ñ\82Ñ\8c Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ð¹ (средняя %d%%)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1295
 msgid "Map stats:"
@@ -998,7 +1000,7 @@ msgstr " по достижению лидерства в ^3%s %s^7"
 #: qcsrc/client/hud/panel/scoreboard.qc:1688
 #, c-format
 msgid "^1Respawning in ^3%s^1..."
-msgstr "^1Возрождение после ^3%s^1..."
+msgstr "^1Возрождение через ^3%s^1..."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1698
 #, c-format
@@ -1020,7 +1022,7 @@ msgstr "^2Имя ^7вместо \"^1Anonymous player^7\" в статистике
 
 #: qcsrc/client/hud/panel/vote.qc:115
 msgid "A vote has been called for:"
-msgstr "Ð\93олоÑ\81ование Ð±Ñ\8bло Ñ\81оздано для:"
+msgstr "Создано Ð³Ð¾Ð»Ð¾Ñ\81ование для:"
 
 #: qcsrc/client/hud/panel/vote.qc:117
 msgid "Allow servers to store and display your name?"
@@ -1076,7 +1078,7 @@ msgstr "км/ч"
 
 #: qcsrc/client/main.qc:1020
 msgid " mph"
-msgstr "милÑ\8f/ч"
+msgstr "милÑ\8c/ч"
 
 #: qcsrc/client/main.qc:1022
 msgid " knots"
@@ -1122,7 +1124,7 @@ msgstr ""
 
 #: qcsrc/client/mapvoting.qc:507
 msgid "^1Error:^7 Couldn't find pak index.\n"
-msgstr "^1Error:^7 Невозможно найти индекс пака.\n"
+msgstr "^1Error:^7 Не удалось найти индекс пака.\n"
 
 #: qcsrc/client/mapvoting.qc:516
 msgid "Requesting preview...\n"
@@ -1162,7 +1164,7 @@ msgstr "Большая броня"
 
 #: qcsrc/common/items/item/armor.qh:147
 msgid "Mega armor"
-msgstr "Мега броня"
+msgstr "Мега-броня"
 
 #: qcsrc/common/items/item/health.qh:111
 msgid "Big health"
@@ -1178,7 +1180,7 @@ msgstr "Реактивный ранец"
 
 #: qcsrc/common/items/item/jetpack.qh:82
 msgid "Fuel regen"
-msgstr "ЭнеÑ\80гиÑ\8f Ñ\80егенеÑ\80аÑ\86ии"
+msgstr "РегенеÑ\80аÑ\82оÑ\80 Ñ\82оплива"
 
 #: qcsrc/common/items/item/powerup.qh:44
 msgid "Strength"
@@ -1364,11 +1366,11 @@ msgstr "Повезёт в следующий раз!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1172
 msgid "Tubular! Press \"Next Level\" to continue!"
-msgstr "ТÑ\83бÑ\83лаÑ\80! Ð\9dажмиÑ\82е \"СледÑ\83Ñ\8eÑ\89ий Ñ\83Ñ\80овнь\" для продолжения!"
+msgstr "Ð\9fÑ\80евоÑ\81Ñ\85одно! Ð\9dажмиÑ\82е \"СледÑ\83Ñ\8eÑ\89ий Ñ\83Ñ\80овень\" для продолжения!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1174
 msgid "Wicked! Press \"Next Level\" to continue!"
-msgstr "Ð\93Ñ\80еÑ\88ник! Ð\9dажмиÑ\82е \"СледÑ\83Ñ\8eÑ\89ий Ñ\83Ñ\80овнь\" для продолжения!"
+msgstr "Ð\9eзоÑ\80ник! Ð\9dажмиÑ\82е \"СледÑ\83Ñ\8eÑ\89ий Ñ\83Ñ\80овень\" для продолжения!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1177
 msgid "Press the space bar to change your currently selected tile"
@@ -1487,7 +1489,7 @@ msgstr "Выберите в меню \"^1Следующий матч^7\" для
 #: qcsrc/common/minigames/minigame/pp.qc:451
 #: qcsrc/common/minigames/minigame/ttt.qc:332
 msgid "Wait for your opponent to confirm the rematch"
-msgstr "Дождитесь пока соперник подтвердит начало переигровки"
+msgstr "Дождитесь пока соперник подтвердит старт переигровки"
 
 #: qcsrc/common/minigames/minigame/pp.qc:582
 #: qcsrc/common/minigames/minigame/ttt.qc:665
@@ -1621,7 +1623,7 @@ msgstr "Бонус"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
 msgid "Damage text"
-msgstr "ТекÑ\81Ñ\82 урона"
+msgstr "ЦиÑ\84Ñ\80Ñ\8b урона"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:18
 msgid "Draw damage numbers"
@@ -1699,7 +1701,7 @@ msgstr "Граната"
 
 #: qcsrc/common/mutators/mutator/overkill/hmg.qh:17
 msgid "Heavy Machine Gun"
-msgstr "ТÑ\8fжÑ\91лÑ\8bй Ð¿улемёт"
+msgstr "ТÑ\8fжÑ\91лÑ\8bй Ð\9fулемёт"
 
 #: qcsrc/common/mutators/mutator/overkill/rpc.qh:17
 msgid "Rocket Propelled Chainsaw"
@@ -1736,13 +1738,13 @@ msgstr "Контрольная точка"
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:13
 #: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:252
 msgid "Finish"
-msgstr "Ð\9aонеÑ\86"
+msgstr "ФиниÑ\88"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:14
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:15
 #: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:252
 msgid "Start"
-msgstr "Ð\9dаÑ\87ало"
+msgstr "СÑ\82аÑ\80Ñ\82"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:17
 msgid "Defend"
@@ -1817,7 +1819,7 @@ msgstr "Носитель ключа"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:39
 msgid "Run here"
-msgstr "Беги сюда"
+msgstr "Бегите сюда"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:45
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:48
@@ -1873,7 +1875,7 @@ msgstr "^1Уведомления от сервера:"
 
 #: qcsrc/common/notifications/all.inc:239
 msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
-msgstr "^F4Ð\9fРÐ\98Ð\9cÐ\95ЧÐ\90Ð\9dÐ\98Ð\95: ^BGЧаÑ\82 Ð·Ñ\80иÑ\82елей Ð½Ðµ Ð²Ð¸Ð´ÐµÐ½ Ð´Ð»Ñ\8f Ð¸Ð³Ñ\80оков во время матча"
+msgstr "^F4Ð\9fРÐ\98Ð\9cÐ\95ЧÐ\90Ð\9dÐ\98Ð\95: ^BGÐ\98гÑ\80оки Ð½Ðµ Ð²Ð¸Ð´Ñ\8fÑ\82 Ñ\87аÑ\82 Ð·Ñ\80иÑ\82елей во время матча"
 
 #: qcsrc/common/notifications/all.inc:241
 #, c-format
@@ -1910,23 +1912,23 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:246
 msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
-msgstr "^BG ^TC^TT^BG Ð¤Ð»Ð°Ð³ Ð±Ñ\8bл Ð²Ð¾Ð·Ð²Ñ\80аÑ\89ен на базу владельцем"
+msgstr "^BG ^TC^TT^BG Ð¤Ð»Ð°Ð³ Ð²Ð¾Ð·Ð²Ñ\80аÑ\89Ñ\91н на базу владельцем"
 
 #: qcsrc/common/notifications/all.inc:247
 msgid "^BGThe flag was returned by its owner"
-msgstr "^BGФлаг Ð±Ñ\8bл Ð²Ð¾Ð·Ð²Ñ\80аÑ\89ен на базу владельцем"
+msgstr "^BGФлаг Ð²Ð¾Ð·Ð²Ñ\80аÑ\89Ñ\91н на базу владельцем"
 
 #: qcsrc/common/notifications/all.inc:248
 msgid "^BGThe ^TC^TT^BG flag was destroyed and returned to base"
-msgstr "^BG ^TC^TT^BG Флаг был уничтожен и возвращен на базу"
+msgstr "^BG ^TC^TT^BG Флаг был уничтожен и возвращён на базу"
 
 #: qcsrc/common/notifications/all.inc:249
 msgid "^BGThe flag was destroyed and returned to base"
-msgstr "^BGФлаг был уничтожен и возвращен на базу"
+msgstr "^BGФлаг был уничтожен и возвращён на базу"
 
 #: qcsrc/common/notifications/all.inc:250
 msgid "^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"
-msgstr "^BG ^TC^TT^BG Ð¤Ð»Ð°Ð³ Ð±Ñ\8bл Ð±Ñ\80оÑ\88ен Ð² Ð±Ð°Ð·Ðµ Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\89ен Ð½Ð° Ð½ÐµÐµ"
+msgstr "^BG ^TC^TT^BG Ð¤Ð»Ð°Ð³ Ð±Ñ\8bл Ð±Ñ\80оÑ\88ен Ð½Ð° Ð±Ð°Ð·Ðµ Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\89Ñ\91н"
 
 #: qcsrc/common/notifications/all.inc:251
 msgid "^BGThe flag was dropped in the base and returned itself"
@@ -2007,11 +2009,11 @@ msgstr "^BGУ вас нет топлива для ^F1Реактивного ра
 msgid "^F2You lack a UID, superspec options will not be saved/restored"
 msgstr ""
 "^F2У вас нет UID, настройки суперспектатора не будут сохранены или "
-"востановлены"
+"воÑ\81Ñ\81Ñ\82ановленÑ\8b"
 
 #: qcsrc/common/notifications/all.inc:271
 msgid "^F1Round already started, you will join the game in the next round"
-msgstr "^F1РаÑ\83нд Ñ\83же Ð½Ð°Ñ\87алÑ\81Ñ\8f, Ð²Ñ\8b Ð½Ð°Ñ\87нÑ\91Ñ\82е Ð¸Ð³Ñ\80Ñ\83 Ñ\81о Ñ\81ледÑ\83Ñ\8eÑ\89его Ñ\80аÑ\83ндда"
+msgstr "^F1Раунд уже начался, вы начнёте игру со следующего раунда"
 
 #: qcsrc/common/notifications/all.inc:272
 msgid "^F2You will spectate in the next round"
@@ -2020,12 +2022,12 @@ msgstr "^F2Вы станете зрителем со следующего рау
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 был убит ^BG%s^K1 с усилителем ^BG%s^K1 ^K1%s%s"
+msgstr "^BG%s%s^K1 убит ^BG%s^K1 с усилителем ^BG%s^K1 ^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:274
 #, c-format
 msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 был растерзан ^BG%s^K1 с усилителем ^BG%s^K1 ^K1%s%s"
+msgstr "^BG%s%s^K1 растерзан ^BG%s^K1 с усилителем ^BG%s^K1 ^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:275
 #, c-format
@@ -2045,22 +2047,22 @@ msgstr "^BG%s%s^K1 был впечатан в землю ^BG%s^K1%s%s"
 #: qcsrc/common/notifications/all.inc:278
 #, c-format
 msgid "^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð´Ð¾Ð¶Ð¶ÐµÐ½ ^BG%s^K1^K1%s%s"
+msgstr "^BG%s%s^K1 Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð´Ð¿Ð°Ð»Ñ\91н Ð¸Ð· ^BG%s^K1^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:278
 #, c-format
 msgid "^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¿Ñ\80ожаÑ\80ен Ð´Ð¾ Ñ\85Ñ\80Ñ\83Ñ\81Ñ\82Ñ\8fÑ\89ей ÐºÐ¾Ñ\80оÑ\87ки ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 прожарен до хрустящей корочки ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:279
 #, c-format
 msgid "^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¸Ñ\81пеÑ\87Ñ\91н Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 испечён с помощью ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:280
 #, c-format
 msgid "^BG%s%s^K1 was pushed in front of a monster by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¾Ñ\82пÑ\80авлен Ðº Ð¼Ð¾Ð½Ñ\81Ñ\82Ñ\80ам Ñ\80Ñ\83кой ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 отправлен к монстрам рукой ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:281
 #, c-format
@@ -2070,22 +2072,22 @@ msgstr "^BG%s%s^K1 был взорван ^BG%s^K1%s%s"
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
-msgstr "^BG%s%s^K1 слишком близко подошел к взрыву напалма%s%s"
+msgstr "^BG%s%s^K1 слишком близко подошёл к взрыву напалма%s%s"
 
 #: qcsrc/common/notifications/all.inc:282
 #, c-format
 msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
-msgstr "^BG%s%s^K1 был сожжён заживо Гранатой Напалма ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 сожжён заживо Гранатой Напалма ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:283
 #, c-format
 msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð²Ð·орван Ледяной Гранатой ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 Ð¿Ð¾Ð´орван Ледяной Гранатой ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:284
 #, c-format
 msgid "^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð·Ð°Ð¼Ð¾Ñ\80ожен Ð\9bедÑ\8fной Ð\93Ñ\80анаÑ\82ой ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 заморожен Ледяной Гранатой ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:285
 #, c-format
@@ -2095,7 +2097,7 @@ msgstr "^BG%s%s^K1 не был вылечен Лечащей Гранатой ^B
 #: qcsrc/common/notifications/all.inc:286
 #, c-format
 msgid "^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¾Ñ\82пÑ\80авлен Ð² Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8bй ÐºÐ¾Ñ\81моÑ\81 ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 отправлен в открытый космос ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:287
 #, c-format
@@ -2116,7 +2118,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:289
 #, c-format
 msgid "^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ñ\83биÑ\82 ^BG%s^K1%s%s Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ñ\82елепоÑ\80Ñ\82аÑ\86ии"
+msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ñ\82елеÑ\84Ñ\80агнÑ\83Ñ\82 ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:290
 #, c-format
@@ -2129,15 +2131,13 @@ msgstr ""
 msgid ""
 "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s%s"
 msgstr ""
-"^BG%s%s^K1 зацепило взрывной волной от подорвавшегося с Bumblebee ^BG%s^K1%s"
-"%s"
+"^BG%s%s^K1 зацепило взрывной волной от подорвавшегося со Шмеля ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:292
 #, c-format
 msgid "^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s%s"
 msgstr ""
-"^BG%s%s^K1 долюбовался огоньками из пушки Bumblebee, управляемого ^BG%s^K1%s"
-"%s"
+"^BG%s%s^K1 засмотрелся на огоньки из пушки Шмеля, управляемого ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:293
 #, c-format
@@ -2147,7 +2147,7 @@ msgstr "^BG%s%s^K1 был раздавлен ^BG%s^K1%s%s"
 #: qcsrc/common/notifications/all.inc:294
 #, c-format
 msgid "^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s"
-msgstr "^BG%s%s^K1 был завален кассетными бомбами с Raptor'а ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 был завален кассетными бомбами с Ящера ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:295
 #, c-format
@@ -2158,47 +2158,46 @@ msgstr "^BG%s%s^K1 не смог устоять перед пурпурными
 #, c-format
 msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s%s"
 msgstr ""
-"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Raptor'e ^BG%s^K1%s%s"
+"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Ящере ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:297
 #, c-format
 msgid ""
 "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s%s"
 msgstr ""
-"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Spiderbot'e ^BG"
-"%s^K1%s%s"
+"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Пауке-боте ^BG%s^K1%s"
+"%s"
 
 #: qcsrc/common/notifications/all.inc:298
 #, c-format
 msgid "^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s%s"
-msgstr "^BG%s%s^K1 измельчён Spiderbot'ом, управляемым ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 измельчён Пуком-ботом, управляемым ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:299
 #, c-format
 msgid "^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s"
-msgstr ""
-"^BG%s%s^K1 был разорван на куски Spiderbot'ом, управляемым ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 разорван на куски Пауком-ботом, управляемым ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:300
 #, c-format
 msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"
 msgstr ""
-"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Racer'e ^BG%s^K1%s%s"
+"^BG%s%s^K1 зацепило взрывной волной от взорвавшегося на Гонщике ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:301
 #, c-format
 msgid "^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"
-msgstr "^BG%s%s^K1 пригвоздило Racer'ом, управляемым ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 пригвоздило Гонщиком, управляемым ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:302
 #, c-format
 msgid "^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"
-msgstr "^BG%s%s^K1 не смог скрыться от Racer'а, управляемого ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 не смог скрыться от Гонщика, управляемого ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:303
 #, c-format
 msgid "^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¾Ñ\82пÑ\80авлен Ð² Ð¼Ð¸Ñ\80 Ð±Ð¾Ð»Ð¸ Ñ\80Ñ\83кой ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 отправлен в мир боли рукой ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:305
 #, c-format
@@ -2268,7 +2267,7 @@ msgstr "^BG%s^K1 сгорел дотла%s%s"
 #: qcsrc/common/notifications/all.inc:315
 #, c-format
 msgid "^BG%s^K1 was exploded by a Mage%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð²Ð·орван Магом%s%s"
+msgstr "^BG%s^K1 Ð¿Ð¾Ð´орван Магом%s%s"
 
 #: qcsrc/common/notifications/all.inc:316
 #, c-format
@@ -2278,22 +2277,22 @@ msgstr "^BG%s^K1's вывернут наизнанку Шамблером%s%s"
 #: qcsrc/common/notifications/all.inc:317
 #, c-format
 msgid "^BG%s^K1 was smashed by a Shambler%s%s"
-msgstr "^BG%s^K1 был раздавлен Шаблером%s%s"
+msgstr "^BG%s^K1 раздавлен Шамблером%s%s"
 
 #: qcsrc/common/notifications/all.inc:318
 #, c-format
 msgid "^BG%s^K1 was zapped to death by a Shambler%s%s"
-msgstr "^BG%s^K1 был стёрт в порошок Шамблером%s%s"
+msgstr "^BG%s^K1 стёрт в порошок Шамблером%s%s"
 
 #: qcsrc/common/notifications/all.inc:319
 #, c-format
 msgid "^BG%s^K1 was bitten by a Spider%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð¿Ð¾Ð±Ð¸Ñ\82 Ð\9fаÑ\83ком%s%s"
+msgstr "^BG%s^K1 побит Пауком%s%s"
 
 #: qcsrc/common/notifications/all.inc:320
 #, c-format
 msgid "^BG%s^K1 was fireballed by a Wyvern%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð¿Ð¾Ñ\80ажÑ\91н Ð¾Ð³Ð½Ðµным шаром Виверна%s%s"
+msgstr "^BG%s^K1 Ð¿Ð¾Ñ\80ажÑ\91н Ð¾Ð³Ð½ÐµÐ½ным шаром Виверна%s%s"
 
 #: qcsrc/common/notifications/all.inc:321
 #, c-format
@@ -2320,7 +2319,7 @@ msgstr "^BG%s^K1 захотел посмотреть на взрыв своег
 #: qcsrc/common/notifications/all.inc:324
 #, c-format
 msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
-msgstr "^BG%s^K1 был сожжён заживо своей же Гранатой Напалма%s%s"
+msgstr "^BG%s^K1 сожжён заживо своей же Гранатой Напалма%s%s"
 
 #: qcsrc/common/notifications/all.inc:326
 #, c-format
@@ -2330,7 +2329,7 @@ msgstr "^BG%s^K1 немного обжёгся%s%s"
 #: qcsrc/common/notifications/all.inc:326
 #, c-format
 msgid "^BG%s^K1 was frozen to death by their own Ice Nade%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð·Ð°Ð¼Ð¾Ñ\80ожен Ñ\81воей Ð¶Ðµ Ð\9bедÑ\8fной Ð\93Ñ\80анаÑ\82ой%s%s"
+msgstr "^BG%s^K1 заморожен своей же Ледяной Гранатой%s%s"
 
 #: qcsrc/common/notifications/all.inc:327
 #, c-format
@@ -2355,7 +2354,7 @@ msgstr "^BG%s^K1 сгинул%s%s"
 #: qcsrc/common/notifications/all.inc:330
 #, c-format
 msgid "^BG%s^K1 became a shooting star%s%s"
-msgstr "^BG%s^K1 стал падующей звездой%s%s"
+msgstr "^BG%s^K1 стал падающей звездой%s%s"
 
 #: qcsrc/common/notifications/all.inc:331
 #, c-format
@@ -2390,17 +2389,17 @@ msgstr "^BG%s^K1 налетел на турель%s%s"
 #: qcsrc/common/notifications/all.inc:337
 #, c-format
 msgid "^BG%s^K1 was blasted away by an eWheel turret%s%s"
-msgstr "^BG%s^K1 был разорван в клочья турелью еМобиля%s%s"
+msgstr "^BG%s^K1 разорван в клочья турелью еМобиля%s%s"
 
 #: qcsrc/common/notifications/all.inc:338
 #, c-format
 msgid "^BG%s^K1 got caught up in the FLAC turret fire%s%s"
-msgstr "^BG%s^K1 Ð¿Ð¾Ð¿Ð°Ð» Ð¿Ð¾Ð´ Ð¾Ð³Ð¾Ð½Ñ\8c Ð·ÐµÐ½Ð¸Ñ\82ки FLAC%s%s"
+msgstr "^BG%s^K1 Ð¿Ð¾Ð¿Ð°Ð» Ð¿Ð¾Ð´ Ð¾Ð³Ð¾Ð½Ñ\8c Ð\97ениÑ\82ной Ð\9fÑ\83Ñ\88ки %s%s"
 
 #: qcsrc/common/notifications/all.inc:339
 #, c-format
 msgid "^BG%s^K1 was blasted away by a Hellion turret%s%s"
-msgstr "^BG%s^K1 был разорван в клочья турелью Hellion%s%s"
+msgstr "^BG%s^K1 разорван в клочья турелью Hellion%s%s"
 
 #: qcsrc/common/notifications/all.inc:340
 #, c-format
@@ -2415,12 +2414,12 @@ msgstr "^BG%s^K1 изрешечён Пулемётной башней%s%s"
 #: qcsrc/common/notifications/all.inc:342
 #, c-format
 msgid "^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s"
-msgstr "^BG%s^K1 был разорван на тлеющие кусочки турелью MLRS%s%s"
+msgstr "^BG%s^K1 разорван на тлеющие кусочки турелью MLRS%s%s"
 
 #: qcsrc/common/notifications/all.inc:343
 #, c-format
 msgid "^BG%s^K1 was phased out by a turret%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð¾Ñ\82менÑ\91н турелью%s%s"
+msgstr "^BG%s^K1 Ð»Ð¸ÐºÐ²Ð¸Ð´Ð¸Ñ\80ован турелью%s%s"
 
 #: qcsrc/common/notifications/all.inc:344
 #, c-format
@@ -2430,62 +2429,62 @@ msgstr "^BG%s^K1 отведал перегретой плазмы из туре
 #: qcsrc/common/notifications/all.inc:345
 #, c-format
 msgid "^BG%s^K1 was electrocuted by a Tesla turret%s%s"
-msgstr "^BG%s^K1 был убит электрическим током турели Теслы%s%s"
+msgstr "^BG%s^K1 убит электрическим током турели Теслы%s%s"
 
 #: qcsrc/common/notifications/all.inc:346
 #, c-format
 msgid "^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"
-msgstr "^BG%s^K1 обогащён свинцом из турели Walker'a%s%s"
+msgstr "^BG%s^K1 обогащён свинцом из турели Ходунa%s%s"
 
 #: qcsrc/common/notifications/all.inc:347
 #, c-format
 msgid "^BG%s^K1 was impaled by a Walker turret%s%s"
-msgstr "^BG%s^K1 Ð±Ñ\8bл Ð¿Ñ\80онзÑ\91н Ñ\82Ñ\83Ñ\80елÑ\8cÑ\8e Walker'а%s%s"
+msgstr "^BG%s^K1 Ð¿Ñ\80онзÑ\91н Ñ\82Ñ\83Ñ\80елÑ\8cÑ\8e Ð¥Ð¾Ð´Ñ\83на%s%s"
 
 #: qcsrc/common/notifications/all.inc:348
 #, c-format
 msgid "^BG%s^K1 was blasted away by a Walker turret%s%s"
-msgstr "^BG%s^K1 был разорван в клочья турелью Walker'а%s%s"
+msgstr "^BG%s^K1 разорван в клочья турелью Ходуна%s%s"
 
 #: qcsrc/common/notifications/all.inc:349
 #, c-format
 msgid "^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"
-msgstr "^BG%s^K1 зацепило взрывной волной от Bumblebee%s%s"
+msgstr "^BG%s^K1 зацепило взрывной волной от Шмеля %s%s"
 
 #: qcsrc/common/notifications/all.inc:350
 #, c-format
 msgid "^BG%s^K1 was crushed by a vehicle%s%s"
-msgstr "^BG%s^K1 был раздавлен весом тяжёлой машины%s%s"
+msgstr "^BG%s^K1 раздавлен весом тяжёлой машины%s%s"
 
 #: qcsrc/common/notifications/all.inc:351
 #, c-format
 msgid "^BG%s^K1 was caught in a Raptor cluster bomb%s%s"
-msgstr "^BG%s^K1 был накрыт кассетными бомбами с Raptor'а%s%s"
+msgstr "^BG%s^K1 был накрыт кассетными бомбами с Ящера%s%s"
 
 #: qcsrc/common/notifications/all.inc:352
 #, c-format
 msgid "^BG%s^K1 got caught in the blast of a Raptor explosion%s%s"
-msgstr "^BG%s^K1 задело взрывной волной от Raptor'a%s%s"
+msgstr "^BG%s^K1 задело взрывной волной от Ящера %s%s"
 
 #: qcsrc/common/notifications/all.inc:353
 #, c-format
 msgid "^BG%s^K1 got caught in the blast of a Spiderbot explosion%s%s"
-msgstr "^BG%s^K1 задело взрывной волной от Spiderbot'а%s%s"
+msgstr "^BG%s^K1 задело взрывной волной от Паука-бота%s%s"
 
 #: qcsrc/common/notifications/all.inc:354
 #, c-format
 msgid "^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s"
-msgstr "^BG%s^K1 был разорван на кусочки ракетой Spiderbot'а%s%s"
+msgstr "^BG%s^K1 разорван на кусочки ракетой Паука-бота%s%s"
 
 #: qcsrc/common/notifications/all.inc:355
 #, c-format
 msgid "^BG%s^K1 got caught in the blast of a Racer explosion%s%s"
-msgstr "^BG%s^K1 задело взрывной волной от Racer'а%s%s"
+msgstr "^BG%s^K1 задело взрывной волной от Гонщика%s%s"
 
 #: qcsrc/common/notifications/all.inc:356
 #, c-format
 msgid "^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"
-msgstr "^BG%s^K1 не смог укрыться от ракеты Racer'а%s%s"
+msgstr "^BG%s^K1 не смог укрыться от ракеты Гонщика%s%s"
 
 #: qcsrc/common/notifications/all.inc:359
 #, c-format
@@ -2515,12 +2514,12 @@ msgstr "^BG%s^K3 воскрес после падения"
 #: qcsrc/common/notifications/all.inc:366
 #, c-format
 msgid "^BG%s^K3 was revived by their Nade explosion"
-msgstr "^BG%s^K3 Ð±Ñ\8bл Ð¾Ð¶Ð¸Ð²Ð»Ñ\91н Ð²Ð·Ñ\80Ñ\8bвом Ñ\81воей Ð³Ñ\80анаÑ\82Ñ\8b"
+msgstr "^BG%s^K3 оживлён взрывом своей гранаты"
 
 #: qcsrc/common/notifications/all.inc:367
 #, c-format
 msgid "^BG%s^K3 was automatically revived after %s second(s)"
-msgstr "^BG%s^K3 Ð±Ñ\8bл Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ð¶Ð¸Ð²Ð»Ñ\91н Ð¿Ð¾Ñ\81ле %s Ñ\81екÑ\83нд(Ñ\8b)"
+msgstr "^BG%s^K3 автоматически оживлён после %s секунд(ы)"
 
 #: qcsrc/common/notifications/all.inc:368
 #, c-format
@@ -2551,7 +2550,7 @@ msgstr "^BGРаунд окончен, победитель не выявлен"
 #: qcsrc/common/notifications/all.inc:375
 #, c-format
 msgid "^BGGodmode saved you %s units of damage, cheater!"
-msgstr "^BGРежим Бога спас тебя от %s единиц урона, читер!"
+msgstr "^BGРежим Бога спас вас от %s единиц урона, читер!"
 
 #: qcsrc/common/notifications/all.inc:377
 #, c-format
@@ -2567,13 +2566,13 @@ msgstr "^BG%s^BG потерял усилитель %s^BG!"
 #: qcsrc/common/notifications/all.inc:692
 #, c-format
 msgid "^BGYou dropped the %s^BG buff!"
-msgstr "^BGÐ\92Ñ\8b Ñ\83Ñ\80онили усилитель %s^BG!"
+msgstr "^BGÐ\92Ñ\8b Ñ\81бÑ\80оÑ\81или усилитель %s^BG!"
 
 #: qcsrc/common/notifications/all.inc:380
 #: qcsrc/common/notifications/all.inc:693
 #, c-format
 msgid "^BGYou got the %s^BG buff!"
-msgstr "^BGÐ\92Ñ\8b Ð·Ð°Ð±Ñ\80али усилитель %s^BG!"
+msgstr "^BGÐ\92Ñ\8b Ð¿Ð¾Ð´Ð½Ñ\8fли усилитель %s^BG!"
 
 #: qcsrc/common/notifications/all.inc:382
 #: qcsrc/common/notifications/all.inc:696
@@ -2585,7 +2584,7 @@ msgstr "^BGУ вас отсутствует ^F1%s"
 #: qcsrc/common/notifications/all.inc:697
 #, c-format
 msgid "^BGYou dropped the ^F1%s^BG%s"
-msgstr "^BGВы выбросили ^F1%s^BG%s"
+msgstr "^BGВы сбросили ^F1%s^BG%s"
 
 #: qcsrc/common/notifications/all.inc:384
 #: qcsrc/common/notifications/all.inc:698
@@ -2624,7 +2623,7 @@ msgstr "^BG%s^F3 подключился"
 #: qcsrc/common/notifications/all.inc:391
 #, c-format
 msgid "^BG%s^F3 connected and joined the ^TC^TT team"
-msgstr "^BG%s^F3 подключен и присоединен к ^TC^TT коменде"
+msgstr "^BG%s^F3 подключён и присоединён к ^TC^TT команде"
 
 #: qcsrc/common/notifications/all.inc:392
 #, c-format
@@ -2640,7 +2639,7 @@ msgstr "^BG%s^F3 сейчас играет в команде ^TC^TT"
 #: qcsrc/common/notifications/all.inc:706
 #, c-format
 msgid "^BG%s^BG has dropped the ball!"
-msgstr "^BG%s^BG Ð\9fоÑ\82еÑ\80Ñ\8fл мяч!"
+msgstr "^BG%s^BG Ð²Ñ\8bбÑ\80оÑ\81ил мяч!"
 
 #: qcsrc/common/notifications/all.inc:396
 #: qcsrc/common/notifications/all.inc:707
@@ -2656,7 +2655,7 @@ msgstr "^BG%s^BG захватил ключ ^TC^TT команды"
 #: qcsrc/common/notifications/all.inc:399
 #, c-format
 msgid "^BG%s^BG dropped the ^TC^TT Key"
-msgstr "^BG%s^BG выбросил ^TC^TT Ключ"
+msgstr "^BG%s^BG уронил ^TC^TT Ключ"
 
 #: qcsrc/common/notifications/all.inc:400
 #, c-format
@@ -2708,7 +2707,7 @@ msgstr "Контрольная точка %s^BG команды ^TC^TT^BG был
 
 #: qcsrc/common/notifications/all.inc:414
 msgid "^TC^TT^BG generator has been destroyed"
-msgstr "^TC^TT^BG генератор был уничтожен"
+msgstr "^TC^TT^BG генератор уничтожен"
 
 #: qcsrc/common/notifications/all.inc:415
 msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
@@ -2749,13 +2748,13 @@ msgid ""
 "^F2You were kicked from the server because you are a spectator and "
 "spectators aren't allowed at the moment."
 msgstr ""
-"^F2ТÑ\8b Ð±Ñ\8bл Ð²Ñ\8bкинÑ\83Ñ\82 Ñ\81 Ñ\81еÑ\80веÑ\80а, Ð¿Ð¾Ñ\82омÑ\83 Ñ\87Ñ\82о Ñ\82Ñ\8b Ð·Ñ\80иÑ\82елÑ\8c, Ð° Ð·Ñ\80иÑ\82ели Ð½Ðµ Ð´Ð¾Ð¿Ñ\83Ñ\81каÑ\8eÑ\82Ñ\81Ñ\8f "
-"на данный момент."
+"^F2Ð\92Ñ\8b Ð²Ñ\8bкинÑ\83Ñ\82Ñ\8b Ñ\81 Ñ\81еÑ\80веÑ\80а, Ð¿Ð¾Ñ\82омÑ\83 Ñ\87Ñ\82о Ð²Ñ\8b Ð±Ñ\8bли Ð·Ñ\80иÑ\82елем, Ð° Ð·Ñ\80иÑ\82ели Ð½Ðµ "
+"допÑ\83Ñ\81каÑ\8eÑ\82Ñ\81Ñ\8f Ð½Ð° Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð¼ÐµÐ½Ñ\82."
 
 #: qcsrc/common/notifications/all.inc:425
 #, c-format
 msgid "^BG%s^F3 is now spectating"
-msgstr "^BG%s^F3 Ñ\82епеÑ\80Ñ\8c Ð½Ð°Ð±Ð»Ñ\8eдатель"
+msgstr "^BG%s^F3 Ñ\82епеÑ\80Ñ\8c Ð·Ñ\80итель"
 
 #: qcsrc/common/notifications/all.inc:427
 #, c-format
@@ -2828,7 +2827,7 @@ msgid ""
 "kicked, because spectating isn't allowed at this time!"
 msgstr ""
 "^F2Вы должны присоединиться к игре в течение %s, в противном случае вы "
-"бÑ\83деÑ\82е Ð¾Ñ\82Ñ\81оединенÑ\8b Ð¾Ñ\82 Ñ\81еÑ\80веÑ\80а, Ñ\82ак ÐºÐ°Ðº Ð±Ñ\8bÑ\82Ñ\8c Ð½Ð°Ð±Ð»Ñ\8eдателем временно запрещено!"
+"бÑ\83деÑ\82е Ð¾Ñ\82Ñ\81оединенÑ\8b Ð¾Ñ\82 Ñ\81еÑ\80веÑ\80а, Ñ\82ак ÐºÐ°Ðº Ð±Ñ\8bÑ\82Ñ\8c Ð·Ñ\80ителем временно запрещено!"
 
 #: qcsrc/common/notifications/all.inc:443
 #, c-format
@@ -2894,7 +2893,7 @@ msgstr "^BG%s%s^K1 попал под раздачу тока из Дуговой
 #: qcsrc/common/notifications/all.inc:457
 #, c-format
 msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Arc bolts%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð²Ð·Ð¾Ñ\80ван ÐºÑ\80ивÑ\8bми Ð±Ð¾Ð»Ñ\82ами%s%s ^BG%s^K1's"
+msgstr "^BG%s%s^K1 взорван кривыми болтами%s%s ^BG%s^K1's"
 
 #: qcsrc/common/notifications/all.inc:458
 #, c-format
@@ -2909,12 +2908,12 @@ msgstr "^BG%s^K1 отправил себя в ад из своего же Бла
 #: qcsrc/common/notifications/all.inc:460
 #, c-format
 msgid "^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s"
-msgstr "^BG%s%s^K1 испытал на себе силу Crylink'а ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 испытал на себе силу Крайлинка ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:461
 #, c-format
 msgid "^BG%s^K1 felt the strong pull of their Crylink%s%s"
-msgstr "^BG%s^K1 испытал на себе силу собственного Crylink'а%s%s"
+msgstr "^BG%s^K1 испытал на себе силу собственного Крайлинка%s%s"
 
 #: qcsrc/common/notifications/all.inc:462
 #, c-format
@@ -2934,22 +2933,22 @@ msgstr "^BG%s^K1 взорвал себя с помощью Разрушител
 #: qcsrc/common/notifications/all.inc:465
 #, c-format
 msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s%s"
-msgstr "^BG%s%s^K1 был разорван зарядом Electro от ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 разорван зарядом Электро ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:466
 #, c-format
 msgid "^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s%s"
-msgstr "^BG%s%s^K1 почуял запах озона от Electro комбо ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 почуял запах озона от комбо Электро ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:467
 #, c-format
 msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Electro orb%s%s"
-msgstr "^BG%s%s^K1 подошел слишком близко сфере Электро ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 подошёл слишком близко сфере Электро ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:468
 #, c-format
 msgid "^BG%s^K1 played with Electro bolts%s%s"
-msgstr "^BG%s^K1 Ð´Ð¾Ð¸Ð³Ñ\80алÑ\81Ñ\8f Ñ\81 Ð­Ð»ÐµÐºÑ\82Ñ\80иÑ\87еÑ\81кими Ð·Ð°Ñ\80Ñ\8fдами%s%s"
+msgstr "^BG%s^K1 Ð´Ð¾Ð¸Ð³Ñ\80алÑ\81Ñ\8f Ñ\81 Ð·Ð°Ñ\80Ñ\8fдами Ð­Ð»ÐµÐºÑ\82Ñ\80о %s%s"
 
 #: qcsrc/common/notifications/all.inc:469
 #, c-format
@@ -2964,7 +2963,7 @@ msgstr "^BG%s%s^K1 оказался слишком близко к огненн
 #: qcsrc/common/notifications/all.inc:471
 #, c-format
 msgid "^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s%s"
-msgstr "^BG%s%s^K1 был сожжён зажигательной миной ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 сожжён зажигательной миной ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:472
 #, c-format
@@ -2974,42 +2973,42 @@ msgstr "^BG%s^K1 должен был выбрать пушку поменьше%
 #: qcsrc/common/notifications/all.inc:473
 #, c-format
 msgid "^BG%s^K1 forgot about their firemine%s%s"
-msgstr "^BG%s^K1 забыл о своей зажигательной мине ds%s%s"
+msgstr "^BG%s^K1 забыл о своей зажигательной мине %s%s"
 
 #: qcsrc/common/notifications/all.inc:474
 #, c-format
 msgid "^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s"
-msgstr "^BG%s%s^K1 утрамбован очередью из Hagar'а от ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 утрамбован очередью из Хагара от ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:475
 #, c-format
 msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s"
-msgstr "^BG%s%s^K1 обстрелян из Hagar'а со стороны ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 обстрелян из Хагара ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:476
 #, c-format
 msgid "^BG%s^K1 played with tiny Hagar rockets%s%s"
-msgstr "^BG%s^K1 доигрался с ракетками из Hagar'а%s%s"
+msgstr "^BG%s^K1 доигрался с ракетками из Хагара%s%s"
 
 #: qcsrc/common/notifications/all.inc:477
 #, c-format
 msgid "^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s"
-msgstr "^BG%s%s^K1 был порезан HLAC'ом ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 был порезан из ТЛО ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:478
 #, c-format
 msgid "^BG%s^K1 got a little jumpy with their HLAC%s%s"
-msgstr "^BG%s^K1 не соблюдал технику безопасности при обращении с HLAC%s%s"
+msgstr "^BG%s^K1 не соблюдал технику безопасности при обращении с ТЛО %s%s"
 
 #: qcsrc/common/notifications/all.inc:479
 #, c-format
 msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Heavy Machine Gun%s%s"
-msgstr "^BG%s%s^K1 Ð·Ð°Ñ\81Ñ\82Ñ\80елен Ð¸Ð· Ð¢Ñ\8fжÑ\91лого Ð¿улемёта ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 Ð·Ð°Ñ\81Ñ\82Ñ\80елен Ð¸Ð· Ð¢Ñ\8fжÑ\91лого Ð\9fулемёта ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:480
 #, c-format
 msgid "^BG%s%s^K1 was torn to bits by ^BG%s^K1's Heavy Machine Gun%s%s"
-msgstr "^BG%s%s^K1 Ñ\80азоÑ\80ван Ð½Ð° ÐºÑ\83Ñ\81ки Ð¸Ð· Ð¢Ñ\8fжÑ\91лого Ð¿улемёта ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 Ñ\80азоÑ\80ван Ð½Ð° ÐºÑ\83Ñ\81ки Ð¸Ð· Ð¢Ñ\8fжÑ\91лого Ð\9fулемёта ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:481
 #, c-format
@@ -3058,48 +3057,49 @@ msgstr "^BG%s^K1 забыл о своей мине%s%s"
 #, c-format
 msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
 msgstr ""
-"^BG%s%s^K1 оказался в зоне поражения гранаты, выпущенной из Mortar'a ^BG"
+"^BG%s%s^K1 оказался в зоне поражения гранаты, выпущенной из Мортиры ^BG"
 "%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:490
 #, c-format
 msgid "^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s"
-msgstr "^BG%s%s^K1 отведал гранаты из Mortar'a ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 отведал гранаты из Мортиры ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:491
 #, c-format
 msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
-msgstr "^BG%s^K1 не уследил за гранатой, выпущенной из своего Mortar'a%s%s"
+msgstr "^BG%s^K1 не уследил за гранатой, выпущенной из своего Мортиры %s%s"
 
 #: qcsrc/common/notifications/all.inc:492
 #, c-format
 msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
-msgstr "^BG%s^K1 взорвал сам себя с помощью Mortar'a%s%s"
+msgstr "^BG%s^K1 взорвал сам себя с помощью Мортиры %s%s"
 
 #: qcsrc/common/notifications/all.inc:493
 #, c-format
 msgid "^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 расстрелян из Rifle ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 расстрелян из Винтовки ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:494
 #, c-format
 msgid "^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr "^BG%s%s^K1 погиб после знакомства с пулей из Rifle ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 погиб после знакомства с пулей из Винтовки ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:495
 #, c-format
 msgid "^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr "^BG%s%s^K1 не смог избежать знакомства с пулей из Rifle ^BG%s^K1%s%s"
+msgstr ""
+"^BG%s%s^K1 не смог избежать знакомства с пулей из Винтовки ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:496
 #, c-format
 msgid "^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s%s"
-msgstr "^BG%s%s^K1 не смог спрятаться от Rifle ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 не смог спрятаться от Винтовки ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:497
 #, c-format
 msgid "^BG%s%s^K1 was sawn in half by ^BG%s^K1's Rocket Propelled Chainsaw%s%s"
-msgstr "^BG%s%s^K1 был распилен пополам Реактивной Бензопилой ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 распилен пополам Реактивной Бензопилой ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:498
 #, c-format
@@ -3109,7 +3109,7 @@ msgstr "^BG%s%s^K1 почти уклонился от Реактивной Бе
 #: qcsrc/common/notifications/all.inc:499
 #, c-format
 msgid "^BG%s^K1 was sawn in half by their own Rocket Propelled Chainsaw%s%s"
-msgstr "^BG%s^K1 был распилен пополам своей же Реактивной Бензопилой%s%s"
+msgstr "^BG%s^K1 распилен пополам своей же Реактивной Бензопилой%s%s"
 
 #: qcsrc/common/notifications/all.inc:500
 #, c-format
@@ -3126,8 +3126,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:502
 #, c-format
 msgid "^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"
-msgstr ""
-"^BG%s%s^K1 был захвачен системой самонаведения Самонаводчика ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 был захвачен системой Самонаводчика ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:503
 #, c-format
@@ -3142,17 +3141,17 @@ msgstr "^BG%s%s^K1 застрелен из Шоковой Волны ^BG%s^K1%s%
 #: qcsrc/common/notifications/all.inc:505
 #, c-format
 msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shockwave%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¾Ñ\82Ñ\88лÑ\91пан ^BG%s^K1 Ð¾Ð³Ñ\80омной Ð¨Ð¾ÐºÐ¾Ð²Ð¾Ð¹ Ð\92олной%s%s"
+msgstr "^BG%s%s^K1 отшлёпан ^BG%s^K1 огромной Шоковой Волной%s%s"
 
 #: qcsrc/common/notifications/all.inc:506
 #, c-format
 msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s%s"
-msgstr "^BG%s%s^K1 пристрелен из Shotgun'a ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 пристрелен из Дробовика ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:507
 #, c-format
 msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s%s"
-msgstr "^BG%s%s^K1 отшлёпал ^BG%s^K1 своим большим Shotgun'ом%s%s"
+msgstr "^BG%s%s^K1 отшлёпал ^BG%s^K1 своим большим Дробовиком%s%s"
 
 #: qcsrc/common/notifications/all.inc:508
 #, c-format
@@ -3172,7 +3171,7 @@ msgstr "^BGУ %s^K1 завяли уши от собственной игры @!#
 #: qcsrc/common/notifications/all.inc:511
 #, c-format
 msgid "^BG%s%s^K1 has been sublimated by ^BG%s^K1's Vaporizer%s%s"
-msgstr "^BG%s%s^K1 Ð±Ñ\8bл Ð¿Ñ\80еобÑ\80азован Ð² Ð¿Ð°Ñ\80 Ð\98Ñ\81паÑ\80иÑ\82елем ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 преобразован в пар Испарителем ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:512
 #, c-format
@@ -3206,7 +3205,7 @@ msgstr "^F4Игра начнётся через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:545
 msgid "^F4Round starts in ^COUNT"
-msgstr "^F4Раунд начнется через ^COUNT"
+msgstr "^F4Раунд начнётся через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:546
 msgid "^F4Round cannot start"
@@ -3295,11 +3294,11 @@ msgstr "^BGВы передали флаг %s"
 
 #: qcsrc/common/notifications/all.inc:569
 msgid "^BGYou got the ^TC^TT^BG flag!"
-msgstr "^BGÐ\92Ñ\8b Ð·Ð°Ð±Ñ\80али ^TC^TT^BG флаг!"
+msgstr "^BGÐ\92Ñ\8b Ð¿Ð¾Ð´Ð½Ñ\8fли ^TC^TT^BG флаг!"
 
 #: qcsrc/common/notifications/all.inc:570
 msgid "^BGYou got the flag!"
-msgstr "^BGÐ\92Ñ\8b Ð·Ð°Ð±Ñ\80али флаг!"
+msgstr "^BGÐ\92Ñ\8b Ð¿Ð¾Ð´Ð½Ñ\8fли флаг!"
 
 #: qcsrc/common/notifications/all.inc:571
 #, c-format
@@ -3344,26 +3343,22 @@ msgstr "^BG%sПротивник (^BG%s%s)^BG забрал свой флаг! В
 #: qcsrc/common/notifications/all.inc:579
 #, c-format
 msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr ""
-"^BGВаш %sтоварищ по команде^BG заполучил ^TC^TT^BG флаг! Защищайте его!"
+msgstr "^BGВаш %sсоюзник^BG заполучил ^TC^TT^BG флаг! Защищайте его!"
 
 #: qcsrc/common/notifications/all.inc:580
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr ""
-"^BGВаш %sтоварищ по команде (^BG%s%s)^BG заполучил ^TC^TT^BG флаг! Защищайте "
-"его!"
+msgstr "^BGВаш %sсоюзник (^BG%s%s)^BG заполучил ^TC^TT^BG флаг! Защищайте его!"
 
 #: qcsrc/common/notifications/all.inc:581
 #, c-format
 msgid "^BGYour %steam mate^BG got the flag! Protect them!"
-msgstr "^BGÐ\92аÑ\88 %sÑ\82оваÑ\80иÑ\89 Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ^BG заполучил флаг! Защищайте его!"
+msgstr "^BGÐ\92аÑ\88 %sÑ\81оÑ\8eзник^BG заполучил флаг! Защищайте его!"
 
 #: qcsrc/common/notifications/all.inc:582
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
-msgstr ""
-"^BGВаш %sтоварищ по команде (^BG%s%s)^BG заполучил флаг! Защищайте его!"
+msgstr "^BGВаш %sсоюзник (^BG%s%s)^BG заполучил флаг! Защищайте его!"
 
 #: qcsrc/common/notifications/all.inc:583
 msgid "^BGEnemies can now see you on radar!"
@@ -3385,7 +3380,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:590
 #, c-format
 msgid "^K3%sYou fragged ^BG%s"
-msgstr "^K3%sÐ\92Ñ\8b Ñ\83били ^BG%s"
+msgstr "^K3%sÐ\92Ñ\8b Ñ\84Ñ\80агнÑ\83ли ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:591
 #: qcsrc/common/notifications/all.inc:600
@@ -3397,7 +3392,7 @@ msgstr "^K3%sВы отыграли очко у ^BG%s"
 #: qcsrc/common/notifications/all.inc:592
 #, c-format
 msgid "^K1%sYou were fragged by ^BG%s"
-msgstr "^K1%sÐ\92аÑ\81 Ñ\83бил ^BG%s"
+msgstr "^K1%sÐ\92аÑ\81 Ñ\84Ñ\80агнÑ\83л ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:593
 #: qcsrc/common/notifications/all.inc:602
@@ -3429,7 +3424,7 @@ msgstr "^K1%sВы были заморожены игроком ^BG%s"
 #: qcsrc/common/notifications/all.inc:617
 #, c-format
 msgid "^K1%sYou typefragged ^BG%s"
-msgstr "^K1%sÐ\92Ñ\8b Ñ\83били ^BG%s, пока он писал"
+msgstr "^K1%sÐ\92Ñ\8b Ñ\84Ñ\80агнÑ\83ли ^BG%s, пока он писал"
 
 #: qcsrc/common/notifications/all.inc:618
 #, c-format
@@ -3439,12 +3434,12 @@ msgstr "^K1%sВы отыграли очко у ^BG%s^K1 пока они писа
 #: qcsrc/common/notifications/all.inc:619
 #, c-format
 msgid "^K1%sYou were typefragged by ^BG%s"
-msgstr "^K1%sÐ\9fока Ð²Ñ\8b Ð¿Ð¸Ñ\81али, Ð²Ð°Ñ\81 Ñ\83бил ^BG%s"
+msgstr "^K1%sÐ\9fока Ð²Ñ\8b Ð¿Ð¸Ñ\81али, Ð²Ð°Ñ\81 Ñ\84Ñ\80агнÑ\83л ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:620
 #, c-format
 msgid "^K1%sYou were scored against by ^BG%s^K1 while typing"
-msgstr "^K1%sВас фрагнул игрок ^BG%s^K1 пока вы печатали"
+msgstr "^K1%sВас фрагнул игрок ^BG%s^K1, пока вы писали"
 
 #: qcsrc/common/notifications/all.inc:626
 #, c-format
@@ -3466,11 +3461,11 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:630
 msgid "^K1Don't go against your team mates!"
-msgstr "^K1Ð\9dе Ñ\83бивайÑ\82е Ñ\82оваÑ\80иÑ\89ей Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ!"
+msgstr "^K1Ð\9dе Ñ\83бивайÑ\82е Ñ\81оÑ\8eзников!"
 
 #: qcsrc/common/notifications/all.inc:630
 msgid "^K1Don't shoot your team mates!"
-msgstr "^K1Ð\9dе Ñ\81Ñ\82Ñ\80елÑ\8fйÑ\82е Ð² Ñ\81воиÑ\85 Ñ\82оваÑ\80иÑ\89ей Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ!"
+msgstr "^K1Ð\9dе Ñ\81Ñ\82Ñ\80елÑ\8fйÑ\82е Ð² Ñ\81воиÑ\85 Ñ\81оÑ\8eзников!"
 
 #: qcsrc/common/notifications/all.inc:631
 msgid "^K1Die camper!"
@@ -3539,7 +3534,7 @@ msgstr "^K1Нахождение рядом со взрывом напалма о
 
 #: qcsrc/common/notifications/all.inc:642
 msgid "^K1You felt a little chilly!"
-msgstr "^K1Ð\92Ñ\8b Ð¿Ð¾Ñ\87Ñ\83вÑ\81Ñ\82вовали Ð¿Ñ\80оÑ\85ладеÑ\86!"
+msgstr "^K1Ð\92Ñ\8b Ð¿Ð¾Ñ\87Ñ\83вÑ\81Ñ\82вовали Ð¾Ð·Ð½Ð¾Ð±!"
 
 #: qcsrc/common/notifications/all.inc:642
 msgid "^K1You got a little bit too cold!"
@@ -3559,7 +3554,7 @@ msgstr "^K1Вы погибли от отсутствия патронов..."
 
 #: qcsrc/common/notifications/all.inc:645
 msgid "^K1You grew too old without taking your medicine"
-msgstr "^K1Вы прожили слишком долго, для человека не принимающего лекарств"
+msgstr "^K1Вы прожили слишком долго для человека не принимающего лекарств"
 
 #: qcsrc/common/notifications/all.inc:645
 msgid "^K1You need to preserve your health"
@@ -3600,7 +3595,7 @@ msgstr "^K1Ваша встреча с турелью закончилась пл
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You were fragged by a turret!"
-msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\83биты турелью!"
+msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\84Ñ\80агнÑ\83ты турелью!"
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You had an unfortunate run in with an eWheel turret!"
@@ -3608,19 +3603,19 @@ msgstr "^K1Ваша встреча с турелью еМобиля законч
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You were fragged by an eWheel turret!"
-msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\83биты турелью еМобиля!"
+msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\84Ñ\80агнÑ\83ты турелью еМобиля!"
 
 #: qcsrc/common/notifications/all.inc:654
 msgid "^K1You had an unfortunate run in with a Walker turret!"
-msgstr "^K1Ваша встреча с турелью Walker закончилась плачевно!"
+msgstr "^K1Ваша встреча с турелью Ходуна закончилась плачевно!"
 
 #: qcsrc/common/notifications/all.inc:654
 msgid "^K1You were fragged by a Walker turret!"
-msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\83биÑ\82Ñ\8b Ñ\82Ñ\83Ñ\80елÑ\8cÑ\8e Walker!"
+msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\84Ñ\80агнÑ\83Ñ\82Ñ\8b Ñ\82Ñ\83Ñ\80елÑ\8cÑ\8e Ð¥Ð¾Ð´Ñ\83на!"
 
 #: qcsrc/common/notifications/all.inc:655
 msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1Ð\92аÑ\81 Ð·Ð°Ð´ÐµÐ»Ð¾ Ð²Ð·Ñ\80Ñ\8bвной Ð²Ð¾Ð»Ð½Ð¾Ð¹ Ð¾Ñ\82 Bumblebee!"
+msgstr "^K1Ð\92аÑ\81 Ð·Ð°Ð´ÐµÐ»Ð¾ Ð²Ð·Ñ\80Ñ\8bвной Ð²Ð¾Ð»Ð½Ð¾Ð¹ Ð¨Ð¼ÐµÐ»Ñ\8f!"
 
 #: qcsrc/common/notifications/all.inc:656
 msgid "^K1You were crushed by a vehicle!"
@@ -3628,27 +3623,27 @@ msgstr "^K1Вы были раздавлены весом тяжёлой маши
 
 #: qcsrc/common/notifications/all.inc:657
 msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1Вас накрыло кассетными бомбами с Raptor'а!"
+msgstr "^K1Вас накрыло кассетными бомбами с Ящера!"
 
 #: qcsrc/common/notifications/all.inc:658
 msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1Вас задело взрывной волной от Raptor'a!"
+msgstr "^K1Вас задело взрывной волной от Ящера!"
 
 #: qcsrc/common/notifications/all.inc:659
 msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1Вас задело взрывной волной от Spiderbot'a!"
+msgstr "^K1Вас задело взрывной волной от Паука-ботa!"
 
 #: qcsrc/common/notifications/all.inc:660
 msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1Ракета Spiderbot'а порвала Вас в клочья!"
+msgstr "^K1Ракета Паука-бота порвала вас в клочья!"
 
 #: qcsrc/common/notifications/all.inc:661
 msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1Вас задело взрывной волной от Racer'а!"
+msgstr "^K1Вас задело взрывной волной от Гонщика!"
 
 #: qcsrc/common/notifications/all.inc:662
 msgid "^K1You couldn't find shelter from a Racer rocket!"
-msgstr "^K1Вы не смогли укрыться от ракеты Racer'а!"
+msgstr "^K1Вы не смогли укрыться от ракеты Гонщика!"
 
 #: qcsrc/common/notifications/all.inc:663
 msgid "^K1Watch your step!"
@@ -3657,22 +3652,22 @@ msgstr "^K1Смотри под ноги!"
 #: qcsrc/common/notifications/all.inc:665
 #, c-format
 msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr "^K1Ð\94ебил! Ð¢Ñ\8b Ñ\83бил ^BG%s^K1, Ñ\81воего Ñ\82оваÑ\80иÑ\89а Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ!"
+msgstr "^K1Ð\9dегодÑ\8fй! Ð\92Ñ\8b Ñ\84Ñ\80агнÑ\83ли ^BG%s^K1, Ñ\81воего Ñ\81оÑ\8eзника!"
 
 #: qcsrc/common/notifications/all.inc:665
 #, c-format
 msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr "^K1Ð\94ебил! Ð¢Ñ\8b Ð½Ð°Ð¿Ð°Ð» Ð½Ð° ^BG%s^K1, Ñ\81воего Ñ\82оваÑ\80иÑ\89а Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ!"
+msgstr "^K1Ð\9dегодÑ\8fй! Ð\92Ñ\8b Ð½Ð°Ð¿Ð°Ð»Ð¸ Ð½Ð° ^BG%s^K1, Ñ\81воего Ñ\81оÑ\8eзника!"
 
 #: qcsrc/common/notifications/all.inc:666
 #, c-format
 msgid "^K1You were fragged by ^BG%s^K1, a team mate"
-msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\83биÑ\82Ñ\8b ^BG%s^K1, Ð²Ð°Ñ\88им Ñ\82оваÑ\80иÑ\89ем Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ"
+msgstr "^K1Ð\92Ñ\8b Ð±Ñ\8bли Ñ\84Ñ\80агнÑ\83Ñ\82Ñ\8b ^BG%s^K1, Ð²Ð°Ñ\88им Ñ\81оÑ\8eзником"
 
 #: qcsrc/common/notifications/all.inc:666
 #, c-format
 msgid "^K1You were scored against by ^BG%s^K1, a team mate"
-msgstr "^K1Ð\92Ñ\8b Ð¿Ñ\80оигÑ\80али Ð¾Ñ\87ко ^BG%s^K1, Ñ\81воемÑ\83 Ñ\82оваÑ\80иÑ\89Ñ\83 Ð¿Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ"
+msgstr "^K1Ð\92Ñ\8b Ð¿Ñ\80оигÑ\80али Ð¾Ñ\87ко ^BG%s^K1, Ñ\81воемÑ\83 Ñ\81оÑ\8eзникÑ\83"
 
 #: qcsrc/common/notifications/all.inc:668
 msgid ""
@@ -3680,7 +3675,7 @@ msgid ""
 "^BGDisconnecting in ^COUNT..."
 msgstr ""
 "^K1Хватит бездельничать!\n"
-"^BGРаÑ\81Ñ\81оединение через ^COUNT..."
+"^BGÐ\9eÑ\82клÑ\8eÑ\87ение через ^COUNT..."
 
 #: qcsrc/common/notifications/all.inc:670
 #, c-format
@@ -3742,7 +3737,7 @@ msgstr "^K1A %s прибыл!"
 
 #: qcsrc/common/notifications/all.inc:694
 msgid "^BGYou got the ^F1Fuel regenerator"
-msgstr "^BGУ Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c ^F1Ð\92оÑ\81Ñ\81Ñ\82ановиÑ\82елÑ\8c топлива"
+msgstr "^BGУ Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c ^F1РегенеÑ\80аÑ\82оÑ\80 топлива"
 
 #: qcsrc/common/notifications/all.inc:695
 msgid "^BGYou got the ^F1Jet pack"
@@ -3828,7 +3823,7 @@ msgstr "^BGОжидание присоединения %s игроков(а)..."
 
 #: qcsrc/common/notifications/all.inc:723
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BGÐ\92аÑ\88е Ð¾Ñ\80Ñ\83жие Ð±Ñ\8bло Ð¾Ñ\81лаблено Ð´Ð¾ Ñ\82еÑ\85 Ð¿Ð¾Ñ\80, Ð¿Ð¾ÐºÐ° Ð²Ñ\8b Ð½Ðµ Ð½Ð°Ð¹Ð´Ñ\91Ñ\82е Ð¿Ð°Ñ\82Ñ\80онÑ\8b!"
+msgstr "^BGВаше оружие ослаблено до тех пор, пока вы не найдёте патроны!"
 
 #: qcsrc/common/notifications/all.inc:724
 msgid "^F4^COUNT^BG left to find some ammo!"
@@ -3974,7 +3969,7 @@ msgstr "^F2Действие Щита закончилось"
 
 #: qcsrc/common/notifications/all.inc:756
 msgid "^F2You are on speed"
-msgstr "^F2Ваша скорость передвижения повышена"
+msgstr "^F2Вы двигаетесь быстрее"
 
 #: qcsrc/common/notifications/all.inc:757
 msgid "^F2Speed has worn off"
@@ -4002,7 +3997,7 @@ msgstr "^BGЗадача выполнена!"
 
 #: qcsrc/common/notifications/all.inc:767
 msgid "^BGThere are more to go..."
-msgstr "^BGВпереди еще много чего..."
+msgstr "^BGВпереди ещё много чего..."
 
 #: qcsrc/common/notifications/all.inc:768
 #, c-format
@@ -4031,7 +4026,7 @@ msgstr "^K1Смена команды через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:776
 msgid "^K1Spectating in ^COUNT"
-msgstr "^K1Ð\92Ñ\8b Ñ\81Ñ\82анеÑ\82е Ð½Ð°Ð±Ð»Ñ\8eдателем через ^COUNT"
+msgstr "^K1Ð\92Ñ\8b Ñ\81Ñ\82анеÑ\82е Ð·Ñ\80ителем через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:777
 msgid "^K1Suicide in ^COUNT"
@@ -4043,11 +4038,11 @@ msgstr "^F4Тайм-аут начнётся через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:780
 msgid "^F4Timeout ends in ^COUNT"
-msgstr "^F4Тайм-аут законится через ^COUNT"
+msgstr "^F4Тайм-аут закончится через ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:782
 msgid "^K1Cannot join given minigame session!"
-msgstr "^K1Невозможно присоединиться к данной сессии миниигры!"
+msgstr "^K1Невозможно присоединиться к данной сессии мини-игры!"
 
 #: qcsrc/common/notifications/all.inc:784
 #, c-format
@@ -4057,7 +4052,7 @@ msgstr "^BGНажмите ^F2%s^BG, чтобы войти или выйти из
 #: qcsrc/common/notifications/all.inc:785
 #, c-format
 msgid "^BGPress ^F2%s^BG to enter the vehicle gunner"
-msgstr "^BGНажмите ^F2%s^BG, чтобы стать пулемётчиком траспорта"
+msgstr "^BGНажмите ^F2%s^BG, чтобы стать пулемётчиком транспорта"
 
 #: qcsrc/common/notifications/all.inc:786
 #, c-format
@@ -4154,7 +4149,7 @@ msgstr "%s^K1 начал РЕЗНЮ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:446
 msgid "MASSACRE! "
-msgstr "РЕЗНЯ!"
+msgstr "РЕЗНЯ! "
 
 #: qcsrc/common/notifications/all.qh:447
 #, c-format
@@ -4173,7 +4168,7 @@ msgstr "БЕСПРЕДЕЛ! "
 #: qcsrc/common/notifications/all.qh:448
 #, c-format
 msgid "%s^K1 is a BERSERKER! %s^BG"
-msgstr "%s^K1 БЕРСЕРКЕР! %s^BG"
+msgstr "%s^K1 БЕРСЕРК! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:448
 #, c-format
@@ -4182,7 +4177,7 @@ msgstr "%s^K1 набрал ДВАДЦАТЬ ОЧКОВ ПОДРЯД! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:448
 msgid "BERSERKER! "
-msgstr "БЕРСЕРКЕР! "
+msgstr "БЕРСЕРК! "
 
 #: qcsrc/common/notifications/all.qh:449
 #, c-format
@@ -4196,7 +4191,7 @@ msgstr "%s^K1 набрал ДВАДЦАТЬ ПЯТЬ ОЧКОВ ПОДРЯД! %s
 
 #: qcsrc/common/notifications/all.qh:449
 msgid "CARNAGE! "
-msgstr "БОЙНЯ!"
+msgstr "БОЙНЯ! "
 
 #: qcsrc/common/notifications/all.qh:450
 #, c-format
@@ -4210,7 +4205,7 @@ msgstr "%s^K1 предрекает АРМАГЕДДОН! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:450
 msgid "ARMAGEDDON! "
-msgstr "АРМАГЕДДОН!"
+msgstr "АРМАГЕДДОН! "
 
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
@@ -4299,7 +4294,7 @@ msgstr ", прервав серию из %d очков подряд"
 #: qcsrc/common/notifications/all.qh:610
 #, c-format
 msgid ", losing their %d frag spree"
-msgstr ", Ð¾ÐºÐ¾Ð½Ñ\87ив свою серию из %d убийств подряд"
+msgstr ", Ð¿Ñ\80еÑ\80вав свою серию из %d убийств подряд"
 
 #: qcsrc/common/notifications/all.qh:611
 #, c-format
@@ -4380,7 +4375,7 @@ msgstr "GENERATOR^Розовый"
 
 #: qcsrc/common/turrets/all.qh:51
 msgid "Turrets dump command only works with sv_cmd.\n"
-msgstr "Команда выгрузки туреток работает только с sv_cmd.\n"
+msgstr "Команда выгрузки турелей работает только с sv_cmd.\n"
 
 #: qcsrc/common/turrets/cl_turrets.qc:129
 #, c-format
@@ -4401,7 +4396,7 @@ msgstr "еМобиль"
 
 #: qcsrc/common/turrets/turret/flac.qh:13
 msgid "FLAC Cannon"
-msgstr "Ð\97ениÑ\82наÑ\8f Ð¿ушка"
+msgstr "Ð\97ениÑ\82наÑ\8f Ð\9fушка"
 
 #: qcsrc/common/turrets/turret/flac_weapon.qh:7
 msgid "FLAC"
@@ -4474,11 +4469,11 @@ msgstr "Катушка Теслы"
 
 #: qcsrc/common/turrets/turret/walker.qh:15
 msgid "Walker Turret"
-msgstr "ХодÑ\8fÑ\87аÑ\8f Ñ\82Ñ\83Ñ\80елÑ\8c"
+msgstr "ТÑ\83Ñ\80елÑ\8c Ð¥Ð¾Ð´Ñ\83на"
 
 #: qcsrc/common/turrets/turret/walker_weapon.qh:7
 msgid "Walker"
-msgstr "Ходунки"
+msgstr "Ходун"
 
 #: qcsrc/common/vehicles/cl_vehicles.qc:192
 #, c-format
@@ -4523,7 +4518,7 @@ msgstr "Вспышка Ящера"
 
 #: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
 msgid "Spiderbot"
-msgstr "Паук-робот"
+msgstr "Паук-бот"
 
 #: qcsrc/common/weapons/all.qh:78
 msgid "Weapons dump command only works with sv_cmd.\n"
@@ -4910,7 +4905,7 @@ msgstr "Код игры"
 
 #: qcsrc/menu/xonotic/credits.qc:116
 msgid "Marketing / PR"
-msgstr "Маркетинг / Cвязи с общественностью"
+msgstr "Маркетинг / Связи с общественностью"
 
 #: qcsrc/menu/xonotic/credits.qc:122
 msgid "Legal"
@@ -5297,7 +5292,7 @@ msgstr "Панель информационных сообщений"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
 msgid "PNL^Disabled"
-msgstr "PNL^Ð\92Ñ\8bключена"
+msgstr "PNL^Ð\9eÑ\82ключена"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
 msgid "PNL^Enabled spectating"
@@ -5429,7 +5424,7 @@ msgstr "км/ч"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:54
 msgid "mph"
-msgstr "милÑ\8f/ч"
+msgstr "милÑ\8c/ч"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:55
 msgid "knots"
@@ -5449,7 +5444,7 @@ msgstr "Ускорение:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
 msgid "Include vertical acceleration"
-msgstr "С вертикальним ускорением"
+msgstr "С вертикальным ускорением"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
 msgid "Physics Panel"
@@ -5539,19 +5534,19 @@ msgstr "Режим увел.:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
 msgid "Zoomed in"
-msgstr "Приближён"
+msgstr "Приближен"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
 msgid "Zoomed out"
-msgstr "Не приближён"
+msgstr "Не приближен"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
 msgid "Always zoomed"
-msgstr "Всегда приближён"
+msgstr "Всегда приближен"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
 msgid "Never zoomed"
-msgstr "Никогда не приближён"
+msgstr "Никогда не приближен"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
 msgid "Radar Panel"
@@ -5643,7 +5638,7 @@ msgstr "Иконки оружия:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:41
 msgid "Show only owned weapons"
-msgstr "Показывать только свое оружие"
+msgstr "Показывать только своё оружие"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:52
 msgid "Show weapon ID as:"
@@ -5708,7 +5703,7 @@ msgstr "Обновить"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:30
 msgid "Set skin"
-msgstr "Ð\92Ñ\8bбÑ\80ать тему"
+msgstr "Ð\9fÑ\80именить тему"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
 msgid "Save current skin"
@@ -5901,7 +5896,7 @@ msgstr "Предел фрагов:"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:66
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:78
 msgid "The amount of frags needed before the match will end"
-msgstr "Количество фрагов, необходимых для завершения состязания"
+msgstr "Количество фрагов, необходимых для завершения матча"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:67
 msgid "Capture limit:"
@@ -5909,7 +5904,7 @@ msgstr "Предел захватов:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:67
 msgid "The amount of captures needed before the match will end"
-msgstr "Количество захватов, необходимых для завершения состязания"
+msgstr "Количество захватов, необходимых для завершения матча"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:68
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:69
@@ -5925,7 +5920,7 @@ msgstr "Предел очков:"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:69
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:77
 msgid "The amount of points needed before the match will end"
-msgstr "Количество очков, необходимых для завершения состязания"
+msgstr "Количество очков, необходимых для завершения матча"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:70
 msgid "Lives:"
@@ -5941,7 +5936,7 @@ msgstr "Цели:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:72
 msgid "The amount of goals needed before the match will end"
-msgstr "Количество голов, необходимых для завершения состязания"
+msgstr "Количество голов, необходимых для завершения матча"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:97
 msgid "Gametype"
@@ -5953,8 +5948,7 @@ msgstr "Предел времени:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:104
 msgid "Timelimit in minutes that when hit, will end the match"
-msgstr ""
-"Ограничение времени в минутах, состязание закончится при его достижении"
+msgstr "Ограничение времени в минутах, после которого закончится матч"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:105
 #, c-format
@@ -6079,8 +6073,8 @@ msgid ""
 "Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
 "Delete to clear; Enter when done."
 msgstr ""
-"Нажмите здесь или Ctrl-F, чтобы задать ключевое слово для сужения списка "
-"карт. Ctrl-Delete, чтобы очистить; Enter, когда закончите."
+"Нажмите здесь или Ctrl+F, чтобы задать ключевое слово для сужения списка "
+"карт. Ctrl+Delete, чтобы очистить; Enter, когда закончите."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:207
 msgid "Add shown"
@@ -6137,7 +6131,7 @@ msgstr "Закрыть"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:96
 msgid "MAP^Play"
-msgstr "Играть"
+msgstr "MAP^Играть"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
 msgid "Map Information"
@@ -6164,12 +6158,12 @@ msgstr "Уклонение"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:63
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:267
 msgid "InstaGib"
-msgstr "Ð\98нÑ\81Ñ\82аÐ\93иб"
+msgstr "Ð\98нÑ\81Ñ\82агиб"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:216
 msgid "New Toys"
-msgstr "Ð\9dовÑ\8bе Ð\98грушки"
+msgstr "Ð\9dовÑ\8bе Ð¸грушки"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:272
@@ -6179,12 +6173,12 @@ msgstr "НИКС"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:69
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:220
 msgid "Rocket Flying"
-msgstr "РакеÑ\82нÑ\8bй Ð\9fолÑ\91Ñ\82"
+msgstr "Ð\9fолÑ\91Ñ\82 Ð½Ð° Ñ\80акеÑ\82е"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
 msgid "Invincible Projectiles"
-msgstr "Неразрушимые Снаряды"
+msgstr "Неразрушимые снаряды"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:75
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:282
@@ -6309,7 +6303,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:230
 msgid "Weapons stay after they are picked up"
-msgstr "Ð\92Ñ\81Ñ\91 Ñ\81обÑ\80анное Ð¾Ñ\80Ñ\83жие Ð¾Ñ\81Ñ\82аÑ\91Ñ\82Ñ\81Ñ\8f Ð¿Ð¾Ñ\81ле Ð²Ð¾Ð·Ñ\80ождений"
+msgstr "Ð\9fÑ\83Ñ\88ки Ð¾Ñ\81Ñ\82аÑ\8eÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ñ\81ле Ð¿Ð¾Ð´Ð±Ð¾Ñ\80а"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:235
 msgid "Regular (no arena)"
@@ -6350,8 +6344,8 @@ msgid ""
 msgstr ""
 "Игроки получат только одно оружие, которое немедленно убьёт противника с "
 "одного выстрела. Если игрок испытывает недостаток патронов, у него есть 10 "
-"Ñ\81екÑ\83нд, Ñ\87Ñ\82обÑ\8b Ð½Ð°Ð¹Ñ\82и ÐµÑ\89Ñ\91, Ð¸Ð½Ð°Ñ\87е Ð¾Ð½ Ð²Ñ\81Ñ\82Ñ\80еÑ\82иÑ\82 Ñ\81меÑ\80Ñ\82Ñ\8c. Ð ÐµÐ¶Ð¸Ð¼ Ð²Ñ\82оÑ\80оÑ\81Ñ\82епенного "
-"огня не наносит урона, но он хорош для прыжка."
+"Ñ\81екÑ\83нд, Ñ\87Ñ\82обÑ\8b Ð½Ð°Ð¹Ñ\82и ÐµÑ\89Ñ\91, Ð¸Ð½Ð°Ñ\87е Ð¾Ð½ Ð²Ñ\81Ñ\82Ñ\80еÑ\82иÑ\82 Ñ\81меÑ\80Ñ\82Ñ\8c. Ð ÐµÐ¶Ð¸Ð¼ Ð°Ð»Ñ\8cÑ\82еÑ\80наÑ\82ивного "
+"огня не наносит урона, но он хорош для трюков."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
 msgid ""
@@ -6359,9 +6353,9 @@ msgid ""
 "weapon. After some time, a countdown will start, after which everyone will "
 "switch to another weapon."
 msgstr ""
-"Xonotic без предметов — вместо подбора предметов, каждый играет с тем же "
-"оружием. Через некоторое время начнётся обратный отчёт, после чего "
-"переключится на другое оружие."
+"Xonotic без предметов — вместо подбора предметов, каждый играет одним и тем "
+"же Ð¾Ñ\80Ñ\83жием. Ð§ÐµÑ\80ез Ð½ÐµÐºÐ¾Ñ\82оÑ\80ое Ð²Ñ\80емÑ\8f Ð½Ð°Ñ\87нÑ\91Ñ\82Ñ\81Ñ\8f Ð¾Ð±Ñ\80аÑ\82нÑ\8bй Ð¾Ñ\82Ñ\87Ñ\91Ñ\82, Ð¿Ð¾Ñ\81ле Ñ\87его "
+"произойдёт переключение на другое оружие."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:277
 msgid "with blaster"
@@ -6403,7 +6397,8 @@ msgstr "Пауза"
 msgid ""
 "Pause updating the server list to prevent servers from \"jumping around\""
 msgstr ""
-"Приостановить обновление списка серверов для предотвращения их скакания"
+"Приостановить обновление списка серверов для закрепления серверов на одном "
+"месте"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:53
 msgid "Reload the server list"
@@ -6802,11 +6797,11 @@ msgstr "Установить прочность:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
 msgid "Non-solid"
-msgstr "Не твердый"
+msgstr "Не твёрдый"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
 msgid "Solid"
-msgstr "Твердый"
+msgstr "Твёрдый"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
 msgid "Set physics:"
@@ -7027,7 +7022,7 @@ msgstr "7.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
 msgid "Swap stereo output channels"
-msgstr "Поменять местами стерео каналы"
+msgstr "Поменять местами каналы стерео"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
 msgid "Swap left/right channels"
@@ -7250,8 +7245,8 @@ msgid ""
 "Disable textures completely for very slow hardware. This gives a huge "
 "performance boost, but looks very ugly. (default: disabled)"
 msgstr ""
-"Ð\92Ñ\8bклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\82екÑ\81Ñ\82Ñ\83Ñ\80Ñ\8b Ð¿Ð¾Ð»Ð½Ð¾Ñ\81Ñ\82Ñ\8cÑ\8e для очень слабых компьютеров. Это даст лучшую "
-"пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c, Ð½Ð¾ Ð±Ñ\83деÑ\82 Ð²Ñ\8bглÑ\8fдеÑ\82Ñ\8c Ð¿Ð»Ð¾Ñ\85о (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Ð\9fолноÑ\81Ñ\82Ñ\8cÑ\8e Ð¾Ñ\82клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\82екÑ\81Ñ\82Ñ\83Ñ\80Ñ\8b для очень слабых компьютеров. Это даст лучшую "
+"пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c, Ð½Ð¾ Ð±Ñ\83деÑ\82 Ð²Ñ\8bглÑ\8fдеÑ\82Ñ\8c Ð½Ðµ ÐºÑ\80аÑ\81иво (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:135
 msgid "Use lightmaps"
@@ -7294,7 +7289,7 @@ msgid ""
 "\"pop out\" of the flat 2D surface (default: disabled)"
 msgstr ""
 "Эффект рельефного текстурирования, который сделает 2D-текстуры трёхмерными "
-"(по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"(по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:148
 msgid "Relief mapping"
@@ -7306,7 +7301,7 @@ msgid ""
 "(default: disabled)"
 msgstr ""
 "Более высокое качество рельефного текстурирования, которое также снизит "
-"пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:152
 msgid "Reflections:"
@@ -7318,7 +7313,7 @@ msgid ""
 "with reflecting surfaces (default: disabled)"
 msgstr ""
 "Качество отражения и преломления, снижающее производительность на картах с "
-"зеÑ\80калÑ\8cнÑ\8bми Ð¿Ð¾Ð²ÐµÑ\80Ñ\85ноÑ\81Ñ\82Ñ\8fми (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"зеÑ\80калÑ\8cнÑ\8bми Ð¿Ð¾Ð²ÐµÑ\80Ñ\85ноÑ\81Ñ\82Ñ\8fми (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:156
 msgid "Resolution of reflections/refractions (default: good)"
@@ -7400,7 +7395,7 @@ msgid ""
 "of real dynamic lights (default: disabled)"
 msgstr ""
 "Включить быстрое, но некрасивое динамическое освещение отрисовкой ярких "
-"коÑ\80он Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\80еалÑ\8cного Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ\87еÑ\81кого Ð¾Ñ\81веÑ\89ениÑ\8f (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"коÑ\80он Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\80еалÑ\8cного Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ\87еÑ\81кого Ð¾Ñ\81веÑ\89ениÑ\8f (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:198
 msgid "Realtime dynamic lighting"
@@ -7422,7 +7417,7 @@ msgstr "Тени"
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
 msgid "Enable rendering of shadows from dynamic lights (default: disabled)"
 msgstr ""
-"Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð¾Ñ\82Ñ\80иÑ\81овкÑ\83 Ñ\82еней Ð¾Ñ\82 Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ\87еÑ\81кого Ð¾Ñ\81веÑ\89ениÑ\8f (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð¾Ñ\82Ñ\80иÑ\81овкÑ\83 Ñ\82еней Ð¾Ñ\82 Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ\87еÑ\81кого Ð¾Ñ\81веÑ\89ениÑ\8f (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:205
 msgid "Realtime world lighting"
@@ -7435,13 +7430,13 @@ msgid ""
 msgstr ""
 "Включить отрисовку полного освещения реального времени на картах, "
 "поддерживающих это. Примечание: это скажется на производительности (по "
-"Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
 msgid ""
 "Enable rendering of shadows from realtime world lights (default: disabled)"
 msgstr ""
-"Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð¾Ñ\82Ñ\80иÑ\81овкÑ\83 Ñ\82еней Ð¾Ñ\82 Ð¾Ñ\81веÑ\89ениÑ\8f Ñ\80еалÑ\8cного Ð²Ñ\80емени (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð¾Ñ\82Ñ\80иÑ\81овкÑ\83 Ñ\82еней Ð¾Ñ\82 Ð¾Ñ\81веÑ\89ениÑ\8f Ñ\80еалÑ\8cного Ð²Ñ\80емени (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:212
 msgid "Use normal maps"
@@ -7474,7 +7469,7 @@ msgid ""
 msgstr ""
 "Включить эффект свечения, который увеличивает яркость пикселей, "
 "соседствующих с очень яркими. Очень снижает производительность (по "
-"Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:226
 msgid "Extra postprocessing effects"
@@ -7486,7 +7481,7 @@ msgid ""
 "using a powerup (default: disabled)"
 msgstr ""
 "Включить специальные эффекты пост-обработки, когда получен урон, под водой "
-"или Ð²ÐºÐ»Ñ\8eÑ\87ен Ñ\81веÑ\82 (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"или Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ñ\83Ñ\81илиÑ\82елÑ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:232
 msgid "Motion blur strength - 0.4 recommended"
@@ -7598,7 +7593,7 @@ msgstr "Расплывчатый прицел на препятствиях"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
 msgid "Enlarge crosshair if targeting an enemy"
-msgstr "Увеличивать прицел, при наведении на врага"
+msgstr "Увеличивать прицел при наведении на врага"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:143
 msgid "Animate crosshair when hitting an enemy"
@@ -7761,7 +7756,7 @@ msgstr "Серии убийств в информационных сообщен
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
 msgid "SPREES^Disabled"
-msgstr "SPREES^Ð\92Ñ\8bключены"
+msgstr "SPREES^Ð\9eÑ\82ключены"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:47
 msgid "Target"
@@ -7855,7 +7850,7 @@ msgstr "Предметы"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:32
 msgid "Use simple 2D images instead of item models"
-msgstr "Показывать 2D изображения вместо моделей предметов"
+msgstr "Показывать иконки вместо моделей предметов"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
 msgid "Unavailable alpha:"
@@ -7875,7 +7870,7 @@ msgstr "Тёмный"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:41
 msgid "GHOITEMS^Tinted"
-msgstr "Окрашеные"
+msgstr "Окрашенные"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:42
 msgid "GHOITEMS^Normal"
@@ -7892,11 +7887,11 @@ msgstr "Игроки"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
 msgid "Force player models to mine"
-msgstr "Применить мою модель к другим игрокам"
+msgstr "Применять мою модель к игрокам"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
 msgid "Force player colors to mine"
-msgstr "Применить мои цвета к другим игрокам"
+msgstr "Применять мои цвета к игрокам"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
 msgid "In non teamplay modes only"
@@ -7952,7 +7947,7 @@ msgstr "Плавное приседание"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:42
 msgid "View waving while idle"
-msgstr "РаÑ\81каÑ\87ивание ÐºÐ°Ð¼ÐµÑ\80Ñ\8b Ð¿Ñ\80и Ð±ÐµÐ·Ð´ÐµÐ¹Ñ\81Ñ\82вовии"
+msgstr "Раскачивание камеры при бездействии"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:46
 msgid "View bobbing while walking around"
@@ -8029,15 +8024,15 @@ msgstr "Кратность"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:113
 msgid "Display reticle 2D overlay while zooming"
-msgstr "Показывать 2D эффект увеличительного прицела"
+msgstr "Показывать 2D-эффект увеличительного прицела"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:116
 msgid "Release zoom when you die or respawn"
-msgstr "Ð\92Ñ\8bключать увеличитель при смерти или возрождении"
+msgstr "Ð\9eÑ\82ключать увеличитель при смерти или возрождении"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:120
 msgid "Release zoom when you switch weapons"
-msgstr "Ð\92Ñ\8bключать увеличитель при смене оружия"
+msgstr "Ð\9eÑ\82ключать увеличитель при смене оружия"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qh:7
 #: qcsrc/menu/xonotic/keybinder.qc:76
@@ -8058,7 +8053,7 @@ msgstr "Вниз"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:50
 msgid "Use priority list for weapon cycling"
-msgstr "Использовать приоритеты для прокрутки оружия"
+msgstr "Использовать приоритеты для переключения оружия"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:51
 msgid ""
@@ -8067,7 +8062,7 @@ msgstr "Использовать список выше при езде с ору
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:53
 msgid "Cycle through only usable weapon selections"
-msgstr "ЦиклиÑ\80овать только готовые к использованию оружия"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87ать только готовые к использованию оружия"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:57
 msgid "Auto switch weapons on pickup"
@@ -8082,7 +8077,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:61
 msgid "Release attack buttons when you switch weapons"
-msgstr "Ð\92Ñ\8bключать кнопку атаки при смене оружия"
+msgstr "Ð\9eÑ\82ключать кнопку атаки при смене оружия"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
 msgid "Draw 1st person weapon model"
@@ -8176,7 +8171,7 @@ msgstr "Отключить системное ускорение мыши"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:79
 msgid "Make use of DGA mouse input"
-msgstr "Использовать DGA ввод для мыши"
+msgstr "Использовать ввод с мыши через DGA"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:93
 msgid "Pressing \"enter console\" key also closes it"
@@ -8188,7 +8183,7 @@ msgstr "Использовать клавишу для открытия конс
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:96
 msgid "Automatically repeat jumping if holding jump"
-msgstr "Повторять прыжок автоматически при удержании"
+msgstr "Повторять прыжок автоматически при удержании нажатия"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:99
 msgid "Jetpack on jump:"
@@ -8196,7 +8191,7 @@ msgstr "Реактивный ранец при прыжке:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:101
 msgid "JPJUMP^Disabled"
-msgstr "JPJUMP^Ð\92Ñ\8bключены"
+msgstr "JPJUMP^Ð\9eÑ\82ключены"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:102
 msgid "Air only"
@@ -8231,7 +8226,7 @@ msgstr "Определённая пользователем привязка к
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
 #, c-format
 msgid "%d fps"
-msgstr "%d фпс"
+msgstr "%d fps"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
 #, c-format
@@ -8253,7 +8248,7 @@ msgstr "Порт UDP клиента:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
 msgid "Force client to use chosen port unless it is set to 0"
-msgstr "Ð\9fÑ\80инÑ\83диÑ\82елÑ\8cное Ð¸Ñ\81полÑ\8cзованние ÐºÐ»Ð¸ÐµÐ½Ñ\82ом Ð²Ñ\8bбÑ\80анного Ð¿Ð¾Ñ\80Ñ\82а, Ð¸Ð½Ð°Ñ\87е 0"
+msgstr "Принудительное использование клиентом выбранного порта, иначе 0"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
 msgid "Bandwidth:"
@@ -8329,7 +8324,7 @@ msgstr "Компенсация ошибки движения"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:82
 msgid "Use encryption (AES) when available"
-msgstr "Использовать шифрование (AES) если возможно"
+msgstr "Использовать шифрование (AES), если возможно"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:85
 msgid "Framerate"
@@ -8369,7 +8364,7 @@ msgstr "Показывать кол-во кадров в секунду (FPS)"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
 msgid "Show your rendered frames per second"
-msgstr "Показывать кол-во отрисованных кадров в секуду"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c ÐºÐ¾Ð»-во Ð¾Ñ\82Ñ\80иÑ\81ованнÑ\8bÑ\85 ÐºÐ°Ð´Ñ\80ов Ð² Ñ\81екÑ\83ндÑ\83"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:135
 msgid "Menu tooltips:"
@@ -8401,7 +8396,7 @@ msgstr "Показывать текущие дату и время"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:144
 msgid "Show current date and time of day, useful on screenshots"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ие Ð´Ð°Ñ\82Ñ\83 Ð¸ Ð²Ñ\80емÑ\8f, Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ\8f Ñ\81нимков Ñ\8dкÑ\80ана"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ие Ð´Ð°Ñ\82Ñ\83 Ð¸ Ð²Ñ\80емÑ\8f, Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ\8f Ñ\81кÑ\80инÑ\88оÑ\82ов"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:147
 msgid "Enable developer mode"
@@ -8423,7 +8418,7 @@ msgstr "Полный сброс"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
 msgid "Cvar filter:"
-msgstr "Фильтр cvar:"
+msgstr "Фильтр переменных:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
 msgid "Modified cvars only"
@@ -8467,7 +8462,7 @@ msgstr "Язык текста"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:69
 msgid "Set language"
-msgstr "Ð\92Ñ\8bбÑ\80ать язык"
+msgstr "Ð\9fÑ\80именить язык"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:74
 msgid "Disable gore effects and harsh language"
@@ -8478,12 +8473,11 @@ msgid ""
 "Replace blood and gibs with content that does not have any gore effects "
 "(default: disabled)"
 msgstr ""
-"Заменить кровь и ошмётки контентом без элементов насилия (по умолчанию: "
-"выкл.)"
+"Заменить кровь и ошмётки эффектом без элементов насилия (по умолчанию: откл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
 msgid "While connected language changes will be applied only to the menu,"
-msgstr "Ð\9fока Ð²Ñ\8b Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87енÑ\8b, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\8fзÑ\8bка Ð¿Ñ\80имениÑ\82Ñ\81Ñ\8f только для меню,"
+msgstr "Ð\9fока Ð²Ñ\8b Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87енÑ\8b, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\8fзÑ\8bка Ð²Ñ\81Ñ\82Ñ\83пиÑ\82 Ð² Ñ\81илÑ\83 только для меню,"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
 msgid "full language changes will take effect starting from the next game"
@@ -8491,7 +8485,7 @@ msgstr "полное применение языка вступит в силу
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
 msgid "Disconnect now"
-msgstr "СейÑ\87аÑ\81 Ð¾Ñ\82клÑ\8eÑ\87ен"
+msgstr "Ð\9eÑ\82Ñ\81оединиÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81ейÑ\87аÑ\81"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
 msgid "Switch language"
@@ -8551,7 +8545,7 @@ msgstr "Глубина цвета:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:53
 msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
-msgstr "Сколько бит на точку использовать для вывода, советуется 32"
+msgstr "Сколько бит на пиксель использовать для вывода, рекомендуется 32"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:54
 msgid "16bit"
@@ -8574,9 +8568,9 @@ msgid ""
 "Enable vertical synchronization to prevent tearing, will cap your fps to the "
 "screen refresh rate (default: disabled)"
 msgstr ""
-"Включить вертикальную синхронизацию для предотвращения образования трещин, "
-"ограничит частоту кадров в секунду частотой обновления экрана (по умолчанию: "
-"выкл.)"
+"Включить вертикальную синхронизацию для предотвращения разрывов кадров, это "
+"ограничит частоту кадров в секунду частотой обновления монитора (по "
+"умолчанию: откл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:67
 msgid "Flip view horizontally"
@@ -8584,7 +8578,7 @@ msgstr "Перевернуть изображение по горизонтал
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:68
 msgid "Poor man's left handed mode (default: off)"
-msgstr "Режим Ð»ÐµÐ²Ð¾Ñ\80Ñ\83кого Ð±ÐµÐ´Ð½Ñ\8fги (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл)"
+msgstr "Режим Ð»ÐµÐ²Ð¾Ñ\80Ñ\83кого Ð±ÐµÐ´Ð½Ñ\8fги (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:71
 msgid "Anisotropy:"
@@ -8626,7 +8620,7 @@ msgid ""
 "might decrease performance by quite a lot (default: disabled)"
 msgstr ""
 "Включить сглаживание, которое сглаживает края 3D-геометрии. Примечание: это "
-"можеÑ\82 Ñ\81илÑ\8cно Ñ\81низиÑ\82Ñ\8c Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"можеÑ\82 Ñ\81илÑ\8cно Ñ\81низиÑ\82Ñ\8c Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:85
 msgid "AA^Disabled"
@@ -8638,7 +8632,7 @@ msgstr "Высококачественный буфер кадров"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:97
 msgid "Depth first:"
-msgstr "СпеÑ\80ва глубина:"
+msgstr "СнаÑ\87ала глубина:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:99
 msgid ""
@@ -8646,7 +8640,7 @@ msgid ""
 "normal rendering starts (default: disabled)"
 msgstr ""
 "Устранить перерасход отрисовкой только глубокой версии сцен до нормального "
-"наÑ\87ала Ð¾Ñ\82Ñ\80иÑ\81овки (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"наÑ\87ала Ð¾Ñ\82Ñ\80иÑ\81овки (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:100
 msgid "DF^Disabled"
@@ -8662,7 +8656,7 @@ msgstr "Всё"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:105
 msgid "Vertex Buffer Objects (VBOs)"
-msgstr "Использовать Vertex Buffer Objects (VBO)"
+msgstr "Использовать вершинные буферы (VBO)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:108
 msgid "VBO^Off"
@@ -8670,7 +8664,7 @@ msgstr "Отключено"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:109
 msgid "Vertices, some Tris (compatible)"
-msgstr "Вершины и отдельные треугольники (безопасно)"
+msgstr "Вершины, отдельные треугольники (безопасно)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:110
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:114
@@ -8768,9 +8762,9 @@ msgid ""
 "Make the CPU wait for the GPU to finish each frame, can help with some "
 "strange input or video lag on some machines (default: disabled)"
 msgstr ""
-"Заставляет процессор ждать пока видеокарта закончит отрисовку каждого кадра, "
-"может помочь в случае задержек и лагов на некоторых компьютерах (по "
-"Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Заставляет процессор ждать, пока видеокарта закончит отрисовку каждого "
+"кадÑ\80а, Ð¼Ð¾Ð¶ÐµÑ\82 Ð¿Ð¾Ð¼Ð¾Ñ\87Ñ\8c Ð² Ñ\81лÑ\83Ñ\87ае Ð·Ð°Ð´ÐµÑ\80жек Ð¸ Ð»Ð°Ð³Ð¾Ð² Ð½Ð° Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80аÑ\85 (по "
+"Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:158
 msgid "Use OpenGL 2.0 shaders (GLSL)"
@@ -8785,8 +8779,8 @@ msgid ""
 "Enable use of GLSL to apply gamma correction, note that it might decrease "
 "performance by a lot (default: disabled)"
 msgstr ""
-"Активировать GLSL, чтобы применить гамма-коррекцию. Примечание: это сильно "
-"Ñ\81низиÑ\82 Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð²Ñ\8bкл.)"
+"Активировать GLSL, чтобы применять гамма-коррекцию. Примечание: это сильно "
+"Ñ\81низиÑ\82 Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (по Ñ\83молÑ\87аниÑ\8e: Ð¾Ñ\82кл.)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:168
 msgid "Psycho coloring (easter egg)"
@@ -8810,7 +8804,7 @@ msgstr "Уровень сложности:"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
 msgid "CSKL^Easy"
-msgstr "Легкий"
+msgstr "Лёгкий"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
 msgid "CSKL^Medium"
@@ -8838,11 +8832,11 @@ msgstr "Победитель"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:32
 msgid "join 'best' team (auto-select)"
-msgstr "пÑ\80иÑ\81оединиÑ\82Ñ\8cÑ\81Ñ\8f Ðº 'лÑ\83Ñ\87Ñ\88ей' ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ (авÑ\82овÑ\8bбоÑ\80)"
+msgstr "авÑ\82овÑ\8bбоÑ\80 'лÑ\83Ñ\87Ñ\88ей' ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:33
 msgid "Autoselect team (recommended)"
-msgstr "Ð\90вÑ\82овÑ\8bбоÑ\80 ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b (Ñ\81овеÑ\82уется)"
+msgstr "Ð\90вÑ\82овÑ\8bбоÑ\80 ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b (Ñ\80екомендуется)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:37
 msgid "red"
@@ -8962,7 +8956,7 @@ msgstr "показать очки"
 
 #: qcsrc/menu/xonotic/keybinder.qc:80
 msgid "screen shot"
-msgstr "Ñ\81нимок Ñ\8dкÑ\80ана"
+msgstr "Ñ\81кÑ\80инÑ\88оÑ\82"
 
 #: qcsrc/menu/xonotic/keybinder.qc:81
 msgid "maximize radar"
@@ -8970,7 +8964,7 @@ msgstr "увеличить радар"
 
 #: qcsrc/menu/xonotic/keybinder.qc:82
 msgid "3rd person view"
-msgstr "Ð\92ид от 3-го лица"
+msgstr "вид от 3-го лица"
 
 #: qcsrc/menu/xonotic/keybinder.qc:83
 msgid "enter spectator mode"
@@ -9018,7 +9012,7 @@ msgstr "выйти"
 
 #: qcsrc/menu/xonotic/keybinder.qc:101
 msgid "auto-join team"
-msgstr "авто-выбор команды"
+msgstr "автовыбор команды"
 
 #: qcsrc/menu/xonotic/keybinder.qc:103
 msgid "drop key / drop flag"
@@ -9048,7 +9042,7 @@ msgstr "Не нажимайте эту кнопку снова!"
 msgid ""
 "Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
 msgstr ""
-"Что? Не могу зайти (m = NULL). Перефильтрую, чтобы такого больше не "
+"Что? Не могу зайти (m = NULL). Перефильтровка, чтобы такого больше не "
 "случалось.\n"
 
 #: qcsrc/menu/xonotic/maplist.qc:299
@@ -9061,8 +9055,8 @@ msgid ""
 "Huh? Can't play this (invalid game type). Refiltering so this won't happen "
 "again.\n"
 msgstr ""
-"Что? Не могу зайти (неверный тип игры). Перефильтрую, чтобы такого больше не "
-"случалось.\n"
+"Что? Не могу зайти (неверный тип игры). Перефильтровка, чтобы такого больше "
+"не случалось.\n"
 
 #: qcsrc/menu/xonotic/playerlist.qc:100 qcsrc/menu/xonotic/playerlist.qc:110
 msgid "spectator"
@@ -9320,7 +9314,7 @@ msgstr "Любимая_карта:"
 #: qcsrc/menu/xonotic/statslist.qc:201 qcsrc/menu/xonotic/statslist.qc:245
 #, c-format
 msgid "%s_Matches:"
-msgstr "%s_матчей:"
+msgstr "Матчи_%s:"
 
 #: qcsrc/menu/xonotic/statslist.qc:208
 #, c-format
@@ -9345,7 +9339,7 @@ msgstr "%s_любимая_карта:"
 #: qcsrc/menu/xonotic/statslist.qc:246
 #, c-format
 msgid "%d (unranked)"
-msgstr "%d (неÑ\80ейÑ\82инговÑ\8bе)"
+msgstr "%d (без Ñ\80ейÑ\82инга)"
 
 #: qcsrc/menu/xonotic/util.qc:417
 #, c-format
index b2544fa0740c89e540773baa6b08dd9cd12483c0..128169c502911d760c7de4707850887c805f6284 100644 (file)
@@ -7581,6 +7581,15 @@ effect arc_lightning
        underwater
        velocityjitter 250 250 250
        velocitymultiplier 20
+effect arc_lightning
+       type smoke
+       alpha 40 40 350
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       sizeincrease 400
+       size 4 4
+       tex 38 38
+       velocitymultiplier 100
 effect arc_beam
        type spark
        airfriction -10
index c997fea25772cd797dc361c60304db04e7cc3b5b..cfaa1e5804da071f55675621780791861d5b3fc2 100644 (file)
@@ -205,7 +205,6 @@ COLOR_SLIDER_D                '1 1 1'
 COLOR_SLIDER_F                '1 1 1'
 COLOR_SLIDER_N                '1 1 1'
 COLOR_SLIDER_S                '1 1 1'
-TOLERANCE_SLIDER              '0.2 2 0'
 WIDTH_SLIDERTEXT              0.333333333333
 
 // tooltip
index ca0384fb554135f88ed4bf13a41c3b3e849497f9..2ffe29af0c04e785e215421c99c9a450d6b71ae5 100755 (executable)
@@ -252,4 +252,3 @@ COLOR_SLIDER_F                  '1 1 1'
 COLOR_SLIDER_D                  '1 1 1'
 COLOR_SLIDER_S                  '1 1 1'
 WIDTH_SLIDERTEXT                0.333333333333
-TOLERANCE_SLIDER                '0.2 2 0'
index b7011a0b0e18369246a573e86f52dd0d22174bb4..0580e89eb1a152813fe0a25636285f84740a85ce 100644 (file)
@@ -252,4 +252,3 @@ COLOR_SLIDER_F                  '0.5 0.75 1'
 COLOR_SLIDER_D                  '1 1 1'
 COLOR_SLIDER_S                  '0.25 0.25 0.25'
 WIDTH_SLIDERTEXT                0.333333333333
-TOLERANCE_SLIDER                '0.2 2 0'
index 5f4bbaad40211135e157b03f89e82e99ef337475..af7d8ce165a92e7d6941a7692393a7ebdca387bb 100644 (file)
@@ -233,4 +233,3 @@ COLOR_SLIDER_F                  '1 1 1'
 COLOR_SLIDER_D                  '1 1 1'
 COLOR_SLIDER_S                  '1 1 1'
 WIDTH_SLIDERTEXT                0.333333333333
-TOLERANCE_SLIDER                '0.2 2 0'
index 328032ff60119c8c7704a4d06b69fa6ae74e2e56..03be75cf7729d3fd20f619553aa25e6c63f15ba1 100644 (file)
@@ -1,21 +1,24 @@
+ko    Korean "한국의" 33%
 ast   Asturian "Asturianu" 73%
-de    German "Deutsch" 99%
-de_CH German "Deutsch (Schweiz)" 99%
+zh_CN "Chinese (China)" "中文" 49%
+de    German "Deutsch"
+de_CH German "Deutsch (Schweiz)"
 en    English "English"
 en_AU English "English (Australia)" 86%
 es    Spanish "Español" 99%
-fr    French "Français" 99%
-it    Italian "Italiano" 99%
+fr    French "Français"
+ga    Irish "Irish" 35%
+it    Italian "Italiano"
 hu    Hungarian "Magyar" 55%
 nl    Dutch "Nederlands" 70%
 pl    Polish "Polski" 81%
-pt    Portuguese "Português" 99%
+pt    Portuguese "Português"
 ro    Romanian "Romana" 83%
 fi    Finnish "Suomi" 33%
 zh_TW "Chinese (Taiwan)" "國語" 68%
 el    Greek "Ελληνική" 33%
 be    Belarusian "Беларуская" 61%
 bg    Bulgarian "Български" 68%
-ru    Russian "Русский" 99%
+ru    Russian "Русский"
 sr    Serbian "Српски" 71%
 uk    Ukrainian "Українська" 57%
index 51ae3f140fae169c02967a4dc5f6a398c6e381ee..ff5cf3223d1050efcb6a8e2b194297b6ae234206 100644 (file)
@@ -307,7 +307,7 @@ set g_buffs_random_location 0 "randomize buff location on start and when reset"
 set g_buffs_random_location_attempts 10 "number of random locations a single buff will attempt to respawn at before giving up"
 set g_buffs_spawn_count 0 "how many buffs to spawn on the map if none exist already"
 set g_buffs_replace_powerups 0 "replace powerups on the map with random buffs"
-set g_buffs_drop 1 "allow dropping buffs"
+set g_buffs_drop 0 "allow dropping buffs"
 set g_buffs_cooldown_activate 5 "cooldown period when buff is first activated"
 set g_buffs_cooldown_respawn 3 "cooldown period when buff is reloading"
 set g_buffs_ammo 1 "ammo buff: infinite ammunition"
index 200f5b2c55b575ab5b22efa18b2f9c0017ba1f93..f914df7dde266da81b331c964f871183c8e9030c 100644 (file)
@@ -309,6 +309,7 @@ void Cmd_Scoreboard_Help()
        LOG_INFO(_("^3ping^7                     Ping time"));
        LOG_INFO(_("^3pl^7                       Packet loss"));
        LOG_INFO(_("^3elo^7                      Player ELO"));
+       LOG_INFO(_("^3fps^7                      Player FPS"));
        LOG_INFO(_("^3kills^7                    Number of kills"));
        LOG_INFO(_("^3deaths^7                   Number of deaths"));
        LOG_INFO(_("^3suicides^7                 Number of suicides"));
@@ -359,7 +360,7 @@ void Cmd_Scoreboard_Help()
 // otherwise the previous exclusive rule warns anyway
 // e.g. -teams,rc,cts,lms/kills ?+rc/kills
 #define SCOREBOARD_DEFAULT_COLUMNS \
-"ping pl name |" \
+"ping pl fps name |" \
 " -teams,rc,cts,inv,lms/kills +ft,tdm/kills ?+rc,inv/kills" \
 " -teams,lms/deaths +ft,tdm/deaths" \
 " +tdm/sum" \
@@ -464,6 +465,7 @@ void Cmd_Scoreboard_SetFields(int argc)
                        case "elo": sbt_field[sbt_num_fields] = SP_ELO; break;
                        case "dmg": case "damage": sbt_field[sbt_num_fields] = SP_DMG; break;
                        case "dmgtaken": case "damagetaken": sbt_field[sbt_num_fields] = SP_DMGTAKEN; break;
+                       case "fps": sbt_field[sbt_num_fields] = SP_FPS; break;
                        default:
                        {
                                FOREACH(Scores, true, {
@@ -679,6 +681,19 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                        }
                }
 
+               case SP_FPS:
+               {
+                       float fps = pl.(scores(SP_FPS));
+                       if(fps == 0)
+                       {
+                               sbt_field_rgb = '1 1 1';
+                               return ((pl.ping == 0) ? _("N/A") : "..."); // if 0 ping, either connecting or bot (either case can't show proper score)
+                       }
+                       //sbt_field_rgb = HUD_Get_Num_Color(fps, 200);
+                       sbt_field_rgb = '1 0 0' + '0 1 1' * (bound(0, fps, 60) / 60);
+                       return ftos(fps);
+               }
+
                case SP_DMG: case SP_DMGTAKEN:
                        return sprintf("%.1f k", pl.(scores(field)) / 1000);
 
index f0b8aac6c9ee3b69d1c4c51abfde9cf98f7c23ca..9c146c09bd9115091c24585fc02c323558b75d19 100644 (file)
@@ -134,6 +134,8 @@ void CSQC_Init()
        registercvar("cl_jumpspeedcap_min", "");
        registercvar("cl_jumpspeedcap_max", "");
 
+       registercvar("cl_shootfromfixedorigin", "");
+
        registercvar("cl_multijump", "1");
 
        registercvar("cl_spawn_near_teammate", "1");
index 7dcbd83d2b3c661db795119e6698424a5f4baa40..dd184bee9bbeb7d8dfcf3f5eb75abf7337d330b5 100644 (file)
@@ -370,6 +370,35 @@ STATIC_INIT(viewmodel) {
        viewmodels[slot] = new(viewmodel);
 }
 
+float showfps_prevfps;
+float showfps_prevfps_time;
+int showfps_framecounter;
+
+void fpscounter_update()
+{
+       if(!STAT(SHOWFPS))
+               return;
+
+       float currentTime = gettime(GETTIME_REALTIME);
+       showfps_framecounter += 1;
+       if(currentTime - showfps_prevfps_time > STAT(SHOWFPS))
+       {
+               showfps_prevfps = showfps_framecounter/(currentTime - showfps_prevfps_time);
+               showfps_framecounter = 0;
+               showfps_prevfps_time = currentTime;
+
+               int channel = MSG_C2S;
+               WriteHeader(channel, fpsreport);
+               WriteShort(channel, bound(0, rint(showfps_prevfps), 65535)); // prevent insane fps values
+       }
+}
+
+STATIC_INIT(fpscounter_init)
+{
+       float currentTime = gettime(GETTIME_REALTIME);
+       showfps_prevfps_time = currentTime; // we must initialize it to avoid an instant low frame sending
+}
+
 void Porto_Draw(entity this);
 STATIC_INIT(Porto)
 {
@@ -1393,8 +1422,8 @@ void SpecialCommand()
                vector slot = specialcommand_slots[j];
                if(slot.y)
                        slot.y += SPECIALCOMMAND_SPEED * frametime;
-               if(slot.z)
-                       slot.z = sin(SPECIALCOMMAND_TURNSPEED * M_PI * time);
+               //if(slot.z)
+                       //slot.z = sin(SPECIALCOMMAND_TURNSPEED * M_PI * time);
                if(slot.y >= vid_conheight)
                        slot = '0 0 0';
 
@@ -1404,7 +1433,7 @@ void SpecialCommand()
                        {
                                slot.x = bound(0, (random() * vid_conwidth + 1), vid_conwidth);
                                slot.y = 1; // start it off 0 so we can use it
-                               slot.z = random();
+                               slot.z = floor(random() * Weapons_MAX);
                                sc_spawntime = time + bound(0.4, random(), 0.75); // prevent spawning another one for this amount of time!
                                vector newcolor = randomvec() * 2;
                                newcolor.x = bound(0.4, newcolor.x, 1);
@@ -1418,7 +1447,11 @@ void SpecialCommand()
                        vector splash_size = '0 0 0';
                        splash_size.x = max(vid_conwidth, vid_conheight) * SPECIALCOMMAND_SIZE;
                        splash_size.y = max(vid_conwidth, vid_conheight) * SPECIALCOMMAND_SIZE;
-                       drawpic(vec2(slot), "gfx/smile", vec2(splash_size), specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL);
+                       entity wep = Weapons_from(slot.z);
+                       if(wep == WEP_Null)
+                               drawpic(vec2(slot), "gfx/smile", vec2(splash_size), specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL);
+                       else
+                               drawpic_skin(vec2(slot), wep.model2, vec2(splash_size), specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL);
                        //drawrotpic(vec2(slot), slot.z, "gfx/smile", vec2(splash_size), vec2(splash_size) / 2, specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL);
                }
 
@@ -1862,6 +1895,7 @@ void CSQC_UpdateView(entity this, float w, float h)
 
        TargetMusic_Advance();
        Fog_Force();
+       fpscounter_update();
 
        if(drawtime == 0)
                drawframetime = 0.01666667; // when we don't know fps yet, we assume 60fps
index 2d0c4e9110d7e5f22f885156721b8150febb3650..7144bf3da5ed6bb4166c3cc5b3f8f4895d416a7f 100644 (file)
@@ -1,9 +1,16 @@
 #pragma once
 
+
+// This includes some functions useful for debugging.
+// Some more bot-specific ones are in server/pathlib/debug.qc.
+// Look for other useful commands under prvm_* in console (apropos / search).
+
+
 #ifdef CSQC
 .entity tag_entity;
 #endif
 
+
 #ifdef GAMEQC
 .bool debug;
 .int sv_entnum;
@@ -45,6 +52,7 @@ REGISTER_NET_TEMP(net_debug)
        }
 #endif
 
+
 #if ENABLE_DEBUGDRAW
 #ifdef GAMEQC
 /**
@@ -151,6 +159,7 @@ bool autocvar_debugdraw;
        }
 #endif
 
+
 #ifdef SVQC
        COMMON_COMMAND(debugdraw_sv, "Dump all server entities")
        {
@@ -183,6 +192,7 @@ bool autocvar_debugdraw;
 #endif
 #endif
 
+
 GENERIC_COMMAND(bufstr_get, "Examine a string buffer object")
 {
        switch (request)
@@ -205,6 +215,7 @@ GENERIC_COMMAND(bufstr_get, "Examine a string buffer object")
        }
 }
 
+
 GENERIC_COMMAND(version, "Print the current version")
 {
        switch (request)
@@ -223,6 +234,7 @@ GENERIC_COMMAND(version, "Print the current version")
        }
 }
 
+
 #ifdef CSQC
 void(float bufhandle, string pattern, string antipattern) buf_cvarlist = #517;
 #endif
@@ -257,6 +269,7 @@ GENERIC_COMMAND(cvar_localchanges, "Print locally changed cvars")
        }
 }
 
+
 #if ENABLE_DEBUGTRACE
 REGISTER_STAT(TRACE_ENT, int)
 #ifdef SVQC
@@ -315,6 +328,7 @@ STATIC_INIT(TRACE_ENT)
 #endif
 #endif
 
+
 GENERIC_COMMAND(find, "Search through entities for matching classname")
 {
        switch (request)
@@ -345,6 +359,7 @@ GENERIC_COMMAND(find, "Search through entities for matching classname")
        }
 }
 
+
 GENERIC_COMMAND(findat, "Search through entities for matching origin")
 {
        switch (request)
@@ -365,3 +380,92 @@ GENERIC_COMMAND(findat, "Search through entities for matching origin")
                }
        }
 }
+
+
+// debug_test() allows drawing text from server on the client anywhere in world coordinates.
+
+#ifdef GAMEQC
+REGISTER_NET_TEMP(debug_text_3d);
+#endif
+
+#ifdef CSQC
+
+CLASS(DebugText3d, Object)
+       // reusing existing fields
+       ATTRIB(DebugText3d, origin, vector);
+       ATTRIB(DebugText3d, message, string); // the text (i wanted to use the .text field but then this whole macro-based-inheritance thing shat itself)
+       ATTRIB(DebugText3d, health, float); // text alignment (recycled field)
+       ATTRIB(DebugText3d, hit_time, float); // when it was created
+       ATTRIB(DebugText3d, fade_rate, float); // how fast is should disappear
+       ATTRIB(DebugText3d, velocity, vector);
+
+       CONSTRUCTOR(DebugText3d, vector pos, string msg, float align, float fade_rate_, vector vel) {
+               CONSTRUCT(DebugText3d);
+               this.origin = pos;
+               this.message = strzone(msg);
+               this.health = align;
+               this.hit_time = time;
+               this.fade_rate = fade_rate_;
+               this.velocity = vel;
+               IL_PUSH(g_drawables_2d, this);
+       }
+
+       DESTRUCTOR(DebugText3d) {
+               strunzone(this.message);
+       }
+
+       void DebugText3d_draw2d(DebugText3d this) {
+               float since_created = time - this.hit_time;
+               float alpha_ = 1 - since_created * this.fade_rate;
+
+               if (alpha_ < 0) {
+                       delete(this);
+                       return;
+               }
+
+               int size = 8;
+               vector screen_pos = project_3d_to_2d(this.origin) + since_created * this.velocity;
+               float align = this.health;
+               if (align > 0)
+                       screen_pos.x -= stringwidth(this.message, true, size * '1 1 0') * min(1, align);
+               if (screen_pos.z < 0) return; // behind camera
+               screen_pos.z = 0;
+
+               vector rgb = '1 1 0';
+               drawcolorcodedstring2_builtin(screen_pos, this.message, size * '1 1 0', rgb, alpha_, DRAWFLAG_NORMAL);
+       }
+       ATTRIB(DebugText3d, draw2d, void(DebugText3d), DebugText3d_draw2d);
+ENDCLASS(DebugText3d)
+
+NET_HANDLE(debug_text_3d, bool is_new) {
+       vector pos = ReadVector();
+       string msg = ReadString();
+       float align = ReadFloat();
+       float duration = ReadFloat();
+       vector vel = ReadVector();
+       make_impure(NEW(DebugText3d, pos, msg, align, 1 / duration, vel));
+       return true;
+}
+
+#endif // CSQC
+
+#ifdef SVQC
+
+// can't use autocvars because they give unused warning unless the macros are expanded
+#define debug_text_3d(...) EVAL(OVERLOAD(debug_text_3d, __VA_ARGS__))
+#define debug_text_3d_2(pos, msg) debug_text_3d_3(pos, msg, cvar("debug_text_3d_default_align"))
+#define debug_text_3d_3(pos, msg, align) debug_text_3d_4(pos, msg, align, cvar("debug_text_3d_default_duration"))
+#define debug_text_3d_4(pos, msg, align, dur) debug_text_3d_5(pos, msg, align, dur, stov(cvar_string("debug_text_3d_default_velocity")))
+#define debug_text_3d_5(pos, msg, align, dur, vel) debug_text_3d_fn(pos, msg, align, dur, vel)
+
+ERASEABLE
+void debug_text_3d_fn(vector pos, string msg, float align, float duration, vector velocity) {
+       WriteHeader(MSG_BROADCAST, debug_text_3d);
+       WriteVector(MSG_BROADCAST, pos);
+       WriteString(MSG_BROADCAST, msg);
+       WriteFloat(MSG_BROADCAST, align);
+       WriteFloat(MSG_BROADCAST, duration);
+       WriteVector(MSG_BROADCAST, velocity);
+}
+
+#endif // SVQC
index 56303a44ffa93f36443bf4a3131baa015f361e82..b659e8a8517a83755718d93ea06c03c9a9989db8 100644 (file)
@@ -8529,6 +8529,22 @@ SUB(arc_lightning) {
        MY(velocityjitter) = '250.0 250.0 250.0';
        MY(velocitymultiplier) = 20;
 }
+// impact smoke
+SUB(arc_lightning) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 400;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 100;
+}
 
 DEF(arc_beam);
 // sparks on beam
index ca58d9f0901c8c4484c824e5dc09adf4206f9b71..0884bc8d79054c29d6d88bacb75ad88de011e09b 100644 (file)
@@ -940,7 +940,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        if(f)
                                _MapInfo_Map_ApplyGametype (s, pGametypeToSet, f, true);
                        else if(!autocvar_g_mapinfo_ignore_warnings)
-                               LOG_WARN("Map ", pFilename, " supports unknown game type ", t, ", ignored");
+                               LOG_DEBUG("Map ", pFilename, " supports unknown game type ", t, ", ignored");
                }
                else if(t == "gametype")
                {
@@ -949,7 +949,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        if(f)
                                _MapInfo_Map_ApplyGametypeEx (s, pGametypeToSet, f);
                        else if(!autocvar_g_mapinfo_ignore_warnings)
-                               LOG_WARN("Map ", pFilename, " supports unknown game type ", t, ", ignored");
+                               LOG_DEBUG("Map ", pFilename, " supports unknown game type ", t, ", ignored");
                }
                else if(t == "size")
                {
@@ -996,7 +996,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        }
                        else
                        {
-                               LOG_WARN("Map ", pFilename, " has a setting for unknown game type ", t, ", ignored");
+                               LOG_DEBUG("Map ", pFilename, " has a setting for unknown game type ", t, ", ignored");
                        }
                }
                else if(t == "clientsettemp_for_type")
@@ -1013,7 +1013,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        }
                        else
                        {
-                               LOG_WARN("Map ", pFilename, " has a client setting for unknown game type ", t, ", ignored");
+                               LOG_DEBUG("Map ", pFilename, " has a client setting for unknown game type ", t, ", ignored");
                        }
                }
                else if(t == "fog")
index 4d9f107af794270f54a2beddddf23b26740a4d09..671a524f9eea2132f773c333c35b06ee3d02431d 100644 (file)
@@ -14,7 +14,7 @@ bool autocvar_g_buffs_random_location;
 int autocvar_g_buffs_random_location_attempts;
 int autocvar_g_buffs_spawn_count;
 bool autocvar_g_buffs_replace_powerups;
-bool autocvar_g_buffs_drop = true;
+bool autocvar_g_buffs_drop = false;
 float autocvar_g_buffs_cooldown_activate;
 float autocvar_g_buffs_cooldown_respawn;
 float autocvar_g_buffs_resistance_blockpercent;
index e183c3339b14711dd3225669be3f788da743f334..24149ad7fce9430ca89000e777d20a3939f25fe6 100644 (file)
@@ -370,11 +370,11 @@ void nade_napalm_boom(entity this)
        CSQCProjectile(fountain, true, PROJECTILE_NAPALM_FOUNTAIN, true);
 }
 
-void nade_ice_freeze(entity freezefield, entity frost_target, float freeze_time)
+void nade_ice_freeze(entity freezefield, entity frost_target, float freezetime)
 {
        frost_target.frozen_by = freezefield.realowner;
        Send_Effect(EFFECT_ELECTRO_IMPACT, frost_target.origin, '0 0 0', 1);
-       Freeze(frost_target, 1/freeze_time, 3, false);
+       Freeze(frost_target, 1 / freezetime, 3, false);
 
        Drop_Special_Items(frost_target);
 }
index 7b69ad5030c9fb9d6ec510612001f2551f37e255..657e761712250cc7aed93ec4f3d93747979588f6 100644 (file)
@@ -55,3 +55,5 @@ REGISTER_NET_LINKED(ENT_CLIENT_SPAWNEVENT)
 REGISTER_NET_LINKED(ENT_CLIENT_WALL)
 
 #include <lib/csqcmodel/net.qh>
+
+REGISTER_NET_C2S(fpsreport)
index 7d3cab007b508fa6dafceb84a14585d0fd68f327..351725bc14698fe92da40c5aa533947e5a7e0381 100644 (file)
@@ -113,8 +113,8 @@ void PM_ClientMovement_UpdateStatus(entity this)
                        break; // don't bother checking the others
                }
        }
-       if(this.waterlevel >= WATERLEVEL_SWIMMING)
-               do_crouch = false;
+       //if(this.waterlevel >= WATERLEVEL_SWIMMING)
+               //do_crouch = false;
        if(hud != HUD_NORMAL)
                do_crouch = false;
        if(STAT(FROZEN, this))
index 476d0dbbaa612445241bd1450c48642a7f78f347..377a780770300554275d3685e3e6d53e90122bb8 100644 (file)
@@ -39,6 +39,8 @@ REGISTER_SP(FRAGS);
 
 REGISTER_SP(ELO);
 
+REGISTER_SP(FPS);
+
 // TODO: move to common mutators
 
 REGISTER_SP(RACE_TIME);
index 69d3a4f583326714cc89f44f23fe2d097f3a993d..648ef60e844b8f316662ea633e5c6ac3ca2a12dc 100644 (file)
@@ -121,6 +121,11 @@ REGISTER_STAT(ENTRAP_ORB_ALPHA, float)
 REGISTER_STAT(ITEMSTIME, int, autocvar_sv_itemstime)
 REGISTER_STAT(KILL_TIME, float)
 
+#ifdef SVQC
+float autocvar_sv_showfps = 5;
+#endif
+REGISTER_STAT(SHOWFPS, float, autocvar_sv_showfps)
+
 #ifdef SVQC
 bool autocvar_g_ctf_leaderboard;
 #endif
@@ -299,6 +304,13 @@ REGISTER_STAT(SLICK_APPLYGRAVITY, bool, autocvar_sv_slick_applygravity)
 float warmup_limit;
 #endif
 
+#ifdef SVQC
+bool autocvar_g_shootfromcenter;
+bool autocvar_g_shootfromeye;
+#endif
+REGISTER_STAT(SHOOTFROMEYE, bool, autocvar_g_shootfromeye)
+REGISTER_STAT(SHOOTFROMCENTER, bool, autocvar_g_shootfromcenter)
+
 REGISTER_STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, float)
 REGISTER_STAT(MOVEVARS_AIRCONTROL_PENALTY, float)
 REGISTER_STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, float)
index f2345e8f59397aba32c0802dd24e6b218a3c255a..0f5c69c777f65c0540a41de281622f4af56feb08 100644 (file)
@@ -13,7 +13,7 @@ void trigger_heal_touch(entity this, entity toucher)
                if (!IS_DEAD(toucher))
                if (toucher.triggerhealtime < time)
                {
-                       bool is_trigger = !boolean(!this.nottargeted && this.targetname != "");
+                       bool is_trigger = this.targetname == "";
                        if(is_trigger)
                                EXACTTRIGGER_TOUCH(this, toucher);
                        if(this.delay > 0)
index fbd20c84011596a6bd110e9f96e51f270413e4b8..f7287212ade9ca721895d3357b2df4942c405c4e 100644 (file)
@@ -125,20 +125,12 @@ void trigger_common_read(entity this, bool withtarget)
 
                int targbits = ReadByte();
 
-               #define X(xs,b) MACRO_BEGIN { \
-                       if(targbits & BIT(b)) \
-                               xs = strzone(ReadString()); \
-                       else \
-                               xs = string_null; \
-               } MACRO_END
-
-               X(this.target, 0);
-               X(this.target2, 1);
-               X(this.target3, 2);
-               X(this.target4, 3);
-               X(this.targetname, 4);
-               X(this.killtarget, 5);
-               #undef X
+               this.target = ((targbits & BIT(0)) ? strzone(ReadString()) : string_null);
+               this.target2 = ((targbits & BIT(1)) ? strzone(ReadString()) : string_null);
+               this.target3 = ((targbits & BIT(2)) ? strzone(ReadString()) : string_null);
+               this.target4 = ((targbits & BIT(3)) ? strzone(ReadString()) : string_null);
+               this.targetname = ((targbits & BIT(4)) ? strzone(ReadString()) : string_null);
+               this.killtarget = ((targbits & BIT(5)) ? strzone(ReadString()) : string_null);
        }
 
        if(f & 4)
index 2b8274f4b890aa473b5432de2415bb1719e925a1..49cd7be7c252bc74cc106a436c71034bc5dd8843 100644 (file)
@@ -14,8 +14,7 @@ const float   SPAWNFLAG_NOTOUCH = 1;
 
 .float height;
 
-.float nottargeted;
-#define IFTARGETED if(!this.nottargeted && this.targetname != "")
+#define IFTARGETED if(this.targetname && this.targetname != "")
 
 .float lip;
 
index 5c51c2d87b4da7071b8dcde95671038f3618e630..dca20d0cdbf1b627bf920ddee47aeb93c60ce58d 100644 (file)
@@ -293,24 +293,21 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float algn)
 
 vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn)
 {
-#ifdef SVQC
        string s;
-#endif
        if (visual)
        {
                vecs = shotorg_adjustfromclient(vecs, y_is_right, algn);
        }
-#ifdef SVQC
-       else if (autocvar_g_shootfromeye)
+       else if (STAT(SHOOTFROMEYE))
        {
                vecs.y = vecs.z = 0;
        }
-       else if (autocvar_g_shootfromcenter)
+       else if (STAT(SHOOTFROMCENTER))
        {
                vecs.y = 0;
                vecs.z -= 2;
        }
-       else if ((s = autocvar_g_shootfromfixedorigin) != "")
+       else if ((s = G_SHOOTFROMFIXEDORIGIN) != "")
        {
                vector v = stov(s);
                if (y_is_right) v.y = -v.y;
@@ -318,7 +315,6 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn
                vecs.y = v.y;
                vecs.z = v.z;
        }
-#endif
        else  // just do the same as top
        {
                vecs = shotorg_adjustfromclient(vecs, y_is_right, algn);
index beaa6cb48a3773e2555b4817177696242b7b7e43..0af47590078a8dde4c44257de429ff240e0dd19e 100644 (file)
@@ -359,6 +359,13 @@ ENUMCLASS_END(WFRAME)
 
 .WFRAME wframe;
 
+#ifdef SVQC
+    #define G_SHOOTFROMFIXEDORIGIN autocvar_g_shootfromfixedorigin
+#elif defined(CSQC)
+    string autocvar_cl_shootfromfixedorigin;
+    #define G_SHOOTFROMFIXEDORIGIN autocvar_cl_shootfromfixedorigin
+#endif
+
 vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn);
 void CL_WeaponEntity_SetModel(entity this, string name, bool _anim);
 #endif
index 21ca117f4c4ec89980bbb60f9e34e3c4b88a549c..e5d4f2eb23253dccbe414e522d0bc5ec84e8c1f0 100644 (file)
@@ -752,6 +752,9 @@ METHOD(Arc, wr_playerdeath, void(entity thiswep, entity actor, .entity weaponent
 #endif
 #ifdef CSQC
 bool autocvar_cl_arcbeam_teamcolor = true;
+bool autocvar_cl_arcbeam_simple = true;
+
+.int beam_slot;
 
 METHOD(Arc, wr_impacteffect, void(entity thiswep, entity actor))
 {
@@ -802,32 +805,37 @@ void Draw_ArcBeam_callback(vector start, vector hit, vector end)
        vector last_top = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_top);
        vector last_bottom = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_bottom);
 
-       R_BeginPolygon(beam.beam_image, DRAWFLAG_NORMAL); // DRAWFLAG_ADDITIVE
-       R_PolygonVertex(
-               top,
-               '0 0.5 0' + ('0 0.5 0' * (thickness / beam.beam_thickness)),
-               beam.beam_color,
-               beam.beam_alpha
-       );
-       R_PolygonVertex(
-               last_top,
-               '0 0.5 0' + ('0 0.5 0' * (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
-               beam.beam_color,
-               beam.beam_alpha
-       );
-       R_PolygonVertex(
-               last_bottom,
-               '0 0.5 0' * (1 - (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
-               beam.beam_color,
-               beam.beam_alpha
-       );
-       R_PolygonVertex(
-               bottom,
-               '0 0.5 0' * (1 - (thickness / beam.beam_thickness)),
-               beam.beam_color,
-               beam.beam_alpha
-       );
-       R_EndPolygon();
+       if(autocvar_cl_arcbeam_simple)
+               Draw_CylindricLine(start, end, thickness, beam.beam_image, 0.25, -time * 3, beam.beam_color, beam.beam_alpha, DRAWFLAG_NORMAL, transformed_view_org);
+       else
+       {
+               R_BeginPolygon(beam.beam_image, DRAWFLAG_NORMAL); // DRAWFLAG_ADDITIVE
+               R_PolygonVertex(
+                       top,
+                       '0 0.5 0' + ('0 0.5 0' * (thickness / beam.beam_thickness)),
+                       beam.beam_color,
+                       beam.beam_alpha
+               );
+               R_PolygonVertex(
+                       last_top,
+                       '0 0.5 0' + ('0 0.5 0' * (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
+                       beam.beam_color,
+                       beam.beam_alpha
+               );
+               R_PolygonVertex(
+                       last_bottom,
+                       '0 0.5 0' * (1 - (Draw_ArcBeam_callback_last_thickness / beam.beam_thickness)),
+                       beam.beam_color,
+                       beam.beam_alpha
+               );
+               R_PolygonVertex(
+                       bottom,
+                       '0 0.5 0' * (1 - (thickness / beam.beam_thickness)),
+                       beam.beam_color,
+                       beam.beam_alpha
+               );
+               R_EndPolygon();
+       }
 
        // draw trailing particles
        // NOTES:
@@ -884,17 +892,30 @@ void Draw_ArcBeam(entity this)
                // into a weapon system for client code.
 
                // find where we are aiming
-               makevectors(warpzone_save_view_angles);
+               makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
                vector forward = v_forward;
                vector right = v_right;
                vector up = v_up;
+               entity wepent = viewmodels[this.beam_slot];
+
+               if(autocvar_chase_active)
+                       this.beam_usevieworigin = 1;
+               else
+                       this.beam_usevieworigin = 2;
 
                // decide upon start position
                if(this.beam_usevieworigin == 2)
                        { start_pos = warpzone_save_view_origin; }
+               else if(csqcplayer)
+                       { start_pos = csqcplayer.origin + csqcplayer.view_ofs; }
                else
                        { start_pos = this.origin; }
 
+               int v_shot_idx;  // used later
+               (v_shot_idx = gettagindex(wepent, "shot")) || (v_shot_idx = gettagindex(wepent, "tag_shot"));
+               if(v_shot_idx && this.beam_usevieworigin == 2)
+                       start_pos = gettaginfo(wepent, v_shot_idx) - '0 0 2';
+
                // trace forward with an estimation
                WarpZone_TraceLine(
                        start_pos,
@@ -911,9 +932,16 @@ void Draw_ArcBeam(entity this)
                        end_pos = start_pos + (forward * g_trueaim_minrange);
 
                // move shot origin to the actual gun muzzle origin
-               vector origin_offset =
-                         right * -this.beam_shotorigin.y
-                       + up * this.beam_shotorigin.z;
+               vector origin_offset = '0 0 0';
+               if(!v_shot_idx || this.beam_usevieworigin != 2)
+               {
+                       this.beam_shotorigin = wepent.movedir;
+                       origin_offset =
+                                right * -this.beam_shotorigin.y
+                               + up * this.beam_shotorigin.z;
+               }
+               else
+                       this.beam_shotorigin = '0 0 0';
 
                start_pos = start_pos + origin_offset;
 
@@ -1119,7 +1147,7 @@ void Draw_ArcBeam(entity this)
                        )
                );
        }
-       if(this.beam_muzzleeffect)
+       if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
        {
                pointparticles(
                        this.beam_muzzleeffect,
@@ -1160,11 +1188,13 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
        int slot = ReadByte();
        entity flash;
 
+       this.beam_slot = slot;
+
        if(isnew)
        {
                int gunalign = W_GunAlign(viewmodels[slot], STAT(GUNALIGN)) - 1;
 
-               this.beam_shotorigin = arc_shotorigin[gunalign];
+               this.beam_shotorigin = arc_shotorigin[gunalign]; // get a starting point
 
                // set other main attributes of the beam
                this.draw = Draw_ArcBeam;
@@ -1271,18 +1301,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1297,18 +1327,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; // (EFFECT_GRENADE_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null; // (EFFECT_GRENADE_MUZZLEFLASH);
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1323,18 +1353,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1349,18 +1379,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 0;
                                this.beam_hitlight[3] = 0;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 50;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 0;
                                this.beam_muzzlelight[3] = 0;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1375,18 +1405,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1401,18 +1431,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1427,18 +1457,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1453,18 +1483,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
@@ -1481,18 +1511,18 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_hitlight[1] = 1;
                                this.beam_hitlight[2] = 1;
                                this.beam_hitlight[3] = 1;
-                               this.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH);
+                               this.beam_muzzleeffect = EFFECT_Null;
                                this.beam_muzzlelight[0] = 0;
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
                                this.beam_image = "particles/lgbeam";
-                               if(this.beam_muzzleeffect)
+                               if(this.beam_muzzleeffect && autocvar_r_drawviewmodel)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
                                        flash.alpha = this.beam_alpha;
                                        flash.colormod = this.beam_color;
-                                       flash.scale = 0.5;
+                                       flash.scale = 0.35;
                                }
                                break;
                        }
index bbd3ddb4efbd2efd081a257bf43ea6ff19566e3b..d9164dc19ab6c999534cf72f868801f2750b466a 100644 (file)
@@ -183,14 +183,14 @@ void W_Hagar_Attack2_Load_Release(entity actor, .entity weaponentity)
 
        weapon_prepareattack_do(actor, weaponentity, true, WEP_CVAR_SEC(hagar, refire));
 
-       W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage), WEP_HAGAR.m_id | HITTYPE_SECONDARY);
+       shots = actor.(weaponentity).hagar_load;
+       W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage) * shots, WEP_HAGAR.m_id | HITTYPE_SECONDARY);
        Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        forward = v_forward;
        right = v_right;
        up = v_up;
 
-       shots = actor.(weaponentity).hagar_load;
        missile = NULL;
        for(counter = 0; counter < shots; ++counter)
        {
index 3da8b8939a48ca1e649e611f5e8d036939c4104c..1b9abdbf0ecb4f1ae694cff46164dc417a5df38d 100644 (file)
@@ -51,8 +51,8 @@ MACRO_END
        { (viewmodels[this.m_wepent_slot]).minelayer_mines = ReadByte(); }) \
     \
     PROP(false, arc_heat_percent, WEPENT_SET_NORMAL, \
-       { WriteByte(chan, this.arc_heat_percent * 16); }, \
-       { (viewmodels[this.m_wepent_slot]).arc_heat_percent = ReadByte() / 16; }) \
+       { WriteByte(chan, this.arc_heat_percent * 255); }, \
+       { (viewmodels[this.m_wepent_slot]).arc_heat_percent = ReadByte() / 255; }) \
     \
     PROP(false, vortex_chargepool_ammo, WEPENT_SET_NORMAL, \
        { WriteByte(chan, this.vortex_chargepool_ammo * 16); }, \
index b1f5326a9bb5a441b5094de347cfe973086d5bd6..fe2952e2c4025c3d5f84854627824cc3f4ab3d6f 100644 (file)
@@ -304,6 +304,11 @@ MACRO_END
                if (g_buf) strunzone(g_buf);
                g_buf = strzone(tmp);
        }
+       void WriteShort(int to, int b)
+       {
+               WriteByte(to, (b >> 8) & 0xFF);
+               WriteByte(to, b & 0xFF);
+       }
 #elif defined(SVQC)
        int ReadByte()
        {
@@ -311,6 +316,10 @@ MACRO_END
                ydec_single(g_buf, ret);
                return ret;
        }
+       int ReadShort()
+       {
+               return (ReadByte() << 8) | (ReadByte());
+       }
        void WriteByte(int to, int b);
 #endif
 
index 0a3fb085c1d5fb988298073071745b829578cb3d..812eb72c8424bf2ab19f3d04fc30bf01522f3213 100644 (file)
@@ -161,6 +161,14 @@ string cons(string a, string b)
        return strcat(a, " ", b);
 }
 
+ERASEABLE
+string cons_mid(string a, string mid, string b)
+{
+       if (a == "") return b;
+       if (b == "") return a;
+       return strcat(a, mid, b);
+}
+
 ERASEABLE
 string substring_range(string s, float b, float e)
 {
index 8246e106de54165f014b548b50adb247009a7a91..ce4535452da5405d3b57495462ac51d27c9dd1ce 100644 (file)
@@ -177,11 +177,7 @@ void WarpZone_Touch(entity this, entity toucher)
                return;
 
        // FIXME needs a better check to know what is safe to teleport and what not
-       if((toucher.move_movetype == MOVETYPE_NONE && toucher.move_movetype == MOVETYPE_NONE) || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity
-#ifdef CSQC
-       || tag_networkentity
-#endif
-       )
+       if(toucher.move_movetype == MOVETYPE_NONE || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity)
                return;
 
        if(WarpZoneLib_ExactTrigger_Touch(this, toucher))
index 72bcc5e94ec44a294f1b9eaa86b5cad566b0a22d..c651a4ffc4fcfd277b208b46e457d675e43ba30d 100644 (file)
                this.delta = e - s;
        }
 
-       METHOD(Animation, setValueStartDelta, void(entity this, float s, float d))
-       {
-               this.startValue = s;
-               this.delta = d;
-       }
-
        METHOD(Animation, setObjectSetter, void(entity this, entity o, void(entity, float) s))
        {
                this.object = o;
index 009feb577c00fbaa1454ed373845f7cd6998fedb..1fdea3dd6fbfdd4fae41cce56ffd80b179910b39 100644 (file)
@@ -6,7 +6,6 @@ CLASS(Animation, Object)
        METHOD(Animation, setTimeStartEnd, void(Animation this, float, float));
        METHOD(Animation, setTimeStartDuration, void(Animation this, float, float));
        METHOD(Animation, setValueStartEnd, void(Animation this, float, float));
-       METHOD(Animation, setValueStartDelta, void(Animation this, float, float));
        METHOD(Animation, setObjectSetter, void(Animation this, entity, void(entity, float)));
        METHOD(Animation, tick, void(Animation this, float));
        METHOD(Animation, calcValue, float(Animation this, float, float, float, float));
index 07385e91e68ac0dde198ac54ce2377ecbadaf6b6..97f08c98113e520e6d55457356befca52319f28b 100644 (file)
                if (me.pressed == 1)
                {
                        hit = 1;
-                       if (pos.x < 1 - me.controlWidth - me.tolerance.y * me.controlWidth) hit = 0;
-                       if (pos.y < 0 - me.tolerance.x) hit = 0;
-                       if (pos.x >= 1 + me.tolerance.y * me.controlWidth) hit = 0;
-                       if (pos.y >= 1 + me.tolerance.x) hit = 0;
+                       if (pos.x < 1 - me.controlWidth - me.tolerance.x * me.controlWidth) hit = 0;
+                       if (pos.y < 0 - me.tolerance.y) hit = 0;
+                       if (pos.x >= 1 + me.tolerance.x * me.controlWidth) hit = 0;
+                       if (pos.y >= 1 + me.tolerance.y) hit = 0;
                        if (hit)
                        {
                                // calculate new pos to v
index c798aae338dcc5771ca8edcc51cfa9401e66522b..b70d3880bae819100350f8aba68ff240e8367158 100644 (file)
@@ -39,7 +39,7 @@ CLASS(Slider, Label)
        ATTRIB(Slider, pressed, float, 0);
        ATTRIB(Slider, pressOffset, float, 0);
        ATTRIB(Slider, previousValue, float, 0);
-       ATTRIB(Slider, tolerance, vector, '0 0 0');
+       ATTRIB(Slider, tolerance, vector, '0 0 0'); // drag tolerance
        ATTRIB(Slider, disabled, float, 0);
        ATTRIB(Slider, color, vector, '1 1 1');
        ATTRIB(Slider, color2, vector, '1 1 1');
index d5e1f82eba4ab0ece3d7fb7995ec4b7838c455a3..3889b341b795c1893c81afb2b43c15136c1053db 100644 (file)
@@ -274,5 +274,4 @@ SKINBEGIN
        SKINVECTOR(COLOR_SLIDER_D, '1 1 1');
        SKINVECTOR(COLOR_SLIDER_S, '1 1 1');
        SKINFLOAT(WIDTH_SLIDERTEXT, 0.333333333333);
-       SKINVECTOR(TOLERANCE_SLIDER, '0.2 2 0');
 SKINEND
index 2e67e7acf861294bb39a6d97bf2a5155e008eaac..611ef4a45e714de1b8292f68904659f3891e9b98 100644 (file)
@@ -10,7 +10,9 @@ void XonoticHUDAmmoDialog_fill(entity me)
        entity e;
        string panelname = "ammo";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Ammunition display:")));
index 9113a02794b1b08f810b009dd491c06fd8be7ab6..3af373e4388d30ee7b9c5623c623625f2b789e60 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDAmmoDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDAmmoDialog, title, string, _("Ammo Panel"));
        ATTRIB(XonoticHUDAmmoDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDAmmoDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDAmmoDialog, rows, float, 15);
+       ATTRIB(XonoticHUDAmmoDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDAmmoDialog, columns, float, 4);
        ATTRIB(XonoticHUDAmmoDialog, name, string, "HUDammo");
        ATTRIB(XonoticHUDAmmoDialog, requiresConnection, float, true);
index 332f6753f76d62273411801ab6cd584f46077a9a..938f69a8c57be823a7d95857e70101d37569c2c2 100644 (file)
@@ -10,7 +10,9 @@ void XonoticHUDCenterprintDialog_fill(entity me)
        entity e;
        string panelname = "centerprint";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TDempty(me, 0.2);
index 9fc6846eb9a0d5d044a27ed4c99937190ab3137c..2b952580ecb6e055ae51a1b6bd219d091f73d5de 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDCenterprintDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDCenterprintDialog, title, string, _("Centerprint Panel"));
        ATTRIB(XonoticHUDCenterprintDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDCenterprintDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDCenterprintDialog, rows, float, 15);
+       ATTRIB(XonoticHUDCenterprintDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDCenterprintDialog, columns, float, 4);
        ATTRIB(XonoticHUDCenterprintDialog, name, string, "HUDcenterprint");
        ATTRIB(XonoticHUDCenterprintDialog, requiresConnection, float, true);
index 1ffa41f68c802d9c1cdb96995f2aa50619db762e..d1612412e66c8d419f0887b002534c070c091c88 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDChatDialog_fill(entity me)
        entity e;
        string panelname = "chat";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Chat entries:")));
index 570c2d616cde334e7402acc4d061ccad7c299d5d..da2f329bbaa57503569d16c8d1ed5630a2d59052 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDChatDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDChatDialog, title, string, _("Chat Panel"));
        ATTRIB(XonoticHUDChatDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDChatDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDChatDialog, rows, float, 15);
+       ATTRIB(XonoticHUDChatDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDChatDialog, columns, float, 4);
        ATTRIB(XonoticHUDChatDialog, name, string, "HUDchat");
        ATTRIB(XonoticHUDChatDialog, requiresConnection, float, true);
index b46d3aa02eff1fbd791331d3ac731c394506f426..ef63756870dd8d587901593ab2511efd65b99395 100644 (file)
@@ -8,7 +8,9 @@ void XonoticHUDEngineInfoDialog_fill(entity me)
        entity e;
        string panelname = "engineinfo";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Engine info:")));
index b741465024d78a9917639aedabd61c209ae026ca..706767146c776c621c6304fe618be4f2164eabf0 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDEngineInfoDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDEngineInfoDialog, title, string, _("Engine Info Panel"));
        ATTRIB(XonoticHUDEngineInfoDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDEngineInfoDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDEngineInfoDialog, rows, float, 15);
+       ATTRIB(XonoticHUDEngineInfoDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDEngineInfoDialog, columns, float, 4);
        ATTRIB(XonoticHUDEngineInfoDialog, name, string, "HUDengineinfo");
        ATTRIB(XonoticHUDEngineInfoDialog, requiresConnection, float, true);
index ac305b83258638cd4352305a7071d338a5d85b3d..e67f63ffcda27281ceb077c18c979baa3f097700 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDHealthArmorDialog_fill(entity me)
        entity e;
        string panelname = "healtharmor";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_combined", _("Combine health and armor")));
index b37f41b76ef5f1ecf91a8d2056d2fe8cab68a98e..9342e293306137427ea3d339b34dcf49b749cc85 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDHealthArmorDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDHealthArmorDialog, title, string, _("Health/Armor Panel"));
        ATTRIB(XonoticHUDHealthArmorDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDHealthArmorDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDHealthArmorDialog, rows, float, 16);
+       ATTRIB(XonoticHUDHealthArmorDialog, rows, float, 16.5);
        ATTRIB(XonoticHUDHealthArmorDialog, columns, float, 4);
        ATTRIB(XonoticHUDHealthArmorDialog, name, string, "HUDhealtharmor");
        ATTRIB(XonoticHUDHealthArmorDialog, requiresConnection, float, true);
index d758ad206643dcdba154fbfe48be74eca5726b58..6b11a691513c236689e8395df6f798968abd85ff 100644 (file)
@@ -8,7 +8,9 @@ void XonoticHUDInfoMessagesDialog_fill(entity me)
        entity e;
        string panelname = "infomessages";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Info messages:")));
index 5d9032ffb0fdf3e307190fd5a77353b425b5a099..a6370d33e30e88d9566d3508d8ad49d0f3cabf22 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDInfoMessagesDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDInfoMessagesDialog, title, string, _("Info Messages Panel"));
        ATTRIB(XonoticHUDInfoMessagesDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDInfoMessagesDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDInfoMessagesDialog, rows, float, 15);
+       ATTRIB(XonoticHUDInfoMessagesDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDInfoMessagesDialog, columns, float, 4);
        ATTRIB(XonoticHUDInfoMessagesDialog, name, string, "HUDinfomessages");
        ATTRIB(XonoticHUDInfoMessagesDialog, requiresConnection, float, true);
index aeb8c8c774d639fa11a2073135e343e9d8c78f33..32264c5bcd32789aa21add5f6644a67e8a3d95ff 100644 (file)
@@ -13,12 +13,12 @@ void XonoticHUDItemsTimeDialog_fill(entity me)
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_itemstime"));
-                       e.addValue(e, ZCTX(_("PNL^Disabled")), "0");
-                       e.addValue(e, ZCTX(_("PNL^Enabled spectating")), "1");
-                       e.addValue(e, ZCTX(_("PNL^Enabled even playing in warmup")), "2");
+                       e.addValue(e, _("Disable"), "0");
+                       e.addValue(e, _("Enable spectating"), "1");
+                       e.addValue(e, _("Enable even playing in warmup"), "2");
                        e.configureXonoticTextSliderValues(e);
 
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Align icon:")));
index 507dedb7c95cc068adc2d478cf4a83795c72e620..0cb74ea6770fd64031c99f00a93ba45c70076327 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDItemsTimeDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDItemsTimeDialog, title, string, _("Items Time Panel"));
        ATTRIB(XonoticHUDItemsTimeDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDItemsTimeDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDItemsTimeDialog, rows, float, 15);
+       ATTRIB(XonoticHUDItemsTimeDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDItemsTimeDialog, columns, float, 4);
        ATTRIB(XonoticHUDItemsTimeDialog, name, string, "HUDitemstime");
 ENDCLASS(XonoticHUDItemsTimeDialog)
index 53cad1a930383ca693df2d8c5aa2419255df556b..afc47af30d4570768fb95cc48d12bfd4fb93ef97 100644 (file)
@@ -7,5 +7,7 @@ void XonoticHUDModIconsDialog_fill(entity me)
        entity e;
        string panelname = "modicons";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 }
index 3a3b72f6c9989df94d4695b135ed30f96f6186e5..a59d09af4b008950114dd03ee860cec51a0e694d 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDModIconsDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDModIconsDialog, title, string, _("Mod Icons Panel"));
        ATTRIB(XonoticHUDModIconsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDModIconsDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDModIconsDialog, rows, float, 15);
+       ATTRIB(XonoticHUDModIconsDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDModIconsDialog, columns, float, 4);
        ATTRIB(XonoticHUDModIconsDialog, name, string, "HUDmodicons");
        ATTRIB(XonoticHUDModIconsDialog, requiresConnection, float, true);
index 490051846e378fd7835c50d684d9294083ef0ddc..1dc0a15b70617ec0cc42d17a90b93c9bacfca8bb 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDNotificationDialog_fill(entity me)
        entity e;
        string panelname = "notify";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Notifications:")));
index f816e4ffe042fd9d6f6f6ba84c46cecbdddc97b6..be51051f6c2b9acd138acd192c2677a5e46d606e 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDNotificationDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDNotificationDialog, title, string, _("Notification Panel"));
        ATTRIB(XonoticHUDNotificationDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDNotificationDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDNotificationDialog, rows, float, 15);
+       ATTRIB(XonoticHUDNotificationDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDNotificationDialog, columns, float, 4);
        ATTRIB(XonoticHUDNotificationDialog, name, string, "HUDnotify");
        ATTRIB(XonoticHUDNotificationDialog, requiresConnection, float, true);
index eabc93dab51021e7c44b1ac2cbe8dab9eda843ec..3a1e0bee1822a42e2fd363323e8f41cec73296f4 100644 (file)
@@ -12,13 +12,13 @@ void XonoticHUDPhysicsDialog_fill(entity me)
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_physics"));
-                       e.addValue(e, _("Panel disabled"), "0");
-                       e.addValue(e, _("Panel enabled"), "1");
-                       e.addValue(e, _("Panel enabled even observing"), "2");
-                       e.addValue(e, _("Panel enabled only in Race/CTS"), "3");
+                       e.addValue(e, _("Disable"), "0");
+                       e.addValue(e, _("Enable"), "1");
+                       e.addValue(e, _("Enable even observing"), "2");
+                       e.addValue(e, _("Enable only in Race/CTS"), "3");
                        e.configureXonoticTextSliderValues(e);
 
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 1.4, e = makeXonoticCheckBox(0, "hud_panel_physics_progressbar", _("Status bar")));
index f6f19135d1f7a257d001d4af567bd01d50d03adc..2a52bef91b8841e8f60e42a6f83e31f476e6363f 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDPhysicsDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDPhysicsDialog, title, string, _("Physics Panel"));
        ATTRIB(XonoticHUDPhysicsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDPhysicsDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDPhysicsDialog, rows, float, 15);
+       ATTRIB(XonoticHUDPhysicsDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDPhysicsDialog, columns, float, 4);
        ATTRIB(XonoticHUDPhysicsDialog, name, string, "HUDphysics");
        ATTRIB(XonoticHUDPhysicsDialog, sliderTopspeedTime, entity);
index 1b490d10272fdb3dc8bb28ee3d337b483afd751b..7e0ffae1a4137a46d20cccd1b96269d56349de6f 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDPowerupsDialog_fill(entity me)
        entity e;
        string panelname = "powerups";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_powerups_progressbar", _("Enable status bar")));
index 7f67fa6007b6f2423dfd54158ead5a20f038f36d..c82f98278095b5aed91d1501e59657be65aa3b64 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDPowerupsDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDPowerupsDialog, title, string, _("Powerups Panel"));
        ATTRIB(XonoticHUDPowerupsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDPowerupsDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDPowerupsDialog, rows, float, 14);
+       ATTRIB(XonoticHUDPowerupsDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDPowerupsDialog, columns, float, 4);
        ATTRIB(XonoticHUDPowerupsDialog, name, string, "HUDpowerups");
        ATTRIB(XonoticHUDPowerupsDialog, requiresConnection, float, true);
index 4e24ff998eeb67f2b0351d999056784898dfc7af..30d95721090c17406c900b865d8ccab8d7bac3d6 100644 (file)
@@ -11,12 +11,12 @@ void XonoticHUDPressedKeysDialog_fill(entity me)
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_pressedkeys"));
-                       e.addValue(e, _("Panel disabled"), "0");
-                       e.addValue(e, _("Panel enabled when spectating"), "1");
-                       e.addValue(e, _("Panel always enabled"), "2");
+                       e.addValue(e, ("Disable"), "0");
+                       e.addValue(e, ("Enable when spectating"), "1");
+                       e.addValue(e, ("Always enable"), "2");
                        e.configureXonoticTextSliderValues(e);
 
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TDempty(me, 0.2);
index cc82959e6443af3c3ffc594da63504f66cf399dd..46452c696dfa76469fa3fe3b3ccd2b1dec78ed56 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDPressedKeysDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDPressedKeysDialog, title, string, _("Pressed Keys Panel"));
        ATTRIB(XonoticHUDPressedKeysDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDPressedKeysDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDPressedKeysDialog, rows, float, 15);
+       ATTRIB(XonoticHUDPressedKeysDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDPressedKeysDialog, columns, float, 4);
        ATTRIB(XonoticHUDPressedKeysDialog, name, string, "HUDpressedkeys");
        ATTRIB(XonoticHUDPressedKeysDialog, requiresConnection, float, true);
index 4012bc61ac13b64975a57ff9c47e8bf356432af6..128951c0c8acfbde8bc5d33e84af28d49ca74776 100644 (file)
@@ -9,7 +9,10 @@ void XonoticHUDQuickMenuDialog_fill(entity me)
        entity e;
        string panelname = "quickmenu";
 
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+       // this panel has no main cvar
+       //dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Text alignment:")));
index 16f93c13d584579397f754ca3a78ec9dcdba7de4..ac6693a648155fe71a93257c7f7cc42d36ce583c 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDQuickMenuDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDQuickMenuDialog, title, string, _("Quick Menu Panel"));
        ATTRIB(XonoticHUDQuickMenuDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDQuickMenuDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDQuickMenuDialog, rows, float, 15);
+       ATTRIB(XonoticHUDQuickMenuDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDQuickMenuDialog, columns, float, 4);
        ATTRIB(XonoticHUDQuickMenuDialog, name, string, "HUDquickmenu");
 ENDCLASS(XonoticHUDQuickMenuDialog)
index 2673e546039a5afc5fb86d72e25e78193f1ce201..d4bbe51f56451c941c4ac312b0384b46f48ab00e 100644 (file)
@@ -7,5 +7,7 @@ void XonoticHUDRaceTimerDialog_fill(entity me)
        entity e;
        string panelname = "racetimer";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 }
index 7c814e3823e3586d7a2c9d14edb9a2a688f67cd0..81a8f005341aa3c5be0c3b4549ecc39710a6ce56 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDRaceTimerDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDRaceTimerDialog, title, string, _("Race Timer Panel"));
        ATTRIB(XonoticHUDRaceTimerDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDRaceTimerDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDRaceTimerDialog, rows, float, 15);
+       ATTRIB(XonoticHUDRaceTimerDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDRaceTimerDialog, columns, float, 4);
        ATTRIB(XonoticHUDRaceTimerDialog, name, string, "HUDracetimer");
        ATTRIB(XonoticHUDRaceTimerDialog, requiresConnection, float, true);
index de9ed6898b821e7df49781fcb2176c85fcd103a1..3e8db6686c09b79c96b6096eb6d9052a245b65b1 100644 (file)
@@ -12,12 +12,12 @@ void XonoticHUDRadarDialog_fill(entity me)
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_radar"));
-                       e.addValue(e, _("Panel disabled"), "0");
-                       e.addValue(e, _("Panel enabled in teamgames"), "1");
-                       e.addValue(e, _("Panel always enabled"), "2");
+                       e.addValue(e, _("Disable"), "0");
+                       e.addValue(e, _("Enable in team games"), "1");
+                       e.addValue(e, _("Always enable"), "2");
                        e.configureXonoticTextSliderValues(e);
 
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Radar:")));
index 04617b677f4c04a7444cf5de08444c1c67532f25..d02f5cd59298fe3b45bba6ca0aefd81f0c8c6d06 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDRadarDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDRadarDialog, title, string, _("Radar Panel"));
        ATTRIB(XonoticHUDRadarDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDRadarDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDRadarDialog, rows, float, 15);
+       ATTRIB(XonoticHUDRadarDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDRadarDialog, columns, float, 4);
        ATTRIB(XonoticHUDRadarDialog, name, string, "HUDradar");
        ATTRIB(XonoticHUDRadarDialog, requiresConnection, float, true);
index f04ca30da9397f358055366fa8bb726398847078..afb97e5fd42de9a8fed0ce82d6352bb22a9fddd9 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDScoreDialog_fill(entity me)
        entity e;
        string panelname = "score";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Score:")));
index d97787404e921121ce3453be7f8a42bfd1a940fb..20fa6cf967f86aa1a26a4644f32aaf4ae652e2a3 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDScoreDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDScoreDialog, title, string, _("Score Panel"));
        ATTRIB(XonoticHUDScoreDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDScoreDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDScoreDialog, rows, float, 15);
+       ATTRIB(XonoticHUDScoreDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDScoreDialog, columns, float, 4);
        ATTRIB(XonoticHUDScoreDialog, name, string, "HUDscore");
        ATTRIB(XonoticHUDScoreDialog, requiresConnection, float, true);
index dd9a7b8788923f0a5f424e9e76c6655ce248c226..84c6d862dbebb8a4644e2546516a9d9b70a71de1 100644 (file)
@@ -8,7 +8,9 @@ void XonoticHUDTimerDialog_fill(entity me)
        entity e;
        string panelname = "timer";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Timer:")));
index 61955495edd4c7ac985ee989c39fe2d23b27cf3c..dac91cc2a67a57ec9fe1e79f9568a98857179931 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDTimerDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDTimerDialog, title, string, _("Timer Panel"));
        ATTRIB(XonoticHUDTimerDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDTimerDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDTimerDialog, rows, float, 15);
+       ATTRIB(XonoticHUDTimerDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDTimerDialog, columns, float, 4);
        ATTRIB(XonoticHUDTimerDialog, name, string, "HUDtimer");
        ATTRIB(XonoticHUDTimerDialog, requiresConnection, float, true);
index e8afa7ca706b91a71b050c9af2c12de684924bf4..39c9a69f707a0465aee72da99363c2c5123ae72c 100644 (file)
@@ -9,7 +9,9 @@ void XonoticHUDVoteDialog_fill(entity me)
        entity e;
        string panelname = "vote";
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Alpha after voting:")));
index 061c69e56c4797b3d904739b0adcedfe97d79bba..b07b189e5b81d031ccd8069a053e117eec7271d5 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDVoteDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDVoteDialog, title, string, _("Vote Panel"));
        ATTRIB(XonoticHUDVoteDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDVoteDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDVoteDialog, rows, float, 15);
+       ATTRIB(XonoticHUDVoteDialog, rows, float, 15.5);
        ATTRIB(XonoticHUDVoteDialog, columns, float, 4);
        ATTRIB(XonoticHUDVoteDialog, name, string, "HUDvote");
        ATTRIB(XonoticHUDVoteDialog, requiresConnection, float, true);
index 61339b6b938cc54800e1326bba256b00d08488a4..116b8ae2f06798a47e1854b5306c6eb58130acf9 100644 (file)
@@ -13,7 +13,9 @@ void XonoticHUDWeaponsDialog_fill(entity me)
        string panelname = "weapons";
        float i;
 
-       DIALOG_HUDPANEL_COMMON();
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
 
        me.TR(me);
                me.TDempty(me, 0.2);
index fad14749e6f4665f00b4c460c238a018811d0f37..4f877d4d3f3419e444f0fbbab65c7bbde913d970 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticHUDWeaponsDialog, XonoticRootDialog)
        ATTRIB(XonoticHUDWeaponsDialog, title, string, _("Weapons Panel"));
        ATTRIB(XonoticHUDWeaponsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
        ATTRIB(XonoticHUDWeaponsDialog, intendedWidth, float, 0.4);
-       ATTRIB(XonoticHUDWeaponsDialog, rows, float, 21);
+       ATTRIB(XonoticHUDWeaponsDialog, rows, float, 21.5);
        ATTRIB(XonoticHUDWeaponsDialog, columns, float, 4);
        ATTRIB(XonoticHUDWeaponsDialog, name, string, "HUDweapons");
        ATTRIB(XonoticHUDWeaponsDialog, requiresConnection, float, true);
index 0ea24a8891931157853a55fe461888271abd5947..63b55a19b9514200ab86e1fe3e298afb7aea5a22 100644 (file)
@@ -20,7 +20,7 @@ string weaponarenastring_cvar;
 string WeaponArenaString()
 {
        string s;
-       float n, i;
+       float n;
        s = cvar_string("g_weaponarena");
        if(s == "0")
                return "";
@@ -39,14 +39,14 @@ string WeaponArenaString()
 
        n = tokenize_console(s);
        s = "";
-       for(i = 0; i < n; ++i)
+       for(int j = 0; j < n; ++j)
        {
                FOREACH(Weapons, it != WEP_Null, {
-                       if(argv(i) == it.netname)
-                               s = strcat(s, " & ", it.m_name);
+                       if(argv(j) == it.netname)
+                               s = cons_mid(s, " & ", it.m_name);
                });
        }
-       s = sprintf(_("%s Arena"), substring(s, 3, strlen(s) - 3));
+       s = sprintf(_("%s Arena"), s);
 
        weaponarenastring = strzone(s);
 
@@ -55,56 +55,59 @@ string WeaponArenaString()
 
 string XonoticMutatorsDialog_toString(entity me)
 {
-       string s;
-       s = "";
+       string s = "";
        if(cvar("g_dodging"))
-               s = strcat(s, ", ", _("Dodging"));
+               s = cons_mid(s, ", ", _("Dodging"));
        if(cvar("g_instagib"))
-               s = strcat(s, ", ", _("InstaGib"));
+               s = cons_mid(s, ", ", _("InstaGib"));
        if(cvar("g_new_toys"))
-               s = strcat(s, ", ", _("New Toys"));
+               s = cons_mid(s, ", ", _("New Toys"));
        if(cvar("g_nix"))
-               s = strcat(s, ", ", _("NIX"));
+               s = cons_mid(s, ", ", _("NIX"));
        if(cvar("g_rocket_flying"))
-               s = strcat(s, ", ", _("Rocket Flying"));
+               s = cons_mid(s, ", ", _("Rocket Flying"));
        if(cvar("g_invincible_projectiles"))
-               s = strcat(s, ", ", _("Invincible Projectiles"));
+               s = cons_mid(s, ", ", _("Invincible Projectiles"));
        if(cvar_string("g_weaponarena") != "0")
-               s = strcat(s, ", ", WeaponArenaString());
+               s = cons_mid(s, ", ", WeaponArenaString());
        else if(cvar("g_balance_blaster_weaponstartoverride") == 0)
-               s = strcat(s, ", ", _("No start weapons"));
+               s = cons_mid(s, ", ", _("No start weapons"));
        if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
-               s = strcat(s, ", ", _("Low gravity"));
+               s = cons_mid(s, ", ", _("Low gravity"));
        if(cvar("g_cloaked"))
-               s = strcat(s, ", ", _("Cloaked"));
+               s = cons_mid(s, ", ", _("Cloaked"));
        if(cvar("g_grappling_hook"))
-               s = strcat(s, ", ", _("Hook"));
+               s = cons_mid(s, ", ", _("Hook"));
        if(cvar("g_midair"))
-               s = strcat(s, ", ", _("Midair"));
+               s = cons_mid(s, ", ", _("Midair"));
+       if(cvar("g_melee_only"))
+               s = cons_mid(s, ", ", _("Melee only"));
        if(cvar("g_vampire"))
-               s = strcat(s, ", ", _("Vampire"));
+               s = cons_mid(s, ", ", _("Vampire"));
        if(cvar("g_pinata"))
-               s = strcat(s, ", ", _("Piñata"));
+               s = cons_mid(s, ", ", _("Piñata"));
        if(cvar("g_weapon_stay"))
-               s = strcat(s, ", ", _("Weapons stay"));
+               s = cons_mid(s, ", ", _("Weapons stay"));
        if(cvar("g_bloodloss") > 0)
-               s = strcat(s, ", ", _("Blood loss"));
+               s = cons_mid(s, ", ", _("Blood loss"));
        if(cvar("g_jetpack"))
-               s = strcat(s, ", ", _("Jet pack"));
+               s = cons_mid(s, ", ", _("Jet pack"));
        if(cvar("g_buffs") > 0)
-               s = strcat(s, ", ", _("Buffs"));
+               s = cons_mid(s, ", ", _("Buffs"));
        if(cvar("g_overkill"))
-               s = strcat(s, ", ", _("Overkill"));
+               s = cons_mid(s, ", ", _("Overkill"));
        if(cvar("g_powerups") == 0)
-               s = strcat(s, ", ", _("No powerups"));
+               s = cons_mid(s, ", ", _("No powerups"));
        if(cvar("g_powerups") > 0)
-               s = strcat(s, ", ", _("Powerups"));
+               s = cons_mid(s, ", ", _("Powerups"));
        if(cvar("g_touchexplode") > 0)
-               s = strcat(s, ", ", _("Touch explode"));
+               s = cons_mid(s, ", ", _("Touch explode"));
+       if(cvar("g_walljump"))
+               s = cons_mid(s, ", ", _("Wall jumping"));
        if(s == "")
                return ZCTX(_("MUT^None"));
        else
-               return substring(s, 2, strlen(s) - 2);
+               return s;
 }
 
 float checkCompatibility_pinata(entity me)
@@ -113,6 +116,10 @@ float checkCompatibility_pinata(entity me)
                return 0;
        if(cvar("g_nix"))
                return 0;
+       if(cvar("g_overkill"))
+               return 0;
+       if(cvar("g_melee_only"))
+               return 0;
        if(cvar_string("g_weaponarena") != "0")
                return 0;
        return 1;
@@ -168,10 +175,11 @@ void XonoticMutatorsDialog_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
+                       e.cvarOffValue = "-1"; // TODO: make this a radio button?
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_midair", _("Midair"),
-                       _("Only possible to inflict damage on your enemy while he's airborne")));
+                       _("Only possible to inflict damage on your enemy while they're airborne")));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_vampire", _("Vampire"),
index 14272cb19ba9f8e6db66f2a309daf000430adc10..b6ad4af100ca132d4d90532ec11a56a9ca24df77 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticListBox, ListBox)
        ATTRIB(XonoticListBox, fontSize, float, SKINFONTSIZE_NORMAL);
        ATTRIB(XonoticListBox, scrollbarWidth, float, SKINWIDTH_SCROLLBAR);
        ATTRIB(XonoticListBox, src, string, SKINGFX_SCROLLBAR);
-       ATTRIB(XonoticListBox, tolerance, vector, SKINTOLERANCE_SLIDER);
+       ATTRIB(XonoticListBox, tolerance, vector, '2 0.2 0');
        ATTRIB(XonoticListBox, rowsPerItem, float, 1);
        METHOD(XonoticListBox, resizeNotify, void(entity, vector, vector, vector, vector));
        ATTRIB(XonoticListBox, color, vector, SKINCOLOR_SCROLLBAR_N);
index 9204c5eb35b501481d2be533c53c361b18b10245..fea35745896a6a71f3773fd22becebe0e0f59627 100644 (file)
@@ -8,7 +8,7 @@ CLASS(XonoticSlider, Slider)
        ATTRIB(XonoticSlider, fontSize, float, SKINFONTSIZE_NORMAL);
        ATTRIB(XonoticSlider, valueSpace, float, SKINWIDTH_SLIDERTEXT);
        ATTRIB(XonoticSlider, image, string, SKINGFX_SLIDER);
-       ATTRIB(XonoticSlider, tolerance, vector, SKINTOLERANCE_SLIDER);
+       ATTRIB(XonoticSlider, tolerance, vector, '0.2 2 0');
        ATTRIB(XonoticSlider, align, float, 0.5);
        ATTRIB(XonoticSlider, color, vector, SKINCOLOR_SLIDER_N);
        ATTRIB(XonoticSlider, colorC, vector, SKINCOLOR_SLIDER_C);
index 3e94738a9ab500d89a162003be58ef67106e49f0..401a6eadda0026b5f7e2b6533c40352c597961ea 100644 (file)
@@ -100,21 +100,21 @@ void XonoticStatsList_getStats(entity me)
                        case "overall/last_seen_dt":
                        {
                                order = 1;
-                               outstr = _("Last_Seen:");
+                               outstr = _("Last match:");
                                data = XonoticStatsList_convertDate(car(data));
                                break;
                        }
                        case "overall/alivetime":
                        {
                                order = 1;
-                               outstr = _("Time_Played:");
+                               outstr = _("Time played:");
                                data = process_time(3, stof(data));
                                break;
                        }
                        case "overall/favorite-map":
                        {
                                order = 2;
-                               outstr = _("Favorite_Map:");
+                               outstr = _("Favorite map:");
                                data = car(data);
                                break;
                        }
@@ -146,13 +146,13 @@ void XonoticStatsList_getStats(entity me)
 
                if((order == -1) && (out_total_matches >= 0) && (out_total_wins >= 0))
                {
-                       bufstr_add(me.listStats, sprintf("003Matches: %d", out_total_matches), true);
+                       bufstr_add(me.listStats, sprintf("003%s\n%d", _("Matches:"), out_total_matches), true);
 
                        if(out_total_matches > 0) // don't show extra info if there are no matches played
                        {
                                out_total_losses = max(0, (out_total_matches - out_total_wins));
-                               bufstr_add(me.listStats, sprintf("003Wins/Losses: %d/%d", out_total_wins, out_total_losses), true);
-                               bufstr_add(me.listStats, sprintf("004Win_Percentage: %d%%", ((out_total_wins / out_total_matches) * 100)), true);
+                               bufstr_add(me.listStats, sprintf("003%s\n%d/%d", _("Wins/Losses:"), out_total_wins, out_total_losses), true);
+                               bufstr_add(me.listStats, sprintf("004%s\n%d%%", _("Win percentage:"), ((out_total_wins / out_total_matches) * 100)), true);
                        }
 
                        out_total_matches = -1;
@@ -163,13 +163,13 @@ void XonoticStatsList_getStats(entity me)
 
                if((order == -1) && (out_total_kills >= 0) && (out_total_deaths >= 0))
                {
-                       bufstr_add(me.listStats, sprintf("005Kills/Deaths: %d/%d", out_total_kills, out_total_deaths), true);
+                       bufstr_add(me.listStats, sprintf("005%s\n%d/%d", _("Kills/Deaths:"), out_total_kills, out_total_deaths), true);
 
                        // if there are no deaths, just show kill count
-                       if(out_total_deaths > 0)
-                               bufstr_add(me.listStats, sprintf("006Kill_Ratio: %.2f", (out_total_kills / out_total_deaths)), true);
-                       else
-                               bufstr_add(me.listStats, sprintf("006Kill_Ratio: %.2f", out_total_kills), true);
+                       if(out_total_deaths == 0)
+                               out_total_deaths = 1;
+
+                       bufstr_add(me.listStats, sprintf("006%s\n%.2f", _("Kill ratio:"), (out_total_kills / out_total_deaths)), true);
 
                        out_total_kills = -1;
                        out_total_deaths = -1;
@@ -198,28 +198,27 @@ void XonoticStatsList_getStats(entity me)
                                        case "matches":
                                        {
                                                order = 1;
-                                               outstr = sprintf(_("%s_Matches:"), strtoupper(gametype));
-                                               //data = sprintf(_("%d (unranked)"), data);
+                                               outstr = _("Matches:");
                                                break;
                                        }
                                        case "elo":
                                        {
                                                order = 2;
-                                               outstr = sprintf(_("%s_ELO:"), strtoupper(gametype));
+                                               outstr = _("ELO:");
                                                data = sprintf("%d", stof(data));
                                                break;
                                        }
                                        case "rank":
                                        {
                                                order = 3;
-                                               outstr = sprintf(_("%s_Rank:"), strtoupper(gametype));
+                                               outstr = _("Rank:");
                                                data = sprintf("%d", stof(data));
                                                break;
                                        }
                                        case "percentile":
                                        {
                                                order = 4;
-                                               outstr = sprintf(_("%s_Percentile:"), strtoupper(gametype));
+                                               outstr = _("Percentile:");
                                                data = sprintf("%d%%", stof(data));
                                                break;
                                        }
@@ -228,8 +227,7 @@ void XonoticStatsList_getStats(entity me)
                                        case "favorite-map":
                                        {
                                                order = 5;
-                                               outstr = sprintf(_("%s_Favorite_Map:"), strtoupper(gametype));
-                                               //data = sprintf(_("%d (unranked)"), data);
+                                               outstr = _("Favorite map:");
                                                break;
                                        }
                                        #endif
@@ -237,12 +235,14 @@ void XonoticStatsList_getStats(entity me)
                                        default: continue; // nothing to see here
                                }
 
+                               outstr = strcat(strtoupper(gametype), " ", outstr);
                                // now set up order for sorting later
                                orderstr = sprintf("%2.2s%d", gametype, order);
                        }
                        else if(event == "matches")
                        {
-                               outstr = sprintf(_("%s_Matches:"), strtoupper(gametype));
+                               outstr = _("Matches:");
+                               outstr = strcat(strtoupper(gametype), " ", outstr);
                                data = sprintf(_("%d (unranked)"), stof(data));
 
                                // unranked game modes ALWAYS get put last
@@ -251,7 +251,7 @@ void XonoticStatsList_getStats(entity me)
                        else { continue; }
                }
 
-               bufstr_add(me.listStats, sprintf("%s%s %s", orderstr, outstr, data), true);
+               bufstr_add(me.listStats, sprintf("%s%s\n%s", orderstr, outstr, data), true);
        }
 
        me.nItems = buf_getsize(me.listStats);
@@ -294,14 +294,13 @@ void XonoticStatsList_drawListBoxItem(entity me, int i, vector absSize, bool isS
        }
 
        string data = bufstr_get(me.listStats, i);
-       string s = car(data);
-       string d = cdr(data);
+       int ofs = strstrofs(data, "\n", 0);
 
-       s = substring(s, 3, strlen(s) - 3);
-       s = strreplace("_", " ", s);
+       string s = substring(data, 3, ofs - 3);
        s = draw_TextShortenToWidth(s, 0.5 * me.columnNameSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 1);
 
+       string d = substring(data, ofs + 1, strlen(data) - (ofs + 1));
        d = draw_TextShortenToWidth(d, me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize), 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 1 * (me.columnNameSize - draw_TextWidth(d, 0, me.realFontSize))) * eX, d, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 1);
 }
index 58fe8e86bbe4a0becaac10ea463fe493f50b2d72..3c588ce55000415a1aa1a5688e0199b2bdce32f8 100644 (file)
@@ -9,7 +9,7 @@ CLASS(XonoticTextSlider, TextSlider)
        ATTRIB(XonoticTextSlider, fontSize, float, SKINFONTSIZE_NORMAL);
        ATTRIB(XonoticTextSlider, valueSpace, float, SKINWIDTH_SLIDERTEXT);
        ATTRIB(XonoticTextSlider, image, string, SKINGFX_SLIDER);
-       ATTRIB(XonoticTextSlider, tolerance, vector, SKINTOLERANCE_SLIDER);
+       ATTRIB(XonoticTextSlider, tolerance, vector, '0.2 2 0');
        ATTRIB(XonoticTextSlider, align, float, 0.5);
        ATTRIB(XonoticTextSlider, color, vector, SKINCOLOR_SLIDER_N);
        ATTRIB(XonoticTextSlider, colorC, vector, SKINCOLOR_SLIDER_C);
index 7b381b544588ae4d9049d972ad0d74d44c7c9a23..602862820b114f93a4ef00bd28ceb07a4e453e1f 100644 (file)
@@ -1,4 +1,5 @@
 #include "util.qh"
+#include "dialog.qh"
 
 #include "../item.qh"
 
@@ -749,6 +750,7 @@ string GameType_GetIcon(int cnt)
 .void(entity) TR;
 .void(entity, float, float, entity) TD;
 .void(entity, float) TDempty;
+.void(entity, float, float) gotoRC;
 entity makeXonoticTextLabel(float theAlign, string theText);
 entity makeXonoticTextSlider(string);
 .void(entity, string, string) addValue;
@@ -758,12 +760,21 @@ entity makeXonoticCheckBoxString(string, string, string, string);
 entity makeXonoticCheckBox(float, string, string);
 .bool sendCvars;
 
-void dialog_hudpanel_common_notoggle(entity me, string panelname)
+void dialog_hudpanel_main_checkbox(entity me, string panelname)
 {
-       float i;
        entity e;
 
        me.TR(me);
+               me.TDempty(me, 1.5);
+               me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, strzone(strcat("hud_panel_", panelname)), _("Enable")));
+}
+
+void dialog_hudpanel_main_settings(entity me, string panelname)
+{
+       float i;
+       entity e;
+
+       me.gotoRC(me, me.currentRow + 1.5, 0);
                me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Background:")));
                        me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
                                e.addValue(e, _("Default"), "");
index 96fef2ad4006f553a3bd8a5b22dd594b684df5c3..f5bd636d81f98c1b481b0919776ed2051d5fddaf 100644 (file)
@@ -36,13 +36,8 @@ string GameType_GetIcon(int cnt);
 int GameType_GetCount();
 int GameType_GetTotalCount();
 
-void dialog_hudpanel_common_notoggle(entity me, string panelname);
-#define DIALOG_HUDPANEL_COMMON_NOTOGGLE() \
-       dialog_hudpanel_common_notoggle(me, panelname)
-#define DIALOG_HUDPANEL_COMMON() \
-       me.TR(me); \
-               me.TD(me, 1, 4, e = makeXonoticCheckBox(0, strzone(strcat("hud_panel_", panelname)), _("Enable panel"))); \
-       DIALOG_HUDPANEL_COMMON_NOTOGGLE()
+void dialog_hudpanel_main_checkbox(entity me, string panelname);
+void dialog_hudpanel_main_settings(entity me, string panelname);
 
 float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha);
 
index a2f917fafcaee15b204ce9cc80eb1455ce89dc38..a2f9ab49b4f9c48497e8599806adc6ff7cd247a2 100644 (file)
@@ -204,8 +204,6 @@ bool autocvar_g_respawn_ghosts;
 float autocvar_g_respawn_ghosts_maxtime;
 float autocvar_g_respawn_ghosts_speed;
 int autocvar_g_respawn_waves;
-bool autocvar_g_shootfromcenter;
-bool autocvar_g_shootfromeye;
 string autocvar_g_shootfromfixedorigin;
 int autocvar_g_showweaponspawns;
 bool autocvar_g_spawn_alloweffects;
index 4b9c70b26f7a8a2f2782bef5e6efb778cdd97b89..48ea4c261d53bed840246686abfcba9543e55e77 100644 (file)
@@ -308,6 +308,9 @@ void PutObserverInServer(entity this)
        if(this.bot_attack)
                IL_REMOVE(g_bot_targets, this);
        this.bot_attack = false;
+       if(this.monster_attack)
+               IL_REMOVE(g_monster_targets, this);
+       this.monster_attack = false;
     STAT(HUD, this) = HUD_NORMAL;
        TRANSMUTE(Observer, this);
        this.iscreature = false;
@@ -340,6 +343,7 @@ void PutObserverInServer(entity this)
        this.strength_finished = 0;
        this.invincible_finished = 0;
        this.superweapons_finished = 0;
+       this.dphitcontentsmask = 0;
        this.pushltime = 0;
        this.istypefrag = 0;
        setthink(this, func_null);
@@ -1094,6 +1098,8 @@ void FixClientCvars(entity e)
        stuffcmd(e, sprintf("\ncl_jumpspeedcap_min \"%s\"\n", autocvar_sv_jumpspeedcap_min));
        stuffcmd(e, sprintf("\ncl_jumpspeedcap_max \"%s\"\n", autocvar_sv_jumpspeedcap_max));
 
+       stuffcmd(e, sprintf("\ncl_shootfromfixedorigin \"%s\"\n", autocvar_g_shootfromfixedorigin));
+
        MUTATOR_CALLHOOK(FixClientCvars, e);
 }
 
@@ -1343,6 +1349,7 @@ void ClientDisconnect(entity this)
     MUTATOR_CALLHOOK(ClientDisconnect, this);
 
        if (CS(this).netname_previous) strunzone(CS(this).netname_previous); // needs to be before the CS entity is removed!
+       if (CS(this).weaponorder_byimpulse) strunzone(CS(this).weaponorder_byimpulse);
        ClientState_detach(this);
 
        Portal_ClearAll(this);
@@ -1363,7 +1370,6 @@ void ClientDisconnect(entity this)
        bot_relinkplayerlist();
 
        if (this.clientstatus) strunzone(this.clientstatus);
-       if (this.weaponorder_byimpulse) strunzone(this.weaponorder_byimpulse);
        if (this.personal) delete(this.personal);
 
        this.playerid = 0;
@@ -2140,6 +2146,7 @@ bool joinAllowed(entity this)
 }
 
 .int items_added;
+.string shootfromfixedorigin;
 bool PlayerThink(entity this)
 {
        if (game_stopped || intermission_running) {
@@ -2248,8 +2255,8 @@ bool PlayerThink(entity this)
        bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this);
        if (have_hook) {
                do_crouch = false;
-       } else if (this.waterlevel >= WATERLEVEL_SWIMMING) {
-               do_crouch = false;
+       //} else if (this.waterlevel >= WATERLEVEL_SWIMMING) {
+               //do_crouch = false;
        } else if (this.vehicle) {
                do_crouch = false;
        } else if (STAT(FROZEN, this)) {
@@ -2274,6 +2281,11 @@ bool PlayerThink(entity this)
 
        FixPlayermodel(this);
 
+       if (this.shootfromfixedorigin != autocvar_g_shootfromfixedorigin) {
+               this.shootfromfixedorigin = autocvar_g_shootfromfixedorigin;
+               stuffcmd(this, sprintf("\ncl_shootfromfixedorigin \"%s\"\n", autocvar_g_shootfromfixedorigin));
+       }
+
        // LordHavoc: allow firing on move frames (sub-ticrate), this gives better timing on slow servers
        //if(frametime)
        {
@@ -2754,6 +2766,13 @@ void PlayerPostThink (entity this)
        }
 
        if (IS_PLAYER(this)) {
+               if(this.death_time == time && IS_DEAD(this))
+               {
+                       // player's bbox gets resized now, instead of in the damage event that killed the player,
+                       // once all the damage events of this frame have been processed with normal size
+                       this.maxs.z = 5;
+                       setsize(this, this.mins, this.maxs);
+               }
                DrownPlayer(this);
                UpdateChatBubble(this);
                if (CS(this).impulse) ImpulseCommands(this);
@@ -2814,3 +2833,10 @@ void PM_UpdateButtons(entity this, entity store)
        store.v_angle = this.v_angle;
        store.movement = this.movement;
 }
+
+NET_HANDLE(fpsreport, bool)
+{
+       int fps = ReadShort();
+       PlayerScore_Set(sender, SP_FPS, fps);
+       return true;
+}
index 42d7d9560b4e92359242e19428f242d146cbff0a..48d42da0092d2f8cf059d1f2037e8aace3bbc372 100644 (file)
@@ -113,6 +113,7 @@ CLASS(Client, Object)
     ATTRIB(Client, cmd_floodcount, int, this.cmd_floodcount);
     ATTRIB(Client, cmd_floodtime, float, this.cmd_floodtime);
     ATTRIB(Client, wasplayer, bool, this.wasplayer);
+    ATTRIB(Client, weaponorder_byimpulse, string, this.weaponorder_byimpulse);
 
     // networked cvars
 
index a25c16be4ee205570d00775b1afee1f9f741ad17..af8c3a052ed9517f41482a0253160341f4ed01f2 100644 (file)
@@ -364,6 +364,7 @@ const float ACTIVE_TOGGLE   = 3;
 
 .float revival_time; // time at which player was last revived
 .float revive_speed; // NOTE: multiplier (anything above 1 is instaheal)
+.float freeze_time;
 .entity iceblock;
 .entity frozen_by; // for ice fields
 
index 804d9fd713d8bae506df76f137b2fe546af58892..3fb000e708072a5af331a984f1d0563ef5afac99 100644 (file)
@@ -518,7 +518,7 @@ void Ice_Think(entity this)
        this.nextthink = time;
 }
 
-void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypoint)
+void Freeze (entity targ, float revivespeed, float frozen_type, float show_waypoint)
 {
        if(!IS_PLAYER(targ) && !IS_MONSTER(targ)) // only specified entities can be freezed
                return;
@@ -531,10 +531,11 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
        STAT(FROZEN, targ) = frozen_type;
        STAT(REVIVE_PROGRESS, targ) = ((frozen_type == 3) ? 1 : 0);
        SetResourceAmount(targ, RESOURCE_HEALTH, ((frozen_type == 3) ? targ_maxhealth : 1));
-       targ.revive_speed = freeze_time;
+       targ.revive_speed = revivespeed;
        if(targ.bot_attack)
                IL_REMOVE(g_bot_targets, targ);
        targ.bot_attack = false;
+       targ.freeze_time = time;
 
        entity ice = new(ice);
        ice.owner = targ;
index 8b4204b126dfa1d1b44306a0abc51222391bc837..ff762e9046fd51d89046dbb196a258d3ef02acec 100644 (file)
@@ -368,12 +368,12 @@ string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList(entity this, string wo
 {
        string o;
        o = W_FixWeaponOrder_ForceComplete(wo);
-       if(this.weaponorder_byimpulse)
+       if(CS(this).weaponorder_byimpulse)
        {
-               strunzone(this.weaponorder_byimpulse);
-               this.weaponorder_byimpulse = string_null;
+               strunzone(CS(this).weaponorder_byimpulse);
+               CS(this).weaponorder_byimpulse = string_null;
        }
-       this.weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(o));
+       CS(this).weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(o));
        return o;
 }
 
index 8a32b9b5bddf8c9ff71e031f6857fecbc86cb812..5538a574428cb4b8cbc5dbbe01dec2aa0f5264c8 100644 (file)
@@ -29,7 +29,6 @@ float cvar_normal(string n)
 #define cvar_set_normal builtin_cvar_set
 
 .vector dropped_origin;
-.float nottargeted;
 
 entity eliminatedPlayers;
 void EliminatedPlayers_Init(float(entity) isEliminated_func);
index fb452c3399b9bb4ab39721abb574ec32944ccff4..6853c04a15641dc69bd6e52f7da39615a41610a4 100644 (file)
@@ -1065,3 +1065,9 @@ MUTATOR_HOOKABLE(PlayerPhysics_UpdateStats, EV_PlayerPhysics_UpdateStats);
     /** bot */ i(entity, MUTATOR_ARGV_0_entity) \
     /**/
 MUTATOR_HOOKABLE(HavocBot_Aim, EV_HavocBot_Aim);
+
+/** return true to skip respawn time calculations */
+#define EV_CalculateRespawnTime(i, o) \
+    /** player */ i(entity, MUTATOR_ARGV_0_entity) \
+    /**/
+MUTATOR_HOOKABLE(CalculateRespawnTime, EV_CalculateRespawnTime);
index 67b999e61171b1748313eea22e1bee37b5fad9a8..43ed39aea4924cee57ed841d68e0fe883f4e8429 100644 (file)
@@ -373,6 +373,12 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDamage_SplitHealthArmor)
                GameRules_scoring_add_team(frag_attacker, SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier);
 }
 
+MUTATOR_HOOKFUNCTION(ca, CalculateRespawnTime)
+{
+       // no respawn calculations needed, player is forced to spectate anyway
+       return true;
+}
+
 MUTATOR_HOOKFUNCTION(ca, PlayerRegen)
 {
        // no regeneration in CA
index af6b520749f3b157434d443bc056690f32602b33..06bdb1428f869439244afd76f9e836eef8000945 100644 (file)
@@ -173,9 +173,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da
        vector v;
        Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker);
 
-       // damage resistance (ignore most of the damage from a bullet or similar)
-       damage = max(damage - 5, 1);
-
        v = healtharmor_applydamage(this.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
        take = v.x;
        save = v.y;
@@ -223,7 +220,7 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da
 
 void calculate_player_respawn_time(entity this)
 {
-       if(g_ca)
+       if(MUTATOR_CALLHOOK(CalculateRespawnTime, this))
                return;
 
        float gametype_setting_tmp;
@@ -629,11 +626,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                        animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD1, true);
                else
                        animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD2, true);
-               if (this.maxs.z > 5)
-               {
-                       this.maxs_z = 5;
-                       setsize(this, this.mins, this.maxs);
-               }
+
                // set damage function to corpse damage
                this.event_damage = PlayerCorpseDamage;
                // call the corpse damage function just in case it wants to gib
@@ -652,7 +645,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                if(autocvar_sv_gentle > 0 || autocvar_ekg || this.classname == "body") {
                        // remove corpse
                        // clones don't run any animation code any more, so we must gib them when they die :(
-                       PlayerCorpseDamage(this, inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, weaponentity, hitloc, force);
+                       this.event_damage(this, inflictor, attacker, autocvar_sv_gibhealth + 1, deathtype, weaponentity, hitloc, force);
                }
 
                // reset fields the weapons may use just in case
index 7f7f19b518912d5b56db30c60e2fcb447c347074..8804063dc6e5c918cb64e1b2912c2a27e99b8771 100644 (file)
@@ -995,7 +995,7 @@ spawnfunc(target_checkpoint) // defrag entity
        defrag_ents = 1;
 
        // if this is targeted, then it probably isn't a trigger
-       bool is_trigger = !boolean(!this.nottargeted && this.targetname != "");
+       bool is_trigger = this.targetname == "";
 
        if(is_trigger)
                EXACTTRIGGER_INIT;
index c9948660efe1165c7ed8654dac1ba770e6763277..3f1db42903ddd010c209febba24f608cba1c1840 100644 (file)
@@ -353,6 +353,28 @@ float PlayerScore_Add(entity player, PlayerScoreField scorefield, float score)
        return s.(scores(scorefield));
 }
 
+float PlayerScore_Set(entity player, PlayerScoreField scorefield, float score)
+{
+       if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
+       entity s = CS(player).scorekeeper;
+       if(!s)
+       {
+               if(game_stopped)
+                       return 0;
+               LOG_WARN("Setting score of unknown player!");
+               return 0;
+       }
+
+       float oldscore = s.(scores(scorefield));
+       if(oldscore == score)
+               return oldscore;
+
+       if(scores_label(scorefield) != "")
+               s.SendFlags |= (2 ** (scorefield.m_id % 16));
+       s.(scores(scorefield)) = score;
+       return s.(scores(scorefield));
+}
+
 float PlayerTeamScore_Add(entity player, PlayerScoreField pscorefield, float tscorefield, float score)
 {
        float r;
index e2a57f43fb4a3ffaf36b6a5d33f1d475d793e9db..ad406196635a55b1ecf60667d653eba8a21c27bc 100644 (file)
@@ -24,6 +24,14 @@ void PlayerScore_Detach(entity player);
  */
 float PlayerScore_Add(entity player, PlayerScoreField scorefield, float score);
 
+/**
+ * Sets the player's score to the score parameter.
+ * NEVER call this if PlayerScore_Attach has not been called yet!
+ * Means: FIXME make players unable to join the game when not called ClientConnect yet.
+ * Returns the new (or old if unchanged) score.
+ */
+float PlayerScore_Set(entity player, PlayerScoreField scorefield, float score);
+
 /**
  * \brief Returns the player's score.
  * \param[in] player Player to inspect.
index 17f5de90a307f6a9385eab41dd8c918111c6894c..17714e4c29bb6bf8ec9fe7888533d5923587b6ba 100644 (file)
@@ -55,6 +55,9 @@ void ScoreRules_basics(int teams, float sprio, float stprio, float score_enabled
        ScoreInfo_SetLabel_PlayerScore(SP_DMG, "dmg", 0);
        ScoreInfo_SetLabel_PlayerScore(SP_DMGTAKEN, "dmgtaken", SFL_LOWER_IS_BETTER);
        ScoreInfo_SetLabel_PlayerScore(SP_ELO, "elo", 0);
+
+       if(STAT(SHOWFPS))
+               ScoreInfo_SetLabel_PlayerScore(SP_FPS, "fps", 0);
 }
 void ScoreRules_basics_end()
 {
index 9164b4febec31eb8c7056662c89bb3bbc4920821..e48840883a589658796b693585badd2d7e4d9bf8 100644 (file)
@@ -213,11 +213,6 @@ spawnfunc(info_player_team4)
 //   _y: weight
 vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck)
 {
-       float shortest, thisdist;
-       float prio;
-
-       prio = 0;
-
        // filter out spots for the wrong team
        if(teamcheck >= 0)
                if(spot.team != teamcheck)
@@ -238,9 +233,10 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck)
                        return '-1 0 0';
        }
 
-       shortest = vlen(world.maxs - world.mins);
+       float prio = 0;
+       float shortest = vlen(world.maxs - world.mins);
        FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
-               thisdist = vlen(it.origin - spot.origin);
+               float thisdist = vlen(it.origin - spot.origin);
                if (thisdist < shortest)
                        shortest = thisdist;
        });
index f1800ae00eeda41b69bf8f8d1cbc24fbb90f002b..1eda4e25b1066c86831ef2cb679bccd7993a6ce8 100644 (file)
@@ -67,6 +67,7 @@ void accuracy_add(entity this, int w, int fired, int hit)
        entity a = CS(this).accuracy;
        if (!a) return;
        if (!hit && !fired) return;
+       if (w == WEP_Null.m_id) return;
        w -= WEP_FIRST;
        int b = accuracy_byte(a.accuracy_hit[w], a.accuracy_fired[w]);
        if (hit)    a.accuracy_hit  [w] += hit;
@@ -93,8 +94,11 @@ bool accuracy_isgooddamage(entity attacker, entity targ)
        int mutator_check = MUTATOR_CALLHOOK(AccuracyTargetValid, attacker, targ);
 
        if (warmup_stage) return false;
-       if (IS_DEAD(targ)) return false;
-       if (STAT(FROZEN, targ)) return false;
+
+       // damage to dead/frozen players is good only if it happens in the frame they get killed / frozen
+       // so that stats for weapons that shoot multiple projectiles per shot are properly counted
+       if (IS_DEAD(targ) && time > targ.death_time) return false;
+       if (STAT(FROZEN, targ) && time > targ.freeze_time) return false;
        if (SAME_TEAM(attacker, targ)) return false;
 
        if (mutator_check == MUT_ACCADD_INVALID) return true;
index 693d5a240456323adab1c259b51dfb2551275386..f059dfba9bccd79a97da944a5c9eaea77a98e0be 100644 (file)
@@ -304,7 +304,7 @@ void W_NextWeapon(entity this, int list, .entity weaponentity)
        if(list == 0)
                W_CycleWeapon(this, weaponorder_byid, -1, weaponentity);
        else if(list == 1)
-               W_CycleWeapon(this, this.weaponorder_byimpulse, -1, weaponentity);
+               W_CycleWeapon(this, CS(this).weaponorder_byimpulse, -1, weaponentity);
        else if(list == 2)
                W_CycleWeapon(this, CS(this).cvar_cl_weaponpriority, -1, weaponentity);
 }
@@ -315,7 +315,7 @@ void W_PreviousWeapon(entity this, float list, .entity weaponentity)
        if(list == 0)
                W_CycleWeapon(this, weaponorder_byid, +1, weaponentity);
        else if(list == 1)
-               W_CycleWeapon(this, this.weaponorder_byimpulse, +1, weaponentity);
+               W_CycleWeapon(this, CS(this).weaponorder_byimpulse, +1, weaponentity);
        else if(list == 2)
                W_CycleWeapon(this, CS(this).cvar_cl_weaponpriority, +1, weaponentity);
 }
index 772809d658dde2d8ad7c95bdbce39077634cf06b..a3898c627720059dbf6aecb3eef1c29e3a71c5aa 100644 (file)
@@ -30,8 +30,6 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect
        float nudge = 1; // added to traceline target and subtracted from result  TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        float oldsolid = ent.dphitcontentsmask;
        Weapon wep = DEATH_WEAPONOF(deathtype);
-    if (wep == WEP_Null)
-       wep = ent.(weaponentity).m_weapon; // TODO: don't fall back, if the attack isn't a weapon we don't want it to affect the user's held weapon!
        if(!IS_CLIENT(ent))
                antilag = false; // no antilag for non-clients!
        if (IS_PLAYER(ent) && (wep.spawnflags & WEP_FLAG_PENETRATEWALLS))
@@ -418,10 +416,10 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo
                        yoda = 0;
                        MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity));
                        damage = M_ARGV(4, float);
-                       float g = accuracy_isgooddamage(this, hit);
+                       bool gooddamage = accuracy_isgooddamage(this, hit);
                        Damage(hit, this, this, damage * solid_penetration_left, dtype, weaponentity, start, force * dir * solid_penetration_left);
                        // calculate hits for ballistic weapons
-                       if(g)
+                       if(gooddamage)
                        {
                                // do not exceed 100%
                                float added_damage = min(damage - total_damage, damage * solid_penetration_left);
index 09f9702dae32cab5ea2568e2bcddc7b4569c8e8e..8f1457a034a07e6d4caf2edfdea024d68d55079a 100644 (file)
@@ -469,6 +469,10 @@ set sv_accuracy_data_send 1 "1 send weapon accuracy data statistics and improved
 set _independent_players 0 "DO NOT TOUCH"
 set _notarget 0 "NO, REALLY, DON'T"
 
+set debug_text_3d_default_align 0 "Default text alignment for debug_text_3d()"
+set debug_text_3d_default_duration 10 "Default duration for debug_text_3d()"
+set debug_text_3d_default_velocity "0 -10 0" "Default velocity for debug_text_3d() in screen coords (X and Y from top left)"
+
 // otherwise, antilag breaks
 sv_gameplayfix_consistentplayerprethink 1
 
@@ -551,3 +555,5 @@ set sv_simple_items 1 "allow or forbid client use of simple items"
 set sv_showspectators 1 "Show who's spectating who in the player info panel when client has cl_showspectators on. Shouldn't be used on competitive servers, also disable when watching a suspected cheater"
 
 set sv_damagetext 2 "<= 0: disabled, >= 1: visible to spectators, >= 2: visible to attacker, >= 3: all players see everyone's damage"
+
+set sv_showfps 5 "Show player's FPS counters in the scoreboard. This setting acts as a delay in seconds between updates"