]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/gibs_config' into 'master'
authorLegendaryGuard <rootuser999@gmail.com>
Thu, 5 Jan 2023 00:21:19 +0000 (00:21 +0000)
committerLegendaryGuard <rootuser999@gmail.com>
Thu, 5 Jan 2023 00:21:19 +0000 (00:21 +0000)
Gibs: tweak settings to reduce exaggerated throw velocity

See merge request xonotic/xonotic-data.pk3dir!1114

98 files changed:
.gitlab-ci.yml
.tx/merge-base
_hud_common.cfg
_hud_descriptions.cfg
common.la.po
common.zh_CN.po
common.zh_HK.po
common.zh_TW.po
gamemodes-server.cfg
hud_luma.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
languages.txt
models/weapons/v_akordeon.md3
models/weapons/v_fireball.md3
models/weapons/v_kleinbottle.md3
models/weapons/v_nex.md3
models/weapons/v_rl.md3
models/weapons/v_tuba.md3
monsters.cfg
qcsrc/client/hud/hud.qh
qcsrc/client/hud/panel/_mod.inc
qcsrc/client/hud/panel/_mod.qh
qcsrc/client/hud/panel/ammo.qc
qcsrc/client/hud/panel/pickup.qc [new file with mode: 0644]
qcsrc/client/hud/panel/pickup.qh [new file with mode: 0644]
qcsrc/client/hud/panel/timer.qc
qcsrc/client/main.qc
qcsrc/client/main.qh
qcsrc/client/view.qc
qcsrc/client/view.qh
qcsrc/common/constants.qh
qcsrc/common/effects/qc/casings.qc
qcsrc/common/effects/qc/casings.qh
qcsrc/common/effects/qc/damageeffects.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qh
qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc
qcsrc/common/items/inventory.qh
qcsrc/common/items/item/ammo.qh
qcsrc/common/items/item/jetpack.qh
qcsrc/common/mapobjects/subs.qc
qcsrc/common/mapobjects/trigger/hurt.qc
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/mutators/mutator/buffs/all.inc
qcsrc/common/mutators/mutator/buffs/buffs.qh
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/overkill/okhmg.qc
qcsrc/common/mutators/mutator/overkill/okhmg.qh
qcsrc/common/mutators/mutator/overkill/okmachinegun.qc
qcsrc/common/mutators/mutator/overkill/okrpc.qh
qcsrc/common/net_linked.qh
qcsrc/common/notifications/all.inc
qcsrc/common/notifications/all.qc
qcsrc/common/notifications/all.qh
qcsrc/common/physics/movetypes/movetypes.qc
qcsrc/common/physics/movetypes/movetypes.qh
qcsrc/common/resources/all.inc
qcsrc/common/resources/resources.qh
qcsrc/common/vehicles/vehicle/raptor_weapons.qc
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/all.qh
qcsrc/common/weapons/weapon.qh
qcsrc/common/weapons/weapon/blaster.qh
qcsrc/common/weapons/weapon/devastator.qh
qcsrc/common/weapons/weapon/fireball.qc
qcsrc/common/weapons/weapon/machinegun.qc
qcsrc/common/weapons/weapon/machinegun.qh
qcsrc/common/weapons/weapon/mortar.qc
qcsrc/common/weapons/weapon/mortar.qh
qcsrc/common/weapons/weapon/rifle.qc
qcsrc/common/weapons/weapon/seeker.qc
qcsrc/common/weapons/weapon/shockwave.qc
qcsrc/common/weapons/weapon/shotgun.qc
qcsrc/common/weapons/weapon/vaporizer.qh
qcsrc/common/weapons/weapon/vortex.qh
qcsrc/lib/csqcmodel/cl_player.qc
qcsrc/lib/csqcmodel/cl_player.qh
qcsrc/menu/xonotic/_mod.inc
qcsrc/menu/xonotic/_mod.qh
qcsrc/menu/xonotic/dialog_hudpanel_pickup.qc [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_hudpanel_pickup.qh [new file with mode: 0644]
qcsrc/menu/xonotic/mainwindow.qc
qcsrc/server/client.qc
qcsrc/server/command/vote.qc
qcsrc/server/damage.qc
qcsrc/server/damage.qh
qcsrc/server/items/items.qc
qcsrc/server/weapons/common.qc
qcsrc/server/weapons/tracing.qc
qcsrc/server/world.qc
ruleset-XPM.cfg
xonotic-client.cfg
xonotic-server.cfg

index 62a9fa393ee55019a7f3601fbe9a473ea6fe8b31..31378d8d25d85d6432a5b73209a2b11fc88127c1 100644 (file)
@@ -69,7 +69,7 @@ test_sv_game:
     - wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints\r
     - wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache\r
 \r
-    - EXPECT=4c834aa9b5950ffe25deec1880f21641\r
+    - EXPECT=8fb740a3cb3754ca7b9295ddc5c911b5\r
     - HASH=$(${ENGINE} +timestamps 1 +exec serverbench.cfg\r
       | tee /dev/stderr\r
       | sed -e 's,^\[[^]]*\] ,,'\r
index 59e31e612ecd7291d7ffd360bdb6b8fa6184d0fc..324a74c035a73eaed64e84fc0acd8447d585f6d6 100644 (file)
@@ -1 +1 @@
-Thu Dec 22 07:23:37 CET 2022
+Tue Dec 27 07:23:39 CET 2022
index 74f48a6aa5b408a337eccc5cf9cf1390bab969bc..0c808dd3784f54e960cbfe4897606f9dea07c000 100644 (file)
@@ -49,6 +49,7 @@ seta hud_panel_scoreboard_accuracy 1 "show weapon accuracy stats panel in the sc
 seta hud_panel_scoreboard_ctf_leaderboard 1 "show a capture time rankings leaderboard in the scoreboard if allowed by the server"
 seta hud_panel_scoreboard_itemstats 1 "show item stats panel in the scoreboard"
 seta hud_panel_strafehud        3 "enable this panel, 1 = show if not observing, 2 = show always, 3 = show only in race/cts if not observing"
+seta hud_panel_pickup           1 "enable this panel"
 
 seta hud_panel_weapons_dynamichud          1 "apply the dynamic hud effects to this panel"
 seta hud_panel_ammo_dynamichud             1 "apply the dynamic hud effects to this panel"
@@ -69,6 +70,7 @@ seta hud_panel_centerprint_dynamichud      1 "apply the dynamic hud effects to t
 seta hud_panel_itemstime_dynamichud        1 "apply the dynamic hud effects to this panel"
 seta hud_panel_scoreboard_dynamichud       0 "apply the dynamic hud effects to this panel"
 seta hud_panel_strafehud_dynamichud        1 "apply the dynamic hud effects to this panel"
+seta hud_panel_pickup_dynamichud           1 "apply the dynamic hud effects to this panel"
 
 seta hud_panel_weapons_ammo_full_shells 60 "show 100% of the status bar at this ammo count"
 seta hud_panel_weapons_ammo_full_nails 320 "show 100% of the status bar at this ammo count"
@@ -275,3 +277,8 @@ seta hud_shownames_maxdistance 5000 "alpha/size is 0 at this distance"
 seta hud_shownames_antioverlap 1 "if two tags overlap, fade out the one further away from you"
 seta hud_shownames_antioverlap_minalpha 0.4 "fade out overlapping tags to this alpha value"
 seta hud_shownames_offset 52 "offset (along z-axis) tag from player origin by this many units"
+
+seta hud_panel_pickup_showtimer 1 "0 = hide timer, 1 = show timer, 2 = only when spectating"
+seta hud_panel_pickup_iconsize 1.5 "icon size scale"
+seta hud_panel_pickup_time 3 "pickup message duration (can't be higher than 5)"
+seta hud_panel_pickup_fade_out 0.15 "how long a pickup message takes to fade out (this time is included in the message duration)"
index 545e0b92b51209e986926dcec132e4fdfe345f6d..b1831264694caaaa858c95e834366e48bfcc8ed3 100644 (file)
@@ -380,3 +380,12 @@ seta hud_panel_strafehud_bg_color_team "" "override panel color with team color
 seta hud_panel_strafehud_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
 seta hud_panel_strafehud_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 seta hud_panel_strafehud_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+
+seta hud_panel_pickup_pos "" "position of this base of the panel"
+seta hud_panel_pickup_size "" "size of this panel"
+seta hud_panel_pickup_bg "" "if set to something else than \"\" = override default background"
+seta hud_panel_pickup_bg_color "" "if set to something else than \"\" = override default panel background color"
+seta hud_panel_pickup_bg_color_team "" "override panel color with team color in team based games"
+seta hud_panel_pickup_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
+seta hud_panel_pickup_bg_border "" "if set to something else than \"\" = override default size of border around the background"
+seta hud_panel_pickup_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
index 5821de2d8e1c720797bb98c6c61074b2ab3129d6..4338bac20db6e113afcccb23f23d3dd800770996 100644 (file)
@@ -3352,7 +3352,7 @@ msgstr "^BG%s%s^K1, magno cantu ^BG%s^K1 M@!#%% Harmonicae, occisus est%s%s"
 #: qcsrc/common/notifications/all.inc:446
 #, c-format
 msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"
-msgstr "^BG%s^K1 suis auribus M@!%% Harmonica nocuit%s%s"
+msgstr "^BG%s^K1 suis auribus M@!#%% Harmonica nocuit%s%s"
 
 #: qcsrc/common/notifications/all.inc:447
 #, c-format
@@ -3477,18 +3477,18 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:471
 #, c-format
 msgid "^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1, gravitatis bombo ^BG%s^K1 Unci, offensus est%s%s"
 
 #: qcsrc/common/notifications/all.inc:472
 #, c-format
 msgid ""
 "^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1, magno canto ^BG%s^K1 M@!#%% Klein Lagenae, occisus est%s%s"
 
 #: qcsrc/common/notifications/all.inc:473
 #, c-format
 msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"
-msgstr ""
+msgstr "^BG%s^K1 suis auribus M@!#%% Klein Lagena nocuit%s%s"
 
 #: qcsrc/common/notifications/all.inc:474
 #, c-format
@@ -3498,43 +3498,43 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:475
 #, c-format
 msgid "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1, Polybolo ^BG%s^K1, perforatus est%s%s"
 
 #: qcsrc/common/notifications/all.inc:476
 #: qcsrc/common/notifications/all.inc:783
 #, c-format
 msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
-msgstr ""
+msgstr "^F2%s^BG tribuli simul ponere non potes"
 
 #: qcsrc/common/notifications/all.inc:477
 #, c-format
 msgid "^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 ad ^BG%s^K1 tribulum proxime fuit%s%s"
 
 #: qcsrc/common/notifications/all.inc:478
 #, c-format
 msgid "^BG%s^K1 forgot about their mine%s%s"
-msgstr ""
+msgstr "^BG%s^K1 sui tribuli oblitus est%s%s"
 
 #: qcsrc/common/notifications/all.inc:479
 #, c-format
 msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 ad ^BG%s^K1 Mortarii granatam proxime fuit%s%s"
 
 #: qcsrc/common/notifications/all.inc:480
 #, c-format
 msgid "^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1, granatam ^BG%s^K1 Mortarii, edit%s%s"
 
 #: qcsrc/common/notifications/all.inc:481
 #, c-format
 msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s^K1 sui ipsius Mortarii granatam non vidit%s%s"
 
 #: qcsrc/common/notifications/all.inc:482
 #, c-format
 msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
-msgstr ""
+msgstr "^BG%s^K1 suo Mortario se rupit%s%s"
 
 #: qcsrc/common/notifications/all.inc:483
 #, c-format
@@ -3651,12 +3651,12 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:505
 #, c-format
 msgid "^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1, magno cantu ^BG%s^K1 M@!#%% Tubae, occisus est%s%s"
 
 #: qcsrc/common/notifications/all.inc:506
 #, c-format
 msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s"
-msgstr ""
+msgstr "^BG%s^K1 suis auribus M@!#%% Tuba nocuit%s%s"
 
 #: qcsrc/common/notifications/all.inc:507
 #, c-format
@@ -3670,20 +3670,20 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:527
 msgid "^F4You are now alone!"
-msgstr ""
+msgstr "^F4Iam solus es!"
 
 #: qcsrc/common/notifications/all.inc:529
 msgid "^BGYou are attacking!"
-msgstr ""
+msgstr "^BGImpetis!"
 
 #: qcsrc/common/notifications/all.inc:530
 msgid "^BGYou are defending!"
-msgstr ""
+msgstr "^BGDefendis!"
 
 #: qcsrc/common/notifications/all.inc:531
 #, c-format
 msgid "^BGObjective destroyed in ^F4%s^BG!"
-msgstr ""
+msgstr "^BGMeta ^F4%s^BG deleta est!"
 
 #: qcsrc/common/notifications/all.inc:533
 #, c-format
@@ -3692,20 +3692,20 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:534
 msgid "^BGBegin!"
-msgstr ""
+msgstr "^BGIncipe!"
 
 #: qcsrc/common/notifications/all.inc:535
 msgid "^BGGame starts in"
-msgstr ""
+msgstr "^BGLudus incipietur post"
 
 #: qcsrc/common/notifications/all.inc:536
 #, c-format
 msgid "^BGRound %s starts in"
-msgstr ""
+msgstr "^BGTempus %sum incipietur post"
 
 #: qcsrc/common/notifications/all.inc:537
 msgid "^F4Round cannot start"
-msgstr ""
+msgstr "^F4Tempus incipi non potest"
 
 #: qcsrc/common/notifications/all.inc:542
 msgid "^F2Don't camp!"
@@ -3731,11 +3731,11 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:549
 msgid "^BGYou captured the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGVexillum ^TC^TT^BG cepisti!"
 
 #: qcsrc/common/notifications/all.inc:550
 msgid "^BGYou captured the flag!"
-msgstr ""
+msgstr "^BGVexillum cepisti!"
 
 #: qcsrc/common/notifications/all.inc:551
 #, c-format
@@ -3745,119 +3745,119 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:552
 #, c-format
 msgid "^BG%s^BG passed the ^TC^TT^BG flag to %s"
-msgstr ""
+msgstr "^BG%s^BG vexillum ^TC^TT^BG %s^BG dedit"
 
 #: qcsrc/common/notifications/all.inc:553
 #, c-format
 msgid "^BG%s^BG passed the flag to %s"
-msgstr ""
+msgstr "^BG%s^BG vexillum %s^BG dedit"
 
 #: qcsrc/common/notifications/all.inc:554
 #, c-format
 msgid "^BGYou received the ^TC^TT^BG flag from %s"
-msgstr ""
+msgstr "^BGVexillum ^TC^TT^BG a %s^BG accepisti"
 
 #: qcsrc/common/notifications/all.inc:555
 #, c-format
 msgid "^BGYou received the flag from %s"
-msgstr ""
+msgstr "^BGVexillum a %s^BG accepisti"
 
 #: qcsrc/common/notifications/all.inc:556
 #, c-format
 msgid "^BGPress ^F2%s^BG to receive the flag from %s^BG"
-msgstr ""
+msgstr "^F2%s^BG preme ut vexillum a %s^BG accipias"
 
 #: qcsrc/common/notifications/all.inc:557
 #, c-format
 msgid "^BGRequesting %s^BG to pass you the flag"
-msgstr ""
+msgstr "^BGRogatur ut ^BG%s^BG vexillum tibi det"
 
 #: qcsrc/common/notifications/all.inc:558
 #, c-format
 msgid "^BGYou passed the ^TC^TT^BG flag to %s"
-msgstr ""
+msgstr "^BGVexillum ^TC^TT^BG %s^BG dedisti"
 
 #: qcsrc/common/notifications/all.inc:559
 #, c-format
 msgid "^BGYou passed the flag to %s"
-msgstr ""
+msgstr "^BGVexillum %s^BG dedisti"
 
 #: qcsrc/common/notifications/all.inc:560
 msgid "^BGYou got the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGVexillum ^TC^TT^BG tenes!"
 
 #: qcsrc/common/notifications/all.inc:561
 msgid "^BGYou got the flag!"
-msgstr ""
+msgstr "^BGVexillum tenes!"
 
 #: qcsrc/common/notifications/all.inc:562
 #, c-format
 msgid "^BGYou got your %steam^BG's flag, return it!"
-msgstr ""
+msgstr "^BGTuae %smanus^BG vexillum tenes, id refer!"
 
 #: qcsrc/common/notifications/all.inc:563
 #, c-format
 msgid "^BGYou got the %senemy^BG's flag, return it!"
-msgstr ""
+msgstr "%sHostium^BG vexillum tenes, id refer!"
 
 #: qcsrc/common/notifications/all.inc:564
 #, c-format
 msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes^BG tuum vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:565
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes (^BG%s%s)^BG tuum vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:566
 #, c-format
 msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes^BG vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:567
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes (^BG%s%s)^BG vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:568
 #, c-format
 msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes^BG suum vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:569
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr ""
+msgstr "%sHostes (^BG%s%s)^BG suum vexillum tenent! Id recipe!"
 
 #: qcsrc/common/notifications/all.inc:570
 #, c-format
 msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr ""
+msgstr "^BGTuus %scollega^BG vexillum ^TC^TT^BG tenet! Eum serva!"
 
 #: qcsrc/common/notifications/all.inc:571
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr ""
+msgstr "^BGTuus %scollega (^BG%s%s)^BG vexillum ^TC^TT^BG tenet! Eum serva!"
 
 #: qcsrc/common/notifications/all.inc:572
 #, c-format
 msgid "^BGYour %steam mate^BG got the flag! Protect them!"
-msgstr ""
+msgstr "^BGTuus %scollega^BG vexillum tenet! Eum serva!"
 
 #: qcsrc/common/notifications/all.inc:573
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
-msgstr ""
+msgstr "^BGTuus %scollega (^BG%s%s)^BG vexillum tenet! Eum serva!"
 
 #: qcsrc/common/notifications/all.inc:574
 #: qcsrc/common/notifications/all.inc:712
 msgid "^BGEnemies can now see you on radar!"
-msgstr ""
+msgstr "^BGInimici detectro te videre possunt!"
 
 #: qcsrc/common/notifications/all.inc:575
 msgid "^BGYou returned the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGVexillum ^TC^TT^BG rettulisti!"
 
 #: qcsrc/common/notifications/all.inc:576
 msgid "^BGStalemate! Enemies can now see you on radar!"
@@ -3870,7 +3870,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:581
 #, c-format
 msgid "^K3%sYou fragged ^BG%s"
-msgstr ""
+msgstr "^K3%s^BG%s^K3 occidisti"
 
 #: qcsrc/common/notifications/all.inc:582
 #: qcsrc/common/notifications/all.inc:591
@@ -3882,7 +3882,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:583
 #, c-format
 msgid "^K1%sYou were fragged by ^BG%s"
-msgstr ""
+msgstr "^K1%sA ^BG%s^K1 occisus es"
 
 #: qcsrc/common/notifications/all.inc:584
 #: qcsrc/common/notifications/all.inc:593
@@ -3894,27 +3894,27 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:590
 #, c-format
 msgid "^K3%sYou burned ^BG%s"
-msgstr ""
+msgstr "^K3%s^BG%s^K3 cremavisti"
 
 #: qcsrc/common/notifications/all.inc:592
 #, c-format
 msgid "^K1%sYou were burned by ^BG%s"
-msgstr ""
+msgstr "^K1%sA ^BG%s^K1 crematus es"
 
 #: qcsrc/common/notifications/all.inc:599
 #, c-format
 msgid "^K3%sYou froze ^BG%s"
-msgstr ""
+msgstr "^K3%s^BG%s^K3 gelavisti"
 
 #: qcsrc/common/notifications/all.inc:601
 #, c-format
 msgid "^K1%sYou were frozen by ^BG%s"
-msgstr ""
+msgstr "^K1%sA ^BG%s^K1 gelatus es"
 
 #: qcsrc/common/notifications/all.inc:608
 #, c-format
 msgid "^K1%sYou typefragged ^BG%s"
-msgstr ""
+msgstr "^K1%s^BG%s^K1 scribentem occidisti"
 
 #: qcsrc/common/notifications/all.inc:609
 #, c-format
@@ -3924,7 +3924,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:610
 #, c-format
 msgid "^K1%sYou were typefragged by ^BG%s"
-msgstr ""
+msgstr "^K1%sTu scribens a ^BG%s^K1 occisus es"
 
 #: qcsrc/common/notifications/all.inc:611
 #, c-format
@@ -3934,11 +3934,11 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:617
 #, c-format
 msgid "^BGPress ^F2%s^BG again to toss the nade!"
-msgstr ""
+msgstr "^F2%s^BG iterum preme ut granatam iacias!"
 
 #: qcsrc/common/notifications/all.inc:618
 msgid "^F2You got a ^K1BONUS GRENADE^F2!"
-msgstr ""
+msgstr "^F2Tibi ^K1GRANATA DONATA^F2 est!"
 
 #: qcsrc/common/notifications/all.inc:620
 #, c-format
index 0d839c507e4f169277064a761c84e50e137bb669..33b0eb3f95862c327a3f4ba40f46a0d894f1f1cc 100644 (file)
@@ -618,7 +618,7 @@ msgstr "推入虚空而销毁的钥匙数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^destroyed"
-msgstr "毁"
+msgstr "毁"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^damage"
@@ -1526,7 +1526,7 @@ msgstr "钥匙猎取"
 
 #: qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc:18
 msgid "^1You have no more lives left"
-msgstr "^1你已经用尽你的生命"
+msgstr "^1你已耗尽生命"
 
 #: qcsrc/common/gamemodes/gamemode/lms/lms.qh:11
 msgid "Last Man Standing"
@@ -4120,7 +4120,7 @@ msgstr "^K1你被行走者炮塔杀死了!"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1你被笼罩在野蜂的爆炸中!"
+msgstr "^K1你被野蜂的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1You were crushed by a vehicle!"
@@ -4128,23 +4128,23 @@ msgstr "^K1你被载具压扁了!"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1你被笼罩å\9c¨ç\8c\9bæ\9e­ç\9a\84é\9b\86æ\9d\9fç\88\86破中!"
+msgstr "^K1你被ç\8c\9bæ\9e­ç\9a\84é\9b\86æ\9d\9fç\88\86ç ´å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1你被笼罩å\9c¨ç\8c\9bæ\9e­ç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被ç\8c\9bæ\9e­ç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:650
 msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1你被笼罩在蜘蛛机器人的爆炸中!"
+msgstr "^K1你被蜘蛛机器人的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:651
 msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1你被蜘蛛机器人炸成了碎片!"
+msgstr "^K1你被è\9c\98è\9b\9bæ\9cºå\99¨äººç\81«ç®­å¼¹ç\82¸æ\88\90äº\86ç¢\8eç\89\87ï¼\81"
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1你被笼罩å\9c¨ç«\9eé\80\9fè\80\85ç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被ç«\9eé\80\9fè\80\85ç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You couldn't find shelter from a Racer rocket!"
@@ -4320,14 +4320,14 @@ msgstr "^BG你带着^TC^TT队^BG钥匙开局"
 
 #: qcsrc/common/notifications/all.inc:710
 msgid "^BGYou have no lives left, you must wait until the next match"
-msgstr "^BG你已耗尽生命,你必须等待至下一轮竞赛"
+msgstr "^BG你已耗尽生命,请静候下一轮竞赛"
 
 #: qcsrc/common/notifications/all.inc:711
 msgid ""
 "^F4WARNING:^BG you can't rejoin this match after spectating.\n"
 "Use the same command again to spectate anyway."
 msgstr ""
-"^F4警告:^BG在进入旁观模式后,不能重新加入此局竞赛。\n"
+"^F4警告:^BG进入旁观模式后,将不能重新加入这一局竞赛。\n"
 "再次运行此指令以旁观。"
 
 #: qcsrc/common/notifications/all.inc:713
@@ -4350,7 +4350,7 @@ msgstr "^BG等待 %s 位玩家加入……"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BG你的武器被降级,找到一些弹药来恢复!"
+msgstr "^BG你的武器被降级,去找些弹药来恢复!"
 
 #: qcsrc/common/notifications/all.inc:719
 msgid "^F4^COUNT^BG left to find some ammo!"
@@ -4440,16 +4440,16 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep fragging until we have a winner!"
 msgstr ""
-"^F2现在是^F4超时阶段^F2!\n"
-"继续æ\9d\80æ\95\8cã\80\81ç\9b´å\88°å\86³è\83\9c!"
+"^F2现在是^F4决胜时刻^F2!\n"
+"继续æ\9d\80æ\95\8cã\80\81ç\9c\8bè\8a±è\90½è°\81家!"
 
 #: qcsrc/common/notifications/all.inc:737
 msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep scoring until we have a winner!"
 msgstr ""
-"^F2现在是^F4超时阶段^F2!\n"
-"尽全力进球、直到决胜!"
+"^F2现在是^F4决胜时刻^F2!\n"
+"尽全力进球、力拔头筹!"
 
 #: qcsrc/common/notifications/all.inc:738
 msgid ""
@@ -4459,11 +4459,11 @@ msgid ""
 "The more control points your team holds,\n"
 "the faster the enemy generator decays"
 msgstr ""
-"^F2现在是^F4超时阶段^F2!\n"
+"^F2现在是^F4决胜时刻^F2!\n"
 "\n"
 "发电机开始衰减。\n"
 "团队占领的控制点越多,\n"
-"敌方发电机衰减越快"
+"敌方发电机衰减越快"
 
 #: qcsrc/common/notifications/all.inc:739
 #, c-format
@@ -4471,7 +4471,7 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "^BGAdded ^F4%s^BG to the game!"
 msgstr ""
-"^F2现在是^F4超时阶段^F2!\n"
+"^F2现在是^F4决胜时刻^F2!\n"
 "^BG为游戏添加了 ^F4%s^BG!"
 
 #: qcsrc/common/notifications/all.inc:741
@@ -4967,7 +4967,7 @@ msgstr "相位炮塔"
 
 #: qcsrc/common/turrets/turret/phaser_weapon.qh:7
 msgid "Phaser"
-msgstr "相位"
+msgstr "相位"
 
 #: qcsrc/common/turrets/turret/plasma.qh:13
 msgid "Plasma Cannon"
@@ -5485,11 +5485,11 @@ msgstr "按 %s"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:956
 msgid "No right gunner!"
-msgstr "没有右舷炮架!"
+msgstr "右舷炮架没有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:962
 msgid "No left gunner!"
-msgstr "没有左舷炮架!"
+msgstr "左舷炮架没有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qh:21
 msgid "Bumblebee"
@@ -10234,7 +10234,7 @@ msgstr "十二月"
 #: qcsrc/menu/xonotic/statslist.qc:46
 #, no-c-format
 msgid "DATE^%m %d, %Y"
-msgstr "%Y 年 %m %d日"
+msgstr "%Y 年 %m %d 日"
 
 #: qcsrc/menu/xonotic/statslist.qc:97
 msgid "Joined:"
@@ -10297,11 +10297,11 @@ msgstr "%d(无排名)"
 
 #: qcsrc/menu/xonotic/util.qc:419
 msgid "Update can be downloaded at:"
-msgstr "可这里下载更新:"
+msgstr "可这里下载更新:"
 
 #: qcsrc/menu/xonotic/util.qc:509
 msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "正在自动生成新增地图的地图信息..."
+msgstr "正在自动生成新增地图的地图信息 (mapinfo)..."
 
 #: qcsrc/menu/xonotic/util.qc:544
 #, c-format
index 1d583a06fa8bbf401dba6d0bcd6cf9255908f409..2a7f000047e093ff672a131914db7f8d00a91fee 100644 (file)
@@ -612,7 +612,7 @@ msgstr "推入虛空而銷燬的鑰匙數"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^destroyed"
-msgstr "銷燬"
+msgstr "摧毀"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^damage"
@@ -1520,7 +1520,7 @@ msgstr "鑰匙獵取"
 
 #: qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc:18
 msgid "^1You have no more lives left"
-msgstr "^1你已經用盡你的生命"
+msgstr "^1你已耗盡生命"
 
 #: qcsrc/common/gamemodes/gamemode/lms/lms.qh:11
 msgid "Last Man Standing"
@@ -4114,7 +4114,7 @@ msgstr "^K1你被行走者炮塔殺死了!"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1你被籠罩在野蜂的爆炸中!"
+msgstr "^K1你被野蜂的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1You were crushed by a vehicle!"
@@ -4122,23 +4122,23 @@ msgstr "^K1你被載具壓扁了!"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1你被籠罩å\9c¨ç\8c\9bæ¢\9fç\9a\84é\9b\86æ\9d\9fç\88\86破中!"
+msgstr "^K1你被ç\8c\9bæ¢\9fç\9a\84é\9b\86æ\9d\9fç\88\86ç ´å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1你被籠罩å\9c¨ç\8c\9bæ¢\9fç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被ç\8c\9bæ¢\9fç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:650
 msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1你被籠罩在蜘蛛機器人的爆炸中!"
+msgstr "^K1你被蜘蛛機器人的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:651
 msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1你被蜘蛛機器人炸成了碎片!"
+msgstr "^K1你被è\9c\98è\9b\9bæ©\9få\99¨äººç\81«ç®­å½\88ç\82¸æ\88\90äº\86ç¢\8eç\89\87ï¼\81"
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1你被籠罩å\9c¨ç«¶é\80\9fè\80\85ç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被競é\80\9fè\80\85ç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You couldn't find shelter from a Racer rocket!"
@@ -4314,14 +4314,14 @@ msgstr "^BG你帶着^TC^TT隊^BG鑰匙開局"
 
 #: qcsrc/common/notifications/all.inc:710
 msgid "^BGYou have no lives left, you must wait until the next match"
-msgstr "^BG你已耗盡生命,你必須等待至下一輪競賽"
+msgstr "^BG你已耗盡生命,請靜候下一輪競賽"
 
 #: qcsrc/common/notifications/all.inc:711
 msgid ""
 "^F4WARNING:^BG you can't rejoin this match after spectating.\n"
 "Use the same command again to spectate anyway."
 msgstr ""
-"^F4警告:^BG在進入旁觀模式後,不能重新加入此局競賽。\n"
+"^F4警告:^BG進入旁觀模式後,將不能重新加入這一局競賽。\n"
 "再次運行此指令以旁觀。"
 
 #: qcsrc/common/notifications/all.inc:713
@@ -4344,7 +4344,7 @@ msgstr "^BG等待 %s 位玩家加入……"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BG你的武器被降級,找到一些彈藥來恢復!"
+msgstr "^BG你的武器被降級,去找些彈藥來恢復!"
 
 #: qcsrc/common/notifications/all.inc:719
 msgid "^F4^COUNT^BG left to find some ammo!"
@@ -4434,16 +4434,16 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep fragging until we have a winner!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
-"ç¹¼çº\8c殺æ\95µã\80\81ç\9b´å\88°æ±ºå\8b\9d!"
+"^F2現在是^F4決勝時刻^F2!\n"
+"ç¹¼çº\8c殺æ\95µã\80\81ç\9c\8bè\8a±è\90½èª°å®¶!"
 
 #: qcsrc/common/notifications/all.inc:737
 msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep scoring until we have a winner!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
-"盡全力進球、直到決勝!"
+"^F2現在是^F4決勝時刻^F2!\n"
+"盡全力進球、力拔頭籌!"
 
 #: qcsrc/common/notifications/all.inc:738
 msgid ""
@@ -4453,11 +4453,11 @@ msgid ""
 "The more control points your team holds,\n"
 "the faster the enemy generator decays"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
+"^F2現在是^F4決勝時刻^F2!\n"
 "\n"
 "發電機開始衰減。\n"
 "團隊佔領的控制點越多,\n"
-"æ\95µæ\96¹ç\9a\84ç\99¼é\9b»æ©\9fè¡°æ¸\9bè¶\8aå¿«"
+"敵方發電機衰減越快"
 
 #: qcsrc/common/notifications/all.inc:739
 #, c-format
@@ -4465,7 +4465,7 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "^BGAdded ^F4%s^BG to the game!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
+"^F2現在是^F4決勝時刻^F2!\n"
 "^BG為遊戲添加了 ^F4%s^BG!"
 
 #: qcsrc/common/notifications/all.inc:741
@@ -4961,7 +4961,7 @@ msgstr "相位炮塔"
 
 #: qcsrc/common/turrets/turret/phaser_weapon.qh:7
 msgid "Phaser"
-msgstr "相位"
+msgstr "相位"
 
 #: qcsrc/common/turrets/turret/plasma.qh:13
 msgid "Plasma Cannon"
@@ -5479,11 +5479,11 @@ msgstr "按 %s"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:956
 msgid "No right gunner!"
-msgstr "沒有右舷炮架!"
+msgstr "右舷炮架沒有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:962
 msgid "No left gunner!"
-msgstr "沒有左舷炮架!"
+msgstr "左舷炮架沒有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qh:21
 msgid "Bumblebee"
@@ -10228,7 +10228,7 @@ msgstr "十二月"
 #: qcsrc/menu/xonotic/statslist.qc:46
 #, no-c-format
 msgid "DATE^%m %d, %Y"
-msgstr "%Y 年 %m %d日"
+msgstr "%Y 年 %m %d 日"
 
 #: qcsrc/menu/xonotic/statslist.qc:97
 msgid "Joined:"
@@ -10291,11 +10291,11 @@ msgstr "%d(無排名)"
 
 #: qcsrc/menu/xonotic/util.qc:419
 msgid "Update can be downloaded at:"
-msgstr "å\8f¯å¾\9e這裏下載更新:"
+msgstr "å\8f¯å\9c¨這裏下載更新:"
 
 #: qcsrc/menu/xonotic/util.qc:509
 msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "正在自動生成新增地圖的地圖信息..."
+msgstr "正在自動生成新增地圖的地圖信息 (mapinfo)..."
 
 #: qcsrc/menu/xonotic/util.qc:544
 #, c-format
index 313b7563acfded6cbf03ad97059e72bc7dbe48a3..358f71128d1391007f49751e46083f04a790b683 100644 (file)
@@ -30,7 +30,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2022-12-04 07:22+0100\n"
 "PO-Revision-Date: 2013-09-12 16:53+0000\n"
-"Last-Translator: é»\83æ\9f\8f諺 <s8321414@gmail.com>, 2015\n"
+"Last-Translator: é\9f¬ å\88\98 <jiegushijia@gmail.com>, 2019\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.com/team-xonotic/"
 "xonotic/language/zh_TW/)\n"
 "Language: zh_TW\n"
@@ -620,7 +620,7 @@ msgstr "推入虛空而銷燬的鑰匙數"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^destroyed"
-msgstr "銷燬"
+msgstr "摧毀"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^damage"
@@ -1528,7 +1528,7 @@ msgstr "鑰匙獵取"
 
 #: qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc:18
 msgid "^1You have no more lives left"
-msgstr "^1你已經用盡你的生命"
+msgstr "^1你已耗盡生命"
 
 #: qcsrc/common/gamemodes/gamemode/lms/lms.qh:11
 msgid "Last Man Standing"
@@ -4122,7 +4122,7 @@ msgstr "^K1你被行走者砲塔殺死了!"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1你被籠罩在野蜂的爆炸中!"
+msgstr "^K1你被野蜂的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1You were crushed by a vehicle!"
@@ -4130,23 +4130,23 @@ msgstr "^K1你被載具壓扁了!"
 
 #: qcsrc/common/notifications/all.inc:648
 msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1你被籠罩å\9c¨ç\8c\9b禽ç\9a\84é\9b\86æ\9d\9fç\88\86破中!"
+msgstr "^K1你被ç\8c\9b禽ç\9a\84é\9b\86æ\9d\9fç\88\86ç ´å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:649
 msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1你被籠罩å\9c¨ç\8c\9b禽ç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被ç\8c\9b禽ç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:650
 msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1你被籠罩在蜘蛛機器人的爆炸中!"
+msgstr "^K1你被蜘蛛機器人的爆炸吞噬!"
 
 #: qcsrc/common/notifications/all.inc:651
 msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1你被蜘蛛機器人炸成了碎片!"
+msgstr "^K1你被è\9c\98è\9b\9bæ©\9få\99¨äººç\81«ç®­å½\88ç\82¸æ\88\90äº\86ç¢\8eç\89\87ï¼\81"
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1你被籠罩å\9c¨ç«¶é\80\9fè\80\85ç\9a\84ç\88\86ç\82¸ä¸­!"
+msgstr "^K1你被競é\80\9fè\80\85ç\9a\84ç\88\86ç\82¸å\90\9eå\99¬!"
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You couldn't find shelter from a Racer rocket!"
@@ -4322,14 +4322,14 @@ msgstr "^BG你帶著^TC^TT隊^BG鑰匙開局"
 
 #: qcsrc/common/notifications/all.inc:710
 msgid "^BGYou have no lives left, you must wait until the next match"
-msgstr "^BG你已耗盡生命,你必須等待至下一輪競賽"
+msgstr "^BG你已耗盡生命,請靜候下一輪競賽"
 
 #: qcsrc/common/notifications/all.inc:711
 msgid ""
 "^F4WARNING:^BG you can't rejoin this match after spectating.\n"
 "Use the same command again to spectate anyway."
 msgstr ""
-"^F4警告:^BG在進入旁觀模式後,不能重新加入此局競賽。\n"
+"^F4警告:^BG進入旁觀模式後,將不能重新加入這一局競賽。\n"
 "再次執行此指令以旁觀。"
 
 #: qcsrc/common/notifications/all.inc:713
@@ -4352,7 +4352,7 @@ msgstr "^BG等待 %s 位玩家加入……"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr "^BG你的武器被降級,找到一些彈藥來恢復!"
+msgstr "^BG你的武器被降級,去找些彈藥來恢復!"
 
 #: qcsrc/common/notifications/all.inc:719
 msgid "^F4^COUNT^BG left to find some ammo!"
@@ -4442,16 +4442,16 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep fragging until we have a winner!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
-"ç¹¼çº\8c殺æ\95µã\80\81ç\9b´å\88°æ±ºå\8b\9d!"
+"^F2現在是^F4決勝時刻^F2!\n"
+"ç¹¼çº\8c殺æ\95µã\80\81ç\9c\8bè\8a±è\90½èª°å®¶!"
 
 #: qcsrc/common/notifications/all.inc:737
 msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep scoring until we have a winner!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
-"盡全力進球、直到決勝!"
+"^F2現在是^F4決勝時刻^F2!\n"
+"盡全力進球、力拔頭籌!"
 
 #: qcsrc/common/notifications/all.inc:738
 msgid ""
@@ -4461,11 +4461,11 @@ msgid ""
 "The more control points your team holds,\n"
 "the faster the enemy generator decays"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
+"^F2現在是^F4決勝時刻^F2!\n"
 "\n"
 "發電機開始衰減。\n"
 "團隊佔領的控制點越多,\n"
-"æ\95µæ\96¹ç\9a\84ç\99¼é\9b»æ©\9fè¡°æ¸\9bè¶\8aå¿«"
+"敵方發電機衰減越快"
 
 #: qcsrc/common/notifications/all.inc:739
 #, c-format
@@ -4473,7 +4473,7 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "^BGAdded ^F4%s^BG to the game!"
 msgstr ""
-"^F2現在是^F4超時階段^F2!\n"
+"^F2現在是^F4決勝時刻^F2!\n"
 "^BG為遊戲添加了 ^F4%s^BG!"
 
 #: qcsrc/common/notifications/all.inc:741
@@ -4969,7 +4969,7 @@ msgstr "相位砲塔"
 
 #: qcsrc/common/turrets/turret/phaser_weapon.qh:7
 msgid "Phaser"
-msgstr "相位"
+msgstr "相位"
 
 #: qcsrc/common/turrets/turret/plasma.qh:13
 msgid "Plasma Cannon"
@@ -5487,11 +5487,11 @@ msgstr "按 %s"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:956
 msgid "No right gunner!"
-msgstr "沒有右舷炮架!"
+msgstr "右舷炮架沒有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:962
 msgid "No left gunner!"
-msgstr "沒有左舷炮架!"
+msgstr "左舷炮架沒有炮手!"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qh:21
 msgid "Bumblebee"
@@ -10236,7 +10236,7 @@ msgstr "十二月"
 #: qcsrc/menu/xonotic/statslist.qc:46
 #, no-c-format
 msgid "DATE^%m %d, %Y"
-msgstr "%Y 年 %m %d日"
+msgstr "%Y 年 %m %d 日"
 
 #: qcsrc/menu/xonotic/statslist.qc:97
 msgid "Joined:"
@@ -10299,11 +10299,11 @@ msgstr "%d(無排名)"
 
 #: qcsrc/menu/xonotic/util.qc:419
 msgid "Update can be downloaded at:"
-msgstr "å\8f¯å¾\9e這裡下載更新:"
+msgstr "å\8f¯å\9c¨這裡下載更新:"
 
 #: qcsrc/menu/xonotic/util.qc:509
 msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "正在自動生成新增地圖的地圖資訊..."
+msgstr "正在自動生成新增地圖的地圖資訊 (mapinfo)..."
 
 #: qcsrc/menu/xonotic/util.qc:544
 #, c-format
index a822fc9a64e51d41392ebc849860a732a503b0ec..a7379ed40f85ff6d7841e747e85aeb6914218838 100644 (file)
@@ -260,7 +260,7 @@ set g_ctf_stalemate 1 "show the enemy flagcarrier location after both teams have
 set g_ctf_stalemate_endcondition 1 "condition for stalemate mode to be finished: 1 = If ONE flag is no longer stale, 2 = If BOTH flags are no longer stale"
 set g_ctf_stalemate_time 60 "time for each flag until stalemate mode is activated"
 set g_ctf_flagcarrier_waypointforenemy_spotting 1 "show the enemy flagcarrier location if a team mate presses +use to spot them"
-set g_ctf_dropped_capture_delay 1.5 "autocapture delay when flag is thrown onto the base - counted from throw, not landing"
+set g_ctf_dropped_capture_delay 1 "autocapture delay when flag is thrown onto the base - counted from when the flag lands on the ground"
 set g_ctf_dropped_capture_radius 100 "allow dropped flags to be automatically captured by base flags if the dropped flag is within this radius of it"
 set g_ctf_flag_damageforcescale 2
 set g_ctf_portalteleport 0 "allow flag carriers to go through portals made in portal gun without dropping the flag"
@@ -326,6 +326,7 @@ set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
 set g_cts_finish_kill_delay 2 "kill player this many seconds after stage completion to prevent cheating by starting out with more speed than otherwise possible; set it to 0 to not kill or to -1 to kill instantly"
 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"
+set g_cts_drop_monster_items 0 "allow killed monsters to drop their items"
 
 
 // ==========================
index 384024e34536a8f91e2cd0941f5f20d32d4c3ef3..9aaaac6f7c5db29a2ad9902ec8394451d129d26a 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.86 0.35 0"
 seta hud_progressbar_vehicles_ammo1_color "0.77 0.67 0"
 seta hud_progressbar_vehicles_ammo2_color "0.86 0.35 0"
 
-seta _hud_panelorder "17 25 15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 25 15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.005000"
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha "0.7"
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0.010000 0.945000"
+seta hud_panel_pickup_size "0.260000 0.035000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index 82b07077fecd7da6dda4d5cc8bcd50176be1aee0..6bc988364184b9a5707e4c3a7a99f4cdb87f470f 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
 seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
 
-seta _hud_panelorder "17 25 15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 25 15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha ""
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0.010000 0.950000"
+seta hud_panel_pickup_size "0.260000 0.030000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index 3d93b90b38e538724a51ee64d391acb66d3517d8..c798b7564c527d35f4fb29c65cf6174ee703f0b2 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
 seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
 
-seta _hud_panelorder "17 10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 25 15 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 25 15 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -178,7 +178,7 @@ seta hud_panel_racetimer_bg_alpha ""
 seta hud_panel_racetimer_bg_border ""
 seta hud_panel_racetimer_bg_padding ""
 
-seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_pos "0.720000 0.890000"
 seta hud_panel_vote_size "0.170000 0.110000"
 seta hud_panel_vote_bg ""
 seta hud_panel_vote_bg_color ""
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha ""
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0 0.960000"
+seta hud_panel_pickup_size "0.270000 0.030000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index c1a69a88ca192f5affc15999e4cbdc6b3ee39114..7532b807f3081a9f3c7794a9e909365b0742c8fc 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
 seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
 
-seta _hud_panelorder "17 25 15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 25 15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -178,7 +178,7 @@ seta hud_panel_racetimer_bg_alpha ""
 seta hud_panel_racetimer_bg_border ""
 seta hud_panel_racetimer_bg_padding ""
 
-seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_pos "0.720000 0.890000"
 seta hud_panel_vote_size "0.170000 0.110000"
 seta hud_panel_vote_bg ""
 seta hud_panel_vote_bg_color ""
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha ""
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0 0.960000"
+seta hud_panel_pickup_size "0.270000 0.030000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index f0842bc640a3e4d97913886c3031f9cb51dc9607..80ab470df64411161bb78761cbc08ff6785da37d 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
 seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
 
-seta _hud_panelorder "17 25 15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 25 15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha ""
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0.700000 0.940000"
+seta hud_panel_pickup_size "0.260000 0.040000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index 2b035c8a4eccc1b9b25ab3441b4d1c2a151c0844..2b8fe146577715ec77f3286ef4bf3bb9ca37b268 100644 (file)
@@ -30,7 +30,7 @@ seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
 seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
 
-seta _hud_panelorder "17 25 15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 18 23 19 20 21 22 24 "
+seta _hud_panelorder "17 25 15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 18 23 19 20 21 22 24 25 26 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -211,7 +211,7 @@ seta hud_panel_pressedkeys_bg_padding ""
 seta hud_panel_pressedkeys_aspect "1.8"
 seta hud_panel_pressedkeys_attack "0"
 
-seta hud_panel_chat_pos "0 0.760000"
+seta hud_panel_chat_pos "0 0.730000"
 seta hud_panel_chat_size "0.420000 0.130000"
 seta hud_panel_chat_bg "0"
 seta hud_panel_chat_bg_color ""
@@ -382,4 +382,13 @@ seta hud_panel_strafehud_bg_alpha ""
 seta hud_panel_strafehud_bg_border ""
 seta hud_panel_strafehud_bg_padding ""
 
+seta hud_panel_pickup_pos "0.010000 0.860000"
+seta hud_panel_pickup_size "0.330000 0.030000"
+seta hud_panel_pickup_bg "0"
+seta hud_panel_pickup_bg_color ""
+seta hud_panel_pickup_bg_color_team ""
+seta hud_panel_pickup_bg_alpha "1"
+seta hud_panel_pickup_bg_border ""
+seta hud_panel_pickup_bg_padding ""
+
 menu_sync
index d1c9fb2f5eeadf40824caed5493d6d1c59fd9d7f..40cad15e1eab835827732f39a5e0d4fc770357ea 100644 (file)
@@ -16,7 +16,6 @@ ro    "Romanian" "Romana" 68%
 fi    "Finnish" "Suomi" 99%
 sv    "Swedish" "Svenska" 99%
 tr    "Turkish" "Türkçe" 51%
-zh_HK "zh_HK" "zh_HK" 100%
 cs    "Czech" "Čeština" 31%
 el    "Greek" "Ελληνική" 44%
 be    "Belarusian" "Беларуская" 50%
@@ -24,7 +23,8 @@ bg    "Bulgarian" "Български" 66%
 ru    "Russian" "Русский" 100%
 sr    "Serbian" "Српски" 59%
 uk    "Ukrainian" "Українська" 50%
-zh_CN "Chinese (China)" "中文" 100%
-zh_TW "Chinese (Taiwan)" "國語" 100%
+zh_TW "Chinese (Taiwan)" "中文(正體字)" 100%
+zh_CN "Chinese (China)" "中文(简体字)" 100%
+zh_HK "Chinese (Hong Kong)" "中文(香港字)" 100%
 ja_JP "Japanese" "日本語" 99%
 ko    "Korean" "한국의" 35%
index 399079741755b46dd93a0029ceb24b5a8f565995..16e583c7fbe524269a4014846a8b45c64f4f9dd1 100644 (file)
Binary files a/models/weapons/v_akordeon.md3 and b/models/weapons/v_akordeon.md3 differ
index 18fbf7489035b48c291686663142d718c2376058..3015329669e16795dae5d80caa6ab2ffa71f9ef5 100644 (file)
Binary files a/models/weapons/v_fireball.md3 and b/models/weapons/v_fireball.md3 differ
index b42affbb465d8f39f3484dd5178ee2c1135a8c1b..5036b0cc4ad71b0ad885063b5e2ffc8f8b347b59 100644 (file)
Binary files a/models/weapons/v_kleinbottle.md3 and b/models/weapons/v_kleinbottle.md3 differ
index 4cafdd10ffe3bd9acb4e910b119ba4a17e7418f8..bb67413fe6e56aa35ba78a5c5d24c9f6441d10f8 100644 (file)
Binary files a/models/weapons/v_nex.md3 and b/models/weapons/v_nex.md3 differ
index 534e616aca9d58c9b9ad090550e9c4fe47b50132..a243610583b01bd80335257ecf7672118a3b20c1 100644 (file)
Binary files a/models/weapons/v_rl.md3 and b/models/weapons/v_rl.md3 differ
index 910b2271ff54a601a553b0bfc840f5087c52b3ca..8f7914aa8af00b08cf1fd963c1a683fc755bdcf8 100644 (file)
Binary files a/models/weapons/v_tuba.md3 and b/models/weapons/v_tuba.md3 differ
index 3f94f96319e05a1452863c5380e46d6ebfc2eaf6..94e25eb47d422eb1eb1eba6cd42ff751966746f8 100644 (file)
@@ -52,7 +52,6 @@ set g_monster_mage_heal_allies 20
 set g_monster_mage_heal_delay 1.5
 set g_monster_mage_heal_minhealth 250
 set g_monster_mage_heal_range 250
-set g_monster_mage_heal_self 40
 set g_monster_mage_health 400
 set g_monster_mage_shield_blockpercent 0.8
 set g_monster_mage_shield_delay 7
index 463dcd402da61fdc8317108e327f8f1b30f51d71..0eb81916cec1562540c718b4589fb0a2c7dd640d 100644 (file)
@@ -121,6 +121,7 @@ int ts_primary, ts_secondary;
 float weapontime;
 float weaponprevtime;
 
+float timer;
 float teamnagger;
 
 int hudShiftState;
@@ -274,6 +275,7 @@ REGISTER_HUD_PANEL(ITEMSTIME,       HUD_ItemsTime,      PANEL_CONFIG_MAIN | PANE
 REGISTER_HUD_PANEL(QUICKMENU,       HUD_QuickMenu,      PANEL_CONFIG_MAIN                        , PANEL_SHOW_MAINGAME | PANEL_SHOW_MINIGAME                                          ) // QUICKMENU
 REGISTER_HUD_PANEL(SCOREBOARD,      Scoreboard_Draw,    PANEL_CONFIG_NO                          , PANEL_SHOW_MAINGAME | PANEL_SHOW_MINIGAME | PANEL_SHOW_MAPVOTE | PANEL_SHOW_WITH_SB) // SCOREBOARD
 REGISTER_HUD_PANEL(STRAFEHUD,       HUD_StrafeHUD,      PANEL_CONFIG_MAIN | PANEL_CONFIG_CANBEOFF, PANEL_SHOW_MAINGAME                                                                ) // STRAFEHUD
+REGISTER_HUD_PANEL(PICKUP,          HUD_Pickup,         PANEL_CONFIG_MAIN | PANEL_CONFIG_CANBEOFF, PANEL_SHOW_MAINGAME                                                                ) // PICKUP
 // always add new panels to the end of list
 
 // Because calling lots of functions in QC apparently cuts fps in half on many machines:
index 68e368ed13cb0c9dad0227073710fe0f885c7c57..9f6c7fb5c4e9dd63322a07ee3be2cc5b73c6df88 100644 (file)
@@ -9,6 +9,7 @@
 #include <client/hud/panel/modicons.qc>
 #include <client/hud/panel/notify.qc>
 #include <client/hud/panel/physics.qc>
+#include <client/hud/panel/pickup.qc>
 #include <client/hud/panel/powerups.qc>
 #include <client/hud/panel/pressedkeys.qc>
 #include <client/hud/panel/quickmenu.qc>
index 1b45f0cd042a5be7fa4b42483c1e08039c04f636..4f901379e8e46618242acd1aba3a6a614002a24e 100644 (file)
@@ -9,6 +9,7 @@
 #include <client/hud/panel/modicons.qh>
 #include <client/hud/panel/notify.qh>
 #include <client/hud/panel/physics.qh>
+#include <client/hud/panel/pickup.qh>
 #include <client/hud/panel/powerups.qh>
 #include <client/hud/panel/pressedkeys.qh>
 #include <client/hud/panel/quickmenu.qh>
index 0cc1f23956aa417f554c186183ff2f0438d6f53d..1f748d5427f7129c98b74765baddd6d4ff4fdfc7 100644 (file)
@@ -218,16 +218,13 @@ void HUD_Ammo()
        else
        {
                row = column = 0;
-               // disabling new-style loop for now to restore original order of ammo types
-               //FOREACH(Resources, it.instanceOfAmmoResource && !it.m_hidden,
-               for(int j = 0; j < AMMO_COUNT; ++j)
+               IL_EACH(default_order_resources, it.instanceOfAmmoResource && !it.m_hidden,
                {
-                       Resource ammotype = GetAmmoTypeFromNum(j);
                        DrawAmmoItem(
                                pos + vec2(column * (ammo_size.x + offset.x), row * (ammo_size.y + offset.y)),
                                ammo_size,
-                               ammotype,
-                               (wep.ammo_type == ammotype),
+                               it,
+                               (wep.ammo_type == it),
                                infinite_ammo
                        );
 
@@ -237,7 +234,7 @@ void HUD_Ammo()
                                row = 0;
                                column = column + 1;
                        }
-               }
+               });
        }
 
        if (draw_nades)
diff --git a/qcsrc/client/hud/panel/pickup.qc b/qcsrc/client/hud/panel/pickup.qc
new file mode 100644 (file)
index 0000000..1858931
--- /dev/null
@@ -0,0 +1,105 @@
+#include "pickup.qh"
+
+#include <client/draw.qh>
+#include <client/hud/hud.qh>
+#include <client/hud/panel/timer.qh>
+#include <common/items/inventory.qh>
+
+// Pickup (#26)
+
+void HUD_Pickup_Export(int fh)
+{
+       // allow saving cvars that aesthetically change the panel into hud skin files
+}
+
+void Pickup_Update(entity it, int count)
+{
+       if(last_pickup_item != it || time - STAT(LAST_PICKUP) > autocvar_hud_panel_pickup_time)
+               last_pickup_count = 0;
+       last_pickup_item = it;
+       last_pickup_count += count;
+}
+
+float HUD_Pickup_Time(float t)
+{
+       float timelimit = (warmup_stage ? STAT(WARMUP_TIMELIMIT) : STAT(TIMELIMIT) * 60);
+
+       if(autocvar_hud_panel_timer_increment || timelimit <= 0)
+               return floor(t - STAT(GAMESTARTTIME));
+       else
+               return ceil(timelimit + STAT(GAMESTARTTIME) - t);
+}
+
+void HUD_Pickup()
+{
+       if(!autocvar_hud_panel_pickup) return;
+
+       HUD_Panel_LoadCvars();
+       vector pos, mySize;
+       pos = panel_pos;
+       mySize = panel_size;
+
+       if (autocvar_hud_panel_pickup_dynamichud)
+               HUD_Scale_Enable();
+       else
+               HUD_Scale_Disable();
+       HUD_Panel_DrawBg();
+       if(panel_bg_padding)
+       {
+               pos += '1 1 0' * panel_bg_padding;
+               mySize -= '2 2 0' * panel_bg_padding;
+       }
+
+       float last_pickup_time = STAT(LAST_PICKUP);
+       float display_time = min(5, autocvar_hud_panel_pickup_time);
+       entity it = last_pickup_item;
+
+       if((last_pickup_time && last_pickup_time > time - display_time && it) || autocvar__hud_configure) {
+               string str_timer, str_name, icon;
+               vector sz, sz2;
+               vector fontsize = '1 1 0' * mySize.y;
+               vector iconsize = fontsize * autocvar_hud_panel_pickup_iconsize;
+
+               if(autocvar__hud_configure)
+                       icon = strcat(hud_skin_path, "/armor_mega");
+               else
+                       icon = strcat(hud_skin_path, "/", ((it.model2) ? it.model2 : it.m_icon));
+
+               sz = draw_getimagesize(icon);
+               sz2 = vec2(iconsize.y*(sz.x/sz.y), iconsize.y);
+               if(autocvar__hud_configure)
+                       str_name = "Mega armor";
+               else
+                       str_name = ((last_pickup_count > 1) ? sprintf("%s (x%d)", it.m_name, last_pickup_count) : it.m_name);
+
+               float a;
+               float fade_out_time = min(display_time, autocvar_hud_panel_pickup_fade_out);
+
+               if(autocvar__hud_configure)
+                       a = 1;
+               else if(time < last_pickup_time + display_time - fade_out_time)
+                       a = 1;
+               else
+                       a = (last_pickup_time + display_time - time) / fade_out_time;
+
+               if(autocvar_hud_panel_pickup_showtimer) {
+                       // 1 will show the timer always
+                       // 2 will show the timer only if spectating
+                       // forbid serverflag will force the 2nd behavior
+                       if((autocvar_hud_panel_pickup_showtimer == 1 && !(serverflags & SERVERFLAG_FORBID_PICKUPTIMER)) || spectatee_status)
+                       {
+                               if(autocvar__hud_configure)
+                                       str_timer = "13:02";
+                               else
+                                       str_timer = seconds_tostring(HUD_Pickup_Time(last_pickup_time));
+                               drawstring(pos, str_timer, fontsize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+                               pos.x += stringwidth(str_timer, false, fontsize) + fontsize.x * 0.25;
+                       }
+               }
+
+               drawpic(pos - eY * ((iconsize.y - fontsize.y) / 2), icon, sz2, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               pos.x += sz2.x + fontsize.x * 0.25;
+               str_name = textShortenToWidth(str_name, mySize.x - (pos.x - panel_pos.x), fontsize, stringwidth_nocolors);
+               drawstring(pos, str_name, fontsize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+       }
+}
diff --git a/qcsrc/client/hud/panel/pickup.qh b/qcsrc/client/hud/panel/pickup.qh
new file mode 100644 (file)
index 0000000..503308d
--- /dev/null
@@ -0,0 +1,14 @@
+#pragma once
+#include "../panel.qh"
+
+bool autocvar_hud_panel_pickup;
+bool autocvar_hud_panel_pickup_dynamichud = true;
+int autocvar_hud_panel_pickup_showtimer = 1;
+float autocvar_hud_panel_pickup_iconsize = 1.5;
+float autocvar_hud_panel_pickup_time = 3;
+float autocvar_hud_panel_pickup_fade_out = 0.15;
+
+entity last_pickup_item;
+int last_pickup_count;
+
+void Pickup_Update(entity it, int count);
index 00a231b7cf44607d70fd56e338784f2fe3fdbdb5..aa0c73b5bf90c4d08ea4e37d0d49cdb7f1ab460e 100644 (file)
@@ -62,8 +62,8 @@ void HUD_Timer()
                mySize -= '2 2 0' * panel_bg_padding;
        }
 
-       string timer;
-       string subtimer = string_null;
+       string timer_str = string_null;
+       string subtimer_str = string_null;
        string subtext = string_null;
        float curtime, timelimit, timeleft;
        vector timer_size, subtext_size, subtimer_size;
@@ -73,10 +73,7 @@ void HUD_Timer()
 
        // Use real or frozen time and get the time limit
        curtime = (intermission_time ? intermission_time : time);
-       if(warmup_stage)
-               timelimit = STAT(WARMUP_TIMELIMIT);
-       else
-               timelimit = STAT(TIMELIMIT) * 60;
+       timelimit = (warmup_stage ? STAT(WARMUP_TIMELIMIT) : STAT(TIMELIMIT) * 60);
 
        // Calculate time left
        timeleft = HUD_Timer_TimeLeft(curtime, STAT(GAMESTARTTIME), timelimit);
@@ -87,16 +84,16 @@ void HUD_Timer()
 
        // Timer text
        if (autocvar_hud_panel_timer_increment || timelimit <= 0)
-               timer = seconds_tostring(HUD_Timer_TimeElapsed(curtime, STAT(GAMESTARTTIME)));
+               timer = HUD_Timer_TimeElapsed(curtime, STAT(GAMESTARTTIME));
        else
-               timer = seconds_tostring(timeleft);
+               timer = timeleft;
 
        // Secondary timer for round-based game modes
        if(STAT(ROUNDSTARTTIME) && autocvar_hud_panel_timer_secondary)
        {
                if(STAT(ROUNDSTARTTIME) == -1) {
                        // Round can't start
-                       subtimer = "--:--";
+                       subtimer_str = "--:--";
                        subtimer_color = '1 0 0';
                } else {
                        float round_curtime, round_timelimit, round_timeleft;
@@ -114,9 +111,9 @@ void HUD_Timer()
 
                        // Subtimer text
                        if (autocvar_hud_panel_timer_increment || round_timelimit <= 0)
-                               subtimer = seconds_tostring(HUD_Timer_TimeElapsed(round_curtime, STAT(ROUNDSTARTTIME)));
+                               subtimer_str = seconds_tostring(HUD_Timer_TimeElapsed(round_curtime, STAT(ROUNDSTARTTIME)));
                        else
-                               subtimer = seconds_tostring(round_timeleft);
+                               subtimer_str = seconds_tostring(round_timeleft);
                }
        }
 
@@ -142,17 +139,18 @@ void HUD_Timer()
        subtext_size  = vec2(mySize.x, mySize.y / 3);
        timer_size    = vec2(mySize.x, mySize.y - subtext_size.y);
        subtimer_size = vec2(mySize.x / 3, mySize.y - subtext_size.y);
+       timer_str     = seconds_tostring(timer);
 
        panel_size.y -= subtext_size.y;
        HUD_Panel_DrawBg();
 
-       if(subtimer) {
+       if(subtimer_str) {
                float subtimer_padding = subtimer_size.y / 5;
                timer_size.x -= subtimer_size.x;
-               drawstring_aspect(pos + eX * timer_size.x + eY * subtimer_padding, (swap ? timer : subtimer), subtimer_size - eY * subtimer_padding * 2, (swap ? timer_color : subtimer_color), panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawstring_aspect(pos + eX * timer_size.x + eY * subtimer_padding, (swap ? timer_str : subtimer_str), subtimer_size - eY * subtimer_padding * 2, (swap ? timer_color : subtimer_color), panel_fg_alpha, DRAWFLAG_NORMAL);
        }
 
-       drawstring_aspect(pos, (swap ? subtimer : timer), timer_size, (swap ? subtimer_color : timer_color), panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawstring_aspect(pos, (swap ? subtimer_str : timer_str), timer_size, (swap ? subtimer_color : timer_color), panel_fg_alpha, DRAWFLAG_NORMAL);
 
        if(subtext)
                drawstring_aspect(pos + eY * timer_size.y, subtext, subtext_size, '0 1 0', panel_fg_alpha, DRAWFLAG_NORMAL);
index 9c610aabca53484a66ec502772e79dc483336010..4e05e681db3d48d8c37276dfe4339e4e895fcd9e 100644 (file)
@@ -526,7 +526,7 @@ float CSQC_InputEvent(int bInputType, float nPrimary, float nSecondary)
                        Scoreboard_UI_Enable(0);
                        return true;
                }
-               if (!isdemo() && cvar("_menu_gamemenu_dialog_available"))
+               if (autocvar_menu_gamemenu && !isdemo() && cvar("_menu_gamemenu_dialog_available"))
                {
                        localcmd("\nmenu_showgamemenudialog\n");
                        return true;
index 00dd149638de748bb50cf927b89ec9e20a2c5f92..1f9e6a9a03e5aa1f78ef13dd78a8de13b79853ca 100644 (file)
@@ -20,6 +20,7 @@ bool autocvar_developer_csqcentities;
 bool autocvar_cl_race_cptimes_onlyself; // TODO: move to race gamemode
 bool autocvar_cl_race_cptimes_showself = false;
 bool autocvar_cl_welcome = true;
+bool autocvar_menu_gamemenu = true;
 
 // Map coordinate base calculations need these
 vector mi_center;
index 8f919b556ca7d90d54c430cd25d20f758e28588f..a9ad0a76bd7e612d58fdeaafa49a40cc27d8fa66 100644 (file)
@@ -269,7 +269,6 @@ void viewmodel_animate(entity this)
                this.origin += bobmodel_ofs(view);
 }
 
-.vector viewmodel_origin, viewmodel_angles;
 .float weapon_nextthink;
 .float weapon_eta_last;
 .float weapon_switchdelay;
@@ -278,8 +277,6 @@ void viewmodel_animate(entity this)
 
 void viewmodel_draw(entity this)
 {
-       if(!this.activeweapon || !autocvar_r_drawviewmodel)
-               return;
        int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL;
        float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha);
        int wepskin = this.m_skin;
@@ -313,8 +310,7 @@ void viewmodel_draw(entity this)
                {
                        this.name_last = name;
                        CL_WeaponEntity_SetModel(this, name, swap);
-                       this.viewmodel_origin = this.origin;
-                       this.viewmodel_angles = this.angles;
+                       this.origin += autocvar_cl_gunoffset;
                }
                anim_update(this);
                if ((!this.animstate_override && !this.animstate_looping) || time > this.animstate_endtime)
@@ -343,8 +339,6 @@ void viewmodel_draw(entity this)
                }
        }
        this.weapon_eta_last = f;
-       this.origin = this.viewmodel_origin;
-       this.angles = this.viewmodel_angles;
        this.angles_x = (-90 * f * f);
        viewmodel_animate(this);
        MUTATOR_CALLHOOK(DrawViewModel, this);
@@ -917,6 +911,7 @@ void HUD_Draw(entity this)
        UpdateDamage();
        HUD_Crosshair(this);
        HitSound();
+       Local_Notification_Queue_Process();
 }
 
 void ViewLocation_Mouse()
@@ -1608,8 +1603,10 @@ void CSQC_UpdateView(entity this, float w, float h)
 
        // run viewmodel_draw before updating view_angles to the angles calculated by WarpZone_FixView
        // viewmodel_draw needs to use the view_angles set by the engine on every CSQC_UpdateView call
-       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-               viewmodel_draw(viewmodels[slot]);
+       if(autocvar_r_drawviewmodel)
+               for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+                       if(viewmodels[slot].activeweapon)
+                               viewmodel_draw(viewmodels[slot]);
 
        // Render the Scene
        view_origin = getpropertyvec(VF_ORIGIN);
index 45959383bdf38c893dc30abad243237c01629e79..cd33ebfb6a1201e41f9caa706209c1cc2fcb3d92 100644 (file)
@@ -92,6 +92,7 @@ vector autocvar_cl_eventchase_viewoffset = '0 0 20';
 string autocvar__togglezoom;
 int autocvar_cl_nade_timer;
 bool autocvar_r_drawviewmodel;
+vector autocvar_cl_gunoffset;
 
 void calc_followmodel_ofs(entity view);
 
index a60a9de13ff0a6275a2b548aafcf785b052e2dcd..e0c17a7a128a0e623be23e7048a6afd4bec0e108 100644 (file)
@@ -17,6 +17,7 @@ const int SERVERFLAG_ALLOW_FULLBRIGHT = BIT(0);
 const int SERVERFLAG_TEAMPLAY = BIT(1);
 const int SERVERFLAG_PLAYERSTATS = BIT(2);
 const int SERVERFLAG_PLAYERSTATS_CUSTOM = BIT(3);
+const int SERVERFLAG_FORBID_PICKUPTIMER = BIT(4);
 
 const int SPECIES_HUMAN = 0;
 const int SPECIES_ROBOT_SOLID = 1;
index c0c7f5ac98d41bc95cb90948d4234f84c007f6dc..b49ff60faceaccb3b46a88cde7ad1825907c684c 100644 (file)
@@ -14,7 +14,7 @@ REPLICATE(cvar_cl_casings, bool, "cl_casings");
 REPLICATE(cvar_r_drawviewmodel, int, "r_drawviewmodel");
 
 #ifdef SVQC
-void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, int casingtype, entity casingowner, .entity weaponentity)
+void SpawnCasing(vector vel, vector ang, int casingtype, entity casingowner, .entity weaponentity)
 {
        vector org = casingowner.(weaponentity).spawnorigin;
        org = casingowner.origin + casingowner.view_ofs + org.x * v_forward - org.y * v_right + org.z * v_up;
@@ -22,10 +22,20 @@ void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float ran
        FOREACH_CLIENT(true, {
                if (!(CS_CVAR(it).cvar_cl_casings))
                        continue;
-               if (it == casingowner && !(CS_CVAR(it).cvar_r_drawviewmodel))
+
+               casingtype &= 0x3F; // reset any bitflags that were set for the previous client
+
+               if (it == casingowner || (IS_SPEC(it) && it.enemy == casingowner))
+               {
+                       if (!(CS_CVAR(it).cvar_r_drawviewmodel))
+                               continue;
+
+                       casingtype |= 0x40; // client will apply autocvar_cl_gunoffset in first person
+               }
+               else if (1 & ~checkpvs(it.origin + it.view_ofs, casingowner)) // 1 or 3 means visible
                        continue;
 
-               msg_entity = it;
+               msg_entity = it; // sound_allowed checks this
                if (!sound_allowed(MSG_ONE, it))
                        casingtype |= 0x80; // silent
 
@@ -35,7 +45,7 @@ void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float ran
                WriteShort(MSG_ONE, compressShortVector(vel)); // actually compressed velocity
                WriteByte(MSG_ONE, ang.x * 256 / 360);
                WriteByte(MSG_ONE, ang.y * 256 / 360);
-               WriteByte(MSG_ONE, ang.z * 256 / 360);
+               // weapons only have pitch and yaw, so no need to send ang.z
        });
 }
 #endif
@@ -47,6 +57,7 @@ classfield(Casing) .bool silent;
 classfield(Casing) .int state;
 classfield(Casing) .float cnt;
 
+// this is only needed because LimitedChildrenRubble() takes a func pointer
 void Casing_Delete(entity this)
 {
     delete(this);
@@ -66,14 +77,24 @@ void Casing_Draw(entity this)
 
     if (this.alpha < ALPHA_MIN_VISIBLE)
     {
-        Casing_Delete(this);
+        delete(this);
         this.drawmask = 0;
         return;
     }
 
+    trace_startsolid = 0; // due to cl_casings_ticrate, traces are not always performed
     Movetype_Physics_MatchTicrate(this, autocvar_cl_casings_ticrate, autocvar_cl_casings_sloppy);
     //if (wasfreed(this))
     //    return; // deleted by touch function
+
+    // prevent glitchy casings when the gun model is poking into a wall
+    // doing this here is cheaper than doing it on the server as the client performs the trace anyway
+    if (trace_startsolid)
+    {
+        delete(this);
+        this.drawmask = 0;
+        return;
+    }
 }
 
 SOUND(BRASS1, W_Sound("brass1"));
@@ -93,7 +114,7 @@ void Casing_Touch(entity this, entity toucher)
 {
     if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
     {
-        Casing_Delete(this);
+        delete(this);
         return;
     }
 
@@ -133,30 +154,30 @@ void Casing_Damage(entity this, float thisdmg, int hittype, vector org, vector t
 
 NET_HANDLE(casings, bool isNew)
 {
-    int _state = ReadByte();
-    vector org = ReadVector();
-    vector vel = decompressShortVector(ReadShort());
-    vector ang;
-    ang_x = ReadByte() * 360 / 256;
-    ang_y = ReadByte() * 360 / 256;
-    ang_z = ReadByte() * 360 / 256;
+    Casing casing = ListNewChildRubble(CasingsNGibs, new(casing));
+
+    casing.state = ReadByte();
+    casing.origin = ReadVector();
+    casing.velocity = decompressShortVector(ReadShort());
+    casing.angles_x = ReadByte() * 360 / 256;
+    casing.angles_y = ReadByte() * 360 / 256;
+
     return = true;
 
-    Casing casing = ListNewChildRubble(CasingsNGibs, new(casing));
-    casing.silent = (_state & 0x80);
-    casing.state = (_state & 0x7F);
-    casing.origin = org;
+    casing.silent = casing.state & 0x80;
+    if (casing.state & 0x40 && !autocvar_chase_active)
+        casing.origin += autocvar_cl_gunoffset.x * v_forward
+                       - autocvar_cl_gunoffset.y * v_right
+                       + autocvar_cl_gunoffset.z * v_up;
+    casing.state &= 0x3F; // the 2 most significant bits are reserved for the silent and casingowner bitflags
+
     setorigin(casing, casing.origin);
-    casing.velocity = vel;
-    casing.angles = ang;
     casing.drawmask = MASK_NORMAL;
-
     casing.draw = Casing_Draw;
     if (isNew) IL_PUSH(g_drawables, casing);
-    casing.velocity = casing.velocity + 2 * prandomvec();
-    casing.avelocity = '0 250 0' + 100 * prandomvec();
+    casing.velocity += 2 * prandomvec();
+    casing.avelocity = '0 10 0' + 100 * prandomvec();
     set_movetype(casing, MOVETYPE_BOUNCE);
-    casing.bouncefactor = 0.25;
     settouch(casing, Casing_Touch);
     casing.move_time = time;
     casing.event_damage = Casing_Damage;
@@ -166,16 +187,16 @@ NET_HANDLE(casings, bool isNew)
     {
         case 1:
             setmodel(casing, MDL_CASING_SHELL);
+            casing.bouncefactor = 0.25;
             casing.cnt = time + autocvar_cl_casings_shell_time;
             break;
         default:
             setmodel(casing, MDL_CASING_BULLET);
+            casing.bouncefactor = 0.5;
             casing.cnt = time + autocvar_cl_casings_bronze_time;
             break;
     }
 
-    setsize(casing, '0 0 -1', '0 0 -1');
-
     LimitedChildrenRubble(CasingsNGibs, "casing", autocvar_cl_casings_maxcount, Casing_Delete, NULL);
 }
 
index f4884cb233d5424bbede9027db792c7137025185..5e2c0a5ecf2788e9ed8e4bc83e8c522b6b3d981b 100644 (file)
@@ -5,7 +5,7 @@ float autocvar_cl_casings_bronze_time;
 int autocvar_cl_casings_maxcount = 100;
 float autocvar_cl_casings_shell_time;
 bool autocvar_cl_casings_sloppy = 1;
-float autocvar_cl_casings_ticrate = 0.1;
+float autocvar_cl_casings_ticrate;
 #endif
 
 #ifdef GAMEQC
@@ -16,5 +16,5 @@ REPLICATE_INIT(int, cvar_r_drawviewmodel);
 #ifdef SVQC
 int autocvar_g_casings;
 
-void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, int casingtype, entity casingowner, .entity weaponentity);
+void SpawnCasing(vector vel, vector ang, int casingtype, entity casingowner, .entity weaponentity);
 #endif
index 5f3cf9d43b3fd32979fc245e41d3ba66ca49d7c8..cb58a055c5dfcf2328479fcdc0ef13ce300c2452 100644 (file)
@@ -13,12 +13,12 @@ bool Damage_DamageInfo_SendEntity(entity this, entity to, int sf)
        WriteByte(MSG_ENTITY, bound(1, this.dmg, 255));
        WriteByte(MSG_ENTITY, bound(0, this.dmg_radius, 255));
        WriteByte(MSG_ENTITY, bound(1, this.dmg_edge, 255));
-       WriteShort(MSG_ENTITY, this.oldorigin.x);
+       WriteVector(MSG_ENTITY, this.velocity);
        WriteByte(MSG_ENTITY, this.species);
        return true;
 }
 
-void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)
+void Damage_DamageInfo(vector org, bool is_solid_hit, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)
 {
        // TODO maybe call this from non-edgedamage too?
        // TODO maybe make the client do the particle effects for the weapons and the impact sounds using this info?
@@ -38,8 +38,9 @@ void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad
        e.dmg_radius = rad;
        e.dmg_force = vlen(force);
        e.velocity = force;
-       e.oldorigin_x = compressShortVector(e.velocity);
        e.species = bloodtype;
+       if(is_solid_hit)
+               e.species |= 0x80;
 
        Net_LinkEntity(e, false, 0.2, Damage_DamageInfo_SendEntity);
 }
