]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/respawn_delays
authorMario <mario.mario@y7mail.com>
Tue, 1 Oct 2013 13:07:49 +0000 (06:07 -0700)
committerMario <mario.mario@y7mail.com>
Tue, 1 Oct 2013 13:07:49 +0000 (06:07 -0700)
1  2 
defaultXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/defs.qh

diff --combined defaultXonotic.cfg
index d0817109e9daebd4d61ef180b5bb4b73dd61f3ab,d967d53d555dee2e8dd5f98b46f4c98f8ff1d9d1..5f618ceb7260d02ce6fcde04ba0b2922d32d1437
@@@ -37,6 -37,8 +37,8 @@@ alias -hook -button
  alias use "impulse 21"
  
  // for backwards compatibility
+ // TODO Remove after 0.8 release!
+ cl_particles_forcetraileffects 1
  
  alias dropweapon "impulse 17"
  alias +show_info +button7
@@@ -91,12 -93,16 +93,16 @@@ vid_fullscreen 
  vid_width 1024
  vid_height 768
  vid_pixelheight 1
+ vid_resizable 0 // cannot be turned on before it is sure it cannot cause a r_restart
+ vid_desktopfullscreen 1
  prvm_language en
  set _menu_prvm_language ""
  set _menu_vid_width "$vid_width"
  set _menu_vid_height "$vid_height"
  set _menu_vid_pixelheight "$vid_pixelheight"
+ set _menu_vid_desktopfullscreen "$vid_desktopfullscreen"
  seta menu_vid_scale 0
+ seta menu_vid_allowdualscreenresolution 0
  // 2D resolution 800x600
  vid_conwidth 800
  vid_conheight 600
@@@ -107,6 -113,33 +113,33 @@@ v_deathtilt 0 // needed for spectators 
  exec sRGB-disable.cfg
  vid_sRGB_fallback 2
  r_hdr_glowintensity 1
+ // #define Image_LinearFloatFromsRGBFloat(c) (((c) <= 0.04045f) ? (c) * (1.0f / 12.92f) : (float)pow(((c) + 0.055f)*(1.0f/1.055f), 2.4f))
+ set rpn_sRGB_to_linear "dup 0.055 add 1.055 div 2.4 pow exch 12.92 div dup 0.0031308 gt when"
+ // #define Image_sRGBFloatFromLinearFloat(c) (((c) < 0.0031308f) ? (c) * 12.92f : 1.055f * (float)pow((c), 1.0f/2.4f) - 0.055f)
+ set rpn_linear_to_sRGB "dup 1.0 2.4 div pow 1.055 mul 0.055 sub exch 12.92 mul dup 0.04045 ge when"
+ // -nosRGB to -sRGB sky shader conversion:
+ //
+ // q3map_sunExt 1 0.6875 0.375 340 25 47 0 16
+ //                                    ^^ elevation
+ //                             ^^^ sunlight
+ // q3map_skylight 110 3
+ //                ^^^ skylight
+ //
+ // With that, do (the last parameter is the ratio of skylight you assume hits
+ // the surfaces, about 0.25 for inner surfaces near sky, about 1.00 on
+ // terrain):
+ // ]skybox_nosRGB_to_sRGB 340 47 110 0.25
+ // rpn: still on stack: new_sunlight:
+ // rpn: still on stack: 380.464142
+ // rpn: still on stack: new_skylight:
+ // rpn: still on stack: 9.32523632
+ //
+ // The equivalent -sRGB shader then will have:
+ //
+ // q3map_sunExt 1 0.6875 0.375 380.464142 25 47 0 16
+ // q3map_skylight 9.32523632 3
+ alias skybox_nosRGB_to_sRGB "rpn $3 402.123 $4 div div $rpn_sRGB_to_linear 402.123 $4 div mul /new_skylight: $3 402.123 $4 div div $1 256 div $2 0.017453 mul sin mul add $rpn_sRGB_to_linear $3 402.123 $4 div div $rpn_sRGB_to_linear sub 256 mul $2 0.017453 mul sin div /new_sunlight:"
  
  // these settings determine how much the view is affected by movement/damage
  cl_smoothviewheight 0.05 // time of the averaging to the viewheight value so that it creates a smooth transition for crouching and such. 0 for instant transition
@@@ -243,7 -276,7 +276,7 @@@ set cl_deathglow 0.8 "number of second
  
  set sv_gibhealth 100 "Minus health a dead body must have in order to get gibbed"
  
- // fragmessage: This allows extra information to be displayed with the frag centerprints. 
+ // fragmessage: This allows extra information to be displayed with the frag centerprints.
  set sv_fraginfo 1 "Enable extra frag message information, 0 = Never display, 1 = Display only in warmup mode; 2 = Always display"
  set sv_fraginfo_ping 1 "Enable ping display information, 0 = Never display, 1 = Always display (If the player is a bot, it will say bot instead of the ping.)"
  set sv_fraginfo_handicap 1 "Enable handicap display information, 0 = Never display, 1 = Only when the player has handicap on, 2 = Always display (Displays Off if disabled)"
@@@ -282,7 -315,7 +315,7 @@@ seta sv_defaultplayermodel_pink "" "\"\
  seta sv_defaultplayerskin_pink 0
  seta sv_defaultplayercolors ""        "set to 16*shirt+pants to force a color, note: it does NOT depend on defaultcharacter! Set to \"\" to disable"
  set sv_autoscreenshot 0 "if set to 1, the server forces all clients to create a local screenshot once the map ended"
- net_messagetimeout 300
+ net_messagetimeout 30
  net_connecttimeout 30
  sv_jumpstep 1 // step up stairs while jumping, makes it easier to reach ledges
  set ekg 0     "Throw huge amounts of gibs"
@@@ -378,13 -411,6 +411,6 @@@ set g_weapon_throwable 1 "if set to 1, 
  set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default"
  set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition"
  set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
- set g_minstagib 0     "enable minstagib"
- set g_minstagib_extralives 1  "how many extra lives you will get per powerup"
- set g_minstagib_ammo_start 10 "starting ammo"
- set g_minstagib_ammo_drop 5   "how much ammo you'll get for weapons or cells"
- set g_minstagib_invis_alpha 0.15
- set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup"
- set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health"
  set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
  set g_weaponarena_random "0"  "if set to a number, only that weapon count is given on every spawn (randomly)"
  set g_weaponarena_random_with_laser "1"       "additionally, always provide the laser in random weapon arena games"
