- 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 '^:'
-Sun Nov 4 07:24:04 CET 2018
+Tue Nov 27 07:24:07 CET 2018
"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"
#: qcsrc/common/vehicles/vehicle/racer.qh:19
msgid "Racer"
-msgstr ""
+msgstr "Αγωνιζόμενος"
#: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
msgid "Racer cannon"
#: 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"
#: 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
#: qcsrc/menu/xonotic/dialog_monstertools.qc:26
msgid "Follow"
-msgstr ""
+msgstr "Ακολούθησε"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:27
msgid "Wander"
#: 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
#: 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
"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"
#: 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)"
#: 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
#: 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"
#: 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
"^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!"
#: 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
#: qcsrc/common/notifications/all.qh:445
msgid "RAGE! "
-msgstr ""
+msgstr "HİDDET! "
#: qcsrc/common/notifications/all.qh:446
#, c-format
#: qcsrc/common/notifications/all.qh:450
msgid "ARMAGEDDON! "
-msgstr ""
+msgstr "KIYAMET!"
#: qcsrc/common/notifications/all.qh:457
#, c-format
#: 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
#: 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"
#: 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"
#: 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:"
#: 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"
#: 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"
#: 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 "Ağ"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
msgid "Client UDP port:"
#: 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"
#: 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"
#: 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:"
#: 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"
#: qcsrc/menu/xonotic/slider_decibels.qc:82
#, c-format
msgid "%s dB"
-msgstr ""
+msgstr "%s dB"
#: qcsrc/menu/xonotic/slider_particles.qc:13
msgid ""
# 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"
--- /dev/null
+{
+ "files.associations": {
+ "*.qc": "c",
+ "*.qh": "c",
+ "*.inc": "c"
+ },
+ "C_Cpp.errorSquiggles": "Disabled",
+ "C_Cpp.dimInactiveRegions": false
+}
#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)
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)
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 )
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);
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; \
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;
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;
#include <common/util.qh>
#include <server/constants.qh>
#include <server/defs.qh>
+ #include <server/utils.qh>
#endif
#ifdef WARPZONELIB_KEEPDEBUG
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);
if (conv <= 0) { \
ret = -1; \
} else { \
- bool esc = false; \
if (conv == '=') { \
- esc = true; \
conv = STRING_ITERATOR_GET(stringiter); \
conv -= 64; \
} \
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); \
.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);
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;
//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");
{
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!");
}
}
+ if (time > this.bot_firetimer)
+ {
+ this.dphitcontentsmask = hf;
+ return false;
+ }
+
//if (r > maxshottime * shotspeed)
// return false;
this.dphitcontentsmask = hf;
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);
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;
havocbot_aim(this);
lag_update(this);
- this.bot_aimdir_executed = false;
-
if (this.bot_aimtarg)
{
this.aistatus |= AI_STATUS_ATTACKING;
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)
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
this.aistatus &= ~AI_STATUS_OUT_JUMPPAD;
}
}
- else
+ else //if (this.goalcurrent)
{
if (this.goalcurrent.bot_pickup)
{
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))
// 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)
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;
}
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
// 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';
}
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);
}
}
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)
{
dir = normalize(dir + dodge);
}
+ makevectors(this.v_angle);
//dir = this.bot_dodgevector;
//if (this.bot_dodgevector_jumpbutton)
// PHYS_INPUT_BUTTON_JUMP(this) = true;
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;
}
.float havocbot_stickenemy;
.float havocbot_role_timeout;
+.float bot_stop_moving_timeout;
.float bot_tracewalk_time;
.entity ignoregoal;
.entity bot_lastseengoal;
// 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;
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
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)
{
++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
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)
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)
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;
// 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),
{
}
#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) \
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';
return s;
}
+bool autocvar_sv_qcphysics = false; // TODO this is for testing - remove when qcphysics work
+
/**
=============
ClientConnect
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);
// 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));
+ }
}
}
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))
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;
}
// 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)); }