]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into martin-t/rpc-acc
authorMartin Taibr <taibr.martin@gmail.com>
Fri, 2 Mar 2018 21:03:20 +0000 (22:03 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Fri, 2 Mar 2018 21:03:20 +0000 (22:03 +0100)
80 files changed:
.gitlab-ci.yml
.tx/merge-base
commands.cfg
common.cs.po
common.gd.po
common.ru.po
gfx/menu/luma/skinvalues.txt
gfx/menu/luminos/skinvalues.txt
gfx/menu/wickedx/skinvalues.txt
gfx/menu/xaw/skinvalues.txt
languages.txt
qcsrc/client/main.qc
qcsrc/client/view.qc
qcsrc/common/debug.qh
qcsrc/common/mapinfo.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc
qcsrc/common/stats.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/warpzone/server.qc
qcsrc/menu/anim/animation.qc
qcsrc/menu/anim/animation.qh
qcsrc/menu/command/menu_cmd.qc
qcsrc/menu/draw.qc
qcsrc/menu/item.qc
qcsrc/menu/item.qh
qcsrc/menu/item/button.qc
qcsrc/menu/item/button.qh
qcsrc/menu/item/container.qc
qcsrc/menu/item/container.qh
qcsrc/menu/item/image.qc
qcsrc/menu/item/inputbox.qc
qcsrc/menu/item/inputbox.qh
qcsrc/menu/item/inputcontainer.qc
qcsrc/menu/item/inputcontainer.qh
qcsrc/menu/item/listbox.qc
qcsrc/menu/item/listbox.qh
qcsrc/menu/item/nexposee.qc
qcsrc/menu/item/nexposee.qh
qcsrc/menu/item/slider.qc
qcsrc/menu/item/slider.qh
qcsrc/menu/skin-customizables.inc
qcsrc/menu/xonotic/_mod.inc
qcsrc/menu/xonotic/_mod.qh
qcsrc/menu/xonotic/colorpicker.qc
qcsrc/menu/xonotic/colorpicker.qh
qcsrc/menu/xonotic/colorpicker_string.qc
qcsrc/menu/xonotic/colorpicker_string.qh
qcsrc/menu/xonotic/dialog_settings_game.qc
qcsrc/menu/xonotic/dialog_settings_game.qh
qcsrc/menu/xonotic/listbox.qh
qcsrc/menu/xonotic/picker.qc
qcsrc/menu/xonotic/picker.qh
qcsrc/menu/xonotic/screenshotimage.qc
qcsrc/menu/xonotic/screenshotimage.qh
qcsrc/menu/xonotic/scrollpanel.qc [new file with mode: 0644]
qcsrc/menu/xonotic/scrollpanel.qh [new file with mode: 0644]
qcsrc/menu/xonotic/slider.qh
qcsrc/menu/xonotic/statslist.qc
qcsrc/menu/xonotic/textslider.qh
qcsrc/server/autocvars.qh
qcsrc/server/client.qc
qcsrc/server/client.qh
qcsrc/server/command/vote.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/events.qh
qcsrc/server/mutators/mutator/gamemode_ca.qc
qcsrc/server/player.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..946c98fc60de9289488e12b541a279166d439105 100644 (file)
@@ -1 +1 @@
-Wed Feb 14 07:23:42 CET 2018
+Fri Mar  2 07:24:40 CET 2018
index 66ca90e2aa25dcb0aab5f659ba07b2c722b2e44b..79366e4b703af1967b2ef20e8a1299536d4d9974 100644 (file)
@@ -302,6 +302,11 @@ set sv_vote_command_restriction_movetoyellow "1;"
 set sv_vote_command_restriction_movetopink "1;"
 set sv_vote_command_restriction_movetospec "1;"
 
+// help messages for votes that aren't implemeneted in the game code
+// examples used here are based on the usage output of implemented votes
+set sv_vote_command_help_restart "\nUsage:^3 vcall restart\n^7  No arguments required."
+set sv_vote_command_help_gotomap "\nUsage:^3 vcall gotomap mapname\n^7  Where 'mapname' is the name of the map to go to.\n  Type ^3lsmaps^7 to get a list of available maps to vote for."
+
 // =================================
 //  voting - server/command/vote.qc
 // =================================
@@ -337,7 +342,7 @@ alias vabstain  "qc_cmd_cmd vote abstain"
 
 // aliases for both client and server
 alias vcall     "qc_cmd_svcmd vote call ${* ?}"
-alias vhelp     "qc_cmd_svcmd vote help"
+alias vhelp     "qc_cmd_svcmd vote help ${* ?}"
 alias vstatus   "qc_cmd_svcmd vote status"
 alias vstop     "qc_cmd_svcmd vote stop"
 
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..55e03f10515b2b5e465e55c1187d4ecd3ea7b362 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-01 20:50+0000\n"
 "Last-Translator: Andrei Stepanov\n"
 "Language-Team: Russian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ru/)\n"
@@ -107,7 +107,7 @@ msgstr "вторичный огонь"
 #: 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ало Ð¸Ð³Ñ\80Ñ\8b Ñ\87еÑ\80ез ^3%d^1 Ñ\81екÑ\83нд"
+msgstr "^1СÑ\82аÑ\80Ñ\82 Ð¸Ð³Ñ\80Ñ\8b Ñ\87еÑ\80ез ^3%d^1 Ñ\81екÑ\83нд(Ñ\8b)"
 
 #: 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
@@ -1076,7 +1078,7 @@ msgstr "км/ч"
 
 #: qcsrc/client/main.qc:1020
 msgid " mph"
-msgstr "милÑ\8f/ч"
+msgstr "милÑ\8c/ч"
 
 #: qcsrc/client/main.qc:1022
 msgid " knots"
@@ -1111,7 +1113,7 @@ msgstr "Голосование за карту"
 #: qcsrc/client/mapvoting.qc:382
 #, c-format
 msgid "%d seconds left"
-msgstr "Осталось %d секунд"
+msgstr "Осталось %d секунд(ы)"
 
 #: qcsrc/client/mapvoting.qc:497
 msgid ""
@@ -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 Флаг был возвращен на базу владельцем"
+msgstr "^BG ^TC^TT^BG Флаг был возвращён на базу владельцем"
 
 #: qcsrc/common/notifications/all.inc:247
 msgid "^BGThe flag was returned by its owner"
-msgstr "^BGФлаг был возвращен на базу владельцем"
+msgstr "^BGФлаг был возвращён на базу владельцем"
 
 #: 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"
@@ -2045,7 +2047,7 @@ 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 Ð±Ñ\8bл Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð´Ð¿Ð°Ð»Ñ\91н Ð¸Ð· ^BG%s^K1^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:278
 #, c-format
@@ -2070,7 +2072,7 @@ 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
@@ -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,42 +2158,42 @@ 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"
+"^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
@@ -2278,7 +2278,7 @@ 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 Ð±Ñ\8bл Ñ\80аздавлен Ð¨Ð°Ð¼Ð±Ð»ÐµÑ\80ом%s%s"
 
 #: qcsrc/common/notifications/all.inc:318
 #, c-format
@@ -2293,7 +2293,7 @@ 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 был поражён огненым шаром Виверна%s%s"
+msgstr "^BG%s^K1 был поражён огненным шаром Виверна%s%s"
 
 #: qcsrc/common/notifications/all.inc:321
 #, c-format
@@ -2355,7 +2355,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
@@ -2395,7 +2395,7 @@ msgstr "^BG%s^K1 был разорван в клочья турелью еМоб
 #: 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
@@ -2435,22 +2435,22 @@ msgstr "^BG%s^K1 был убит электрическим током туре
 #: 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 был пронзён турелью Walker'а%s%s"
+msgstr "^BG%s^K1 был пронзён турелью Ходуна%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
@@ -2460,32 +2460,32 @@ msgstr "^BG%s^K1 был раздавлен весом тяжёлой машин
 #: 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
@@ -2551,7 +2551,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 +2567,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 +2585,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 +2624,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 +2640,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 +2656,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
@@ -2749,13 +2749,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 +2828,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
@@ -2909,12 +2909,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 +2934,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
@@ -2979,37 +2979,37 @@ msgstr "^BG%s^K1 забыл о своей зажигательной мине ds
 #: 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,43 +3058,44 @@ 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
@@ -3126,8 +3127,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
@@ -3147,12 +3147,12 @@ msgstr "^BG%s%s^K1 был отшлёпан ^BG%s^K1 огромной Шоков
 #: 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
@@ -3206,7 +3206,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 +3295,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 +3344,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 +3381,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 +3393,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 +3425,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 +3435,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 +3462,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 +3535,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 +3555,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 +3596,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 +3604,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 +3624,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 +3653,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 +3676,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 +3738,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"
@@ -3974,7 +3970,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"
@@ -3994,7 +3990,7 @@ msgstr "^F2Гонка окончена, завершите ваш круг!"
 
 #: qcsrc/common/notifications/all.inc:764
 msgid "^BGSecondary fire inflicts no damage!"
-msgstr "^BGÐ\90лÑ\8cÑ\82еÑ\80наÑ\82ивный режим огня не наносит урона!"
+msgstr "^BGÐ\92Ñ\82оÑ\80иÑ\87ный режим огня не наносит урона!"
 
 #: qcsrc/common/notifications/all.inc:766
 msgid "^BGSequence completed!"
@@ -4002,7 +3998,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 +4027,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 +4039,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 +4053,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
@@ -4091,7 +4087,7 @@ msgstr "основной"
 
 #: qcsrc/common/notifications/all.qh:407 qcsrc/common/notifications/all.qh:408
 msgid "secondary"
-msgstr "алÑ\8cÑ\82еÑ\80наÑ\82ивный"
+msgstr "вÑ\82оÑ\80иÑ\87ный"
 
 #: qcsrc/common/notifications/all.qh:410
 msgid "point"
@@ -4154,7 +4150,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 +4169,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 +4178,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 +4192,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 +4206,7 @@ msgstr "%s^K1 предрекает АРМАГЕДДОН! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:450
 msgid "ARMAGEDDON! "
-msgstr "АРМАГЕДДОН!"
+msgstr "АРМАГЕДДОН! "
 
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
@@ -4380,7 +4376,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 +4397,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 +4470,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 +4519,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 +4906,7 @@ msgstr "Код игры"
 
 #: qcsrc/menu/xonotic/credits.qc:116
 msgid "Marketing / PR"
-msgstr "Маркетинг / Cвязи с общественностью"
+msgstr "Маркетинг / Связи с общественностью"
 
 #: qcsrc/menu/xonotic/credits.qc:122
 msgid "Legal"
@@ -5297,7 +5293,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 +5425,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 +5445,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 +5535,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 +5639,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 +5704,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 +5897,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 +5905,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 +5921,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 +5937,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 +5949,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 +6074,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 +6132,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 +6159,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 +6174,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 +6304,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 +6345,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епенного "
-"огнÑ\8f Ð½Ðµ Ð½Ð°Ð½Ð¾Ñ\81иÑ\82 Ñ\83Ñ\80она, Ð½Ð¾ Ð¾Ð½ Ñ\85оÑ\80оÑ\88 Ð´Ð»Ñ\8f Ð¿Ñ\80Ñ\8bжка."
+"Ñ\81екÑ\83нд, Ñ\87Ñ\82обÑ\8b Ð½Ð°Ð¹Ñ\82и ÐµÑ\89Ñ\91, Ð¸Ð½Ð°Ñ\87е Ð¾Ð½ Ð²Ñ\81Ñ\82Ñ\80еÑ\82иÑ\82 Ñ\81меÑ\80Ñ\82Ñ\8c. Ð ÐµÐ¶Ð¸Ð¼ Ð²Ñ\82оÑ\80иÑ\87ного Ð¾Ð³Ð½Ñ\8f Ð½Ðµ "
+"наноÑ\81иÑ\82 Ñ\83Ñ\80она, Ð½Ð¾ Ð¾Ð½ Ñ\85оÑ\80оÑ\88 Ð´Ð»Ñ\8f Ñ\82Ñ\80Ñ\8eков."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
 msgid ""
@@ -6359,9 +6354,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 +6398,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 +6798,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 +7023,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 +7246,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 +7290,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 +7302,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 +7314,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 +7396,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 +7418,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 +7431,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 +7470,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 +7482,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 +7594,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 +7757,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 +7851,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 +7871,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 +7888,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 +7948,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 +8025,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 +8054,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 +8063,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 +8078,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 +8172,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 +8184,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 +8192,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 +8227,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 +8249,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 +8325,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 +8365,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 +8397,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 +8419,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 +8463,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 +8474,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 +8486,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 +8546,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 +8569,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 +8579,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 +8621,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 +8633,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 +8641,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 +8657,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 +8665,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 +8763,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 +8780,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 +8805,7 @@ msgstr "Уровень сложности:"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
 msgid "CSKL^Easy"
-msgstr "Легкий"
+msgstr "Лёгкий"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
 msgid "CSKL^Medium"
@@ -8842,7 +8837,7 @@ msgstr "присоединиться к 'лучшей' команде (авто
 
 #: 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 +8957,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 +8965,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 +9013,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 +9043,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 +9056,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 +9315,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 +9340,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 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..8c037dc23d9dc22198d495b4a1abad8a2e042ce5 100644 (file)
@@ -1,21 +1,24 @@
 ast   Asturian "Asturianu" 73%
-de    German "Deutsch" 99%
-de_CH German "Deutsch (Schweiz)" 99%
+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%
-hu    Hungarian "Magyar" 55%
-nl    Dutch "Nederlands" 70%
-pl    Polish "Polski" 81%
-pt    Portuguese "Português" 99%
+fr    French "Français"
+ga    Irish "Irish" 32%
+it    Italian "Italiano"
+hu    Hungarian "Magyar" 53%
+nl    Dutch "Nederlands" 67%
+pl    Polish "Polski" 80%
+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%
-sr    Serbian "Српски" 71%
-uk    Ukrainian "Українська" 57%
+fi    Finnish "Suomi" 31%
+zh_CN "Chinese (China)" "中文" 47%
+zh_TW "Chinese (Taiwan)" "國語" 67%
+ko    Korean "한국의" 32%
+el    Greek "Ελληνική" 32%
+be    Belarusian "Беларуская" 59%
+bg    Bulgarian "Български" 66%
+ru    Russian "Русский"
+sr    Serbian "Српски" 69%
+uk    Ukrainian "Українська" 57%
\ No newline at end of file
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..9bfa8db9ad0d6e51590150d28896883626528716 100644 (file)
@@ -1393,8 +1393,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 +1404,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 +1418,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);
                }
 
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 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 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 a4b9b1826b1ce833adf464ea952106bf4f9b6050..b25175aea5ad9055355fd508b0ba238fad97673a 100644 (file)
@@ -1,4 +1,4 @@
-string autocvar_g_offhand_blaster;
+string autocvar_g_offhand_blaster = "0";
 
 REGISTER_MUTATOR(offhand_blaster, expr_evaluate(autocvar_g_offhand_blaster));
 
