From: Martin Taibr Date: Fri, 2 Mar 2018 21:03:20 +0000 (+0100) Subject: Merge branch 'master' into martin-t/rpc-acc X-Git-Tag: xonotic-v0.8.5~1964^2~2 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=109c961b4eacb3f617d9c66f9fdec40e1264f97e;hp=26d2cece1d88a2fad9e0a2f8069c3924496698c1 Merge branch 'master' into martin-t/rpc-acc --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6ecbcbcb3..6a84214343 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 '^:' diff --git a/.tx/merge-base b/.tx/merge-base index c0ddb1d5fc..946c98fc60 100644 --- a/.tx/merge-base +++ b/.tx/merge-base @@ -1 +1 @@ -Wed Feb 14 07:23:42 CET 2018 +Fri Mar 2 07:24:40 CET 2018 diff --git a/commands.cfg b/commands.cfg index 66ca90e2aa..79366e4b70 100644 --- a/commands.cfg +++ b/commands.cfg @@ -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" diff --git a/common.cs.po b/common.cs.po index 50459f52a7..5413fe1414 100644 --- a/common.cs.po +++ b/common.cs.po @@ -3,7 +3,8 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# a b , 2017 +# Martin Taibr , 2017 +# Martin Taibr , 2017 # NONE , 2015 # Tomáš Volavka , 2015 # Tomáš Volavka , 2015 diff --git a/common.gd.po b/common.gd.po index 60eae07c73..d8a7b894d1 100644 --- a/common.gd.po +++ b/common.gd.po @@ -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 diff --git a/common.ru.po b/common.ru.po index e6e06c60ff..55e03f1051 100644 --- a/common.ru.po +++ b/common.ru.po @@ -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У Вас закончились жизни" +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Начало игры через ^3%d^1 секунд" +msgstr "^1Старт игры через ^3%d^1 секунд(ы)" #: qcsrc/client/hud/panel/infomessages.qc:145 msgid "^2Currently in ^1warmup^2 stage!" @@ -157,7 +157,7 @@ msgstr "готовность" #: qcsrc/client/hud/panel/infomessages.qc:162 #, c-format msgid "%sPress ^3%s%s once you are ready" -msgstr "%sПо готовности нажмите ^3%s%s" +msgstr "%sНажмите ^3%s%s по готовности" #: 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 "Были распознаны следующие имена полей (без учета регистра):\n" +msgstr "Распознаны следующие имена полей (без учёта регистра):\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 Как часто флаг (Захват флага) или ключ (Охота за ключами) или " +"мяч (Прятки) были подобраны\n" #: qcsrc/client/hud/panel/scoreboard.qc:318 msgid "^3captime^7 Time of fastest cap (CTF)\n" -msgstr "^3captime^7 Время наибыстрейшего захвата(CTF)\n" +msgstr "^3captime^7 Время быстрейшего захвата (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" -"использованы для включения/выключения ВСЕХ командных/не\n" +"использованы для включения/отключения ВСЕХ командных/не\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 "Статистика точности (средняя %d%%)" +msgstr "Точность попаданий (средняя %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 "миля/ч" +msgstr "миль/ч" #: 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 "Энергия регенерации" +msgstr "Регенератор топлива" #: 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 "Тубулар! Нажмите \"Следующий уровнь\" для продолжения!" +msgstr "Превосходно! Нажмите \"Следующий уровень\" для продолжения!" #: qcsrc/common/minigames/minigame/bd.qc:1174 msgid "Wicked! Press \"Next Level\" to continue!" -msgstr "Грешник! Нажмите \"Следующий уровнь\" для продолжения!" +msgstr "Озорник! Нажмите \"Следующий уровень\" для продолжения!" #: 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 "Текст урона" +msgstr "Цифры урона" #: 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 "Тяжёлый пулемёт" +msgstr "Тяжёлый Пулемёт" #: 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 "Конец" +msgstr "Финиш" #: 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 "Начало" +msgstr "Старт" #: 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ПРИМЕЧАНИЕ: ^BGЧат зрителей не виден для игроков во время матча" +msgstr "^F4ПРИМЕЧАНИЕ: ^BGИгроки не видят чат зрителей во время матча" #: 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 Флаг был брошен в базе и возвращен на нее" +msgstr "^BG ^TC^TT^BG Флаг был брошен на базе и возвращён" #: 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, настройки суперспектатора не будут сохранены или " -"востановлены" +"восстановлены" #: qcsrc/common/notifications/all.inc:271 msgid "^F1Round already started, you will join the game in the next round" -msgstr "^F1Раунд уже начался, вы начнёте игру со следующего раундда" +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 был немного подожжен ^BG%s^K1^K1%s%s" +msgstr "^BG%s%s^K1 был немного подпалён из ^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 был убит ^BG%s^K1%s%s в процессе телепортации" +msgstr "^BG%s%s^K1 был телефрагнут ^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 был раздавлен Шамблером%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 попал под огонь зенитки FLAC%s%s" +msgstr "^BG%s^K1 попал под огонь Зенитной Пушки %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Вы уронили усилитель %s^BG!" +msgstr "^BGВы сбросили усилитель %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Вы забрали усилитель %s^BG!" +msgstr "^BGВы подняли усилитель %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 Потерял мяч!" +msgstr "^BG%s^BG выбросил мяч!" #: 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Ты был выкинут с сервера, потому что ты зритель, а зрители не допускаются " -"на данный момент." +"^F2Вы выкинуты с сервера, потому что вы были зрителем, а зрители не " +"допускаются на данный момент." #: qcsrc/common/notifications/all.inc:425 #, c-format msgid "^BG%s^F3 is now spectating" -msgstr "^BG%s^F3 теперь наблюдатель" +msgstr "^BG%s^F3 теперь зритель" #: 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, в противном случае вы " -"будете отсоединены от сервера, так как быть наблюдателем временно запрещено!" +"будете отсоединены от сервера, так как быть зрителем временно запрещено!" #: 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 доигрался с Электрическими зарядами%s%s" +msgstr "^BG%s^K1 доигрался с зарядами Электро %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 застрелен из Тяжёлого пулемёта ^BG%s^K1%s%s" +msgstr "^BG%s%s^K1 застрелен из Тяжёлого Пулемёта ^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 разорван на куски из Тяжёлого пулемёта ^BG%s^K1%s%s" +msgstr "^BG%s%s^K1 разорван на куски из Тяжёлого Пулемёта ^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Вы забрали ^TC^TT^BG флаг!" +msgstr "^BGВы подняли ^TC^TT^BG флаг!" #: qcsrc/common/notifications/all.inc:570 msgid "^BGYou got the flag!" -msgstr "^BGВы забрали флаг!" +msgstr "^BGВы подняли флаг!" #: 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Ваш %sтоварищ по команде^BG заполучил флаг! Защищайте его!" +msgstr "^BGВаш %sсоюзник^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Вы убили ^BG%s" +msgstr "^K3%sВы фрагнули ^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Вас убил ^BG%s" +msgstr "^K1%sВас фрагнул ^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Вы убили ^BG%s, пока он писал" +msgstr "^K1%sВы фрагнули ^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Пока вы писали, вас убил ^BG%s" +msgstr "^K1%sПока вы писали, вас фрагнул ^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Не убивайте товарищей по команде!" +msgstr "^K1Не убивайте союзников!" #: qcsrc/common/notifications/all.inc:630 msgid "^K1Don't shoot your team mates!" -msgstr "^K1Не стреляйте в своих товарищей по команде!" +msgstr "^K1Не стреляйте в своих союзников!" #: 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Вы почувствовали прохладец!" +msgstr "^K1Вы почувствовали озноб!" #: 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Вы были убиты турелью!" +msgstr "^K1Вы были фрагнуты турелью!" #: 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Вы были убиты турелью еМобиля!" +msgstr "^K1Вы были фрагнуты турелью еМобиля!" #: 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Вы были убиты турелью Walker!" +msgstr "^K1Вы были фрагнуты турелью Ходуна!" #: qcsrc/common/notifications/all.inc:655 msgid "^K1You got caught in the blast of a Bumblebee explosion!" -msgstr "^K1Вас задело взрывной волной от Bumblebee!" +msgstr "^K1Вас задело взрывной волной Шмеля!" #: 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Дебил! Ты убил ^BG%s^K1, своего товарища по команде!" +msgstr "^K1Негодяй! Вы фрагнули ^BG%s^K1, своего союзника!" #: qcsrc/common/notifications/all.inc:665 #, c-format msgid "^K1Moron! You went against ^BG%s^K1, a team mate!" -msgstr "^K1Дебил! Ты напал на ^BG%s^K1, своего товарища по команде!" +msgstr "^K1Негодяй! Вы напали на ^BG%s^K1, своего союзника!" #: qcsrc/common/notifications/all.inc:666 #, c-format msgid "^K1You were fragged by ^BG%s^K1, a team mate" -msgstr "^K1Вы были убиты ^BG%s^K1, вашим товарищем по команде" +msgstr "^K1Вы были фрагнуты ^BG%s^K1, вашим союзником" #: qcsrc/common/notifications/all.inc:666 #, c-format msgid "^K1You were scored against by ^BG%s^K1, a team mate" -msgstr "^K1Вы проиграли очко ^BG%s^K1, своему товарищу по команде" +msgstr "^K1Вы проиграли очко ^BG%s^K1, своему союзнику" #: qcsrc/common/notifications/all.inc:668 msgid "" @@ -3680,7 +3676,7 @@ msgid "" "^BGDisconnecting in ^COUNT..." msgstr "" "^K1Хватит бездельничать!\n" -"^BGРассоединение через ^COUNT..." +"^BGОтключение через ^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У вас есть ^F1Восстановитель топлива" +msgstr "^BGУ вас есть ^F1Регенератор топлива" #: 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Альтернативный режим огня не наносит урона!" +msgstr "^BGВторичный режим огня не наносит урона!" #: 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Вы станете наблюдателем через ^COUNT" +msgstr "^K1Вы станете зрителем через ^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 "альтернативный" +msgstr "вторичный" #: 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 "Зенитная пушка" +msgstr "Зенитная Пушка" #: 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 "Ходячая турель" +msgstr "Турель Ходуна" #: 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^Выключена" +msgstr "PNL^Отключена" #: 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 "миля/ч" +msgstr "миль/ч" #: 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 "Выбрать тему" +msgstr "Применить тему" #: 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 "ИнстаГиб" +msgstr "Инстагиб" #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:216 msgid "New Toys" -msgstr "Новые Игрушки" +msgstr "Новые игрушки" #: 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 "Ракетный Полёт" +msgstr "Полёт на ракете" #: 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 "Всё собранное оружие остаётся после возрождений" +msgstr "Пушки остаются после подбора" #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:235 msgid "Regular (no arena)" @@ -6350,8 +6345,8 @@ msgid "" msgstr "" "Игроки получат только одно оружие, которое немедленно убьёт противника с " "одного выстрела. Если игрок испытывает недостаток патронов, у него есть 10 " -"секунд, чтобы найти ещё, иначе он встретит смерть. Режим второстепенного " -"огня не наносит урона, но он хорош для прыжка." +"секунд, чтобы найти ещё, иначе он встретит смерть. Режим вторичного огня не " +"наносит урона, но он хорош для трюков." #: 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 без предметов — вместо подбора предметов, каждый играет одним и тем " +"же оружием. Через некоторое время начнётся обратный отчёт, после чего " +"произойдёт переключение на другое оружие." #: 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 "" -"Выключить текстуры полностью для очень слабых компьютеров. Это даст лучшую " -"производительность, но будет выглядеть плохо (по умолчанию: выкл.)" +"Полностью отключить текстуры для очень слабых компьютеров. Это даст лучшую " +"производительность, но будет выглядеть не красиво (по умолчанию: откл.)" #: 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-текстуры трёхмерными " -"(по умолчанию: выкл.)" +"(по умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:148 msgid "Relief mapping" @@ -7306,7 +7302,7 @@ msgid "" "(default: disabled)" msgstr "" "Более высокое качество рельефного текстурирования, которое также снизит " -"производительность (по умолчанию: выкл.)" +"производительность (по умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:152 msgid "Reflections:" @@ -7318,7 +7314,7 @@ msgid "" "with reflecting surfaces (default: disabled)" msgstr "" "Качество отражения и преломления, снижающее производительность на картах с " -"зеркальными поверхностями (по умолчанию: выкл.)" +"зеркальными поверхностями (по умолчанию: откл.)" #: 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 "" "Включить быстрое, но некрасивое динамическое освещение отрисовкой ярких " -"корон вместо реального динамического освещения (по умолчанию: выкл.)" +"корон вместо реального динамического освещения (по умолчанию: откл.)" #: 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 "" -"Включить отрисовку теней от динамического освещения (по умолчанию: выкл.)" +"Включить отрисовку теней от динамического освещения (по умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:205 msgid "Realtime world lighting" @@ -7435,13 +7431,13 @@ msgid "" msgstr "" "Включить отрисовку полного освещения реального времени на картах, " "поддерживающих это. Примечание: это скажется на производительности (по " -"умолчанию: выкл.)" +"умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:208 msgid "" "Enable rendering of shadows from realtime world lights (default: disabled)" msgstr "" -"Включить отрисовку теней от освещения реального времени (по умолчанию: выкл.)" +"Включить отрисовку теней от освещения реального времени (по умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:212 msgid "Use normal maps" @@ -7474,7 +7470,7 @@ msgid "" msgstr "" "Включить эффект свечения, который увеличивает яркость пикселей, " "соседствующих с очень яркими. Очень снижает производительность (по " -"умолчанию: выкл.)" +"умолчанию: откл.)" #: qcsrc/menu/xonotic/dialog_settings_effects.qc:226 msgid "Extra postprocessing effects" @@ -7486,7 +7482,7 @@ msgid "" "using a powerup (default: disabled)" msgstr "" "Включить специальные эффекты пост-обработки, когда получен урон, под водой " -"или включен свет (по умолчанию: выкл.)" +"или используется усилитель (по умолчанию: откл.)" #: 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^Выключены" +msgstr "SPREES^Отключены" #: 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 "Раскачивание камеры при бездействовии" +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 "Выключать увеличитель при смерти или возрождении" +msgstr "Отключать увеличитель при смерти или возрождении" #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:120 msgid "Release zoom when you switch weapons" -msgstr "Выключать увеличитель при смене оружия" +msgstr "Отключать увеличитель при смене оружия" #: 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 "Циклировать только готовые к использованию оружия" +msgstr "Переключать только готовые к использованию оружия" #: 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 "Выключать кнопку атаки при смене оружия" +msgstr "Отключать кнопку атаки при смене оружия" #: 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^Выключены" +msgstr "JPJUMP^Отключены" #: 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 "Принудительное использованние клиентом выбранного порта, иначе 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 "Показывать кол-во отрисованных кадров в секунду" #: 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 "Показывать текущие дату и время, полезно для снимков экрана" +msgstr "Показывать текущие дату и время, полезно для скриншотов" #: 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 "Выбрать язык" +msgstr "Применить язык" #: 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 "Пока вы подключены, изменение языка применится только для меню," +msgstr "Пока вы подключены, изменение языка вступит в силу только для меню," #: 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 "Сейчас отключен" +msgstr "Отсоединиться сейчас" #: 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 "Режим леворукого бедняги (по умолчанию: выкл)" +msgstr "Режим леворукого бедняги (по умолчанию: откл.)" #: 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-геометрии. Примечание: это " -"может сильно снизить производительность (по умолчанию: выкл.)" +"может сильно снизить производительность (по умолчанию: откл.)" #: 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 "Сперва глубина:" +msgstr "Сначала глубина:" #: qcsrc/menu/xonotic/dialog_settings_video.qc:99 msgid "" @@ -8646,7 +8641,7 @@ msgid "" "normal rendering starts (default: disabled)" msgstr "" "Устранить перерасход отрисовкой только глубокой версии сцен до нормального " -"начала отрисовки (по умолчанию: выкл.)" +"начала отрисовки (по умолчанию: откл.)" #: 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 "" -"Заставляет процессор ждать пока видеокарта закончит отрисовку каждого кадра, " -"может помочь в случае задержек и лагов на некоторых компьютерах (по " -"умолчанию: выкл.)" +"Заставляет процессор ждать, пока видеокарта закончит отрисовку каждого " +"кадра, может помочь в случае задержек и лагов на некоторых компьютерах (по " +"умолчанию: откл.)" #: 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, чтобы применить гамма-коррекцию. Примечание: это сильно " -"снизит производительность (по умолчанию: выкл.)" +"Активировать GLSL, чтобы применять гамма-коррекцию. Примечание: это сильно " +"снизит производительность (по умолчанию: откл.)" #: 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 "Автовыбор команды (советуется)" +msgstr "Автовыбор команды (рекомендуется)" #: qcsrc/menu/xonotic/dialog_teamselect.qc:37 msgid "red" @@ -8962,7 +8957,7 @@ msgstr "показать очки" #: qcsrc/menu/xonotic/keybinder.qc:80 msgid "screen shot" -msgstr "снимок экрана" +msgstr "скриншот" #: 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 "Вид от 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 (нерейтинговые)" +msgstr "%d (без рейтинга)" #: qcsrc/menu/xonotic/util.qc:417 #, c-format diff --git a/gfx/menu/luma/skinvalues.txt b/gfx/menu/luma/skinvalues.txt index c997fea257..cfaa1e5804 100644 --- a/gfx/menu/luma/skinvalues.txt +++ b/gfx/menu/luma/skinvalues.txt @@ -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 diff --git a/gfx/menu/luminos/skinvalues.txt b/gfx/menu/luminos/skinvalues.txt index ca0384fb55..2ffe29af0c 100755 --- a/gfx/menu/luminos/skinvalues.txt +++ b/gfx/menu/luminos/skinvalues.txt @@ -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' diff --git a/gfx/menu/wickedx/skinvalues.txt b/gfx/menu/wickedx/skinvalues.txt index b7011a0b0e..0580e89eb1 100644 --- a/gfx/menu/wickedx/skinvalues.txt +++ b/gfx/menu/wickedx/skinvalues.txt @@ -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' diff --git a/gfx/menu/xaw/skinvalues.txt b/gfx/menu/xaw/skinvalues.txt index 5f4bbaad40..af7d8ce165 100644 --- a/gfx/menu/xaw/skinvalues.txt +++ b/gfx/menu/xaw/skinvalues.txt @@ -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' diff --git a/languages.txt b/languages.txt index 328032ff60..8c037dc23d 100644 --- a/languages.txt +++ b/languages.txt @@ -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 diff --git a/qcsrc/client/main.qc b/qcsrc/client/main.qc index f0b8aac6c9..9c146c09bd 100644 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@ -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"); diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 7dcbd83d2b..9bfa8db9ad 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -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); } diff --git a/qcsrc/common/debug.qh b/qcsrc/common/debug.qh index 2d0c4e9110..7144bf3da5 100644 --- a/qcsrc/common/debug.qh +++ b/qcsrc/common/debug.qh @@ -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 diff --git a/qcsrc/common/mapinfo.qc b/qcsrc/common/mapinfo.qc index ca58d9f090..0884bc8d79 100644 --- a/qcsrc/common/mapinfo.qc +++ b/qcsrc/common/mapinfo.qc @@ -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") diff --git a/qcsrc/common/mutators/mutator/nades/nades.qc b/qcsrc/common/mutators/mutator/nades/nades.qc index e183c3339b..24149ad7fc 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qc +++ b/qcsrc/common/mutators/mutator/nades/nades.qc @@ -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); } diff --git a/qcsrc/common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc b/qcsrc/common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc index a4b9b1826b..b25175aea5 100644 --- a/qcsrc/common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc +++ b/qcsrc/common/mutators/mutator/offhand_blaster/sv_offhand_blaster.qc @@ -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)); diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index 69d3a4f583..db681315a6 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -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) diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 5c51c2d87b..dca20d0cdb 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -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); diff --git a/qcsrc/common/weapons/all.qh b/qcsrc/common/weapons/all.qh index beaa6cb48a..0af4759007 100644 --- a/qcsrc/common/weapons/all.qh +++ b/qcsrc/common/weapons/all.qh @@ -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 diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index 6a115baf14..21ca117f4c 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -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); diff --git a/qcsrc/common/weapons/weapon/hagar.qc b/qcsrc/common/weapons/weapon/hagar.qc index bbd3ddb4ef..d9164dc19a 100644 --- a/qcsrc/common/weapons/weapon/hagar.qc +++ b/qcsrc/common/weapons/weapon/hagar.qc @@ -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) { diff --git a/qcsrc/common/wepent.qc b/qcsrc/common/wepent.qc index 3da8b8939a..1b9abdbf0e 100644 --- a/qcsrc/common/wepent.qc +++ b/qcsrc/common/wepent.qc @@ -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); }, \ diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 8246e106de..ce4535452d 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -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)) diff --git a/qcsrc/menu/anim/animation.qc b/qcsrc/menu/anim/animation.qc index 72bcc5e94e..c651a4ffc4 100644 --- a/qcsrc/menu/anim/animation.qc +++ b/qcsrc/menu/anim/animation.qc @@ -33,12 +33,6 @@ 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; diff --git a/qcsrc/menu/anim/animation.qh b/qcsrc/menu/anim/animation.qh index 009feb577c..1fdea3dd6f 100644 --- a/qcsrc/menu/anim/animation.qh +++ b/qcsrc/menu/anim/animation.qh @@ -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)); diff --git a/qcsrc/menu/command/menu_cmd.qc b/qcsrc/menu/command/menu_cmd.qc index 18e5ae0812..e727b39e64 100644 --- a/qcsrc/menu/command/menu_cmd.qc +++ b/qcsrc/menu/command/menu_cmd.qc @@ -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(); diff --git a/qcsrc/menu/draw.qc b/qcsrc/menu/draw.qc index 01184a4bf5..ae6967e367 100644 --- a/qcsrc/menu/draw.qc +++ b/qcsrc/menu/draw.qc @@ -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) diff --git a/qcsrc/menu/item.qc b/qcsrc/menu/item.qc index 1d31e95a9c..a5c7cfa854 100644 --- a/qcsrc/menu/item.qc +++ b/qcsrc/menu/item.qc @@ -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)) diff --git a/qcsrc/menu/item.qh b/qcsrc/menu/item.qh index a5df526806..6cee17b3fd 100644 --- a/qcsrc/menu/item.qh +++ b/qcsrc/menu/item.qh @@ -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)); diff --git a/qcsrc/menu/item/button.qc b/qcsrc/menu/item/button.qc index 8299a6859f..77e4ccad26 100644 --- a/qcsrc/menu/item/button.qc +++ b/qcsrc/menu/item/button.qc @@ -36,10 +36,10 @@ 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) { diff --git a/qcsrc/menu/item/button.qh b/qcsrc/menu/item/button.qh index 1a164245c8..2077da7007 100644 --- a/qcsrc/menu/item/button.qh +++ b/qcsrc/menu/item/button.qh @@ -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)); diff --git a/qcsrc/menu/item/container.qc b/qcsrc/menu/item/container.qc index 56535bf71c..329ddf0f6e 100644 --- a/qcsrc/menu/item/container.qc +++ b/qcsrc/menu/item/container.qc @@ -178,19 +178,17 @@ } 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) { @@ -310,7 +308,8 @@ 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 { diff --git a/qcsrc/menu/item/container.qh b/qcsrc/menu/item/container.qh index 8273f5ddde..b737526850 100644 --- a/qcsrc/menu/item/container.qh +++ b/qcsrc/menu/item/container.qh @@ -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)); diff --git a/qcsrc/menu/item/image.qc b/qcsrc/menu/item/image.qc index 59405ec169..73b302c4a7 100644 --- a/qcsrc/menu/item/image.qc +++ b/qcsrc/menu/item/image.qc @@ -18,9 +18,10 @@ 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) diff --git a/qcsrc/menu/item/inputbox.qc b/qcsrc/menu/item/inputbox.qc index 6f7ed9f243..a418dc2ce0 100644 --- a/qcsrc/menu/item/inputbox.qc +++ b/qcsrc/menu/item/inputbox.qc @@ -71,17 +71,17 @@ 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) diff --git a/qcsrc/menu/item/inputbox.qh b/qcsrc/menu/item/inputbox.qh index e3eede653b..5b0c28f9e4 100644 --- a/qcsrc/menu/item/inputbox.qh +++ b/qcsrc/menu/item/inputbox.qh @@ -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)); diff --git a/qcsrc/menu/item/inputcontainer.qc b/qcsrc/menu/item/inputcontainer.qc index 37c46240f7..cda3426772 100644 --- a/qcsrc/menu/item/inputcontainer.qc +++ b/qcsrc/menu/item/inputcontainer.qc @@ -89,11 +89,10 @@ 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)); @@ -117,13 +116,13 @@ 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) { diff --git a/qcsrc/menu/item/inputcontainer.qh b/qcsrc/menu/item/inputcontainer.qh index 9ae4a53750..8ded2e657b 100644 --- a/qcsrc/menu/item/inputcontainer.qh +++ b/qcsrc/menu/item/inputcontainer.qh @@ -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)); diff --git a/qcsrc/menu/item/listbox.qc b/qcsrc/menu/item/listbox.qc index aa10c20b3b..97f08c9811 100644 --- a/qcsrc/menu/item/listbox.qc +++ b/qcsrc/menu/item/listbox.qc @@ -182,10 +182,10 @@ 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 @@ -208,43 +208,43 @@ } 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) { @@ -335,9 +335,7 @@ 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)); @@ -376,19 +374,19 @@ } } 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(); diff --git a/qcsrc/menu/item/listbox.qh b/qcsrc/menu/item/listbox.qh index 56fda91cc1..b3f5164a4d 100644 --- a/qcsrc/menu/item/listbox.qh +++ b/qcsrc/menu/item/listbox.qh @@ -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)); diff --git a/qcsrc/menu/item/nexposee.qc b/qcsrc/menu/item/nexposee.qc index c0f18cf859..d42fceb533 100644 --- a/qcsrc/menu/item/nexposee.qc +++ b/qcsrc/menu/item/nexposee.qc @@ -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) diff --git a/qcsrc/menu/item/nexposee.qh b/qcsrc/menu/item/nexposee.qh index 4159648f97..440413b5e5 100644 --- a/qcsrc/menu/item/nexposee.qh +++ b/qcsrc/menu/item/nexposee.qh @@ -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)); diff --git a/qcsrc/menu/item/slider.qc b/qcsrc/menu/item/slider.qc index 2e89bb68ee..b569c3b0c4 100644 --- a/qcsrc/menu/item/slider.qc +++ b/qcsrc/menu/item/slider.qc @@ -172,53 +172,53 @@ 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) { diff --git a/qcsrc/menu/item/slider.qh b/qcsrc/menu/item/slider.qh index 3b7327788c..b70d3880ba 100644 --- a/qcsrc/menu/item/slider.qh +++ b/qcsrc/menu/item/slider.qh @@ -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'); diff --git a/qcsrc/menu/skin-customizables.inc b/qcsrc/menu/skin-customizables.inc index d5e1f82eba..3889b341b7 100644 --- a/qcsrc/menu/skin-customizables.inc +++ b/qcsrc/menu/skin-customizables.inc @@ -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 diff --git a/qcsrc/menu/xonotic/_mod.inc b/qcsrc/menu/xonotic/_mod.inc index 577c822580..fd83718283 100644 --- a/qcsrc/menu/xonotic/_mod.inc +++ b/qcsrc/menu/xonotic/_mod.inc @@ -98,6 +98,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/menu/xonotic/_mod.qh b/qcsrc/menu/xonotic/_mod.qh index b6e34eff24..f1644a2f5c 100644 --- a/qcsrc/menu/xonotic/_mod.qh +++ b/qcsrc/menu/xonotic/_mod.qh @@ -98,6 +98,7 @@ #include #include #include +#include #include #include #include diff --git a/qcsrc/menu/xonotic/colorpicker.qc b/qcsrc/menu/xonotic/colorpicker.qc index 357276e16a..d8aedf6951 100644 --- a/qcsrc/menu/xonotic/colorpicker.qc +++ b/qcsrc/menu/xonotic/colorpicker.qc @@ -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 diff --git a/qcsrc/menu/xonotic/colorpicker.qh b/qcsrc/menu/xonotic/colorpicker.qh index b1c9d1e80a..149357dd9f 100644 --- a/qcsrc/menu/xonotic/colorpicker.qh +++ b/qcsrc/menu/xonotic/colorpicker.qh @@ -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); diff --git a/qcsrc/menu/xonotic/colorpicker_string.qc b/qcsrc/menu/xonotic/colorpicker_string.qc index 200204c00d..5a44e58830 100644 --- a/qcsrc/menu/xonotic/colorpicker_string.qc +++ b/qcsrc/menu/xonotic/colorpicker_string.qc @@ -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) diff --git a/qcsrc/menu/xonotic/colorpicker_string.qh b/qcsrc/menu/xonotic/colorpicker_string.qh index e990234b3f..aa4a10c93a 100644 --- a/qcsrc/menu/xonotic/colorpicker_string.qh +++ b/qcsrc/menu/xonotic/colorpicker_string.qh @@ -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)); diff --git a/qcsrc/menu/xonotic/dialog_settings_game.qc b/qcsrc/menu/xonotic/dialog_settings_game.qc index d2ce368d1d..87134cb781 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game.qc @@ -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)) diff --git a/qcsrc/menu/xonotic/dialog_settings_game.qh b/qcsrc/menu/xonotic/dialog_settings_game.qh index b9231642b1..c9617f582f 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game.qh +++ b/qcsrc/menu/xonotic/dialog_settings_game.qh @@ -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)); diff --git a/qcsrc/menu/xonotic/listbox.qh b/qcsrc/menu/xonotic/listbox.qh index 14272cb19b..b6ad4af100 100644 --- a/qcsrc/menu/xonotic/listbox.qh +++ b/qcsrc/menu/xonotic/listbox.qh @@ -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); diff --git a/qcsrc/menu/xonotic/picker.qc b/qcsrc/menu/xonotic/picker.qc index db302e9a8c..5276976832 100644 --- a/qcsrc/menu/xonotic/picker.qc +++ b/qcsrc/menu/xonotic/picker.qc @@ -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) diff --git a/qcsrc/menu/xonotic/picker.qh b/qcsrc/menu/xonotic/picker.qh index b8e19cf19e..c98e9fc9b6 100644 --- a/qcsrc/menu/xonotic/picker.qh +++ b/qcsrc/menu/xonotic/picker.qh @@ -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)); diff --git a/qcsrc/menu/xonotic/screenshotimage.qc b/qcsrc/menu/xonotic/screenshotimage.qc index 42e168b4b5..8e8f3ccf73 100644 --- a/qcsrc/menu/xonotic/screenshotimage.qc +++ b/qcsrc/menu/xonotic/screenshotimage.qc @@ -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) diff --git a/qcsrc/menu/xonotic/screenshotimage.qh b/qcsrc/menu/xonotic/screenshotimage.qh index 8920bed287..c27a853377 100644 --- a/qcsrc/menu/xonotic/screenshotimage.qh +++ b/qcsrc/menu/xonotic/screenshotimage.qh @@ -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 index 0000000000..4543f0bc48 --- /dev/null +++ b/qcsrc/menu/xonotic/scrollpanel.qc @@ -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 index 0000000000..f675e863d4 --- /dev/null +++ b/qcsrc/menu/xonotic/scrollpanel.qh @@ -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) diff --git a/qcsrc/menu/xonotic/slider.qh b/qcsrc/menu/xonotic/slider.qh index 9204c5eb35..fea3574589 100644 --- a/qcsrc/menu/xonotic/slider.qh +++ b/qcsrc/menu/xonotic/slider.qh @@ -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); diff --git a/qcsrc/menu/xonotic/statslist.qc b/qcsrc/menu/xonotic/statslist.qc index 3e94738a9a..3f9dc410b3 100644 --- a/qcsrc/menu/xonotic/statslist.qc +++ b/qcsrc/menu/xonotic/statslist.qc @@ -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); } diff --git a/qcsrc/menu/xonotic/textslider.qh b/qcsrc/menu/xonotic/textslider.qh index 58fe8e86bb..3c588ce550 100644 --- a/qcsrc/menu/xonotic/textslider.qh +++ b/qcsrc/menu/xonotic/textslider.qh @@ -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); diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index a2f917fafc..a2f9ab49b4 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -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; diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index f64935330a..5a199e06dc 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -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); diff --git a/qcsrc/server/client.qh b/qcsrc/server/client.qh index 42d7d9560b..48d42da009 100644 --- a/qcsrc/server/client.qh +++ b/qcsrc/server/client.qh @@ -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 diff --git a/qcsrc/server/command/vote.qc b/qcsrc/server/command/vote.qc index 7ed7d6b4ea..6d037473dd 100644 --- a/qcsrc/server/command/vote.qc +++ b/qcsrc/server/command/vote.qc @@ -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"); } } diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 060e1ce55a..4b600e3fce 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -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 diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 33dd8b2e25..c7a6f2cfb3 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -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; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 16303bd39f..a3bb6eb216 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -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; } diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 8b4204b126..ff762e9046 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -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; } diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index fb452c3399..6853c04a15 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -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); diff --git a/qcsrc/server/mutators/mutator/gamemode_ca.qc b/qcsrc/server/mutators/mutator/gamemode_ca.qc index 67b999e611..43ed39aea4 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ca.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ca.qc @@ -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 diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index af6b520749..06bdb1428f 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -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 diff --git a/qcsrc/server/spawnpoints.qc b/qcsrc/server/spawnpoints.qc index 9164b4febe..e48840883a 100644 --- a/qcsrc/server/spawnpoints.qc +++ b/qcsrc/server/spawnpoints.qc @@ -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; }); diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc index f1800ae00e..1eda4e25b1 100644 --- a/qcsrc/server/weapons/accuracy.qc +++ b/qcsrc/server/weapons/accuracy.qc @@ -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; diff --git a/qcsrc/server/weapons/selection.qc b/qcsrc/server/weapons/selection.qc index 693d5a2404..f059dfba9b 100644 --- a/qcsrc/server/weapons/selection.qc +++ b/qcsrc/server/weapons/selection.qc @@ -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); } diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 4f23011595..60a5c3ba70 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -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); diff --git a/xonotic-server.cfg b/xonotic-server.cfg index 09f9702dae..7b6504d516 100644 --- a/xonotic-server.cfg +++ b/xonotic-server.cfg @@ -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