@@@ -414,23 -440,6 +440,6 @@@ set g_player_alpha 
  set g_player_brightness 0     "set to 2 for brighter players"
  seta g_balance_cloaked_alpha 0.25
  
- set g_sandbox 0 "allow players to spawn and edit objects around the map"
- set g_sandbox_info 1 "print object information to the server. 1 prints info about spawned / removed objects, 2 also prints info about edited objects"
- set g_sandbox_readonly 0 "when this mode is active, players cannot modify objects or use any sandbox commands"
- set g_sandbox_storage_name default "name of the selected storage to use"
- set g_sandbox_storage_autosave 5 "storage is automatically saved every specified number of seconds"
- set g_sandbox_storage_autoload 1 "if a storage file exists for the given map, automatically load it at startup"
- set g_sandbox_editor_flood 1 "players must wait this many seconds between spawning objects"
- set g_sandbox_editor_maxobjects 1000 "maximum number of objects that may exist at a time"
- set g_sandbox_editor_free 1 "0 = players can only copy or edit their own objects, 1 = players can copy but not edit other objects, 2 = players can copy and edit all object"
- set g_sandbox_editor_distance_spawn 200 "distance at which objects spawn in front of the player"
- set g_sandbox_editor_distance_edit 300 "distance at which players can edit or remove objects they are looking at"
- set g_sandbox_object_scale_min 0.1 "minimum scale that objects can be set to"
- set g_sandbox_object_scale_max 2 "maximum scale that objects can be set to"
- set g_sandbox_object_material_velocity_min 100 "velocity objects must have while colliding for material effects to be applied"
- set g_sandbox_object_material_velocity_factor 0.002 "velocity range which decides the intensity of material effects"
- set cl_sandbox_clipboard ""
  seta menu_sandbox_spawn_model ""
  seta menu_sandbox_attach_bone ""
  seta menu_sandbox_edit_skin 0
@@@ -449,33 -458,13 +458,14 @@@ bind f7 menu_showsandboxtool
  set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
  set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps"
  
- set welcome_message_time 8
  set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up"
  
- set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in all balance configs, regardless of g_projectiles_damage"
- set g_dodging 0 "set to 1 to enable dodging in games"
- set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs"
- 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_delay 0.5 "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_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)"
- set sv_dodging_height_threshold 10 "the maximum height above ground where to allow dodging"
- 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 g_spawn_alloweffects 1 "allow clients to enable spawn point and event effects such as particles and sounds, see cl_spawn_ cvars for more info"
  set g_spawn_furthest 1 "this amount of the spawns shall be far away from any players"
  set g_spawn_useallspawns 0 "use all spawns, e.g. also team spawns in non-teamplay, and all spawns, even enemy spawns, in teamplay"
- set g_spawn_near_teammate 0 "if set, players prefer spawns near a team mate"
- set g_spawn_near_teammate_distance 640 "max distance to consider a spawn to be near a team mate"
  // respawn delay
  set g_respawn_delay 2 "number of seconds you have to wait before you can respawn again"
 +set g_respawn_delay_max 5 "number of seconds you can wait before you're forced to respawn (only effective with g_forced_respawn 1)"
  set g_respawn_waves 0 "respawn in waves (every n seconds), intended to decrease overwhelming base attacks"
  
  // overtime
@@@ -750,13 -739,6 +740,6 @@@ bind F2 vn
  //used for spectate/observer mode
  bind F3 spec
  
- // NIX (No Items Xonotic) - at each time, everyone uses the same weapon,
- // and in regular intervals, this weapon is cycled
- set g_nix 0 "No Items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon, and so on"
- set g_nix_with_laser 0 "always carry the laser as an additional weapon in NIX"
- set g_nix_with_healtharmor 0 "when 1, health and armor still show up in NIX"
- set g_nix_with_powerups 0 "when 1, powerups still show up in NIX"
  // score log
  set sv_logscores_console 0    "print scores to server console"
  set sv_logscores_file 0       "print scores to file"
@@@ -966,7 -948,7 +949,7 @@@ seta scoreboard_border_thickness 1 "sco
  seta scoreboard_accuracy_border_thickness 1 "accuracy stats border thickness"
  seta scoreboard_accuracy_doublerows 0 "use two rows instead of one"
  seta scoreboard_accuracy_nocolors 0 "don't use colors displaying accuracy stats"
- seta scoreboard_accuracy 0 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars"
+ seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars"
  seta scoreboard_color_bg_r 0 "red color component of the scoreboard background"
  seta scoreboard_color_bg_g 0.4 "green color component of the scoreboard background"
  seta scoreboard_color_bg_b 0.6 "blue color component of the scoreboard background"
@@@ -974,7 -956,7 +957,7 @@@ seta scoreboard_color_bg_team 0.5 "tea
  seta scoreboard_alpha_bg 0.6 "scoreboard background alpha"
  seta scoreboard_alpha_fg 1 "scoreboard foreground alpha"
  seta scoreboard_alpha_name 0.9 "alpha of player text in scoreboard list other than self"
- seta scoreboard_alpha_name_self 1 "alpha of player text in scoreboard list of self" 
+ seta scoreboard_alpha_name_self 1 "alpha of player text in scoreboard list of self"
  seta scoreboard_fadeinspeed 10 "speed at which scoreboard fades in, higher is faster (0 = instant)"
  seta scoreboard_fadeoutspeed 5 "speed at which scoreboard fades out, higher is faster (0 = instant)"
  seta scoreboard_highlight 1 "enable highlighting for rows and columns in the scoreboard"
@@@ -1061,8 -1043,8 +1044,8 @@@ makesaved v_idlescal
  makesaved v_kicktime
  
  // ticrate
- //sys_ticrate 0.0166667
- sys_ticrate 0.0333333
+ //sys_ticrate 0.0166667 // 60fps. This would be ideal, but kills home routers.
+ sys_ticrate 0.0333333 // Use 30fps instead.
  cl_netfps 60 // should match or be a multiple
  sv_gameplayfix_delayprojectiles 0
  sv_gameplayfix_q2airaccelerate 1
@@@ -1090,10 -1072,6 +1073,6 @@@ alias sethostname "set menu_use_default
  
  set sv_foginterval 1 "force enable fog in regular intervals"
  