index 69d3a4f583326714cc89f44f23fe2d097f3a993d..db681315a6c4d27b3d804f5fb4a90bc13bf7e196 100644 (file)
@@ -299,6 +299,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 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 6a115baf1458cbd52586d49aebe1ea6d07545bbc..21ca117f4c4ec89980bbb60f9e34e3c4b88a549c 100644 (file)
@@ -1276,6 +1276,7 @@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew)
                                this.beam_muzzlelight[1] = 1;
                                this.beam_muzzlelight[2] = 1;
                                this.beam_muzzlelight[3] = 1;
+                               this.beam_image = "particles/lgbeam";
                                if(this.beam_muzzleeffect)
                                {
                                        setmodel(flash, MDL_ARC_MUZZLEFLASH);
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 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 18e5ae08123ff999f479c896f2eadc79de4972d6..e727b39e6446acbb10e8745c5b0a5bb93d3fcdea 100644 (file)
@@ -48,6 +48,7 @@ void GameCommand(string theCommand)
                LOG_INFO(_("Usage: menu_cmd command..., where possible commands are:"));
                LOG_INFO(_("  sync - reloads all cvars on the current menu page"));
                LOG_INFO(_("  directmenu ITEM - select a menu item as main item"));
+               LOG_INFO(_("  dumptree - dump the state of the menu as a tree to the console"));
 
                LOG_INFO("Generic commands shared by all programs:");
                GenericCommand_macro_help();
index 01184a4bf5d026e2c5c0580c8ef625e07610772a..ae6967e367565fc02c38f08f57c77ac0ccca706d 100644 (file)
@@ -312,32 +312,55 @@ float draw_CondensedFontFactor(string theText, float ICanHasKallerz, vector Size
        return 1.0;
 }
 
-float draw_clipSet;
+IntrusiveList draw_clip;
+STATIC_INIT(draw_clip) { draw_clip = IL_NEW(); }
+CLASS(ClipFrame, Object)
+       ATTRIB(ClipFrame, clip_shift, vector, '0 0 0');
+       ATTRIB(ClipFrame, clip_scale, vector, '0 0 0');
+ENDCLASS(ClipFrame)
+
+void _draw_SetClip(vector o, vector s)
+{
+       ClipFrame prev = IL_PEEK(draw_clip);
+       if (prev) {
+               o.x = bound(prev.clip_shift.x, o.x, prev.clip_shift.x + prev.clip_scale.x);
+               o.y = bound(prev.clip_shift.y, o.y, prev.clip_shift.y + prev.clip_scale.y);
+               s.x = bound(0, s.x, prev.clip_scale.x - (o.x - prev.clip_shift.x));
+               s.y = bound(0, s.y, prev.clip_scale.y - (o.y - prev.clip_shift.y));
+       }
+       ClipFrame e = NEW(ClipFrame);
+       e.clip_shift = o;
+       e.clip_scale = s;
+       IL_PUSH(draw_clip, e);
+       drawsetcliparea(o.x, o.y, s.x, s.y);
+}
+
 void draw_SetClip()
 {
-       if(draw_clipSet)
-               error("Already clipping, no stack implemented here, sorry");
-       drawsetcliparea(draw_shift.x, draw_shift.y, draw_scale.x, draw_scale.y);
-       draw_clipSet = 1;
+       _draw_SetClip(draw_shift, draw_scale);
 }
 
 void draw_SetClipRect(vector theOrigin, vector theScale)
 {
-       vector o, s;
-       if(draw_clipSet)
-               error("Already clipping, no stack implemented here, sorry");
-       o = boxToGlobal(theOrigin, draw_shift, draw_scale);
-       s = boxToGlobalSize(theScale, draw_scale);
-       drawsetcliparea(o.x, o.y, s.x, s.y);
-       draw_clipSet = 1;
+       _draw_SetClip(
+               boxToGlobal(theOrigin, draw_shift, draw_scale),
+               boxToGlobalSize(theScale, draw_scale)
+       );
 }
 
 void draw_ClearClip()
 {
-       if(!draw_clipSet)
-               error("Not clipping, can't clear it then");
+       if (IL_EMPTY(draw_clip)) {
+               LOG_FATAL("Not clipping, can't clear it then");
+       }
+       entity currentSettings = IL_PEEK(draw_clip);
+       IL_REMOVE(draw_clip, currentSettings);
+       delete(currentSettings);
        drawresetcliparea();
-       draw_clipSet = 0;
+       ClipFrame e = IL_PEEK(draw_clip);
+       if (e) {
+               drawsetcliparea(e.clip_shift.x, e.clip_shift.y, e.clip_scale.x, e.clip_scale.y);
+       }
 }
 
 string draw_TextShortenToWidth(string theText, float maxWidth, float ICanHasKallerz, vector SizeThxBye)
index 1d31e95a9c7d5c513ea9f2766da4c574a1d7eca3..a5c7cfa8544c70219099a4a12079b7a87dd5a408 100644 (file)
@@ -74,9 +74,9 @@
                return 0;  // unhandled
        }
 
