]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'martin-t/nades' into 'master'
authorMario <zacjardine@y7mail.com>
Wed, 28 Sep 2016 07:09:07 +0000 (07:09 +0000)
committerMario <zacjardine@y7mail.com>
Wed, 28 Sep 2016 07:09:07 +0000 (07:09 +0000)
fix nades colliding with the player himself (unless g_nades_nade_small is 1)

I am not sure if this is a good enough fix but it seems to work. Previously, the nades were often thrown from the "backup" location because with the default offset they were partially inside the player.

See merge request !367

63 files changed:
.gitlab-ci.yml
_hud_common.cfg
defaultXonotic.cfg
gamemodes.cfg
minigames.cfg
mutators.cfg
notifications.cfg
physics.cfg
physicsCPMA.cfg
physicsFruit.cfg
physicsHavoc.cfg
physicsLeeStricklin-ModdedFruit.cfg
physicsLeeStricklin.cfg
physicsLeeStricklinOld.cfg
physicsLzd.cfg
physicsNexuiz10.cfg
physicsNexuiz11.cfg
physicsNexuiz151.cfg
physicsNexuiz151b.cfg
physicsNexuiz16rc1.cfg
physicsNexuiz20.cfg
physicsNexuiz25.cfg
physicsNexuiz26.cfg
physicsNoQWBunny-nexbased.cfg
physicsQ.cfg
physicsQ2.cfg
physicsQ2a.cfg
physicsQ3.cfg
physicsQBF.cfg
physicsQBFplus.cfg
physicsSamual.cfg
physicsWarsow.cfg
physicsWarsowClassicBunny.cfg
physicsWarsowDev.cfg
physicsX.cfg
physicsX010.cfg
physicsX07.cfg
physicsXDF.cfg
physicsXDFLight.cfg
qcsrc/client/autocvars.qh
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/player_skeleton.qc
qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc
qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh
qcsrc/common/notifications/all.inc
qcsrc/common/notifications/all.qh
qcsrc/common/physics/player.qc
qcsrc/common/physics/player.qh
qcsrc/common/stats.qh
qcsrc/common/t_items.qh
qcsrc/common/turrets/cl_turrets.qc
qcsrc/common/vehicles/sv_vehicles.qc
qcsrc/menu/xonotic/dialog_settings_game_messages.qc
qcsrc/menu/xonotic/dialog_settings_misc.qc
qcsrc/server/autocvars.qh
qcsrc/server/client.qc
qcsrc/server/g_damage.qc
qcsrc/server/mapvoting.qc
qcsrc/server/mutators/events.qh
qcsrc/server/mutators/mutator/gamemode_assault.qc
qcsrc/server/mutators/mutator/gamemode_freezetag.qc
qcsrc/server/player.qc
qcsrc/server/weapons/weaponsystem.qc

index afd12e592f5e3a5de8dbc67cce4461b2d8efe74b..2d4c2cc5642b8f514adad161fc9052c318f00af9 100644 (file)
@@ -30,7 +30,7 @@ test_sv_game:
     - 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 '^:'
index 3e120e92cbe82bd5c7f2acc7c58a4f7150233076..c7befdd232dd79479a9c2a7b54c81120e9708150 100644 (file)
@@ -92,7 +92,7 @@ seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight 0.1 "
 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"
@@ -111,6 +111,7 @@ seta hud_panel_scoreboard_namesize 15 "size limit of player names and relative c
 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
index 9055264dd6042d03c6fff5d6107317b5d86834be..22e0624ceb78454ed87843eb596a735f7c9f8778 100644 (file)
@@ -85,6 +85,8 @@ seta cl_spawn_event_particles 1 "pointparticles effect whenever a player spawns"
 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
@@ -287,6 +289,8 @@ set sv_gibhealth 100 "Minus health a dead body must have in order to get gibbed"
 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"
@@ -682,7 +686,8 @@ alias sv_fbskin_off "sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultpl
 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"
 
@@ -694,7 +699,7 @@ set sv_motd ""
 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
@@ -703,7 +708,7 @@ seta g_maplist_votable_abstain 0    "when 1, you can abstain from your vote"
 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"
@@ -1448,6 +1453,8 @@ alias menu_sync "menu_cmd sync"
 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"
index add2332726f51f1eb52df2f2e495a9be791f0693..7d776b3b77fa5bc76c9fce1fc4ea7b0682da4737 100644 (file)
@@ -259,9 +259,10 @@ set g_ctf_oneflag_reverse 0 "apply reverse mode to oneflag CTF (take flag to ene
 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"