- set g_physical_items 0 "1 uses ODE physics for dropped weapons, 2 for all items, requires physics_ode to be enabled"
- set g_physical_items_damageforcescale 3 "how affected physical weapons are by damage"
- set g_physical_items_reset 1 "return map items to their original lotation after being picked up"
  // Audio track names (for old-style "cd loop NUMBER" usage)
  set _cdtrack_first "1"
  alias _cdtrack_0 "g_cdtracks_remaplist \"$g_cdtracks_remaplist $1\""
@@@ -1152,7 -1130,7 +1131,7 @@@ set sv_clones 0 "number of clones a pla
  
  set cl_handicap 1     "the higher, the more damage you will receive (client setting) NOTE: reconnect or use sendcvar command to update the choice."
  
- seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice." 
+ seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice."
  
  seta cl_autoscreenshot 1 "Take a screenshot upon the end of a match... 0 = Disable completely, 1 = Allow sv_autoscreenshot to take a screenshot when requested, 2 = Always take an autoscreenshot anyway."
  
@@@ -1176,12 -1154,6 +1155,6 @@@ set g_bugrigs_speed_ref 400    "reference 
  set g_bugrigs_speed_pow 2     "reference power for accel and steer responsiveness"
  set g_bugrigs_steer 1 "steering amount"
  
- set g_touchexplode 0
- set g_touchexplode_radius 50
- set g_touchexplode_damage 10
- set g_touchexplode_edgedamage 0
- set g_touchexplode_force 150
  set g_ban_sync_uri "" "sync using this ban list provider (empty string to disable)"
  set g_ban_sync_interval 5     "sync every 5 minutes"
  set g_ban_sync_trusted_servers ""     "request ban lists from these xonotic servers (do not include your own server there, or unbanning may fail)"
@@@ -1283,7 -1255,7 +1256,7 @@@ seta cl_casings_maxcount 100 "maximum a
  seta cl_gibs_maxcount 100 "maximum amount of gibs (must be at least 1)"
  seta cl_vehicle_spiderbot_cross_alpha 0.6
  seta cl_vehicle_spiderbot_cross_size 1
- seta cl_vehicles_hudscale 0.5 
+ seta cl_vehicles_hudscale 0.5
  seta cl_vehicles_hudalpha 0.75
  seta cl_vehicles_hud_tactical 1
  
@@@ -1340,10 -1312,6 +1313,6 @@@ seta cl_forcemyplayerskin 0 "set to th
  seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
  seta cl_movement_errorcompensation 1 "try to compensate for prediction errors and reduce preceived lag"
  
- // debug cvars for keyhunt attaching
- set _angles "0 0 0"
- set _origin "0 0 0"
  // campaign internal, set when loading a campaign map1G
  set _campaign_index ""
  set _campaign_name ""
@@@ -1492,7 -1460,7 +1461,7 @@@ mod_q3shader_default_polygonoffset -1
  mod_q3shader_default_polygonfactor 0
  
  // allow fullbright
- set sv_allow_fullbright 0 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay"
+ set sv_allow_fullbright 1 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay"
  
  // auto-teams (team selection by player ID)
  // any player not listed is forced to spectate
@@@ -1570,6 -1538,7 +1539,7 @@@ exec turrets.cf
  exec vehicles.cfg
  exec crosshairs.cfg
  exec gamemodes.cfg
+ exec mutators.cfg
  exec notifications.cfg
  
  // load console command aliases and settings
@@@ -1583,7 -1552,7 +1553,7 @@@ exec _hud_descriptions.cf
  exec hud_luminos.cfg
  
  
- // ... and now that everything is configured/aliased, we can do some things: 
+ // ... and now that everything is configured/aliased, we can do some things:
  
  // Change g_start_delay based upon if the server is local or not.
  if_client set g_start_delay 0 "delay before the game starts, so everyone can join; recommended to set this to like 15 on a public server"
@@@ -1603,5 -1572,3 +1573,3 @@@ set cl_simpleitems_postfix "_simple" "p
  set cl_fullbright_items 0 "enable fullbright items (if server allows, controled by g_fullbrightitems)"
  set cl_weapon_stay_color "2 0.5 0.5" "Color of picked up weapons when g_weapon_stay > 0"
  set cl_weapon_stay_alpha 0.75 "Alpha of picked up weapons when g_weapon_stay > 0"
- seta g_superspectate 0 "server side, allows extended spectator functions through the cmd interface. followpowerup, followstrength, followstshield or followfc [red|blue] will transfer spectation to the relevent player, if any"
index 06cc7bba0b9df39db4b55fdd64d50ae4ce225c5a,759aea6add8832d27b88c9cb413ef08f70b65ae9..b0be65d46166b7f87257fce3cb054acb24267dd5
@@@ -139,7 -139,6 +139,6 @@@ float autocvar_g_balance_crylink_primar
  float autocvar_g_balance_crylink_primary_joinexplode_force;
  float autocvar_g_balance_crylink_primary_joinexplode_radius;
  float autocvar_g_balance_crylink_primary_joinspread;
- float autocvar_g_balance_crylink_primary_jointime;
  float autocvar_g_balance_crylink_primary_linkexplode;
  float autocvar_g_balance_crylink_primary_middle_fadetime;
  float autocvar_g_balance_crylink_primary_middle_lifetime;
@@@ -165,7 -164,6 +164,6 @@@ float autocvar_g_balance_crylink_second
  float autocvar_g_balance_crylink_secondary_joinexplode_force;
  float autocvar_g_balance_crylink_secondary_joinexplode_radius;
  float autocvar_g_balance_crylink_secondary_joinspread;
- float autocvar_g_balance_crylink_secondary_jointime;
  float autocvar_g_balance_crylink_secondary_line_fadetime;
  float autocvar_g_balance_crylink_secondary_line_lifetime;
  float autocvar_g_balance_crylink_secondary_linkexplode;
@@@ -810,7 -808,6 +808,7 @@@ float autocvar_g_domination_point_leadl
  float autocvar_g_domination_point_rate;
  float autocvar_g_domination_teams_override;
  float autocvar_g_forced_respawn;
 +float autocvar_g_respawn_delay_max;
  string autocvar_g_forced_team_blue;
  string autocvar_g_forced_team_otherwise;
  string autocvar_g_forced_team_pink;
