]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into tzork/gm_nexball
authorJakob MG <jakob_mg@hotmail.com>
Tue, 28 Feb 2012 05:42:06 +0000 (06:42 +0100)
committerJakob MG <jakob_mg@hotmail.com>
Tue, 28 Feb 2012 05:42:06 +0000 (06:42 +0100)
Conflicts:
qcsrc/server/cl_weapons.qc

1  2 
defaultXonotic.cfg
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/defs.qh
qcsrc/server/miscfunctions.qc
qcsrc/server/progs.src

diff --combined defaultXonotic.cfg
index db0e26f35ffdf4869530f644f966a4b5eb18f1fc,761ccf075851fbd8b6b4c2c8155af825460c407c..302933da4fa33965f135c3838b6188ba6166fb29
@@@ -10,7 -10,7 +10,7 @@@
  // e.g. Xonotic 1.5.1 RC1 will be 15101
  set g_xonoticversion git "Xonotic version (formatted for humans)"
  
- gameversion 500 // 0.5.0
+ gameversion 600 // 0.6.0
  gameversion_min 0 // git builds see all versions
  gameversion_max 65535 // git builds see all versions
  
  //   gameversion_min = (gameversion / 100) * 100 - 100
  //   gameversion_max = (gameversion / 100) * 100 + 199
  
+ // changes a cvar and reports it to the server (for the menu to notify the
+ // server about changes)
+ alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
  seta cl_firststart "" "how many times the client has been run"
  seta cl_startcount 0 "how many times the client has been run"
  
@@@ -57,124 -61,6 +61,6 @@@ _cl_color 11
  _cl_name Player
  _cl_playermodel models/player/erebus.iqm
  _cl_playerskin 0