index 6dfec5088f886a3b229b0185c35f2e6d24a4ff17..4be8cf69bb9ce4d0737cfd1c7d05f94ec0850fd6 100644 (file)
@@ -19,3 +19,4 @@ set sv_minigames_snake_wrap 0 "Wrap around the edges of the screen instead of dy
 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
index 7910786107c1685dd05f2e896ea65d976a870607..787ec7e3c773c44757f000040cfa918a009db5a0 100644 (file)
@@ -10,7 +10,8 @@ set g_dodging 0 "set to 1 to enable dodging in games"
 
 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"
@@ -20,6 +21,7 @@ set sv_dodging_height_threshold 10 "the maximum height above ground where to all
 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
 
 
 // ===========
@@ -187,6 +189,7 @@ set g_nades_spawn 1 "give nades right away when player spawns rather than delayi
 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
index 2409b83d68e961634a316d738c81beb1b030fcb5..6aa1ee3b7d37fc66b0dee4979e396acd7025d1f2 100644 (file)
@@ -420,7 +420,7 @@ seta notification_INFO_WEAPON_TUBA_SUICIDE "1" "0 = off, 1 = print to console, 2
 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"
@@ -488,7 +488,15 @@ seta notification_CENTER_CTF_STALEMATE_CARRIER "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"
@@ -537,8 +545,6 @@ seta notification_CENTER_DOOR_LOCKED_NEED "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"
@@ -583,7 +589,6 @@ seta notification_CENTER_LMS_NOLIVES "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"
@@ -802,7 +807,7 @@ seta notification_WEAPON_TUBA_SUICIDE "1" "Enable this multiple notification"
 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"
@@ -847,6 +852,14 @@ seta notification_CHOICE_FRAG "1" "Choice for this notification 0 = off, 1 = def
 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"
@@ -869,4 +882,4 @@ seta notification_show_sprees_info "3" "Show spree information in MSG_INFO messa
 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
index e9fe5628940d9597fd5843533b54bced13066ae0..92fccaa42854ce67fef60c5cf5eb8ba4f5b0da45 100644 (file)
@@ -28,6 +28,7 @@ set g_physics_xonotic_airaccel_qw_stretchfactor 2
 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
@@ -56,6 +57,7 @@ set g_physics_nexuiz_airaccel_qw_stretchfactor 0
 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
@@ -84,6 +86,7 @@ set g_physics_quake_airaccel_qw_stretchfactor 0
 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
@@ -112,6 +115,7 @@ set g_physics_warsow_airaccel_qw_stretchfactor 0
 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
@@ -140,6 +144,7 @@ set g_physics_defrag_airaccel_qw_stretchfactor 0
 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
@@ -168,6 +173,7 @@ set g_physics_quake3_airaccel_qw_stretchfactor 0
 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
@@ -196,6 +202,7 @@ set g_physics_vecxis_airaccel_qw_stretchfactor 0
 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
@@ -224,6 +231,7 @@ set g_physics_quake2_airaccel_qw_stretchfactor 0
 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
@@ -252,6 +260,7 @@ set g_physics_bones_airaccel_qw_stretchfactor 0
 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
index e4bbad3d48630aa95c9f3463fdd1d327c7323a12..f2a4209c25eb44ee435273856d0c87720d7c00de 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index ee44b5547a052717cde7f28fb0f52063e638c65f..efe5b46ac3854ad774019787a0391140e315de76 100644 (file)
@@ -22,6 +22,7 @@ sv_maxairstrafespeed 100
 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
index 6aac341780e7573cbe580b714e62b747d61e6612..8d02ff46271260092d0fa52b2902adda3599965f 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 90eaa49c1223cd4bacf7aa7e228dc4670f88240b..61ce6557dfb15d7ac1b55d0128039c12d92e1507 100644 (file)
@@ -31,6 +31,7 @@ sv_airstrafeaccel_qw -0.97
 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
index 03081fdab7554b9c5118b795ac8b86987ff966a6..53ec90148e32aa7b1819454f57cba876ea759958 100644 (file)
@@ -31,6 +31,7 @@ sv_airstrafeaccel_qw -0.95
 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
index ef213a70f9d356226b401c0779752d85d69c7157..6a24567a93e518f68b347c6292d2e962c4279130 100644 (file)
@@ -26,6 +26,7 @@ sv_airstrafeaccel_qw 0
 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
