Merge remote-tracking branch 'origin/terencehill/bot_waypoints'
authorterencehill <piuntn@gmail.com>
Sat, 8 Dec 2018 12:25:04 +0000 (13:25 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 8 Dec 2018 12:25:04 +0000 (13:25 +0100)
27 files changed:
.gitlab-ci.yml
.tx/merge-base
common.el.po
common.tr.po
common.zh_CN.po
qcsrc/.vscode/settings.json [new file with mode: 0644]
qcsrc/client/view.qc
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc
qcsrc/common/mapobjects/teleporters.qc
qcsrc/common/mapobjects/teleporters.qh
qcsrc/common/mutators/mutator/buffs/sv_buffs.qc
qcsrc/lib/warpzone/server.qc
qcsrc/lib/yenc.qh
qcsrc/menu/xonotic/serverlist.qc
qcsrc/server/bot/api.qh
qcsrc/server/bot/default/aim.qc
qcsrc/server/bot/default/aim.qh
qcsrc/server/bot/default/havocbot/havocbot.qc
qcsrc/server/bot/default/havocbot/havocbot.qh
qcsrc/server/bot/default/navigation.qc
qcsrc/server/bot/default/navigation.qh
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/cheats.qc
qcsrc/server/client.qc
qcsrc/server/race.qc
qcsrc/server/weapons/tracing.qc

index 291bf49..e773eb6 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
     - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
     - make
-    - EXPECT=78686205fc72d91c106a3022d0d8b083
+    - EXPECT=b27bbbd74c91ea66195d61982fd471ce
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index 6d3cbe5..64801e8 100644 (file)
@@ -1 +1 @@
-Sun Nov  4 07:24:04 CET 2018
+Tue Nov 27 07:24:07 CET 2018
index 3716599..0f4660a 100644 (file)
@@ -17,8 +17,8 @@ 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-11-02 19:48+0000\n"
-"Last-Translator: Marinus Savoritias\n"
+"PO-Revision-Date: 2018-11-10 10:16+0000\n"
+"Last-Translator: Mensious Mensious <ektoras@tutanota.com>\n"
 "Language-Team: Greek (http://www.transifex.com/team-xonotic/xonotic/language/"
 "el/)\n"
 "Language: el\n"
@@ -4378,7 +4378,7 @@ msgstr ""
 
 #: qcsrc/common/vehicles/vehicle/racer.qh:19
 msgid "Racer"
-msgstr ""
+msgstr "Αγωνιζόμενος"
 
 #: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
 msgid "Racer cannon"
@@ -5585,7 +5585,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"
@@ -5679,7 +5679,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:13
 msgid "Monster:"
-msgstr ""
+msgstr "Τέρας:"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:22
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
@@ -5697,7 +5697,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:26
 msgid "Follow"
-msgstr ""
+msgstr "Ακολούθησε"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:27
 msgid "Wander"
@@ -6027,7 +6027,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:49
 #, c-format
 msgid "%s Arena"
-msgstr ""
+msgstr "%s Αρένα"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:61
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:159
@@ -6114,11 +6114,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:99
 msgid "No powerups"
-msgstr ""
+msgstr "Όχι powerups"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:101
 msgid "Powerups"
-msgstr ""
+msgstr "Powerups"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:163
index e860428..854b206 100644 (file)
@@ -10,7 +10,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-11-03 19:42+0000\n"
+"PO-Revision-Date: 2018-11-26 14:15+0000\n"
 "Last-Translator: Demiray Muhterem <mdemiray@msn.com>\n"
 "Language-Team: Turkish (http://www.transifex.com/team-xonotic/xonotic/"
 "language/tr/)\n"
@@ -282,11 +282,11 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^negative"
-msgstr ""
+msgstr "QMCMD^olumsuz"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^positive"
-msgstr ""
+msgstr "QMCMD^olumlu"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
@@ -881,7 +881,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:203
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:208
 msgid "N/A"
-msgstr ""
+msgstr "N/A"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1156
 #, c-format
@@ -1039,19 +1039,19 @@ msgstr "Kullanım dışı"
 
 #: qcsrc/client/main.qc:1014
 msgid " qu/s"
-msgstr ""
+msgstr " qu/s"
 
 #: qcsrc/client/main.qc:1016
 msgid " m/s"
-msgstr ""
+msgstr " m/s"
 
 #: qcsrc/client/main.qc:1018
 msgid " km/h"
-msgstr ""
+msgstr " km/h"
 
 #: qcsrc/client/main.qc:1020
 msgid " mph"
-msgstr ""
+msgstr " mph"
 
 #: qcsrc/client/main.qc:1022
 msgid " knots"
@@ -3307,31 +3307,31 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:590
 #, c-format
 msgid "^K3%sYou fragged ^BG%s"
-msgstr ""
+msgstr "^K3%sParçalandın ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:591
 #: qcsrc/common/notifications/all.inc:600
 #: qcsrc/common/notifications/all.inc:609
 #, c-format
 msgid "^K3%sYou scored against ^BG%s"
-msgstr ""
+msgstr "^K3%sPuan yaptın ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:592
 #, c-format
 msgid "^K1%sYou were fragged by ^BG%s"
-msgstr ""
+msgstr "^K1%sŞunun tarafından parçalandın ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:593
 #: qcsrc/common/notifications/all.inc:602
 #: qcsrc/common/notifications/all.inc:611
 #, c-format
 msgid "^K1%sYou were scored against by ^BG%s"
-msgstr ""
+msgstr "^K1%sŞundan puan kaybettin ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:599
 #, c-format
 msgid "^K3%sYou burned ^BG%s"
-msgstr ""
+msgstr "^K3%sYandın ^BG%s"
 
 #: qcsrc/common/notifications/all.inc:601
 #, c-format
@@ -3383,55 +3383,57 @@ msgid ""
 "^BGYou have been moved into a different team\n"
 "You are now on: %s"
 msgstr ""
+"^BGFarklı bir takıma geçtiniz\n"
+"Şimdi buradasınız: %s"
 
 #: qcsrc/common/notifications/all.inc:630
 msgid "^K1Don't go against your team mates!"
-msgstr ""
+msgstr "^K1Takım arkadaşlarına karşı savaşma!"
 
 #: qcsrc/common/notifications/all.inc:630
 msgid "^K1Don't shoot your team mates!"
-msgstr ""
+msgstr "^K1Takım arkadaşlarına ateş etme!"
 
 #: qcsrc/common/notifications/all.inc:631
 msgid "^K1Die camper!"
-msgstr ""
+msgstr "^K1Kampçıyı öldür!"
 
 #: qcsrc/common/notifications/all.inc:631
 msgid "^K1Reconsider your tactics, camper!"
-msgstr ""
+msgstr "^K1Taktiklerinizi tekrar düşünün, kampçı!"
 
 #: qcsrc/common/notifications/all.inc:632
 msgid "^K1You unfairly eliminated yourself!"
-msgstr ""
+msgstr "^K1Kendinizi yok ettiniz!"
 
 #: qcsrc/common/notifications/all.inc:633
 #, c-format
 msgid "^K1You were %s"
-msgstr ""
+msgstr "^K1Sen %s"
 
 #: qcsrc/common/notifications/all.inc:634
 msgid "^K1You couldn't catch your breath!"
-msgstr ""
+msgstr "^K1Nefesini yakalayamadın!"
 
 #: qcsrc/common/notifications/all.inc:635
 msgid "^K1You hit the ground with a crunch!"
-msgstr ""
+msgstr "^K1Çatlağa çarptı!"
 
 #: qcsrc/common/notifications/all.inc:636
 msgid "^K1You felt a little too hot!"
-msgstr ""
+msgstr "^K1Çok sıcak hissettin!"
 
 #: qcsrc/common/notifications/all.inc:636
 msgid "^K1You got a little bit too crispy!"
-msgstr ""
+msgstr "^K1Biraz çıtır çıtır!"
 
 #: qcsrc/common/notifications/all.inc:637
 msgid "^K1You killed your own dumb self!"
-msgstr ""
+msgstr "^K1Aptal kendini öldürdün!"
 
 #: qcsrc/common/notifications/all.inc:637
 msgid "^K1You need to be more careful!"
-msgstr ""
+msgstr "^K1Daha dikkatli olmalısın!"
 
 #: qcsrc/common/notifications/all.inc:638
 msgid "^K1You couldn't stand the heat!"
@@ -3974,27 +3976,27 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.qh:407 qcsrc/common/notifications/all.qh:408
 msgid "primary"
-msgstr ""
+msgstr "birincil"
 
 #: qcsrc/common/notifications/all.qh:407 qcsrc/common/notifications/all.qh:408
 msgid "secondary"
-msgstr ""
+msgstr "ikincil"
 
 #: qcsrc/common/notifications/all.qh:410
 msgid "point"
-msgstr ""
+msgstr "nokta"
 
 #: qcsrc/common/notifications/all.qh:410
 msgid "points"
-msgstr ""
+msgstr "noktalar"
 
 #: qcsrc/common/notifications/all.qh:419
 msgid "drop flag"
-msgstr ""
+msgstr "bayrak bırak"
 
 #: qcsrc/common/notifications/all.qh:420
 msgid "throw nade"
-msgstr ""
+msgstr "nade fırlat"
 
 #: qcsrc/common/notifications/all.qh:431
 #, c-format
@@ -4027,7 +4029,7 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.qh:445
 msgid "RAGE! "
-msgstr ""
+msgstr "HİDDET! "
 
 #: qcsrc/common/notifications/all.qh:446
 #, c-format
@@ -4097,7 +4099,7 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.qh:450
 msgid "ARMAGEDDON! "
-msgstr ""
+msgstr "KIYAMET!"
 
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
@@ -4135,19 +4137,19 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.qh:514
 msgid "First blood! "
-msgstr ""
+msgstr "İlk kan!"
 
 #: qcsrc/common/notifications/all.qh:514
 msgid "First score! "
-msgstr ""
+msgstr "İlk sonuç!"
 
 #: qcsrc/common/notifications/all.qh:518
 msgid "First casualty! "
-msgstr ""
+msgstr "İlk kaza!"
 
 #: qcsrc/common/notifications/all.qh:518
 msgid "First victim! "
-msgstr ""
+msgstr "İlk kurban!"
 
 #: qcsrc/common/notifications/all.qh:559
 #, c-format
@@ -4191,75 +4193,75 @@ msgstr ""
 
 #: qcsrc/common/teams.qh:29
 msgid "TEAM^Red"
-msgstr ""
+msgstr "TEAM^Kırmızı"
 
 #: qcsrc/common/teams.qh:30
 msgid "TEAM^Blue"
-msgstr ""
+msgstr "TEAM^Mavi"
 
 #: qcsrc/common/teams.qh:31
 msgid "TEAM^Yellow"
-msgstr ""
+msgstr "TEAM^Sarı"
 
 #: qcsrc/common/teams.qh:32
 msgid "TEAM^Pink"
-msgstr ""
+msgstr "TEAM^Pembe"
 
 #: qcsrc/common/teams.qh:33
 msgid "Team"
-msgstr ""
+msgstr "Takım"
 
 #: qcsrc/common/teams.qh:34
 msgid "Neutral"
-msgstr ""
+msgstr "Tarafsız"
 
 #: qcsrc/common/teams.qh:37
 msgid "KEY^Red"
-msgstr ""
+msgstr "KEY^Kırmızı"
 
 #: qcsrc/common/teams.qh:38
 msgid "KEY^Blue"
-msgstr ""
+msgstr "KEY^Mavi"
 
 #: qcsrc/common/teams.qh:39
 msgid "KEY^Yellow"
-msgstr ""
+msgstr "KEY^Sarı"
 
 #: qcsrc/common/teams.qh:40
 msgid "KEY^Pink"
-msgstr ""
+msgstr "KEY^Pembe"
 
 #: qcsrc/common/teams.qh:41
 msgid "FLAG^Red"
-msgstr ""
+msgstr "FLAG^Kırmızı"
 
 #: qcsrc/common/teams.qh:42
 msgid "FLAG^Blue"
-msgstr ""
+msgstr "FLAG^Mavi"
 
 #: qcsrc/common/teams.qh:43
 msgid "FLAG^Yellow"
-msgstr ""
+msgstr "FLAG^Sarı"
 
 #: qcsrc/common/teams.qh:44
 msgid "FLAG^Pink"
-msgstr ""
+msgstr "FLAG^Pembe"
 
 #: qcsrc/common/teams.qh:45
 msgid "GENERATOR^Red"
-msgstr ""
+msgstr "GENERATOR^Kırmızı"
 
 #: qcsrc/common/teams.qh:46
 msgid "GENERATOR^Blue"
-msgstr ""
+msgstr "GENERATOR^Mavi"
 
 #: qcsrc/common/teams.qh:47
 msgid "GENERATOR^Yellow"
-msgstr ""
+msgstr "GENERATOR^Sarı"
 
 #: qcsrc/common/teams.qh:48
 msgid "GENERATOR^Pink"
-msgstr ""
+msgstr "GENERATOR^Pembe"
 
 #: qcsrc/common/turrets/all.qh:51
 msgid "Turrets dump command only works with sv_cmd.\n"
@@ -6725,32 +6727,32 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:18
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:19
 msgid "Effects"
-msgstr ""
+msgstr "Efekt"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:20
 msgid "Audio"
-msgstr ""
+msgstr "Ses"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:22
 msgid "Game"
-msgstr ""
+msgstr "Oyun"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:23
 msgid "Input"
-msgstr ""
+msgstr "Giriş"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:24
 msgid "User"
-msgstr ""
+msgstr "Kullanıcı"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:25
 #: qcsrc/menu/xonotic/keybinder.qc:105
 msgid "Misc"
-msgstr ""
+msgstr "Karışık"
 
 #: qcsrc/menu/xonotic/dialog_settings.qh:6
 msgid "Settings"
@@ -6762,11 +6764,11 @@ msgstr "Oyun ayarlarını değiştir"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
 msgid "Master:"
-msgstr ""
+msgstr "Deneyimli:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
 msgid "Music:"
-msgstr ""
+msgstr "Müzik:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
 msgid "VOL^Ambient:"
@@ -6786,19 +6788,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:71
 msgid "Player:"
-msgstr ""
+msgstr "Oyuncu:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:78
 msgid "Shots:"
-msgstr ""
+msgstr "Atış:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:85
 msgid "Voice:"
-msgstr ""
+msgstr "Ses:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:93
 msgid "Weapons:"
-msgstr ""
+msgstr "Cephane:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
 msgid "New style sound attenuation"
@@ -6818,75 +6820,75 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:108
 msgid "8 kHz"
-msgstr ""
+msgstr "8 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:109
 msgid "11.025 kHz"
-msgstr ""
+msgstr "11.025 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:110
 msgid "16 kHz"
-msgstr ""
+msgstr "16 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:111
 msgid "22.05 kHz"
-msgstr ""
+msgstr "22.05 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:112
 msgid "24 kHz"
-msgstr ""
+msgstr "24 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:113
 msgid "32 kHz"
-msgstr ""
+msgstr "32 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:114
 msgid "44.1 kHz"
-msgstr ""
+msgstr "44.1 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:115
 msgid "48 kHz"
-msgstr ""
+msgstr "48 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:119
 msgid "Channels:"
-msgstr ""
+msgstr "Kanallar:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
 msgid "Number of channels for the sound output"
-msgstr ""
+msgstr "Ses çıkışı için kanal sayısı"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:122
 msgid "Mono"
-msgstr ""
+msgstr "Mono"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:123
 msgid "Stereo"
-msgstr ""
+msgstr "Stereo"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:124
 msgid "2.1"
-msgstr ""
+msgstr "2.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:125
 msgid "4"
-msgstr ""
+msgstr "4"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:126
 msgid "5"
-msgstr ""
+msgstr "5"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:127
 msgid "5.1"
-msgstr ""
+msgstr "5.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:128
 msgid "6.1"
-msgstr ""
+msgstr "6.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:129
 msgid "7.1"
-msgstr ""
+msgstr "7.1"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
 msgid "Swap stereo output channels"
@@ -8056,21 +8058,21 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
 #, c-format
 msgid "%d fps"
-msgstr ""
+msgstr "%d fps"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
 #, c-format
 msgid "%d KB/s"
-msgstr ""
+msgstr "%d KB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
 #, c-format
 msgid "%d MB/s"
-msgstr ""
+msgstr "%d MB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
 msgid "Network"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
 msgid "Client UDP port:"
@@ -8090,19 +8092,19 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
 msgid "56k"
-msgstr ""
+msgstr "56k"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
 msgid "ISDN"
-msgstr ""
+msgstr "ISDN"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
 msgid "Slow ADSL"
-msgstr ""
+msgstr "Yavaş ADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
 msgid "Fast ADSL"
-msgstr ""
+msgstr "Hızlı ADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
 msgid "Broadband"
@@ -8375,11 +8377,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:54
 msgid "16bit"
-msgstr ""
+msgstr "16bit"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:55
 msgid "32bit"
-msgstr ""
+msgstr "32bit"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:59
 msgid "Full screen"
@@ -8418,20 +8420,20 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:75
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:86
 msgid "2x"
-msgstr ""
+msgstr "2x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:76
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:87
 msgid "4x"
-msgstr ""
+msgstr "4x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:77
 msgid "8x"
-msgstr ""
+msgstr "8x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:78
 msgid "16x"
-msgstr ""
+msgstr "16x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:81
 msgid "Antialiasing:"
@@ -8967,11 +8969,11 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/skinlist.qc:70
 msgid "<TITLE>"
-msgstr ""
+msgstr "<TITLE>"
 
 #: qcsrc/menu/xonotic/skinlist.qc:71
 msgid "<AUTHOR>"
-msgstr ""
+msgstr "<AUTHOR>"
 
 #: qcsrc/menu/xonotic/slider_decibels.qc:72
 msgid "VOL^MAX"
@@ -8984,7 +8986,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/slider_decibels.qc:82
 #, c-format
 msgid "%s dB"
-msgstr ""
+msgstr "%s dB"
 
 #: qcsrc/menu/xonotic/slider_particles.qc:13
 msgid ""
index 669d4a4..1a5ec83 100644 (file)
@@ -9,7 +9,8 @@
 # kalawore <kalawore@outlook.com>, 2015
 # Losier Blackheath <losier.cc@gmail.com>, 2018
 # sapphireliu <balancedliu@gmail.com>, 2014
-# 茂森 杜 <dumaosen_main01@outlook.com>, 2018
+# 杜茂森 <dumaosen_main01@outlook.com>, 2018
+# 杜茂森 <dumaosen_main01@outlook.com>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
diff --git a/qcsrc/.vscode/settings.json b/qcsrc/.vscode/settings.json
new file mode 100644 (file)
index 0000000..a0042aa
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "files.associations": {
+        "*.qc": "c",
+        "*.qh": "c",
+        "*.inc": "c"
+    },
+    "C_Cpp.errorSquiggles": "Disabled",
+    "C_Cpp.dimInactiveRegions": false
+}
index ffab462..5172731 100644 (file)
@@ -1357,20 +1357,21 @@ void HUD_Crosshair(entity this)
 
 #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
                        MACRO_BEGIN { \
+                               vector scaled_sz = sz * wcross_size; \
                                if(wcross_blur > 0) \
                                { \
                                        for(i = -2; i <= 2; ++i) \
                                        for(j = -2; j <= 2; ++j) \
-                                       M(i,j,sz,wcross_name,wcross_alpha*0.04); \
+                                       M(i,j,sz,scaled_sz,wcross_name,wcross_alpha*0.04); \
                                } \
                                else \
                                { \
-                                       M(0,0,sz,wcross_name,wcross_alpha); \
+                                       M(0,0,sz,scaled_sz,wcross_name,wcross_alpha); \
                                } \
                        } MACRO_END
 
