]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/itemstime
authorTimePath <andrew.hardaker1995@gmail.com>
Sun, 2 Aug 2015 10:08:07 +0000 (20:08 +1000)
committerTimePath <andrew.hardaker1995@gmail.com>
Sun, 2 Aug 2015 10:08:07 +0000 (20:08 +1000)
# Conflicts:
# qcsrc/common/stats.qh

43 files changed:
_hud_common.cfg
_hud_descriptions.cfg
defaultXonotic.cfg
gfx/hud/default/fuelregen.tga [new file with mode: 0644]
gfx/hud/default/item_large_armor.tga [new file with mode: 0644]
gfx/hud/default/item_mega_health.tga [new file with mode: 0644]
gfx/hud/default/item_shield.tga [new file with mode: 0644]
gfx/hud/default/item_strength.tga [new file with mode: 0644]
gfx/hud/default/jetpack.tga [new file with mode: 0644]
gfx/hud/luminos/fuelregen.tga [new file with mode: 0644]
gfx/hud/luminos/item_large_armor.tga [new file with mode: 0644]
gfx/hud/luminos/item_mega_health.tga [new file with mode: 0644]
gfx/hud/luminos/item_shield.tga [new file with mode: 0644]
gfx/hud/luminos/item_strength.tga [new file with mode: 0644]
gfx/hud/luminos/jetpack.tga [new file with mode: 0644]
gfx/hud/old/item_large_armor.tga [new file with mode: 0644]
gfx/hud/old/item_mega_health.tga [new file with mode: 0644]
gfx/hud/old/item_shield.tga [new file with mode: 0644]
gfx/hud/old/item_strength.tga [new file with mode: 0644]
hud_luma.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/client/hud_config.qc
qcsrc/client/waypointsprites.qc
qcsrc/common/constants.qh
qcsrc/common/stats.qh
qcsrc/menu/classes.inc
qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc [new file with mode: 0644]
qcsrc/menu/xonotic/mainwindow.qc
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/command/vote.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/t_items.qc
qcsrc/server/t_items.qh
qcsrc/server/waypointsprites.qc

index b74eff9607999b19978d0128dd466824e1167585..ba81ef88ea520992f3db7e75a1c77ab3b28bf613 100644 (file)
@@ -41,6 +41,8 @@ seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_ch
 seta hud_panel_physics_acceleration_movingaverage 1 "use an averaging method for calculating acceleration instead of the real value"
 seta hud_panel_phisics_update_interval 0.0666 "how often (in seconds) numeric values get updated on screen"
 
+seta hud_panel_itemstime_progressbar_maxtime "30" "when left time is at least this amount, the status bar is full"
+
 // hud panel aliases
 alias hud_panel_radar_rotate "toggle hud_panel_radar_rotation 0 1 2 3 4"
 alias +hud_panel_radar_maximized "cl_cmd hud radar 1"
index 8bbe38942d196b630559e110e85b8c0f1e0a6fbd..163524c959abc1464ae752b5ecf2356c097c87b1 100644 (file)
@@ -312,3 +312,21 @@ seta hud_panel_buffs_bg_color_team "" "override panel color with team color in t
 seta hud_panel_buffs_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
 seta hud_panel_buffs_bg_border "" "if set to something else than \"\" = override default size of border around the background"
 seta hud_panel_buffs_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+
+seta hud_panel_itemstime "" "enable/disable this panel, it shows left time until important items (mega health, large armor, powerups, superweapons, etc...) respawn in the map: 1 when spectating, 2 even playing in warmup stage"
+seta hud_panel_itemstime_pos "" "position of this base of the panel"
+seta hud_panel_itemstime_size "" "size of this panel"
+seta hud_panel_itemstime_bg "" "if set to something else than \"\" = override default background"
+seta hud_panel_itemstime_bg_color "" "if set to something else than \"\" = override default panel background color"
+seta hud_panel_itemstime_bg_color_team "" "override panel color with team color in team based games"
+seta hud_panel_itemstime_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
+seta hud_panel_itemstime_bg_border "" "if set to something else than \"\" = override default size of border around the background"
+seta hud_panel_itemstime_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+seta hud_panel_itemstime_iconalign "" "0 = align icons to the left, 1 = align icons to the right"
+seta hud_panel_itemstime_progressbar "" "use progressbar behind icons"
+seta hud_panel_itemstime_progressbar_name "" "name of progressbar to use behind icons"
+seta hud_panel_itemstime_progressbar_reduced "" "progressbar is displayed only in the text field"
+seta hud_panel_itemstime_showspawned "" "show icons of already spawned items"
+seta hud_panel_itemstime_text "" "show text"
+seta hud_panel_itemstime_ratio "" "ratio between space reserved for text and icon width of each item entry (min value is 2)"
+seta hud_panel_itemstime_size_dinamic "" "reduce panel size by removing spacing beetwen items"
index 1d1d8a5af9e5299e2e2114235eaedec511dc2347..d996e32e4f7f3dea1059a50804053e68f7363227 100644 (file)
@@ -758,6 +758,7 @@ seta g_waypointsprite_crosshairfadedistance 150 "distance in virtual pixels from
 seta g_waypointsprite_distancefadealpha 1 "alpha multiplier near distance"
 seta g_waypointsprite_distancefadescale 0.7 "scale multiplier near the distance"
 seta g_waypointsprite_distancefadedistancemultiplier 0.5 "distance in map sizes from distance where to stop fading"
+seta g_waypointsprite_itemstime 2 "show waypoints to indicate that some important items (mega health, large armor) are about to respawn: 1 when spectating, 2 even playing in warmup stage"
 set g_waypointsprite_spam 0 "Debugging feature. Set to 10 and load courtfun in race mode to test."
 alias "g_waypointsprite_personal"      "impulse 30"
 alias "g_waypointsprite_personal_p"    "impulse 31"
@@ -779,6 +780,8 @@ seta g_waypointsprite_turrets 1 "disable turret waypoints"
 seta g_waypointsprite_turrets_maxdist 5000 "max distace for turret sprites"
 seta g_waypointsprite_tactical 1 "tactical overlay on turrets when in a vehicle"
 
+set sv_itemstime 1 "enable networking of left time until respawn for items such as mega health and large armor"
+
 // so it can be stuffcmd-ed still
 set cl_gravity 800     "but ignored anyway"
 