index 51c49d7832dbf0197ca6a2ab5d456389ce675ebf..f6f74cd21a9b88eabd7f1c278cf6f4ad320b6c98 100644 (file)
@@ -24,6 +24,7 @@ sv_airstrafeaccel_qw 0
 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
index 0ce33aa95132362f57bb28eeec904c6549bed91e..9292016afe5d483864082f9f87e0b01483635f70 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 08711fd5b0f6905b33ff2688261f0e0543611922..660e7b818323ce0b654d4a58a9743c88d8897809 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 092985cae51a00a87a76cf26a78519c9f5d3f127..2c2e94c5f4dd7042ca9e041ed2244485ff500237 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index c6d9bef4b912d82e5200691d82a3fb55627b4d88..45a46cb46e24711f5cb5055b144af9a989efb399 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 5e0ee6ae0c6f265690c3783be05c3d10f35a1d19..86f1c31c744679d6bd61a548f5882f1a038f8817 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index d129a2db05ebada4a9698aeafcfedbb9456ac2d9..fe461768851079b603981d8d90cd6d815be5a143 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 8a52299763d537423fb2012f6a9ed304c969ef0e..ed45598a9bb4a31039f5bf1804b2f1c61c9282b9 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 4df3f211ebe490134394e21d60a35a0b739fae6b..3f7cd58f18f35567b43d626ccb55a0e3cbed412f 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 3e905428f76d52f1183cde4fc116ccabc0268afa..77660a426a10abb2fa60168c63016f7e65eb5ef3 100644 (file)
@@ -32,6 +32,7 @@ sv_airstrafeaccel_qw -0.9825
 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
index 448e087f46f20c1d0287dfd29c9a605a93266fcc..609a8f3d30f6d7829fc779c6147b8bce79134a36 100644 (file)
@@ -24,6 +24,7 @@ sv_airstrafeaccel_qw 0
 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
index 124c50660a1046ca8bf9ce7245a4d9579a0ff71c..a9fbe166da3bbe3321a7741d5eda482c3507295b 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 580f6257fa65f2bde52c74983f72492e45456f2f..87817dfcfd46a275d968daf57005c1d627be36ae 100644 (file)
@@ -24,6 +24,7 @@ sv_airstrafeaccel_qw 0
 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
index 6f00896b671b4b542115d6270c96b4bac7d08c20..7363b216dea7e8e34be9dc4871066baae213bc9c 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 31963e9feee4dc1dc6691514a081bde9d3765c7f..adc9df69c97af22d1644dab9d4cec72a78882982 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 82463859835480526e90bbae65db204238344fd7..596d6ca3b8ea78b2e524d60a423f56bc627b2f18 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 6858892e3b3ad27b1c8a8e8d4257c7a650e269c6..9041601e2fd601ea734d80b12440ea0a4d1ab728 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 50101d73d43165843ecf32f08b55fb33aff8fb2d..5fbe22bab998900fd02a8e7ff24c1cebe9b2eb8f 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index c4c3535a7f9ac1c74d3daa7a7c7645f4daaa9e27..3b28d90999966f1cc73b4c04fbcbf639e4173f2b 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index 331723ec9317539cbc2b2e4bdc139a99b52abb94..cf31a3f932790052f79df433b372a5f022cae33b 100644 (file)
@@ -23,6 +23,7 @@ sv_airstrafeaccel_qw 0
 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
index c109e1157636e5b6fb91f658a0c8ba37910b922f..1fe218f06adf5d9837cf570c79720d8bf3b16859 100644 (file)
@@ -38,6 +38,7 @@ sv_airstrafeaccel_qw -0.95
 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
index 6dadcf161bd1078d9b6b4227e84c6d9624b0f7e0..0dfe0b46c9970bf689e257c720dab1dd846ff9d2 100644 (file)
@@ -31,6 +31,7 @@ sv_airstrafeaccel_qw -0.95
 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
index a3e42a977eca1a69fc3ba438f7aa69f305466e34..132aa9eff68cec24fde30da5dfb24bfb2becc04f 100644 (file)
@@ -37,6 +37,7 @@ sv_airstrafeaccel_qw -0.95
 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
index 8597e9e005d77020ea96c2375efa78ba56887b8c..5a3aaa393bd117eaf455bfe99342e4979adc1b98 100644 (file)
@@ -29,6 +29,7 @@ sv_airstrafeaccel_qw 1
 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
index 6cb0780dd988ee2f7ffafed71d16e8348d0a8b4b..4d1f652bb81bbae8bfa7ba6c653d0300012cc5e5 100644 (file)
@@ -29,6 +29,7 @@ sv_airstrafeaccel_qw -0.987
 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