@@@ -818,6 -815,8 +816,8 @@@ string autocvar_g_forced_team_red
  string autocvar_g_forced_team_yellow;
  float autocvar_g_freezetag_frozen_force;
  float autocvar_g_freezetag_frozen_maxtime;
+ float autocvar_g_freezetag_revive_falldamage;
+ float autocvar_g_freezetag_revive_falldamage_health;
  float autocvar_g_freezetag_point_leadlimit;
  float autocvar_g_freezetag_point_limit;
  float autocvar_g_freezetag_revive_extra_size;
@@@ -866,10 -865,7 +866,7 @@@ float autocvar_g_keyhunt_point_leadlimi
  #define autocvar_g_keyhunt_point_limit cvar("g_keyhunt_point_limit")
  float autocvar_g_keyhunt_teams;
  float autocvar_g_keyhunt_teams_override;
- float autocvar_g_lms_campcheck_damage;
- float autocvar_g_lms_campcheck_distance;
  float autocvar_g_lms_extra_lives;
- float autocvar_g_lms_campcheck_interval;
  float autocvar_g_lms_join_anytime;
  float autocvar_g_lms_last_join;
  #define autocvar_g_lms_lives_override cvar("g_lms_lives_override")
@@@ -893,7 -889,6 +890,6 @@@ float autocvar_g_maxplayers
  float autocvar_g_maxplayers_spectator_blocktime;
  float autocvar_g_maxpushtime;
  float autocvar_g_maxspeed;
- #define autocvar_g_midair cvar("g_midair")
  float autocvar_g_midair_shieldtime;
  #define autocvar_g_minstagib cvar("g_minstagib")
  float autocvar_g_minstagib_ammo_drop;
@@@ -1111,11 -1106,13 +1107,13 @@@ float autocvar_sv_defaultplayerskin
  float autocvar_sv_dodging_delay;
  float autocvar_sv_dodging_height_threshold;
  float autocvar_sv_dodging_horiz_speed;
+ float autocvar_sv_dodging_horiz_speed_frozen;
  float autocvar_sv_dodging_ramp_time;
  float autocvar_sv_dodging_sound;
  float autocvar_sv_dodging_up_speed;
  float autocvar_sv_dodging_wall_distance_threshold;
  float autocvar_sv_dodging_wall_dodging;
+ float autocvar_sv_dodging_frozen;
  float autocvar_sv_doublejump;
  float autocvar_sv_eventlog;
  float autocvar_sv_eventlog_console;
@@@ -1207,7 -1204,6 +1205,6 @@@ float autocvar_timelimit_overtimes
  float autocvar_timelimit_suddendeath;
  #define autocvar_utf8_enable cvar("utf8_enable")
  float autocvar_waypoint_benchmark;
- float autocvar_welcome_message_time;
  float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
  float autocvar_g_trueaim_minrange;
  float autocvar_g_debug_defaultsounds;
@@@ -1235,3 -1231,26 +1232,26 @@@ float autocvar_g_touchexplode_radius
  float autocvar_g_touchexplode_damage;
  float autocvar_g_touchexplode_edgedamage;
  float autocvar_g_touchexplode_force;
+ #define autocvar_g_bloodloss cvar("g_bloodloss")
+ float autocvar_g_random_gravity_negative_chance;
+ float autocvar_g_random_gravity_min;
+ float autocvar_g_random_gravity_max;
+ float autocvar_g_random_gravity_positive;
+ float autocvar_g_random_gravity_negative;
+ float autocvar_g_random_gravity_delay;
+ float autocvar_g_nades;
+ float autocvar_g_nades_spawn;
+ float autocvar_g_nades_nade_lifetime;
+ float autocvar_g_nades_nade_minforce;
+ float autocvar_g_nades_nade_maxforce;
+ float autocvar_g_nades_nade_health;
+ float autocvar_g_nades_nade_refire;
+ float autocvar_g_nades_nade_damage;
+ float autocvar_g_nades_nade_edgedamage;
+ float autocvar_g_nades_nade_radius;
+ float autocvar_g_nades_nade_force;
+ float autocvar_g_nades_nade_newton_style;
+ float autocvar_g_campcheck_damage;
+ float autocvar_g_campcheck_distance;
+ float autocvar_g_campcheck_interval;
+ float autocvar_g_jump_grunt;
index 2171ffbddb4ead8e507975d82da2f6abecd179bf,fac4314ca6e7b53c577b1182228f3ca612bc614e..4cf7b3626d5ae335b9b2020fbef86c3c1eec5b4a
@@@ -170,7 -170,7 +170,7 @@@ void PutObserverInServer (void
        
        if(self.alivetime)
        {
-               if(!inWarmupStage)
+               if(!warmup_stage)
                        PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
                self.alivetime = 0;
        }
        setorigin (self, (spot.origin + PL_VIEW_OFS)); // offset it so that the spectator spawns higher off the ground, looks better this way
        self.prevorigin = self.origin;
        self.items = 0;
-       WEPSET_CLEAR_E(self);
+       self.weapons = '0 0 0';
        self.model = "";
        FixPlayermodel();
        setmodel(self, "null");
@@@ -297,7 -297,13 +297,13 @@@ void FixPlayermodel(
  
                n = tokenize_console(defaultmodel);
                if(n > 0)
+               {
                        defaultmodel = argv(floor(n * self.model_randomizer));
+                       // However, do NOT randomize if the player-selected model is in the list.
+                       for (i = 0; i < n; ++i)
+                               if ((argv(i) == self.playermodel && defaultskin == stof(self.playerskin)) || argv(i) == strcat(self.playermodel, ":", self.playerskin))
+                                       defaultmodel = argv(i);
+               }
  
                i = strstrofs(defaultmodel, ":", 0);
                if(i >= 0)
@@@ -424,7 -430,7 +430,7 @@@ void PutClientInServer (void
                        self.nex_charge = autocvar_g_balance_nex_charge_start;
                }
  
-               if(inWarmupStage)
+               if(warmup_stage)
                {
                        self.ammo_shells = warmup_start_ammo_shells;
                        self.ammo_nails = warmup_start_ammo_nails;
                        self.ammo_fuel = warmup_start_ammo_fuel;
                        self.health = warmup_start_health;
                        self.armorvalue = warmup_start_armorvalue;
-                       WEPSET_COPY_EA(self, warmup_start_weapons);
+                       self.weapons = warmup_start_weapons;
                }
                else
                {
                        self.ammo_fuel = start_ammo_fuel;
                        self.health = start_health;
                        self.armorvalue = start_armorvalue;
-                       WEPSET_COPY_EA(self, start_weapons);
+                       self.weapons = start_weapons;
                }
  
-               if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) // exception for minstagib, as minstanex is a superweapon
+               if(self.weapons & WEPSET_SUPERWEAPONS)
                        self.superweapons_finished = time + autocvar_g_balance_superweapons_time;
                else
                        self.superweapons_finished = 0;
                if(g_weaponarena_random)
                {
                        if(g_weaponarena_random_with_laser)
-                               WEPSET_ANDNOT_EW(self, WEP_LASER);
+                               self.weapons &= ~WEPSET_LASER;
                        W_RandomWeapons(self, g_weaponarena_random);
                        if(g_weaponarena_random_with_laser)
-                               WEPSET_OR_EW(self, WEP_LASER);
+                               self.weapons |= WEPSET_LASER;
                }
  
                self.items = start_items;
                self.weaponname = "";
                self.switchingweapon = 0;
  
-               if(!inWarmupStage)
+               if(!warmup_stage)
                        if(!self.alivetime)
                                self.alivetime = time;
  
@@@ -811,7 -817,7 +817,7 @@@ void KillIndicator_Think(
                if(IS_REAL_CLIENT(self.owner))
                {
                        if(self.cnt <= 10)
-                               { Send_Notification(NOTIF_ONE, self.owner, MSG_ANNCE, Announcer_PickNumber(self.cnt)); }
+                               { Send_Notification(NOTIF_ONE, self.owner, MSG_ANNCE, Announcer_PickNumber(CNT_KILL, self.cnt)); }
                }
                self.nextthink = time + 1;
                self.cnt -= 1;
@@@ -1180,7 -1186,7 +1186,7 @@@ void ClientConnect (void
                        Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, getwelcomemessage());
                }
  
-               if(autocvar_g_bugrigs || WEPSET_EQ_AW(g_weaponarena_weapons, WEP_TUBA))
+               if(autocvar_g_bugrigs || (g_weaponarena_weapons == WEPSET_TUBA))
                        stuffcmd(self, "cl_cmd settemp chase_active 1\n");
        }
  