- seta crosshair 16
- seta crosshair_color "0.6 0.8 1"
- seta crosshair_alpha 0.300000
- seta crosshair_size 0.500000
- seta crosshair_dot 1
- seta crosshair_dot_alpha 1
- seta crosshair_dot_size 0.600000
- seta crosshair_dot_color "1 0 0" "when != 0, use custom color for the crosshair dot"
- seta crosshair_pickup 0.25
- seta crosshair_pickup_speed 4
- seta crosshair_hitindication 0.5
- seta crosshair_hitindication_color "10 -10 -10"
- seta crosshair_hitindication_speed 5
- seta crosshair_per_weapon 0   "when 1, each gun will display a different crosshair"
- seta crosshair_color_per_weapon 1 "when 1, each gun will display the crosshair with a different color"
- seta crosshair_effect_speed -1 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time"
- seta crosshair_effect_scalefade 1 "use scaling and fading for crosshair effects"
- seta crosshair_hittest 1 "do a crosshair hit evaluation; also, the crosshair is scaled by the given number when aiming at an enemy, and blurred when aiming at a team mate"
- seta crosshair_hittest_blur 1 "blur the crosshair if the shot is obstructed"
- seta crosshair_hittest_showimpact 0 "move the crosshair to the actual impact location if obstructed"
- seta crosshair_laser ""       "crosshair to display when wielding the laser"
- seta crosshair_laser_color "1 0.35 0.2"       "crosshair color to display when wielding the laser"
- seta crosshair_laser_alpha 0.75       "crosshair alpha value to display when wielding the laser"
- seta crosshair_laser_size 0.4 "crosshair size when wielding the laser"
- seta crosshair_shotgun ""     "crosshair to display when wielding the shotgun"
- seta crosshair_shotgun_color "0.7 0.7 0.7"    "crosshair color to display when wielding the shotgun"
- seta crosshair_shotgun_alpha 1.1      "crosshair alpha value to display when wielding the shotgun"
- seta crosshair_shotgun_size 0.65      "crosshair size when wielding the shotgun"
- seta crosshair_uzi "" "crosshair to display when wielding the machinegun"
- seta crosshair_uzi_color "0.4 0.9 0.35"       "crosshair color to display when wielding the machinegun"
- seta crosshair_uzi_alpha 0.9  "crosshair alpha value to display when wielding the machinegun"
- seta crosshair_uzi_size 0.6   "crosshair size when wielding the machinegun"
- seta crosshair_grenadelauncher ""     "crosshair to display when wielding the mortar"
- seta crosshair_grenadelauncher_color "1 0.15 0"       "crosshair color to display when wielding the mortar"
- seta crosshair_grenadelauncher_alpha 1.15     "crosshair alpha value to display when wielding the mortar"
- seta crosshair_grenadelauncher_size 0.7       "crosshair size when wielding the mortar"
- seta crosshair_minelayer ""   "crosshair to display when wielding the mortar"
- seta crosshair_minelayer_color "0.75 0.75 0"  "crosshair color to display when wielding the mortar"
- seta crosshair_minelayer_alpha 1.15   "crosshair alpha value to display when wielding the mortar"
- seta crosshair_minelayer_size 0.9     "crosshair size when wielding the mortar"
- seta crosshair_electro ""     "crosshair to display when wielding the electro"
- seta crosshair_electro_color "0.35 0.5 1"     "crosshair color to display when wielding the electro"
- seta crosshair_electro_alpha 1        "crosshair alpha value to display when wielding the electro"
- seta crosshair_electro_size 0.5       "crosshair size when wielding the electro"
- seta crosshair_crylink ""     "crosshair to display when wielding the crylink"
- seta crosshair_crylink_color "0.85 0.25 1"    "crosshair color to display when wielding the crylink"
- seta crosshair_crylink_alpha 0.85     "crosshair alpha value to display when wielding the crylink"
- seta crosshair_crylink_size 0.4       "crosshair size when wielding the crylink"
- seta crosshair_nex "" "crosshair to display when wielding the nex gun"
- seta crosshair_nex_color "0 0.9 1"    "crosshair color to display when wielding the nex gun"
- seta crosshair_nex_alpha 0.85 "crosshair alpha value to display when wielding the nex gun"
- seta crosshair_nex_size 0.65  "crosshair size when wielding the nex gun"
- seta crosshair_hagar ""       "crosshair to display when wielding the hagar"
- seta crosshair_hagar_color "0.85 0.5 0.35"    "crosshair color to display when wielding the hagar"
- seta crosshair_hagar_alpha 1  "crosshair alpha value to display when wielding the hagar"
- seta crosshair_hagar_size 0.8 "crosshair size when wielding the hagar"
- seta crosshair_rocketlauncher ""      "crosshair to display when wielding the rocketlauncher"
- seta crosshair_rocketlauncher_color "1 0.75 0.2"      "crosshair color to display when wielding the rocketlauncher"
- seta crosshair_rocketlauncher_alpha 1 "crosshair alpha value to display when wielding the rocketlauncher"
- seta crosshair_rocketlauncher_size 0.5875     "crosshair size when wielding the rocketlauncher"
- seta crosshair_porto ""       "crosshair to display when wielding the porto"
- seta crosshair_porto_color "0.5 1 0.5"        "crosshair color to display when wielding the porto"
- seta crosshair_porto_alpha 0.85       "crosshair alpha value to display when wielding the porto"
- seta crosshair_porto_size 0.6 "crosshair size when wielding the porto"
- seta crosshair_minstanex ""   "crosshair to display when wielding the minstanex gun"
- seta crosshair_minstanex_color "0.65 0.65 1"  "crosshair color to display when wielding the minstanex gun"
- seta crosshair_minstanex_alpha 1      "crosshair alpha value to display when wielding the minstanex gun"
- seta crosshair_minstanex_size 0.4     "crosshair size when wielding the minstanex gun"
- seta crosshair_hook ""        "crosshair to display when wielding the hook"
- seta crosshair_hook_color "0.65 1 0.85"       "crosshair color to display when wielding the hook"
- seta crosshair_hook_alpha 0.85        "crosshair alpha value to display when wielding the hook"
- seta crosshair_hook_size 0.5  "crosshair size when wielding the hook"
- seta crosshair_hlac ""        "crosshair to display when wielding the H.L.A.C"
- seta crosshair_hlac_color "1 0.65 0.2"        "crosshair color to display when wielding the H.L.A.C."
- seta crosshair_hlac_alpha 1   "crosshair alpha value to display when wielding the H.L.A.C."
- seta crosshair_hlac_size 0.6  "crosshair size when wielding the H.L.A.C."
- seta crosshair_seeker ""      "crosshair to display when wielding the TAG Seeker"
- seta crosshair_seeker_color "1 0.35 0.35"     "crosshair color to display when wielding the TAG seeker"
- seta crosshair_seeker_alpha 0.9       "crosshair alpha value to display when wielding the TAG seeker"
- seta crosshair_seeker_size 0.8        "crosshair size when wielding the TAG seeker"
- seta crosshair_rifle ""       "crosshair to display when wielding the rifle"
- seta crosshair_rifle_color "0.85 0.5 0.25"    "crosshair color to display when wielding the rifle"
- seta crosshair_rifle_alpha 1  "crosshair alpha value to display when wielding the rifle"
- seta crosshair_rifle_size 0.5 "crosshair size when wielding the rifle"
- seta crosshair_tuba ""        "crosshair to display when wielding the tuba"
- seta crosshair_tuba_color "0.85 0.5 0.25"     "crosshair color to display when wielding the tuba"
- seta crosshair_tuba_alpha 1   "crosshair alpha value to display when wielding the tuba"
- seta crosshair_tuba_size 1    "crosshair size when wielding the tuba"
- seta crosshair_fireball ""    "crosshair to display when wielding the fireball"
- seta crosshair_fireball_color "0.2 1.0 0.2"   "crosshair color to display when wielding the fireball"
- seta crosshair_fireball_alpha 1       "crosshair alpha value to display when wielding the fireball"
- seta crosshair_fireball_size 1        "crosshair size when wielding the fireball"
- seta crosshair_color_by_health 0 "if enabled, crosshair color will depend on current health"
- // ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
- seta crosshair_ring 1 "main cvar to enable or disable normal crosshair rings"
- seta crosshair_ring_inner 0 "allow inner rings to be drawn too"
- seta crosshair_ring_size 2    "ring size"
- seta crosshair_ring_alpha 0.2 "ring alpha"
- seta crosshair_ring_nex 1 "draw a ring showing the current charge of the nexgun"
- seta crosshair_ring_nex_alpha 0.15
- seta crosshair_ring_nex_inner_alpha 0.15
- seta crosshair_ring_nex_inner_color_red 0.8
- seta crosshair_ring_nex_inner_color_green 0
- seta crosshair_ring_nex_inner_color_blue 0
- seta crosshair_ring_nex_currentcharge_scale 30
- seta crosshair_ring_nex_currentcharge_movingavg_rate 0.05
- seta crosshair_ring_minelayer 1
- seta crosshair_ring_minelayer_alpha 0.15
- seta crosshair_ring_hagar 1
- seta crosshair_ring_hagar_alpha 0.15
- seta crosshair_ring_reload 1 "main cvar to enable or disable ammo crosshair rings"
- seta crosshair_ring_reload_size 2.5   "reload ring size"
- seta crosshair_ring_reload_alpha 0.2  "reload ring alpha"
  
  seta cl_reticle 1 "control for toggling whether ANY zoom reticles are shown"
  seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)"