index 8e2c722e8f374ec8baee0f4a0204ad1f296fcc04..a4fcd3e841f2a227d0d7cf9dee934b4447a0e70c 100644 (file)
@@ -452,4 +452,3 @@ float autocvar_crosshair_rpc_alpha = 1;
 float autocvar_crosshair_rpc_size = 1;
 int autocvar_cl_nade_timer;
 bool autocvar_r_drawviewmodel;
-bool autocvar_cl_items_nofade;
index 5e48bc371e8ae26a5d32997599b5c35794de35b7..2361ccff7a0a585ed1e5a7d444d4aad051a37612 100644 (file)
@@ -61,6 +61,7 @@ bool autocvar_hud_panel_scoreboard_dynamichud = false;
 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;
 
 
@@ -923,8 +924,18 @@ vector Scoreboard_DrawOthers(vector item_pos, vector rgb, int this_team, entity
        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)
@@ -932,24 +943,30 @@ vector Scoreboard_DrawOthers(vector item_pos, vector rgb, int this_team, entity
                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)
@@ -960,12 +977,28 @@ vector Scoreboard_DrawOthers(vector item_pos, vector rgb, int this_team, entity
                        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);
 }
@@ -1544,8 +1577,12 @@ void Scoreboard_Draw()
        {
                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;
 
index 9a2f32931f8c3c587c37381613a7d0c5446fea70..66827c8f30e3bdc2bfeb9508ce64a5a69bf86bea 100644 (file)
@@ -1,10 +1,11 @@
 #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;
@@ -181,7 +182,7 @@ void skeleton_from_frames(entity e, bool is_dead)
        {
                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;
index 7e5f79317f6dc046238f83bf5c8995da2b12b077..e7a33567b62227403780bb71320f25ea9f56bbc0 100644 (file)
@@ -611,11 +611,9 @@ void Draw_WaypointSprite(entity this)
     (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;
 
     {
index 6a420b734eacd1dcdf74dd37846cfc4d025cc48f..62a7cac61123efc52393d6f814c48521612a4eee 100644 (file)
@@ -73,8 +73,8 @@ float waypointsprite_distancefadescale;
 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;
index b9f7b36a91302663bb27857caae3fb061d9c0452..e6be6b1007c30ce0a6de83607c674ac98b9d9dc9 100644 (file)
     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)
index 2a1eb458f4a8a4cef20746a2cd04a9ebb313c635..e7a02dd65947354eec106c17a68275eebfeb2a85 100644 (file)
@@ -352,6 +352,7 @@ float autocvar_notification_show_sprees_center_specialonly = true;
        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
@@ -412,6 +413,7 @@ string BUFF_NAME(int i);
        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)) : ""))*/ \
index f5c0e0316e3340bb995e04577ad9719375c063b8..4eb527d62adeddc73a870d334afab0c8ca42e9d2 100644 (file)
@@ -49,6 +49,7 @@ void Physics_UpdateStats(entity this, float maxspd_mod)
        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);
@@ -119,7 +120,11 @@ void PM_ClientMovement_UpdateStatus(entity this)
 
 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;
 
index fb7edc83a3b571e4820cd4304e0bb8fcc3973dc8..9f540148deb9b8c08908376e644c4c5e93a862a0 100644 (file)
@@ -46,6 +46,7 @@ bool IsFlying(entity a);
 #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)
index d6aa068ea67eb775da3cba979c9a62398e9cbcf2..e6cc5530cf806f819cb061faa3937966ac9b177b 100644 (file)
@@ -272,6 +272,7 @@ REGISTER_STAT(MOVEVARS_AIRCONTROL_PENALTY, float)
 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)
index 1c65e806af7e97544ef801904c7f9c1aeb0e741d..06e14555ed0aca53537f9c2143ceabfc96b5b2b7 100644 (file)
@@ -29,6 +29,7 @@ void StartItem(entity this, entity a);
 
 #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';