@@@ -1282,7 -1288,7 +1288,7 @@@ void ClientDisconnect (void
  
        // Here, everything has been done that requires this player to be a client.
  
-       self.flags &~= FL_CLIENT;
+       self.flags &= ~FL_CLIENT;
  
        if (self.chatbubbleentity)
                remove (self.chatbubbleentity);
@@@ -1403,7 -1409,7 +1409,7 @@@ void play_countdown(float finished, str
        if(IS_REAL_CLIENT(self))
                if(floor(finished - time - frametime) != floor(finished - time))
                        if(finished - time < 6)
-                               sound (self, CH_INFO, samp, VOL_BASE, ATTN_NORM);
+                               sound (self, CH_INFO, samp, VOL_BASE, ATTEN_NORM);
  }
  
  void player_powerups (void)
        if((self.items & IT_USING_JETPACK) && !self.deadflag)
                self.modelflags |= MF_ROCKET;
        else
-               self.modelflags &~= MF_ROCKET;
+               self.modelflags &= ~MF_ROCKET;
  
-       self.effects &~= (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
+       self.effects &= ~(EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
  
        if((self.alpha < 0 || self.deadflag) && !self.vehicle) // don't apply the flags if the player is gibbed
                return;
                }
                if (self.items & IT_SUPERWEAPON)
                {
-                       if (!WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS))
+                       if (!(self.weapons & WEPSET_SUPERWEAPONS))
                        {
                                self.superweapons_finished = 0;
                                self.items = self.items - (self.items & IT_SUPERWEAPON);
                                if (time > self.superweapons_finished)
                                {
                                        self.items = self.items - (self.items & IT_SUPERWEAPON);
-                                       WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS);
+                                       self.weapons &= ~WEPSET_SUPERWEAPONS;
                                        //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_SUPERWEAPON_BROKEN, self.netname);
                                        Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_SUPERWEAPON_BROKEN);
                                }
                        }
                }
-               else if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS))
+               else if(self.weapons & WEPSET_SUPERWEAPONS)
                {
                        if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS))
                        {
                        else
                        {
                                self.superweapons_finished = 0;
-                               WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS);
+                               self.weapons &= ~WEPSET_SUPERWEAPONS;
                        }
                }
                else
        if(autocvar_g_fullbrightplayers)
                self.effects = self.effects | EF_FULLBRIGHT;
  
-       // midair gamemode: damage only while in the air
-       // if in midair mode, being on ground grants temporary invulnerability
-       // (this is so that multishot weapon don't clear the ground flag on the
-       // first damage in the frame, leaving the player vulnerable to the
-       // remaining hits in the same frame)
-       if (self.flags & FL_ONGROUND)
-       if (g_midair)
-               self.spawnshieldtime = max(self.spawnshieldtime, time + autocvar_g_midair_shieldtime);
        if (time >= game_starttime)
        if (time < self.spawnshieldtime)
                self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
@@@ -1617,7 -1614,7 +1614,7 @@@ void player_regen (void
        }
  
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished) * (self.items & IT_FUEL_REGEN != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, rot_mod * frametime * (time > self.pauserotfuel_finished), limitf);
+               self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished) * ((self.items & IT_FUEL_REGEN) != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, rot_mod * frametime * (time > self.pauserotfuel_finished), limitf);
  }
  
  float zoomstate_set;