@@@ -200,9 -86,11 +86,11 @@@ vid_fullscreen 
  vid_width 1024
  vid_height 768
  vid_pixelheight 1
- seta menu_vid_width 1024
- seta menu_vid_height 768
- seta menu_vid_pixelheight 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"
  seta menu_vid_scale 0
  // 2D resolution 800x600
  vid_conwidth 800
@@@ -218,14 -106,17 +106,17 @@@ r_hdr_glowintensity 
  // 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
  cl_deathfade 0 // fade screen to dark red when dead, value represents how fast the fade is (higher is faster)
- cl_bobcycle 0 // how long the cycle of up/down view movement takes (only works if cl_bob is not 0), default is 0.6
- cl_bob 0.01 // how much view moves up/down when moving (does not move if cl_bobcycle is 0, but still enables cl_bobmodel), default is 0.02
- cl_bob2cycle 0 // how long the cycle of left/right view movement takes (only works if cl_bob2 is not 0), default is 0.6
- cl_bob2 0.01 // how much view moves left/right when moving (does not move if cl_bob2cycle is 0), default is 0.01
+ cl_bobcycle 0.5 // how long the cycle of up/down view movement takes (only works if cl_bob is not 0), default is 0.6
+ cl_bob 0 // how much view moves up/down when moving (does not move if cl_bobcycle is 0, but still enables cl_bobmodel), default is 0.02
+ cl_bob2cycle 1 // how long the cycle of left/right view movement takes (only works if cl_bob2 is not 0), default is 0.6
+ cl_bob2 0 // how much view moves left/right when moving (does not move if cl_bob2cycle is 0), default is 0.01
  cl_bobfall 0.05 "how much the view swings down when falling (influenced by the speed you hit the ground with)"
  cl_bobfallcycle 3 "speed of the bobfall swing"
  cl_bobfallspeed 200 "necessary amount of speed for bob-falling to occur"
  cl_bobmodel 1 // whether to have gun model move around on screen when moving (only works if cl_bob is not 0), default is 1
+ cl_bobmodel_side 0.2 // amount the gun sways to the sides
+ cl_bobmodel_speed 5 // rate at which the gun sways
+ cl_bobmodel_up 0.1 // amount the gun sways up and down
  cl_leanmodel 1 // enables weapon leaning effect when looking around
  cl_leanmodel_side_speed 0.7 "gun leaning sideways speed"
  cl_leanmodel_side_limit 35 "gun leaning sideways limit"
@@@ -301,7 -192,7 +192,7 @@@ set g_warmup_allguns 1     "if set players 
  set g_warmup_majority_factor 0.8 "minimum percentage of players ready needed for warmup to end"
  
  set g_chat_nospectators 0     "if 0 spec/observer chat is always visible to the player, if 1 it is never visible to players, if 2 it is only visible to players during warmup stage"
- set sv_vote_nospectators 0    "if set only players can call a vote (thus spectators and observers can't call a vote)"
+ set sv_vote_nospectators 0    "Only players can call a vote (thus spectators and observers can't call a vote): 0 = all people can vote, 1 = spectators can vote in warmup stage, 2 = only players can vote (no exceptions)."
  
  alias g_tourney "g_tourney_$1"
  alias g_tourney_1 "g_warmup 1; g_chat_nospectators 2; sv_vote_nospectators 1"
@@@ -321,6 -212,14 +212,14 @@@ set g_telefrags_teamplay 1 "never telef
  set g_telefrags_avoid 1 "when teleporters have a random destination, avoid teleporting to locations where a telefrag would happen"
  set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed"
  