index a893b3e8a77d30c281ef602770dc6098319947f6..c21e327d4470655336e6033d1823587c65f6e458 100644 (file)
@@ -156,17 +156,14 @@ void turret_draw2d(entity this)
 
        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;
 
        {
index 60a8ee07760fbe897e58cd58fab2e22904337728..cd62f0746b69f6b2dc892f42a1938807cf566d07 100644 (file)
@@ -900,7 +900,7 @@ bool vehicle_impulse(entity this, int imp)
 
 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;
 
@@ -1224,7 +1224,7 @@ bool vehicle_initialize(entity this, Vehicle info, bool nodrop)
        else
                this.nextthink = time + game_starttime;
 
-       if(MUTATOR_CALLHOOK(VehicleSpawn, this))
+       if(!MUTATOR_CALLHOOK(VehicleInit, this))
                return false;
 
        return true;
index 0ea55f637e86e783f5853f4124b3888f616d12a9..dc28dc9ba62458bf820fd01cce0626b601a3dc33 100644 (file)
@@ -56,7 +56,7 @@ void XonoticGameMessageSettingsTab_fill(entity me)
                        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"), "-"));
index ede6543e7d983cfed14ee19587da465bd7411b06..8f98df58164e2fbd9933d17492ee6ea2f5ef4c05 100644 (file)
@@ -9,6 +9,8 @@
 #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;
@@ -51,9 +53,16 @@ void XonoticMiscSettingsTab_fill(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"))
                {
index 6faddf4dde63d51399a626be342967caf0def555..c4f77dfad38446d8e11fe91466db06e6d1319ae7 100644 (file)
@@ -509,6 +509,7 @@ float autocvar_sv_warsowbunny_turnaccel;
 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;
index dd9aab7fabc0c55c29c85680c2e32cc24f9ee434..e42807ec5de086baf5572a1c23f3398b165b6a3d 100644 (file)
@@ -2333,7 +2333,7 @@ void PlayerPreThink (entity this)
                                        {
                                                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;
                                        }
index 3e448363655f6ce712a84efb3af74f3202a68db1..cb43861acf4ae272ffc7f67ae07950dbf2c03977 100644 (file)
@@ -264,6 +264,18 @@ float Obituary_WeaponDeath(
        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)
@@ -413,7 +425,7 @@ 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,
@@ -560,7 +572,10 @@ void Unfreeze (entity targ)
                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;
index 9a1ed5c040fd6e8d55cc0c44df8204a1dbc78936..29768893a727dc3730bb723dfdb38f25ee72fb5a 100644 (file)
@@ -14,7 +14,6 @@
 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;
@@ -255,7 +254,6 @@ void MapVote_Init()
        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();
 }
@@ -561,7 +559,6 @@ float MapVote_CheckRules_2()
                {
                        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));
@@ -592,10 +589,8 @@ float MapVote_CheckRules_2()
 
 void MapVote_Tick()
 {
-       float keeptwo;
        float totalvotes;
 
-       keeptwo = mapvote_keeptwotime;
        MapVote_CheckRules_1(); // count
        if(MapVote_CheckRules_2()) // decide
                return;
index 3743c6b94978977769c9112e30a024e4d912b86a..179faf1f6b6e93d35ad66df811843326594e4504 100644 (file)
@@ -63,6 +63,16 @@ MUTATOR_HOOKABLE(ClientDisconnect, EV_ClientDisconnect);
     /**/
 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) \
@@ -529,12 +539,12 @@ MUTATOR_HOOKABLE(HelpMePing, EV_HelpMePing);
 
 /**
  * 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
index 10a8f644f89c7e2389c4c879ede4db57e485eef2..b032ab01949db9c6453da64da4d96058e9a926ce 100644 (file)
@@ -185,15 +185,6 @@ void assault_new_round(entity this)
 {
        //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;
 
@@ -540,11 +531,13 @@ MUTATOR_HOOKFUNCTION(as, TurretSpawn)
                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)
index 0143760872504e1fbc6a143714b6bc2e5eba47fb..32c91d8c17d20fb6f6e9fdaeb4eb9b0f0e31ec98 100644 (file)
@@ -378,10 +378,6 @@ MUTATOR_HOOKFUNCTION(ft, PlayerDies)
        }
        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);
        }
 
@@ -436,22 +432,13 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
        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);
@@ -565,6 +552,23 @@ MUTATOR_HOOKFUNCTION(ft, SetWeaponArena)
                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;
index e95ae98193281c9ea5a6b1226d22b7a52548b4db..e270f38df034c3232cdcddbb12ed034f10ace7e0 100644 (file)
@@ -555,9 +555,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 
         // 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);
@@ -685,7 +684,7 @@ void dedicated_print(string input)
  */
 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);
index 451c50ec12f13b861254c75a3d4313fea115e0e9..4968d3c31f4d2f813ac5cdddde94f167ec2b52e4 100644 (file)
@@ -21,7 +21,9 @@
 
 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);