@@ -192,8 +193,10 @@ NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
        thedamage = ReadByte();
        rad = ReadByte();
        edge = ReadByte();
-       force = decompressShortVector(ReadShort());
+       force = ReadVector();
        species = ReadByte();
+       bool is_solid_hit = (species & 0x80);
+       species = (species & 0x7F);
 
        return = true;
 
@@ -397,11 +400,16 @@ NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
                w_random = prandom();
 
                vector force_dir = normalize(force);
-               traceline(w_org - force_dir * 16, w_org + force_dir * 16, MOVE_NOMONSTERS, NULL);
-               if(trace_fraction < 1 && !(hitwep.spawnflags & WEP_TYPE_HITSCAN))
-                       w_backoff = trace_plane_normal;
-               else
+               if (is_solid_hit) // traceline not needed
                        w_backoff = -force_dir;
+               else
+               {
+                       traceline(w_org - force_dir * 16, w_org + force_dir * 16, MOVE_NOMONSTERS, NULL);
+                       if(trace_fraction < 1 && !(hitwep.spawnflags & WEP_TYPE_HITSCAN))
+                               w_backoff = trace_plane_normal;
+                       else
+                               w_backoff = -force_dir;
+               }
                setorigin(this, w_org + w_backoff * 2); // for sound() calls
 
                if(!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY))