+ seta cl_damageeffect 1 "enable weapon damage effects. 1 enables the feature on skeletal models, 2 on any model"
+ seta cl_damageeffect_ticrate 0.1 "particle spawn rate"
+ seta cl_damageeffect_bones 5 "how many damages to allow on a rigged mesh at once (non-skeletal objects are limited to one)"
+ seta cl_damageeffect_distribute 1 "divide particle intensity if multiple damages are present"
+ seta cl_damageeffect_lifetime 0.1 "how much a damage effect lasts, based on damage amount"
+ seta cl_damageeffect_lifetime_min 3 "minimum lifetime a damage effect may have"
+ seta cl_damageeffect_lifetime_max 6 "maximum lifetime a damage effect may have"
  set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns"
  set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
  set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would"
@@@ -453,7 -352,6 +352,6 @@@ locs_enable 
  pausable 0
  set g_spawnshieldtime 1 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
  set g_antilag 2       "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
- set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
  set g_antilag_nudge 0 "don't touch"
  set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
  set g_shootfromclient 2 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed; see also cl_gunalign"
@@@ -577,13 -475,6 +475,13 @@@ seta g_keyhunt_point_leadlimit -1        "Keyh
  seta g_race_laps_limit -1     "Race laps limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta g_nexball_goallimit -1 "Nexball goal limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta g_nexball_goalleadlimit -1 "Nexball goal lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 +seta g_nexball_safepass_maxdist 5000    // Max distance to allow save fassping (0 to turn off safe passing)
 +seta g_nexball_safepass_turnrate 0.1    // How fast the safe-pass ball can habge direction
 +seta g_nexball_safepass_holdtime 0.75   // How long to remeber last teammate you pointed at
 +seta g_nexball_viewmodel_scale 0.25     // How large the ball for the carrier
 +seta g_nexball_viewmodel_offset "8 8 0" // Where the ball is located on carrier "forward right up"
 +seta g_nexball_tackling 1               // Allow ball theft?
 +
  
  seta g_ctf_ignore_frags 0     "1: regular frags give no points"
  
@@@ -654,9 -545,9 +552,9 @@@ set g_cts_weapon_stay 
  set g_freezetag_respawn_waves 0
  set g_freezetag_respawn_delay 0
  set g_freezetag_weapon_stay 0
- set g_ka_respawn_delay 0
- set g_ka_respawn_waves 0
- set g_ka_weapon_stay 0
+ set g_keepaway_respawn_delay 0
+ set g_keepaway_respawn_waves 0
+ set g_keepaway_weapon_stay 0
  
  // overtime
  seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
@@@ -897,7 -788,7 +795,7 @@@ set g_multijump_speed -999999      "Minimum 
  
  // effects
  r_glsl_vertextextureblend_usebothalphas 1 // allows to abuse texture blending as detail texture
- r_glsl_postprocess 1
+ r_glsl_postprocess 0 // but note, hud_postprocessing enables this
  r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
  r_picmipworld 1
  gl_picmip_world 0
@@@ -1138,12 -1029,13 +1036,13 @@@ set nextmap ""       "override the maplist wh
  set lastlevel ""
  set quit_when_empty 0 "set to 1, then the server exits when the next level would start but is empty"
  set quit_and_redirect ""      "set to an IP to redirect all players at the end of the match to another server. Set to \"self\" to let all players reconnect at the end of the match (use it to make seamless engine updates)"
+ set quit_and_redirect_timer 1.5 "set to number of seconds after quit before performing the connect operation of quit_and_redirect"
  
  // singleplayer campaign
  set g_campaign 0
  set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
  seta g_campaign_name "xonoticbeta"
- set g_campaign_skill 0
+ seta g_campaign_skill -1 // -2 easy -1 medium 0 hard
  
  alias singleplayer_start "g_campaign_index 0; set scmenu_campaign_goto 0"
  alias singleplayer_continue "set scmenu_campaign_goto -1"
@@@ -1345,6 -1237,7 +1244,7 @@@ set menu_slowmo 
  seta menu_sounds 0 "enables menu sound effects. 1 enables click sounds, 2 also enables hover sounds"
  seta menu_tooltips 1 "menu tooltips: 0 disabled, 1 enabled, 2 also shows cvar or console command (when available) changed or executed by the item"
  set menu_picmip_bypass 0 "bypass texture quality enforcement based on system resources, not recommended and may cause crashes!"
+ set menu_showboxes 0 "show item bounding boxes (debug)"
  
  r_textbrightness 0.2
  r_textcontrast 0.8
@@@ -1453,6 -1346,8 +1353,8 @@@ seta v_kicktime $v_kicktim
  seta r_subdivisions_tolerance $r_subdivisions_tolerance
  seta vid_gl20 $vid_gl20
  seta vid_gl13 $vid_gl13
+ seta r_drawviewmodel $r_drawviewmodel
+ seta v_idlescale $v_idlescale
  
  // ticrate
  //sys_ticrate 0.0166667