-#define CROSSHAIR_DRAW_SINGLE(i,j,sz,wcross_name,wcross_alpha) \
-                       drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size.x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size.y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
+#define CROSSHAIR_DRAW_SINGLE(i,j,sz,scaled_sz,wcross_name,wcross_alpha) \
+                       drawpic(wcross_origin - ('0.5 0 0' * (scaled_sz.x + i * wcross_blur) + '0 0.5 0' * (scaled_sz.y + j * wcross_blur)), wcross_name, scaled_sz, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
 
 #define CROSSHAIR_DRAW(sz,wcross_name,wcross_alpha) \
                        CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
index 0b87c03..224fbcb 100644 (file)
@@ -534,9 +534,10 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
                        Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED, player.netname, first.netname);
                }
 
-               IL_EACH(reviving_players, true, {
-                       STAT(REVIVE_PROGRESS, it) = STAT(REVIVE_PROGRESS, player);
-               });
+               if (reviving_players)
+                       IL_EACH(reviving_players, true, {
+                               STAT(REVIVE_PROGRESS, it) = STAT(REVIVE_PROGRESS, player);
+                       });
        }
 
        if (reviving_players)
index b4c4dc6..854e37e 100644 (file)
@@ -1625,6 +1625,11 @@ bool ons_Teleport(entity player, entity tele_target, float range, bool tele_effe
                                player.angles = '0 1 0' * ( theta * RAD2DEG + 180 );
                                makevectors(player.angles);
                                player.fixangle = true;
+                               if (IS_BOT_CLIENT(player))
+                               {
+                                       player.v_angle = player.angles;
+                                       bot_aim_reset(player);
+                               }
                                player.teleport_antispam = time + autocvar_g_onslaught_teleport_wait;
 
                                if ( tele_effects )
index 403d956..6482a3d 100644 (file)
@@ -113,6 +113,11 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
        setorigin(player, to);
        player.oldorigin = to; // don't undo the teleport by unsticking
        player.angles = to_angles;
+       if (IS_BOT_CLIENT(player))
+       {
+               player.v_angle = player.angles;
+               bot_aim_reset(player);
+       }
        player.fixangle = true;
        player.velocity = to_velocity;
        BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
index 68c5114..f72f943 100644 (file)
@@ -34,12 +34,8 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
 void trigger_teleport_use(entity this, entity actor, entity trigger);
 
 #define TDEATHLOOP(o) \
-       entity head; \
-       vector deathmin; \
-       vector deathmax; \
-       float deathradius; \
-       deathmin = (o) + player.mins; \
-       deathmax = (o) + player.maxs; \
+       vector deathmin = (o) + player.mins; \
+       vector deathmax = (o) + player.maxs; \
        if(telefragmin != telefragmax) \
        { \
                if(deathmin.x > telefragmin.x) deathmin.x = telefragmin.x; \
@@ -49,11 +45,9 @@ void trigger_teleport_use(entity this, entity actor, entity trigger);
                if(deathmax.y < telefragmax.y) deathmax.y = telefragmax.y; \
                if(deathmax.z < telefragmax.z) deathmax.z = telefragmax.z; \
        } \
-       deathradius = max(vlen(deathmin), vlen(deathmax)); \
-       for(head = findradius(o, deathradius); head; head = head.chain) \
-               if(head != player) \
-                       if(head.takedamage) \
-                               if(boxesoverlap(deathmin, deathmax, head.absmin, head.absmax))
+       float deathradius = max(vlen(deathmin), vlen(deathmax)); \
+       for (entity head = findradius(o, deathradius); head; head = head.chain) \
+               if (head != player && head.takedamage && boxesoverlap(deathmin, deathmax, head.absmin, head.absmax))
 
 float check_tdeath(entity player, vector org, vector telefragmin, vector telefragmax);
 float tdeath_hit;
index 9338c98..95216fe 100644 (file)
@@ -680,11 +680,21 @@ MUTATOR_HOOKFUNCTION(buffs, ForbidThrowCurrentWeapon)
 
                        closest.velocity = my_vel;
                        closest.angles = my_ang;
+                       if (IS_BOT_CLIENT(closest))
+                       {
+                               closest.v_angle = closest.angles;
+                               bot_aim_reset(closest);
+                       }
                        closest.fixangle = true;
                        closest.oldorigin = my_org;
                        closest.oldvelocity = my_vel;
                        player.velocity = their_vel;
                        player.angles = their_ang;
+                       if (IS_BOT_CLIENT(player))
+                       {
+                               player.v_angle = player.angles;
+                               bot_aim_reset(player);
+                       }
                        player.fixangle = true;
                        player.oldorigin = their_org;
                        player.oldvelocity = their_vel;
index 2805c00..a81d0c4 100644 (file)
@@ -10,6 +10,7 @@
        #include <common/util.qh>
        #include <server/constants.qh>
        #include <server/defs.qh>
+       #include <server/utils.qh>
 #endif
 
 #ifdef WARPZONELIB_KEEPDEBUG
@@ -42,11 +43,17 @@ void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector
        player.lastteleporttime = time;
 #endif
        setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch
+       player.angles = to_angles;
 #ifdef SVQC
        player.oldorigin = to; // for DP's unsticking
        player.fixangle = true;
+       if (IS_BOT_CLIENT(player))
+       {
+               // FIXME find a way to smooth view's angles change for bots too
+               player.v_angle = player.angles;
+               bot_aim_reset(player);
+       }
 #endif
-       player.angles = to_angles;
        player.velocity = to_velocity;
 
        BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
index a8389e2..dce6e9c 100644 (file)
@@ -34,9 +34,7 @@
                if (conv <= 0) { \
                        ret = -1; \
                } else { \
-                       bool esc = false; \
                        if (conv == '=') { \
-                               esc = true; \
                                conv = STRING_ITERATOR_GET(stringiter); \
                                conv -= 64; \
                        } \
index eec56ca..b781ff6 100644 (file)
@@ -27,14 +27,17 @@ void RegisterSLCategories()
                for(i = 0; i < category_ent_count; ++i) \
                { \
                        s = categories[i].override_string; \
-                       if((s != "") && (s != categories[i].cat_name)) \
+                       if(s != "" && s != categories[i].cat_name) \
                        { \
                                catnum = 0; \
                                for(x = 0; x < category_ent_count; ++x) \
-                               { if(categories[x].cat_name == s) { \
-                                       catnum = (x+1); \
-                                       break; \
-                               } } \
+                               { \
+                                       if(categories[x].cat_name == s) \
+                                       { \
+                                               catnum = x + 1; \
+                                               break; \
+                                       } \
+                               } \
                                if(catnum) \
                                { \
                                        strfree(categories[i].override_string); \
index 9373319..3f434db 100644 (file)
@@ -55,6 +55,7 @@ float skill;
 .int wpflags;
 
 bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeedupward, float maxshottime, float applygravity);
+void bot_aim_reset(entity this);
 void bot_clientconnect(entity this);
 void bot_clientdisconnect(entity this);
 void bot_cmdhelp(string scmd);
index e7a2e6a..7af3fab 100644 (file)
@@ -170,6 +170,22 @@ void bot_lagfunc(entity this, float t, float f1, float f2, entity e1, vector v1,
                this.bot_canfire = 1;
 }
 
+void bot_aim_reset(entity this)
+{
+       this.bot_aimdir_executed = true;
+       this.bot_badaimtime = 0;
+       this.bot_aimthinktime = time;
+       this.bot_prevaimtime = time;
+       this.bot_mouseaim = this.v_angle;
+       this.bot_olddesiredang = this.v_angle;
+       this.bot_1st_order_aimfilter = '0 0 0';
+       this.bot_2nd_order_aimfilter = '0 0 0';
+       this.bot_3th_order_aimfilter = '0 0 0';
+       this.bot_4th_order_aimfilter = '0 0 0';
+       this.bot_5th_order_aimfilter = '0 0 0';
+       this.bot_firetimer = 0;
+}
+
 void bot_aimdir(entity this, vector v, float maxfiredeviation)
 {
        float dist, delta_t, blend;
@@ -309,10 +325,15 @@ void bot_aimdir(entity this, vector v, float maxfiredeviation)
        //dprint("e ", vtos(diffang), " < ", ftos(maxfiredeviation), "\n");
 
        // decide whether to fire this time
-       if (v * shotdir >= cos(maxfiredeviation * DEG2RAD))
-       if(vdist(trace_endpos-shotorg, <, 500 + 500 * bound(0, skill + this.bot_aggresskill, 10)) || random()*random()>bound(0,(skill+this.bot_aggresskill)*0.05,1))
-               this.bot_firetimer = time + bound(0.1, 0.5-(skill+this.bot_aggresskill)*0.05, 0.5);
-       //traceline(shotorg,shotorg+shotdir*1000,false,NULL);
+       if (maxfiredeviation != 0 && v * shotdir > cos(maxfiredeviation * DEG2RAD))
+       {
+               traceline(shotorg, shotorg + shotdir * 1000, false, NULL);
+               if (vdist(trace_endpos - shotorg, <, 500 + 500 * bound(0, skill + this.bot_aggresskill, 10))
+                       || random() * random() > bound(0, (skill + this.bot_aggresskill) * 0.05, 1))
+               {
+                       this.bot_firetimer = time + bound(0.1, 0.5 - (skill + this.bot_aggresskill) * 0.05, 0.5);
+               }
+       }
        //dprint(ftos(maxfiredeviation),"\n");
        //dprint(" diff:", vtos(diffang), "\n");
 
@@ -329,20 +350,12 @@ bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeed
 {
        float r, hf, distanceratio;
        vector v;
-       /*
-       eprint(this);
-       dprint("bot_aim(", ftos(shotspeed));
-       dprint(", ", ftos(shotspeedupward));
-       dprint(", ", ftos(maxshottime));
-       dprint(", ", ftos(applygravity));
-       dprint(");\n");
-       */
-
        hf = this.dphitcontentsmask;
        this.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 
-       shotspeed *= W_WeaponSpeedFactor(this);
-       shotspeedupward *= W_WeaponSpeedFactor(this);
+       float speed_factor = W_WeaponSpeedFactor(this);
+       shotspeed *= speed_factor;
+       shotspeedupward *= speed_factor;
        if (!shotspeed)
        {
                LOG_TRACE("bot_aim: WARNING: weapon ", this.(weaponentity).m_weapon.m_name, " shotspeed is zero!");
@@ -390,6 +403,12 @@ bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeed
                }
        }
 
+       if (time > this.bot_firetimer)
+       {
+               this.dphitcontentsmask = hf;
+               return false;
+       }
+
        //if (r > maxshottime * shotspeed)
        //      return false;
        this.dphitcontentsmask = hf;
index 1eb71bc..2a31451 100644 (file)
@@ -93,6 +93,7 @@ void bot_lagfunc(entity this, float t, float f1, float f2, entity e1, vector v1,
 float bot_shouldattack(entity this, entity targ);
 void bot_aimdir(entity this, vector v, float maxfiredeviation);
 bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeedupward, float maxshottime, bool applygravity);
+void bot_aim_reset(entity this);
 float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, float shotspeed, float shotspeedupward, float maxtime, float shotdelay, entity ignore);
 
 vector bot_shotlead(vector targorigin, vector targvelocity, float shotspeed, float shotdelay);
index 17a7c29..b823986 100644 (file)
@@ -31,6 +31,11 @@ void havocbot_ai(entity this)
        if(this.draggedby)
                return;
 
+       this.bot_aimdir_executed = false;
+       // lock aim if teleported or passing through a warpzone
+       if (this.lastteleporttime && !this.jumppadcount)
+               this.bot_aimdir_executed = true;
+
        if(bot_execute_commands(this))
                return;
 
@@ -106,8 +111,6 @@ void havocbot_ai(entity this)
        havocbot_aim(this);
        lag_update(this);
 
-       this.bot_aimdir_executed = false;
-
        if (this.bot_aimtarg)
        {
                this.aistatus |= AI_STATUS_ATTACKING;
@@ -137,7 +140,7 @@ void havocbot_ai(entity this)
                else
                {
                        if(IS_PLAYER(this.bot_aimtarg))
-                               bot_aimdir(this, this.bot_aimtarg.origin + this.bot_aimtarg.view_ofs - this.origin - this.view_ofs , -1);
+                               bot_aimdir(this, this.bot_aimtarg.origin + this.bot_aimtarg.view_ofs - this.origin - this.view_ofs, 0);
                }
        }
        else if (this.goalcurrent)
@@ -153,7 +156,7 @@ void havocbot_ai(entity this)
                vector dir = get_closer_dest(this.goalcurrent, this.origin);
                dir -= this.origin + this.view_ofs;
                dir.z = 0;
-               bot_aimdir(this, dir, -1);
+               bot_aimdir(this, dir, 0);
        }
 
        // if the bot is not attacking, consider reloading weapons
@@ -577,7 +580,7 @@ void havocbot_movetogoal(entity this)
                                        this.aistatus &= ~AI_STATUS_OUT_JUMPPAD;
                                }
                        }
-                       else
+                       else //if (this.goalcurrent)
                        {
                                if (this.goalcurrent.bot_pickup)
                                {
@@ -601,9 +604,9 @@ void havocbot_movetogoal(entity this)
                                        return;
                        }
                }
-               else
+               else //if (!(this.aistatus & AI_STATUS_OUT_JUMPPAD))
                {
-                       if(time - this.lastteleporttime > 0.2 && this.velocity.z > 0)
+                       if(this.origin.z - this.lastteleport_origin.z > (this.maxs.z - this.mins.z) * 0.5)
                        {
                                vector velxy = this.velocity; velxy_z = 0;
                                if(vdist(velxy, <, autocvar_sv_maxspeed * 0.2))
@@ -794,8 +797,26 @@ void havocbot_movetogoal(entity this)
                        // don't remove if not visible
                        if (checkpvs(this.origin + this.view_ofs, this.goalcurrent))
                        {
-                               navigation_goalrating_timeout_force(this);
-                               return;
+                               if (IS_DEAD(this.goalcurrent))
+                               {
+                                       IL_EACH(g_items, it.enemy == this.goalcurrent && Item_IsLoot(it),
+                                       {
+                                               if (vdist(it.origin - this.goalcurrent.death_origin, <, 50))
+                                               {
+                                                       navigation_clearroute(this);
+                                                       navigation_pushroute(this, it);
+                                                       // loot can't be immediately rated since it isn't on ground yet
+                                                       // it will be rated after a second when on ground, meanwhile head to it
+                                                       navigation_goalrating_timeout_expire(this, 1);
+                                                       return;
+                                               }
+                                       });
+                               }
+                               if (!Item_IsLoot(this.goalcurrent))
+                               {
+                                       navigation_goalrating_timeout_force(this);
+                                       return;
+                               }
                        }
                }
                else if (!(STAT(FROZEN, this.goalentity)) && this.bot_tracewalk_time < time)
@@ -881,7 +902,8 @@ void havocbot_movetogoal(entity this)
 
        diff = destorg - this.origin;
 
-       if (this.goalcurrent == this.goalentity && time < this.goalentity_lock_timeout && vdist(diff, <, 10))
+       if (time < this.bot_stop_moving_timeout
+               || (this.goalcurrent == this.goalentity && time < this.goalentity_lock_timeout && vdist(diff, <, 10)))
        {
                // stop if the locked goal has been reached
                destorg = this.origin;
@@ -928,12 +950,18 @@ void havocbot_movetogoal(entity this)
                        }
                        else
                        {
-                               dir = flatdir;
                                if(this.velocity.z >= 0 && !(this.watertype == CONTENT_WATER && destorg.z < this.origin.z) &&
                                        (this.aistatus & AI_STATUS_OUT_WATER))
+                               {
                                        PHYS_INPUT_BUTTON_JUMP(this) = true;
+                                       dir = flatdir;
+                               }
                                else
+                               {
                                        PHYS_INPUT_BUTTON_JUMP(this) = false;
+                                       if (destorg.z > this.origin.z)
+                                               dir = flatdir;
+                               }
                        }
                }
                else
@@ -1065,6 +1093,12 @@ void havocbot_movetogoal(entity this)
                        // Check for water/slime/lava and dangerous edges
                        // (only when the bot is on the ground or jumping intentionally)
 
+                       if (skill + this.bot_moveskill <= 3 && time > this.bot_stop_moving_timeout
+                               && current_speed > maxspeed * 0.9 && fabs(deviation.y) > 70)
+                       {
+                               this.bot_stop_moving_timeout = time + 0.4 + random() * 0.2;
+                       }
+
                        offset = (vdist(this.velocity, >, 32) ? this.velocity * 0.2 : v_forward * 32);
                        vector dst_ahead = this.origin + this.view_ofs + offset;
                        vector dst_down = dst_ahead - '0 0 3000';
@@ -1168,13 +1202,11 @@ void havocbot_movetogoal(entity this)
                }
                if (ladder_zdir)
                {
-                       if (vdist(flatdir, <, 15))
-                               dir = ladder_zdir * '0 0 1';
+                       if (vdist(vec2(diff), <, 40))
+                               dir.z = ladder_zdir * 4;
                        else
-                       {
-                               dir.z = ladder_zdir * 1.3;
-                               dir = normalize(dir);
-                       }
+                               dir.z = ladder_zdir * 2;
+                       dir = normalize(dir);
                }
        }
 