-       METHOD(Item, mousePress, float(Item this, vector pos))
+       METHOD(Item, mousePress, bool(Item this, vector pos))
        {
-               return 0;  // unhandled
+               return false;  // unhandled
        }
 
        METHOD(Item, mouseDrag, float(Item this, vector pos))
index a5df526806e851e7777f0e6792de627881a46145..6cee17b3fdd5f9ccd24a66d078f040aaee9110a2 100644 (file)
@@ -10,7 +10,7 @@ CLASS(Item, Object)
        METHOD(Item, keyDown, float(Item, float, float, float));
        METHOD(Item, keyUp, float(Item, float, float, float));
        METHOD(Item, mouseMove, float(Item, vector));
-       METHOD(Item, mousePress, float(Item, vector));
+       METHOD(Item, mousePress, bool(Item this, vector pos));
        METHOD(Item, mouseDrag, float(Item, vector));
        METHOD(Item, mouseRelease, float(Item, vector));
        METHOD(Item, focusEnter, void(Item));
index 8299a6859f539c097404e15184437e0903b44c4f..77e4ccad264fee8f912abdb8573ba154af71289c 100644 (file)
                if (pos.y >= 1) me.pressed = 0;
                return 1;
        }
-       float Button_mousePress(entity me, vector pos)
+       METHOD(Button, mousePress, bool(Button this, vector pos))
        {
-               me.mouseDrag(me, pos);  // verify coordinates
-               return 1;
+               this.mouseDrag(this, pos);  // verify coordinates
+               return true;
        }
        float Button_mouseRelease(entity me, vector pos)
        {
index 1a164245c8f269368067b3b43c4ae6f92fd9066f..2077da70071c5b680c55e6ac83b10838b83bf2a4 100644 (file)
@@ -9,7 +9,7 @@ CLASS(Button, Label)
        METHOD(Button, showNotify, void(entity));
        METHOD(Button, resizeNotify, void(entity, vector, vector, vector, vector));
        METHOD(Button, keyDown, float(entity, float, float, float));
-       METHOD(Button, mousePress, float(entity, vector));
+       METHOD(Button, mousePress, bool(Button this, vector pos));
        METHOD(Button, mouseDrag, float(entity, vector));
        METHOD(Button, mouseRelease, float(entity, vector));
        METHOD(Button, playClickSound, void(entity));
index 56535bf71c18f5ddd24202dc534642568948c1c2..329ddf0f6e201c880a09883f0fdc3af296e78dce 100644 (file)
                }
                return 0;
        }