@@@ -1737,6 -1632,7 +1639,7 @@@ alias _gunalign_14 "cl_gunalign 3
  alias _gunalign_update "_gunalign_$v_flipped$menu_cl_gunalign"
  
  set _menu_alpha "" // will be set by menu QC to the current fading of the menu, can be used by CSQC to fade items
+ set _menu_initialized 0 "is 0 on first menu loading, 1 later"
  
  set g_triggerimpulse_accel_power 1 "trigger_impulse accelerator power (applied BEFORE the multiplier)"
  set g_triggerimpulse_accel_multiplier 1 "trigger_impulse accelerator multiplier (applied AFTER the power)"
@@@ -1783,6 -1679,7 +1686,7 @@@ seta cl_forceplayercolors 0 "make every
  seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
  seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
  seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (requires server to have sv_use_csqc_players 1, and is 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 (requires server to have sv_use_csqc_players 1)"
  
  // debug cvars for keyhunt attaching
  set _angles "0 0 0"
@@@ -1962,6 -1859,15 +1866,15 @@@ set g_weapon_charge_colormod_blue_full 
  set g_playerstats_uri ""
  set g_playerstats_debug 0 "when 1, player stats are dumped to the console too"
  
+ // autoscreenshots
+ set g_max_info_autoscreenshot 3 "how many info_autoscreenshot entities are allowed"
+ // mod names for server browser
+ // note: the lowest of these that mismatches default is used
+ set g_mod_physics "" "Current physics config name"
+ set g_mod_balance "" "Current balance config name"
+ set g_mod_config  "" "Current config mod name"
  // session locking
  locksession 1
  
@@@ -2000,6 -1906,7 +1913,7 @@@ exec effects-normal.cf
  exec physicsX.cfg
  exec turrets.cfg
  exec vehicles.cfg
+ exec crosshairs.cfg
  
  // load console command aliases and settings
  exec commands.cfg
@@@ -2020,3 -1927,6 +1934,6 @@@ if_dedicated set g_start_delay 15       "dela
  
  // enable menu syncing
  alias menu_sync "menu_cmd sync"
+ set sv_join_notices ""
+ set sv_join_notices_time 15
index 2eb12adb9a4b510d9b944b10ada9a01a870bd0f2,ada824caa69b9d87239f51924a8365f973079d5d..2c340bf78a4b69ace3314d64933142c09dc04672
@@@ -421,6 -421,9 +421,6 @@@ void PutObserverInServer (void
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
  
 -      if(self.ballcarried && g_nexball)
 -              DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
 -
        WaypointSprite_PlayerDead();
  
        if not(g_ca)  // don't reset teams when moving a ca player to the spectators
@@@ -642,11 -645,14 +642,14 @@@ Called when a client spawns in the serv
  =============
  */
  //void() ctf_playerchanged;
  void PutClientInServer (void)
  {
        if(clienttype(self) == CLIENTTYPE_BOT)
        {
                self.classname = "player";
+               if(g_ca)
+                       self.caplayer = 1;
        }
        else if(clienttype(self) == CLIENTTYPE_REAL)
        {
                WriteByte(MSG_ONE, SVC_SETVIEW);
                WriteEntity(MSG_ONE, self);
        }
-       
        // reset player keys
        self.itemkeys = 0;
  
                        self.classname = "observer";
        }
  
-       if(g_arena || (g_ca && !allowed_to_spawn))
-       if(!self.spawned)
+       if((g_arena && !self.spawned) || (g_ca && !allowed_to_spawn))
                self.classname = "observer";
  
        if(gameover)
                self.lastrocket = world; // stop rocket guiding, no revenge from the grave!
                self.lastteleporttime = time; // prevent insane speeds due to changing origin
          self.hud = HUD_NORMAL;
-         
                if(g_arena)
                {
                        Spawnqueue_Remove(self);
                        Spawnqueue_Mark(self);
                }
                else if(g_ca)
                        self.caplayer = 1;
  
                        self.alivetime = time;
  
                antilag_clear(self);
-       } else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) {
+       } else if(self.classname == "observer") {
                PutObserverInServer ();
        }
  
@@@ -964,6 -968,7 +965,7 @@@ float ClientInit_SendEntity(entity to, 
        WriteByte(MSG_ENTITY, autocvar_g_balance_minelayer_limit); // minelayer max mines
        WriteByte(MSG_ENTITY, autocvar_g_balance_hagar_secondary_load_max); // hagar max loadable rockets
        WriteCoord(MSG_ENTITY, autocvar_g_trueaim_minrange);
+       WriteByte(MSG_ENTITY, autocvar_g_balance_porto_secondary);
        return TRUE;
  }
  