index a1e1c59900ba4ac5ac435e8dcdc73d431f0bc57a..91952b2d15746ce085923c62007e35213717722d 100644 (file)
@@ -356,6 +356,7 @@ void ctf_Handle_Drop(entity flag, entity player, int droptype)
        flag.angles = '0 0 0';
        SetResourceExplicit(flag, RES_HEALTH, flag.max_health);
        flag.ctf_droptime = time;
+       flag.ctf_landtime = 0;
        flag.ctf_dropper = player;
        flag.ctf_status = FLAG_DROPPED;
 
@@ -473,6 +474,7 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype)
        flag.solid = SOLID_TRIGGER;
        flag.ctf_dropper = player;
        flag.ctf_droptime = time;
+       flag.ctf_landtime = 0;
 
        flag.flags = FL_ITEM | FL_NOTARGET; // clear FL_ONGROUND for MOVETYPE_TOSS
 
@@ -949,7 +951,7 @@ void ctf_FlagThink(entity this)
                                for(tmp_entity = ctf_worldflaglist; tmp_entity; tmp_entity = tmp_entity.ctf_worldflagnext)
                                        if(tmp_entity.ctf_status == FLAG_DROPPED)
                                        if(vdist(this.origin - tmp_entity.origin, <, autocvar_g_ctf_dropped_capture_radius))