-       float Container_mousePress(entity me, vector pos)
+       METHOD(Container, mousePress, bool(Container this, vector pos))
        {
-               entity f;
-               float r;
-               f = me.focusedChild;
+               entity f = this.focusedChild;
                if (f)
                {
-                       me.enterSubitem(me, f);
-                       r = f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
-                       me.leaveSubitem(me);
+                       this.enterSubitem(this, f);
+                       bool r = f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
+                       this.leaveSubitem(this);
                        return r;
                }
-               return 0;
+               return false;
        }
        float Container_mouseDrag(entity me, vector pos)
        {
                                me.focusedChild.focused = 1;
                                me.focusedChild.focusEnter(me.focusedChild);
 
-                               if (me.focusedChild.instanceOfContainer) me.focusedChild.setFocus(me.focusedChild, me.focusedChild.savedFocus);
+                               if (me.focusedChild.instanceOfContainer)
+                                       me.focusedChild.setFocus(me.focusedChild, me.focusedChild.savedFocus);
                        }
                        else
                        {
index 8273f5ddde38a43ec3e153d3a5f02247f452a775..b73752685030a8ef57277ddaf3a3b7b7279f26f1 100644 (file)
@@ -7,7 +7,7 @@ CLASS(Container, Item)
        METHOD(Container, keyUp, float(entity, float, float, float));
        METHOD(Container, keyDown, float(entity, float, float, float));
        METHOD(Container, mouseMove, float(entity, vector));
-       METHOD(Container, mousePress, float(entity, vector));
+       METHOD(Container, mousePress, bool(Container this, vector pos));
        METHOD(Container, mouseDrag, float(entity, vector));
        METHOD(Container, mouseRelease, float(entity, vector));
        METHOD(Container, focusLeave, void(entity));
index 59405ec169f15448df4e7f028c67b8e43ef56c0b..73b302c4a7716a6e7f7b363b030a3d46ff7058a8 100644 (file)
 
        void Image_draw(entity me)
        {
-               if (me.imgSize.x > 1 || me.imgSize.y > 1) draw_SetClip();
+               bool willClip = me.imgSize.x > 1 || me.imgSize.y > 1;
+               if (willClip) draw_SetClip();
                draw_Picture(me.imgOrigin, me.src, me.imgSize, me.color, 1);
-               if (me.imgSize.x > 1 || me.imgSize.y > 1) draw_ClearClip();
+               if (willClip) draw_ClearClip();
                SUPER(Image).draw(me);
        }
        void Image_updateAspect(entity me)
index 6f7ed9f24309b7d7556d5d594144acf642198a83..a418dc2ce0fffa7b761fff860ebe8f950dbb09bf 100644 (file)
                return 1;
        }
 
-       float InputBox_mousePress(entity me, vector pos)
+       METHOD(InputBox, mousePress, bool(InputBox this, vector pos))
        {
-               if (me.enableClearButton)
-                       if (over_ClearButton(me, pos))
+               if (this.enableClearButton)
+                       if (over_ClearButton(this, pos))
                        {
-                               me.cb_pressed = 1;
-                               return 1;
+                               this.cb_pressed = 1;
+                               return true;
                        }
-               me.dragScrollTimer = time;
-               me.pressed = 1;
-               return InputBox_mouseDrag(me, pos);
+               this.dragScrollTimer = time;
+               this.pressed = 1;
+               return InputBox_mouseDrag(this, pos);
        }
 
        float InputBox_mouseRelease(entity me, vector pos)
index e3eede653b9c0c297bf698b36ed1b4108ae5035b..5b0c28f9e454d49eb6990e9cd694abe845f8e4dd 100644 (file)
@@ -9,7 +9,7 @@ CLASS(InputBox, Label)
        METHOD(InputBox, keyDown, float(entity, float, float, float));
        METHOD(InputBox, mouseMove, float(entity, vector));
        METHOD(InputBox, mouseRelease, float(entity, vector));
-       METHOD(InputBox, mousePress, float(entity, vector));
+       METHOD(InputBox, mousePress, bool(InputBox this, vector pos));
        METHOD(InputBox, mouseDrag, float(entity, vector));
        METHOD(InputBox, showNotify, void(entity));
        METHOD(InputBox, resizeNotify, void(entity, vector, vector, vector, vector));
index 37c46240f77fdcd8bf704b1b6d999aaa3de5e254..cda342677262206dd8afb2bcdb011f136ed2edc9 100644 (file)
                if (e && !e.focusable) e = NULL;
                entity prev = this.mouseFocusedChild;
                this.mouseFocusedChild = e;
-               if (!e) return false;  // keep focus when hovering over non-focusable elements
                if (e != prev)
                {
                        this.setFocus(this, e);
-                       if (e.instanceOfInputContainer)
+                       if (e && e.instanceOfInputContainer)
                        {
                                e.focusedChild = NULL;
                                e._changeFocusXY(e, globalToBox(pos, e.Container_origin, e.Container_size));
                if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;
                return 0;
        }
-       float InputContainer_mousePress(entity me, vector pos)
+       METHOD(InputContainer, mousePress, bool(InputContainer this, vector pos))
        {
-               me.mouseFocusedChild = NULL;  // force focusing
-               if (me._changeFocusXY(me, pos))
-                       if (SUPER(InputContainer).mousePress(me, pos)) return 1;
-               if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;
-               return 0;
+               this.mouseFocusedChild = NULL;  // force focusing
+               if (this._changeFocusXY(this, pos))
+                       if (SUPER(InputContainer).mousePress(this, pos)) return true;
+               if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return true;
+               return false;
        }
        float InputContainer_mouseRelease(entity me, vector pos)
        {
index 9ae4a537506bcad1a54fb7721b7816dd74685d35..8ded2e657bcba13f3a7f594c078d6dafceee4043 100644 (file)
@@ -4,7 +4,7 @@
 CLASS(InputContainer, Container)
        METHOD(InputContainer, keyDown, float(entity, float, float, float));
        METHOD(InputContainer, mouseMove, float(entity, vector));
-       METHOD(InputContainer, mousePress, float(entity, vector));
+       METHOD(InputContainer, mousePress, bool(InputContainer this, vector pos));
        METHOD(InputContainer, mouseRelease, float(entity, vector));
        METHOD(InputContainer, mouseDrag, float(entity, vector));
        METHOD(InputContainer, focusLeave, void(entity));
index aa10c20b3b0f6d04bac8d5810e8b53b74bb799f2..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
                }
                return 1;
        }