@@@ -1592,8 -1597,12 +1594,12 @@@ void ClientConnect (void
        CSQCMODEL_AUTOINIT();
  
        self.model_randomizer = random();
+     
+     if(clienttype(self) != CLIENTTYPE_REAL)
+         return;
+         
+     sv_notice_join();
  }
  /*
  =============
  ClientDisconnect
@@@ -1649,6 -1658,8 +1655,6 @@@ void ClientDisconnect (void
        RemoveGrapplingHook(self);
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
 -      if(self.ballcarried && g_nexball)
 -              DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
  
        // Here, everything has been done that requires this player to be a client.
  
@@@ -1890,7 -1901,8 +1896,8 @@@ void player_powerups (void
                }
                if (self.items & IT_SUPERWEAPON)
                {
-                       self.effects = self.effects | EF_RED;
+                       //if(W_WeaponBit(self.weapon) & WEPBIT_SUPERWEAPONS)
+                       //      self.effects = self.effects | EF_RED;
                        if (!(self.weapons & WEPBIT_SUPERWEAPONS))
                        {
                                self.superweapons_finished = 0;
                                }
                        }
                }
-               else
+               else if(self.weapons & WEPBIT_SUPERWEAPONS)
                {
-                       if (time < self.superweapons_finished)
+                       if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS))
                        {
                                self.items = self.items | IT_SUPERWEAPON;
                                sprint(self, "^3You now have a superweapon\n");
                        }
                        else
+                       {
+                               self.superweapons_finished = 0;
                                self.weapons &~= WEPBIT_SUPERWEAPONS; // just in case
+                       }
+               }
+               else
+               {
+                       self.superweapons_finished = 0;
                }
        }
        
@@@ -2300,7 -2319,7 +2314,7 @@@ void ShowRespawnCountdown(
  .float prevent_join_msgtime;
  void LeaveSpectatorMode()
  {
-       if(nJoinAllowed(1)) {
+       if(nJoinAllowed(self)) {
                if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
                        self.classname = "player";
  
   * it checks whether the number of currently playing players exceeds g_maxplayers.
   * @return int number of free slots for players, 0 if none
   */
- float nJoinAllowed(float includeMe) {
+ float nJoinAllowed(entity ignore) {
+       if(!ignore)
+       // this is called that way when checking if anyone may be able to join (to build qcstatus)
+       // so report 0 free slots if restricted
+       {
+               if(autocvar_g_forced_team_otherwise == "spectate")
+                       return 0;
+               if(autocvar_g_forced_team_otherwise == "spectator")
+                       return 0;
+       }
        if(self.team_forced < 0)
-               return FALSE; // forced spectators can never join
+               return 0; // forced spectators can never join
  
        // TODO simplify this
        entity e;
        float totalClients;
        FOR_EACH_CLIENT(e)
-               totalClients += 1;
+               if(e != ignore)
+                       totalClients += 1;
  
        if (!autocvar_g_maxplayers)
-               return maxclients - totalClients + includeMe;
+               return maxclients - totalClients;
  
        float currentlyPlaying;
        FOR_EACH_REALPLAYER(e)
                currentlyPlaying += 1;
  
        if(currentlyPlaying < autocvar_g_maxplayers)
-               return min(maxclients - totalClients + includeMe, autocvar_g_maxplayers - currentlyPlaying);
+               return min(maxclients - totalClients, autocvar_g_maxplayers - currentlyPlaying);
  
        return 0;
  }
@@@ -3027,8 -3056,6 +3051,6 @@@ void PlayerPostThink (void
        }
        */
  
-       Arena_Warmup();
        //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
  
        if(self.waypointsprite_attachedforcarrier)
index fa7e095dceb883436dd1c87508a488e9bfe311ca,07dc0788b341ebf88d0750271f4e0214fcc92c70..5a162742387c471883838d67a24a478e21357786
@@@ -421,6 -421,7 +421,7 @@@ void PlayerCorpseDamage (entity inflict
                Violence_GibSplash(self, 1, 1, attacker);
                self.alpha = -1;
                self.solid = SOLID_NOT; // restore later
+               self.takedamage = DAMAGE_NO; // restore later
        }
  }
  
@@@ -434,7 -435,7 +435,7 @@@ void PlayerDamage (entity inflictor, en
        float valid_damage_for_weaponstats;
        float excess;
  
-       if((g_arena && numspawned < 2) || (g_ca && !ca_teams_ok) && !inWarmupStage)
+       if((g_arena && numspawned < 2) || (g_ca && allowed_to_spawn) && !inWarmupStage)
                return;
  
        dh = max(self.health, 0);
                        else
                                DropFlag(self.flagcarried, world, attacker);
                }
 -              if(self.ballcarried && g_nexball)
 -                      DropBall(self.ballcarried, self.origin, self.velocity);
                Portal_ClearAllLater(self);
  
                if(clienttype(self) == CLIENTTYPE_REAL)
index dc827c9a21d019d833d97c2722d76fed77306b9a,fac0d73aa2cbf09b30f36ed949e7bb97a9d26085..4a12ce1850323e10f7b11282a76874cb0f426e66
@@@ -173,11 -173,17 +173,17 @@@ float W_AmmoItemCode(float wpn
        return (get_weaponinfo(wpn)).items & IT_AMMO;
  }
  