@@ -1188,8 +1220,14 @@ void havocbot_movetogoal(entity this)
                dir = normalize(dir);
        }
 
+       // already executed when bot targets an enemy
        if (!this.bot_aimdir_executed)
-               bot_aimdir(this, dir, -1);
+       {
+               if (time < this.bot_stop_moving_timeout)
+                       bot_aimdir(this, normalize(this.goalcurrent.origin - this.origin), 0);
+               else
+                       bot_aimdir(this, dir, 0);
+       }
 
        if (!ladder_zdir)
        {
@@ -1197,6 +1235,7 @@ void havocbot_movetogoal(entity this)
                dir = normalize(dir + dodge);
        }
 
+       makevectors(this.v_angle);
        //dir = this.bot_dodgevector;
        //if (this.bot_dodgevector_jumpbutton)
        //      PHYS_INPUT_BUTTON_JUMP(this) = true;
@@ -1560,14 +1599,14 @@ float havocbot_moveto(entity this, vector pos)
                        vector dir = get_closer_dest(this.goalcurrent, this.origin);
                        dir -= this.origin + this.view_ofs;
                        dir.z = 0;
-                       bot_aimdir(this, dir, -1);
+                       bot_aimdir(this, dir, 0);
                }
 
                if(this.aistatus & AI_STATUS_WAYPOINT_PERSONAL_REACHED)
                {
                        // Step 5: Waypoint reached
                        LOG_TRACE(this.netname, "'s personal waypoint reached");
-                       delete(this.havocbot_personal_waypoint);
+                       waypoint_remove(this.havocbot_personal_waypoint);
                        this.aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_REACHED;
                        return CMD_STATUS_FINISHED;
                }