@@@ -1636,52 -1633,52 +1633,52 @@@ void GetPressedKeys(void) 
        if (self.movement_x > 0) // get if movement keys are pressed
        {       // forward key pressed
                self.pressedkeys |= KEY_FORWARD;
-               self.pressedkeys &~= KEY_BACKWARD;
+               self.pressedkeys &= ~KEY_BACKWARD;
        }
        else if (self.movement_x < 0)
        {       // backward key pressed
                self.pressedkeys |= KEY_BACKWARD;
-               self.pressedkeys &~= KEY_FORWARD;
+               self.pressedkeys &= ~KEY_FORWARD;
        }
        else
        {       // no x input
-               self.pressedkeys &~= KEY_FORWARD;
-               self.pressedkeys &~= KEY_BACKWARD;
+               self.pressedkeys &= ~KEY_FORWARD;
+               self.pressedkeys &= ~KEY_BACKWARD;
        }
  
        if (self.movement_y > 0)
        {       // right key pressed
                self.pressedkeys |= KEY_RIGHT;
-               self.pressedkeys &~= KEY_LEFT;
+               self.pressedkeys &= ~KEY_LEFT;
        }
        else if (self.movement_y < 0)
        {       // left key pressed
                self.pressedkeys |= KEY_LEFT;
-               self.pressedkeys &~= KEY_RIGHT;
+               self.pressedkeys &= ~KEY_RIGHT;
        }
        else
        {       // no y input
-               self.pressedkeys &~= KEY_RIGHT;
-               self.pressedkeys &~= KEY_LEFT;
+               self.pressedkeys &= ~KEY_RIGHT;
+               self.pressedkeys &= ~KEY_LEFT;
        }
  
        if (self.BUTTON_JUMP) // get if jump and crouch keys are pressed
                self.pressedkeys |= KEY_JUMP;
        else
-               self.pressedkeys &~= KEY_JUMP;
+               self.pressedkeys &= ~KEY_JUMP;
        if (self.BUTTON_CROUCH)
                self.pressedkeys |= KEY_CROUCH;
        else
-               self.pressedkeys &~= KEY_CROUCH;
+               self.pressedkeys &= ~KEY_CROUCH;
  
        if (self.BUTTON_ATCK)
                self.pressedkeys |= KEY_ATCK;
        else
-               self.pressedkeys &~= KEY_ATCK;
+               self.pressedkeys &= ~KEY_ATCK;
        if (self.BUTTON_ATCK2)
                self.pressedkeys |= KEY_ATCK2;
        else