+ .float savenextthink;
  void thrown_wep_think()
  {
-       self.solid = SOLID_TRIGGER;
        self.owner = world;
-       SUB_SetFade(self, time + 20, 1);
+       float timeleft = self.savenextthink - time;
+       if(timeleft > 1)
+               SUB_SetFade(self, self.savenextthink - 1, 1);
+       else if(timeleft > 0)
+               SUB_SetFade(self, time, timeleft);
+       else
+               SUB_VanishOrRemove(self);
  }
  
  // returns amount of ammo used as string, or -1 for failure, or 0 for no ammo count
@@@ -197,6 -203,33 +203,33 @@@ string W_ThrowNewWeapon(entity own, flo
        wep.flags |= FL_TOSSED;
        wep.colormap = own.colormap;
  
+       if(W_WeaponBit(wpn) & WEPBIT_SUPERWEAPONS)
+       {
+               if(own.items & IT_UNLIMITED_SUPERWEAPONS)
+               {
+                       wep.superweapons_finished = time + autocvar_g_balance_superweapons_time;
+               }
+               else
+               {
+                       float superweapons = 1;
+                       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+                               if(own.weapons & WEPBIT_SUPERWEAPONS & W_WeaponBit(i))
+                                       ++superweapons;
+                       if(superweapons <= 1)
+                       {
+                               wep.superweapons_finished = own.superweapons_finished;
+                               own.superweapons_finished = 0;
+                       }
+                       else
+                       {
+                               float timeleft = own.superweapons_finished - time;
+                               float weptimeleft = timeleft / superweapons;
+                               wep.superweapons_finished = time + weptimeleft;
+                               own.superweapons_finished -= weptimeleft;
+                       }
+               }
+       }
        wa = W_AmmoItemCode(wpn);
        if(wa == 0)
        {
                        return string_null;
                wep.glowmod = own.weaponentity_glowmod;
                wep.think = thrown_wep_think;
-               wep.nextthink = time + 0.5;
+               wep.savenextthink = wep.nextthink;
+               wep.nextthink = min(wep.nextthink, time + 0.5);
+               wep.pickup_anyway = TRUE; // these are ALWAYS pickable
                return "";
        }
        else
                }
                wep.glowmod = own.weaponentity_glowmod;
                wep.think = thrown_wep_think;
-               wep.nextthink = time + 0.5;
+               wep.savenextthink = wep.nextthink;
+               wep.nextthink = min(wep.nextthink, time + 0.5);
                wep.pickup_anyway = TRUE; // these are ALWAYS pickable
                return s;
        }