index b3c0c3e..2ec6316 100644 (file)
@@ -23,6 +23,7 @@
 .float havocbot_stickenemy;
 .float havocbot_role_timeout;
 
+.float bot_stop_moving_timeout;
 .float bot_tracewalk_time;
 .entity ignoregoal;
 .entity bot_lastseengoal;
index 8fe72ff..7c7f7e1 100644 (file)
@@ -742,6 +742,7 @@ bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float e
 // completely empty the goal stack, used when deciding where to go
 void navigation_clearroute(entity this)
 {
+       this.lastteleporttime = 0;
        this.goalcurrent_prev = this.goalcurrent;
        this.goalcurrent_distance_2d = FLOAT_MAX;
        this.goalcurrent_distance_z = FLOAT_MAX;
@@ -1611,11 +1612,12 @@ int navigation_poptouchedgoals(entity this)
                if (!this.goalcurrent.wpisbox // warpzone
                        && vlen2(this.origin - this.goalstack01.origin) < vlen2(this.origin - this.goalcurrent.origin))
                {
+                       // immediately remove origin and destination waypoints
                        navigation_poproute(this);
                        ++removed_goals;
                        navigation_poproute(this);
                        ++removed_goals;
-                       return removed_goals;
+                       this.lastteleporttime = 0;
                }
 
                // make sure jumppad is really hit, don't rely on distance based checks
@@ -1638,12 +1640,17 @@ int navigation_poptouchedgoals(entity this)
                                if (time - this.lastteleporttime < random() * max_delay)
                                        return removed_goals;
                        }
