- wget -O data/maps/g-23.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.waypoints.cache
- wget -O data/maps/g-23.waypoints.hardwired https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.waypoints.hardwired
- make
- - EXPECT=b46b7dcf27e864c2842b7436e32e24fe
+ - EXPECT=cc5f9dd607764a67822f4db73fd53dc0
- HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
| tee /dev/stderr
| grep '^:'
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_panel_physics_acceleration_movingaverage 1 "use an averaging method for calculating acceleration instead of the real value"
-seta hud_panel_phisics_update_interval 0.0666 "how often (in seconds) numeric values get updated on screen"
+seta hud_panel_physics_update_interval 0.0666 "how often (in seconds) numeric values get updated on screen"
seta hud_panel_physics_speed_unit "1" "speed unit (1 = qu/s, 2 = m/s, 3 = km/h, 4 = mph, 5 = knots)"
seta hud_panel_itemstime_progressbar_maxtime "30" "when left time is at least this amount, the status bar is full"
seta hud_panel_scoreboard_maxheight 0.5 "max height of the scoreboard; a few players that wouldn't fit into the scoreboard are listed in the last row"
seta hud_panel_scoreboard_others_showscore 1 "show scores of players listed in the last row when the scoreboard reaches the max height"
seta hud_panel_scoreboard_spectators_showping 1 "show ping of spectators"
+seta hud_panel_scoreboard_spectators_aligned 0 "align spectators in columns"
seta hud_panel_scoreboard_minwidth 0.4 "minimum width of the scoreboard"
// hud panel aliases
seta cl_spawn_event_sound 1 "sound effect whenever a player spawns"
//seta cl_spawn_point_model 0 "place a model at all spawn points" // still needs a model
seta cl_spawn_point_particles 1 "pointparticles effect at all spawn points" // managed by effects-.cfg files
+seta cl_spawn_point_dist_min 1200
+seta cl_spawn_point_dist_max 1600
freelook 1
sensitivity 6
set sv_friction_on_land 0
set sv_friction_slick 0.5
+set sv_aircontrol_backwards 0 "apply forward aircontrol options to backward movement"
+
set sv_player_viewoffset "0 0 35" "view offset of the player model"
set sv_player_mins "-16 -16 -24" "playermodel mins"
set sv_player_maxs "16 16 45" "playermodel maxs"
seta sv_servermodelsonly 1
cl_curl_enabled 1
-cl_curl_maxspeed 500
+cl_curl_maxdownloads 3
+cl_curl_maxspeed 0
cl_curl_useragent 1
cl_curl_useragent_append "$g_xonoticversion"
set g_waypoints_for_items 0 "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
seta g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match"
-seta g_maplist_votable_keeptwotime 15
+seta g_maplist_votable_keeptwotime 15 "show only 2 options after this amount of time during map vote screen"
seta g_maplist_votable_timeout 30 "timeout for the map voting; must be below 50 seconds!"
seta g_maplist_votable_suggestions 2
seta g_maplist_votable_suggestions_override_mostrecent 0
seta g_maplist_votable_screenshot_dir "maps levelshots" "where to look for map screenshots"
set sv_vote_gametype 0 "show a vote screen for gametypes before map vote screen"
-set sv_vote_gametype_keeptwotime 10 "show only 2 options for this amount of time during gametype vote screen"
+set sv_vote_gametype_keeptwotime 10 "show only 2 options after this amount of time during gametype vote screen"
set sv_vote_gametype_options "dm ctf ca lms tdm ft"
set sv_vote_gametype_timeout 20
set sv_vote_gametype_default_current 1 "Keep the current gametype if no one votes"
set sv_join_notices ""
set sv_join_notices_time 15
+seta cl_items_nofade 0
+seta cl_animate_items 1
seta cl_ghost_items 0.45 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
seta cl_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
set sv_simple_items 1 "allow or forbid client use of simple items"
set g_ctf_flag_return 1 "auto return the flag to base when touched by a teammate"
set g_ctf_flag_return_carrying 0 "(manual return mode) auto return the flag to base if touched by a flag carrier"
set g_ctf_flag_return_carried_radius 100 "allow flags to be returned by carrier if base is within this radius"
-set g_ctf_flag_return_time 15
-set g_ctf_flag_return_dropped 100
-set g_ctf_flag_return_damage 0
+set g_ctf_flag_return_time 15 "automatically return the flag to base after this amount of time"
+set g_ctf_flag_return_dropped 100 "automatically return the flag to base if dropped within this distance from base (in qu)"
+set g_ctf_flag_return_damage 0 "allow the flag to be damaged, reducing time needed to automatically return to base"
+set g_ctf_flag_return_damage_delay 0 "how much time the flag takes to automatically return to base if it falls into lava/slime/trigger hurt"
set g_ctf_flag_return_when_unreachable 1 "automatically return the flag if it falls into lava/slime/trigger hurt"
set g_ctf_flagcarrier_auto_helpme_damage 100 "automatically place a helpme notification on flag carrier waypointsprite if they get hit and their health dips below this value"
set g_ctf_flagcarrier_auto_helpme_time 2 "antispam time for the helpme notification"
set sv_minigames_snake_delay_initial 0.7 "Initial delay between snake movement"
set sv_minigames_snake_delay_multiplier 50 "Multiplier of incremental of movement speed (player_score / cvar)"
set sv_minigames_snake_delay_min 0.1 "Minimum delay between snake movement (at fastest rate)"
+set sv_minigames_snake_lives 3
seta cl_dodging_timeout 0.2 "determines how long apart (in seconds) two taps on the same direction key are considered a dodge. use 0 to disable"
-set sv_dodging_wall_dodging 0 "set to 1 to allow dodging off walls. 0 to disable"
+set sv_dodging_air_dodging 0
+set sv_dodging_wall_dodging 0 "allow dodging off walls"
set sv_dodging_delay 0.7 "determines how long a player has to wait to be able to dodge again after dodging"
set sv_dodging_up_speed 200 "the jump velocity of the dodge"
set sv_dodging_horiz_speed 400 "the horizontal velocity of the dodge"
set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging"
set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent"
set sv_dodging_frozen 0 "allow dodging while frozen"
+set sv_dodging_frozen_doubletap 0
// ===========
set g_nades_client_select 0 "allow client side selection of nade type"
set g_nades_pickup 0 "allow picking up thrown nades (not your own)"
set g_nades_pickup_time 2 "time until picked up nade explodes"
+set g_nades_override_dropweapon 1
set g_nades_nade_lifetime 3.5
set g_nades_nade_minforce 400
set g_nades_nade_maxforce 2000
seta notification_INFO_WEAPON_VAPORIZER_MURDER "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
seta notification_INFO_WEAPON_VORTEX_MURDER "1" "0 = off, 1 = print to console, 2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
-// MSG_CENTER notifications (count = 225):
+// MSG_CENTER notifications (count = 230):
seta notification_CENTER_ALONE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_ASSAULT_ATTACKING "1" "0 = off, 1 = centerprint"
seta notification_CENTER_ASSAULT_DEFENDING "1" "0 = off, 1 = centerprint"
seta notification_CENTER_CTF_STALEMATE_OTHER "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_FRAG "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_FRAGGED "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAGGED_FIRE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAGGED_FIRE_VERBOSE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAGGED_FREEZE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAGGED_FREEZE_VERBOSE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_FRAGGED_VERBOSE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAG_FIRE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAG_FIRE_VERBOSE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAG_FREEZE "1" "0 = off, 1 = centerprint"
+seta notification_CENTER_DEATH_MURDER_FRAG_FREEZE_VERBOSE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_FRAG_VERBOSE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_TYPEFRAG "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DEATH_MURDER_TYPEFRAGGED "1" "0 = off, 1 = centerprint"
seta notification_CENTER_DOOR_UNLOCKED "1" "0 = off, 1 = centerprint"
seta notification_CENTER_EXTRALIVES "1" "0 = off, 1 = centerprint"
seta notification_CENTER_FREEZETAG_AUTO_REVIVED "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_FREEZETAG_FREEZE "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_FREEZETAG_FROZEN "1" "0 = off, 1 = centerprint"
seta notification_CENTER_FREEZETAG_REVIVE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_FREEZETAG_REVIVED "1" "0 = off, 1 = centerprint"
seta notification_CENTER_FREEZETAG_REVIVE_SELF "1" "0 = off, 1 = centerprint"
seta notification_CENTER_MISSING_PLAYERS "1" "0 = off, 1 = centerprint"
seta notification_CENTER_MISSING_TEAMS "1" "0 = off, 1 = centerprint"
seta notification_CENTER_MOTD "1" "0 = off, 1 = centerprint"
-seta notification_CENTER_NADE "1" "0 = off, 1 = centerprint"
seta notification_CENTER_NADE_BONUS "1" "0 = off, 1 = centerprint"
seta notification_CENTER_NADE_THROW "1" "0 = off, 1 = centerprint"
seta notification_CENTER_NIX_COUNTDOWN "1" "0 = off, 1 = centerprint"
seta notification_WEAPON_VAPORIZER_MURDER "1" "Enable this multiple notification"
seta notification_WEAPON_VORTEX_MURDER "1" "Enable this multiple notification"
-// MSG_CHOICE notifications (count = 24):
+// MSG_CHOICE notifications (count = 28):
seta notification_CHOICE_CTF_CAPTURE_BROKEN_BLUE "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
seta notification_CHOICE_CTF_CAPTURE_BROKEN_BLUE_ALLOWED "2" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
seta notification_CHOICE_CTF_CAPTURE_BROKEN_PINK "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
seta notification_CHOICE_FRAG_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
seta notification_CHOICE_FRAGGED "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
seta notification_CHOICE_FRAGGED_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
+seta notification_CHOICE_FRAGGED_FIRE "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
+seta notification_CHOICE_FRAGGED_FIRE_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
+seta notification_CHOICE_FRAGGED_FREEZE "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
+seta notification_CHOICE_FRAGGED_FREEZE_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
+seta notification_CHOICE_FRAG_FIRE "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
+seta notification_CHOICE_FRAG_FIRE_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
+seta notification_CHOICE_FRAG_FREEZE "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
+seta notification_CHOICE_FRAG_FREEZE_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
seta notification_CHOICE_TYPEFRAG "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
seta notification_CHOICE_TYPEFRAG_ALLOWED "1" "Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
seta notification_CHOICE_TYPEFRAGGED "1" "Choice for this notification 0 = off, 1 = default message, 2 = verbose message"
seta notification_show_sprees_info_newline "1" "Show attacker spree information for MSG_INFO messages on a separate line than the death notification itself"
seta notification_show_sprees_info_specialonly "1" "Don't show attacker spree information in MSG_INFO messages if it isn't an achievement"
-// Notification counts (total = 807): MSG_ANNCE = 89, MSG_INFO = 316, MSG_CENTER = 225, MSG_MULTI = 153, MSG_CHOICE = 24
+// Notification counts (total = 816): MSG_ANNCE = 89, MSG_INFO = 316, MSG_CENTER = 230, MSG_MULTI = 153, MSG_CHOICE = 28
set g_physics_xonotic_airaccel_sideways_friction 0
set g_physics_xonotic_aircontrol 100
set g_physics_xonotic_aircontrol_power 2
+set g_physics_xonotic_aircontrol_backwards 0
set g_physics_xonotic_aircontrol_penalty 0
set g_physics_xonotic_warsowbunny_airforwardaccel 1.00001
set g_physics_xonotic_warsowbunny_topspeed 925
set g_physics_nexuiz_airaccel_sideways_friction 0.35
set g_physics_nexuiz_aircontrol 0
set g_physics_nexuiz_aircontrol_power 2
+set g_physics_nexuiz_aircontrol_backwards 0
set g_physics_nexuiz_aircontrol_penalty 0
set g_physics_nexuiz_warsowbunny_airforwardaccel 1.00001
set g_physics_nexuiz_warsowbunny_topspeed 925
set g_physics_quake_airaccel_sideways_friction 0
set g_physics_quake_aircontrol 0
set g_physics_quake_aircontrol_power 2
+set g_physics_quake_aircontrol_backwards 0
set g_physics_quake_aircontrol_penalty 0
set g_physics_quake_warsowbunny_airforwardaccel 1.00001
set g_physics_quake_warsowbunny_topspeed 925
set g_physics_warsow_airaccel_sideways_friction 0
set g_physics_warsow_aircontrol 0
set g_physics_warsow_aircontrol_power 2
+set g_physics_warsow_aircontrol_backwards 0
set g_physics_warsow_aircontrol_penalty 0
set g_physics_warsow_warsowbunny_airforwardaccel 1.00001
set g_physics_warsow_warsowbunny_topspeed 925
set g_physics_defrag_airaccel_sideways_friction 0
set g_physics_defrag_aircontrol 150
set g_physics_defrag_aircontrol_power 2
+set g_physics_defrag_aircontrol_backwards 0
set g_physics_defrag_aircontrol_penalty 0
set g_physics_defrag_warsowbunny_airforwardaccel 1.00001
set g_physics_defrag_warsowbunny_topspeed 925
set g_physics_quake3_airaccel_sideways_friction 0
set g_physics_quake3_aircontrol 0
set g_physics_quake3_aircontrol_power 2
+set g_physics_quake3_aircontrol_backwards 0
set g_physics_quake3_aircontrol_penalty 0
set g_physics_quake3_warsowbunny_airforwardaccel 1.00001
set g_physics_quake3_warsowbunny_topspeed 925
set g_physics_vecxis_airaccel_sideways_friction 0.3
set g_physics_vecxis_aircontrol 0
set g_physics_vecxis_aircontrol_power 2
+set g_physics_vecxis_aircontrol_backwards 0
set g_physics_vecxis_aircontrol_penalty 0
set g_physics_vecxis_warsowbunny_airforwardaccel 1.00001
set g_physics_vecxis_warsowbunny_topspeed 925
set g_physics_quake2_airaccel_sideways_friction 0
set g_physics_quake2_aircontrol 0
set g_physics_quake2_aircontrol_power 2
+set g_physics_quake2_aircontrol_backwards 0
set g_physics_quake2_aircontrol_penalty 0
set g_physics_quake2_warsowbunny_airforwardaccel 1.00001
set g_physics_quake2_warsowbunny_topspeed 925
set g_physics_bones_airaccel_sideways_friction 0
set g_physics_bones_aircontrol 150
set g_physics_bones_aircontrol_power 2
+set g_physics_bones_aircontrol_backwards 0
set g_physics_bones_aircontrol_penalty 0
set g_physics_bones_warsowbunny_airforwardaccel 1.00001
set g_physics_bones_warsowbunny_topspeed 925
sv_aircontrol 150
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_airstrafeaccel_qw -0.97
sv_aircontrol 125
sv_aircontrol_power 2.5
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 125
sv_aircontrol_penalty 150
sv_aircontrol_power 2.5
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 800
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 125
sv_aircontrol_penalty 150
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 800
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 125
sv_aircontrol_penalty 100
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 9 // activates warsow movement mode
sv_warsowbunny_accel 0.1593
sv_aircontrol 150
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 0
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 6 // activates warsow movement mode
sv_warsowbunny_accel 0.1585
sv_aircontrol 100
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 900
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 125
sv_aircontrol_penalty 150
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 800
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 125
sv_aircontrol_penalty 180
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 800
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 150
sv_aircontrol_penalty 0
sv_aircontrol_power 2
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_aircontrol 100
sv_aircontrol_penalty 100
sv_aircontrol_power 2.5
+sv_aircontrol_backwards 0
sv_airspeedlimit_nonqw 0
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
float autocvar_crosshair_rpc_size = 1;
int autocvar_cl_nade_timer;
bool autocvar_r_drawviewmodel;
-bool autocvar_cl_items_nofade;
float autocvar_hud_panel_scoreboard_maxheight = 0.5;
bool autocvar_hud_panel_scoreboard_others_showscore = true;
bool autocvar_hud_panel_scoreboard_spectators_showping = true;
+bool autocvar_hud_panel_scoreboard_spectators_aligned = false;
float autocvar_hud_panel_scoreboard_minwidth = 0.4;
if(!complete)
width_limit -= stringwidth("...", false, hud_fontsize);
float namesize = autocvar_hud_panel_scoreboard_namesize * hud_fontsize.x;
- float ping_padding = 0;
- float min_pingsize = stringwidth("999", false, hud_fontsize);
+ static float max_name_width = 0;
+ string field = "";
+ float fieldsize = 0;
+ float min_fieldsize = 0;
+ float fieldpadding = hud_fontsize.x * 0.25;
+ if(this_team == NUM_SPECTATOR)
+ {
+ if(autocvar_hud_panel_scoreboard_spectators_showping)
+ min_fieldsize = stringwidth("999", false, hud_fontsize);
+ }
+ else if(autocvar_hud_panel_scoreboard_others_showscore)
+ min_fieldsize = stringwidth("99", false, hud_fontsize);
for(i = 0; pl; pl = pl.sort_next)
{
if(pl.team != this_team)
if(pl == ignored_pl)
continue;
- ping_padding = 0;
- string str = textShortenToWidth(entcs_GetName(pl.sv_entnum), namesize, hud_fontsize, stringwidth_colors);
+ field = "";
if(this_team == NUM_SPECTATOR)
{
if(autocvar_hud_panel_scoreboard_spectators_showping)
- {
- string ping = Scoreboard_GetField(pl, SP_PING);
- float pingsize = stringwidth(ping, false, hud_fontsize);
- if(min_pingsize > pingsize)
- ping_padding = min_pingsize - pingsize;
- string col = rgb_to_hexcolor(sbt_field_rgb);
- str = sprintf("%s ^7[%s%s^7]", str, col, ping);
- }
+ field = Scoreboard_GetField(pl, SP_PING);
}
else if(autocvar_hud_panel_scoreboard_others_showscore)
- str = sprintf("%s ^7(^3%s^7)", str, ftos(pl.(scores(ps_primary))));
- float str_width = stringwidth(str, true, hud_fontsize);
- if(pos.x + str_width > width_limit)
+ field = ftos(pl.(scores(ps_primary)));
+
+ string str = textShortenToWidth(entcs_GetName(pl.sv_entnum), namesize, hud_fontsize, stringwidth_colors);
+ float column_width = stringwidth(str, true, hud_fontsize);
+ if((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned)
+ {
+ if(column_width > max_name_width)
+ max_name_width = column_width;
+ column_width = max_name_width;
+ }
+ if(field != "")
+ {
+ fieldsize = stringwidth(field, false, hud_fontsize);
+ column_width += hud_fontsize.x * 0.25 + max(fieldsize, min_fieldsize) + 2 * fieldpadding;
+ }
+
+ if(pos.x + column_width > width_limit)
{
++i;
if(!complete)
else
{
pos.x = item_pos.x + hud_fontsize.x * 0.5;
- pos.y = item_pos.y + i * (hud_fontsize.y * 1.25);
+ pos.y += hud_fontsize.y * 1.25;
}
}
- drawcolorcodedstring(pos, str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
- pos.x += str_width + hud_fontsize.x * 0.5;
- pos.x += ping_padding;
+
+ vector name_pos = pos;
+ if((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned)
+ name_pos.x += max(fieldsize, min_fieldsize) + 2 * fieldpadding + hud_fontsize.x * 0.25;
+ drawcolorcodedstring(name_pos, str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ if(field != "")
+ {
+ h_size.x = max(fieldsize, min_fieldsize) + 2 * fieldpadding;
+ h_size.y = hud_fontsize.y;
+ vector field_pos = pos;
+ if(!((this_team == NUM_SPECTATOR) && autocvar_hud_panel_scoreboard_spectators_aligned))
+ field_pos.x += column_width - h_size.x;
+ if(sbt_highlight)
+ drawfill(field_pos, h_size, '1 1 1', sbt_highlight_alpha, DRAWFLAG_NORMAL);
+ field_pos.x += fieldpadding + (max(fieldsize, min_fieldsize) - fieldsize) * 0.5;
+ drawstring(field_pos, field, hud_fontsize, sbt_field_rgb, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ }
+ pos.x += column_width;
+ pos.x += hud_fontsize.x;
}
return eX * item_pos.x + eY * (item_pos.y + i * hud_fontsize.y * 1.25);
}
{
if(pl.team == NUM_SPECTATOR)
{
+ for(tm = teams.sort_next; tm; tm = tm.sort_next)
+ if(tm.team == NUM_SPECTATOR)
+ break;
+ str = sprintf("%s (%d)", _("Spectators"), tm.team_size);
draw_beginBoldFont();
- drawstring(pos, _("Spectators"), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos, str, hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
draw_endBoldFont();
pos.y += 1.25 * hud_fontsize.y;
#include "player_skeleton.qh"
+#include <common/physics/movetypes/movetypes.qh>
#include "mutators/events.qh"
#include "../lib/csqcmodel/cl_player.qh"
#include "../lib/warpzone/anglestransform.qh"
-.float v_angle_x;
+.vector v_angle;
.float v_angle_save_x;
class(Skeleton) .float skeleton_info_modelindex;
{
if(e == csqcplayer)
{
- if(intermission)
+ if(e.move_movetype == MOVETYPE_NONE)
{
if(!e.v_angle_save_x)
e.v_angle_save_x = input_angles.x;
(vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o.x,
(vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o.y);
- float vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
-
float crosshairdistance = sqrt( pow(o.x - vid_conwidth/2, 2) + pow(o.y - vid_conheight/2, 2) );
- t = waypointsprite_scale * vidscale;
+ t = waypointsprite_scale;
a *= waypointsprite_alpha;
{
float waypointsprite_distancefadedistance;
float waypointsprite_alpha;
-const float SPRITE_HEALTHBAR_WIDTH = 144;
-const float SPRITE_HEALTHBAR_HEIGHT = 9;
+const float SPRITE_HEALTHBAR_WIDTH = 104;
+const float SPRITE_HEALTHBAR_HEIGHT = 7;
const float SPRITE_HEALTHBAR_MARGIN = 6;
const float SPRITE_HEALTHBAR_BORDER = 2;
const float SPRITE_HEALTHBAR_BORDERALPHA = 1;
MSG_CENTER_NOTIF(CTF_STALEMATE_CARRIER, 1, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Enemies can now see you on radar!"), "")
MSG_CENTER_NOTIF(CTF_STALEMATE_OTHER, 1, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "")
- MSG_CENTER_NOTIF(DEATH_MURDER_FRAG, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s"))
- MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", _("^K1%sYou were fragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s"))
- MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", _("^K1%sYou were fragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^BG%s"))
- MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s"))
- MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAG, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing"))
- MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAGGED, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", _("^K1%sYou were typefragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing!"))
- MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAGGED_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", _("^K1%sYou were typefragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing^BG%s"))
- MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAG_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s"))
-
- MSG_CENTER_NOTIF(NADE_THROW, 1, 0, 0, "", CPID_NADES, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the nade!"), "")
+ #define VERBOSE_MURDER(type) strcat(MURDER_##type, "^BG%s")
+
+ #define MURDER_FRAG _("^K3%sYou fragged ^BG%s")
+ #define MURDER_FRAG2 _("^K3%sYou scored against ^BG%s")
+ #define MURDER_FRAGGED _("^K1%sYou were fragged by ^BG%s")
+ #define MURDER_FRAGGED2 _("^K1%sYou were scored against by ^BG%s")
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAG, MURDER_FRAG2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAGGED, MURDER_FRAGGED2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", VERBOSE_MURDER(FRAGGED), VERBOSE_MURDER(FRAGGED2) )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", VERBOSE_MURDER(FRAG), VERBOSE_MURDER(FRAG2) )
+
+ #define MURDER_FRAG_FIRE _("^K3%sYou burned ^BG%s")
+ #define MURDER_FRAG_FIRE2 _("^K3%sYou scored against ^BG%s")
+ #define MURDER_FRAGGED_FIRE _("^K1%sYou were burned by ^BG%s")
+ #define MURDER_FRAGGED_FIRE2 _("^K1%sYou were scored against by ^BG%s")
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_FIRE, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAG_FIRE, MURDER_FRAG_FIRE2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_FIRE, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAGGED_FIRE, MURDER_FRAGGED_FIRE2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_FIRE_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", VERBOSE_MURDER(FRAGGED_FIRE), VERBOSE_MURDER(FRAGGED_FIRE2) )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_FIRE_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", VERBOSE_MURDER(FRAG_FIRE), VERBOSE_MURDER(FRAG_FIRE2) )
+
+ #define MURDER_FRAG_FREEZE _("^K3%sYou froze ^BG%s")
+ #define MURDER_FRAG_FREEZE2 _("^K3%sYou scored against ^BG%s")
+ #define MURDER_FRAGGED_FREEZE _("^K1%sYou were frozen by ^BG%s")
+ #define MURDER_FRAGGED_FREEZE2 _("^K1%sYou were scored against by ^BG%s")
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_FREEZE, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAG_FREEZE, MURDER_FRAG_FREEZE2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_FREEZE, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_FRAGGED_FREEZE, MURDER_FRAGGED_FREEZE2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAGGED_FREEZE_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", VERBOSE_MURDER(FRAGGED_FREEZE), VERBOSE_MURDER(FRAGGED_FREEZE2))
+ MSG_CENTER_NOTIF(DEATH_MURDER_FRAG_FREEZE_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", VERBOSE_MURDER(FRAG_FREEZE), VERBOSE_MURDER(FRAG_FREEZE2) )
+
+ #define MURDER_TYPEFRAG _("^K1%sYou typefragged ^BG%s")
+ #define MURDER_TYPEFRAG2 _("^K1%sYou scored against ^BG%s^K1 while they were typing")
+ #define MURDER_TYPEFRAGGED _("^K1%sYou were typefragged by ^BG%s")
+ #define MURDER_TYPEFRAGGED2 _("^K1%sYou were scored against by ^BG%s^K1 while typing")
+ MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAG, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_TYPEFRAG, MURDER_TYPEFRAG2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAGGED, 1, 1, 1, "spree_cen s1", CPID_Null, "0 0", MURDER_TYPEFRAGGED, MURDER_TYPEFRAGGED2 )
+ MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAGGED_VERBOSE, 1, 1, 4, "spree_cen s1 frag_stats", CPID_Null, "0 0", VERBOSE_MURDER(TYPEFRAGGED), VERBOSE_MURDER(TYPEFRAGGED2) )
+ MSG_CENTER_NOTIF(DEATH_MURDER_TYPEFRAG_VERBOSE, 1, 1, 2, "spree_cen s1 frag_ping", CPID_Null, "0 0", VERBOSE_MURDER(TYPEFRAG), VERBOSE_MURDER(TYPEFRAG2) )
+
+ MSG_CENTER_NOTIF(NADE_THROW, 1, 0, 0, "nade_key", CPID_NADES, "0 0", _("^BGPress ^F2%s^BG again to toss the nade!"), "")
MSG_CENTER_NOTIF(NADE_BONUS, 1, 0, 0, "", CPID_NADES, "0 0", _("^F2You got a ^K1BONUS GRENADE^F2!"), "")
MSG_CENTER_NOTIF(DEATH_SELF_AUTOTEAMCHANGE, 1, 0, 1, "death_team", CPID_Null, "0 0", _("^BGYou have been moved into a different team\nYou are now on: %s"), "")
MSG_CENTER_NOTIF(EXTRALIVES, 1, 0, 0, "", CPID_Null, "0 0", _("^F2You picked up some extra lives"), "")
- MSG_CENTER_NOTIF(FREEZETAG_FREEZE, 1, 1, 0, "s1", CPID_Null, "0 0", _("^K3You froze ^BG%s"), "")
- MSG_CENTER_NOTIF(FREEZETAG_FROZEN, 1, 1, 0, "s1", CPID_Null, "0 0", _("^K1You were frozen by ^BG%s"), "")
MSG_CENTER_NOTIF(FREEZETAG_REVIVE, 1, 1, 0, "s1", CPID_Null, "0 0", _("^K3You revived ^BG%s"), "")
MSG_CENTER_NOTIF(FREEZETAG_REVIVE_SELF, 1, 0, 0, "", CPID_Null, "0 0", _("^K3You revived yourself"), "")
MSG_CENTER_NOTIF(FREEZETAG_REVIVED, 1, 1, 0, "s1", CPID_Null, "0 0", _("^K3You were revived by ^BG%s"), "")
MSG_CENTER_NOTIF(NIX_COUNTDOWN, 1, 0, 2, "item_wepname", CPID_NIX, "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "")
MSG_CENTER_NOTIF(NIX_NEWWEAPON, 1, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "")
- MSG_CENTER_NOTIF(NADE, 1, 0, 0, "", CPID_Null, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "")
-
MSG_CENTER_NOTIF(ONS_CAPTURE, 1, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^BGYou captured %s^BG control point"), "")
MULTITEAM_CENTER(ONS_CAPTURE, 4, 1, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^TC^TT^BG team captured %s^BG control point"), "", NAME)
MSG_CENTER_NOTIF(ONS_CONTROLPOINT_SHIELDED, 1, 0, 0, "", CPID_ONS_CAPSHIELD, "0 0", _("^BGThis control point currently cannot be captured"), "")
MSG_CHOICE_NOTIF(CTF_PICKUP_ENEMY_TEAM, 1, 2, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY_TEAM, CENTER_CTF_PICKUP_ENEMY_TEAM_VERBOSE)
MSG_CHOICE_NOTIF(FRAG, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAG, CENTER_DEATH_MURDER_FRAG_VERBOSE)
MSG_CHOICE_NOTIF(FRAGGED, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED, CENTER_DEATH_MURDER_FRAGGED_VERBOSE)
+ MSG_CHOICE_NOTIF(FRAG_FIRE, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAG_FIRE, CENTER_DEATH_MURDER_FRAG_FIRE_VERBOSE)
+ MSG_CHOICE_NOTIF(FRAGGED_FIRE, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED_FIRE, CENTER_DEATH_MURDER_FRAGGED_FIRE_VERBOSE)
+ MSG_CHOICE_NOTIF(FRAG_FREEZE, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAG_FREEZE, CENTER_DEATH_MURDER_FRAG_FREEZE_VERBOSE)
+ MSG_CHOICE_NOTIF(FRAGGED_FREEZE, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED_FREEZE, CENTER_DEATH_MURDER_FRAGGED_FREEZE_VERBOSE)
MSG_CHOICE_NOTIF(TYPEFRAG, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAG, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE)
MSG_CHOICE_NOTIF(TYPEFRAGGED, 1, 1, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAGGED, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE)
race_diff: show time difference between f2 and f3
missing_teams: show which teams still need players
pass_key: find the keybind for "passing" or "dropping" in CTF game mode
+ nade_key: find the keybind for nade throwing
frag_ping: show the ping of a player
frag_stats: show health/armor/ping of a player
frag_pos: show score status and position in the match of a player
ARG_CASE(ARG_CS_SV, "race_diff", ((f2 > f3) ? sprintf(CCR("^1[+%s]"), mmssss(f2 - f3)) : sprintf(CCR("^2[-%s]"), mmssss(f3 - f2)))) \
ARG_CASE(ARG_CS, "missing_teams", notif_arg_missing_teams(f1)) \
ARG_CASE(ARG_CS, "pass_key", getcommandkey(_("drop flag"), "+use")) \
+ ARG_CASE(ARG_CS, "nade_key", getcommandkey(_("throw nade"), "dropweapon")) \
ARG_CASE(ARG_CS, "frag_ping", notif_arg_frag_ping(true, f2)) \
ARG_CASE(ARG_CS, "frag_stats", notif_arg_frag_stats(f2, f3, f4)) \
/*ARG_CASE(ARG_CS, "frag_pos", ((Should_Print_Score_Pos(f1)) ? sprintf("\n^BG%s", Read_Score_Pos(f1)) : ""))*/ \
STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, this) = Physics_ClientOption(this, "airaccel_sideways_friction", autocvar_sv_airaccel_sideways_friction);
STAT(MOVEVARS_AIRCONTROL, this) = Physics_ClientOption(this, "aircontrol", autocvar_sv_aircontrol);
STAT(MOVEVARS_AIRCONTROL_POWER, this) = Physics_ClientOption(this, "aircontrol_power", autocvar_sv_aircontrol_power);
+ STAT(MOVEVARS_AIRCONTROL_BACKWARDS, this) = Physics_ClientOption(this, "aircontrol_backwards", autocvar_sv_aircontrol_backwards);
STAT(MOVEVARS_AIRCONTROL_PENALTY, this) = Physics_ClientOption(this, "aircontrol_penalty", autocvar_sv_aircontrol_penalty);
STAT(MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, this) = Physics_ClientOption(this, "warsowbunny_airforwardaccel", autocvar_sv_warsowbunny_airforwardaccel);
STAT(MOVEVARS_WARSOWBUNNY_TOPSPEED, this) = Physics_ClientOption(this, "warsowbunny_topspeed", autocvar_sv_warsowbunny_topspeed);
void CPM_PM_Aircontrol(entity this, float dt, vector wishdir, float wishspeed)
{
- float k = 32 * (2 * IsMoveInDirection(this.movement, 0) - 1);
+ float movity = IsMoveInDirection(this.movement, 0);
+ if(PHYS_AIRCONTROL_BACKWARDS(this))
+ movity += IsMoveInDirection(this.movement, 180);
+
+ float k = 32 * (2 * movity - 1);
if (k <= 0)
return;
#define PHYS_AIRCONTROL(s) STAT(MOVEVARS_AIRCONTROL, s)
#define PHYS_AIRCONTROL_PENALTY(s) STAT(MOVEVARS_AIRCONTROL_PENALTY, s)
#define PHYS_AIRCONTROL_POWER(s) STAT(MOVEVARS_AIRCONTROL_POWER, s)
+#define PHYS_AIRCONTROL_BACKWARDS(s) STAT(MOVEVARS_AIRCONTROL_BACKWARDS, s)
#define PHYS_AIRSPEEDLIMIT_NONQW(s) STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, s)
#define PHYS_AIRSTOPACCELERATE(s) STAT(MOVEVARS_AIRSTOPACCELERATE, s)
#define PHYS_AIRSTRAFEACCELERATE(s) STAT(MOVEVARS_AIRSTRAFEACCELERATE, s)
REGISTER_STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, float)
REGISTER_STAT(MOVEVARS_AIRSTRAFEACCEL_QW, float)
REGISTER_STAT(MOVEVARS_AIRCONTROL_POWER, float)
+REGISTER_STAT(MOVEVARS_AIRCONTROL_BACKWARDS, bool)
noref bool autocvar_sv_gameplayfix_nogravityonground;
REGISTER_STAT(MOVEFLAGS, int, MOVEFLAG_VALID
| (autocvar_sv_gameplayfix_q2airaccelerate ? MOVEFLAG_Q2AIRACCELERATE : 0)
#ifdef CSQC
+bool autocvar_cl_items_nofade;
float autocvar_cl_animate_items = 1;
float autocvar_cl_ghost_items = 0.45;
vector autocvar_cl_ghost_items_color = '-1 -1 -1';
o_z = 0;
- float edgedistance_min, crosshairdistance;
- edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
+ float edgedistance_min = min((o.y - (vid_conheight * waypointsprite_edgeoffset_top)),
(o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
(vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
(vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
- float vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
+ float crosshairdistance = sqrt( pow(o.x - vid_conwidth/2, 2) + pow(o.y - vid_conheight/2, 2) );
- crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
-
- t = waypointsprite_scale * vidscale;
+ t = waypointsprite_scale;
a *= waypointsprite_alpha;
{
void vehicles_enter(entity pl, entity veh)
{
- // Remove this when bots know how to use vehicles
+ // Remove this when bots know how to use vehicles
if((IS_BOT_CLIENT(pl) && !autocvar_g_vehicles_allow_bots))
return;
else
this.nextthink = time + game_starttime;
- if(MUTATOR_CALLHOOK(VehicleSpawn, this))
+ if(!MUTATOR_CALLHOOK(VehicleInit, this))
return false;
return true;
setDependentAND(e, "notification_show_sprees", 1, 1, "notification_show_sprees_info", 1, 3);
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBoxEx_T(2, 1, "notification_CHOICE_FRAG", _("Add extra frag information to centerprint when available"), "-"));
- makeMulti(e, "notification_CHOICE_FRAGGED notification_CHOICE_TYPEFRAG notification_CHOICE_TYPEFRAGGED");
+ makeMulti(e, "notification_CHOICE_FRAGGED notification_CHOICE_TYPEFRAG notification_CHOICE_TYPEFRAGGED notification_CHOICE_FRAG_FIRE notification_CHOICE_FRAGGED_FIRE notification_CHOICE_FRAG_FREEZE notification_CHOICE_FRAGGED_FREEZE");
e.sendCvars = true;
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox_T(0, "notification_show_location", _("Add frag location to death messages when available"), "-"));
#include "mainwindow.qh"
#define ADDVALUE_FPS(i) e.addValue(e, strzone(sprintf(_("%d fps"), i)), #i)
+#define ADDVALUE_SPEED_KB(i) e.addValue(e, strzone(sprintf(_("%d kb/s"), i)), #i)
+#define ADDVALUE_SPEED_MB(i, j) e.addValue(e, strzone(sprintf(_("%d MB/s"), i)), #j)
entity makeXonoticMiscSettingsTab()
{
entity me;
me.TD(me, 1, 2, e = makeXonoticSlider_T(1, 5, 1, "cl_curl_maxdownloads",
_("Maximum number of concurrent HTTP/FTP downloads")));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Speed (kB/s):")));
- me.TD(me, 1, 2, e = makeXonoticSlider_T(10, 2000, 50, "cl_curl_maxspeed",
- _("Maximum download speed")));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Download speed:")));
+ me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_curl_maxspeed"));
+ ADDVALUE_SPEED_KB(50);
+ ADDVALUE_SPEED_KB(100);
+ ADDVALUE_SPEED_KB(300);
+ ADDVALUE_SPEED_KB(500);
+ ADDVALUE_SPEED_MB(1, 1000);
+ ADDVALUE_SPEED_MB(2, 2000);
+ e.addValue(e, strzone(_("Unlimited")), "0");
+ e.configureXonoticTextSliderValues(e);
me.TR(me);
if(cvar("developer"))
{
float autocvar_sv_airaccel_sideways_friction;
float autocvar_sv_aircontrol;
float autocvar_sv_aircontrol_power;
+float autocvar_sv_aircontrol_backwards;
float autocvar_sv_aircontrol_penalty;
float autocvar_sv_warsowbunny_airforwardaccel;
float autocvar_sv_warsowbunny_topspeed;
{
if ((this.respawn_flags & RESPAWN_FORCE) && !(this.respawn_time < this.respawn_time_max))
this.deadflag = DEAD_RESPAWNING;
- else if (!button_pressed || (this.respawn_flags & RESPAWN_FORCE))
+ else if (!button_pressed || (time >= this.respawn_time_max && (this.respawn_flags & RESPAWN_FORCE)))
this.deadflag = DEAD_DEAD;
break;
}
return false;
}
+bool frag_centermessage_override(entity attacker, entity targ, int deathtype, int kill_count_to_attacker, int kill_count_to_target)
+{
+ if(deathtype == DEATH_FIRE.m_id)
+ {
+ Send_Notification(NOTIF_ONE, attacker, MSG_CHOICE, CHOICE_FRAG_FIRE, targ.netname, kill_count_to_attacker, (IS_BOT_CLIENT(targ) ? -1 : targ.ping));
+ Send_Notification(NOTIF_ONE, targ, MSG_CHOICE, CHOICE_FRAGGED_FIRE, attacker.netname, kill_count_to_target, attacker.health, attacker.armorvalue, (IS_BOT_CLIENT(attacker) ? -1 : attacker.ping));
+ return true;
+ }
+
+ return MUTATOR_CALLHOOK(FragCenterMessage, attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target);
+}
+
.int buffs = _STAT(BUFFS); // TODO: remove
entity buff_FirstFromFlags(int _buffs);
void Obituary(entity attacker, entity inflictor, entity targ, int deathtype)
(IS_BOT_CLIENT(attacker) ? -1 : attacker.ping)
);
}
- else
+ else if(!frag_centermessage_override(attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target))
{
Send_Notification(
NOTIF_ONE,
return;
if(STAT(FROZEN, targ) && STAT(FROZEN, targ) != 3) // only reset health if target was frozen
+ {
targ.health = ((IS_PLAYER(targ)) ? start_health : targ.max_health);
+ targ.pauseregen_finished = time + autocvar_g_balance_pause_health_regen;
+ }
STAT(FROZEN, targ) = 0;
targ.revive_progress = 0;
float mapvote_nextthink;
float mapvote_keeptwotime;
float mapvote_timeout;
-string mapvote_message;
const float MAPVOTE_SCREENSHOT_DIRS_COUNT = 4;
string mapvote_screenshot_dirs[MAPVOTE_SCREENSHOT_DIRS_COUNT];
float mapvote_screenshot_dirs_count;
mapvote_timeout = time + autocvar_g_maplist_votable_timeout;
if(mapvote_count_real < 3 || mapvote_keeptwotime <= time)
mapvote_keeptwotime = 0;
- mapvote_message = "Choose a map and press its key!";
MapVote_Spawn();
}
{
float didntvote;
MapVote_TouchMask();
- mapvote_message = "Now decide between the TOP TWO!";
mapvote_keeptwotime = 0;
result = strcat(":vote:keeptwo:", mapvote_maps[firstPlace]);
result = strcat(result, ":", ftos(firstPlaceVotes));
void MapVote_Tick()
{
- float keeptwo;
float totalvotes;
- keeptwo = mapvote_keeptwotime;
MapVote_CheckRules_1(); // count
if(MapVote_CheckRules_2()) // decide
return;
/**/
MUTATOR_HOOKABLE(PlayerDies, EV_PlayerDies);
+/** allows overriding the frag centerprint messages */
+#define EV_FragCenterMessage(i, o) \
+ /** attacker */ i(entity, MUTATOR_ARGV_0_entity) \
+ /** target */ i(entity, MUTATOR_ARGV_1_entity) \
+ /** deathtype */ i(float, MUTATOR_ARGV_2_float) \
+ /** attacker kcount*/ i(int, MUTATOR_ARGV_3_int) \
+ /** targ killcount */ i(int, MUTATOR_ARGV_4_int) \
+ /**/
+MUTATOR_HOOKABLE(FragCenterMessage, EV_FragCenterMessage);
+
/** called when a player dies to e.g. remove stuff he was carrying */
#define EV_PlayHitsound(i, o) \
/** victim */ i(entity, MUTATOR_ARGV_0_entity) \
/**
* called when a vehicle initializes
- * return true to remove the vehicle
+ * return false to remove the vehicle
*/
-#define EV_VehicleSpawn(i, o) \
+#define EV_VehicleInit(i, o) \
/** vehicle */ i(entity, MUTATOR_ARGV_0_entity) \
/**/
-MUTATOR_HOOKABLE(VehicleSpawn, EV_VehicleSpawn);
+MUTATOR_HOOKABLE(VehicleInit, EV_VehicleInit);
/**
* called when a player enters a vehicle
{
//bprint("ASSAULT: new round\n");
- // Eject players from vehicles
- FOREACH_CLIENT(IS_PLAYER(it) && it.vehicle, vehicles_exit(it.vehicle, VHEF_RELEASE));
-
- IL_EACH(g_vehicles, true,
- {
- vehicles_clearreturn(it);
- vehicles_spawn(it);
- });
-
// up round counter
this.winning = this.winning + 1;
turret.team = 5; // this gets reversed when match starts?
}
-MUTATOR_HOOKFUNCTION(as, VehicleSpawn)
+MUTATOR_HOOKFUNCTION(as, VehicleInit)
{
entity veh = M_ARGV(0, entity);
- veh.nextthink = time + 0.5;
+ if(veh.active != ACTIVE_NOT)
+ veh.nextthink = time + 0.5;
+ return true;
}
MUTATOR_HOOKFUNCTION(as, HavocBot_ChooseRole)
}
else
{
- if(IS_PLAYER(frag_target))
- Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_FROZEN, frag_attacker.netname);
- if(IS_PLAYER(frag_attacker))
- Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_FREEZETAG_FREEZE, frag_target.netname);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_FREEZE, frag_target.netname, frag_attacker.netname);
}
if(gameover)
return true;
- entity player = M_ARGV(0, entity);
-
- if(STAT(FROZEN, player) == 1)
- {
- // keep health = 1
- player.pauseregen_finished = time + autocvar_g_balance_pause_health_regen;
- }
-
if(round_handler_IsActive())
if(!round_handler_IsRoundStarted())
return true;
int n;
-
- entity o;
- o = NULL;
+ entity o = NULL;
+ entity player = M_ARGV(0, entity);
//if(STAT(FROZEN, player))
//if(player.freezetag_frozen_timeout > 0 && time < player.freezetag_frozen_timeout)
//player.iceblock.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (player.freezetag_frozen_timeout - time) / (player.freezetag_frozen_timeout - player.freezetag_frozen_time);
M_ARGV(0, string) = "most";
}
+MUTATOR_HOOKFUNCTION(ft, FragCenterMessage)
+{
+ entity frag_attacker = M_ARGV(0, entity);
+ entity frag_target = M_ARGV(1, entity);
+ //float frag_deathtype = M_ARGV(2, float);
+ int kill_count_to_attacker = M_ARGV(3, int);
+ int kill_count_to_target = M_ARGV(4, int);
+
+ if(STAT(FROZEN, frag_target))
+ return; // target was already frozen, so this is just pushing them off the cliff
+
+ Send_Notification(NOTIF_ONE, frag_attacker, MSG_CHOICE, CHOICE_FRAG_FREEZE, frag_target.netname, kill_count_to_attacker, (IS_BOT_CLIENT(frag_target) ? -1 : frag_target.ping));
+ Send_Notification(NOTIF_ONE, frag_target, MSG_CHOICE, CHOICE_FRAGGED_FREEZE, frag_attacker.netname, kill_count_to_target, frag_attacker.health, frag_attacker.armorvalue, (IS_BOT_CLIENT(frag_attacker) ? -1 : frag_attacker.ping));
+
+ return true;
+}
+
void freezetag_Initialize()
{
freezetag_teams = autocvar_g_freezetag_teams_override;
// increment frag counter for used weapon type
Weapon w = DEATH_WEAPONOF(deathtype);
- if(w != WEP_Null)
- if(accuracy_isgooddamage(attacker, this))
- attacker.accuracy.(accuracy_frags[w.m_id-1]) += 1;
+ if(w != WEP_Null && accuracy_isgooddamage(attacker, this))
+ attacker.accuracy.(accuracy_frags[w.m_id-1]) += 1;
MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, this, deathtype, damage);
excess = M_ARGV(4, float);
*/
int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol)
{
- if (!teamsay && !privatesay) if (substring(msgin, 0, 1) == " ")
+ if (!teamsay && !privatesay && substring(msgin, 0, 1) == " ")
msgin = substring(msgin, 1, -1); // work around DP say bug (say_team does not have this!)
msgin = formatmessage(source, msgin);
float W_WeaponRateFactor(entity this)
{
- float t = 1.0 / g_weaponratefactor;
+ float t = 1;
+ if(g_weaponratefactor > 0)
+ t = 1.0 / g_weaponratefactor;
MUTATOR_CALLHOOK(WeaponRateFactor, t, this);
t = M_ARGV(0, float);