- 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=c2ae476e90317feda0756669a21ce1e7
+ - EXPECT=fed9f3b94a544058593aaa8addaa9402
- HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
| tee /dev/stderr
| grep '^:'
-Sun Sep 30 07:24:04 CEST 2018
+Fri Nov 16 07:24:08 CET 2018
seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
-seta hud_powerup 0 "power of the sharpen effect when owning the shield or strength powerups, default is 0.5"
+seta hud_powerup 0 "power of the sharpen effect when owning the shield or strength powerups"
seta hud_postprocessing 1 "enables the ability for effects such as hud_damage_blur and hud_contents to apply a postprocessing method upon the screen - enabling this disables manual editing of the postprocess cvars"
-seta hud_postprocessing_maxbluralpha 0 "maximum alpha which the blur postprocess can be, default is 0.5"
-seta hud_postprocessing_maxblurradius 8 "maximum radius which the blur postprocess can be, default is 8"
+seta hud_postprocessing_maxbluralpha 0 "maximum alpha which the blur postprocess can be"
+seta hud_postprocessing_maxblurradius 8 "maximum radius which the blur postprocess can be"
seta hud_contents 1 "an improved version of gl_polyblend for liquids such as water/lava/slime, draw a filler when inside the liquid"
seta hud_contents_blur 10 "Use postprocessing to blur the screen when you are inside a liquid. Higher values = more blur"
set g_balance_shotgun_secondary_alt_refire 1.2
set g_balance_shotgun_switchdelay_drop 0.2
set g_balance_shotgun_switchdelay_raise 0.2
-set g_balance_shotgun_weaponreplace "shockwave"
-set g_balance_shotgun_weaponstart 0
+set g_balance_shotgun_weaponreplace ""
+set g_balance_shotgun_weaponstart 1
set g_balance_shotgun_weaponstartoverride -1
set g_balance_shotgun_weaponthrowable 1
// }}}
set g_balance_crylink_secondary_animtime 0.2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_damage 50
-set g_balance_crylink_secondary_edgedamage 15
-set g_balance_crylink_secondary_force -400
+set g_balance_crylink_secondary_damage 10
+set g_balance_crylink_secondary_edgedamage 5
+set g_balance_crylink_secondary_force -200
set g_balance_crylink_secondary_joindelay 0
set g_balance_crylink_secondary_joinexplode 0
set g_balance_crylink_secondary_joinexplode_damage 0
set g_balance_crylink_secondary_joinexplode_force 0
set g_balance_crylink_secondary_joinexplode_radius 0
set g_balance_crylink_secondary_joinspread 0
-set g_balance_crylink_secondary_linkexplode 1
+set g_balance_crylink_secondary_linkexplode 0
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_secondary_middle_lifetime 5
-set g_balance_crylink_secondary_other_fadetime 5
-set g_balance_crylink_secondary_other_lifetime 5
-set g_balance_crylink_secondary_radius 70
-set g_balance_crylink_secondary_refire 0.8
-set g_balance_crylink_secondary_shots 1
-set g_balance_crylink_secondary_speed 3000
-set g_balance_crylink_secondary_spread 0
-set g_balance_crylink_secondary_spreadtype 1
+set g_balance_crylink_secondary_other_fadetime 2
+set g_balance_crylink_secondary_other_lifetime 2
+set g_balance_crylink_secondary_radius 100
+set g_balance_crylink_secondary_refire 0.65
+set g_balance_crylink_secondary_shots 5
+set g_balance_crylink_secondary_speed 7000
+set g_balance_crylink_secondary_spread 0.08
+set g_balance_crylink_secondary_spreadtype 0
set g_balance_crylink_switchdelay_drop 0.2
set g_balance_crylink_switchdelay_raise 0.2
set g_balance_crylink_weaponreplace ""
set g_balance_shockwave_switchdelay_drop 0.2
set g_balance_shockwave_switchdelay_raise 0.2
set g_balance_shockwave_weaponreplace ""
-set g_balance_shockwave_weaponstart 1
+set g_balance_shockwave_weaponstart 0
set g_balance_shockwave_weaponstartoverride -1
set g_balance_shockwave_weaponthrowable 0
// }}}
set g_balance_arc_burst_heat 5
set g_balance_arc_beam_maxangle 10
set g_balance_arc_beam_nonplayerdamage 80
-set g_balance_arc_beam_range 1250
+set g_balance_arc_beam_range 1500
set g_balance_arc_beam_refire 0.25
set g_balance_arc_beam_returnspeed 8
-set g_balance_arc_beam_tightness 0.5
+set g_balance_arc_beam_tightness 0.6
set g_balance_arc_bolt 1
set g_balance_arc_bolt_ammo 1
set g_balance_arc_bolt_damage 25
set g_balance_okmachinegun_primary_damage 25
set g_balance_okmachinegun_primary_force 5
set g_balance_okmachinegun_primary_refire 0.1
-set g_balance_okmachinegun_primary_solidpenetration 13.1
+set g_balance_okmachinegun_primary_solidpenetration 63
set g_balance_okmachinegun_primary_spread_add 0.012
set g_balance_okmachinegun_primary_spread_max 0.05
set g_balance_okmachinegun_primary_spread_min 0
# MasterWord, 2016
# Vindex <kon14.inside@gmail.com>, 2014
# Konstantinos Mihalenas <ldinos99@gmail.com>, 2014
+# Marinus Savoritias, 2018
+# Marinus Savoritias, 2018
# MasterWord, 2016
+# Mensious Mensious <ektoras@tutanota.com>, 2018
# Vindex <kon14.inside@gmail.com>, 2014
# Γιάννης Ανθυμίδης, 2011-2012
msgid ""
"Project-Id-Version: Xonotic\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-09 00:35+0200\n"
-"PO-Revision-Date: 2017-09-19 19:54+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\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/client/hud/panel/infomessages.qc:102
#: qcsrc/client/hud/panel/infomessages.qc:106
msgid "next weapon"
-msgstr ""
+msgstr "επόμενο όπλο"
#: qcsrc/client/hud/panel/infomessages.qc:102
#: qcsrc/client/hud/panel/infomessages.qc:106
msgid "previous weapon"
-msgstr ""
+msgstr "προηγούμενο όπλο"
#: qcsrc/client/hud/panel/infomessages.qc:106
#, c-format
#: qcsrc/client/hud/panel/infomessages.qc:128
#: qcsrc/client/hud/panel/infomessages.qc:131
msgid "jump"
-msgstr ""
+msgstr "άλμα"
#: qcsrc/client/hud/panel/infomessages.qc:139
#, c-format
#: qcsrc/client/hud/panel/quickmenu.qc:636
msgid "Continue..."
-msgstr ""
+msgstr "Συνέχεια..."
#: qcsrc/client/hud/panel/quickmenu.qc:794
#: qcsrc/client/hud/panel/quickmenu.qc:798
#: qcsrc/client/hud/panel/quickmenu.qc:806
msgid "QMCMD^negative"
-msgstr ""
+msgstr "QMCMD^αρνητικό"
#: qcsrc/client/hud/panel/quickmenu.qc:807
msgid "QMCMD^positive"
-msgstr ""
+msgstr "QMCMD^θετικό"
#: qcsrc/client/hud/panel/quickmenu.qc:808
msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:829
msgid "QMCMD^FPS"
-msgstr ""
+msgstr "QMCMD^FPS"
#: qcsrc/client/hud/panel/quickmenu.qc:830
msgid "QMCMD^Net graph"
#: qcsrc/client/hud/panel/scoreboard.qc:92
msgid "SCO^k/d"
-msgstr ""
+msgstr "SCO^k/d"
#: qcsrc/client/hud/panel/scoreboard.qc:93
msgid "SCO^kdr"
-msgstr ""
+msgstr "SCO^kdr"
#: qcsrc/client/hud/panel/scoreboard.qc:94
msgid "SCO^kills"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "SCO^rounds won"
-msgstr ""
+msgstr "SCO^γύροι νικήθηκαν"
#: qcsrc/client/hud/panel/scoreboard.qc:110
msgid "SCO^score"
-msgstr ""
+msgstr "SCO^score"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "SCO^suicides"
#: 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/hud/panel/scoreboard.qc:1295
msgid "Map stats:"
-msgstr ""
+msgstr "Στατιστικά χάρτη:"
#: qcsrc/client/hud/panel/scoreboard.qc:1325
msgid "Monsters killed:"
#: qcsrc/client/hud/panel/scoreboard.qc:1519
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
msgid "Scoreboard"
-msgstr ""
+msgstr "Scoreboard"
#: qcsrc/client/hud/panel/scoreboard.qc:1584
#, c-format
#: qcsrc/client/hud/panel/scoreboard.qc:1635
#: qcsrc/client/hud/panel/scoreboard.qc:1654
msgid " or"
-msgstr ""
+msgstr "ή"
#: qcsrc/client/hud/panel/scoreboard.qc:1638
#: qcsrc/client/hud/panel/scoreboard.qc:1645
#, c-format
msgid " until ^3%s %s^7"
-msgstr ""
+msgstr " μέχρι ^3%s %s^7"
#: qcsrc/client/hud/panel/scoreboard.qc:1639
#: qcsrc/client/hud/panel/scoreboard.qc:1646
#: qcsrc/client/main.qc:1014
msgid " qu/s"
-msgstr ""
+msgstr " qu/s"
#: qcsrc/client/main.qc:1016
msgid " m/s"
#: qcsrc/common/items/item/jetpack.qh:35
msgid "Jet Pack"
-msgstr ""
+msgstr "Jet Pack"
#: qcsrc/common/items/item/jetpack.qh:82
msgid "Fuel regen"
#: qcsrc/common/items/item/powerup.qh:44
msgid "Strength"
-msgstr ""
+msgstr "Δύναμη"
#: qcsrc/common/items/item/powerup.qh:76
msgid "Shield"
-msgstr ""
+msgstr "Ασπίδα"
#: qcsrc/common/mapinfo.qc:639
#, no-c-format
#: qcsrc/common/mapinfo.qh:99
msgid "Deathmatch"
-msgstr ""
+msgstr "Deathmatch"
#: qcsrc/common/mapinfo.qh:99
msgid "Score as many frags as you can"
#: qcsrc/common/mapinfo.qh:111
msgid "Last Man Standing"
-msgstr ""
+msgstr "Last Man Standing"
#: qcsrc/common/mapinfo.qh:111
msgid "Survive and kill until the enemies have no lives left"
#: qcsrc/common/mapinfo.qh:160
msgid "Race CTS"
-msgstr ""
+msgstr "Race CTS"
#: qcsrc/common/mapinfo.qh:160
msgid "Race for fastest time."
-msgstr ""
+msgstr "Αγώνας για τον γρηγορότερο χρόνο."
#: qcsrc/common/mapinfo.qh:184
msgid "Help your team score the most frags against the enemy team"
#: qcsrc/common/mapinfo.qh:184
msgid "Team Deathmatch"
-msgstr ""
+msgstr "Team Deathmatch"
#: qcsrc/common/mapinfo.qh:220
msgid "Capture the Flag"
#: qcsrc/common/mapinfo.qh:371
msgid "Onslaught"
-msgstr ""
+msgstr "Onslaught"
#: qcsrc/common/mapinfo.qh:387
msgid "Nexball"
#: qcsrc/common/minigames/cl_minigames.qc:383
msgid "It's your turn"
-msgstr ""
+msgstr "Είναι η σειρά σου"
#: qcsrc/common/minigames/cl_minigames_hud.qc:331
#: qcsrc/menu/xonotic/dialog_quit.qh:6
#: qcsrc/common/minigames/cl_minigames_hud.qc:336
msgid "Invite"
-msgstr ""
+msgstr "Πρόσκληση"
#: qcsrc/common/minigames/cl_minigames_hud.qc:378
msgid "Current Game"
#: qcsrc/common/minigames/cl_minigames_hud.qc:489
msgid "Minigames"
-msgstr ""
+msgstr "Minigames"
#: qcsrc/common/minigames/minigame/bd.qc:1168
msgid "Better luck next time!"
-msgstr ""
+msgstr "Καλή τύχη την επόμενη φορά!"
#: qcsrc/common/minigames/minigame/bd.qc:1172
msgid "Tubular! Press \"Next Level\" to continue!"
#: qcsrc/common/minigames/minigame/bd.qc:1404
msgid "Next Level"
-msgstr ""
+msgstr "Επόμενο Επίπεδο"
#: qcsrc/common/minigames/minigame/bd.qc:1405
msgid "Restart"
-msgstr ""
+msgstr "Επανακίνηση"
#: qcsrc/common/minigames/minigame/bd.qc:1406
msgid "Editor"
#: qcsrc/common/minigames/minigame/c4.qc:378
#: qcsrc/common/minigames/minigame/nmm.qc:601
msgid "You lost the game!"
-msgstr ""
+msgstr "Έχασες το παιχνίδι!"
#: qcsrc/common/minigames/minigame/c4.qc:379
#: qcsrc/common/minigames/minigame/nmm.qc:602
msgid "You win!"
-msgstr ""
+msgstr "Νίκησες!"
#: qcsrc/common/minigames/minigame/c4.qc:383
#: qcsrc/common/minigames/minigame/nmm.qc:606
#: qcsrc/common/minigames/minigame/pong.qc:570
#: qcsrc/common/minigames/minigame/ttt.qc:299
msgid "AI"
-msgstr ""
+msgstr "AI"
#: qcsrc/common/minigames/minigame/pong.qc:587
msgid "Press ^1Start Match^7 to start the match with the current players"
#: qcsrc/common/minigames/minigame/pong.qc:651
msgid "Start Match"
-msgstr ""
+msgstr "Έναρξη Match"
#: qcsrc/common/minigames/minigame/pong.qc:652
msgid "Add AI player"
-msgstr ""
+msgstr "Προσθήκη παίκτη AI"
#: qcsrc/common/minigames/minigame/pong.qc:653
msgid "Remove AI player"
-msgstr ""
+msgstr "Αφαίρεση παίκτη AI"
#: qcsrc/common/minigames/minigame/pp.qc:443
#: qcsrc/common/minigames/minigame/ttt.qc:324
#: qcsrc/common/minigames/minigame/pp.qc:582
#: qcsrc/common/minigames/minigame/ttt.qc:665
msgid "Next Match"
-msgstr ""
+msgstr "Επόμενο Match"
#: qcsrc/common/minigames/minigame/ps.qc:478
#, c-format
#: qcsrc/common/monsters/monster/wyvern.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:19
msgid "Wyvern"
-msgstr ""
+msgstr "Wyvern"
#: qcsrc/common/monsters/monster/wyvern.qh:28
msgid "Wyvern attack"
-msgstr ""
+msgstr "Επίθεση Wyvern"
#: qcsrc/common/monsters/monster/zombie.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:15
#: qcsrc/common/mutators/mutator/buffs/all.inc:33
#: qcsrc/common/mutators/mutator/instagib/items.qh:94
msgid "Speed"
-msgstr ""
+msgstr "Ταχύτητα"
#: qcsrc/common/mutators/mutator/buffs/all.inc:43
msgid "Medic"
#: qcsrc/common/mutators/mutator/buffs/all.inc:86
msgid "Jump"
-msgstr ""
+msgstr "Άλμα"
#: qcsrc/common/mutators/mutator/buffs/all.inc:95
msgid "Invisible"
#: qcsrc/common/mutators/mutator/buffs/all.inc:128
msgid "Luck"
-msgstr ""
+msgstr "Τύχη"
#: qcsrc/common/mutators/mutator/buffs/all.inc:136
msgid "Flight"
-msgstr ""
+msgstr "Πτύση"
#: qcsrc/common/mutators/mutator/buffs/buffs.qh:7
msgid "Buff"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
msgid "Font size minimum:"
-msgstr ""
+msgstr "Ελάχιστο μέγεθος γραμματοσειράς:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
msgid "Font size maximum:"
-msgstr ""
+msgstr "Μέγιστο μέγεθος γραμματοσειράς:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
msgid "Accumulate range:"
#: qcsrc/common/mutators/mutator/nades/nades.qh:32
msgid "Grenade"
-msgstr ""
+msgstr "Χειροβομβίδα"
#: qcsrc/common/mutators/mutator/overkill/hmg.qh:17
msgid "Heavy Machine Gun"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
msgid "Help me!"
-msgstr ""
+msgstr "Βοήθεια!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
msgid "Here"
-msgstr ""
+msgstr "Εδώ"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:6
msgid "DANGER"
-msgstr ""
+msgstr "ΚΙΝΔΥΝΟΣ"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:8
msgid "Frozen!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
msgid "Item"
-msgstr ""
+msgstr "Αντικείμενο"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
msgid "Checkpoint"
-msgstr ""
+msgstr "Checkpoint"
#: 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"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
msgid "White base"
-msgstr ""
+msgstr "Άσπρη Βάση"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:25
msgid "Red base"
-msgstr ""
+msgstr "Κόκκινη Βάση"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:26
msgid "Blue base"
-msgstr ""
+msgstr "Μπλέ Βάση"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:27
msgid "Yellow base"
-msgstr ""
+msgstr "Κίτρινη Βάση"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:28
msgid "Pink base"
-msgstr ""
+msgstr "Ρόζ Βάση"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
msgid "Return flag here"
-msgstr ""
+msgstr "Επέστρεψε την σημαία εδώ"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
#: 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
msgid "Ball"
-msgstr ""
+msgstr "Μπάλα"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:46
msgid "Ball carrier"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:49
msgid "Goal"
-msgstr ""
+msgstr "Goal"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:54
#: qcsrc/common/mutators/mutator/waypoints/all.inc:55
#: qcsrc/common/mutators/mutator/waypoints/all.inc:57
msgid "Weapon"
-msgstr ""
+msgstr "Όπλο"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:59
msgid "Monster"
-msgstr ""
+msgstr "Τέρας"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:61
msgid "Vehicle"
-msgstr ""
+msgstr "Όχημα"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
msgid "Intruder!"
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:651
#: qcsrc/common/turrets/cl_turrets.qc:120
msgid "Spam"
-msgstr ""
+msgstr "Spam"
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:655
#, c-format
msgid "%s needing help!"
-msgstr ""
+msgstr "%s χρειάζεται βοήθεια!"
#: qcsrc/common/net_notice.qc:87
msgid "^1Server notices:"
#: qcsrc/common/notifications/all.inc:241
#, c-format
msgid "^BG%s^BG captured the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG έπιασε την ^TC^TT^BG σημαία"
#: qcsrc/common/notifications/all.inc:242
#, c-format
"^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG"
"%s^BG's previous record of ^F2%s^BG seconds"
msgstr ""
+"^BG%s^BG έπιασε την ^TC^TT^BG σημαία σε ^F1%s^BG δευτερόλεπτα, ξεπερνώντας "
+"^BG%s^BG's προηγούμενο ρεκόρ των ^F2%s^BG δευτερολέπτων"
#: qcsrc/common/notifications/all.inc:243
#, c-format
msgid "^BG%s^BG captured the flag"
-msgstr ""
+msgstr "^BG%s^BG έπιασε την σημαία"
#: qcsrc/common/notifications/all.inc:244
#, c-format
#: qcsrc/common/notifications/all.inc:259
#, c-format
msgid "^BG%s^BG lost the flag"
-msgstr ""
+msgstr "^BG%s^BG έχασε την σημαία"
#: qcsrc/common/notifications/all.inc:260
#, c-format
msgid "^BG%s^BG got the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG πήρε την ^TC^TT^BG σημαία"
#: qcsrc/common/notifications/all.inc:261
#, c-format
msgid "^BG%s^BG got the flag"
-msgstr ""
+msgstr "^BG%s^BG πήρε την σημαία"
#: qcsrc/common/notifications/all.inc:262
#: qcsrc/common/notifications/all.inc:263
#: qcsrc/common/notifications/all.inc:370
#: qcsrc/common/notifications/all.inc:684
msgid "^TC^TT^BG team wins the round"
-msgstr ""
+msgstr "^TC^TT^BG ομάδα κέρδισε τον γύρο"
#: qcsrc/common/notifications/all.inc:371
#: qcsrc/common/notifications/all.inc:685
#, c-format
msgid "^BG%s^BG wins the round"
-msgstr ""
+msgstr "^BG%s^BG κέρδισε τον γύρο"
#: qcsrc/common/notifications/all.inc:372
#: qcsrc/common/notifications/all.inc:548
msgid "^BGRound tied"
-msgstr ""
+msgstr "^BGRound ισοπαλία"
#: qcsrc/common/notifications/all.inc:373
#: qcsrc/common/notifications/all.inc:549
msgid "^BGRound over, there's no winner"
-msgstr ""
+msgstr "^BGRound τέλος, δεν υπάρχει νικητής"
#: qcsrc/common/notifications/all.inc:375
#, c-format
#: qcsrc/common/notifications/all.inc:698
#, c-format
msgid "^BGYou got the ^F1%s"
-msgstr ""
+msgstr "^BGΠήρες το ^F1%s"
#: qcsrc/common/notifications/all.inc:385
#: qcsrc/common/notifications/all.inc:699
#: qcsrc/common/notifications/all.inc:389
#, c-format
msgid "^BG%s^BG is connecting..."
-msgstr ""
+msgstr "^BG%s^BG συνδέεται...."
#: qcsrc/common/notifications/all.inc:390
#, c-format
msgid "^BG%s^F3 connected"
-msgstr ""
+msgstr "^BG%s^F3 συνδέθηκε"
#: qcsrc/common/notifications/all.inc:391
#, c-format
#: qcsrc/common/notifications/all.inc:422
#, c-format
msgid "^BG%s^F3 disconnected"
-msgstr ""
+msgstr "^BG%s^F3 αποσυνδέθηκε"
#: qcsrc/common/notifications/all.inc:423
#, c-format
#: qcsrc/common/notifications/all.inc:430
#, c-format
msgid "^BG%s^BG has finished the race"
-msgstr ""
+msgstr "^BG%s^BG τερμάτισε τον αγώνα"
#: qcsrc/common/notifications/all.inc:431
#, c-format
#: qcsrc/common/notifications/all.inc:445
msgid "^BGYou cannot change to a larger team"
-msgstr ""
+msgstr "^BGΔεν μπορείς να αλλάξεις σε μία μεγαλύτερη ομάδα"
#: qcsrc/common/notifications/all.inc:446
msgid "^BGYou are not allowed to change teams"
-msgstr ""
+msgstr "^BGΔεν επιτρέπεται να αλλάξεις ομάδες"
#: qcsrc/common/notifications/all.inc:448
#, c-format
#: qcsrc/common/notifications/all.inc:583
msgid "^BGEnemies can now see you on radar!"
-msgstr ""
+msgstr "^BGΟι εχθροί μπορούν να σε δούν στο radar!"
#: qcsrc/common/notifications/all.inc:584
msgid "^BGYou returned the ^TC^TT^BG flag!"
#: qcsrc/common/notifications/all.inc:610
#, c-format
msgid "^K1%sYou were frozen by ^BG%s"
-msgstr ""
+msgstr "^K1 %s Πάγωσες από τον ^BG%s"
#: qcsrc/common/notifications/all.inc:617
#, c-format
#: qcsrc/common/notifications/all.inc:683
msgid "^TC^TT^BG team loses the round"
-msgstr ""
+msgstr "^TC^TT^BG ομάδα χάνει τον γύρο"
#: qcsrc/common/notifications/all.inc:687
msgid "^K1You froze yourself"
#: qcsrc/common/notifications/all.inc:739
#, c-format
msgid "^BGPress ^F2%s^BG to teleport"
-msgstr ""
+msgstr "^BGΠάτα ^F2%s^BG για να τηλεμεταφερθείς"
#: qcsrc/common/notifications/all.inc:740
#, c-format
#: qcsrc/common/notifications/all.qh:410
msgid "point"
-msgstr ""
+msgstr "πόντος"
#: qcsrc/common/notifications/all.qh:410
msgid "points"
-msgstr ""
+msgstr "πόντοι"
#: qcsrc/common/notifications/all.qh:419
msgid "drop flag"
#: qcsrc/common/teams.qh:29
msgid "TEAM^Red"
-msgstr ""
+msgstr "TEAM^Κόκκινη"
#: qcsrc/common/teams.qh:30
msgid "TEAM^Blue"
-msgstr ""
+msgstr "TEAM^Μπλέ"
#: qcsrc/common/teams.qh:31
msgid "TEAM^Yellow"
-msgstr ""
+msgstr "TEAM^Κίτρινη"
#: qcsrc/common/teams.qh:32
msgid "TEAM^Pink"
-msgstr ""
+msgstr "TEAM^Ρόζ"
#: qcsrc/common/teams.qh:33
msgid "Team"
-msgstr ""
+msgstr "Ομάδα"
#: qcsrc/common/teams.qh:34
msgid "Neutral"
#: qcsrc/common/teams.qh:37
msgid "KEY^Red"
-msgstr ""
+msgstr "KEY^Κόκκινο"
#: qcsrc/common/teams.qh:38
msgid "KEY^Blue"
-msgstr ""
+msgstr "KEY^Μπλέ"
#: qcsrc/common/teams.qh:39
msgid "KEY^Yellow"
-msgstr ""
+msgstr "KEY^Κίτρινο"
#: qcsrc/common/teams.qh:40
msgid "KEY^Pink"
-msgstr ""
+msgstr "KEY^Ρόζ"
#: qcsrc/common/teams.qh:41
msgid "FLAG^Red"
-msgstr ""
+msgstr "FLAG^Κόκκινο"
#: qcsrc/common/teams.qh:42
msgid "FLAG^Blue"
-msgstr ""
+msgstr "FLAG^Μπλέ"
#: qcsrc/common/teams.qh:43
msgid "FLAG^Yellow"
-msgstr ""
+msgstr "FLAG^Κίτρινο"
#: qcsrc/common/teams.qh:44
msgid "FLAG^Pink"
-msgstr ""
+msgstr "FLAG^Ρόζ"
#: qcsrc/common/teams.qh:45
msgid "GENERATOR^Red"
-msgstr ""
+msgstr "GENERATOR^Κόκκινο"
#: qcsrc/common/teams.qh:46
msgid "GENERATOR^Blue"
-msgstr ""
+msgstr "GENERATOR^Μπλέ"
#: qcsrc/common/teams.qh:47
msgid "GENERATOR^Yellow"
-msgstr ""
+msgstr "GENERATOR^Κίτρινο"
#: qcsrc/common/teams.qh:48
msgid "GENERATOR^Pink"
-msgstr ""
+msgstr "GENERATOR^Ρόζ"
#: qcsrc/common/turrets/all.qh:51
msgid "Turrets dump command only works with sv_cmd.\n"
#: qcsrc/common/turrets/turret/ewheel_weapon.qh:7
msgid "eWheel"
-msgstr ""
+msgstr "eWheel"
#: qcsrc/common/turrets/turret/flac.qh:13
msgid "FLAC Cannon"
-msgstr ""
+msgstr "FLAC Cannon"
#: qcsrc/common/turrets/turret/flac_weapon.qh:7
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
#: qcsrc/common/turrets/turret/fusionreactor.qh:11
msgid "Fusion Reactor"
#: qcsrc/common/turrets/turret/machinegun_weapon.qh:7
msgid "Machinegun"
-msgstr ""
+msgstr "Machinegun"
#: qcsrc/common/turrets/turret/mlrs.qh:13
msgid "MLRS Turret"
-msgstr ""
+msgstr "MLRS Turret"
#: qcsrc/common/turrets/turret/mlrs_weapon.qh:7
msgid "MLRS"
-msgstr ""
+msgstr "MRLS"
#: qcsrc/common/turrets/turret/phaser.qh:13
msgid "Phaser Cannon"
-msgstr ""
+msgstr "Phaser Cannon"
#: qcsrc/common/turrets/turret/phaser_weapon.qh:7
msgid "Phaser"
-msgstr ""
+msgstr "Phaser"
#: qcsrc/common/turrets/turret/plasma.qh:13
msgid "Plasma Cannon"
-msgstr ""
+msgstr "Plasma Cannon"
#: qcsrc/common/turrets/turret/plasma_dual.qh:7
msgid "Dual plasma"
-msgstr ""
+msgstr "Dual Plasma"
#: qcsrc/common/turrets/turret/plasma_dual.qh:19
msgid "Dual Plasma Cannon"
-msgstr ""
+msgstr "Dual Plasma Cannon"
#: qcsrc/common/turrets/turret/plasma_weapon.qh:7
msgid "Plasma"
-msgstr ""
+msgstr "Plasma"
#: qcsrc/common/turrets/turret/tesla.qh:13
#: qcsrc/common/turrets/turret/tesla_weapon.qh:7
msgid "Tesla Coil"
-msgstr ""
+msgstr "Tesla Coil"
#: qcsrc/common/turrets/turret/walker.qh:15
msgid "Walker Turret"
-msgstr ""
+msgstr "Walker Turret"
#: qcsrc/common/turrets/turret/walker_weapon.qh:7
msgid "Walker"
#: qcsrc/common/vehicles/cl_vehicles.qc:192
#, c-format
msgid "Press %s"
-msgstr ""
+msgstr "Πατήστε %s"
#: qcsrc/common/vehicles/vehicle/bumblebee.qc:950
msgid "No right gunner!"
#: qcsrc/common/vehicles/vehicle/racer.qh:19
msgid "Racer"
-msgstr ""
+msgstr "Αγωνιζόμενος"
#: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
msgid "Racer cannon"
-msgstr ""
+msgstr "Racer Canon"
#: qcsrc/common/vehicles/vehicle/raptor.qh:19
msgid "Raptor"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:9
msgid "Raptor cannon"
-msgstr ""
+msgstr "Raptor cannon"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:17
msgid "Raptor bomb"
-msgstr ""
+msgstr "Raptor bomb"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:25
msgid "Raptor flare"
-msgstr ""
+msgstr "Raptor flare"
#: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
msgid "Spiderbot"
#: qcsrc/common/weapons/weapon/arc.qc:17
msgid "Arc"
-msgstr ""
+msgstr "Arc"
#: qcsrc/common/weapons/weapon/blaster.qc:17
msgid "Blaster"
-msgstr ""
+msgstr "Blaster"
#: qcsrc/common/weapons/weapon/crylink.qc:17
msgid "Crylink"
-msgstr ""
+msgstr "Crylink"
#: qcsrc/common/weapons/weapon/devastator.qc:17
msgid "Devastator"
-msgstr ""
+msgstr "Devastator"
#: qcsrc/common/weapons/weapon/electro.qc:17
msgid "Electro"
-msgstr ""
+msgstr "Electro"
#: qcsrc/common/weapons/weapon/fireball.qc:17
msgid "Fireball"
#: qcsrc/common/weapons/weapon/hagar.qc:17
msgid "Hagar"
-msgstr ""
+msgstr "Hagar"
#: qcsrc/common/weapons/weapon/hlac.qc:17
msgid "Heavy Laser Assault Cannon"
#: qcsrc/common/weapons/weapon/shockwave.qc:17
msgid "Shockwave"
-msgstr ""
+msgstr "Shockwave"
#: qcsrc/common/weapons/weapon/shotgun.qc:17
msgid "Shotgun"
#: qcsrc/common/weapons/weapon/vaporizer.qc:18
msgid "Vaporizer"
-msgstr ""
+msgstr "Vaporizer"
#: qcsrc/common/weapons/weapon/vortex.qc:18
msgid "Vortex"
-msgstr ""
+msgstr "Vortex"
#: qcsrc/lib/counting.qh:9
#, c-format
msgid "CI_DEC^%s years"
-msgstr ""
+msgstr "CI_DEC^%s χρόνια"
#: qcsrc/lib/counting.qh:12
#, c-format
msgid "CI_ZER^%d years"
-msgstr ""
+msgstr "CI_ZER^%d χρόνια"
#: qcsrc/lib/counting.qh:13
#, c-format
msgid "CI_FIR^%d year"
-msgstr ""
+msgstr "CI_FIR^%d χρόνος"
#: qcsrc/lib/counting.qh:14
#, c-format
msgid "CI_SEC^%d years"
-msgstr ""
+msgstr "CI_SEC^%d χρόνια"
#: qcsrc/lib/counting.qh:15
#, c-format
msgid "CI_THI^%d years"
-msgstr ""
+msgstr "CI_THI^%d χρόνια"
#: qcsrc/lib/counting.qh:16
#, c-format
msgid "CI_MUL^%d years"
-msgstr ""
+msgstr "CI_MUL^%d χρόνια"
#: qcsrc/lib/counting.qh:18
#, c-format
msgid "CI_DEC^%s weeks"
-msgstr ""
+msgstr "CI_DEC^%s εβδομάδες"
#: qcsrc/lib/counting.qh:21
#, c-format
msgid "CI_ZER^%d weeks"
-msgstr ""
+msgstr "CI_ZER^%d εβδομάδες"
#: qcsrc/lib/counting.qh:22
#, c-format
msgid "CI_FIR^%d week"
-msgstr ""
+msgstr "CI_FIR^%d εβδομάδα"
#: qcsrc/lib/counting.qh:23
#, c-format
msgid "CI_SEC^%d weeks"
-msgstr ""
+msgstr "CI_SEC^%d εβδομάδες"
#: qcsrc/lib/counting.qh:24
#, c-format
msgid "CI_THI^%d weeks"
-msgstr ""
+msgstr "CI_THI^%d εβδομάδες"
#: qcsrc/lib/counting.qh:25
#, c-format
msgid "CI_MUL^%d weeks"
-msgstr ""
+msgstr "CI_MUL^%d εβδομάδες"
#: qcsrc/lib/counting.qh:27
#, c-format
msgid "CI_DEC^%s days"
-msgstr ""
+msgstr "CI_DEC^%s μέρες"
#: qcsrc/lib/counting.qh:30
#, c-format
msgid "CI_ZER^%d days"
-msgstr ""
+msgstr "CI_ZER^%d μέρες"
#: qcsrc/lib/counting.qh:31
#, c-format
msgid "CI_FIR^%d day"
-msgstr ""
+msgstr "CI_FIR^%d μέρα"
#: qcsrc/lib/counting.qh:32
#, c-format
msgid "CI_SEC^%d days"
-msgstr ""
+msgstr "CI_SEC^%d μέρες"
#: qcsrc/lib/counting.qh:33
#, c-format
msgid "CI_THI^%d days"
-msgstr ""
+msgstr "CI_THI^%d μέρες"
#: qcsrc/lib/counting.qh:34
#, c-format
msgid "CI_MUL^%d days"
-msgstr ""
+msgstr "CI_MUL^%d μέρες"
#: qcsrc/lib/counting.qh:36
#, c-format
msgid "CI_DEC^%s hours"
-msgstr ""
+msgstr "CI_DEC^%s ώρες"
#: qcsrc/lib/counting.qh:39
#, c-format
msgid "CI_ZER^%d hours"
-msgstr ""
+msgstr "CI_ZER^%d ώρες"
#: qcsrc/lib/counting.qh:40
#, c-format
msgid "CI_FIR^%d hour"
-msgstr ""
+msgstr "CI_FIR^%d ώρα"
#: qcsrc/lib/counting.qh:41
#, c-format
msgid "CI_SEC^%d hours"
-msgstr ""
+msgstr "CI_SEC^%d ώρες"
#: qcsrc/lib/counting.qh:42
#, c-format
msgid "CI_THI^%d hours"
-msgstr ""
+msgstr "CI_THI^%d ώρες"
#: qcsrc/lib/counting.qh:43
#, c-format
msgid "CI_MUL^%d hours"
-msgstr ""
+msgstr "CI_MUL^%d ώρες"
#: qcsrc/lib/counting.qh:46
#, c-format
msgid "CI_DEC^%s minutes"
-msgstr ""
+msgstr "CI_DEC^%s λεπτά"
#: qcsrc/lib/counting.qh:49
#, c-format
msgid "CI_ZER^%d minutes"
-msgstr ""
+msgstr "CI_ZER^%d λεπτά"
#: qcsrc/lib/counting.qh:50
#, c-format
msgid "CI_FIR^%d minute"
-msgstr ""
+msgstr "CI_FIR^%d λεπτό"
#: qcsrc/lib/counting.qh:51
#, c-format
msgid "CI_SEC^%d minutes"
-msgstr ""
+msgstr "CI_SEC^%d λεπτά"
#: qcsrc/lib/counting.qh:52
#, c-format
msgid "CI_THI^%d minutes"
-msgstr ""
+msgstr "CI_THI^%d λεπτά"
#: qcsrc/lib/counting.qh:53
#, c-format
msgid "CI_MUL^%d minutes"
-msgstr ""
+msgstr "CI_MUL^%d λεπτά"
#: qcsrc/lib/counting.qh:55
#, c-format
msgid "CI_DEC^%s seconds"
-msgstr ""
+msgstr "CI_DEC^%s δευτερόλεπτα"
#: qcsrc/lib/counting.qh:58
#, c-format
msgid "CI_ZER^%d seconds"
-msgstr ""
+msgstr "CI_ZER^%d δευτερόλεπτα"
#: qcsrc/lib/counting.qh:59
#, c-format
msgid "CI_FIR^%d second"
-msgstr ""
+msgstr "CI_FIR^%d δευτερόλεπτο"
#: qcsrc/lib/counting.qh:60
#, c-format
msgid "CI_SEC^%d seconds"
-msgstr ""
+msgstr "CI_SEC^%d δευτερόλεπτα"
#: qcsrc/lib/counting.qh:61
#, c-format
msgid "CI_THI^%d seconds"
-msgstr ""
+msgstr "CI_THI^%d δευτερόλεπτα"
#: qcsrc/lib/counting.qh:62
#, c-format
msgid "CI_MUL^%d seconds"
-msgstr ""
+msgstr "CI_MUL^%d δευτερόλεπτα"
#: qcsrc/lib/counting.qh:79
#, c-format
#: qcsrc/lib/string.qh:48
#, c-format
msgid "%d days, %02d:%02d:%02d"
-msgstr ""
+msgstr "%d μέρες, %02d:%02d:%02d"
#: qcsrc/lib/string.qh:49
#, c-format
msgid "%02d:%02d:%02d"
-msgstr ""
+msgstr "%02d:%02d:%02d"
#: qcsrc/menu/command/menu_cmd.qc:48
msgid "Usage: menu_cmd command..., where possible commands are:\n"
#: qcsrc/menu/xonotic/credits.qc:172
msgid "Chinese (Taiwan)"
-msgstr ""
+msgstr "Chinese (Taiwan)"
#: qcsrc/menu/xonotic/credits.qc:177
msgid "Cornish"
-msgstr ""
+msgstr "Cornish"
#: qcsrc/menu/xonotic/credits.qc:180
msgid "Czech"
#: qcsrc/menu/xonotic/credits.qc:240
msgid "Kazakh"
-msgstr ""
+msgstr "Kazakh"
#: qcsrc/menu/xonotic/credits.qc:243
msgid "Korean"
-msgstr ""
+msgstr "Korean"
#: qcsrc/menu/xonotic/credits.qc:247
msgid "Polish"
#: 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"
"The maximum amount of players or bots that can be connected to your server "
"at once"
msgstr ""
+"Ο μέγιστος αριθμός παικτών που μπορεί να συνδεθεί στον server σας ταυτόχρονα"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:144
msgid "Number of bots:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:218
msgid "Add every available map to your selection"
-msgstr ""
+msgstr "Προσθήκη όλων των διαθέσιμων χαρτών στις επιλογές σας"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:221
msgid "Remove all"
#: 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
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:160
msgid "Enable dodging"
-msgstr ""
+msgstr "Ενεργοποίηση Αποφυγής"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:167
msgid "All players are almost invisible"
#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:42
msgid "Show empty servers"
-msgstr ""
+msgstr "Εμφάνιση άδειων server"
#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:46
msgid "SRVS^Full"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
msgid "Swap left/right channels"
-msgstr ""
+msgstr "Αλλαγή αριστερών/δεξιών καναλιών"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:138
msgid "Headphone friendly mode"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:160
msgid "Dynamic HUD"
-msgstr ""
+msgstr "Dynamic HUD"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:161
msgid "HUD moves around following player's movement"
#: 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"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:56
msgid "Download speed:"
-msgstr ""
+msgstr "Ταχύτητα λήψης:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
msgid "Local latency:"
#: qcsrc/menu/xonotic/keybinder.qc:44
msgid "WEAPON^previous"
-msgstr ""
+msgstr "ΟΠΛΟ^προηγούμενο"
#: qcsrc/menu/xonotic/keybinder.qc:45
msgid "WEAPON^next"
-msgstr ""
+msgstr "ΟΠΛΟ^επόμενο"
#: qcsrc/menu/xonotic/keybinder.qc:46
msgid "WEAPON^previously used"
#: qcsrc/menu/xonotic/keybinder.qc:97
msgid "quit"
-msgstr ""
+msgstr "έξοδος"
#: qcsrc/menu/xonotic/keybinder.qc:101
msgid "auto-join team"
#: qcsrc/menu/xonotic/serverlist.qc:1060
#, c-format
msgid "AES level %d"
-msgstr ""
+msgstr "Επίπεδο AES %d"
#: qcsrc/menu/xonotic/serverlist.qc:1060
msgid "ENC^none"
#: qcsrc/menu/xonotic/serverlist.qh:158
msgid "SLCAT^InstaGib"
-msgstr ""
+msgstr "SLCAT^InstaGib"
#: qcsrc/menu/xonotic/serverlist.qh:159
msgid "SLCAT^Defrag Mode"
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Çağlar Turalı <caglarturali@gmail.com>, 2018
+# Demiray Muhterem <mdemiray@msn.com>, 2018
msgid ""
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-07-05 15:06+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2018-11-08 17:13+0000\n"
+"Last-Translator: Demiray Muhterem <mdemiray@msn.com>\n"
"Language-Team: Turkish (http://www.transifex.com/team-xonotic/xonotic/"
"language/tr/)\n"
"Language: tr\n"
#, c-format
msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
msgstr ""
+"^2Başarıyla dışa aktarıldı: %s (Not: data/data/ klasörüne kaydedildi)\n"
#: qcsrc/client/hud/hud_config.qc:243
#, c-format
msgid "^1Couldn't write to %s\n"
-msgstr ""
+msgstr "^1Şuraya yazılamıyor %s\n"
#: qcsrc/client/hud/panel/chat.qc:82
msgid "^3Player^7: This is the chat area."
-msgstr ""
+msgstr "^3Oyuncu^7: Burası sohbet alanı."
#: qcsrc/client/hud/panel/engineinfo.qc:69
#, c-format
msgid "FPS: %.*f"
-msgstr ""
+msgstr "FPS: %.*f"
#: qcsrc/client/hud/panel/infomessages.qc:87
msgid "^1Observing"
-msgstr ""
+msgstr "^1Gözlemleniyor"
#: qcsrc/client/hud/panel/infomessages.qc:89
#, c-format
msgid "^1Spectating: ^7%s"
-msgstr ""
+msgstr "^1İzleniyor: ^7%s"
#: qcsrc/client/hud/panel/infomessages.qc:100
#, c-format
msgid "^1Press ^3%s^1 to spectate"
-msgstr ""
+msgstr "^1İzlemek için ^3%s^1 basın"
#: qcsrc/client/hud/panel/infomessages.qc:100
#: qcsrc/menu/xonotic/keybinder.qc:40
msgid "primary fire"
-msgstr ""
+msgstr "birincil ateş"
#: qcsrc/client/hud/panel/infomessages.qc:102
#, c-format
msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
-msgstr ""
+msgstr "^1Önceki veya sonraki oyuncu için ^3%s^1 veya ^3%s^1 tuşuna basın"
#: qcsrc/client/hud/panel/infomessages.qc:102
#: qcsrc/client/hud/panel/infomessages.qc:106
msgid "next weapon"
-msgstr ""
+msgstr "bir sonraki silah"
#: qcsrc/client/hud/panel/infomessages.qc:102
#: qcsrc/client/hud/panel/infomessages.qc:106
msgid "previous weapon"
-msgstr ""
+msgstr "bir önceki silah"
#: qcsrc/client/hud/panel/infomessages.qc:106
#, c-format
msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
-msgstr ""
+msgstr "^1Hızı değiştirmek için ^3%s^1 veya ^3%s^1 basın"
#: qcsrc/client/hud/panel/infomessages.qc:108
#, c-format
msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
msgstr ""
+"^1Gözlemlemek için ^3%s^1, kamera modunu değiştirmek için ^3%s^1 tuşuna basın"
#: qcsrc/client/hud/panel/infomessages.qc:108
#: qcsrc/common/vehicles/cl_vehicles.qc:192
msgid "drop weapon"
-msgstr ""
+msgstr "silah bırak"
#: qcsrc/client/hud/panel/infomessages.qc:108
#: qcsrc/menu/xonotic/keybinder.qc:41
msgid "secondary fire"
-msgstr ""
+msgstr "ikincil ateş"
#: qcsrc/client/hud/panel/infomessages.qc:111
#, c-format
msgid "^1Press ^3%s^1 for gamemode info"
-msgstr ""
+msgstr "^1Oyun modu bilgisi için ^3%s^1 tuşuna basın"
#: qcsrc/client/hud/panel/infomessages.qc:111
#: qcsrc/menu/xonotic/keybinder.qc:94
msgid "server info"
-msgstr ""
+msgstr "sunucu bilgisi"
#: qcsrc/client/hud/panel/infomessages.qc:124
msgid "^1Match has already begun"
-msgstr ""
+msgstr "^1Savaş çoktan başladı"
#: qcsrc/client/hud/panel/infomessages.qc:126
msgid "^1You have no more lives left"
-msgstr ""
+msgstr "^1Fazla canın kalmadı"
#: qcsrc/client/hud/panel/infomessages.qc:128
#: qcsrc/client/hud/panel/infomessages.qc:131
#, c-format
msgid "^1Press ^3%s^1 to join"
-msgstr ""
+msgstr "^1Katılmak için ^3%s^1 tuşuna basın"
#: qcsrc/client/hud/panel/infomessages.qc:128
#: qcsrc/client/hud/panel/infomessages.qc:131
msgid "jump"
-msgstr ""
+msgstr "zıpla"
#: qcsrc/client/hud/panel/infomessages.qc:139
#, c-format
msgid "^1Game starts in ^3%d^1 seconds"
-msgstr ""
+msgstr "^1Oyun ^3%d^1 saniye içerisinde başlıyor"
#: qcsrc/client/hud/panel/infomessages.qc:145
msgid "^2Currently in ^1warmup^2 stage!"
-msgstr ""
+msgstr "^2Şu an ^1ısınma^2 aşamasında!"
#: qcsrc/client/hud/panel/infomessages.qc:160
#, c-format
msgid "%sPress ^3%s%s to end warmup"
-msgstr ""
+msgstr "%sIsınmayı bitirmek için ^3%s%s basın"
#: qcsrc/client/hud/panel/infomessages.qc:160
#: qcsrc/client/hud/panel/infomessages.qc:162
#: qcsrc/client/hud/panel/infomessages.qc:175
#: qcsrc/menu/xonotic/keybinder.qc:91
msgid "ready"
-msgstr ""
+msgstr "hazır"
#: qcsrc/client/hud/panel/infomessages.qc:162
#, c-format
msgid "%sPress ^3%s%s once you are ready"
-msgstr ""
+msgstr "%sHazır olduğunuzda ^3%s%s basın"
#: qcsrc/client/hud/panel/infomessages.qc:167
msgid "^2Waiting for others to ready up to end warmup..."
-msgstr ""
+msgstr "^2Diğerlerinin ısınma aşamasını bitirmesi bekleniyor..."
#: qcsrc/client/hud/panel/infomessages.qc:169
msgid "^2Waiting for others to ready up..."
-msgstr ""
+msgstr "^2Diğerlerinin hazır olması bekleniyor..."
#: qcsrc/client/hud/panel/infomessages.qc:175
#, c-format
msgid "^2Press ^3%s^2 to end warmup"
-msgstr ""
+msgstr "^2Isınmayı bitirmek için ^3%s^2 tuşuna basın"
#: qcsrc/client/hud/panel/infomessages.qc:196
msgid "Teamnumbers are unbalanced!"
-msgstr ""
+msgstr "Takım sayıları dengesiz!"
#: qcsrc/client/hud/panel/infomessages.qc:199
#, c-format
msgid " Press ^3%s%s to adjust"
-msgstr ""
+msgstr "Ayarlamak için ^3%s%s basın"
#: qcsrc/client/hud/panel/infomessages.qc:199
#: qcsrc/menu/xonotic/keybinder.qc:102
msgid "team menu"
-msgstr ""
+msgstr "takım menüsü"
#: qcsrc/client/hud/panel/infomessages.qc:209
msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1Oyuncu izleniyor:"
#: qcsrc/client/hud/panel/infomessages.qc:209
msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1Sen izleniyorsun:"
#: qcsrc/client/hud/panel/infomessages.qc:225
msgid "^7Press ^3ESC ^7to show HUD options."
#: qcsrc/client/hud/panel/modicons.qc:566
msgid "Personal best"
-msgstr ""
+msgstr "Kişisel rekor"
#: qcsrc/client/hud/panel/modicons.qc:576
msgid "Server best"
-msgstr ""
+msgstr "Sunucu rekoru"
#: qcsrc/client/hud/panel/notify.qc:115 qcsrc/client/hud/panel/notify.qc:116
#: qcsrc/client/hud/panel/score.qc:59
#, c-format
msgid "Player %d"
-msgstr ""
+msgstr "Oyuncu %d"
#: qcsrc/client/hud/panel/quickmenu.qc:603
#: qcsrc/client/hud/panel/quickmenu.qc:605
#, c-format
msgid "Submenu%d"
-msgstr ""
+msgstr "Altmenü%d"
#: qcsrc/client/hud/panel/quickmenu.qc:610
#, c-format
msgid "Command%d"
-msgstr ""
+msgstr "Komut%d"
#: qcsrc/client/hud/panel/quickmenu.qc:636
msgid "Continue..."
-msgstr ""
+msgstr "Devam..."
#: qcsrc/client/hud/panel/quickmenu.qc:794
#: qcsrc/client/hud/panel/quickmenu.qc:798
#: qcsrc/client/hud/panel/quickmenu.qc:795
msgid "QMCMD^:-) / nice one"
-msgstr ""
+msgstr "QMCMD^:-) / güzel"
#: qcsrc/client/hud/panel/quickmenu.qc:795
msgid "QMCMD^nice one"
-msgstr ""
+msgstr "QMCMD^güzel"
#: qcsrc/client/hud/panel/quickmenu.qc:796
msgid "QMCMD^good game"
-msgstr ""
+msgstr "QMCMD^iyi oyun"
#: qcsrc/client/hud/panel/quickmenu.qc:797
msgid "QMCMD^hi / good luck"
-msgstr ""
+msgstr "QMCMD^selam / iyi şanslar"
#: qcsrc/client/hud/panel/quickmenu.qc:797
msgid "QMCMD^hi / good luck and have fun"
-msgstr ""
+msgstr "QMCMD^selam / iyi şanslar ve iyi eğlenceler"
#: qcsrc/client/hud/panel/quickmenu.qc:802
#: qcsrc/client/hud/panel/quickmenu.qc:818
msgid "QMCMD^Team chat"
-msgstr ""
+msgstr "QMCMD^Takım sohbet"
#: qcsrc/client/hud/panel/quickmenu.qc:803
msgid "QMCMD^quad soon"
-msgstr ""
+msgstr "QMCMD^dört yakında"
#: qcsrc/client/hud/panel/quickmenu.qc:804
msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^ücretsiz malzeme %x^7 (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:804
msgid "QMCMD^free item, icon"
-msgstr ""
+msgstr "QMCMD^ücretsiz malzeme, simge"
#: qcsrc/client/hud/panel/quickmenu.qc:805
msgid "QMCMD^took item (l:%l^7)"
#: 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/client/hud/panel/quickmenu.qc:823
#: qcsrc/client/hud/panel/quickmenu.qc:860
msgid "QMCMD^Settings"
-msgstr ""
+msgstr "QMCMD^Ayarları"
#: qcsrc/client/hud/panel/quickmenu.qc:824
#: qcsrc/client/hud/panel/quickmenu.qc:831
msgid "QMCMD^View/HUD settings"
-msgstr ""
+msgstr "QMCMD^View/HUD ayarları"
#: qcsrc/client/hud/panel/quickmenu.qc:825
msgid "QMCMD^3rd person view"
-msgstr ""
+msgstr "QMCMD^Üçüncü şahıs görünümü"
#: qcsrc/client/hud/panel/quickmenu.qc:826
msgid "QMCMD^Player models like mine"
#: qcsrc/client/hud/panel/quickmenu.qc:833
#: qcsrc/client/hud/panel/quickmenu.qc:836
msgid "QMCMD^Sound settings"
-msgstr ""
+msgstr "QMCMD^Ses ayarları"
#: qcsrc/client/hud/panel/quickmenu.qc:834
msgid "QMCMD^Hit sound"
#: qcsrc/client/hud/panel/racetimer.qc:61
msgid "Start line"
-msgstr ""
+msgstr "Başlangıç çizgisi"
#: qcsrc/client/hud/panel/racetimer.qc:63
#: qcsrc/client/hud/panel/racetimer.qc:67
msgid "Finish line"
-msgstr ""
+msgstr "Bitiş çizgisi"
#: qcsrc/client/hud/panel/racetimer.qc:65
#, c-format
#: qcsrc/client/hud/panel/scoreboard.qc:1295
msgid "Map stats:"
-msgstr ""
+msgstr "Harita verileri:"
#: qcsrc/client/hud/panel/scoreboard.qc:1325
msgid "Monsters killed:"
-msgstr ""
+msgstr "Canavarlar öldürüldü:"
#: qcsrc/client/hud/panel/scoreboard.qc:1332
msgid "Secrets found:"
-msgstr ""
+msgstr "Sırlar bulundu:"
#: qcsrc/client/hud/panel/scoreboard.qc:1354
msgid "Capture time rankings"
-msgstr ""
+msgstr "Zaman sıralamasını yakala"
#: qcsrc/client/hud/panel/scoreboard.qc:1354
msgid "Rankings"
-msgstr ""
+msgstr "Sıralamalar"
#: qcsrc/client/hud/panel/scoreboard.qc:1519
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
msgid "Scoreboard"
-msgstr ""
+msgstr "Sonuçlar"
#: qcsrc/client/hud/panel/scoreboard.qc:1584
#, c-format
msgid "Speed award: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "Hız ödülü: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1588
#, c-format
msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "Tüm zamanların en hızlısı: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1604
#, c-format
msgid "Spectators"
-msgstr ""
+msgstr "Seyirciler"
#: qcsrc/client/hud/panel/scoreboard.qc:1619
#, c-format
#: qcsrc/client/hud/panel/scoreboard.qc:1635
#: qcsrc/client/hud/panel/scoreboard.qc:1654
msgid " or"
-msgstr ""
+msgstr "veya"
#: qcsrc/client/hud/panel/scoreboard.qc:1638
#: qcsrc/client/hud/panel/scoreboard.qc:1645
#: qcsrc/client/hud/panel/scoreboard.qc:1688
#, c-format
msgid "^1Respawning in ^3%s^1..."
-msgstr ""
+msgstr "^1Yeniden doğuma son ^3%s^1..."
#: qcsrc/client/hud/panel/scoreboard.qc:1698
#, c-format
msgid "You are dead, wait ^3%s^7 before respawning"
-msgstr ""
+msgstr "Öldünüz, yeniden doğmadan önce ^3%s^7 bekleyin"
#: qcsrc/client/hud/panel/scoreboard.qc:1707
#, c-format
msgid "You are dead, press ^2%s^7 to respawn"
-msgstr ""
+msgstr "Öldünüz, yeniden doğmak için ^2%s^7 basın"
#: qcsrc/client/hud/panel/vote.qc:24
msgid "^1You must answer before entering hud configure mode\n"
-msgstr ""
+msgstr "^1HUD yapılandırma moduna girmeden önce cevaplamalısınız\n"
#: qcsrc/client/hud/panel/vote.qc:29
msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
#: qcsrc/client/hud/panel/vote.qc:115
msgid "A vote has been called for:"
-msgstr ""
+msgstr "Bir oylama yapılacak:"
#: qcsrc/client/hud/panel/vote.qc:117
msgid "Allow servers to store and display your name?"
-msgstr ""
+msgstr "Sunucuların adınızı saklamasına ve görüntülemesine izin verilsin mi?"
#: qcsrc/client/hud/panel/vote.qc:121
msgid "^1Configure the HUD"
-msgstr ""
+msgstr "^1HUD'ı Yapılandır"
#: qcsrc/client/hud/panel/vote.qc:125 qcsrc/menu/xonotic/dialog_firstrun.qc:82
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:18
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:16
#: qcsrc/menu/xonotic/dialog_uid2name.qc:15
msgid "Yes"
-msgstr ""
+msgstr "Evet"
#: qcsrc/client/hud/panel/vote.qc:127 qcsrc/menu/xonotic/dialog_firstrun.qc:83
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:21
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:17
#: qcsrc/menu/xonotic/dialog_uid2name.qc:17
msgid "No"
-msgstr ""
+msgstr "Hayır"
#: qcsrc/client/hud/panel/weapons.qc:530
msgid "Out of ammo"
-msgstr ""
+msgstr "Cephane kalmadı"
#: qcsrc/client/hud/panel/weapons.qc:534
msgid "Don't have"
-msgstr ""
+msgstr "Sahip değilsin"
#: qcsrc/client/hud/panel/weapons.qc:538
msgid "Unavailable"
-msgstr ""
+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"
#: qcsrc/client/main.qc:1264
#, c-format
msgid "%s (not bound)"
-msgstr ""
+msgstr "%s (bağlı değil)"
#: qcsrc/client/mapvoting.qc:49
msgid " (1 vote)"
-msgstr ""
+msgstr " (1 oy)"
#: qcsrc/client/mapvoting.qc:51
#, c-format
msgid " (%d votes)"
-msgstr ""
+msgstr " (%d oy)"
#: qcsrc/client/mapvoting.qc:271
msgid "Don't care"
-msgstr ""
+msgstr "Umrumda değil"
#: qcsrc/client/mapvoting.qc:365
msgid "Decide the gametype"
-msgstr ""
+msgstr "Oyun türüne karar verin"
#: qcsrc/client/mapvoting.qc:365
msgid "Vote for a map"
-msgstr ""
+msgstr "Haritayı oyla"
#: qcsrc/client/mapvoting.qc:382
#, c-format
msgid "%d seconds left"
-msgstr ""
+msgstr "%d saniye kaldı"
#: qcsrc/client/mapvoting.qc:497
msgid ""
#: qcsrc/client/mapvoting.qc:516
msgid "Requesting preview...\n"
-msgstr ""
+msgstr "Önizleme isteniyor...\n"
#: qcsrc/client/miscfunctions.qc:109
msgid "Trying to remove a team which is not in the teamlist!"
-msgstr ""
+msgstr "Takım listesinde olmayan bir takımı çıkarmaya çalışma!"
#: qcsrc/client/view.qc:1380
msgid "Nade timer"
-msgstr ""
+msgstr "Nade zamanlayıcısı"
#: qcsrc/client/view.qc:1385
msgid "Capture progress"
-msgstr ""
+msgstr "İlerlemeyi yakala"
#: qcsrc/client/view.qc:1390
msgid "Revival progress"
-msgstr ""
+msgstr "İlerlemeyi canlandır"
#: qcsrc/common/command/generic.qc:157
msgid "error creating curl handle\n"
-msgstr ""
+msgstr "curl tanıtımı oluşturma hatası\n"
#: qcsrc/common/command/generic.qc:403
msgid "Notification restart command only works with cl_cmd and sv_cmd.\n"
#: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
msgid "Ball Stealer"
-msgstr ""
+msgstr "Top hırsızı"
#: qcsrc/common/items/item/armor.qh:111
msgid "Big armor"
-msgstr ""
+msgstr "Büyük zırh"
#: qcsrc/common/items/item/armor.qh:147
msgid "Mega armor"
-msgstr ""
+msgstr "Mega zırh"
#: qcsrc/common/items/item/health.qh:111
msgid "Big health"
-msgstr ""
+msgstr "Büyük sağlık"
#: qcsrc/common/items/item/health.qh:147
msgid "Mega health"
-msgstr ""
+msgstr "Mega sağlık"
#: qcsrc/common/items/item/jetpack.qh:35
msgid "Jet Pack"
-msgstr ""
+msgstr "Jet Paketi"
#: qcsrc/common/items/item/jetpack.qh:82
msgid "Fuel regen"
-msgstr ""
+msgstr "Yakıt yağmuru"
#: qcsrc/common/items/item/powerup.qh:44
msgid "Strength"
-msgstr ""
+msgstr "Kuvvet"
#: qcsrc/common/items/item/powerup.qh:76
msgid "Shield"
-msgstr ""
+msgstr "Zırh"
#: qcsrc/common/mapinfo.qc:639
#, no-c-format
msgid "@!#%'n Tuba Throwing"
-msgstr ""
+msgstr "@!#%'n Tuba Atma"
#: qcsrc/common/mapinfo.qh:99
msgid "Deathmatch"
-msgstr ""
+msgstr "Ölümmaçı"
#: qcsrc/common/mapinfo.qh:99
msgid "Score as many frags as you can"
-msgstr ""
+msgstr "Yapabildiğiniz kadar çok sayıda parçaya puan verin"
#: qcsrc/common/mapinfo.qh:111
msgid "Last Man Standing"
-msgstr ""
+msgstr "Ayakta Kalan Son Kişi"
#: qcsrc/common/mapinfo.qh:111
msgid "Survive and kill until the enemies have no lives left"
-msgstr ""
+msgstr "Hayatta kalanlar yok olana kadar hayatta kal ve öldür"
#: qcsrc/common/mapinfo.qh:126
msgid "Race"
-msgstr ""
+msgstr "Yarış"
#: qcsrc/common/mapinfo.qh:126
msgid "Race against other players to the finish line"
-msgstr ""
+msgstr "Bitiş çizgisine diğer oyunculara karşı yarışın"
#: qcsrc/common/mapinfo.qh:160
msgid "Race CTS"
#: qcsrc/common/mapinfo.qh:160
msgid "Race for fastest time."
-msgstr ""
+msgstr "En hızlı zaman için yarış."
#: qcsrc/common/mapinfo.qh:184
msgid "Help your team score the most frags against the enemy team"
msgstr ""
+"Takımınıza, düşman takımına karşı en iyi skoru elde etmesi için yardım edin."
#: qcsrc/common/mapinfo.qh:184
msgid "Team Deathmatch"
-msgstr ""
+msgstr "Ölümmaçı Takımı"
#: qcsrc/common/mapinfo.qh:220
msgid "Capture the Flag"
-msgstr ""
+msgstr "Bayrağı kap"
#: qcsrc/common/mapinfo.qh:220
msgid ""
"Find and bring the enemy flag to your base to capture it, defend your base "
"from the other team"
msgstr ""
+"Yakalamak için düşman bayrağını bulup üsse getir, üssünüzü de diğer takımdan "
+"koru"
#: qcsrc/common/mapinfo.qh:249
msgid "Clan Arena"
-msgstr ""
+msgstr "Klan Alanı"
#: qcsrc/common/mapinfo.qh:249
msgid "Kill all enemy teammates to win the round"
-msgstr ""
+msgstr "Turu kazanmak için tüm düşman takım unsurlarını öldür"
#: qcsrc/common/mapinfo.qh:287
msgid "Capture and defend all the control points to win"
-msgstr ""
+msgstr "Kazanmak için tüm kontrol noktalarını yakalayın ve savunun"
#: qcsrc/common/mapinfo.qh:287
msgid "Domination"
-msgstr ""
+msgstr "Hakimiyet"
#: qcsrc/common/mapinfo.qh:319
msgid "Gather all the keys to win the round"
-msgstr ""
+msgstr "Turu kazanmak için tüm anahtarları topla"
#: qcsrc/common/mapinfo.qh:319
msgid "Key Hunt"
-msgstr ""
+msgstr "Anahtar Avı"
#: qcsrc/common/mapinfo.qh:353
msgid "Assault"
-msgstr ""
+msgstr "Hücum"
#: qcsrc/common/mapinfo.qh:353
msgid ""
"Destroy obstacles to find and destroy the enemy power core before time runs "
"out"
-msgstr ""
+msgstr "Zaman dolmadan düşman güç merkezini bul ve yok etmek için engelleri aş"
#: qcsrc/common/mapinfo.qh:371
msgid "Capture control points to reach and destroy the enemy generator"
-msgstr ""
+msgstr "Düşman jeneratörüne ulaşmak ve yok etmek için kontrol noktalarını geç"
#: qcsrc/common/mapinfo.qh:371
msgid "Onslaught"
-msgstr ""
+msgstr "Saldırı"
#: qcsrc/common/mapinfo.qh:387
msgid "Nexball"
-msgstr ""
+msgstr "Nexball"
#: qcsrc/common/mapinfo.qh:387
msgid "Shoot and kick the ball into the enemies goal, keep your goal clean"
-msgstr ""
+msgstr "Düşman kalesine gol at, kendi kaleni koru"
#: qcsrc/common/mapinfo.qh:408
msgid "Freeze Tag"
-msgstr ""
+msgstr "Dondurucu Etiket"
#: qcsrc/common/mapinfo.qh:408
msgid ""
"Kill enemies to freeze them, stand next to frozen teammates to revive them; "
"freeze all enemies to win"
msgstr ""
+"Onları dondurmak için düşmanları öldürün, donmuş ekip arkadaşlarının yanında "
+"onları canlandırın; kazanmak için tüm düşmanları dondurun"
#: qcsrc/common/mapinfo.qh:446
msgid "Hold the ball to get points for kills"
-msgstr ""
+msgstr "Öldürmek için puan almak için topu tut"
#: qcsrc/common/mapinfo.qh:446
msgid "Keepaway"
-msgstr ""
+msgstr "Uzak dur"
#: qcsrc/common/mapinfo.qh:461
msgid "Invasion"
-msgstr ""
+msgstr "İstila"
#: qcsrc/common/mapinfo.qh:461
msgid "Survive against waves of monsters"
-msgstr ""
+msgstr "Canavarların saldırı dalgalarına karşı hayatta kal"
#: qcsrc/common/minigames/cl_minigames.qc:383
msgid "It's your turn"
-msgstr ""
+msgstr "Senin sıran"
#: qcsrc/common/minigames/cl_minigames_hud.qc:331
#: qcsrc/menu/xonotic/dialog_quit.qh:6
msgid "Quit"
-msgstr ""
+msgstr "Çıkış"
#: qcsrc/common/minigames/cl_minigames_hud.qc:336
msgid "Invite"
-msgstr ""
+msgstr "Davet"
#: qcsrc/common/minigames/cl_minigames_hud.qc:378
msgid "Current Game"
-msgstr ""
+msgstr "Geçerli Oyun"
#: qcsrc/common/minigames/cl_minigames_hud.qc:403
msgid "Exit Menu"
-msgstr ""
+msgstr "Menüden Çık"
#: qcsrc/common/minigames/cl_minigames_hud.qc:415
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
msgid "Create"
-msgstr ""
+msgstr "Oluştur"
#: qcsrc/common/minigames/cl_minigames_hud.qc:418
msgid "Join"
-msgstr ""
+msgstr "Giriş"
#: qcsrc/common/minigames/cl_minigames_hud.qc:489
msgid "Minigames"
-msgstr ""
+msgstr "Küçükoyunlar"
#: qcsrc/common/minigames/minigame/bd.qc:1168
msgid "Better luck next time!"
-msgstr ""
+msgstr "Bir dahaki sefere daha iyi şanslar!"
#: qcsrc/common/minigames/minigame/bd.qc:1172
msgid "Tubular! Press \"Next Level\" to continue!"
-msgstr ""
+msgstr "Boru gibi! Devam etmek için \"Sonraki Seviye\" ye basın!"
#: qcsrc/common/minigames/minigame/bd.qc:1174
msgid "Wicked! Press \"Next Level\" to continue!"
-msgstr ""
+msgstr "Kötü! Devam etmek için \"Sonraki Seviye\" ye basın!"
#: qcsrc/common/minigames/minigame/bd.qc:1177
msgid "Press the space bar to change your currently selected tile"
-msgstr ""
+msgstr "Seçili olan kutucuğunuzu değiştirmek için boşluk tuşuna basın"
#: qcsrc/common/minigames/minigame/bd.qc:1180
msgid "Push the boulders onto the targets"
-msgstr ""
+msgstr "Kayalar hedeflere doğru itin"
#: qcsrc/common/minigames/minigame/bd.qc:1404
msgid "Next Level"
-msgstr ""
+msgstr "Sonraki Oyun"
#: qcsrc/common/minigames/minigame/bd.qc:1405
msgid "Restart"
-msgstr ""
+msgstr "Yeniden Başlat"
#: qcsrc/common/minigames/minigame/bd.qc:1406
msgid "Editor"
-msgstr ""
+msgstr "Yayımcı"
#: qcsrc/common/minigames/minigame/bd.qc:1407
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:37
msgid "Save"
-msgstr ""
+msgstr "Kaydet"
#: qcsrc/common/minigames/minigame/c4.qc:373
#: qcsrc/common/minigames/minigame/pp.qc:438
#: qcsrc/common/minigames/minigame/ttt.qc:319
msgid "Draw"
-msgstr ""
+msgstr "Çiz"
#: qcsrc/common/minigames/minigame/c4.qc:378
#: qcsrc/common/minigames/minigame/nmm.qc:601
msgid "You lost the game!"
-msgstr ""
+msgstr "Oyunu kaybettin!"
#: qcsrc/common/minigames/minigame/c4.qc:379
#: qcsrc/common/minigames/minigame/nmm.qc:602
msgid "You win!"
-msgstr ""
+msgstr "Kazandın!"
#: qcsrc/common/minigames/minigame/c4.qc:383
#: qcsrc/common/minigames/minigame/nmm.qc:606
#: qcsrc/common/minigames/minigame/pp.qc:455
#: qcsrc/common/minigames/minigame/ttt.qc:336
msgid "Wait for your opponent to make their move"
-msgstr ""
+msgstr "Rakibinizin harekete geçmesini bekleyin"
#: qcsrc/common/minigames/minigame/c4.qc:386
#: qcsrc/common/minigames/minigame/nmm.qc:608
#: qcsrc/common/minigames/minigame/pp.qc:458
#: qcsrc/common/minigames/minigame/ttt.qc:339
msgid "Click on the game board to place your piece"
-msgstr ""
+msgstr "Parçanızı yerleştirmek için oyun tahtasına tıklayın"
#: qcsrc/common/minigames/minigame/nmm.qc:610
msgid ""
"You can select one of your pieces to move it in one of the surrounding places"
msgstr ""
+"Çevrenizdeki yerlerden birinde taşımak için parçalarınızdan birini "
+"seçebilirsiniz"
#: qcsrc/common/minigames/minigame/nmm.qc:612
msgid "You can select one of your pieces to move it anywhere on the board"
msgstr ""
+"Tahtada herhangi bir yere taşımak için parçalarınızdan birini seçebilirsiniz"
#: qcsrc/common/minigames/minigame/nmm.qc:614
msgid "You can take one of the opponent's pieces"
-msgstr ""
+msgstr "Rakibin parçalarından birini alabilirsin"
#: qcsrc/common/minigames/minigame/pong.qc:570
#: qcsrc/common/minigames/minigame/ttt.qc:299
msgid "AI"
-msgstr ""
+msgstr "Yapay Zeka"
#: qcsrc/common/minigames/minigame/pong.qc:587
msgid "Press ^1Start Match^7 to start the match with the current players"
msgstr ""
+"Mevcut oyuncularla maçı başlatmak için ^1Müsabaka Başlat^7 tuşuna basın"
#: qcsrc/common/minigames/minigame/pong.qc:651
msgid "Start Match"
-msgstr ""
+msgstr "Müsabaka Başlat"
#: qcsrc/common/minigames/minigame/pong.qc:652
msgid "Add AI player"
-msgstr ""
+msgstr "YZ Oyuncusu Ekle"
#: qcsrc/common/minigames/minigame/pong.qc:653
msgid "Remove AI player"
-msgstr ""
+msgstr "YZ Oyuncusunu Sil"
#: qcsrc/common/minigames/minigame/pp.qc:443
#: qcsrc/common/minigames/minigame/ttt.qc:324
"You lost the game!\n"
"Select \"^1Next Match^7\" on the menu for a rematch!"
msgstr ""
+"Oyunu kaybettin!\n"
+"Tekrar oynamak için menüden \"^1Sonraki Müsabaka^7\" öğesini seç."
#: qcsrc/common/minigames/minigame/pp.qc:444
#: qcsrc/common/minigames/minigame/ttt.qc:325
"You win!\n"
"Select \"^1Next Match^7\" on the menu to start a new match!"
msgstr ""
+"Sen kazandın!\n"
+"Yeni bir müsabaka için menüden \"^1Sonraki Müsabaka^7\" öğesini seç!"
#: qcsrc/common/minigames/minigame/pp.qc:450
#: qcsrc/common/minigames/minigame/ttt.qc:331
#: qcsrc/common/minigames/minigame/pp.qc:582
#: qcsrc/common/minigames/minigame/ttt.qc:665
msgid "Next Match"
-msgstr ""
+msgstr "Sonraki Müsabaka"
#: qcsrc/common/minigames/minigame/ps.qc:478
#, c-format
msgid "Pieces left: %s"
-msgstr ""
+msgstr "Kalan parça: %s"
#: qcsrc/common/minigames/minigame/ps.qc:488
msgid "No more valid moves"
-msgstr ""
+msgstr "Daha fazla geçerli hareket yok"
#: qcsrc/common/minigames/minigame/ps.qc:491
msgid "Well done, you win!"
-msgstr ""
+msgstr "Aferin, sen kazandın!"
#: qcsrc/common/minigames/minigame/ps.qc:494
msgid "Jump a piece over another to capture it"
-msgstr ""
+msgstr "Yakalamak için bir parçayı diğerine atla"
#: qcsrc/common/minigames/minigame/ttt.qc:666
msgid "Single Player"
-msgstr ""
+msgstr "Tek Oyuncu"
#: qcsrc/common/monsters/monster/mage.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:18
msgid "Mage"
-msgstr ""
+msgstr "Sihirbaz"
#: qcsrc/common/monsters/monster/mage.qh:29
msgid "Mage spike"
#: qcsrc/common/monsters/monster/spider.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:16
msgid "Spider"
-msgstr ""
+msgstr "Örümcek"
#: qcsrc/common/monsters/monster/spider.qh:28
msgid "Spider attack"
-msgstr ""
+msgstr "Örümcek saldırısı"
#: qcsrc/common/monsters/monster/wyvern.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:19
msgid "Wyvern"
-msgstr ""
+msgstr "Ejder"
#: qcsrc/common/monsters/monster/wyvern.qh:28
msgid "Wyvern attack"
-msgstr ""
+msgstr "Ejder saldırısı"
#: qcsrc/common/monsters/monster/zombie.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:15
msgid "Zombie"
-msgstr ""
+msgstr "Zombi"
#: qcsrc/common/mutators/mutator/buffs/all.inc:15
msgid "Ammo"
-msgstr ""
+msgstr "Cephane"
#: qcsrc/common/mutators/mutator/buffs/all.inc:24
msgid "Resistance"
-msgstr ""
+msgstr "Direnç"
#: qcsrc/common/mutators/mutator/buffs/all.inc:33
#: qcsrc/common/mutators/mutator/instagib/items.qh:94
msgid "Speed"
-msgstr ""
+msgstr "Hız"
#: qcsrc/common/mutators/mutator/buffs/all.inc:43
msgid "Medic"
-msgstr ""
+msgstr "Sıhhiye"
#: qcsrc/common/mutators/mutator/buffs/all.inc:54
msgid "Bash"
-msgstr ""
+msgstr "Darbe"
#: qcsrc/common/mutators/mutator/buffs/all.inc:62
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:177
msgid "Vampire"
-msgstr ""
+msgstr "Vampir"
#: qcsrc/common/mutators/mutator/buffs/all.inc:70
msgid "Disability"
-msgstr ""
+msgstr "Sakatlık"
#: qcsrc/common/mutators/mutator/buffs/all.inc:78
msgid "Vengeance"
-msgstr ""
+msgstr "İntikam"
#: qcsrc/common/mutators/mutator/buffs/all.inc:86
msgid "Jump"
-msgstr ""
+msgstr "Zıpla"
#: qcsrc/common/mutators/mutator/buffs/all.inc:95
msgid "Invisible"
-msgstr ""
+msgstr "Görünmez"
#: qcsrc/common/mutators/mutator/buffs/all.inc:104
msgid "Inferno"
-msgstr ""
+msgstr "Cehennem"
#: qcsrc/common/mutators/mutator/buffs/all.inc:112
msgid "Swapper"
-msgstr ""
+msgstr "Takascı"
#: qcsrc/common/mutators/mutator/buffs/all.inc:120
msgid "Magnet"
-msgstr ""
+msgstr "Mıknatıs"
#: qcsrc/common/mutators/mutator/buffs/all.inc:128
msgid "Luck"
-msgstr ""
+msgstr "Şans"
#: qcsrc/common/mutators/mutator/buffs/all.inc:136
msgid "Flight"
-msgstr ""
+msgstr "Uçuş"
#: qcsrc/common/mutators/mutator/buffs/buffs.qh:7
msgid "Buff"
-msgstr ""
+msgstr "Devetüyü"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
msgid "Damage text"
-msgstr ""
+msgstr "Hasar metni"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:18
msgid "Draw damage numbers"
-msgstr ""
+msgstr "Hasar numarasını çiz"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
msgid "Font size minimum:"
-msgstr ""
+msgstr "Asgari yazı tipi boyutu:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
msgid "Font size maximum:"
-msgstr ""
+msgstr "Azami yazı tipi boyutu:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
msgid "Accumulate range:"
-msgstr ""
+msgstr "Birikim aralığı:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:35
msgid "Lifetime:"
-msgstr ""
+msgstr "Ömür:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:40
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:50
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:109
#: qcsrc/menu/xonotic/util.qc:775
msgid "Color:"
-msgstr ""
+msgstr "Renk:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:47
msgid "Draw damage numbers for friendly fire"
-msgstr ""
+msgstr "Dost ateşi için hasar numarası çizin"
#: qcsrc/common/mutators/mutator/instagib/items.qh:56
msgid "Extra life"
-msgstr ""
+msgstr "İlave can"
#: qcsrc/common/mutators/mutator/instagib/items.qh:75
msgid "Invisibility"
-msgstr ""
+msgstr "Görünmezlik"
#: qcsrc/common/mutators/mutator/nades/nades.inc:18
msgid "Napalm grenade"
-msgstr ""
+msgstr "Napalm bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:26
msgid "Ice grenade"
-msgstr ""
+msgstr "Buz bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:34
msgid "Translocate grenade"
-msgstr ""
+msgstr "Yer değiştirme bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:42
msgid "Spawn grenade"
-msgstr ""
+msgstr "Ortaya çıkma bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:50
msgid "Heal grenade"
-msgstr ""
+msgstr "İyileşme bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:58
msgid "Monster grenade"
-msgstr ""
+msgstr "Canavar bombası"
#: qcsrc/common/mutators/mutator/nades/nades.inc:66
msgid "Entrap grenade"
-msgstr ""
+msgstr "Tuzak bombası"
#: qcsrc/common/mutators/mutator/nades/nades.qh:32
msgid "Grenade"
-msgstr ""
+msgstr "Bomba"
#: qcsrc/common/mutators/mutator/overkill/hmg.qh:17
msgid "Heavy Machine Gun"
-msgstr ""
+msgstr "Ağır makineli tüfek"
#: qcsrc/common/mutators/mutator/overkill/rpc.qh:17
msgid "Rocket Propelled Chainsaw"
-msgstr ""
+msgstr "Roket tahrikli testere"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:3
msgid "Waypoint"
-msgstr ""
+msgstr "Ara nokta"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
msgid "Help me!"
-msgstr ""
+msgstr "Yardım et!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
msgid "Here"
-msgstr ""
+msgstr "İşte"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:6
msgid "DANGER"
-msgstr ""
+msgstr "TEHLİKE"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:8
msgid "Frozen!"
-msgstr ""
+msgstr "Soğuk!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
msgid "Item"
-msgstr ""
+msgstr "Nesne"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
msgid "Checkpoint"
-msgstr ""
+msgstr "Kontrol noktası"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:13
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:252
msgid "Finish"
-msgstr ""
+msgstr "Bitiş"
#: 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 "Başlat"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:17
msgid "Defend"
-msgstr ""
+msgstr "Savun"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:18
msgid "Destroy"
-msgstr ""
+msgstr "Yoket"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:19
msgid "Push"
-msgstr ""
+msgstr "İt"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
msgid "Flag carrier"
-msgstr ""
+msgstr "Bayrak taşıyıcı"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
msgid "Enemy carrier"
-msgstr ""
+msgstr "Düşman taşıyıcı"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
msgid "Dropped flag"
-msgstr ""
+msgstr "Bırakılan bayrak"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
msgid "White base"
-msgstr ""
+msgstr "Beyaz zemin"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:25
msgid "Red base"
-msgstr ""
+msgstr "Kırmızı zemin"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:26
msgid "Blue base"
-msgstr ""
+msgstr "Mavi zemin"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:27
msgid "Yellow base"
-msgstr ""
+msgstr "Sarı zemin"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:28
msgid "Pink base"
-msgstr ""
+msgstr "Pembe zemin"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
msgid "Return flag here"
-msgstr ""
+msgstr "Bayrağı buraya getir"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
#: qcsrc/common/mutators/mutator/waypoints/all.inc:52
#: qcsrc/common/mutators/mutator/waypoints/all.inc:53
msgid "Control point"
-msgstr ""
+msgstr "Kontrol noktası"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:37
msgid "Dropped key"
-msgstr ""
+msgstr "Bırakılan anahtar"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:38
#: qcsrc/common/mutators/mutator/waypoints/all.inc:40
#: qcsrc/common/mutators/mutator/waypoints/all.inc:42
#: qcsrc/common/mutators/mutator/waypoints/all.inc:43
msgid "Key carrier"
-msgstr ""
+msgstr "Anahtar taşıyıcı"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:39
msgid "Run here"
-msgstr ""
+msgstr "Burada koş"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:45
#: qcsrc/common/mutators/mutator/waypoints/all.inc:48
msgid "Ball"
-msgstr ""
+msgstr "Küre"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:46
msgid "Ball carrier"
-msgstr ""
+msgstr "Küre taşıyıcı"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:49
msgid "Goal"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:54
#: qcsrc/common/mutators/mutator/waypoints/all.inc:55
msgid "Generator"
-msgstr ""
+msgstr "Dinamo"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:57
msgid "Weapon"
-msgstr ""
+msgstr "Silah"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:59
msgid "Monster"
-msgstr ""
+msgstr "Canavar"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:61
msgid "Vehicle"
-msgstr ""
+msgstr "Araç"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
msgid "Intruder!"
-msgstr ""
+msgstr "Davetsiz misafir!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:64
msgid "Tagged"
-msgstr ""
+msgstr "Etiketli"
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:651
#: qcsrc/common/turrets/cl_turrets.qc:120
msgid "Spam"
-msgstr ""
+msgstr "İstenmeyen"
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:655
#, c-format
msgid "%s needing help!"
-msgstr ""
+msgstr "%s yardıma ihtiyacım var!"
#: qcsrc/common/net_notice.qc:87
msgid "^1Server notices:"
-msgstr ""
+msgstr "^1Sunucu bildirimleri:"
#: qcsrc/common/notifications/all.inc:239
msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
-msgstr ""
+msgstr "^F4NOT: ^BGMaç sırasında oyunculara sohbet gönderilmez"
#: qcsrc/common/notifications/all.inc:241
#, c-format
msgid "^BG%s^BG captured the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG ^TC^TT^BG bayrağı ele geçirildi"
#: qcsrc/common/notifications/all.inc:242
#, 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/item/listbox.qc:415
#, c-format
msgid "Item %d"
-msgstr ""
+msgstr "Nesne %d"
#: qcsrc/menu/item/textslider.qc:11 qcsrc/menu/item/textslider.qc:12
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:37
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:68
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:115
msgid "Custom"
-msgstr ""
+msgstr "Mevcut"
#: qcsrc/menu/xonotic/campaign.qc:241
#, c-format
msgid "Level %d: %s"
-msgstr ""
+msgstr "Seviye %d: %s"
#: qcsrc/menu/xonotic/credits.qc:4
msgid "Core Team"
-msgstr ""
+msgstr "Çekirdek Takım"
#: qcsrc/menu/xonotic/credits.qc:16
msgid "Extended Team"
-msgstr ""
+msgstr "İlave Takım"
#: qcsrc/menu/xonotic/credits.qc:48
msgid "Website"
-msgstr ""
+msgstr "Website"
#: qcsrc/menu/xonotic/credits.qc:53
msgid "Stats"
-msgstr ""
+msgstr "İstatistikler"
#: qcsrc/menu/xonotic/credits.qc:57
msgid "Art"
-msgstr ""
+msgstr "Sanat"
#: qcsrc/menu/xonotic/credits.qc:65
msgid "Animation"
-msgstr ""
+msgstr "Canlandırma"
#: qcsrc/menu/xonotic/credits.qc:69
msgid "Level Design"
-msgstr ""
+msgstr "Seviye Tasarımı"
#: qcsrc/menu/xonotic/credits.qc:92
msgid "Music / Sound FX"
-msgstr ""
+msgstr "Müzik / Ses FX"
#: qcsrc/menu/xonotic/credits.qc:108
msgid "Game Code"
-msgstr ""
+msgstr "Oyun Kodu"
#: qcsrc/menu/xonotic/credits.qc:116
msgid "Marketing / PR"
-msgstr ""
+msgstr "Mağaza / PR"
#: qcsrc/menu/xonotic/credits.qc:122
msgid "Legal"
-msgstr ""
+msgstr "Yasal"
#: qcsrc/menu/xonotic/credits.qc:127
msgid "Game Engine"
-msgstr ""
+msgstr "Oyun Motoru"
#: qcsrc/menu/xonotic/credits.qc:131
msgid "Engine Additions"
-msgstr ""
+msgstr "Motor Eklemeleri"
#: qcsrc/menu/xonotic/credits.qc:136
msgid "Compiler"
-msgstr ""
+msgstr "Derleyici"
#: qcsrc/menu/xonotic/credits.qc:142
msgid "Other Active Contributors"
-msgstr ""
+msgstr "Diğer Aktif Geliştiriciler"
#: qcsrc/menu/xonotic/credits.qc:149
msgid "Translators"
-msgstr ""
+msgstr "Çevirmenler"
#: qcsrc/menu/xonotic/credits.qc:151
msgid "Asturian"
-msgstr ""
+msgstr "Asturyaca"
#: qcsrc/menu/xonotic/credits.qc:156
msgid "Belarusian"
-msgstr ""
+msgstr "Beyaz Rusça"
#: qcsrc/menu/xonotic/credits.qc:159
msgid "Bulgarian"
-msgstr ""
+msgstr "Bulgarca"
#: qcsrc/menu/xonotic/credits.qc:166
msgid "Chinese (China)"
-msgstr ""
+msgstr "Çince (Çin)"
#: qcsrc/menu/xonotic/credits.qc:172
msgid "Chinese (Taiwan)"
-msgstr ""
+msgstr "Çince (Tayvan)"
#: qcsrc/menu/xonotic/credits.qc:177
msgid "Cornish"
-msgstr ""
+msgstr "Keltçe"
#: qcsrc/menu/xonotic/credits.qc:180
msgid "Czech"
-msgstr ""
+msgstr "Çekce"
#: qcsrc/menu/xonotic/credits.qc:185
msgid "Dutch"
-msgstr ""
+msgstr "Flemenkçe"
#: qcsrc/menu/xonotic/credits.qc:192
msgid "English (Australia)"
-msgstr ""
+msgstr "İngilizce (Avustralya)"
#: qcsrc/menu/xonotic/credits.qc:197
msgid "Finnish"
-msgstr ""
+msgstr "Fince"
#: qcsrc/menu/xonotic/credits.qc:202
msgid "French"
-msgstr ""
+msgstr "Fransızca"
#: qcsrc/menu/xonotic/credits.qc:210
msgid "German"
-msgstr ""
+msgstr "Almanca"
#: qcsrc/menu/xonotic/credits.qc:221
msgid "Greek"
-msgstr ""
+msgstr "Yunanca"
#: qcsrc/menu/xonotic/credits.qc:227
msgid "Hungarian"
-msgstr ""
+msgstr "Macarca"
#: qcsrc/menu/xonotic/credits.qc:231
msgid "Irish"
-msgstr ""
+msgstr "İrlandaca"
#: qcsrc/menu/xonotic/credits.qc:234
msgid "Italian"
-msgstr ""
+msgstr "İtalyanca"
#: qcsrc/menu/xonotic/credits.qc:240
msgid "Kazakh"
-msgstr ""
+msgstr "Kazakça"
#: qcsrc/menu/xonotic/credits.qc:243
msgid "Korean"
-msgstr ""
+msgstr "Korece"
#: qcsrc/menu/xonotic/credits.qc:247
msgid "Polish"
-msgstr ""
+msgstr "Polonyaca"
#: qcsrc/menu/xonotic/credits.qc:255
msgid "Portuguese"
-msgstr ""
+msgstr "Portekizce"
#: qcsrc/menu/xonotic/credits.qc:261
msgid "Romanian"
-msgstr ""
+msgstr "Romanca"
#: qcsrc/menu/xonotic/credits.qc:268
msgid "Russian"
-msgstr ""
+msgstr "Rusça"
#: qcsrc/menu/xonotic/credits.qc:279
msgid "Scottish Gaelic"
-msgstr ""
+msgstr "İskoçca"
#: qcsrc/menu/xonotic/credits.qc:282
msgid "Serbian"
-msgstr ""
+msgstr "Sırpça"
#: qcsrc/menu/xonotic/credits.qc:288
msgid "Spanish"
-msgstr ""
+msgstr "İspanyolca"
#: qcsrc/menu/xonotic/credits.qc:299
msgid "Swedish"
-msgstr ""
+msgstr "İsveççe"
#: qcsrc/menu/xonotic/credits.qc:303
msgid "Ukrainian"
-msgstr ""
+msgstr "Ukraynaca"
#: qcsrc/menu/xonotic/credits.qc:310
msgid "Past Contributors"
-msgstr ""
+msgstr "Geçmişte Katkıda Bulunanlar"
#: qcsrc/menu/xonotic/cvarlist.qc:73
msgid "forced to be saved to config.cfg"
-msgstr ""
+msgstr "config.cfg dosyasına kaydedilmek zorunda"
#: qcsrc/menu/xonotic/cvarlist.qc:79 qcsrc/menu/xonotic/cvarlist.qc:89
msgid "will not be saved"
-msgstr ""
+msgstr "kaydedilmeyecek"
#: qcsrc/menu/xonotic/cvarlist.qc:84
msgid "will be saved to config.cfg"
-msgstr ""
+msgstr "config.cfg dosyasına kaydedilecek"
#: qcsrc/menu/xonotic/cvarlist.qc:93
msgid "private"
-msgstr ""
+msgstr "özel"
#: qcsrc/menu/xonotic/cvarlist.qc:95
msgid "engine setting"
-msgstr ""
+msgstr "motor ayarı"
#: qcsrc/menu/xonotic/cvarlist.qc:97
msgid "read only"
-msgstr ""
+msgstr "salt okunur"
#: qcsrc/menu/xonotic/dialog_credits.qc:13
#: qcsrc/menu/xonotic/dialog_monstertools.qc:38
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:75
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qc:14
msgid "OK"
-msgstr ""
+msgstr "TAMAM"
#: qcsrc/menu/xonotic/dialog_credits.qh:7
msgid "Credits"
-msgstr ""
+msgstr "Katkılar"
#: qcsrc/menu/xonotic/dialog_credits.qh:8
msgid "The Xonotic credits"
-msgstr ""
+msgstr "Xonotic katkıcıları"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
msgid ""
"player name to get started. You can change these options later through the "
"menu system."
msgstr ""
+"Xonotic'e hoş geldiniz, lütfen dil tercihinizi seçin ve başlamak için oyuncu "
+"adınızı girin. Bu seçenekleri daha sonra menüden değiştirebilirsiniz."
#: qcsrc/menu/xonotic/dialog_firstrun.qc:45
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:28
msgid "Name:"
-msgstr ""
+msgstr "İsim:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:53
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:60
msgid "Name under which you will appear in the game"
-msgstr ""
+msgstr "Oyunda görüneceğiniz isim"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:69
msgid "Text language:"
-msgstr ""
+msgstr "Yazı dili:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:78
msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
msgstr ""
+"Oyuncu istatistikleri takma adınızı stats.xonotic.org adresinde kullanmasına "
+"izin verilsin mi?"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:84
msgid "Undecided"
-msgstr ""
+msgstr "Kararsız"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:88
msgid "Save settings"
-msgstr ""
+msgstr "Ayarları kaydet"
#: qcsrc/menu/xonotic/dialog_firstrun.qh:6
msgid "Welcome"
-msgstr ""
+msgstr "Hoşgeldiniz"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:16
msgid "Ammunition display:"
-msgstr ""
+msgstr "Mühimmat ekranı:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:19
msgid "Show only current ammo type"
-msgstr ""
+msgstr "Sadece geçerli mühimmat türünü göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:22
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:44
msgid "Noncurrent alpha:"
-msgstr ""
+msgstr "Mevcut olmayan alfa:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:26
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:48
msgid "Noncurrent scale:"
-msgstr ""
+msgstr "Akım dışı ölçek:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:30
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
msgid "Align icon:"
-msgstr ""
+msgstr "Hizalama simgesi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:31
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:30
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:33
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
msgid "Left"
-msgstr ""
+msgstr "Sol"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:34
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:20
msgid "Right"
-msgstr ""
+msgstr "Sağ"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qh:6
msgid "Ammo Panel"
-msgstr ""
+msgstr "Mühimmat Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:17
msgid "Message duration:"
-msgstr ""
+msgstr "Mesaj süresi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:21
msgid "Fade time:"
-msgstr ""
+msgstr "Solma süresi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:25
msgid "Flip messages order"
-msgstr ""
+msgstr "Mesajları sırala"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:15
msgid "Text alignment:"
-msgstr ""
+msgstr "Metin hizalama:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:31
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:19
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:71
msgid "Center"
-msgstr ""
+msgstr "Ortala"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:35
msgid "Font scale:"
-msgstr ""
+msgstr "Yazı tipi ölçeği:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
msgid "Centerprint Panel"
-msgstr ""
+msgstr "Ortabaskı paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:15
msgid "Chat entries:"
-msgstr ""
+msgstr "Sohbet girişleri:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:18
msgid "Chat size:"
-msgstr ""
+msgstr "Sohbet boyutu:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:22
msgid "Chat lifetime:"
-msgstr ""
+msgstr "Sohbet süresi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:26
msgid "Chat beep sound"
-msgstr ""
+msgstr "Sohbet bip sesi"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qh:6
msgid "Chat Panel"
-msgstr ""
+msgstr "Sohbet Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:14
msgid "Engine info:"
-msgstr ""
+msgstr "Motor bilgisi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:17
msgid "Use an averaging algorithm for fps"
-msgstr ""
+msgstr "Fps için ortalama algoritma kullan"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh:6
msgid "Engine Info Panel"
-msgstr ""
+msgstr "Motor Bilgisi Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:15
msgid "Combine health and armor"
-msgstr ""
+msgstr "Sağlık ve zırhı birleştirin"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:28
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:15
msgid "Enable status bar"
-msgstr ""
+msgstr "Durum çubuğunu etkinleştir"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:19
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:17
msgid "Status bar alignment:"
-msgstr ""
+msgstr "Durum çubuğu hizalaması:"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:27
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:37
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:25
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:35
msgid "Inward"
-msgstr ""
+msgstr "içe doğru"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:38
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:27
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:36
msgid "Outward"
-msgstr ""
+msgstr "Dışa doğru"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:32
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:30
msgid "Icon alignment:"
-msgstr ""
+msgstr "Simge hizalama:"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:40
msgid "Flip health and armor positions"
-msgstr ""
+msgstr "Ayak sağlığı ve zırh pozisyonları"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
msgid "Health/Armor Panel"
-msgstr ""
+msgstr "Sağlık/Zırh Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:14
msgid "Info messages:"
-msgstr ""
+msgstr "Bilgi mesajları:"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:17
msgid "Flip align"
-msgstr ""
+msgstr "Çevir hizala"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
msgid "Info Messages Panel"
-msgstr ""
+msgstr "Bilgi Mesajları Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
msgid "PNL^Disabled"
-msgstr ""
+msgstr "PNL^Devredışı"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
msgid "PNL^Enabled spectating"
-msgstr ""
+msgstr "PNL^Etkinleştiriliyor"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:18
msgid "PNL^Enabled even playing in warmup"
-msgstr ""
+msgstr "PNL^Isınmada bile oynatma etkin"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:29
msgid "Reduced"
-msgstr ""
+msgstr "İndirimli"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:32
msgid "Text/icon ratio:"
-msgstr ""
+msgstr "Metin/simge oranı:"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
msgid "Hide spawned items"
-msgstr ""
+msgstr "Ortaya çıkan öğeleri gizle"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
msgid "Hide big armor and health"
-msgstr ""
+msgstr "Büyük zırhı ve sağlığı gizle"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
msgid "Dynamic size"
-msgstr ""
+msgstr "Dinamik boyut"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
msgid "Items Time Panel"
-msgstr ""
+msgstr "Öğeler Zaman Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
msgid "Mod Icons Panel"
-msgstr ""
+msgstr "Mod Simgeleri Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:15
msgid "Notifications:"
-msgstr ""
+msgstr "Bildirimler:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:18
msgid "Also print notifications to the console"
-msgstr ""
+msgstr "Ayrıca konsola bildirimleri yazdır"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:21
msgid "Flip notify order"
-msgstr ""
+msgstr "Siparişi bilgilendir"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:24
msgid "Entry lifetime:"
-msgstr ""
+msgstr "Giriş ömrü:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:28
msgid "Entry fadetime:"
-msgstr ""
+msgstr "Giriş solma süresi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
msgid "Notification Panel"
-msgstr ""
+msgstr "Bildirim Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:15
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:14
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:15
msgid "Panel disabled"
-msgstr ""
+msgstr "Panel devre dışı"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:16
msgid "Panel enabled"
-msgstr ""
+msgstr "Panel etkin"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
msgid "Panel enabled even observing"
-msgstr ""
+msgstr "Panel gözlemleme etkin"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
msgid "Panel enabled only in Race/CTS"
-msgstr ""
+msgstr "Panel yalnızca Race/CTS'de etkinleştirildi"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
msgid "Status bar"
-msgstr ""
+msgstr "Durum çubuğu"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:26
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:68
msgid "Left align"
-msgstr ""
+msgstr "Sol hizalama"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:27
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:74
msgid "Right align"
-msgstr ""
+msgstr "Sağ hizalama"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:28
msgid "Inward align"
-msgstr ""
+msgstr "İçe hizala"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:29
msgid "Outward align"
-msgstr ""
+msgstr "Dışa hizala"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:33
msgid "Flip speed/acceleration positions"
-msgstr ""
+msgstr "Çevirme hızı/hızlanma pozisyonları"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
msgid "Speed:"
-msgstr ""
+msgstr "Hız:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
msgid "Include vertical speed"
-msgstr ""
+msgstr "Dikey hızı dahil et"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
msgid "Speed unit:"
-msgstr ""
+msgstr "Hız ünitesi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
msgid "qu/s"
-msgstr ""
+msgstr "qu/s"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:52
msgid "m/s"
-msgstr ""
+msgstr "m/s"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:53
msgid "km/h"
-msgstr ""
+msgstr "km/h"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:54
msgid "mph"
-msgstr ""
+msgstr "mph"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:55
msgid "knots"
-msgstr ""
+msgstr "bağ"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:57
msgid "Show"
-msgstr ""
+msgstr "Göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:60
msgid "Top speed"
-msgstr ""
+msgstr "En yüksek hız"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
msgid "Acceleration:"
-msgstr ""
+msgstr "Hızlanma:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
msgid "Include vertical acceleration"
-msgstr ""
+msgstr "Dikey hızlandırmayı dahil et"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
msgid "Physics Panel"
-msgstr ""
+msgstr "Fizik Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
msgid "Powerups Panel"
-msgstr ""
+msgstr "Güç Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
msgid "Panel enabled when spectating"
-msgstr ""
+msgstr "Panel isteğe bağlı olarak etkinleştirildi"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
msgid "Panel always enabled"
-msgstr ""
+msgstr "Panel her zaman etkin"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
msgid "Forced aspect:"
-msgstr ""
+msgstr "Zorlama yönü:"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
msgid "Pressed Keys Panel"
-msgstr ""
+msgstr "Basılı Tuşlar Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
msgid "Quick Menu Panel"
-msgstr ""
+msgstr "Hızlı Menü Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
msgid "Race Timer Panel"
-msgstr ""
+msgstr "Yarış Zamanlayıcı Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
msgid "Panel enabled in teamgames"
-msgstr ""
+msgstr "Takım oyunlarında panel etkin"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
msgid "Radar:"
-msgstr ""
+msgstr "Radar:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:26
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:68
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
#: qcsrc/menu/xonotic/util.qc:792
msgid "Alpha:"
-msgstr ""
+msgstr "Alfa:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:30
msgid "Rotation:"
-msgstr ""
+msgstr "Döndürme:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:32
msgid "Forward"
-msgstr ""
+msgstr "İleri"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:33
msgid "West"
-msgstr ""
+msgstr "Batı"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:34
msgid "South"
-msgstr ""
+msgstr "Güney"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:35
msgid "East"
-msgstr ""
+msgstr "Doğu"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:36
msgid "North"
-msgstr ""
+msgstr "Kuzey"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
msgid "Scale:"
-msgstr ""
+msgstr "Ölçek:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
msgid "Zoom mode:"
-msgstr ""
+msgstr "Yakınlaştırma modu:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
msgid "Zoomed in"
-msgstr ""
+msgstr "Yakınlaştırılmış"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
msgid "Zoomed out"
-msgstr ""
+msgstr "Uzaklaştırıldı"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
msgid "Always zoomed"
-msgstr ""
+msgstr "Her zaman yakınlaştırılmış"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
msgid "Never zoomed"
-msgstr ""
+msgstr "Hiçbir zaman yakınlaştırma"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
msgid "Radar Panel"
-msgstr ""
+msgstr "Radar Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:15
msgid "Score:"
-msgstr ""
+msgstr "Puan:"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:18
msgid "Rankings:"
-msgstr ""
+msgstr "Sıralama:"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:19
msgid "Off"
-msgstr ""
+msgstr "Kapat"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:20
msgid "And me"
-msgstr ""
+msgstr "ve ben"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
msgid "Pure"
-msgstr ""
+msgstr "Sade"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qh:6
msgid "Score Panel"
-msgstr ""
+msgstr "Sonuç Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:14
msgid "Timer:"
-msgstr ""
+msgstr "Zamanlayıcı:"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:17
msgid "Show elapsed time"
-msgstr ""
+msgstr "Geçen zamanı göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
msgid "Timer Panel"
-msgstr ""
+msgstr "Zamanlayıcı Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:15
msgid "Alpha after voting:"
-msgstr ""
+msgstr "Oylamadan sonra Alfa:"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
msgid "Vote Panel"
-msgstr ""
+msgstr "Oylama Paneli"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:20
msgid "Fade out after:"
-msgstr ""
+msgstr "Sonra solma:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:139
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:55
msgid "Never"
-msgstr ""
+msgstr "Asla"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
#, c-format
msgid "%ds"
-msgstr ""
+msgstr "%ds"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:28
msgid "Fade effect:"
-msgstr ""
+msgstr "Solma efekti:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:31
msgid "EF^None"
-msgstr ""
+msgstr "EF^Yok"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:32
msgid "Alpha"
-msgstr ""
+msgstr "Alfa"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
msgid "Slide"
-msgstr ""
+msgstr "Kaydır"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:34
msgid "EF^Both"
-msgstr ""
+msgstr "EF^Her ikisi de"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:38
msgid "Weapon icons:"
-msgstr ""
+msgstr "Silah simgeleri:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:41
msgid "Show only owned weapons"
-msgstr ""
+msgstr "Sadece sahip olunan silahları göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:52
msgid "Show weapon ID as:"
-msgstr ""
+msgstr "Silah kimliğini şunun gibi göster:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:53
msgid "SHOWAS^None"
-msgstr ""
+msgstr "SHOWAS^Yok"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
msgid "Number"
-msgstr ""
+msgstr "Numara"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
msgid "Bind"
-msgstr ""
+msgstr "Bindir"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:58
msgid "Weapon ID scale:"
-msgstr ""
+msgstr "Silah kimliği ölçeği:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:64
msgid "Show Accuracy"
-msgstr ""
+msgstr "Doğruluk Göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:65
msgid "Show Ammo"
-msgstr ""
+msgstr "Cephaneyi Göster"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:68
msgid "Ammo bar alpha:"
-msgstr ""
+msgstr "Cephane çubuğu alfa:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:74
msgid "Ammo bar color:"
-msgstr ""
+msgstr "Cephane çubuğu rengi:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
msgid "Weapons Panel"
-msgstr ""
+msgstr "Cephane Paneli"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
msgid "HUD skins"
-msgstr ""
+msgstr "HUD biçimleri"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:22
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:196
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:25
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:35
msgid "Filter:"
-msgstr ""
+msgstr "Filtre:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:30
#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:53
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:49
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:44
msgid "Refresh"
-msgstr ""
+msgstr "Yenile"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
#: qcsrc/menu/xonotic/dialog_settings_user.qc:30
msgid "Set skin"
-msgstr ""
+msgstr "Biçim ayarla"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
msgid "Save current skin"
-msgstr ""
+msgstr "Mevcut biçimi kaydet"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
msgid "Panel background defaults:"
-msgstr ""
+msgstr "Panel arka plan varsayılanları:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:48
#: qcsrc/menu/xonotic/util.qc:767
msgid "Background:"
-msgstr ""
+msgstr "Arkaplan:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:50
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:62
#: qcsrc/menu/xonotic/util.qc:770 qcsrc/menu/xonotic/util.qc:786
#: qcsrc/menu/xonotic/util.qc:803
msgid "Disable"
-msgstr ""
+msgstr "Devredışı"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
#: qcsrc/menu/xonotic/util.qc:783
msgid "Border size:"
-msgstr ""
+msgstr "Kenarlık boyutu:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
msgid "Team color:"
-msgstr ""
+msgstr "Takım rengi:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
#: qcsrc/menu/xonotic/util.qc:809
msgid "Test team color in configure mode"
-msgstr ""
+msgstr "Yapılandırma modunda ekip rengini test et"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
#: qcsrc/menu/xonotic/util.qc:812
msgid "Padding:"
-msgstr ""
+msgstr "Dolgu malzemesi:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
msgid "HUD Dock:"
-msgstr ""
+msgstr "HUD Rıhtım:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
msgid "DOCK^Disabled"
-msgstr ""
+msgstr "DOCK^Devredışı"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:96
msgid "DOCK^Small"
-msgstr ""
+msgstr "DOCK^Küçük"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:97
msgid "DOCK^Medium"
-msgstr ""
+msgstr "DOCK^Vasat"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:98
msgid "DOCK^Large"
-msgstr ""
+msgstr "DOCK^Geniş"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:121
msgid "Grid settings:"
-msgstr ""
+msgstr "Izgara ayarları:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:124
msgid "Snap panels to grid"
-msgstr ""
+msgstr "Panelleri ızgaraya yapıştır"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:127
msgid "Grid size:"
-msgstr ""
+msgstr "Izgara boyutu:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:129
msgid "X:"
-msgstr ""
+msgstr "X:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:136
msgid "Y:"
-msgstr ""
+msgstr "Y:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:145
msgid "Exit setup"
-msgstr ""
+msgstr "Kurulumdan çık"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qh:6
msgid "Panel HUD Setup"
-msgstr ""
+msgstr "Panel HUD Kurulum"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:13
msgid "Monster:"
-msgstr ""
+msgstr "Canavar:"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:22
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
msgid "Spawn"
-msgstr ""
+msgstr "Yumurta"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:23
#: qcsrc/menu/xonotic/serverlist.qc:268
msgid "Remove"
-msgstr ""
+msgstr "Kaldır"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:25
msgid "Move target:"
-msgstr ""
+msgstr "Hedefi taşı:"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:26
msgid "Follow"
-msgstr ""
+msgstr "Takip et"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:27
msgid "Wander"
-msgstr ""
+msgstr "Dolaş"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:28
msgid "Spawnpoint"
#: qcsrc/menu/xonotic/dialog_multiplayer.qh:6
msgid "Multiplayer"
-msgstr ""
+msgstr "Çoklu Oyuncu"
#: qcsrc/menu/xonotic/dialog_multiplayer.qh:7
msgid ""
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:229
msgid "Start Multiplayer!"
-msgstr ""
+msgstr "Çoklu Oyuncu Başlat!"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:58
msgid "Title:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
msgid "Settings:"
-msgstr ""
+msgstr "Ayarlar:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:258
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:290
#: 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"
-msgstr ""
+msgstr "Ayarlar"
#: qcsrc/menu/xonotic/dialog_settings.qh:7
msgid "Change the game settings"
-msgstr ""
+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:"
#: 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_effects.qc:50
msgid "PRE^Medium"
-msgstr ""
+msgstr "PRE^Vasat"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
msgid "PRE^Normal"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:80
msgid "PDET^Medium"
-msgstr ""
+msgstr "PDET^Vasat"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:81
msgid "PDET^Normal"
"Disable textures completely for very slow hardware. This gives a huge "
"performance boost, but looks very ugly. (default: disabled)"
msgstr ""
+"Çok yavaş donanım için dokuları tamamen devre dışı bırakın. Bu büyük bir "
+"performans artışı sağlar, ancak çok çirkin görünür. (varsayılan: devre dışı)"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:135
msgid "Use lightmaps"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
msgid "Gamemode Settings"
-msgstr ""
+msgstr "Oyun modu ayarları"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:67
msgid "Display capture times in Capture The Flag"
#: 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_misc.qc:151
msgid "Advanced settings..."
-msgstr ""
+msgstr "Gelişmiş ayarlar..."
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:152
msgid "Advanced settings where you can tweak every single variable of the game"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:43
msgid "SZ^Medium"
-msgstr ""
+msgstr "SZ^Vasat"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:44
msgid "SZ^Large"
#: 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/dialog_singleplayer.qc:131
msgid "CSKL^Easy"
-msgstr ""
+msgstr "CSKL^Kolay"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
msgid "CSKL^Medium"
-msgstr ""
+msgstr "CSKL^Vasat"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:133
msgid "CSKL^Hard"
-msgstr ""
+msgstr "CSKL^Zor"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:135
msgid "Start Singleplayer!"
-msgstr ""
+msgstr "Tek Oyuncu Başlat!"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
msgid "Singleplayer"
-msgstr ""
+msgstr "Tekli Oyuncu"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
msgid "Play the singleplayer campaign or instant action matches against bots"
-msgstr ""
+msgstr "Tek oyunculu mücadele veya botlara karşı anlık müsabakaları oynayın"
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
msgid "Winner"
#: qcsrc/menu/xonotic/serverlist.qc:1063
#, c-format
msgid "modified settings"
-msgstr ""
+msgstr "Ayarları düzenle"
#: qcsrc/menu/xonotic/serverlist.qc:1063
#, c-format
msgid "official settings"
-msgstr ""
+msgstr "Varsayılan ayarlar"
#: qcsrc/menu/xonotic/serverlist.qc:1065
msgid "stats disabled"
#: 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 ""
#: qcsrc/menu/xonotic/slider_particles.qc:16
msgid "PART^Medium"
-msgstr ""
+msgstr "PART^Vasat"
#: qcsrc/menu/xonotic/slider_particles.qc:17
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:14
"texture memory usage, but make the textures appear very blurry. (default: "
"good)"
msgstr ""
+"Doku keskinliğini değiştirin. Ayarları düşürmek, doku belleği kullanımını "
+"etkili bir şekilde azaltır, ancak dokuların çok bulanık görünmesine sebep "
+"olur. (varsayılan: iyi)"
#: qcsrc/menu/xonotic/slider_resolution.qc:115
msgid "Screen resolution"
-msgstr ""
+msgstr "Ekran çözünürlüğü"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
msgid "PART^Slow"
#: qcsrc/menu/xonotic/statslist.qc:29
msgid "January"
-msgstr ""
+msgstr "Ocak"
#: qcsrc/menu/xonotic/statslist.qc:30
msgid "February"
-msgstr ""
+msgstr "Şubat"
#: qcsrc/menu/xonotic/statslist.qc:31
msgid "March"
-msgstr ""
+msgstr "Mart"
#: qcsrc/menu/xonotic/statslist.qc:32
msgid "April"
-msgstr ""
+msgstr "Nisan"
#: qcsrc/menu/xonotic/statslist.qc:33
msgid "May"
-msgstr ""
+msgstr "Mayıs"
#: qcsrc/menu/xonotic/statslist.qc:34
msgid "June"
-msgstr ""
+msgstr "Haziran"
#: qcsrc/menu/xonotic/statslist.qc:35
msgid "July"
-msgstr ""
+msgstr "Temmuz"
#: qcsrc/menu/xonotic/statslist.qc:36
msgid "August"
-msgstr ""
+msgstr "Ağustos"
#: qcsrc/menu/xonotic/statslist.qc:37
msgid "September"
-msgstr ""
+msgstr "Eylül"
#: qcsrc/menu/xonotic/statslist.qc:38
msgid "October"
-msgstr ""
+msgstr "Ekim"
#: qcsrc/menu/xonotic/statslist.qc:39
msgid "November"
-msgstr ""
+msgstr "Kasım"
#: qcsrc/menu/xonotic/statslist.qc:40
msgid "December"
-msgstr ""
+msgstr "Aralık"
#: qcsrc/menu/xonotic/statslist.qc:96
msgid "Joined:"
-msgstr ""
+msgstr "Katıldı:"
#: qcsrc/menu/xonotic/statslist.qc:103
msgid "Last_Seen:"
-msgstr ""
+msgstr "Son_Görülme:"
#: qcsrc/menu/xonotic/statslist.qc:110
msgid "Time_Played:"
-msgstr ""
+msgstr "Oynama_Süresi:"
#: qcsrc/menu/xonotic/statslist.qc:117
msgid "Favorite_Map:"
-msgstr ""
+msgstr "Favori_Harita:"
#: qcsrc/menu/xonotic/statslist.qc:201 qcsrc/menu/xonotic/statslist.qc:245
#, c-format
msgid "%s_Matches:"
-msgstr ""
+msgstr "%s_Maçlar:"
#: qcsrc/menu/xonotic/statslist.qc:208
#, c-format
msgid "%s_ELO:"
-msgstr ""
+msgstr "%s_ELO:"
#: qcsrc/menu/xonotic/statslist.qc:215
#, c-format
msgid "%s_Rank:"
-msgstr ""
+msgstr "%s_Derece:"
#: qcsrc/menu/xonotic/statslist.qc:222
#, c-format
msgid "%s_Percentile:"
-msgstr ""
+msgstr "%s_Yüzdelik_Dilim:"
#: qcsrc/menu/xonotic/statslist.qc:231
#, c-format
msgid "%s_Favorite_Map:"
-msgstr ""
+msgstr "%s_Favori_Harita:"
#: qcsrc/menu/xonotic/statslist.qc:246
#, c-format
msgid "%d (unranked)"
-msgstr ""
+msgstr "%d (derecelendirilmemiş)"
#: qcsrc/menu/xonotic/util.qc:417
#, c-format
"Update can be downloaded at:\n"
"%s\n"
msgstr ""
+"Güncelleme şuradan indirilebilir:\n"
+"%s\n"
#: qcsrc/menu/xonotic/util.qc:528
msgid "Autogenerating mapinfo for newly added maps..."
-msgstr ""
+msgstr "Yeni eklenen haritalar için harita bilgisi oluşturuluyor..."
#: qcsrc/menu/xonotic/util.qc:557
#, c-format
msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s TEST YAPISI"
#: qcsrc/menu/xonotic/util.qc:577
#, c-format
msgid "Update to %s now!"
-msgstr ""
+msgstr "Şimdi %s 'e güncelle!"
#: qcsrc/menu/xonotic/util.qc:662
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems.\n"
msgstr ""
+"^1HATA: Doku sıkıştırması gerekli ama deskteklenmiyor.\n"
+"^1Görsel problemler olabilir.\n"
#: qcsrc/menu/xonotic/util.qc:780
msgid "Use default"
-msgstr ""
+msgstr "Varsayılanı kullan"
#: qcsrc/menu/xonotic/util.qc:800
msgid "Team Color:"
-msgstr ""
+msgstr "Takım Rengi:"
#: qcsrc/menu/xonotic/util.qh:44
msgid "Enable panel"
-msgstr ""
+msgstr "Paneli etkinleştir"
+
+#~ msgid "QMCMD^Chat"
+#~ msgstr "QMCMD^Sohbet"
# 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"
gl_flashblend 0
gl_picmip 0
gl_texturecompression_2d 0
-gl_texturecompression_sky 1
+gl_texturecompression_sky 0
mod_q3bsp_nolightmaps 0
r_bloom 0
r_coronas 1
set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
set g_cts_send_rankings_cnt 15 "send this number of map records to clients"
+set g_cts_removeprojectiles 0 "remove projectiles when the player dies, to prevent using weapons earlier in the stage than intended"
// ==========================
// duel
// ======
set g_duel 0 "Duel: frag the opponent more in a one versus one arena battle"
-set g_duel_warmup 1 "Have a short warmup period before beginning the actual duel"
+//set g_duel_warmup 180 "Have a short warmup period before beginning the actual duel"
set g_duel_with_powerups 0 "Enable powerups to spawn in the duel gamemode"
pt_BR "Portuguese (Brazil)" "Português (Brasil)" 99%
ro "Romanian" "Romana" 83%
fi "Finnish" "Suomi" 33%
-el "Greek" "Ελληνική" 33%
+el "Greek" "Ελληνική" 43%
be "Belarusian" "Беларуская" 61%
bg "Bulgarian" "Български" 68%
ru "Russian" "Русский" 99%
--- /dev/null
+{
+ "files.associations": {
+ "*.qc": "c",
+ "*.qh": "c",
+ "*.inc": "c"
+ },
+ "C_Cpp.errorSquiggles": "Disabled",
+ "C_Cpp.dimInactiveRegions": false
+}
.float death_time;
.int modelflags;
-.bool isplayermodel;
-
// FEATURE: LOD
.int lodmodelindex0;
.int lodmodelindex1;
// recursive predraw call to fix issues with forcemodels and LOD if bone indexes mismatch
if(this.tag_entity.classname == "csqcmodel")
{
- CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.entnum >= 1 && this.tag_entity.entnum <= maxclients));
+ CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.isplayermodel & ISPLAYER_CLIENT));
}
if(this.tag_entity.modelindex != this.tag_entity_lastmodelindex)
if(this.csqcmodel_modelflags & MF_ROTATE)
{
this.renderflags |= RF_USEAXIS;
- makevectors(this.angles + '0 100 0' * fmod(time, 3.6));
+ MAKEVECTORS(makevectors, this.angles + '0 100 0' * fmod(time, 3.6), v_forward, v_right, v_up);
}
if(this.csqcmodel_modelflags & MF_TRACER)
tref = EFFECT_TR_WIZSPIKE.m_id;
if(this.isplayermodel && this.drawmask) // this checks if it's a player MODEL!
{
- CSQCPlayer_ModelAppearance_Apply(this, this.entnum == player_localnum + 1);
+ CSQCPlayer_ModelAppearance_Apply(this, (this.isplayermodel & ISPLAYER_LOCAL));
CSQCPlayer_LOD_Apply(this);
if(!isplayer)
void CSQCModel_Hook_PostUpdate(entity this, bool isnew, bool isplayer, bool islocalplayer)
{
// is it a player model? (shared state)
- this.isplayermodel = (substring(this.model, 0, 14) == "models/player/" || substring(this.model, 0, 17) == "models/ok_player/" || (substring(this.model, 0, 16) == "models/monsters/" && (this.entnum >= 1 && this.entnum <= maxclients)));
+ bool is_playermodel = (substring(this.model, 0, 14) == "models/player/" || substring(this.model, 0, 17) == "models/ok_player/" ||
+ (substring(this.model, 0, 16) == "models/monsters/" && (this.isplayermodel & BIT(1))));
+ this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_MODEL, is_playermodel);
// save values set by server
if(this.isplayermodel)
.int csqcmodel_modelflags;
.int csqcmodel_traileffect;
+.int isplayermodel;
+
void CSQCModel_Effects_Apply(entity this);
void CSQCModel_Hook_PreDraw(entity this, bool isplayer);
MUTATOR_CALLHOOK(DrawInfoMessages, pos, mySize);
- if(!warmup_stage && gametype == MAPINFO_TYPE_LMS)
+ if(!warmup_stage && ISGAMETYPE(LMS))
{
entity sk;
sk = playerslots[player_localnum];
mod_active = 1; // required in each mod function that always shows something
int layout;
- if(gametype == MAPINFO_TYPE_CA)
+ if(ISGAMETYPE(CA))
layout = autocvar_hud_panel_modicons_ca_layout;
- else //if(gametype == MAPINFO_TYPE_FREEZETAG)
+ else //if(ISGAMETYPE(FREEZETAG))
layout = autocvar_hud_panel_modicons_freezetag_layout;
int rows, columns;
float aspect_ratio;
// clientside personal record
string rr;
- if(gametype == MAPINFO_TYPE_CTS)
+ if(ISGAMETYPE(CTS))
rr = CTS_RECORD;
else
rr = RACE_RECORD;
{
if(!autocvar_hud_panel_physics) return;
if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
- if(autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
+ if(autocvar_hud_panel_physics == 3 && !(ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
}
HUD_Panel_LoadCvars();
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_racetimer) return;
- if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
+ if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
if(spectatee_status == -1) return;
}
IL_EACH(g_radaricons, it.teamradar_icon, {
if ( hud_panel_radar_mouse )
if ( GetResourceAmount(it, RESOURCE_HEALTH) >= 0 )
- if ( it.team == myteam + 1 || gametype == MAPINFO_TYPE_RACE || !teamplay )
+ if ( it.team == myteam + 1 || ISGAMETYPE(RACE) || !teamplay )
{
vector coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(it.origin));
if(vdist((mousepos - coord), <, 8))
if(!autocvar__hud_configure)
{
if(!autocvar_hud_panel_score) return;
- if(spectatee_status == -1 && (gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
+ if(spectatee_status == -1 && (ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
}
HUD_Panel_LoadCvars();
return true;
else if (intermission == 2)
return false;
- else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS && !active_minigame)
+ else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && !ISGAMETYPE(CTS) && !active_minigame)
return true;
else if (scoreboard_showscores_force)
return true;
vector hl_rgb = rgb + '0.5 0.5 0.5';
pos.y += hud_fontsize.y;
- drawstring(pos + eX * panel_bg_padding, ((gametype == MAPINFO_TYPE_CTF) ? _("Capture time rankings") : _("Rankings")), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos + eX * panel_bg_padding, ((ISGAMETYPE(CTF)) ? _("Capture time rankings") : _("Rankings")), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
pos.y += 1.25 * hud_fontsize.y;
if(panel.current_panel_bg != "0")
pos.y += panel_bg_border;
bool have_weapon_stats;
bool Scoreboard_AccuracyStats_WouldDraw(float ypos)
{
- if (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_NEXBALL)
+ if (ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || ISGAMETYPE(NEXBALL))
return false;
if (!autocvar_hud_panel_scoreboard_accuracy || warmup_stage || ypos > 0.91 * vid_conheight)
return false;
if (Scoreboard_AccuracyStats_WouldDraw(pos.y))
pos = Scoreboard_AccuracyStats_Draw(pos, panel_bg_color, bg_size);
- if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (autocvar_hud_panel_scoreboard_ctf_leaderboard && gametype == MAPINFO_TYPE_CTF && STAT(CTF_SHOWLEADERBOARD))) {
+ if(ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || (autocvar_hud_panel_scoreboard_ctf_leaderboard && ISGAMETYPE(CTF) && STAT(CTF_SHOWLEADERBOARD))) {
if(race_speedaward) {
drawcolorcodedstring(pos, sprintf(_("Speed award: %d%s ^7(%s^7)"), race_speedaward, race_speedaward_unit, ColorTranslateRGB(race_speedaward_holder)), hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
pos.y += 1.25 * hud_fontsize.y;
tl = STAT(TIMELIMIT);
fl = STAT(FRAGLIMIT);
ll = STAT(LEADLIMIT);
- if(gametype == MAPINFO_TYPE_LMS)
+ if(ISGAMETYPE(LMS))
{
if(tl > 0)
str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl));
void HUD_Vote()
{
- if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
+ if(autocvar_cl_allow_uid2name == -1 && (ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || (serverflags & SERVERFLAG_PLAYERSTATS)))
{
// this dialog gets overriden by the uid2name menu dialog, if it exists
// TODO remove this client side uid2name dialog in the next release
registercvar("cl_spawn_near_teammate", "1");
+ registercvar("cl_weapon_switch_reload", "1");
+ registercvar("cl_weapon_switch_fallback_to_impulse", "1");
+
if(autocvar_cl_lockview)
cvar_set("cl_lockview", "0");
bool postinit;
entity gametype;
+// temporary hack
+#define ISGAMETYPE(NAME) (gametype == MAPINFO_TYPE_##NAME)
float FONT_USER = 8;
// FIXME: alpha is negative when dead, breaking death fade
if (!this.csqcmodel_isdead) a *= f;
}
- if (a < ALPHA_MIN_VISIBLE && gametype != MAPINFO_TYPE_CTS) return;
+ if (a < ALPHA_MIN_VISIBLE && ISGAMETYPE(CTS)) return;
if (vdist(this.origin - view_origin, >=, max_shot_distance)) return;
float dist = vlen(this.origin - view_origin);
if (autocvar_hud_shownames_maxdistance)
coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord3d));
- makevectors(pangles - '0 1 0' * teamradar_angle);
+ vector forward = '0 0 0', right = '0 0 0', up = '0 0 0';
+ MAKEVECTORS(makevectors, pangles - '0 1 0' * teamradar_angle, forward, right, up);
if(v_flipped)
{
- v_forward.x = -v_forward.x;
- v_right.x = -v_right.x;
- v_up.x = -v_up.x;
+ forward.x = -forward.x;
+ right.x = -right.x;
+ up.x = -up.x; // TODO: unused!
}
- v_forward.z = 0;
- v_forward = normalize(v_forward);
- v_forward.y *= -1.0;
- v_right.x = -v_forward.y;
- v_right.y = v_forward.x;
+ forward.z = 0;
+ forward = normalize(forward);
+ forward.y *= -1.0;
+ right.x = -forward.y;
+ right.y = forward.x;
if(rgb == '1 1 1')
rgb2 = '0 0 0';
rgb2 = '1 1 1';
R_BeginPolygon("", 0);
- R_PolygonVertex(coord+v_forward*3, '0 0 0', rgb2, panel_fg_alpha);
- R_PolygonVertex(coord+v_right*4-v_forward*2.5, '0 1 0', rgb2, panel_fg_alpha);
- R_PolygonVertex(coord-v_forward*2, '1 0 0', rgb2, panel_fg_alpha);
- R_PolygonVertex(coord-v_right*4-v_forward*2.5, '1 1 0', rgb2, panel_fg_alpha);
+ R_PolygonVertex(coord+forward*3, '0 0 0', rgb2, panel_fg_alpha);
+ R_PolygonVertex(coord+right*4-forward*2.5, '0 1 0', rgb2, panel_fg_alpha);
+ R_PolygonVertex(coord-forward*2, '1 0 0', rgb2, panel_fg_alpha);
+ R_PolygonVertex(coord-right*4-forward*2.5, '1 1 0', rgb2, panel_fg_alpha);
R_EndPolygon();
R_BeginPolygon("", 0);
- R_PolygonVertex(coord+v_forward*2, '0 0 0', rgb, panel_fg_alpha);
- R_PolygonVertex(coord+v_right*3-v_forward*2, '0 1 0', rgb, panel_fg_alpha);
- R_PolygonVertex(coord-v_forward, '1 0 0', rgb, panel_fg_alpha);
- R_PolygonVertex(coord-v_right*3-v_forward*2, '1 1 0', rgb, panel_fg_alpha);
+ R_PolygonVertex(coord+forward*2, '0 0 0', rgb, panel_fg_alpha);
+ R_PolygonVertex(coord+right*3-forward*2, '0 1 0', rgb, panel_fg_alpha);
+ R_PolygonVertex(coord-forward, '1 0 0', rgb, panel_fg_alpha);
+ R_PolygonVertex(coord-right*3-forward*2, '1 1 0', rgb, panel_fg_alpha);
R_EndPolygon();
}
if(autocvar_r_letterbox == 0)
if(autocvar_viewsize < 120)
{
- if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS))
+ if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS)))
Accuracy_LoadLevels();
HUD_Main();
// Render the Scene
view_origin = getpropertyvec(VF_ORIGIN);
view_angles = getpropertyvec(VF_ANGLES);
- makevectors(view_angles);
- view_forward = v_forward;
- view_right = v_right;
- view_up = v_up;
+ MAKEVECTORS(makevectors, view_angles, view_forward, view_right, view_up);
#ifdef BLURTEST
if(time > blurtest_time0 && time < blurtest_time1)
else if(cvar("r_glsl_postprocess") == 2)
cvar_set("r_glsl_postprocess", "0");
- /*if(gametype == MAPINFO_TYPE_CTF)
+ /*if(ISGAMETYPE(CTF))
{
ctf_view();
} else */
return;
}
- int size = 8;
+ int size = 11;
vector screen_pos = project_3d_to_2d(this.origin) + since_created * this.velocity;
- float align = GetResourceAmount(this, RESOURCE_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;
+ float align = GetResourceAmount(this, RESOURCE_HEALTH);
+ string msg;
+ vector msg_pos;
- vector rgb = '1 1 0';
- drawcolorcodedstring2_builtin(screen_pos, this.message, size * '1 1 0', rgb, alpha_, DRAWFLAG_NORMAL);
+ int n = tokenizebyseparator(this.message, "\n");
+ for(int k = 0; k < n; ++k)
+ {
+ msg = argv(k);
+ msg_pos = screen_pos + k * 1.25 * size * eY;
+ if (align > 0)
+ msg_pos.x -= stringwidth(msg, true, size * '1 1 0') * min(1, align);
+
+ drawcolorcodedstring_builtin(msg_pos, msg, size * '1 1 0', alpha_, DRAWFLAG_NORMAL);
+ }
}
ATTRIB(DebugText3d, draw2d, void(DebugText3d), DebugText3d_draw2d);
ENDCLASS(DebugText3d)
.float cnt;
.int state;
-.bool isplayermodel;
void DamageEffect_Think(entity this)
{
return;
}
this.state = this.owner.csqcmodel_isdead;
- if(this.owner.isplayermodel && (this.owner.entnum == player_localentnum) && !autocvar_chase_active)
+ if(this.owner.isplayermodel && (this.owner.isplayermodel & ISPLAYER_LOCAL) && !autocvar_chase_active)
return; // if we aren't using a third person camera, hide our own effects
// now generate the particles
void entcs_attach(entity player)
{
- entity e = player.entcs = new(entcs_sender);
+ entity e = CS(player).entcs = new(entcs_sender);
e.owner = player;
setthink(e, entcs_think);
e.nextthink = time;
Net_LinkEntity(e, false, 0, entcs_send);
if (!IS_REAL_CLIENT(player)) return;
FOREACH_CLIENT(true, {
- assert(it.entcs);
- _entcs_send(it.entcs, msg_entity = player, BITS(23), MSG_ONE);
+ assert(CS(it).entcs);
+ _entcs_send(CS(it).entcs, msg_entity = player, BITS(23), MSG_ONE);
});
}
void entcs_detach(entity player)
{
- if (!player.entcs) return;
- delete(player.entcs);
- player.entcs = NULL;
+ if (!CS(player).entcs) return;
+ delete(CS(player).entcs);
+ CS(player).entcs = NULL;
}
#endif
.int m_forceupdate;
/** Force an origin update, for player sounds */
- #define entcs_force_origin(e) ((e).entcs.m_forceupdate = BIT(2))
+ #define entcs_force_origin(e) (CS(e).entcs.m_forceupdate = BIT(2))
#endif
void(entity this, float ratingscale, vector org, float sradius) havocbot_goalrating_items;
void(entity this, float ratingscale, vector org, float sradius) havocbot_goalrating_enemyplayers;
+// assault game mode: Which team is attacking in this round?
+float assault_attacker_team;
+
// predefined spawnfuncs
void target_objective_decrease_activate(entity this);
float autocvar_g_cts_finish_kill_delay;
bool autocvar_g_cts_selfdamage;
+bool autocvar_g_cts_removeprojectiles;
// legacy bot roles
.float race_checkpoint;
frag_target.respawn_flags |= RESPAWN_FORCE;
race_AbandonRaceCheck(frag_target);
+
+ if(autocvar_g_cts_removeprojectiles)
+ {
+ IL_EACH(g_projectiles, it.owner == frag_target && (it.flags & FL_PROJECTILE),
+ {
+ delete(it);
+ });
+ }
}
MUTATOR_HOOKFUNCTION(cts, HavocBot_ChooseRole)
#include "sv_duel.qh"
-MUTATOR_HOOKFUNCTION(duel, ReadLevelCvars)
-{
- if(autocvar_g_duel_warmup)
- warmup_stage = 1; // otherwise allow it if it's enabled
- //sv_ready_restart_after_countdown = 0;
-}
-
MUTATOR_HOOKFUNCTION(duel, GetPlayerLimit)
{
M_ARGV(0, int) = 2; // duel is always 1v1!
}
bool autocvar_g_duel_with_powerups;
-bool autocvar_g_duel_warmup = true;
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)
frag_force *= autocvar_g_keepaway_ballcarrier_force;
}
}
- else if (!frag_target.ballcarried) // if the target is a noncarrier
+ else if (IS_PLAYER(frag_attacker) && !frag_target.ballcarried) // if the target is a noncarrier
{
if(frag_target == frag_attacker) // damage done to yourself
{
MUTATOR_HOOKFUNCTION(cl_nb, WantEventchase)
{
- if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WEPSET(NEXBALL)))
+ if(autocvar_cl_eventchase_nexball && ISGAMETYPE(NEXBALL) && !(WepSet_GetFromStat() & WEPSET(NEXBALL)))
return true;
return false;
}
float autocvar_g_onslaught_spawn_choose;
float autocvar_g_onslaught_click_radius;
-void FixSize(entity e);
entity cam;
// =======================
// Junk Pile
// ==========
-void setmodel_fixsize(entity e, Model m)
-{
- setmodel(e, m);
- FixSize(e);
-}
-
void onslaught_updatelinks()
{
entity l;
this.owner.waslinked = this.owner.islinked;
if(this.owner.model != "models/onslaught/controlpoint_pad.md3")
- setmodel_fixsize(this.owner, MDL_ONS_CP_PAD1);
+ setmodel(this.owner, MDL_ONS_CP_PAD1);
//setsize(this, '-32 -32 0', '32 32 8');
delete(this);
this.SendFlags |= CPSF_SETUP;
}
if(this.owner.model != MDL_ONS_CP_PAD2.model_str())
- setmodel_fixsize(this.owner, MDL_ONS_CP_PAD2);
+ setmodel(this.owner, MDL_ONS_CP_PAD2);
if(random() < 0.9 - GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health)
Send_Effect(EFFECT_RAGE, this.origin + 10 * randomvec(), '0 0 -1', 1);
setthink(this, ons_ControlPoint_Think);
this.ons_toucher = NULL;
this.nextthink = time + ONS_CP_THINKRATE;
- setmodel_fixsize(this, MDL_ONS_CP_PAD1);
+ setmodel(this, MDL_ONS_CP_PAD1);
WaypointSprite_UpdateMaxHealth(this.sprite, 0);
WaypointSprite_UpdateRule(this.sprite,this.team,SPRITERULE_TEAMPLAY);
if(cp.message == "") { cp.message = "a"; }
// appearence
- setmodel_fixsize(cp, MDL_ONS_CP_PAD1);
+ setmodel(cp, MDL_ONS_CP_PAD1);
// control point placement
if((cp.spawnflags & 1) || cp.noalign) // don't drop to floor, just stay at fixed location
{
TC(Inventory, this);
WriteHeader(MSG_ENTITY, ENT_CLIENT_INVENTORY);
- entity e = this.owner;
- if (IS_SPEC(e)) e = PS(e.enemy); // TODO: how can this *ever* be the case?
- TC(Player, e);
- Inventory data = e.inventory;
- Inventory_Write(data);
+ TC(PlayerState, this.owner);
+ Inventory_Write(this);
return true;
}
-void Inventory_new(entity e)
+bool Inventory_customize(entity this, entity client)
+{
+ // sends to spectators too!
+ return (PS(client) && PS(client).inventory == this);
+}
+
+void Inventory_new(PlayerState this)
{
Inventory inv = NEW(Inventory), bak = NEW(Inventory);
inv.inventory = bak;
- inv.drawonlytoclient = IS_CLIENT(e) ? e : e.m_client;
- Net_LinkEntity((inv.owner = e).inventory = inv, false, 0, Inventory_Send);
+ setcefc(inv, Inventory_customize);
+ Net_LinkEntity((inv.owner = this).inventory = inv, false, 0, Inventory_Send);
}
void Inventory_delete(entity e) { delete(e.inventory.inventory); delete(e.inventory); }
void Inventory_update(entity e) { e.inventory.SendFlags = 0xFFFFFF; }
string _MapInfo_GetDefault(Gametype t)
{
- switch(t)
- {
- case MAPINFO_TYPE_DEATHMATCH: return "30 20 0";
- case MAPINFO_TYPE_TEAM_DEATHMATCH: return "50 20 2 0";
- case MAPINFO_TYPE_DOMINATION: return "200 20 0";
- case MAPINFO_TYPE_CTF: return "300 20 10 0";
- case MAPINFO_TYPE_LMS: return "9 20 0";
- case MAPINFO_TYPE_CA: return "10 20 0";
- case MAPINFO_TYPE_KEYHUNT: return "1000 20 3 0";
- case MAPINFO_TYPE_ASSAULT: return "20 0";
- case MAPINFO_TYPE_RACE: return "20 5 7 15 0";
- case MAPINFO_TYPE_ONSLAUGHT: return "20 0";
- case MAPINFO_TYPE_NEXBALL: return "5 20 0";
- case MAPINFO_TYPE_CTS: return "20 0 0";
- case MAPINFO_TYPE_FREEZETAG: return "10 20 0";
- // NOTE: DO NOT ADD ANY MORE GAME TYPES HERE
- // THIS IS JUST LEGACY SUPPORT FOR NEXUIZ MAPS
- // ONLY ADD NEW STUFF TO _MapInfo_GetDefaultEx
- // THIS FUNCTION WILL EVENTUALLY BE REMOVED
- default: return "";
- }
+ return t.m_legacydefaults;
}
void _MapInfo_Map_ApplyGametype(string s, Gametype pWantedType, Gametype pThisType, int load_default)
if(load_default)
_MapInfo_Map_ApplyGametype(_MapInfo_GetDefault(pThisType), pWantedType, pThisType, false);
- if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT || pWantedType == MAPINFO_TYPE_RACE || pWantedType == MAPINFO_TYPE_CTS) // these modes don't use fraglimit
+ if(!pWantedType.frags) // these modes don't use fraglimit
{
cvar_set("fraglimit", "0");
}
// rc = timelimit timelimit_qualification laps laps_teamplay
if(pWantedType == MAPINFO_TYPE_RACE)
{
+ cvar_set("fraglimit", "0"); // special case!
+
sa = car(s); if(sa == "") sa = cvar_string("timelimit");
cvar_set("g_race_qualifying_timelimit", sa);
s = cdr(s);
s = cdr(s);
}
- if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT || pWantedType == MAPINFO_TYPE_CTS) // these modes don't use fraglimit
+ if(!pWantedType.frags) // these modes don't use fraglimit
{
cvar_set("leadlimit", "0");
}
float MapInfo_isRedundant(string fn, string t)
{
// normalize file name
- fn = strreplace("_", "-", fn);
+ fn = strreplace("_", "", fn);
+ fn = strreplace("-", "", fn);
// normalize visible title
- t = strreplace(": ", "-", t);
- t = strreplace(":", "-", t);
- t = strreplace(" ", "-", t);
- t = strreplace("_", "-", t);
- t = strreplace("'", "-", t);
-
- if(!strcasecmp(fn, t))
- return true;
+ t = strreplace(":", "", t);
+ t = strreplace(" ", "", t);
+ t = strreplace("_", "", t);
+ t = strreplace("-", "", t);
+ t = strreplace("'", "", t);
+ t = strdecolorize(t);
// we allow the visible title to have punctuation the file name does
// not, but not vice versa
- t = strreplace("-", "", t);
-
if(!strcasecmp(fn, t))
return true;
ATTRIB(Gametype, message, string);
/** does this gametype support teamplay? */
ATTRIB(Gametype, team, bool, false);
+ /** does this gametype use a point limit? */
+ ATTRIB(Gametype, frags, bool, true);
/** game type defaults */
ATTRIB(Gametype, model2, string);
/** game type description */
ATTRIB(Gametype, m_modicons_reset, void());
#endif
+ /** DO NOT USE, this is compatibility for legacy maps! */
+ ATTRIB(Gametype, m_legacydefaults, string, "");
+
ATTRIB(Gametype, m_mutators, string);
METHOD(Gametype, m_parse_mapinfo, bool(string k, string v))
{
{
return false;
}
+ METHOD(Gametype, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Frag limit:"), 5, 100, 5, "fraglimit_override", string_null, _("The amount of frags needed before the match will end"));
+ }
METHOD(Gametype, describe, string(Gametype this))
{
returns(this.message, strcat("gametype_", this.mdl));
}
- METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, bool gteamplay, string mutators, string defaults, string gdescription))
+ METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, bool gteamplay, bool gusepoints, string mutators, string defaults, string gdescription))
{
this.netname = g_name;
this.mdl = sname;
this.m_mutators = cons(sname, mutators);
this.model2 = defaults;
this.gametype_description = gdescription;
+ this.frags = gusepoints;
// same as `1 << m_id`
MAPINFO_TYPE_ALL |= this.items = this.m_flags = (MAPINFO_TYPE_ALL + 1);
CLASS(Deathmatch, Gametype)
INIT(Deathmatch)
{
- this.gametype_init(this, _("Deathmatch"),"dm","g_dm",false,"","timelimit=15 pointlimit=30 leadlimit=0",_("Score as many frags as you can"));
+ this.gametype_init(this, _("Deathmatch"),"dm","g_dm",false,true,"","timelimit=15 pointlimit=30 leadlimit=0",_("Score as many frags as you can"));
}
METHOD(Deathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
{
return true;
}
+ ATTRIB(Deathmatch, m_legacydefaults, string, "30 20 0");
ENDCLASS(Deathmatch)
REGISTER_GAMETYPE(DEATHMATCH, NEW(Deathmatch));
CLASS(LastManStanding, Gametype)
INIT(LastManStanding)
{
- this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",false,"","timelimit=20 lives=9 leadlimit=0",_("Survive and kill until the enemies have no lives left"));
+ this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",false,true,"","timelimit=20 lives=9 leadlimit=0",_("Survive and kill until the enemies have no lives left"));
}
METHOD(LastManStanding, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
{
return true;
}
+ METHOD(LastManStanding, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Lives:"), 3, 50, 1, "g_lms_lives_override", string_null, string_null);
+ }
+ ATTRIB(LastManStanding, m_legacydefaults, string, "9 20 0");
ENDCLASS(LastManStanding)
REGISTER_GAMETYPE(LMS, NEW(LastManStanding));
CLASS(Race, Gametype)
INIT(Race)
{
- this.gametype_init(this, _("Race"),"rc","g_race",false,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0",_("Race against other players to the finish line"));
+ this.gametype_init(this, _("Race"),"rc","g_race",false,true,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0",_("Race against other players to the finish line"));
}
METHOD(Race, m_parse_mapinfo, bool(string k, string v))
{
{
return true;
}
+ METHOD(Race, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Laps:"), 1, 25, 1, "g_race_laps_limit", string_null, string_null);
+ }
#ifdef CSQC
ATTRIB(Race, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
#endif
+ ATTRIB(Race, m_legacydefaults, string, "20 5 7 15 0");
ENDCLASS(Race)
REGISTER_GAMETYPE(RACE, NEW(Race));
#define g_race IS_GAMETYPE(RACE)
CLASS(RaceCTS, Gametype)
INIT(RaceCTS)
{
- this.gametype_init(this, _("Race CTS"),"cts","g_cts",false,"cloaked","timelimit=20",_("Race for fastest time."));
+ this.gametype_init(this, _("Race CTS"),"cts","g_cts",false,false,"cloaked","timelimit=20",_("Race for fastest time."));
}
METHOD(RaceCTS, m_generate_mapinfo, void(Gametype this, string v))
{
// for map databases
// cvar_set("fraglimit", sa);
}
+ METHOD(RaceCTS, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null);
+ }
#ifdef CSQC
ATTRIB(RaceCTS, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
#endif
+ ATTRIB(RaceCTS, m_legacydefaults, string, "20 0 0");
ENDCLASS(RaceCTS)
REGISTER_GAMETYPE(CTS, NEW(RaceCTS));
#define g_cts IS_GAMETYPE(CTS)
CLASS(TeamDeathmatch, Gametype)
INIT(TeamDeathmatch)
{
- this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",true,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Help your team score the most frags against the enemy team"));
+ this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",true,true,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Help your team score the most frags against the enemy team"));
}
METHOD(TeamDeathmatch, m_parse_mapinfo, bool(string k, string v))
{
{
cvar_set("g_tdm_teams", sa);
}
+ METHOD(TeamDeathmatch, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 5, 100, 5, "g_tdm_point_limit", "g_tdm_teams_override", _("The amount of points needed before the match will end"));
+ }
+ ATTRIB(TeamDeathmatch, m_legacydefaults, string, "50 20 2 0");
ENDCLASS(TeamDeathmatch)
REGISTER_GAMETYPE(TEAM_DEATHMATCH, NEW(TeamDeathmatch));
#define g_tdm IS_GAMETYPE(TEAM_DEATHMATCH)
CLASS(CaptureTheFlag, Gametype)
INIT(CaptureTheFlag)
{
- this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",true,"","timelimit=20 caplimit=10 leadlimit=6",_("Find and bring the enemy flag to your base to capture it, defend your base from the other team"));
+ this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",true,true,"","timelimit=20 caplimit=10 leadlimit=6",_("Find and bring the enemy flag to your base to capture it, defend your base from the other team"));
}
METHOD(CaptureTheFlag, m_generate_mapinfo, void(Gametype this, string v))
{
{
cvar_set("fraglimit", sa);
}
+ METHOD(CaptureTheFlag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Capture limit:"), 1, 20, 1, "capturelimit_override", string_null, _("The amount of captures needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(CaptureTheFlag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CTF);
ATTRIB(CaptureTheFlag, m_modicons_reset, void(), HUD_Mod_CTF_Reset);
#endif
+ ATTRIB(CaptureTheFlag, m_legacydefaults, string, "300 20 10 0");
ENDCLASS(CaptureTheFlag)
REGISTER_GAMETYPE(CTF, NEW(CaptureTheFlag));
#define g_ctf IS_GAMETYPE(CTF)
CLASS(ClanArena, Gametype)
INIT(ClanArena)
{
- this.gametype_init(this, _("Clan Arena"),"ca","g_ca",true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=0",_("Kill all enemy teammates to win the round"));
+ this.gametype_init(this, _("Clan Arena"),"ca","g_ca",true,true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=0",_("Kill all enemy teammates to win the round"));
}
METHOD(ClanArena, m_parse_mapinfo, bool(string k, string v))
{
{
cvar_set("g_ca_teams", sa);
}
+ METHOD(ClanArena, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Frag limit:"), 5, 100, 5, "fraglimit_override", "g_ca_teams_override", _("The amount of frags needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(ClanArena, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
#endif
+ ATTRIB(ClanArena, m_legacydefaults, string, "10 20 0");
ENDCLASS(ClanArena)
REGISTER_GAMETYPE(CA, NEW(ClanArena));
#define g_ca IS_GAMETYPE(CA)
CLASS(Domination, Gametype)
INIT(Domination)
{
- this.gametype_init(this, _("Domination"),"dom","g_domination",true,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0",_("Capture and defend all the control points to win"));
+ this.gametype_init(this, _("Domination"),"dom","g_domination",true,true,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0",_("Capture and defend all the control points to win"));
}
METHOD(Domination, m_parse_mapinfo, bool(string k, string v))
{
if(v == "dom_controlpoint")
MapInfo_Map_supportedGametypes |= this.m_flags;
}
+ METHOD(Domination, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 50, 500, 10, "g_domination_point_limit", "g_domination_teams_override", _("The amount of points needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(Domination, m_modicons, void(vector pos, vector mySize), HUD_Mod_Dom);
#endif
+ ATTRIB(Domination, m_legacydefaults, string, "200 20 0");
ENDCLASS(Domination)
REGISTER_GAMETYPE(DOMINATION, NEW(Domination));
CLASS(KeyHunt, Gametype)
INIT(KeyHunt)
{
- this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",true,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0",_("Gather all the keys to win the round"));
+ this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",true,true,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0",_("Gather all the keys to win the round"));
}
METHOD(KeyHunt, m_parse_mapinfo, bool(string k, string v))
{
{
cvar_set("g_keyhunt_teams", sa);
}
+ METHOD(KeyHunt, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit", "g_keyhunt_teams_override", _("The amount of points needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(KeyHunt, m_modicons, void(vector pos, vector mySize), HUD_Mod_KH);
#endif
+ ATTRIB(KeyHunt, m_legacydefaults, string, "1000 20 3 0");
ENDCLASS(KeyHunt)
REGISTER_GAMETYPE(KEYHUNT, NEW(KeyHunt));
CLASS(Assault, Gametype)
INIT(Assault)
{
- this.gametype_init(this, _("Assault"),"as","g_assault",true,"","timelimit=20",_("Destroy obstacles to find and destroy the enemy power core before time runs out"));
+ this.gametype_init(this, _("Assault"),"as","g_assault",true,false,"","timelimit=20",_("Destroy obstacles to find and destroy the enemy power core before time runs out"));
}
METHOD(Assault, m_generate_mapinfo, void(Gametype this, string v))
{
{
return true;
}
+ METHOD(Assault, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null);
+ }
+ ATTRIB(Assault, m_legacydefaults, string, "20 0");
ENDCLASS(Assault)
REGISTER_GAMETYPE(ASSAULT, NEW(Assault));
#define g_assault IS_GAMETYPE(ASSAULT)
CLASS(Onslaught, Gametype)
INIT(Onslaught)
{
- this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",true,"","pointlimit=1 timelimit=20",_("Capture control points to reach and destroy the enemy generator"));
+ this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",true,false,"","pointlimit=1 timelimit=20",_("Capture control points to reach and destroy the enemy generator"));
}
METHOD(Onslaught, m_generate_mapinfo, void(Gametype this, string v))
{
if(v == "onslaught_generator")
MapInfo_Map_supportedGametypes |= this.m_flags;
}
+ METHOD(Onslaught, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null);
+ }
+ ATTRIB(Onslaught, m_legacydefaults, string, "20 0");
ENDCLASS(Onslaught)
REGISTER_GAMETYPE(ONSLAUGHT, NEW(Onslaught));
CLASS(NexBall, Gametype)
INIT(NexBall)
{
- this.gametype_init(this, _("Nexball"),"nb","g_nexball",true,"","timelimit=20 pointlimit=5 leadlimit=0",_("Shoot and kick the ball into the enemies goal, keep your goal clean"));
+ this.gametype_init(this, _("Nexball"),"nb","g_nexball",true,true,"","timelimit=20 pointlimit=5 leadlimit=0",_("Shoot and kick the ball into the enemies goal, keep your goal clean"));
}
METHOD(NexBall, m_generate_mapinfo, void(Gametype this, string v))
{
{
return true;
}
+ METHOD(NexBall, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Goals:"), 1, 50, 1, "g_nexball_goallimit", string_null, _("The amount of goals needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(NexBall, m_modicons, void(vector pos, vector mySize), HUD_Mod_NexBall);
#endif
+ ATTRIB(NexBall, m_legacydefaults, string, "5 20 0");
ENDCLASS(NexBall)
REGISTER_GAMETYPE(NEXBALL, NEW(NexBall));
#define g_nexball IS_GAMETYPE(NEXBALL)
CLASS(FreezeTag, Gametype)
INIT(FreezeTag)
{
- this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=0",_("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win"));
+ this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",true,true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=0",_("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win"));
}
METHOD(FreezeTag, m_parse_mapinfo, bool(string k, string v))
{
{
cvar_set("g_freezetag_teams", sa);
}
+ METHOD(FreezeTag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Frag limit:"), 5, 100, 5, "fraglimit_override", "g_freezetag_teams_override", _("The amount of frags needed before the match will end"));
+ }
#ifdef CSQC
ATTRIB(FreezeTag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
#endif
+ ATTRIB(FreezeTag, m_legacydefaults, string, "10 20 0");
ENDCLASS(FreezeTag)
REGISTER_GAMETYPE(FREEZETAG, NEW(FreezeTag));
#define g_freezetag IS_GAMETYPE(FREEZETAG)
CLASS(Keepaway, Gametype)
INIT(Keepaway)
{
- this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",false,"","timelimit=20 pointlimit=30",_("Hold the ball to get points for kills"));
+ this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",false,true,"","timelimit=20 pointlimit=30",_("Hold the ball to get points for kills"));
}
METHOD(Keepaway, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
{
CLASS(Invasion, Gametype)
INIT(Invasion)
{
- this.gametype_init(this, _("Invasion"),"inv","g_invasion",false,"","pointlimit=50 teams=0 type=0",_("Survive against waves of monsters"));
+ this.gametype_init(this, _("Invasion"),"inv","g_invasion",false,true,"","pointlimit=50 teams=0 type=0",_("Survive against waves of monsters"));
}
METHOD(Invasion, m_parse_mapinfo, bool(string k, string v))
{
if(v == "invasion_spawnpoint")
MapInfo_Map_supportedGametypes |= this.m_flags;
}
+ METHOD(Invasion, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+ {
+ TC(Gametype, this);
+ returns(menu, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null);
+ }
ENDCLASS(Invasion)
REGISTER_GAMETYPE(INVASION, NEW(Invasion));
CLASS(Duel, Gametype)
INIT(Duel)
{
- this.gametype_init(this, _("Duel"),"duel","g_duel",false,"","timelimit=10 pointlimit=0 leadlimit=0",_("Fight in a one versus one arena battle to decide the winner"));
+ this.gametype_init(this, _("Duel"),"duel","g_duel",false,true,"","timelimit=10 pointlimit=0 leadlimit=0",_("Fight in a one versus one arena battle to decide the winner"));
}
METHOD(Duel, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
{
void MapInfo_Shutdown(); // call this in the shutdown handler
#define MAPINFO_SETTEMP_ACL_USER cvar_string("g_mapinfo_settemp_acl")
-#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -_* -g_ban* +*"
+#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -_* -g_ban* -r_water +*"
this.reset = generic_netlinked_reset;
this.reset(this);
- FixSize(this);
-
Net_LinkEntity(this, 0, false, conveyor_send);
this.SendFlags |= SF_TRIGGER_INIT;
void door_link()
{
- // set size now, as everything is loaded
- //FixSize(this);
//Net_LinkEntity(this, false, 0, door_send);
}
#endif
void g_clientmodel_use(entity this, entity actor, entity trigger)
{
+ // Flag to set func_clientwall state
+ // 1 == deactivate, 2 == activate, 0 == do nothing
+ if(this.classname == "func_clientwall" || this.classname == "func_clientillusionary")
+ this.antiwall_flag = trigger.antiwall_flag;
+
if (this.antiwall_flag == 1)
{
this.inactive = 1;
Fade 'ent' out when time >= 'when'
==================
*/
+.float fade_rate;
void SUB_SetFade(entity ent, float when, float fading_time);
.vector finaldest, finalangle; //plat.qc stuff
if(t.move_movetype != MOVETYPE_NONE)
continue;
+ // bots can't tell teamed jumppads from normal ones
+ if (this.team)
+ continue;
+
entity e = spawn();
setsize(e, PL_MIN_CONST, PL_MAX_CONST);
e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
else if(n == 1)
{
// exactly one dest - bots love that
- this.enemy = find(NULL, targetname, this.target);
+ if (!this.team)
+ this.enemy = find(NULL, targetname, this.target);
+ else // bots can't tell teamed jumppads from normal ones
+ this.enemy = NULL;
}
else
{
// have to use random selection every single time
this.enemy = NULL;
}
+
}
#ifdef SVQC
else
{
- entity e = spawn();
- setsize(e, PL_MIN_CONST, PL_MAX_CONST);
- e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
- setorigin(e, org);
- e.velocity = this.movedir;
- tracetoss(e, e);
- if (item)
+ if (!this.team)
{
- bool r = (trace_ent == item);
+ entity e = spawn();
+ setsize(e, PL_MIN_CONST, PL_MAX_CONST);
+ e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
+ setorigin(e, org);
+ e.velocity = this.movedir;
+ tracetoss(e, e);
+ if (item)
+ {
+ bool r = (trace_ent == item);
+ delete(e);
+ return r;
+ }
+ if (!(boxesoverlap(this.absmin, this.absmax + eZ * 50, trace_endpos + PL_MIN_CONST, trace_endpos + PL_MAX_CONST)))
+ waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity), e);
delete(e);
- return r;
}
- if (!(boxesoverlap(this.absmin, this.absmax + eZ * 50, trace_endpos + PL_MIN_CONST, trace_endpos + PL_MAX_CONST)))
- waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity), e);
- delete(e);
+ else if (item)
+ return false;
}
defer(this, 0.1, trigger_push_updatelink);
return; // allready been triggered
}
- if(this.spawnflags & ONLY_PLAYERS && !IS_PLAYER(this.enemy))
+ if((this.spawnflags & ONLY_PLAYERS) && !IS_PLAYER(this.enemy))
{
return; // only players
}
delete(this);
}
-void FixSize(entity e)
-{
- e.mins_x = rint(e.mins_x);
- e.mins_y = rint(e.mins_y);
- e.mins_z = rint(e.mins_z);
-
- e.maxs_x = rint(e.maxs_x);
- e.maxs_y = rint(e.maxs_y);
- e.maxs_z = rint(e.maxs_z);
-}
-
#ifdef SVQC
void generic_setactive(entity this, int act)
{
}
if (s != "")
{
- // Flag to set func_clientwall state
- // 1 == deactivate, 2 == activate, 0 == do nothing
- int aw_flag = this.antiwall_flag;
for(entity t = NULL; (t = find(t, targetname, s)); )
{
- if(t.use && (t.sub_target_used != time || !preventReuse))
+ if(t != this && t.use && (t.sub_target_used != time || !preventReuse))
{
if(this.target_random)
{
}
else
{
- if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary")
- t.antiwall_flag = aw_flag;
-
t.use(t, actor, this);
if(preventReuse)
t.sub_target_used = time;
.vector dest;
-void FixSize(entity e);
-
#ifdef CSQC
void trigger_common_read(entity this, bool withtarget);
void trigger_remove_generic(entity this);
AUTOCVAR_SAVE(cl_damagetext_size_max_damage, float, 140, "How much damage is considered large");
AUTOCVAR_SAVE(cl_damagetext_alpha_start, float, 1, "Damage text initial alpha");
AUTOCVAR_SAVE(cl_damagetext_alpha_lifetime, float, 3, "Damage text lifetime in seconds");
-AUTOCVAR_SAVE(cl_damagetext_velocity, vector, '0 0 20', "Damage text move direction (world coordinates)");
-AUTOCVAR_SAVE(cl_damagetext_offset, vector, '0 -40 0', "Damage text offset (screen coordinates)");
+AUTOCVAR_SAVE(cl_damagetext_velocity_screen, vector, '0 0 0', "Damage text move direction (screen coordinates)");
+AUTOCVAR_SAVE(cl_damagetext_velocity_world, vector, '0 0 20', "Damage text move direction (world coordinates relative to player's view)");
+AUTOCVAR_SAVE(cl_damagetext_offset_screen, vector, '0 -45 0', "Damage text offset (screen coordinates)");
+AUTOCVAR_SAVE(cl_damagetext_offset_world, vector, '0 0 0', "Damage text offset (world coordinates relative to player's view)");
AUTOCVAR_SAVE(cl_damagetext_accumulate_range, float, 30, "Damage text spawned within this range is accumulated");
AUTOCVAR_SAVE(cl_damagetext_accumulate_alpha_rel, float, 0.65, "Only update existing damage text when it's above this much percentage (0 to 1) of the starting alpha");
-AUTOCVAR_SAVE(cl_damagetext_friendlyfire, bool, true, "Show damage text for friendlyfire too");
+AUTOCVAR_SAVE(cl_damagetext_friendlyfire, int, 1, "0: never show for friendly fire, 1: when more than 0 damage, 2: always");
AUTOCVAR_SAVE(cl_damagetext_friendlyfire_color, vector, '1 0 0', "Damage text color for friendlyfire");
-AUTOCVAR_SAVE(cl_damagetext_2d, bool, true, "Show damagetext in 2D coordinated if the enemy's location is not known");
+AUTOCVAR_SAVE(cl_damagetext_2d, bool, true, "Show damagetext in 2D coordinates if the enemy's location is not known");
AUTOCVAR_SAVE(cl_damagetext_2d_pos, vector, '0.47 0.53 0', "2D damage text initial position (X and Y between 0 and 1)");
AUTOCVAR_SAVE(cl_damagetext_2d_alpha_start, float, 1, "2D damage text initial alpha");
AUTOCVAR_SAVE(cl_damagetext_2d_alpha_lifetime, float, 1.3, "2D damage text lifetime (alpha fading) in seconds");
AUTOCVAR_SAVE(cl_damagetext_2d_velocity, vector, '-25 0 0', "2D damage text move direction (screen coordinates)");
AUTOCVAR_SAVE(cl_damagetext_2d_overlap_offset, vector, '0 -15 0', "Offset 2D damage text by this much to prevent overlapping (screen coordinates)");
AUTOCVAR_SAVE(cl_damagetext_2d_close_range, float, 125, "Always use 2D damagetext for hits closer that this");
-AUTOCVAR_SAVE(cl_damagetext_2d_out_of_view, bool, true, "Always use 2D damagetext for hits that occured off-screen");
+AUTOCVAR_SAVE(cl_damagetext_2d_out_of_view, bool, true, "Always use 2D damagetext for hits that occurred off-screen");
CLASS(DamageText, Object)
ATTRIB(DamageText, m_color, vector, autocvar_cl_damagetext_color);
void DamageText_draw2d(DamageText this) {
float since_hit = time - this.hit_time;
+ // can't use `dt = hit_time - prev_update_time` because shrinking wouldn't be linear
float size = this.m_size - since_hit * this.m_shrink_rate * this.m_size;
float alpha_ = this.alpha - since_hit * this.fade_rate;
if (alpha_ <= 0 || size <= 0) {
delete(this);
return;
}
+
vector screen_pos;
if (this.m_screen_coords) {
screen_pos = this.origin + since_hit * autocvar_cl_damagetext_2d_velocity;
} else {
- screen_pos = project_3d_to_2d(this.origin + since_hit * autocvar_cl_damagetext_velocity) + autocvar_cl_damagetext_offset;
+ makevectors(view_angles);
+ vector world_offset = since_hit * autocvar_cl_damagetext_velocity_world + autocvar_cl_damagetext_offset_world;
+ vector world_pos = this.origin + world_offset.x * v_forward + world_offset.y * v_right + world_offset.z * v_up;
+ screen_pos = project_3d_to_2d(world_pos) + since_hit * autocvar_cl_damagetext_velocity_screen + autocvar_cl_damagetext_offset_screen;
}
+ screen_pos.y += size / 2;
+
if (screen_pos.z >= 0) {
screen_pos.z = 0;
vector rgb;
vector drawfontscale_save = drawfontscale;
drawfontscale = (size / autocvar_cl_damagetext_size_max) * '1 1 0';
+ screen_pos.y -= drawfontscale.x * size / 2;
drawcolorcodedstring2_builtin(screen_pos, this.text, autocvar_cl_damagetext_size_max * '1 1 0', rgb, alpha_, DRAWFLAG_NORMAL);
drawfontscale = drawfontscale_save;
}
}
ENDCLASS(DamageText)
+float current_alpha(entity damage_text) {
+ // alpha doesn't change - actual alpha is always calculated from the initial value
+ return damage_text.alpha - (time - damage_text.hit_time) * damage_text.fade_rate;
+}
+
NET_HANDLE(damagetext, bool isNew)
{
int server_entity_index = ReadByte();
else potential_damage = ReadShort();
return = true;
- if (!autocvar_cl_damagetext) return;
- if (friendlyfire && !autocvar_cl_damagetext_friendlyfire) return;
+ if (autocvar_cl_damagetext == 0) return;
+ if (friendlyfire) {
+ if (autocvar_cl_damagetext_friendlyfire == 0) return;
+ if (autocvar_cl_damagetext_friendlyfire == 1 && health == 0 && armor == 0) return;
+ }
int client_entity_index = server_entity_index - 1;
entity entcs = entcs_receiver(client_entity_index);
if (can_use_3d && !prefer_2d) {
// world coords
- if (autocvar_cl_damagetext_accumulate_range) {
- for (entity e = findradius(entcs.origin, autocvar_cl_damagetext_accumulate_range); e; e = e.chain) {
- if (e.instanceOfDamageText
- && !e.m_screen_coords // we're using origin for both world coords and screen coords so avoid mismatches
- && e.m_group == server_entity_index
- && e.alpha > autocvar_cl_damagetext_accumulate_alpha_rel * autocvar_cl_damagetext_alpha_start) {
- DamageText_update(e, entcs.origin, e.m_healthdamage + health, e.m_armordamage + armor, e.m_potential_damage + potential_damage, deathtype);
- return;
- }
+ // using 1 as minimum because of shotgun (same as menu)
+ for (entity e = findradius(entcs.origin, max(autocvar_cl_damagetext_accumulate_range, 1)); e; e = e.chain) {
+ if (e.instanceOfDamageText
+ && !e.m_screen_coords // we're using origin for both world coords and screen coords so avoid mismatches
+ && e.m_group == server_entity_index
+ && current_alpha(e) > autocvar_cl_damagetext_accumulate_alpha_rel * autocvar_cl_damagetext_alpha_start) {
+ DamageText_update(e, entcs.origin, e.m_healthdamage + health, e.m_armordamage + armor, e.m_potential_damage + potential_damage, deathtype);
+ return;
}
}
make_impure(NEW(DamageText, server_entity_index, entcs.origin, false, health, armor, potential_damage, deathtype, friendlyfire));
this.TR(this);
this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Accumulate range:")));
setDependent(e, "cl_damagetext", 1, 1);
- this.TD(this, 1, 2, e = makeXonoticSlider(0, 500, 1, "cl_damagetext_accumulate_range"));
+ // 1 as min because shotgun sends damagetext per pellet (see https://gitlab.com/xonotic/xonotic-data.pk3dir/issues/1994).
+ // It's capped to 1 in code too but let's not lie to users by allowing the slider to go to 0, it would still accumulate
+ // when hitting a stationary player using a weapon with no push.
+ this.TD(this, 1, 2, e = makeXonoticSlider(1, 500, 1, "cl_damagetext_accumulate_range"));
setDependent(e, "cl_damagetext", 1, 1);
this.TR(this);
this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Lifetime:")));
n.alpha = Nades_from(STAT(NADE_BONUS_TYPE, n)).m_alpha;
setmodel(fn, MDL_NADE_VIEW);
- setattachment(fn, player.(weaponentity), "");
+ //setattachment(fn, player.(weaponentity), "");
+ fn.viewmodelforclient = player;
fn.realowner = fn.owner = player;
fn.colormod = Nades_from(STAT(NADE_BONUS_TYPE, n)).m_color;
fn.colormap = player.colormap;
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity);
}
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(okhmg, refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(okhmg, refire) * W_WeaponRateFactor(actor);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(okhmg, refire), W_OverkillHeavyMachineGun_Attack_Auto);
}
SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity);
}
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(okmachinegun, refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(okmachinegun, refire) * W_WeaponRateFactor(actor);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(okmachinegun, refire), W_OverkillMachineGun_Attack_Auto);
}
entity frag_attacker = M_ARGV(1, entity);
entity frag_target = M_ARGV(2, entity);
- entity targ = ((frag_attacker) ? frag_attacker : frag_target);
+ entity targ = ((IS_PLAYER(frag_attacker)) ? frag_attacker : frag_target);
ok_DropItem(frag_target, targ);
vector planes[MAX_CLIP_PLANES];
int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight) // SV_FlyMove
{
+ if(dt <= 0)
+ return 0;
+
int blocked = 0;
int i, j, numplanes = 0;
float time_left = dt, grav = 0;
vector push;
- vector primal_velocity, original_velocity, restore_velocity;
+ vector primal_velocity, original_velocity;
+ vector restore_velocity = this.velocity;
for(i = 0; i < MAX_CLIP_PLANES; ++i)
planes[i] = '0 0 0';
}
}
- original_velocity = primal_velocity = restore_velocity = this.velocity;
+ original_velocity = primal_velocity = this.velocity;
for(int bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++)
{
break;
push = this.velocity * time_left;
- _Movetype_PushEntity(this, push, true);
- if(trace_startsolid)
+ if(!_Movetype_PushEntity(this, push, true, false))
{
// we got teleported by a touch function
// let's abort the move
vector org = this.origin;
vector steppush = '0 0 1' * stepheight;
- _Movetype_PushEntity(this, steppush, true);
- if(trace_startsolid)
+ if(!_Movetype_PushEntity(this, steppush, true, false))
{
blocked |= 8;
break;
}
- _Movetype_PushEntity(this, push, true);
- if(trace_startsolid)
+ if(!_Movetype_PushEntity(this, push, true, false))
{
blocked |= 8;
break;
}
float trace2_fraction = trace_fraction;
- steppush = '0 0 1' * (org.z - this.origin_z);
- _Movetype_PushEntity(this, steppush, true);
- if(trace_startsolid)
+ steppush = vec3(0, 0, org.z - this.origin_z);
+ if(!_Movetype_PushEntity(this, steppush, true, false))
{
blocked |= 8;
break;
#define X(i) \
if (_Movetype_TestEntityPosition('0 0 -1' * i)) \
if (_Movetype_TestEntityPosition('0 0 1' * i))
- X(01) X(02) X(03) X(04) X(05) X(06) X(07) X(08)
- X(09) X(10) X(11) X(12) X(13) X(14) X(15) X(16)
+ X(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8)
+ X(9) X(10) X(11) X(12) X(13) X(14) X(15) X(16)
X(17)
#undef X
{
tracebox(this.origin, this.mins, this.maxs, end, type, this);
}
-float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid) // SV_PushEntity
+bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool dolink) // SV_PushEntity
{
_Movetype_PushEntityTrace(this, push);
if(trace_startsolid && failonstartsolid)
- return trace_fraction;
+ {
+ int oldtype = this.move_nomonsters;
+ this.move_nomonsters = MOVE_NOMONSTERS;
+ _Movetype_PushEntityTrace(this, push);
+ this.move_nomonsters = oldtype;
+ if(trace_startsolid)
+ return true;
+ }
this.origin = trace_endpos;
+ vector last_origin = this.origin;
+
+ if(dolink)
+ _Movetype_LinkEdict(this, true);
+
if(trace_fraction < 1)
if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent)))
_Movetype_Impact(this, trace_ent);
- return trace_fraction;
+ return (this.origin == last_origin); // false if teleported by touch
}
void _Movetype_LinkEdict(entity this, float touch_triggers);
vector _Movetype_ClipVelocity(vector vel, vector norm, float f);
void _Movetype_PushEntityTrace(entity this, vector push);
-float _Movetype_PushEntity(entity this, vector push, float failonstartsolid);
+bool _Movetype_PushEntity(entity this, vector push, float failonstartsolid, bool dolink);
void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient);
void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy);
for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump)
{
vector move = this.velocity * movetime;
- _Movetype_PushEntity(this, move, true);
+ _Movetype_PushEntity(this, move, true, false);
if (wasfreed(this))
return;
if (trace_startsolid)
{
_Movetype_UnstickEntity(this);
- _Movetype_PushEntity(this, move, false);
+ _Movetype_PushEntity(this, move, false, false);
if (wasfreed(this))
return;
}
// move up
vector upmove = '0 0 1' * PHYS_STEPHEIGHT(this);
- _Movetype_PushEntity(this, upmove, true);
- if(wasfreed(this))
- return;
- if(trace_startsolid)
+ if(!_Movetype_PushEntity(this, upmove, true, true))
{
// we got teleported when upstepping... must abort the move
return;
// move down
vector downmove = '0 0 0';
downmove.z = -PHYS_STEPHEIGHT(this) + start_velocity.z * dt;
- _Movetype_PushEntity(this, downmove, true);
- if(wasfreed(this))
- return;
-
- if(trace_startsolid)
+ if(!_Movetype_PushEntity(this, downmove, true, true))
{
// we got teleported when downstepping... must abort the move
return;
.entity hook;
// TODO
- #define IS_CLIENT(s) ((s).isplayermodel || (s) == csqcplayer)
- #define IS_PLAYER(s) ((s).isplayermodel)
+ #define IS_CLIENT(s) (((s).isplayermodel & ISPLAYER_CLIENT) || (s) == csqcplayer)
+ #define IS_PLAYER(s) ((s).isplayermodel & ISPLAYER_PLAYER)
#define IS_NOT_A_CLIENT(s) (!(s).isplayermodel && (s) != csqcplayer)
#define isPushable(s) ((s).isplayermodel || (s).pushable || ((s).flags & FL_PROJECTILE))
.entity realowner;
bool sound_allowed(int to, entity e)
{
+ if(!e) return true; // save on a few checks
for ( ; ; )
{
if (e.classname == "body") e = e.enemy;
#include "state.qh"
-void Inventory_new(entity this);
+void Inventory_new(PlayerState this);
void Inventory_delete(entity this);
void PlayerState_attach(entity this)
PlayerScore_Detach(this); // what ^they^ said
W_HitPlotClose(this);
ClientData_Detach(this);
+ entcs_detach(this);
delete(CS(this));
this._cs = NULL;
-
bot_clientdisconnect(this);
anticheat_report_to_eventlog(this);
- entcs_detach(this);
}
void setItemGroup(entity this)
{
- if(!IS_SMALL(this.itemdef))
+ if(!IS_SMALL(this.itemdef) || Item_IsLoot(this))
return;
FOREACH_ENTITY_RADIUS(this.origin, 120, (it != this) && IS_SMALL(it.itemdef),
if(s == t)
{
r = d;
+ break; // if we found a killing case, apply it! other settings may be allowed in the future, but this one is caught
}
}
return r;
float autocvar_g_vehicle_bumblebee_pitchspeed = 60;
float autocvar_g_vehicle_bumblebee_pitchlimit = 60;
float autocvar_g_vehicle_bumblebee_friction = 0.5;
-bool autocvar_g_vehicle_bumblebee_swim = false;
+bool autocvar_g_vehicle_bumblebee_swim = true;
float autocvar_g_vehicle_bumblebee_energy = 500;
float autocvar_g_vehicle_bumblebee_energy_regen = 50;
Weapon Weapons_fromstr(string s)
{
FOREACH(Weapons, it != WEP_Null && it.netname == s, return it);
- return NULL;
+ return WEP_Null;
}
void Dump_Weapon_Settings()
{
int totalweapons = 0, totalsettings = 0;
+ int wepcount = 1;
FOREACH(Weapons, it != WEP_Null, {
+ if((it.spawnflags & WEP_FLAG_HIDDEN) && (it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && !(it.spawnflags & WEP_FLAG_NORMAL))
+ continue; // never include the attacks
// step 1: clear the queue
WEP_CONFIG_COUNT = 0;
for (int x = 0; x <= MAX_CONFIG_SETTINGS; ++x)
// step 4: write queue
WEP_CONFIG_WRITETOFILE(sprintf(
"// {{{ #%d: %s%s\n",
- i,
+ wepcount,
it.m_name,
((it.spawnflags & WEP_FLAG_MUTATORBLOCKED) ? " (MUTATOR WEAPON)" : "")
));
LOG_INFOF("#%d: %s: %d settings...", i, it.m_name, WEP_CONFIG_COUNT);
totalweapons += 1;
totalsettings += WEP_CONFIG_COUNT;
+ wepcount += 1;
});
// clear queue now that we're finished
getthink(beam)(beam);
}
-void Arc_Smoke(entity actor, .entity weaponentity)
+void W_Arc_Attack(Weapon thiswep, entity actor, .entity weaponentity, int fire)
{
+ if(!actor.(weaponentity).arc_beam || wasfreed(actor.(weaponentity).arc_beam))
+ {
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+
+ // attack handled by the beam itself, this is just a loop to keep the attack happening!
+
+ // NOTE: arc doesn't use a refire
+ //ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(arc, refire) * W_WeaponRateFactor(actor);
+ actor.(weaponentity).wframe = WFRAME_FIRE1;
+ weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, WEP_CVAR(arc, beam_animtime), W_Arc_Attack);
+}
+void Arc_Smoke(Weapon thiswep, entity actor, .entity weaponentity, int fire)
+{
+ // TODO: spamming this without checking any refires is asking for trouble!
makevectors(actor.v_angle);
- W_SetupShot_Range(actor,weaponentity,false,0,SND_Null,0,0,0,WEP_ARC.m_id); // TODO: probably doesn't need deathtype, since this is just a prefire effect
+ W_SetupShot_Range(actor,weaponentity,false,0,SND_Null,0,0,0,thiswep.m_id); // TODO: probably doesn't need deathtype, since this is just a prefire effect
vector smoke_origin = w_shotorg + actor.velocity*frametime;
if ( actor.arc_overheat > time )
{
if ( random() < actor.(weaponentity).arc_heat_percent )
Send_Effect(EFFECT_ARC_SMOKE, smoke_origin, '0 0 0', 1 );
- if ( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) )
+ if ( (fire & 1) || (fire & 2) )
{
Send_Effect(EFFECT_ARC_OVERHEAT_FIRE, smoke_origin, w_shotdir, 1 );
if ( !actor.arc_smoke_sound )
}
if ( actor.arc_smoke_sound && ( actor.arc_overheat <= time ||
- !( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) ) ) || actor.(weaponentity).m_switchweapon != WEP_ARC )
+ !( PHYS_INPUT_BUTTON_ATCK(actor) || PHYS_INPUT_BUTTON_ATCK2(actor) ) ) || actor.(weaponentity).m_switchweapon != thiswep )
{
actor.arc_smoke_sound = 0;
sound(actor, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
METHOD(Arc, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
{
Arc_Player_SetHeat(actor, weaponentity);
- Arc_Smoke(actor, weaponentity);
+ Arc_Smoke(thiswep, actor, weaponentity, fire);
bool beam_fire2 = ((fire & 2) && !WEP_CVAR(arc, bolt));
if (time >= actor.arc_overheat)
if ((fire & 1) || beam_fire2 || actor.(weaponentity).arc_beam.beam_bursting)
{
-
+ #if 0
if(actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
#if 0
#endif
weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, WEP_CVAR(arc, beam_animtime), w_ready);
}
+ #endif
if((!actor.(weaponentity).arc_beam) || wasfreed(actor.(weaponentity).arc_beam))
{
if(!actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
+ actor.(weaponentity).wframe = WFRAME_FIRE1;
+ weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, WEP_CVAR(arc, beam_animtime), W_Arc_Attack);
actor.(weaponentity).arc_BUTTON_ATCK_prev = true;
}
}
if(actor.(weaponentity).arc_BUTTON_ATCK_prev)
{
- int slot = weaponslot(weaponentity);
sound(actor, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor(actor);
}
actor.(weaponentity).arc_BUTTON_ATCK_prev = false;
if(!(this.realowner.items & IT_UNLIMITED_WEAPON_AMMO))
{
this.realowner.cnt = thiswep.m_id;
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(this.realowner, slot) = time;
+ ATTACK_FINISHED(this.realowner, weaponentity) = time;
this.realowner.(weaponentity).m_switchweapon = w_getbestweapon(this.realowner, weaponentity);
}
}
if(!(this.realowner.items & IT_UNLIMITED_WEAPON_AMMO))
{
this.realowner.cnt = thiswep.m_id;
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(this.realowner, slot) = time;
+ ATTACK_FINISHED(this.realowner, weaponentity) = time;
this.realowner.(weaponentity).m_switchweapon = w_getbestweapon(this.realowner, weaponentity);
}
}
{
#if 0
// don't switch while guiding a missile
- if(ATTACK_FINISHED(actor, slot) <= time || PS(actor).m_weapon != WEP_DEVASTATOR)
+ if(ATTACK_FINISHED(actor, weaponentity) <= time || PS(actor).m_weapon != WEP_DEVASTATOR)
{
ammo_amount = false;
if(WEP_CVAR(devastator, reload_ammo))
delete(this);
if(to)
- SetMovetypeFollow(this, to);
+ SetMovetypeFollow(newproj, to);
}
void W_Electro_Orb_Touch(entity this, entity toucher)
{
PROJECTILE_TOUCH(this, toucher);
- if(toucher.takedamage == DAMAGE_AIM)
- { if(WEP_CVAR_SEC(electro, touchexplode)) { W_Electro_Explode(this, toucher); } }
+ if(toucher.takedamage == DAMAGE_AIM && WEP_CVAR_SEC(electro, touchexplode))
+ { W_Electro_Explode(this, toucher); }
else if(toucher.owner != this.owner && toucher.classname != this.classname) // don't stick to player's other projectiles!
{
//UpdateCSQCProjectile(this);
W_Hagar_Attack(thiswep, actor, weaponentity);
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(hagar, refire) * W_WeaponRateFactor(actor);
- int theframe = WFRAME_FIRE1;
- entity this = actor.(weaponentity);
- if(this)
- {
- if(this.wframe == WFRAME_FIRE1)
- theframe = WFRAME_DONTCHANGE;
- }
- weapon_thinkf(actor, weaponentity, theframe, WEP_CVAR_PRI(hagar, refire), W_Hagar_Attack_Auto);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(hagar, refire) * W_WeaponRateFactor(actor);
+ actor.(weaponentity).wframe = WFRAME_FIRE1;
+ weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, WEP_CVAR_PRI(hagar, refire), W_Hagar_Attack_Auto);
}
METHOD(Hagar, wr_aim, void(entity thiswep, entity actor, .entity weaponentity))
return;
}
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(hlac, refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(hlac, refire) * W_WeaponRateFactor(actor);
W_HLAC_Attack(thiswep, actor, weaponentity);
actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(hlac, refire), W_HLAC_Attack_Frame);
actor.punchangle_x = random() - 0.5;
actor.punchangle_y = random() - 0.5;
}
- int slot = weaponslot(weaponentity);
// this attack_finished just enforces a cooldown at the end of a burst
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
if(actor.(weaponentity).misc_bulletcounter == 1)
fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, first_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, first_damage), WEP_CVAR(machinegun, first_force), deathtype, EFFECT_BULLET);
SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity);
}
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(machinegun, sustained_refire), W_MachineGun_Attack_Auto);
}
actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
if(actor.(weaponentity).misc_bulletcounter == 0)
{
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, burst_refire2) * W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(machinegun, burst_refire2) * W_WeaponRateFactor(actor);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(machinegun, burst_animtime), w_ready);
}
else
if(!thiswep.wr_checkammo1(thiswep, own, weaponentity))
{
own.cnt = thiswep.m_id;
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(own, slot) = time;
+ ATTACK_FINISHED(own, weaponentity) = time;
own.(weaponentity).m_switchweapon = w_getbestweapon(own, weaponentity);
}
}
- this.realowner.(weaponentity).minelayer_mines -= 1;
delete(this);
}
if(!thiswep.wr_checkammo1(thiswep, own, weaponentity))
{
own.cnt = thiswep.m_id;
- int slot = weaponslot(weaponentity);
- ATTACK_FINISHED(own, slot) = time;
+ ATTACK_FINISHED(own, weaponentity) = time;
own.(weaponentity).m_switchweapon = w_getbestweapon(own, weaponentity);
}
}
- this.realowner.(weaponentity).minelayer_mines -= 1;
delete(this);
}
if(this.move_movetype == MOVETYPE_NONE || this.move_movetype == MOVETYPE_FOLLOW)
return; // we're already a stuck mine, why do we get called? TODO does this even happen?
- if(WarpZone_Projectile_Touch(this, toucher))
- {
- if(wasfreed(this))
- {
- .entity weaponentity = this.weaponentity_fld;
- this.realowner.(weaponentity).minelayer_mines -= 1;
- }
- return;
- }
+ PROJECTILE_TOUCH(this, toucher);
if((toucher && IS_PLAYER(toucher) && !IS_DEAD(toucher)) || toucher.owner == this.owner)
{
// scan how many mines we placed, and return if we reached our limit
if(WEP_CVAR(minelayer, limit))
{
- if(actor.(weaponentity).minelayer_mines >= WEP_CVAR(minelayer, limit))
+ int minecount = W_MineLayer_Count(actor, weaponentity);
+ if(minecount >= WEP_CVAR(minelayer, limit))
{
// the refire delay keeps this message from being spammed
Send_Notification(NOTIF_ONE, actor, MSG_MULTI, WEAPON_MINELAYER_LIMIT, WEP_CVAR(minelayer, limit));
// common properties
MUTATOR_CALLHOOK(EditProjectile, actor, mine);
-
- actor.(weaponentity).minelayer_mines = W_MineLayer_Count(actor, weaponentity);
}
bool W_MineLayer_PlacedMines(entity this, .entity weaponentity, bool detonate)
METHOD(MineLayer, wr_aim, void(entity thiswep, entity actor, .entity weaponentity))
{
// aim and decide to fire if appropriate
- if(actor.(weaponentity).minelayer_mines >= WEP_CVAR(minelayer, limit))
+ int minecount = W_MineLayer_Count(actor, weaponentity);
+ if(minecount >= WEP_CVAR(minelayer, limit))
PHYS_INPUT_BUTTON_ATCK(actor) = false;
else
PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, weaponentity, WEP_CVAR(minelayer, speed), 0, WEP_CVAR(minelayer, lifetime), false);
}
METHOD(MineLayer, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
{
+ actor.(weaponentity).minelayer_mines = W_MineLayer_Count(actor, weaponentity);
+
if(autocvar_g_balance_minelayer_reload_ammo && actor.(weaponentity).clip_load < WEP_CVAR(minelayer, ammo)) // forced reload
{
// not if we're holding the minelayer without enough ammo, but can detonate existing mines
}
METHOD(MineLayer, wr_checkammo1, bool(entity thiswep, entity actor, .entity weaponentity))
{
- //int slot = 0; // TODO: unhardcode
// actually do // don't switch while placing a mine
- //if(ATTACK_FINISHED(actor, slot) <= time || PS(actor).m_weapon != WEP_MINE_LAYER)
+ //if(ATTACK_FINISHED(actor, weaponentity) <= time || PS(actor).m_weapon != WEP_MINE_LAYER)
//{
float ammo_amount = GetResourceAmount(actor, thiswep.ammo_type) >= WEP_CVAR(minelayer, ammo);
ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR(minelayer, ammo);
float r, af;
Weapon sw = actor.(weaponentity).m_switchweapon; // make it not detect weapon changes as reason to abort firing
- int slot = weaponslot(weaponentity);
- af = ATTACK_FINISHED(actor, slot);
+ af = ATTACK_FINISHED(actor, weaponentity);
actor.(weaponentity).m_switchweapon = actor.(weaponentity).m_weapon;
- ATTACK_FINISHED(actor, slot) = time;
+ ATTACK_FINISHED(actor, weaponentity) = time;
r = weapon_prepareattack(thiswep, actor, weaponentity, actor.rifle_bullethail_frame == WFRAME_FIRE2, actor.rifle_bullethail_refire);
if(actor.(weaponentity).m_switchweapon == actor.(weaponentity).m_weapon)
actor.(weaponentity).m_switchweapon = sw;
}
else
{
- ATTACK_FINISHED(actor, slot) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
+ ATTACK_FINISHED(actor, weaponentity) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
}
}
void CSQCModel_Draw(entity this)
{
// some nice flags for CSQCMODEL_IF and the hooks
- bool isplayer = (this.entnum >= 1 && this.entnum <= maxclients);
+ bool isplayer = (this.isplayermodel & ISPLAYER_CLIENT);
noref bool islocalplayer = (this.entnum == player_localnum + 1);
noref bool isnolocalplayer = (isplayer && (this.entnum != player_localnum + 1));
NET_HANDLE(ENT_CLIENT_MODEL, bool isnew)
{
int sf = ReadInt24_t();
+ int psf = ReadByte();
// some nice flags for CSQCMODEL_IF and the hooks
- bool isplayer = ReadByte() || (this.entnum >= 1 && this.entnum <= maxclients);
+ bool isplayer = (psf & ISPLAYER_CLIENT) || (this.entnum >= 1 && this.entnum <= maxclients);
if (isnew && isplayer)
{
CSQCModel_players[this.entnum - 1] = this;
bool islocalplayer = (this.entnum == player_localnum + 1);
noref bool isnolocalplayer = (isplayer && !islocalplayer);
+ this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_CLIENT, isplayer);
+ this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_LOCAL, islocalplayer);
+ this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_PLAYER, (psf & ISPLAYER_PLAYER));
+
this.classname = "csqcmodel";
this.iflags |= IFLAG_ORIGIN; // interpolate origin too
this.iflags |= IFLAG_ANGLES; // interpolate angles too
.float frame2time;
.float lerpfrac;
+const int ISPLAYER_MODEL = BIT(0); // using a player model
+const int ISPLAYER_CLIENT = BIT(1); // is a client
+const int ISPLAYER_LOCAL = BIT(2); // is the local player
+const int ISPLAYER_PLAYER = BIT(3); // is a player in the match
+
const int CSQCMODEL_PROPERTY_FRAME = BIT(23);
const int CSQCMODEL_PROPERTY_TELEPORTED = BIT(22); // the "teleport bit" cancelling interpolation
const int CSQCMODEL_PROPERTY_MODELINDEX = BIT(21);
noref bool islocalplayer = (this == to);
noref bool isnolocalplayer = (isplayer && (this != to));
+ int psf = 0;
+ psf = BITSET(psf, ISPLAYER_CLIENT, isplayer);
+ psf = BITSET(psf, ISPLAYER_LOCAL, islocalplayer);
+ psf = BITSET(psf, ISPLAYER_PLAYER, IS_PLAYER(this));
+
WriteHeader(MSG_ENTITY, ENT_CLIENT_MODEL);
WriteInt24_t(MSG_ENTITY, sf);
- WriteByte(MSG_ENTITY, isplayer);
+ WriteByte(MSG_ENTITY, psf);
#define CSQCMODEL_IF(cond) if(cond) {
#define CSQCMODEL_ENDIF }
void WarpZone_Touch(entity this, entity toucher);
NET_HANDLE(ENT_CLIENT_WARPZONE, bool isnew)
{
+ if(!warpzone_warpzones_exist)
+ cvar_settemp("r_water", "1"); // HACK for DarkPlaces: always enable reflections when a map has warpzones
warpzone_warpzones_exist = 1;
if (!this.enemy)
{
NET_HANDLE(ENT_CLIENT_WARPZONE_CAMERA, bool isnew)
{
+ if(!warpzone_cameras_exist)
+ cvar_settemp("r_water", "1"); // HACK for DarkPlaces: always enable reflections when a map has cameras
warpzone_cameras_exist = 1;
this.classname = "func_warpzone_camera";
void GameType_ConfigureSliders_for_CurrentGametype(entity me)
{
- switch(MapInfo_CurrentGametype())
- {
- case MAPINFO_TYPE_CA: GameType_ConfigureSliders(me, _("Frag limit:"), 5, 100, 5, "fraglimit_override", "g_ca_teams_override", _("The amount of frags needed before the match will end")); break;
- case MAPINFO_TYPE_FREEZETAG: GameType_ConfigureSliders(me, _("Frag limit:"), 5, 100, 5, "fraglimit_override", "g_freezetag_teams_override", _("The amount of frags needed before the match will end")); break;
- case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(me, _("Capture limit:"), 1, 20, 1, "capturelimit_override", string_null, _("The amount of captures needed before the match will end")); break;
- case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(me, _("Point limit:"), 50, 500, 10, "g_domination_point_limit", "g_domination_teams_override", _("The amount of points needed before the match will end")); break;
- case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(me, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit", "g_keyhunt_teams_override", _("The amount of points needed before the match will end")); break;
- case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(me, _("Lives:"), 3, 50, 1, "g_lms_lives_override", string_null, string_null); break;
- case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(me, _("Laps:"), 1, 25, 1, "g_race_laps_limit", string_null, string_null); break;
- case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(me, _("Goals:"), 1, 50, 1, "g_nexball_goallimit", string_null, _("The amount of goals needed before the match will end")); break;
- case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(me, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null); break;
- case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(me, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null); break;
- case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(me, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null); break;
- case MAPINFO_TYPE_INVASION: GameType_ConfigureSliders(me, _("Point limit:"), 50, 500, 10, string_null, string_null, string_null); break;
- case MAPINFO_TYPE_TEAM_DEATHMATCH: GameType_ConfigureSliders(me, _("Point limit:"), 5, 100, 5, "g_tdm_point_limit", "g_tdm_teams_override", _("The amount of points needed before the match will end")); break;
- default: GameType_ConfigureSliders(me, _("Frag limit:"), 5, 100, 5, "fraglimit_override", string_null, _("The amount of frags needed before the match will end")); break;
- }
+ Gametype gt = MapInfo_CurrentGametype();
+ gt.m_configuremenu(gt, me, GameType_ConfigureSliders);
}
entity makeXonoticServerCreateTab()
float autocvar_sv_track_canjump;
bool autocvar_sv_showspectators;
bool autocvar_g_weaponswitch_debug;
+bool autocvar_g_weaponswitch_debug_alternate;
bool autocvar_g_allow_checkpoints;
bool autocvar_sv_vq3compat_changehitbox = false;
const int WAYPOINTFLAG_USEFUL = BIT(17); // Useless WP detection temporary flag.
const int WAYPOINTFLAG_DEAD_END = BIT(16); // Useless WP detection temporary flag.
const int WAYPOINTFLAG_LADDER = BIT(15);
+const int WAYPOINTFLAG_JUMP = BIT(14);
entity kh_worldkeylist;
.entity kh_worldkeynext;
void waypoint_spawnforitem(entity e);
void waypoint_spawnforitem_force(entity e, vector org);
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent);
-void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent);
+void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent);
void waypoint_spawn_fromeditor(entity pl);
entity waypoint_spawn(vector m1, vector m2, float f);
void waypoint_unreachable(entity pl);
void lag_update(entity this)
{
- if (this.lag1_time) if (time > this.lag1_time) {this.lag_func(this, this.lag1_time, this.lag1_float1, this.lag1_float2, this.lag1_entity1, this.lag1_vec1, this.lag1_vec2, this.lag1_vec3, this.lag1_vec4);this.lag1_time = 0;}
- if (this.lag2_time) if (time > this.lag2_time) {this.lag_func(this, this.lag2_time, this.lag2_float1, this.lag2_float2, this.lag2_entity1, this.lag2_vec1, this.lag2_vec2, this.lag2_vec3, this.lag2_vec4);this.lag2_time = 0;}
- if (this.lag3_time) if (time > this.lag3_time) {this.lag_func(this, this.lag3_time, this.lag3_float1, this.lag3_float2, this.lag3_entity1, this.lag3_vec1, this.lag3_vec2, this.lag3_vec3, this.lag3_vec4);this.lag3_time = 0;}
- if (this.lag4_time) if (time > this.lag4_time) {this.lag_func(this, this.lag4_time, this.lag4_float1, this.lag4_float2, this.lag4_entity1, this.lag4_vec1, this.lag4_vec2, this.lag4_vec3, this.lag4_vec4);this.lag4_time = 0;}
- if (this.lag5_time) if (time > this.lag5_time) {this.lag_func(this, this.lag5_time, this.lag5_float1, this.lag5_float2, this.lag5_entity1, this.lag5_vec1, this.lag5_vec2, this.lag5_vec3, this.lag5_vec4);this.lag5_time = 0;}
+ if (this.lag1_time && time > this.lag1_time) { this.lag_func(this, this.lag1_time, this.lag1_float1, this.lag1_float2, this.lag1_entity1, this.lag1_vec1, this.lag1_vec2, this.lag1_vec3, this.lag1_vec4); this.lag1_time = 0; }
+ if (this.lag2_time && time > this.lag2_time) { this.lag_func(this, this.lag2_time, this.lag2_float1, this.lag2_float2, this.lag2_entity1, this.lag2_vec1, this.lag2_vec2, this.lag2_vec3, this.lag2_vec4); this.lag2_time = 0; }
+ if (this.lag3_time && time > this.lag3_time) { this.lag_func(this, this.lag3_time, this.lag3_float1, this.lag3_float2, this.lag3_entity1, this.lag3_vec1, this.lag3_vec2, this.lag3_vec3, this.lag3_vec4); this.lag3_time = 0; }
+ if (this.lag4_time && time > this.lag4_time) { this.lag_func(this, this.lag4_time, this.lag4_float1, this.lag4_float2, this.lag4_entity1, this.lag4_vec1, this.lag4_vec2, this.lag4_vec3, this.lag4_vec4); this.lag4_time = 0; }
+ if (this.lag5_time && time > this.lag5_time) { this.lag_func(this, this.lag5_time, this.lag5_float1, this.lag5_float2, this.lag5_entity1, this.lag5_vec1, this.lag5_vec2, this.lag5_vec3, this.lag5_vec4); this.lag5_time = 0; }
}
float lag_additem(entity this, float t, float f1, float f2, entity e1, vector v1, vector v2, vector v3, vector v4)
#include <lib/warpzone/common.qh>
#include <lib/warpzone/util_server.qh>
+STATIC_INIT(bot) { bot_calculate_stepheightvec(); }
+
// TODO: remove this function! its only purpose is to update these fields since bot_setnameandstuff is called before ClientState
void bot_setclientfields(entity this)
{
{
if (vdist(this.origin - this.goalcurrent_prev.origin, <, 50)
&& navigation_goalrating_timeout_can_be_anticipated(this))
+ {
navigation_goalrating_timeout_force(this);
+ }
}
bool goalcurrent_can_be_removed = false;
{
if (vlen2(flat_diff) < vlen2(offset))
{
- actual_destorg.x = destorg.x;
- actual_destorg.y = destorg.y;
+ if (this.goalcurrent.wpflags & WAYPOINTFLAG_JUMP && this.goalstack01)
+ {
+ // oblique warpzones need a jump otherwise bots gets stuck
+ PHYS_INPUT_BUTTON_JUMP(this) = true;
+ }
+ else
+ {
+ actual_destorg.x = destorg.x;
+ actual_destorg.y = destorg.y;
+ }
}
}
else if (vdist(flat_diff, <, 32) && diff.z < -16) // destination is under the bot
dir = normalize(dir + dodge);
}
+ makevectors(this.v_angle);
//dir = this.bot_dodgevector;
//if (this.bot_dodgevector_jumpbutton)
// PHYS_INPUT_BUTTON_JUMP(this) = true;
// Should it do a weapon combo?
float af, ct, combo_time, combo;
- af = ATTACK_FINISHED(this, 0);
+ af = ATTACK_FINISHED(this, weaponentity);
ct = autocvar_bot_ai_weapon_combo_threshold;
// Bots with no skill will be 4 times more slower than "godlike" bots when doing weapon combos
if(this.goalcurrent.wpflags & WAYPOINTFLAG_TELEPORT)
{
+ if (!this.goalcurrent.wpisbox // warpzone
+ && vlen2(this.origin - this.goalstack01.origin) < vlen2(this.origin - this.goalcurrent.origin))
+ {
+ navigation_poproute(this);
+ ++removed_goals;
+ navigation_poproute(this);
+ ++removed_goals;
+ return removed_goals;
+ }
+
// make sure jumppad is really hit, don't rely on distance based checks
// as they may report a touch even if it didn't really happen
if(this.lastteleporttime > 0 && TELEPORT_USED(this, this.goalcurrent))
LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by weaponentity state");
}
}
- else if(ATTACK_FINISHED(this, slot) > time)
+ else if(ATTACK_FINISHED(this, weaponentity) > time)
{
if(f)
{
this.colormod = '8 0 8';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by ATTACK_FINISHED (", ftos(ATTACK_FINISHED(this, slot) - time), " seconds left)");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by ATTACK_FINISHED (", ftos(ATTACK_FINISHED(this, weaponentity) - time), " seconds left)");
}
}
else if(this.(weaponentity).tuba_note)
if(!f)
{
this.colormod = '8 8 0';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " thinks it has fired, but apparently did not; ATTACK_FINISHED says ", ftos(ATTACK_FINISHED(this, slot) - time), " seconds left");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " thinks it has fired, but apparently did not; ATTACK_FINISHED says ", ftos(ATTACK_FINISHED(this, weaponentity) - time), " seconds left");
}
}
if (from == to || (from.wpflags & WAYPOINTFLAG_NORELINK))
return;
- bool found = false;
- if (!found && from.wp00 == to) found = true; if (found) {from.wp00 = from.wp01; from.wp00mincost = from.wp01mincost;}
- if (!found && from.wp01 == to) found = true; if (found) {from.wp01 = from.wp02; from.wp01mincost = from.wp02mincost;}
- if (!found && from.wp02 == to) found = true; if (found) {from.wp02 = from.wp03; from.wp02mincost = from.wp03mincost;}
- if (!found && from.wp03 == to) found = true; if (found) {from.wp03 = from.wp04; from.wp03mincost = from.wp04mincost;}
- if (!found && from.wp04 == to) found = true; if (found) {from.wp04 = from.wp05; from.wp04mincost = from.wp05mincost;}
- if (!found && from.wp05 == to) found = true; if (found) {from.wp05 = from.wp06; from.wp05mincost = from.wp06mincost;}
- if (!found && from.wp06 == to) found = true; if (found) {from.wp06 = from.wp07; from.wp06mincost = from.wp07mincost;}
- if (!found && from.wp07 == to) found = true; if (found) {from.wp07 = from.wp08; from.wp07mincost = from.wp08mincost;}
- if (!found && from.wp08 == to) found = true; if (found) {from.wp08 = from.wp09; from.wp08mincost = from.wp09mincost;}
- if (!found && from.wp09 == to) found = true; if (found) {from.wp09 = from.wp10; from.wp09mincost = from.wp10mincost;}
- if (!found && from.wp10 == to) found = true; if (found) {from.wp10 = from.wp11; from.wp10mincost = from.wp11mincost;}
- if (!found && from.wp11 == to) found = true; if (found) {from.wp11 = from.wp12; from.wp11mincost = from.wp12mincost;}
- if (!found && from.wp12 == to) found = true; if (found) {from.wp12 = from.wp13; from.wp12mincost = from.wp13mincost;}
- if (!found && from.wp13 == to) found = true; if (found) {from.wp13 = from.wp14; from.wp13mincost = from.wp14mincost;}
- if (!found && from.wp14 == to) found = true; if (found) {from.wp14 = from.wp15; from.wp14mincost = from.wp15mincost;}
- if (!found && from.wp15 == to) found = true; if (found) {from.wp15 = from.wp16; from.wp15mincost = from.wp16mincost;}
- if (!found && from.wp16 == to) found = true; if (found) {from.wp16 = from.wp17; from.wp16mincost = from.wp17mincost;}
- if (!found && from.wp17 == to) found = true; if (found) {from.wp17 = from.wp18; from.wp17mincost = from.wp18mincost;}
- if (!found && from.wp18 == to) found = true; if (found) {from.wp18 = from.wp19; from.wp18mincost = from.wp19mincost;}
- if (!found && from.wp19 == to) found = true; if (found) {from.wp19 = from.wp20; from.wp19mincost = from.wp20mincost;}
- if (!found && from.wp20 == to) found = true; if (found) {from.wp20 = from.wp21; from.wp20mincost = from.wp21mincost;}
- if (!found && from.wp21 == to) found = true; if (found) {from.wp21 = from.wp22; from.wp21mincost = from.wp22mincost;}
- if (!found && from.wp22 == to) found = true; if (found) {from.wp22 = from.wp23; from.wp22mincost = from.wp23mincost;}
- if (!found && from.wp23 == to) found = true; if (found) {from.wp23 = from.wp24; from.wp23mincost = from.wp24mincost;}
- if (!found && from.wp24 == to) found = true; if (found) {from.wp24 = from.wp25; from.wp24mincost = from.wp25mincost;}
- if (!found && from.wp25 == to) found = true; if (found) {from.wp25 = from.wp26; from.wp25mincost = from.wp26mincost;}
- if (!found && from.wp26 == to) found = true; if (found) {from.wp26 = from.wp27; from.wp26mincost = from.wp27mincost;}
- if (!found && from.wp27 == to) found = true; if (found) {from.wp27 = from.wp28; from.wp27mincost = from.wp28mincost;}
- if (!found && from.wp28 == to) found = true; if (found) {from.wp28 = from.wp29; from.wp28mincost = from.wp29mincost;}
- if (!found && from.wp29 == to) found = true; if (found) {from.wp29 = from.wp30; from.wp29mincost = from.wp30mincost;}
- if (!found && from.wp30 == to) found = true; if (found) {from.wp30 = from.wp31; from.wp30mincost = from.wp31mincost;}
- if (found) {from.wp31 = NULL; from.wp31mincost = 10000000;}
+ entity fromwp31_prev = from.wp31;
+
+ switch (waypoint_getlinknum(from, to))
+ {
+ // fallthrough all the way
+ case 0: from.wp00 = from.wp01; from.wp00mincost = from.wp01mincost;
+ case 1: from.wp01 = from.wp02; from.wp01mincost = from.wp02mincost;
+ case 2: from.wp02 = from.wp03; from.wp02mincost = from.wp03mincost;
+ case 3: from.wp03 = from.wp04; from.wp03mincost = from.wp04mincost;
+ case 4: from.wp04 = from.wp05; from.wp04mincost = from.wp05mincost;
+ case 5: from.wp05 = from.wp06; from.wp05mincost = from.wp06mincost;
+ case 6: from.wp06 = from.wp07; from.wp06mincost = from.wp07mincost;
+ case 7: from.wp07 = from.wp08; from.wp07mincost = from.wp08mincost;
+ case 8: from.wp08 = from.wp09; from.wp08mincost = from.wp09mincost;
+ case 9: from.wp09 = from.wp10; from.wp09mincost = from.wp10mincost;
+ case 10: from.wp10 = from.wp11; from.wp10mincost = from.wp11mincost;
+ case 11: from.wp11 = from.wp12; from.wp11mincost = from.wp12mincost;
+ case 12: from.wp12 = from.wp13; from.wp12mincost = from.wp13mincost;
+ case 13: from.wp13 = from.wp14; from.wp13mincost = from.wp14mincost;
+ case 14: from.wp14 = from.wp15; from.wp14mincost = from.wp15mincost;
+ case 15: from.wp15 = from.wp16; from.wp15mincost = from.wp16mincost;
+ case 16: from.wp16 = from.wp17; from.wp16mincost = from.wp17mincost;
+ case 17: from.wp17 = from.wp18; from.wp17mincost = from.wp18mincost;
+ case 18: from.wp18 = from.wp19; from.wp18mincost = from.wp19mincost;
+ case 19: from.wp19 = from.wp20; from.wp19mincost = from.wp20mincost;
+ case 20: from.wp20 = from.wp21; from.wp20mincost = from.wp21mincost;
+ case 21: from.wp21 = from.wp22; from.wp21mincost = from.wp22mincost;
+ case 22: from.wp22 = from.wp23; from.wp22mincost = from.wp23mincost;
+ case 23: from.wp23 = from.wp24; from.wp23mincost = from.wp24mincost;
+ case 24: from.wp24 = from.wp25; from.wp24mincost = from.wp25mincost;
+ case 25: from.wp25 = from.wp26; from.wp25mincost = from.wp26mincost;
+ case 26: from.wp26 = from.wp27; from.wp26mincost = from.wp27mincost;
+ case 27: from.wp27 = from.wp28; from.wp27mincost = from.wp28mincost;
+ case 28: from.wp28 = from.wp29; from.wp28mincost = from.wp29mincost;
+ case 29: from.wp29 = from.wp30; from.wp29mincost = from.wp30mincost;
+ case 30: from.wp30 = from.wp31; from.wp30mincost = from.wp31mincost;
+ case 31: from.wp31 = NULL; from.wp31mincost = 10000000;
+ }
+
+ if (fromwp31_prev && !from.wp31)
+ waypoint_schedulerelink(from);
+}
+
+int waypoint_getlinknum(entity from, entity to)
+{
+ if (from.wp00 == to) return 0; if (from.wp01 == to) return 1; if (from.wp02 == to) return 2; if (from.wp03 == to) return 3;
+ if (from.wp04 == to) return 4; if (from.wp05 == to) return 5; if (from.wp06 == to) return 6; if (from.wp07 == to) return 7;
+ if (from.wp08 == to) return 8; if (from.wp09 == to) return 9; if (from.wp10 == to) return 10; if (from.wp11 == to) return 11;
+ if (from.wp12 == to) return 12; if (from.wp13 == to) return 13; if (from.wp14 == to) return 14; if (from.wp15 == to) return 15;
+ if (from.wp16 == to) return 16; if (from.wp17 == to) return 17; if (from.wp18 == to) return 18; if (from.wp19 == to) return 19;
+ if (from.wp20 == to) return 20; if (from.wp21 == to) return 21; if (from.wp22 == to) return 22; if (from.wp23 == to) return 23;
+ if (from.wp24 == to) return 24; if (from.wp25 == to) return 25; if (from.wp26 == to) return 26; if (from.wp27 == to) return 27;
+ if (from.wp28 == to) return 28; if (from.wp29 == to) return 29; if (from.wp30 == to) return 30; if (from.wp31 == to) return 31;
+ return -1;
}
bool waypoint_islinked(entity from, entity to)
{
- if (from.wp00 == to) return true;if (from.wp01 == to) return true;if (from.wp02 == to) return true;if (from.wp03 == to) return true;
- if (from.wp04 == to) return true;if (from.wp05 == to) return true;if (from.wp06 == to) return true;if (from.wp07 == to) return true;
- if (from.wp08 == to) return true;if (from.wp09 == to) return true;if (from.wp10 == to) return true;if (from.wp11 == to) return true;
- if (from.wp12 == to) return true;if (from.wp13 == to) return true;if (from.wp14 == to) return true;if (from.wp15 == to) return true;
- if (from.wp16 == to) return true;if (from.wp17 == to) return true;if (from.wp18 == to) return true;if (from.wp19 == to) return true;
- if (from.wp20 == to) return true;if (from.wp21 == to) return true;if (from.wp22 == to) return true;if (from.wp23 == to) return true;
- if (from.wp24 == to) return true;if (from.wp25 == to) return true;if (from.wp26 == to) return true;if (from.wp27 == to) return true;
- if (from.wp28 == to) return true;if (from.wp29 == to) return true;if (from.wp30 == to) return true;if (from.wp31 == to) return true;
- return false;
+ return (waypoint_getlinknum(from, to) >= 0);
}
void waypoint_updatecost_foralllinks()
if(!found)
{
if(!removal_mode)
- LOG_INFO("NOTICE: Can not find waypoint at ", vtos(wp_from_pos), ". Path skipped");
+ LOG_INFO("NOTICE: Can not find origin waypoint for the hardwired link ", s, ". Path skipped");
continue;
}
}
if(!found)
{
if(!removal_mode)
- LOG_INFO("NOTICE: Can not find waypoint at ", vtos(wp_to_pos), ". Path skipped");
+ LOG_INFO("NOTICE: Can not find destination waypoint for the hardwired link ", s, ". Path skipped");
continue;
}
vector waypoint_fixorigin_down_dir(vector position, entity tracetest_ent, vector down_dir)
{
- tracebox(position + '0 0 1', PL_MIN_CONST, PL_MAX_CONST, position + down_dir * 3000, MOVE_NOMONSTERS, tracetest_ent);
+ vector endpos = position + down_dir * 3000;
+ tracebox(position + '0 0 1', PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
if(trace_startsolid)
- tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z / 2), PL_MIN_CONST, PL_MAX_CONST, position + down_dir * 3000, MOVE_NOMONSTERS, tracetest_ent);
+ tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z / 2), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
if(trace_startsolid)
- tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z), PL_MIN_CONST, PL_MAX_CONST, position + down_dir * 3000, MOVE_NOMONSTERS, tracetest_ent);
+ tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
if(trace_fraction < 1)
position = trace_endpos;
return position;
e.nearestwaypointtimeout = -1;
}
-void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent)
+void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent)
{
- // warpzones with oblique warp plane rely on down_dir to snap waypoints
- // to the ground without leaving the warp plane
- // warpzones with horizontal warp plane (down_dir.x == -1) generate
- // destination waypoint snapped to the ground (leaving warpzone), source
- // waypoint in the center of the warp plane
- if(down_dir.x != -1)
- org = waypoint_fixorigin_down_dir(org, tracetest_ent, down_dir);
- if(down_dir.x == -1)
- down_dir = '0 0 -1';
- destination = waypoint_fixorigin_down_dir(destination, tracetest_ent, down_dir);
- waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, org, org, destination, destination, timetaken);
+ float src_angle = e.warpzone_angles.x;
+ while (src_angle < -180) src_angle += 360;
+ while (src_angle > 180) src_angle -= 360;
+
+ float dest_angle = e.enemy.warpzone_angles.x;
+ while (dest_angle < -180) dest_angle += 360;
+ while (dest_angle > 180) dest_angle -= 360;
+
+ // no waypoints for warpzones pointing upwards, they can't be used by the bots
+ if (src_angle == -90 || dest_angle == -90)
+ return;
+
+ makevectors(e.warpzone_angles);
+ vector src = (e.absmin + e.absmax) * 0.5;
+ src += ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
+ vector down_dir_src = -v_up;
+
+ makevectors(e.enemy.warpzone_angles);
+ vector dest = (e.enemy.absmin + e.enemy.absmax) * 0.5;
+ dest += ((e.enemy.warpzone_origin - dest) * v_forward) * v_forward - 16 * v_right;
+ vector down_dir_dest = -v_up;
+
+ int extra_flag = 0;
+ // don't snap to the ground waypoints for source warpzones pointing downwards
+ if (src_angle != 90)
+ {
+ src = waypoint_fixorigin_down_dir(src, tracetest_ent, down_dir_src);
+ dest = waypoint_fixorigin_down_dir(dest, tracetest_ent, down_dir_dest);
+ // oblique warpzones need a jump otherwise bots gets stuck
+ if (src_angle != 0)
+ extra_flag = WAYPOINTFLAG_JUMP;
+ }
+
+ waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT | extra_flag, src, src, dest, dest, 0);
}
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent)
// increase by 0.01 when changes require only waypoint relinking
// increase by 1 when changes require to manually edit waypoints
// max 2 decimal places, always specified
-const float WAYPOINT_VERSION = 1.01;
+const float WAYPOINT_VERSION = 1.02;
string waypoint_time;
// fields you can query using prvm_global server to get some statistics about waypoint linking culling
spawnfunc(waypoint);
void waypoint_removelink(entity from, entity to);
+int waypoint_getlinknum(entity from, entity to);
bool waypoint_islinked(entity from, entity to);
void waypoint_addlink_customcost(entity from, entity to, float c);
void waypoint_addlink(entity from, entity to);
void waypoint_spawnforitem_force(entity e, vector org);
void waypoint_spawnforitem(entity e);
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent);
-void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent);
+void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent);
void botframe_showwaypointlinks();
float waypoint_loadall();
void waypoint_spawnforitem(entity e) { }
void waypoint_spawnforitem_force(entity e, vector org) { }
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent) { }
-void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent) { }
+void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent) { }
void waypoint_spawn_fromeditor(entity pl) { }
entity waypoint_spawn(vector m1, vector m2, float f) { return NULL; }
#endif
if (IS_REAL_CLIENT(this))
sv_notice_join(this);
- this.move_qcphysics = false;
+ this.move_qcphysics = true;
// update physics stats (players can spawn before physics runs)
Physics_UpdateStats(this);
CSQCMODEL_AUTOUPDATE(this);
}
+/**
+ * message "": do not say, just test flood control
+ * return value:
+ * 1 = accept
+ * 0 = reject
+ * -1 = fake accept
+ */
+int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol)
+{
+ if (!teamsay && !privatesay && substring(msgin, 0, 1) == " ")
+ msgin = substring(msgin, 1, -1); // work around DP say bug (say_team does not have this!)
+
+ if (source)
+ msgin = formatmessage(source, msgin);
+
+ string colorstr;
+ if (!(IS_PLAYER(source) || source.caplayer))
+ colorstr = "^0"; // black for spectators
+ else if(teamplay)
+ colorstr = Team_ColorCode(source.team);
+ else
+ {
+ colorstr = "";
+ teamsay = false;
+ }
+
+ if(game_stopped)
+ teamsay = false;
+
+ if (!source) {
+ colorstr = "";
+ teamsay = false;
+ }
+
+ if(msgin != "")
+ msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
+
+ /*
+ * using bprint solves this... me stupid
+ // how can we prevent the message from appearing in a listen server?
+ // for now, just give "say" back and only handle say_team
+ if(!teamsay)
+ {
+ clientcommand(source, strcat("say ", msgin));
+ return;
+ }
+ */
+
+ string namestr = "";
+ if (source)
+ namestr = playername(source, autocvar_g_chat_teamcolors);
+
+ string colorprefix = (strdecolorize(namestr) == namestr) ? "^3" : "^7";
+
+ string msgstr = "", cmsgstr = "";
+ string privatemsgprefix = string_null;
+ int privatemsgprefixlen = 0;
+ if (msgin != "")
+ {
+ if(privatesay)
+ {
+ msgstr = strcat("\{1}\{13}* ", colorprefix, namestr, "^3 tells you: ^7");
+ privatemsgprefixlen = strlen(msgstr);
+ msgstr = strcat(msgstr, msgin);
+ cmsgstr = strcat(colorstr, colorprefix, namestr, "^3 tells you:\n^7", msgin);
+ privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", playername(privatesay, autocvar_g_chat_teamcolors), ": ^7");
+ }
+ else if(teamsay)
+ {
+ if(strstrofs(msgin, "/me", 0) >= 0)
+ {
+ //msgin = strreplace("/me", "", msgin);
+ //msgin = substring(msgin, 3, strlen(msgin));
+ msgin = strreplace("/me", strcat(colorstr, "(", colorprefix, namestr, colorstr, ")^7"), msgin);
+ msgstr = strcat("\{1}\{13}^4* ", "^7", msgin);
+ }
+ else
+ msgstr = strcat("\{1}\{13}", colorstr, "(", colorprefix, namestr, colorstr, ") ^7", msgin);
+ cmsgstr = strcat(colorstr, "(", colorprefix, namestr, colorstr, ")\n^7", msgin);
+ }
+ else
+ {
+ if(strstrofs(msgin, "/me", 0) >= 0)
+ {
+ //msgin = strreplace("/me", "", msgin);
+ //msgin = substring(msgin, 3, strlen(msgin));
+ msgin = strreplace("/me", strcat(colorprefix, namestr), msgin);
+ msgstr = strcat("\{1}^4* ", "^7", msgin);
+ }
+ else {
+ msgstr = "\{1}";
+ msgstr = strcat(msgstr, (namestr != "") ? strcat(colorprefix, namestr, "^7: ") : "^7");
+ msgstr = strcat(msgstr, msgin);
+ }
+ cmsgstr = "";
+ }
+ msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint
+ }
+
+ string fullmsgstr = msgstr;
+ string fullcmsgstr = cmsgstr;
+
+ // FLOOD CONTROL
+ int flood = 0;
+ var .float flood_field = floodcontrol_chat;
+ if(floodcontrol && source)
+ {
+ float flood_spl;
+ float flood_burst;
+ float flood_lmax;
+ float lines;
+ if(privatesay)
+ {
+ flood_spl = autocvar_g_chat_flood_spl_tell;
+ flood_burst = autocvar_g_chat_flood_burst_tell;
+ flood_lmax = autocvar_g_chat_flood_lmax_tell;
+ flood_field = floodcontrol_chattell;
+ }
+ else if(teamsay)
+ {
+ flood_spl = autocvar_g_chat_flood_spl_team;
+ flood_burst = autocvar_g_chat_flood_burst_team;
+ flood_lmax = autocvar_g_chat_flood_lmax_team;
+ flood_field = floodcontrol_chatteam;
+ }
+ else
+ {
+ flood_spl = autocvar_g_chat_flood_spl;
+ flood_burst = autocvar_g_chat_flood_burst;
+ flood_lmax = autocvar_g_chat_flood_lmax;
+ flood_field = floodcontrol_chat;
+ }
+ flood_burst = max(0, flood_burst - 1);
+ // to match explanation in default.cfg, a value of 3 must allow three-line bursts and not four!
+
+ // do flood control for the default line size
+ if(msgstr != "")
+ {
+ getWrappedLine_remaining = msgstr;
+ msgstr = "";
+ lines = 0;
+ while(getWrappedLine_remaining && (!flood_lmax || lines <= flood_lmax))
+ {
+ msgstr = strcat(msgstr, " ", getWrappedLineLen(82.4289758859709, strlennocol)); // perl averagewidth.pl < gfx/vera-sans.width
+ ++lines;
+ }
+ msgstr = substring(msgstr, 1, strlen(msgstr) - 1);
+
+ if(getWrappedLine_remaining != "")
+ {
+ msgstr = strcat(msgstr, "\n");
+ flood = 2;
+ }
+
+ if (time >= source.(flood_field))
+ {
+ source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + lines * flood_spl;
+ }
+ else
+ {
+ flood = 1;
+ msgstr = fullmsgstr;
+ }
+ }
+ else
+ {
+ if (time >= source.(flood_field))
+ source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + flood_spl;
+ else
+ flood = 1;
+ }
+
+ if (timeout_status == TIMEOUT_ACTIVE) // when game is paused, no flood protection
+ source.(flood_field) = flood = 0;
+ }
+
+ string sourcemsgstr, sourcecmsgstr;
+ if(flood == 2) // cannot happen for empty msgstr
+ {
+ if(autocvar_g_chat_flood_notify_flooder)
+ {
+ sourcemsgstr = strcat(msgstr, "\n^3FLOOD CONTROL: ^7message too long, trimmed\n");
+ sourcecmsgstr = "";
+ }
+ else
+ {
+ sourcemsgstr = fullmsgstr;
+ sourcecmsgstr = fullcmsgstr;
+ }
+ cmsgstr = "";
+ }
+ else
+ {
+ sourcemsgstr = msgstr;
+ sourcecmsgstr = cmsgstr;
+ }
+
+ if (!privatesay && source && !(IS_PLAYER(source) || source.caplayer))
+ {
+ if (!game_stopped)
+ if (teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !warmup_stage))
+ teamsay = -1; // spectators
+ }
+
+ if(flood)
+ LOG_INFO("NOTE: ", playername(source, true), "^7 is flooding.");
+
+ // build sourcemsgstr by cutting off a prefix and replacing it by the other one
+ if(privatesay)
+ sourcemsgstr = strcat(privatemsgprefix, substring(sourcemsgstr, privatemsgprefixlen, -1));
+
+ int ret;
+ if(source && CS(source).muted)
+ {
+ // always fake the message
+ ret = -1;
+ }
+ else if(flood == 1)
+ {
+ if (autocvar_g_chat_flood_notify_flooder)
+ {
+ sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.(flood_field) - time), "^3 seconds\n"));
+ ret = 0;
+ }
+ else
+ ret = -1;
+ }
+ else
+ {
+ ret = 1;
+ }
+
+ if (privatesay && source && !(IS_PLAYER(source) || source.caplayer))
+ {
+ if (!game_stopped)
+ if ((privatesay && (IS_PLAYER(privatesay) || privatesay.caplayer)) && ((autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !warmup_stage)))
+ ret = -1; // just hide the message completely
+ }
+
+ MUTATOR_CALLHOOK(ChatMessage, source, ret);
+ ret = M_ARGV(1, int);
+
+ if(sourcemsgstr != "" && ret != 0)
+ {
+ if(ret < 0) // faked message, because the player is muted
+ {
+ sprint(source, sourcemsgstr);
+ if(sourcecmsgstr != "" && !privatesay)
+ centerprint(source, sourcecmsgstr);
+ }
+ else if(privatesay) // private message, between 2 people only
+ {
+ sprint(source, sourcemsgstr);
+ if (!autocvar_g_chat_tellprivacy) { dedicated_print(msgstr); } // send to server console too if "tellprivacy" is disabled
+ if(!MUTATOR_CALLHOOK(ChatMessageTo, privatesay, source))
+ {
+ sprint(privatesay, msgstr);
+ if(cmsgstr != "")
+ centerprint(privatesay, cmsgstr);
+ }
+ }
+ else if ( teamsay && CS(source).active_minigame )
+ {
+ sprint(source, sourcemsgstr);
+ dedicated_print(msgstr); // send to server console too
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && CS(it).active_minigame == CS(source).active_minigame && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
+ sprint(it, msgstr);
+ });
+ }
+ else if(teamsay > 0) // team message, only sent to team mates
+ {
+ sprint(source, sourcemsgstr);
+ dedicated_print(msgstr); // send to server console too
+ if(sourcecmsgstr != "")
+ centerprint(source, sourcecmsgstr);
+ FOREACH_CLIENT((IS_PLAYER(it) || it.caplayer) && IS_REAL_CLIENT(it) && it != source && it.team == source.team && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
+ sprint(it, msgstr);
+ if(cmsgstr != "")
+ centerprint(it, cmsgstr);
+ });
+ }
+ else if(teamsay < 0) // spectator message, only sent to spectators
+ {
+ sprint(source, sourcemsgstr);
+ dedicated_print(msgstr); // send to server console too
+ FOREACH_CLIENT(!(IS_PLAYER(it) || it.caplayer) && IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
+ sprint(it, msgstr);
+ });
+ }
+ else
+ {
+ if (source) {
+ sprint(source, sourcemsgstr);
+ dedicated_print(msgstr); // send to server console too
+ MX_Say(strcat(playername(source, true), "^7: ", msgin));
+ }
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
+ sprint(it, msgstr);
+ });
+ }
+ }
+
+ return ret;
+}
+
// hack to copy the button fields from the client entity to the Client State
void PM_UpdateButtons(entity this, entity store)
{
ATTRIBARRAY(Client, cvar_cl_weaponpriorities, string, 10);
ATTRIB(Client, cvar_cl_weaponpriority, string, this.cvar_cl_weaponpriority);
ATTRIB(Client, cvar_cl_cts_noautoswitch, bool, this.cvar_cl_cts_noautoswitch);
+ ATTRIB(Client, cvar_cl_weapon_switch_reload, bool, this.cvar_cl_weapon_switch_reload);
+ ATTRIB(Client, cvar_cl_weapon_switch_fallback_to_impulse, bool, this.cvar_cl_weapon_switch_fallback_to_impulse);
METHOD(Client, m_unwind, bool(Client this));
#define SPECTATE_COPY() ACCUMULATE void SpectateCopy(entity this, entity spectatee)
#define SPECTATE_COPYFIELD(fld) SPECTATE_COPY() { this.(fld) = spectatee.(fld); }
+
+int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol);
.float cvar_cl_movement_track_canjump;
.float cvar_cl_newusekeysupported;
.float cvar_cl_cts_noautoswitch;
+.bool cvar_cl_weapon_switch_reload;
+.bool cvar_cl_weapon_switch_fallback_to_impulse;
.string cvar_g_xonoticversion;
.string cvar_cl_weaponpriority;
#else
#define ATTACK_FINISHED_FOR(ent, w, slot) ((ent).attack_finished_single[slot])
#endif
-#define ATTACK_FINISHED(ent, slot) ATTACK_FINISHED_FOR(ent, ent.(weaponentity).m_weapon.m_id, slot)
-
-// assault game mode: Which team is attacking in this round?
-float assault_attacker_team;
+#define ATTACK_FINISHED(ent, w) ATTACK_FINISHED_FOR(ent, ent.(w).m_weapon.m_id, weaponslot(w))
// speedrun: when 1, player auto teleports back when capture timeout happens
.float speedrunning;
}
}
- if(STAT(FROZEN, targ))
- if(deathtype != DEATH_HURTTRIGGER.m_id && deathtype != DEATH_TEAMCHANGE.m_id && deathtype != DEATH_AUTOTEAMCHANGE.m_id)
+ if(deathtype != DEATH_HURTTRIGGER.m_id && deathtype != DEATH_TEAMCHANGE.m_id && deathtype != DEATH_AUTOTEAMCHANGE.m_id && STAT(FROZEN, targ))
{
- if(autocvar_g_frozen_revive_falldamage > 0)
- if(deathtype == DEATH_FALL.m_id)
- if(damage >= autocvar_g_frozen_revive_falldamage)
+ if(autocvar_g_frozen_revive_falldamage > 0 && deathtype == DEATH_FALL.m_id && damage >= autocvar_g_frozen_revive_falldamage)
{
Unfreeze(targ, false);
SetResourceAmount(targ, RESOURCE_HEALTH, autocvar_g_frozen_revive_falldamage_health);
force *= autocvar_g_frozen_force;
}
- if(STAT(FROZEN, targ) && deathtype == DEATH_HURTTRIGGER.m_id && !autocvar_g_frozen_damage_trigger)
+ if(IS_PLAYER(targ) && STAT(FROZEN, targ) && deathtype == DEATH_HURTTRIGGER.m_id && !autocvar_g_frozen_damage_trigger)
{
Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) \
{ \
.entity weaponentity = weaponentities[slot]; \
- W_SwitchWeapon(this, Weapons_from(WEP_FIRST + i), weaponentity); \
+ W_SwitchWeapon_TryOthers(this, Weapons_from(WEP_FIRST + i), weaponentity); \
if(slot == 0 && autocvar_g_weaponswitch_debug != 1) \
break; \
} \
#include "matrix.qh"
-#include "player.qh"
+#include "client.qh"
var void MX_Handle(int buf, string ancestor)
{
REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
+REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
+
+REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
+
/**
* @param f -1: cleanup, 0: request, 1: receive
*/
GiveResourceWithLimit(targ, RESOURCE_HEALTH, amount, limit);
return true;
}
-
-/**
- * message "": do not say, just test flood control
- * return value:
- * 1 = accept
- * 0 = reject
- * -1 = fake accept
- */
-int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol)
-{
- if (!teamsay && !privatesay && substring(msgin, 0, 1) == " ")
- msgin = substring(msgin, 1, -1); // work around DP say bug (say_team does not have this!)
-
- if (source)
- msgin = formatmessage(source, msgin);
-
- string colorstr;
- if (!(IS_PLAYER(source) || source.caplayer))
- colorstr = "^0"; // black for spectators
- else if(teamplay)
- colorstr = Team_ColorCode(source.team);
- else
- {
- colorstr = "";
- teamsay = false;
- }
-
- if(game_stopped)
- teamsay = false;
-
- if (!source) {
- colorstr = "";
- teamsay = false;
- }
-
- if(msgin != "")
- msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
-
- /*
- * using bprint solves this... me stupid
- // how can we prevent the message from appearing in a listen server?
- // for now, just give "say" back and only handle say_team
- if(!teamsay)
- {
- clientcommand(source, strcat("say ", msgin));
- return;
- }
- */
-
- string namestr = "";
- if (source)
- namestr = playername(source, autocvar_g_chat_teamcolors);
-
- string colorprefix = (strdecolorize(namestr) == namestr) ? "^3" : "^7";
-
- string msgstr = "", cmsgstr = "";
- string privatemsgprefix = string_null;
- int privatemsgprefixlen = 0;
- if (msgin != "")
- {
- if(privatesay)
- {
- msgstr = strcat("\{1}\{13}* ", colorprefix, namestr, "^3 tells you: ^7");
- privatemsgprefixlen = strlen(msgstr);
- msgstr = strcat(msgstr, msgin);
- cmsgstr = strcat(colorstr, colorprefix, namestr, "^3 tells you:\n^7", msgin);
- privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", playername(privatesay, autocvar_g_chat_teamcolors), ": ^7");
- }
- else if(teamsay)
- {
- if(strstrofs(msgin, "/me", 0) >= 0)
- {
- //msgin = strreplace("/me", "", msgin);
- //msgin = substring(msgin, 3, strlen(msgin));
- msgin = strreplace("/me", strcat(colorstr, "(", colorprefix, namestr, colorstr, ")^7"), msgin);
- msgstr = strcat("\{1}\{13}^4* ", "^7", msgin);
- }
- else
- msgstr = strcat("\{1}\{13}", colorstr, "(", colorprefix, namestr, colorstr, ") ^7", msgin);
- cmsgstr = strcat(colorstr, "(", colorprefix, namestr, colorstr, ")\n^7", msgin);
- }
- else
- {
- if(strstrofs(msgin, "/me", 0) >= 0)
- {
- //msgin = strreplace("/me", "", msgin);
- //msgin = substring(msgin, 3, strlen(msgin));
- msgin = strreplace("/me", strcat(colorprefix, namestr), msgin);
- msgstr = strcat("\{1}^4* ", "^7", msgin);
- }
- else {
- msgstr = "\{1}";
- msgstr = strcat(msgstr, (namestr != "") ? strcat(colorprefix, namestr, "^7: ") : "^7");
- msgstr = strcat(msgstr, msgin);
- }
- cmsgstr = "";
- }
- msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint
- }
-
- string fullmsgstr = msgstr;
- string fullcmsgstr = cmsgstr;
-
- // FLOOD CONTROL
- int flood = 0;
- var .float flood_field = floodcontrol_chat;
- if(floodcontrol && source)
- {
- float flood_spl;
- float flood_burst;
- float flood_lmax;
- float lines;
- if(privatesay)
- {
- flood_spl = autocvar_g_chat_flood_spl_tell;
- flood_burst = autocvar_g_chat_flood_burst_tell;
- flood_lmax = autocvar_g_chat_flood_lmax_tell;
- flood_field = floodcontrol_chattell;
- }
- else if(teamsay)
- {
- flood_spl = autocvar_g_chat_flood_spl_team;
- flood_burst = autocvar_g_chat_flood_burst_team;
- flood_lmax = autocvar_g_chat_flood_lmax_team;
- flood_field = floodcontrol_chatteam;
- }
- else
- {
- flood_spl = autocvar_g_chat_flood_spl;
- flood_burst = autocvar_g_chat_flood_burst;
- flood_lmax = autocvar_g_chat_flood_lmax;
- flood_field = floodcontrol_chat;
- }
- flood_burst = max(0, flood_burst - 1);
- // to match explanation in default.cfg, a value of 3 must allow three-line bursts and not four!
-
- // do flood control for the default line size
- if(msgstr != "")
- {
- getWrappedLine_remaining = msgstr;
- msgstr = "";
- lines = 0;
- while(getWrappedLine_remaining && (!flood_lmax || lines <= flood_lmax))
- {
- msgstr = strcat(msgstr, " ", getWrappedLineLen(82.4289758859709, strlennocol)); // perl averagewidth.pl < gfx/vera-sans.width
- ++lines;
- }
- msgstr = substring(msgstr, 1, strlen(msgstr) - 1);
-
- if(getWrappedLine_remaining != "")
- {
- msgstr = strcat(msgstr, "\n");
- flood = 2;
- }
-
- if (time >= source.(flood_field))
- {
- source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + lines * flood_spl;
- }
- else
- {
- flood = 1;
- msgstr = fullmsgstr;
- }
- }
- else
- {
- if (time >= source.(flood_field))
- source.(flood_field) = max(time - flood_burst * flood_spl, source.(flood_field)) + flood_spl;
- else
- flood = 1;
- }
-
- if (timeout_status == TIMEOUT_ACTIVE) // when game is paused, no flood protection
- source.(flood_field) = flood = 0;
- }
-
- string sourcemsgstr, sourcecmsgstr;
- if(flood == 2) // cannot happen for empty msgstr
- {
- if(autocvar_g_chat_flood_notify_flooder)
- {
- sourcemsgstr = strcat(msgstr, "\n^3FLOOD CONTROL: ^7message too long, trimmed\n");
- sourcecmsgstr = "";
- }
- else
- {
- sourcemsgstr = fullmsgstr;
- sourcecmsgstr = fullcmsgstr;
- }
- cmsgstr = "";
- }
- else
- {
- sourcemsgstr = msgstr;
- sourcecmsgstr = cmsgstr;
- }
-
- if (!privatesay && source && !(IS_PLAYER(source) || source.caplayer))
- {
- if (!game_stopped)
- if (teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !warmup_stage))
- teamsay = -1; // spectators
- }
-
- if(flood)
- LOG_INFO("NOTE: ", playername(source, true), "^7 is flooding.");
-
- // build sourcemsgstr by cutting off a prefix and replacing it by the other one
- if(privatesay)
- sourcemsgstr = strcat(privatemsgprefix, substring(sourcemsgstr, privatemsgprefixlen, -1));
-
- int ret;
- if(source && CS(source).muted)
- {
- // always fake the message
- ret = -1;
- }
- else if(flood == 1)
- {
- if (autocvar_g_chat_flood_notify_flooder)
- {
- sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.(flood_field) - time), "^3 seconds\n"));
- ret = 0;
- }
- else
- ret = -1;
- }
- else
- {
- ret = 1;
- }
-
- if (privatesay && source && !(IS_PLAYER(source) || source.caplayer))
- {
- if (!game_stopped)
- if ((privatesay && (IS_PLAYER(privatesay) || privatesay.caplayer)) && ((autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !warmup_stage)))
- ret = -1; // just hide the message completely
- }
-
- MUTATOR_CALLHOOK(ChatMessage, source, ret);
- ret = M_ARGV(1, int);
-
- if(sourcemsgstr != "" && ret != 0)
- {
- if(ret < 0) // faked message, because the player is muted
- {
- sprint(source, sourcemsgstr);
- if(sourcecmsgstr != "" && !privatesay)
- centerprint(source, sourcecmsgstr);
- }
- else if(privatesay) // private message, between 2 people only
- {
- sprint(source, sourcemsgstr);
- if (!autocvar_g_chat_tellprivacy) { dedicated_print(msgstr); } // send to server console too if "tellprivacy" is disabled
- if(!MUTATOR_CALLHOOK(ChatMessageTo, privatesay, source))
- {
- sprint(privatesay, msgstr);
- if(cmsgstr != "")
- centerprint(privatesay, cmsgstr);
- }
- }
- else if ( teamsay && CS(source).active_minigame )
- {
- sprint(source, sourcemsgstr);
- dedicated_print(msgstr); // send to server console too
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && CS(it).active_minigame == CS(source).active_minigame && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
- sprint(it, msgstr);
- });
- }
- else if(teamsay > 0) // team message, only sent to team mates
- {
- sprint(source, sourcemsgstr);
- dedicated_print(msgstr); // send to server console too
- if(sourcecmsgstr != "")
- centerprint(source, sourcecmsgstr);
- FOREACH_CLIENT((IS_PLAYER(it) || it.caplayer) && IS_REAL_CLIENT(it) && it != source && it.team == source.team && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
- sprint(it, msgstr);
- if(cmsgstr != "")
- centerprint(it, cmsgstr);
- });
- }
- else if(teamsay < 0) // spectator message, only sent to spectators
- {
- sprint(source, sourcemsgstr);
- dedicated_print(msgstr); // send to server console too
- FOREACH_CLIENT(!(IS_PLAYER(it) || it.caplayer) && IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
- sprint(it, msgstr);
- });
- }
- else
- {
- if (source) {
- sprint(source, sourcemsgstr);
- dedicated_print(msgstr); // send to server console too
- MX_Say(strcat(playername(source, true), "^7: ", msgin));
- }
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && !MUTATOR_CALLHOOK(ChatMessageTo, it, source), {
- sprint(it, msgstr);
- });
- }
- }
-
- return ret;
-}
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
bool PlayerHeal(entity targ, entity inflictor, float amount, float limit);
-
-int Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol);
// 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));
+ }
}
}
tracetest_ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
//for(entity e = warpzone_first; e; e = e.warpzone_next)
for(entity e = NULL; (e = find(e, classname, "trigger_warpzone")); )
- {
- vector src, dst;
- src = (e.absmin + e.absmax) * 0.5;
- makevectors(e.warpzone_angles);
- src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
- dst = (e.enemy.absmin + e.enemy.absmax) * 0.5;
- makevectors(e.enemy.warpzone_angles);
- dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right;
- waypoint_spawnforteleporter_wz(e, src, dst, 0, -v_up, tracetest_ent);
- }
+ waypoint_spawnforteleporter_wz(e, tracetest_ent);
delete(tracetest_ent);
}
if (mutator_check == MUT_ACCADD_INVALID) return true;
if (mutator_check != MUT_ACCADD_VALID) return false;
- if (!IS_CLIENT(targ)) return false;
+ if (!IS_CLIENT(targ) || !IS_CLIENT(attacker)) return false;
return true;
}
bool accuracy_canbegooddamage(entity attacker)
{
- return !warmup_stage;
+ return !warmup_stage && IS_CLIENT(attacker);
}
W_SwitchWeapon_Force(this, ww, weaponentity);
}
-void W_SwitchWeapon(entity this, Weapon w, .entity weaponentity)
+bool W_SwitchWeapon(entity this, Weapon w, .entity weaponentity)
{
if(this.(weaponentity).m_switchweapon != w)
{
if(client_hasweapon(this, w, weaponentity, true, true))
+ {
W_SwitchWeapon_Force(this, w, weaponentity);
+ return true;
+ }
else
+ {
this.(weaponentity).selectweapon = w.m_id; // update selectweapon anyway
+ return false;
+ }
}
- else if(!forbidWeaponUse(this))
+ else if(!forbidWeaponUse(this) && CS(this).cvar_cl_weapon_switch_reload)
{
entity actor = this;
w.wr_reload(w, actor, weaponentity);
}
+
+ return true; // player already has the weapon out or needs to reload
+}
+
+void W_SwitchWeapon_TryOthers(entity this, Weapon w, .entity weaponentity)
+{
+ if(!W_SwitchWeapon(this, w, weaponentity) && CS(this).cvar_cl_weapon_switch_fallback_to_impulse)
+ W_NextWeaponOnImpulse(this, w.impulse, weaponentity);
}
void W_CycleWeapon(entity this, string weaponorder, float dir, .entity weaponentity)
// perform weapon to attack (weaponstate and attack_finished check is here)
void W_SwitchToOtherWeapon(entity this, .entity weaponentity);
-void W_SwitchWeapon(entity this, Weapon imp, .entity weaponentity);
+bool W_SwitchWeapon(entity this, Weapon imp, .entity weaponentity); // returns false if the player does not have the weapon
+void W_SwitchWeapon_TryOthers(entity this, Weapon imp, .entity weaponentity);
void W_CycleWeapon(entity this, string weaponorder, float dir, .entity weaponentity);
if(!IS_CLIENT(ent))
antilag = false; // no antilag for non-clients!
if (IS_PLAYER(ent) && (wep.spawnflags & WEP_FLAG_PENETRATEWALLS))
+ {
+ // This is the reason rifle, MG, OKMG and other fireBullet weapons don't hit the crosshair when shooting at walls.
+ // This is intentional, otherwise if you stand too close to a (glass) wall and attempt to shoot an enemy through it,
+ // trueaim will cause the shot to hit the wall exactly but then miss the enemy (unless shooting from eye/center).
+ // TODO for fireBullet, find how far the shot will penetrate and aim at that
+ // for fireRailgunbullet, find the farthest target and aim at that
+ // this will avoid issues when another player is passing in front of you when you shoot
+ // (currently such a shot will hit him but then miss the original target)
ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
+ }
else
ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
if(antilag)
{
this.viewmodelforclient = this.owner;
if (IS_SPEC(client) && client.enemy == this.owner) this.viewmodelforclient = client;
- return true;
+ return false;
}
vector CL_Weapon_GetShotOrg(int wpn)
if (attacktime >= 0)
{
- int slot = weaponslot(weaponentity);
// don't fire if previous attack is not finished
- if (ATTACK_FINISHED(actor, slot) > time + actor.(weaponentity).weapon_frametime * 0.5) return false;
+ if (ATTACK_FINISHED(actor, weaponentity) > time + actor.(weaponentity).weapon_frametime * 0.5) return false;
entity this = actor.(weaponentity);
// don't fire while changing weapon
if (this.state != WS_READY) return false;
// if the weapon hasn't been firing continuously, reset the timer
if (attacktime >= 0)
{
- int slot = weaponslot(weaponentity);
- if (ATTACK_FINISHED(actor, slot) < time - this.weapon_frametime * 1.5)
+ if (ATTACK_FINISHED(actor, weaponentity) < time - this.weapon_frametime * 1.5)
{
- ATTACK_FINISHED(actor, slot) = time;
+ ATTACK_FINISHED(actor, weaponentity) = time;
// dprint("resetting attack finished to ", ftos(time), "\n");
}
- ATTACK_FINISHED(actor, slot) = ATTACK_FINISHED(actor, slot) + attacktime * W_WeaponRateFactor(actor);
+ float arate = W_WeaponRateFactor(actor);
+ ATTACK_FINISHED(actor, weaponentity) = ATTACK_FINISHED(actor, weaponentity) + attacktime * arate;
+
+ if(autocvar_g_weaponswitch_debug_alternate && W_DualWielding(actor))
+ {
+ int slot = weaponslot(weaponentity);
+ for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot)
+ {
+ if(slot == wepslot)
+ continue;
+ .entity wepent = weaponentities[wepslot];
+ if(actor.(wepent) && actor.(wepent).m_weapon != WEP_Null)
+ {
+ if(ATTACK_FINISHED(actor, wepent) > time + actor.(wepent).weapon_frametime * 0.5)
+ continue; // still cooling down!
+ if (ATTACK_FINISHED(actor, wepent) < time - actor.(wepent).weapon_frametime * 1.5)
+ ATTACK_FINISHED(actor, wepent) = time;
+ ATTACK_FINISHED(actor, wepent) = ATTACK_FINISHED(actor, wepent) + (attacktime * arate) / MAX_WEAPONSLOTS;
+ }
+ }
+ }
}
this.bulletcounter += 1;
- // dprint("attack finished ", ftos(ATTACK_FINISHED(actor, slot)), "\n");
+ // dprint("attack finished ", ftos(ATTACK_FINISHED(actor, weaponentity)), "\n");
}
bool weapon_prepareattack(Weapon thiswep, entity actor, .entity weaponentity, bool secondary, float attacktime)
entity oldwep = this.m_weapon;
// set up weapon switch think in the future, and start drop anim
- if (INDEPENDENT_ATTACK_FINISHED || ATTACK_FINISHED(actor, weaponslot(weaponentity)) <= time + this.weapon_frametime * 0.5)
+ if (INDEPENDENT_ATTACK_FINISHED || ATTACK_FINISHED(actor, weaponentity) <= time + this.weapon_frametime * 0.5)
{
sound(actor, CH_WEAPON_SINGLE, SND_WEAPON_SWITCH, VOL_BASE, ATTN_NORM);
this.state = WS_DROP;
// LordHavoc: network timing test code
// if (actor.button0)
- // print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(actor, slot)), " >= ", ftos(this.weapon_nextthink), "\n");
+ // print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(actor, weaponentity)), " >= ", ftos(this.weapon_nextthink), "\n");
Weapon w = this.m_weapon;
{
backtrace(sprintf(
"W_DecreaseAmmo(%.2f): '%s' subtracted too much %s from '%s', resulting with '%.2f' left... "
- "Please notify Samual immediately with a copy of this backtrace!\n",
+ "Please notify the developers immediately with a copy of this backtrace!\n",
ammo_use,
wep.netname,
GetAmmoPicture(wep.ammo_type),
// then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
// so your weapon is disabled for a few seconds without reason
- // ATTACK_FINISHED(actor, slot) -= w_ent.reload_time - 1;
+ // ATTACK_FINISHED(actor, weaponentity) -= w_ent.reload_time - 1;
w_ready(wpn, actor, weaponentity, PHYS_INPUT_BUTTON_ATCK(actor) | (PHYS_INPUT_BUTTON_ATCK2(actor) << 1));
}
// then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
// so your weapon is disabled for a few seconds without reason
- // ATTACK_FINISHED(actor, slot) = max(time, ATTACK_FINISHED(actor, slot)) + this.reload_time + 1;
+ // ATTACK_FINISHED(actor, weaponentity) = max(time, ATTACK_FINISHED(actor, weaponentity)) + this.reload_time + 1;
weapon_thinkf(actor, weaponentity, WFRAME_RELOAD, this.reload_time, W_ReloadedAndReady);
set g_vehicle_bumblebee_pitchspeed 60
set g_vehicle_bumblebee_pitchlimit 60
set g_vehicle_bumblebee_friction 0.5
-set g_vehicle_bumblebee_swim 0
+set g_vehicle_bumblebee_swim 1
set g_vehicle_bumblebee_energy 500
set g_vehicle_bumblebee_energy_regen 50
seta cl_unpress_zoom_on_weapon_switch 1 "automatically unpress zoom when you switch a weapon"
seta cl_unpress_attack_on_weapon_switch 0 "automatically unpress fire and fire1 attack buttons when you switch a weapon"
+seta cl_weapon_switch_reload 1 "When trying to switch to the currently held weapon, reload it"
+seta cl_weapon_switch_fallback_to_impulse 1 "When trying to switch to a weapon that is not available, switch to an alternative from the same impulse"
+
seta cl_spawn_event_particles 1 "pointparticles effect whenever a player spawns"
seta cl_spawn_event_sound 1 "sound effect whenever a player spawns"
//seta cl_spawn_point_model 0 "place a model at all spawn points" // still needs a model
seta cl_damagetext_size_max_damage 140 "How much damage is considered large"
seta cl_damagetext_alpha_start "1" "Damage text initial alpha"
seta cl_damagetext_alpha_lifetime "3" "Damage text lifetime in seconds"
-seta cl_damagetext_velocity "0 0 20" "Damage text move direction"
-seta cl_damagetext_offset "0 -40 0" "Damage text offset"
+seta cl_damagetext_velocity_screen "0 0 0" "Damage text move direction (screen coordinates)"
+seta cl_damagetext_velocity_world "0 0 20" "Damage text move direction (world coordinates relative to player's view)"
+seta cl_damagetext_offset_screen "0 -45 0" "Damage text offset (screen coordinates)"
+seta cl_damagetext_offset_world "0 0 0" "Damage text offset (world coordinates relative to player's view)"
seta cl_damagetext_accumulate_range "30" "Damage text spawned within this range is accumulated"
seta cl_damagetext_accumulate_alpha_rel "0.65" "Only update existing damage text when it's above this much percentage (0 to 1) of the starting alpha"
seta cl_damagetext_friendlyfire "1" "Show damage text for friendlyfire too"
seta cl_damagetext_friendlyfire_color "1 0 0" "Damage text color for friendlyfire"
+seta cl_damagetext_2d 1 "Show damagetext in 2D coordinates if the enemy's location is not known"
seta cl_damagetext_2d_pos "0.47 0.53 0" "2D damage text initial position (X and Y between 0 and 1)"
seta cl_damagetext_2d_alpha_start 1 "2D damage text initial alpha"
seta cl_damagetext_2d_alpha_lifetime 1.3 "2D damage text lifetime (alpha fading) in seconds"
seta cl_damagetext_2d_velocity "-25 0 0" "2D damage text move direction (screen coordinates)"
seta cl_damagetext_2d_overlap_offset "0 -15 0" "Offset 2D damage text by this much to prevent overlapping (screen coordinates)"
seta cl_damagetext_2d_close_range 125 "Always use 2D damagetext for hits closer that this"
-seta cl_damagetext_2d_out_of_view 1 "Always use 2D damagetext for hits that occured off-screen"
+seta cl_damagetext_2d_out_of_view 1 "Always use 2D damagetext for hits that occurred off-screen"
seta cl_vehicles_alarm 1 "Play an alarm sound when the vehicle you are driving is heavily damaged"
seta cl_vehicles_hud_tactical 1
cl_netfps 60 // should match or be a multiple of sys_ticrate
-seta gl_texturecompression 0
+gl_texture_anisotropy 8
+seta gl_texturecompression 0 // FIXME the description is wrong - when this is 0, e.g. gl_texturecompression_sky still takes effect
gl_texturecompression_color 1
gl_texturecompression_gloss 1
gl_texturecompression_glow 1
-gl_texturecompression_lightcubemaps 1
+gl_texturecompression_lightcubemaps 0
gl_texturecompression_q3bsplightmaps 0
gl_texturecompression_sky 1
sv_gameplayfix_delayprojectiles 0
sv_gameplayfix_q2airaccelerate 1
sv_gameplayfix_stepmultipletimes 1
+sv_gameplayfix_stepdown 2
// delay for "kill" to prevent abuse
set g_balance_kill_delay 2