+                       else if (this.goalcurrent.wpisbox) // teleport
+                       {
+                               // immediately remove origin and destination waypoints
+                               navigation_poproute(this);
+                               ++removed_goals;
+                       }
                        navigation_poproute(this);
                        this.lastteleporttime = 0;
                        ++removed_goals;
                }
-               else
-                       return removed_goals;
+               return removed_goals;
        }
        else if (this.lastteleporttime > 0)
        {
@@ -1675,6 +1682,9 @@ int navigation_poptouchedgoals(entity this)
                        ++removed_goals;
                        return removed_goals;
                }
+               // reset of lastteleporttime can be overriden by a jumppad when it's set
+               // in more than one frame: make sure it's reset
+               this.lastteleporttime = 0;
        }
 
        // Loose goal touching check when running
@@ -1796,6 +1806,7 @@ void navigation_goalrating_start(entity this)
        navigation_clearroute(this);
        navigation_bestgoal = NULL;
        navigation_markroutes(this, wp);
+       this.goalstack31 = wp; // temporarly save the really close waypoint
 }
 
 // ends a goal selection session (updates goal stack to the best goal)
@@ -1804,19 +1815,27 @@ void navigation_goalrating_end(entity this)
        if(this.aistatus & AI_STATUS_STUCK)
                return;
 