-       float ListBox_mousePress(entity me, vector pos)
+       METHOD(ListBox, mousePress, bool(ListBox this, vector pos))
        {
-               if (pos.x < 0) return 0;
-               if (pos.y < 0) return 0;
-               if (pos.x >= 1) return 0;
-               if (pos.y >= 1) return 0;
-               me.dragScrollPos = pos;
-               me.updateControlTopBottom(me);
-               if (pos.x >= 1 - me.controlWidth)
+               if (pos.x < 0) return false;
+               if (pos.y < 0) return false;
+               if (pos.x >= 1) return false;
+               if (pos.y >= 1) return false;
+               this.dragScrollPos = pos;
+               this.updateControlTopBottom(this);
+               if (pos.x >= 1 - this.controlWidth)
                {
-                       // if hit, set me.pressed, otherwise scroll by one page
-                       if (pos.y < me.controlTop)
+                       // if hit, set this.pressed, otherwise scroll by one page
+                       if (pos.y < this.controlTop)
                        {
                                // page up
-                               me.scrollPosTarget = max(me.scrollPosTarget - 1, 0);
+                               this.scrollPosTarget = max(this.scrollPosTarget - 1, 0);
                        }
-                       else if (pos.y > me.controlBottom)
+                       else if (pos.y > this.controlBottom)
                        {
                                // page down
-                               me.scrollPosTarget = min(me.scrollPosTarget + 1, me.getTotalHeight(me) - 1);
+                               this.scrollPosTarget = min(this.scrollPosTarget + 1, this.getTotalHeight(this) - 1);
                        }
                        else
                        {
-                               me.pressed = 1;
-                               me.pressOffset = pos.y;
-                               me.previousValue = me.scrollPos;
+                               this.pressed = 1;
+                               this.pressOffset = pos.y;
+                               this.previousValue = this.scrollPos;
                        }
                }
                else
                {
                        // continue doing that while dragging (even when dragging outside). When releasing, forward the click to the then selected item.
-                       me.pressed = 2;
+                       this.pressed = 2;
                        // an item has been clicked. Select it, ...
-                       me.setSelected(me, me.getItemAtPos(me, me.scrollPos + pos.y));
-                       me.setFocusedItem(me, me.selectedItem);
+                       this.setSelected(this, this.getItemAtPos(this, this.scrollPos + pos.y));
+                       this.setFocusedItem(this, this.selectedItem);
                }
-               return 1;
+               return true;
        }
        void ListBox_setFocusedItem(entity me, int item)
        {
        AUTOCVAR(menu_scroll_averaging_time_pressed, float, 0.06, "smooth scroll averaging time when dragging the scrollbar");
        void ListBox_draw(entity me)
        {
-               float i;
-               vector absSize, fillSize = '0 0 0';
-               vector oldshift, oldscale;
+               vector fillSize = '0 0 0';
 
                // we can't do this in mouseMove as the list can scroll without moving the cursor
                if (me.mouseMoveOffset != -1) me.setFocusedItem(me, me.getItemAtPos(me, me.scrollPos + me.mouseMoveOffset));
                        }
                }
                draw_SetClip();
-               oldshift = draw_shift;
-               oldscale = draw_scale;
+               vector oldshift = draw_shift;
+               vector oldscale = draw_scale;
 
-               i = me.getItemAtPos(me, me.scrollPos);
-               float j = me.getItemStart(me, i) - me.scrollPos;
-               for ( ; i < me.nItems && j < 1; ++i)
+               int i = me.getItemAtPos(me, me.scrollPos);
+               float y = me.getItemStart(me, i) - me.scrollPos;
+               for ( ; i < me.nItems && y < 1; ++i)
                {
-                       draw_shift = boxToGlobal(eY * j, oldshift, oldscale);
+                       draw_shift = boxToGlobal(eY * y, oldshift, oldscale);
                        vector relSize = eX * (1 - me.controlWidth) + eY * me.getItemHeight(me, i);
-                       absSize = boxToGlobalSize(relSize, me.size);
+                       vector absSize = boxToGlobalSize(relSize, me.size);
                        draw_scale = boxToGlobalSize(relSize, oldscale);
                        me.drawListBoxItem(me, i, absSize, (me.selectedItem == i), (me.focusedItem == i));
-                       j += relSize.y;
+                       y += relSize.y;
                }
                draw_ClearClip();
 
index 56fda91cc15d82e163e362e9a250c38a8c1bb525..b3f5164a4d0937f769a55c68fb9cfbf474b07a99 100644 (file)
@@ -7,7 +7,7 @@ CLASS(ListBox, Item)
        METHOD(ListBox, draw, void(entity));
        METHOD(ListBox, keyDown, float(entity, float, float, float));
        METHOD(ListBox, mouseMove, float(entity, vector));
-       METHOD(ListBox, mousePress, float(entity, vector));
+       METHOD(ListBox, mousePress, bool(ListBox this, vector pos));
        METHOD(ListBox, mouseDrag, float(entity, vector));
        METHOD(ListBox, mouseRelease, float(entity, vector));
        METHOD(ListBox, focusLeave, void(entity));
index c0f18cf859476eff528f0f9a9ebb10a1eee3acdd..d42fceb533a787a35a340eaa517aa964e1843247 100644 (file)
@@ -154,35 +154,35 @@ LABEL(have_overlap)
                SUPER(Nexposee).draw(me);
        }
 
-       float Nexposee_mousePress(entity me, vector pos)
+       METHOD(Nexposee, mousePress, bool(Nexposee this, vector pos))
        {
-               if (me.animationState == 0)
+               if (this.animationState == 0)
                {
-                       me.mouseFocusedChild = NULL;
-                       Nexposee_mouseMove(me, pos);
-                       if (me.mouseFocusedChild)
+                       this.mouseFocusedChild = NULL;
+                       Nexposee_mouseMove(this, pos);
+                       if (this.mouseFocusedChild)
                        {
                                m_play_click_sound(MENU_SOUND_OPEN);
-                               me.animationState = 1;
-                               SUPER(Nexposee).setFocus(me, NULL);
+                               this.animationState = 1;
+                               SUPER(Nexposee).setFocus(this, NULL);
                        }
                        else
                        {
-                               me.close(me);
+                               this.close(this);
                        }
-                       return 1;
+                       return true;
                }
-               else if (me.animationState == 2)
+               else if (this.animationState == 2)
                {
-                       if (!(SUPER(Nexposee).mousePress(me, pos)))
+                       if (!(SUPER(Nexposee).mousePress(this, pos)))
                        {
                                m_play_click_sound(MENU_SOUND_CLOSE);
-                               me.animationState = 3;
-                               SUPER(Nexposee).setFocus(me, NULL);
+                               this.animationState = 3;
+                               SUPER(Nexposee).setFocus(this, NULL);
                        }
-                       return 1;
+                       return true;
                }
-               return 0;
+               return false;
        }
 
        float Nexposee_mouseRelease(entity me, vector pos)
index 4159648f974207260d502ab8efb4ad90907258f4..440413b5e59616332194103a7c6f1b30cb8f0649 100644 (file)
@@ -5,7 +5,7 @@ CLASS(Nexposee, Container)
        METHOD(Nexposee, draw, void(entity));
        METHOD(Nexposee, keyDown, float(entity, float, float, float));
        METHOD(Nexposee, keyUp, float(entity, float, float, float));
-       METHOD(Nexposee, mousePress, float(entity, vector));
+       METHOD(Nexposee, mousePress, bool(Nexposee this, vector pos));
        METHOD(Nexposee, mouseMove, float(entity, vector));
        METHOD(Nexposee, mouseRelease, float(entity, vector));
        METHOD(Nexposee, mouseDrag, float(entity, vector));
index 2e89bb68ee21e7356dcc906653a73c9a35b385c1..b569c3b0c4c228bec7d158f558129e21fded4f7c 100644 (file)
 
                return 1;
        }