-                                       if(time > tmp_entity.ctf_droptime + autocvar_g_ctf_dropped_capture_delay)
+                                       if((this.noalign || tmp_entity.ctf_landtime) && time > ((this.noalign) ? tmp_entity.ctf_droptime : tmp_entity.ctf_landtime) + autocvar_g_ctf_dropped_capture_delay)
                                                ctf_Handle_Capture(this, tmp_entity, CAPTURE_DROPPED);
                        }
                        return;
@@ -958,6 +960,8 @@ void ctf_FlagThink(entity this)
                case FLAG_DROPPED:
                {
                        this.angles = '0 0 0'; // reset flag angles in case warpzones adjust it
+                       if(IS_ONGROUND(this) && !this.ctf_landtime)
+                               this.ctf_landtime = time; // landtime is reset when thrown, and we don't want to restart the timer if the flag is pushed
 
                        if(autocvar_g_ctf_flag_dropped_floatinwater)
                        {
@@ -1210,6 +1214,7 @@ void ctf_RespawnFlag(entity flag)
        flag.ctf_dropper = NULL;
        flag.ctf_pickuptime = 0;
        flag.ctf_droptime = 0;
+       flag.ctf_landtime = 0;
        flag.ctf_flagdamaged_byworld = false;
        navigation_dynamicgoal_unset(flag);
 
index 519cbd0648f49eaaaffceb7863fc4f2abea24ed2..adb061809fe053f56c36f763e31fb7195e0e3928 100644 (file)
@@ -135,6 +135,7 @@ bool ctf_stalemate; // indicates that a stalemate is active
 float ctf_captimerecord; // record time for capturing the flag
 .float ctf_pickuptime;
 .float ctf_droptime;
+.float ctf_landtime;
 .int ctf_status; // status of the flag (FLAG_BASE, FLAG_DROPPED, FLAG_CARRY declared globally)
 .entity ctf_dropper; // don't allow spam of dropping the flag
 .float next_take_time;
index 56de4a90cf86d9912b532331bfb7ce622996b2e8..0fbab7ae51f54159e1913b7fe723bd4795b77ed4 100644 (file)
@@ -12,6 +12,7 @@
 float autocvar_g_cts_finish_kill_delay;
 bool autocvar_g_cts_selfdamage;
 bool autocvar_g_cts_removeprojectiles;
+bool autocvar_g_cts_drop_monster_items;
 
 // legacy bot roles
 .float race_checkpoint;
@@ -284,6 +285,8 @@ MUTATOR_HOOKFUNCTION(cts, FilterItem)
 
        if (Item_IsLoot(item))
        {
+               if(item.monster_loot && autocvar_g_cts_drop_monster_items)
+                       return false;
                return true;
        }
 }
index 22a4d94c387335f833d0867f2acb1df01e776663..6f6ebdc452a9f768b2626fc5aecf00e9f054876c 100644 (file)
@@ -37,7 +37,10 @@ STATIC_INIT(Inventory)
 #endif
 
 #ifdef CSQC
+#include <client/hud/panel/pickup.qh>
+
 Inventory g_inventory;
+
 void Inventory_remove(entity this)
 {
     if(g_inventory == this)
@@ -63,11 +66,20 @@ NET_HANDLE(ENT_CLIENT_INVENTORY, bool isnew)
             .int fld = inv_items[it.m_id];
             int prev = this.(fld);
             int next = this.(fld) = ReadByte();
+
+            Pickup_Update(it, next - prev);
             LOG_DEBUGF("%s: %.0f -> %.0f", it.m_name, prev, next);
         }
     }
     return true;
 }