+       entity wp = this.goalstack31; // save to wp as this.goalstack31 is set by navigation_routetogoal
+       this.goalstack31 = NULL;
+
        navigation_routetogoal(this, navigation_bestgoal, this.origin);
        LOG_DEBUG("best goal ", this.goalcurrent.classname);
 
+       if (wp && this.goalcurrent == wp)
+               navigation_poproute(this);
+
        // If the bot got stuck then try to reach the farthest waypoint
-       if (!this.goalentity && autocvar_bot_wander_enable)
+       if (!this.goalentity)
        {
-               if (!(this.aistatus & AI_STATUS_STUCK))
+               if (autocvar_bot_wander_enable && !(this.aistatus & AI_STATUS_STUCK))
                {
                        LOG_DEBUG(this.netname, " cannot walk to any goal");
                        this.aistatus |= AI_STATUS_STUCK;
                }
+               this.goalentity_shouldbefrozen = false;
        }
-       this.goalentity_shouldbefrozen = boolean(STAT(FROZEN, this.goalentity));
+       else
+               this.goalentity_shouldbefrozen = boolean(STAT(FROZEN, this.goalentity));
 }
 
 void botframe_updatedangerousobjects(float maxupdate)
index b8b067c..d002ae2 100644 (file)
@@ -52,8 +52,7 @@ entity navigation_bestgoal;
        waypoint_addlink_customcost(to_item, from_wp, waypoint_getlinkcost(from_wp, to_item))
 
 #define TELEPORT_USED(pl, tele_wp) \