diff --git a/gfx/hud/default/fuelregen.tga b/gfx/hud/default/fuelregen.tga
new file mode 100644 (file)
index 0000000..3f3a891
Binary files /dev/null and b/gfx/hud/default/fuelregen.tga differ
diff --git a/gfx/hud/default/item_large_armor.tga b/gfx/hud/default/item_large_armor.tga
new file mode 100644 (file)
index 0000000..6d84530
Binary files /dev/null and b/gfx/hud/default/item_large_armor.tga differ
diff --git a/gfx/hud/default/item_mega_health.tga b/gfx/hud/default/item_mega_health.tga
new file mode 100644 (file)
index 0000000..75515eb
Binary files /dev/null and b/gfx/hud/default/item_mega_health.tga differ
diff --git a/gfx/hud/default/item_shield.tga b/gfx/hud/default/item_shield.tga
new file mode 100644 (file)
index 0000000..da87b64
Binary files /dev/null and b/gfx/hud/default/item_shield.tga differ
diff --git a/gfx/hud/default/item_strength.tga b/gfx/hud/default/item_strength.tga
new file mode 100644 (file)
index 0000000..ed0e8a8
Binary files /dev/null and b/gfx/hud/default/item_strength.tga differ
diff --git a/gfx/hud/default/jetpack.tga b/gfx/hud/default/jetpack.tga
new file mode 100644 (file)
index 0000000..ba76c45
Binary files /dev/null and b/gfx/hud/default/jetpack.tga differ
diff --git a/gfx/hud/luminos/fuelregen.tga b/gfx/hud/luminos/fuelregen.tga
new file mode 100644 (file)
index 0000000..3f3a891
Binary files /dev/null and b/gfx/hud/luminos/fuelregen.tga differ
diff --git a/gfx/hud/luminos/item_large_armor.tga b/gfx/hud/luminos/item_large_armor.tga
new file mode 100644 (file)
index 0000000..6d84530
Binary files /dev/null and b/gfx/hud/luminos/item_large_armor.tga differ
diff --git a/gfx/hud/luminos/item_mega_health.tga b/gfx/hud/luminos/item_mega_health.tga
new file mode 100644 (file)
index 0000000..75515eb
Binary files /dev/null and b/gfx/hud/luminos/item_mega_health.tga differ
diff --git a/gfx/hud/luminos/item_shield.tga b/gfx/hud/luminos/item_shield.tga
new file mode 100644 (file)
index 0000000..da87b64
Binary files /dev/null and b/gfx/hud/luminos/item_shield.tga differ
diff --git a/gfx/hud/luminos/item_strength.tga b/gfx/hud/luminos/item_strength.tga
new file mode 100644 (file)
index 0000000..ed0e8a8
Binary files /dev/null and b/gfx/hud/luminos/item_strength.tga differ
diff --git a/gfx/hud/luminos/jetpack.tga b/gfx/hud/luminos/jetpack.tga
new file mode 100644 (file)
index 0000000..ba76c45
Binary files /dev/null and b/gfx/hud/luminos/jetpack.tga differ
diff --git a/gfx/hud/old/item_large_armor.tga b/gfx/hud/old/item_large_armor.tga
new file mode 100644 (file)
index 0000000..5f43ab1
Binary files /dev/null and b/gfx/hud/old/item_large_armor.tga differ
diff --git a/gfx/hud/old/item_mega_health.tga b/gfx/hud/old/item_mega_health.tga
new file mode 100644 (file)
index 0000000..71c3d6d
Binary files /dev/null and b/gfx/hud/old/item_mega_health.tga differ
diff --git a/gfx/hud/old/item_shield.tga b/gfx/hud/old/item_shield.tga
new file mode 100644 (file)
index 0000000..58cb73b
Binary files /dev/null and b/gfx/hud/old/item_shield.tga differ
diff --git a/gfx/hud/old/item_strength.tga b/gfx/hud/old/item_strength.tga
new file mode 100644 (file)
index 0000000..0f7689d
Binary files /dev/null and b/gfx/hud/old/item_strength.tga differ
index 36af8de6758b798ca0db0fb34c15a2156bb42b33..d0614c316a966ccc09115afd87a8e4ab7c0d936f 100644 (file)
@@ -26,7 +26,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 "15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 "
+seta _hud_panelorder "15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.005000"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.030000 0.260000"
+seta hud_panel_itemstime_size "0.070000 0.230000"
+seta hud_panel_itemstime_bg "border_itemstime"
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "0"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "0"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "2"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 054254c06b0da9593fbfa09c976c0930612dda41..5d2c556721c28da4c6983b4e3aa633e8df6a0f33 100644 (file)
@@ -26,7 +26,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 "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 "
+seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.030000 0.260000"
+seta hud_panel_itemstime_size "0.070000 0.230000"
+seta hud_panel_itemstime_bg "border_itemstime"
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "0"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "0"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "2"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 192ef68d91f5f61cd67fd6eb2474b122d6ec97c2..447fda8a28c4e09fb3a8f13c50cc897419c2d0a9 100644 (file)
@@ -26,7 +26,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 "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 "
+seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.000000 0.310000"
+seta hud_panel_itemstime_size "0.070000 0.180000"
+seta hud_panel_itemstime_bg ""
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "0"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "0"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "2"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 4045cc44dd4efdef79955630df919c7ee55df8a3..4fe2a1fd99a018b535e0524b7c9fa0020629361a 100644 (file)
@@ -26,7 +26,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 "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 "
+seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.000000 0.310000"
+seta hud_panel_itemstime_size "0.070000 0.180000"
+seta hud_panel_itemstime_bg ""
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "0"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "0"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "2"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 4ec02c1b1c26afc2615949577ca07566a137754a..c3e759c4f1a15c1e2acbfd272183018070eb70ed 100644 (file)
@@ -26,7 +26,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 "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 "
+seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.020000 0.490000"
+seta hud_panel_itemstime_size "0.090000 0.140000"
+seta hud_panel_itemstime_bg "0"
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "1"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "1"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "3.5"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 6728107fb104c8998a94cbf6855d37f7df0ff9dc..b08937f62cc0f0ae36eae67558a694870af08ccd 100644 (file)
@@ -26,7 +26,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 "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 "
+seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 17 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.01"
@@ -311,4 +311,22 @@ seta hud_panel_buffs_bg_alpha ""
 seta hud_panel_buffs_bg_border ""
 seta hud_panel_buffs_bg_padding ""
 