+
+NET_HANDLE(TE_CSQC_WEAPONPICKUP, bool isnew)
+{
+       const Weapon it = REGISTRY_GET(Weapons, ReadByte());
+       Pickup_Update(it, 1);
+       return true;
+}
 #endif
 
 #ifdef SVQC
index bf22a7e81d8b0dd6ca93fcf074c05e5c6ae59e63..179cc9a1d76df4878d167b3ad00a33ed48cbfb3f 100644 (file)
@@ -26,160 +26,172 @@ CLASS(Ammo, Pickup)
 ENDCLASS(Ammo)
 
 
+// NOTE: ammo resource registration order should match ammo (as item) registration order
+// see REGISTER_RESOURCE calls order
+
+// ammo type #1: shells
 #ifdef GAMEQC
-MODEL(Bullets_ITEM, Item_Model("a_bullets.mdl"));
+MODEL(Shells_ITEM, Item_Model("a_shells.md3"));
 #endif
 
 #ifdef SVQC
-PROPERTY(int, g_pickup_nails);
-void ammo_bullets_init(Pickup this, entity item)
+PROPERTY(int, g_pickup_shells);
+void ammo_shells_init(Pickup this, entity item)
 {
-    if(!GetResource(item, RES_BULLETS))
-        SetResourceExplicit(item, RES_BULLETS, g_pickup_nails);
+    if(!GetResource(item, RES_SHELLS))
+        SetResourceExplicit(item, RES_SHELLS, g_pickup_shells);
 }
 #endif
 
-CLASS(Bullets, Ammo)
-ENDCLASS(Bullets)
+CLASS(Shells, Ammo)
+ENDCLASS(Shells)
 