@@@ -282,12 -318,12 +318,12 @@@ float W_IsWeaponThrowable(float w
                return 0;
        if (g_cts)
                return 0;
 -      if (g_nexball && w == WEP_PORTO)
++      if (g_nexball && w == WEP_GRENADE_LAUNCHER)
+               return 0;
  
        wb = W_WeaponBit(w);
        if(!wb)
                return 0;
-       if(wb & WEPBIT_SUPERWEAPONS) // can't throw a superweapon, they don't work
-               return 0;
        wa = W_AmmoItemCode(w);
        if(start_weapons & wb)
        {
diff --combined qcsrc/server/defs.qh
index 0c6c6c65b763262a4a0504f2fb2c30e47baecff1,26fd254f1a4c72cb223f1ece3147406e4330b9e7..a46c8f7e7119aad27b12b28b3692b657c0372ee0
@@@ -280,7 -280,7 +280,7 @@@ void checkSpectatorBlock()
  .float jointime; // time of joining
  .float alivetime; // time of being alive
  
- float nJoinAllowed(float includeMe);
+ float nJoinAllowed(entity ignore);
  #define PREVENT_JOIN_TEXT "^1You may not join the game at this time.\n\nThe player limit reached maximum capacity."
  
  .float spawnshieldtime;
@@@ -342,6 -342,7 +342,6 @@@ string gamemode_name
  float startitem_failed;
  
  void DropFlag(entity flag, entity penalty_receiver, entity attacker);
 -void DropBall(entity ball, vector org, vector vel);
  void DropAllRunes(entity pl);
  
  
@@@ -544,7 -545,7 +544,7 @@@ void SUB_UseTargets()
  
  void ClientData_Touch(entity e);
  
- vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
//vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
  
  .float wasplayer;
  
@@@ -641,6 -642,8 +641,8 @@@ float serverflags
  
  .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
  
+ .float player_blocked;
  .float freezetag_frozen;
  .float freezetag_revive_progress;
  
@@@ -653,3 -656,5 +655,5 @@@ typedef vector(entity player, entity sp
  .spawn_evalfunc_t spawn_evalfunc;
  
  .entity conveyor;
+ string modname;
index cb390a5f99c2207a4c6d711ed92f987caead17fd,060fa62689b721379829763b3701584a202a4846..7065542b1902db6b65b7faa35612b55d854aa5eb
@@@ -796,6 -796,10 +796,6 @@@ float want_weapon(string cvarprefix, en
                        t |= (i == WEP_HOOK);
        }
  
 -      // we cannot disable porto in Nexball, we must force it
 -      if(g_nexball && i == WEP_PORTO)
 -              t = 1;
 -
        return t;
  }
  
@@@ -893,12 -897,18 +893,18 @@@ void readplayerstartcvars(
  
        if (g_weaponarena)
        {
+               g_minstagib = 0; // incompatible
+               g_pinata = 0; // incompatible
+               g_weapon_stay = 0; // incompatible
                start_weapons = g_weaponarena;
                if(!(g_lms || g_ca))
                        start_items |= IT_UNLIMITED_AMMO;
        }
        else if (g_minstagib)
        {
+               g_pinata = 0; // incompatible
+               g_weapon_stay = 0; // incompatible
+               g_bloodloss = 0; // incompatible
                start_health = 100;
                start_armorvalue = 0;
                start_weapons = WEPBIT_MINSTANEX;
        if(!cvar("g_use_ammunition"))
                start_items |= IT_UNLIMITED_AMMO;
  
+       if(cvar("g_nexball"))
+               start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT
        if(g_minstagib)
        {
                start_ammo_cells = cvar("g_minstagib_ammo_start");
@@@ -1977,35 -1990,30 +1986,30 @@@ float WarpZone_Projectile_Touch_ImpactF
  }
  #define PROJECTILE_TOUCH if(WarpZone_Projectile_Touch()) return
  
- float MAX_IPBAN_URIS           = 16;
-                               
- float URI_GET_DISCARD          = 0;
- float URI_GET_IPBAN            = 1;
- float URI_GET_IPBAN_END        = 16;
  void URI_Get_Callback(float id, float status, string data)
  {
-     dprint("Received HTTP request data for id ", ftos(id), "; status is ", ftos(status), "\nData is:\n");
-     dprint(data);
-     dprint("\nEnd of data.\n");
-     if(url_URI_Get_Callback(id, status, data))
-     {
-         // handled
-     }
-     else if (id == URI_GET_DISCARD)
-     {
-         // discard
-     }
-     else if (id >= URI_GET_IPBAN && id <= URI_GET_IPBAN_END)
-     {
-         // online ban list
-         OnlineBanList_URI_Get_Callback(id, status, data);
-     }
-     else
-     {
-         print("Received HTTP request data for an invalid id ", ftos(id), ".\n");
-     }
+       if(url_URI_Get_Callback(id, status, data))
+       {
+               // handled
+       }
+       else if (id == URI_GET_DISCARD)
+       {
+               // discard
+       }
+       else if (id >= URI_GET_CURL && id <= URI_GET_CURL_END)
+       {
+               // sv_cmd curl
+               Curl_URI_Get_Callback(id, status, data);
+       }
+       else if (id >= URI_GET_IPBAN && id <= URI_GET_IPBAN_END)
+       {
+               // online ban list
+               OnlineBanList_URI_Get_Callback(id, status, data);
+       }
+       else
+       {
+               print("Received HTTP request data for an invalid id ", ftos(id), ".\n");
+       }
  }
  
  string uid2name(string myuid) {
diff --combined qcsrc/server/progs.src
index d23663531d25652f77ef84302af146f443c8415a,4ce318377e997810b886110e39a987bf4abb8d0e..0dbe5378186ab296c6cff094d0dfce718d9dfdd4
@@@ -21,6 -21,7 +21,7 @@@ sys-post.q
  ../common/command/rpn.qh
  ../common/command/generic.qh
  ../common/command/shared_defs.qh
+ ../common/net_notice.qh
  
  autocvars.qh
  constants.qh
@@@ -29,7 -30,6 +30,7 @@@ defs.qh               // Should rename this, it has 
  mutators/base.qh
  mutators/mutators.qh
  mutators/gamemode_keyhunt.qh // TODO fix this
 +mutators/gamemode_nexball.qh 
  mutators/mutator_dodging.qh
  
  //// tZork Turrets ////
@@@ -140,7 -140,7 +141,7 @@@ antilag.q
  ctf.qc
  domination.qc
  mode_onslaught.qc
 -nexball.qc
 +//nexball.qc
  g_hook.qc
  
  t_swamp.qc
@@@ -153,6 -153,8 +154,8 @@@ campaign.q
  ../common/command/markup.qc
  ../common/command/rpn.qc
  ../common/command/generic.qc
+ ../common/net_notice.qc
  command/common.qc
  command/banning.qc
  command/radarmap.qc
@@@ -202,7 -204,6 +205,7 @@@ playerstats.q
  ../common/explosion_equation.qc
  
  mutators/base.qc
 +mutators/gamemode_nexball.qc
  mutators/gamemode_keyhunt.qc
  mutators/gamemode_freezetag.qc
  mutators/gamemode_keepaway.qc