+seta hud_panel_itemstime 2
+seta hud_panel_itemstime_pos "0.000000 0.290000"
+seta hud_panel_itemstime_size "0.150000 0.060000"
+seta hud_panel_itemstime_bg "0"
+seta hud_panel_itemstime_bg_color ""
+seta hud_panel_itemstime_bg_color_team ""
+seta hud_panel_itemstime_bg_alpha ""
+seta hud_panel_itemstime_bg_border ""
+seta hud_panel_itemstime_bg_padding ""
+seta hud_panel_itemstime_iconalign "0"
+seta hud_panel_itemstime_progressbar "0"
+seta hud_panel_itemstime_progressbar_name "progressbar"
+seta hud_panel_itemstime_progressbar_reduced "0"
+seta hud_panel_itemstime_showspawned "0"
+seta hud_panel_itemstime_text "1"
+seta hud_panel_itemstime_ratio "2"
+seta hud_panel_itemstime_size_dinamic "1"
+
 menu_sync
index 0cd212f329a3e3af34877f540b1feeb4a20cae51..dd7cf2f68eab435a75fd19651ce231854ef9941d 100644 (file)
@@ -173,6 +173,7 @@ float autocvar_g_waypointsprite_edgeoffset_left;
 float autocvar_g_waypointsprite_edgeoffset_right;
 float autocvar_g_waypointsprite_edgeoffset_top;
 float autocvar_g_waypointsprite_fontsize;
+int autocvar_g_waypointsprite_itemstime;
 float autocvar_g_waypointsprite_minalpha;
 float autocvar_g_waypointsprite_minscale;
 float autocvar_g_waypointsprite_normdistance;
@@ -269,6 +270,16 @@ float autocvar_hud_panel_healtharmor_progressbar_gfx_damage;
 float autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth;
 float autocvar_hud_panel_healtharmor_progressbar_gfx_smooth;
 int autocvar_hud_panel_healtharmor_text;
+int autocvar_hud_panel_itemstime = 2;
+float autocvar_hud_panel_itemstime_size_dinamic = 1;
+float autocvar_hud_panel_itemstime_ratio = 2;
+int autocvar_hud_panel_itemstime_iconalign;
+bool autocvar_hud_panel_itemstime_progressbar = 0;
+float autocvar_hud_panel_itemstime_progressbar_maxtime;
+string autocvar_hud_panel_itemstime_progressbar_name = "progressbar";
+float autocvar_hud_panel_itemstime_progressbar_reduced;
+bool autocvar_hud_panel_itemstime_showspawned;
+int autocvar_hud_panel_itemstime_text = 1;
 bool autocvar_hud_panel_infomessages;
 bool autocvar_hud_panel_infomessages_flip;
 bool autocvar_hud_panel_modicons;
index e0dc1d91b7c93babe7324ae3cdc585163643006e..34a23f1b4654b183c5b465f232ed81f41d1308b4 100644 (file)
@@ -4574,6 +4574,212 @@ void HUD_Buffs(void)
        draw_endBoldFont();
 }
 