-       float Slider_mousePress(entity me, vector pos)
+       METHOD(Slider, mousePress, bool(Slider this, vector pos))
        {
                float controlCenter;
-               if (me.disabled) return 0;
-               if (pos.x < 0) return 0;
-               if (pos.y < 0) return 0;
-               if (pos.x >= 1 - me.textSpace) return 0;
-               if (pos.y >= 1) return 0;
-               controlCenter = (me.value - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth) + 0.5 * me.controlWidth;
-               if (fabs(pos.x - controlCenter) <= 0.5 * me.controlWidth)
+               if (this.disabled) return false;
+               if (pos.x < 0) return false;
+               if (pos.y < 0) return false;
+               if (pos.x >= 1 - this.textSpace) return false;
+               if (pos.y >= 1) return false;
+               controlCenter = (this.value - this.valueMin) / (this.valueMax - this.valueMin) * (1 - this.textSpace - this.controlWidth) + 0.5 * this.controlWidth;
+               if (fabs(pos.x - controlCenter) <= 0.5 * this.controlWidth)
                {
-                       me.pressed = 1;
-                       me.pressOffset = pos.x - controlCenter;
-                       me.previousValue = me.value;
-                       // me.mouseDrag(me, pos);
+                       this.pressed = 1;
+                       this.pressOffset = pos.x - controlCenter;
+                       this.previousValue = this.value;
+                       // this.mouseDrag(this, pos);
                }
                else
                {
                        float clickValue, pageValue, inRange;
-                       clickValue = median(0, (pos.x - me.pressOffset - 0.5 * me.controlWidth) / (1 - me.textSpace - me.controlWidth), 1) * (me.valueMax - me.valueMin) + me.valueMin;
-                       inRange = (almost_in_bounds(me.valueMin, me.value, me.valueMax));
+                       clickValue = median(0, (pos.x - this.pressOffset - 0.5 * this.controlWidth) / (1 - this.textSpace - this.controlWidth), 1) * (this.valueMax - this.valueMin) + this.valueMin;
+                       inRange = (almost_in_bounds(this.valueMin, this.value, this.valueMax));
                        if (pos.x < controlCenter)
                        {
-                               pageValue = me.value - me.valuePageStep;
-                               if (me.valueStep) clickValue = floor(clickValue / me.valueStep) * me.valueStep;
+                               pageValue = this.value - this.valuePageStep;
+                               if (this.valueStep) clickValue = floor(clickValue / this.valueStep) * this.valueStep;
                                pageValue = max(pageValue, clickValue);
                        }
                        else
                        {
-                               pageValue = me.value + me.valuePageStep;
-                               if (me.valueStep) clickValue = ceil(clickValue / me.valueStep) * me.valueStep;
+                               pageValue = this.value + this.valuePageStep;
+                               if (this.valueStep) clickValue = ceil(clickValue / this.valueStep) * this.valueStep;
                                pageValue = min(pageValue, clickValue);
                        }
-                       if (inRange) me.setValue(me, median(me.valueMin, pageValue, me.valueMax));
-                       else me.setValue(me, me.valueMax);
-                       if(me.applyButton)
-                               me.applyButton.disabled = false;
+                       if (inRange) this.setValue(this, median(this.valueMin, pageValue, this.valueMax));
+                       else this.setValue(this, this.valueMax);
+                       if(this.applyButton)
+                               this.applyButton.disabled = false;
                        if (pageValue == clickValue)
                        {
-                               controlCenter = (me.value - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth) + 0.5 * me.controlWidth;
-                               me.pressed = 1;
-                               me.pressOffset = pos.x - controlCenter;
-                               me.previousValue = me.value;
-                               // me.mouseDrag(me, pos);
+                               controlCenter = (this.value - this.valueMin) / (this.valueMax - this.valueMin) * (1 - this.textSpace - this.controlWidth) + 0.5 * this.controlWidth;
+                               this.pressed = 1;
+                               this.pressOffset = pos.x - controlCenter;
+                               this.previousValue = this.value;
+                               // this.mouseDrag(this, pos);
                        }
                }
-               return 1;
+               return true;
        }
        float Slider_mouseRelease(entity me, vector pos)
        {
index 3b7327788c0d130afb230471b076b8b8262587e9..b70d3880bae819100350f8aba68ff240e8367158 100644 (file)
@@ -10,7 +10,7 @@ CLASS(Slider, Label)
        METHOD(Slider, draw, void(entity));
        METHOD(Slider, keyDown, float(entity, float, float, float));
        METHOD(Slider, keyUp, float(entity, float, float, float));
-       METHOD(Slider, mousePress, float(entity, vector));
+       METHOD(Slider, mousePress, bool(Slider this, vector pos));
        METHOD(Slider, mouseDrag, float(entity, vector));
        METHOD(Slider, mouseRelease, float(entity, vector));
        METHOD(Slider, valueToText, string(entity, float));
@@ -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 577c8225803461225c818ce07f6cf396d1806f10..fd83718283928e45f0c77ad9d3af81cc62ad88d1 100644 (file)
@@ -98,6 +98,7 @@
 #include <menu/xonotic/rootdialog.qc>
 #include <menu/xonotic/screenshotimage.qc>
 #include <menu/xonotic/screenshotlist.qc>
+#include <menu/xonotic/scrollpanel.qc>
 #include <menu/xonotic/serverlist.qc>
 #include <menu/xonotic/skinlist.qc>
 #include <menu/xonotic/slider.qc>
index b6e34eff247606d774eb1d321fe9f7539071d3ff..f1644a2f5cfc0bb76657141f15d34dea80b340a8 100644 (file)
@@ -98,6 +98,7 @@
 #include <menu/xonotic/rootdialog.qh>
 #include <menu/xonotic/screenshotimage.qh>
 #include <menu/xonotic/screenshotlist.qh>
+#include <menu/xonotic/scrollpanel.qh>
 #include <menu/xonotic/serverlist.qh>
 #include <menu/xonotic/skinlist.qh>
 #include <menu/xonotic/slider.qh>
index 357276e16adf3794334eb7d640089b78350504ca..d8aedf69512a7349910fb0a0c6ba06e0009b6059 100644 (file)
@@ -16,10 +16,10 @@ void XonoticColorpicker_configureXonoticColorpicker(entity me, entity theTextbox
        me.configureImage(me, me.image);
 }
 
-float XonoticColorpicker_mousePress(entity me, vector coords)
+METHOD(XonoticColorpicker, mousePress, bool(XonoticColorpicker this, vector pos))
 {
-       me.mouseDrag(me, coords);
-       return 1;
+       this.mouseDrag(this, pos);
+       return true;
 }
 
 // must match hslimage.c
index b1c9d1e80ae566dd5a5dcddc8fb569f46bb3f3b3..149357dd9f2695065045d97edd6fb27be5b0d2ff 100644 (file)
@@ -3,7 +3,7 @@
 #include "../item/image.qh"
 CLASS(XonoticColorpicker, Image)
        METHOD(XonoticColorpicker, configureXonoticColorpicker, void(entity, entity));
-       METHOD(XonoticColorpicker, mousePress, float(entity, vector));
+       METHOD(XonoticColorpicker, mousePress, bool(XonoticColorpicker this, vector pos));
        METHOD(XonoticColorpicker, mouseRelease, float(entity, vector));
        METHOD(XonoticColorpicker, mouseDrag, float(entity, vector));
        ATTRIB(XonoticColorpicker, controlledTextbox, entity);
index 200204c00d131cc9fb3e62615215fd74a6577b1f..5a44e58830862c9e668185b3f21bda1bffadd076 100644 (file)
@@ -50,10 +50,10 @@ void XonoticColorpickerString_saveCvars(entity me)
                cvar_set(me.cvarName, sprintf("%v", hslimage_color(me.prevcoords, me.imagemargin)));
 }
 
-float XonoticColorpickerString_mousePress(entity me, vector coords)
+METHOD(XonoticColorpickerString, mousePress, bool(XonoticColorpickerString this, vector pos))
 {
-       me.mouseDrag(me, coords);
-       return 1;
+       this.mouseDrag(this, pos);
+       return true;
 }
 
 float XonoticColorpickerString_mouseDrag(entity me, vector coords)
