From: Mario Date: Mon, 24 Aug 2015 08:34:57 +0000 (+1000) Subject: Merge branch 'master' into Mario/minigames_merge X-Git-Tag: xonotic-v0.8.2~2038^2 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=2aed36e128f8f00da9c76f9e66baae89d5bb26b2;hp=-c Merge branch 'master' into Mario/minigames_merge # Conflicts: # _hud_descriptions.cfg # defaultXonotic.cfg # qcsrc/client/hud.qh # qcsrc/client/main.qc # qcsrc/client/progs.src # qcsrc/client/view.qc # qcsrc/common/constants.qh # qcsrc/common/notifications.qh # qcsrc/server/autocvars.qh # qcsrc/server/cl_client.qc # qcsrc/server/progs.src --- 2aed36e128f8f00da9c76f9e66baae89d5bb26b2 diff --combined _hud_descriptions.cfg index ab53df710f,7b6f739753..1de28cb9fd --- a/_hud_descriptions.cfg +++ b/_hud_descriptions.cfg @@@ -25,6 -25,8 +25,8 @@@ seta hud_progressbar_nexball_color "" " seta hud_progressbar_speed_color "" "R G B vector of the progress bar background color" seta hud_progressbar_acceleration_color "" "R G B vector of the progress bar background color" seta hud_progressbar_acceleration_neg_color "" "R G B vector of the progress bar background color" + seta hud_progressbar_vehicles_ammo1_color "" "R G B vector of the progress bar background color" + seta hud_progressbar_vehicles_ammo2_color "" "R G B vector of the progress bar background color" seta _hud_panelorder "" "contains order in which panels are to be drawn" @@@ -62,6 -64,8 +64,8 @@@ seta hud_panel_weapons_label_scale "" " seta hud_panel_weapons_accuracy "" "show accuracy color as the weapon icon background; colors can be configured with accuracy_color* cvars" seta hud_panel_weapons_ammo "" "show ammo as a status bar" seta hud_panel_weapons_onlyowned "" "show only owned weapons" + seta hud_panel_weapons_noncurrent_alpha "" "alpha of noncurrent weapons" + seta hud_panel_weapons_noncurrent_scale "" "scale of noncurrent weapons, relative to the current weapon" seta hud_panel_ammo "" "enable/disable this panel" seta hud_panel_ammo_pos "" "position of this panel" @@@ -84,7 -88,6 +88,6 @@@ seta hud_panel_ammo_text "" "show text/ seta hud_panel_powerups "" "enable/disable this panel" seta hud_panel_powerups_pos "" "position of this panel" seta hud_panel_powerups_size "" "size of this panel" - seta hud_panel_powerups_flip "" "flip strength/shield positions" seta hud_panel_powerups_baralign "" "0 = align bars to the left, 1 = align bars to the right, 2 = align only left bar to the right, 3 = align only right bar to the right" seta hud_panel_powerups_iconalign "" "0 = align icons to the left, 1 = align icons to the right, 2 = align only left icon to the right, 3 = align only right icon to the right" seta hud_panel_powerups_bg "" "if set to something else than \"\" = override default background" @@@ -94,10 -97,7 +97,7 @@@ seta hud_panel_powerups_bg_alpha "" "i seta hud_panel_powerups_bg_border "" "if set to something else than \"\" = override default size of border around the background" seta hud_panel_powerups_bg_padding "" "if set to something else than \"\" = override default padding of contents from border" seta hud_panel_powerups_progressbar "" "enable progressbar in panel" - seta hud_panel_powerups_progressbar_strength "" "progressbar image for strength" - seta hud_panel_powerups_progressbar_shield "" "progressbar image for shield" - seta hud_panel_powerups_progressbar_superweapons "" "progressbar image for superweapons" - seta hud_panel_powerups_text "" "show text/icons in the powerups panel" + seta hud_panel_powerups_text "" "show text and icons in the powerups panel" seta hud_panel_healtharmor "" "enable/disable this panel, 2 = combined health/armor display" seta hud_panel_healtharmor_pos "" "position of this panel" @@@ -301,52 -301,29 +301,69 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "" "minimum factor for the font size from the subsequent fading effects" seta hud_panel_centerprint_fade_minfontsize "" "minimum factor for the font size from the fading in/out effects" - seta hud_panel_buffs "" "enable/disable this panel" - seta hud_panel_buffs_pos "" "position of this panel" - seta hud_panel_buffs_size "" "size of this panel" - seta hud_panel_buffs_bg "" "if set to something else than \"\" = override default background" - seta hud_panel_buffs_bg_color "" "if set to something else than \"\" = override default panel background color" - seta hud_panel_buffs_bg_color_team "" "override panel color with team color in team based games" - 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_minigameboard "" "enable/disable this panel" +seta hud_panel_minigameboard_pos "" "position of this panel" +seta hud_panel_minigameboard_size "" "size of this panel" +seta hud_panel_minigameboard_bg "" "if set to something else than \"\" = override default background" +seta hud_panel_minigameboard_bg_color "" "if set to something else than \"\" = override default panel background color" +seta hud_panel_minigameboard_bg_color_team "" "override panel color with team color in team based games" +seta hud_panel_minigameboard_bg_alpha "" "if set to something else than \"\" = override default panel background alpha" +seta hud_panel_minigameboard_bg_border "" "if set to something else than \"\" = override default size of border around the background" +seta hud_panel_minigameboard_bg_padding "" "if set to something else than \"\" = override default padding of contents from border" + +seta hud_panel_minigamestatus "" "enable/disable this panel" +seta hud_panel_minigamestatus_pos "" "position of this panel" +seta hud_panel_minigamestatus_size "" "size of this panel" +seta hud_panel_minigamestatus_bg "" "if set to something else than \"\" = override default background" +seta hud_panel_minigamestatus_bg_color "" "if set to something else than \"\" = override default panel background color" +seta hud_panel_minigamestatus_bg_color_team "" "override panel color with team color in team based games" +seta hud_panel_minigamestatus_bg_alpha "" "if set to something else than \"\" = override default panel background alpha" +seta hud_panel_minigamestatus_bg_border "" "if set to something else than \"\" = override default size of border around the background" +seta hud_panel_minigamestatus_bg_padding "" "if set to something else than \"\" = override default padding of contents from border" + +seta hud_panel_minigamehelp "" "enable/disable this panel" +seta hud_panel_minigamehelp_pos "" "position of this panel" +seta hud_panel_minigamehelp_size "" "size of this panel" +seta hud_panel_minigamehelp_bg "" "if set to something else than \"\" = override default background" +seta hud_panel_minigamehelp_bg_color "" "if set to something else than \"\" = override default panel background color" +seta hud_panel_minigamehelp_bg_color_team "" "override panel color with team color in team based games" +seta hud_panel_minigamehelp_bg_alpha "" "if set to something else than \"\" = override default panel background alpha" +seta hud_panel_minigamehelp_bg_border "" "if set to something else than \"\" = override default size of border around the background" +seta hud_panel_minigamehelp_bg_padding "" "if set to something else than \"\" = override default padding of contents from border" + +seta hud_panel_minigamemenu "" "enable/disable this panel" +seta hud_panel_minigamemenu_pos "" "position of this panel" +seta hud_panel_minigamemenu_size "" "size of this panel" +seta hud_panel_minigamemenu_bg "" "if set to something else than \"\" = override default background" +seta hud_panel_minigamemenu_bg_color "" "if set to something else than \"\" = override default panel background color" +seta hud_panel_minigamemenu_bg_color_team "" "override panel color with team color in team based games" +seta hud_panel_minigamemenu_bg_alpha "" "if set to something else than \"\" = override default panel background alpha" +seta hud_panel_minigamemenu_bg_border "" "if set to something else than \"\" = override default size of border around the background" +seta hud_panel_minigamemenu_bg_padding "" "if set to something else than \"\" = override default padding of contents from border" ++ + seta hud_panel_mapvote "" "enable/disable this panel" + seta hud_panel_mapvote_pos "" "position of this panel" + seta hud_panel_mapvote_size "" "size of this panel" + seta hud_panel_mapvote_bg "" "if set to something else than \"\" = override default background" + seta hud_panel_mapvote_bg_color "" "if set to something else than \"\" = override default panel background color" + seta hud_panel_mapvote_bg_color_team "" "override panel color with team color in team based games" + seta hud_panel_mapvote_bg_alpha "" "if set to something else than \"\" = override default panel background alpha" + seta hud_panel_mapvote_bg_border "" "if set to something else than \"\" = override default size of border around the background" + seta hud_panel_mapvote_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_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_dynamicsize "" "allow panel size reduction by removing spacing among items" diff --combined defaultXonotic.cfg index dc241eced0,798da0913b..d31cd76e58 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@@ -72,7 -72,7 +72,7 @@@ seta cl_velocityzoom_time 0.2 "time val seta cl_spawnzoom 1 "zoom effect immediately when a player spawns" seta cl_spawnzoom_speed 1 "speed at which zooming occurs while spawning" seta cl_spawnzoom_factor 2 "factor of zoom while spawning" - seta cl_zoomfactor 5 "how much +zoom will zoom (1-16)" + seta cl_zoomfactor 5 "how much +zoom will zoom (1-30)" seta cl_zoomspeed 8 "how fast it will zoom (0.5-16), negative values mean instant zoom" seta cl_zoomsensitivity 0 "how zoom changes sensitivity (0 = weakest, 1 = strongest)" @@@ -234,10 -234,12 +234,12 @@@ seta cl_hitsound_nom_damage 25 "damage seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead; set to 2 to active the effect only when the corpse doesn't move anymore" seta cl_eventchase_nexball 1 "camera goes into 3rd person mode when in nexball game-mode" seta cl_eventchase_distance 140 "final camera distance" + seta cl_eventchase_generator_distance 400 "final camera distance while viewing generator explosion" seta cl_eventchase_speed 1.3 "how fast the camera slides back, 0 is instant" seta cl_eventchase_maxs "12 12 8" "max size of eventchase camera bbox" seta cl_eventchase_mins "-12 -12 -8" "min size of eventchase camera bbox" seta cl_eventchase_viewoffset "0 0 20" "viewoffset of eventchase camera" + seta cl_eventchase_generator_viewoffset "0 0 80" "viewoffset of eventchase camera while viewing generator explosion" //nifreks lockonrestart feature, used in team-based game modes, if set to 1 and all players readied up no other player can then join the game anymore, useful to block spectators from joining set teamplay_lockonrestart 0 "it set to 1 in a team-based game, the teams are locked once all players readied up and the game restarted (no new players can join after restart unless using the server-command unlockteams)" @@@ -288,14 -290,9 +290,9 @@@ set cl_deathglow 0.8 "number of second set sv_gibhealth 100 "Minus health a dead body must have in order to get gibbed" - // fragmessage: This allows extra information to be displayed with the frag centerprints. - set sv_fraginfo 1 "Enable extra frag message information, 0 = Never display, 1 = Display only in warmup mode; 2 = Always display" - set sv_fraginfo_ping 1 "Enable ping display information, 0 = Never display, 1 = Always display (If the player is a bot, it will say bot instead of the ping.)" - set sv_fraginfo_handicap 1 "Enable handicap display information, 0 = Never display, 1 = Only when the player has handicap on, 2 = Always display (Displays Off if disabled)" - set sv_fraginfo_stats 1 "Enable statistics (health/armor) display information, 0 = Never display, 1 = Always display (Only available for the person who was killed)" - // use default physics set sv_friction_on_land 0 + set sv_friction_slick 0.5 set sv_player_viewoffset "0 0 35" "view offset of the player model" set sv_player_mins "-16 -16 -24" "playermodel mins" @@@ -757,6 -754,7 +754,7 @@@ seta g_waypointsprite_crosshairfadedist 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" @@@ -778,6 -776,8 +776,8 @@@ seta g_waypointsprite_turrets 1 "disabl 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" @@@ -1101,6 -1101,7 +1101,6 @@@ seta cl_gentle_damage 0 "client side g set g_jetpack 0 "Jetpack mutator" set g_running_guns 0 "... or wonder, till it drives you mad, what would have followed if you had." -set g_bastet 0 "don't try" set _urllib_nextslot 0 "temp variable" set cl_warpzone_usetrace 1 "do not touch" @@@ -1130,11 -1131,6 +1130,6 @@@ set g_mapinfo_settemp_acl "+*" "ACL fo seta cl_casings_maxcount 100 "maximum amount of shell casings (must be at least 1)" seta cl_gibs_maxcount 100 "maximum amount of gibs (must be at least 1)" - seta cl_vehicle_spiderbot_cross_alpha 0.6 - seta cl_vehicle_spiderbot_cross_size 1 - seta cl_vehicles_hudscale 0.5 - seta cl_vehicles_hudalpha 0.75 - seta cl_vehicles_hud_tactical 1 //cl_gunalign calculator seta menu_cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only" @@@ -1398,7 -1394,7 +1393,8 @@@ exec gamemodes.cf exec mutators.cfg exec notifications.cfg exec monsters.cfg +exec minigames.cfg + exec physics.cfg // load console command aliases and settings exec commands.cfg diff --combined hud_luma.cfg index ec4e415f23,573e8da309..70d0764b67 --- a/hud_luma.cfg +++ b/hud_luma.cfg @@@ -16,22 -16,24 +16,24 @@@ seta hud_progressbar_alpha "0.600000 seta hud_progressbar_health_color "0.83 0.12 0" seta hud_progressbar_armor_color "0.28 0.8 0" seta hud_progressbar_fuel_color "0.77 0.67 0" - seta hud_progressbar_strength_color "0.86 0.35 0" - seta hud_progressbar_shield_color "0.28 0.8 0" + seta hud_progressbar_strength_color "1 0.39 0" + seta hud_progressbar_shield_color "0.36 1 0.07" seta hud_progressbar_superweapons_color "0.77 0.67 0" seta hud_progressbar_nexball_color "0.2 0.65 0.93" seta hud_progressbar_speed_color "0.77 0.67 0" seta hud_progressbar_acceleration_color "0.2 0.65 0.93" 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 "17 15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.005000" seta hud_configure_grid_ysize "0.005000" seta hud_panel_weapons 1 - seta hud_panel_weapons_pos "0.965000 0.120000" + seta hud_panel_weapons_pos "0.965000 0.125000" seta hud_panel_weapons_size "0.035000 0.770000" seta hud_panel_weapons_bg "border_default_east" seta hud_panel_weapons_bg_color "" @@@ -60,10 -62,12 +62,12 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" + seta hud_panel_weapons_noncurrent_alpha "0.8" + seta hud_panel_weapons_noncurrent_scale "0.9" seta hud_panel_ammo 1 - seta hud_panel_ammo_pos "0.330000 0.865000" - seta hud_panel_ammo_size "0.340000 0.060000" + seta hud_panel_ammo_pos "0.315000 0.865000" + seta hud_panel_ammo_size "0.370000 0.060000" seta hud_panel_ammo_bg "border_tab_south" seta hud_panel_ammo_bg_color "" seta hud_panel_ammo_bg_color_team "" @@@ -80,21 -84,17 +84,17 @@@ seta hud_panel_ammo_progressbar_xoffse seta hud_panel_ammo_text "1" seta hud_panel_powerups 1 - seta hud_panel_powerups_pos "0 0.270000" - seta hud_panel_powerups_size "0.040000 0.415000" - seta hud_panel_powerups_bg "border_default_west" + seta hud_panel_powerups_pos "0.325000 0.815000" + seta hud_panel_powerups_size "0.350000 0.055000" + seta hud_panel_powerups_bg "border_shadow_south" seta hud_panel_powerups_bg_color "" seta hud_panel_powerups_bg_color_team "" seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" - seta hud_panel_powerups_bg_padding "2" - seta hud_panel_powerups_flip "1" - seta hud_panel_powerups_iconalign "1" - seta hud_panel_powerups_baralign "1" + seta hud_panel_powerups_bg_padding "" + seta hud_panel_powerups_iconalign "3" + seta hud_panel_powerups_baralign "3" seta hud_panel_powerups_progressbar "1" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -206,7 -206,7 +206,7 @@@ seta hud_panel_modicons_dom_layout "1 seta hud_panel_modicons_freezetag_layout "1" seta hud_panel_pressedkeys 1 - seta hud_panel_pressedkeys_pos "0.445000 0.730000" + seta hud_panel_pressedkeys_pos "0.445000 0.710000" seta hud_panel_pressedkeys_size "0.110000 0.090000" seta hud_panel_pressedkeys_bg " " seta hud_panel_pressedkeys_bg_color "" @@@ -251,7 -251,7 +251,7 @@@ seta hud_panel_infomessages_bg_padding seta hud_panel_infomessages_flip "1" seta hud_panel_physics 3 - seta hud_panel_physics_pos "0.410000 0.630000" + seta hud_panel_physics_pos "0.410000 0.625000" seta hud_panel_physics_size "0.180000 0.080000" seta hud_panel_physics_bg "0" seta hud_panel_physics_bg_color "" @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.435000 0.840000" - seta hud_panel_buffs_size "0.125000 0.035000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "border_default" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "2" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined hud_luminos.cfg index d9e3fdfc9e,302d4d769f..a1509ae7bf --- a/hud_luminos.cfg +++ b/hud_luminos.cfg @@@ -23,8 -23,10 +23,10 @@@ seta hud_progressbar_nexball_color "0. seta hud_progressbar_speed_color "1 0.75 0" seta hud_progressbar_acceleration_color "0.5 0.75 1" 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 "17 15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.010000" @@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" + seta hud_panel_weapons_noncurrent_alpha "1" + seta hud_panel_weapons_noncurrent_scale "1" seta hud_panel_ammo 1 seta hud_panel_ammo_pos "0.330000 0.960000" @@@ -87,14 -91,10 +91,10 @@@ seta hud_panel_powerups_bg_color " seta hud_panel_powerups_bg_color_team "" seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" - seta hud_panel_powerups_bg_padding "" - seta hud_panel_powerups_flip "1" + seta hud_panel_powerups_bg_padding "-2" seta hud_panel_powerups_iconalign "3" seta hud_panel_powerups_baralign "3" seta hud_panel_powerups_progressbar "1" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.450000 0.855000" - seta hud_panel_buffs_size "0.050000 0.070000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "0" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "2" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined hud_luminos_minimal.cfg index 67db42dfd1,3386129fcf..e5aec23184 --- a/hud_luminos_minimal.cfg +++ b/hud_luminos_minimal.cfg @@@ -23,8 -23,10 +23,10 @@@ seta hud_progressbar_nexball_color "0. seta hud_progressbar_speed_color "1 0.75 0" seta hud_progressbar_acceleration_color "0.5 0.75 1" 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 "17 10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.010000" @@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" + seta hud_panel_weapons_noncurrent_alpha "1" + seta hud_panel_weapons_noncurrent_scale "1" seta hud_panel_ammo 1 seta hud_panel_ammo_pos "0.650000 0.890000" @@@ -88,13 -92,9 +92,9 @@@ seta hud_panel_powerups_bg_color_team " seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" seta hud_panel_powerups_bg_padding "-3" - seta hud_panel_powerups_flip "1" seta hud_panel_powerups_iconalign "1" seta hud_panel_powerups_baralign "1" seta hud_panel_powerups_progressbar "1" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.450000 0.855000" - seta hud_panel_buffs_size "0.050000 0.070000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "0" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "2" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined hud_luminos_minimal_xhair.cfg index f6067e7c53,200c763a4a..f313b4c435 --- a/hud_luminos_minimal_xhair.cfg +++ b/hud_luminos_minimal_xhair.cfg @@@ -23,8 -23,10 +23,10 @@@ seta hud_progressbar_nexball_color "0. seta hud_progressbar_speed_color "1 0.75 0" seta hud_progressbar_acceleration_color "0.5 0.75 1" 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 "17 15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.010000" @@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" + seta hud_panel_weapons_noncurrent_alpha "1" + seta hud_panel_weapons_noncurrent_scale "1" seta hud_panel_ammo 1 seta hud_panel_ammo_pos "0.450000 0.630000" @@@ -88,13 -92,9 +92,9 @@@ seta hud_panel_powerups_bg_color_team " seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" seta hud_panel_powerups_bg_padding "-3" - seta hud_panel_powerups_flip "1" seta hud_panel_powerups_iconalign "1" seta hud_panel_powerups_baralign "1" seta hud_panel_powerups_progressbar "1" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.450000 0.855000" - seta hud_panel_buffs_size "0.050000 0.070000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "0" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "2" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined hud_luminos_old.cfg index 45c6107c94,95aab98e18..4d27482b09 --- a/hud_luminos_old.cfg +++ b/hud_luminos_old.cfg @@@ -23,8 -23,10 +23,10 @@@ seta hud_progressbar_nexball_color "0. seta hud_progressbar_speed_color "1 0.75 0" seta hud_progressbar_acceleration_color "0.5 0.75 1" 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 "17 15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.010000" @@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" + seta hud_panel_weapons_noncurrent_alpha "1" + seta hud_panel_weapons_noncurrent_scale "1" seta hud_panel_ammo 1 seta hud_panel_ammo_pos "0.190000 0.920000" @@@ -88,13 -92,9 +92,9 @@@ seta hud_panel_powerups_bg_color_team " seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" seta hud_panel_powerups_bg_padding "" - seta hud_panel_powerups_flip "1" seta hud_panel_powerups_iconalign "3" seta hud_panel_powerups_baralign "3" seta hud_panel_powerups_progressbar "1" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.450000 0.855000" - seta hud_panel_buffs_size "0.050000 0.070000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "0" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "3.5" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined hud_nexuiz.cfg index a5af3c7df5,f1e1cdf24e..5eb75cfde0 --- a/hud_nexuiz.cfg +++ b/hud_nexuiz.cfg @@@ -23,8 -23,10 +23,10 @@@ seta hud_progressbar_nexball_color "0. seta hud_progressbar_speed_color "1 0.75 0" seta hud_progressbar_acceleration_color "0.5 0.75 1" 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 "17 15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 18" seta hud_configure_grid "1" seta hud_configure_grid_xsize "0.01" @@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi seta hud_panel_weapons_timeout_speed_in "0.25" seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "0" + seta hud_panel_weapons_noncurrent_alpha "1" + seta hud_panel_weapons_noncurrent_scale "1" seta hud_panel_ammo 1 seta hud_panel_ammo_pos "0.160000 0.910000" @@@ -88,13 -92,9 +92,9 @@@ seta hud_panel_powerups_bg_color_team " seta hud_panel_powerups_bg_alpha "" seta hud_panel_powerups_bg_border "" seta hud_panel_powerups_bg_padding "" - seta hud_panel_powerups_flip "1" seta hud_panel_powerups_iconalign "0" seta hud_panel_powerups_baralign "0" seta hud_panel_powerups_progressbar "0" - seta hud_panel_powerups_progressbar_strength "progressbar" - seta hud_panel_powerups_progressbar_shield "progressbar" - seta hud_panel_powerups_progressbar_superweapons "progressbar" seta hud_panel_powerups_text "1" seta hud_panel_healtharmor 1 @@@ -299,54 -299,31 +299,71 @@@ seta hud_panel_centerprint_fade_subsequ seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75" seta hud_panel_centerprint_fade_minfontsize "0" - seta hud_panel_buffs 1 - seta hud_panel_buffs_pos "0.450000 0.855000" - seta hud_panel_buffs_size "0.050000 0.070000" - seta hud_panel_buffs_bg "0" - seta hud_panel_buffs_bg_color "" - seta hud_panel_buffs_bg_color_team "" - seta hud_panel_buffs_bg_alpha "" - seta hud_panel_buffs_bg_border "" - seta hud_panel_buffs_bg_padding "" + seta hud_panel_mapvote 1 + seta hud_panel_mapvote_pos "0 0" + seta hud_panel_mapvote_size "1 1" + seta hud_panel_mapvote_bg "0" + seta hud_panel_mapvote_bg_color "" + seta hud_panel_mapvote_bg_color_team "" + seta hud_panel_mapvote_bg_alpha "" + seta hud_panel_mapvote_bg_border "" + seta hud_panel_mapvote_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_text "1" + seta hud_panel_itemstime_ratio "2" + seta hud_panel_itemstime_dynamicsize "1" +seta hud_panel_minigameboard "1" +seta hud_panel_minigameboard_pos "0.22 0.15" +seta hud_panel_minigameboard_size "0.50 0.60" +seta hud_panel_minigameboard_bg "border_small" +seta hud_panel_minigameboard_bg_color "" +seta hud_panel_minigameboard_bg_color_team "" +seta hud_panel_minigameboard_bg_alpha "" +seta hud_panel_minigameboard_bg_border "" +seta hud_panel_minigameboard_bg_padding "" + +seta hud_panel_minigamestatus "1" +seta hud_panel_minigamestatus_pos "0.74 0.15" +seta hud_panel_minigamestatus_size "0.2 0.60" +seta hud_panel_minigamestatus_bg "border_small" +seta hud_panel_minigamestatus_bg_color "" +seta hud_panel_minigamestatus_bg_color_team "" +seta hud_panel_minigamestatus_bg_alpha "" +seta hud_panel_minigamestatus_bg_border "" +seta hud_panel_minigamestatus_bg_padding "" + +seta hud_panel_minigamehelp "1" +seta hud_panel_minigamehelp_pos "0.22 0.78" +seta hud_panel_minigamehelp_size "0.50 0.20" +seta hud_panel_minigamehelp_bg "" +seta hud_panel_minigamehelp_bg_color "" +seta hud_panel_minigamehelp_bg_color_team "" +seta hud_panel_minigamehelp_bg_alpha "" +seta hud_panel_minigamehelp_bg_border "" +seta hud_panel_minigamehelp_bg_padding "" + +seta hud_panel_minigamemenu "0" +seta hud_panel_minigamemenu_pos "0 0.26" +seta hud_panel_minigamemenu_size "0.2 0.49" +seta hud_panel_minigamemenu_bg "border_small" +seta hud_panel_minigamemenu_bg_color "" +seta hud_panel_minigamemenu_bg_color_team "" +seta hud_panel_minigamemenu_bg_alpha "" +seta hud_panel_minigamemenu_bg_border "" +seta hud_panel_minigamemenu_bg_padding "" + menu_sync diff --combined qcsrc/client/command/cl_cmd.qc index 942c719385,e80130c596..9fe33a4fc0 --- a/qcsrc/client/command/cl_cmd.qc +++ b/qcsrc/client/command/cl_cmd.qc @@@ -14,6 -14,8 +14,8 @@@ #include "../mapvoting.qh" #include "../miscfunctions.qh" + #include "../mutators/events.qh" + #include "../../common/mapinfo.qh" #include "../../common/command/generic.qh" @@@ -252,15 -254,6 +254,15 @@@ void LocalCommand_hud(int request, int return; } + case "minigame": + { + if(HUD_MinigameMenu_IsOpened()) + HUD_MinigameMenu_Close(); + else + HUD_MinigameMenu_Open(); + return; + } + case "save": { if(argv(2)) @@@ -289,9 -282,15 +291,15 @@@ case "radar": { if(argv(2)) - hud_panel_radar_maximized = InterpretBoolean(argv(2)); + HUD_Radar_Show_Maximized(InterpretBoolean(argv(2)),0); else - hud_panel_radar_maximized = !hud_panel_radar_maximized; + HUD_Radar_Show_Maximized(!hud_panel_radar_maximized,0); + return; + } + + case "clickradar": + { + HUD_Radar_Show_Maximized(!hud_panel_radar_mouse,1); return; } } @@@ -306,7 -305,7 +314,7 @@@ print(" 'configname' is the name to save to for \"save\" action,\n"); print(" 'radartoggle' is to control hud_panel_radar_maximized for \"radar\" action,\n"); print(" and 'layout' is how to organize the scoreboard columns for the set action.\n"); - print(" Full list of commands here: \"configure, save, scoreboard_columns_help, scoreboard_columns_set, radar.\"\n"); + print(" Full list of commands here: \"configure, minigame, save, scoreboard_columns_help, scoreboard_columns_set, radar.\"\n"); return; } } @@@ -360,6 -359,31 +368,31 @@@ void LocalCommand_mv_download(int reque } } + void LocalCommand_find(int request, int argc) + { + switch(request) + { + case CMD_REQUEST_COMMAND: + { + entity client; + + for(client = world; (client = find(client, classname, argv(1))); ) + print(etos(client), "\n"); + + return; + } + + default: + print("Incorrect parameters for ^2find^7\n"); + case CMD_REQUEST_USAGE: + { + print("\nUsage:^3 cl_cmd find classname\n"); + print(" Where 'classname' is the classname to search for.\n"); + return; + } + } + } + void LocalCommand_sendcvar(int request, int argc) { switch(request) @@@ -431,6 -455,7 +464,7 @@@ void LocalCommand_(int request CLIENT_COMMAND("handlevote", LocalCommand_handlevote(request, arguments), "System to handle selecting a vote or option") \ CLIENT_COMMAND("hud", LocalCommand_hud(request, arguments), "Commands regarding/controlling the HUD system") \ CLIENT_COMMAND("localprint", LocalCommand_localprint(request, arguments), "Create your own centerprint sent to yourself") \ + CLIENT_COMMAND("find", LocalCommand_find(request, arguments), "Search through entities for matching classname") \ CLIENT_COMMAND("mv_download", LocalCommand_mv_download(request, arguments), "Retrieve mapshot picture from the server") \ CLIENT_COMMAND("sendcvar", LocalCommand_sendcvar(request, arguments), "Send a cvar to the server (like weaponpriority)") \ /* nothing */ @@@ -493,8 -518,8 +527,8 @@@ void GameCommand(string command // argc: 1 - 2 - 3 - 4 // argv: 0 - 1 - 2 - 3 // cmd vote - master - login - password - - if(strtolower(argv(0)) == "help") + string s = strtolower(argv(0)); + if (s == "help") { if(argc == 1) { @@@ -518,14 -543,11 +552,11 @@@ return; } } - else if(GenericCommand(command)) - { - return; // handled by common/command/generic.qc - } - else if(LocalCommand_macro_command(argc)) // continue as usual and scan for normal commands - { - return; // handled by one of the above LocalCommand_* functions - } + // continue as usual and scan for normal commands + if (GenericCommand(command)// handled by common/command/generic.qc + || LocalCommand_macro_command(argc) // handled by one of the above LocalCommand_* functions + || MUTATOR_CALLHOOK(CSQC_ConsoleCommand, s, argc, command) // handled by a mutator + ) return; // nothing above caught the command, must be invalid print(((command != "") ? strcat("Unknown client command \"", command, "\"") : "No command provided"), ". For a list of supported commands, try cl_cmd help.\n"); @@@ -588,14 -610,12 +619,12 @@@ void ConsoleCommand_macro_init( #ifndef CAMERATEST } #endif - - return; } - bool ConsoleCommand_macro_normal(int argc) + bool ConsoleCommand_macro_normal(string s, int argc) { #define CONSOLE_COMMAND(name,execution) \ - { if(name == strtolower(argv(0))) { { execution } return true; } } + { if (name == s) { { execution } return true; } } CONSOLE_COMMANDS_NORMAL(); #undef CONSOLE_COMMAND @@@ -603,12 -623,12 +632,12 @@@ return false; } - bool ConsoleCommand_macro_movement(int argc) + bool ConsoleCommand_macro_movement(string s, int argc) { if(camera_active) { #define CONSOLE_COMMAND(name,execution) \ - { if(name == strtolower(argv(0))) { { execution } return true; } } + { if (name == s) { { execution } return true; } } CONSOLE_COMMANDS_MOVEMENT(); #undef CONSOLE_COMMAND @@@ -626,17 -646,9 +655,9 @@@ bool CSQC_ConsoleCommand(string command) { int argc = tokenize_console(command); - - if(ConsoleCommand_macro_normal(argc)) - { - return true; - } - else if(ConsoleCommand_macro_movement(argc)) - { - return true; - } - - // Return value should be 1 if CSQC handled the command, otherwise return 0 to have the engine handle it. - - return false; + string s = strtolower(argv(0)); + // Return value should be true if CSQC handled the command, otherwise return false to have the engine handle it. + return (ConsoleCommand_macro_normal(s, argc) + || ConsoleCommand_macro_movement(s, argc) + ); } diff --combined qcsrc/client/hud.qc index 797bf1c965,3482a62bf0..7125739cff --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@@ -2,17 -2,24 +2,24 @@@ #include "_all.qh" #include "hud_config.qh" + #include "mapvoting.qh" #include "scoreboard.qh" #include "sortlist.qh" #include "teamradar.qh" #include "t_items.qh" + #include "../dpdefs/keycodes.qh" + #include "../common/buffs.qh" #include "../common/constants.qh" #include "../common/counting.qh" #include "../common/deathtypes.qh" + #include "../common/items/all.qc" #include "../common/mapinfo.qh" #include "../common/nades.qh" + + #include "../server/mutators/gamemode_ctf.qh" + #include "../common/stats.qh" #include "../csqcmodellib/cl_player.qh" @@@ -159,7 -166,7 +166,7 @@@ float HUD_GetRowCount(int item_count, v return bound(1, floor((sqrt(4 * item_aspect * aspect * item_count + aspect * aspect) + aspect + 0.5) / 2), item_count); } - vector HUD_GetTableSize(int item_count, vector psize, float item_aspect) + vector HUD_GetTableSize_BestItemAR(int item_count, vector psize, float item_aspect) { float columns, rows; float ratio, best_ratio = 0; @@@ -504,7 -511,8 +511,8 @@@ void HUD_Weapons(void vector color; // check to see if we want to continue - if(hud != HUD_NORMAL) { return; } + if(intermission == 2) return; + if(hud != HUD_NORMAL) return; if(!autocvar__hud_configure) { @@@ -521,8 -529,6 +529,6 @@@ // update generic hud functions HUD_Panel_UpdateCvars(); - draw_beginBoldFont(); - // figure out weapon order (how the weapons are sorted) // TODO make this configurable if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0]) { @@@ -592,16 -598,13 +598,13 @@@ // might as well commit suicide now, no reason to live ;) if (weapon_count == 0) - { - draw_endBoldFont(); return; - } vector old_panel_size = panel_size; vector padded_panel_size = panel_size - '2 2 0' * panel_bg_padding; // get the all-weapons layout - vector table_size = HUD_GetTableSize(WEP_COUNT, padded_panel_size, aspect); + vector table_size = HUD_GetTableSize_BestItemAR(WEP_COUNT, padded_panel_size, aspect); columns = table_size.x; rows = table_size.y; weapon_size.x = padded_panel_size.x / columns; @@@ -749,10 -752,7 +752,7 @@@ HUD_Panel_DrawBg(1); if(center.x == -1) - { - draw_endBoldFont(); return; - } if(panel_bg_padding) { @@@ -764,7 -764,7 +764,7 @@@ if(!rows) // if rows is > 0 onlyowned code has already updated these vars { - vector table_size = HUD_GetTableSize(WEP_COUNT, panel_size, aspect); + vector table_size = HUD_GetTableSize_BestItemAR(WEP_COUNT, panel_size, aspect); columns = table_size.x; rows = table_size.y; weapon_size.x = panel_size.x / columns; @@@ -797,11 -797,17 +797,17 @@@ // draw items row = column = 0; vector label_size = '1 1 0' * min(weapon_size.x, weapon_size.y) * bound(0, autocvar_hud_panel_weapons_label_scale, 1); + vector noncurrent_pos = '0 0 0'; + vector noncurrent_size = weapon_size * bound(0, autocvar_hud_panel_weapons_noncurrent_scale, 1); + float noncurrent_alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_weapons_noncurrent_alpha, 1); + bool isCurrent; + for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i) { // retrieve information about the current weapon to be drawn self = weaponorder[i]; weapon_id = self.impulse; + isCurrent = (self.weapon == switchweapon); // skip if this weapon doesn't exist if(!self || weapon_id < 0) { continue; } @@@ -812,12 -818,12 +818,12 @@@ continue; // figure out the drawing position of weapon - weapon_pos = (panel_pos - + eX * column * weapon_size.x - + eY * row * weapon_size.y); + weapon_pos = (panel_pos + eX * column * weapon_size.x + eY * row * weapon_size.y); + noncurrent_pos.x = weapon_pos.x + (weapon_size.x - noncurrent_size.x) / 2; + noncurrent_pos.y = weapon_pos.y + (weapon_size.y - noncurrent_size.y) / 2; // draw background behind currently selected weapon - if(self.weapon == switchweapon) + if(isCurrent) drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); // draw the weapon accuracy @@@ -835,7 -841,10 +841,10 @@@ if(weapons_stat & WepSet_FromWeapon(self.weapon)) { // draw the weapon image - drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + if(isCurrent) + drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + else + drawpic_aspect_skin(noncurrent_pos, self.model2, noncurrent_size, '1 1 1', noncurrent_alpha, DRAWFLAG_NORMAL); // draw weapon label string switch(autocvar_hud_panel_weapons_label) @@@ -897,7 -906,7 +906,7 @@@ } else // draw a "ghost weapon icon" if you don't have the weapon { - drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(noncurrent_pos, self.model2, noncurrent_size, '0.2 0.2 0.2', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); } // draw the complain message @@@ -955,56 -964,51 +964,51 @@@ } } } - - draw_endBoldFont(); } // Ammo (#1) - void DrawNadeScoreBar(vector myPos, vector mySize, vector color) + void DrawNadeProgressBar(vector myPos, vector mySize, float progress, vector color) { - HUD_Panel_DrawProgressBar( myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x, autocvar_hud_panel_ammo_progressbar_name, - getstatf(STAT_NADE_BONUS_SCORE), 0, 0, color, + progress, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - } void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time) { - float theAlpha = 1, a, b; - vector nade_color, picpos, numpos; - - nade_color = Nade_Color(getstati(STAT_NADE_BONUS_TYPE)); + float bonusNades = getstatf(STAT_NADE_BONUS); + float bonusProgress = getstatf(STAT_NADE_BONUS_SCORE); + float bonusType = getstati(STAT_NADE_BONUS_TYPE); + vector nadeColor = NADES[bonusType].m_color; + string nadeIcon = NADES[bonusType].m_icon; - a = getstatf(STAT_NADE_BONUS); - b = getstatf(STAT_NADE_BONUS_SCORE); + vector iconPos, textPos; if(autocvar_hud_panel_ammo_iconalign) { - numpos = myPos; - picpos = myPos + eX * 2 * mySize.y; + iconPos = myPos + eX * 2 * mySize.y; + textPos = myPos; } else { - numpos = myPos + eX * mySize.y; - picpos = myPos; + iconPos = myPos; + textPos = myPos + eX * mySize.y; } - DrawNadeScoreBar(myPos, mySize, nade_color); - - if(b > 0 || a > 0) + if(bonusNades > 0 || bonusProgress > 0) { + DrawNadeProgressBar(myPos, mySize, bonusProgress, nadeColor); + if(autocvar_hud_panel_ammo_text) - drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawstring_aspect(textPos, ftos(bonusNades), eX * (2/3) * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); if(draw_expanding) - drawpic_aspect_skin_expanding(picpos, "nade_nbg", '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, expand_time); + drawpic_aspect_skin_expanding(iconPos, nadeIcon, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, expand_time); - drawpic_aspect_skin(picpos, "nade_bg" , '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(picpos, "nade_nbg" , '1 1 0' * mySize.y, nade_color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(iconPos, nadeIcon, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } } @@@ -1085,6 -1089,7 +1089,7 @@@ int nade_prevframe float nade_statuschange_time; void HUD_Ammo(void) { + if(intermission == 2) return; if(hud != HUD_NORMAL) return; if(!autocvar__hud_configure) { @@@ -1302,196 -1307,218 +1307,218 @@@ void DrawNumIcon(vector myPos, vector m // Powerups (#2) // - void HUD_Powerups(void) + + // Powerup item fields (reusing existing fields) + .string message; // Human readable name + .string netname; // Icon name + .vector colormod; // Color + .float count; // Time left + .float lifetime; // Maximum time + + entity powerupItems; + int powerupItemsCount; + + void resetPowerupItems() + { + entity item; + for(item = powerupItems; item; item = item.chain) + item.count = 0; + + powerupItemsCount = 0; + } + + void addPowerupItem(string name, string icon, vector color, float currentTime, float lifeTime) + { + if(!powerupItems) + powerupItems = spawn(); + + entity item; + for(item = powerupItems; item.count; item = item.chain) + if(!item.chain) + item.chain = spawn(); + + item.message = name; + item.netname = icon; + item.colormod = color; + item.count = currentTime; + item.lifetime = lifeTime; + + ++powerupItemsCount; + } + + int getPowerupItemAlign(int align, int column, int row, int columns, int rows, bool isVertical) + { + if(align < 2) + return align; + + bool isTop = isVertical && rows > 1 && row == 0; + bool isBottom = isVertical && rows > 1 && row == rows-1; + bool isLeft = !isVertical && columns > 1 && column == 0; + bool isRight = !isVertical && columns > 1 && column == columns-1; + + if(isTop || isLeft) return (align == 2) ? 1 : 0; + if(isBottom || isRight) return (align == 2) ? 0 : 1; + + return 2; + } + + void HUD_Powerups() { - float strength_time, shield_time, superweapons_time; + if(intermission == 2) return; + + int allItems = getstati(STAT_ITEMS, 0, 24); + int allBuffs = getstati(STAT_BUFFS, 0, 24); + int strengthTime, shieldTime, superTime; + + // Initialize items if(!autocvar__hud_configure) { if(!autocvar_hud_panel_powerups) return; if(spectatee_status == -1) return; - if(!(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE | IT_SUPERWEAPON))) return; - if (getstati(STAT_HEALTH) <= 0) return; + if(getstati(STAT_HEALTH) <= 0) return; + if(!(allItems & (ITEM_Strength.m_itemid | ITEM_Shield.m_itemid | IT_SUPERWEAPON)) && !allBuffs) return; - strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); - shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); - superweapons_time = bound(0, getstatf(STAT_SUPERWEAPONS_FINISHED) - time, 99); + strengthTime = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); + shieldTime = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); + superTime = bound(0, getstatf(STAT_SUPERWEAPONS_FINISHED) - time, 99); - if (getstati(STAT_ITEMS, 0, 24) & IT_UNLIMITED_SUPERWEAPONS) - superweapons_time = 99; // force max + if(allItems & IT_UNLIMITED_SUPERWEAPONS) + superTime = 99; - // prevent stuff to show up on mismatch that will be fixed next frame - if (!(getstati(STAT_ITEMS, 0, 24) & IT_SUPERWEAPON)) - superweapons_time = 0; + // Prevent stuff to show up on mismatch that will be fixed next frame + if(!(allItems & IT_SUPERWEAPON)) + superTime = 0; } else { - strength_time = 15; - shield_time = 27; - superweapons_time = 13; + strengthTime = 15; + shieldTime = 27; + superTime = 13; + allBuffs = 0; } - HUD_Panel_UpdateCvars(); + // Add items to linked list + resetPowerupItems(); - draw_beginBoldFont(); + if(strengthTime) + addPowerupItem("Strength", "strength", autocvar_hud_progressbar_strength_color, strengthTime, 30); + if(shieldTime) + addPowerupItem("Shield", "shield", autocvar_hud_progressbar_shield_color, shieldTime, 30); + if(superTime) + addPowerupItem("Superweapons", "superweapons", autocvar_hud_progressbar_superweapons_color, superTime, 30); - vector pos, mySize; - pos = panel_pos; - mySize = panel_size; + FOREACH(BUFFS, it.m_itemid & allBuffs, LAMBDA( + addPowerupItem(it.m_prettyName, strcat("buff_", it.m_name), it.m_color, bound(0, getstatf(STAT_BUFF_TIME) - time, 99), 60); + )); + + if(!powerupItemsCount) + return; + + // Draw panel background + HUD_Panel_UpdateCvars(); + HUD_Panel_DrawBg(1); + + // Set drawing area + vector pos = panel_pos; + vector size = panel_size; + bool isVertical = size.y > size.x; - HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time, superweapons_time), 1)); if(panel_bg_padding) { pos += '1 1 0' * panel_bg_padding; - mySize -= '2 2 0' * panel_bg_padding; + size -= '2 2 0' * panel_bg_padding; } - float panel_ar = mySize.x/mySize.y; - bool is_vertical = (panel_ar < 1); - vector shield_offset = '0 0 0', strength_offset = '0 0 0', superweapons_offset = '0 0 0'; + // Find best partitioning of the drawing area + const float DESIRED_ASPECT = 6; + float aspect = 0, a; + int columns = 0, c; + int rows = 0, r; + int i = 1; - int superweapons_is = -1; - - if(superweapons_time) + do { - if(strength_time) - { - if(shield_time) - superweapons_is = 0; - else - superweapons_is = 2; - } - else - { - if(shield_time) - superweapons_is = 1; - else - superweapons_is = 2; - } - } + c = floor(powerupItemsCount / i); + r = ceil(powerupItemsCount / c); + a = isVertical ? (size.y/r) / (size.x/c) : (size.x/c) / (size.y/r); - // FIXME handle superweapons here - if(superweapons_is == 0) - { - if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1)) + if(i == 1 || fabs(DESIRED_ASPECT - a) < fabs(DESIRED_ASPECT - aspect)) { - mySize.x *= (1.0 / 3.0); - superweapons_offset.x = mySize.x; - if (autocvar_hud_panel_powerups_flip) - shield_offset.x = 2*mySize.x; - else - strength_offset.x = 2*mySize.x; - } - else - { - mySize.y *= (1.0 / 3.0); - superweapons_offset.y = mySize.y; - if (autocvar_hud_panel_powerups_flip) - shield_offset.y = 2*mySize.y; - else - strength_offset.y = 2*mySize.y; + aspect = a; + columns = c; + rows = r; } } - else + while(++i <= powerupItemsCount); + + // Prevent single items from getting too wide + if(powerupItemsCount == 1 && aspect > DESIRED_ASPECT) { - if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1)) + if(isVertical) { - mySize.x *= 0.5; - if (autocvar_hud_panel_powerups_flip) - shield_offset.x = mySize.x; - else - strength_offset.x = mySize.x; + size.y *= 0.5; + pos.y += size.y * 0.5; } else { - mySize.y *= 0.5; - if (autocvar_hud_panel_powerups_flip) - shield_offset.y = mySize.y; - else - strength_offset.y = mySize.y; + size.x *= 0.5; + pos.x += size.x * 0.5; } } - bool shield_baralign, strength_baralign, superweapons_baralign; - bool shield_iconalign, strength_iconalign, superweapons_iconalign; + // Draw items from linked list + vector itemPos = pos; + vector itemSize = eX * (size.x / columns) + eY * (size.y / rows); + vector textColor = '1 1 1'; - if (autocvar_hud_panel_powerups_flip) - { - strength_baralign = (autocvar_hud_panel_powerups_baralign == 2 || autocvar_hud_panel_powerups_baralign == 1); - shield_baralign = (autocvar_hud_panel_powerups_baralign == 3 || autocvar_hud_panel_powerups_baralign == 1); - strength_iconalign = (autocvar_hud_panel_powerups_iconalign == 2 || autocvar_hud_panel_powerups_iconalign == 1); - shield_iconalign = (autocvar_hud_panel_powerups_iconalign == 3 || autocvar_hud_panel_powerups_iconalign == 1); - } - else - { - shield_baralign = (autocvar_hud_panel_powerups_baralign == 2 || autocvar_hud_panel_powerups_baralign == 1); - strength_baralign = (autocvar_hud_panel_powerups_baralign == 3 || autocvar_hud_panel_powerups_baralign == 1); - shield_iconalign = (autocvar_hud_panel_powerups_iconalign == 2 || autocvar_hud_panel_powerups_iconalign == 1); - strength_iconalign = (autocvar_hud_panel_powerups_iconalign == 3 || autocvar_hud_panel_powerups_iconalign == 1); - } + int fullSeconds = 0; + int align = 0; + int column = 0; + int row = 0; - if(superweapons_is == 0) - { - superweapons_iconalign = strength_iconalign; - superweapons_baralign = 2; - } - else if(superweapons_is == 1) - { - superweapons_offset = strength_offset; - superweapons_iconalign = strength_iconalign; - superweapons_baralign = strength_baralign; - } - else // if(superweapons_is == 2) + draw_beginBoldFont(); + for(entity item = powerupItems; item.count; item = item.chain) { - superweapons_offset = shield_offset; - superweapons_iconalign = shield_iconalign; - superweapons_baralign = shield_baralign; - } + itemPos = eX * (pos.x + column * itemSize.x) + eY * (pos.y + row * itemSize.y); - if(shield_time) - { - const float maxshield = 30; - float shield = ceil(shield_time); + // Draw progressbar if(autocvar_hud_panel_powerups_progressbar) - HUD_Panel_DrawProgressBar(pos + shield_offset, mySize, autocvar_hud_panel_powerups_progressbar_shield, shield/maxshield, is_vertical, shield_baralign, autocvar_hud_progressbar_shield_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - if(autocvar_hud_panel_powerups_text) { - if(shield > 1) - DrawNumIcon(pos + shield_offset, mySize, shield, "shield", is_vertical, shield_iconalign, '1 1 1', 1); - if(shield <= 5) - DrawNumIcon_expanding(pos + shield_offset, mySize, shield, "shield", is_vertical, shield_iconalign, '1 1 1', 1, bound(0, (shield - shield_time) / 0.5, 1)); + align = getPowerupItemAlign(autocvar_hud_panel_powerups_baralign, column, row, columns, rows, isVertical); + HUD_Panel_DrawProgressBar(itemPos, itemSize, "progressbar", item.count / item.lifetime, isVertical, align, item.colormod, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - } - if(strength_time) - { - const float maxstrength = 30; - float strength = ceil(strength_time); - if(autocvar_hud_panel_powerups_progressbar) - HUD_Panel_DrawProgressBar(pos + strength_offset, mySize, autocvar_hud_panel_powerups_progressbar_strength, strength/maxstrength, is_vertical, strength_baralign, autocvar_hud_progressbar_strength_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + // Draw icon and text if(autocvar_hud_panel_powerups_text) { - if(strength > 1) - DrawNumIcon(pos + strength_offset, mySize, strength, "strength", is_vertical, strength_iconalign, '1 1 1', 1); - if(strength <= 5) - DrawNumIcon_expanding(pos + strength_offset, mySize, strength, "strength", is_vertical, strength_iconalign, '1 1 1', 1, bound(0, (strength - strength_time) / 0.5, 1)); + align = getPowerupItemAlign(autocvar_hud_panel_powerups_iconalign, column, row, columns, rows, isVertical); + fullSeconds = ceil(item.count); + textColor = '0.6 0.6 0.6' + (item.colormod * 0.4); + + if(item.count > 1) + DrawNumIcon(itemPos, itemSize, fullSeconds, item.netname, isVertical, align, textColor, panel_fg_alpha); + if(item.count <= 5) + DrawNumIcon_expanding(itemPos, itemSize, fullSeconds, item.netname, isVertical, align, textColor, panel_fg_alpha, bound(0, (fullSeconds - item.count) / 0.5, 1)); } - } - if(superweapons_time) - { - const float maxsuperweapons = 30; - float superweapons = ceil(superweapons_time); - if(autocvar_hud_panel_powerups_progressbar) - HUD_Panel_DrawProgressBar(pos + superweapons_offset, mySize, autocvar_hud_panel_powerups_progressbar_superweapons, superweapons/maxsuperweapons, is_vertical, superweapons_baralign, autocvar_hud_progressbar_superweapons_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - if(autocvar_hud_panel_powerups_text) + // Determine next section + if(isVertical) + { + if(++column >= columns) + { + column = 0; + ++row; + } + } + else { - if(superweapons > 1) - DrawNumIcon(pos + superweapons_offset, mySize, superweapons, "superweapons", is_vertical, superweapons_iconalign, '1 1 1', 1); - if(superweapons <= 5) - DrawNumIcon_expanding(pos + superweapons_offset, mySize, superweapons, "superweapons", is_vertical, superweapons_iconalign, '1 1 1', 1, bound(0, (superweapons - superweapons_time) / 0.5, 1)); + if(++row >= rows) + { + row = 0; + ++column; + } } } - draw_endBoldFont(); } @@@ -1502,6 -1529,7 +1529,7 @@@ void HUD_HealthArmor(void) { int armor, health, fuel; + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_healtharmor) return; @@@ -1551,6 -1579,9 +1579,9 @@@ } HUD_Panel_UpdateCvars(); + + draw_beginBoldFont(); + vector pos, mySize; pos = panel_pos; mySize = panel_size; @@@ -1756,6 -1787,8 +1787,8 @@@ HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, fuel_baralign, autocvar_hud_progressbar_fuel_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); } } + + draw_endBoldFont(); } // Notification area (#4) @@@ -1803,6 -1836,7 +1836,7 @@@ void HUD_Notify_Push(string icon, strin void HUD_Notify(void) { + if(intermission == 2) return; if (!autocvar__hud_configure) if (!autocvar_hud_panel_notify) return; @@@ -1928,6 -1962,7 +1962,7 @@@ string seconds_tostring(float sec void HUD_Timer(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_timer) return; @@@ -1985,8 -2020,170 +2020,170 @@@ // Radar (#6) // + + float HUD_Radar_Clickable() + { + return hud_panel_radar_mouse && !hud_panel_radar_temp_hidden; + } + + void HUD_Radar_Show_Maximized(bool doshow,float clickable) + { + hud_panel_radar_maximized = doshow; + hud_panel_radar_temp_hidden = 0; + + if ( doshow ) + { + if (clickable) + { + if(autocvar_hud_cursormode) + setcursormode(1); + hud_panel_radar_mouse = 1; + } + } + else if ( hud_panel_radar_mouse ) + { + hud_panel_radar_mouse = 0; + mouseClicked = 0; + if(autocvar_hud_cursormode) + if(!mv_active) + setcursormode(0); + } + } + void HUD_Radar_Hide_Maximized() + { + HUD_Radar_Show_Maximized(false,false); + } + + + float HUD_Radar_InputEvent(float bInputType, float nPrimary, float nSecondary) + { + if(!hud_panel_radar_maximized || !hud_panel_radar_mouse || + autocvar__hud_configure || mv_active) + return false; + + if(bInputType == 3) + { + mousepos_x = nPrimary; + mousepos_y = nSecondary; + return true; + } + + if(nPrimary == K_MOUSE1) + { + if(bInputType == 0) // key pressed + mouseClicked |= S_MOUSE1; + else if(bInputType == 1) // key released + mouseClicked -= (mouseClicked & S_MOUSE1); + } + else if(nPrimary == K_MOUSE2) + { + if(bInputType == 0) // key pressed + mouseClicked |= S_MOUSE2; + else if(bInputType == 1) // key released + mouseClicked -= (mouseClicked & S_MOUSE2); + } + else if ( nPrimary == K_ESCAPE && bInputType == 0 ) + { + HUD_Radar_Hide_Maximized(); + } + else + { + // allow console/use binds to work without hiding the map + string con_keys; + float keys; + float i; + con_keys = strcat(findkeysforcommand("toggleconsole", 0)," ",findkeysforcommand("+use", 0)) ; + keys = tokenize(con_keys); // findkeysforcommand returns data for this + for (i = 0; i < keys; ++i) + { + if(nPrimary == stof(argv(i))) + return false; + } + + if ( getstati(STAT_HEALTH) <= 0 ) + { + // Show scoreboard + if ( bInputType < 2 ) + { + con_keys = findkeysforcommand("+showscores", 0); + keys = tokenize(con_keys); + for (i = 0; i < keys; ++i) + { + if ( nPrimary == stof(argv(i)) ) + { + hud_panel_radar_temp_hidden = bInputType == 0; + return false; + } + } + } + } + else if ( bInputType == 0 ) + HUD_Radar_Hide_Maximized(); + + return false; + } + + return true; + } + + void HUD_Radar_Mouse() + { + if ( !hud_panel_radar_mouse ) return; + if(mv_active) return; + + if ( intermission ) + { + HUD_Radar_Hide_Maximized(); + return; + } + + if(mouseClicked & S_MOUSE2) + { + HUD_Radar_Hide_Maximized(); + return; + } + + if(!autocvar_hud_cursormode) + { + mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed; + + mousepos_x = bound(0, mousepos_x, vid_conwidth); + mousepos_y = bound(0, mousepos_y, vid_conheight); + } + + HUD_Panel_UpdateCvars(); + + + panel_size = autocvar_hud_panel_radar_maximized_size; + panel_size_x = bound(0.2, panel_size_x, 1) * vid_conwidth; + panel_size_y = bound(0.2, panel_size_y, 1) * vid_conheight; + panel_pos_x = (vid_conwidth - panel_size_x) / 2; + panel_pos_y = (vid_conheight - panel_size_y) / 2; + + if(mouseClicked & S_MOUSE1) + { + // click outside + if ( mousepos_x < panel_pos_x || mousepos_x > panel_pos_x + panel_size_x || + mousepos_y < panel_pos_y || mousepos_y > panel_pos_y + panel_size_y ) + { + HUD_Radar_Hide_Maximized(); + return; + } + vector pos = teamradar_texcoord_to_3dcoord(teamradar_2dcoord_to_texcoord(mousepos),view_origin_z); + localcmd(sprintf("cmd ons_spawn %f %f %f",pos_x,pos_y,pos_z)); + + HUD_Radar_Hide_Maximized(); + return; + } + + + const vector cursor_size = '32 32 0'; + drawpic(mousepos-'8 4 0', strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), cursor_size, '1 1 1', 0.8, DRAWFLAG_NORMAL); + } + void HUD_Radar(void) { + if(intermission == 2) return; if (!autocvar__hud_configure) { if (hud_panel_radar_maximized) @@@ -2005,6 -2202,9 +2202,9 @@@ } } + if ( hud_panel_radar_temp_hidden ) + return; + HUD_Panel_UpdateCvars(); float f = 0; @@@ -2158,8 -2358,27 +2358,27 @@@ for(tm = world; (tm = find(tm, classname, "radarlink")); ) draw_teamradar_link(tm.origin, tm.velocity, tm.team); + + vector coord; + vector brightcolor; for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); ) + { + if ( hud_panel_radar_mouse ) + if ( tm.health > 0 ) + if ( tm.team == myteam+1 ) + { + coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(tm.origin)); + if ( vlen(mousepos-coord) < 8 ) + { + brightcolor_x = min(1,tm.teamradar_color_x*1.5); + brightcolor_y = min(1,tm.teamradar_color_y*1.5); + brightcolor_z = min(1,tm.teamradar_color_z*1.5); + drawpic(coord - '8 8 0', "gfx/teamradar_icon_glow", '16 16 0', brightcolor, panel_fg_alpha, 0); + } + } + draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, panel_fg_alpha); + } for(tm = world; (tm = find(tm, classname, "entcs_receiver")); ) { color2 = GetPlayerColor(tm.sv_entnum); @@@ -2169,6 -2388,21 +2388,21 @@@ draw_teamradar_player(view_origin, view_angles, '1 1 1'); drawresetcliparea(); + + if ( hud_panel_radar_mouse ) + { + string message = "Click to select teleport destination"; + + if ( getstati(STAT_HEALTH) <= 0 ) + { + message = "Click to select spawn location"; + } + + drawcolorcodedstring(pos + '0.5 0 0' * (mySize_x - stringwidth(message, true, hud_fontsize)) - '0 1 0' * hud_fontsize_y * 2, + message, hud_fontsize, hud_panel_radar_foreground_alpha, DRAWFLAG_NORMAL); + + hud_panel_radar_bottom = pos_y + mySize_y + hud_fontsize_y; + } } // Score (#7) @@@ -2298,6 -2532,7 +2532,7 @@@ void HUD_Score_Rankings(vector pos, vec void HUD_Score(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_score) return; @@@ -2321,7 -2556,7 +2556,7 @@@ vector distribution_color; entity tm, pl, me; - me = playerslots[player_localentnum - 1]; + me = playerslots[current_player]; if((scores_flags[ps_primary] & SFL_TIME) && !teamplay) { // race/cts record display on HUD string timer, distrtimer; @@@ -2481,6 -2716,7 +2716,7 @@@ // void HUD_RaceTimer (void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_racetimer) return; @@@ -2490,8 -2726,6 +2726,6 @@@ HUD_Panel_UpdateCvars(); - draw_beginBoldFont(); - vector pos, mySize; pos = panel_pos; mySize = panel_size; @@@ -2527,7 -2761,9 +2761,9 @@@ if(autocvar__hud_configure) { s = "0:13:37"; + draw_beginBoldFont(); drawstring(pos + eX * 0.5 * mySize.x - '0.5 0 0' * stringwidth(s, false, '0.60 0.60 0' * mySize.y), s, '0.60 0.60 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + draw_endBoldFont(); s = _("^1Intermediate 1 (+15.42)"); drawcolorcodedstring(pos + eX * 0.5 * mySize.x - '0.5 0 0' * stringwidth(s, true, '1 1 0' * 0.20 * mySize.y) + eY * 0.60 * mySize.y, s, '1 1 0' * 0.20 * mySize.y, panel_fg_alpha, DRAWFLAG_NORMAL); s = sprintf(_("^1PENALTY: %.1f (%s)"), 2, "missing a checkpoint"); @@@ -2577,6 -2813,8 +2813,8 @@@ } } + draw_beginBoldFont(); + if(forcetime != "") { a = bound(0, (time - race_checkpointtime) / 0.5, 1); @@@ -2590,6 -2828,8 +2828,8 @@@ s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime)); drawstring(pos + eX * 0.5 * mySize.x - '0.5 0 0' * stringwidth(s, false, '0.6 0.6 0' * mySize.y), s, '0.6 0.6 0' * mySize.y, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); } + + draw_endBoldFont(); } else { @@@ -2620,8 -2860,6 +2860,6 @@@ } } } - - draw_endBoldFont(); } // Vote window (#9) @@@ -2629,6 -2867,7 +2867,7 @@@ void HUD_Vote(void) { + if(intermission == 2) return; if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS))) { vote_active = 1; @@@ -2857,154 -3096,184 +3096,184 @@@ void HUD_Mod_CA(vector myPos, vector my } // CTF HUD modicon section - float redflag_prevframe, blueflag_prevframe; // status during previous frame - int redflag_prevstatus, blueflag_prevstatus; // last remembered status - float redflag_statuschange_time, blueflag_statuschange_time; // time when the status changed + int redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe, neutralflag_prevframe; // status during previous frame + int redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus, neutralflag_prevstatus; // last remembered status + float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time, neutralflag_statuschange_time; // time when the status changed void HUD_Mod_CTF_Reset(void) { - redflag_prevstatus = blueflag_prevstatus = redflag_prevframe = blueflag_prevframe = redflag_statuschange_time = blueflag_statuschange_time = 0; + redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = neutralflag_prevstatus = 0; + redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = neutralflag_prevframe = 0; + redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0; } void HUD_Mod_CTF(vector pos, vector mySize) { - vector redflag_pos, blueflag_pos; + vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos; vector flag_size; float f; // every function should have that - int redflag, blueflag; // current status - float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime; // time since the status changed - int stat_items; + int redflag, blueflag, yellowflag, pinkflag, neutralflag; // current status + float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime, yellowflag_statuschange_elapsedtime, pinkflag_statuschange_elapsedtime, neutralflag_statuschange_elapsedtime; // time since the status changed + bool ctf_oneflag; // one-flag CTF mode enabled/disabled + int stat_items = getstati(STAT_CTF_FLAGSTATUS, 0, 24); + float fs, fs2, fs3, size1, size2; + vector e1, e2; - stat_items = getstati(STAT_ITEMS, 0, 24); - redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3; - blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3; + redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3; + blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3; + yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3; + pinkflag = (stat_items/CTF_PINK_FLAG_TAKEN) & 3; + neutralflag = (stat_items/CTF_NEUTRAL_FLAG_TAKEN) & 3; - if(redflag || blueflag) - mod_active = 1; - else - mod_active = 0; + ctf_oneflag = (stat_items & CTF_FLAG_NEUTRAL); - if(autocvar__hud_configure) - { + mod_active = (redflag || blueflag || yellowflag || pinkflag || neutralflag); + + if (autocvar__hud_configure) { redflag = 1; blueflag = 2; + if (team_count >= 3) + yellowflag = 2; + if (team_count >= 4) + pinkflag = 3; + ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor? } // when status CHANGES, set old status into prevstatus and current status into status - if (redflag != redflag_prevframe) - { - redflag_statuschange_time = time; - redflag_prevstatus = redflag_prevframe; - redflag_prevframe = redflag; - } - - if (blueflag != blueflag_prevframe) - { - blueflag_statuschange_time = time; - blueflag_prevstatus = blueflag_prevframe; - blueflag_prevframe = blueflag; - } - - redflag_statuschange_elapsedtime = time - redflag_statuschange_time; - blueflag_statuschange_elapsedtime = time - blueflag_statuschange_time; - - float BLINK_FACTOR = 0.15; - float BLINK_BASE = 0.85; + #define X(team) do { \ + if (team##flag != team##flag_prevframe) { \ + team##flag_statuschange_time = time; \ + team##flag_prevstatus = team##flag_prevframe; \ + team##flag_prevframe = team##flag; \ + } \ + team##flag_statuschange_elapsedtime = time - team##flag_statuschange_time; \ + } while (0) + X(red); + X(blue); + X(yellow); + X(pink); + X(neutral); + #undef X + + const float BLINK_FACTOR = 0.15; + const float BLINK_BASE = 0.85; // note: // RMS = sqrt(BLINK_BASE^2 + 0.5 * BLINK_FACTOR^2) // thus // BLINK_BASE = sqrt(RMS^2 - 0.5 * BLINK_FACTOR^2) // ensure RMS == 1 - float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz - - string red_icon, red_icon_prevstatus; - float red_alpha, red_alpha_prevstatus; - red_alpha = red_alpha_prevstatus = 1; - switch(redflag) { - case 1: red_icon = "flag_red_taken"; break; - case 2: red_icon = "flag_red_lost"; break; - case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; - default: - if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2)) - red_icon = "flag_red_shielded"; - else - red_icon = string_null; - break; - } - switch(redflag_prevstatus) { - case 1: red_icon_prevstatus = "flag_red_taken"; break; - case 2: red_icon_prevstatus = "flag_red_lost"; break; - case 3: red_icon_prevstatus = "flag_red_carrying"; red_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; + const float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz + + #define X(team, cond) \ + string team##_icon, team##_icon_prevstatus; \ + int team##_alpha, team##_alpha_prevstatus; \ + team##_alpha = team##_alpha_prevstatus = 1; \ + do { \ + switch (team##flag) { \ + case 1: team##_icon = "flag_" #team "_taken"; break; \ + case 2: team##_icon = "flag_" #team "_lost"; break; \ + case 3: team##_icon = "flag_" #team "_carrying"; team##_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \ + default: \ + if ((stat_items & CTF_SHIELDED) && (cond)) { \ + team##_icon = "flag_" #team "_shielded"; \ + } else { \ + team##_icon = string_null; \ + } \ + break; \ + } \ + switch (team##flag_prevstatus) { \ + case 1: team##_icon_prevstatus = "flag_" #team "_taken"; break; \ + case 2: team##_icon_prevstatus = "flag_" #team "_lost"; break; \ + case 3: team##_icon_prevstatus = "flag_" #team "_carrying"; team##_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \ + default: \ + if (team##flag == 3) { \ + team##_icon_prevstatus = "flag_" #team "_carrying"; /* make it more visible */\ + } else if((stat_items & CTF_SHIELDED) && (cond)) { \ + team##_icon_prevstatus = "flag_" #team "_shielded"; \ + } else { \ + team##_icon_prevstatus = string_null; \ + } \ + break; \ + } \ + } while (0) + X(red, myteam != NUM_TEAM_1); + X(blue, myteam != NUM_TEAM_2); + X(yellow, myteam != NUM_TEAM_3); + X(pink, myteam != NUM_TEAM_4); + X(neutral, true); + #undef X + + if (ctf_oneflag) { + // hacky, but these aren't needed + red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null; + fs = fs2 = fs3 = 1; + } else switch (team_count) { default: - if(redflag == 3) - red_icon_prevstatus = "flag_red_carrying"; // make it more visible - else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2)) - red_icon_prevstatus = "flag_red_shielded"; - else - red_icon_prevstatus = string_null; - break; + case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break; + case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break; + case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break; } - string blue_icon, blue_icon_prevstatus; - float blue_alpha, blue_alpha_prevstatus; - blue_alpha = blue_alpha_prevstatus = 1; - switch(blueflag) { - case 1: blue_icon = "flag_blue_taken"; break; - case 2: blue_icon = "flag_blue_lost"; break; - case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; - default: - if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1)) - blue_icon = "flag_blue_shielded"; - else - blue_icon = string_null; - break; - } - switch(blueflag_prevstatus) { - case 1: blue_icon_prevstatus = "flag_blue_taken"; break; - case 2: blue_icon_prevstatus = "flag_blue_lost"; break; - case 3: blue_icon_prevstatus = "flag_blue_carrying"; blue_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; - default: - if(blueflag == 3) - blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible - else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1)) - blue_icon_prevstatus = "flag_blue_shielded"; - else - blue_icon_prevstatus = string_null; - break; + if (mySize_x > mySize_y) { + size1 = mySize_x; + size2 = mySize_y; + e1 = eX; + e2 = eY; + } else { + size1 = mySize_y; + size2 = mySize_x; + e1 = eY; + e2 = eX; } - if(mySize.x > mySize.y) { - if (myteam == NUM_TEAM_1) { // always draw own flag on left + switch (myteam) { + default: + case NUM_TEAM_1: { redflag_pos = pos; - blueflag_pos = pos + eX * 0.5 * mySize.x; - } else { - blueflag_pos = pos; - redflag_pos = pos + eX * 0.5 * mySize.x; + blueflag_pos = pos + eX * fs2 * size1; + yellowflag_pos = pos - eX * fs2 * size1; + pinkflag_pos = pos + eX * fs3 * size1; + break; } - flag_size = eX * 0.5 * mySize.x + eY * mySize.y; - } else { - if (myteam == NUM_TEAM_1) { // always draw own flag on left - redflag_pos = pos; - blueflag_pos = pos + eY * 0.5 * mySize.y; - } else { + case NUM_TEAM_2: { + redflag_pos = pos + eX * fs2 * size1; blueflag_pos = pos; - redflag_pos = pos + eY * 0.5 * mySize.y; + yellowflag_pos = pos - eX * fs2 * size1; + pinkflag_pos = pos + eX * fs3 * size1; + break; + } + case NUM_TEAM_3: { + redflag_pos = pos + eX * fs3 * size1; + blueflag_pos = pos - eX * fs2 * size1; + yellowflag_pos = pos; + pinkflag_pos = pos + eX * fs2 * size1; + break; + } + case NUM_TEAM_4: { + redflag_pos = pos - eX * fs2 * size1; + blueflag_pos = pos + eX * fs3 * size1; + yellowflag_pos = pos + eX * fs2 * size1; + pinkflag_pos = pos; + break; } - flag_size = eY * 0.5 * mySize.y + eX * mySize.x; } - - f = bound(0, redflag_statuschange_elapsedtime*2, 1); - if(red_icon_prevstatus && f < 1) - drawpic_aspect_skin_expanding(redflag_pos, red_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * red_alpha_prevstatus, DRAWFLAG_NORMAL, f); - if(red_icon) - drawpic_aspect_skin(redflag_pos, red_icon, flag_size, '1 1 1', panel_fg_alpha * red_alpha * f, DRAWFLAG_NORMAL); - - f = bound(0, blueflag_statuschange_elapsedtime*2, 1); - if(blue_icon_prevstatus && f < 1) - drawpic_aspect_skin_expanding(blueflag_pos, blue_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * blue_alpha_prevstatus, DRAWFLAG_NORMAL, f); - if(blue_icon) - drawpic_aspect_skin(blueflag_pos, blue_icon, flag_size, '1 1 1', panel_fg_alpha * blue_alpha * f, DRAWFLAG_NORMAL); + neutralflag_pos = pos; + flag_size = e1 * fs * size1 + e2 * size2; + + #define X(team) do { \ + f = bound(0, team##flag_statuschange_elapsedtime * 2, 1); \ + if (team##_icon_prevstatus && f < 1) \ + drawpic_aspect_skin_expanding(team##flag_pos, team##_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * team##_alpha_prevstatus, DRAWFLAG_NORMAL, f); \ + if (team##_icon) \ + drawpic_aspect_skin(team##flag_pos, team##_icon, flag_size, '1 1 1', panel_fg_alpha * team##_alpha * f, DRAWFLAG_NORMAL); \ + } while (0) + X(red); + X(blue); + X(yellow); + X(pink); + X(neutral); + #undef X } // Keyhunt HUD modicon section @@@ -3475,6 -3744,7 +3744,7 @@@ float mod_change; // "time" when mod_ac void HUD_ModIcons(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_modicons) return; @@@ -3516,6 -3786,7 +3786,7 @@@ // void HUD_PressedKeys(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_pressedkeys) return; @@@ -3602,6 -3873,15 +3873,15 @@@ void HUD_Chat(void HUD_Panel_UpdateCvars(); + if(intermission == 2) + { + // reserve some more space to the mapvote panel + // by resizing and moving chat panel to the bottom + panel_size.y = min(panel_size.y, vid_conheight * 0.2); + panel_pos.y = vid_conheight - panel_size.y - panel_bg_border * 2; + chat_posy = panel_pos.y; + chat_sizey = panel_size.y; + } if(autocvar__con_chat_maximized && !autocvar__hud_configure) // draw at full screen height if maximized { panel_pos.y = panel_bg_border; @@@ -3670,6 -3950,7 +3950,7 @@@ float frametimeavg1; // 1 frame ag float frametimeavg2; // 2 frames ago void HUD_EngineInfo(void) { + //if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_engineinfo) return; @@@ -3731,6 -4012,7 +4012,7 @@@ } while(0) void HUD_InfoMessages(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_infomessages) return; @@@ -3785,7 -4067,7 +4067,7 @@@ if(spectatee_status == -1) s = _("^1Observing"); else - s = sprintf(_("^1Spectating: ^7%s"), GetPlayerName(player_localentnum - 1)); + s = sprintf(_("^1Spectating: ^7%s"), GetPlayerName(current_player)); drawInfoMessage(s); if(spectatee_status == -1) @@@ -3909,8 -4191,10 +4191,10 @@@ // vector acc_prevspeed; float acc_prevtime, acc_avg, top_speed, top_speed_time; + float physics_update_time, discrete_speed, discrete_acceleration; void HUD_Physics(void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_physics) return; @@@ -3996,8 -4280,23 +4280,23 @@@ acc_prevspeed = vel; acc_prevtime = time; - f = bound(0, f * 10, 1); - acc_avg = acc_avg * (1 - f) + acceleration * f; + if(autocvar_hud_panel_physics_acceleration_movingaverage) + { + f = bound(0, f * 10, 1); + acc_avg = acc_avg * (1 - f) + acceleration * f; + acceleration = acc_avg; + } + } + + int acc_decimals = 2; + if(time > physics_update_time) + { + // workaround for ftos_decimals returning a negative 0 + if(discrete_acceleration > -1 / pow(10, acc_decimals) && discrete_acceleration < 0) + discrete_acceleration = 0; + discrete_acceleration = acceleration; + discrete_speed = speed; + physics_update_time += autocvar_hud_panel_physics_update_interval; } //compute layout @@@ -4051,7 -4350,7 +4350,7 @@@ //else //tmp_offset_x = 0; tmp_offset.y = (panel_size.y - tmp_size.y) / 2; - drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(discrete_speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); //draw speed unit if (speed_baralign) @@@ -4141,7 -4440,7 +4440,7 @@@ f = acceleration/autocvar_hud_panel_physics_acceleration_max; if (autocvar_hud_panel_physics_acceleration_progressbar_nonlinear) - f = sqrt(f); + f = (f >= 0 ? sqrt(f) : -sqrt(-f)); if (acceleration_progressbar_scale) // allow progressbar to go out of panel bounds { @@@ -4163,12 -4462,16 +4462,16 @@@ HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset + tmp_offset, tmp_size, "accelbar", f, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - tmp_size.x = panel_size.x; - tmp_size.y = panel_size.y * text_scale; - tmp_offset.x = 0; - tmp_offset.y = (panel_size.y - tmp_size.y) / 2; - if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) - drawstring_aspect(panel_pos + acceleration_offset + tmp_offset, strcat(ftos_decimals(acceleration, 2), "g"), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + + if(autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) + { + tmp_size.x = panel_size.x; + tmp_size.y = panel_size.y * text_scale; + tmp_offset.x = 0; + tmp_offset.y = (panel_size.y - tmp_size.y) / 2; + + drawstring_aspect(panel_pos + acceleration_offset + tmp_offset, strcat(ftos_decimals(discrete_acceleration, acc_decimals), "g"), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + } draw_endBoldFont(); } @@@ -4283,6 -4586,7 +4586,7 @@@ void reset_centerprint_messages(void float hud_configure_cp_generation_time; void HUD_CenterPrint (void) { + if(intermission == 2) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_centerprint) return; @@@ -4325,7 -4629,15 +4629,15 @@@ } HUD_Panel_UpdateCvars(); - if(scoreboard_fade_alpha) + if ( HUD_Radar_Clickable() ) + { + if (hud_panel_radar_bottom >= 0.96 * vid_conheight) + return; + + panel_pos = eY * hud_panel_radar_bottom + eX * 0.5 * (vid_conwidth - panel_size_x); + panel_size_y = min(panel_size_y, vid_conheight - hud_panel_radar_bottom); + } + else if(scoreboard_fade_alpha) { hud_fade_alpha = hud_fade_alpha_save; @@@ -4501,90 -4813,13 +4813,31 @@@ } } - // Buffs (#18) - // - void HUD_Buffs(void) - { - int buffs = getstati(STAT_BUFFS, 0, 24); - if(!autocvar__hud_configure) - { - if(!autocvar_hud_panel_buffs) return; - if(spectatee_status == -1) return; - if(getstati(STAT_HEALTH) <= 0) return; - if(!buffs) return; - } - else - { - buffs = Buff_Type_first.items; // force first buff - } - - int b = 0; // counter to tell other functions that we have buffs - entity e; - string s = ""; - for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items) - { - ++b; - string o = strcat(rgb_to_hexcolor(Buff_Color(e.items)), Buff_PrettyName(e.items)); - if(s == "") - s = o; - else - s = strcat(s, " ", o); - } - - HUD_Panel_UpdateCvars(); - - draw_beginBoldFont(); - - vector pos, mySize; - pos = panel_pos; - mySize = panel_size; - - HUD_Panel_DrawBg(bound(0, b, 1)); - if(panel_bg_padding) - { - pos += '1 1 0' * panel_bg_padding; - mySize -= '2 2 0' * panel_bg_padding; - } - - //float panel_ar = mySize_x/mySize_y; - //bool is_vertical = (panel_ar < 1); - //float buff_iconalign = autocvar_hud_panel_buffs_iconalign; - vector buff_offset = '0 0 0'; - - for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items) - { - //DrawNumIcon(pos + buff_offset, mySize, shield, "shield", is_vertical, buff_iconalign, '1 1 1', 1); - drawcolorcodedstring_aspect(pos + buff_offset, s, mySize, panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); - } - - draw_endBoldFont(); - } - +// Minigame +// +#include "../common/minigames/cl_minigames_hud.qc" + /* ================== Main HUD system ================== */ +bool HUD_Panel_CheckFlags(int showflags) +{ + if ( HUD_Minigame_Showpanels() ) + return showflags & PANEL_SHOW_MINIGAME; + return showflags & PANEL_SHOW_MAINGAME; +} + +void HUD_Panel_Draw(entity panent) +{ + panel = panent; + if ( HUD_Panel_CheckFlags(panel.panel_showflags) ) + panel.panel_draw(); +} + void HUD_Reset (void) { // reset gametype specific icons @@@ -4606,24 -4841,16 +4859,21 @@@ void HUD_Main (void HUD_Configure_Frame(); - if(intermission == 2) // no hud during mapvote - hud_fade_alpha = 0; - // panels that we want to be active together with the scoreboard // they must fade only when the menu does if(scoreboard_fade_alpha == 1) { - (panel = HUD_PANEL(CENTERPRINT)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(CENTERPRINT)); return; } if(!autocvar__hud_configure && !hud_fade_alpha) + { + hud_fade_alpha = 1; + HUD_Panel_Draw(HUD_PANEL(VOTE)); + hud_fade_alpha = 0; return; + } // Drawing stuff if (hud_skin_prev != autocvar_hud_skin) @@@ -4636,8 -4863,6 +4886,6 @@@ hud_skin_prev = strzone(autocvar_hud_skin); } - current_player = player_localentnum; - // draw the dock if(autocvar_hud_dock != "" && autocvar_hud_dock != "0") { @@@ -4657,11 -4882,11 +4905,11 @@@ { string hud_dock_color = autocvar_hud_dock_color; if(hud_dock_color == "shirt") { - f = stof(getplayerkeyvalue(current_player - 1, "colors")); + f = stof(getplayerkeyvalue(current_player, "colors")); color = colormapPaletteColor(floor(f / 16), 0); } else if(hud_dock_color == "pants") { - f = stof(getplayerkeyvalue(current_player - 1, "colors")); + f = stof(getplayerkeyvalue(current_player, "colors")); color = colormapPaletteColor(f % 16, 1); } else @@@ -4722,16 -4947,16 +4970,16 @@@ } hud_draw_maximized = 0; - // draw panels in order specified by panel_order array + // draw panels in the order specified by panel_order array for(i = HUD_PANEL_NUM - 1; i >= 0; --i) - (panel = hud_panel[panel_order[i]]).panel_draw(); + HUD_Panel_Draw(hud_panel[panel_order[i]]); hud_draw_maximized = 1; // panels that may be maximized must check this var // draw maximized panels on top if(hud_panel_radar_maximized) - (panel = HUD_PANEL(RADAR)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(RADAR)); if(autocvar__con_chat_maximized) - (panel = HUD_PANEL(CHAT)).panel_draw(); + HUD_Panel_Draw(HUD_PANEL(CHAT)); HUD_Configure_PostDraw(); diff --combined qcsrc/client/hud.qh index 91a267d522,ee8ca1c687..9850b78d20 --- a/qcsrc/client/hud.qh +++ b/qcsrc/client/hud.qh @@@ -12,6 -12,16 +12,16 @@@ int HUD_PANEL_LAST int panel_order[HUD_PANEL_MAX]; string hud_panelorder_prev; + bool hud_draw_maximized; + bool hud_panel_radar_maximized; + bool hud_panel_radar_mouse; + float hud_panel_radar_bottom; + bool hud_panel_radar_temp_hidden; + bool chat_panel_modified; + bool radar_panel_modified; + + void HUD_Radar_Hide_Maximized(); + void HUD_Reset (void); void HUD_Main (void); @@@ -25,11 -35,6 +35,6 @@@ int vote_prev; // previous state of vot float vote_alpha; float vote_change; // "time" when vote_active changed - float hud_draw_maximized; - float hud_panel_radar_maximized; - float chat_panel_modified; - float radar_panel_modified; - vector mousepos; vector panel_click_distance; // mouse cursor distance from the top left corner of the panel (saved only upon a click) vector panel_click_resizeorigin; // coordinates for opposite point when resizing @@@ -113,6 -118,11 +118,11 @@@ string panel_bg_padding_str class(HUDPanel) .void() panel_draw; + // chat panel can be reduced / moved while the mapvote is active + // let know the mapvote panel about chat pos and size + float chat_posy; + float chat_sizey; + float current_player; float GetPlayerColorForce(int i); @@@ -123,13 -133,6 +133,13 @@@ string GetPlayerName(int i) float stringwidth_nocolors(string s, vector theSize); void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, bool vertical, float baralign, vector theColor, float theAlpha, int drawflag); +.int panel_showflags; +const int PANEL_SHOW_NEVER = 0x00; +const int PANEL_SHOW_MAINGAME = 0x01; +const int PANEL_SHOW_MINIGAME = 0x02; +const int PANEL_SHOW_ALWAYS = 0xff; +bool HUD_Panel_CheckFlags(int showflags); + // prev_* vars contain the health/armor at the previous FRAME // set to -1 when player is dead or was not playing @@@ -143,32 -146,31 +153,34 @@@ float old_p_healthtime, old_p_armortime // set to -1 to forcedly stop effects when we switch spectated player (e.g. from playerX: 70h to playerY: 50h) int prev_p_health, prev_p_armor; - - #define HUD_PANELS(HUD_PANEL) \ - HUD_PANEL(WEAPONS , HUD_Weapons , weapons, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(AMMO , HUD_Ammo , ammo, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(POWERUPS , HUD_Powerups , powerups, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(HEALTHARMOR , HUD_HealthArmor , healtharmor, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(NOTIFY , HUD_Notify , notify, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(TIMER , HUD_Timer , timer, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(RADAR , HUD_Radar , radar, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(SCORE , HUD_Score , score, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(RACETIMER , HUD_RaceTimer , racetimer, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(VOTE , HUD_Vote , vote, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(MODICONS , HUD_ModIcons , modicons, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(PRESSEDKEYS , HUD_PressedKeys , pressedkeys, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(CHAT , HUD_Chat , chat, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(ENGINEINFO , HUD_EngineInfo , engineinfo, PANEL_SHOW_ALWAYS ) \ - HUD_PANEL(INFOMESSAGES , HUD_InfoMessages , infomessages, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(PHYSICS , HUD_Physics , physics, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(CENTERPRINT , HUD_CenterPrint , centerprint, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(BUFFS , HUD_Buffs , buffs, PANEL_SHOW_MAINGAME ) \ - HUD_PANEL(MINIGAME_BOARD, HUD_MinigameBoard ,minigameboard, PANEL_SHOW_MINIGAME ) \ - HUD_PANEL(MINIGAME_STATUS,HUD_MinigameStatus,minigamestatus,PANEL_SHOW_MINIGAME ) \ - HUD_PANEL(MINIGAME_HELP, HUD_MinigameHelp ,minigamehelp, PANEL_SHOW_MINIGAME ) \ - HUD_PANEL(MINIGAME_MENU, HUD_MinigameMenu ,minigamemenu, PANEL_SHOW_ALWAYS ) + void HUD_ItemsTime(); + + #define HUD_PANELS(HUD_PANEL) \ - HUD_PANEL(WEAPONS , HUD_Weapons , weapons) \ - HUD_PANEL(AMMO , HUD_Ammo , ammo) \ - HUD_PANEL(POWERUPS , HUD_Powerups , powerups) \ - HUD_PANEL(HEALTHARMOR , HUD_HealthArmor , healtharmor) \ - HUD_PANEL(NOTIFY , HUD_Notify , notify) \ - HUD_PANEL(TIMER , HUD_Timer , timer) \ - HUD_PANEL(RADAR , HUD_Radar , radar) \ - HUD_PANEL(SCORE , HUD_Score , score) \ - HUD_PANEL(RACETIMER , HUD_RaceTimer , racetimer) \ - HUD_PANEL(VOTE , HUD_Vote , vote) \ - HUD_PANEL(MODICONS , HUD_ModIcons , modicons) \ - HUD_PANEL(PRESSEDKEYS , HUD_PressedKeys , pressedkeys) \ - HUD_PANEL(CHAT , HUD_Chat , chat) \ - HUD_PANEL(ENGINEINFO , HUD_EngineInfo , engineinfo) \ - HUD_PANEL(INFOMESSAGES , HUD_InfoMessages , infomessages) \ - HUD_PANEL(PHYSICS , HUD_Physics , physics) \ - HUD_PANEL(CENTERPRINT , HUD_CenterPrint , centerprint) \ - HUD_PANEL(MAPVOTE , MapVote_Draw , mapvote) \ - HUD_PANEL(ITEMSTIME , HUD_ItemsTime , itemstime) \ - // always add new panels to the end of list - -#define HUD_PANEL(NAME, draw_func, name) \ ++ HUD_PANEL(WEAPONS , HUD_Weapons , weapons, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(AMMO , HUD_Ammo , ammo, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(POWERUPS , HUD_Powerups , powerups, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(HEALTHARMOR , HUD_HealthArmor , healtharmor, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(NOTIFY , HUD_Notify , notify, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(TIMER , HUD_Timer , timer, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(RADAR , HUD_Radar , radar, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(SCORE , HUD_Score , score, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(RACETIMER , HUD_RaceTimer , racetimer, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(VOTE , HUD_Vote , vote, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(MODICONS , HUD_ModIcons , modicons, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(PRESSEDKEYS , HUD_PressedKeys , pressedkeys, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(CHAT , HUD_Chat , chat, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(ENGINEINFO , HUD_EngineInfo , engineinfo, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(INFOMESSAGES , HUD_InfoMessages , infomessages, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(PHYSICS , HUD_Physics , physics, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(CENTERPRINT , HUD_CenterPrint , centerprint, PANEL_SHOW_MAINGAME ) \ ++ HUD_PANEL(MINIGAME_BOARD, HUD_MinigameBoard ,minigameboard, PANEL_SHOW_MINIGAME ) \ ++ HUD_PANEL(MINIGAME_STATUS,HUD_MinigameStatus,minigamestatus,PANEL_SHOW_MINIGAME ) \ ++ HUD_PANEL(MINIGAME_HELP, HUD_MinigameHelp ,minigamehelp, PANEL_SHOW_MINIGAME ) \ ++ HUD_PANEL(MINIGAME_MENU, HUD_MinigameMenu ,minigamemenu, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(MAPVOTE , MapVote_Draw ,mapvote, PANEL_SHOW_ALWAYS ) \ ++ HUD_PANEL(ITEMSTIME , HUD_ItemsTime ,itemstime, PANEL_SHOW_MAINGAME ) + +#define HUD_PANEL(NAME, draw_func, name, showflags) \ int HUD_PANEL_##NAME; \ void draw_func(void); \ void RegisterHUD_Panel_##NAME() { \ @@@ -178,8 -180,7 +190,8 @@@ hud_panelent.classname = "hud_panel"; \ hud_panelent.panel_name = #name; \ hud_panelent.panel_id = HUD_PANEL_##NAME; \ - hud_panelent.panel_draw = draw_func; \ + hud_panelent.panel_draw = draw_func; \ + hud_panelent.panel_showflags = showflags; \ HUD_PANEL_NUM++; \ } \ ACCUMULATE_FUNCTION(RegisterHUD_Panels, RegisterHUD_Panel_##NAME); @@@ -239,9 -240,9 +251,9 @@@ HUD_PANELS(HUD_PANEL panel_bg_color = autocvar_hud_panel_bg_color; \ } else { \ if (panel_bg_color_str == "shirt") { \ - panel_bg_color = colormapPaletteColor(floor(stof(getplayerkeyvalue(current_player - 1, "colors")) / 16), 0);\ + panel_bg_color = colormapPaletteColor(floor(stof(getplayerkeyvalue(current_player, "colors")) / 16), 0); \ } else if (panel_bg_color_str == "pants") { \ - panel_bg_color = colormapPaletteColor(stof(getplayerkeyvalue(current_player - 1, "colors")) % 16, 1);\ + panel_bg_color = colormapPaletteColor(stof(getplayerkeyvalue(current_player, "colors")) % 16, 1); \ } else { \ panel_bg_color = stov(panel_bg_color_str); \ } \ diff --combined qcsrc/client/main.qc index b13842bebb,e39b3346a3..fac6204617 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@@ -2,9 -2,11 +2,11 @@@ #include "_all.qh" #include "casings.qh" + #include "controlpoint.qh" #include "csqcmodel_hooks.qh" #include "damage.qh" #include "effects.qh" + #include "generator.qh" #include "gibs.qh" #include "hook.qh" #include "hud.qh" @@@ -17,20 -19,20 +19,20 @@@ #include "scoreboard.qh" #include "shownames.qh" #include "sortlist.qh" - #include "target_music.qh" - #include "tturrets.qh" #include "tuba.qh" #include "t_items.qh" #include "wall.qh" #include "waypointsprites.qh" - #include "vehicles/bumblebee.qh" - #include "vehicles/all.qh" + #include "../common/vehicles/all.qh" + + #include "mutators/events.qh" #include "weapons/projectile.qh" #include "../common/buffs.qh" #include "../common/deathtypes.qh" + #include "../common/effects.qh" #include "../common/mapinfo.qh" #include "../common/monsters/all.qh" #include "../common/nades.qh" @@@ -41,11 -43,18 +43,18 @@@ #include "../common/items/all.qh" + #include "../common/mutators/base.qh" + #include "../common/weapons/all.qh" #include "../csqcmodellib/cl_model.qh" #include "../csqcmodellib/interpolate.qh" + #include "../common/triggers/include.qh" + + #include "../common/turrets/cl_turrets.qh" + #include "../common/turrets/turrets.qh" + #include "../warpzonelib/client.qh" // -------------------------------------------------------------------------- @@@ -118,6 -127,9 +127,9 @@@ void CSQC_Init(void registercvar("cl_nade_type", "3"); registercvar("cl_pokenade_type", "zombie"); + registercvar("cl_jumpspeedcap_min", ""); + registercvar("cl_jumpspeedcap_max", ""); + gametype = 0; // hud_fields uses strunzone on the titles! @@@ -136,17 -148,13 +148,15 @@@ GetTeam(NUM_SPECTATOR, true); // add specs first // needs to be done so early because of the constants they create - CALL_ACCUMULATED_FUNCTION(RegisterWeapons); - CALL_ACCUMULATED_FUNCTION(RegisterMonsters); - CALL_ACCUMULATED_FUNCTION(RegisterItems); - CALL_ACCUMULATED_FUNCTION(RegisterGametypes); + static_init(); + CALL_ACCUMULATED_FUNCTION(RegisterTurrets); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); CALL_ACCUMULATED_FUNCTION(RegisterHUD_Panels); - CALL_ACCUMULATED_FUNCTION(RegisterBuffs); + CALL_ACCUMULATED_FUNCTION(RegisterEffects); + initialize_minigames(); + WaypointSprite_Load(); // precaches @@@ -154,12 -162,11 +164,11 @@@ precache_sound("misc/hit.wav"); precache_sound("misc/typehit.wav"); + generator_precache(); Projectile_Precache(); Hook_Precache(); GibSplash_Precache(); Casings_Precache(); - Vehicles_Precache(); - turrets_precache(); Tuba_Precache(); CSQCPlayer_Precache(); @@@ -222,9 -229,6 +231,9 @@@ void Shutdown(void if (!(calledhooks & HOOK_END)) localcmd("\ncl_hook_gameend\n"); } + + deactivate_minigame(); + HUD_MinigameMenu_Close(); } .float has_team; @@@ -368,12 -372,12 +377,15 @@@ float CSQC_InputEvent(float bInputType if (HUD_Panel_InputEvent(bInputType, nPrimary, nSecondary)) return true; + if ( HUD_Radar_InputEvent(bInputType, nPrimary, nSecondary) ) + return true; + if (MapVote_InputEvent(bInputType, nPrimary, nSecondary)) return true; + if (HUD_Minigame_InputEvent(bInputType, nPrimary, nSecondary)) + return true; + if(menu_visible && menu_action) if(menu_action(bInputType, nPrimary, nSecondary)) return true; @@@ -386,6 -390,7 +398,7 @@@ // -------------------------------------------------------------------------- // BEGIN OPTIONAL CSQC FUNCTIONS + void Ent_RemoveEntCS() { entcs_receiver[self.sv_entnum] = world; @@@ -703,7 -708,7 +716,7 @@@ void Ent_ReadSpawnPoint(float is_new) / if(is_new) { self.origin = spn_origin; - setsize(self, PL_MIN, PL_MAX); + setsize(self, PL_MIN_CONST, PL_MAX_CONST); droptofloor(); /*if(autocvar_cl_spawn_point_model) // needs a model first @@@ -785,7 -790,7 +798,7 @@@ void Ent_ReadSpawnEvent(float is_new button_zoom = false; } } - + HUD_Radar_Hide_Maximized(); //printf("Ent_ReadSpawnEvent(is_new = %d); origin = %s, entnum = %d, localentnum = %d\n", is_new, vtos(self.origin), entnum, player_localentnum); } @@@ -840,6 -845,12 +853,12 @@@ void CSQC_Ent_Update(float bIsNewEntity self.enttype = t; switch(t) { + case ENT_CLIENT_MUTATOR: { + int mutID = ReadMutator(); + if (!MUTATOR_CALLHOOK(CSQC_Ent_Update, mutID, bIsNewEntity)) + error(sprintf("Unknown mutator type in CSQC_Ent_Update (mutID: %d, edict: %d, classname: %s)\n", mutID, num_for_edict(self), self.classname)); + break; + } case ENT_CLIENT_ENTCS: Ent_ReadEntCS(); break; case ENT_CLIENT_SCORES: Ent_ReadPlayerScore(); break; case ENT_CLIENT_TEAMSCORES: Ent_ReadTeamScore(); break; @@@ -848,7 -859,6 +867,6 @@@ case ENT_CLIENT_LASER: Ent_Laser(); break; case ENT_CLIENT_NAGGER: Ent_Nagger(); break; case ENT_CLIENT_ELIMINATEDPLAYERS: Ent_EliminatedPlayers(); break; - case ENT_CLIENT_WAYPOINT: Ent_WaypointSprite(); break; case ENT_CLIENT_RADARLINK: Ent_RadarLink(); break; case ENT_CLIENT_PROJECTILE: Ent_Projectile(); break; case ENT_CLIENT_GIBSPLASH: Ent_GibSplash(bIsNewEntity); break; @@@ -872,6 -882,8 +890,8 @@@ case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break; case ENT_CLIENT_TURRET: ent_turret(); break; + case ENT_CLIENT_GENERATOR: ent_generator(); break; + case ENT_CLIENT_CONTROLPOINT_ICON: ent_cpicon(); break; case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break; case ENT_CLIENT_ITEM: ItemRead(bIsNewEntity); break; case ENT_CLIENT_BUMBLE_RAYGUN: bumble_raygun_read(bIsNewEntity); break; @@@ -879,7 -891,20 +899,21 @@@ case ENT_CLIENT_SPAWNEVENT: Ent_ReadSpawnEvent(bIsNewEntity); break; case ENT_CLIENT_NOTIFICATION: Read_Notification(bIsNewEntity); break; case ENT_CLIENT_HEALING_ORB: ent_healer(); break; + case ENT_CLIENT_MINIGAME: ent_read_minigame(); break; + case ENT_CLIENT_VIEWLOC: ent_viewloc(); break; + case ENT_CLIENT_VIEWLOC_TRIGGER: ent_viewloc_trigger(); break; + case ENT_CLIENT_LADDER: ent_func_ladder(); break; + case ENT_CLIENT_TRIGGER_PUSH: ent_trigger_push(); break; + case ENT_CLIENT_TARGET_PUSH: ent_target_push(); break; + case ENT_CLIENT_CONVEYOR: ent_conveyor(); break; + case ENT_CLIENT_DOOR: ent_door(); break; + case ENT_CLIENT_PLAT: ent_plat(); break; + case ENT_CLIENT_SWAMP: ent_swamp(); break; + case ENT_CLIENT_CORNER: ent_corner(); break; + case ENT_CLIENT_KEYLOCK: ent_keylock(); break; + case ENT_CLIENT_TRAIN: ent_train(); break; + case ENT_CLIENT_TRIGGER_IMPULSE: ent_trigger_impulse(); break; + case ENT_CLIENT_EFFECT: Read_Effect(bIsNewEntity); break; default: //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype)); @@@ -1246,69 -1271,55 +1280,55 @@@ void Net_WeaponComplain( // Return value should be 1 if CSQC handled the temporary entity, otherwise return 0 to have the engine process the event. float CSQC_Parse_TempEntity() { - float bHandled; - bHandled = true; // Acquire TE ID - float nTEID; - nTEID = ReadByte(); + int nTEID = ReadByte(); - if(autocvar_developer_csqcentities) + if (autocvar_developer_csqcentities) printf("CSQC_Parse_TempEntity() with nTEID=%d\n", nTEID); - // NOTE: Could just do return instead of break... - switch(nTEID) + switch (nTEID) { + case TE_CSQC_MUTATOR: + int mutID = ReadMutator(); + if (MUTATOR_CALLHOOK(CSQC_Parse_TempEntity, mutID)) + return true; case TE_CSQC_TARGET_MUSIC: Net_TargetMusic(); - bHandled = true; - break; + return true; case TE_CSQC_PICTURE: Net_MapVote_Picture(); - bHandled = true; - break; + return true; case TE_CSQC_RACE: Net_ReadRace(); - bHandled = true; - break; + return true; case TE_CSQC_VORTEXBEAMPARTICLE: Net_ReadVortexBeamParticle(); - bHandled = true; - break; + return true; case TE_CSQC_TEAMNAGGER: Net_TeamNagger(); - bHandled = true; - break; + return true; case TE_CSQC_ARC: Net_ReadArc(); - bHandled = true; - break; + return true; case TE_CSQC_PINGPLREPORT: Net_ReadPingPLReport(); - bHandled = true; - break; + return true; case TE_CSQC_WEAPONCOMPLAIN: Net_WeaponComplain(); - bHandled = true; - break; + return true; case TE_CSQC_VEHICLESETUP: Net_VehicleSetup(); - bHandled = true; - break; + return true; case TE_CSQC_SVNOTICE: cl_notice_read(); - bHandled = true; - break; + return true; case TE_CSQC_SHOCKWAVEPARTICLE: Net_ReadShockwaveParticle(); - bHandled = true; - break; + return true; default: // No special logic for this temporary entity; return 0 so the engine can handle it - bHandled = false; - break; + return false; } - - return bHandled; } string getcommandkey(string text, string command) diff --combined qcsrc/client/progs.src index 87d5e4f03a,9b687532ff..0c030de333 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@@ -2,24 -2,25 +2,25 @@@ ../common/util-pre.qh ../dpdefs/csprogsdefs.qh + ../common/util-post.qh announcer.qc bgmscript.qc casings.qc + controlpoint.qc csqcmodel_hooks.qc damage.qc effects.qc + generator.qc gibs.qc hook.qc hud.qc hud_config.qc - laser.qc main.qc mapvoting.qc miscfunctions.qc modeleffects.qc movelib.qc - movetypes.qc noise.qc particles.qc player_skeleton.qc @@@ -28,9 -29,7 +29,7 @@@ rubble.q scoreboard.qc shownames.qc sortlist.qc - target_music.qc teamradar.qc - tturrets.qc tuba.qc t_items.qc view.qc @@@ -39,36 -38,46 +38,49 @@@ waypointsprites.q command/all.qc - vehicles/bumblebee.qc - vehicles/all.qc - weapons/projectile.qc // TODO ../common/animdecide.qc ../common/buffs.qc + ../common/effects.qc ../common/mapinfo.qc + ../common/movetypes/include.qc ../common/nades.qc ../common/net_notice.qc ../common/notifications.qc + ../common/physics.qc ../common/playerstats.qc + ../common/p2mathlib.qc ../common/test.qc ../common/urllib.qc ../common/util.qc - ../common/items/all.qc + ../common/viewloc.qc +../common/minigames/minigames.qc +../common/minigames/cl_minigames.qc + + ../common/items/all.qc ../common/monsters/all.qc + ../common/mutators/all.qc + ../common/vehicles/all.qc + ../common/weapons/all.qc - ../common/weapons/all.qc // TODO + ../common/turrets/cl_turrets.qc + ../common/turrets/turrets.qc + + ../common/triggers/include.qc ../csqcmodellib/cl_model.qc ../csqcmodellib/cl_player.qc ../csqcmodellib/interpolate.qc + ../server/mutators/mutator_multijump.qc + ../warpzonelib/anglestransform.qc ../warpzonelib/client.qc ../warpzonelib/common.qc ../warpzonelib/mathlib.qc + ../warpzonelib/util_server.qc + + ../../mod/client/progs.inc diff --combined qcsrc/client/scoreboard.qc index 026834f48f,126cc904d0..a24b943790 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@@ -7,7 -7,6 +7,7 @@@ #include "../common/constants.qh" #include "../common/counting.qh" #include "../common/mapinfo.qh" +#include "../common/minigames/cl_minigames.qh" #include "../common/stats.qh" #include "../common/teams.qh" #include "../common/util.qh" @@@ -303,7 -302,7 +303,7 @@@ void Cmd_HUD_Help( #define HUD_DefaultColumnLayout() \ "ping pl name | " \ "-teams,race,lms/kills +ft,tdm/kills -teams,lms/deaths +ft,tdm/deaths -teams,lms,race,ka/suicides +ft,tdm/suicides -race,dm,tdm,ka,ft/frags " /* tdm already has this in "score" */ \ - "+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns " \ + "+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns +ons/caps +ons/takes " \ "+lms/lives +lms/rank " \ "+kh/caps +kh/pushes +kh/destroyed " \ "?+race/laps ?+race/time ?+race/fastest " \ @@@ -361,7 -360,6 +361,6 @@@ void Cmd_HUD_SetFields(float argc hud_fontsize = HUD_GetFontsize("hud_fontsize"); - draw_beginBoldFont(); for(i = 1; i < argc - 1; ++i) { float nocomplain; @@@ -500,7 -498,6 +499,6 @@@ } hud_field[hud_num_fields] = SP_END; - draw_endBoldFont(); } // MOVEUP:: @@@ -880,7 -877,6 +878,6 @@@ vector HUD_Scoreboard_MakeTable(vector } // print the strings of the columns headers and draw the columns - draw_beginBoldFont(); int i; for(i = 0; i < hud_num_fields; ++i) { @@@ -924,7 -920,6 +921,6 @@@ pos.x -= hud_fontsize.x; } } - draw_endBoldFont(); pos.x = xmin; pos.y += 1.25 * hud_fontsize.y; // skip the header @@@ -965,13 -960,15 +961,15 @@@ float HUD_WouldDrawScoreboard() { if (autocvar__hud_configure) return 0; + else if (HUD_Radar_Clickable()) + return 0; else if (scoreboard_showscores) return 1; else if (intermission == 1) return 1; else if (intermission == 2) return 0; - else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS) + else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS && !active_minigame) return 1; else if (scoreboard_showscores_force) return 1; @@@ -981,18 -978,40 +979,40 @@@ float average_accuracy; vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) { + WepSet weapons_stat = WepSet_GetFromStat(); + WepSet weapons_inmap = WepSet_GetFromStat_InMap(); + float initial_posx = pos.x; int i; - int weapon_cnt = WEP_COUNT - 3; // either vaporizer/vortex are hidden, no port-o-launch, no tuba - float rows; - if(autocvar_scoreboard_accuracy_doublerows) + float weapon_stats; + int disownedcnt = 0; + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + { + self = get_weaponinfo(i); + if(!self.weapon) + continue; + + weapon_stats = weapon_accuracy[i-WEP_FIRST]; + + if(weapon_stats < 0 && !(weapons_stat & WepSet_FromWeapon(i) || weapons_inmap & WepSet_FromWeapon(i))) + ++disownedcnt; + } + + int weapon_cnt = WEP_COUNT - disownedcnt; + + if(weapon_cnt <= 0) + return pos; + + int rows; + if(autocvar_scoreboard_accuracy_doublerows && weapon_cnt >= floor(WEP_COUNT * 0.5)) rows = 2; else rows = 1; + int columnns = ceil(weapon_cnt / rows); + float height = 40; float fontsize = height * 1/3; float weapon_height = height * 2/3; - float weapon_width = sbwidth / weapon_cnt; - float g_instagib = 0; + float weapon_width = sbwidth / columnns / rows; drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos.y += 1.25 * hud_fontsize.y + autocvar_scoreboard_border_thickness; @@@ -1007,7 -1026,7 +1027,7 @@@ drawborderlines(autocvar_scoreboard_border_thickness, pos, tmp, '0 0 0', scoreboard_alpha_bg * 0.75, DRAWFLAG_NORMAL); // column highlighting - for(i = 0; i < weapon_cnt/rows; ++i) + for(i = 0; i < columnns; ++i) { if(!(i % 2)) drawfill(pos + '1 0 0' * weapon_width * rows * i, '0 1 0' * height * rows + '1 0 0' * weapon_width * rows, '0 0 0', scoreboard_alpha_bg * 0.2, DRAWFLAG_NORMAL); @@@ -1020,29 -1039,29 +1040,29 @@@ } average_accuracy = 0; - float weapons_with_stats; - weapons_with_stats = 0; + int weapons_with_stats = 0; if(rows == 2) pos.x += weapon_width / 2; - if(switchweapon == WEP_VAPORIZER) - g_instagib = 1; // TODO: real detection for instagib? - - float weapon_stats; if(autocvar_scoreboard_accuracy_nocolors) rgb = '1 1 1'; else Accuracy_LoadColors(); - for(i = WEP_FIRST; i <= WEP_LAST; ++i) + float oldposx = pos.x; + vector tmpos = pos; + + int column; + for(i = WEP_FIRST, column = 0; i <= WEP_LAST; ++i) { self = get_weaponinfo(i); if (!self.weapon) continue; - if ((i == WEP_VORTEX && g_instagib) || i == WEP_PORTO || (i == WEP_VAPORIZER && !g_instagib) || i == WEP_TUBA) // skip port-o-launch, vortex || vaporizer and tuba - continue; weapon_stats = weapon_accuracy[i-WEP_FIRST]; + if(weapon_stats < 0 && !(weapons_stat & WepSet_FromWeapon(i) || weapons_inmap & WepSet_FromWeapon(i))) + continue; + float weapon_alpha; if(weapon_stats >= 0) weapon_alpha = scoreboard_alpha_fg; @@@ -1050,7 -1069,7 +1070,7 @@@ weapon_alpha = 0.2 * scoreboard_alpha_fg; // weapon icon - drawpic_aspect_skin(pos, self.model2, '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(tmpos, self.model2, '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); // the accuracy if(weapon_stats >= 0) { weapons_with_stats += 1; @@@ -1065,24 -1084,24 +1085,24 @@@ if(!autocvar_scoreboard_accuracy_nocolors) rgb = Accuracy_GetColor(weapon_stats); - drawstring(pos + '1 0 0' * padding + '0 1 0' * weapon_height, s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(tmpos + '1 0 0' * padding + '0 1 0' * weapon_height, s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); } + tmpos.x += weapon_width * rows; pos.x += weapon_width * rows; - if(rows == 2 && i == 6) { - pos.x -= sbwidth; + if(rows == 2 && column == columnns - 1) { + tmpos.x = oldposx; + tmpos.y += height; pos.y += height; } + ++column; } if(weapons_with_stats) average_accuracy = floor((average_accuracy * 100 / weapons_with_stats) + 0.5); - if(rows == 2) - pos.x -= weapon_width / 2; - pos.x -= sbwidth; pos.y += height; - - pos.y += 1.25 * hud_fontsize.y; + pos.y += 1.25 * hud_fontsize.y; + pos.x = initial_posx; return pos; } diff --combined qcsrc/client/view.qc index 8800de8d86,e846a662b1..533668297c --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@@ -8,14 -8,15 +8,15 @@@ #include "noise.qh" #include "scoreboard.qh" #include "shownames.qh" - #include "target_music.qh" - #include "vehicles/all.qh" #include "waypointsprites.qh" + #include "mutators/events.qh" + #include "../common/constants.qh" #include "../common/mapinfo.qh" #include "../common/nades.qh" #include "../common/stats.qh" + #include "../common/triggers/target/music.qh" #include "../common/teams.qh" #include "../common/util.qh" @@@ -34,7 -35,7 +35,7 @@@ void Porto_Draw( vector p, dir, ang, q, nextdir; float portal_number, portal1_idx; - if(activeweapon != WEP_PORTO || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL) + if(activeweapon != WEP_PORTO.m_id || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL) return; if(g_balance_porto_secondary) return; @@@ -124,7 -125,7 +125,7 @@@ vector GetCurrentFov(float fov zoomsensitivity = autocvar_cl_zoomsensitivity; zoomfactor = autocvar_cl_zoomfactor; - if(zoomfactor < 1 || zoomfactor > 16) + if(zoomfactor < 1 || zoomfactor > 30) zoomfactor = 2.5; zoomspeed = autocvar_cl_zoomspeed; if(zoomspeed >= 0) @@@ -133,7 -134,7 +134,7 @@@ zoomdir = button_zoom; if(hud == HUD_NORMAL) - if((activeweapon == WEP_VORTEX && vortex_scope) || (activeweapon == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here + if((activeweapon == WEP_VORTEX.m_id && vortex_scope) || (activeweapon == WEP_RIFLE.m_id && rifle_scope)) // do NOT use switchweapon here zoomdir += button_attack2; if(spectatee_status > 0 || isdemo()) { @@@ -155,7 -156,7 +156,7 @@@ } else if(autocvar_cl_spawnzoom && zoomin_effect) { - float spawnzoomfactor = bound(1, autocvar_cl_spawnzoom_factor, 16); + float spawnzoomfactor = bound(1, autocvar_cl_spawnzoom_factor, 30); current_viewzoom += (autocvar_cl_spawnzoom_speed * (spawnzoomfactor - current_viewzoom) * drawframetime); current_viewzoom = bound(1 / spawnzoomfactor, current_viewzoom, 1); @@@ -228,6 -229,15 +229,15 @@@ return '1 0 0' * fovx + '0 1 0' * fovy; } + vector GetViewLocationFOV(float fov) + { + float frustumy = tan(fov * M_PI / 360.0) * 0.75; + float frustumx = frustumy * vid_width / vid_height / vid_pixelheight; + float fovx = atan2(frustumx, 1) / M_PI * 360.0; + float fovy = atan2(frustumy, 1) / M_PI * 360.0; + return '1 0 0' * fovx + '0 1 0' * fovy; + } + vector GetOrthoviewFOV(vector ov_worldmin, vector ov_worldmax, vector ov_mid, vector ov_org) { float fovx, fovy; @@@ -311,16 -321,16 +321,16 @@@ float TrueAimCheck( switch(activeweapon) // WEAPONTODO { - case WEP_TUBA: // no aim - case WEP_PORTO: // shoots from eye - case WEP_HOOK: // no trueaim - case WEP_MORTAR: // toss curve + case WEP_TUBA.m_id: // no aim + case WEP_PORTO.m_id: // shoots from eye + case WEP_HOOK.m_id: // no trueaim + case WEP_MORTAR.m_id: // toss curve return SHOTTYPE_HITWORLD; - case WEP_VORTEX: - case WEP_VAPORIZER: + case WEP_VORTEX.m_id: + case WEP_VAPORIZER.m_id: mv = MOVE_NORMAL; break; - case WEP_RIFLE: + case WEP_RIFLE.m_id: ta = trueaim_rifle; mv = MOVE_NORMAL; if(zoomscript_caught) @@@ -329,19 -339,19 +339,19 @@@ return EnemyHitCheck(); } break; - case WEP_DEVASTATOR: // projectile has a size! + case WEP_DEVASTATOR.m_id: // projectile has a size! mi = '-3 -3 -3'; ma = '3 3 3'; break; - case WEP_FIREBALL: // projectile has a size! + case WEP_FIREBALL.m_id: // projectile has a size! mi = '-16 -16 -16'; ma = '16 16 16'; break; - case WEP_SEEKER: // projectile has a size! + case WEP_SEEKER.m_id: // projectile has a size! mi = '-2 -2 -2'; ma = '2 2 2'; break; - case WEP_ELECTRO: // projectile has a size! + case WEP_ELECTRO.m_id: // projectile has a size! mi = '0 0 -3'; ma = '0 0 -3'; break; @@@ -396,8 -406,6 +406,6 @@@ const float CAMERA_CHASE = 2 float reticle_type; string reticle_image; string NextFrameCommand; - void CSQC_SPIDER_HUD(); - void CSQC_RAPTOR_HUD(); vector freeze_org, freeze_ang; entity nightvision_noise, nightvision_noise2; @@@ -420,15 -428,19 +428,19 @@@ vector liquidcolor_prev float eventchase_current_distance; float eventchase_running; - float WantEventchase() + bool WantEventchase() { if(autocvar_cl_orthoview) return false; if(intermission) return true; + if(self.viewloc) + return true; if(spectatee_status >= 0) { - if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WepSet_FromWeapon(WEP_PORTO))) + if(hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)) + return true; + if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WepSet_FromWeapon(WEP_PORTO.m_id))) return true; if(autocvar_cl_eventchase_death && (getstati(STAT_HEALTH) <= 0)) { @@@ -479,7 -491,7 +491,7 @@@ void UpdateHitsound( static float hitsound_time_prev = 0; // HACK: the only way to get the arc to sound consistent with pitch shift is to ignore cl_hitsound_antispam_time - float arc_hack = activeweapon == WEP_ARC && autocvar_cl_hitsound >= 2; + float arc_hack = activeweapon == WEP_ARC.m_id && autocvar_cl_hitsound >= 2; if (arc_hack || COMPARE_INCREASING(time, hitsound_time_prev) > autocvar_cl_hitsound_antispam_time) { if (autocvar_cl_hitsound && unaccounted_damage) @@@ -532,7 -544,7 +544,7 @@@ void UpdateCrosshair( if(getstati(STAT_FROZEN)) drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, ((getstatf(STAT_REVIVE_PROGRESS)) ? ('0.25 0.90 1' + ('1 0 0' * getstatf(STAT_REVIVE_PROGRESS)) + ('0 1 1' * getstatf(STAT_REVIVE_PROGRESS) * -1)) : '0.25 0.90 1'), autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); else if (getstatf(STAT_HEALING_ORB)>time) - drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, Nade_Color(NADE_TYPE_HEAL), autocvar_hud_colorflash_alpha*getstatf(STAT_HEALING_ORB_ALPHA), DRAWFLAG_ADDITIVE); + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, NADE_TYPE_HEAL.m_color, autocvar_hud_colorflash_alpha*getstatf(STAT_HEALING_ORB_ALPHA), DRAWFLAG_ADDITIVE); if(!intermission) if(getstatf(STAT_NADE_TIMER) && autocvar_cl_nade_timer) // give nade top priority, as it's a matter of life and death { @@@ -550,9 -562,7 +562,9 @@@ CSQC_common_hud(); // crosshair goes VERY LAST - if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL && !csqcplayer.viewloc) + if(!scoreboard_active && !camera_active && intermission != 2 && - spectatee_status != -1 && hud == HUD_NORMAL && ++ spectatee_status != -1 && hud == HUD_NORMAL && !csqcplayer.viewloc && + !HUD_MinigameMenu_IsOpened() ) { if (!autocvar_crosshair_enabled) // main toggle for crosshair rendering return; @@@ -793,6 -803,8 +805,8 @@@ wcross_alpha_prev = wcross_alpha; wcross_color_prev = wcross_color; + MUTATOR_CALLHOOK(UpdateCrosshair); + wcross_scale *= 1 - autocvar__menu_alpha; wcross_alpha *= 1 - autocvar__menu_alpha; wcross_size = draw_getimagesize(wcross_name) * wcross_scale; @@@ -828,7 -840,7 +842,7 @@@ // handle the values - if (autocvar_crosshair_ring && activeweapon == WEP_VORTEX && vortex_charge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex + if (autocvar_crosshair_ring && activeweapon == WEP_VORTEX.m_id && vortex_charge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex { if (vortex_chargepool || use_vortex_chargepool) { use_vortex_chargepool = 1; @@@ -848,14 -860,14 +862,14 @@@ ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring_nexgun.tga"; } - else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) + else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER.m_id && minelayer_maxmines && autocvar_crosshair_ring_minelayer) { ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to. ring_alpha = autocvar_crosshair_ring_minelayer_alpha; ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring.tga"; } - else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar) + else if (activeweapon == WEP_HAGAR.m_id && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar) { ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1); ring_alpha = autocvar_crosshair_ring_hagar_alpha; @@@ -878,12 -890,12 +892,12 @@@ // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances. // if a new image for another weapon is added, add the code (and its respective file/value) here - if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80)) + if ((activeweapon == WEP_RIFLE.m_id) && (weapon_clipsize == 80)) ring_image = "gfx/crosshair_ring_rifle.tga"; else ring_image = "gfx/crosshair_ring.tga"; } - else if ( autocvar_crosshair_ring && autocvar_crosshair_ring_arc && arc_heat && activeweapon == WEP_ARC ) + else if ( autocvar_crosshair_ring && autocvar_crosshair_ring_arc && arc_heat && activeweapon == WEP_ARC.m_id ) { ring_value = arc_heat; ring_alpha = (1-arc_heat)*autocvar_crosshair_ring_arc_cold_alpha + @@@ -998,6 -1010,8 +1012,8 @@@ const int BUTTON_3 = 4 const int BUTTON_4 = 8; float cl_notice_run(); float prev_myteam; + int lasthud; + float vh_notice_time; void CSQC_UpdateView(float w, float h) { entity e; @@@ -1013,6 -1027,11 +1029,11 @@@ hud = getstati(STAT_HUD); + if(hud != HUD_NORMAL && lasthud == HUD_NORMAL) + vh_notice_time = time + autocvar_cl_vehicles_notify_time; + + lasthud = hud; + if(autocvar__hud_showbinds_reload) // menu can set this one { db_close(binddb); @@@ -1056,7 -1075,11 +1077,11 @@@ CSQCPlayer_SetCamera(); - myteam = GetPlayerColor(player_localentnum - 1); + if(player_localentnum <= maxclients) // is it a client? + current_player = player_localentnum - 1; + else // then player_localentnum is the vehicle I'm driving + current_player = player_localnum; + myteam = GetPlayerColor(current_player); if(myteam != prev_myteam) { @@@ -1089,18 -1112,41 +1114,41 @@@ // event chase camera if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped { - if(WantEventchase()) + float vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); + float ons_roundlost = (gametype == MAPINFO_TYPE_ONSLAUGHT && getstati(STAT_ROUNDLOST)); + entity gen = world; + + if(ons_roundlost) + { + entity e; + for(e = world; (e = find(e, classname, "onslaught_generator")); ) + { + if(e.health <= 0) + { + gen = e; + break; + } + } + if(!gen) + ons_roundlost = FALSE; // don't enforce the 3rd person camera if there is no dead generator to show + } + if(WantEventchase() || (!autocvar_cl_orthoview && ons_roundlost)) { eventchase_running = true; // make special vector since we can't use view_origin (It is one frame old as of this code, it gets set later with the results this code makes.) vector current_view_origin = (csqcplayer ? csqcplayer.origin : pmove_org); + if(ons_roundlost) { current_view_origin = gen.origin; } // detect maximum viewoffset and use it - if(autocvar_cl_eventchase_viewoffset) + vector view_offset = autocvar_cl_eventchase_viewoffset; + if(vehicle_chase && autocvar_cl_eventchase_vehicle_viewoffset) { view_offset = autocvar_cl_eventchase_vehicle_viewoffset; } + if(ons_roundlost) { view_offset = autocvar_cl_eventchase_generator_viewoffset; } + + if(view_offset) { - WarpZone_TraceLine(current_view_origin, current_view_origin + autocvar_cl_eventchase_viewoffset + ('0 0 1' * autocvar_cl_eventchase_maxs.z), MOVE_WORLDONLY, self); - if(trace_fraction == 1) { current_view_origin += autocvar_cl_eventchase_viewoffset; } + WarpZone_TraceLine(current_view_origin, current_view_origin + view_offset + ('0 0 1' * autocvar_cl_eventchase_maxs.z), MOVE_WORLDONLY, self); + if(trace_fraction == 1) { current_view_origin += view_offset; } else { current_view_origin.z += max(0, (trace_endpos.z - current_view_origin.z) - autocvar_cl_eventchase_maxs.z); } } @@@ -1110,10 -1156,14 +1158,14 @@@ if(!autocvar_chase_active) { cvar_set("chase_active", "-1"); } // make the camera smooth back - if(autocvar_cl_eventchase_speed && eventchase_current_distance < autocvar_cl_eventchase_distance) - eventchase_current_distance += autocvar_cl_eventchase_speed * (autocvar_cl_eventchase_distance - eventchase_current_distance) * frametime; // slow down the further we get - else if(eventchase_current_distance != autocvar_cl_eventchase_distance) - eventchase_current_distance = autocvar_cl_eventchase_distance; + float chase_distance = autocvar_cl_eventchase_distance; + if(vehicle_chase && autocvar_cl_eventchase_vehicle_distance) { chase_distance = autocvar_cl_eventchase_vehicle_distance; } + if(ons_roundlost) { chase_distance = autocvar_cl_eventchase_generator_distance; } + + if(autocvar_cl_eventchase_speed && eventchase_current_distance < chase_distance) + eventchase_current_distance += autocvar_cl_eventchase_speed * (chase_distance - eventchase_current_distance) * frametime; // slow down the further we get + else if(eventchase_current_distance != chase_distance) + eventchase_current_distance = chase_distance; makevectors(view_angles); @@@ -1121,6 -1171,7 +1173,7 @@@ WarpZone_TraceBox(current_view_origin, autocvar_cl_eventchase_mins, autocvar_cl_eventchase_maxs, eventchase_target_origin, MOVE_WORLDONLY, self); // If the boxtrace fails, revert back to line tracing. + if(!self.viewloc) if(trace_startsolid) { eventchase_target_origin = (current_view_origin - (v_forward * eventchase_current_distance)); @@@ -1129,7 -1180,8 +1182,8 @@@ } else { setproperty(VF_ORIGIN, trace_endpos); } - setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles)); + if(!self.viewloc) + setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles)); } else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code { @@@ -1351,6 -1403,7 +1405,7 @@@ vid_pixelheight = autocvar_vid_pixelheight; if(autocvar_cl_orthoview) { setproperty(VF_FOV, GetOrthoviewFOV(ov_worldmin, ov_worldmax, ov_mid, ov_org)); } + else if(csqcplayer.viewloc) { setproperty(VF_FOV, GetViewLocationFOV(110)); } // enforce 110 fov, so things dont look odd else { setproperty(VF_FOV, GetCurrentFov(fov)); } // Camera for demo playback @@@ -1782,22 -1835,14 +1837,16 @@@ if(autocvar__hud_configure) HUD_Panel_Mouse(); - if ( HUD_MinigameMenu_IsOpened() || minigame_isactive() ) ++ else if ( HUD_MinigameMenu_IsOpened() || minigame_isactive() ) + HUD_Minigame_Mouse(); + else + HUD_Radar_Mouse(); if(hud && !intermission) - { - if(hud == HUD_SPIDERBOT) - CSQC_SPIDER_HUD(); - else if(hud == HUD_WAKIZASHI) - CSQC_WAKIZASHI_HUD(); - else if(hud == HUD_RAPTOR) - CSQC_RAPTOR_HUD(); - else if(hud == HUD_BUMBLEBEE) - CSQC_BUMBLE_HUD(); - else if(hud == HUD_BUMBLEBEE_GUN) - CSQC_BUMBLE_GUN_HUD(); - } + if(hud == HUD_BUMBLEBEE_GUN) + CSQC_BUMBLE_GUN_HUD(); + else + VEH_ACTION(hud, VR_HUD); cl_notice_run(); @@@ -1815,13 -1860,9 +1864,9 @@@ void CSQC_common_hud(void HUD_Main(); // always run these functions for alpha checks HUD_DrawScoreboard(); - if (scoreboard_active) // scoreboard/accuracy + // scoreboard/accuracy, map/gametype voting screen + if (scoreboard_active || intermission == 2) HUD_Reset(); - else if (intermission == 2) // map voting screen - { - MapVote_Draw(); - HUD_Reset(); - } } diff --combined qcsrc/common/constants.qh index ee14d989a8,7de2a88832..bc18b4dc7a --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@@ -1,11 -1,44 +1,44 @@@ #ifndef CONSTANTS_H #define CONSTANTS_H + // COMMIT-TODO: Update if necessary before committing + // Revision 1: additional statistics sent (flag caps, returns, deaths) + // Revision 2: Mapvote preview pictures + // Revision 3: optimized map vote protocol + // Revision 4: CSQC config var system + // Revision 5: mapvote time fix + // Revision 6: more robust against packet loss/delays, also show not yet connected clients + // Revision 7: packet loss column + // Revision 8: race + // Revision 9: race delta + // Revision 10: scoreboard force + // Revision 11: scoreboard unforce; spectator support beginning + // Revision 12: smaller scores updates (SERVER: requires new engine) + // Revision 13: pointparticles + // Revision 14: laser + // Revision 15: zoom + // Revision 16: multi-weapons + // Revision 17: multi-weaponimpulses + // Revision 18: warmup + // Revision 19: fog + // Revision 20: naggers + // Revision 21: entcs for players optimized (position data down from 12 to 7 bytes); waypointsprites in csqc for team radar + // Revision 22: hook shot origin + #define CSQC_REVISION 22 + const int AS_STRING = 1; const int AS_INT = 2; const int AS_FLOAT_TRUNCATED = 2; const int AS_FLOAT = 8; + const int TE_CSQC_MUTATOR = 99; + #define MUTATOR_HASH(s) crc16(true, s) + #define WriteMutator(to, s) do { \ + WriteByte(to, TE_CSQC_MUTATOR); \ + WriteLong(to, MUTATOR_HASH(#s)); \ + } while (0) + #define ReadMutator() ReadLong() + #define ReadMutatorEquals(read, s) (read == MUTATOR_HASH(#s)) const int TE_CSQC_PICTURE = 100; const int TE_CSQC_RACE = 101; const int TE_CSQC_VORTEXBEAMPARTICLE = 103; @@@ -46,7 -79,6 +79,6 @@@ const int ENT_CLIENT_POINTPARTICLES = 6 const int ENT_CLIENT_RAINSNOW = 7; const int ENT_CLIENT_LASER = 8; const int ENT_CLIENT_NAGGER = 9; // flags [votecalledvote] - const int ENT_CLIENT_WAYPOINT = 10; // flags origin [team displayrule] [spritename] [spritename2] [spritename3] [lifetime maxdistance hideable] const int ENT_CLIENT_RADARLINK = 11; // flags [startorigin] [endorigin] [startcolor+16*endcolor] const int ENT_CLIENT_PROJECTILE = 12; const int ENT_CLIENT_GIBSPLASH = 13; @@@ -79,12 -111,30 +111,30 @@@ const int ENT_CLIENT_ELIMINATEDPLAYERS const int ENT_CLIENT_TURRET = 40; const int ENT_CLIENT_AUXILIARYXHAIR = 50; const int ENT_CLIENT_VEHICLE = 60; + const int ENT_CLIENT_LADDER = 61; + const int ENT_CLIENT_TRIGGER_PUSH = 62; + const int ENT_CLIENT_TARGET_PUSH = 63; + const int ENT_CLIENT_CONVEYOR = 64; + const int ENT_CLIENT_DOOR = 65; + const int ENT_CLIENT_TRAIN = 66; + const int ENT_CLIENT_PLAT = 67; + const int ENT_CLIENT_TRIGGER_IMPULSE = 68; + const int ENT_CLIENT_SWAMP = 69; + const int ENT_CLIENT_CORNER = 70; + const int ENT_CLIENT_KEYLOCK = 71; + const int ENT_CLIENT_GENERATOR = 72; + const int ENT_CLIENT_CONTROLPOINT_ICON = 73; + const int ENT_CLIENT_EFFECT = 74; +const int ENT_CLIENT_MINIGAME = 75; - + const int ENT_CLIENT_VIEWLOC = 78; + const int ENT_CLIENT_VIEWLOC_TRIGGER = 79; - const int ENT_CLIENT_HEALING_ORB = 80; + const int ENT_CLIENT_MUTATOR = TE_CSQC_MUTATOR; // 99 + 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; @@@ -126,13 -176,7 +176,7 @@@ const int CTF_STATE_DEFEND = 2 const int CTF_STATE_COMMANDER = 3; const int HUD_NORMAL = 0; - const int HUD_VEHICLE_FIRST = 10; - const int HUD_SPIDERBOT = 10; - const int HUD_WAKIZASHI = 11; - const int HUD_RAPTOR = 12; - const int HUD_BUMBLEBEE = 13; - const int HUD_BUMBLEBEE_GUN = 14; - const int HUD_VEHICLE_LAST = 14; + const int HUD_BUMBLEBEE_GUN = 25; const vector eX = '1 0 0'; const vector eY = '0 1 0'; @@@ -253,6 -297,8 +297,8 @@@ const int PROJECTILE_BUMBLE_BEAM = 31 const int PROJECTILE_MAGE_SPIKE = 32; const int PROJECTILE_SHAMBLER_LIGHTNING = 33; + // projectile IDs 40-50 reserved + const int PROJECTILE_RPC = 60; const int SPECIES_HUMAN = 0; @@@ -278,7 -324,7 +324,7 @@@ const int SERVERFLAG_ALLOW_FULLBRIGHT const int SERVERFLAG_TEAMPLAY = 2; const int SERVERFLAG_PLAYERSTATS = 4; - // FIXME/EXPLAINME: why? + // FIXME/EXPLAINME: why? Mario: because vector autocvar_sv_player_maxs = '16 16 45'; vector autocvar_sv_player_mins = '-16 -16 -24'; vector autocvar_sv_player_viewoffset = '0 0 20'; @@@ -287,6 -333,9 +333,9 @@@ vector autocvar_sv_player_crouch_mins vector autocvar_sv_player_crouch_viewoffset = '0 0 20'; vector autocvar_sv_player_headsize = '24 24 12'; + + // not so constant + #ifdef SVQC #define PL_VIEW_OFS autocvar_sv_player_viewoffset #define PL_MIN autocvar_sv_player_mins #define PL_MAX autocvar_sv_player_maxs @@@ -294,16 -343,18 +343,18 @@@ #define PL_CROUCH_MIN autocvar_sv_player_crouch_mins #define PL_CROUCH_MAX autocvar_sv_player_crouch_maxs #define PL_HEAD autocvar_sv_player_headsize + #elif defined(CSQC) + #define PL_VIEW_OFS vec3(getstatf(STAT_PL_VIEW_OFS1), getstatf(STAT_PL_VIEW_OFS2), getstatf(STAT_PL_VIEW_OFS3)) + #define PL_MIN vec3(getstatf(STAT_PL_MIN1), getstatf(STAT_PL_MIN2), getstatf(STAT_PL_MIN3)) + #define PL_MAX vec3(getstatf(STAT_PL_MAX1), getstatf(STAT_PL_MAX2), getstatf(STAT_PL_MAX3)) + #define PL_CROUCH_VIEW_OFS vec3(getstatf(STAT_PL_CROUCH_VIEW_OFS1), getstatf(STAT_PL_CROUCH_VIEW_OFS2), getstatf(STAT_PL_CROUCH_VIEW_OFS3)) + #define PL_CROUCH_MIN vec3(getstatf(STAT_PL_CROUCH_MIN1), getstatf(STAT_PL_CROUCH_MIN2), getstatf(STAT_PL_CROUCH_MIN3)) + #define PL_CROUCH_MAX vec3(getstatf(STAT_PL_CROUCH_MAX1), getstatf(STAT_PL_CROUCH_MAX2), getstatf(STAT_PL_CROUCH_MAX3)) + #endif - // helpers - #define PL_VIEW_OFS_z autocvar_sv_player_viewoffset.z - #define PL_MIN_z autocvar_sv_player_mins.z - #define PL_MAX_z autocvar_sv_player_maxs.z - #define PL_CROUCH_VIEW_OFS_z autocvar_sv_player_crouch_viewoffset.z - #define PL_CROUCH_MIN_z autocvar_sv_player_mins.z - #define PL_HEAD_x autocvar_sv_player_headsize.x - #define PL_HEAD_y autocvar_sv_player_headsize.y - #define PL_HEAD_z autocvar_sv_player_headsize.z + // a bit more constant + const vector PL_MAX_CONST = '16 16 45'; + const vector PL_MIN_CONST = '-16 -16 -24'; // spawnpoint prios const int SPAWN_PRIO_NEAR_TEAMMATE_FOUND = 200; @@@ -321,8 -372,8 +372,8 @@@ const int URI_GET_UPDATENOTIFICATION = const int URI_GET_URLLIB = 128; const int URI_GET_URLLIB_END = 191; - // gametype votes - const int GTV_AVAILABLE = 0; - // for later use in per-map gametype filtering - const int GTV_FORBIDDEN = 2; + // gametype vote flags + const int GTV_FORBIDDEN = 0; // Cannot be voted + const int GTV_AVAILABLE = 1; // Can be voted + const int GTV_CUSTOM = 2; // Custom entry #endif diff --combined qcsrc/common/minigames/cl_minigames.qc index e8eee26245,0000000000..2fefd53227 mode 100644,000000..100644 --- a/qcsrc/common/minigames/cl_minigames.qc +++ b/qcsrc/common/minigames/cl_minigames.qc @@@ -1,408 -1,0 +1,406 @@@ +#include "cl_minigames.qh" + +// Draw a square in the center of the avaliable area +void minigame_hud_simpleboard(vector pos, vector mySize, string board_texture) +{ + if(panel.current_panel_bg != "0" && panel.current_panel_bg != "") + draw_BorderPicture(pos - '1 1 0' * panel_bg_border, + panel.current_panel_bg, + mySize + '1 1 0' * 2 * panel_bg_border, + panel_bg_color, panel_bg_alpha, + '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER)); + drawpic(pos, board_texture, mySize, '1 1 1', panel_bg_alpha, DRAWFLAG_NORMAL); +} + +// De-normalize (2D vector) v from relative coordinate inside pos mySize +vector minigame_hud_denormalize(vector v, vector pos, vector mySize) +{ + v_x = pos_x + v_x * mySize_x; + v_y = pos_y + v_y * mySize_y; + return v; +} +// De-normalize (2D vector) v from relative size inside pos mySize +vector minigame_hud_denormalize_size(vector v, vector pos, vector mySize) +{ + v_x = v_x * mySize_x; + v_y = v_y * mySize_y; + return v; +} + +// Normalize (2D vector) v to relative coordinate inside pos mySize +vector minigame_hud_normalize(vector v, vector pos, vector mySize) +{ + v_x = ( v_x - pos_x ) / mySize_x; + v_y = ( v_y - pos_y ) / mySize_y; + return v; +} + +// Check if the mouse is inside the given area +bool minigame_hud_mouse_in(vector pos, vector sz) +{ + return mousepos_x >= pos_x && mousepos_x < pos_x + sz_x && + mousepos_y >= pos_y && mousepos_y < pos_y + sz_y ; +} + +void initialize_minigames() +{ + entity last_minig = world; + entity minig; + #define MINIGAME(name,nicename) \ + minig = spawn(); \ + minig.classname = "minigame_descriptor"; \ + minig.netname = strzone(strtolower(#name)); \ + minig.message = nicename; \ + minig.minigame_hud_board = name##_hud_board; \ + minig.minigame_hud_status = name##_hud_status; \ + minig.minigame_event = name##_client_event; \ + if ( !last_minig ) minigame_descriptors = minig; \ + else last_minig.list_next = minig; \ + last_minig = minig; + + REGISTERED_MINIGAMES + + #undef MINIGAME +} + +string minigame_texture_skin(string skinname, string name) +{ + return sprintf("gfx/hud/%s/minigames/%s", skinname, name); +} +string minigame_texture(string name) +{ + string path = minigame_texture_skin(autocvar_menu_skin,name); + if ( precache_pic(path) == "" ) + path = minigame_texture_skin("default", name); + return path; +} + +#define FIELD(Flags, Type, Name) MSLE_CLEAN_##Type(self.Name) +#define MSLE_CLEAN_String(x) strunzone(x); +#define MSLE_CLEAN_Byte(x) +#define MSLE_CLEAN_Char(x) +#define MSLE_CLEAN_Short(x) +#define MSLE_CLEAN_Long(x) +#define MSLE_CLEAN_Coord(x) +#define MSLE_CLEAN_Angle(x) +#define MSLE_CLEAN_Float(x) +#define MSLE_CLEAN_Vector(x) +#define MSLE_CLEAN_Vector2D(x) + +#define MSLE(Name,Fields) \ + void msle_entremove_##Name() { strunzone(self.netname); Fields } +MINIGAME_SIMPLELINKED_ENTITIES +#undef MSLE +#undef FIELD + +void minigame_autoclean_entity(entity e) +{ + dprint("CL Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n"); + remove(e); +} + +void HUD_MinigameMenu_CurrentButton(); +bool auto_close_minigamemenu; +void deactivate_minigame() +{ + if ( !active_minigame ) + return; + + active_minigame.minigame_event(active_minigame,"deactivate"); + entity e = world; + while( (e = findentity(e, owner, active_minigame)) ) + if ( e.minigame_autoclean ) + { + minigame_autoclean_entity(e); + } + + minigame_self = world; + active_minigame = world; + + if ( auto_close_minigamemenu ) + { + HUD_MinigameMenu_Close(); + auto_close_minigamemenu = 0; + } + else + HUD_MinigameMenu_CurrentButton(); +} + +void minigame_entremove() +{ + if ( self == active_minigame ) + deactivate_minigame(); +} + +void activate_minigame(entity minigame) +{ + if ( !minigame ) + { + deactivate_minigame(); + return; + } + + if ( !minigame.descriptor || minigame.classname != "minigame" ) + { + dprint("Trying to activate unregistered minigame ",minigame.netname," in client\n"); + return; + } + + if ( minigame == active_minigame ) + return; + + if ( active_minigame ) + { + deactivate_minigame(); + } + + if ( minigame_self.owner != minigame ) + minigame_self = world; + active_minigame = minigame; + active_minigame.minigame_event(active_minigame,"activate"); + + if ( HUD_MinigameMenu_IsOpened() ) + HUD_MinigameMenu_CurrentButton(); + else + { + auto_close_minigamemenu = 1; + HUD_MinigameMenu_Open(); + } +} + +void minigame_player_entremove() +{ + if ( self.owner == active_minigame && self.minigame_playerslot == player_localentnum ) + deactivate_minigame(); +} + +vector ReadVector2D() { vector v; v_x = ReadCoord(); v_y = ReadCoord(); v_z = 0; return v; } +vector ReadVector() { vector v; v_x = ReadCoord(); v_y = ReadCoord(); v_z = ReadCoord(); return v; } +string() ReadString_Raw = #366; +string ReadString_Zoned() { return strzone(ReadString_Raw()); } - #define ReadFloat ReadCoord +#define ReadString ReadString_Zoned +#define FIELD(Flags, Type,Name) if ( sf & (Flags) ) self.Name = Read##Type(); +#define MSLE(Name,Fields) \ + else if ( self.classname == #Name ) { \ + if ( sf & MINIG_SF_CREATE ) { \ + minigame_read_owner(); \ + self.entremove = msle_entremove_##Name; \ + } \ + minigame_ent = self.owner; \ + Fields \ + } +void minigame_read_owner() +{ + string owner_name = ReadString_Raw(); + self.owner = world; + do + self.owner = find(self.owner,netname,owner_name); + while ( self.owner && self.owner.classname != "minigame" ); + if ( !self.owner ) + dprint("Got a minigame entity without a minigame!\n"); +} +void ent_read_minigame() +{ + float sf = ReadByte(); + if ( sf & MINIG_SF_CREATE ) + { + self.classname = msle_classname(ReadShort()); + self.netname = ReadString_Zoned(); + } + + entity minigame_ent = world; + + if ( self.classname == "minigame" ) + { + minigame_ent = self; + + if ( sf & MINIG_SF_CREATE ) + { + self.entremove = minigame_entremove; + self.descriptor = minigame_get_descriptor(ReadString_Raw()); + if ( !self.descriptor ) + dprint("Got a minigame without a client-side descriptor!\n"); + else + self.minigame_event = self.descriptor.minigame_event; + } + if ( sf & MINIG_SF_UPDATE ) + self.minigame_flags = ReadLong(); + } + else if ( self.classname == "minigame_player" ) + { + float activate = 0; + if ( sf & MINIG_SF_CREATE ) + { + self.entremove = minigame_player_entremove; + minigame_read_owner(); + float ent = ReadLong(); + self.minigame_playerslot = ent; + dprint("Player: ",GetPlayerName(ent-1),"\n"); + + activate = (ent == player_localnum+1 && self.owner && self.owner != active_minigame); + + } + minigame_ent = self.owner; + + if ( sf & MINIG_SF_UPDATE ) + self.team = ReadByte(); + + if ( activate ) + { + minigame_self = self; + activate_minigame(self.owner); + } + } + MINIGAME_SIMPLELINKED_ENTITIES + + if ( minigame_ent ) + minigame_ent.minigame_event(minigame_ent,"network_receive",self,sf); + + if ( sf & MINIG_SF_CREATE ) + { + dprint("CL Reading entity: ",ftos(num_for_edict(self)), + " classname:",self.classname," enttype:",ftos(self.enttype) ); + dprint(" sf:",ftos(sf)," netname:",self.netname,"\n\n"); + } +} - #undef ReadFloat +#undef ReadString +#undef FIELD +#undef MSLE + +string minigame_getWrappedLine(float w, vector theFontSize, textLengthUpToWidth_widthFunction_t tw) +{ + int last_word; + string s; + int take_until; + int skip = 0; + + s = getWrappedLine_remaining; + + if(w <= 0) + { + getWrappedLine_remaining = string_null; + return s; // the line has no size ANYWAY, nothing would be displayed. + } + + take_until = textLengthUpToWidth(s, w, theFontSize, tw); + + if ( take_until > strlen(s) ) + take_until = strlen(s); + + for ( int i = 0; i < take_until; i++ ) + if ( substring(s,i,1) == "\n" ) + { + take_until = i; + skip = 1; + break; + } + + if ( take_until > 0 || skip > 0 ) + { + if ( skip == 0 && take_until < strlen(s) ) + { + last_word = take_until; + while(last_word > 0 && substring(s, last_word, 1) != " ") + --last_word; + + if ( last_word != 0 ) + { + take_until = last_word; + skip = 1; + } + } + + getWrappedLine_remaining = substring(s, take_until+skip, strlen(s) - (take_until+skip)); + if(getWrappedLine_remaining == "") + getWrappedLine_remaining = string_null; + else if (tw("^7", theFontSize) == 0) + getWrappedLine_remaining = strcat(find_last_color_code(substring(s, 0, take_until)), getWrappedLine_remaining); + return substring(s, 0, take_until); + } + else + { + getWrappedLine_remaining = string_null; + return s; + } +} + +vector minigame_drawstring_wrapped( float maxwidth, vector pos, string text, + vector fontsize, vector color, float theAlpha, int drawflags, float align ) +{ + getWrappedLine_remaining = text; + vector mypos = pos; + while ( getWrappedLine_remaining ) + { + string line = minigame_getWrappedLine(maxwidth,fontsize,stringwidth_nocolors); + if ( line == "" ) + break; + mypos_x = pos_x + (maxwidth - stringwidth_nocolors(line, fontsize)) * align; + drawstring(mypos, line, fontsize, color, theAlpha, drawflags); + mypos_y += fontsize_y; + } + mypos_x = maxwidth; + mypos_y -= pos_y; + return mypos; +} + +vector minigame_drawcolorcodedstring_wrapped( float maxwidth, vector pos, + string text, vector fontsize, float theAlpha, int drawflags, float align ) +{ + getWrappedLine_remaining = text; + vector mypos = pos; + while ( getWrappedLine_remaining ) + { + string line = minigame_getWrappedLine(maxwidth,fontsize,stringwidth_colors); + if ( line == "" ) + break; + mypos_x = pos_x + (maxwidth - stringwidth_colors(line, fontsize)) * align; + drawcolorcodedstring(mypos, line, fontsize, theAlpha, drawflags); + mypos_y += fontsize_y; + } + mypos_x = maxwidth; + mypos_y -= pos_y; + return mypos; +} + +void minigame_drawstring_trunc(float maxwidth, vector pos, string text, + vector fontsize, vector color, float theAlpha, int drawflags ) +{ + string line = textShortenToWidth(text,maxwidth,fontsize,stringwidth_nocolors); + drawstring(pos, line, fontsize, color, theAlpha, drawflags); +} + +void minigame_drawcolorcodedstring_trunc(float maxwidth, vector pos, string text, + vector fontsize, float theAlpha, int drawflags ) +{ + string line = textShortenToWidth(text,maxwidth,fontsize,stringwidth_colors); + drawcolorcodedstring(pos, line, fontsize, theAlpha, drawflags); +} + +void minigame_drawpic_centered( vector pos, string texture, vector sz, + vector color, float thealpha, int drawflags ) +{ + drawpic( pos-sz/2, texture, sz, color, thealpha, drawflags ); +} + +// Workaround because otherwise variadic arguments won't work properly +// It could be a bug in the compiler or in darkplaces +void minigame_cmd_workaround(float dummy, string...cmdargc) +{ + string cmd; + cmd = "cmd minigame "; + float i; + for ( i = 0; i < cmdargc; i++ ) + cmd = strcat(cmd,...(i,string)); + localcmd(strcat(cmd,"\n")); +} + +// Prompt the player to play in the current minigame +// (ie: it's their turn and they should get back to the minigame) +void minigame_prompt() +{ + if ( active_minigame && ! HUD_MinigameMenu_IsOpened() ) + { + HUD_Notify_Push(sprintf("minigames/%s/icon_notif",active_minigame.descriptor.netname), + _("It's your turn"), ""); + } +} diff --combined qcsrc/common/minigames/sv_minigames.qc index 40332796e2,0000000000..157471cbd5 mode 100644,000000..100644 --- a/qcsrc/common/minigames/sv_minigames.qc +++ b/qcsrc/common/minigames/sv_minigames.qc @@@ -1,432 -1,0 +1,430 @@@ +#include "minigames.qh" + +void player_clear_minigame(entity player) +{ + player.active_minigame = world; + player.minigame_players = world; + if ( IS_PLAYER(player) ) + player.movetype = MOVETYPE_WALK; + else + player.movetype = MOVETYPE_FLY_WORLDONLY; + player.team_forced = 0; +} + +void minigame_rmplayer(entity minigame_session, entity player) +{ + entity e; + entity p = minigame_session.minigame_players; + + if ( p.minigame_players == player ) + { + if ( p.list_next == world ) + { + end_minigame(minigame_session); + return; + } + minigame_session.minigame_event(minigame_session,"part",player); + GameLogEcho(strcat(":minigame:part:",minigame_session.netname,":", + ftos(num_for_edict(player)),":",player.netname)); + minigame_session.minigame_players = p.list_next; + remove ( p ); + player_clear_minigame(player); + } + else + { + for ( e = p.list_next; e != world; e = e.list_next ) + { + if ( e.minigame_players == player ) + { + minigame_session.minigame_event(minigame_session,"part",player); + GameLogEcho(strcat(":minigame:part:",minigame_session.netname,":", + ftos(num_for_edict(player)),":",player.netname)); + p.list_next = e.list_next; + remove(e); + player_clear_minigame(player); + return; + } + p = e; + } + } +} + + +#define FIELD(Flags, Type,Name) if ( sf & (Flags) ) Write##Type(MSG_ENTITY, self.Name); +#define WriteVector(to,Name) WriteCoord(to,Name##_x); WriteCoord(to,Name##_y); WriteCoord(to,Name##_z) +#define WriteVector2D(to,Name) WriteCoord(to,Name##_x); WriteCoord(to,Name##_y) - #define WriteFloat WriteCoord +#define MSLE(Name,Fields) \ + else if ( self.classname == #Name ) { \ + if ( sf & MINIG_SF_CREATE ) WriteString(MSG_ENTITY,self.owner.netname); \ + Fields } + +// Send an entity to a client +// only use on minigame entities or entities with a minigame owner +bool minigame_SendEntity(entity to, int sf) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_MINIGAME); + WriteByte(MSG_ENTITY, sf); + + if ( sf & MINIG_SF_CREATE ) + { + WriteShort(MSG_ENTITY,msle_id(self.classname)); + WriteString(MSG_ENTITY,self.netname); + } + + entity minigame_ent = self.owner; + + if ( self.classname == "minigame" ) + { + minigame_ent = self; + + if ( sf & MINIG_SF_CREATE ) + WriteString(MSG_ENTITY,self.descriptor.netname); + + if ( sf & MINIG_SF_UPDATE ) + WriteLong(MSG_ENTITY,self.minigame_flags); + } + else if ( self.classname == "minigame_player" ) + { + if ( sf & MINIG_SF_CREATE ) + { + WriteString(MSG_ENTITY,self.owner.netname); + WriteLong(MSG_ENTITY,num_for_edict(self.minigame_players)); + } + if ( sf & MINIG_SF_UPDATE ) + WriteByte(MSG_ENTITY,self.team); + } + MINIGAME_SIMPLELINKED_ENTITIES + + minigame_ent.minigame_event(minigame_ent,"network_send",self,sf); + + return true; + +} +#undef FIELD +#undef MSLE - #undef WriteFloat + +// Force resend all minigame entities +void minigame_resend(entity minigame) +{ + minigame.SendFlags = MINIG_SF_ALL; + entity e = world; + while (( e = findentity(e,owner,minigame) )) + { + e.SendFlags = MINIG_SF_ALL; + } +} + +bool minigame_CheckSend() +{ + entity e; + for ( e = self.owner.minigame_players; e != world; e = e.list_next ) + if ( e.minigame_players == other ) + return true; + return false; +} + +int minigame_addplayer(entity minigame_session, entity player) +{ + if ( player.active_minigame ) + { + if ( player.active_minigame == minigame_session ) + return 0; + minigame_rmplayer(player.active_minigame,player); + } + + int mgteam = minigame_session.minigame_event(minigame_session,"join",player); + + if ( mgteam ) + { + entity player_pointer = spawn(); + player_pointer.classname = "minigame_player"; + player_pointer.owner = minigame_session; + player_pointer.minigame_players = player; + player_pointer.team = mgteam; + player_pointer.list_next = minigame_session.minigame_players; + minigame_session.minigame_players = player_pointer; + player.active_minigame = minigame_session; + player.minigame_players = player_pointer; + player_pointer.customizeentityforclient = minigame_CheckSend; + Net_LinkEntity(player_pointer, false, 0, minigame_SendEntity); + + if ( !IS_OBSERVER(player) && autocvar_sv_minigames_observer ) + { + entity e = self; + self = player; + PutObserverInServer(); + self = e; + } + if ( autocvar_sv_minigames_observer == 2 ) + player.team_forced = -1; + + minigame_resend(minigame_session); + } + GameLogEcho(strcat(":minigame:join",(mgteam?"":"fail"),":",minigame_session.netname,":", + ftos(num_for_edict(player)),":",player.netname)); + + return mgteam; +} + +entity start_minigame(entity player, string minigame ) +{ + if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) ) + return world; + + entity e = minigame_get_descriptor(minigame); + if ( e ) + { + entity minig = spawn(); + minig.classname = "minigame"; + minig.netname = strzone(strcat(e.netname,"_",ftos(num_for_edict(minig)))); + minig.descriptor = e; + minig.minigame_event = e.minigame_event; + minig.minigame_event(minig,"start"); + GameLogEcho(strcat(":minigame:start:",minig.netname)); + if ( ! minigame_addplayer(minig,player) ) + { + dprint("Minigame ",minig.netname," rejected the first player join!\n"); + end_minigame(minig); + return world; + } + Net_LinkEntity(minig, false, 0, minigame_SendEntity); + + if ( !minigame_sessions ) + minigame_sessions = minig; + else + { + minigame_sessions.owner = minig; + minig.list_next = minigame_sessions; + minigame_sessions = minig; + } + return minig; + } + + return world; +} + +entity join_minigame(entity player, string game_id ) +{ + if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) ) + return world; + + entity minig; + for ( minig = minigame_sessions; minig != world; minig = minig.list_next ) + { + if ( minig.netname == game_id ) + if ( minigame_addplayer(minig,player) ) + return minig; + } + + return world; +} + +void part_minigame(entity player ) +{ + entity minig = player.active_minigame; + + if ( minig && minig.classname == "minigame" ) + minigame_rmplayer(minig,player); +} + +void end_minigame(entity minigame_session) +{ + if ( minigame_session.owner ) + minigame_session.owner.list_next = minigame_session.list_next; + else + minigame_sessions = minigame_session.list_next; + + minigame_session.minigame_event(minigame_session,"end"); + GameLogEcho(strcat(":minigame:end:",minigame_session.netname)); + + + entity e = world; + while( (e = findentity(e, owner, minigame_session)) ) + if ( e.minigame_autoclean ) + { + dprint("SV Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n"); + remove(e); + } + + entity p; + for ( e = minigame_session.minigame_players; e != world; e = p ) + { + p = e.list_next; + player_clear_minigame(e.minigame_players); + remove(e); + } + + strunzone(minigame_session.netname); + remove(minigame_session); +} + +void end_minigames() +{ + while ( minigame_sessions ) + { + end_minigame(minigame_sessions); + } +} + +void initialize_minigames() +{ + entity last_minig = world; + entity minig; + #define MINIGAME(name,nicename) \ + minig = spawn(); \ + minig.classname = "minigame_descriptor"; \ + minig.netname = #name; \ + minig.message = nicename; \ + minig.minigame_event = name##_server_event; \ + if ( !last_minig ) minigame_descriptors = minig; \ + else last_minig.list_next = minig; \ + last_minig = minig; + + REGISTERED_MINIGAMES + + #undef MINIGAME +} + +string invite_minigame(entity inviter, entity player) +{ + if ( !inviter || !inviter.active_minigame ) + return "Invalid minigame"; + if ( !VerifyClientEntity(player, true, false) ) + return "Invalid player"; + if ( inviter == player ) + return "You can't invite yourself"; + if ( player.active_minigame == inviter.active_minigame ) + return strcat(player.netname," is already playing"); + + Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_MINIGAME_INVITE, + inviter.active_minigame.netname, inviter.netname ); + + GameLogEcho(strcat(":minigame:invite:",inviter.active_minigame.netname,":", + ftos(num_for_edict(player)),":",player.netname)); + + return ""; +} + +entity minigame_find_player(entity client) +{ + if ( ! client.active_minigame ) + return world; + entity e; + for ( e = client.active_minigame.minigame_players; e; e = e.list_next ) + if ( e.minigame_players == client ) + return e; + return world; +} + +bool MinigameImpulse(int imp) +{ + entity e = minigame_find_player(self); + if ( imp && self.active_minigame && e ) + { + return self.active_minigame.minigame_event(self.active_minigame,"impulse",e,imp); + } + return false; +} + + + +void ClientCommand_minigame(int request, int argc, string command) +{ + if ( !autocvar_sv_minigames ) + { + sprint(self,"Minigames are not enabled!\n"); + return; + } + + if (request == CMD_REQUEST_COMMAND ) + { + string minig_cmd = argv(1); + if ( minig_cmd == "create" && argc > 2 ) + { + entity minig = start_minigame(self, argv(2)); + if ( minig ) + sprint(self,"Created minigame session: ",minig.netname,"\n"); + else + sprint(self,"Cannot start minigame session!\n"); + return; + } + else if ( minig_cmd == "join" && argc > 2 ) + { + entity minig = join_minigame(self, argv(2)); + if ( minig ) + sprint(self,"Joined: ",minig.netname,"\n"); + else + { + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_JOIN_PREVENT_MINIGAME); + sprint(self,"Cannot join given minigame session!\n"); + } + return; + } + else if ( minig_cmd == "list" ) + { + entity e; + for ( e = minigame_descriptors; e != world; e = e.list_next ) + sprint(self,e.netname," (",e.message,") ","\n"); + return; + } + else if ( minig_cmd == "list-sessions" ) + { + entity e; + for ( e = minigame_sessions; e != world; e = e.list_next ) + sprint(self,e.netname,"\n"); + return; + } + else if ( minig_cmd == "end" || minig_cmd == "part" ) + { + if ( self.active_minigame ) + { + part_minigame(self); + sprint(self,"Left minigame session\n"); + } + else + sprint(self,"You aren't playing any minigame...\n"); + return; + } + else if ( minig_cmd == "invite" && argc > 2 ) + { + if ( self.active_minigame ) + { + entity client = GetIndexedEntity(argc, 2); + string error = invite_minigame(self,client); + if ( error == "" ) + { + sprint(self,"You have invited ",client.netname, + " to join your game of ", self.active_minigame.descriptor.message, "\n"); + } + else + sprint(self,"Could not invite: ", error, ".\n"); + } + else + sprint(self,"You aren't playing any minigame...\n"); + return; + } + else if ( self.active_minigame ) + { + entity e = minigame_find_player(self); + string subcommand = substring(command,argv_end_index(0),-1); + int arg_c = tokenize_console(subcommand); + if ( self.active_minigame.minigame_event(self.active_minigame,"cmd",e,arg_c,subcommand) ) + return; + + } + else sprint(self,strcat("Wrong command:^1 ",command,"\n")); + } + + sprint(self, "\nUsage:^3 cmd minigame create \n"); + sprint(self, " Start a new minigame session\n"); + sprint(self, "Usage:^3 cmd minigame join \n"); + sprint(self, " Join an exising minigame session\n"); + sprint(self, "Usage:^3 cmd minigame list\n"); + sprint(self, " List available minigames\n"); + sprint(self, "Usage:^3 cmd minigame list-sessions\n"); + sprint(self, " List available minigames sessions\n"); + sprint(self, "Usage:^3 cmd minigame part|end\n"); + sprint(self, " Leave the current minigame\n"); + sprint(self, "Usage:^3 cmd minigame invite \n"); + sprint(self, " Invite the given player to join you in a minigame\n"); +} diff --combined qcsrc/common/notifications.qh index 0dfbebe777,92386b3132..cc7b397a49 --- a/qcsrc/common/notifications.qh +++ b/qcsrc/common/notifications.qh @@@ -347,36 -347,46 +347,46 @@@ void Send_Notification_WOCOVA #define MSG_INFO_NOTIFICATIONS \ MSG_INFO_NOTIF(2, INFO_CHAT_NOSPECTATORS, 0, 0, "", "", "", _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "") \ + MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 4, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \ + MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 4, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_CAPTURE_NEUTRAL, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the flag"), "") \ + MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 4, 1, 1, "s1 f1p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "") \ + MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 4, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_ABORTRUN_, 4, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_ABORTRUN_NEUTRAL,0, 0, "", "", "", _("^BGThe flag was returned by its owner"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DAMAGED_, 4, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_DAMAGED_NEUTRAL, 0, 0, "", "", "", _("^BGThe flag was destroyed and returned to base"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DROPPED_, 4, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_DROPPED_NEUTRAL, 0, 0, "", "", "", _("^BGThe flag was dropped in the base and returned itself"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_NEEDKILL_, 4, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_NEEDKILL_NEUTRAL,0, 0, "", "", "", _("^BGThe flag fell somewhere it couldn't be reached and returned to base"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_SPEEDRUN_, 4, 0, 1, "f1p2dec", "", "", _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_SPEEDRUN_NEUTRAL,0, 1, "f1p2dec", "", "", _("^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \ + MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_TIMEOUT_, 4, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag has returned to the base"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_TIMEOUT_NEUTRAL, 0, 0, "", "", "", _("^BGThe flag has returned to the base"), "") \ + MULTITEAM_INFO(1, INFO_CTF_LOST_, 4, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the ^TC^TT^BG flag"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_LOST_NEUTRAL, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the flag"), "") \ + MULTITEAM_INFO(1, INFO_CTF_PICKUP_, 4, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the ^TC^TT^BG flag"), "") \ + MSG_INFO_NOTIF(1, INFO_CTF_PICKUP_NEUTRAL, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the flag"), "") \ + MULTITEAM_INFO(1, INFO_CTF_RETURN_, 4, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \ + MULTITEAM_INFO(1, INFO_CTF_RETURN_MONSTER_, 4, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \ MSG_INFO_NOTIF(2, INFO_COINTOSS, 1, 0, "s1", "", "", _("^F2Throwing coin... Result: %s^F2!"), "") \ MSG_INFO_NOTIF(1, INFO_JETPACK_NOFUEL, 0, 0, "", "", "", _("^BGYou don't have any fuel for the ^F1Jetpack"), "") \ MSG_INFO_NOTIF(2, INFO_SUPERSPEC_MISSING_UID, 0, 0, "", "", "", _("^F2You lack a UID, superspec options will not be saved/restored"), "") \ MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE, 0, 0, "", "", "", _("^F1Round already started, you will join the game in the next round"), "") \ MSG_INFO_NOTIF(1, INFO_CA_LEAVE, 0, 0, "", "", "", _("^F2You will spectate in the next round"), "") \ - MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \ - MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \ - MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 2, 1, 1, "s1 f1p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "") \ - MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 2, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_ABORTRUN_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DAMAGED_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DROPPED_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_NEEDKILL_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_SPEEDRUN_, 2, 0, 1, "f1p2dec", "", "", _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \ - MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_TIMEOUT_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag has returned to the base"), "") \ - MULTITEAM_INFO(1, INFO_CTF_LOST_, 2, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the ^TC^TT^BG flag"), "") \ - MULTITEAM_INFO(1, INFO_CTF_PICKUP_, 2, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the ^TC^TT^BG flag"), "") \ - MULTITEAM_INFO(1, INFO_CTF_RETURN_, 2, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \ - MULTITEAM_INFO(1, INFO_CTF_RETURN_MONSTER_, 2, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_BUFF, 3, 3, "spree_inf s1 s2 f3buffname s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"), _("^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_CHEAT, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_DROWN, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_water", _("^BG%s%s^K1 was drowned by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_fall", _("^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"), _("^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_lava", _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_MONSTER, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was pushed infront of a monster by ^BG%s^K1%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NAPALM, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_napalm", _("^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"), _("^BG%s%s^K1 got too close to a napalm explosion%s%s")) \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_ice", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE_FREEZE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_ice", _("^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_HEAL, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_nade_heal", _("^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "nade_normal", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NAPALM, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "nade_napalm", _("^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"), _("^BG%s%s^K1 got too close to a napalm explosion%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "nade_ice", _("^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE_FREEZE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "nade_ice", _("^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_HEAL, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "nade_heal", _("^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_shootingstar", _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"), "") \ @@@ -394,7 -404,6 +404,6 @@@ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_DEATH, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_GUN, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_ROCKET, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VENGEANCE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was destroyed by the vengeful ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VOID, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "notify_void", _("^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_AUTOTEAMCHANGE, 2, 1, "s1 s2loc death_team", "", "", _("^BG%s^K1 was moved into the %s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_BETRAYAL, 2, 1, "s1 s2loc spree_lost", "s1", "notify_teamkill_red", _("^BG%s^K1 became enemies with the Lord of Teamplay%s%s"), "") \ @@@ -414,11 -423,11 +423,11 @@@ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was fireballed by a Wyvern%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 joins the Zombies%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NAPALM, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_napalm", _("^BG%s^K1 was burned to death by their own Napalm Nade%s%s"), _("^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s")) \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_ice", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE_FREEZE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_ice", _("^BG%s^K1 was frozen to death by their own Ice Nade%s%s"), _("^BG%s^K1 felt a little chilly%s%s")) \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_HEAL, 2, 1, "s1 s2loc spree_lost", "s1", "notify_nade_heal", _("^BG%s^K1's Healing Nade didn't quite heal them%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE, 2, 1, "s1 s2loc spree_lost", "s1", "nade_normal", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NAPALM, 2, 1, "s1 s2loc spree_lost", "s1", "nade_napalm", _("^BG%s^K1 was burned to death by their own Napalm Nade%s%s"), _("^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE, 2, 1, "s1 s2loc spree_lost", "s1", "nade_ice", _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE_FREEZE, 2, 1, "s1 s2loc spree_lost", "s1", "nade_ice", _("^BG%s^K1 was frozen to death by their own Ice Nade%s%s"), _("^BG%s^K1 felt a little chilly%s%s")) \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_HEAL, 2, 1, "s1 s2loc spree_lost", "s1", "nade_heal", _("^BG%s^K1's Healing Nade didn't quite heal them%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO, 2, 1, "s1 s2loc spree_lost", "s1", "notify_outofammo", _("^BG%s^K1 died%s%s. What's the point of living without ammo?"), _("^BG%s^K1 ran out of ammo%s%s")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 rotted away%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR, 2, 1, "s1 s2loc spree_lost", "s1", "notify_shootingstar", _("^BG%s^K1 became a shooting star%s%s"), "") \ @@@ -438,7 -447,7 +447,7 @@@ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PLASMA, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 got served some superheated plasma from a turret%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_TESLA, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was electrocuted by a Tesla turret%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_GUN, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_MEELE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was impaled by a Walker turret%s%s"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_MELEE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was impaled by a Walker turret%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_ROCKET, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was blasted away by a Walker turret%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_BUMB_DEATH, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_CRUSH, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was crushed by a vehicle%s%s"), "") \ @@@ -484,6 -493,10 +493,10 @@@ MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT, 1, 0, "s1", "", "", _("^BG%s^F3 forfeited"), "") \ MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES, 1, 0, "s1", "", "", _("^BG%s^F3 has no more lives left"), "") \ MSG_INFO_NOTIF(1, INFO_MONSTERS_DISABLED, 0, 0, "", "", "", _("^BGMonsters are currently disabled"), "") \ + MSG_INFO_NOTIF(1, INFO_ONSLAUGHT_CAPTURE, 2, 0, "s1 s2", "", "", _("^BG%s^BG captured %s^BG control point"), "") \ + MULTITEAM_INFO(1, INFO_ONSLAUGHT_CPDESTROYED_, 4, 2, 0, "s1 s2", "", "", _("^TC^TT^BG team %s^BG control point has been destroyed by %s"), "") \ + MULTITEAM_INFO(1, INFO_ONSLAUGHT_GENDESTROYED_, 4, 0, 0, "", "", "", _("^TC^TT^BG generator has been destroyed"), "") \ + MULTITEAM_INFO(1, INFO_ONSLAUGHT_GENDESTROYED_OVERTIME_, 4, 0, 0, "", "", "", _("^TC^TT^BG generator spontaneously combusted due to overtime!"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY, 1, 0, "s1", "s1", "strength", _("^BG%s^K1 picked up Invisibility"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_SHIELD, 1, 0, "s1", "s1", "shield", _("^BG%s^K1 picked up Shield"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_SPEED, 1, 0, "s1", "s1", "shield", _("^BG%s^K1 picked up Speed"), "") \ @@@ -500,7 -513,6 +513,7 @@@ MSG_INFO_NOTIF(1, INFO_RACE_NEW_IMPROVED, 1, 3, "s1 race_col f1ord race_col f2race_time race_diff", "s1 f2race_time", "race_newtime", _("^BG%s^BG improved their %s%s^BG place record with %s%s %s"), "") \ MSG_INFO_NOTIF(1, INFO_RACE_NEW_MISSING_UID, 1, 1, "s1 f1race_time", "s1 f1race_time", "race_newfail", _("^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID and will be lost."), "") \ MSG_INFO_NOTIF(1, INFO_RACE_NEW_SET, 1, 2, "s1 race_col f1ord race_col f2race_time", "s1 f2race_time", "race_newrecordserver", _("^BG%s^BG set the %s%s^BG place record with %s%s"), "") \ + MULTIICON_INFO(1, INFO_MINIGAME_INVITE, 2, 0, "s2 minigame1_name s1","s2", "minigame1_d", "minigames/%s/icon_notif",_("^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 (^F1%s^F4)"), "") \ MULTITEAM_INFO(1, INFO_SCORES_, 4, 0, 0, "", "", "", _("^TC^TT ^BGteam scores!"), "") \ MSG_INFO_NOTIF(1, INFO_SPECTATE_WARNING, 0, 1, "f1secs", "", "", _("^F2You have to become a player within the next %s, otherwise you will be kicked, because spectating isn't allowed at this time!"), "") \ MSG_INFO_NOTIF(1, INFO_SUPERWEAPON_PICKUP, 1, 0, "s1", "s1", "superweapons", _("^BG%s^K1 picked up a Superweapon"), "") \ @@@ -597,20 -609,34 +610,34 @@@ MSG_CENTER_NOTIF(1, CENTER_CAMPCHECK, 0, 0, "", CPID_CAMPCHECK, "0 0", _("^F2Don't camp!"), "") \ MSG_CENTER_NOTIF(1, CENTER_COINTOSS, 1, 0, "s1", NO_CPID, "0 0", _("^F2Throwing coin... Result: %s^F2!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \ - MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_INACTIVE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGThis flag is currently inactive"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now ^F1shielded^BG from the flag(s)\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 4, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURE_NEUTRAL, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the flag!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_FLAG_THROW_PUNISH, 0, 1, "f1secs", CPID_CTF_LOWPRIO, "0 0", _("^BGToo many flag throws! Throwing disabled for %s."), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 2, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_PASS_RECEIVED_, 2, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 4, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_OTHER_NEUTRAL, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the flag to %s"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PASS_RECEIVED_, 4, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_RECEIVED_NEUTRAL, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the flag from %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTED, 1, 0, "s1 pass_key", CPID_CTF_PASS, "0 0", _("^BG%s^BG requests you to pass the flag%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTING, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGRequesting %s^BG to pass you the flag"), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_PASS_SENT_, 2, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_, 2, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PASS_SENT_, 4, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_SENT_NEUTRAL, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the flag to %s"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_, 4, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_NEUTRAL, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the flag!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got your %steam^BG's flag, return it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_ENEMY, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the %senemy^BG's flag, return it!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy^BG got your flag! Retrieve it!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_VERBOSE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"), "") \ - MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \ - MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_VERBOSE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \ - MULTITEAM_CENTER(1, CENTER_CTF_RETURN_, 2, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_NEUTRAL, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy^BG got the flag! Retrieve it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE, 2, 0, "s1 s2 s1",CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_TEAM, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy^BG got their flag! Retrieve it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_TEAM_VERBOSE,2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_TEAM_, 4, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_TEAM_VERBOSE_, 4, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_NEUTRAL, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \ + MULTITEAM_CENTER(1, CENTER_CTF_RETURN_, 4, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_CARRIER, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Enemies can now see you on radar!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_OTHER, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG, 1, 1, "spree_cen s1", NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \ @@@ -671,6 -697,7 +698,7 @@@ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE_SELF, 0, 0, "", NO_CPID, "0 0", _("^K3You revived yourself"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED, 1, 0, "s1", NO_CPID, "0 0", _("^K3You were revived by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_AUTO_REVIVED, 0, 1, "f1", NO_CPID, "0 0", _("^K3You were automatically revived after %s second(s)"), "") \ + MSG_CENTER_NOTIF(1, CENTER_GENERATOR_UNDERATTACK, 0, 0, "", NO_CPID, "0 0", _("^BGThe generator is under attack!"), "") \ MULTITEAM_CENTER(1, CENTER_ROUND_TEAM_WIN_, 4, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team wins the round"), "") \ MSG_CENTER_NOTIF(1, CENTER_ROUND_PLAYER_WIN, 1, 0, "s1", CPID_ROUND, "0 0", _("^BG%s^BG wins the round"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF, 0, 0, "", NO_CPID, "0 0", _("^K1You froze yourself"), "") \ @@@ -696,7 -723,6 +724,6 @@@ MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_ROUNDSTART, 0, 1, "", CPID_KEYHUNT_OTHER, "1 f1", _("^F4Round will start in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_SCAN, 0, 1, "", CPID_KEYHUNT_OTHER, "f1 0", _("^BGScanning frequency range..."), "") \ MULTITEAM_CENTER(1, CENTER_KEYHUNT_START_, 4, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGYou are starting with the ^TC^TT Key"), "") \ - MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT, 0, 1, "missing_teams", CPID_KEYHUNT_OTHER, "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_LMS_NOLIVES, 0, 0, "", CPID_LMS, "0 0", _("^BGYou have no lives left, you must wait until the next match"), "") \ MSG_CENTER_NOTIF(1, CENTER_MISSING_TEAMS, 0, 1, "missing_teams", CPID_MISSING_TEAMS, "-1 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_MISSING_PLAYERS, 0, 1, "f1", CPID_MISSING_PLAYERS, "-1 0", _("^BGWaiting for %s player(s) to join..."), "") \ @@@ -707,13 -733,20 +734,20 @@@ MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN, 0, 2, "item_wepname", CPID_NIX, "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_NADE, 0, 0, "", NO_CPID, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \ - MSG_CENTER_NOTIF(1, CENTER_ONS_NOTSHIELDED, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^K1Your generator is NOT shielded!\n^BGRe-capture controlpoints to shield it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_CAPTURE, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^BGYou captured %s^BG control point"), "") \ + MULTITEAM_CENTER(1, CENTER_ONS_CAPTURE_, 4, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^TC^TT^BG team captured %s^BG control point"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_CONTROLPOINT_SHIELDED, 0, 0, "", CPID_ONS_CAPSHIELD, "0 0", _("^BGThis control point currently cannot be captured"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_GENERATOR_SHIELDED, 0, 0, "", CPID_ONS_CAPSHIELD, "0 0", _("^BGThe enemy generator cannot be destroyed yet\n^F2Capture some control points to unshield it"), "") \ + MULTITEAM_CENTER(1, CENTER_ONS_NOTSHIELDED_, 4, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^BGThe ^TCenemy^BG generator is no longer shielded!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_NOTSHIELDED_TEAM, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^K1Your generator is NOT shielded!\n^BGRe-capture control points to shield it!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_TELEPORT, 0, 0, "pass_key", CPID_ONSLAUGHT, "0 0", _("^BGPress ^F2DROPFLAG%s^BG to teleport"), "") \ + MSG_CENTER_NOTIF(1, CENTER_ONS_TELEPORT_ANTISPAM, 0, 1, "f1secs", CPID_ONSLAUGHT, "0 0", _("^BGTeleporting disabled for %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG, 0, 0, "", CPID_OVERTIME, "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_CONTROLPOINT, 0, 0, "", CPID_OVERTIME, "5 0", _("^F2Now playing ^F4OVERTIME^F2!\n\nGenerators are now decaying.\nThe more control points your team holds,\nthe faster the enemy generator decays"), "") \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME, 0, 1, "f1time", CPID_OVERTIME, "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \ MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_IN, 0, 0, "", NO_CPID, "0 0", _("^K1In^BG-portal created"), "") \ MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_OUT, 0, 0, "", NO_CPID, "0 0", _("^F3Out^BG-portal created"), "") \ - MSG_CENTER_NOTIF(1, CENTER_PORTO_FAILED, 0, 0, "", NO_CPID, "0 0", _("^K1Portal deployment failed.\n\n^F2Catch it to try again!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_PORTO_FAILED, 0, 0, "", NO_CPID, "0 0", _("^F1Portal creation failed"), "") \ MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Invisibility has worn off"), "") \ MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Shield has worn off"), "") \ MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SPEED, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Speed has worn off"), "") \ @@@ -736,8 -769,12 +770,13 @@@ MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Suicide in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING, 0, 1, "", CPID_TIMEOUT, "1 f1", _("^F4Timeout begins in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING, 0, 1, "", CPID_TIMEOUT, "1 f1", _("^F4Timeout ends in ^COUNT"), "") \ - MSG_CENTER_NOTIF(1, CENTER_WEAPON_MINELAYER_LIMIT, 0, 1, "f1", NO_CPID, "0 0", _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "") \ - MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT_MINIGAME, 0, 0, "", NO_CPID, "0 0", _("^K1Cannot join given minigame session!"), "" ) ++ MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT_MINIGAME, 0, 0, "", NO_CPID, "0 0", _("^K1Cannot join given minigame session!"), "" ) \ + MSG_CENTER_NOTIF(1, CENTER_VEHICLE_ENTER, 0, 0, "pass_key", CPID_VEHICLES, "0 0", _("^BGPress ^F2DROPFLAG%s^BG to enter/exit the vehicle"), "") \ + MSG_CENTER_NOTIF(1, CENTER_VEHICLE_ENTER_GUNNER, 0, 0, "pass_key", CPID_VEHICLES, "0 0", _("^BGPress ^F2DROPFLAG%s^BG to enter the vehicle gunner"), "") \ + MSG_CENTER_NOTIF(1, CENTER_VEHICLE_ENTER_STEAL, 0, 0, "pass_key", CPID_VEHICLES, "0 0", _("^BGPress ^F2DROPFLAG%s^BG to steal this vehicle"), "") \ + MSG_CENTER_NOTIF(1, CENTER_VEHICLE_STEAL, 0, 0, "", CPID_VEHICLES_OTHER, "0 0", _("^F2The enemy is stealing one of your vehicles!\n^F4Stop them!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_VEHICLE_STEAL_SELF, 0, 0, "", CPID_VEHICLES_OTHER, "4 0", _("^F2You have stolen the enemy's vehicle, you are now visible on their radar!"), "") \ + MSG_CENTER_NOTIF(1, CENTER_WEAPON_MINELAYER_LIMIT, 0, 1, "f1", NO_CPID, "0 0", _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "") #define MULTITEAM_MULTI2(default,prefix,anncepre,infopre,centerpre) \ MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \ @@@ -755,6 -792,7 +794,7 @@@ MULTITEAM_MULTI##teams(default,prefix,anncepre,infopre,centerpre) #define MSG_MULTI_NOTIFICATIONS \ + MSG_MULTI_NOTIF(1, DEATH_MURDER_BUFF, NO_MSG, INFO_DEATH_MURDER_BUFF, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_CHEAT, NO_MSG, INFO_DEATH_MURDER_CHEAT, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_DROWN, NO_MSG, INFO_DEATH_MURDER_DROWN, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL, NO_MSG, INFO_DEATH_MURDER_FALL, NO_MSG) \ @@@ -783,7 -821,6 +823,6 @@@ MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_DEATH, NO_MSG, INFO_DEATH_MURDER_VH_WAKI_DEATH, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_GUN, NO_MSG, INFO_DEATH_MURDER_VH_WAKI_GUN, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_ROCKET, NO_MSG, INFO_DEATH_MURDER_VH_WAKI_ROCKET, NO_MSG) \ - MSG_MULTI_NOTIF(1, DEATH_MURDER_VENGEANCE, NO_MSG, INFO_DEATH_MURDER_VENGEANCE, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_MURDER_VOID, NO_MSG, INFO_DEATH_MURDER_VOID, NO_MSG) \ MSG_MULTI_NOTIF(1, DEATH_SELF_AUTOTEAMCHANGE, NO_MSG, INFO_DEATH_SELF_AUTOTEAMCHANGE, CENTER_DEATH_SELF_AUTOTEAMCHANGE) \ MSG_MULTI_NOTIF(1, DEATH_SELF_BETRAYAL, NO_MSG, INFO_DEATH_SELF_BETRAYAL, CENTER_DEATH_SELF_BETRAYAL) \ @@@ -827,7 -864,7 +866,7 @@@ MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_PLASMA, NO_MSG, INFO_DEATH_SELF_TURRET_PLASMA, CENTER_DEATH_SELF_TURRET) \ MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_TESLA, NO_MSG, INFO_DEATH_SELF_TURRET_TESLA, CENTER_DEATH_SELF_TURRET) \ MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_GUN, NO_MSG, INFO_DEATH_SELF_TURRET_WALK_GUN, CENTER_DEATH_SELF_TURRET_WALK) \ - MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_MEELE, NO_MSG, INFO_DEATH_SELF_TURRET_WALK_MEELE, CENTER_DEATH_SELF_TURRET_WALK) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_MELEE, NO_MSG, INFO_DEATH_SELF_TURRET_WALK_MELEE, CENTER_DEATH_SELF_TURRET_WALK) \ MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_ROCKET, NO_MSG, INFO_DEATH_SELF_TURRET_WALK_ROCKET, CENTER_DEATH_SELF_TURRET_WALK) \ MSG_MULTI_NOTIF(1, DEATH_SELF_VH_BUMB_DEATH, NO_MSG, INFO_DEATH_SELF_VH_BUMB_DEATH, CENTER_DEATH_SELF_VH_BUMB_DEATH) \ MSG_MULTI_NOTIF(1, DEATH_SELF_VH_CRUSH, NO_MSG, INFO_DEATH_SELF_VH_CRUSH, CENTER_DEATH_SELF_VH_CRUSH) \ @@@ -924,11 -961,14 +963,14 @@@ MULTITEAM_CHOICE##teams(default,challow,prefix,chtype,optiona,optionb) #define MSG_CHOICE_NOTIFICATIONS \ - MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_BROKEN_, 2, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_BROKEN_) \ - MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_TIME_, 2, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_TIME_) \ - MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_UNBROKEN_, 2, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_UNBROKEN_) \ - MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_TEAM, MSG_CENTER, CENTER_CTF_PICKUP_TEAM, CENTER_CTF_PICKUP_TEAM_VERBOSE) \ + MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_BROKEN_, 4, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_BROKEN_) \ + MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_TIME_, 4, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_TIME_) \ + MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_UNBROKEN_, 4, MSG_INFO, INFO_CTF_CAPTURE_, INFO_CTF_CAPTURE_UNBROKEN_) \ + MULTITEAM_CHOICE(1, 2, CHOICE_CTF_PICKUP_TEAM_, 4, MSG_CENTER, CENTER_CTF_PICKUP_TEAM_, CENTER_CTF_PICKUP_TEAM_VERBOSE_) \ + MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_TEAM_NEUTRAL, MSG_CENTER, CENTER_CTF_PICKUP_TEAM_NEUTRAL, CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL) \ MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY, CENTER_CTF_PICKUP_ENEMY_VERBOSE) \ + MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY_NEUTRAL, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY_NEUTRAL, CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE) \ + MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY_TEAM, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY_TEAM, CENTER_CTF_PICKUP_ENEMY_TEAM_VERBOSE) \ MSG_CHOICE_NOTIF(1, 1, CHOICE_FRAG, MSG_CENTER, CENTER_DEATH_MURDER_FRAG, CENTER_DEATH_MURDER_FRAG_VERBOSE) \ MSG_CHOICE_NOTIF(1, 1, CHOICE_FRAGGED, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED, CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \ MSG_CHOICE_NOTIF(1, 1, CHOICE_TYPEFRAG, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAG, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \ @@@ -1020,8 -1060,6 +1062,8 @@@ float autocvar_notification_show_sprees item_centime: amount of time to display weapon message in centerprint item_buffname: return full name of a buff from buffid death_team: show the full name of the team a player is switching from + minigame1_name: return human readable name of a minigame from its id(s1) + minigame1_d: return descriptor name of a minigame from its id(s1) */ const float NOTIF_MAX_ARGS = 7; @@@ -1073,13 -1111,12 +1115,14 @@@ const float ARG_DC = 6; // unique resul ARG_CASE(ARG_CS_SV, "spree_end", (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \ ARG_CASE(ARG_CS_SV, "spree_lost", (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \ ARG_CASE(ARG_CS_SV, "item_wepname", WEP_NAME(f1)) \ - ARG_CASE(ARG_CS_SV, "item_buffname", sprintf("%s%s", rgb_to_hexcolor(Buff_Color(f1)), Buff_PrettyName(f1))) \ + ARG_CASE(ARG_CS_SV, "item_buffname", sprintf("%s%s", rgb_to_hexcolor(BUFFS[f1].m_color), BUFFS[f1].m_prettyName)) \ + ARG_CASE(ARG_CS_SV, "f3buffname", sprintf("%s%s", rgb_to_hexcolor(BUFFS[f3].m_color), BUFFS[f3].m_prettyName)) \ ARG_CASE(ARG_CS_SV, "item_wepammo", (s1 != "" ? sprintf(_(" with %s"), s1) : "")) \ ARG_CASE(ARG_DC, "item_centime", ftos(autocvar_notification_item_centerprinttime)) \ ARG_CASE(ARG_SV, "death_team", Team_ColoredFullName(f1)) \ - ARG_CASE(ARG_CS, "death_team", Team_ColoredFullName(f1 - 1)) + ARG_CASE(ARG_CS, "death_team", Team_ColoredFullName(f1 - 1)) \ + ARG_CASE(ARG_CS_SV_HA, "minigame1_name",find(world,netname,s1).descriptor.message) \ + ARG_CASE(ARG_CS_SV_HA, "minigame1_d", find(world,netname,s1).descriptor.netname) #define NOTIF_HIT_MAX(count,funcname) do { \ if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; } \ @@@ -1308,11 -1345,14 +1351,14 @@@ enum , CPID_MOTD , CPID_NIX , CPID_ONSLAUGHT + , CPID_ONS_CAPSHIELD , CPID_OVERTIME , CPID_POWERUP , CPID_RACE_FINISHLAP , CPID_TEAMCHANGE , CPID_TIMEOUT + , CPID_VEHICLES + , CPID_VEHICLES_OTHER // always last , NOTIF_CPID_COUNT }; @@@ -1326,10 -1366,10 +1372,10 @@@ float NOTIF_CHOICE_COUNT // notification limits -- INCREASE AS NECESSARY const float NOTIF_ANNCE_MAX = 100; - const float NOTIF_INFO_MAX = 300; - const float NOTIF_CENTER_MAX = 200; + const float NOTIF_INFO_MAX = 350; + const float NOTIF_CENTER_MAX = 250; const float NOTIF_MULTI_MAX = 200; - const float NOTIF_CHOICE_MAX = 20; + const float NOTIF_CHOICE_MAX = 30; // notification entities entity msg_annce_notifs[NOTIF_ANNCE_MAX]; @@@ -1471,50 -1511,6 +1517,50 @@@ float notif_global_error } \ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name); +.string nent_iconargs; +#define MULTIICON_INFO(default,name,strnum,flnum,args,hudargs,iconargs,icon,normal,gentle) \ + NOTIF_ADD_AUTOCVAR(name, default) \ + int name; \ + void RegisterNotification_##name() \ + { \ + SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_INFO_COUNT) \ + CHECK_MAX_COUNT(name, NOTIF_INFO_MAX, NOTIF_INFO_COUNT, "MSG_INFO") \ + Create_Notification_Entity( \ + /* COMMON ======================== */ \ + default, /* var_default */ \ + ACVNN(name), /* var_cvar */ \ + MSG_INFO, /* typeid */ \ + name, /* nameid */ \ + strtoupper(#name), /* namestring */ \ + strnum, /* strnum */ \ + flnum, /* flnum */ \ + /* ANNCE =========== */ \ + NO_MSG, /* channel */ \ + "", /* snd */ \ + NO_MSG, /* vol */ \ + NO_MSG, /* position */ \ + /* INFO & CENTER === */ \ + args, /* args */ \ + hudargs, /* hudargs */ \ + icon, /* icon */ \ + NO_MSG, /* cpid */ \ + "", /* durcnt */ \ + normal, /* normal */ \ + gentle, /* gentle */ \ + /* MULTI ============= */ \ + NO_MSG, /* anncename */ \ + NO_MSG, /* infoname */ \ + NO_MSG, /* centername */ \ + /* CHOICE ============== */ \ + NO_MSG, /* challow_def */ \ + NO_MSG, /* challow_var */ \ + NO_MSG, /* chtype */ \ + NO_MSG, /* optiona */ \ + NO_MSG); /* optionb */ \ + msg_info_notifs[name - 1].nent_iconargs = iconargs; \ + } \ + ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name); + #define MSG_CENTER_NOTIF(default,name,strnum,flnum,args,cpid,durcnt,normal,gentle) \ NOTIF_ADD_AUTOCVAR(name, default) \ float name; \ diff --combined qcsrc/server/autocvars.qh index 583fe10a46,9d6c49d2f0..cf1d1fc16c --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@@ -194,6 -194,7 +194,6 @@@ bool autocvar_g_ban_sync_trusted_server string autocvar_g_ban_sync_uri; string autocvar_g_banned_list; bool autocvar_g_banned_list_idmode; -bool autocvar_g_bastet; bool autocvar_g_botclip_collisions; bool autocvar_g_bugrigs; float autocvar_g_ca_damage2score_multiplier; @@@ -237,6 -238,7 +237,7 @@@ float autocvar_g_ctf_throw_velocity_for float autocvar_g_ctf_throw_velocity_up; float autocvar_g_ctf_drop_velocity_up; float autocvar_g_ctf_drop_velocity_side; + bool autocvar_g_ctf_oneflag_reverse; bool autocvar_g_ctf_portalteleport; bool autocvar_g_ctf_pass; float autocvar_g_ctf_pass_arc; @@@ -250,19 -252,18 +251,18 @@@ float autocvar_g_ctf_pass_turnrate float autocvar_g_ctf_pass_timelimit; float autocvar_g_ctf_pass_velocity; bool autocvar_g_ctf_dynamiclights; - string autocvar_g_ctf_flag_blue_model; - int autocvar_g_ctf_flag_blue_skin; float autocvar_g_ctf_flag_collect_delay; float autocvar_g_ctf_flag_damageforcescale; - int autocvar_g_ctf_flag_dropped_waypoint; - float autocvar_g_ctf_flag_dropped_floatinwater; + bool autocvar_g_ctf_flag_dropped_waypoint; + bool autocvar_g_ctf_flag_dropped_floatinwater; bool autocvar_g_ctf_flag_glowtrails; - float autocvar_g_ctf_flag_health; - string autocvar_g_ctf_flag_red_model; - int autocvar_g_ctf_flag_red_skin; + int autocvar_g_ctf_flag_health; + bool autocvar_g_ctf_flag_return; + float autocvar_g_ctf_flag_return_carried_radius; float autocvar_g_ctf_flag_return_time; bool autocvar_g_ctf_flag_return_when_unreachable; float autocvar_g_ctf_flag_return_damage; + float autocvar_g_ctf_flag_return_damage_delay; float autocvar_g_ctf_flag_return_dropped; float autocvar_g_ctf_flagcarrier_auto_helpme_damage; float autocvar_g_ctf_flagcarrier_auto_helpme_time; @@@ -277,7 -278,6 +277,6 @@@ int autocvar_g_ctf_score_capture int autocvar_g_ctf_score_capture_assist; int autocvar_g_ctf_score_kill; int autocvar_g_ctf_score_penalty_drop; - //int autocvar_g_ctf_score_penalty_suicidedrop; int autocvar_g_ctf_score_penalty_returned; int autocvar_g_ctf_score_pickup_base; int autocvar_g_ctf_score_pickup_dropped_early; @@@ -433,11 -433,6 +432,6 @@@ bool autocvar_g_nix_with_powerups bool autocvar_g_nodepthtestitems; bool autocvar_g_nodepthtestplayers; bool autocvar_g_norecoil; - float autocvar_g_onslaught_cp_buildhealth; - float autocvar_g_onslaught_cp_buildtime; - float autocvar_g_onslaught_cp_health; - float autocvar_g_onslaught_cp_regen; - float autocvar_g_onslaught_gen_health; int autocvar_g_pickup_cells_max; int autocvar_g_pickup_plasma_max; int autocvar_g_pickup_fuel_max; @@@ -509,45 -504,10 +503,10 @@@ bool autocvar_g_turrets_nofire bool autocvar_g_turrets_reloadcvars; float autocvar_g_turrets_targetscan_maxdelay; float autocvar_g_turrets_targetscan_mindelay; - float autocvar_g_turrets_unit_ewheel_speed_fast; - float autocvar_g_turrets_unit_ewheel_speed_slow; - float autocvar_g_turrets_unit_ewheel_speed_slower; - float autocvar_g_turrets_unit_ewheel_speed_stop; - float autocvar_g_turrets_unit_ewheel_turnrate; - float autocvar_g_turrets_unit_hellion_std_shot_speed_gain; - float autocvar_g_turrets_unit_hellion_std_shot_speed_max; - float autocvar_g_turrets_unit_hk_std_shot_speed; - float autocvar_g_turrets_unit_hk_std_shot_speed_accel; - float autocvar_g_turrets_unit_hk_std_shot_speed_accel2; - float autocvar_g_turrets_unit_hk_std_shot_speed_decel; - float autocvar_g_turrets_unit_hk_std_shot_speed_max; - float autocvar_g_turrets_unit_hk_std_shot_speed_turnrate; - float autocvar_g_turrets_unit_walker_speed_jump; - float autocvar_g_turrets_unit_walker_speed_roam; - float autocvar_g_turrets_unit_walker_speed_run; - float autocvar_g_turrets_unit_walker_speed_stop; - float autocvar_g_turrets_unit_walker_speed_swim; - float autocvar_g_turrets_unit_walker_speed_walk; - float autocvar_g_turrets_unit_walker_std_meele_dmg; - float autocvar_g_turrets_unit_walker_std_meele_force; - float autocvar_g_turrets_unit_walker_std_meele_range; - float autocvar_g_turrets_unit_walker_std_rocket_dmg; - float autocvar_g_turrets_unit_walker_std_rocket_force; - float autocvar_g_turrets_unit_walker_std_rocket_radius; - float autocvar_g_turrets_unit_walker_std_rocket_refire; - float autocvar_g_turrets_unit_walker_std_rocket_speed; - float autocvar_g_turrets_unit_walker_std_rocket_turnrate; - float autocvar_g_turrets_unit_walker_std_rockets_range; - float autocvar_g_turrets_unit_walker_std_rockets_range_min; - float autocvar_g_turrets_unit_walker_turn; - float autocvar_g_turrets_unit_walker_turn_walk; - float autocvar_g_turrets_unit_walker_turn_run; - float autocvar_g_turrets_unit_walker_turn_strafe; - float autocvar_g_turrets_unit_walker_turn_swim; bool autocvar_g_use_ammunition; bool autocvar_g_waypointeditor; int autocvar_g_waypointeditor_auto; - int autocvar_g_waypoints_for_items; + bool autocvar_g_waypoints_for_items; float autocvar_g_weapon_charge_colormod_blue_full; float autocvar_g_weapon_charge_colormod_blue_half; float autocvar_g_weapon_charge_colormod_green_full; @@@ -584,20 -544,8 +543,8 @@@ float autocvar_skill_auto float autocvar_snd_soundradius; int autocvar_spawn_debug; bool autocvar_speedmeter; - float autocvar_sv_accelerate; float autocvar_sv_accuracy_data_share = 1; string autocvar_sv_adminnick; - float autocvar_sv_airaccel_qw; - float autocvar_sv_airaccel_qw_stretchfactor; - float autocvar_sv_airaccel_sideways_friction; - float autocvar_sv_airaccelerate; - float autocvar_sv_aircontrol; - float autocvar_sv_aircontrol_penalty; - float autocvar_sv_aircontrol_power; - float autocvar_sv_airspeedlimit_nonqw; - float autocvar_sv_airstopaccelerate; - float autocvar_sv_airstrafeaccel_qw; - float autocvar_sv_airstrafeaccelerate; bool autocvar_sv_autoscreenshot; int autocvar_sv_cheats; float autocvar_sv_clientcommand_antispam_time; @@@ -631,12 -579,13 +578,13 @@@ int autocvar_sv_eventlog_files_counter string autocvar_sv_eventlog_files_nameprefix; string autocvar_sv_eventlog_files_namesuffix; bool autocvar_sv_eventlog_files_timestamps; - float autocvar_sv_friction; float autocvar_sv_friction_on_land; + var float autocvar_sv_friction_slick = 0.5; 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; string autocvar_sv_jumpspeedcap_max; float autocvar_sv_jumpspeedcap_max_disable_on_ramps; string autocvar_sv_jumpspeedcap_min; @@@ -647,7 -596,6 +595,6 @@@ bool autocvar_sv_logscores_file string autocvar_sv_logscores_filename; float autocvar_sv_mapchange_delay; float autocvar_sv_maxairspeed; - float autocvar_sv_maxairstrafespeed; float autocvar_sv_maxspeed; string autocvar_sv_motd; bool autocvar_sv_precacheplayermodels; @@@ -661,7 -609,6 +608,6 @@@ int autocvar_sv_spectate float autocvar_sv_spectator_speed_multiplier; bool autocvar_sv_status_privacy; float autocvar_sv_stepheight; - float autocvar_sv_stopspeed; float autocvar_sv_strengthsound_antispam_refire_threshold; float autocvar_sv_strengthsound_antispam_time; bool autocvar_sv_teamnagger; @@@ -695,11 -642,6 +641,6 @@@ float autocvar_sv_vote_stop float autocvar_sv_vote_timeout; float autocvar_sv_vote_wait; bool autocvar_sv_vote_gamestart; - float autocvar_sv_warsowbunny_accel; - float autocvar_sv_warsowbunny_airforwardaccel; - float autocvar_sv_warsowbunny_backtosideratio; - float autocvar_sv_warsowbunny_topspeed; - float autocvar_sv_warsowbunny_turnaccel; float autocvar_sv_waypointsprite_deadlifetime; float autocvar_sv_waypointsprite_deployed_lifetime; float autocvar_sv_waypointsprite_limitedrange; @@@ -719,7 -661,8 +660,8 @@@ int autocvar_timelimit_overtimes float autocvar_timelimit_suddendeath; #define autocvar_utf8_enable cvar("utf8_enable") bool autocvar_waypoint_benchmark; - bool autocvar_sv_gameplayfix_gravityunaffectedbyticrate; + float autocvar_sv_gameplayfix_gravityunaffectedbyticrate; + bool autocvar_sv_gameplayfix_upwardvelocityclearsongroundflag; float autocvar_g_trueaim_minrange; bool autocvar_g_debug_defaultsounds; float autocvar_g_grab_range; @@@ -851,8 -794,36 +793,36 @@@ float autocvar_g_spawn_near_teammate_di bool autocvar_g_spawn_near_teammate_ignore_spawnpoint; float autocvar_g_spawn_near_teammate_ignore_spawnpoint_delay; float autocvar_g_spawn_near_teammate_ignore_spawnpoint_delay_death; + float autocvar_g_onslaught_debug; + float autocvar_g_onslaught_teleport_wait; + bool autocvar_g_onslaught_spawn_at_controlpoints; + bool autocvar_g_onslaught_spawn_at_generator; + float autocvar_g_onslaught_cp_proxydecap; + float autocvar_g_onslaught_cp_proxydecap_distance = 512; + float autocvar_g_onslaught_cp_proxydecap_dps = 100; + float autocvar_g_onslaught_spawn_at_controlpoints_chance = 0.5; + float autocvar_g_onslaught_spawn_at_controlpoints_random; + float autocvar_g_onslaught_spawn_at_generator_chance; + float autocvar_g_onslaught_spawn_at_generator_random; + float autocvar_g_onslaught_cp_buildhealth; + float autocvar_g_onslaught_cp_buildtime; + float autocvar_g_onslaught_cp_health; + float autocvar_g_onslaught_cp_regen; + float autocvar_g_onslaught_gen_health; + float autocvar_g_onslaught_shield_force = 100; + float autocvar_g_onslaught_allow_vehicle_touch; + float autocvar_g_onslaught_round_timelimit; + float autocvar_g_onslaught_point_limit; + float autocvar_g_onslaught_warmup; + float autocvar_g_onslaught_teleport_radius; + float autocvar_g_onslaught_spawn_choose; + float autocvar_g_onslaught_click_radius; int autocvar_g_spawn_near_teammate_ignore_spawnpoint_check_health; bool autocvar_g_spawn_near_teammate_ignore_spawnpoint_closetodeath; + bool autocvar_g_physics_clientselect; + string autocvar_g_physics_clientselect_options; + string autocvar_g_physics_clientselect_default; + bool autocvar_g_buffs_effects; float autocvar_g_buffs_waypoint_distance; bool autocvar_g_buffs_randomize; float autocvar_g_buffs_random_lifetime; @@@ -871,17 -842,25 +841,27 @@@ float autocvar_g_buffs_medic_regen float autocvar_g_buffs_vengeance_damage_multiplier; float autocvar_g_buffs_bash_force; float autocvar_g_buffs_bash_force_self; - float autocvar_g_buffs_disability_time; + float autocvar_g_buffs_disability_slowtime; float autocvar_g_buffs_disability_speed; float autocvar_g_buffs_disability_rate; + float autocvar_g_buffs_disability_weaponspeed; float autocvar_g_buffs_speed_speed; float autocvar_g_buffs_speed_rate; + float autocvar_g_buffs_speed_weaponspeed; float autocvar_g_buffs_speed_damage_take; float autocvar_g_buffs_speed_regen; float autocvar_g_buffs_vampire_damage_steal; float autocvar_g_buffs_invisible_alpha; float autocvar_g_buffs_flight_gravity; float autocvar_g_buffs_jump_height; +bool autocvar_sv_minigames; +bool autocvar_sv_minigames_observer; + float autocvar_g_buffs_inferno_burntime_factor; + float autocvar_g_buffs_inferno_burntime_min_time; + float autocvar_g_buffs_inferno_burntime_target_damage; + float autocvar_g_buffs_inferno_burntime_target_time; + float autocvar_g_buffs_inferno_damagemultiplier; + float autocvar_g_buffs_swapper_range; + float autocvar_g_buffs_magnet_range_item; + float autocvar_sv_player_scale; #endif diff --combined qcsrc/server/cl_client.qc index 8813456a35,9a832efd4d..ee3fc76ffb --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@@ -6,17 -6,14 +6,14 @@@ #include "cl_impulse.qh" #include "cl_player.qh" #include "ent_cs.qh" - #include "g_subs.qh" #include "ipban.qh" #include "miscfunctions.qh" #include "portals.qh" #include "teamplay.qh" #include "playerdemo.qh" - #include "secret.qh" #include "spawnpoints.qh" #include "g_damage.qh" #include "g_hook.qh" - #include "t_teleporters.qh" #include "command/common.qh" #include "cheats.qh" #include "g_world.qh" @@@ -28,15 -25,20 +25,22 @@@ #include "bot/bot.qh" #include "bot/navigation.qh" - #include "vehicles/vehicle.qh" + #include "../common/vehicles/all.qh" #include "weapons/hitplot.qh" #include "weapons/weaponsystem.qh" #include "../common/net_notice.qh" + #include "../common/physics.qh" + + #include "../common/items/all.qc" + + #include "../common/triggers/subs.qh" + #include "../common/triggers/triggers.qh" + #include "../common/triggers/trigger/secret.qh" +#include "../common/minigames/sv_minigames.qh" + #include "../common/items/inventory.qh" #include "../common/monsters/sv_monsters.qh" @@@ -186,7 -188,7 +190,7 @@@ void PutObserverInServer (void entity spot; self.hud = HUD_NORMAL; - if(IS_PLAYER(self)) { pointparticles(particleeffectnum("spawn_event_neutral"), self.origin, '0 0 0', 1); } + if(IS_PLAYER(self)) { Send_Effect("spawn_event_neutral", self.origin, '0 0 0', 1); } spot = SelectSpawnPoint (true); if(!spot) @@@ -216,7 -218,7 +220,7 @@@ } if(self.vehicle) - vehicles_exit(VHEF_RELESE); + vehicles_exit(VHEF_RELEASE); WaypointSprite_PlayerDead(); @@@ -226,7 -228,8 +230,8 @@@ if(self.killcount != -666) { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_SPECTATE, self.netname); - if(autocvar_g_chat_nospectators == 1 || (cvar("g_warmup") && !(warmup_stage || gameover) && autocvar_g_chat_nospectators == 2)) + if(!intermission_running) + if(autocvar_g_chat_nospectators == 1 || (!(warmup_stage || gameover) && autocvar_g_chat_nospectators == 2)) Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_CHAT_NOSPECTATORS); if(self.just_joined == false) { @@@ -420,7 -423,7 +425,7 @@@ void PutClientInServer (void // reset player keys self.itemkeys = 0; - MUTATOR_CALLHOOK(PutClientInServer); + MUTATOR_CALLHOOK(PutClientInServer, self); if(gameover) self.classname = "observer"; @@@ -443,9 -446,6 +448,6 @@@ RemoveGrapplingHook(self); // Wazat's Grappling Hook - if(self.vehicle) - vehicles_exit(VHEF_RELESE); - self.classname = "player"; self.wasplayer = true; self.iscreature = true; @@@ -534,7 -534,7 +536,7 @@@ self.respawn_flags = 0; self.respawn_time = 0; self.stat_respawn_time = 0; - self.scale = 0; + self.scale = autocvar_sv_player_scale; self.fade_time = 0; self.pain_frame = 0; self.pain_finished = 0; @@@ -639,8 -639,7 +641,7 @@@ Unfreeze(self); - spawn_spot = spot; - MUTATOR_CALLHOOK(PlayerSpawn); + MUTATOR_CALLHOOK(PlayerSpawn, spot); if(autocvar_spawn_debug) { @@@ -814,7 -813,7 +815,7 @@@ void ClientKill_Now( { if(self.vehicle) { - vehicles_exit(VHEF_RELESE); + vehicles_exit(VHEF_RELEASE); if(!self.killindicator_teamchange) { self.vehicle_health = -1; @@@ -1275,7 -1274,7 +1276,7 @@@ void ClientConnect (void self = oldself; } - MUTATOR_CALLHOOK(ClientConnect); + MUTATOR_CALLHOOK(ClientConnect, self); } /* ============= @@@ -1289,7 -1288,7 +1290,7 @@@ void ReadyCount() void ClientDisconnect (void) { if(self.vehicle) - vehicles_exit(VHEF_RELESE); + vehicles_exit(VHEF_RELEASE); if (!IS_CLIENT(self)) { @@@ -1299,10 -1298,7 +1300,10 @@@ PlayerStats_GameReport_FinalizePlayer(self); + if ( self.active_minigame ) + part_minigame(self); + - if(IS_PLAYER(self)) { pointparticles(particleeffectnum("spawn_event_neutral"), self.origin, '0 0 0', 1); } + if(IS_PLAYER(self)) { Send_Effect("spawn_event_neutral", self.origin, '0 0 0', 1); } CheatShutdownClient(); @@@ -1380,20 -1376,14 +1381,20 @@@ void ChatBubbleThink( remove(self); return; } - if ((self.owner.BUTTON_CHAT && !self.owner.deadflag) -#ifdef TETRIS - || self.owner.tetris_on -#endif - ) - self.model = self.mdl; - else - self.model = ""; + + self.mdl = ""; + + if ( !self.owner.deadflag && IS_PLAYER(self.owner) ) + { + if ( self.owner.active_minigame ) + self.mdl = "models/sprites/minigame_busy.iqm"; + else if ( self.owner.BUTTON_CHAT ) + self.mdl = "models/misc/chatbubble.spr"; + } + + if ( self.model != self.mdl ) + setmodel(self, self.mdl); + } void UpdateChatBubble() @@@ -1410,10 -1400,10 +1411,10 @@@ self.chatbubbleentity.nextthink = time; setmodel(self.chatbubbleentity, "models/misc/chatbubble.spr"); // precision set below //setorigin(self.chatbubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1'); - setorigin(self.chatbubbleentity, '0 0 15' + self.maxs.z * '0 0 1'); + setorigin(self.chatbubbleentity, '0 0 15' + self.maxs_z * '0 0 1'); setattachment(self.chatbubbleentity, self, ""); // sticks to moving player better, also conserves bandwidth self.chatbubbleentity.mdl = self.chatbubbleentity.model; - self.chatbubbleentity.model = ""; + //self.chatbubbleentity.model = ""; self.chatbubbleentity.effects = EF_LOWPRECISION; } } @@@ -1445,7 -1435,7 +1446,7 @@@ void respawn(void self.velocity = '0 0 1' * autocvar_g_respawn_ghosts_speed; self.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3; self.effects |= CSQCMODEL_EF_RESPAWNGHOST; - pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1); + Send_Effect("respawn_ghost", self.origin, '0 0 0', 1); if(autocvar_g_respawn_ghosts_maxtime) SUB_SetFade (self, time + autocvar_g_respawn_ghosts_maxtime / 2 + random () * (autocvar_g_respawn_ghosts_maxtime - autocvar_g_respawn_ghosts_maxtime / 2), 1.5); } @@@ -1467,7 -1457,7 +1468,7 @@@ void play_countdown(float finished, str void player_powerups (void) { // add a way to see what the items were BEFORE all of these checks for the mutator hook - olditems = self.items; + int items_prev = self.items; if((self.items & IT_USING_JETPACK) && !self.deadflag && !gameover) self.modelflags |= MF_ROCKET; @@@ -1484,13 -1474,13 +1485,13 @@@ if (!g_instagib) { - if (self.items & IT_STRENGTH) + if (self.items & ITEM_Strength.m_itemid) { play_countdown(self.strength_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT); if (time > self.strength_finished) { - self.items = self.items - (self.items & IT_STRENGTH); + self.items = self.items - (self.items & ITEM_Strength.m_itemid); //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_STRENGTH, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_STRENGTH); } @@@ -1499,18 -1489,18 +1500,18 @@@ { if (time < self.strength_finished) { - self.items = self.items | IT_STRENGTH; + self.items = self.items | ITEM_Strength.m_itemid; Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_STRENGTH, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_STRENGTH); } } - if (self.items & IT_INVINCIBLE) + if (self.items & ITEM_Shield.m_itemid) { play_countdown(self.invincible_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT); if (time > self.invincible_finished) { - self.items = self.items - (self.items & IT_INVINCIBLE); + self.items = self.items - (self.items & ITEM_Shield.m_itemid); //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_SHIELD, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SHIELD); } @@@ -1519,7 -1509,7 +1520,7 @@@ { if (time < self.invincible_finished) { - self.items = self.items | IT_INVINCIBLE; + self.items = self.items | ITEM_Shield.m_itemid; Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SHIELD, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SHIELD); } @@@ -1579,7 -1569,7 +1580,7 @@@ if (time < self.spawnshieldtime) self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT); - MUTATOR_CALLHOOK(PlayerPowerups); + MUTATOR_CALLHOOK(PlayerPowerups, self, items_prev); } float CalcRegen(float current, float stable, float regenfactor, float regenframetime) @@@ -1631,11 -1621,7 +1632,7 @@@ void player_regen (void { float max_mod, regen_mod, rot_mod, limit_mod; max_mod = regen_mod = rot_mod = limit_mod = 1; - regen_mod_max = max_mod; - regen_mod_regen = regen_mod; - regen_mod_rot = rot_mod; - regen_mod_limit = limit_mod; - if(!MUTATOR_CALLHOOK(PlayerRegen)) + if(!MUTATOR_CALLHOOK(PlayerRegen, max_mod, regen_mod, rot_mod, limit_mod)) if(!self.frozen) { float minh, mina, maxh, maxa, limith, limita; @@@ -1663,7 -1649,11 +1660,11 @@@ // if player rotted to death... die! // check this outside above checks, as player may still be able to rot to death if(self.health < 1) + { + if(self.vehicle) + vehicles_exit(VHEF_RELEASE); self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0'); + } if (!(self.items & IT_UNLIMITED_WEAPON_AMMO)) { @@@ -1673,7 -1663,7 +1674,7 @@@ minf = autocvar_g_balance_fuel_regenstable; limitf = autocvar_g_balance_fuel_limit; - self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, frametime * (time > self.pauseregen_finished) * ((self.items & IT_FUEL_REGEN) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > self.pauserotfuel_finished), limitf); + self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, frametime * (time > self.pauseregen_finished) * ((self.items & ITEM_JetpackRegen.m_itemid) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > self.pauserotfuel_finished), limitf); } } @@@ -1690,55 -1680,17 +1691,17 @@@ void SetZoomState(float z void GetPressedKeys(void) { MUTATOR_CALLHOOK(GetPressedKeys); - if (self.movement.x > 0) // get if movement keys are pressed - { // forward key pressed - self.pressedkeys |= KEY_FORWARD; - self.pressedkeys &= ~KEY_BACKWARD; - } - else if (self.movement.x < 0) - { // backward key pressed - self.pressedkeys |= KEY_BACKWARD; - self.pressedkeys &= ~KEY_FORWARD; - } - else - { // no x input - self.pressedkeys &= ~KEY_FORWARD; - self.pressedkeys &= ~KEY_BACKWARD; - } - - if (self.movement.y > 0) - { // right key pressed - self.pressedkeys |= KEY_RIGHT; - self.pressedkeys &= ~KEY_LEFT; - } - else if (self.movement.y < 0) - { // left key pressed - self.pressedkeys |= KEY_LEFT; - self.pressedkeys &= ~KEY_RIGHT; - } - else - { // no y input - self.pressedkeys &= ~KEY_RIGHT; - self.pressedkeys &= ~KEY_LEFT; - } - - if (self.BUTTON_JUMP) // get if jump and crouch keys are pressed - self.pressedkeys |= KEY_JUMP; - else - self.pressedkeys &= ~KEY_JUMP; - if (self.BUTTON_CROUCH) - self.pressedkeys |= KEY_CROUCH; - else - self.pressedkeys &= ~KEY_CROUCH; - - if (self.BUTTON_ATCK) - self.pressedkeys |= KEY_ATCK; - else - self.pressedkeys &= ~KEY_ATCK; - if (self.BUTTON_ATCK2) - self.pressedkeys |= KEY_ATCK2; - else - self.pressedkeys &= ~KEY_ATCK2; + #define X(var,bit,flag) (flag ? var |= bit : var &= ~bit) + X(self.pressedkeys, KEY_FORWARD, self.movement_x > 0); + X(self.pressedkeys, KEY_BACKWARD, self.movement_x < 0); + X(self.pressedkeys, KEY_RIGHT, self.movement_y > 0); + X(self.pressedkeys, KEY_LEFT, self.movement_y < 0); + + X(self.pressedkeys, KEY_JUMP, PHYS_INPUT_BUTTON_JUMP(self)); + X(self.pressedkeys, KEY_CROUCH, PHYS_INPUT_BUTTON_CROUCH(self)); + X(self.pressedkeys, KEY_ATCK, PHYS_INPUT_BUTTON_ATCK(self)); + X(self.pressedkeys, KEY_ATCK2, PHYS_INPUT_BUTTON_ATCK2(self)); + #undef X } /* @@@ -1748,8 -1700,7 +1711,7 @@@ spectate mode routine */ void SpectateCopy(entity spectatee) { - other = spectatee; - MUTATOR_CALLHOOK(SpectateCopy); + MUTATOR_CALLHOOK(SpectateCopy, spectatee, self); self.armortype = spectatee.armortype; self.armorvalue = spectatee.armorvalue; self.ammo_cells = spectatee.ammo_cells; @@@ -2135,11 -2086,6 +2097,11 @@@ void PrintWelcomeMessage( void ObserverThink() { + if ( self.impulse ) + { + MinigameImpulse(self.impulse); + self.impulse = 0; + } float prefered_movetype; if (self.flags & FL_JUMPRELEASED) { if (self.BUTTON_JUMP && !self.version_mismatch) { @@@ -2170,11 -2116,6 +2132,11 @@@ void SpectatorThink() { + if ( self.impulse ) + { + if(MinigameImpulse(self.impulse)) + self.impulse = 0; + } if (self.flags & FL_JUMPRELEASED) { if (self.BUTTON_JUMP && !self.version_mismatch) { self.flags &= ~FL_JUMPRELEASED; @@@ -2222,6 -2163,7 +2184,7 @@@ self.flags |= FL_CLIENT | FL_NOTARGET; } + void vehicles_enter (entity pl, entity veh); void PlayerUseKey() { if (!IS_PLAYER(self)) @@@ -2229,8 -2171,41 +2192,41 @@@ if(self.vehicle) { - vehicles_exit(VHEF_NORMAL); - return; + if(!gameover) + { + vehicles_exit(VHEF_NORMAL); + return; + } + } + else if(autocvar_g_vehicles_enter) + { + if(!self.frozen) + if(self.deadflag == DEAD_NO) + if(!gameover) + { + entity head, closest_target = world; + head = WarpZone_FindRadius(self.origin, autocvar_g_vehicles_enter_radius, TRUE); + + while(head) // find the closest acceptable target to enter + { + if(head.vehicle_flags & VHF_ISVEHICLE) + if(head.deadflag == DEAD_NO) + if(!head.owner || ((head.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(head.owner, self))) + if(head.takedamage != DAMAGE_NO) + { + if(closest_target) + { + if(vlen(self.origin - head.origin) < vlen(self.origin - closest_target.origin)) + { closest_target = head; } + } + else { closest_target = head; } + } + + head = head.chain; + } + + if(closest_target) { vehicles_enter(self, closest_target); return; } + } } // a use key was pressed; call handlers @@@ -2273,6 -2248,7 +2269,7 @@@ Called every frame for each client befo */ .float usekeypressed; void() nexball_setstatus; + .float last_vehiclecheck; .int items_added; void PlayerPreThink (void) { @@@ -2283,6 -2259,8 +2280,8 @@@ self.stat_allow_oldvortexbeam = autocvar_g_allow_oldvortexbeam; self.stat_leadlimit = autocvar_leadlimit; + self.weaponsinmap = weaponsInMap; + if(frametime) { // physics frames: update anticheat stuff @@@ -2355,6 -2333,11 +2354,6 @@@ self.max_armorvalue = 0; } -#ifdef TETRIS - if (TetrisPreFrame()) - return; -#endif - if(self.frozen == 2) { self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1); @@@ -2372,7 -2355,7 +2371,7 @@@ if(self.health < 1) { if(self.vehicle) - vehicles_exit(VHEF_RELESE); + vehicles_exit(VHEF_RELEASE); self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE, self.origin, '0 0 0'); } else if ( self.revive_progress <= 0 ) @@@ -2381,6 -2364,30 +2380,30 @@@ MUTATOR_CALLHOOK(PlayerPreThink); + if(autocvar_g_vehicles_enter) + if(time > self.last_vehiclecheck) + if(IS_PLAYER(self)) + if(!gameover) + if(!self.frozen) + if(!self.vehicle) + if(self.deadflag == DEAD_NO) + { + entity veh; + for(veh = world; (veh = findflags(veh, vehicle_flags, VHF_ISVEHICLE)); ) + if(vlen(veh.origin - self.origin) < autocvar_g_vehicles_enter_radius) + if(veh.deadflag == DEAD_NO) + if(veh.takedamage != DAMAGE_NO) + if((veh.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(veh.owner, self)) + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER_GUNNER); + else if(!veh.owner) + if(!veh.team || SAME_TEAM(self, veh)) + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER); + else if(autocvar_g_vehicles_steal) + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER_STEAL); + + self.last_vehiclecheck = time + 1; + } + if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button { if(self.BUTTON_USE && !self.usekeypressed) @@@ -2412,7 -2419,7 +2435,7 @@@ if(frametime) { - if(self.weapon == WEP_VORTEX && WEP_CVAR(vortex, charge)) + if(self.weapon == WEP_VORTEX.m_id && WEP_CVAR(vortex, charge)) { self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.vortex_charge / WEP_CVAR(vortex, charge_animlimit)); self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.vortex_charge / WEP_CVAR(vortex, charge_animlimit)); @@@ -2508,7 -2515,7 +2531,7 @@@ // WEAPONTODO: THIS SHIT NEEDS TO GO EVENTUALLY // It cannot be predicted by the engine! - if((self.weapon == WEP_SHOCKWAVE || self.weapon == WEP_SHOTGUN) && self.weaponentity.wframe == WFRAME_FIRE2 && time < self.weapon_nextthink) + if((self.weapon == WEP_SHOCKWAVE.m_id || self.weapon == WEP_SHOTGUN.m_id) && self.weaponentity.wframe == WFRAME_FIRE2 && time < self.weapon_nextthink) do_crouch = 0; if (do_crouch) @@@ -2516,8 -2523,8 +2539,8 @@@ if (!self.crouch) { self.crouch = true; - self.view_ofs = PL_CROUCH_VIEW_OFS; - setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); + self.view_ofs = self.stat_pl_crouch_view_ofs; + setsize (self, self.stat_pl_crouch_min, self.stat_pl_crouch_max); // setanim(self, self.anim_duck, false, true, true); // this anim is BROKEN anyway } } @@@ -2525,12 -2532,12 +2548,12 @@@ { if (self.crouch) { - tracebox(self.origin, PL_MIN, PL_MAX, self.origin, false, self); + tracebox(self.origin, self.stat_pl_min, self.stat_pl_max, self.origin, false, self); if (!trace_startsolid) { self.crouch = false; - self.view_ofs = PL_VIEW_OFS; - setsize (self, PL_MIN, PL_MAX); + self.view_ofs = self.stat_pl_view_ofs; + setsize (self, self.stat_pl_min, self.stat_pl_max); } } } @@@ -2547,8 -2554,8 +2570,8 @@@ W_WeaponFrame(); self.items_added = 0; - if(self.items & IT_JETPACK) - if(self.items & IT_FUEL_REGEN || self.ammo_fuel >= 0.01) + if(self.items & ITEM_Jetpack.m_itemid) + if(self.items & ITEM_JetpackRegen.m_itemid || self.ammo_fuel >= 0.01) self.items_added |= IT_FUEL; self.items |= self.items_added; @@@ -2585,7 -2592,7 +2608,7 @@@ // WEAPONTODO: Add weapon request for this if(!zoomstate_set) - SetZoomState(self.BUTTON_ZOOM || self.BUTTON_ZOOMSCRIPT || (self.BUTTON_ATCK2 && self.weapon == WEP_VORTEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_RIFLE && WEP_CVAR(rifle, secondary) == 0)); // WEAPONTODO + SetZoomState(self.BUTTON_ZOOM || self.BUTTON_ZOOMSCRIPT || (self.BUTTON_ATCK2 && self.weapon == WEP_VORTEX.m_id) || (self.BUTTON_ATCK2 && self.weapon == WEP_RIFLE.m_id && WEP_CVAR(rifle, secondary) == 0)); // WEAPONTODO float oldspectatee_status; oldspectatee_status = self.spectatee_status; @@@ -2676,6 -2683,13 +2699,6 @@@ void PlayerPostThink (void } } -#ifdef TETRIS - if(self.impulse == 100) - ImpulseCommands(); - if (!TetrisPostFrame()) - { -#endif - CheatFrame(); //CheckPlayerJump(); @@@ -2690,6 -2704,10 +2713,6 @@@ GetPressedKeys(); } -#ifdef TETRIS - } -#endif - /* float i; for(i = 0; i < 1000; ++i) diff --combined qcsrc/server/cl_impulse.qc index 77b70053d8,45708409c5..64fb50df83 --- a/qcsrc/server/cl_impulse.qc +++ b/qcsrc/server/cl_impulse.qc @@@ -10,11 -10,8 +10,10 @@@ #include "weapons/selection.qh" #include "weapons/tracing.qh" #include "weapons/weaponsystem.qh" - #include "vehicles/vehicle.qh" #include "waypointsprites.qh" +#include "../common/minigames/sv_minigames.qh" + #include "../common/weapons/all.qh" /* @@@ -65,10 -62,6 +64,10 @@@ void ImpulseCommands (void return; self.impulse = 0; + if ( self.active_minigame ) + if ( MinigameImpulse(imp) ) + return; + // allow only weapon change impulses when not in round time if(round_handler_IsActive() && !round_handler_IsRoundStarted()) if(imp == 17 || (imp >= 20 && imp < 200) || imp > 253) @@@ -77,11 -70,15 +76,15 @@@ if (timeout_status == TIMEOUT_ACTIVE) //don't allow any impulses while the game is paused return; - if(self.vehicle) - if(self.vehicle.deadflag == DEAD_NO) - if(self.vehicle.vehicles_impulse) - if(self.vehicle.vehicles_impulse(imp)) - return; + if(self.vehicle) + if(self.vehicle.deadflag == DEAD_NO) + { + if(self.vehicle.vehicles_impulse) + if(self.vehicle.vehicles_impulse(imp)) + return; + if(vehicle_impulse(imp)) + return; + } if(CheatImpulse(imp)) { @@@ -96,6 -93,7 +99,7 @@@ } else if(imp >= 10 && imp <= 20) { + if(!self.vehicle) if(self.deadflag == DEAD_NO) { switch(imp) @@@ -131,7 -129,7 +135,7 @@@ W_PreviousWeapon(1); break; case 20: - if(!forbidWeaponUse()) { WEP_ACTION(self.weapon, WR_RELOAD); } + if(!forbidWeaponUse(self)) { WEP_ACTION(self.weapon, WR_RELOAD); } break; } } @@@ -144,6 -142,7 +148,7 @@@ } else if(imp >= 200 && imp <= 229) { + if(!self.vehicle) if(self.deadflag == DEAD_NO) { // custom order weapon cycling @@@ -156,6 -155,7 +161,7 @@@ } else if(imp >= 230 && imp <= 253) { + if(!self.vehicle) if(self.deadflag == DEAD_NO) W_SwitchWeapon (imp - 230 + WEP_FIRST); else @@@ -192,7 -192,7 +198,7 @@@ case 33: if(self.deadflag == DEAD_NO && teamplay) { - if (!MUTATOR_CALLHOOK(HelpMePing)) + if (!MUTATOR_CALLHOOK(HelpMePing, self)) { wp = WaypointSprite_Attach("helpme", true, RADARICON_HELPME, '1 0.5 0'); if(!wp) @@@ -404,4 -404,8 +410,4 @@@ } } } -#ifdef TETRIS - else if(imp == 100) - TetrisImpulse(); -#endif } diff --combined qcsrc/server/cl_player.qc index 3f10caa8d7,e3bb91e395..46d1b2cbd0 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@@ -5,7 -5,6 +5,6 @@@ #include "cheats.qh" #include "g_damage.qh" #include "g_subs.qh" - #include "g_triggers.qh" #include "g_violence.qh" #include "miscfunctions.qh" #include "portals.qh" @@@ -16,13 -15,14 +15,16 @@@ #include "../common/animdecide.qh" #include "../common/csqcmodel_settings.qh" #include "../common/deathtypes.qh" + #include "../common/triggers/subs.qh" #include "../common/playerstats.qh" #include "../csqcmodellib/sv_model.qh" +#include "../common/minigames/sv_minigames.qh" + #include "weapons/weaponstats.qh" + #include "../common/animdecide.qh" + void CopyBody_Think(void) { if(self.CopyBody_nextthink && time > self.CopyBody_nextthink) @@@ -322,7 -322,7 +324,7 @@@ void PlayerDamage (entity inflictor, en damage /= sqrt(bound(1.0, attacker.cvar_cl_handicap, 100.0)); } - if(DEATH_ISWEAPON(deathtype, WEP_TUBA)) + if(DEATH_ISWEAPON(deathtype, WEP_TUBA.m_id)) { // tuba causes blood to come out of the ears vector ear1, ear2; @@@ -385,14 -385,8 +387,8 @@@ self.istypefrag = 0; } - frag_inflictor = inflictor; - frag_attacker = attacker; - frag_target = self; frag_damage = damage; - damage_take = take; - damage_save = save; - damage_force = force; - MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor); + MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor, inflictor, attacker, self, force, take, save); take = bound(0, damage_take, self.health); save = bound(0, damage_save, self.armorvalue); excess = max(0, damage - take - save); @@@ -498,6 -492,7 +494,7 @@@ dh = dh - max(self.health, 0); da = da - max(self.armorvalue, 0); WeaponStats_LogDamage(awep, abot, self.weapon, vbot, dh + da); + MUTATOR_CALLHOOK(PlayerDamaged, attacker, self, dh, da, hitloc); } if (self.health < 1) @@@ -535,7 -530,7 +532,7 @@@ if(deathtype == DEATH_KILL) { // for the lemmings fans, a small harmless explosion - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); + Send_Effect("rocket_explode", self.origin, '0 0 0', 1); } } @@@ -549,11 -544,7 +546,7 @@@ if(accuracy_isgooddamage(attacker, self)) attacker.accuracy.(accuracy_frags[w-1]) += 1; - frag_attacker = attacker; - frag_inflictor = inflictor; - frag_target = self; - frag_deathtype = deathtype; - MUTATOR_CALLHOOK(PlayerDies); + MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, self, deathtype); WEP_ACTION(self.weapon, WR_PLAYERDEATH); @@@ -878,15 -869,6 +871,15 @@@ float Say(entity source, float teamsay if(cmsgstr != "") centerprint(privatesay, cmsgstr); } + else if ( teamsay && source.active_minigame ) + { + sprint(source, sourcemsgstr); + dedicated_print(msgstr); // send to server console too + FOR_EACH_REALCLIENT(head) + if(head != source) + if(head.active_minigame == source.active_minigame) + sprint(head, msgstr); + } else if(teamsay > 0) // team message, only sent to team mates { sprint(source, sourcemsgstr); diff --combined qcsrc/server/command/cmd.qc index 9333f06b58,c6d122eed3..24187b172f --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@@ -8,7 -8,6 +8,6 @@@ #include "../campaign.qh" #include "../cheats.qh" #include "../cl_player.qh" - #include "../g_triggers.qh" #include "../ipban.qh" #include "../mapvoting.qh" #include "../scores.qh" @@@ -17,7 -16,7 +16,7 @@@ #include "../mutators/mutators_include.qh" #ifdef SVQC - #include "../vehicles/vehicle.qh" + #include "../../common/vehicles/all.qh" #endif #include "../../common/constants.qh" @@@ -27,7 -26,7 +26,7 @@@ #include "../../common/teams.qh" #include "../../common/util.qh" - #include "../../common/monsters/all.qh" + #include "../../common/monsters/all.qc" #include "../../common/monsters/spawn.qh" #include "../../common/monsters/sv_monsters.qh" @@@ -233,14 -232,14 +232,14 @@@ void ClientCommand_mobedit(float reques WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 100, MOVE_NORMAL, self); if(!autocvar_g_monsters_edit) { sprint(self, "Monster property editing is not enabled.\n"); return; } - if(trace_ent.flags & FL_MONSTER) + if(IS_MONSTER(trace_ent)) { if(trace_ent.realowner != self) { sprint(self, "That monster does not belong to you.\n"); return; } switch(argv(1)) { case "skin": { - if(trace_ent.monsterid != MON_MAGE) + if(trace_ent.monsterid != MON_MAGE.monsterid) trace_ent.skin = stof(argv(2)); return; } @@@ -274,7 -273,7 +273,7 @@@ void ClientCommand_mobkill(float reques makevectors(self.v_angle); WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 100, MOVE_NORMAL, self); - if(trace_ent.flags & FL_MONSTER) + if(IS_MONSTER(trace_ent)) { if(trace_ent.realowner != self) { @@@ -378,6 -377,46 +377,46 @@@ void ClientCommand_mobspawn(float reque } } + void ClientCommand_physics(float request, float argc) + { + switch(request) + { + case CMD_REQUEST_COMMAND: + { + string command = strtolower(argv(1)); + + if(!autocvar_g_physics_clientselect) + { + sprint(self, "Client physics selection is currently disabled.\n"); + return; + } + + if(command == "list" || command == "help") + { + sprint(self, strcat("Available physics sets: \n\n", autocvar_g_physics_clientselect_options, " default\n")); + return; + } + + if(Physics_Valid(command) || command == "default") + { + stuffcmd(self, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n")); + sprint(self, strcat("^2Physics set successfully changed to ^3", command, "\n")); + return; + } + } + + default: + sprint(self, strcat("Current physics set: ^3", self.cvar_cl_physics, "\n")); + case CMD_REQUEST_USAGE: + { + sprint(self, "\nUsage:^3 cmd physics \n"); + sprint(self, " See 'cmd physics list' for available physics sets.\n"); + sprint(self, " Argument 'default' resets to standard physics.\n"); + return; + } + } + } + void ClientCommand_ready(float request) // todo: anti-spam for toggling readyness { switch(request) @@@ -770,6 -809,7 +809,7 @@@ void ClientCommand_(float request CLIENT_COMMAND("mobedit", ClientCommand_mobedit(request, arguments), "Edit your monster's properties") \ CLIENT_COMMAND("mobkill", ClientCommand_mobkill(request), "Kills your monster") \ CLIENT_COMMAND("mobspawn", ClientCommand_mobspawn(request, arguments), "Spawn monsters infront of yourself") \ + CLIENT_COMMAND("physics", ClientCommand_physics(request, arguments), "Change physics set") \ CLIENT_COMMAND("ready", ClientCommand_ready(request), "Qualify as ready to end warmup stage (or restart server if allowed)") \ CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \ CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command), "Print a message to chat to all team mates") \ @@@ -780,7 -820,6 +820,7 @@@ CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments), "Suggest a map to the mapvote at match end") \ CLIENT_COMMAND("tell", ClientCommand_tell(request, arguments, command), "Send a message directly to a player") \ CLIENT_COMMAND("voice", ClientCommand_voice(request, arguments, command), "Send voice message via sound") \ + CLIENT_COMMAND("minigame", ClientCommand_minigame(request, arguments, command), "Start a minigame") \ /* nothing */ void ClientCommand_macro_help() @@@ -849,11 -888,6 +889,6 @@@ void SV_ParseClientCommand(string comma float argc = tokenize_console(command); - // for the mutator hook system - cmd_name = strtolower(argv(0)); - cmd_argc = argc; - cmd_string = command; - // Guide for working with argc arguments by example: // argc: 1 - 2 - 3 - 4 // argv: 0 - 1 - 2 - 3 @@@ -902,7 -936,7 +937,7 @@@ return; } } - else if(MUTATOR_CALLHOOK(SV_ParseClientCommand)) + else if(MUTATOR_CALLHOOK(SV_ParseClientCommand, strtolower(argv(0)), argc, command)) { return; // handled by a mutator } diff --combined qcsrc/server/g_world.qc index 8fab845a73,0fc713f69a..d743a2cba0 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@@ -17,16 -17,17 +17,17 @@@ #include "mutators/mutators_include.qh" #include "race.qh" #include "scores.qh" - #include "secret.qh" #include "teamplay.qh" #include "waypointsprites.qh" #include "weapons/weaponstats.qh" #include "../common/buffs.qh" #include "../common/constants.qh" #include "../common/deathtypes.qh" + #include "../common/effects.qh" #include "../common/mapinfo.qh" #include "../common/monsters/all.qh" #include "../common/monsters/sv_monsters.qh" + #include "../common/vehicles/all.qh" #include "../common/notifications.qh" #include "../common/playerstats.qh" #include "../common/stats.qh" @@@ -273,6 -274,7 +274,7 @@@ void cvar_changes_init( BADCVAR("g_domination_default_teams"); BADCVAR("g_freezetag"); BADCVAR("g_freezetag_teams"); + BADCVAR("g_invasion_teams"); BADCVAR("g_keepaway"); BADCVAR("g_keyhunt"); BADCVAR("g_keyhunt_teams"); @@@ -334,7 -336,6 +336,6 @@@ BADCVAR("pausable"); BADCVAR("sv_allow_fullbright"); BADCVAR("sv_checkforpacketsduringsleep"); - BADCVAR("sv_fraginfo"); BADCVAR("sv_timeout"); BADPREFIX("sv_timeout_"); BADPREFIX("crypto_"); @@@ -345,7 -346,6 +346,6 @@@ BADPREFIX("prvm_"); BADPREFIX("skill_"); BADPREFIX("sv_cullentities_"); - BADPREFIX("sv_fraginfo_"); BADPREFIX("sv_maxidle_"); BADPREFIX("sv_vote_"); BADPREFIX("timelimit_"); @@@ -376,6 -376,7 +376,7 @@@ BADCVAR("g_ca_teams_override"); BADCVAR("g_ctf_ignore_frags"); BADCVAR("g_domination_point_limit"); + BADCVAR("g_domination_teams_override"); BADCVAR("g_freezetag_teams_override"); BADCVAR("g_friendlyfire"); BADCVAR("g_fullbrightitems"); @@@ -396,6 -397,7 +397,7 @@@ BADCVAR("g_nexball_goallimit"); BADCVAR("g_powerups"); BADCVAR("g_start_delay"); + BADCVAR("g_tdm_teams_override"); BADCVAR("g_warmup"); BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay"); BADCVAR("hostname"); @@@ -557,13 -559,11 +559,11 @@@ void spawnfunc___init_dedicated_server( self.classname = "worldspawn"; // safeguard against various stuff ;) // needs to be done so early because of the constants they create - CALL_ACCUMULATED_FUNCTION(RegisterWeapons); - CALL_ACCUMULATED_FUNCTION(RegisterMonsters); - CALL_ACCUMULATED_FUNCTION(RegisterItems); - CALL_ACCUMULATED_FUNCTION(RegisterGametypes); + static_init(); + CALL_ACCUMULATED_FUNCTION(RegisterTurrets); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); - CALL_ACCUMULATED_FUNCTION(RegisterBuffs); + CALL_ACCUMULATED_FUNCTION(RegisterEffects); MapInfo_Enumerate(); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); @@@ -575,6 -575,7 +575,7 @@@ void Nagger_Init() void ClientInit_Spawn(); void WeaponStats_Init(); void WeaponStats_Shutdown(); + void Physics_AddStats(); void spawnfunc_worldspawn (void) { float fd, l, j, n; @@@ -606,16 -607,12 +607,14 @@@ server_is_dedicated = (stof(cvar_defstring("is_dedicated")) ? true : false); // needs to be done so early because of the constants they create - CALL_ACCUMULATED_FUNCTION(RegisterWeapons); - CALL_ACCUMULATED_FUNCTION(RegisterMonsters); - CALL_ACCUMULATED_FUNCTION(RegisterItems); - CALL_ACCUMULATED_FUNCTION(RegisterGametypes); + static_init(); + CALL_ACCUMULATED_FUNCTION(RegisterTurrets); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); - CALL_ACCUMULATED_FUNCTION(RegisterBuffs); + CALL_ACCUMULATED_FUNCTION(RegisterEffects); + initialize_minigames(); + ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid)); TemporaryDB = db_create(); @@@ -696,8 -693,7 +695,7 @@@ GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s)); s = ":gameinfo:mutators:LIST"; - ret_string = s; - MUTATOR_CALLHOOK(BuildMutatorsString); + MUTATOR_CALLHOOK(BuildMutatorsString, s); s = ret_string; // simple, probably not good in the mutator system @@@ -784,6 -780,7 +782,7 @@@ WeaponStats_Init(); WepSet_AddStat(); + WepSet_AddStat_InMap(); addstat(STAT_SWITCHWEAPON, AS_INT, switchweapon); addstat(STAT_SWITCHINGWEAPON, AS_INT, switchingweapon); addstat(STAT_GAMESTARTTIME, AS_FLOAT, stat_game_starttime); @@@ -818,11 -815,29 +817,29 @@@ addstat(STAT_FROZEN, AS_INT, frozen); addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, revive_progress); - // g_movementspeed hack - addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw); - addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed); - addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw); - addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw); + // physics + Physics_AddStats(); + + // new properties + addstat(STAT_MOVEVARS_JUMPVELOCITY, AS_FLOAT, stat_sv_jumpvelocity); + addstat(STAT_MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, AS_FLOAT, stat_sv_airaccel_qw_stretchfactor); + addstat(STAT_MOVEVARS_MAXAIRSTRAFESPEED, AS_FLOAT, stat_sv_maxairstrafespeed); + addstat(STAT_MOVEVARS_MAXAIRSPEED, AS_FLOAT, stat_sv_maxairspeed); + addstat(STAT_MOVEVARS_AIRSTRAFEACCELERATE, AS_FLOAT, stat_sv_airstrafeaccelerate); + addstat(STAT_MOVEVARS_WARSOWBUNNY_TURNACCEL, AS_FLOAT, stat_sv_warsowbunny_turnaccel); + addstat(STAT_MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, AS_FLOAT, stat_sv_airaccel_sideways_friction); + addstat(STAT_MOVEVARS_AIRCONTROL, AS_FLOAT, stat_sv_aircontrol); + addstat(STAT_MOVEVARS_AIRCONTROL_POWER, AS_FLOAT, stat_sv_aircontrol_power); + addstat(STAT_MOVEVARS_AIRCONTROL_PENALTY, AS_FLOAT, stat_sv_aircontrol_penalty); + addstat(STAT_MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, AS_FLOAT, stat_sv_warsowbunny_airforwardaccel); + addstat(STAT_MOVEVARS_WARSOWBUNNY_TOPSPEED, AS_FLOAT, stat_sv_warsowbunny_topspeed); + addstat(STAT_MOVEVARS_WARSOWBUNNY_ACCEL, AS_FLOAT, stat_sv_warsowbunny_accel); + addstat(STAT_MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO, AS_FLOAT, stat_sv_warsowbunny_backtosideratio); + addstat(STAT_MOVEVARS_FRICTION, AS_FLOAT, stat_sv_friction); + addstat(STAT_MOVEVARS_ACCELERATE, AS_FLOAT, stat_sv_accelerate); + addstat(STAT_MOVEVARS_STOPSPEED, AS_FLOAT, stat_sv_stopspeed); + addstat(STAT_MOVEVARS_AIRACCELERATE, AS_FLOAT, stat_sv_airaccelerate); + addstat(STAT_MOVEVARS_AIRSTOPACCELERATE, AS_FLOAT, stat_sv_airstopaccelerate); // secrets addstat(STAT_SECRETS_TOTAL, AS_FLOAT, stat_secrets_total); @@@ -1674,48 -1689,6 +1691,6 @@@ void ClearWinners(void head.winning = 0; } - // Onslaught winning condition: - // game terminates if only one team has a working generator (or none) - float WinningCondition_Onslaught() - { - entity head; - float t1, t2, t3, t4; - - WinningConditionHelper(); // set worldstatus - - if(warmup_stage) - return WINNING_NO; - - // first check if the game has ended - t1 = t2 = t3 = t4 = 0; - head = find(world, classname, "onslaught_generator"); - while (head) - { - if (head.health > 0) - { - if (head.team == NUM_TEAM_1) t1 = 1; - if (head.team == NUM_TEAM_2) t2 = 1; - if (head.team == NUM_TEAM_3) t3 = 1; - if (head.team == NUM_TEAM_4) t4 = 1; - } - head = find(head, classname, "onslaught_generator"); - } - if (t1 + t2 + t3 + t4 < 2) - { - // game over, only one team remains (or none) - ClearWinners(); - if (t1) SetWinners(team, NUM_TEAM_1); - if (t2) SetWinners(team, NUM_TEAM_2); - if (t3) SetWinners(team, NUM_TEAM_3); - if (t4) SetWinners(team, NUM_TEAM_4); - dprint("Have a winner, ending game.\n"); - return WINNING_YES; - } - - // Two or more teams remain - return WINNING_NO; - } - // Assault winning condition: If the attackers triggered a round end (by fulfilling all objectives) // they win. Otherwise the defending team wins once the timelimit passes. void assault_new_round(); @@@ -2084,9 -2057,6 +2059,6 @@@ void CheckRules_World( return; } - if(g_onslaught) - timelimit = 0; // ONS has its own overtime rule - float wantovertime; wantovertime = 0; @@@ -2172,10 -2142,6 +2144,6 @@@ { checkrules_status = WinningCondition_LMS(); } - else if (g_onslaught) - { - checkrules_status = WinningCondition_Onslaught(); // TODO remove this? - } else { checkrules_status = WinningCondition_Scores(fraglimit, leadlimit); diff --combined qcsrc/server/progs.src index 76b0e3d347,3d39893d06..f10b721ae5 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@@ -5,6 -5,7 +5,7 @@@ sys-pre.q ../dpdefs/progsdefs.qh ../dpdefs/dpextensions.qh sys-post.qh + ../common/util-post.qh anticheat.qc antilag.qc @@@ -12,20 -13,20 +13,19 @@@ campaign.q cheats.qc cl_client.qc cl_impulse.qc - cl_physics.qc cl_player.qc + controlpoint.qc csqceffects.qc ent_cs.qc - func_breakable.qc g_casings.qc g_damage.qc g_hook.qc // g_lights.qc // TODO: was never used g_models.qc g_subs.qc - g_triggers.qc -g_tetris.qc g_violence.qc g_world.qc + generator.qc ipban.qc item_key.qc mapvoting.qc @@@ -38,21 -39,14 +38,14 @@@ race.q round_handler.qc scores.qc scores_rules.qc - secret.qc spawnpoints.qc steerlib.qc sv_main.qc - target_music.qc - target_spawn.qc teamplay.qc t_halflife.qc t_items.qc - t_jumppads.qc - t_plats.qc - t_quake.qc t_quake3.qc - t_swamp.qc - t_teleporters.qc + t_quake.qc waypointsprites.qc bot/aim.qc @@@ -63,7 -57,6 +56,6 @@@ bot/waypoints.q bot/havocbot/havocbot.qc bot/havocbot/role_keyhunt.qc - bot/havocbot/role_onslaught.qc bot/havocbot/roles.qc command/all.qc @@@ -78,8 -71,6 +70,6 @@@ pathlib/movenode.q pathlib/path_waypoint.qc pathlib/utility.qc - vehicles/all.qc - weapons/accuracy.qc weapons/common.qc weapons/csqcprojectile.qc // TODO @@@ -95,24 -86,36 +85,38 @@@ weapons/weaponsystem.q ../common/buffs.qc ../common/campaign_file.qc ../common/campaign_setup.qc + ../common/effects.qc ../common/mapinfo.qc - ../common/monsters/all.qc ../common/monsters/spawn.qc ../common/monsters/sv_monsters.qc +../common/minigames/minigames.qc +../common/minigames/sv_minigames.qc + ../common/movetypes/include.qc ../common/nades.qc ../common/net_notice.qc ../common/notifications.qc + ../common/physics.qc ../common/playerstats.qc + ../common/p2mathlib.qc ../common/test.qc + ../common/viewloc.qc + ../common/triggers/include.qc ../common/urllib.qc ../common/util.qc ../common/items/all.qc + ../common/monsters/all.qc + ../common/mutators/all.qc + ../common/vehicles/all.qc + ../common/weapons/all.qc // TODO + ../common/turrets/sv_turrets.qc + ../common/turrets/config.qc + ../common/turrets/util.qc + ../common/turrets/turrets.qc + ../common/turrets/checkpoint.qc + ../common/turrets/targettrigger.qc ../common/weapons/config.qc - ../common/weapons/all.qc // TODO ../csqcmodellib/sv_model.qc @@@ -121,3 -124,5 +125,5 @@@ ../warpzonelib/mathlib.qc ../warpzonelib/server.qc ../warpzonelib/util_server.qc + + ../../mod/server/progs.inc