From: terencehill Date: Wed, 20 Oct 2010 22:09:40 +0000 (+0200) Subject: Merge branch 'master' into terencehill/newpanelhud-dom_points X-Git-Tag: xonotic-v0.5.0~348^2~6^2~5 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=81046f42baf4ec980a069a5e9ba88b1e5fc7f2c9;hp=-c Merge branch 'master' into terencehill/newpanelhud-dom_points Conflicts: qcsrc/server/cl_client.qc --- 81046f42baf4ec980a069a5e9ba88b1e5fc7f2c9 diff --combined defaultXonotic.cfg index 6ab48a4f9a,050a2915df..1746535c95 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@@ -79,16 -79,23 +79,23 @@@ alias movetoteam_pink "sv_cmd movetotea alias movetoteam_yellow "sv_cmd movetoteam $1 yellow" alias movetoteam_auto "sv_cmd movetoteam $1 auto" - // merge lightmaps up to 1024x1024 textures - // the default of 2048x2048 is too heavy for my rig (SavageX) - mod_q3bsp_lightmapmergepower 3 + // merge lightmaps up to 2048x2048 textures + mod_q3bsp_lightmapmergepower 4 // player defaults _cl_color 102 _cl_name Player _cl_playermodel models/player/umbra.iqm _cl_playerskin 0 - crosshair 1 + seta crosshair 3 + seta crosshair_color_red 0.6 + seta crosshair_color_green 0.8 + seta crosshair_color_blue 1 + seta crosshair_alpha 1 + seta crosshair_size 0.35 + seta crosshair_dot 1 + seta crosshair_dot_alpha 1 + seta crosshair_dot_size 1 seta crosshair_per_weapon 0 "when 1, each gun will display a different crosshair" seta crosshair_color_override 0 "when 1, crosshair_color_* overrides the per-weapon color" seta crosshair_effect_speed -1 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time" @@@ -120,6 -127,12 +127,12 @@@ seta crosshair_grenadelauncher_color_gr seta crosshair_grenadelauncher_color_blue 0 "crosshair color blue component to display when wielding the mortar" seta crosshair_grenadelauncher_color_alpha 1.15 "crosshair alpha value to display when wielding the mortar" seta crosshair_grenadelauncher_size 0.7 "crosshair size when wielding the mortar" + seta crosshair_minelayer "" "crosshair to display when wielding the mortar" + seta crosshair_minelayer_color_red 0.75 "crosshair color red component to display when wielding the mortar" + seta crosshair_minelayer_color_green 0.75 "crosshair color green component to display when wielding the mortar" + seta crosshair_minelayer_color_blue 0 "crosshair color blue component to display when wielding the mortar" + seta crosshair_minelayer_color_alpha 1.15 "crosshair alpha value to display when wielding the mortar" + seta crosshair_minelayer_size 0.9 "crosshair size when wielding the mortar" seta crosshair_electro "" "crosshair to display when wielding the electro" seta crosshair_electro_color_red 0.35 "crosshair color red component to display when wielding the electro" seta crosshair_electro_color_green 0.5 "crosshair color green component to display when wielding the electro" @@@ -186,7 -199,6 +199,6 @@@ seta crosshair_campingrifle_color_gree seta crosshair_campingrifle_color_blue 0.25 "crosshair color blue component to display when wielding the campingrifle" seta crosshair_campingrifle_color_alpha 1 "crosshair alpha value to display when wielding the campingrifle" seta crosshair_campingrifle_size 0.65 "crosshair size when wielding the campingrifle" - seta crosshair_campingrifle_ring_size 1.5 "bullet counter ring size around campingrifle crosshair, multiple of crosshair_campingrifle_size" seta crosshair_tuba "" "crosshair to display when wielding the tuba" seta crosshair_tuba_color_red 0.85 "crosshair color red component to display when wielding the tuba" seta crosshair_tuba_color_green 0.5 "crosshair color green component to display when wielding the tuba" @@@ -199,6 -211,9 +211,9 @@@ seta crosshair_fireball_color_green 1. seta crosshair_fireball_color_blue 0.2 "crosshair color blue component to display when wielding the fireball" seta crosshair_fireball_color_alpha 1 "crosshair alpha value to display when wielding the fireball" seta crosshair_fireball_size 1 "crosshair size when wielding the fireball" + seta crosshair_ring_size 3 "bullet counter ring size for Rifle, velocity ring for Nex" + seta crosshair_campingrifle_bulletcounter_alpha 0.15 + seta crosshair_nexvelocity_alpha 0.15 seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)" seta cl_reticle_item_nex 1 "draw aiming recticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha" seta cl_reticle_item_normal 1 "draw recticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha" @@@ -210,7 -225,7 +225,7 @@@ seta cl_zoomspeed 3.5 "how fast it wil seta cl_zoomsensitivity 0 "how zoom changes sensitivity (0 = weakest, 1 = strongest)" freelook 1 sensitivity 6 - v_gamma 1.125000 + v_gamma 1 viewsize 100 bgmvolume 1 volume 0.5 @@@ -283,8 -298,6 +298,6 @@@ seta cl_voice_directional_taunt_attenua hostname "Xonotic $g_xonoticversion Server" set sv_mapchange_delay 5 set minplayers 0 "number of players playing at the same time (if not enough real players are there the remaining slots are filled with bots)" - sv_cullentities_trace 1 - r_cullentities_trace 1 // restart server if all players hit "ready"-button set sv_ready_restart 0 "if set to 1 allow a map to be restarted once all players pressed the \"ready\" button'" @@@ -322,11 -335,12 +335,12 @@@ set g_allow_oldnexbeam 0 "If enabled, c seta cl_particles_oldnexbeam 0 "Uses the old v2.3 Nexgun beam instead of the new beam, only works if server allows it (g_allow_oldnexbeam 1)" set sv_qcweaponanimation 0 - set g_telefrags 1 - set g_telefrags_avoid 0 + set g_telefrags 1 "telefragging, i.e. killing someone who stands in the way of someone who is teleporting" + set g_telefrags_teamplay 1 "never telefrag team mates" + set g_telefrags_avoid 1 "when teleporters have a random destination, avoid teleporting to locations where a telefrag would happen" set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed" - set g_respawn_ghosts 0 "if 1 dead bodies become ghosts and float away when the player respawns" + set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns" set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate" set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would" @@@ -338,12 -352,12 +352,12 @@@ set sv_fragmessage_information_typefra // use default physics set sv_friction_on_land 0 - exec physicsNoQWBunny-nexbased.cfg + exec physicsNoQWBunny-xpmbased.cfg - set sv_player_viewoffset "0 0 35" "view offset of the player model" + set sv_player_viewoffset "0 0 42" "view offset of the player model" set sv_player_mins "-16 -16 -24" "playermodel mins" set sv_player_maxs "16 16 45" "playermodel maxs" - set sv_player_crouch_viewoffset "0 0 15" "view offset of the player model when crouched" + set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when crouched" set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel" set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel" @@@ -428,9 -442,9 +442,9 @@@ set bot_ai_keyboard_treshold 0.5 set bot_ai_aimskill_offset 0.3 "Amount of error induced to the bots aim" set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming" set bot_ai_custom_weapon_priority_distances "300 850" "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons" - set bot_ai_custom_weapon_priority_far "minstanex nex campingrifle rocketlauncher grenadelauncher electro hagar hlac crylink laser uzi fireball seeker shotgun tuba" "Desired weapons for far distances ordered by priority" - set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba" "Desired weapons for middle distances ordered by priority" - set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba seeker hagar crylink grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball" "Desired weapons for close distances ordered by priority" + set bot_ai_custom_weapon_priority_far "minstanex nex campingrifle rocketlauncher minelayer grenadelauncher electro hagar hlac crylink laser uzi fireball seeker shotgun tuba" "Desired weapons for far distances ordered by priority" + set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker minelayer grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba" "Desired weapons for middle distances ordered by priority" + set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba seeker hagar crylink minelayer grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball" "Desired weapons for close distances ordered by priority" set bot_ai_weapon_combo 1 "Enable bots to do weapon combos" set bot_ai_weapon_combo_threshold 0.3 "Try to make a combo N seconds after the last attack" set bot_ai_friends_aware_pickup_radius "500" "Bots will not pickup items if a team mate is this distance near the item" @@@ -509,7 -523,7 +523,7 @@@ set g_casings 2 "specifies which casing set g_norecoil 0 "if set to 1 shooting weapons won't make you crosshair to move upwards (recoil)" set g_maplist_mostrecent "" "contains the name of the maps that were most recently played" seta g_maplist_mostrecent_count 3 "number of most recent maps that are blocked from being played again" - seta g_maplist "accident aggressor aneurysm basement basementctf bleach bloodprison bloodprisonctf bluesky cyberparcour01 darkzone desertfactory dieselpower downer eggandbacon evilspace farewell final_rage nr_piece-o-cake ons-reborn racetrack reslimed ruiner runningman runningman_1on1remix runningmanctf silvercity skyway slimepit soylent starship stormkeep2 strength toxic warfare" + seta g_maplist "g-23" "the list of maps to be cycled among (is autogenerated if empty)" seta g_maplist_index 0 "this is used internally for saving position in maplist cycle" seta g_maplist_selectrandom 0 "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle" seta g_maplist_shuffle 1 "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list" @@@ -523,6 -537,7 +537,7 @@@ set g_player_brightness 0 "set to 2 fo seta g_balance_cloaked_alpha 0.25 set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps" + set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps" set welcome_message_time 8 @@@ -846,6 -861,10 +861,10 @@@ set g_footsteps 1 "serverside footstep set g_deathglow 1.25 "when enabled, players stop glowing after they die (the value specifies glow fading speed)" + set g_multijump 0 "Number of multiple jumps to allow (jumping again in the air), -1 allows for infinite jumps" + set g_multijump_add 0 "0 = make the current z velocity equal to jumpvelocity, 1 = add jumpvelocity to the current z velocity" + set g_multijump_speed -999999 "Minimum vertical speed a player must have in order to jump again" + // effects r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints) r_picmipworld 1 @@@ -856,16 -875,16 +875,16 @@@ r_mipsprites r_mipskins 1 r_shadow_realtime_world_lightmaps 1 seta r_ambient 4 - cl_decals_fadetime 1 + cl_decals_fadetime 5 cl_decals_time 2 seta cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left" seta cl_nogibs 0 "reduce number of violence effects, or remove them totally" seta cl_particlegibs 0 "simpler gibs" seta cl_gibs_damageforcescale 3.5 "force to push around gibs" - seta cl_gibs_lifetime 14 "average lifetime of gibs" + seta cl_gibs_lifetime 5 "average lifetime of gibs" seta cl_gibs_velocity_scale 1 "gib throw velocity force scale" seta cl_gibs_velocity_random 1 "gib throw velocity randomness scale" - seta cl_gibs_velocity_up 0 "extra z velocity for gibs" + seta cl_gibs_velocity_up 1 "extra z velocity for gibs" seta cl_gibs_ticrate 0.1 "ticrate for gibs" seta cl_gibs_sloppy 1 "sloppy gibs, may temporarily penetrate walls" seta cl_casings 1 "enable or disable bullet casings" @@@ -1047,13 -1066,13 +1066,13 @@@ set rcon_restricted_commands "restart f set sv_vote_call 1 "users can call a vote for the above commands" set sv_vote_master 1 "users can call a vote to become master" set sv_vote_master_password "" "when set, users can use \"vlogin PASSWORD\" to log in as master" - set sv_vote_change 0 "set to 1 to allow to change you vote/mind" + set sv_vote_change 1 "set to 1 to allow to change you vote/mind" set sv_vote_singlecount 0 "set to 1 to count votes once after timeout or to 0 to count with every vote" - set sv_vote_timeout 60 "a vote will timeout after this many seconds" + set sv_vote_timeout 30 "a vote will timeout after this many seconds" set sv_vote_wait 120 "a player can not call a vote again for this many seconds when his vote was not accepted" set sv_vote_stop 15 "a player can not call a vote again for this many seconds when he stopped this vote (e.g. to correct it)" set sv_vote_majority_factor 0.5 "which quotient of the PLAYERS constitute a majority? (try: 0.667, 0.75 when using the above)" - set sv_vote_simple_majority_factor 0 "which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)" + set sv_vote_simple_majority_factor 0.667 "which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)" // when disabled, don't allow game type changes "note: set these two equal to JUST support simple majorities" set sv_vote_override_mostrecent 0 alias vhelp "cmd vote help" @@@ -1116,6 -1135,7 +1135,7 @@@ set quit_and_redirect "" "set to an IP // singleplayer campaign set g_campaign 0 + set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink" seta g_campaign_name "xonotic25" set g_campaign_skill 0 set g_campaignxonotic20_index 0 @@@ -1140,6 -1160,7 +1160,7 @@@ seta sv_servermodelsonly cl_curl_enabled 1 cl_curl_maxspeed 300 sv_curl_defaulturl "http://www.xonotic.com/contentdownload/getmap.php?file=" + set sv_curl_serverpackages_auto 0 "automatically add packs with *.serverpackage files to sv_curl_serverpackages" set sv_motd "" @@@ -1251,8 -1272,9 +1272,9 @@@ set g_keyhunt_teams set cl_gravity 800 "but ignored anyway" set g_ban_default_bantime 5400 "90 minutes" - set g_ban_default_masksize 3 "whole 255.255.255.0 networks (set to 4 for single IPs); when UID support is compiled in, masksize 0 means banning by UID" + set g_ban_default_masksize 3 "masksize 0 means banning by UID only, 1 means banning by /8 (IPv6: /32) network, 2 means banning by /16 (IPv6: /48) network, 3 means banning by /24 (IPv6: /56) network, 4 means banning by single IP (IPv6: /64 network)" set g_banned_list "" "format: IP remainingtime IP remainingtime ..." + set g_banned_list_idmode "1" "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)" alias bans "sv_cmd bans" alias ban "sv_cmd ban $*" // usage: ban address(maybe incomplete, like 1.2.3) bantime(seconds) alias kickban "sv_cmd kickban $*" // usage: kickban # playerno bantime(seconds) masksize(bytes) @@@ -1307,13 -1329,15 +1329,15 @@@ alias _userbind_call "${$1} alias +userbind "_userbind_call userbind${1}_press" alias -userbind "_userbind_call userbind${1}_release" - seta menu_skin "default" + seta menu_skin "luminos" set menu_slowmo 1 seta menu_sounds 0 "enables menu sound effects. 1 enables click sounds, 2 also enables hover sounds" r_textbrightness 0.2 r_textcontrast 0.8 - r_textshadow 1 + r_textshadow 0 + r_font_postprocess_blur 1 + r_font_postprocess_outline 1 // good settings for these fonts con_chat 5 @@@ -1325,7 -1349,7 +1349,7 @@@ con_notifyalign // hud variables set _hud_configure 0 "1 = configure the HUD" - seta hud_configure_teamcolorforced 1 "1 = force display of team colors in configure mode" + seta hud_configure_teamcolorforced 0 "1 = force display of team colors in configure mode" seta hud_configure_checkcollisions 1 "check for collisions against other panels when in hud configure mode" seta hud_configure_bg_minalpha 0.25 "minimum panel background alpha when in hud configure mode" seta hud_configure_grid_alpha 0.15 "alpha for visible grid when in configure mode" @@@ -1334,8 -1358,9 +1358,9 @@@ seta sbar_info_pos 0 "Y-axis distance f // hud cvar descriptions exec _hud_descriptions.cfg - // exec the default skin config. remember, NO menu_restart in the deafault cfg (dp segfaults at startup otherwise) - exec hud_default.cfg + // exec the default skin config + // please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency + exec hud_luminos.cfg // user preference cvars (i.e. shouldn't be adjusted by a skin config) seta hud_panel_weapons_label 1 "1 = show number of weapon, 2 = show bound key of weapon" @@@ -1352,12 -1377,12 +1377,14 @@@ seta hud_panel_weapons_ammo_full_nails seta hud_panel_weapons_ammo_full_cells 80 "show 100% of the status bar at this ammo count" seta hud_panel_weapons_ammo_full_rockets 80 "show 100% of the status bar at this ammo count" seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this ammo count" + seta hud_panel_weapons_timeout "3" "panel disappears if you don't switch weapon for this amount of seconds" + seta hud_panel_weapons_timeout_effect "1" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out" seta hud_panel_notify_time 10 "time that a new entry stays until it fades out" seta hud_panel_notify_fadetime 3 "fade out time" +seta hud_panel_modicons_dom_layout 0 "3 possible layouts: 0) only icons; 1) icons and percentage of average pps (points per second); 2) icons and average pps" + seta hud_panel_timer_increment 0 "show elapsed time instead of remaining time" seta hud_panel_radar_scale 4096 "distance you can see on the team radar" @@@ -1365,12 -1390,15 +1392,15 @@@ seta hud_panel_radar_rotation 0 "rotati seta hud_panel_radar_zoommode 0 "zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out" alias hud_panel_radar_rotate "toggle hud_panel_radar_rotation 0 1 2 3 4" - seta hud_panel_engineinfo_framecounter_time 1 "time between framerate display updates, smaller values yield less accuracy" + seta hud_panel_engineinfo_framecounter_time 0.1 "time between framerate display updates" seta hud_panel_engineinfo_framecounter_decimals 0 "amount of decimals to show" seta hud_panel_engineinfo_framecounter_exponentialmovingaverage 1 "use an averaging method for calculating fps instead of counting frametime like engine does" seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight 0.1 "weight of latest data point" seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold 0.5 "threshold for fps change when to update instantly, to make big fps changes update faster" + seta hud_showbinds 1 "the way to show the keys to press in HUD messages: 0 displays commands, 1 bound keys, 2 both" + seta hud_showbinds_limit 2 "maximum number of bound keys to show for a command. 0 for unlimited" + // scoreboard seta scoreboard_columns default seta scoreboard_border_thickness 1 "scoreboard border thickness" @@@ -1378,8 -1406,8 +1408,8 @@@ seta scoreboard_accuracy_border_thickne seta scoreboard_accuracy_doublerows 0 "use two rows instead of one" seta scoreboard_accuracy 1 "0 = no weapon accuracy stats panel on scoreboard" seta scoreboard_color_bg_r 0 "red color component of the HUD background" - seta scoreboard_color_bg_g 0.25 "green color component of the HUD background" - seta scoreboard_color_bg_b 0.17 "blue color component of the HUD background" + seta scoreboard_color_bg_g 0.4 "green color component of the HUD background" + seta scoreboard_color_bg_b 0.6 "blue color component of the HUD background" seta scoreboard_color_bg_team 0.5 "team color multiplier of the HUD background" seta scoreboard_alpha_bg 0.6 "scoreboard background alpha" seta scoreboard_alpha_fg 1 "scoreboard foreground alpha" @@@ -1390,6 -1418,8 +1420,8 @@@ seta scoreboard_fadeoutspeed 5 "speed a seta scoreboard_highlight 1 "enable highlighting for rows and columns in the scoreboard" seta scoreboard_highlight_alpha 0.10 "highlight alpha value (depends on hud_scoreboard_highlight 1)" seta scoreboard_highlight_alpha_self 0.25 "self highlight alpha value" + seta scoreboard_offset_left 0.04 "how many pixels the scoreboard is offset from the left screen edge" + seta scoreboard_offset_right 0.148 "how many pixels the scoreboard is offset from the right screen edge" // for menu server list (eventually make them have engine support?) seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join" @@@ -1449,6 -1479,7 +1481,7 @@@ set con_completion_gotomap ma set con_completion_vmap map set con_completion_vnextmap map set con_completion_vdomap map + set con_completion_playermodel models/player/*.iqm // these non-saved engine cvars shall be savedG seta cl_port $cl_port @@@ -1464,6 -1495,7 +1497,7 @@@ sys_ticrate 0.016666 cl_netfps 60 // should match sv_gameplayfix_delayprojectiles 0 sv_gameplayfix_q2airaccelerate 1 + sv_gameplayfix_stepmultipletimes 1 // delay for "kill" to prevent abuse set g_balance_kill_delay 5 @@@ -1502,8 -1534,8 +1536,8 @@@ unalias _cdtrac cd remap $g_cdtracks_remaplist set sv_intermission_cdtrack "" - set g_cdtracks_dontusebydefault "" - set menu_cdtrack "ninesix" + set g_cdtracks_dontusebydefault "rising-of-the-phoenix" + set menu_cdtrack "rising-of-the-phoenix" // maxidle (in seconds): kick players idle for more than that amount of time set sv_maxidle 0 @@@ -1516,7 -1548,7 +1550,7 @@@ set capturelimit // hud: font size seta hud_fontsize 11 seta hud_fontsize_spec 16 - seta scr_centersize 11 + seta scr_centersize 12 seta hud_width 560 // alias hud_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; scoreboard_columns_set" alias sbar_font "set _requested_sbar_font \"${*}\"" @@@ -1532,13 -1564,13 +1566,13 @@@ set g_jump_grunt 0 "Do you make a grunt alias allready "sv_cmd allready" - seta cl_weaponpriority "minstanex rocketlauncher nex grenadelauncher fireball hlac hagar seeker crylink campingrifle uzi electro tuba shotgun laser hook porto" "weapon priority list" + seta cl_weaponpriority "minstanex rocketlauncher nex minelayer grenadelauncher fireball hlac hagar seeker crylink campingrifle uzi electro tuba shotgun laser hook porto" "weapon priority list" seta cl_weaponpriority_useforcycling 0 "when set, weapon cycling by the mouse wheel makes use of the weapon priority list (the special value 2 uses the weapon ID list for cycling)" seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun. Default value: explosives" seta cl_weaponpriority1 "minstanex nex crylink hlac electro laser" "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun. Default value: energy" seta cl_weaponpriority2 "minstanex nex campingrifle" "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun. Default value: hitscan exact" seta cl_weaponpriority3 "minstanex nex campingrifle uzi shotgun" "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun. Default value: hitscan all" - seta cl_weaponpriority4 "grenadelauncher hlac hagar crylink seeker shotgun" "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun. Default value: spam weapons" + seta cl_weaponpriority4 "minelayer grenadelauncher hlac hagar crylink seeker shotgun" "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun. Default value: spam weapons" seta cl_weaponpriority5 "laser hook porto" "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun. Default value: weapons for moving" seta cl_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun" seta cl_weaponpriority7 "" "use impulse 207 for prev gun from this list, 217 for best gun, 227 for next gun" @@@ -1878,6 -1910,7 +1912,7 @@@ cl_decals_newsystem set g_weaponreplace_laser "" set g_weaponreplace_shotgun "" set g_weaponreplace_uzi "" + set g_weaponreplace_minelayer "" set g_weaponreplace_grenadelauncher "" set g_weaponreplace_electro "" set g_weaponreplace_crylink "" @@@ -1911,5 -1944,27 +1946,27 @@@ scr_conscroll3_y scr_conscroll_x -0.1 scr_conscroll_y -0.3 + scr_loadingscreen_background 0 + scr_loadingscreen_barcolor "0 0.5 1" + scr_loadingscreen_barheight 20 + scr_loadingscreen_count 1 + // DP cannot properly detect this, so rather turn off the detection r_texture_dds_load_dxt1_noalpha 1 + + // particles optimization + r_drawparticles_nearclip_min 8 + r_drawparticles_nearclip_max 16 + + // sv_cullentities_trace is 1, so the client doesn't have to + sv_cullentities_trace 1 + r_cullentities_trace 0 + + // less "lagging" of other players, but also less PL tolerant... let's try this + sv_clmovement_inputtimeout 0.05 + + // exact gloss looks better, e.g. on g-23 + r_shadow_glossexact 1 + + // use fake light if map has no lightmaps + r_fakelight 1 diff --combined qcsrc/client/hud.qc index 439517f0ae,69459256f0..131d113c81 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@@ -131,7 -131,7 +131,7 @@@ float stringwidth_nocolors(string s, ve #define CENTERPRINT_MAX_LINES 30 string centerprint_messages[CENTERPRINT_MAX_LINES]; float centerprint_width[CENTERPRINT_MAX_LINES]; - vector centerprint_start; + float centerprint_time; float centerprint_expire; float centerprint_num; float centerprint_offset_hint; @@@ -182,6 -182,8 +182,8 @@@ void centerprint(string strMessage while(getWrappedLine_remaining) { s = getWrappedLine(vid_conwidth * 0.75, centerprint_fontsize, stringwidth_colors); + if(centerprint_messages[i] != s) // don't fade the same message in, looks stupid + centerprint_time = time; if(centerprint_messages[i]) strunzone(centerprint_messages[i]); centerprint_messages[i] = strzone(s); @@@ -208,8 -210,6 +210,6 @@@ if(havail > vid_conheight - 70) havail = vid_conheight - 70; // avoid overlapping HUD - centerprint_start_x = 0; - #if 0 float forbiddenmin, forbiddenmax, allowedmin, allowedmax, preferred; @@@ -260,17 -260,10 +260,10 @@@ centerprint_start_y = bound(forbiddenmax, preferred, allowedmax); } #else - centerprint_start_y = - min( - max( - max(scoreboard_bottom, vid_conheight * 0.5 + 16), - (havail - h)/2 - ), - havail - h - ); #endif centerprint_num = i; + centerprint_expire = time + cvar("scr_centertime"); } @@@ -279,32 -272,39 +272,39 @@@ void HUD_DrawCenterPrint (void float i; vector pos; string ts; - float a; - - //if(time > centerprint_expire) - // return; + float a, sz; - //a = bound(0, 1 - 2 * (time - centerprint_expire), 1); - a = bound(0, 1 - 4 * (time - centerprint_expire), 1); - //sz = 1.2 / (a + 0.2); + if(time - centerprint_time < 0.25) + a = (time - centerprint_time) / 0.25; + else + a = bound(0, 1 - 4 * (time - centerprint_expire), 1); if(a <= 0) return; + sz = 0.8 + (a / 5); + + if(centerprint_num * cvar("scr_centersize") > 24 && HUD_WouldDrawScoreboard()) // 24 = height of Scoreboard text + { + centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y; + } pos = centerprint_start; for (i=0; i vid_conwidth) + tmp_size_x = vid_conwidth - panel_pos_x; + if (panel_pos_y + panel_size_copied_y > vid_conheight) + tmp_size_y = vid_conheight - panel_pos_y; + + if (panel_size == tmp_size) + return true; + + // backup first! + panel_pos_backup = panel_pos; + panel_size_backup = panel_size; + highlightedPanel_backup = highlightedPanel_prev; + + string s; + s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight)); + cvar_set(strcat("hud_panel_", panel_name, "_size"), s); + } + else if(nPrimary == 'z') // undo last action + { + if (bInputType == 1) + return true; + //restore previous values + if (highlightedPanel_backup != -1) + { + HUD_Panel_GetName(highlightedPanel_backup) + string s; + s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight)); + cvar_set(strcat("hud_panel_", panel_name, "_pos"), s); + s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight)); + cvar_set(strcat("hud_panel_", panel_name, "_size"), s); + highlightedPanel_backup = -1; + } + } + } else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW) { if (bInputType == 1) @@@ -1226,6 -1318,7 +1318,7 @@@ void HUD_Panel_Highlight( } float highlightcheck; + vector prev_pos, prev_size; void HUD_Panel_Mouse() { // TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled @@@ -1255,9 -1348,28 +1348,28 @@@ if(mouseClicked) { if(prevMouseClicked == 0) + { HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin + // and calls HUD_Panel_UpdatePosSizeForId() for the highlighted panel + prev_pos = panel_pos; + prev_size = panel_size; + } + else + HUD_Panel_UpdatePosSizeForId(highlightedPanel) - hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions); + if (prev_pos != panel_pos || prev_size != panel_size) + { + hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions); + // backup! + panel_pos_backup = prev_pos; + panel_size_backup = prev_size; + highlightedPanel_backup = highlightedPanel; + } + else + // in case the clicked panel is inside another panel and we aren't + // moving it, avoid the immediate "fix" of its position/size + // (often unwanted and hateful) by disabling collisions check + hud_configure_checkcollisions = false; if(highlightedAction == 1) HUD_Panel_SetPos(mousepos - panel_click_distance); @@@ -1307,13 -1419,13 +1419,13 @@@ cursorsize = '32 32 0'; if(highlightcheck == 0) - drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else if(highlightcheck == 1) - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else if(highlightcheck == 2) - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); prevMouseClicked = mouseClicked; } @@@ -1366,6 -1478,7 +1478,7 @@@ float GetAmmoTypeForWep(float i case WEP_UZI: return 1; case WEP_CAMPINGRIFLE: return 1; case WEP_GRENADE_LAUNCHER: return 2; + case WEP_MINE_LAYER: return 2; case WEP_ELECTRO: return 3; case WEP_CRYLINK: return 3; case WEP_HLAC: return 3; @@@ -1385,14 -1498,94 +1498,94 @@@ void HUD_Weapons(void if(!autocvar_hud_panel_weapons && !autocvar__hud_configure) return; + float timeout = cvar("hud_panel_weapons_timeout"); + float timeout_effect_length, timein_effect_length; + if (cvar("hud_panel_weapons_timeout_effect") == 0) + { + timeout_effect_length = 0; + timein_effect_length = 0; + } + else + { + timeout_effect_length = 0.75; + timein_effect_length = 0.375; + } + + if (timeout && time >= weapontime + timeout + timeout_effect_length && !autocvar__hud_configure) + { + weaponprevtime = time; + return; + } + active_panel = HUD_PANEL_WEAPONS; HUD_Panel_UpdateCvars(weapons); - vector pos, mySize; - float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt; - pos = panel_pos; - mySize = panel_size; + if (timeout && time >= weapontime + timeout && !autocvar__hud_configure) + { + float f = (time - (weapontime + timeout)) / timeout_effect_length; + if (cvar("hud_panel_weapons_timeout_effect")) + { + panel_bg_alpha *= (1 - f); + panel_fg_alpha *= (1 - f); + } + if (cvar("hud_panel_weapons_timeout_effect") == 1) + { + f *= f; // for a cooler movement + vector center; + center_x = panel_pos_x + panel_size_x/2; + center_y = panel_pos_y + panel_size_y/2; + float screen_ar = vid_conwidth/vid_conheight; + if (center_x/center_y < screen_ar) //bottom left + { + if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom + panel_pos_y += f * (vid_conheight - panel_pos_y); + else //left + panel_pos_x -= f * (panel_pos_x + panel_size_x); + } + else //top right + { + if ((vid_conwidth - center_x)/center_y < screen_ar) //right + panel_pos_x += f * (vid_conwidth - panel_pos_x); + else //top + panel_pos_y -= f * (panel_pos_y + panel_size_y); + } + } + weaponprevtime = time - (1 - f) * timein_effect_length; + } + else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure) + { + float f = (time - weaponprevtime) / timein_effect_length; + if (cvar("hud_panel_weapons_timeout_effect")) + { + panel_bg_alpha *= (f); + panel_fg_alpha *= (f); + } + if (cvar("hud_panel_weapons_timeout_effect") == 1) + { + f *= f; // for a cooler movement + f = 1 - f; + vector center; + center_x = panel_pos_x + panel_size_x/2; + center_y = panel_pos_y + panel_size_y/2; + float screen_ar = vid_conwidth/vid_conheight; + if (center_x/center_y < screen_ar) //bottom left + { + if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom + panel_pos_y += f * (vid_conheight - panel_pos_y); + else //left + panel_pos_x -= f * (panel_pos_x + panel_size_x); + } + else //top right + { + if ((vid_conwidth - center_x)/center_y < screen_ar) //right + panel_pos_x += f * (vid_conwidth - panel_pos_x); + else //top + panel_pos_y -= f * (panel_pos_y + panel_size_y); + } + } + } + float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt; weapon_cnt = 0; for(i = WEP_FIRST; i <= WEP_LAST; ++i) { @@@ -1425,8 -1618,8 +1618,8 @@@ HUD_Panel_DrawBg(1); if(panel_bg_padding) { - pos += '1 1 0' * panel_bg_padding; - mySize -= '2 2 0' * panel_bg_padding; + panel_pos += '1 1 0' * panel_bg_padding; + panel_size -= '2 2 0' * panel_bg_padding; } // hits @@@ -1449,7 -1642,7 +1642,7 @@@ HUD_Weapons_Clear(); float rows, columns; - rows = mySize_y/mySize_x; + rows = panel_size_y/panel_size_x; rows = bound(1, floor((sqrt(4 * autocvar_hud_panel_weapons_aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT); columns = ceil(WEP_COUNT/rows); @@@ -1467,8 -1660,8 +1660,8 @@@ for(i = 0; i < weapon_cnt; ++i) { - wpnpos = pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows); - wpnsize = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + wpnpos = panel_pos + eX * column * panel_size_x*(1/columns) + eY * row * panel_size_y*(1/rows); + wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows); self = weaponorder[i]; weapid = self.impulse; @@@ -1510,9 -1703,9 +1703,9 @@@ drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL); if(autocvar_hud_panel_weapons_label == 1) // weapon number - drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); else if(autocvar_hud_panel_weapons_label == 2) // bind - drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); // draw ammo status bar if(autocvar_hud_panel_weapons_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO) @@@ -1845,10 -2038,17 +2038,17 @@@ void HUD_Powerups(void) pos = panel_pos; mySize = panel_size; - float strength_time, shield_time; - - strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); - shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); + float strength_time, shield_time; + if(autocvar__hud_configure) + { + strength_time = 15; + shield_time = 27; + } + else + { + strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); + shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); + } HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time), 1)); if(panel_bg_padding) @@@ -1857,12 -2057,6 +2057,6 @@@ mySize -= '2 2 0' * panel_bg_padding; } - if(autocvar__hud_configure) - { - strength_time = 15; - shield_time = 27; - } - vector barpos, barsize; vector picpos; vector numpos; @@@ -2062,12 -2256,10 +2256,10 @@@ void HUD_HealthArmor(void mySize -= '2 2 0' * panel_bg_padding; } - float armor, health; + float armor, health, fuel; armor = getstati(STAT_ARMOR); health = getstati(STAT_HEALTH); - - float fuel; - fuel = getstati(GetAmmoStat(4)); // how much fuel do we have? + fuel = getstati(STAT_FUEL); if(autocvar__hud_configure) { @@@ -2391,7 -2583,7 +2583,7 @@@ void HUD_KillNotify_Push(string attacke killnotify_victims[0] = strzone(victim); } - void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) + void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim { float w; float alsoprint, gentle; @@@ -2472,96 -2664,104 +2664,104 @@@ } else if(type == KILL_FIRST_BLOOD) print("^1",s1, "^1 drew first blood", "\n"); - // TODO: icon! - else if (type == DEATH_TELEFRAG) - print ("^1",s1, "^1 was telefragged by ", s2, "\n"); + else if (type == DEATH_TELEFRAG) { + HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG); + if(gentle) + print ("^1",s2, "^1 tried to occupy ", s1, "^1's teleport destination space\n"); + else + print ("^1",s2, "^1 was telefragged by ", s1, "\n"); + } else if (type == DEATH_DROWN) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_DROWN); + HUD_KillNotify_Push(s1, s2, 1, DEATH_DROWN); if(alsoprint) - print ("^1",s1, "^1 was drowned by ", s2, "\n"); + print ("^1",s2, "^1 was drowned by ", s1, "\n"); } else if (type == DEATH_SLIME) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_SLIME); + HUD_KillNotify_Push(s1, s2, 1, DEATH_SLIME); if(alsoprint) - print ("^1",s1, "^1 was slimed by ", s2, "\n"); + print ("^1",s2, "^1 was slimed by ", s1, "\n"); } else if (type == DEATH_LAVA) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_LAVA); + HUD_KillNotify_Push(s1, s2, 1, DEATH_LAVA); if(alsoprint) - print ("^1",s1, "^1 was cooked by ", s2, "\n"); + print ("^1",s2, "^1 was cooked by ", s1, "\n"); } else if (type == DEATH_FALL) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_FALL); + HUD_KillNotify_Push(s1, s2, 1, DEATH_FALL); if(alsoprint) - print ("^1",s1, "^1 was grounded by ", s2, "\n"); + print ("^1",s2, "^1 was grounded by ", s1, "\n"); } else if (type == DEATH_SHOOTING_STAR) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_SHOOTING_STAR); + HUD_KillNotify_Push(s1, s2, 1, DEATH_SHOOTING_STAR); if(alsoprint) - print ("^1",s1, "^1 was shot into space by ", s2, "\n"); + print ("^1",s2, "^1 was shot into space by ", s1, "\n"); } else if (type == DEATH_SWAMP) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was conserved by ", s2, "\n"); + print ("^1",s2, "^1 was conserved by ", s1, "\n"); } else if (type == DEATH_HURTTRIGGER) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_HURTTRIGGER); + HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER); if(alsoprint) - print("^1",s1, "^1 was thrown into a world of hurt by ", s2, "\n"); + print("^1",s2, "^1 was thrown into a world of hurt by ", s1, "\n"); } else if(type == DEATH_SBCRUSH) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was crushed by ^1", s2, "\n"); + print ("^1",s2, "^1 was crushed by ^1", s1, "\n"); } else if(type == DEATH_SBMINIGUN) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 got shredded by ^1", s2, "\n"); + print ("^1",s2, "^1 got shredded by ^1", s1, "\n"); } else if(type == DEATH_SBROCKET) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was blased to bits by ^1", s2, "\n"); + print ("^1",s2, "^1 was blased to bits by ^1", s1, "\n"); } else if(type == DEATH_SBBLOWUP) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 got caught in the destruction of ^1", s2, "'s vehicle\n"); + print ("^1",s2, "^1 got caught in the destruction of ^1", s1, "'s vehicle\n"); } else if(type == DEATH_WAKIGUN) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was bolted down by ^1", s2, "\n"); + print ("^1",s2, "^1 was bolted down by ^1", s1, "\n"); } else if(type == DEATH_WAKIROCKET) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 could find no shelter from ^1", s2, "'s rockets\n"); + print ("^1",s2, "^1 could find no shelter from ^1", s1, "'s rockets\n"); } else if(type == DEATH_WAKIBLOWUP) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 dies when ^1", s2, "'s wakizashi dies.\n"); + print ("^1",s2, "^1 dies when ^1", s1, "'s wakizashi dies.\n"); } else if(type == DEATH_TURRET) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was pushed into the line of fire by ^1", s2, "\n"); + print ("^1",s2, "^1 was pushed into the line of fire by ^1", s1, "\n"); } else if(type == DEATH_TOUCHEXPLODE) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was pushed into an accident by ^1", s2, "\n"); + print ("^1",s2, "^1 was pushed into an accident by ^1", s1, "\n"); } else if(type == DEATH_CHEAT) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was unfairly eliminated by ^1", s2, "\n"); + print ("^1",s2, "^1 was unfairly eliminated by ^1", s1, "\n"); } else if (type == DEATH_FIRE) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was burnt to death by ^1", s2, "\n"); + print ("^1",s2, "^1 was burnt to death by ^1", s1, "\n"); } else if (type == DEATH_CUSTOM) { - HUD_KillNotify_Push(s2, s1, 1, DEATH_CUSTOM); + HUD_KillNotify_Push(s1, s2, 1, DEATH_CUSTOM); if(alsoprint) - print ("^1",s1, "^1 ", s2, "\n"); + print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n"); + } else if (type == DEATH_HURTTRIGGER) { + HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER); + if(alsoprint) + print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n"); } else { - HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC); + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) - print ("^1",s1, "^1 was fragged by ", s2, "\n"); + print ("^1",s2, "^1 was fragged by ", s1, "\n"); } } else if(msg == MSG_SPREE) { if(type == KILL_END_SPREE) { @@@ -2662,11 -2862,11 +2862,11 @@@ } else if (type == DEATH_CUSTOM) { HUD_KillNotify_Push(s1, "", 0, DEATH_CUSTOM); if(alsoprint) - print ("^1",s1, "^1 ", s2, "\n"); + print("^1", sprintf(s2, strcat(s1, "^1")), "\n"); } else if (type == DEATH_HURTTRIGGER) { HUD_KillNotify_Push(s1, "", 0, DEATH_HURTTRIGGER); if(alsoprint) - print ("^1",s1, "^1 was in the wrong place\n"); + print("^1", sprintf(s2, strcat(s1, "^1")), "\n"); } else if(type == DEATH_TOUCHEXPLODE) { HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC); if(alsoprint) @@@ -2752,7 -2952,7 +2952,7 @@@ void HUD_Centerprint(string s1, string centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't shoot your team mates!")); } else if (type == DEATH_QUIET) { // do nothing - } else if (type == DEATH_KILL) { + } else { // generic message if(gentle) centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to be more careful!")); else @@@ -2795,7 -2995,7 +2995,7 @@@ } else { centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1, s2)); } - } else if (type == KILL_FRAGGED) { + } else { // generic message if(gentle) { centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, s2)); } else { @@@ -2846,7 -3046,7 +3046,7 @@@ void HUD_Notify (void float width_attacker; string attacker, victim; - float i, j; + float i, j, w; for(j = 0; j < entries; ++j) { s = ""; @@@ -2870,7 -3070,7 +3070,7 @@@ a = 0; } - float w; + w = -1; w = DEATH_WEAPONOF(killnotify_deathtype[j]); // TODO: maybe print in team colors? @@@ -3024,6 -3224,10 +3224,10 @@@ { s = "notify_teamkill_red"; } + else if(killnotify_deathtype[j] == DEATH_TELEFRAG) + { + s = "notify_telefrag"; + } else if(killnotify_deathtype[j] == DEATH_DROWN) { s = "notify_water"; @@@ -3547,6 -3751,17 +3751,17 @@@ void HUD_VoteWindow(void pos = panel_pos; mySize = panel_size; + if(!autocvar__hud_configure) + { + panel_fg_alpha = autocvar_hud_panel_fg_alpha; + panel_bg_alpha_str = autocvar_hud_panel_vote_bg_alpha; + + if(panel_bg_alpha_str == "") { + panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha); + } + panel_bg_alpha = stof(panel_bg_alpha_str); + } + string s; float a; if(vote_active != vote_prev) { @@@ -3569,9 -3784,9 +3784,9 @@@ if(!vote_alpha) return; - a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); - + a = panel_bg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); HUD_Panel_DrawBg(a); + a = panel_fg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); if(panel_bg_padding) { pos += '1 1 0' * panel_bg_padding; @@@ -3597,37 -3812,37 +3812,37 @@@ mySize = newSize; s = "A vote has been called for:"; - drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1.75/8), stringwidth_colors); if(autocvar__hud_configure) s = "^1Configure the HUD"; - drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL); // print the yes/no counts - s = strcat("Yes (", getcommandkey("not bound", "vyes"), "): ", ftos(vote_yescount)); - drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); - s = strcat("No (", getcommandkey("not bound", "vno"), "): ", ftos(vote_nocount)); - drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); + s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount)); + drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL); + s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount)); + drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL); // draw the progress bar backgrounds - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); // draw the highlights if(vote_highlighted == 1) { drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); } else if(vote_highlighted == 2) { drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); } // draw the progress bars drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); drawresetcliparea(); @@@ -4114,105 -4329,6 +4329,105 @@@ void HUD_Mod_Race(vector pos, vector my drawfont = hud_font; } +void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float i) +{ + float stat, pps_ratio; + string pic; + vector color; + switch(i) + { + case 0: + stat = getstatf(STAT_DOM_PPS_RED); + pic = "dom_icon_red"; + color = '1 0 0'; + break; + case 1: + stat = getstatf(STAT_DOM_PPS_BLUE); + pic = "dom_icon_blue"; + color = '0 0 1'; + break; + case 2: + stat = getstatf(STAT_DOM_PPS_YELLOW); + pic = "dom_icon_yellow"; + color = '1 1 0'; + break; + case 3: + stat = getstatf(STAT_DOM_PPS_PINK); + pic = "dom_icon_pink"; + color = '1 0 1'; + } + pps_ratio = stat / getstatf(STAT_DOM_TOTAL_PPS); + + if(mySize_x/mySize_y > aspect_ratio) + { + i = aspect_ratio * mySize_y; + myPos_x = myPos_x + (mySize_x - i) / 2; + mySize_x = i; + } + else + { + i = 1/aspect_ratio * mySize_x; + myPos_y = myPos_y + (mySize_y - i) / 2; + mySize_y = i; + } + + if (cvar("hud_panel_modicons_dom_layout")) // show text too + { + //draw the text + drawfont = hud_bigfont; + color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max + if (cvar("hud_panel_modicons_dom_layout") == 2) // average pps + drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(stat, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); + else // percentage of average pps + drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); + drawfont = hud_font; + } + + //draw the icon + drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + if (stat > 0) + { + drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - pps_ratio), mySize_y, mySize_y * pps_ratio); + drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawresetcliparea(); + } +} + +void HUD_Mod_Dom(vector myPos, vector mySize) +{ + entity tm; + float teams_count; + for(tm = teams.sort_next; tm; tm = tm.sort_next) + if(tm.team != COLOR_SPECTATOR) + ++teams_count; + + float rows, columns, aspect_ratio; + rows = mySize_y/mySize_x; + aspect_ratio = (cvar("hud_panel_modicons_dom_layout")) ? 3 : 1; + rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count); + columns = ceil(teams_count/rows); + + drawfont = hud_bigfont; + int i; + float row, column; + for(i=0; i= rows) + { + row = 0; + ++column; + } + } + drawfont = hud_font; +} + float mod_prev; // previous state of mod_active to check for a change float mod_alpha; float mod_change; // "time" when mod_active changed @@@ -4222,7 -4338,7 +4437,7 @@@ void HUD_ModIcons(void if(!autocvar_hud_panel_modicons && !autocvar__hud_configure) return; - if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure) + if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_DOMINATION && !autocvar__hud_configure) return; active_panel = HUD_PANEL_MODICONS; @@@ -4259,8 -4375,6 +4474,8 @@@ HUD_Mod_NexBall(pos, mySize); else if(gametype == GAME_CTS || gametype == GAME_RACE) HUD_Mod_Race(pos, mySize); + else if(gametype == GAME_DOMINATION) + HUD_Mod_Dom(pos, mySize); } // Draw pressed keys (#11) @@@ -4337,8 -4451,15 +4552,15 @@@ void HUD_Chat(void { panel_pos_y = panel_bg_border; panel_size_y = vid_conheight - panel_bg_border * 2; - if(panel_bg == "0") - panel_bg = "border"; // force a border when maximized + if(panel_bg == "0") // force a border when maximized + { + if(precache_pic(panel_bg) == "") { + panel_bg = strcat(hud_skin_path, "/border_default"); + if(precache_pic(panel_bg) == "") { + panel_bg = "gfx/hud/default/border_default"; + } + } + } panel_bg_alpha = max(0.75, panel_bg_alpha); // force an alpha of at least 0.75 } @@@ -4406,29 -4527,32 +4628,32 @@@ void HUD_EngineInfo(void mySize -= '2 2 0' * panel_bg_padding; } + float currentTime = gettime(GETTIME_REALTIME); if(cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage")) { - frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + frametime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P + float currentframetime = currentTime - prevfps_time; + frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P frametimeavg2 = frametimeavg1; frametimeavg1 = frametimeavg; float weight; weight = cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight"); - if(frametime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter. + if(currentframetime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter. { - if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/frametime) to make big updates instant - prevfps = (1/frametime); + if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/currentframetime) to make big updates instant + prevfps = (1/currentframetime); prevfps = (1 - weight) * prevfps + weight * (1/frametimeavg); // framecounter just used so there's no need for a new variable, think of it as "frametime average" } + prevfps_time = currentTime; } else { framecounter += 1; - if(time - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time")) + if(currentTime - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time")) { - prevfps = framecounter/cvar("hud_panel_engineinfo_framecounter_time"); + prevfps = framecounter/(currentTime - prevfps_time); framecounter = 0; - prevfps_time = time; + prevfps_time = currentTime; } } @@@ -4441,6 -4565,11 +4666,11 @@@ // Info messages panel (#14) // + #define drawInfoMessage(s)\ + if(autocvar_hud_panel_infomessages_flip)\ + o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);\ + drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);\ + o_y += fontsize_y; void HUD_InfoMessages(void) { if(!autocvar_hud_panel_infomessages && !autocvar__hud_configure) @@@ -4484,6 -4613,12 +4714,12 @@@ vector fontsize; fontsize = '0.20 0.20 0' * mySize_y; + float a; + if(spectatee_status != 0) + a = 1; + else + a = panel_fg_alpha; + string s; if(!autocvar__hud_configure) { @@@ -4493,35 -4628,22 +4729,22 @@@ s = "^1Observing"; else s = strcat("^1Spectating: ^7", GetPlayerName(spectatee_status - 1)); - - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) if(spectatee_status == -1) - s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate"); + s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 to spectate"); else - s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player"); - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 for another player"); + drawInfoMessage(s) if(spectatee_status == -1) s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed"); else - s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe"); - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + s = strcat("^1Press ^3", getcommandkey("secondary fire", "+fire2"), "^1 to observe"); + drawInfoMessage(s) s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info"); - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) if(gametype == GAME_ARENA) s = "^1Wait for your turn to join"; @@@ -4538,10 -4660,7 +4761,7 @@@ } else s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join"); - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) //show restart countdown: if (time < getstatf(STAT_GAMESTARTTIME)) { @@@ -4549,17 -4668,14 +4769,14 @@@ //we need to ceil, otherwise the countdown would be off by .5 when using round() countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time); s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds"); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL); + o_y += fontsize_y; } } if(warmup_stage && !intermission) { s = "^2Currently in ^1warmup^2 stage!"; - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) } string blinkcolor; @@@ -4584,18 -4700,12 +4801,12 @@@ else s = strcat("^2Waiting for others to ready up..."); } - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) } else if(warmup_stage && !intermission && !spectatee_status) { s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup"); - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) } if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger) @@@ -4621,11 -4731,7 +4832,7 @@@ if (tm.team != COLOR_SPECTATOR) if (tm.team_size == ts_max) s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust"); - - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) } } } @@@ -4633,25 -4739,13 +4840,13 @@@ else { s = "^7Press ^3ESC ^7to show HUD options."; - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) s = "^3Doubleclick ^7a panel for panel-specific options."; - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) s = "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"; - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) s = "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."; - if(autocvar_hud_panel_infomessages_flip) - o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); - drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); - o += eY * fontsize_y; + drawInfoMessage(s) } } @@@ -4804,10 -4898,19 +4999,19 @@@ void HUD_Main (void { hud_skin_path = strcat("gfx/hud/", autocvar_hud_skin); + // global hud alpha fade if(disable_menu_alphacheck == 1) - menu_fade_alpha = 1; + hud_fade_alpha = 1; else - menu_fade_alpha = (1 - autocvar__menu_alpha); + hud_fade_alpha = (1 - autocvar__menu_alpha); + + if(scoreboard_fade_alpha) + hud_fade_alpha = (1 - scoreboard_fade_alpha); + + if(intermission == 2) // no hud during mapvote + hud_fade_alpha = 0; + else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0) + hud_fade_alpha = 1; hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5); hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5); @@@ -4859,9 -4962,12 +5063,12 @@@ string pic; pic = strcat(hud_skin_path, "/", autocvar_hud_dock); if(precache_pic(pic) == "") { - pic = "gfx/hud/default/dock"; + pic = strcat(hud_skin_path, "/dock_medium"); + if(precache_pic(pic) == "") { + pic = "gfx/hud/default/dock_medium"; + } } - drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * menu_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... + drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... } // cache the panel order into the panel_order array diff --combined qcsrc/common/constants.qh index b2c4c53d16,6f0eccfafb..417526e78e --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@@ -61,6 -61,7 +61,7 @@@ const float TE_CSQC_NOTIFY = 112 const float TE_CSQC_WEAPONCOMPLAIN = 113; const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115; const float TE_CSQC_NEX_SCOPE = 116; + const float TE_CSQC_CR_MAXBULLETS = 117; const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder const float RACE_NET_CHECKPOINT_CLEAR = 1; @@@ -308,13 -309,8 +309,14 @@@ const float STAT_NB_METERSTART = 45 const float STAT_SHOTORG = 46; // compressShotOrigin const float STAT_LEADLIMIT = 47; const float STAT_BULLETS_LOADED = 48; + const float STAT_NEX_CHARGE = 49; +const float STAT_DOM_TOTAL_PPS = 70; +const float STAT_DOM_PPS_RED = 71; +const float STAT_DOM_PPS_BLUE = 72; +const float STAT_DOM_PPS_PINK = 73; +const float STAT_DOM_PPS_YELLOW = 74; + // see DP source, quakedef.h const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222; const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223; @@@ -404,7 -400,7 +406,7 @@@ float CHAN_AUTO = 0 // on world: announcers, ... INFO // on players: item pickup ITEMS // on entities: UNUSED - // on csqc: UNUSED + // on csqc: announcers INFO float CHAN_WEAPON = 1; // Weapon fire // on world: UNUSED // on players: weapon firing WEAPONS @@@ -419,7 -415,7 +421,7 @@@ float CHAN_TRIGGER = 3; // Triggers/I // on world: UNUSED // on players: item pickup ITEMS // on entities: platforms moving etc. ITEMS - // on csqc: UNUSED + // on csqc: platforms moving etc. ITEMS float CHAN_PROJECTILE = 4; // Projectiles // on world: UNUSED // on players: projectiles hitting player SHOTS @@@ -460,20 -456,21 +462,21 @@@ float PROJECTILE_CRYLINK = 5 float PROJECTILE_ELECTRO_BEAM = 6; float PROJECTILE_GRENADE = 7; float PROJECTILE_GRENADE_BOUNCING = 8; - float PROJECTILE_LASER = 9; - float PROJECTILE_HLAC = 10; - float PROJECTILE_SEEKER = 11; - float PROJECTILE_FLAC = 12; - float PROJECTILE_PORTO_RED = 13; - float PROJECTILE_PORTO_BLUE = 14; - float PROJECTILE_HOOKBOMB = 15; - float PROJECTILE_HAGAR = 16; - float PROJECTILE_HAGAR_BOUNCING = 17; - float PROJECTILE_BULLET_GLOWING = 18; - float PROJECTILE_CRYLINK_BOUNCING = 19; - float PROJECTILE_FIREBALL = 20; - float PROJECTILE_FIREMINE = 21; - float PROJECTILE_BULLET_GLOWING_TRACER = 22; + float PROJECTILE_MINE = 9; + float PROJECTILE_LASER = 10; + float PROJECTILE_HLAC = 11; + float PROJECTILE_SEEKER = 12; + float PROJECTILE_FLAC = 13; + float PROJECTILE_PORTO_RED = 14; + float PROJECTILE_PORTO_BLUE = 15; + float PROJECTILE_HOOKBOMB = 16; + float PROJECTILE_HAGAR = 17; + float PROJECTILE_HAGAR_BOUNCING = 18; + float PROJECTILE_BULLET_GLOWING = 19; + float PROJECTILE_CRYLINK_BOUNCING = 20; + float PROJECTILE_FIREBALL = 21; + float PROJECTILE_FIREMINE = 22; + float PROJECTILE_BULLET_GLOWING_TRACER = 23; float SPECIES_HUMAN = 0; float SPECIES_ROBOT_SOLID = 1; diff --combined qcsrc/server/cl_client.qc index e935273c6d,df6c8d4b2a..6cc10bcd6b --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@@ -6,6 -6,13 +6,13 @@@ void send_CSQC_teamnagger() WriteByte(0, TE_CSQC_TEAMNAGGER); } + void send_CSQC_cr_maxbullets(entity e) { + msg_entity = e; + WriteByte(MSG_ONE, SVC_TEMPENTITY); + WriteByte(MSG_ONE, TE_CSQC_CR_MAXBULLETS); + WriteByte(MSG_ONE, cvar("g_balance_campingrifle_magazinecapacity")); + } + void Announce(string snd) { WriteByte(MSG_ALL, SVC_TEMPENTITY); WriteByte(MSG_ALL, TE_CSQC_ANNOUNCE); @@@ -866,10 -873,11 +873,11 @@@ void PutClientInServer (void self.iscreature = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; + self.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID; if(cvar("g_playerclip_collisions")) - self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; - else - self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY; + self.dphitcontentsmask |= DPCONTENTS_PLAYERCLIP; + if(clienttype(self) == CLIENTTYPE_BOT && cvar("g_botclip_collisions")) + self.dphitcontentsmask |= DPCONTENTS_BOTCLIP; self.frags = FRAGS_PLAYER; if(independent_players) MAKE_INDEPENDENT_PLAYER(self); @@@ -881,6 -889,8 +889,8 @@@ self.effects = 0; self.air_finished = time + 12; self.dmg = 2; + if(cvar("g_balance_nex_charge")) + self.nex_charge = cvar("g_balance_nex_charge_start"); if(inWarmupStage) { @@@ -1354,8 -1364,9 +1364,9 @@@ void FixClientCvars(entity e if(g_race || g_cts) stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n"); if(cvar("g_antilag") == 3) // client side hitscan - //stuffcmd(e, "cl_cmd settemp cl_prydoncursor -1\ncl_cmd settemp cl_prydoncursor_notrace 0\n"); stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n"); + if(sv_gentle) + stuffcmd(e, "cl_cmd settemp cl_gentle 1\n"); /* * we no longer need to stuff this. Remove this comment block if you feel * 2.3 and higher (or was it 2.2.3?) don't need these any more @@@ -1386,11 -1397,6 +1397,7 @@@ Called when a client connects to the se string ColoredTeamName(float t); void DecodeLevelParms (void); //void dom_player_join_team(entity pl); - #ifdef UID - .float uid_kicktime; - .string uid; - #endif +void set_dom_state(entity e, float connecting); void ClientConnect (void) { float t; @@@ -1568,12 -1574,6 +1575,6 @@@ else self.hitplotfh = -1; - #ifdef UID - if(clienttype(self) == CLIENTTYPE_REAL) - if not(self.uid) - self.uid_kicktime = time + 60; - #endif - if(g_race || g_cts) { string rr; if(g_cts) @@@ -1594,11 -1594,10 +1595,12 @@@ race_SendRankings(i, 0, 0, MSG_ONE); } } - else if(cvar("sv_teamnagger") && !g_ca) // teamnagger is currently bad for ca + else if(cvar("sv_teamnagger") && !(cvar("bot_vs_human") && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca send_CSQC_teamnagger(); + if (g_domination) + set_dom_state(self, TRUE); + send_CSQC_cr_maxbullets(self); CheatInitClient(); } @@@ -2860,9 -2859,16 +2862,16 @@@ float isInvisibleString(string s switch(c) { case 0: - case 32: - case 160: + case 32: // space break; + case 192: // charmap space + if (!cvar("utf8_enable")) + break; + return FALSE; + case 160: // space in unicode fonts + case 0xE000 + 192: // utf8 charmap space + if (cvar("utf8_enable")) + break; default: return FALSE; } @@@ -2907,16 -2913,6 +2916,6 @@@ void PlayerPostThink (void self.stat_count -= 1; } - #ifdef UID - if(self.uid_kicktime) - if(time > self.uid_kicktime) - { - bprint("^3", self.netname, "^3 was kicked for missing UID.\n"); - dropclient(self); - return; - } - #endif - if(sv_maxidle && frametime) { // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero). diff --combined qcsrc/server/domination.qc index ac8343c069,3e5bed8b25..17e2e5fe0b --- a/qcsrc/server/domination.qc +++ b/qcsrc/server/domination.qc @@@ -24,26 -24,6 +24,26 @@@ float g_domination_point_rate .entity sprite; .float captime; +// pps: points per second +.float dom_total_pps; +.float dom_pps_red; +.float dom_pps_blue; +.float dom_pps_yellow; +.float dom_pps_pink; +float total_pps; +float pps_red; +float pps_blue; +float pps_yellow; +float pps_pink; +void set_dom_state(entity e, float connecting) +{ + if(connecting) e.dom_total_pps = total_pps; + e.dom_pps_red = pps_red; + e.dom_pps_blue = pps_blue; + if(c3 >= 0) e.dom_pps_yellow = pps_yellow; + if(c4 >= 0) e.dom_pps_pink = pps_pink; +} + void() dom_controlpoint_setup; void LogDom(string mode, float team_before, entity actor) @@@ -97,7 -77,10 +97,10 @@@ void dompoint_captured ( wait_time = self.wait; bprint("^3", head.netname, "^3", self.message); - bprint(" ^7(", ftos(points), " points every ", ftos(wait_time), " seconds)\n"); + if (points != 1) + bprint(" ^7(", ftos(points), " points every ", ftos(wait_time), " seconds)\n"); + else + bprint(" ^7(", ftos(points), " point every ", ftos(wait_time), " seconds)\n"); if(self.enemy.playerid == self.enemy_playerid) PlayerScore_Add(self.enemy, SP_DOM_TAKES, 1); @@@ -127,53 -110,21 +130,53 @@@ self.delay = old_delay; self.team = old_team; + switch(self.team) + { + // "fix" pps when slightly under 0 because of approximation errors + case COLOR_TEAM1: + pps_red -= (points/wait_time); + if (pps_red < 0) pps_red = 0; + break; + case COLOR_TEAM2: + pps_blue -= (points/wait_time); + if (pps_blue < 0) pps_blue = 0; + break; + case COLOR_TEAM3: + pps_yellow -= (points/wait_time); + if (pps_yellow < 0) pps_yellow = 0; + break; + case COLOR_TEAM4: + pps_pink -= (points/wait_time); + if (pps_pink < 0) pps_pink = 0; + } + switch(self.goalentity.team) { + // "fix" pps when slightly over total_pps because of approximation errors case COLOR_TEAM1: + pps_red += (points/wait_time); + if (pps_red > total_pps) pps_red = total_pps; WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", ""); break; case COLOR_TEAM2: + pps_blue += (points/wait_time); + if (pps_blue > total_pps) pps_blue = total_pps; WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", ""); break; case COLOR_TEAM3: + pps_yellow += (points/wait_time); + if (pps_yellow > total_pps) pps_yellow = total_pps; WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", ""); break; case COLOR_TEAM4: + pps_pink += (points/wait_time); + if (pps_pink > total_pps) pps_pink = total_pps; WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", ""); - break; } + + FOR_EACH_CLIENT(head) + set_dom_state(head, FALSE); + WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0)); WaypointSprite_Ping(self.sprite); @@@ -209,6 -160,9 +212,6 @@@ void dompointthink( if (gameover || self.delay > time || time < game_starttime) // game has ended, don't keep giving points return; - g_domination_point_rate = cvar("g_domination_point_rate"); - g_domination_point_amt = cvar("g_domination_point_amt"); - if(g_domination_point_rate) self.delay = time + g_domination_point_rate; else @@@ -595,17 -549,6 +598,17 @@@ void spawnfunc_dom_controlpoint( self.effects = self.effects | EF_LOWPRECISION; if (cvar("g_domination_point_fullbright")) self.effects |= EF_FULLBRIGHT; + + float points, waittime; + if (g_domination_point_rate) + points += g_domination_point_rate; + else + points += self.frags; + if (g_domination_point_amt) + waittime += g_domination_point_amt; + else + waittime += self.wait; + total_pps += points/waittime; }; // code from here on is just to support maps that don't have control point and team entities @@@ -712,15 -655,6 +715,15 @@@ void dom_init( precache_sound("domination/claim.wav"); InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE); + addstat(STAT_DOM_TOTAL_PPS, AS_FLOAT, dom_total_pps); + addstat(STAT_DOM_PPS_RED, AS_FLOAT, dom_pps_red); + addstat(STAT_DOM_PPS_BLUE, AS_FLOAT, dom_pps_blue); + if(c3 >= 0) addstat(STAT_DOM_PPS_YELLOW, AS_FLOAT, dom_pps_yellow); + if(c4 >= 0) addstat(STAT_DOM_PPS_PINK, AS_FLOAT, dom_pps_pink); + + g_domination_point_rate = cvar("g_domination_point_rate"); + g_domination_point_amt = cvar("g_domination_point_amt"); + // teamplay is always on in domination, defaults to hurt self but not teammates //if(!teams_matter) // cvar_set("teamplay", "3");