index e990234b3f0a24779b9e3b40da6850b31299cd82..aa4a10c93a7d45a9583f4c8b57f671d135f20b81 100644 (file)
@@ -5,7 +5,7 @@
 #include "../item/image.qh"
 CLASS(XonoticColorpickerString, Image)
        METHOD(XonoticColorpickerString, configureXonoticColorpickerString, void(entity, string, string));
-       METHOD(XonoticColorpickerString, mousePress, float(entity, vector));
+       METHOD(XonoticColorpickerString, mousePress, bool(XonoticColorpickerString this, vector pos));
        METHOD(XonoticColorpickerString, mouseRelease, float(entity, vector));
        METHOD(XonoticColorpickerString, mouseDrag, float(entity, vector));
 
index d2ce368d1d0b225452230bfef96ff4770f540890..87134cb7812c15635247ec2799c21abf88c8a27e 100644 (file)
@@ -94,7 +94,9 @@ CONSTRUCTOR(XonoticRegisteredSettingsList, DataSource _source) {
 
 METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this))
 {
-    entity c = this.currentPanel;
+    entity s = this.currentPanel;
+    s.viewportHeight = 15.5;
+    entity c = s.currentPanel;
     entity removing = this.currentItem;
     DataSource data = this.topicList.source;
     entity adding = data.getEntry(data, this.topicList.selectedItem, func_null);
@@ -107,6 +109,7 @@ METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this))
         this.currentItem = adding;
         adding.resizeNotify(adding, '0 0 0', c.size, '0 0 0', c.size);
         c.addItem(c, adding, '0 0 0', '1 1 0', 1);
+               s.resizeNotify(s, '0 0 0', s.size, '0 0 0', s.size);
     }
 }
 METHOD(XonoticGameSettingsTab, fill, void(entity this))
index b9231642b18e9b016afb5277531a6e15fe1bea84..c9617f582f55fa01e9caefeb624cdbc54e9ae180 100644 (file)
@@ -32,13 +32,14 @@ CLASS(XonoticRegisteredSettingsList, XonoticListBox)
 ENDCLASS(XonoticRegisteredSettingsList)
 
 #include "tab.qh"
+#include "scrollpanel.qh"
 CLASS(XonoticGameSettingsTab, XonoticTab)
        ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9);
        ATTRIB(XonoticGameSettingsTab, rows, float, 15.5);
        ATTRIB(XonoticGameSettingsTab, columns, float, 6.5);
        ATTRIB(XonoticGameSettingsTab, source, DataSource, NEW(SettingSource));
        ATTRIB(XonoticGameSettingsTab, topicList, entity, NEW(XonoticRegisteredSettingsList, this.source));
-       ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticTab));
+       ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticScrollPanel));
        ATTRIB(XonoticGameSettingsTab, currentItem, entity);
        METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this));
        METHOD(XonoticGameSettingsTab, fill, void(entity this));
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 db302e9a8ca11b435bd9e6b2e7c006fcc05268b8..527697683218d87a2550f862ddd36b2a3dd67299 100644 (file)
@@ -39,17 +39,17 @@ float XonoticPicker_mouseDrag(entity me, vector coords)
        return me.mouseMove(me, coords);
 }
 
-float XonoticPicker_mousePress(entity me, vector coords)
+METHOD(XonoticPicker, mousePress, bool(XonoticPicker this, vector pos))
 {
-       me.mouseMove(me, coords);
+       this.mouseMove(this, pos);
 
-       if(me.focusedCell.x >= 0)
+       if(this.focusedCell.x >= 0)
        {
-               me.pressed = 1;
-               me.pressedCell = me.focusedCell;
+               this.pressed = 1;
+               this.pressedCell = this.focusedCell;
        }
 
-       return 1;
+       return true;
 }
 
 float XonoticPicker_mouseRelease(entity me, vector coords)
index b8e19cf19ebaedf19a3fcb0f440f877ae3006012..c98e9fc9b6fa8f082a3bd346dad51c48edd36048 100644 (file)
@@ -3,7 +3,7 @@
 #include "../item.qh"
 CLASS(XonoticPicker, Item)
        METHOD(XonoticPicker, configureXonoticPicker, void(entity));
-       METHOD(XonoticPicker, mousePress, float(entity, vector));
+       METHOD(XonoticPicker, mousePress, bool(XonoticPicker this, vector pos));
        METHOD(XonoticPicker, mouseRelease, float(entity, vector));
        METHOD(XonoticPicker, mouseMove, float(entity, vector));
        METHOD(XonoticPicker, mouseDrag, float(entity, vector));
index 42e168b4b58b2617d5978b7bce289bd8ac4a8131..8e8f3ccf738bd4f32de72be843b87510b558d8d8 100644 (file)
@@ -27,9 +27,9 @@ void XonoticScreenshotImage_load(entity me, string theImage)
        me.setZoom(me, 0, 0);
 }
 
-float XonoticScreenshotImage_mousePress(entity me, vector coords)
+METHOD(XonoticScreenshotImage, mousePress, bool(XonoticScreenshotImage this, vector pos))
 {
-       return me.drag_setStartPos(me, coords);
+       return this.drag_setStartPos(this, pos);
 }
 
 float XonoticScreenshotImage_mouseDrag(entity me, vector coords)
index 8920bed287f50fceed2527f56646d36a8599f812..c27a853377ce51eb18270adb6c7197e4811fb2e9 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticScreenshotImage, XonoticImage)
        METHOD(XonoticScreenshotImage, load, void(entity, string));
        METHOD(XonoticScreenshotImage, draw, void(entity));
        ATTRIB(XonoticScreenshotImage, focusable, float, 1);  // mousePress and mouseDrag work only if focusable is set
-       METHOD(XonoticScreenshotImage, mousePress, float(entity, vector));
+       METHOD(XonoticScreenshotImage, mousePress, bool(XonoticScreenshotImage this, vector pos));
        METHOD(XonoticScreenshotImage, mouseDrag, float(entity, vector));
        METHOD(XonoticScreenshotImage, mouseMove, float(entity, vector));
        METHOD(XonoticScreenshotImage, resizeNotify, void(entity, vector, vector, vector, vector));