+// ItemsTime (#XX)
+//
+const float ITEMSTIME_MAXITEMS = 10;
+float ItemsTime_time[ITEMSTIME_MAXITEMS];
+string GetItemsTimePicture(float i)
+{
+       switch(i)
+       {
+               case 0: return "item_large_armor";
+               case 1: return "item_mega_health";
+               case 2: return "item_strength";
+               case 3: return "item_shield";
+               case 4: return "item_mega_health";
+               case 5: return "item_strength";
+               case 6: return "item_shield";
+               case 7: return "fuelregen";
+               case 8: return "jetpack";
+               case 9: return "superweapons";
+               default: return "";
+       }
+}
+
+void DrawItemsTimeItem(vector myPos, vector mySize, float ar, float itemcode)
+{
+       float t = 0;
+       vector color = '0 0 0';
+       float picalpha;
+       if(ItemsTime_time[itemcode] <= time)
+       {
+               float BLINK_FACTOR = 0.15;
+               float BLINK_BASE = 0.85;
+               float BLINK_FREQ = 5;
+               picalpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
+       }
+       else
+       {
+               picalpha = 1;
+               t = floor(ItemsTime_time[itemcode] - time + 0.999);
+               if(t < 5)
+                       color = '0.7 0 0';
+               else if(t < 10)
+                       color = '0.7 0.7 0';
+               else
+                       color = '1 1 1';
+       }
+
+       vector picpos, numpos;
+       if(autocvar_hud_panel_itemstime_iconalign)
+       {
+               numpos = myPos;
+               picpos = myPos + eX * (ar - 1) * mySize_y;
+       }
+       else
+       {
+               numpos = myPos + eX * mySize_y;
+               picpos = myPos;
+       }
+
+       if(t > 0 && autocvar_hud_panel_itemstime_progressbar)
+       {
+               vector p_pos, p_size;
+               if(autocvar_hud_panel_itemstime_progressbar_reduced)
+               {
+                       p_pos = numpos;
+                       p_size = eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y;
+               }
+               else
+               {
+                       p_pos = myPos;
+                       p_size = mySize;
+               }
+               HUD_Panel_DrawProgressBar(p_pos, p_size, autocvar_hud_panel_itemstime_progressbar_name, t/autocvar_hud_panel_itemstime_progressbar_maxtime, 0, autocvar_hud_panel_itemstime_iconalign, color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+
+       if(t > 0 && autocvar_hud_panel_itemstime_text)
+               drawstring_aspect(numpos, ftos(t), eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawpic_aspect_skin(picpos, GetItemsTimePicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL);
+}
+
+void HUD_ItemsTime(void)
+{
+       if(!autocvar__hud_configure)
+       {
+               if(!(
+                       (autocvar_hud_panel_itemstime == 1 && spectatee_status != 0)
+               ||      (autocvar_hud_panel_itemstime == 2 && (spectatee_status != 0 || warmup_stage))
+                       )) { return; }
+
+               ItemsTime_time[0] = getstatf(STAT_ARMOR_LARGE_TIME);
+               ItemsTime_time[1] = getstatf(STAT_HEALTH_MEGA_TIME);
+               ItemsTime_time[2] = getstatf(STAT_INVISIBLE_TIME);
+               ItemsTime_time[3] = getstatf(STAT_SPEED_TIME);
+               ItemsTime_time[4] = getstatf(STAT_EXTRALIFE_TIME);
+               ItemsTime_time[5] = getstatf(STAT_STRENGTH_TIME);
+               ItemsTime_time[6] = getstatf(STAT_SHIELD_TIME);
+               ItemsTime_time[7] = getstatf(STAT_FUELREGEN_TIME);
+               ItemsTime_time[8] = getstatf(STAT_JETPACK_TIME);
+               ItemsTime_time[9] = getstatf(STAT_SUPERWEAPONS_TIME);
+       }
+       else
+       {
+               // do not show here mutator-dependent items
+               ItemsTime_time[0] = time + 0;
+               ItemsTime_time[1] = time + 8;
+               ItemsTime_time[2] = -1; // mutator-dependent
+               ItemsTime_time[3] = -1; // mutator-dependent
+               ItemsTime_time[4] = -1; // mutator-dependent
+               ItemsTime_time[5] = time + 0;
+               ItemsTime_time[6] = time + 4;
+               ItemsTime_time[7] = time + 49;
+               ItemsTime_time[8] = -1;
+               ItemsTime_time[9] = time + 28;
+       }
+
+       float i;
+       float count = 0;
+       if (autocvar_hud_panel_itemstime_showspawned)
+               for (i = 0; i < ITEMSTIME_MAXITEMS; ++i)
+                       count += (ItemsTime_time[i] != -1);
+       else
+               for (i = 0; i < ITEMSTIME_MAXITEMS; ++i)
+                       count += (ItemsTime_time[i] > time);
+       if (count == 0)
+               return;
+
+       HUD_Panel_UpdateCvars();
+
+       vector pos, mySize;
+       pos = panel_pos;
+       mySize = panel_size;
+
+       if(panel_bg_padding)
+       {
+               pos += '1 1 0' * panel_bg_padding;
+               mySize -= '2 2 0' * panel_bg_padding;
+       }
+
+       float rows, columns;
+       float ar = max(2, autocvar_hud_panel_itemstime_ratio) + 1;
+       rows = HUD_GetRowCount(count, mySize, ar);
+       columns = ceil(count/rows);
+
+       vector itemstime_size = eX * mySize.x*(1/columns) + eY * mySize.y*(1/rows);
+
+       vector offset = '0 0 0';
+       float newSize;
+       if(autocvar_hud_panel_itemstime_size_dinamic)
+       {
+               if(autocvar__hud_configure)
+               if(menu_enabled != 2)
+                       HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
+
+               // reduce panel to avoid spacing items
+               if(itemstime_size.x / itemstime_size.y < ar)
+               {
+                       newSize = rows * itemstime_size.x / ar;
+                       pos.y += (mySize.y - newSize) / 2;
+                       mySize.y = newSize;
+                       itemstime_size.y = mySize.y / rows;
+               }
+               else
+               {
+                       newSize = columns * itemstime_size.y * ar;
+                       pos.x += (mySize.x - newSize) / 2;
+                       mySize.x = newSize;
+                       itemstime_size.x = mySize.x / columns;
+               }
+               panel_pos = pos - '1 1 0' * panel_bg_padding;
+               panel_size = mySize + '2 2 0' * panel_bg_padding;
+       }
+       else
+       {
+               if(itemstime_size.x/itemstime_size.y > ar)
+               {
+                       newSize = ar * itemstime_size.y;
+                       offset.x = itemstime_size.x - newSize;
+                       pos.x += offset.x/2;
+                       itemstime_size.x = newSize;
+               }
+               else
+               {
+                       newSize = 1/ar * itemstime_size.x;
+                       offset.y = itemstime_size.y - newSize;
+                       pos.y += offset.y/2;
+                       itemstime_size.y = newSize;
+               }
+       }
+
+       HUD_Panel_DrawBg(1);
+
+       float row = 0, column = 0;
+       for (i = 0; i < ITEMSTIME_MAXITEMS; ++i) {
+               if (ItemsTime_time[i] == -1)
+                       continue;
+               if (!autocvar_hud_panel_itemstime_showspawned)
+                       if (ItemsTime_time[i] <= time)
+                               continue;
+               DrawItemsTimeItem(pos + eX * column * (itemstime_size.x + offset.x) + eY * row * (itemstime_size.y + offset.y), itemstime_size, ar, i);
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       column = column + 1;
+               }
+       }
+}
 
 /*
 ==================
index 5bc2ca4a736c1529b6b91a2bac7478a6291f5e51..90a17b80be91b500fc2a0f8006098fdd618a956e 100644 (file)
@@ -155,7 +155,9 @@ int prev_p_health, prev_p_armor;
        HUD_PANEL(INFOMESSAGES , HUD_InfoMessages , infomessages)                                                                                                               \
        HUD_PANEL(PHYSICS      , HUD_Physics      , physics)                                                                                                                    \
        HUD_PANEL(CENTERPRINT  , HUD_CenterPrint  , centerprint)                                                                                                                \
-       HUD_PANEL(BUFFS        , HUD_Buffs        , buffs)
+       HUD_PANEL(BUFFS        , HUD_Buffs        , buffs) \
+       HUD_PANEL(ITEMSTIME    , HUD_ItemsTime    , itemstime) \
+       // always add new panels to the end of list
 
 #define HUD_PANEL(NAME, draw_func, name)                                                                                                                                                       \
        int HUD_PANEL_##NAME;                                                                                                                                                                                   \
index 4b55bb40e9850ab92c104210f6d2fb3712373c93..dc37fea71ad08b3562d2efbf390922da0d3b55ef 100644 (file)
@@ -202,6 +202,16 @@ void HUD_Panel_ExportCfg(string cfgname)
                                        HUD_Write_PanelCvar_q("_fade_subsequent_minfontsize");
                                        HUD_Write_PanelCvar_q("_fade_minfontsize");
                                        break;
+                               case HUD_PANEL_ITEMSTIME:
+                                       HUD_Write_PanelCvar_q("_iconalign");
+                                       HUD_Write_PanelCvar_q("_progressbar");
+                                       HUD_Write_PanelCvar_q("_progressbar_name");
+                                       HUD_Write_PanelCvar_q("_progressbar_reduced");
+                                       HUD_Write_PanelCvar_q("_showspawned");
+                                       HUD_Write_PanelCvar_q("_text");
+                                       HUD_Write_PanelCvar_q("_ratio");
+                                       HUD_Write_PanelCvar_q("_size_dinamic");
+                                       break;
                        }
                        HUD_Write("\n");
                }
index 0b32de7e920b5e598d1a3aaed844f8f1f22941cb..c3b724f7bda3df74899b86d79363cb7c7f0562ed 100644 (file)
@@ -166,6 +166,10 @@ vector drawspritetext(vector o, float ang, float minwidth, vector rgb, float a,
 
 float spritelookupblinkvalue(string s)
 {
+       if(substring(s, 0, 4) == "wpn-")
+       if(get_weaponinfo(stof(substring(s, 4, strlen(s)))).spawnflags & WEP_FLAG_SUPERWEAPON)
+               return 2;
+
        switch(s)
        {
                case "ons-cp-atck-neut": return 2;
@@ -173,6 +177,8 @@ float spritelookupblinkvalue(string s)
                case "ons-cp-atck-blue": return 2;
                case "ons-cp-dfnd-red":  return 0.5;
                case "ons-cp-dfnd-blue": return 0.5;
+               case "item_health_mega": return 2;
+               case "item_armor_large": return 2;
                case "item-invis":       return 2;
                case "item-extralife":   return 2;
                case "item-speed":       return 2;
@@ -245,6 +251,8 @@ string spritelookuptext(string s)
                case "dom-blue": return _("Control point");
                case "dom-yellow": return _("Control point");
                case "dom-pink": return _("Control point");
+               case "item_health_mega": return _("Mega health");
+               case "item_armor_large": return _("Large armor");
                case "item-invis": return _("Invisibility");
                case "item-extralife": return _("Extra life");
                case "item-speed": return _("Speed");
@@ -346,6 +354,14 @@ void Draw_WaypointSprite()
        // choose the sprite
        switch(self.rule)
        {
+               case SPRITERULE_SPECTATOR:
+                       if(!(
+                               (autocvar_g_waypointsprite_itemstime == 1 && t == NUM_SPECTATOR + 1)
+                       ||      (autocvar_g_waypointsprite_itemstime == 2 && (t == NUM_SPECTATOR + 1 || warmup_stage))
+                               ))
+                               return;
+                       spriteimage = self.netname;
+                       break;
                case SPRITERULE_DEFAULT:
                        if(self.team)
                        {
@@ -399,7 +415,7 @@ void Draw_WaypointSprite()
        {
                if(self.helpme && time < self.helpme)
                        a *= SPRITE_HELPME_BLINK;
-               else
+               else if(!self.lifetime) // fading out waypoints don't blink
                        a *= spritelookupblinkvalue(spriteimage);
        }
 
@@ -409,7 +425,7 @@ void Draw_WaypointSprite()
                a = 1;
        }
 
-       if(a <= 0)
+       if(a <= 0.003)
                return;
 
        rgb = fixrgbexcess(rgb);
index 939c6d7c17ffaf882155ac46c63ffed740fd7e86..580c7b4a11a8143d134816c3333fb1e803ea91b6 100644 (file)
@@ -120,6 +120,7 @@ const int ENT_CLIENT_HEALING_ORB = 80;
 
 const int SPRITERULE_DEFAULT = 0;
 const int SPRITERULE_TEAMPLAY = 1;
+const int SPRITERULE_SPECTATOR = 2;
 
 const int RADARICON_NONE = 0;
 const int RADARICON_FLAG = 1;
index fa52737631f93bf0599097b28ae9041b71142a27..dbe9a13901a86c25ce813146c00c0ba6d64d6f0a 100644 (file)
@@ -109,19 +109,18 @@ const int STAT_OK_AMMO_CHARGE         = 85;
 const int STAT_OK_AMMO_CHARGEPOOL     = 86;
 const int STAT_FROZEN                 = 87;
 const int STAT_REVIVE_PROGRESS        = 88;
-const int STAT_WEAPONSINMAP           = 89;
-const int STAT_WEAPONSINMAP2          = 90;
-const int STAT_WEAPONSINMAP3          = 91;
-// 92 empty?
-// 93 empty?
-// 94 empty?
-// 95 empty?
-// 96 empty?
-// 97 empty?
-// 98 empty?
+const int STAT_ARMOR_LARGE_TIME       = 89;
+const int STAT_HEALTH_MEGA_TIME       = 90;
+const int STAT_INVISIBLE_TIME         = 91;
+const int STAT_SPEED_TIME             = 92;
+const int STAT_EXTRALIFE_TIME         = 93;
+const int STAT_STRENGTH_TIME          = 94;
+const int STAT_SHIELD_TIME            = 95;
+const int STAT_FUELREGEN_TIME         = 96;
+const int STAT_JETPACK_TIME           = 97;
+const int STAT_SUPERWEAPONS_TIME      = 98;
 // 99 empty?
 
-
 /* The following stats change depending on the gamemode, so can share the same ID */
 // IDs 100 to 104 reserved for gamemodes
 
@@ -171,7 +170,9 @@ const int STAT_PL_CROUCH_MAX3         = 119;
 const int STAT_PL_CROUCH_VIEW_OFS1    = 117;
 const int STAT_PL_CROUCH_VIEW_OFS2    = 118;
 const int STAT_PL_CROUCH_VIEW_OFS3    = 119;
-// 120 empty?
+const int STAT_WEAPONSINMAP           = 120;
+const int STAT_WEAPONSINMAP2          = 121;
+const int STAT_WEAPONSINMAP3          = 122;
 // 121 empty?
 // 122 empty?
 // 123 empty?
index 5b0e417f94965c5c1f4899b49a904575c3366c4c..8d47809a35da15b47904200dda71f1084331e1f0 100644 (file)
@@ -48,6 +48,7 @@
 #include "xonotic/dialog_hudpanel_engineinfo.qc"
 #include "xonotic/dialog_hudpanel_healtharmor.qc"
 #include "xonotic/dialog_hudpanel_infomessages.qc"
+#include "xonotic/dialog_hudpanel_itemstime.qc"
 #include "xonotic/dialog_hudpanel_modicons.qc"
 #include "xonotic/dialog_hudpanel_notification.qc"
 #include "xonotic/dialog_hudpanel_physics.qc"
diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc b/qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc
new file mode 100644 (file)
index 0000000..a643617
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef DIALOG_HUDPANEL_ITEMSTIME_H
+#define DIALOG_HUDPANEL_ITEMSTIME_H
+#include "rootdialog.qc"
+CLASS(XonoticHUDItemsTimeDialog, XonoticRootDialog)
+       METHOD(XonoticHUDItemsTimeDialog, fill, void(entity))
+       ATTRIB(XonoticHUDItemsTimeDialog, title, string, _("Items Time Panel"))
+       ATTRIB(XonoticHUDItemsTimeDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
+       ATTRIB(XonoticHUDItemsTimeDialog, intendedWidth, float, 0.4)
+       ATTRIB(XonoticHUDItemsTimeDialog, rows, float, 15)
+       ATTRIB(XonoticHUDItemsTimeDialog, columns, float, 4)
+       ATTRIB(XonoticHUDItemsTimeDialog, name, string, "HUDitemstime")
+ENDCLASS(XonoticHUDItemsTimeDialog)
+#endif
+
+#ifdef IMPLEMENTATION
+void XonoticHUDItemsTimeDialog_fill(entity me)
+{
+       entity e;
+       string panelname = "itemstime";
+
+       me.TR(me);
+               me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_itemstime"));
+                       e.addValue(e, ZCTX(_("PNL^Disabled")), "0");
+                       e.addValue(e, ZCTX(_("PNL^Enabled spectating")), "1");
+                       e.addValue(e, ZCTX(_("PNL^Enabled even playing in warmup")), "2");
+                       e.configureXonoticTextSliderValues(e);
+
+       DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+
+       me.TR(me);
+               me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Align icon:")));
+                       me.TD(me, 1, 2.6/2, e = makeXonoticRadioButton(2, "hud_panel_itemstime_iconalign", "0", _("Left")));
+                       me.TD(me, 1, 2.6/2, e = makeXonoticRadioButton(2, "hud_panel_itemstime_iconalign", "1", _("Right")));
+       me.TR(me);
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_itemstime_progressbar", _("Enable status bar")));
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_itemstime_progressbar_reduced", _("Reduced")));
+                       setDependent(e, "hud_panel_itemstime_progressbar", 1, 1);
+       me.TR(me);
+               me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Text/icon ratio:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(2, 8, 0.5, "hud_panel_itemstime_ratio"));
+       me.TR(me);
+               me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_itemstime_showspawned", _("Show spawned items")));
+       me.TR(me);
+               me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_itemstime_size_dinamic", _("Dinamic size")));
+}
+#endif
index 7af6e9363d3ce440dbc60d944a55b400c77d3475..2a4635a4089533f0819f372fee73f75095f4ce78 100644 (file)
@@ -132,6 +132,10 @@ void MainWindow_configureMainWindow(entity me)
        i.configureDialog(i);
        me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 
+       i = NEW(XonoticHUDItemsTimeDialog);
+       i.configureDialog(i);
+       me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
 
        // dialogs used by settings
        me.userbindEditDialog = i = NEW(XonoticUserbindEditDialog);
index 51b14aa0812e2c2af73a354b7cd204608beb736c..8ca128282e36bf477106af5f40af3d4756219372 100644 (file)
@@ -626,6 +626,7 @@ float autocvar_sv_gameplayfix_q2airaccelerate;
 int autocvar_sv_gentle;
 #define autocvar_sv_gravity cvar("sv_gravity")
 string autocvar_sv_intermission_cdtrack;
+float autocvar_sv_itemstime;
 float autocvar_sv_jumpspeedcap_max;
 float autocvar_sv_jumpspeedcap_max_disable_on_ramps;
 float autocvar_sv_jumpspeedcap_min;
index 8ca2f6c35f8771d2b58995bed78c0ca9442ec49a..38ac065701b1b207d5027f23831cf287d905d750 100644 (file)
@@ -195,6 +195,7 @@ void PutObserverInServer (void)
 
        if(IS_REAL_CLIENT(self))
        {
+               Item_ItemsTime_SetTimesForPlayer(self);
                msg_entity = self;
                WriteByte(MSG_ONE, SVC_SETVIEW);
                WriteEntity(MSG_ONE, self);
@@ -506,6 +507,9 @@ void PutClientInServer (void)
                else
                        self.superweapons_finished = 0;
 
+               if(!warmup_stage)
+                       Item_ItemsTime_ResetTimesForPlayer(self);
+
                if(g_weaponarena_random) // WEAPONTODO: more stuff that should be in a mutator. also: rename those cvars
                {
                        if(g_weaponarena_random_with_blaster)
index 4be48e124e82b98d38fb26c41c5df7dfe18efc29..6ea03dd43fdaad2c88dca9ee34ce0b0171a73adc 100644 (file)
@@ -462,6 +462,8 @@ void ReadyRestart_force()
        // disable the warmup global for the server
        warmup_stage = 0; // once the game is restarted the game is in match stage
 
+       Item_ItemsTime_ResetTimes();
+
        // reset the .ready status of all players (also spectators)
        FOR_EACH_REALCLIENT(tmp_player) { tmp_player.ready = 0; }
        readycount = 0;
index 1fbc8d09a50587b2c30094d4fabe2bf8bde001b5..cab4d569fc6061a4628873cbb5f5358be128352a 100644 (file)
@@ -110,6 +110,7 @@ void setanim(entity e, vector anim, float looping, float override, float restart
 
 .float species;
 
+.float scheduledrespawntime;
 .float respawntime;
 .float respawntimejitter;
 //.float       chasecam;
@@ -512,6 +513,17 @@ const float ACTIVE_TOGGLE  = 3;
 .void (float act_state) setactive;
 .entity realowner;
 
+.float item_armor_large_time;
+.float item_health_mega_time;
+.float item_invisible_time;
+.float item_speed_time;
+.float item_extralife_time;
+.float item_strength_time;
+.float item_shield_time;
+.float item_fuelregen_time;
+.float item_jetpack_time;
+.float item_superweapons_time;
+
 //float serverflags;
 
 .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
index c913e86e75a7d5b72346fe6c67b5dbca7f3ea65c..98417c73ebda9ae11d154887ffffe8f6b1205478 100644 (file)
@@ -574,6 +574,7 @@ void spawnfunc___init_dedicated_server(void)
 void Map_MarkAsRecent(string m);
 float world_already_spawned;
 void Nagger_Init();
+void Item_ItemsTime_Init();
 void ClientInit_Spawn();
 void WeaponStats_Init();
 void WeaponStats_Shutdown();
@@ -816,6 +817,19 @@ void spawnfunc_worldspawn (void)
 
        addstat(STAT_ARC_HEAT, AS_FLOAT, arc_heat_percent);
 
+       // items time
+       addstat(STAT_ARMOR_LARGE_TIME, AS_FLOAT, item_armor_large_time);
+       addstat(STAT_HEALTH_MEGA_TIME, AS_FLOAT, item_health_mega_time);
+       addstat(STAT_INVISIBLE_TIME, AS_FLOAT, item_invisible_time);
+       addstat(STAT_SPEED_TIME, AS_FLOAT, item_speed_time);
+       addstat(STAT_EXTRALIFE_TIME, AS_FLOAT, item_extralife_time);
+       addstat(STAT_STRENGTH_TIME, AS_FLOAT, item_strength_time);
+       addstat(STAT_SHIELD_TIME, AS_FLOAT, item_shield_time);
+       addstat(STAT_FUELREGEN_TIME, AS_FLOAT, item_fuelregen_time);
+       addstat(STAT_JETPACK_TIME, AS_FLOAT, item_jetpack_time);
+       addstat(STAT_SUPERWEAPONS_TIME, AS_FLOAT, item_superweapons_time);
+       Item_ItemsTime_Init();
+
        // freeze attacks
        addstat(STAT_FROZEN, AS_INT, frozen);
        addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, revive_progress);
index 4e3e376e3b26625d03bb5c8ff1cd8f22c20a60c0..2ad260769979496d7f42108b26d290e598d81973 100644 (file)
@@ -412,6 +412,159 @@ void Item_Think()
        }
 }
 
+float it_armor_large_time;
+float it_health_mega_time;
+float it_invisible_time;
+float it_speed_time;
+float it_extralife_time;
+float it_strength_time;
+float it_shield_time;
+float it_fuelregen_time;
+float it_jetpack_time;
+float it_superweapons_time;
+
+void Item_ItemsTime_Init()
+{
+       it_armor_large_time = -1;
+       it_health_mega_time = -1;
+       it_invisible_time = -1;
+       it_speed_time = -1;
+       it_extralife_time = -1;
+       it_strength_time = -1;
+       it_shield_time = -1;
+       it_fuelregen_time = -1;
+       it_jetpack_time = -1;
+       it_superweapons_time = -1;
+}
+void Item_ItemsTime_ResetTimes()
+{
+       it_armor_large_time = (it_armor_large_time == -1) ? -1 : 0;
+       it_health_mega_time = (it_health_mega_time == -1) ? -1 : 0;
+       it_invisible_time   = (it_invisible_time   == -1) ? -1 : 0;
+       it_speed_time       = (it_speed_time       == -1) ? -1 : 0;
+       it_extralife_time   = (it_extralife_time   == -1) ? -1 : 0;
+       it_strength_time    = (it_strength_time    == -1) ? -1 : 0;
+       it_shield_time      = (it_shield_time      == -1) ? -1 : 0;
+       it_fuelregen_time   = (it_fuelregen_time   == -1) ? -1 : 0;
+       it_jetpack_time     = (it_jetpack_time     == -1) ? -1 : 0;
+       it_superweapons_time= (it_superweapons_time== -1) ? -1 : 0;
+}
+void Item_ItemsTime_ResetTimesForPlayer(entity e)
+{
+       e.item_armor_large_time = (it_armor_large_time == -1) ? -1 : 0;
+       e.item_health_mega_time = (it_health_mega_time == -1) ? -1 : 0;
+       e.item_invisible_time   = (it_invisible_time   == -1) ? -1 : 0;
+       e.item_speed_time       = (it_speed_time       == -1) ? -1 : 0;
+       e.item_extralife_time   = (it_extralife_time   == -1) ? -1 : 0;
+       e.item_strength_time    = (it_strength_time    == -1) ? -1 : 0;
+       e.item_shield_time      = (it_shield_time      == -1) ? -1 : 0;
+       e.item_fuelregen_time   = (it_fuelregen_time   == -1) ? -1 : 0;
+       e.item_jetpack_time     = (it_jetpack_time     == -1) ? -1 : 0;
+       e.item_superweapons_time= (it_superweapons_time== -1) ? -1 : 0;
+}
+void Item_ItemsTime_SetTimesForPlayer(entity e)
+{
+       e.item_armor_large_time = it_armor_large_time;
+       e.item_health_mega_time = it_health_mega_time;
+       e.item_invisible_time = it_invisible_time;
+       e.item_speed_time = it_speed_time;
+       e.item_extralife_time = it_extralife_time;
+       e.item_strength_time = it_strength_time;
+       e.item_shield_time = it_shield_time;
+       e.item_fuelregen_time = it_fuelregen_time;
+       e.item_jetpack_time = it_jetpack_time;
+       e.item_superweapons_time = it_superweapons_time;
+}
+bool Item_ItemsTime_UpdateTime_Check(float item_time, float t)
+{
+       if(t == 0 && item_time == -1)
+               return true;
+       if(time < t && (item_time <= time || t < item_time))
+               return true;
+       return false;
+}
+void Item_ItemsTime_UpdateTime(entity e, float t)
+{
+       if(g_instagib)
+       {
+               switch(e.items)
+               {
+                       case IT_STRENGTH://"item-invis"
+                               if(Item_ItemsTime_UpdateTime_Check(it_invisible_time, t))
+                                       it_invisible_time = t;
+                               break;
+                       case IT_NAILS://"item-extralife"
+                               if(Item_ItemsTime_UpdateTime_Check(it_extralife_time, t))
+                                       it_extralife_time = t;
+                               break;
+                       case IT_INVINCIBLE://"item-speed"
+                               if(Item_ItemsTime_UpdateTime_Check(it_speed_time, t))
+                                       it_speed_time = t;
+                               break;
+               }
+       }
+       else
+       {
+               switch(e.items)
+               {
+                       case IT_HEALTH:
+                               if(!autocvar_sv_itemstime)
+                                       break;
+                               //if (e.classname == "item_health_mega")
+                                       if(Item_ItemsTime_UpdateTime_Check(it_health_mega_time, t))
+                                               it_health_mega_time = t;
+                               break;
+                       case IT_ARMOR:
+                               if(!autocvar_sv_itemstime)
+                                       break;
+                               if (e.classname == "item_armor_large")
+                                       if(Item_ItemsTime_UpdateTime_Check(it_armor_large_time, t))
+                                               it_armor_large_time = t;
+                               break;
+                       case IT_STRENGTH://"item-strength"
+                               if(Item_ItemsTime_UpdateTime_Check(it_strength_time, t))
+                                       it_strength_time = t;
+                               break;
+                       case IT_INVINCIBLE://"item-shield"
+                               if(Item_ItemsTime_UpdateTime_Check(it_shield_time, t))
+                                       it_shield_time = t;
+                               break;
+                       default:
+                               if(e.weapons & WEPSET_SUPERWEAPONS)
+                                       if(Item_ItemsTime_UpdateTime_Check(it_superweapons_time, t))
+                                                       it_superweapons_time = t;
+               }
+       }
+       switch(e.items)
+       {
+               case IT_FUEL_REGEN://"item-fuelregen"
+                       if(Item_ItemsTime_UpdateTime_Check(it_fuelregen_time, t))
+                               it_fuelregen_time = t;
+                       break;
+               case IT_JETPACK://"item-jetpack"
+                       if(Item_ItemsTime_UpdateTime_Check(it_jetpack_time, t))
+                               it_jetpack_time = t;
+                       break;
+       }
+}
+void Item_ItemsTime_SetTimesForAllPlayers()
+{
+       entity e;
+       if(warmup_stage)
+       {
+               FOR_EACH_REALCLIENT(e)
+                       Item_ItemsTime_SetTimesForPlayer(e);
+       }
+       else
+       {
+               FOR_EACH_REALCLIENT(e)
+               {
+                       if(!IS_PLAYER(e))
+                               Item_ItemsTime_SetTimesForPlayer(e);
+               }
+       }
+}
+
 void Item_Respawn (void)
 {
        Item_Show(self, 1);
@@ -424,6 +577,12 @@ void Item_Respawn (void)
                sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound
        setorigin (self, self.origin);
 
+       if(self.flags & FL_POWERUP || self.classname == "item_armor_large" || self.items == IT_HEALTH || (self.weapons & WEPSET_SUPERWEAPONS))
+       {
+               Item_ItemsTime_UpdateTime(self, 0);
+               Item_ItemsTime_SetTimesForAllPlayers();
+       }
+
        self.think = Item_Think;
        self.nextthink = time;
 
@@ -454,6 +613,14 @@ void Item_RespawnCountdown (void)
                                case IT_JETPACK:    name = "item-jetpack"; rgb = '0.5 0.5 0.5'; break;
                                case IT_STRENGTH:   name = "item-strength"; rgb = '0 0 1'; break;
                                case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break;
+                               case IT_HEALTH:
+                                       //if (self.classname == "item_health_mega")
+                                               {name = "item_health_mega"; rgb = '1 0 0';}
+                                       break;
+                               case IT_ARMOR:
+                                       if (self.classname == "item_armor_large")
+                                               {name = "item_armor_large"; rgb = '0 1 0';}
+                                       break;
                        }
                        item_name = name;
                        item_color = rgb;
@@ -473,7 +640,11 @@ void Item_RespawnCountdown (void)
                        {
                                WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_POWERUP, rgb);
                                if(self.waypointsprite_attached)
+                               {
+                                       if (self.items == IT_HEALTH || self.items == IT_ARMOR)
+                                               WaypointSprite_UpdateRule(self.waypointsprite_attached, 0, SPRITERULE_SPECTATOR);
                                        WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
+                               }
                        }
                        else
                        {
@@ -505,16 +676,57 @@ void Item_RespawnThink()
 
 void Item_ScheduleRespawnIn(entity e, float t)
 {
-       if((e.flags & FL_POWERUP) || (e.weapons & WEPSET_SUPERWEAPONS))
+       if((e.flags & FL_POWERUP) || (e.weapons & WEPSET_SUPERWEAPONS) || e.classname == "item_armor_large" || e.items == IT_HEALTH)
        {
+               entity head;
                e.think = Item_RespawnCountdown;
                e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS);
+               e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS;
                e.count = 0;
+               if(e.weapons & WEPSET_SUPERWEAPONS)
+               {
+                       for(t = e.scheduledrespawntime, head = world; (head = nextent(head)); )
+                       {
+                               if(e == head)
+                                       continue;
+                               if(clienttype(head) == CLIENTTYPE_NOTACLIENT)
+                               if(head.weapons & WEPSET_SUPERWEAPONS)
+                               if(head.classname != "weapon_info")
+                               {
+                                       if(head.scheduledrespawntime <= time)
+                                       {
+                                               t = 0;
+                                               break;
+                                       }
+                                       if(head.scheduledrespawntime < t)
+                                               t = head.scheduledrespawntime;
+                               }
+                       }
+               }
+               else
+               {
+                       for(t = e.scheduledrespawntime, head = world; (head = find(head, classname, e.classname)); )
+                       {
+                               // in instagib .classname is "instagib" for every item
+                               if(e == head || (g_instagib && e.items != head.items))
+                                       continue;
+                               if(head.scheduledrespawntime <= time)
+                               {
+                                       t = 0;
+                                       break;
+                               }
+                               if(head.scheduledrespawntime < t)
+                                       t = head.scheduledrespawntime;
+                       }
+               }
+               Item_ItemsTime_UpdateTime(e, t);
+               Item_ItemsTime_SetTimesForAllPlayers();
        }
        else
        {
                e.think = Item_RespawnThink;
                e.nextthink = time;
+               e.scheduledrespawntime = time + t;
                e.wait = time + t;
        }
 }
@@ -1088,6 +1300,8 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
 
                if((itemflags & (FL_POWERUP | FL_WEAPON)) || (itemid & (IT_HEALTH | IT_ARMOR | IT_KEY1 | IT_KEY2)))
                        self.target = "###item###"; // for finding the nearest item using find()
+
+               Item_ItemsTime_UpdateTime(self, 0);
        }
 
        self.bot_pickup = true;
index a33e45a82c388acbb55dd9cf59fe4c1819752803..e05e4ef666c89dd52ce3e7212afa175bab090d24 100644 (file)
@@ -113,6 +113,10 @@ const float ITEM_RESPAWN_TICKS = 10;
 .float max_armorvalue;
 .float pickup_anyway;
 
+void Item_ItemsTime_SetTimesForPlayer(entity e);
+
+void Item_ItemsTime_ResetTimesForPlayer(entity e);
+
 void Item_Show (entity e, float mode);
 
 void Item_Respawn (void);
index d7b637d0ce03fcefaabe35d6fbce6a6441b3d997..b0c8cb1226eaeda11f432629baabccf5dee87f33 100644 (file)
@@ -199,7 +199,14 @@ float WaypointSprite_visible_for_player(entity e)
                        return false;
 
        // team waypoints
-       if(self.team && self.rule == SPRITERULE_DEFAULT)
+       if(self.rule == SPRITERULE_SPECTATOR)
+       {
+               if(!autocvar_sv_itemstime)
+                       return FALSE;
+               if(!warmup_stage && e.classname == "player")
+                       return FALSE;
+       }
+       else if(self.team && self.rule == SPRITERULE_DEFAULT)
        {
                if(self.team != e.team)
                        return false;