-               self.pressedkeys &~= KEY_ATCK2;
+               self.pressedkeys &= ~KEY_ATCK2;
  }
  
  /*
@@@ -1712,7 -1709,7 +1709,7 @@@ void SpectateCopy(entity spectatee) 
        self.strength_finished = spectatee.strength_finished;
        self.invincible_finished = spectatee.invincible_finished;
        self.pressedkeys = spectatee.pressedkeys;
-       WEPSET_COPY_EE(self, spectatee);
+       self.weapons = spectatee.weapons;
        self.switchweapon = spectatee.switchweapon;
        self.switchingweapon = spectatee.switchingweapon;
        self.weapon = spectatee.weapon;
@@@ -1919,7 -1916,7 +1916,7 @@@ void ShowRespawnCountdown(
                {
                        self.respawn_countdown = number - 1;
                        if(ceil(self.respawn_time - (time + 0.5)) == number) // only say it if it is the same number even in 0.5s; to prevent overlapping sounds
-                               Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(number)); 
+                               { Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(CNT_RESPAWN, number)); }
                }
        }
  }
@@@ -2048,7 -2045,7 +2045,7 @@@ void PrintWelcomeMessage(
        {
                if(self.BUTTON_INFO) // BUTTON_INFO hides initial MOTD
                        self.motd_actived_time = -2; // wait until BUTTON_INFO gets released
-               else if(self.motd_actived_time == -2 || IS_PLAYER(self) || time - self.jointime > autocvar_welcome_message_time)
+               else if(self.motd_actived_time == -2 || IS_PLAYER(self))
                {
                        // instanctly hide MOTD
                        self.motd_actived_time = 0;
@@@ -2062,10 -2059,10 +2059,10 @@@ void ObserverThink(
        float prefered_movetype;
        if (self.flags & FL_JUMPRELEASED) {
                if (self.BUTTON_JUMP && !self.version_mismatch) {
-                       self.flags &~= FL_JUMPRELEASED;
+                       self.flags &= ~FL_JUMPRELEASED;
                        self.flags |= FL_SPAWNING;
                } else if(self.BUTTON_ATCK && !self.version_mismatch) {
-                       self.flags &~= FL_JUMPRELEASED;
+                       self.flags &= ~FL_JUMPRELEASED;
                        if(SpectateNext()) {
                                self.classname = "spectator";
                        }
                        self.flags |= FL_JUMPRELEASED;
                        if(self.flags & FL_SPAWNING)
                        {
-                               self.flags &~= FL_SPAWNING;
+                               self.flags &= ~FL_SPAWNING;
                                LeaveSpectatorMode();
                                return;
                        }
@@@ -2091,10 -2088,10 +2088,10 @@@ void SpectatorThink(
  {
        if (self.flags & FL_JUMPRELEASED) {
                if (self.BUTTON_JUMP && !self.version_mismatch) {
-                       self.flags &~= FL_JUMPRELEASED;
+                       self.flags &= ~FL_JUMPRELEASED;
                        self.flags |= FL_SPAWNING;
-               } else if(self.BUTTON_ATCK || self.impulse == 10 || self.impulse == 15 || self.impulse == 18 || self.impulse >= 200 && self.impulse <= 209) {
-                       self.flags &~= FL_JUMPRELEASED;
+               } else if(self.BUTTON_ATCK || self.impulse == 10 || self.impulse == 15 || self.impulse == 18 || (self.impulse >= 200 && self.impulse <= 209)) {
+                       self.flags &= ~FL_JUMPRELEASED;
                        if(SpectateNext()) {
                                self.classname = "spectator";
                        } else {
                                PutClientInServer();
                        }
                        self.impulse = 0;
-               } else if(self.impulse == 12 || self.impulse == 16  || self.impulse == 19 || self.impulse >= 220 && self.impulse <= 229) {
-                       self.flags &~= FL_JUMPRELEASED;
+               } else if(self.impulse == 12 || self.impulse == 16  || self.impulse == 19 || (self.impulse >= 220 && self.impulse <= 229)) {
+                       self.flags &= ~FL_JUMPRELEASED;
                        if(SpectatePrev()) {
                                self.classname = "spectator";
                        } else {
                        }
                        self.impulse = 0;
                } else if (self.BUTTON_ATCK2) {
-                       self.flags &~= FL_JUMPRELEASED;
+                       self.flags &= ~FL_JUMPRELEASED;
                        self.classname = "observer";
                        PutClientInServer();
                } else {
                        self.flags |= FL_JUMPRELEASED;
                        if(self.flags & FL_SPAWNING)
                        {
-                               self.flags &~= FL_SPAWNING;
+                               self.flags &= ~FL_SPAWNING;
                                LeaveSpectatorMode();
                                return;
                        }
@@@ -2311,7 -2308,7 +2308,7 @@@ void PlayerPreThink (void
                                
                                if (self.deadflag == DEAD_DYING)
                                {
 -                                      if(self.respawn_flags & RESPAWN_FORCE)
 +                                      if(self.respawn_flags & RESPAWN_FORCE && !autocvar_g_respawn_delay_max)
                                                self.deadflag = DEAD_RESPAWNING;
                                        else if(!button_pressed)
                                                self.deadflag = DEAD_DEAD;
                                {
                                        if(button_pressed)
                                                self.deadflag = DEAD_RESPAWNABLE;
 +                                      else if(time >= self.respawn_time_max && self.respawn_flags & RESPAWN_FORCE)
 +                                              self.deadflag = DEAD_RESPAWNING;
                                }
                                else if (self.deadflag == DEAD_RESPAWNABLE)
                                {
                                        if(time > self.respawn_time)
                                        {
                                                self.respawn_time = time + 1; // only retry once a second
 +                                              self.respawn_time_max = self.respawn_time;
                                                respawn();
                                        }
                                }
  
                                if(self.respawn_flags & RESPAWN_SILENT)
                                        self.stat_respawn_time = 0;
 +                              else if(self.respawn_flags & RESPAWN_FORCE && autocvar_g_respawn_delay_max)
 +                                      self.stat_respawn_time = self.respawn_time_max;
                                else
                                        self.stat_respawn_time = self.respawn_time;
                        }
                float do_crouch = self.BUTTON_CROUCH;
                if(self.hook.state)
                        do_crouch = 0;
-               if(self.health <= g_bloodloss)
-                       do_crouch = 1;
                if(self.vehicle)
                        do_crouch = 0;
                if(self.freezetag_frozen)
                        }
                }
  
-               if(self.health <= g_bloodloss && self.deadflag == DEAD_NO)
-               {
-                       if(self.bloodloss_timer < time)
-                       {
-                               self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0');
-                               self.bloodloss_timer = time + 0.5 + random() * 0.5;
-                       }
-               }
                FixPlayermodel();
  
                GrapplingHookFrame();
                // LordHavoc: allow firing on move frames (sub-ticrate), this gives better timing on slow servers
                //if(frametime)
                {
-                       self.items &~= self.items_added;
+                       self.items &= ~self.items_added;
  
                        W_WeaponFrame();
  
  
                if(frametime)
                        player_anim();
-               if(g_nexball)
-                       nexball_setstatus();
                
                // secret status
                secrets_setstatus();
@@@ -2569,7 -2547,7 +2552,7 @@@ void PlayerPostThink (void
                        else if(timeleft <= 10)
                        {
                                if(timeleft != self.idlekick_lasttimeleft)
-                                       Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(timeleft));
+                                       { Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(CNT_IDLE, timeleft)); }
                                self.idlekick_lasttimeleft = timeleft;
                        }
                }
        //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
  
        if(self.waypointsprite_attachedforcarrier)
-               WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
+               WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON));
  
        playerdemo_write();
  
index 22c3bbb4fbff20b0b466061f58d1d0d3ba39b42b,1c5daa19f1eb7999d4541a8f586c2de5332e9834..cd2bea2d9c7d1a40e2c14e342bb9f1f4985b0d36
@@@ -262,22 -262,9 +262,9 @@@ void player_anim (void
  
  void SpawnThrownWeapon (vector org, float w)
  {
-       if(g_pinata)
-       {
-               float j;
-               for(j = WEP_FIRST; j <= WEP_LAST; ++j)
-               {
-                       if(WEPSET_CONTAINS_EW(self, j))
-                               if(W_IsWeaponThrowable(j))
-                                       W_ThrowNewWeapon(self, j, FALSE, org, randomvec() * 175 + '0 0 325');
-               }
-       }
-       else
-       {
-               if(WEPSET_CONTAINS_EW(self, self.weapon))
-                       if(W_IsWeaponThrowable(self.weapon))
-                               W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
-       }
+       if(self.weapons & WepSet_FromWeapon(self.weapon))
+               if(W_IsWeaponThrowable(self.weapon))
+                       W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
  }
  
  void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
        // damage resistance (ignore most of the damage from a bullet or similar)
        damage = max(damage - 5, 1);
  
-       v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
+       v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
        take = v_x;
        save = v_y;
  
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM);
                else if (take > 30)
-                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM);
                else if (take > 10)
-                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM);
        }
  
        if (take > 50)
@@@ -385,7 -372,7 +372,7 @@@ void PlayerDamage (entity inflictor, en
                Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
  
  
-       v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
+       v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
        take = v_x;
        save = v_y;
  
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM);
                else if (take > 30)
-                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM);
                else if (take > 10)
-                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
+                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM); // FIXME possibly remove them?
        }
  
        if (take > 50)
        self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
        self.dmg_inflictor = inflictor;
  
-       if(g_ca && self != attacker && IS_PLAYER(attacker))
-               PlayerTeamScore_Add(attacker, SP_SCORE, ST_SCORE, (damage - excess) * autocvar_g_ca_damage2score_multiplier);
        float abot, vbot, awep;
        abot = (IS_BOT_CLIENT(attacker));
        vbot = (IS_BOT_CLIENT(self));
        if(vbot || IS_REAL_CLIENT(self))
        if(abot || IS_REAL_CLIENT(attacker))
        if(attacker && self != attacker)
-       if(IsDifferentTeam(self, attacker))
+       if(DIFF_TEAM(self, attacker))
        {
                if(DEATH_ISSPECIAL(deathtype))
                        awep = attacker.weapon;
                self.solid = SOLID_CORPSE;
                self.ballistics_density = autocvar_g_ballistics_density_corpse;
                // don't stick to the floor
-               self.flags &~= FL_ONGROUND;
+               self.flags &= ~FL_ONGROUND;
                // dying animation
                self.deadflag = DEAD_DYING;
                // when to allow respawn
                        self.respawn_time = ceil((time + sdelay) / waves) * waves;
                else
                        self.respawn_time = time + sdelay;
 +              if(autocvar_g_respawn_delay_max > self.respawn_time)
 +                      self.respawn_time_max = time + autocvar_g_respawn_delay_max;
 +              else
 +                      self.respawn_time_max = self.respawn_time;
                if((sdelay + waves >= 5.0) && (self.respawn_time - time > 1.75))
                        self.respawn_countdown = 10; // first number to count down from is 10
                else
@@@ -877,7 -857,7 +861,7 @@@ float Say(entity source, float teamsay
        if not(IS_PLAYER(source))
        {
                if not(intermission_running)
-                       if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !(inWarmupStage || gameover)))
+                       if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !(warmup_stage || gameover)))
                                teamsay = -1; // spectators
        }
  
@@@ -1116,15 -1096,15 +1100,15 @@@ void FakeGlobalSound(string sample, flo
                        {
                                msg_entity = self;
                                if(IS_REAL_CLIENT(msg_entity))
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTEN_NONE);
                        }
                        break;
                case VOICETYPE_TEAMRADIO:
                        msg_entity = self;
                        if(msg_entity.cvar_cl_voice_directional == 1)
-                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_MIN);
                        else
-                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                        break;
                case VOICETYPE_AUTOTAUNT:
                        if(!sv_autotaunt)
                        if (tauntrand < msg_entity.cvar_cl_autotaunt)
                        {
                                if (msg_entity.cvar_cl_voice_directional >= 1)
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTEN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTEN_MAX));
                                else
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                        }
                        break;
                case VOICETYPE_TAUNT:
                                break;
                        msg_entity = self;
                        if (msg_entity.cvar_cl_voice_directional >= 1)
-                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTEN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTEN_MAX));
                        else
-                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                        break;
                case VOICETYPE_PLAYERSOUND:
                        msg_entity = self;
-                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NORM);
+                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTEN_NORM);
                        break;
                default:
                        backtrace("Invalid voice type!");
@@@ -1191,9 -1171,9 +1175,9 @@@ void GlobalSound(string sample, float c
                                if(IS_REAL_CLIENT(msg_entity))
                                {
                                        if(msg_entity.cvar_cl_voice_directional == 1)
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_MIN);
                                        else
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                                }
                        }
                        break;
                                if(IS_REAL_CLIENT(msg_entity))
                                {
                                        if(msg_entity.cvar_cl_voice_directional == 1)
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_MIN);
                                        else
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                                }
                                msg_entity = self;
                                if(IS_REAL_CLIENT(msg_entity))
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTEN_NONE);
                        }
                        break;
                case VOICETYPE_TEAMRADIO:
                                if(!teamplay || msg_entity.team == self.team)
                                {
                                        if(msg_entity.cvar_cl_voice_directional == 1)
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_MIN);
                                        else
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                                }
                        break;
                case VOICETYPE_AUTOTAUNT:
                                if (tauntrand < msg_entity.cvar_cl_autotaunt)
                                {
                                        if (msg_entity.cvar_cl_voice_directional >= 1)
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTEN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTEN_MAX));
                                        else
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                                }
                        break;
                case VOICETYPE_TAUNT:
                        FOR_EACH_REALCLIENT(msg_entity)
                        {
                                if (msg_entity.cvar_cl_voice_directional >= 1)
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTEN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTEN_MAX));
                                else
-                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTEN_NONE);
                        }
                        break;
                case VOICETYPE_PLAYERSOUND:
-                       sound(self, chan, sample, VOL_BASE, ATTN_NORM);
+                       sound(self, chan, sample, VOL_BASE, ATTEN_NORM);
                        break;
                default:
                        backtrace("Invalid voice type!");
diff --combined qcsrc/server/defs.qh
index ee9aa325f627b13d355fa01b3c3e74812d2e2ce0,c7aebd58f500fe35862ba387133f4a5fd2da5fe4..6e286ab027dc7f1f6dded236000feae4541ae4e2
@@@ -16,12 -16,12 +16,12 @@@ noref float require_spawnfunc_prefix; /
  
  // Globals
  
- float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_bloodloss;
+ float g_cloaked, g_footsteps, g_grappling_hook, g_minstagib;
  float g_warmup_limit;
  float g_warmup_allguns;
  float g_warmup_allow_timeout;
  float g_race_qualifying;
- float inWarmupStage;
+ float warmup_stage;
  float g_pickup_respawntime_weapon;
  float g_pickup_respawntime_superweapon;
  float g_pickup_respawntime_ammo;
@@@ -103,7 -103,6 +103,7 @@@ float server_is_dedicated
  .float play_time;
  .float respawn_flags;
  .float respawn_time;
 +.float respawn_time_max;
  .float death_time;
  .float fade_time;
  .float fade_rate;
@@@ -192,15 -191,15 +192,15 @@@ void w_ready()
  .void() weapon_think;
  
  //float       PLAYER_WEAPONSELECTION_DELAY = );
float PLAYER_WEAPONSELECTION_SPEED = 18;
vector        PLAYER_WEAPONSELECTION_RANGE = '0 20 -40';
const float   PLAYER_WEAPONSELECTION_SPEED = 18;
const vector  PLAYER_WEAPONSELECTION_RANGE = '0 20 -40';
  
  // weapon states (self.weaponentity.state)
float WS_CLEAR                        = 0; // no weapon selected
float WS_RAISE                        = 1; // raise frame
float WS_DROP                 = 2; // deselecting frame
float WS_INUSE                        = 3; // fire state
float WS_READY                        = 4; // idle frame
const float WS_CLEAR                  = 0; // no weapon selected
const float WS_RAISE                  = 1; // raise frame
const float WS_DROP                   = 2; // deselecting frame
const float WS_INUSE                  = 3; // fire state
const float WS_READY                  = 4; // idle frame
  
  // there is 2 weapon tics that can run in one server frame
  #define W_TICSPERFRAME 2
@@@ -297,7 -296,7 +297,7 @@@ string W_Apply_Weaponreplace(string in)
  void FixIntermissionClient(entity e);
  void FixClientCvars(entity e);
  
- WEPSET_DECLARE_A(weaponsInMap);
+ WepSet weaponsInMap;
  
  .float respawn_countdown; // next number to count
  
@@@ -550,7 -549,6 +550,6 @@@ float client_cefc_accumulatortime
  
  .float spectatee_status;
  .float zoomstate;
- .float bloodloss_timer;
  .float restriction;
  
  .entity clientdata;