-REGISTER_ITEM(Bullets, Bullets) {
-    this.m_canonical_spawnfunc = "item_bullets";
+REGISTER_ITEM(Shells, Shells) {
+    this.m_canonical_spawnfunc = "item_shells";
 #ifdef GAMEQC
-       this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
-    this.m_model    =   MDL_Bullets_ITEM;
+    this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
+    this.m_model    = MDL_Shells_ITEM;
 #endif
-    this.netname    =   "bullets";
-    this.m_name     =   _("bullets");
-    this.m_icon     =   "ammo_bullets";
+    this.netname    = "shells";
+    this.m_name     = _("Shells");
+    this.m_icon     = "ammo_shells";
 #ifdef SVQC
-    this.m_botvalue =   1500;
-    this.m_itemid   =   IT_RESOURCE;
-    this.m_iteminit =   ammo_bullets_init;
+    this.m_botvalue = 1000;
+    this.m_itemid   = IT_RESOURCE;
+    this.m_iteminit = ammo_shells_init;
 #endif
 }
 
-SPAWNFUNC_ITEM(item_bullets, ITEM_Bullets)
+SPAWNFUNC_ITEM(item_shells, ITEM_Shells)
+
 
+// ammo type #2: bullets
 #ifdef GAMEQC
-MODEL(Cells_ITEM, Item_Model("a_cells.md3"));
+MODEL(Bullets_ITEM, Item_Model("a_bullets.mdl"));
 #endif
 
 #ifdef SVQC
-PROPERTY(int, g_pickup_cells);
-void ammo_cells_init(Pickup this, entity item)
+PROPERTY(int, g_pickup_nails);
+void ammo_bullets_init(Pickup this, entity item)
 {
-    if(!GetResource(item, RES_CELLS))
-        SetResourceExplicit(item, RES_CELLS, g_pickup_cells);
+    if(!GetResource(item, RES_BULLETS))
+        SetResourceExplicit(item, RES_BULLETS, g_pickup_nails);
 }
 #endif
-REGISTER_ITEM(Cells, Ammo) {
-    this.m_canonical_spawnfunc = "item_cells";
+
+CLASS(Bullets, Ammo)
+ENDCLASS(Bullets)
+
+REGISTER_ITEM(Bullets, Bullets) {
+    this.m_canonical_spawnfunc = "item_bullets";
 #ifdef GAMEQC
-       this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
-    this.m_model    =   MDL_Cells_ITEM;
+    this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
+    this.m_model    = MDL_Bullets_ITEM;
 #endif
-    this.netname    =   "cells";
-    this.m_name     =   _("cells");
-    this.m_icon     =   "ammo_cells";
+    this.netname    = "bullets";
+    this.m_name     = _("Bullets");
+    this.m_icon     = "ammo_bullets";
 #ifdef SVQC
-    this.m_botvalue =   1500;
-    this.m_itemid   =   IT_RESOURCE;
-    this.m_iteminit =   ammo_cells_init;
+    this.m_botvalue = 1500;
+    this.m_itemid   = IT_RESOURCE;
+    this.m_iteminit = ammo_bullets_init;
 #endif
 }
 
-SPAWNFUNC_ITEM(item_cells, ITEM_Cells)
+SPAWNFUNC_ITEM(item_bullets, ITEM_Bullets)
+
 
+// ammo type #3: rockets
 #ifdef GAMEQC
-MODEL(Plasma_ITEM, Item_Model("a_cells.md3"));
+MODEL(Rockets_ITEM, Item_Model("a_rockets.md3"));
 #endif
 
 #ifdef SVQC
-PROPERTY(int, g_pickup_plasma);
-void ammo_plasma_init(Pickup this, entity item)
+PROPERTY(int, g_pickup_rockets);
+void ammo_rockets_init(Pickup this, entity item)
 {
-    if(!GetResource(item, RES_PLASMA))
-        SetResourceExplicit(item, RES_PLASMA, g_pickup_plasma);
+    if(!GetResource(item, RES_ROCKETS))
+        SetResourceExplicit(item, RES_ROCKETS, g_pickup_rockets);
 }
 #endif
-REGISTER_ITEM(Plasma, Ammo) {
-    this.m_canonical_spawnfunc = "item_plasma";
+REGISTER_ITEM(Rockets, Ammo) {
+    this.m_canonical_spawnfunc = "item_rockets";
 #ifdef GAMEQC
-       this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
-    this.m_model    =   MDL_Plasma_ITEM;
+    this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
+    this.m_model    = MDL_Rockets_ITEM;
 #endif
-    this.netname    =   "plasma";
-    this.m_name     =   _("plasma");
-    this.m_icon     =   "ammo_plasma";
+    this.netname    = "rockets";
+    this.m_name     = _("Rockets");
+    this.m_icon     = "ammo_rockets";
 #ifdef SVQC
-    this.m_botvalue =   1500;
-    this.m_itemid   =   IT_RESOURCE;
-    this.m_iteminit =   ammo_plasma_init;
+    this.m_botvalue = 1500;
+    this.m_itemid   = IT_RESOURCE;
+    this.m_iteminit = ammo_rockets_init;
 #endif
 }
 
-SPAWNFUNC_ITEM(item_plasma, ITEM_Plasma)
+SPAWNFUNC_ITEM(item_rockets, ITEM_Rockets)
+
 
+// ammo type #4: cells
 #ifdef GAMEQC
-MODEL(Rockets_ITEM, Item_Model("a_rockets.md3"));
+MODEL(Cells_ITEM, Item_Model("a_cells.md3"));
 #endif
 
 #ifdef SVQC
-PROPERTY(int, g_pickup_rockets);
-void ammo_rockets_init(Pickup this, entity item)
+PROPERTY(int, g_pickup_cells);
+void ammo_cells_init(Pickup this, entity item)
 {
-    if(!GetResource(item, RES_ROCKETS))
-        SetResourceExplicit(item, RES_ROCKETS, g_pickup_rockets);
+    if(!GetResource(item, RES_CELLS))
+        SetResourceExplicit(item, RES_CELLS, g_pickup_cells);
 }
 #endif
-REGISTER_ITEM(Rockets, Ammo) {
-    this.m_canonical_spawnfunc = "item_rockets";
+REGISTER_ITEM(Cells, Ammo) {
+    this.m_canonical_spawnfunc = "item_cells";
 #ifdef GAMEQC
-       this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
-    this.m_model    =   MDL_Rockets_ITEM;
+    this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
+    this.m_model    = MDL_Cells_ITEM;
 #endif
-    this.netname    =   "rockets";
-    this.m_name     =   _("rockets");
-    this.m_icon     =   "ammo_rockets";
+    this.netname    = "cells";
+    this.m_name     = _("Cells");
+    this.m_icon     = "ammo_cells";
 #ifdef SVQC
-    this.m_botvalue =   1500;
-    this.m_itemid   =   IT_RESOURCE;
-    this.m_iteminit =   ammo_rockets_init;
+    this.m_botvalue = 1500;
+    this.m_itemid   = IT_RESOURCE;
+    this.m_iteminit = ammo_cells_init;
 #endif
 }
 
-SPAWNFUNC_ITEM(item_rockets, ITEM_Rockets)
+SPAWNFUNC_ITEM(item_cells, ITEM_Cells)
 
+
+// ammo type #5: plasma
 #ifdef GAMEQC
-MODEL(Shells_ITEM, Item_Model("a_shells.md3"));
+MODEL(Plasma_ITEM, Item_Model("a_cells.md3"));
 #endif
 
 #ifdef SVQC
-PROPERTY(int, g_pickup_shells);
-void ammo_shells_init(Pickup this, entity item)
+PROPERTY(int, g_pickup_plasma);
+void ammo_plasma_init(Pickup this, entity item)
 {
-    if(!GetResource(item, RES_SHELLS))
-        SetResourceExplicit(item, RES_SHELLS, g_pickup_shells);
+    if(!GetResource(item, RES_PLASMA))
+        SetResourceExplicit(item, RES_PLASMA, g_pickup_plasma);
 }
 #endif
-
-CLASS(Shells, Ammo)
-ENDCLASS(Shells)
-
-REGISTER_ITEM(Shells, Shells) {
-    this.m_canonical_spawnfunc = "item_shells";
+REGISTER_ITEM(Plasma, Ammo) {
+    this.m_canonical_spawnfunc = "item_plasma";
 #ifdef GAMEQC
-       this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
-    this.m_model    =   MDL_Shells_ITEM;
+    this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
+    this.m_model    = MDL_Plasma_ITEM;
 #endif
-    this.netname    =   "shells";
-    this.m_name     =   _("shells");
-    this.m_icon     =   "ammo_shells";
+    this.netname    = "plasma";
+    this.m_name     = _("Plasma");
+    this.m_icon     = "ammo_plasma";
 #ifdef SVQC
-    this.m_botvalue =   1000;
-    this.m_itemid   =   IT_RESOURCE;
-    this.m_iteminit =   ammo_shells_init;
+    this.m_botvalue = 1500;
+    this.m_itemid   = IT_RESOURCE;
+    this.m_iteminit = ammo_plasma_init;
 #endif
 }
 
-SPAWNFUNC_ITEM(item_shells, ITEM_Shells)
+SPAWNFUNC_ITEM(item_plasma, ITEM_Plasma)
index e9c5627c84dda6cb0799a42836ff9f5bcb79b682..0ece1bf32c93a81d1c012b771c5fa9af3cce0d17 100644 (file)
@@ -68,7 +68,7 @@ REGISTER_ITEM(JetpackFuel, Ammo) {
     this.m_model    =   MDL_JetpackFuel_ITEM;
 #endif
     this.netname    =   "fuel";
-    this.m_name     =   _("fuel");
+    this.m_name     =   _("Fuel");
     this.m_icon     =   "ammo_fuel";
 #ifdef SVQC
     this.m_botvalue =   2000;
index 5d25bf4b5e9a6001b176d9b509d01aed1256ca7e..678bc11f658c430041324f2731207d7e4fe9cb75 100644 (file)
@@ -241,6 +241,7 @@ void SUB_CalcMove_Bezier (entity this, vector tcontrol, vector tdest, float tspe
                delete(this.move_controller);
        }
        controller = new_pure(SUB_CalcMove_controller);
+       set_movetype(controller, MOVETYPE_NONE); // mark the entity as physics driven so that thinking is handled by QC
        controller.owner = this;
        this.move_controller = controller;
        controller.platmovetype = this.platmovetype;
index 20c08feb1c052a7737eeedb602c9744c1795ad97..3ab2433ad56b6fcfdf5c5173b8a1c7b7a0eea506 100644 (file)
@@ -23,7 +23,7 @@ void trigger_hurt_touch(entity this, entity toucher)
        // only do the EXACTTRIGGER_TOUCH checks when really needed (saves some cpu)
        if (toucher.iscreature)
        {
-               if (time >= toucher.triggerhurttime + ((q3compat && !(this.spawnflags & HURT_SLOW)) ? autocvar_sys_ticrate : 1))
+               if (time >= toucher.triggerhurttime + (q3compat && !(this.spawnflags & HURT_SLOW) ? 0.05 : 1))
                {
                        EXACTTRIGGER_TOUCH(this, toucher);
                        toucher.triggerhurttime = time;
index 8cfa77e6535aa7dfe70925d12a58cb02b9bb4537..f3da794ba517834f3f42e1e66b0ffdabeacd5743 100644 (file)
@@ -24,7 +24,6 @@ float autocvar_g_monster_mage_attack_teleport_chance = 0.2;
 float autocvar_g_monster_mage_attack_teleport_delay = 2;
 float autocvar_g_monster_mage_attack_teleport_random = 0.4;
 float autocvar_g_monster_mage_attack_teleport_random_range = 1200;
-float autocvar_g_monster_mage_heal_self;
 float autocvar_g_monster_mage_heal_allies;
 float autocvar_g_monster_mage_heal_minhealth;
 float autocvar_g_monster_mage_heal_range;
@@ -108,7 +107,6 @@ bool M_Mage_Defend_Heal_Check(entity this, entity targ)
                                        );
                }
                case 2: return (GetResource(targ, RES_ARMOR) < autocvar_g_balance_armor_regenstable);
-               case 3: return (GetResource(targ, RES_HEALTH) > 0);
        }
 
        return false;
@@ -254,11 +252,6 @@ void M_Mage_Defend_Heal(entity this)
                                                fx = EFFECT_ARMOR_REPAIR;
                                        }
                                        break;
-                               case 3:
-                                       float hp = ((it == this) ? autocvar_g_monster_mage_heal_self : autocvar_g_monster_mage_heal_allies);
-                                       TakeResource(it, RES_HEALTH, hp); // TODO: use regular damage functions? needs a way to bypass friendly fire checks
-                                       fx = EFFECT_RAGE;
-                                       break;
                        }
 
                        Send_Effect(fx, it.origin, '0 0 0', 1);
index e88b35f4554aec593a5a922d09ebf0656e0de33a..1635b5cb0d235c6eeb84dac673c18d98e9421e96 100644 (file)
@@ -55,6 +55,8 @@ void monster_dropitem(entity this, entity attacker)
        {
                e.noalign = true;
                StartItem(e, e.monster_loot);
+               if(startitem_failed || wasfreed(e))
+                       return;
                e.gravity = 1;
                setorigin(e, org);
                e.velocity = randomvec() * 175 + '0 0 325';
@@ -884,6 +886,12 @@ bool Monster_Appear_Check(entity this, Monster monster_id)
 
 void Monster_Reset(entity this)
 {
+       if(this.spawnflags & MONSTERFLAG_SPAWNED)
+       {
+               Monster_Remove(this);
+               return;
+       }
+
        setorigin(this, this.pos1);
        this.angles = this.pos2;
 
index 1572a75e55d9d9dc0599b05946f0c7a3eb84a542..92602d892d03d290f052f92bbc06db0cf3254380 100644 (file)
@@ -1,4 +1,4 @@
-string Buff_UndeprecateName(string buffname)
+string Buff_CompatName(string buffname)
 {
     switch(buffname)
     {
index 163176d5b5fa33f71cf4be53ff52aa72bbed1e5b..ae465dfdb3a5e8bfd0049894e403bb74a718dab6 100644 (file)
@@ -67,7 +67,7 @@ STATIC_INIT(REGISTER_BUFFS) {
        #define BUFF_SPAWNFUNC_Q3COMPAT(o, r)
 #endif
 
-string Buff_UndeprecateName(string buffname);
+string Buff_CompatName(string buffname);
 
 BUFF_SPAWNFUNCS(random, NULL)
 
index 1707e168b3af7163cd3c6f2fd39fde4efab2309d..4deecc492f5d02480924de132ef4d7c874d5d28d 100644 (file)
@@ -395,7 +395,7 @@ void nade_ice_think(entity this)
 
                        RadiusDamage(this, this.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
                                autocvar_g_nades_nade_radius, this, NULL, autocvar_g_nades_nade_force, this.projectiledeathtype, DMG_NOWEP, this.enemy);
-                       Damage_DamageInfo(this.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
+                       Damage_DamageInfo(this.origin, false, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
                                autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, this.projectiledeathtype, 0, this);
                }
                delete(this);
@@ -749,7 +749,7 @@ void nade_boom(entity this)
        {
                RadiusDamage(this, this.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
                                 autocvar_g_nades_nade_radius, this, NULL, autocvar_g_nades_nade_force, this.projectiledeathtype, DMG_NOWEP, this.enemy);
-               Damage_DamageInfo(this.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, this.projectiledeathtype, 0, this);
+               Damage_DamageInfo(this.origin, false, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, this.projectiledeathtype, 0, this);
        }
 
        if(this.takedamage)
index d5a2ba2e32f53142357695adbc8834dcab63c1dc..1d8c5e87f9aa043252c00dac81e78152066dd2b6 100644 (file)
@@ -45,7 +45,7 @@ void W_OverkillHeavyMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity
        if (autocvar_g_casings >= 2) // casing code
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 
        ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(okhmg, refire) * W_WeaponRateFactor(actor);
index 8f597e01b2924b182338d8705522a1a9dc116e19..55fea8ca754e4570ab99293d8d86476296e07fb6 100644 (file)
@@ -20,6 +20,7 @@ CLASS(OverkillHeavyMachineGun, Weapon)
 /* wepimg    */ ATTRIB(OverkillHeavyMachineGun, model2, string, "weaponhmg");
 /* refname   */ ATTRIB(OverkillHeavyMachineGun, netname, string, "okhmg");
 /* wepname   */ ATTRIB(OverkillHeavyMachineGun, m_name, string, _("Overkill Heavy Machine Gun"));
+/* legacy    */ ATTRIB(OverkillHeavyMachineGun, m_deprecated_netname, string, "hmg");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 20db8d961863b3a37d6235eee7b38fb891ddad55..a86cdc5194f3f2e21f7c936423a5bc41a913922b 100644 (file)
@@ -39,7 +39,7 @@ void W_OverkillMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weap
        if(autocvar_g_casings >= 2) // casing code
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 
        ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR_PRI(okmachinegun, refire) * W_WeaponRateFactor(actor);
index 60c0c9a2df1d55790da28557a884fe9015c3e85c..23421d2f542dfd4f467994ec04d34ab605c2b89e 100644 (file)
@@ -20,6 +20,7 @@ CLASS(OverkillRocketPropelledChainsaw, Weapon)
 /* wepimg    */ ATTRIB(OverkillRocketPropelledChainsaw, model2, string, "weaponrpc");
 /* refname   */ ATTRIB(OverkillRocketPropelledChainsaw, netname, string, "okrpc");
 /* wepname   */ ATTRIB(OverkillRocketPropelledChainsaw, m_name, string, _("Overkill Rocket Propelled Chainsaw"));
+/* legacy    */ ATTRIB(OverkillRocketPropelledChainsaw, m_deprecated_netname, string, "rpc");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index e1586c2034cd867b4a02d3e4fe995d8b3786d15a..f9e40965b8473282a398fdcedd9dd29c462b8532 100644 (file)
@@ -7,6 +7,7 @@ REGISTER_NET_TEMP(TE_CSQC_PINGPLREPORT)
 REGISTER_NET_TEMP(TE_CSQC_WEAPONCOMPLAIN)
 REGISTER_NET_TEMP(TE_CSQC_SERVERWELCOME)
 REGISTER_NET_TEMP(TE_CSQC_VEHICLESETUP)
+REGISTER_NET_TEMP(TE_CSQC_WEAPONPICKUP)
 
 const int RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const int RACE_NET_CHECKPOINT_CLEAR = 1;
index 360a3439a61478ac7d649a0c2e26ad247239c37f..9a7845a16dcc4f3e32f7a2684f1466acbe37c6f5 100644 (file)
 #define N_GNTLOFF 1
 #define N__ALWAYS 2
 
+// default time for announcer queue (time to wait before the next announcer is played)
+// -1 = bypass queue and play the announcer immediately
+// 0 = use the announcer sound length
+// >0 = use the specified time in seconds
+#define ANNCE_INSTANT -1
+#define ANNCE_LENGTH 0
+#define ANNCE_DEFTIME 2
+
 #define MULTITEAM_ANNCE(prefix, defaultvalue, sound, channel, volume, position) \
     NOTIF_ADD_AUTOCVAR(ANNCE_##prefix, defaultvalue) \
     MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), channel, volume, position) \
     MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), channel, volume, position)
 
 // MSG_ANNCE_NOTIFICATIONS
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_AIRSHOT,        N_GNTLOFF, "airshot",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_AMAZING,        N_GNTLOFF, "amazing",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_AWESOME,        N_GNTLOFF, "awesome",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_BOTLIKE,        N_GNTLOFF, "botlike",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_ELECTROBITCH,   N__ALWAYS, "electrobitch",      CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_IMPRESSIVE,     N_GNTLOFF, "impressive",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(ACHIEVEMENT_YODA,           N_GNTLOFF, "yoda",              CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(BEGIN,                      N__ALWAYS, "begin",             CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(HEADSHOT,                   N__ALWAYS, "headshot",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(KILLSTREAK_03,              N_GNTLOFF, "03kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_05,              N_GNTLOFF, "05kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_10,              N_GNTLOFF, "10kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_15,              N_GNTLOFF, "15kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_20,              N_GNTLOFF, "20kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_25,              N_GNTLOFF, "25kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(KILLSTREAK_30,              N_GNTLOFF, "30kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(INSTAGIB_LASTSECOND,        N_GNTLOFF, "lastsecond",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(INSTAGIB_NARROWLY,          N_GNTLOFF, "narrowly",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(INSTAGIB_TERMINATED,        N_GNTLOFF, "terminated",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(MULTIFRAG,                  N___NEVER, "multifrag",         CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(NUM_1,                      N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_2,                      N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_3,                      N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_4,                      N__ALWAYS, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_5,                      N__ALWAYS, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_6,                      N__ALWAYS, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_7,                      N__ALWAYS, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_8,                      N__ALWAYS, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_9,                      N__ALWAYS, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_10,                     N__ALWAYS, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_1,            N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_2,            N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_3,            N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_4,            N__ALWAYS, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_5,            N__ALWAYS, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_6,            N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_7,            N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_8,            N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_9,            N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_GAMESTART_10,           N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(NUM_KILL_1,                 N___NEVER, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_2,                 N___NEVER, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_3,                 N___NEVER, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_4,                 N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_5,                 N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_6,                 N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_7,                 N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_8,                 N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_9,                 N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_KILL_10,                N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_1,              N___NEVER, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_2,              N___NEVER, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_3,              N___NEVER, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_4,              N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_5,              N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_6,              N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_7,              N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_8,              N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_9,              N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_RESPAWN_10,             N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_1,           N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_2,           N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_3,           N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_4,           N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_5,           N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_6,           N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_7,           N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_8,           N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_9,           N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_10,          N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(PREPARE,                    N__ALWAYS, "prepareforbattle",  CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(REMAINING_FRAG_1,           N_GNTLOFF, "1fragleft",         CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(REMAINING_FRAG_2,           N_GNTLOFF, "2fragsleft",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(REMAINING_FRAG_3,           N_GNTLOFF, "3fragsleft",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(REMAINING_MIN_1,            N__ALWAYS, "1minuteremains",    CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(REMAINING_MIN_5,            N__ALWAYS, "5minutesremain",    CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(TIMEOUT,                    N__ALWAYS, "timeoutcalled",     CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-
-    MSG_ANNCE_NOTIF(VOTE_ACCEPT,                N__ALWAYS, "voteaccept",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(VOTE_CALL,                  N__ALWAYS, "votecall",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
-    MSG_ANNCE_NOTIF(VOTE_FAIL,                  N__ALWAYS, "votefail",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_AIRSHOT,        N_GNTLOFF, "airshot",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_AMAZING,        N_GNTLOFF, "amazing",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_AWESOME,        N_GNTLOFF, "awesome",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_BOTLIKE,        N_GNTLOFF, "botlike",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_ELECTROBITCH,   N__ALWAYS, "electrobitch",      CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_IMPRESSIVE,     N_GNTLOFF, "impressive",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(ACHIEVEMENT_YODA,           N_GNTLOFF, "yoda",              CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(BEGIN,                      N__ALWAYS, "begin",             CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(HEADSHOT,                   N__ALWAYS, "headshot",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(KILLSTREAK_03,              N_GNTLOFF, "03kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_05,              N_GNTLOFF, "05kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_10,              N_GNTLOFF, "10kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_15,              N_GNTLOFF, "15kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_20,              N_GNTLOFF, "20kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_25,              N_GNTLOFF, "25kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(KILLSTREAK_30,              N_GNTLOFF, "30kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(INSTAGIB_LASTSECOND,        N_GNTLOFF, "lastsecond",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(INSTAGIB_NARROWLY,          N_GNTLOFF, "narrowly",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(INSTAGIB_TERMINATED,        N_GNTLOFF, "terminated",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(MULTIFRAG,                  N___NEVER, "multifrag",         CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(NUM_1,                      N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_2,                      N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_3,                      N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_4,                      N__ALWAYS, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_5,                      N__ALWAYS, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_6,                      N__ALWAYS, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_7,                      N__ALWAYS, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_8,                      N__ALWAYS, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_9,                      N__ALWAYS, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_10,                     N__ALWAYS, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_1,            N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_2,            N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_3,            N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_4,            N__ALWAYS, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_5,            N__ALWAYS, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_6,            N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_7,            N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_8,            N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_9,            N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_GAMESTART_10,           N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(NUM_KILL_1,                 N___NEVER, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_2,                 N___NEVER, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_3,                 N___NEVER, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_4,                 N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_5,                 N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_6,                 N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_7,                 N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_8,                 N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_9,                 N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_KILL_10,                N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_1,              N___NEVER, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_2,              N___NEVER, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_3,              N___NEVER, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_4,              N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_5,              N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_6,              N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_7,              N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_8,              N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_9,              N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_RESPAWN_10,             N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_1,           N__ALWAYS, "1",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_2,           N__ALWAYS, "2",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_3,           N__ALWAYS, "3",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_4,           N___NEVER, "4",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_5,           N___NEVER, "5",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_6,           N___NEVER, "6",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_7,           N___NEVER, "7",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_8,           N___NEVER, "8",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_9,           N___NEVER, "9",                 CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+    MSG_ANNCE_NOTIF(NUM_ROUNDSTART_10,          N___NEVER, "10",                CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(PREPARE,                    N__ALWAYS, "prepareforbattle",  CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(REMAINING_FRAG_1,           N_GNTLOFF, "1fragleft",         CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(REMAINING_FRAG_2,           N_GNTLOFF, "2fragsleft",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(REMAINING_FRAG_3,           N_GNTLOFF, "3fragsleft",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(REMAINING_MIN_1,            N__ALWAYS, "1minuteremains",    CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(REMAINING_MIN_5,            N__ALWAYS, "5minutesremain",    CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+
+    MSG_ANNCE_NOTIF(TIMEOUT,                    N__ALWAYS, "timeoutcalled",     CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_INSTANT)
+
+    MSG_ANNCE_NOTIF(VOTE_ACCEPT,                N__ALWAYS, "voteaccept",        CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(VOTE_CALL,                  N__ALWAYS, "votecall",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
+    MSG_ANNCE_NOTIF(VOTE_FAIL,                  N__ALWAYS, "votefail",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE, ANNCE_DEFTIME)
 
 #undef N___NEVER
 #undef N_GNTLOFF
index 98b0f18e1c41a758ac90c5734df9f5be9e1a71e2..58910887e914a87c70393d5e0e043d6403495acb 100644 (file)
@@ -450,7 +450,8 @@ void Create_Notification_Entity_Annce(entity notif,
                                                                                float channel,
                                                                                string snd,
                                                                                float vol,
-                                                                               float position)
+                                                                               float position,
+                                                                               float queuetime)
                {
                        // Set MSG_ANNCE information and handle precaching
                        #ifdef CSQC
@@ -466,6 +467,7 @@ void Create_Notification_Entity_Annce(entity notif,
                                                notif.nent_snd = strzone(snd);
                                                notif.nent_vol = vol;
                                                notif.nent_position = position;
+                                               notif.nent_queuetime = queuetime;
                                        }
                                }
                                else
@@ -1177,6 +1179,58 @@ void Local_Notification_centerprint_Add(
        #endif
        centerprint_Add(ORDINAL(cpid), input, stof(arg_slot[0]), stof(arg_slot[1]));
 }
+
+void Local_Notification_Queue_Run(MSG net_type, entity notif)
+{              
+       switch (net_type)
+       {
+               case MSG_ANNCE:
+               {
+                       Local_Notification_sound(notif.nent_channel, notif.nent_snd, notif.nent_vol, notif.nent_position);
+                       break;
+               }
+       }
+}
+
+void Local_Notification_Queue_Add(MSG net_type, entity notif, float queue_time)
+{      
+       // Guess length if required
+       if(queue_time == 0)
+               queue_time = soundlength(AnnouncerFilename(notif.nent_snd));
+
+       if(queue_time == -1 || time > notif_queue_next_time) {
+               // Run immediately
+               Local_Notification_Queue_Run(net_type, notif);
+               notif_queue_next_time = time + queue_time;
+       } else {
+               // Put in queue
+               if(notif_queue_length >= NOTIF_QUEUE_MAX) return;
+       
+               notif_queue_type[notif_queue_length] = net_type;
+               notif_queue_entity[notif_queue_length] = notif;
+               notif_queue_time[notif_queue_length] = notif_queue_next_time;
+               
+               notif_queue_next_time += queue_time;
+               ++notif_queue_length;
+       }
+}
+
+void Local_Notification_Queue_Process()
+{
+       if(!notif_queue_length || notif_queue_time[0] > time)
+               return;
+
+       Local_Notification_Queue_Run(notif_queue_type[0], notif_queue_entity[0]);
+
+       // Shift queue to the left
+       --notif_queue_length;
+       for (int j = 0; j < notif_queue_length; j++) {
+               notif_queue_type[j] = notif_queue_type[j+1];
+               notif_queue_entity[j] = notif_queue_entity[j+1];
+               notif_queue_time[j] = notif_queue_time[j+1];
+       }
+}
+
 #endif
 
 void Local_Notification(MSG net_type, Notification net_name, ...count)
@@ -1249,7 +1303,7 @@ void Local_Notification(MSG net_type, Notification net_name, ...count)
                case MSG_ANNCE:
                {
                        #ifdef CSQC
-                       Local_Notification_sound(notif.nent_channel, notif.nent_snd, notif.nent_vol, notif.nent_position);
+                       Local_Notification_Queue_Add(net_type, notif, notif.nent_queuetime);
                        #else
                        backtrace("MSG_ANNCE on server?... Please notify Samual immediately!\n");
                        #endif
@@ -1357,6 +1411,7 @@ void Local_Notification(MSG net_type, Notification net_name, ...count)
                                found_choice.nent_floatcount,
                                s1, s2, s3, s4,
                                f1, f2, f3, f4);
+                       break;
                }
        }
 }
index 74e313dce000995b724132e09eecf722a4fa4809..9d39c219910f9d6c4fda29544169a7848b7feaa4 100644 (file)
@@ -123,7 +123,8 @@ void Create_Notification_Entity_Annce(entity notif,
                                                                                float channel,
                                                                                string snd,
                                                                                float vol,
-                                                                               float position);
+                                                                               float position,
+                                                                               float queuetime);
 
 void Create_Notification_Entity_InfoCenter(entity notif,
                                                                                        float var_cvar,
@@ -384,6 +385,18 @@ const float NOTIF_MAX_ARGS = 7;
 const float NOTIF_MAX_HUDARGS = 2;
 const float NOTIF_MAX_DURCNT = 2;
 
+#ifdef CSQC
+const int NOTIF_QUEUE_MAX = 10;
+entity notif_queue_entity[NOTIF_QUEUE_MAX];
+MSG notif_queue_type[NOTIF_QUEUE_MAX];
+float notif_queue_time[NOTIF_QUEUE_MAX];
+
+float notif_queue_next_time;
+int notif_queue_length;
+
+void Local_Notification_Queue_Process();
+#endif
+
 string arg_slot[NOTIF_MAX_ARGS];
 
 const float ARG_CS_SV_HA = 1; // enabled on CSQC, SVQC, and Hudargs
@@ -643,7 +656,7 @@ string notif_arg_item_wepammo(float f1, float f2)
                case RES_FUEL:    ammoitems = ITEM_JetpackFuel.m_name; break;
                default: return ""; // doesn't use ammo
        }
-       return sprintf(_(" with %d %s"), f2, ammoitems);
+       return sprintf(_(" with %d %s"), f2, strtolower(ammoitems));
 }
 
 
@@ -665,6 +678,7 @@ string notif_arg_item_wepammo(float f1, float f2)
 .string nent_snd;
 .float nent_vol;
 .float nent_position;
+.float nent_queuetime;
 
 // MSG_INFO and MSG_CENTER entity values
 .string nent_args; // used by both
@@ -743,21 +757,22 @@ Notification Get_Notif_Ent(MSG net_type, int net_name)
        return it;
 }
 
-#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \
-       MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, defaultvalue, sound, channel, volume, position)
+#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position, queuetime) \
+       MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, defaultvalue, sound, channel, volume, position, queuetime)
 
-#define MSG_ANNCE_NOTIF(name, defaultvalue, sound, channel, volume, position) \
+#define MSG_ANNCE_NOTIF(name, defaultvalue, sound, channel, volume, position, queuetime) \
        NOTIF_ADD_AUTOCVAR(ANNCE_##name, defaultvalue) \
-       MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, defaultvalue, sound, channel, volume, position)
+       MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, defaultvalue, sound, channel, volume, position, queuetime)
 
-#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \
+#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position, queuetime) \
        REGISTER(Notifications, name, m_id, new_pure(msg_annce_notification)) { \
                Create_Notification_Entity      (this, defaultvalue, ACVNN(cvarname), MSG_ANNCE, strtoupper(#name), teamnum); \
                Create_Notification_Entity_Annce(this, ACVNN(cvarname), strtoupper(#name), \
-                       channel,   /* channel  */ \
-                       sound,     /* snd      */ \
-                       volume,    /* vol      */ \
-                       position); /* position */ \
+                       channel,    /* channel   */ \
+                       sound,      /* snd       */ \
+                       volume,     /* vol       */ \
+                       position,   /* position  */ \
+                       queuetime); /* queuetime */ \
        }
 
 #define MSG_INFO_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \
index 2634b8246bedc6e0eb165b772a11f341d6364924..a2feb35dd8f98894f4cdc9a5ab4c01b694e59f56 100644 (file)
@@ -4,11 +4,7 @@
 void set_movetype(entity this, int mt)
 {
        this.move_movetype = mt;
-       if (mt == MOVETYPE_PHYSICS) {
-               this.move_qcphysics = false;
-       } else if (autocvar_sv_qcphysics == 2) {
-               this.move_qcphysics = true;
-       }
+       this.move_qcphysics = (mt != MOVETYPE_PHYSICS);
        if(!IL_CONTAINS(g_moveables, this))
                IL_PUSH(g_moveables, this); // add it to the moveable entities list (even if it doesn't move!) logic: if an object never sets its movetype, we assume it never does anything notable
        this.movetype = (this.move_qcphysics) ? MOVETYPE_QCENTITY : mt;
index 23a3e28e479d263d3e3b410f163f0f8fbe0cebde..e8cdc059beb3bed5f54da4d7b7ebcbff0e2ce780 100644 (file)
@@ -3,8 +3,6 @@
 #ifdef SVQC
 // undefined on client, engine cvar
 bool autocvar_physics_ode;
-
-int autocvar_sv_qcphysics = 1; // TODO this is for testing - remove when qcphysics work
 #endif
 
 // water levels
index 51e0bccad8e36367c789846d534f151273471c4a..0ad9ba31e77bd680f159f39556d671f2646f0026 100644 (file)
@@ -17,6 +17,9 @@ CLASS(AmmoResource, Resource)
 #endif
 ENDCLASS(AmmoResource)
 
+// NOTE: ammo resource registration order should match ammo (item) registration order
+// see REGISTER_ITEM calls order
+
 REGISTER_RESOURCE(SHELLS, NEW(AmmoResource)) {
        this.netname = "shells";
 #ifdef GAMEQC
index 0ecd29da2779ce403619bf02dde0a594785f7cb5..fa7ce8b73bf448e928a254fb1f62e687d581e0fc 100644 (file)
@@ -35,6 +35,20 @@ ENDCLASS(Resource)
 #define REGISTER_RESOURCE(id, inst) REGISTER(Resources, RES, id, m_id, inst)
 REGISTRY(Resources, BITS(4));
 REGISTER_REGISTRY(Resources)
+
+#ifdef CSQC
+// Copy Resources registry here before it gets sorted alphabetically by REGISTRY_SORT
+// so we can keep resources sorted by categories (as they appear in the code)
+IntrusiveList default_order_resources;
+STATIC_INIT(default_order_resources)
+{
+       default_order_resources = IL_NEW();
+       FOREACH(Resources, true, {
+               IL_PUSH(default_order_resources, it);
+       });
+}
+#endif
+
 REGISTRY_SORT(Resources);
 REGISTRY_CHECK(Resources);
 
index dc219f571cc2322e1cb1b5f1a984ab209656fb0e..30c826c50d08540440fad2c13fae759e1c3a2212 100644 (file)
@@ -121,7 +121,7 @@ void raptor_bomb_burst(entity this)
     entity bomblet;
     float i;
 
-    Damage_DamageInfo(this.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, this);
+    Damage_DamageInfo(this.origin, false, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, this);
 
     for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
     {
index 6bf2d105f8d85c4c82299c9a216f3e20cd818062..effa087e65c57ce2efabc3d2a5d9ad54622d7c74 100644 (file)
@@ -107,21 +107,6 @@ string W_NameWeaponOrder_MapFunc(string s)
        return s;
 }
 
-string W_UndeprecateName(string s)
-{
-       switch (s)
-       {
-               case "nex": return "vortex";
-               case "rocketlauncher": return "devastator";
-               case "laser": return "blaster";
-               case "minstanex": return "vaporizer";
-               case "grenadelauncher": return "mortar";
-               case "uzi": return "machinegun";
-               case "hmg": return "okhmg";
-               case "rpc": return "okrpc";
-               default: return s;
-       }
-}
 string W_NameWeaponOrder(string order)
 {
        return mapPriorityList(order, W_NameWeaponOrder_MapFunc);
@@ -129,8 +114,7 @@ string W_NameWeaponOrder(string order)
 string W_NumberWeaponOrder_MapFunc(string s)
 {
        if (s == "0" || stof(s)) return s;
-       s = W_UndeprecateName(s);
-       FOREACH(Weapons, it != WEP_Null && it.netname == s, return ftos(i));
+       FOREACH(Weapons, it != WEP_Null && (it.netname == s || it.m_deprecated_netname == s), return ftos(i));
        return s;
 }
 string W_NumberWeaponOrder(string order)
@@ -249,20 +233,6 @@ entity GetAmmoItem(Resource ammotype)
 }
 
 #ifdef CSQC
-Resource GetAmmoTypeFromNum(int i)
-{
-       switch (i)
-       {
-               case 0: return RES_SHELLS;
-               case 1: return RES_BULLETS;
-               case 2: return RES_ROCKETS;
-               case 3: return RES_CELLS;
-               case 4: return RES_PLASMA;
-               case 5: return RES_FUEL;
-               default: return RES_NONE;
-       }
-}
-
 int GetAmmoStat(Resource ammotype)
 {
        switch (ammotype)
@@ -394,6 +364,7 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn
  *   this.origin, this.angles
  *   this.weaponchild
  *   this.movedir, this.view_ofs, this.movedir_aligned
+ *   this.spawnorigin (SVQC only)
  *   attachment stuff
  *   anim stuff
  * to free:
@@ -410,7 +381,9 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                if (this.weaponchild) delete(this.weaponchild);
                this.weaponchild = NULL;
                this.movedir = '0 0 0';
+#ifdef SVQC
                this.spawnorigin = '0 0 0';
+#endif
                this.oldorigin = '0 0 0';
                this.anim_fire1  = '0 1 0.01';
                this.anim_fire2  = '0 1 0.01';
@@ -482,6 +455,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                                this.movedir = '0 0 0';
                        }
                }
+#ifdef SVQC
                {
                        int idx = 0;
                        // v_ model attached to invisible h_ model
@@ -501,6 +475,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                                this.spawnorigin = this.movedir;
                        }
                }
+#endif
                if (v_shot_idx)
                {
                        this.oldorigin = '0 0 0';  // use regular attachment
@@ -547,7 +522,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                vector v = this.movedir;
                this.movedir = shotorg_adjust(v, false, false, algn);
                this.movedir_aligned = shotorg_adjust(v, false, true, algn);
-               this.view_ofs = shotorg_adjust(v, false, true, algn) - v;
+               this.view_ofs = this.movedir_aligned - v;
        }
        int compressed_shotorg = compressShotOrigin(this.movedir);
        // make them match perfectly
@@ -557,7 +532,9 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
 #endif
        this.movedir = decompressShotOrigin(compressed_shotorg);
 
+#ifdef SVQC
        this.spawnorigin += this.view_ofs;  // offset the casings origin by the same amount
+#endif
 
        // check if an instant weapon switch occurred
        setorigin(this, this.view_ofs);
index acf4366593e62d3a1b72ba012b30e9121d6777e9..141b8b5eee72a77f286571892486e59113b0f624 100644 (file)
@@ -356,7 +356,9 @@ vector weaponentity_glowmod(Weapon wep, int c, entity wepent)
 //.int weapon; // current weapon
 .string weaponname; // name of .weapon
 
+#ifdef SVQC
 .vector spawnorigin; // for casings
+#endif
 
 .vector movedir_aligned; // shot origin based on weapon alignment (unaffected by shootfromeye)
 
index 70009b15ffc32152ddf3a1c769e534146aebc4b7..cf0f637f0324d614da2ffe5212cf408a5988f357 100644 (file)
@@ -76,6 +76,8 @@ CLASS(Weapon, Object)
     ATTRIB(Weapon, netname, string, "");
     /** M: wepname   : human readable name */
     ATTRIB(Weapon, m_name, string, "AOL CD Thrower");
+    /** M: deprecated refname : old reference name for compatibility with weapons that were renamed */
+    ATTRIB(Weapon, m_deprecated_netname, string, "");
 
     ATTRIB(Weapon, m_pickup, entity);
 
@@ -215,7 +217,6 @@ string weaponorder_byid;
 
 // functions:
 string W_FixWeaponOrder(string order, float complete);
-string W_UndeprecateName(string s);
 string W_NameWeaponOrder(string order);
 string W_NumberWeaponOrder(string order);
 string W_FixWeaponOrder_BuildImpulseList(string o);
@@ -230,8 +231,6 @@ string GetAmmoName(Resource ammotype);
 entity GetAmmoItem(Resource ammotype);
 
 #ifdef CSQC
-Resource GetAmmoTypeFromNum(int i);
-
 int GetAmmoStat(Resource ammotype);
 #endif
 
index d768abfafe46ada390d6f4dfea6c4b3558c3c961..6eebd4c39e6d6b60e34b4b051910c89430ce0f97 100644 (file)
@@ -18,6 +18,7 @@ CLASS(Blaster, Weapon)
 /* wepimg    */ ATTRIB(Blaster, model2, string, "weaponlaser");
 /* refname   */ ATTRIB(Blaster, netname, string, "blaster");
 /* wepname   */ ATTRIB(Blaster, m_name, string, _("Blaster"));
+/* legacy    */ ATTRIB(Blaster, m_deprecated_netname, string, "laser");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 70c72f52cba160dbcad5ab19e82e476f102f090c..7a10bf62a17358ff085a8464d70fcdc24f1b7bfb 100644 (file)
@@ -18,6 +18,7 @@ CLASS(Devastator, Weapon)
 /* wepimg    */ ATTRIB(Devastator, model2, string, "weaponrocketlauncher");
 /* refname   */ ATTRIB(Devastator, netname, string, "devastator");
 /* wepname   */ ATTRIB(Devastator, m_name, string, _("Devastator"));
+/* legacy    */ ATTRIB(Devastator, m_deprecated_netname, string, "rocketlauncher");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 391aa7294c2a24b6170acc68ba312f2e2680cf43..363b1d694141a6e571b16060722c77fbdc5c1811 100644 (file)
@@ -345,7 +345,7 @@ METHOD(Fireball, wr_aim, void(entity thiswep, entity actor, .entity weaponentity
         if(bot_aim(actor, weaponentity, WEP_CVAR_PRI(fireball, speed), 0, WEP_CVAR_PRI(fireball, lifetime), false, false))
         {
             PHYS_INPUT_BUTTON_ATCK(actor) = true;
-            if(random() < 0.02) actor.bot_primary_fireballmooth = 0;
+            if(random() < 0.02) actor.bot_primary_fireballmooth = 1;
         }
     }
     else
@@ -353,7 +353,7 @@ METHOD(Fireball, wr_aim, void(entity thiswep, entity actor, .entity weaponentity
         if(bot_aim(actor, weaponentity, WEP_CVAR_SEC(fireball, speed), WEP_CVAR_SEC(fireball, speed_up), WEP_CVAR_SEC(fireball, lifetime), true, false))
         {
             PHYS_INPUT_BUTTON_ATCK2(actor) = true;
-            if(random() < 0.01) actor.bot_primary_fireballmooth = 1;
+            if(random() < 0.01) actor.bot_primary_fireballmooth = 0;
         }
     }
 }
index 15a4d6a3c180f809cd9ade5fd6de424c00e972a2..62b2a09eac9774ab7a68349ced551eb5a24cb9fe 100644 (file)
@@ -24,7 +24,7 @@ void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity we
        if(autocvar_g_casings >= 2)
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 
        if(actor.(weaponentity).misc_bulletcounter == 1)
@@ -96,7 +96,7 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity
        if(autocvar_g_casings >= 2) // casing code
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 
        ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
@@ -119,7 +119,7 @@ void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentit
        if(autocvar_g_casings >= 2) // casing code
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 
        actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
index 9a2adf46c94d42d17dfda956578c249857e09181..a4097f947e252dfa01d49ba4c99459d7ca3cc962 100644 (file)
@@ -18,6 +18,7 @@ CLASS(MachineGun, Weapon)
 /* wepimg    */ ATTRIB(MachineGun, model2, string, "weaponuzi");
 /* refname   */ ATTRIB(MachineGun, netname, string, "machinegun");
 /* wepname   */ ATTRIB(MachineGun, m_name, string, _("MachineGun"));
+/* legacy    */ ATTRIB(MachineGun, m_deprecated_netname, string, "uzi");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 52b8a571a51eb34e0265bf7fb52a3d0676e57a57..2152accff03f070d74a8875d4ad8b01e9cfd3dee 100644 (file)
@@ -358,9 +358,7 @@ METHOD(Mortar, wr_killmessage, Notification(entity thiswep))
 
 METHOD(Mortar, wr_impacteffect, void(entity thiswep, entity actor))
 {
-    vector org2;
-    org2 = w_org + w_backoff * 12;
-    pointparticles(EFFECT_GRENADE_EXPLODE, org2, '0 0 0', 1);
+    pointparticles(EFFECT_GRENADE_EXPLODE, w_org + w_backoff, '0 0 0', 1);
     if(!w_issilent)
         sound(actor, CH_SHOTS, SND_GRENADE_IMPACT, VOL_BASE, ATTN_NORM);
 }
index 118e5c5f0010ee03ce619f2f4b915d8895db3db0..6d44e75644ca0f2efe5865a2f855d46cec3f2c46 100644 (file)
@@ -18,6 +18,7 @@ CLASS(Mortar, Weapon)
 /* wepimg    */ ATTRIB(Mortar, model2, string, "weapongrenadelauncher");
 /* refname   */ ATTRIB(Mortar, netname, string, "mortar");
 /* wepname   */ ATTRIB(Mortar, m_name, string, _("Mortar"));
+/* legacy    */ ATTRIB(Mortar, m_deprecated_netname, string, "grenadelauncher");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 803930cc0cfc6880a01df26f36109f5efe794169..aa4a980623a4168791f700cdd21b523967bc1796 100644 (file)
@@ -24,7 +24,7 @@ void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, flo
        if(autocvar_g_casings >= 2)
        {
                makevectors(actor.v_angle); // for some reason, this is lost
-               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);
+               SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), vectoangles(v_forward), 3, actor, weaponentity);
        }
 }
 
index bf57fb9c1c5bf0e66efad77f3aa54415ec517354..e4b7674518a99db3bbd5bcfeb32f6d30ce251ff2 100644 (file)
@@ -406,7 +406,7 @@ void W_Seeker_Tag_Explode(entity this)
 {
        //if(other==this.realowner)
        //    return;
-       Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE, 0, this);
+       Damage_DamageInfo(this.origin, false, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE, 0, this);
 
        delete(this);
 }
@@ -434,7 +434,7 @@ void W_Seeker_Tag_Touch(entity this, entity toucher)
        te_knightspike(org2);
 
        this.event_damage = func_null;
-       Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY, toucher.species, this);
+       Damage_DamageInfo(this.origin, false, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY, toucher.species, this);
 
        if(toucher.takedamage == DAMAGE_AIM && !IS_DEAD(toucher))
        {
index 7863de55e33f73a9ba234ede32b57dea60fe6e9e..f91544d7675295d90893f2587c826fd7de4d881b 100644 (file)
@@ -279,6 +279,7 @@ void W_Shockwave_Attack(Weapon thiswep, entity actor, .entity weaponentity)
        W_Shockwave_Send(actor);
        Damage_DamageInfo(
                attack_hitpos,
+               trace_ent && trace_ent.solid == SOLID_BSP,
                WEP_CVAR(shockwave, blast_splash_damage),
                WEP_CVAR(shockwave, blast_splash_edgedamage),
                WEP_CVAR(shockwave, blast_splash_radius),
index e304c4c2b4520d663cc6147068f4439cc81ae7a9..65cc0d9d926323840f682a60c5fc046ba1ec7dd7 100644 (file)
@@ -29,7 +29,7 @@ void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float
        {
                makevectors(actor.v_angle); // for some reason, this is lost
                //for(int sc = 0;sc < WEP_CVAR_PRI(shotgun, ammo);sc = sc + 1)
-                       SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, actor, weaponentity);
+                       SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 30) * v_up), vectoangles(v_forward), 1, actor, weaponentity);
        }
 }
 
index 277557e9cf290554a8fad90596758eabef26f42c..87249f7364b9b6525e9ac74153d4d3902cecd1dd 100644 (file)
@@ -19,6 +19,7 @@ CLASS(Vaporizer, Weapon)
 /* wepimg    */ ATTRIB(Vaporizer, model2, string, "weaponminstanex");
 /* refname   */ ATTRIB(Vaporizer, netname, string, "vaporizer");
 /* wepname   */ ATTRIB(Vaporizer, m_name, string, _("Vaporizer"));
+/* legacy    */ ATTRIB(Vaporizer, m_deprecated_netname, string, "minstanex");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index babbfe51bb0f25a8a0777ce78cbfc3da08470ce7..2d80a7a61ae89b1266299984f8a783605d9426ab 100644 (file)
@@ -19,6 +19,7 @@ CLASS(Vortex, Weapon)
 /* wepimg    */ ATTRIB(Vortex, model2, string, "weaponnex");
 /* refname   */ ATTRIB(Vortex, netname, string, "vortex");
 /* wepname   */ ATTRIB(Vortex, m_name, string, _("Vortex"));
+/* legacy    */ ATTRIB(Vortex, m_deprecated_netname, string, "nex");
 
 #define X(BEGIN, P, END, class, prefix) \
        BEGIN(class) \
index 5521feae190c5a894a6bc5007ef36b362bb55cf6..a92fcc5c5b600294e8825dc037063f3eb949dace 100644 (file)
@@ -526,6 +526,18 @@ vector CSQCPlayer_ApplyChase(entity this, vector v)
 
 void CSQCPlayer_CalcRefdef(entity this)
 {
+       if(use_engine_refdef)
+       {
+               int refdefflags = 0;
+               if (this.csqcmodel_teleported) refdefflags |= REFDEFFLAG_TELEPORTED;
+               if (input_buttons & BIT(1)) refdefflags |= REFDEFFLAG_JUMPING;
+               // note: these two only work in WIP2, but are harmless in WIP1
+               if (PHYS_HEALTH(NULL) <= 0 && PHYS_HEALTH(NULL) != -666 && PHYS_HEALTH(NULL) != -2342) refdefflags |= REFDEFFLAG_DEAD;
+               if (intermission) refdefflags |= REFDEFFLAG_INTERMISSION;
+               V_CalcRefdef(this, refdefflags); // TODO? uses .health stat in the engine when this isn't called here, may be broken!
+               return;
+       }
+
        vector vieworg = this.origin;
        if(intermission)
        {
@@ -554,8 +566,6 @@ void CSQCPlayer_CalcRefdef(entity this)
        setproperty(VF_ANGLES, view_angles);
 }
 
-bool autocvar_cl_useenginerefdef = false;
-
 /** Called once per CSQC_UpdateView() */
 void CSQCPlayer_SetCamera()
 {
@@ -637,20 +647,7 @@ void CSQCPlayer_SetCamera()
                        InterpolateOrigin_Do(view);
                        view.view_ofs = '0 0 1' * vh;
                }
-               if(autocvar_cl_useenginerefdef)
-               {
-                       int refdefflags = 0;
-                       if (view.csqcmodel_teleported) refdefflags |= REFDEFFLAG_TELEPORTED;
-                       if (input_buttons & BIT(1)) refdefflags |= REFDEFFLAG_JUMPING;
-                       // note: these two only work in WIP2, but are harmless in WIP1
-                       if (PHYS_HEALTH(NULL) <= 0 && PHYS_HEALTH(NULL) != -666 && PHYS_HEALTH(NULL) != -2342) refdefflags |= REFDEFFLAG_DEAD;
-                       if (intermission) refdefflags |= REFDEFFLAG_INTERMISSION;
-                       V_CalcRefdef(view, refdefflags); // TODO? uses .health stat in the engine when this isn't called here, may be broken!
-               }
-               else
-               {
-                       CSQCPlayer_CalcRefdef(view);
-               }
+               CSQCPlayer_CalcRefdef(view);
        }
        else
        {
index 925c9bd07f6988024728a82a2a289fbee707fdfd..ff12a662c2251276bf691fa2fc672a7731eb3efc 100644 (file)
@@ -29,6 +29,8 @@ const int CSQCPLAYERSTATUS_UNPREDICTED = 0;
 const int CSQCPLAYERSTATUS_FROMSERVER = 1;
 const int CSQCPLAYERSTATUS_PREDICTED = 2;
 
+bool use_engine_refdef; // debug option for testing legacy engine code
+
 // only ever READ these!
 .int pmove_flags;
 const int PMF_JUMP_HELD = 1;
index 2ee34aef81108f0da2e01c8bc1adc13150a9efb5..524c65915340a8999a5c52007efa49414f5dbbed 100644 (file)
@@ -31,6 +31,7 @@
 #include <menu/xonotic/dialog_hudpanel_modicons.qc>
 #include <menu/xonotic/dialog_hudpanel_notification.qc>
 #include <menu/xonotic/dialog_hudpanel_physics.qc>
+#include <menu/xonotic/dialog_hudpanel_pickup.qc>
 #include <menu/xonotic/dialog_hudpanel_powerups.qc>
 #include <menu/xonotic/dialog_hudpanel_pressedkeys.qc>
 #include <menu/xonotic/dialog_hudpanel_quickmenu.qc>
index 64475f6a18c4be17eb30c6c5cb563254a4a3c2ef..b4fe3d836cbd8cd598cd4256661754772ee41f5d 100644 (file)
@@ -31,6 +31,7 @@
 #include <menu/xonotic/dialog_hudpanel_modicons.qh>
 #include <menu/xonotic/dialog_hudpanel_notification.qh>
 #include <menu/xonotic/dialog_hudpanel_physics.qh>
+#include <menu/xonotic/dialog_hudpanel_pickup.qh>
 #include <menu/xonotic/dialog_hudpanel_powerups.qh>
 #include <menu/xonotic/dialog_hudpanel_pressedkeys.qh>
 #include <menu/xonotic/dialog_hudpanel_quickmenu.qh>
diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_pickup.qc b/qcsrc/menu/xonotic/dialog_hudpanel_pickup.qc
new file mode 100644 (file)
index 0000000..95cb5fe
--- /dev/null
@@ -0,0 +1,39 @@
+#include "dialog_hudpanel_pickup.qh"
+
+#include "checkbox.qh"
+#include "textlabel.qh"
+#include "slider.qh"
+#include "textslider.qh"
+
+void XonoticHUDPickupDialog_fill(entity me)
+{
+       entity e;
+       string panelname = "pickup";
+
+       dialog_hudpanel_main_checkbox(me, panelname);
+
+       dialog_hudpanel_main_settings(me, panelname);
+
+       me.TR(me);
+               me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Pickup messages:")));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Message duration:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(1, 5, 1, "hud_panel_pickup_time"));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Fade time:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(0, 1, 0.05, "hud_panel_pickup_fade_out"));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Show timer:")));
+               me.TD(me, 1, 2, e = makeXonoticTextSlider("hud_panel_pickup_showtimer"));
+                       e.addValue(e, _("Never"), "0");
+                       e.addValue(e, _("Always"), "1");
+                       e.addValue(e, _("Spectating"), "2");
+                       e.configureXonoticTextSliderValues(e);
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Icon size scale:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(1, 3, 0.1, "hud_panel_pickup_iconsize"));
+}
diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_pickup.qh b/qcsrc/menu/xonotic/dialog_hudpanel_pickup.qh
new file mode 100644 (file)
index 0000000..2ceb89d
--- /dev/null
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "rootdialog.qh"
+CLASS(XonoticHUDPickupDialog, XonoticRootDialog)
+       METHOD(XonoticHUDPickupDialog, fill, void(entity));
+       ATTRIB(XonoticHUDPickupDialog, title, string, _("Pickup Panel"));
+       ATTRIB(XonoticHUDPickupDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT);
+       ATTRIB(XonoticHUDPickupDialog, intendedWidth, float, 0.4);
+       ATTRIB(XonoticHUDPickupDialog, rows, float, 15.5);
+       ATTRIB(XonoticHUDPickupDialog, columns, float, 4);
+       ATTRIB(XonoticHUDPickupDialog, name, string, "HUDpickup");
+       ATTRIB(XonoticHUDPickupDialog, requiresConnection, float, true);
+ENDCLASS(XonoticHUDPickupDialog)
index e215e5080bd883bd26086268cf32aa9473b97a19..039d3452fd0038762f728159950f26807c1ee9ae 100644 (file)
@@ -20,6 +20,7 @@
 #include "dialog_hudpanel_timer.qh"
 #include "dialog_hudpanel_vote.qh"
 #include "dialog_hudpanel_weapons.qh"
+#include "dialog_hudpanel_pickup.qh"
 #include "dialog_hudpanel_engineinfo.qh"
 #include "dialog_hudpanel_infomessages.qh"
 #include "dialog_hudpanel_physics.qh"
@@ -158,6 +159,10 @@ void MainWindow_configureMainWindow(entity me)
        i.configureDialog(i);
        me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 
+       i = NEW(XonoticHUDPickupDialog);
+       i.configureDialog(i);
+       me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
        i = NEW(XonoticHUDInfoMessagesDialog);
        i.configureDialog(i);
        me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
index 58fda9a016cdc2b42cd0c5ef8622f9c28d699cae..f27a4e2a7b0185e657e79cae19326a87c35d34c5 100644 (file)
@@ -1168,7 +1168,7 @@ void ClientConnect(entity this)
        if (IS_REAL_CLIENT(this))
                sv_notice_join(this);
 
-       this.move_qcphysics = autocvar_sv_qcphysics;
+       this.move_qcphysics = true;
 
        // update physics stats (players can spawn before physics runs)
        Physics_UpdateStats(this);
index de5524526c9585b00d347a246431c6e41c2d7d0a..b360f34d3f325133ee88629f26110d54a5f508d8 100644 (file)
@@ -559,9 +559,9 @@ void ReadyCount()
 //  Supporting functions for VoteCommand
 // ======================================
 
-float Votecommand_check_assignment(entity caller, float assignment)
+bool Votecommand_check_assignment(entity caller, float assignment)
 {
-       float from_server = (!caller);
+       bool from_server = (!caller);
 
        if ((assignment == VC_ASGNMNT_BOTH)
            || ((!from_server && assignment == VC_ASGNMNT_CLIENTONLY)
@@ -580,33 +580,32 @@ string VoteCommand_extractcommand(string input, float startpos, int argc)
        return output;
 }
 
-float VoteCommand_checknasty(string vote_command)
+bool VoteCommand_checknasty(string vote_command)
 {
-       if ((strstrofs(vote_command, ";", 0) >= 0)
+       return !((strstrofs(vote_command, ";", 0) >= 0)
            || (strstrofs(vote_command, "\n", 0) >= 0)
            || (strstrofs(vote_command, "\r", 0) >= 0)
-           || (strstrofs(vote_command, "$", 0) >= 0)) return false;
-
-       return true;
+           || (strstrofs(vote_command, "$", 0) >= 0));
 }
 
 // NOTE: requires input to be surrounded by spaces
 string VoteCommand_checkreplacements(string input)
 {
-       string output = input;
+       // add a space around the input so the start and end of the list is captured
+       string output = strcat(" ", input, " ");
        // allow gotomap replacements
        output = strreplace(" map ", " gotomap ", output);
        output = strreplace(" chmap ", " gotomap ", output);
        return output;
 }
 
-float VoteCommand_checkinlist(string vote_command, string list)
+bool VoteCommand_checkinlist(string vote_command, string list)
 {
-       string l = VoteCommand_checkreplacements(strcat(" ", list, " "));
+       if (vote_command == "" || list == "")
+               return false;
 
-       if (strstrofs(l, VoteCommand_checkreplacements(strcat(" ", vote_command, " ")), 0) >= 0) return true;
-
-       return false;
+       string l = VoteCommand_checkreplacements(list);
+       return (strstrofs(l, VoteCommand_checkreplacements(vote_command), 0) >= 0);
 }
 
 string ValidateMap(string validated_map, entity caller)
index d93d00bf5f58d368a1f338c970d1657368ec46b9..296a7b107d60470bf88856b13827f9ca39ea3e32 100644 (file)
@@ -902,9 +902,9 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in
                        else
                                force = normalize(force);
                        if(forceintensity >= 0)
-                               Damage_DamageInfo(inflictororigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker);
+                               Damage_DamageInfo(inflictororigin, false, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker);
                        else
-                               Damage_DamageInfo(inflictororigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker);
+                               Damage_DamageInfo(inflictororigin, false, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker);
                }
 
        stat_damagedone = 0;
index a1dadc1a28f052017abbcbddd6252a3c7ec3cc65..cc4dd30a581ebba88ff62674970b2374c716759b 100644 (file)
@@ -41,7 +41,7 @@ float autocvar_g_frozen_force;
 
 bool Damage_DamageInfo_SendEntity(entity this, entity to, int sf);
 
-void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner);
+void Damage_DamageInfo(vector org, bool is_solid_hit, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner);
 
 float checkrules_firstblood;
 
index 7f3a1c7c1132f3641d51c4d7a670bbb187572d18..e68d858a8e72e55d9ad4a156cd0b81400cafbd8e 100644 (file)
@@ -11,6 +11,7 @@
 #include <common/mutators/mutator/buffs/sv_buffs.qh>
 #include <common/mutators/mutator/powerups/_mod.qh>
 #include <common/mutators/mutator/status_effects/_mod.qh>
+#include <common/net_linked.qh>
 #include <common/notifications/all.qh>
 #include <common/resources/resources.qh>
 #include <common/util.qh>
@@ -475,6 +476,15 @@ bool Item_GiveAmmoTo(entity item, entity player, Resource res_type, float ammoma
        return true;
 }
 
+void Item_NotifyWeapon(entity player, int wep)
+{
+       FOREACH_CLIENT(IS_REAL_CLIENT(it) && (it == player || (IS_SPEC(it) && it.enemy == player)), {
+               msg_entity = it;
+               WriteHeader(MSG_ONE, TE_CSQC_WEAPONPICKUP);
+               WriteByte(MSG_ONE, wep);
+       });
+}
+
 bool Item_GiveTo(entity item, entity player)
 {
        // if nothing happens to player, just return without taking the item
@@ -509,15 +519,18 @@ bool Item_GiveTo(entity item, entity player)
        pickedup |= Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max);
        if (item.itemdef.instanceOfWeaponPickup)
        {
-               WepSet w;
+               WepSet w, wp;
                w = STAT(WEAPONS, item);
-               w &= ~STAT(WEAPONS, player);
+               wp = w & ~STAT(WEAPONS, player);
 
-               if (w || (item.spawnshieldtime && item.pickup_anyway > 0))
+               if (wp || (item.spawnshieldtime && item.pickup_anyway > 0))
                {
                        pickedup = true;
                        FOREACH(Weapons, it != WEP_Null, {
                                if(w & (it.m_wepset))
+                                       Item_NotifyWeapon(player, it.m_id);
+
+                               if(wp & (it.m_wepset))
                                {
                                        for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
                                        {
@@ -821,24 +834,21 @@ float weapon_pickupevalfunc(entity player, entity item)
 
 float ammo_pickupevalfunc(entity player, entity item)
 {
-       bool need_shells = false, need_nails = false, need_rockets = false, need_cells = false, need_plasma = false, need_fuel = false;
+       entity item_resource = NULL; // pointer to the resource that may be associated with the given item
        entity wpn = NULL;
        float c = 0;
        float rating = 0;
 
-       // Detect needed ammo
+       // detect needed ammo
        if(item.itemdef.instanceOfWeaponPickup)
        {
-               entity ammo = NULL;
-               if(GetResource(item, RES_SHELLS))       { need_shells  = true; ammo = ITEM_Shells;      }
-               else if(GetResource(item, RES_BULLETS))   { need_nails   = true; ammo = ITEM_Bullets;     }
-               else if(GetResource(item, RES_ROCKETS)) { need_rockets = true; ammo = ITEM_Rockets;     }
-               else if(GetResource(item, RES_CELLS))   { need_cells   = true; ammo = ITEM_Cells;       }
-               else if(GetResource(item, RES_PLASMA))  { need_plasma  = true; ammo = ITEM_Plasma;      }
-               else if(GetResource(item, RES_FUEL))    { need_fuel    = true; ammo = ITEM_JetpackFuel; }
-
+               entity res = item.itemdef.m_weapon.ammo_type;
+               entity ammo = (res != RES_NONE) ? GetAmmoItem(res) : NULL;
                if(!ammo)
                        return 0;
+               if(res != RES_NONE && GetResource(item, res))
+                       item_resource = res;
+
                wpn = item;
                rating = ammo.m_botvalue;
        }
@@ -847,15 +857,13 @@ float ammo_pickupevalfunc(entity player, entity item)
                FOREACH(Weapons, it != WEP_Null, {
                        if(!(STAT(WEAPONS, player) & (it.m_wepset)))
                                continue;
+                       if(it.ammo_type == RES_NONE)
+                               continue;
 
-                       switch(it.ammo_type)
+                       if(GetResource(item, it.ammo_type))
                        {
-                               case RES_SHELLS:  need_shells  = true; break;
-                               case RES_BULLETS: need_nails   = true; break;
-                               case RES_ROCKETS: need_rockets = true; break;
-                               case RES_CELLS:   need_cells   = true; break;
-                               case RES_PLASMA:  need_plasma  = true; break;
-                               case RES_FUEL:    need_fuel    = true; break;
+                               item_resource = it.ammo_type;
+                               break;
                        }
                });
                rating = item.bot_pickupbasevalue;
@@ -863,23 +871,8 @@ float ammo_pickupevalfunc(entity player, entity item)
 
        float noammorating = 0.5;
 
-       if ((need_shells) && GetResource(item, RES_SHELLS) && (GetResource(player, RES_SHELLS) < g_pickup_shells_max))
-               c = GetResource(item, RES_SHELLS) / max(noammorating, GetResource(player, RES_SHELLS));
-
-       if ((need_nails) && GetResource(item, RES_BULLETS) && (GetResource(player, RES_BULLETS) < g_pickup_nails_max))
-               c = GetResource(item, RES_BULLETS) / max(noammorating, GetResource(player, RES_BULLETS));
-
-       if ((need_rockets) && GetResource(item, RES_ROCKETS) && (GetResource(player, RES_ROCKETS) < g_pickup_rockets_max))
-               c = GetResource(item, RES_ROCKETS) / max(noammorating, GetResource(player, RES_ROCKETS));
-
-       if ((need_cells) && GetResource(item, RES_CELLS) && (GetResource(player, RES_CELLS) < g_pickup_cells_max))
-               c = GetResource(item, RES_CELLS) / max(noammorating, GetResource(player, RES_CELLS));
-
-       if ((need_plasma) && GetResource(item, RES_PLASMA) && (GetResource(player, RES_PLASMA) < g_pickup_plasma_max))
-               c = GetResource(item, RES_PLASMA) / max(noammorating, GetResource(player, RES_PLASMA));
-
-       if ((need_fuel) && GetResource(item, RES_FUEL) && (GetResource(player, RES_FUEL) < g_pickup_fuel_max))
-               c = GetResource(item, RES_FUEL) / max(noammorating, GetResource(player, RES_FUEL));
+       if(item_resource && (GetResource(player, item_resource) < GetResourceLimit(player, item_resource)))
+               c = GetResource(item, item_resource) / max(noammorating, GetResource(player, item_resource));
 
        rating *= min(c, 2);
        if(wpn)
@@ -1162,7 +1155,7 @@ void StartItem(entity this, GameItem def)
        if (def.spawnflags & ITEM_FLAG_MUTATORBLOCKED)
        {
                delete(this);
-               return;
+               return; // TODO does not set startitem_failed
        }
 
        this.classname = def.m_canonical_spawnfunc;
@@ -1288,7 +1281,7 @@ spawnfunc(target_items)
                        {
                                FOREACH(StatusEffect, it.instanceOfBuff,
                                {
-                                       string s = Buff_UndeprecateName(argv(j));
+                                       string s = Buff_CompatName(argv(j));
                                        if(s == it.netname)
                                        {
                                                this.buffdef = it;
@@ -1298,8 +1291,8 @@ spawnfunc(target_items)
                                        }
                                });
                                FOREACH(Weapons, it != WEP_Null, {
-                                       string s = W_UndeprecateName(argv(j));
-                                       if(s == it.netname)
+                                       string s = argv(j);
+                                       if(s == it.netname || s == it.m_deprecated_netname)
                                        {
                                                STAT(WEAPONS, this) |= (it.m_wepset);
                                                if(this.spawnflags == 0 || this.spawnflags == 2)
@@ -1364,7 +1357,8 @@ spawnfunc(target_items)
        n = tokenize_console(this.netname);
        for(int j = 0; j < n; ++j)
        {
-               FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, {
+               string cmd = argv(j);
+               FOREACH(Weapons, it != WEP_Null && (cmd == it.netname || cmd == it.m_deprecated_netname), {
                        it.wr_init(it);
                        break;
                });
@@ -1663,12 +1657,12 @@ float GiveItems(entity e, float beginarg, float endarg)
                                got += GiveResourceValue(e, RES_FUEL, op, val);
                                break;
                        default:
-                               FOREACH(StatusEffect, it.instanceOfBuff && buff_Available(it) && Buff_UndeprecateName(cmd) == it.netname,
+                               FOREACH(StatusEffect, it.instanceOfBuff && buff_Available(it) && Buff_CompatName(cmd) == it.netname,
                                {
                                        got += GiveBuff(e, it, op, val);
                                        break;
                                });
-                               FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(cmd) == it.netname, {
+                               FOREACH(Weapons, it != WEP_Null && (cmd == it.netname || cmd == it.m_deprecated_netname), {
                     got += GiveWeapon(e, it.m_id, op, val);
                     break;
                                });
index a00eb120ee8d9fa213e8e8fea68f4241220642bb..a0dd86f5199e3afde64ff2cf7782ee167c28dd39 100644 (file)
@@ -35,10 +35,6 @@ void W_GiveWeapon(entity e, int wep)
        if (!wep) return;
 
        STAT(WEAPONS, e) |= WepSet_FromWeapon(REGISTRY_GET(Weapons, wep));
-
-       if (IS_PLAYER(e)) {
-           Send_Notification(NOTIF_ONE, e, MSG_MULTI, ITEM_WEAPON_GOT, wep);
-    }
 }
 
 void W_PlayStrengthSound(entity player)
@@ -120,11 +116,14 @@ bool SUB_NoImpactCheck(entity this, entity toucher)
        // mirror-impact of something hitting the projectile instead of the
        // projectile hitting the something, or a touchareagrid one. Neither of
        // these stop the projectile from moving, so...
+       // NOTE: this notice is disabled to prevent spam as projectiles can hit content-less objects (other projectiles!)
+#if 0
        if(trace_dphitcontents == 0)
        {
                LOG_TRACEF("A hit from a projectile happened with no hit contents! DEBUG THIS, this should never happen for projectiles! Projectile will self-destruct. (edict: %i, classname: %s, origin: %v)", this, this.classname, this.origin);
                checkclient(this); // TODO: .health is checked in the engine with this, possibly replace with a QC function?
        }
+#endif
     if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
         return true;
     if (toucher == NULL && this.size != '0 0 0')
@@ -135,7 +134,8 @@ bool SUB_NoImpactCheck(entity this, entity toucher)
         traceline(this.origin - tic, this.origin + tic, MOVE_NORMAL, this);
         if (trace_fraction >= 1)
         {
-            LOG_TRACE("Odd... did not hit...?");
+            // NOTE: this notice can occur when projectiles hit non-world objects, better to not spam the console!
+            //LOG_TRACE("Odd... did not hit...?");
         }
         else if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
         {
index 686634c7acfdadae38a1a19e29d521643b78ebe5..c515d8fc9d018f6509100575dc30726fcadd1f2f 100644 (file)
@@ -256,7 +256,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
                }
 
                if(trace_ent.solid == SOLID_BSP || trace_ent.solid == SOLID_SLIDEBOX)
-                       Damage_DamageInfo(trace_endpos, bdamage, 0, 0, force, deathtype, trace_ent.species, this);
+                       Damage_DamageInfo(trace_endpos, (trace_ent.solid == SOLID_BSP), bdamage, 0, 0, force, deathtype, trace_ent.species, this);
 
                // if it is NULL we can't hurt it so stop now
                if (trace_ent == NULL || trace_fraction == 1)
@@ -417,7 +417,7 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
                        is_weapclip = true;
 
                if(!hit || hit.solid == SOLID_BSP || hit.solid == SOLID_SLIDEBOX)
-                       Damage_DamageInfo(start, damage * damage_fraction, 0, 0, max(1, force) * dir * damage_fraction, dtype, hit.species, this);
+                       Damage_DamageInfo(start, (hit && hit.solid == SOLID_BSP), damage * damage_fraction, 0, 0, max(1, force) * dir * damage_fraction, dtype, hit.species, this);
 
                if (hit && hit != WarpZone_trace_forent && hit != fireBullet_last_hit)  // Avoid self-damage (except after going through a warp); avoid hitting the same entity twice (engine bug).
                {
@@ -486,7 +486,7 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
                start = trace_endpos;
 
                if(hit.solid == SOLID_BSP)
-                       Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this);
+                       Damage_DamageInfo(start, true, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this);
        }
 
        if(headshot)
index cdc7d3169816a6548b37d4b4b02112ef18fa7e9d..47198b7d98fd8c790ff81084038625bb4f0a8fea 100644 (file)
@@ -2100,6 +2100,10 @@ void readlevelcvars()
        if(cvar("sv_allow_fullbright"))
                serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
 
+       serverflags &= ~SERVERFLAG_FORBID_PICKUPTIMER;
+       if(cvar("sv_forbid_pickuptimer"))
+               serverflags |= SERVERFLAG_FORBID_PICKUPTIMER;
+
        sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
 
        warmup_stage = cvar("g_warmup");
index 2629ceb7ade8fd12679934964a5a36b681852035..10bad91b2eb5adb5d9ca4e6b071b2a27bb770975 100644 (file)
@@ -27,4 +27,5 @@ g_vehicles 0
 sv_showspectators 0
 sv_taunt 0
 sv_maxidle_playertospectator 0
+sv_forbid_pickuptimer 1 // we don't want people seeing their pickup times in competitive matches
 g_ca_spectate_enemies -1 // block freeroam camera in CA matches
index 9d7a074764a84b92390ea0c6cdc33009ae403c82..22792e06ef6e6e15bb011be78d95f9d59dd1940c 100644 (file)
@@ -307,6 +307,7 @@ r_shadow_realtime_world_importlightentitiesfrommap 0 // Whether build process us
 cl_decals_fadetime 5
 cl_decals_time 1
 seta cl_gunalign 3 "Gun alignment; 1 = center, 3 = right, 4 = left; requires reconnect"
+seta cl_gunoffset "0 0 0" "Adjust the weapon viewmodel position, applies only to your own first person view and is relative to cl_gunalign"
 seta cl_nogibs 0 "reduce number of violence effects, or remove them totally"
 seta cl_particlegibs 0 "simpler gibs"
 seta cl_gibs_damageforcescale 1.5 "force to push around gibs"
@@ -320,7 +321,7 @@ seta cl_gibs_avelocity_scale 1 "how much angular velocity to use on gibs"
 seta cl_casings 1 "enable or disable bullet casings"
 seta cl_casings_shell_time 30 "shell casing lifetime"
 seta cl_casings_bronze_time 10 "bullet casings lifetime"
-seta cl_casings_ticrate 0.1 "ticrate for casings"
+seta cl_casings_ticrate 0.03125 "ticrate for casings"
 seta cl_casings_sloppy 1 "sloppy casings, may temporarily penetrate walls"
 seta cl_projectiles_sloppy 1 "sloppy projectiles, may temporarily penetrate walls"
 cl_stainmaps 0
@@ -870,6 +871,9 @@ scr_loadingscreen_scale 999
 scr_loadingscreen_scale_base 1
 scr_loadingscreen_scale_limit 2
 
+// in-game menu
+seta menu_gamemenu 1 "1: show in-game menu when esc is pressed; 0: show main menu when esc is pressed"
+
 // other config files
 exec effects-normal.cfg
 exec crosshairs.cfg
@@ -909,8 +913,6 @@ seta cl_vaporizerbeam_colorboost 0.7 "saturation of the vaporizer beam's color b
 
 seta cl_showspectators 0 "Show who's spectating you if server has sv_showspectators enabled"
 
-set cl_useenginerefdef 0
-
 set cl_rollkillspeed 10
 
 // Facility for config.cfg use ONLY.
index 1821fa1d7a56662efb77bb69da71ccbabc198bfb..cf7544a08194a07f7965bebe78ce5adaaebe42e6 100644 (file)
@@ -406,7 +406,7 @@ sv_gameplayfix_q2airaccelerate 1
 sv_gameplayfix_stepmultipletimes 1
 sv_gameplayfix_stepdown 2
 // only available in qc physics
-set sv_gameplayfix_stepdown_maxspeed 0 "maximum speed walking entities can be moving for stepping down to apply - requires sv_qcphysics 1"
+set sv_gameplayfix_stepdown_maxspeed 0 "maximum speed walking entities can be moving for stepping down to apply"
 
 // delay for "kill" to prevent abuse
 set g_balance_kill_delay 2 "timer before death when using the kill command"
@@ -529,6 +529,9 @@ set sv_db_saveasdump 0 "write server.db in dump format (loads slower, easier to
 // allow fullbright
 set sv_allow_fullbright 1 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay"
 
+// forbid pickup timer
+set sv_forbid_pickuptimer 0 "when set, clients won't be able to see the time they picked up an item"
+
 // auto-teams (team selection by player ID)
 // any player not listed is forced to spectate
 set g_forced_team_red "" "list of player IDs for red team"