diff --git a/qcsrc/menu/xonotic/scrollpanel.qc b/qcsrc/menu/xonotic/scrollpanel.qc
new file mode 100644 (file)
index 0000000..4543f0b
--- /dev/null
@@ -0,0 +1,46 @@
+#include "scrollpanel.qh"
+
+METHOD(XonoticScrollPanel, drawListBoxItem, void(XonoticScrollPanel this, int i, vector absSize, bool isSelected, bool isFocused))
+{
+       XonoticTab p = this.currentPanel;
+       p.draw(p);
+}
+
+METHOD(XonoticScrollPanel, resizeNotify, void(XonoticScrollPanel this, vector relOrigin, vector relSize, vector absOrigin, vector absSize))
+{
+       SUPER(XonoticScrollPanel).resizeNotify(this, relOrigin, relSize, absOrigin, absSize);
+       this.scrollToItem(this, 0);
+       XonoticTab p = this.currentPanel;
+       float m = p.firstChild.rows / this.viewportHeight;
+       this.itemHeight = m;
+       relSize.y *= m;
+       absSize.y *= m;
+       p.resizeNotify(p, relOrigin, relSize, absOrigin, absSize);
+}
+
+#define X(mouseFunc) \
+METHOD(XonoticScrollPanel, mouseFunc, bool(XonoticScrollPanel this, vector pos)) \
+{ \
+       SUPER(XonoticScrollPanel).mouseFunc(this, pos); \
+       XonoticTab p = this.currentPanel; \
+       this.setFocus(this, p); \
+       \
+       vector o = -eY * this.scrollPos; \
+       vector s = eX * (1 - this.controlWidth) + eY * this.itemHeight; \
+       return p.mouseFunc(p, globalToBox(pos, o, s)); \
+}
+X(mouseMove)
+X(mousePress)
+X(mouseDrag)
+X(mouseRelease)
+#undef X
+
+#define X(keyFunc) \
+METHOD(XonoticScrollPanel, keyFunc, bool(XonoticScrollPanel this, int key, int ascii, bool shift)) \
+{ \
+       XonoticTab p = this.currentPanel; \
+       return p.keyFunc(p, key, ascii, shift) || SUPER(XonoticScrollPanel).keyFunc(this, key, ascii, shift); \
+}
+X(keyDown)
+X(keyUp)
+#undef X
diff --git a/qcsrc/menu/xonotic/scrollpanel.qh b/qcsrc/menu/xonotic/scrollpanel.qh
new file mode 100644 (file)
index 0000000..f675e86
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "listbox.qh"
+#include "tab.qh"
+CLASS(XonoticScrollPanel, XonoticListBox)
+       /** container for single child panel */
+       ATTRIB(XonoticScrollPanel, currentPanel, entity, NEW(XonoticTab));
+       ATTRIB(XonoticScrollPanel, nItems, int, 1);
+       ATTRIB(XonoticScrollPanel, selectionDoesntMatter, bool, true);
+       ATTRIB(XonoticScrollPanel, itemHeight, float, 1);
+       /** number of rows to show at once */
+       ATTRIB(XonoticScrollPanel, viewportHeight, float, 12);
+       ATTRIB(XonoticScrollPanel, alphaBG, float, 0);
+
+       METHOD(XonoticScrollPanel, getItemAtPos, float(XonoticScrollPanel this, float pos)) { return 0; }
+       METHOD(XonoticScrollPanel, getItemHeight, float(XonoticScrollPanel this, int i)) { return this.itemHeight; }
+       METHOD(XonoticScrollPanel, getItemStart, float(XonoticScrollPanel this, int i)) { return 0; }
+       METHOD(XonoticScrollPanel, getTotalHeight, float(XonoticScrollPanel this)) { return this.itemHeight; }
+       METHOD(XonoticScrollPanel, setFocus, void(XonoticScrollPanel this, entity other)) { Container_setFocus(this, other); }
+       METHOD(XonoticScrollPanel, setSelected, void(XonoticScrollPanel this, int i)) { }
+
+       METHOD(XonoticScrollPanel, drawListBoxItem, void(XonoticScrollPanel this, int i, vector absSize, bool isSelected, bool isFocused));
+       METHOD(XonoticScrollPanel, resizeNotify, void(XonoticScrollPanel this, vector relOrigin, vector relSize, vector absOrigin, vector absSize));
+ENDCLASS(XonoticScrollPanel)
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..3f9dc410b3c53ceb17b0e931997ab3ca6b30a837 100644 (file)
@@ -100,21 +100,21 @@ void XonoticStatsList_getStats(entity me)
                        case "overall/last_seen_dt":
                        {
                                order = 1;
-                               outstr = _("Last_Seen:");
+                               outstr = _("Last seen:");
                                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 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 f64935330a9567f19b29485ff5ebbfa835e1f5e7..5a199e06dc3396c61b7de4b0ff5e24bf112bcbb8 100644 (file)
@@ -1094,6 +1094,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);
 }
 
@@ -1347,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);
@@ -1367,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;
@@ -2144,6 +2146,7 @@ bool joinAllowed(entity this)
 }
 
 .int items_added;
+.string shootfromfixedorigin;
 bool PlayerThink(entity this)
 {
        if (game_stopped || intermission_running) {
@@ -2278,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)
        {
@@ -2758,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);
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 7ed7d6b4eae3435478c111dde86799b25afdf77a..6d037473dd39907726f7eca7615610838f6b4f19 100644 (file)
@@ -1138,6 +1138,12 @@ void VoteCommand_macro_help(entity caller, float argc)
 
                VOTE_COMMANDS(CMD_REQUEST_USAGE, caller, argc, "");
 #undef VOTE_COMMAND
+
+               string cvarname = strcat("sv_vote_command_help_", argv(2));
+               if(cvar_type(cvarname) & CVAR_TYPEFLAG_EXISTS)
+                       wordwrap_sprint(caller, cvar_string(cvarname), 1000);
+               else
+                       print_to(caller, "No documentation exists for this vote");
        }
 }
 
index 060e1ce55aacb5f83618426b0fcbc599772124d7..4b600e3fceeab8743b14388eae44ba48c55c0d09 100644 (file)
@@ -366,6 +366,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 33dd8b2e25d1e21ed7108a416c10bbeb5d395d2c..c7a6f2cfb3b179d1452e9f0e88300192f61d722e 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_waypoi
        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 16303bd39f8a1092df21f37ef3bda62a8b950408..a3bb6eb216e8677b4ae7add94f76dbee46188034 100644 (file)
@@ -990,45 +990,43 @@ float GetMaplistPosition()
        return idx;
 }
 
-float MapHasRightSize(string map)
+bool MapHasRightSize(string map)
 {
-       float fh;
        if(currentbots || autocvar_bot_number || player_count < autocvar_minplayers)
        if(autocvar_g_maplist_check_waypoints)
        {
-               LOG_TRACE("checkwp "); LOG_TRACE(map);
+               string checkwp_msg = strcat("checkwp ", map);
                if(!fexists(strcat("maps/", map, ".waypoints")))
                {
-                       LOG_TRACE(": no waypoints");
+                       LOG_TRACE(checkwp_msg, ": no waypoints");
                        return false;
                }
-               LOG_TRACE(": has waypoints");
+               LOG_TRACE(checkwp_msg, ": has waypoints");
        }
 
        // open map size restriction file
-       LOG_TRACE("opensize "); LOG_TRACE(map);
-       fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+       string opensize_msg = strcat("opensize ", map);
+       float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
        if(fh >= 0)
        {
-               float mapmin, mapmax;
-               LOG_TRACE(": ok, ");
-               mapmin = stof(fgets(fh));
-               mapmax = stof(fgets(fh));
+               opensize_msg = strcat(opensize_msg, ": ok, ");
+               int mapmin = stoi(fgets(fh));
+               int mapmax = stoi(fgets(fh));
                fclose(fh);
                if(player_count < mapmin)
                {
-                       LOG_TRACE("not enough");
+                       LOG_TRACE(opensize_msg, "not enough");
                        return false;
                }
-               if(player_count > mapmax)
+               if(mapmax && player_count > mapmax)
                {
-                       LOG_TRACE("too many");
+                       LOG_TRACE(opensize_msg, "too many");
                        return false;
                }
-               LOG_TRACE("right size");
+               LOG_TRACE(opensize_msg, "right size");
                return true;
        }
-       LOG_TRACE(": not found");
+       LOG_TRACE(opensize_msg, ": not found");
        return true;
 }
 
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 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 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 4f23011595ef657a24a6f595417c4a2a61bd79cc..60a5c3ba7011f81c0e6a2ce7ff9942e7653fed0f 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..7b6504d5162875ab34d7c6f61710366352c78605 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