-       (time - pl.lastteleporttime < ((tele_wp.wpflags & WAYPOINTFLAG_PERSONAL) ? 2 : 0.15) \
-       && boxesoverlap(tele_wp.absmin, tele_wp.absmax, pl.lastteleport_origin + STAT(PL_MIN, pl), pl.lastteleport_origin + STAT(PL_MAX, pl)))
+       boxesoverlap(tele_wp.absmin, tele_wp.absmax, pl.lastteleport_origin + STAT(PL_MIN, pl), pl.lastteleport_origin + STAT(PL_MAX, pl))
 
 vector tracewalk_dest;
 float tracewalk_dest_height;
index 84cca9f..8b05910 100644 (file)
@@ -295,7 +295,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        // spawn only one destination waypoint for teleports teleporting player to the exact same spot
        // otherwise links loaded from file would be applied only to the first destination
        // waypoint since link format doesn't specify waypoint entities but just positions
-       if((f & WAYPOINTFLAG_GENERATED) && !(f & WAYPOINTFLAG_NORELINK) && m1 == m2)
+       if((f & WAYPOINTFLAG_GENERATED) && !(f & (WAYPOINTFLAG_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2)
        {
                IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax),
                {
index 5ca5270..c22737e 100644 (file)
@@ -95,8 +95,7 @@ float CheatsAllowed(entity this, float i, int argc, float fr) // the cheat gets
 }
 
 #define BEGIN_CHEAT_FUNCTION() \
-       float cheating, attempting; \
-       cheating = 0; attempting = 0
+       float cheating = 0, attempting = 0
 #define DID_CHEAT() \
        ++cheating
 #define ADD_CHEATS(e,n) \
index 01c8222..0164444 100644 (file)
@@ -622,7 +622,10 @@ void PutPlayerInServer(entity this)
        this.angles = spot.angles;
        this.angles_z = 0; // never spawn tilted even if the spot says to
        if (IS_BOT_CLIENT(this))
+       {
                this.v_angle = this.angles;
+               bot_aim_reset(this);
+       }
        this.fixangle = true; // turn this way immediately
        this.oldvelocity = this.velocity = '0 0 0';
        this.avelocity = '0 0 0';
@@ -1054,6 +1057,8 @@ string getwelcomemessage(entity this)
        return s;
 }
 
+bool autocvar_sv_qcphysics = false; // TODO this is for testing - remove when qcphysics work
+
 /**
 =============
 ClientConnect
@@ -1146,7 +1151,7 @@ void ClientConnect(entity this)
        if (IS_REAL_CLIENT(this))
                sv_notice_join(this);
 
-       this.move_qcphysics = true;
+       this.move_qcphysics = autocvar_sv_qcphysics;
 
        // update physics stats (players can spawn before physics runs)
        Physics_UpdateStats(this);
index 5286032..603b32a 100644 (file)
@@ -84,8 +84,11 @@ void race_writeTime(string map, float t, string myuid)
                // player has no ranked record yet
                for (i = RANKINGS_CNT; i > newpos; --i)
                {
-                       db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), ftos(race_readTime(map, i - 1)));
-                       db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), race_readUID(map, i - 1));
+                       float other_time = race_readTime(map, i - 1);
+                       if (other_time) {
+                               db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), ftos(other_time));
+                               db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), race_readUID(map, i - 1));
+                       }
                }
        }
 
index 9e78aa3..dfa1389 100644 (file)
@@ -26,6 +26,7 @@
 void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vector s_forward, vector mi, vector ma, float antilag, float recoil, Sound snd, float chan, float maxdamage, float range, int deathtype)
 {
        TC(Sound, snd);
+       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(!IS_CLIENT(ent))
@@ -73,20 +74,22 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect
        vector md = ent.(weaponentity).movedir;
        vector vecs = ((md.x > 0) ? md : '0 0 0');
 
-       vector dv = v_forward * vecs.x + v_right * -vecs.y + v_up * vecs.z;
-       w_shotorg = ent.origin + ent.view_ofs;
+       // TODO this is broken - see 637056bea7bf7f5c9c0fc6113e94731a2767476 for an attempted fix
+       // which fixes issue #1957 but causes #2129
+       vector dv = v_right * -vecs.y + v_up * vecs.z;
+       w_shotorg = ent.origin + ent.view_ofs + dv;
 
        // now move the shotorg forward as much as requested if possible
        if(antilag)
        {
                if(CS(ent).antilag_debug)
-                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, CS(ent).antilag_debug);
+                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug);
                else
-                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
+                       tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
        }
        else
-               tracebox(w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent);
-       w_shotorg = trace_endpos;
+               tracebox(w_shotorg, mi, ma, w_shotorg + v_forward * (vecs.x + nudge), MOVE_NORMAL, ent);
+       w_shotorg = trace_endpos - v_forward * nudge;
        // calculate the shotdir from the chosen shotorg
        if(W_DualWielding(ent))
                w_shotdir = s_forward;
@@ -151,7 +154,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect
        }
 
        // nudge w_shotend so a trace to w_shotend hits
-       w_shotend = w_shotend + normalize(w_shotend - w_shotorg);
+       w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
        //if(w_shotend != prevend) { printf("SERVER: shotEND differs: %s - %s\n", vtos(w_shotend), vtos(prevend)); }
        //if(w_shotorg != prevorg) { printf("SERVER: shotORG differs: %s - %s\n", vtos(w_shotorg), vtos(prevorg)); }
        //if(w_shotdir != prevdir) { printf("SERVER: shotDIR differs: %s - %s\n", vtos(w_shotdir), vtos(prevdir)); }