r5658 - in branches/nexuiz-2.0: . Docs Docs/htmlfiles data data/gfx data/gfx/menu data/gfx/menu/default data/gfx/menu/silver data/gfx/menu/simplygray data/gfx/menu/wickedblack data/gfx/menu/wickedblue data/gfx/menu/wickedgreen data/gfx/menu/wickedred data/gfx/menu/wickedwhite data/gfx/menu/wickedyellow data/gfx/menu/wickedz data/gfx/menu/xaw data/maps data/maps/bloodprison data/qcsrc/client data/qcsrc/common data/qcsrc/menu data/qcsrc/menu/item data/qcsrc/menu/nexuiz data/qcsrc/server data/qcsrc/server/tturrets/system data/qcsrc/server/tturrets/units data/scripts data/sound/misc data/sound/plats data/sound/weapons data/textures data/textures/flags data/textures/portals misc misc/tools/ImgToMap misc/tools/ImgToMap/nbproject

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Jan 24 14:51:14 EST 2009


Author: div0
Date: 2009-01-24 14:51:12 -0500 (Sat, 24 Jan 2009)
New Revision: 5658

Added:
   branches/nexuiz-2.0/Docs/egyptsoc/
   branches/nexuiz-2.0/data/gfx/brand.tga
   branches/nexuiz-2.0/data/gfx/crosshaircampingrifle.tga
   branches/nexuiz-2.0/data/gfx/crosshaircrylink.tga
   branches/nexuiz-2.0/data/gfx/crosshairelectro.tga
   branches/nexuiz-2.0/data/gfx/crosshairgrenadelauncher.tga
   branches/nexuiz-2.0/data/gfx/crosshairhagar.tga
   branches/nexuiz-2.0/data/gfx/crosshairhlac.tga
   branches/nexuiz-2.0/data/gfx/crosshairhook.tga
   branches/nexuiz-2.0/data/gfx/crosshairlaser.tga
   branches/nexuiz-2.0/data/gfx/crosshairminstanex.tga
   branches/nexuiz-2.0/data/gfx/crosshairnex.tga
   branches/nexuiz-2.0/data/gfx/crosshairporto.tga
   branches/nexuiz-2.0/data/gfx/crosshairrocketlauncher.tga
   branches/nexuiz-2.0/data/gfx/crosshairseeker.tga
   branches/nexuiz-2.0/data/gfx/crosshairshotgun.tga
   branches/nexuiz-2.0/data/gfx/crosshairuzi.tga
   branches/nexuiz-2.0/data/gfx/menu/blueplastic/
   branches/nexuiz-2.0/data/maps/eggandbacon/
   branches/nexuiz-2.0/data/physics25.cfg
   branches/nexuiz-2.0/data/qcsrc/client/casings.qc
   branches/nexuiz-2.0/data/qcsrc/client/damage.qc
   branches/nexuiz-2.0/data/qcsrc/client/gibs.qc
   branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc
   branches/nexuiz-2.0/data/qcsrc/client/movetypes.qh
   branches/nexuiz-2.0/data/qcsrc/client/projectile.qc
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/cvarlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_demo.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc_cvars.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_network.c
   branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qc
   branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qh
   branches/nexuiz-2.0/data/qcsrc/server/monsters/
   branches/nexuiz-2.0/data/scripts/egyptsoc.shader
   branches/nexuiz-2.0/data/sound/misc/medplat1.ogg
   branches/nexuiz-2.0/data/sound/misc/medplat2.ogg
   branches/nexuiz-2.0/data/sound/plats/medplat1.ogg
   branches/nexuiz-2.0/data/sound/plats/medplat2.ogg
   branches/nexuiz-2.0/data/sound/weapons/electro_fly.ogg
   branches/nexuiz-2.0/data/sound/weapons/rocket_fly.ogg
   branches/nexuiz-2.0/data/sound/weapons/tag_rocket_fly.ogg
   branches/nexuiz-2.0/data/textures/eggandbacon/
   branches/nexuiz-2.0/data/textures/egyptsoc_floor/
   branches/nexuiz-2.0/data/textures/egyptsoc_mat/
   branches/nexuiz-2.0/data/textures/egyptsoc_sfx/
   branches/nexuiz-2.0/data/textures/egyptsoc_trim/
   branches/nexuiz-2.0/data/textures/egyptsoc_trimd/
   branches/nexuiz-2.0/data/textures/egyptsoc_wall/
   branches/nexuiz-2.0/havoc/
   branches/nexuiz-2.0/misc/artwork/
   branches/nexuiz-2.0/misc/mediasource/
   branches/nexuiz-2.0/misc/tools/
   branches/nexuiz-2.0/server/
Removed:
   branches/nexuiz-2.0/artwork/
   branches/nexuiz-2.0/data/cvars.txt
   branches/nexuiz-2.0/data/cvars.txt.pl
   branches/nexuiz-2.0/data/defaultPro.cfg
   branches/nexuiz-2.0/data/physicsPro.cfg
   branches/nexuiz-2.0/data/qcsrc/client/old/
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c
   branches/nexuiz-2.0/data/qcsrc/menu/todo
   branches/nexuiz-2.0/data/qcsrc/server/g_decors.qc
   branches/nexuiz-2.0/data/sound/misc/medplat1.wav
   branches/nexuiz-2.0/data/sound/misc/medplat2.wav
   branches/nexuiz-2.0/data/sound/plats/medplat1.wav
   branches/nexuiz-2.0/data/sound/plats/medplat2.wav
   branches/nexuiz-2.0/data/sound/weapons/electro_fly.wav
   branches/nexuiz-2.0/data/sound/weapons/rocket_fly.wav
   branches/nexuiz-2.0/data/sound/weapons/tag_rocket_fly.wav
   branches/nexuiz-2.0/data/weaponsPro.cfg
   branches/nexuiz-2.0/misc/assault-circuit-board-creator.pl
   branches/nexuiz-2.0/misc/autoshader.sh
   branches/nexuiz-2.0/misc/brightspot.c
   branches/nexuiz-2.0/misc/brightspot.sh
   branches/nexuiz-2.0/misc/bsp2ent
   branches/nexuiz-2.0/misc/bsptool.pl
   branches/nexuiz-2.0/misc/crc16.c
   branches/nexuiz-2.0/misc/csqcarchive.sh
   branches/nexuiz-2.0/misc/democonv-15-20.pl
   branches/nexuiz-2.0/misc/demosplit.pl
   branches/nexuiz-2.0/misc/demotc-race-record-extractor.sh
   branches/nexuiz-2.0/misc/demotc.pl
   branches/nexuiz-2.0/misc/dependencies.pl
   branches/nexuiz-2.0/misc/entmerge.pl
   branches/nexuiz-2.0/misc/fiximage.pl
   branches/nexuiz-2.0/misc/hslimage.c
   branches/nexuiz-2.0/misc/jpeg-if-not-alpha.sh
   branches/nexuiz-2.0/misc/makebuild.sh
   branches/nexuiz-2.0/misc/nexuiz-map-compiler
   branches/nexuiz-2.0/misc/sb-flag-carrying.svg
   branches/nexuiz-2.0/misc/sb-flag-dropped.svg
   branches/nexuiz-2.0/misc/sb-flag-shielded.svg
   branches/nexuiz-2.0/misc/sb-flag-taken.svg
   branches/nexuiz-2.0/misc/spherefunc2skybox.c
   branches/nexuiz-2.0/misc/testbuild.sh
   branches/nexuiz-2.0/misc/ttf2conchars/
   branches/nexuiz-2.0/misc/zipdiff
   branches/nexuiz-2.0/modelsource/
   branches/nexuiz-2.0/pro/
   branches/nexuiz-2.0/tools/
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/Docs/basics.html
   branches/nexuiz-2.0/Docs/faq.html
   branches/nexuiz-2.0/Docs/htmlfiles/basics.aft
   branches/nexuiz-2.0/Docs/htmlfiles/faq.aft
   branches/nexuiz-2.0/changes-since-last-release
   branches/nexuiz-2.0/data/Makefile
   branches/nexuiz-2.0/data/build-compat-pack.sh
   branches/nexuiz-2.0/data/check-sounds.sh
   branches/nexuiz-2.0/data/defaultNexuiz.cfg
   branches/nexuiz-2.0/data/effectinfo.txt
   branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt
   branches/nexuiz-2.0/data/keybinds.txt
   branches/nexuiz-2.0/data/maps/bloodprison.bsp
   branches/nexuiz-2.0/data/maps/bloodprison.map
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0000.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0001.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0002.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0003.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0004.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0005.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0006.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0007.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0008.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0009.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0010.tga
   branches/nexuiz-2.0/data/maps/bloodprison/lm_0011.tga
   branches/nexuiz-2.0/data/maps/bloodprisonctf.map
   branches/nexuiz-2.0/data/nexuiz-credits.txt
   branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
   branches/nexuiz-2.0/data/qcsrc/client/Main.qc
   branches/nexuiz-2.0/data/qcsrc/client/View.qc
   branches/nexuiz-2.0/data/qcsrc/client/csqc_builtins.qc
   branches/nexuiz-2.0/data/qcsrc/client/csqc_constants.qc
   branches/nexuiz-2.0/data/qcsrc/client/ctf.qc
   branches/nexuiz-2.0/data/qcsrc/client/interpolate.qc
   branches/nexuiz-2.0/data/qcsrc/client/interpolate.qh
   branches/nexuiz-2.0/data/qcsrc/client/laser.qc
   branches/nexuiz-2.0/data/qcsrc/client/progs.src
   branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
   branches/nexuiz-2.0/data/qcsrc/client/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc
   branches/nexuiz-2.0/data/qcsrc/common/constants.qh
   branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc
   branches/nexuiz-2.0/data/qcsrc/common/util.qc
   branches/nexuiz-2.0/data/qcsrc/common/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/classes.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
   branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join_serverinfo.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup_weapons.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_effects.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_video.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc
   branches/nexuiz-2.0/data/qcsrc/server/arena.qc
   branches/nexuiz-2.0/data/qcsrc/server/assault.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
   branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
   branches/nexuiz-2.0/data/qcsrc/server/constants.qh
   branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/domination.qc
   branches/nexuiz-2.0/data/qcsrc/server/extensions.qh
   branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
   branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
   branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
   branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
   branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc
   branches/nexuiz-2.0/data/qcsrc/server/portals.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/runematch.qc
   branches/nexuiz-2.0/data/qcsrc/server/scores.qc
   branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
   branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
   branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
   branches/nexuiz-2.0/data/scripts/entities.def
   branches/nexuiz-2.0/data/scripts/shaderlist.txt
   branches/nexuiz-2.0/data/sound/misc/powerup.ogg
   branches/nexuiz-2.0/data/sound/weapons/campingrifle_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/campingrifle_reload.ogg
   branches/nexuiz-2.0/data/sound/weapons/crylink_fire2.ogg
   branches/nexuiz-2.0/data/sound/weapons/crylink_impact.ogg
   branches/nexuiz-2.0/data/sound/weapons/crylink_impact2.ogg
   branches/nexuiz-2.0/data/sound/weapons/hagexp2.ogg
   branches/nexuiz-2.0/data/sound/weapons/hookbomb_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/hookbomb_impact.ogg
   branches/nexuiz-2.0/data/sound/weapons/rocket_mode.ogg
   branches/nexuiz-2.0/data/sound/weapons/seeker_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/shotgun_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/uzi_fire.ogg
   branches/nexuiz-2.0/data/textures/flags/flag_blue_norm.tga
   branches/nexuiz-2.0/data/textures/flags/flag_red_norm.tga
   branches/nexuiz-2.0/data/textures/portals/portals_blue_norm.tga
   branches/nexuiz-2.0/data/textures/portals/portals_red_norm.tga
   branches/nexuiz-2.0/data/update-cvarcount.sh
   branches/nexuiz-2.0/data/weapons.cfg
   branches/nexuiz-2.0/misc/tools/ImgToMap/
   branches/nexuiz-2.0/misc/tools/ImgToMap/nbproject/
   branches/nexuiz-2.0/nexuiz-linux-glx.sh
Log:
r5396 | div0 | 2009-01-03 23:07:28 +0100 (Sat, 03 Jan 2009) | 2 lines
some spacer
r5397 | esteel | 2009-01-04 04:03:44 +0100 (Sun, 04 Jan 2009) | 3 lines
changed the default PRO menu skin to "simplygray" as to make it standout visually
removed the line with sbar_hudselector 1 as defaultNexuiz uses the same one by now
r5398 | esteel | 2009-01-04 04:06:23 +0100 (Sun, 04 Jan 2009) | 2 lines
PRO: removed three lines with userbinds to make default and pro use the same binds (and those three binds were already on some other keys and overwrote some others)
r5399 | div0 | 2009-01-04 16:36:43 +0100 (Sun, 04 Jan 2009) | 5 lines
hook: subtract more ammo:
hook throwing = 2 cells
first 2 seconds are free
after that, remove 4 cells per extra second (in 0.25s intervals)
r5400 | div0 | 2009-01-04 17:19:57 +0100 (Sun, 04 Jan 2009) | 2 lines
decrease less fast
r5401 | div0 | 2009-01-05 03:35:05 +0100 (Mon, 05 Jan 2009) | 2 lines
rcon2irc: support a separate timeout for inter-packet waiting
r5402 | div0 | 2009-01-05 09:28:29 +0100 (Mon, 05 Jan 2009) | 2 lines
crylink: make shot pattern variable according to shots count
r5403 | div0 | 2009-01-05 09:47:18 +0100 (Mon, 05 Jan 2009) | 3 lines
camping rifle: reload when selecting even if it's the only weapon you have;
impulse 20 = reload
r5404 | div0 | 2009-01-05 11:37:32 +0100 (Mon, 05 Jan 2009) | 2 lines
new entity trigger_gamestart that triggers once at startup
r5405 | div0 | 2009-01-05 11:40:41 +0100 (Mon, 05 Jan 2009) | 2 lines
fix description
r5406 | esteel | 2009-01-05 11:42:57 +0100 (Mon, 05 Jan 2009) | 1 line
renamed the "pro" mod to "havoc"
r5407 | div0 | 2009-01-05 12:01:28 +0100 (Mon, 05 Jan 2009) | 2 lines
menu_slist_modfilter
r5408 | esteel | 2009-01-05 12:01:35 +0100 (Mon, 05 Jan 2009) | 1 line
changed escaping slightly
r5409 | div0 | 2009-01-05 13:42:09 +0100 (Mon, 05 Jan 2009) | 2 lines
Committing eggandbacon, so we have a "weapon zoo" map where they all can be tried out.
r5410 | div0 | 2009-01-05 13:43:13 +0100 (Mon, 05 Jan 2009) | 2 lines
oops, fixing typo
r5411 | div0 | 2009-01-05 13:43:57 +0100 (Mon, 05 Jan 2009) | 2 lines
make svnversion ignore modified flags in the script
r5412 | div0 | 2009-01-05 14:16:03 +0100 (Mon, 05 Jan 2009) | 2 lines
oops... this line did nothing
r5413 | esteel | 2009-01-06 10:34:56 +0100 (Tue, 06 Jan 2009) | 2 lines
added reload to the input menu
r5414 | esteel | 2009-01-06 10:40:45 +0100 (Tue, 06 Jan 2009) | 2 lines
changed to bind r reload (was messagemode2 before) which is pretty default in other games but i'm not yet totally sure how much people had liked the old bind
r5415 | div0 | 2009-01-06 10:54:46 +0100 (Tue, 06 Jan 2009) | 3 lines
fix "loof" :P
r5416 | div0 | 2009-01-06 12:44:55 +0100 (Tue, 06 Jan 2009) | 2 lines
add mandelbrotsky to shaderlist
r5417 | div0 | 2009-01-06 13:37:03 +0100 (Tue, 06 Jan 2009) | 2 lines
sounds...
r5418 | div0 | 2009-01-06 14:00:59 +0100 (Tue, 06 Jan 2009) | 2 lines
update keybinds.txt to name all weapons on the keys
r5419 | div0 | 2009-01-06 14:08:41 +0100 (Tue, 06 Jan 2009) | 2 lines
as r is no longer messagemode2, also bind z to it so it can be reached on german keyboards easier too
r5420 | esteel | 2009-01-06 14:09:09 +0100 (Tue, 06 Jan 2009) | 2 lines
made those two shell script have the executable flag
r5421 | div0 | 2009-01-06 14:11:05 +0100 (Tue, 06 Jan 2009) | 2 lines
allow flag dropping (UT had it always allowed, so it can't be that bad)
r5422 | div0 | 2009-01-06 14:11:32 +0100 (Tue, 06 Jan 2009) | 2 lines
+use also drops flag
r5423 | esteel | 2009-01-06 14:22:54 +0100 (Tue, 06 Jan 2009) | 2 lines
added userbind to drop flag/key with message and icon
r5424 | div0 | 2009-01-06 14:55:50 +0100 (Tue, 06 Jan 2009) | 2 lines
make camping rifle damage just 80 (before: 90), and headshot 200 (before: 250)
r5425 | div0 | 2009-01-06 14:59:45 +0100 (Tue, 06 Jan 2009) | 9 lines
player physics:
accelerate: 5.5 to 10 (more control when walking, good for dodging shots)
friction: 5 to 7 (stopping faster when walking)
sideways friction: 0.3 to 0.4 (slightly more control when "cornering")
airaccel qw: 0.93 to 0.95 (more control when "braking" in air, slightly less forward acceleration)
Please test!
r5426 | div0 | 2009-01-06 16:06:44 +0100 (Tue, 06 Jan 2009) | 2 lines
autotaunts by MirceaKitsune (using cl_autotaunt cvar)
r5427 | esteel | 2009-01-06 21:17:53 +0100 (Tue, 06 Jan 2009) | 2 lines
only announce X frags left if there actually is an limit.  fixes the "fraglimit 0 + selfkill = 1frag left message"
r5428 | div0 | 2009-01-06 21:48:20 +0100 (Tue, 06 Jan 2009) | 2 lines
slightly less sideways friction feels better
r5429 | div0 | 2009-01-06 22:08:42 +0100 (Tue, 06 Jan 2009) | 2 lines
sorry, I apparently broke bloodprison... so committing a fix
r5430 | div0 | 2009-01-06 23:23:06 +0100 (Tue, 06 Jan 2009) | 2 lines
csqc: send origin only when needed in WP sprites (shouldn't change much)
r5431 | div0 | 2009-01-07 09:07:10 +0100 (Wed, 07 Jan 2009) | 2 lines
play taunts directionally
r5432 | div0 | 2009-01-07 09:55:49 +0100 (Wed, 07 Jan 2009) | 2 lines
cl_hitsound + some menu changes
r5433 | div0 | 2009-01-07 11:14:41 +0100 (Wed, 07 Jan 2009) | 2 lines
a new string rewriting command :P
r5434 | div0 | 2009-01-07 11:33:10 +0100 (Wed, 07 Jan 2009) | 2 lines
uups :P
r5435 | div0 | 2009-01-07 12:41:47 +0100 (Wed, 07 Jan 2009) | 2 lines
cvars list update
r5436 | div0 | 2009-01-07 12:43:20 +0100 (Wed, 07 Jan 2009) | 2 lines
more new sounds by tenshihan :)
r5437 | div0 | 2009-01-07 13:48:48 +0100 (Wed, 07 Jan 2009) | 2 lines
try to make it use the default value of a cvar if it is not defined (sentcvar)
r5438 | div0 | 2009-01-07 18:16:08 +0100 (Wed, 07 Jan 2009) | 2 lines
physics: sv_accelerate from 10 to 8, as it indeed causes a minor misprediction the higher it is
r5439 | div0 | 2009-01-07 20:41:15 +0100 (Wed, 07 Jan 2009) | 2 lines
seeker: MF_ROCKET, not EF_ROCKET
r5440 | div0 | 2009-01-07 21:24:47 +0100 (Wed, 07 Jan 2009) | 2 lines
more rainbow power
r5441 | esteel | 2009-01-08 02:20:24 +0100 (Thu, 08 Jan 2009) | 1 line
menu skin by FraNcoTirAdoR
r5442 | esteel | 2009-01-08 02:46:14 +0100 (Thu, 08 Jan 2009) | 1 line
minor highlight/color changes for the new menuskin
r5443 | div0 | 2009-01-08 08:25:45 +0100 (Thu, 08 Jan 2009) | 2 lines
new cvar g_full_getstatus_responses to annoy qstat with full status info ;)
r5444 | div0 | 2009-01-08 08:30:40 +0100 (Thu, 08 Jan 2009) | 2 lines
reformat qcstatus explanation
r5445 | div0 | 2009-01-08 08:41:19 +0100 (Thu, 08 Jan 2009) | 2 lines
parse team numbers too
r5446 | div0 | 2009-01-08 09:09:14 +0100 (Thu, 08 Jan 2009) | 2 lines
draw players from their teams
r5447 | div0 | 2009-01-08 09:11:23 +0100 (Thu, 08 Jan 2009) | 2 lines
typo fix
r5448 | div0 | 2009-01-08 09:46:16 +0100 (Thu, 08 Jan 2009) | 2 lines
slightly reduced CR reload time to be exactly 2 shots
r5449 | div0 | 2009-01-08 10:00:07 +0100 (Thu, 08 Jan 2009) | 2 lines
delay taunts by 1 second
r5450 | esteel | 2009-01-08 11:33:26 +0100 (Thu, 08 Jan 2009) | 1 line
make those buttons a bit easier to understand
r5451 | div0 | 2009-01-08 11:42:26 +0100 (Thu, 08 Jan 2009) | 2 lines
make ONLY taunts use ATTN_MIN (sorry)
r5452 | div0 | 2009-01-08 11:43:15 +0100 (Thu, 08 Jan 2009) | 2 lines
headphone friendly mode
r5453 | div0 | 2009-01-08 14:02:10 +0100 (Thu, 08 Jan 2009) | 2 lines
cvar cl_taunt_directional
r5454 | div0 | 2009-01-08 15:46:18 +0100 (Thu, 08 Jan 2009) | 2 lines
only show errors about broken func_rotatings ONCE; make dynlight and SolidBSP triggers no longer MOVETYPE_PUSH (why were they?)
r5455 | div0 | 2009-01-08 19:18:10 +0100 (Thu, 08 Jan 2009) | 3 lines
menu rearrangements
item_respawn effect more particles
r5456 | esteel | 2009-01-08 20:03:10 +0100 (Thu, 08 Jan 2009) | 1 line
spam spam spam
r5457 | div0 | 2009-01-08 21:14:24 +0100 (Thu, 08 Jan 2009) | 2 lines
keyhunt: don't assign keys while waiting for game start
r5458 | div0 | 2009-01-08 21:17:56 +0100 (Thu, 08 Jan 2009) | 2 lines
remove these dprints :P
r5459 | div0 | 2009-01-08 21:23:38 +0100 (Thu, 08 Jan 2009) | 2 lines
fix the last change
r5460 | esteel | 2009-01-08 22:44:40 +0100 (Thu, 08 Jan 2009) | 2 lines
some rewording and restructuring to make server/readme.txt have an better flow
r5461 | esteel | 2009-01-08 22:57:04 +0100 (Thu, 08 Jan 2009) | 2 lines
fix makefile for phony pk3
r5462 | esteel | 2009-01-08 23:06:19 +0100 (Thu, 08 Jan 2009) | 2 lines
fix makefile for phony pk3 even more
r5463 | esteel | 2009-01-09 01:30:24 +0100 (Fri, 09 Jan 2009) | 2 lines
slight improvements
r5464 | esteel | 2009-01-09 13:37:54 +0100 (Fri, 09 Jan 2009) | 2 lines
unbalanced teams take THAT!!!!
r5465 | esteel | 2009-01-09 14:25:24 +0100 (Fri, 09 Jan 2009) | 2 lines
fix the team size hint, stupid me
r5466 | esteel | 2009-01-09 14:35:39 +0100 (Fri, 09 Jan 2009) | 2 lines
do not display the team size hint if YOU are in the spectator team
r5467 | div0 | 2009-01-09 14:45:02 +0100 (Fri, 09 Jan 2009) | 4 lines
new moving platforms func_vectormamamam (adds up origins of other movers) and func_fourier (adds up multiple sine waves).
Both can move a platform in a lissajous or circular pattern.
r5468 | div0 | 2009-01-09 14:47:12 +0100 (Fri, 09 Jan 2009) | 2 lines
make func_train 
r5469 | div0 | 2009-01-09 14:47:37 +0100 (Fri, 09 Jan 2009) | 2 lines
I meant: make func_train able to squish players
r5470 | div0 | 2009-01-09 14:50:26 +0100 (Fri, 09 Jan 2009) | 2 lines
func_fourier: default height now is 32
r5471 | div0 | 2009-01-09 15:14:47 +0100 (Fri, 09 Jan 2009) | 2 lines
rcon2irc status command fix
r5472 | esteel | 2009-01-09 15:47:51 +0100 (Fri, 09 Jan 2009) | 2 lines
unneeded variable
r5473 | esteel | 2009-01-09 17:45:04 +0100 (Fri, 09 Jan 2009) | 1 line
rip out the server side teamsize comlaining (bprint/centerprint) as the clientside hint should be enough now
r5474 | tzork | 2009-01-09 17:45:52 +0100 (Fri, 09 Jan 2009) | 2 lines
Turret should now work in ONS.
Updates to moving units.
r5475 | div0 | 2009-01-09 17:50:53 +0100 (Fri, 09 Jan 2009) | 2 lines
hooray! func_vectormamamam can now also project to planes, or to vectors!
r5476 | div0 | 2009-01-09 20:00:53 +0100 (Fri, 09 Jan 2009) | 2 lines
do less audio spam for triggers that don't even respond to players
r5477 | div0 | 2009-01-09 21:14:28 +0100 (Fri, 09 Jan 2009) | 2 lines
new toy: polycount.pl
r5478 | esteel | 2009-01-09 22:58:39 +0100 (Fri, 09 Jan 2009) | 1 line
forgot this file when renaming Pro to Havoc
r5479 | esteel | 2009-01-09 23:00:57 +0100 (Fri, 09 Jan 2009) | 2 lines
voice flood protection!!!\
update the cvar constatns for this protection and (im too lazy to seperate this) havoc had a weapons cvar missing
r5480 | esteel | 2009-01-10 00:04:37 +0100 (Sat, 10 Jan 2009) | 1 line
fix voice flood protection
r5481 | div0 | 2009-01-10 16:05:47 +0100 (Sat, 10 Jan 2009) | 2 lines
svc_stopsound; make sure exploding projectiles ALWAYS get their sound removed even if there is packet loss
r5482 | div0 | 2009-01-10 16:34:07 +0100 (Sat, 10 Jan 2009) | 2 lines
cl_voice_directional (play all voices directioanlly)
r5483 | div0 | 2009-01-10 19:10:33 +0100 (Sat, 10 Jan 2009) | 2 lines
make voice sounds a bit louder again
r5484 | div0 | 2009-01-10 19:15:51 +0100 (Sat, 10 Jan 2009) | 2 lines
make the Makefile always do update-cvarcount
r5485 | div0 | 2009-01-10 21:03:46 +0100 (Sat, 10 Jan 2009) | 4 lines
add a test csse for the blur: "blurtest" (only when compiled with -DBLURTEST)
example:
cl_cmd blurtest 1 100 0.3
r5486 | div0 | 2009-01-10 21:20:08 +0100 (Sat, 10 Jan 2009) | 5 lines
use electro_fly for the secondary, not for the primary
oggenc these wav files
make them looped properly
make electro_fly 25 dB more silent
r5487 | div0 | 2009-01-10 21:24:12 +0100 (Sat, 10 Jan 2009) | 2 lines
oggenc and loop properly the medplat wav files
r5488 | div0 | 2009-01-10 21:26:59 +0100 (Sat, 10 Jan 2009) | 2 lines
fix the file names in the compat pack builder
r5489 | div0 | 2009-01-10 21:29:41 +0100 (Sat, 10 Jan 2009) | 2 lines
make sure the client doesn't load possible old .wav files
r5490 | esteel | 2009-01-11 18:23:58 +0100 (Sun, 11 Jan 2009) | 1 line
split an larger if test into several, fixed the team size hint for me
r5491 | esteel | 2009-01-11 18:35:58 +0100 (Sun, 11 Jan 2009) | 1 line
add netgraph to the menu
r5492 | div0 | 2009-01-11 20:50:47 +0100 (Sun, 11 Jan 2009) | 2 lines
actually stop the electro_fly sound
r5493 | div0 | 2009-01-12 08:28:31 +0100 (Mon, 12 Jan 2009) | 2 lines
make projectiles support jumppads
r5494 | div0 | 2009-01-12 10:10:27 +0100 (Mon, 12 Jan 2009) | 5 lines
new mode: g_weapon_stay 2
players start with one ammo pickup full of ammo for each of the ammo types
picking up weapons won't gain any ammo at all
r5495 | div0 | 2009-01-12 10:17:42 +0100 (Mon, 12 Jan 2009) | 2 lines
improved weapon stay mode so it no longer affects the porto
r5496 | m0rfar | 2009-01-12 16:29:35 +0100 (Mon, 12 Jan 2009) | 1 line
Better SpawnCasing origins on the 3 guns that use it.
r5497 | div0 | 2009-01-13 07:10:14 +0100 (Tue, 13 Jan 2009) | 2 lines
can't fix this portal crash without additional info, but detect the bad condition and abort with a backtrace while keeping the server running. If anyone gets one of these backtraces, send it to me together with some lines of backlog.
r5498 | div0 | 2009-01-13 07:26:02 +0100 (Tue, 13 Jan 2009) | 2 lines
entities.def update by RoKenn
r5499 | div0 | 2009-01-13 08:53:15 +0100 (Tue, 13 Jan 2009) | 2 lines
turn traceline_inverted into a tracebox_inverted function
r5500 | div0 | 2009-01-13 09:26:58 +0100 (Tue, 13 Jan 2009) | 4 lines
new options for radarmap: --block (default, old style), --trace (using traceline_inverted), --hqblock
--trace looks darker, as it uses the ACTUAL height of floors, and does not check block wise
--hqblock takes 4 times as long as --block, and should look almost the same normally
r5501 | div0 | 2009-01-13 09:50:05 +0100 (Tue, 13 Jan 2009) | 2 lines
more stuff to this :P
r5502 | div0 | 2009-01-13 11:55:31 +0100 (Tue, 13 Jan 2009) | 2 lines
improve radarmap accuracy a little bit
r5503 | div0 | 2009-01-13 12:00:44 +0100 (Tue, 13 Jan 2009) | 2 lines
damn typo :P
r5504 | esteel | 2009-01-13 15:06:46 +0100 (Tue, 13 Jan 2009) | 1 line
added my help messages system so admins can easily provide players with some hints
r5505 | div0 | 2009-01-13 19:18:20 +0100 (Tue, 13 Jan 2009) | 2 lines
fix some div0s in FullTraceFraction
r5506 | div0 | 2009-01-13 19:21:11 +0100 (Tue, 13 Jan 2009) | 2 lines
fix the cause of radarmap --trace being too dark
r5507 | div0 | 2009-01-13 20:04:22 +0100 (Tue, 13 Jan 2009) | 2 lines
fix bug regarding radarmapper usage message
r5508 | div0 | 2009-01-13 20:06:08 +0100 (Tue, 13 Jan 2009) | 2 lines
remove a stupid debug print
r5509 | div0 | 2009-01-13 20:09:21 +0100 (Tue, 13 Jan 2009) | 2 lines
also check processed file names
r5510 | div0 | 2009-01-13 20:12:12 +0100 (Tue, 13 Jan 2009) | 2 lines
more file names
r5511 | div0 | 2009-01-13 20:13:56 +0100 (Tue, 13 Jan 2009) | 2 lines
shuffle maplist only if requested
r5512 | mand1nga | 2009-01-13 20:46:53 +0100 (Tue, 13 Jan 2009) | 2 lines
Added camera for demo playback. 
Use camera_enable for testing
r5513 | esteel | 2009-01-13 21:38:37 +0100 (Tue, 13 Jan 2009) | 1 line
overhaul of the blueplastic skin
r5514 | esteel | 2009-01-13 22:04:36 +0100 (Tue, 13 Jan 2009) | 1 line
changed the teamsize marker to show to all teams except specs, but only show the "press F5" msg to the largest team(s)
r5515 | div0 | 2009-01-14 10:07:30 +0100 (Wed, 14 Jan 2009) | 2 lines
monster framework from dpmod
r5516 | div0 | 2009-01-14 11:12:06 +0100 (Wed, 14 Jan 2009) | 2 lines
fix playerslots_active in rcon2irc
r5517 | esteel | 2009-01-14 12:42:05 +0100 (Wed, 14 Jan 2009) | 2 lines
g_maplist_votable 6 to have two rows full for maps, which looks better imo
r5518 | div0 | 2009-01-14 13:18:12 +0100 (Wed, 14 Jan 2009) | 4 lines
fixed the bug causing sv_cmd radarmap --trace take so long.
Please also test if shooting through walls with the camping rifle still works fine, as it uses the same code.
r5519 | div0 | 2009-01-14 13:20:33 +0100 (Wed, 14 Jan 2009) | 2 lines
fixed important code I killed while trying to kill just debug stuff
r5520 | div0 | 2009-01-14 13:32:26 +0100 (Wed, 14 Jan 2009) | 2 lines
fix a case where trace_endpos made no sense
r5521 | div0 | 2009-01-14 13:32:44 +0100 (Wed, 14 Jan 2009) | 2 lines
this better is a dprint
r5522 | div0 | 2009-01-14 13:43:09 +0100 (Wed, 14 Jan 2009) | 2 lines
make this a dprint too
r5523 | div0 | 2009-01-14 13:59:31 +0100 (Wed, 14 Jan 2009) | 2 lines
radarmap: default to the --trace method, as it is faster now
r5524 | esteel | 2009-01-14 14:39:14 +0100 (Wed, 14 Jan 2009) | 2 lines
renamed calltimeout/resumegame to timein/timeout.  As its hardly used (so far ladder only) not worrying about compatibility
r5525 | div0 | 2009-01-14 15:25:47 +0100 (Wed, 14 Jan 2009) | 2 lines
reduce camping rifle secondary damage a bit
r5526 | esteel | 2009-01-14 15:49:38 +0100 (Wed, 14 Jan 2009) | 2 lines
small change to the help script
r5527 | mand1nga | 2009-01-14 18:58:17 +0100 (Wed, 14 Jan 2009) | 1 line
Updated text colors and demo handling references
r5528 | mand1nga | 2009-01-14 19:06:43 +0100 (Wed, 14 Jan 2009) | 1 line
Added camera_disable alias
r5529 | esteel | 2009-01-14 20:11:21 +0100 (Wed, 14 Jan 2009) | 1 line
mention the old way to use colors again, GENERATE html from the aft file and merge it into Docs/faq.html
r5530 | mand1nga | 2009-01-14 21:19:39 +0100 (Wed, 14 Jan 2009) | 1 line
Spell checking!
r5531 | m0rfar | 2009-01-14 22:47:27 +0100 (Wed, 14 Jan 2009) | 1 line
Added mand1nga to credits (programmer)
r5532 | m0rfar | 2009-01-14 23:06:03 +0100 (Wed, 14 Jan 2009) | 2 lines
Added a graphics source folder (that shall not be shipped with nexuiz)
* .psd sources for Silver and Wickedz (background image only) menu skins.
r5533 | div0 | 2009-01-15 06:54:47 +0100 (Thu, 15 Jan 2009) | 2 lines
some centerprint fixes by victim
r5534 | div0 | 2009-01-15 07:56:52 +0100 (Thu, 15 Jan 2009) | 2 lines
properly stopsound the rocket fly sound
r5535 | div0 | 2009-01-15 07:58:24 +0100 (Thu, 15 Jan 2009) | 2 lines
properly use the base volume for turrets
r5536 | div0 | 2009-01-15 09:04:16 +0100 (Thu, 15 Jan 2009) | 2 lines
make misc_laser more flexible
r5537 | esteel | 2009-01-15 10:52:04 +0100 (Thu, 15 Jan 2009) | 2 lines
pro is now havoc, one more file that knows this fact :P
r5538 | esteel | 2009-01-15 11:10:46 +0100 (Thu, 15 Jan 2009) | 1 line
move the server examples out of Docs and into a dir of its own so more people will see it, adjust the makebuilde.sh script to include it
r5539 | esteel | 2009-01-15 11:16:32 +0100 (Thu, 15 Jan 2009) | 2 lines
pro is now havoc and server got moved, one more file that knows those facts :P will update the matching html file later
r5540 | esteel | 2009-01-15 11:23:53 +0100 (Thu, 15 Jan 2009) | 2 lines
pro is now havoc, just minor nitpicking but one more file that knows this fact :P
r5541 | esteel | 2009-01-15 12:30:44 +0100 (Thu, 15 Jan 2009) | 1 line
somewhat huge directory restructuring, all non nexuizXX.zip files are stored in trunk/misc including artwork and mediasources like models, skins, flag icons, all tool stuff got moved to misc/tools, 
r5542 | div0 | 2009-01-15 12:31:22 +0100 (Thu, 15 Jan 2009) | 2 lines
electro: properly clear projectile sound
r5543 | m0rfar | 2009-01-15 14:19:53 +0100 (Thu, 15 Jan 2009) | 1 line
moved demos tab to multiplayer dialog
r5544 | div0 | 2009-01-15 14:45:24 +0100 (Thu, 15 Jan 2009) | 2 lines
handle RL, Seeker and Electro projectiles completely on the client, to prevent the "sound stays when packet loss" problem entirely
r5545 | div0 | 2009-01-15 14:46:30 +0100 (Thu, 15 Jan 2009) | 2 lines
remove some unnecessary stopsound calls
r5546 | div0 | 2009-01-15 14:56:09 +0100 (Thu, 15 Jan 2009) | 2 lines
add the missing files
r5547 | div0 | 2009-01-15 14:57:13 +0100 (Thu, 15 Jan 2009) | 2 lines
only do the sound in somewhat current engines
r5548 | div0 | 2009-01-15 14:58:52 +0100 (Thu, 15 Jan 2009) | 2 lines
shots slider should also control csqc channel 6
r5549 | div0 | 2009-01-15 15:03:07 +0100 (Thu, 15 Jan 2009) | 2 lines
describe the csqc channel use
r5550 | mand1nga | 2009-01-15 15:27:53 +0100 (Thu, 15 Jan 2009) | 5 lines
Demo camera improvements:
Added support for controlling the camera smoothly (cvars camera_speed_attenuation and camera_mouse_treshold)
Independent speeds for free and chase modes
Support for applying smoothness to player movements (cvar camera_chase_smoothly)
More intuitive cvar names
r5551 | mand1nga | 2009-01-15 16:09:24 +0100 (Thu, 15 Jan 2009) | 1 line
Fixed typos
r5552 | div0 | 2009-01-15 16:24:49 +0100 (Thu, 15 Jan 2009) | 2 lines
remove some ?: operators as fteqcc hates them
r5553 | div0 | 2009-01-15 16:35:33 +0100 (Thu, 15 Jan 2009) | 2 lines
fix some silly "self.nextthink = time + cvar("sys_ticrate")" :P
r5554 | esteel | 2009-01-15 16:44:37 +0100 (Thu, 15 Jan 2009) | 1 line
updated the html files
r5555 | div0 | 2009-01-15 17:23:50 +0100 (Thu, 15 Jan 2009) | 2 lines
egyptsoc: add permission txt file, and normalmap gimp script that has been used
r5556 | div0 | 2009-01-15 18:06:03 +0100 (Thu, 15 Jan 2009) | 2 lines
egyptsoc texture set
r5557 | div0 | 2009-01-15 18:08:33 +0100 (Thu, 15 Jan 2009) | 2 lines
csqcprojectiles: make them more readable; make turrets use them too when they fire a rocket with sound (so they no longer need to use stopsound).
r5558 | div0 | 2009-01-15 18:09:17 +0100 (Thu, 15 Jan 2009) | 2 lines
forgot this one
r5559 | m0rfar | 2009-01-15 18:21:23 +0100 (Thu, 15 Jan 2009) | 1 line
Crosshair 9 & 10 source.
r5560 | esteel | 2009-01-15 18:51:45 +0100 (Thu, 15 Jan 2009) | 2 lines
Crosshair 8 & 11 source
r5561 | esteel | 2009-01-15 23:15:29 +0100 (Thu, 15 Jan 2009) | 1 line
csqc crosshair code which allows per weapon crosshairs, mostly done by MirceaKitsune with some advice by div0 and me.  The menu still needs better changes!!
r5562 | div0 | 2009-01-16 09:09:32 +0100 (Fri, 16 Jan 2009) | 2 lines
do bouncing client side (sound is still server side)
r5563 | div0 | 2009-01-16 09:12:06 +0100 (Fri, 16 Jan 2009) | 2 lines
support move_avelocity too
r5564 | div0 | 2009-01-16 09:15:23 +0100 (Fri, 16 Jan 2009) | 3 lines
update the csqc projectile when a func_rotating like entity is hit (csqc doesn't know these)
r5565 | div0 | 2009-01-16 10:05:49 +0100 (Fri, 16 Jan 2009) | 2 lines
give projectiles the right solid state
r5566 | div0 | 2009-01-16 11:24:20 +0100 (Fri, 16 Jan 2009) | 2 lines
make crosshair size depend on the image size again
r5567 | div0 | 2009-01-16 11:45:00 +0100 (Fri, 16 Jan 2009) | 2 lines
allow overriding the crosshair color, and scaling alpha and size for the weapon specific CHs
r5568 | esteel | 2009-01-16 12:09:09 +0100 (Fri, 16 Jan 2009) | 2 lines
think the CH was broken, tried to fix it but can't test right now :-)
r5569 | esteel | 2009-01-16 13:14:41 +0100 (Fri, 16 Jan 2009) | 1 line
added the tourney mods cointoss
r5570 | div0 | 2009-01-16 13:17:25 +0100 (Fri, 16 Jan 2009) | 2 lines
optimize :)
r5571 | div0 | 2009-01-16 14:51:10 +0100 (Fri, 16 Jan 2009) | 2 lines
make trigger_impulse always unset FL_ONGROUND
r5572 | div0 | 2009-01-16 15:06:45 +0100 (Fri, 16 Jan 2009) | 2 lines
allow maps to load in DM if they support NO game type
r5573 | div0 | 2009-01-16 16:21:04 +0100 (Fri, 16 Jan 2009) | 2 lines
per-weapon crosshair images; too bad these are a failure, and need to be redone at a higher resolution
r5574 | mand1nga | 2009-01-16 18:08:56 +0100 (Fri, 16 Jan 2009) | 1 line
Disabled weapon zoom while using the demo camera
r5575 | div0 | 2009-01-16 19:43:50 +0100 (Fri, 16 Jan 2009) | 2 lines
use servertime that LH just added :)
r5576 | div0 | 2009-01-16 20:59:00 +0100 (Fri, 16 Jan 2009) | 2 lines
the next batch of weapons using the new projectile code: grenade launcher, electro, crylink, mg, sg, camping rifle
r5577 | div0 | 2009-01-16 20:59:59 +0100 (Fri, 16 Jan 2009) | 2 lines
make SG and MG also use that code if NOT using ballistic projectiles
r5578 | mand1nga | 2009-01-16 21:03:05 +0100 (Fri, 16 Jan 2009) | 2 lines
n00bots never heard about weapon combos
improved enemies rating
r5579 | div0 | 2009-01-16 21:10:48 +0100 (Fri, 16 Jan 2009) | 2 lines
laser and hlac: csqc projectile
r5580 | div0 | 2009-01-16 21:22:51 +0100 (Fri, 16 Jan 2009) | 2 lines
fix some projectile issues, and send less bytes per csqc projectile
r5581 | div0 | 2009-01-16 22:11:07 +0100 (Fri, 16 Jan 2009) | 2 lines
make porto and seeker use csqc projectiles completely
r5582 | div0 | 2009-01-16 22:17:53 +0100 (Fri, 16 Jan 2009) | 2 lines
fix MOVETYPE_NONE
r5583 | div0 | 2009-01-16 22:28:53 +0100 (Fri, 16 Jan 2009) | 2 lines
make the remainign weapons csqc projectiles
r5584 | esteel | 2009-01-16 23:58:41 +0100 (Fri, 16 Jan 2009) | 2 lines
make u show the chat history
r5585 | esteel | 2009-01-17 11:46:57 +0100 (Sat, 17 Jan 2009) | 2 lines
spell checked the help system messages, improved some messages, made comments and usage clearer
r5586 | esteel | 2009-01-17 11:53:45 +0100 (Sat, 17 Jan 2009) | 2 lines
ups
r5587 | div0 | 2009-01-17 18:53:48 +0100 (Sat, 17 Jan 2009) | 4 lines
moved gibbing from server to client
SavageX: please reimplement sv_gentle as client cvar in client/gibs.qc
r5588 | div0 | 2009-01-17 18:56:34 +0100 (Sat, 17 Jan 2009) | 2 lines
transmit the sv_gentle state from server to client. SavageX: you know what to do in gibs.qc :)
r5589 | div0 | 2009-01-17 19:02:34 +0100 (Sat, 17 Jan 2009) | 2 lines
fix typo
r5590 | div0 | 2009-01-17 19:12:49 +0100 (Sat, 17 Jan 2009) | 2 lines
register weapon info only ONCE
r5591 | div0 | 2009-01-17 19:14:20 +0100 (Sat, 17 Jan 2009) | 2 lines
fix projectile movetypes
r5592 | div0 | 2009-01-17 19:17:10 +0100 (Sat, 17 Jan 2009) | 2 lines
fix precache names of gibs
r5593 | div0 | 2009-01-17 19:39:56 +0100 (Sat, 17 Jan 2009) | 2 lines
make crylink no longer use an impact sound and effect, instead do this on csqc
r5594 | div0 | 2009-01-17 19:40:32 +0100 (Sat, 17 Jan 2009) | 2 lines
remove two debug prints
r5595 | mand1nga | 2009-01-17 19:44:54 +0100 (Sat, 17 Jan 2009) | 1 line
Updated some changes
r5596 | div0 | 2009-01-17 21:07:28 +0100 (Sat, 17 Jan 2009) | 2 lines
fix countdown announcers
r5597 | div0 | 2009-01-17 22:29:16 +0100 (Sat, 17 Jan 2009) | 2 lines
now all projectile hit effects are clientside
r5598 | div0 | 2009-01-17 22:32:32 +0100 (Sat, 17 Jan 2009) | 2 lines
fix SG damage again
r5599 | div0 | 2009-01-17 22:56:41 +0100 (Sat, 17 Jan 2009) | 2 lines
use TR_SLIGHTBLOOD too
r5600 | esteel | 2009-01-18 00:50:38 +0100 (Sun, 18 Jan 2009) | 2 lines
gibs are now handled clientside so do no longer request/send cl_gibs from the client to the server
r5601 | m0rfar | 2009-01-18 15:28:46 +0100 (Sun, 18 Jan 2009) | 2 lines
Added a Network tab in Settings. With the most common Network options.
There is space for more options here, so more can be added in the future.
r5602 | esteel | 2009-01-18 16:23:24 +0100 (Sun, 18 Jan 2009) | 1 line
crosshair 0 = DISABLE crosshair :-P
r5603 | div0 | 2009-01-18 20:10:02 +0100 (Sun, 18 Jan 2009) | 2 lines
set -616 frags for nonsolid players; that way the engine can know about them, and not collide against them
r5604 | div0 | 2009-01-18 20:22:38 +0100 (Sun, 18 Jan 2009) | 2 lines
client projectiles: use a better way to find the trace normal
r5605 | div0 | 2009-01-18 21:22:34 +0100 (Sun, 18 Jan 2009) | 2 lines
csqc casings
r5606 | div0 | 2009-01-18 21:38:04 +0100 (Sun, 18 Jan 2009) | 2 lines
missing file
r5607 | div0 | 2009-01-19 07:17:57 +0100 (Mon, 19 Jan 2009) | 2 lines
cl_gentle mode (test)
r5608 | div0 | 2009-01-19 08:00:57 +0100 (Mon, 19 Jan 2009) | 2 lines
fix cl_gentle
r5609 | div0 | 2009-01-19 08:22:24 +0100 (Mon, 19 Jan 2009) | 2 lines
move some weapon precache stuff to where it belongs... the others follow later
r5610 | div0 | 2009-01-19 08:36:12 +0100 (Mon, 19 Jan 2009) | 2 lines
fix the other precaches
r5611 | div0 | 2009-01-19 08:58:49 +0100 (Mon, 19 Jan 2009) | 2 lines
fix BAD typo here :(
r5612 | div0 | 2009-01-19 09:01:52 +0100 (Mon, 19 Jan 2009) | 2 lines
fix the fly sounds
r5613 | div0 | 2009-01-19 09:11:12 +0100 (Mon, 19 Jan 2009) | 2 lines
fix casings
r5614 | div0 | 2009-01-19 09:24:14 +0100 (Mon, 19 Jan 2009) | 2 lines
fix csqcchannel6volume control
r5615 | div0 | 2009-01-19 10:20:54 +0100 (Mon, 19 Jan 2009) | 2 lines
fix menu layout (make it more consistent); remove another FBL
r5616 | div0 | 2009-01-19 10:37:16 +0100 (Mon, 19 Jan 2009) | 2 lines
fix the weapons/rick1.wav sounds (instant rickroll... sorry, ricochets)
r5617 | div0 | 2009-01-19 13:58:44 +0100 (Mon, 19 Jan 2009) | 2 lines
casings sound fixed :P
r5618 | m0rfar | 2009-01-19 15:24:09 +0100 (Mon, 19 Jan 2009) | 1 line
Better normalmaps for flags and portals, I think.
r5619 | mand1nga | 2009-01-19 23:57:49 +0100 (Mon, 19 Jan 2009) | 2 lines
New demo camera mode for looking always to the player
New cvar camera_forward_follows for spectator-like camera
r5620 | esteel | 2009-01-20 14:26:42 +0100 (Tue, 20 Jan 2009) | 1 line
outdated, the only item in this list is already done
r5621 | esteel | 2009-01-20 15:00:29 +0100 (Tue, 20 Jan 2009) | 1 line
the old CSQC code is no longer needed and in case people want to take a look at it, use svn :P
r5622 | m0rfar | 2009-01-21 14:33:28 +0100 (Wed, 21 Jan 2009) | 2 lines
More realistic blood color on impacts
Better smoke trail color on grenades
r5623 | div0 | 2009-01-22 07:07:04 +0100 (Thu, 22 Jan 2009) | 2 lines
assault: leave non-team spawnpoints alone when switching rounds
r5624 | div0 | 2009-01-22 08:40:44 +0100 (Thu, 22 Jan 2009) | 2 lines
fix assault resetting of spampoints
r5625 | div0 | 2009-01-22 09:15:16 +0100 (Thu, 22 Jan 2009) | 2 lines
new entities: trigger_relay_teamcheck, trigger_disablerelay
r5626 | div0 | 2009-01-22 09:20:15 +0100 (Thu, 22 Jan 2009) | 2 lines
DP_SV_ONENTITYPREPOSTSPAWNFUNCTION - hooks before and after spawning an entity from a map/ent
r5627 | div0 | 2009-01-22 12:27:26 +0100 (Thu, 22 Jan 2009) | 2 lines
use less bytes; add a .void() reset to all entities for later use by ready-restart
r5628 | div0 | 2009-01-22 13:03:34 +0100 (Thu, 22 Jan 2009) | 2 lines
make all triggers properly self-reset; still missing important stuff: items, and plats
r5629 | div0 | 2009-01-22 13:24:11 +0100 (Thu, 22 Jan 2009) | 2 lines
make all plats reset themselves on ready restart (PLEASE TEST, this may be broken)
r5630 | div0 | 2009-01-22 13:29:04 +0100 (Thu, 22 Jan 2009) | 2 lines
game command __FORCE_READY_RESTART to always force a ready-restart (use with care)
r5631 | div0 | 2009-01-22 13:32:02 +0100 (Thu, 22 Jan 2009) | 2 lines
__FORCE_READY_RESTART: do not respawn players during that (so you can see if it resets platforms right)
r5632 | div0 | 2009-01-22 13:34:10 +0100 (Thu, 22 Jan 2009) | 2 lines
death to g_decors.qc (it no longer does anything anyway)
r5633 | div0 | 2009-01-22 13:45:41 +0100 (Thu, 22 Jan 2009) | 2 lines
make lots of stuff self-resetting
r5634 | div0 | 2009-01-22 13:54:13 +0100 (Thu, 22 Jan 2009) | 2 lines
more self-resetting
r5635 | div0 | 2009-01-22 13:59:43 +0100 (Thu, 22 Jan 2009) | 2 lines
make WPs self-resetting
r5636 | div0 | 2009-01-23 07:33:47 +0100 (Fri, 23 Jan 2009) | 2 lines
make random teleport dest work
r5637 | div0 | 2009-01-23 11:51:33 +0100 (Fri, 23 Jan 2009) | 2 lines
cvar list editor
r5638 | div0 | 2009-01-23 11:55:31 +0100 (Fri, 23 Jan 2009) | 2 lines
document the new extensions
r5639 | div0 | 2009-01-23 12:06:17 +0100 (Fri, 23 Jan 2009) | 2 lines
no longer use cvars.txt, do the filtering in code now
r5640 | div0 | 2009-01-23 13:06:07 +0100 (Fri, 23 Jan 2009) | 2 lines
fix porto bouncing
r5641 | div0 | 2009-01-23 13:54:30 +0100 (Fri, 23 Jan 2009) | 2 lines
add the new skin params
r5642 | div0 | 2009-01-23 13:55:53 +0100 (Fri, 23 Jan 2009) | 2 lines
add missing sound precache
r5643 | esteel | 2009-01-23 13:57:21 +0100 (Fri, 23 Jan 2009) | 2 lines
put the descriptions from the old cvars.txt to good use
r5644 | div0 | 2009-01-23 14:06:31 +0100 (Fri, 23 Jan 2009) | 2 lines
fix missing electro sounds and warnings
r5645 | div0 | 2009-01-23 14:32:08 +0100 (Fri, 23 Jan 2009) | 2 lines
more visible damage_hit
r5646 | div0 | 2009-01-23 15:17:15 +0100 (Fri, 23 Jan 2009) | 2 lines
prevent score adding whne in intermission
r5647 | esteel | 2009-01-23 15:27:56 +0100 (Fri, 23 Jan 2009) | 2 lines
turn lots of comments into cvar descriptions, verified as good as possible.. still please watch out for problems from this huge change
r5648 | esteel | 2009-01-23 15:40:08 +0100 (Fri, 23 Jan 2009) | 2 lines
countp -> counth as its called havoc now :P
r5649 | esteel | 2009-01-23 16:07:58 +0100 (Fri, 23 Jan 2009) | 1 line
ups, a few tabs in wrong places
r5650 | esteel | 2009-01-23 23:06:05 +0100 (Fri, 23 Jan 2009) | 3 lines
added cl_gentle, moved other stuff around a bit to make room for it
gloss allows for r_glsl_deluxemapping 1 and 2 now
r5651 | esteel | 2009-01-23 23:39:21 +0100 (Fri, 23 Jan 2009) | 1 line
switch deluxe/gloss with offset/relief options as it makes more sense that way round
r5652 | esteel | 2009-01-24 13:47:41 +0100 (Sat, 24 Jan 2009) | 1 line
move the important messages a bit lower to make them more visible.. maybe in the long run this should become a cvar
r5653 | esteel | 2009-01-24 15:44:11 +0100 (Sat, 24 Jan 2009) | 1 line
enable showbrand by default to make sure to people "SVN" is still in development.  Still need to change the makebuild.sh to disable this for real builds.  Will do that as soon as i have some time to look into it
r5654 | m0rfar | 2009-01-24 17:35:39 +0100 (Sat, 24 Jan 2009) | 1 line
Use less crappy menu music :)
r5655 | div0 | 2009-01-24 20:09:12 +0100 (Sat, 24 Jan 2009) | 2 lines
fix a warning
r5656 | div0 | 2009-01-24 20:29:12 +0100 (Sat, 24 Jan 2009) | 2 lines
add marker comments and a message how to disable the brand.tga to defaultNexuiz.cfg

Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/.patchsets	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-5394
+revisions_applied = 1-5656

Modified: branches/nexuiz-2.0/Docs/basics.html
===================================================================
--- branches/nexuiz-2.0/Docs/basics.html	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/Docs/basics.html	2009-01-24 19:51:12 UTC (rev 5658)
@@ -65,20 +65,21 @@
 		  </ul>		</div>
 		<p id="tagline">Nexuiz is a <b>free</b> open-source first person shooter that runs on <b>Windows</b>, <b>Linux</b> and <b>OSX</b>.</p>
 	  <div id="content">
-		  <div class="body">
-<br><center><h1><a name="AFT-top"id="AFT-top">Nexuiz Basics explained</a></h1></center>
+<div class="body">
+
+<br><center><h1><a name="AFT-top" id="AFT-top">Nexuiz Basics explained</a></h1></center>
 <center><a class="link" href="http://nexuiz.com">http://nexuiz.com</a>&nbsp;&nbsp;<a class="link" href="http://alientrap.org">http://alientrap.org</a></center>
 <hr>
 <p class="Body">
 This file attempts to cover all of the fundamental principles and techniques for playing Nexuiz in particular, though it will largely apply to any first person shooter.
 </p>
 <!-- Start SectLevel1 -->
-<h2><a name="_Getting Comfortable_"id="_Getting Comfortable_"><strong>Getting Comfortable</strong></a></h2>
+<h2><a name="_Getting Comfortable_" id="_Getting Comfortable_"><strong>Getting Comfortable</strong></a></h2>
 <p class="Body">
 The most important thing when playing is 'to feel good'.  You need to be comfortable with how the game feels, and how it works, in order to play well.  This means being able to concentrate on the game play itself, without being disturbed by in-game distractions or by various sorts of handicaps.  This guide provides a systematic but very brief introduction to Nexuiz, with a view to increasing your effectiveness in-game, straight off the mark.
 </p>
 <!-- Start SectLevel2 -->
-<h3><a name="''Reducing Clutter''"id="''Reducing Clutter''"><em>Reducing Clutter</em></a></h3>
+<h3><a name="''Reducing Clutter''" id="''Reducing Clutter''"><em>Reducing Clutter</em></a></h3>
 <p class="Body">
 Especially when playing against others the first thing you need to ensure is that you can hear and see well.  Although music can enhance the feeling of a game by complementing the action, it can also obscure the sounds of other events - such as players shooting at you or picking up items nearby.  For this reason, many people turn off music while playing (set <em>music</em> in the <em>settings/misc</em> menu to <em>off</em>).  You can also improve your ability to hear in-game events by simply using headphones instead of speakers.  Headphones muffle external noises around you, and also make it easier to hear faint noises in the game.  Because of this, you can hear others more easily, and thus react better.
 </p>
@@ -89,7 +90,7 @@
 In this regard, one of the first things to adjust is the brightness and contrast (in the <em>settings/video</em> menu), so that shadows are not too impenetrable, and areas of alternating light and dark don't create difficulties in tracking opponents.  It's also worthwhile to try increasing you field of view (fov) - the amount you can see to the left and right.  By default, Nexuiz uses a fov of 90 degrees.  Increasing this improves your peripheral vision, but also makes everything seem smaller and thus reduces your ability to aim.  Decreasing it has the opposite effect.  Most gamers find a nice balance somewhere around fov 100-120.  You can find the fov control in the <em>multiplayer/player setup</em> menu.
 </p>
 <!--End Section 2-->
-<h3><a name="''Controlling Your Character''"id="''Controlling Your Character''"><em>Controlling Your Character</em></a></h3>
+<h3><a name="''Controlling Your Character''" id="''Controlling Your Character''"><em>Controlling Your Character</em></a></h3>
 <p class="Body">
 Another thing which will greatly improve the game experience is to have comfortable movement controls, and to be able to get to the 'right gun' quickly.  In terms of movement, there's no need to stick to the game defaults for controlling your character.  Some people like to jump with space; some with mouse2.  Some like inverted mouse, and some can't use it.  Some use WASD for forward, left, back, right; some use ESDF or even 8456.  Use whatever you feel good with.
 </p>
@@ -102,15 +103,15 @@
 <!--End Section 2-->
 <!-- End SectLevel2 -->
 <!--End Section 1-->
-<h2><a name="_Playing_"id="_Playing_"><strong>Playing</strong></a></h2>
+<h2><a name="_Playing_" id="_Playing_"><strong>Playing</strong></a></h2>
 <!-- Start SectLevel2 -->
-<h3><a name="''Identifying Your Opponent''"id="''Identifying Your Opponent''"><em>Identifying Your Opponent</em></a></h3>
+<h3><a name="''Identifying Your Opponent''" id="''Identifying Your Opponent''"><em>Identifying Your Opponent</em></a></h3>
 <p class="Body">
 Depending on the game mode played you either fight for yourself against all others (sometimes there is just one other player to play against) or its your team vs the other team(s).  Pay attention to the welcoming screen it will tell you what gamemode is being played.  You can find an explaination of those at the end of this guide.
 If its a team match you might have to choose a team or you could be automatically assigned to a team when you join the match.  If you have to choose yourself its best to just use the <tt>Auto</tt> button!  It will assign you to the smallest team or if the teams have the same size to the one that has less points.  Only use the specific team buttons if you REALLY want to join that team.  You can press F5 to bring up the team selection dialog or instead of pressing F5 and clicking on the <tt>Auto</tt> button you can also press F6, thats a shortcut for the <tt>Auto</tt> button.  If you are unsure about which team you are in look at your gun or at the scoreboard, which by default will be shown when you press <em>TAB</em>.  The weapon color and the color behind your name is your team color.  Try to only hit the OTHER team(s) :).
 </p>
 <!--End Section 2-->
-<h3><a name="''Hitting Your Opponent''"id="''Hitting Your Opponent''"><em>Hitting Your Opponent</em></a></h3>
+<h3><a name="''Hitting Your Opponent''" id="''Hitting Your Opponent''"><em>Hitting Your Opponent</em></a></h3>
 <p class="Body">
 Once you're comfortable with your controls and your mouse, you should already find it easier to hit your opponents.  And, if you've bound keys to each of the weapons, you can accurately pick which one to use.  But to know which weapon to select, and to get the most out of it, you must understand the advantages and the use of each.
 </p>
@@ -130,7 +131,7 @@
 A special feature in Nexuiz is that walls do not block explosions, so you can't hide behind them.  Similarly, if you know that someone is on the floor above you, shoot at the ceiling, and with a little luck the explosion might hurt him.  This <em>can</em> be changed by a server admin, but the default allows for more fun; and it's also nice to see how good people are at guessing where their opponents are.
 </p>
 <!--End Section 2-->
-<h3><a name="''Controlling The Map''"id="''Controlling The Map''"><em>Controlling The Map</em></a></h3>
+<h3><a name="''Controlling The Map''" id="''Controlling The Map''"><em>Controlling The Map</em></a></h3>
 <p class="Body">
 To put up a good fight you need to survive an attack, so make sure you pick up health and armor lying around the map.  This will also ensure that your opponents are deprived of these, so it will be easier for you to frag them.  To do this effectively you will have to learn where those items are, and try to get them before someone else does.  Armor and health items reappear 30 seconds after they were taken.  You can use this to your advantage by timing your pickups - look at the scoreboard to see the current map time, and then use this to predict when items will respawn.  This way, you can develop patterns on the map so that you're always around when an item respawns.  However, be careful - patterns make you predictable, and your opponent can also use the timer!  If you keep grabbing the armor or health, he will use this against you by lying an ambush.
 </p>
@@ -141,7 +142,7 @@
 In regard to the previous point of working a map to control items, and also shooting at where your opponent will be, it's important to try to predict where on the map your opponents are even when you can't directly see them.  First, try to listen for them; secondly, learn the maps so you know the most useful routes and the most popular areas to which people tend to gravitate.  It gives you a marked advantage to be able to say, &quot;I saw or heard someone pick up an armor, so they must be at such-and-such location, and from there he can only go to this place or that place.&quot; Just shooting something to the likely places your opponent will be - a rocket or a grenade for example - can often result in either a surprise kill, or in surprise damage which you can then follow up.  Don't underestimate how likely a well-aimed educated guess is to hit someone.  Maybe he'll walk into it - rockets can be hard to see coming, and grenades lying on the floor or spammed into a small space can be really hard to avoid.  Once you've hurt him you'll hear the tink of your damage, and you will also know for sure were he is and can finish him off.  You can pretty much 'lock down' a map by picking up items, and making sure others have a hard time getting around which will also mess with their concentration.
 </p>
 <!--End Section 2-->
-<h3><a name="''Using Weapons Effectively''"id="''Using Weapons Effectively''"><em>Using Weapons Effectively</em></a></h3>
+<h3><a name="''Using Weapons Effectively''" id="''Using Weapons Effectively''"><em>Using Weapons Effectively</em></a></h3>
 <p class="Body">
 Among the items you can pick up are the weapons.  Some of them are very unique to Nexuiz, and to get the most out of them you need to be familiar with every aspect of how they work - including the rate of fire, the damage per hit, the spread and speed of the payload, and so on.
 </p>
@@ -155,7 +156,7 @@
 <li>The grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.</li>
 </ul>
 <ul>
-<li>The port-o-launch is the perfection of movement.  The grenade it launches creates two portals.  On first impact it creates the entrace portal, on secondary impact the exit portal.  If you enter the first one you (or others and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other poral along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replentish the energy by simply teleporting something thru it.</li>
+<li>The port-o-launch is the perfection of movement.  The grenade it launches creates two portals.  On first impact it creates the entrace portal, on secondary impact the exit portal.  If you enter the first one you (or others and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.</li>
 </ul>
 <ul>
 <li>The shotgun is very similar to that of other games.  It shoots several hitscan pellets with a high spread, so it does very high damage at close range, but becomes very inaccurate at distance.  It is also very useful to knock opponents out after you already hit them hard with a rocket or other projectile, and subsequently closed to a distance where these are no longer as useful, because it's hard to miss with at close range.  The primary fire mode fires once with a short reload, while the secondary fire mode shoots three very quick shots, but with a long reload afterwards.  Starting with Nexuiz 2.3 the secondary firemode will also have a higher spread so the primary is useful for a longer distance then the secondary firemode.  The shotgun uses pellet ammo which is not shared with any other weapons.</li>
@@ -179,10 +180,10 @@
 <li>The nex is a powerful sniper weapon.  Its primary fire mode fires a hitscan antimatter lance for significant damage, but requires a very precise aim, and has a relatively long reload time.  The secondary fire mode activates zoom.  The nex uses cell ammo which is shared with the hlac, crylink, minstanex and the electro.</li>
 </ul>
 <ul>
-<li>The minsta nex is the snipers wet dream.  Simiar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used soley in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.</li>
+<li>The minsta nex is the snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.</li>
 </ul>
 <ul>
-<li>The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automaticaly if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.</li>
+<li>The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.</li>
 </ul>
 <ul>
 <li>The hagar can be compared to the plasma gun from Quake3.  It has a very high rate of fire, with moderate damage, and some splash damage.  The primary fire mode shoots small projectile missiles at high speed and an extraordinary rate of fire.  The secondary fire mode shoots the same missiles, but at a slower speed and rate of fire, and without the instant trigger.  This means that they will bounce once when hitting a floor or wall, giving you the opportunity to fire around corners, or double your chances to hit someone by spamming an area.  The hagar uses rocket ammo which is shared with the mortar, TAG and the rocket launcher.</li>
@@ -191,14 +192,14 @@
 <li>The rocket launcher is a little different from that of other games, in that the rockets move relatively slowly.  The primary fire mode shoots a slow-moving, high-damage rocket projectile at a medium rate of fire.  The secondary fire mode will explode all your rockets at once.  This means that you don't need to hit your opponent directly - just get the rocket <em>near</em> him, and use the secondary fire to cause splash damage which will badly hurt him.  The rocket launcher uses rocket ammo which is shared with the mortar, TAG and the hagar.</li>
 </ul>
 <ul>
-<li>The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severly damage everyone in its radius and also stops in comming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.</li>
+<li>The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.</li>
 </ul>
 <p class="Body">
-Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explostions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
+Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
 Also note that some objects are affected / pushed by explosion like the keys in Keyhunt or the flags in Capture the Flag.
 </p>
 <!--End Section 2-->
-<h3><a name="''Using Jumping Effectively''"id="''Using Jumping Effectively''"><em>Using Jumping Effectively</em></a></h3>
+<h3><a name="''Using Jumping Effectively''" id="''Using Jumping Effectively''"><em>Using Jumping Effectively</em></a></h3>
 <p class="Body">
 You will need to be able to get around the map quickly and efficiently if you are to hunt down your opponents, and collect items well.  As already mentioned, the laser is useful for jumping and gaining speed - but you can use all explosive weapons for a similar effect.  Other weapons, however, will cause (much) more damage to your health, and not all offer the same strong push as the laser.  The rocket launcher will push you twice as far, but you will also take <em>lots</em> more damage.  The mortar has the same push as the laser, but its explosion is bigger so the timing and the right angle are less of an issue.  For this reason, the mortar is better for a beginner to learn these sorts of jumps.
 </p>
@@ -212,20 +213,20 @@
 Both the speed jumping and the turning require a certain amount of practice, but they are easy to learn - especially compared to the trick jumping found in games like Quake 3 CPMA or Enemy Territory.  However, there is another trick in Nexuiz that does not need any practice at all: the ramp jump.  Just walk up a ramp or slope, and jump.  That jump will get you higher and further than if you had jumped on flat ground.  You can reach some interesting spots by doing this, and ramp jumps can be effectively combined with speed jumping to achieve some remarkable acrobatics which can be very useful for taking shortcuts and thus dominating a map effectively.  It takes some time to learn the good spots were these four tricks can be used to the maximum effectiveness - again, experiment yourself, watch others, and ask around in-game or on the Nexuiz forums (<a class="link" href="http://www.alientrap.org/forum">http://www.alientrap.org/forum</a>).
 </p>
 <!--End Section 2-->
-<h3><a name="''The Console''"id="''The Console''"><em>The Console</em></a></h3>
+<h3><a name="''The Console''" id="''The Console''"><em>The Console</em></a></h3>
 <p class="Body">
 Games generally have a great many settings which can be changed or tweaked to give you the best advantage.  A lot of these aren't included in the game menus, which are limited by space and intended to give only a quick and compact view of the most important options.  For all the other variables, you have the in-game console.  This is like a command line inside the game.  You can enter commands to connect to a server, vote for options on the server, or to change variables like your name or various graphic effects.  You can access the console by pressing shift-escape, and you can close it again by pressing escape.  Lots of info is available on the official Nexuiz forum regarding the effective use of the console, but probably the most important in multiplayer is using it for voting, which will be briefly covered here:
 </p>
 <p class="Body">
-When you are on a server, open the console and type <em>vhelp</em>.  This will display a short help regarding voting, and also tell you what can be voted on on the server.  By default, things you can vote for include the timelimit and the map played.  By entering <em>vcall timelimit -1</em> you call a vote to set the timelimit to -1, which means to end the current map and play the next one.  Or, as another example, <em>vcall chmap aggressor</em> will start a vote to switch to the map 'Aggressor'.  This vote is printed to every player on the server, who can then accept or reject it.  To accept a vote, press F1 (or type in <em>vyes</em> at the console); to reject it, press F2 (or enter <em>vno</em> at the console).  If more then 50% of the players currently on the server accept a vote, the vote is passed and whichever setting has been polled will change.  And in this example the current map will end and the next map will begin.  It does not hurt to tell people to press F1/F2, as some still do not know about it.
+When you are on a server, open the console and type <em>vhelp</em>.  This will display a short help regarding voting, and also tell you what can be voted on the server.  By default, things you can vote for include the timelimit and the map played.  By entering <em>vcall timelimit -1</em> you call a vote to set the timelimit to -1, which means to end the current map and play the next one.  Or, as another example, <em>vcall chmap aggressor</em> will start a vote to switch to the map 'Aggressor'.  This vote is printed to every player on the server, who can then accept or reject it.  To accept a vote, press F1 (or type in <em>vyes</em> at the console); to reject it, press F2 (or enter <em>vno</em> at the console).  If more then 50% of the players currently on the server accept a vote, the vote is passed and whichever setting has been polled will change.  And in this example the current map will end and the next map will begin.  It does not hurt to tell people to press F1/F2, as some still do not know about it.
 </p>
 <!--End Section 2-->
-<h3><a name="''Game Types''"id="''Game Types''"><em>Game Types</em></a></h3>
+<h3><a name="''Game Types''" id="''Game Types''"><em>Game Types</em></a></h3>
 <p class="Body">
 Nexuiz supports several different game modes and some smaller changes called mutators.  Both are displayed when you connect to a server.
 </p>
 <!--End Section 2-->
-<h3><a name="''Modes''"id="''Modes''"><em>Modes</em></a></h3>
+<h3><a name="''Modes''" id="''Modes''"><em>Modes</em></a></h3>
 <ul>
 <li>Deathmatch (DM) is the most simple game mode.  It is a free-for-all fragfest with every man for himself.  All items are free to grab, and the player with the most frags will win (either by hitting the frag limit, or when the time limit expires).</li>
 </ul>
@@ -251,7 +252,7 @@
 <li>Arena mode is similar to deathmatch, but it only puts two players into a map, with the others waiting in a queue.  When one of both is fragged the next one in the queue will play against the winner.</li>
 </ul>
 <ul>
-<li>Keyhunt (KH) is a new team mode in Nexuiz 2.3.  Each team has one key and the goal is the collect all keys.  The team with the most points wins.  You get small points for fragging, fragging a keycarrier and picking up a key but you should go for the BIG points you get when <em>one team has all the keys and all the keycarriers meet</em>.  Of cource it also works when ONE player gets all the keys for his team but this is <em>much</em> harder.</li>
+<li>Keyhunt (KH) is a new team mode in Nexuiz 2.3.  Each team has one key and the goal is the collect all keys.  The team with the most points wins.  You get small points for fragging, fragging a keycarrier and picking up a key but you should go for the BIG points you get when <em>one team has all the keys and all the keycarriers meet</em>.  Of course it also works when ONE player gets all the keys for his team but this is <em>much</em> harder.</li>
 </ul>
 <ul>
 <li>Onslaught (ONS) is a new team mode in Nexuiz 2.4.  Each team has a powergenerator and the goal is to destroy the enemies generator.  Each generator and all except one checkpoint in the map are protected by an forcefield which is powered by nearby checkpoint.  Your team has to start at the one unprotected checkpoint and work your way up to the enemies generator.  Find the perfect balance between attacking the enemies checkpoints/generator and protecting your own.</li>
@@ -264,12 +265,12 @@
 </ul>
 <ul>
 <ul>
-<li>Qualifying mode saves each player's fastest lap time and the player with the fastest time wins. When you die, you respawn in front of the startline.  Players can't interact in this mode. They walk through eachother and can't shoot at the others.</li>
+<li>Qualifying mode saves each player's fastest lap time and the player with the fastest time wins. When you die, you respawn in front of the startline.  Players can't interact in this mode. They walk through each other and can't shoot at the others.</li>
 </ul>
 </ul>
 <ul>
 <ul>
-<li>Race mode is won by the player who makes a certain count of laps first.  Players can interact and kill eachother.  When killed, you respawn in front of the last checkpoint you went through.</li>
+<li>Race mode is won by the player who makes a certain count of laps first.  Players can interact and kill each other.  When killed, you respawn in front of the last checkpoint you went through.</li>
 </ul>
 </ul>
 <ul>
@@ -278,9 +279,9 @@
 </ul>
 </ul>
 <!--End Section 2-->
-<h3><a name="''Mutators''"id="''Mutators''"><em>Mutators</em></a></h3>
+<h3><a name="''Mutators''" id="''Mutators''"><em>Mutators</em></a></h3>
 <ul>
-<li>The hook mutator will add an off-hand hook which can be used like the grappling hook but can be used while you whield other guns.  Fire the hook at a ceiling or wall using the key configured through the menu or bound using <em>bind &quot;key&quot; &quot;+hook&quot;</em>.  Hold down this key while the hook is attached to be pulled toward it.</li>
+<li>The hook mutator will add an off-hand hook which can be used like the grappling hook but can be used while you carry other guns.  Fire the hook at a ceiling or wall using the key configured through the menu or bound using <em>bind &quot;key&quot; &quot;+hook&quot;</em>.  Hold down this key while the hook is attached to be pulled toward it.</li>
 </ul>
 <ul>
 <li>Laser-guided rockets will give you a laser dot on the rocket launcher which you can use to guide the most recently fired rocket.</li>
@@ -295,7 +296,7 @@
 <li>Footsteps will add footstep sounds to your movements.</li>
 </ul>
 <ul>
-<li>Weapon Arena equips everyone with the <em>arena gun</em> choosen by the server admin.</li>
+<li>Weapon Arena equips everyone with the <em>arena gun</em> chosen by the server admin.</li>
 </ul>
 <p class="Body">
 There are some more of these mutators, but those are the most important ones.

Copied: branches/nexuiz-2.0/Docs/egyptsoc (from rev 5656, trunk/Docs/egyptsoc)

Modified: branches/nexuiz-2.0/Docs/faq.html
===================================================================
--- branches/nexuiz-2.0/Docs/faq.html	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/Docs/faq.html	2009-01-24 19:51:12 UTC (rev 5658)
@@ -66,226 +66,240 @@
 		  </ul>		</div>
 		<p id="tagline">Nexuiz is a <b>free</b> open-source first person shooter that runs on <b>Windows</b>, <b>Linux</b> and <b>OSX</b>.</p>
 	  <div id="content">
-		  <div class="body"> <br />
-		      <center>
-		        <h1><a name="AFT-top" id="AFT-top">Nexuiz 3 FAQ</a></h1>
-	        </center>
-		      <center>
-		        <a class="link" href="http://nexuiz.com">http://nexuiz.com</a>&nbsp;&nbsp;<a class="link" href="http://alientrap.org">http://alientrap.org</a>
-	        </center>
-		      <hr />
-              <!--  AFT Table of Contents (auto generated) -->
-              <ul>
-                <li> <a class="link" href="#Troubleshooting">Troubleshooting</a></li>
-                <ul>
-                  <li> <a class="link" href="#How do I install Nexuiz?">How do I install Nexuiz?</a></li>
-                  <li> <a class="link" href="#When I start Nexuiz all I see is a black screen or a black screen with some checkered squares">When I start Nexuiz all I see is a black screen or a black screen with some checkered squares</a></li>
-                  <li> <a class="link" href="#When i start Nexuiz my screen is flickering">When i start Nexuiz my screen is flickering</a></li>
-                  <li> <a class="link" href="#How can I speed up my frame rate?">How can I speed up my frame rate?</a></li>
-                  <li> <a class="link" href="#The sound is broken, it crackles and stutters">The sound is broken, it crackles and stutters</a></li>
-                  <li> <a class="link" href="#Mouse is too slow and sensitivity is at top (on Mac / Linux)">Mouse is too slow and sensitivity is at top (on Mac / Linux)</a></li>
-                  <li> <a class="link" href="#I can't switch to 32 bit color depth (on Windows)">I can't switch to 32 bit color depth (on Windows)</a></li>
-                  <li> <a class="link" href="#When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot">When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot</a></li>
-                  <li> <a class="link" href="#How to report crashes">How to report crashes</a></li>
-                  <li> <a class="link" href="#Where can i get more help?">Where can i get more help?</a></li>
-                </ul>
-                <li> <a class="link" href="#General questions">General questions</a></li>
-                <ul>
-                  <li> <a class="link" href="#How do I install new maps?">How do I install new maps?</a></li>
-                  <li> <a class="link" href="#How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a></li>
-                  <li> <a class="link" href="#How do I open the console?">How do I open the console?</a></li>
-                  <li> <a class="link" href="#What console commands/variables are there?">What console commands/variables are there?</a></li>
-                  <li> <a class="link" href="#How can I activate colors in my name?">How can I activate colors in my name?</a></li>
-                  <li> <a class="link" href="#How do i watch/record demos?">How do i watch/record demos?</a></li>
-                </ul>
-                <li> <a class="link" href="#Server setup">Server setup</a></li>
-                <ul>
-                  <li> <a class="link" href="#How do I start a server?">How do I start a server?</a></li>
-                  <li> <a class="link" href="#Which ports do I have to open in firewall/forward from my router to run a server?">Which ports do I have to open in firewall/forward from my router to run a server?</a></li>
-                  <li> <a class="link" href="#Is there some kind of rcon?">Is there some kind of rcon?</a></li>
-                  <li> <a class="link" href="#How can i kick people who are using special characters in their names?">How can i kick people who are using special characters in their names?</a></li>
-                </ul>
-                <li> <a class="link" href="#Development">Development</a></li>
-                <ul>
-                  <li> <a class="link" href="#How do i set up gtkradiant to create/edit Nexuiz maps?">How do i set up gtkradiant to create/edit Nexuiz maps?</a></li>
-                  <li> <a class="link" href="#Where can i get latest development versions of the source code?">Where can i get latest development versions of the source code?</a> </li>
-                </ul>
-              </ul>
-              <hr />
-              <!-- Start SectLevel1 -->
-              <h2><a name="Troubleshooting" id="Troubleshooting">Troubleshooting</a></h2>
-              <!-- Start SectLevel2 -->
-              <h3><a name="How do I install Nexuiz?" id="How do I install Nexuiz?">How do I install Nexuiz?</a></h3>
-              <p class="Body"> Just unzip the <tt>nexuiz-&lt;version&gt;.zip</tt> file. You can do this with any archive program (like <a class="link" href="http://7zip.org">7zip</a>). It's very important to keep the directory structure while unpacking (in WinZip this option is called &quot;Use folder names&quot;). The directory structure should look like this afterwards: </p>
-              <div class="block">
-                <pre>
+<body>
+<div class="body">
+
+<br><center><h1><a name="AFT-top" id="AFT-top">Nexuiz 3 FAQ</a></h1></center>
+<center><a class="link" href="http://nexuiz.com">http://nexuiz.com</a>&nbsp;&nbsp;<a class="link" href="http://alientrap.org">http://alientrap.org</a></center>
+<hr>
+<!--  AFT Table of Contents (auto generated) -->
+<ul>
+<li> <a class="link" href="#Troubleshooting">Troubleshooting</a></li>
+<ul>
+<li> <a class="link" href="#How do I install Nexuiz?">How do I install Nexuiz?</a></li>
+<li> <a class="link" href="#When I start Nexuiz all I see is a black screen or a black screen with some checkered squares">When I start Nexuiz all I see is a black screen or a black screen with some checkered squares</a></li>
+<li> <a class="link" href="#When i start Nexuiz my screen is flickering">When i start Nexuiz my screen is flickering</a></li>
+<li> <a class="link" href="#How can I speed up my frame rate?">How can I speed up my frame rate?</a></li>
+<li> <a class="link" href="#The sound is broken, it crackles and stutters">The sound is broken, it crackles and stutters</a></li>
+<li> <a class="link" href="#Mouse is too slow and sensitivity is at top (on Mac / Linux)">Mouse is too slow and sensitivity is at top (on Mac / Linux)</a></li>
+<li> <a class="link" href="#I can't switch to 32 bit color depth (on Windows)">I can't switch to 32 bit color depth (on Windows)</a></li>
+<li> <a class="link" href="#When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot">When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot</a></li>
+<li> <a class="link" href="#How to report crashes">How to report crashes</a></li>
+<li> <a class="link" href="#Where can i get more help?">Where can i get more help?</a></li>
+</ul>
+<li> <a class="link" href="#General questions">General questions</a></li>
+<ul>
+<li> <a class="link" href="#How do I install new maps?">How do I install new maps?</a></li>
+<li> <a class="link" href="#How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a></li>
+<li> <a class="link" href="#How do I open the console?">How do I open the console?</a></li>
+<li> <a class="link" href="#What console commands/variables are there?">What console commands/variables are there?</a></li>
+<li> <a class="link" href="#How can I use colors in my nickname and messages?">How can I use colors in my nickname and messages?</a></li>
+<li> <a class="link" href="#How do i watch/record demos?">How do i watch/record demos?</a></li>
+</ul>
+<li> <a class="link" href="#Server setup">Server setup</a></li>
+<ul>
+<li> <a class="link" href="#How do I start a server?">How do I start a server?</a></li>
+<li> <a class="link" href="#Which ports do I have to open in firewall/forward from my router to run a server?">Which ports do I have to open in firewall/forward from my router to run a server?</a></li>
+<li> <a class="link" href="#Is there some kind of rcon?">Is there some kind of rcon?</a></li>
+<li> <a class="link" href="#How can i kick people who are using special characters in their names?">How can i kick people who are using special characters in their names?</a></li>
+</ul>
+<li> <a class="link" href="#Development">Development</a></li>
+<ul>
+<li> <a class="link" href="#How do i set up gtkradiant to create/edit Nexuiz maps?">How do i set up gtkradiant to create/edit Nexuiz maps?</a></li>
+<li> <a class="link" href="#Where can i get latest development versions of the source code?">Where can i get latest development versions of the source code?</a>
+
+</li>
+</ul>
+</ul>
+<hr>
+<!-- Start SectLevel1 -->
+<h2><a name="Troubleshooting" id="Troubleshooting">Troubleshooting</a></h2>
+<!-- Start SectLevel2 -->
+<h3><a name="How do I install Nexuiz?" id="How do I install Nexuiz?">How do I install Nexuiz?</a></h3>
+<p class="Body">
+Just unzip the <tt>nexuiz-&lt;version&gt;.zip</tt> file.  You can do this with any archive program (like <a class="link" href="http://7zip.org">7zip</a>).  It's very important to keep the directory structure while unpacking (in WinZip this option is called &quot;Use folder names&quot;).  The directory structure should look like this afterwards:
+<div class="block"><pre>
 Nexuiz/
 |-- Docs/
-|   |-- *
-|   `-- server/
-|       `-- *
 |-- data/
 |   |-- common-spog.pk3
 |   `-- data*.pk3
-|-- pro/
+|-- havoc/
 |   `-- data*.pk3
 |-- Nexuiz.app/
-|   `-- *
 |-- Nexuiz-SDL.app/
+|-- server/
 |   `-- *
 |-- sources/
-|   `-- *
 |-- *.exe
 |-- *.dll
 `-- nexuiz-linux-*
-            </pre>
-              </div>
-              <p></p>
-              <!--End Section 2-->
-              <h3><a name="When I start Nexuiz all I see is a black screen or a black screen with some checkered squares" id="When I start Nexuiz all I see is a black screen or a black screen with some checkered squares">When I start Nexuiz all I see is a black screen or a black screen with some checkered squares</a></h3>
-              <p class="Body"> This happens when the engine can't load the data*.pk3 file or has trouble to initialize OpenGL. The reasons could be: </p>
-              <ol>
-                <li> you unpacked the zip file without folder names (see <a class="link" href="#How do I install Nexuiz?">How do I install Nexuiz?</a>)</li>
-                <li> on Linux: the current directory is not your Nexuiz/ folder. See <a class="link" href="#How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a> on how to fix this</li>
-                <li> on Mac: you tried to extract and move the files from a Nexuiz update and it deleted the old files. When using the mac GUI please be sure to move only the files not the folders as that will delete the old files or use the mv console command which will not delete the old files</li>
-                <li> the engine could not initialize OpenGL. Please install the latest drivers for your graphic card. You will probably find one for your card there: <a class="link" href="http://intel.com">intel</a> <a class="link" href="http://ati.com">ati</a> <a class="link" href="http://nvidia.com">nvidia</a></li>
-                <li> your download might be corrupted, please download Nexuiz again</li>
-              </ol>
-              <p></p>
-              <!--End Section 2-->
-              <h3><a name="When i start Nexuiz my screen is flickering" id="When i start Nexuiz my screen is flickering">When i start Nexuiz my screen is flickering</a></h3>
-              <p class="Body"> This in known to happen on Windows with Intel grahpic chips and is a bug in the graphics drivers. A workaround is to set <tt>Flip-Policiy</tt> to <tt>blit</tt>. Open the control panel, there should be an icon called <tt>Intel(R) GMA driver</tt> (or something like that), double click it. Click on <tt>3D Settings</tt> to find the screen with that settings. </p>
-              <!--End Section 2-->
-              <h3><a name="How can I speed up my frame rate?" id="How can I speed up my frame rate?">How can I speed up my frame rate?</a></h3>
-              <p class="Body"> You can choose predefined performance settings in the <tt>Settings / Video</tt> menu. <tt>Normal</tt> is the default, <tt>Medium</tt> and <tt>Low</tt> run faster while <tt>High</tt>, <tt>Ultra</tt> and <tt>Ultimate</tt> enable more features you might want to test if you have a high end graphic card. Or you can dis/enable single features. The greatest performance boost can be achieved by turning off dynamic lights and shadows in the <tt>Settings / Effects</tt> menu. Bloom is also quite resource intensive. Other fps boots include disabling <tt>Deluxemapping</tt> and <tt>Coronas</tt>. On older graphics cards or on-board/notebook chips with little video ram you can try to lower the texture quality in the <tt>Settings / Video</tt> menu. Some graphic cards (mostly ATI or quite old cards) run A LOT faster if you disable the <tt>Vertex Buffer Objects</tt> in the <tt>Settings / Video</tt> menu. An other thing that can greatly help on such cards is to disable the <tt>OpenGL 2.0 Shaders</tt>. Having that option enabled is faster on most cards however thats why both are active by default. </p>
-              <!--End Section 2-->
-              <h3><a name="The sound is broken, it crackles and stutters" id="The sound is broken, it crackles and stutters">The sound is broken, it crackles and stutters</a></h3>
-              <p class="Body"> Try run <tt>nexuiz-sdl.exe</tt> instead of <tt>nexuiz.exe</tt> (on Windows). Adding the command line options <tt>-sndspeed 48000</tt> and/or <tt>-sndstereo</tt> can also help on some systems (on Linux, Mac, Windows). </p>
-              <!--End Section 2-->
-              <h3><a name="Mouse is too slow and sensitivity is at top (on Mac / Linux)" id="Mouse is too slow and sensitivity is at top (on Mac / Linux)">Mouse is too slow and sensitivity is at top (on Mac / Linux)</a></h3>
-              <p class="Body"> Mac: The default mouse acceleration on Mac is very high and strange. The Nexuiz defaults work fine with it but some mouse drivers seem to 'correct' the mouse acceleration and conflict with the Nexuiz defaults. Try to disable the option <tt>Turn off OS mouse acceleration</tt> in the <tt>Settings / Input</tt> menu. Or the same via console: <tt>apple_mouse_noaccel 0; vid_restart</tt> (<a class="link" href="#How do I open the console?">How do I open the console?</a>) Linux: A similar problem can arise on Linux. Its also <tt>Turn off OS mouse acceleration</tt> in the <tt>Settings / Input</tt> menu but the console command is different: <tt>vid_dga 0; vid_restart</tt> (<a class="link" href="#How do I open the console?">How do I open the console?</a>) </p>
-              <!--End Section 2-->
-              <h3><a name="I can't switch to 32 bit color depth (on Windows)" id="I can't switch to 32 bit color depth (on Windows)">I can't switch to 32 bit color depth (on Windows)</a></h3>
-              <p class="Body"> Check if your desktop color depth is set to 32 bits per pixel. If it's just set to 16, Nexuiz can't switch to 32 bit mode. </p>
-              <!--End Section 2-->
-              <h3><a name="When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot" id="When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot">When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot</a></h3>
-              <p class="Body"> This is probably because you don't have the map that's running on the server. As Nexuiz supports map/content download the server might not be be setup (correctly) to support this and you will have to get the map the old fashioned way. Those servers should have a download URL in their name or welcome message. There is also a <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.CustomMaps">wiki page</a> dedicated to new maps. For Linux users: you need to have libcurl installed, otherwise you won't be able to download any maps. libcurl should be available in any Linux distribution, just search for &quot;libcurl&quot; and install it in your distribution's package manager. </p>
-              <!--End Section 2-->
-              <h3><a name="How to report crashes" id="How to report crashes">How to report crashes</a></h3>
-              <p class="Body"> Alientrap wants to ensure everyone has a pleasent time playing Nexuiz, so if you have problems we would like to ask you to report them and thus help solve them. Especially crash reports can be very helpful. See below for how to contact Alientrap (<a class="link" href="#Where can i get more help?">Where can i get more help?</a>) </p>
-              <p class="Body"> On Mac: IS THERE A EASY WAY? </p>
-              <p class="Body"> On Linux: In a xterm, <tt>cd</tt> into your Nexuiz installation directory, start <tt>catchsegv ./nexuiz-linux-686-sdl -condebug -developer &gt; crash.txt 2&gt;&amp;1</tt> and give the file crash.txt to the developers. Note that you can also use <tt>./nexuiz-linux-686-glx</tt> or if you have a 64bit system <tt>./nexuiz-linux-x86_64-sdl</tt> and <tt>./nexuiz-linux-x86_64-glx</tt> </p>
-              <p class="Body"> On Windows: Click Start-&gt;Run, and enter drwtsn32, click Ok in the next window, run Nexuiz and wait for the crash. Then go to <tt>C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson</tt> there should be a file called &quot;drwtsn32.log&quot;, give that file along with the engine's build date to the developers. You'll see that date when you open the ingame console (<a class="link" href="#How do I open the console?">How do I open the console?</a>). Note that some folders of that path may be hidden or have a translated name if you're using a non-english windows. </p>
-              <!--End Section 2-->
-              <h3><a name="Where can i get more help?" id="Where can i get more help?">Where can i get more help?</a></h3>
-              <p class="Body"> Visit <a class="link" href="http://alientrap.org/forum">the official Nexuiz forum</a> there is a <a class="link" href="http://alientrap.org/forum/viewforum.php?f=3">support and bug report area</a>. Or get on <a class="link" href="http://en.wikipedia.org/wiki/Internet_Relay_Chat">IRC</a> to chat with other or ask for help. There is the normal users channel (irc://irc.quakenet.org/nexuiz) and the developers channel (irc://irc.anynet.org/alientrap) </p>
-              <!--End Section 2-->
-              <!-- End SectLevel2 -->
-              <!--End Section 1-->
-              <h2><a name="General questions" id="General questions">General questions</a></h2>
-              <!-- Start SectLevel2 -->
-              <h3><a name="How do I install new maps?" id="How do I install new maps?">How do I install new maps?</a></h3>
-              <p class="Body"> Maps usually ship as *.pk3 file. All you have to do is to copy this file to the <tt>Nexuiz/data/</tt> (on Linux, Mac, Windows) OR <tt>~/.nexuiz/data/</tt> (on Linux, Mac) directory. Map packages that were downloaded from a server during playing end up in <tt>Nexuiz/data/dlcache/</tt> or <tt>~/.nexuiz/data/dlcache/</tt> and are only used till you exit Nexuiz. If you want to play them localy or use them to setup a server of your own you can &quot;accept&quot; the packages by moving it one level up - right next to your config.cfg. </p>
-              <!--End Section 2-->
-              <h3><a name="How can I place a shortcut to Nexuiz on my Linux desktop?" id="How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a></h3>
-              <p class="Body"> Use the script <tt>nexuiz-linux-sdl.sh</tt> or <tt>nexuiz-linux-glx.sh</tt> instead of the binaries. The scripts will use the correct <tt>working directory</tt>,choose the right version (32 or 64 bit) and also allow you to start a extra X server. </p>
-              <!--End Section 2-->
-              <h3><a name="How do I open the console?" id="How do I open the console?">How do I open the console?</a></h3>
-              <p class="Body"> Press <tt>[shift]+[escape]</tt>. To close it press <tt>[escape]</tt>. While playing ` or ^ will also open the console. </p>
-              <!--End Section 2-->
-              <h3><a name="What console commands/variables are there?" id="What console commands/variables are there?">What console commands/variables are there?</a></h3>
-              <p class="Body"> You can get a list of variables by entering <tt>cvarlist</tt> on the console (<a class="link" href="#How do I open the console?">How do I open the console?</a>). <tt>cmdlist</tt> will give you a list of available commands. An annotated version of that output can be found at the <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands">Nexuiz wiki</a>. </p>
-              <!--End Section 2-->
-              <h3><a name="How can I activate colors in my name?" id="How can I activate colors in my name?">How can I activate colors in my name?</a></h3>
-              <p class="Body"> Colors can be used in nicknames and chat messages by typing ^ followed by a number between 0 and 9. </p>
-              <!-- 2 columns -->
-              <center>
-                <table cellspacing="0">
-                  <caption>
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-                  </caption>
-                  <tr>
-                    <th> code </th>
-                    <th> color&nbsp;&nbsp; </th>
-                  </tr>
-                  <tr>
-                    <td> ^0 </td>
-                    <td> black&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^1 </td>
-                    <td> red&nbsp;&nbsp;</td>
-                  </tr>
-                  <tr>
-                    <td> ^2 </td>
-                    <td> green&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^3 </td>
-                    <td> yellow&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^4 </td>
-                    <td> blue&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^5 </td>
-                    <td> aqua&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^6 </td>
-                    <td> pink&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^7 </td>
-                    <td> white&nbsp;&nbsp; </td>
-                  </tr>
-                  <tr>
-                    <td> ^8 </td>
-                    <td> light grey&nbsp;&nbsp;</td>
-                  </tr>
-                  <tr>
-                    <td> ^9 </td>
-                    <td> dark grey&nbsp;&nbsp; </td>
-                  </tr>
-                </table>
-              </center>
-              <!--End Section 2-->
-              <h3><a name="How do i watch/record demos?" id="How do i watch/record demos?">How do i watch/record demos?</a></h3>
-              <p class="Body"> After the menu redesign in Nexuiz 2.4 there is no demo menu anymore for the time being. To watch a demo type <tt>ply &lt;demos/name&gt;</tt> in the console (<a class="link" href="#How do I open the console?">How do I open the console?</a>). To automaticly record a demo each time you play enable the option <tt>Demo recording</tt> in the <tt>Settings / Misc</tt> menu. Of if you just want to record some matches open the console and type <tt>rec &lt;demos/name&gt;</tt> before playing. That is before starting a game or connecting to a server. The demo file will then be stored in <tt>Nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Windows) or <tt>~/.nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac). If you downloaded a demo, copy it to <tt>Nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac, Windows) or <tt>~/.nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac). You might have to create this directory if you have never recorded a demo before. You can list all your demo files by typing <tt>dem</tt> on the console. Some useful key bindings for viewing demos are listed <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=357#357">here</a>. A simple way to automatically record demos can be found <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?t=90">here</a> </p>
-              <!--End Section 2-->
-              <!-- End SectLevel2 -->
-              <!--End Section 1-->
-              <h2><a name="Server setup" id="Server setup">Server setup</a></h2>
-              <!-- Start SectLevel2 -->
-              <h3><a name="How do I start a server?" id="How do I start a server?">How do I start a server?</a></h3>
-              <p class="Body"> Use the <tt>Multiplayer / Create</tt> menu to start a <tt>listen server</tt>. You will always have to play yourself in a <tt>listen server</tt>. If you want to create a server without being forced to play yourself please take a look at the file <tt>readme.txt</tt> in the <tt>Docs/server/</tt> directory where the <tt>dedicated server</tt> is explained. </p>
-              <!--End Section 2-->
-              <h3><a name="Which ports do I have to open in firewall/forward from my router to run a server?" id="Which ports do I have to open in firewall/forward from my router to run a server?">Which ports do I have to open in firewall/forward from my router to run a server?</a></h3>
-              <p class="Body"> The default port is 26000 UDP. You can change that in the <tt>Multiplayer / Create</tt> menu or by starting Nexuiz with the parameter <tt>-port &lt;port&gt;</tt> or having a line <tt>port &lt;port&gt;</tt> in the server config file. If you follow the tutorial mentioned above you do not need this command line argument as it will be done in the config file created for the server. To add the command line argument on Windows, create a new shortcut to <tt>nexuiz.exe</tt> or <tt>nexuiz-dedicated.exe</tt> and right click on it. Select properties and <tt>-port &lt;port&gt;</tt> in the &quot;Target:&quot; line. Be sure that the &quot;Start in:&quot; line contains the full path to your Nexuiz folder and click &quot;OK&quot;. The parameter will be used if you start Nexuiz via that new shortcut. </p>
-              <!--End Section 2-->
-              <h3><a name="Is there some kind of rcon?" id="Is there some kind of rcon?">Is there some kind of rcon?</a></h3>
-              <p class="Body"> Yes starting with Nexuiz 2.0 there is rcon (QuakeWorld compatible). To use it you must enter <tt>rcon_password &lt;password&gt;</tt> in the server console or server config file. The Nexuiz client has to set the same password in the same fashion. You can then issue commands with <tt>rcon &lt;command&gt;</tt> if you are connected to the server or will have to set <tt>rcon_address &lt;ip/hostname&gt;</tt> or <tt>rcon_address &lt;ip/hostname&gt;:&lt;port&gt;</tt> to point to the server. There are also external rcon tools but make sure you use a QW compatible rcon tool. </p>
-              <!--End Section 2-->
-              <h3><a name="How can i kick people who are using special characters in their names?" id="How can i kick people who are using special characters in their names?">How can i kick people who are using special characters in their names?</a></h3>
-              <p class="Body"> Enter <tt>status</tt> at the server console. You will see a list of all players. In front of their names you will see a number (the player id). You can kick the player you don't like with <tt>kick # &lt;player id&gt; &lt;reason&gt;</tt> (notice the space after #). </p>
-              <!--End Section 2-->
-              <!-- End SectLevel2 -->
-              <!--End Section 1-->
-              <h2><a name="Development" id="Development">Development</a></h2>
-              <!-- Start SectLevel2 -->
-              <h3><a name="How do i set up gtkradiant to create/edit Nexuiz maps?" id="How do i set up gtkradiant to create/edit Nexuiz maps?">How do i set up gtkradiant to create/edit Nexuiz maps?</a></h3>
-              <p class="Body"> There's a <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?t=10">guide</a> on gtkradiant setup in the forums. There are also <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=33">Windows tool</a> that will help you to setup gtkradiant 1.4 and a <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=841">Linux script</a> to configure gtkradiant 1.5. </p>
-              <!--End Section 2-->
-              <h3><a name="Where can i get latest development versions of the source code?" id="Where can i get latest development versions of the source code?">Where can i get latest development versions of the source code?</a></h3>
-              <p class="Body"> <strong>Engine:</strong> instructions are available at <a class="link" href="http://icculus.org/twilight/darkplaces/download.html">http://icculus.org/twilight/darkplaces/download.html</a> look for <tt>Accessing the SVN server</tt> (you will need a <a class="link" href="http://subversion.tigris.org/project_packages.html">svn client</a>, beta builds are available <a class="link" href="http://icculus.org/twilight/darkplaces/files/">here</a>) </p>
-              <p class="Body"> <strong>Game data:</strong> to check out the Nexuiz svn, you'll need a <a class="link" href="http://subversion.tigris.org/project_packages.html">svn client</a>. To check out the repository with a command line svn client, do </p>
-            <div class="block">
-              <pre>
-svn co svn://svn.icculus.org/nexuiz/trunk/</pre>
-            </div>
-	    To compile the game code you need <a class="link" href="http://sourceforge.net/project/showfiles.php?group_id=116842&amp;package_id=129507">fteqcc</a>.  Just download it and run it twice, once in <tt>data/qcsrc/menu</tt> and once in <tt>data/qcsrc/server</tt>.
-        </div>
+</pre></div>
+</p>
+<!--End Section 2-->
+<h3><a name="When I start Nexuiz all I see is a black screen or a black screen with some checkered squares" id="When I start Nexuiz all I see is a black screen or a black screen with some checkered squares">When I start Nexuiz all I see is a black screen or a black screen with some checkered squares</a></h3>
+<p class="Body">
+This happens when the engine can't load the data*.pk3 file or has trouble to initialize OpenGL.  The reasons could be:
+<ol>
+<li> you unpacked the zip file without folder names (see <a class="link" href="#How do I install Nexuiz?">How do I install Nexuiz?</a>)</li>
+<li> on Linux: the current directory is not your Nexuiz/ folder.  See <a class="link" href="#How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a> on how to fix this</li>
+<li> on Mac: you tried to extract and move the files from a Nexuiz update and it deleted the old files.  When using the mac GUI please be sure to move only the files not the folders as that will delete the old files or use the mv console command which will not delete the old files</li>
+<li> the engine could not initialize OpenGL.  Please install the latest drivers for your graphic card.  You will probably find one for your card there: <a class="link" href="http://intel.com">intel</a> <a class="link" href="http://ati.com">ati</a> <a class="link" href="http://nvidia.com">nvidia</a></li>
+<li> your download might be corrupted, please download Nexuiz again</li>
+</ol>
+</p>
+<!--End Section 2-->
+<h3><a name="When i start Nexuiz my screen is flickering" id="When i start Nexuiz my screen is flickering">When i start Nexuiz my screen is flickering</a></h3>
+<p class="Body">
+This is known to happen on Windows with Intel graphic chips and is a bug in the graphics drivers.  A workaround is to set <tt>Flip-Policiy</tt> to <tt>blit</tt>.  Open the control panel, there should be an icon called <tt>Intel(R) GMA driver</tt> (or something like that), double click it. Click on <tt>3D Settings</tt> to find the screen with those settings.
+</p>
+<!--End Section 2-->
+<h3><a name="How can I speed up my frame rate?" id="How can I speed up my frame rate?">How can I speed up my frame rate?</a></h3>
+<p class="Body">
+You can choose predefined performance settings in the <tt>Settings / Video</tt> menu.  <tt>Normal</tt> is the default, <tt>Medium</tt> and <tt>Low</tt> run faster while <tt>High</tt>, <tt>Ultra</tt> and <tt>Ultimate</tt> enable more features you might want to test if you have a high end graphic card.  Or you can enable/disable single features.  The greatest performance boost can be achieved by turning off dynamic lights and shadows in the <tt>Settings / Effects</tt> menu.  Bloom is also quite resource intensive.  Other fps boots include disabling <tt>Deluxemapping</tt> and <tt>Coronas</tt>.  On older graphics cards or on-board/notebook chips with little video ram you can try to lower the texture quality in the <tt>Settings / Video</tt> menu.
+Some graphic cards (mostly ATI or quite old cards) run A LOT faster if you disable the <tt>Vertex Buffer Objects</tt> in the <tt>Settings / Video</tt> menu.  An other thing that can greatly help on such cards is to disable the <tt>OpenGL 2.0 Shaders</tt>.  Having that option enabled is faster on most cards however that is why both are active by default.
+</p>
+<!--End Section 2-->
+<h3><a name="The sound is broken, it crackles and stutters" id="The sound is broken, it crackles and stutters">The sound is broken, it crackles and stutters</a></h3>
+<p class="Body">
+Try run <tt>nexuiz-sdl.exe</tt> instead of <tt>nexuiz.exe</tt> (on Windows).  Adding the command line options <tt>-sndspeed 48000</tt> and/or <tt>-sndstereo</tt> can also help on some systems (on Linux, Mac, Windows).
+</p>
+<!--End Section 2-->
+<h3><a name="Mouse is too slow and sensitivity is at top (on Mac / Linux)" id="Mouse is too slow and sensitivity is at top (on Mac / Linux)">Mouse is too slow and sensitivity is at top (on Mac / Linux)</a></h3>
+<p class="Body">
+Mac: The default mouse acceleration on Mac is very high and strange.  The Nexuiz defaults work fine with it but some mouse drivers seem to 'correct' the mouse acceleration and conflict with the Nexuiz defaults.  Try to disable the option <tt>Turn off OS mouse acceleration</tt> in the <tt>Settings / Input</tt> menu.  Or the same via console: <tt>apple_mouse_noaccel 0; vid_restart</tt> (<a class="link" href="#How do I open the console?">How do I open the console?</a>)
+Linux: A similar problem can arise on Linux.  Its also <tt>Turn off OS mouse acceleration</tt> in the <tt>Settings / Input</tt> menu but the console command is different: <tt>vid_dga 0; vid_restart</tt> (<a class="link" href="#How do I open the console?">How do I open the console?</a>)
+</p>
+<!--End Section 2-->
+<h3><a name="I can't switch to 32 bit color depth (on Windows)" id="I can't switch to 32 bit color depth (on Windows)">I can't switch to 32 bit color depth (on Windows)</a></h3>
+<p class="Body">
+Check if your desktop color depth is set to 32 bits per pixel.  If it's just set to 16, Nexuiz can't switch to 32 bit mode.
+</p>
+<!--End Section 2-->
+<h3><a name="When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot" id="When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot">When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot</a></h3>
+<p class="Body">
+This is probably because you don't have the map that's running on the server.  As Nexuiz supports map/content download the server might not be be setup (correctly) to support this and you will have to get the map the old fashioned way.  Those servers should have a download URL in their name or welcome message.  There is also a <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.CustomMaps">wiki page</a> dedicated to new maps.
+For Linux users: you need to have libcurl installed, otherwise you won't be able to download any maps.  libcurl should be available in any Linux distribution, just search for &quot;libcurl&quot; and install it in your distribution's package manager.
+</p>
+<!--End Section 2-->
+<h3><a name="How to report crashes" id="How to report crashes">How to report crashes</a></h3>
+<p class="Body">
+Alientrap wants to ensure everyone has a pleasant time playing Nexuiz, so if you have problems we would like to ask you to report them and thus help solve them.  Especially crash reports can be very helpful.  See below for how to contact Alientrap (<a class="link" href="#Where can i get more help?">Where can i get more help?</a>)
+</p>
+<p class="Body">
+On Mac: IS THERE AN EASY WAY?
+</p>
+<p class="Body">
+On Linux: In a xterm, <tt>cd</tt> into your Nexuiz installation directory, start <tt>catchsegv ./nexuiz-linux-686-sdl -condebug -developer &gt; crash.txt 2&gt;&amp;1</tt> and give the file crash.txt to the developers.  Note that you can also use <tt>./nexuiz-linux-686-glx</tt> or if you have a 64bit system <tt>./nexuiz-linux-x86_64-sdl</tt> and <tt>./nexuiz-linux-x86_64-glx</tt>
+</p>
+<p class="Body">
+On Windows: Click Start-&gt;Run, and enter drwtsn32, click Ok in the next window, run Nexuiz and wait for the crash.  Then go to <tt>C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson</tt> there should be a file called &quot;drwtsn32.log&quot;, give that file along with the engine's build date to the developers.  You'll see that date when you open the ingame console (<a class="link" href="#How do I open the console?">How do I open the console?</a>).  Note that some folders of that path may be hidden or have a translated name if you're using a non-english windows.
+</p>
+<!--End Section 2-->
+<h3><a name="Where can i get more help?" id="Where can i get more help?">Where can i get more help?</a></h3>
+<p class="Body">
+Visit <a class="link" href="http://alientrap.org/forum">the official Nexuiz forum</a> there is a <a class="link" href="http://alientrap.org/forum/viewforum.php?f=3">support and bug report area</a>.  Or get on <a class="link" href="http://en.wikipedia.org/wiki/Internet_Relay_Chat">IRC</a> to chat with other or ask for help.  There is the normal users channel (irc://irc.quakenet.org/nexuiz) and the developers channel (irc://irc.anynet.org/alientrap)
+</p>
+<!--End Section 2-->
+<!-- End SectLevel2 -->
+<!--End Section 1-->
+<h2><a name="General questions" id="General questions">General questions</a></h2>
+<!-- Start SectLevel2 -->
+<h3><a name="How do I install new maps?" id="How do I install new maps?">How do I install new maps?</a></h3>
+<p class="Body">
+Maps usually ship as *.pk3 file.  All you have to do is to copy this file to the <tt>Nexuiz/data/</tt> (on Linux, Mac, Windows) OR <tt>~/.nexuiz/data/</tt> (on Linux, Mac) directory.
+Map packages that were downloaded from a server during playing end up in <tt>Nexuiz/data/dlcache/</tt> or <tt>~/.nexuiz/data/dlcache/</tt> and are only used till you exit Nexuiz. If you want to play them locally or use them to setup a server of your own you can &quot;accept&quot; the packages by moving it one level up - right next to your config.cfg.
+</p>
+<!--End Section 2-->
+<h3><a name="How can I place a shortcut to Nexuiz on my Linux desktop?" id="How can I place a shortcut to Nexuiz on my Linux desktop?">How can I place a shortcut to Nexuiz on my Linux desktop?</a></h3>
+<p class="Body">
+Use the script <tt>nexuiz-linux-sdl.sh</tt> or <tt>nexuiz-linux-glx.sh</tt> instead of the binaries.  The scripts will use the correct <tt>working directory</tt>,choose the right version (32 or 64 bit) and also allow you to start a extra X server.
+</p>
+<!--End Section 2-->
+<h3><a name="How do I open the console?" id="How do I open the console?">How do I open the console?</a></h3>
+<p class="Body">
+Press <tt>[shift]+[escape]</tt>.  To close it press <tt>[escape]</tt>.  While playing ` or ^ will also open the console.
+</p>
+<!--End Section 2-->
+<h3><a name="What console commands/variables are there?" id="What console commands/variables are there?">What console commands/variables are there?</a></h3>
+<p class="Body">
+You can get a list of variables by entering <tt>cvarlist</tt> on the console (<a class="link" href="#How do I open the console?">How do I open the console?</a>).  <tt>cmdlist</tt> will give you a list of available commands.  An annotated version of that output can be found at the <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands">Nexuiz wiki</a>.
+</p>
+<!--End Section 2-->
+<h3><a name="How can I use colors in my nickname and messages?" id="How can I activate colors in my name?">How can I use colors in my nickname and messages?</a></h3>
+<p class="Body">
+Colors can be used in nicknames and chat messages via two ways: Either the simple way by typing ^ followed by a number between 0 and 9 or by typing ^x followed by three hexadecimal numbers (0-F) representing red, green and blue components of the color before the text. The second way allows for much more colors. For example if you type ^xF00message the text &quot;message&quot; will be displayed in red color. Simple examples:
+</p>
+<!-- 3 columns --><center><table cellspacing="0">
+<caption>&nbsp;&nbsp;</caption>
+<tr><th> code   </th><th> rgb code   </th><th> color&nbsp;&nbsp;     </th></tr>
+<tr><td> ^0     </td><td> ^x000      </td><td> black&nbsp;&nbsp;     </td></tr>
+<tr><td> ^1     </td><td> ^xF00      </td><td> red&nbsp;&nbsp;</td></tr>
+<tr><td> ^2     </td><td> ^x0F0      </td><td> green&nbsp;&nbsp;     </td></tr>
+<tr><td> ^3     </td><td> ^xFF0      </td><td> yellow&nbsp;&nbsp;    </td></tr>
+<tr><td> ^4     </td><td> ^x00F      </td><td> blue&nbsp;&nbsp;      </td></tr>
+<tr><td> ^5     </td><td> ^x0FF      </td><td> aqua&nbsp;&nbsp;      </td></tr>
+<tr><td> ^6     </td><td> ^xF0C      </td><td> pink&nbsp;&nbsp;      </td></tr>
+<tr><td> ^7     </td><td> ^xFFF      </td><td> white&nbsp;&nbsp;     </td></tr>
+<tr><td> ^8     </td><td> ^xBBB      </td><td> light grey&nbsp;&nbsp;</td></tr>
+<tr><td> ^9     </td><td> ^x444      </td><td> dark grey&nbsp;&nbsp; </td></tr>
+</table></center>
+<!--End Section 2-->
+<h3><a name="How do i watch/record demos?" id="How do i watch/record demos?">How do i watch/record demos?</a></h3>
+<p class="Body">
+Demos are recordings of matches that you have played. To automatically record a demo each time you play enable the option <tt>Record demos while playing</tt> in the <tt>Settings / Demos</tt> menu. Or if you just want to record some matches open the console and type <tt>rec &lt;demos/name&gt;</tt> before playing. That is before starting a game or connecting to a server. The demo file will then be stored in <tt>Nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Windows) or <tt>~/.nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac).
+If you downloaded a demo, copy it to <tt>Nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac, Windows) or <tt>~/.nexuiz/data/demos/&lt;name&gt;.dem</tt> (on Linux, Mac).  You might have to create this directory if you have never recorded a demo before.
+To watch demos you can choose a demo file in the <tt>Settings / Demos</tt> and click the play button. Also you can watch demos typing <tt>ply &lt;demos/name&gt;</tt> in the console (<a class="link" href="#How do I open the console?">How do I open the console?</a>). You can list all your demo files by typing <tt>dem</tt> on the console.Some useful key bindings for viewing demos and making videos are listed <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=357#357">here</a>.  A simple way to automatically record demos can be found <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?t=90">here</a>.
+</p>
+<!--End Section 2-->
+<!-- End SectLevel2 -->
+<!--End Section 1-->
+<h2><a name="Server setup" id="Server setup">Server setup</a></h2>
+<!-- Start SectLevel2 -->
+<h3><a name="How do I start a server?" id="How do I start a server?">How do I start a server?</a></h3>
+<p class="Body">
+Use the <tt>Multiplayer / Create</tt> menu to start a <tt>listen server</tt>.  You will always have to play yourself in a <tt>listen server</tt>.
+If you want to create a server without being forced to play yourself please take a look at the file <tt>readme.txt</tt> in the <tt>Docs/server/</tt> directory where the <tt>dedicated server</tt> is explained.
+</p>
+<!--End Section 2-->
+<h3><a name="Which ports do I have to open in firewall/forward from my router to run a server?" id="Which ports do I have to open in firewall/forward from my router to run a server?">Which ports do I have to open in firewall/forward from my router to run a server?</a></h3>
+<p class="Body">
+The default port is 26000 UDP.  You can change that in the <tt>Multiplayer / Create</tt> menu or by starting Nexuiz with the parameter <tt>-port &lt;port&gt;</tt> or having a line <tt>port &lt;port&gt;</tt> in the server config file.
+If you follow the tutorial mentioned above you do not need this command line argument as it will be done in the config file created for the server.  To add the command line argument on Windows, create a new shortcut to <tt>nexuiz.exe</tt> or <tt>nexuiz-dedicated.exe</tt> and right click on it.  Select properties and <tt>-port &lt;port&gt;</tt> in the &quot;Target:&quot; line.  Be sure that the &quot;Start in:&quot; line contains the full path to your Nexuiz folder and click &quot;OK&quot;.  The parameter will be used if you start Nexuiz via that new shortcut.
+</p>
+<!--End Section 2-->
+<h3><a name="Is there some kind of rcon?" id="Is there some kind of rcon?">Is there some kind of rcon?</a></h3>
+<p class="Body">
+Yes starting with Nexuiz 2.0 there is rcon (QuakeWorld compatible).  To use it you must enter <tt>rcon_password &lt;password&gt;</tt> in the server console or server config file.  The Nexuiz client has to set the same password in the same fashion.  You can then issue commands with <tt>rcon &lt;command&gt;</tt> if you are connected to the server or will have to set <tt>rcon_address &lt;ip/hostname&gt;</tt> or <tt>rcon_address &lt;ip/hostname&gt;:&lt;port&gt;</tt> to point to the server.  There are also external rcon tools but make sure you use a QW compatible rcon tool.
+</p>
+<!--End Section 2-->
+<h3><a name="How can i kick people who are using special characters in their names?" id="How can i kick people who are using special characters in their names?">How can i kick people who are using special characters in their names?</a></h3>
+<p class="Body">
+Enter <tt>status</tt> at the server console.  You will see a list of all players.  In front of their names you will see a number (the player id).  You can kick the player you don't like with <tt>kick # &lt;player id&gt; &lt;reason&gt;</tt> (notice the space after #).
+</p>
+<!--End Section 2-->
+<!-- End SectLevel2 -->
+<!--End Section 1-->
+<h2><a name="Development" id="Development">Development</a></h2>
+<!-- Start SectLevel2 -->
+<h3><a name="How do i set up gtkradiant to create/edit Nexuiz maps?" id="How do i set up gtkradiant to create/edit Nexuiz maps?">How do i set up gtkradiant to create/edit Nexuiz maps?</a></h3>
+<p class="Body">
+There's a <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?t=10">guide</a> on gtkradiant setup in the forums.
+There are also <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=33">Windows tool</a> that will help you to setup gtkradiant 1.4 and a <a class="link" href="http://www.alientrap.org/forum/viewtopic.php?p=841">Linux script</a> to configure gtkradiant 1.5.
+</p>
+<!--End Section 2-->
+<h3><a name="Where can i get latest development versions of the source code?" id="Where can i get latest development versions of the source code?">Where can i get latest development versions of the source code?</a></h3>
+<p class="Body">
+<strong>Engine:</strong> instructions are available at <a class="link" href="http://icculus.org/twilight/darkplaces/download.html">http://icculus.org/twilight/darkplaces/download.html</a> look for <tt>Accessing the SVN server</tt> (you will need a <a class="link" href="http://subversion.tigris.org/project_packages.html">svn client</a>, beta builds are available <a class="link" href="http://icculus.org/twilight/darkplaces/files/">here</a>)
+</p>
+<p class="Body">
+<strong>Game data:</strong> to check out the Nexuiz svn, you'll need a <a class="link" href="http://subversion.tigris.org/project_packages.html">svn client</a>.  To check out the repository with a command line svn client, do
+<div class="block"><pre>
+svn co svn://svn.icculus.org/nexuiz/trunk/
+</pre></div>
+To compile the game code you need <a class="link" href="http://sourceforge.net/project/showfiles.php?group_id=116842&amp;package_id=129507">fteqcc</a>.  Just download it and run it twice, once in <tt>data/qcsrc/menu</tt> and once in <tt>data/qcsrc/server</tt>.
+</p>
+<!--End Section 2-->
 		  <p>&nbsp;</p>
 		<p><br style="clear:left" />
         </p>

Modified: branches/nexuiz-2.0/Docs/htmlfiles/basics.aft
===================================================================
--- branches/nexuiz-2.0/Docs/htmlfiles/basics.aft	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/Docs/htmlfiles/basics.aft	2009-01-24 19:51:12 UTC (rev 5658)
@@ -65,7 +65,7 @@
 
 	*The grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.
 
-	*The port-o-launch is the perfection of movement.  The grenade it launches creates two portals.  On first impact it creates the entrace portal, on secondary impact the exit portal.  If you enter the first one you (or others and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other poral along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replentish the energy by simply teleporting something thru it.
+	*The port-o-launch is the perfection of movement.  The grenade it launches creates two portals.  On first impact it creates the entrace portal, on secondary impact the exit portal.  If you enter the first one you (or others and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.
 
 	*The shotgun is very similar to that of other games.  It shoots several hitscan pellets with a high spread, so it does very high damage at close range, but becomes very inaccurate at distance.  It is also very useful to knock opponents out after you already hit them hard with a rocket or other projectile, and subsequently closed to a distance where these are no longer as useful, because it's hard to miss with at close range.  The primary fire mode fires once with a short reload, while the secondary fire mode shoots three very quick shots, but with a long reload afterwards.  Starting with Nexuiz 2.3 the secondary firemode will also have a higher spread so the primary is useful for a longer distance then the secondary firemode.  The shotgun uses pellet ammo which is not shared with any other weapons.
 
@@ -81,17 +81,17 @@
 
 	*The nex is a powerful sniper weapon.  Its primary fire mode fires a hitscan antimatter lance for significant damage, but requires a very precise aim, and has a relatively long reload time.  The secondary fire mode activates zoom.  The nex uses cell ammo which is shared with the hlac, crylink, minstanex and the electro.
 
-	*The minsta nex is the snipers wet dream.  Simiar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used soley in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.
+	*The minsta nex is the snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.
 
-	*The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automaticaly if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.
+	*The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.
 
 	*The hagar can be compared to the plasma gun from Quake3.  It has a very high rate of fire, with moderate damage, and some splash damage.  The primary fire mode shoots small projectile missiles at high speed and an extraordinary rate of fire.  The secondary fire mode shoots the same missiles, but at a slower speed and rate of fire, and without the instant trigger.  This means that they will bounce once when hitting a floor or wall, giving you the opportunity to fire around corners, or double your chances to hit someone by spamming an area.  The hagar uses rocket ammo which is shared with the mortar, TAG and the rocket launcher.
 
 	*The rocket launcher is a little different from that of other games, in that the rockets move relatively slowly.  The primary fire mode shoots a slow-moving, high-damage rocket projectile at a medium rate of fire.  The secondary fire mode will explode all your rockets at once.  This means that you don't need to hit your opponent directly - just get the rocket ''near'' him, and use the secondary fire to cause splash damage which will badly hurt him.  The rocket launcher uses rocket ammo which is shared with the mortar, TAG and the hagar.
 
-	*The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severly damage everyone in its radius and also stops in comming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.
+	*The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.
 
-Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explostions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
+Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
 Also note that some objects are affected / pushed by explosion like the keys in Keyhunt or the flags in Capture the Flag.
 
 **''Using Jumping Effectively''
@@ -106,7 +106,7 @@
 **''The Console''
 Games generally have a great many settings which can be changed or tweaked to give you the best advantage.  A lot of these aren't included in the game menus, which are limited by space and intended to give only a quick and compact view of the most important options.  For all the other variables, you have the in-game console.  This is like a command line inside the game.  You can enter commands to connect to a server, vote for options on the server, or to change variables like your name or various graphic effects.  You can access the console by pressing shift-escape, and you can close it again by pressing escape.  Lots of info is available on the official Nexuiz forum regarding the effective use of the console, but probably the most important in multiplayer is using it for voting, which will be briefly covered here:
 
-When you are on a server, open the console and type ''vhelp''.  This will display a short help regarding voting, and also tell you what can be voted on on the server.  By default, things you can vote for include the timelimit and the map played.  By entering ''vcall timelimit -1'' you call a vote to set the timelimit to -1, which means to end the current map and play the next one.  Or, as another example, ''vcall chmap aggressor'' will start a vote to switch to the map 'Aggressor'.  This vote is printed to every player on the server, who can then accept or reject it.  To accept a vote, press F1 (or type in ''vyes'' at the console); to reject it, press F2 (or enter ''vno'' at the console).  If more then 50% of the players currently on the server accept a vote, the vote is passed and whichever setting has been polled will change.  And in this example the current map will end and the next map will begin.  It does not hurt to tell people to press F1/F2, as some still do not know about it.
+When you are on a server, open the console and type ''vhelp''.  This will display a short help regarding voting, and also tell you what can be voted on the server.  By default, things you can vote for include the timelimit and the map played.  By entering ''vcall timelimit -1'' you call a vote to set the timelimit to -1, which means to end the current map and play the next one.  Or, as another example, ''vcall chmap aggressor'' will start a vote to switch to the map 'Aggressor'.  This vote is printed to every player on the server, who can then accept or reject it.  To accept a vote, press F1 (or type in ''vyes'' at the console); to reject it, press F2 (or enter ''vno'' at the console).  If more then 50% of the players currently on the server accept a vote, the vote is passed and whichever setting has been polled will change.  And in this example the current map will end and the next map will begin.  It does not hurt to tell people to press F1/F2, as some still do not know about it.
 
 **''Game Types''
 Nexuiz supports several different game modes and some smaller changes called mutators.  Both are displayed when you connect to a server.
@@ -128,7 +128,7 @@
 
 	*Arena mode is similar to deathmatch, but it only puts two players into a map, with the others waiting in a queue.  When one of both is fragged the next one in the queue will play against the winner.
 
-	*Keyhunt (KH) is a new team mode in Nexuiz 2.3.  Each team has one key and the goal is the collect all keys.  The team with the most points wins.  You get small points for fragging, fragging a keycarrier and picking up a key but you should go for the BIG points you get when ''one team has all the keys and all the keycarriers meet''.  Of cource it also works when ONE player gets all the keys for his team but this is ''much'' harder.
+	*Keyhunt (KH) is a new team mode in Nexuiz 2.3.  Each team has one key and the goal is the collect all keys.  The team with the most points wins.  You get small points for fragging, fragging a keycarrier and picking up a key but you should go for the BIG points you get when ''one team has all the keys and all the keycarriers meet''.  Of course it also works when ONE player gets all the keys for his team but this is ''much'' harder.
 
 	*Onslaught (ONS) is a new team mode in Nexuiz 2.4.  Each team has a powergenerator and the goal is to destroy the enemies generator.  Each generator and all except one checkpoint in the map are protected by an forcefield which is powered by nearby checkpoint.  Your team has to start at the one unprotected checkpoint and work your way up to the enemies generator.  Find the perfect balance between attacking the enemies checkpoints/generator and protecting your own.
 
@@ -136,14 +136,14 @@
 
 	*Race is a new mode for all the quick people in Nexuiz 2.5.  The goal is to race through the level as fast as possible.  A timer is set off at the startline and stopped at the endline.  Checkpoints in between give you an update on your time and compared to the top player.  There are three different race modes:
 
-		*Qualifying mode saves each player's fastest lap time and the player with the fastest time wins. When you die, you respawn in front of the startline.  Players can't interact in this mode. They walk through eachother and can't shoot at the others.
+		*Qualifying mode saves each player's fastest lap time and the player with the fastest time wins. When you die, you respawn in front of the startline.  Players can't interact in this mode. They walk through each other and can't shoot at the others.
 
-		*Race mode is won by the player who makes a certain count of laps first.  Players can interact and kill eachother.  When killed, you respawn in front of the last checkpoint you went through.
+		*Race mode is won by the player who makes a certain count of laps first.  Players can interact and kill each other.  When killed, you respawn in front of the last checkpoint you went through.
 
 		*Mixed mode has the players first compete in qualifying mode for a certain time, or until they are all ready, then the game switches to race mode.  The fastest player in qualifying mode is the first to spawn in race mode and so on. 
 
 **''Mutators''
-	*The hook mutator will add an off-hand hook which can be used like the grappling hook but can be used while you whield other guns.  Fire the hook at a ceiling or wall using the key configured through the menu or bound using ''bind "key" "+hook"''.  Hold down this key while the hook is attached to be pulled toward it.
+	*The hook mutator will add an off-hand hook which can be used like the grappling hook but can be used while you carry other guns.  Fire the hook at a ceiling or wall using the key configured through the menu or bound using ''bind "key" "+hook"''.  Hold down this key while the hook is attached to be pulled toward it.
 
 	*Laser-guided rockets will give you a laser dot on the rocket launcher which you can use to guide the most recently fired rocket.
 
@@ -153,7 +153,7 @@
 
 	*Footsteps will add footstep sounds to your movements.
 
-	*Weapon Arena equips everyone with the ''arena gun'' choosen by the server admin.
+	*Weapon Arena equips everyone with the ''arena gun'' chosen by the server admin.
 
 There are some more of these mutators, but those are the most important ones.
 

Modified: branches/nexuiz-2.0/Docs/htmlfiles/faq.aft
===================================================================
--- branches/nexuiz-2.0/Docs/htmlfiles/faq.aft	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/Docs/htmlfiles/faq.aft	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,20 +21,16 @@
 ^<<
 Nexuiz/
 |-- Docs/
-|   |-- *
-|   `-- server/
-|       `-- *
 |-- data/
 |   |-- common-spog.pk3
 |   `-- data*.pk3
-|-- pro/
+|-- havoc/
 |   `-- data*.pk3
 |-- Nexuiz.app/
-|   `-- *
 |-- Nexuiz-SDL.app/
+|-- server/
 |   `-- *
 |-- sources/
-|   `-- *
 |-- *.exe
 |-- *.dll
 `-- nexuiz-linux-*
@@ -49,11 +45,11 @@
 	5. your download might be corrupted, please download Nexuiz again
 
 ** When i start Nexuiz my screen is flickering
-This in known to happen on Windows with Intel grahpic chips and is a bug in the graphics drivers.  A workaround is to set |Flip-Policiy| to |blit|.  Open the control panel, there should be an icon called |Intel(R) GMA driver| (or something like that), double click it. Click on |3D Settings| to find the screen with that settings.
+This is known to happen on Windows with Intel graphic chips and is a bug in the graphics drivers.  A workaround is to set |Flip-Policiy| to |blit|.  Open the control panel, there should be an icon called |Intel(R) GMA driver| (or something like that), double click it. Click on |3D Settings| to find the screen with those settings.
 
 ** How can I speed up my frame rate?
-You can choose predefined performance settings in the |Settings / Video| menu.  |Normal| is the default, |Medium| and |Low| run faster while |High|, |Ultra| and |Ultimate| enable more features you might want to test if you have a high end graphic card.  Or you can dis/enable single features.  The greatest performance boost can be achieved by turning off dynamic lights and shadows in the |Settings / Effects| menu.  Bloom is also quite resource intensive.  Other fps boots include disabling |Deluxemapping| and |Coronas|.  On older graphics cards or on-board/notebook chips with little video ram you can try to lower the texture quality in the |Settings / Video| menu.
-Some graphic cards (mostly ATI or quite old cards) run A LOT faster if you disable the |Vertex Buffer Objects| in the |Settings / Video| menu.  An other thing that can greatly help on such cards is to disable the |OpenGL 2.0 Shaders|.  Having that option enabled is faster on most cards however thats why both are active by default.
+You can choose predefined performance settings in the |Settings / Video| menu.  |Normal| is the default, |Medium| and |Low| run faster while |High|, |Ultra| and |Ultimate| enable more features you might want to test if you have a high end graphic card.  Or you can enable/disable single features.  The greatest performance boost can be achieved by turning off dynamic lights and shadows in the |Settings / Effects| menu.  Bloom is also quite resource intensive.  Other fps boots include disabling |Deluxemapping| and |Coronas|.  On older graphics cards or on-board/notebook chips with little video ram you can try to lower the texture quality in the |Settings / Video| menu.
+Some graphic cards (mostly ATI or quite old cards) run A LOT faster if you disable the |Vertex Buffer Objects| in the |Settings / Video| menu.  An other thing that can greatly help on such cards is to disable the |OpenGL 2.0 Shaders|.  Having that option enabled is faster on most cards however that is why both are active by default.
 
 ** The sound is broken, it crackles and stutters
 Try run |nexuiz-sdl.exe| instead of |nexuiz.exe| (on Windows).  Adding the command line options |-sndspeed 48000| and/or |-sndstereo| can also help on some systems (on Linux, Mac, Windows).
@@ -70,9 +66,9 @@
 For Linux users: you need to have libcurl installed, otherwise you won't be able to download any maps.  libcurl should be available in any Linux distribution, just search for "libcurl" and install it in your distribution's package manager.
 
 ** How to report crashes
-Alientrap wants to ensure everyone has a pleasent time playing Nexuiz, so if you have problems we would like to ask you to report them and thus help solve them.  Especially crash reports can be very helpful.  See below for how to contact Alientrap ([Where can i get more help?])
+Alientrap wants to ensure everyone has a pleasant time playing Nexuiz, so if you have problems we would like to ask you to report them and thus help solve them.  Especially crash reports can be very helpful.  See below for how to contact Alientrap ([Where can i get more help?])
 
-On Mac: IS THERE A EASY WAY?
+On Mac: IS THERE AN EASY WAY?
 
 On Linux: In a xterm, |cd| into your Nexuiz installation directory, start |catchsegv ./nexuiz-linux-686-sdl -condebug -developer > crash.txt 2>&1| and give the file crash.txt to the developers.  Note that you can also use |./nexuiz-linux-686-glx| or if you have a 64bit system |./nexuiz-linux-x86__64-sdl| and |./nexuiz-linux-x86__64-glx|
 
@@ -85,7 +81,7 @@
 
 ** How do I install new maps?
 Maps usually ship as *.pk3 file.  All you have to do is to copy this file to the |Nexuiz/data/| (on Linux, Mac, Windows) OR |~/.nexuiz/data/| (on Linux, Mac) directory.
-Map packages that were downloaded from a server during playing end up in |Nexuiz/data/dlcache/| or |~/.nexuiz/data/dlcache/| and are only used till you exit Nexuiz. If you want to play them localy or use them to setup a server of your own you can "accept" the packages by moving it one level up - right next to your config.cfg.
+Map packages that were downloaded from a server during playing end up in |Nexuiz/data/dlcache/| or |~/.nexuiz/data/dlcache/| and are only used till you exit Nexuiz. If you want to play them locally or use them to setup a server of your own you can "accept" the packages by moving it one level up - right next to your config.cfg.
 
 ** How can I place a shortcut to Nexuiz on my Linux desktop?
 Use the script |nexuiz-linux-sdl.sh| or |nexuiz-linux-glx.sh| instead of the binaries.  The scripts will use the correct |working directory|,choose the right version (32 or 64 bit) and also allow you to start a extra X server.
@@ -96,38 +92,37 @@
 ** What console commands/variables are there?
 You can get a list of variables by entering |cvarlist| on the console ([How do I open the console?]).  |cmdlist| will give you a list of available commands.  An annotated version of that output can be found at the [Nexuiz wiki (http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands)].
 
-** How can I activate colors in my name?
-Colors can be used in nicknames and chat messages by typing ^ followed by a number between 0 and 9.
+** How can I use colors in my nickname and messages?
+Colors can be used in nicknames and chat messages via two ways: Either the simple way by typing ^ followed by a number between 0 and 9 or by typing ^x followed by three hexadecimal numbers (0-F) representing red, green and blue components of the color before the text. The second way allows for much more colors. For example if you type ^xF00message the text "message" will be displayed in red color. Simple examples:
 
-	!                            !
-	! code   ! color             !
-	!----------------------------!
-	! ^0     ! black             !
-	!----------------------------!
-	! ^1     ! red               !
-	!----------------------------!
-	! ^2     ! green             !
-	!----------------------------!
-	! ^3     ! yellow            !
-	!----------------------------!
-	! ^4     ! blue              !
-	!----------------------------!
-	! ^5     ! aqua              !
-	!----------------------------!
-	! ^6     ! pink              !
-	!----------------------------!
-	! ^7     ! white             !
-	!----------------------------!
-	! ^8     ! light grey        !
-	!----------------------------!
-	! ^9     ! dark grey         !
-	!----------------------------!
+	!        !            !                   !
+	! code   ! rgb code   ! color             !
+	!--------!--------------------------------!
+	! ^0     ! ^x000      ! black             !
+	!--------!--------------------------------!
+	! ^1     ! ^xF00      ! red               !
+	!--------!--------------------------------!
+	! ^2     ! ^x0F0      ! green             !
+	!--------!--------------------------------!
+	! ^3     ! ^xFF0      ! yellow            !
+	!--------!--------------------------------!
+	! ^4     ! ^x00F      ! blue              !
+	!--------!--------------------------------!
+	! ^5     ! ^x0FF      ! aqua              !
+	!--------!--------------------------------!
+	! ^6     ! ^xF0C      ! pink              !
+	!--------!--------------------------------!
+	! ^7     ! ^xFFF      ! white             !
+	!--------!--------------------------------!
+	! ^8     ! ^xBBB      ! light grey        !
+	!--------!--------------------------------!
+	! ^9     ! ^x444      ! dark grey         !
+	!--------!--------------------------------!
 
 ** How do i watch/record demos?
-After the menu redesign in Nexuiz 2.4 there is no demo menu anymore for the time being.  To watch a demo type |ply <demos/name>| in the console ([How do I open the console?]).
-To automaticly record a demo each time you play enable the option |Demo recording| in the |Settings / Misc| menu.  Of if you just want to record some matches open the console and type |rec <demos/name>| before playing.  That is before starting a game or connecting to a server.  The demo file will then be stored in |Nexuiz/data/demos/<name>.dem| (on Windows) or |~/.nexuiz/data/demos/<name>.dem| (on Linux, Mac).
+Demos are recordings of matches that you have played. To automatically record a demo each time you play enable the option |Record demos while playing| in the |Settings / Demos| menu. Or if you just want to record some matches open the console and type |rec <demos/name>| before playing. That is before starting a game or connecting to a server. The demo file will then be stored in |Nexuiz/data/demos/<name>.dem| (on Windows) or |~/.nexuiz/data/demos/<name>.dem| (on Linux, Mac).
 If you downloaded a demo, copy it to |Nexuiz/data/demos/<name>.dem| (on Linux, Mac, Windows) or |~/.nexuiz/data/demos/<name>.dem| (on Linux, Mac).  You might have to create this directory if you have never recorded a demo before.
-You can list all your demo files by typing |dem| on the console.  Some useful key bindings for viewing demos are listed [here (http://www.alientrap.org/forum/viewtopic.php?p=357#357)].  A simple way to automatically record demos can be found [here (http://www.alientrap.org/forum/viewtopic.php?t=90)]
+To watch demos you can choose a demo file in the |Settings / Demos| and click the play button. Also you can watch demos typing |ply <demos/name>| in the console ([How do I open the console?]). You can list all your demo files by typing |dem| on the console.Some useful key bindings for viewing demos and making videos are listed [here (http://www.alientrap.org/forum/viewtopic.php?p=357#357)].  A simple way to automatically record demos can be found [here (http://www.alientrap.org/forum/viewtopic.php?t=90)].
 
 * Server setup
 

Modified: branches/nexuiz-2.0/changes-since-last-release
===================================================================
--- branches/nexuiz-2.0/changes-since-last-release	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/changes-since-last-release	2009-01-24 19:51:12 UTC (rev 5658)
@@ -128,7 +128,7 @@
 menu: game type in server browser
 menu: input box margin now in chars, not percent
 menu: more settings
-menu: mouse fixed in -game pro
+menu: mouse fixed in -game pro (now havoc)
 menu: multicampaign
 menu: new playermodel previews (sev)
 menu: new skin "wickedz"
@@ -147,3 +147,6 @@
 models: new flag model
 rcon2irc: disconnect fix
 rcon2irc: irc_trigger
+game: custom weapon priorities for bots
+game: improved bot ai: teamworking, items rating and weapon combos
+game: free camera for demo playback
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/Makefile
===================================================================
--- branches/nexuiz-2.0/data/Makefile	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/Makefile	2009-01-24 19:51:12 UTC (rev 5658)
@@ -13,6 +13,10 @@
 
 all: qc
 
+.PHONY: update-cvarcount
+update-cvarcount:
+	DO_NOT_RUN_MAKE=1 sh update-cvarcount.sh
+
 .PHONY: qc
 qc: menu.dat progs.dat csprogs.dat
 
@@ -26,13 +30,13 @@
 clean:
 	rm -f progs.dat menu.dat csprogs.dat
 
-csprogs.dat: qcsrc/client/*.* qcsrc/common/*.*
+csprogs.dat: qcsrc/client/*.* qcsrc/common/*.* update-cvarcount
 	cd qcsrc/client && $(FTEQCC) $(FTEQCCFLAGS) $(QCFLAGS_CSPROGS)
 
-progs.dat: qcsrc/server/*.* qcsrc/common/*.*
+progs.dat: qcsrc/server/*.* qcsrc/common/*.* update-cvarcount
 	cd qcsrc/server && $(FTEQCC) $(FTEQCCFLAGS) $(QCFLAGS_PROGS)
 
-menu.dat: qcsrc/menu/*.* qcsrc/menu/*/*.* qcsrc/common/*.*
+menu.dat: qcsrc/menu/*.* qcsrc/menu/*/*.* qcsrc/common/*.* update-cvarcount
 	cd qcsrc/menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
 
 gfx/menu/default/skinvalues.txt: qcsrc/menu/skin-customizables.inc
@@ -50,10 +54,10 @@
 				;; \
 		esac; \
 		TDIR=`mktemp -d -t nexuizpk3.XXXXXX`; \
-		cp -v progs.dat csprogs.dat menu.dat $$TDIR/;
+		cp -v progs.dat csprogs.dat menu.dat $$TDIR/; \
 		svn export --force . $$TDIR; \
 		cd $$TDIR; \
-		$(RM) -r qcsrc common-spog.pk3 \
+		$(RM) -r qcsrc common-spog.pk3; \
 		$(ZIP) $$ABSPK3NAME .
 
 .PHONY: log

Modified: branches/nexuiz-2.0/data/build-compat-pack.sh
===================================================================
--- branches/nexuiz-2.0/data/build-compat-pack.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/build-compat-pack.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -39,6 +39,7 @@
 	gfx/teamradar_ping.tga
 	gfx/toxic_mini.tga
 	gfx/warfare_mini.tga
+	maps/eggandbacon.bsp
 	models/ctf/flags.md3
 	models/ctf/flags.md3_0.skin
 	models/ctf/flags.md3_1.skin
@@ -172,6 +173,7 @@
 	models/weapons/w_porto.zym
     models/weapons/w_seeker.zym
 	particles/particlefont.tga
+	scripts/eggandbacon.shader
 	scripts/flags.shader
 	scripts/hlac.shader
 	scripts/portals.shader
@@ -504,7 +506,7 @@
 	sound/weapons/electro_bounce.ogg
 	sound/weapons/electro_fire2.ogg
 	sound/weapons/electro_fire.ogg
-	sound/weapons/electro_fly.wav
+	sound/weapons/electro_fly.ogg
 	sound/weapons/electro_impact.ogg
 	sound/weapons/flacexp1.ogg
 	sound/weapons/flacexp2.ogg
@@ -533,7 +535,7 @@
 	sound/weapons/neximpact.ogg
 	sound/weapons/rocket_det.ogg
 	sound/weapons/rocket_fire.ogg
-	sound/weapons/rocket_fly.wav
+	sound/weapons/rocket_fly.ogg
 	sound/weapons/rocket_impact.ogg
 	sound/weapons/rocket_mode.ogg
 	sound/weapons/seekerexp1.ogg
@@ -547,7 +549,7 @@
 	sound/weapons/tagexp3.ogg
 	sound/weapons/tag_fire.ogg
 	sound/weapons/tag_impact.ogg
-	sound/weapons/tag_rocket_fly.wav
+	sound/weapons/tag_rocket_fly.ogg
 	sound/weapons/uzi_fire.ogg
 	sound/weapons/weaponpickup.ogg
 	sound/weapons/weapon_switch.ogg
@@ -560,6 +562,13 @@
 	textures/crifleflashider_bump.tga
 	textures/crifleflashider_gloss.tga
 	textures/crifleflashider.tga
+	textures/eggandbacon/black.tga
+	textures/eggandbacon/platten_bump.tga
+	textures/eggandbacon/platten_gloss.tga
+	textures/eggandbacon/platten.tga
+	textures/eggandbacon/upsign_bump.tga
+	textures/eggandbacon/upsign_gloss.tga
+	textures/eggandbacon/upsign.tga
 	textures/flags/flag_blue_cloth.tga
 	textures/flags/flag_blue_gloss.tga
 	textures/flags/flag_blue_glow.tga
@@ -629,15 +638,19 @@
 
 cd pack
 
-find . -type f -print0 | qual=85 scaledown=256x256 xargs -0 ../../misc/jpeg-if-not-alpha.sh
+find . -type f -print0 | qual=85 scaledown=256x256 xargs -0 ../../misc/tools/jpeg-if-not-alpha.sh
 
 find . -name \*.ogg | while IFS= read -r NAME; do
+	c=`vorbiscomment -l "$NAME"`
 	oggdec -o "$NAME.wav" "$NAME"
 	oggenc -q 0 -o "$NAME" "$NAME.wav"
+	echo "$c" | vorbiscomment -w "$NAME"
 	rm -f "$NAME.wav"
+
+	touch "${NAME%.ogg}.wav" # to disable this file, should the client have it
 done
 
-rev=`svnversion ..`
+rev=`svnversion .. | sed 's/M$//g; s/.*://g;'`
 pack="zzz_svn-compat-$rev"
 echo "Support files to play on svn servers of revision $rev" > "$pack.txt"
 7za a -tzip -mx=9 "../$pack.pk3" .

Modified: branches/nexuiz-2.0/data/check-sounds.sh
===================================================================
--- branches/nexuiz-2.0/data/check-sounds.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/check-sounds.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+allidentifiers=`grep "^		_VOICEMSG" qcsrc/server/defs.qh | sed "s/.*(//; s/).*//;"`
+
 allsounds=`find sound -name .svn -prune -o \( -name \*.ogg -o -name \*.wav \) -print`
 for S in $allsounds; do
 	SND=${S#sound/}
@@ -77,45 +79,76 @@
 
 for S in models/player/*.sounds sound/player/default.sounds; do
 	if [ "$S" = "sound/player/default.sounds" ] || [ -f "${S#.sounds}" ]; then
-		while read -r TITLE SOUND COUNT; do
-			case "$TITLE" in
-				//*)
-					good=false
-					case "$COUNT" in
-						0)
-							if psoundtry "$SOUND"; then
-								good=false
-							fi
-							;;
-						*)
-							for i in `seq 1 $COUNT`; do
-								if psoundtry "$SOUND$i"; then
-									good=true
+		{
+			identifiers_seen=
+			while read -r TITLE SOUND COUNT; do
+				case "$TITLE" in
+					//TAG*)
+						;;
+					//*)
+						identifiers_seen="$identifiers_seen ${TITLE#//}"
+						good=false
+						case "$COUNT" in
+							0)
+								if psoundtry "$SOUND"; then
+									good=false
 								fi
-							done
-							;;
-					esac
-					if $good; then
-						echo "$S references existing sound $SOUND but commented out"
-					fi
-					;;
-				*[!a-z0-9]*)
-					echo "Unknown identifier $TITLE in $S"
-					;;
-				*)
-					case "$COUNT" in
-						0)
-							psound "$SOUND"
-							;;
-						*)
-							for i in `seq 1 $COUNT`; do
-								psound "$SOUND$i"
-							done
-							;;
-					esac
-					;;
-			esac
-		done < "$S"
+								;;
+							*)
+								for i in `seq 1 $COUNT`; do
+									if psoundtry "$SOUND$i"; then
+										good=true
+									fi
+								done
+								;;
+						esac
+						if $good; then
+							echo "$S references existing sound $SOUND but commented out"
+						else
+							echo "$S does not have a sound for ${TITLE#//} yet"
+						fi
+						;;
+					*)
+						identifiers_seen="$identifiers_seen $TITLE"
+						case "$COUNT" in
+							0)
+								psound "$SOUND"
+								;;
+							*)
+								for i in `seq 1 $COUNT`; do
+									psound "$SOUND$i"
+								done
+								;;
+						esac
+
+						;;
+				esac
+			done
+			missing=`
+				{
+					for X in $identifiers_seen; do
+						echo "$X"
+						echo "$X"
+					done
+					for X in $allidentifiers; do
+						echo "$X"
+					done
+				} | sort | uniq -u
+			`
+			invalid=`
+				{
+					for X in $identifiers_seen; do
+						echo "$X"
+					done
+					for X in $allidentifiers; do
+						echo "$X"
+						echo "$X"
+					done
+				} | sort | uniq -u
+			`
+			[ -z "$invalid" ] || echo "$S specifies invalid sound identifiers `echo $invalid`"
+			[ -z "$missing" ] || echo "$S lacks sound identifiers `echo $missing`"
+		} < "$S"
 	else
 		echo "$S exists for nonexisting player model"
 	fi


Property changes on: branches/nexuiz-2.0/data/check-sounds.sh
___________________________________________________________________
Name: svn:executable
   + *

Deleted: branches/nexuiz-2.0/data/cvars.txt
===================================================================
--- branches/nexuiz-2.0/data/cvars.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/cvars.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,1221 +0,0 @@
-"bot_ai_aimskill_blendrate" "TODO: describe me"
-"bot_ai_aimskill_firetolerance_distdegrees" "TODO: describe me"
-"bot_ai_aimskill_firetolerance_maxdegrees" "TODO: describe me"
-"bot_ai_aimskill_firetolerance_mindegrees" "TODO: describe me"
-"bot_ai_aimskill_fixedrate" "TODO: describe me"
-"bot_ai_aimskill_mouse" "TODO: describe me"
-"bot_ai_aimskill_offset" "TODO: describe me"
-"bot_ai_aimskill_order_filter_1st" "TODO: describe me"
-"bot_ai_aimskill_order_filter_2nd" "TODO: describe me"
-"bot_ai_aimskill_order_filter_3th" "TODO: describe me"
-"bot_ai_aimskill_order_filter_4th" "TODO: describe me"
-"bot_ai_aimskill_order_filter_5th" "TODO: describe me"
-"bot_ai_aimskill_order_mix_1st" "TODO: describe me"
-"bot_ai_aimskill_order_mix_2nd" "TODO: describe me"
-"bot_ai_aimskill_order_mix_3th" "TODO: describe me"
-"bot_ai_aimskill_order_mix_4th" "TODO: describe me"
-"bot_ai_aimskill_order_mix_5th" "TODO: describe me"
-"bot_ai_aimskill_think" "TODO: describe me"
-"bot_ai_chooseweaponinterval" "TODO: describe me"
-"bot_ai_dangerdetectioninterval" "TODO: describe me"
-"bot_ai_dangerdetectionupdates" "TODO: describe me"
-"bot_ai_dodgeupdateinterval" "TODO: describe me"
-"bot_ai_enemydetectioninterval" "TODO: describe me"
-"bot_ai_keyboard_distance" "TODO: describe me"
-"bot_ai_keyboard_treshold" "TODO: describe me"
-"bot_ai_strategyinterval" "TODO: describe me"
-"bot_ai_thinkinterval" "TODO: describe me"
-"bot_ignore_bots" "When set, bots don't shoot at other bots"
-"bot_join_empty" "When set, bots also play if no player has joined the server"
-"bot_nofire" "When set, bots never fire"
-"bot_number" "Minimum number of bots"
-"bot_prefix" "Prefix in front of the bot names"
-"bot_suffix" "Suffix behind the bot names"
-"bot_usemodelnames" "Use player model names for bot names"
-"bot_vs_human" "Bots and humans play in different teams when set"
-"capturelimit_override" "CTF capture limit (use 0 to play without limit, and -1 to use the mapinfo's limit)"
-"cmdline"
-"collision_endnudge"
-"collision_enternudge"
-"collision_impactnudge"
-"collision_leavenudge"
-"collision_prefernudgedfraction"
-"collision_startnudge"
-"coop"
-"cutscene"
-"deathmatch"
-"deathmatch_force_teamplay" "Always play TDM instead of DM"
-"developer"
-"developer_entityparsing"
-"developer_loadfile"
-"developer_loading"
-"developer_memory"
-"developer_memorydebug"
-"developer_networking"
-"edgefriction"
-"ekg" "Throw huge amounts of gibs"
-"fraglimit_override" "Frag limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
-"fs_empty_files_in_pack_mark_deletions"
-"g_antilag" "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
-"g_arena_maxspawned" "TODO: describe me"
-"g_arena_powerups" "TODO: describe me"
-"g_arena_roundbased" "TODO: describe me"
-"g_arena_warmup" "TODO: describe me"
-"g_balance_armor_blockpercent" "TODO: describe me"
-"g_balance_armor_limit" "TODO: describe me"
-"g_balance_armor_regen" "TODO: describe me"
-"g_balance_armor_regenlinear" "TODO: describe me"
-"g_balance_armor_rot" "TODO: describe me"
-"g_balance_armor_rotlinear" "TODO: describe me"
-"g_balance_armor_stable" "TODO: describe me"
-"g_balance_armor_start" "TODO: describe me"
-"g_balance_cloaked_alpha" "TODO: describe me"
-"g_balance_crylink_primary_ammo" "TODO: describe me"
-"g_balance_crylink_primary_animtime" "TODO: describe me"
-"g_balance_crylink_primary_bouncedamagefactor" "TODO: describe me"
-"g_balance_crylink_primary_bounces" "TODO: describe me"
-"g_balance_crylink_primary_damage" "TODO: describe me"
-"g_balance_crylink_primary_edgedamage" "TODO: describe me"
-"g_balance_crylink_primary_force" "TODO: describe me"
-"g_balance_crylink_primary_middle_fadetime" "TODO: describe me"
-"g_balance_crylink_primary_middle_lifetime" "TODO: describe me"
-"g_balance_crylink_primary_other_fadetime" "TODO: describe me"
-"g_balance_crylink_primary_other_lifetime" "TODO: describe me"
-"g_balance_crylink_primary_radius" "TODO: describe me"
-"g_balance_crylink_primary_refire" "TODO: describe me"
-"g_balance_crylink_primary_shots" "TODO: describe me"
-"g_balance_crylink_primary_speed" "TODO: describe me"
-"g_balance_crylink_primary_spread" "TODO: describe me"
-"g_balance_crylink_primary_star_fadetime" "TODO: describe me"
-"g_balance_crylink_primary_star_lifetime" "TODO: describe me"
-"g_balance_crylink_secondary_ammo" "TODO: describe me"
-"g_balance_crylink_secondary_animtime" "TODO: describe me"
-"g_balance_crylink_secondary_bouncedamagefactor" "TODO: describe me"
-"g_balance_crylink_secondary_bounces" "TODO: describe me"
-"g_balance_crylink_secondary_damage" "TODO: describe me"
-"g_balance_crylink_secondary_edgedamage" "TODO: describe me"
-"g_balance_crylink_secondary_force" "TODO: describe me"
-"g_balance_crylink_secondary_line_fadetime" "TODO: describe me"
-"g_balance_crylink_secondary_line_lifetime" "TODO: describe me"
-"g_balance_crylink_secondary_middle_fadetime" "TODO: describe me"
-"g_balance_crylink_secondary_middle_lifetime" "TODO: describe me"
-"g_balance_crylink_secondary_radius" "TODO: describe me"
-"g_balance_crylink_secondary_refire" "TODO: describe me"
-"g_balance_crylink_secondary_shots" "TODO: describe me"
-"g_balance_crylink_secondary_speed" "TODO: describe me"
-"g_balance_crylink_secondary_spread" "TODO: describe me"
-"g_balance_ctf_damageforcescale" "TODO: describe me"
-"g_balance_ctf_delay_collect" "TODO: describe me"
-"g_balance_curse_empathy_minhealth" "TODO: describe me"
-"g_balance_curse_empathy_takedamage" "TODO: describe me"
-"g_balance_curse_slow_atkrate" "TODO: describe me"
-"g_balance_curse_slow_jumpheight" "TODO: describe me"
-"g_balance_curse_slow_moverate" "TODO: describe me"
-"g_balance_curse_venom_hpmod" "TODO: describe me"
-"g_balance_curse_venom_limitmod" "TODO: describe me"
-"g_balance_curse_venom_rotrate" "TODO: describe me"
-"g_balance_curse_vulner_takedamage" "TODO: describe me"
-"g_balance_curse_weak_damage" "TODO: describe me"
-"g_balance_curse_weak_force" "TODO: describe me"
-"g_balance_electro_combo_damage" "TODO: describe me"
-"g_balance_electro_combo_edgedamage" "TODO: describe me"
-"g_balance_electro_combo_force" "TODO: describe me"
-"g_balance_electro_combo_radius" "TODO: describe me"
-"g_balance_electro_combo_speed" "TODO: describe me"
-"g_balance_electro_primary_ammo" "TODO: describe me"
-"g_balance_electro_primary_animtime" "TODO: describe me"
-"g_balance_electro_primary_damage" "TODO: describe me"
-"g_balance_electro_primary_edgedamage" "TODO: describe me"
-"g_balance_electro_primary_force" "TODO: describe me"
-"g_balance_electro_primary_lifetime" "TODO: describe me"
-"g_balance_electro_primary_radius" "TODO: describe me"
-"g_balance_electro_primary_refire" "TODO: describe me"
-"g_balance_electro_primary_speed" "TODO: describe me"
-"g_balance_electro_secondary_ammo" "TODO: describe me"
-"g_balance_electro_secondary_animtime" "TODO: describe me"
-"g_balance_electro_secondary_damage" "TODO: describe me"
-"g_balance_electro_secondary_edgedamage" "TODO: describe me"
-"g_balance_electro_secondary_force" "TODO: describe me"
-"g_balance_electro_secondary_health" "TODO: describe me"
-"g_balance_electro_secondary_lifetime" "TODO: describe me"
-"g_balance_electro_secondary_radius" "TODO: describe me"
-"g_balance_electro_secondary_refire" "TODO: describe me"
-"g_balance_electro_secondary_speed" "TODO: describe me"
-"g_balance_electro_secondary_speed_up" "TODO: describe me"
-"g_balance_electro_secondary_spread" "TODO: describe me"
-"g_balance_falldamage_deadminspeed" "TODO: describe me"
-"g_balance_falldamage_factor" "TODO: describe me"
-"g_balance_falldamage_maxdamage" "TODO: describe me"
-"g_balance_falldamage_minspeed" "TODO: describe me"
-"g_balance_grapplehook_airfriction" "TODO: describe me"
-"g_balance_grapplehook_force_rubber" "TODO: describe me"
-"g_balance_grapplehook_force_rubber_overstretch" "TODO: describe me"
-"g_balance_grapplehook_health" "TODO: describe me"
-"g_balance_grapplehook_length_min" "TODO: describe me"
-"g_balance_grapplehook_speed_fly" "TODO: describe me"
-"g_balance_grapplehook_speed_pull" "TODO: describe me"
-"g_balance_grapplehook_stretch" "TODO: describe me"
-"g_balance_grenadelauncher_primary_ammo" "TODO: describe me"
-"g_balance_grenadelauncher_primary_animtime" "TODO: describe me"
-"g_balance_grenadelauncher_primary_damage" "TODO: describe me"
-"g_balance_grenadelauncher_primary_edgedamage" "TODO: describe me"
-"g_balance_grenadelauncher_primary_force" "TODO: describe me"
-"g_balance_grenadelauncher_primary_lifetime" "TODO: describe me"
-"g_balance_grenadelauncher_primary_radius" "TODO: describe me"
-"g_balance_grenadelauncher_primary_refire" "TODO: describe me"
-"g_balance_grenadelauncher_primary_speed" "TODO: describe me"
-"g_balance_grenadelauncher_primary_speed_up" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_ammo" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_animtime" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_damage" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_edgedamage" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_force" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_health" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_lifetime" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_radius" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_refire" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_speed" "TODO: describe me"
-"g_balance_grenadelauncher_secondary_speed_up" "TODO: describe me"
-"g_balance_hagar_primary_ammo" "TODO: describe me"
-"g_balance_hagar_primary_damage" "TODO: describe me"
-"g_balance_hagar_primary_edgedamage" "TODO: describe me"
-"g_balance_hagar_primary_force" "TODO: describe me"
-"g_balance_hagar_primary_lifetime" "TODO: describe me"
-"g_balance_hagar_primary_radius" "TODO: describe me"
-"g_balance_hagar_primary_refire" "TODO: describe me"
-"g_balance_hagar_primary_speed" "TODO: describe me"
-"g_balance_hagar_primary_spread" "TODO: describe me"
-"g_balance_hagar_secondary_ammo" "TODO: describe me"
-"g_balance_hagar_secondary_damage" "TODO: describe me"
-"g_balance_hagar_secondary_edgedamage" "TODO: describe me"
-"g_balance_hagar_secondary_force" "TODO: describe me"
-"g_balance_hagar_secondary_lifetime" "TODO: describe me"
-"g_balance_hagar_secondary_radius" "TODO: describe me"
-"g_balance_hagar_secondary_refire" "TODO: describe me"
-"g_balance_hagar_secondary_speed" "TODO: describe me"
-"g_balance_hagar_secondary_spread" "TODO: describe me"
-"g_balance_health_limit" "TODO: describe me"
-"g_balance_health_regen" "TODO: describe me"
-"g_balance_health_regenlinear" "TODO: describe me"
-"g_balance_health_rot" "TODO: describe me"
-"g_balance_health_rotlinear" "TODO: describe me"
-"g_balance_health_stable" "TODO: describe me"
-"g_balance_health_start" "TODO: describe me"
-"g_balance_hlac_primary_ammo" "TODO: describe me"
-"g_balance_hlac_primary_animtime" "TODO: describe me"
-"g_balance_hlac_primary_damage" "TODO: describe me"
-"g_balance_hlac_primary_edgedamage" "TODO: describe me"
-"g_balance_hlac_primary_force" "TODO: describe me"
-"g_balance_hlac_primary_lifetime" "TODO: describe me"
-"g_balance_hlac_primary_radius" "TODO: describe me"
-"g_balance_hlac_primary_refire" "TODO: describe me"
-"g_balance_hlac_primary_speed" "TODO: describe me"
-"g_balance_hlac_primary_spread_add" "TODO: describe me"
-"g_balance_hlac_primary_spread_crouchmod" "TODO: describe me"
-"g_balance_hlac_primary_spread_max" "TODO: describe me"
-"g_balance_hlac_primary_spread_min" "TODO: describe me"
-"g_balance_hlac_secondary_ammo" "TODO: describe me"
-"g_balance_hlac_secondary_animtime" "TODO: describe me"
-"g_balance_hlac_secondary_damage" "TODO: describe me"
-"g_balance_hlac_secondary_edgedamage" "TODO: describe me"
-"g_balance_hlac_secondary_force" "TODO: describe me"
-"g_balance_hlac_secondary_lifetime" "TODO: describe me"
-"g_balance_hlac_secondary_radius" "TODO: describe me"
-"g_balance_hlac_secondary_refire" "TODO: describe me"
-"g_balance_hlac_secondary_shots" "TODO: describe me"
-"g_balance_hlac_secondary_speed" "TODO: describe me"
-"g_balance_hlac_secondary_spread" "TODO: describe me"
-"g_balance_hlac_secondary_spread_crouchmod" "TODO: describe me"
-"g_balance_hook_primary_ammo" "TODO: describe me"
-"g_balance_hook_primary_animtime" "TODO: describe me"
-"g_balance_hook_primary_refire" "TODO: describe me"
-"g_balance_hook_secondary_ammo" "TODO: describe me"
-"g_balance_hook_secondary_animtime" "TODO: describe me"
-"g_balance_hook_secondary_damage" "TODO: describe me"
-"g_balance_hook_secondary_duration" "TODO: describe me"
-"g_balance_hook_secondary_edgedamage" "TODO: describe me"
-"g_balance_hook_secondary_force" "TODO: describe me"
-"g_balance_hook_secondary_gravity" "TODO: describe me"
-"g_balance_hook_secondary_lifetime" "TODO: describe me"
-"g_balance_hook_secondary_power" "TODO: describe me"
-"g_balance_hook_secondary_radius" "TODO: describe me"
-"g_balance_hook_secondary_refire" "TODO: describe me"
-"g_balance_hook_secondary_speed" "TODO: describe me"
-"g_balance_keyhunt_damageforcescale" "TODO: describe me"
-"g_balance_keyhunt_delay_collect" "TODO: describe me"
-"g_balance_keyhunt_delay_drop" "TODO: describe me"
-"g_balance_keyhunt_delay_fadeout" "TODO: describe me"
-"g_balance_keyhunt_delay_return" "TODO: describe me"
-"g_balance_keyhunt_delay_round" "TODO: describe me"
-"g_balance_keyhunt_delay_tracking" "TODO: describe me"
-"g_balance_keyhunt_dropvelocity" "TODO: describe me"
-"g_balance_keyhunt_maxdist" "TODO: describe me"
-"g_balance_keyhunt_protecttime" "TODO: describe me"
-"g_balance_keyhunt_score_capture" "TODO: describe me"
-"g_balance_keyhunt_score_carrierfrag" "TODO: describe me"
-"g_balance_keyhunt_score_collect" "TODO: describe me"
-"g_balance_keyhunt_score_destroyed" "TODO: describe me"
-"g_balance_keyhunt_score_destroyed_ownfactor" "TODO: describe me"
-"g_balance_keyhunt_score_push" "TODO: describe me"
-"g_balance_keyhunt_throwvelocity" "TODO: describe me"
-"g_balance_kill_delay" "TODO: describe me"
-"g_balance_laser_primary_animtime" "TODO: describe me"
-"g_balance_laser_primary_damage" "TODO: describe me"
-"g_balance_laser_primary_edgedamage" "TODO: describe me"
-"g_balance_laser_primary_force" "TODO: describe me"
-"g_balance_laser_primary_lifetime" "TODO: describe me"
-"g_balance_laser_primary_radius" "TODO: describe me"
-"g_balance_laser_primary_refire" "TODO: describe me"
-"g_balance_laser_primary_speed" "TODO: describe me"
-"g_balance_laser_secondary" "TODO: describe me"
-"g_balance_laser_secondary_animtime" "TODO: describe me"
-"g_balance_laser_secondary_damage" "TODO: describe me"
-"g_balance_laser_secondary_edgedamage" "TODO: describe me"
-"g_balance_laser_secondary_force" "TODO: describe me"
-"g_balance_laser_secondary_lifetime" "TODO: describe me"
-"g_balance_laser_secondary_radius" "TODO: describe me"
-"g_balance_laser_secondary_refire" "TODO: describe me"
-"g_balance_laser_secondary_speed" "TODO: describe me"
-"g_balance_minstanex_ammo" "TODO: describe me"
-"g_balance_minstanex_animtime" "TODO: describe me"
-"g_balance_minstanex_refire" "TODO: describe me"
-"g_balance_nex_ammo" "TODO: describe me"
-"g_balance_nex_animtime" "TODO: describe me"
-"g_balance_nex_damage" "TODO: describe me"
-"g_balance_nex_force" "TODO: describe me"
-"g_balance_nex_refire" "TODO: describe me"
-"g_balance_nixnex_ammo_cells" "TODO: describe me"
-"g_balance_nixnex_ammo_nails" "TODO: describe me"
-"g_balance_nixnex_ammo_rockets" "TODO: describe me"
-"g_balance_nixnex_ammo_shells" "TODO: describe me"
-"g_balance_nixnex_ammoincr_cells" "TODO: describe me"
-"g_balance_nixnex_ammoincr_nails" "TODO: describe me"
-"g_balance_nixnex_ammoincr_rockets" "TODO: describe me"
-"g_balance_nixnex_ammoincr_shells" "TODO: describe me"
-"g_balance_nixnex_incrtime" "TODO: describe me"
-"g_balance_nixnex_roundtime" "TODO: describe me"
-"g_balance_pause_armor_rot" "TODO: describe me"
-"g_balance_pause_armor_rot_spawn" "TODO: describe me"
-"g_balance_pause_health_regen" "TODO: describe me"
-"g_balance_pause_health_regen_spawn" "TODO: describe me"
-"g_balance_pause_health_rot" "TODO: describe me"
-"g_balance_pause_health_rot_spawn" "TODO: describe me"
-"g_balance_portal_health" "TODO: describe me"
-"g_balance_portal_lifetime" "TODO: describe me"
-"g_balance_porto_primary_ammo" "TODO: describe me"
-"g_balance_porto_primary_lifetime" "TODO: describe me"
-"g_balance_porto_primary_refire" "TODO: describe me"
-"g_balance_porto_primary_speed" "TODO: describe me"
-"g_balance_powerup_invincible_takedamage" "TODO: describe me"
-"g_balance_powerup_invincible_time" "TODO: describe me"
-"g_balance_powerup_strength_damage" "TODO: describe me"
-"g_balance_powerup_strength_force" "TODO: describe me"
-"g_balance_powerup_strength_selfdamage" "TODO: describe me"
-"g_balance_powerup_strength_selfforce" "TODO: describe me"
-"g_balance_powerup_strength_time" "TODO: describe me"
-"g_balance_rocketlauncher_ammo" "TODO: describe me"
-"g_balance_rocketlauncher_animtime" "TODO: describe me"
-"g_balance_rocketlauncher_damage" "TODO: describe me"
-"g_balance_rocketlauncher_detonatedelay" "TODO: describe me"
-"g_balance_rocketlauncher_edgedamage" "TODO: describe me"
-"g_balance_rocketlauncher_force" "TODO: describe me"
-"g_balance_rocketlauncher_health" "TODO: describe me"
-"g_balance_rocketlauncher_laserguided_allow_steal" "TODO: describe me"
-"g_balance_rocketlauncher_laserguided_speed" "TODO: describe me"
-"g_balance_rocketlauncher_laserguided_speedaccel" "TODO: describe me"
-"g_balance_rocketlauncher_laserguided_speedstart" "TODO: describe me"
-"g_balance_rocketlauncher_laserguided_turnrate" "TODO: describe me"
-"g_balance_rocketlauncher_lifetime" "TODO: describe me"
-"g_balance_rocketlauncher_radius" "TODO: describe me"
-"g_balance_rocketlauncher_refire" "TODO: describe me"
-"g_balance_rocketlauncher_speed" "TODO: describe me"
-"g_balance_rocketlauncher_speedaccel" "TODO: describe me"
-"g_balance_rocketlauncher_speedstart" "TODO: describe me"
-"g_balance_rune_defense_combo_takedamage" "TODO: describe me"
-"g_balance_rune_defense_takedamage" "TODO: describe me"
-"g_balance_rune_regen_combo_hpmod" "TODO: describe me"
-"g_balance_rune_regen_combo_limitmod" "TODO: describe me"
-"g_balance_rune_regen_combo_regenrate" "TODO: describe me"
-"g_balance_rune_regen_combo_rotrate" "TODO: describe me"
-"g_balance_rune_regen_hpmod" "TODO: describe me"
-"g_balance_rune_regen_limitmod" "TODO: describe me"
-"g_balance_rune_regen_regenrate" "TODO: describe me"
-"g_balance_rune_speed_atkrate" "TODO: describe me"
-"g_balance_rune_speed_combo_atkrate" "TODO: describe me"
-"g_balance_rune_speed_combo_jumpheight" "TODO: describe me"
-"g_balance_rune_speed_combo_moverate" "TODO: describe me"
-"g_balance_rune_speed_jumpheight" "TODO: describe me"
-"g_balance_rune_speed_moverate" "TODO: describe me"
-"g_balance_rune_strength_combo_damage" "TODO: describe me"
-"g_balance_rune_strength_combo_force" "TODO: describe me"
-"g_balance_rune_strength_damage" "TODO: describe me"
-"g_balance_rune_strength_force" "TODO: describe me"
-"g_balance_rune_vampire_absorb" "TODO: describe me"
-"g_balance_rune_vampire_combo_absorb" "TODO: describe me"
-"g_balance_rune_vampire_combo_minhealth" "TODO: describe me"
-"g_balance_rune_vampire_maxhealth" "TODO: describe me"
-"g_balance_seeker_flac_ammo" "TODO: describe me"
-"g_balance_seeker_flac_animtime" "TODO: describe me"
-"g_balance_seeker_flac_damage" "TODO: describe me"
-"g_balance_seeker_flac_edgedamage" "TODO: describe me"
-"g_balance_seeker_flac_force" "TODO: describe me"
-"g_balance_seeker_flac_lifetime" "TODO: describe me"
-"g_balance_seeker_flac_lifetime_rand" "TODO: describe me"
-"g_balance_seeker_flac_radius" "TODO: describe me"
-"g_balance_seeker_flac_refire" "TODO: describe me"
-"g_balance_seeker_flac_speed" "TODO: describe me"
-"g_balance_seeker_flac_spread" "TODO: describe me"
-"g_balance_seeker_missile_accel" "TODO: describe me"
-"g_balance_seeker_missile_activate_delay" "TODO: describe me"
-"g_balance_seeker_missile_ammo" "TODO: describe me"
-"g_balance_seeker_missile_animtime" "TODO: describe me"
-"g_balance_seeker_missile_count" "TODO: describe me"
-"g_balance_seeker_missile_damage" "TODO: describe me"
-"g_balance_seeker_missile_decel" "TODO: describe me"
-"g_balance_seeker_missile_delay" "TODO: describe me"
-"g_balance_seeker_missile_edgedamage" "TODO: describe me"
-"g_balance_seeker_missile_force" "TODO: describe me"
-"g_balance_seeker_missile_lifetime" "TODO: describe me"
-"g_balance_seeker_missile_proxy" "TODO: describe me"
-"g_balance_seeker_missile_proxy_delay" "TODO: describe me"
-"g_balance_seeker_missile_proxy_maxrange" "TODO: describe me"
-"g_balance_seeker_missile_radius" "TODO: describe me"
-"g_balance_seeker_missile_refire" "TODO: describe me"
-"g_balance_seeker_missile_smart" "TODO: describe me"
-"g_balance_seeker_missile_smart_mindist" "TODO: describe me"
-"g_balance_seeker_missile_smart_trace_max" "TODO: describe me"
-"g_balance_seeker_missile_smart_trace_min" "TODO: describe me"
-"g_balance_seeker_missile_speed" "TODO: describe me"
-"g_balance_seeker_missile_speed_max" "TODO: describe me"
-"g_balance_seeker_missile_turnrate" "TODO: describe me"
-"g_balance_seeker_tag_ammo" "TODO: describe me"
-"g_balance_seeker_tag_animtime" "TODO: describe me"
-"g_balance_seeker_tag_refire" "TODO: describe me"
-"g_balance_seeker_tag_speed" "TODO: describe me"
-"g_balance_selfdamagepercent" "TODO: describe me"
-"g_balance_shotgun_primary_ammo" "TODO: describe me"
-"g_balance_shotgun_primary_animtime" "TODO: describe me"
-"g_balance_shotgun_primary_bullets" "TODO: describe me"
-"g_balance_shotgun_primary_damage" "TODO: describe me"
-"g_balance_shotgun_primary_force" "TODO: describe me"
-"g_balance_shotgun_primary_refire" "TODO: describe me"
-"g_balance_shotgun_primary_spread" "TODO: describe me"
-"g_balance_shotgun_secondary_ammo" "TODO: describe me"
-"g_balance_shotgun_secondary_animtime" "TODO: describe me"
-"g_balance_shotgun_secondary_bullets" "TODO: describe me"
-"g_balance_shotgun_secondary_damage" "TODO: describe me"
-"g_balance_shotgun_secondary_force" "TODO: describe me"
-"g_balance_shotgun_secondary_refire" "TODO: describe me"
-"g_balance_shotgun_secondary_spread" "TODO: describe me"
-"g_balance_teams" "TODO: describe me"
-"g_balance_teams_complain" "TODO: describe me"
-"g_balance_teams_force" "TODO: describe me"
-"g_balance_teams_prevent_imbalance" "TODO: describe me"
-"g_balance_uzi_first_ammo" "TODO: describe me"
-"g_balance_uzi_first_damage" "TODO: describe me"
-"g_balance_uzi_first_force" "TODO: describe me"
-"g_balance_uzi_first_refire" "TODO: describe me"
-"g_balance_uzi_first_spread" "TODO: describe me"
-"g_balance_uzi_sustained_ammo" "TODO: describe me"
-"g_balance_uzi_sustained_damage" "TODO: describe me"
-"g_balance_uzi_sustained_force" "TODO: describe me"
-"g_balance_uzi_sustained_refire" "TODO: describe me"
-"g_balance_uzi_sustained_spread" "TODO: describe me"
-"g_balance_weaponswitchdelay" "TODO: describe me"
-"g_bugrigs" "TODO: describe me"
-"g_bugrigs_accel" "TODO: describe me"
-"g_bugrigs_air_steering" "TODO: describe me"
-"g_bugrigs_angle_smoothing" "TODO: describe me"
-"g_bugrigs_friction_air" "TODO: describe me"
-"g_bugrigs_friction_brake" "TODO: describe me"
-"g_bugrigs_friction_floor" "TODO: describe me"
-"g_bugrigs_planar_movement" "TODO: describe me"
-"g_bugrigs_planar_movement_car_jumping" "TODO: describe me"
-"g_bugrigs_reverse_speeding" "TODO: describe me"
-"g_bugrigs_reverse_spinning" "TODO: describe me"
-"g_bugrigs_reverse_stopping" "TODO: describe me"
-"g_bugrigs_speed_pow" "TODO: describe me"
-"g_bugrigs_speed_ref" "TODO: describe me"
-"g_bugrigs_steer" "TODO: describe me"
-"g_casings" "TODO: describe me"
-"g_changeteam_banned" "TODO: describe me"
-"g_changeteam_fragtransfer" "TODO: describe me"
-"g_chat_nospectators" "TODO: describe me"
-"g_chat_teamcolors" "TODO: describe me"
-"g_cloaked" "TODO: describe me"
-"g_ctf_allow_drop" "TODO: describe me"
-"g_ctf_capture_limit" "TODO: describe me"
-"g_ctf_flag_returntime" "TODO: describe me"
-"g_ctf_flagcarrier_selfdamage" "TODO: describe me"
-"g_ctf_flagcarrier_selfforce" "TODO: describe me"
-"g_ctf_flagpenalty_drop" "TODO: describe me"
-"g_ctf_flagpenalty_returned" "TODO: describe me"
-"g_ctf_flagpenalty_suicidedrop" "TODO: describe me"
-"g_ctf_flagscore_capture" "TODO: describe me"
-"g_ctf_flagscore_kill" "TODO: describe me"
-"g_ctf_flagscore_pickup_base" "TODO: describe me"
-"g_ctf_flagscore_pickup_dropped_early" "TODO: describe me"
-"g_ctf_flagscore_pickup_dropped_late" "TODO: describe me"
-"g_ctf_flagscore_return" "TODO: describe me"
-"g_ctf_flagscore_return_by_killer" "TODO: describe me"
-"g_ctf_flagscore_return_rogue" "TODO: describe me"
-"g_ctf_flagscore_return_rogue_by_killer" "TODO: describe me"
-"g_ctf_fullbrightflags" "TODO: describe me"
-"g_ctf_ignore_frags" "TODO: describe me"
-"g_ctf_personalpenalty_drop" "TODO: describe me"
-"g_ctf_personalpenalty_returned" "TODO: describe me"
-"g_ctf_personalpenalty_suicidedrop" "TODO: describe me"
-"g_ctf_personalscore_capture" "TODO: describe me"
-"g_ctf_personalscore_kill" "TODO: describe me"
-"g_ctf_personalscore_pickup_base" "TODO: describe me"
-"g_ctf_personalscore_pickup_dropped_early" "TODO: describe me"
-"g_ctf_personalscore_pickup_dropped_late" "TODO: describe me"
-"g_ctf_personalscore_return" "TODO: describe me"
-"g_ctf_personalscore_return_by_killer" "TODO: describe me"
-"g_ctf_personalscore_return_rogue" "TODO: describe me"
-"g_ctf_personalscore_return_rogue_by_killer" "TODO: describe me"
-"g_ctf_respawn_delay" "TODO: describe me"
-"g_ctf_respawn_waves" "TODO: describe me"
-"g_ctf_reverse" "TODO: describe me"
-"g_ctf_shield_force" "TODO: describe me"
-"g_ctf_shield_max_ratio" "TODO: describe me"
-"g_ctf_shield_min_negscore" "TODO: describe me"
-"g_ctf_win_mode" "TODO: describe me"
-"g_dm_respawn_delay" "TODO: describe me"
-"g_dm_respawn_waves" "TODO: describe me"
-"g_dom_respawn_delay" "TODO: describe me"
-"g_dom_respawn_waves" "TODO: describe me"
-"g_domination_default_teams" "TODO: describe me"
-"g_domination_disable_frags" "TODO: describe me"
-"g_domination_point_amt" "TODO: describe me"
-"g_domination_point_capturetime" "TODO: describe me"
-"g_domination_point_glow" "TODO: describe me"
-"g_domination_point_limit" "TODO: describe me"
-"g_domination_point_rate" "TODO: describe me"
-"g_footsteps" "TODO: describe me"
-"g_forced_respawn" "TODO: describe me"
-"g_friendlyfire" "TODO: describe me"
-"g_fullbrightitems" "TODO: describe me"
-"g_fullbrightplayers" "TODO: describe me"
-"g_grappling_hook" "TODO: describe me"
-"g_grappling_hook_tarzan" "TODO: describe me"
-"g_jump_grunt" "TODO: describe me"
-"g_keyhunt_point_limit" "TODO: describe me"
-"g_keyhunt_teams_override" "TODO: describe me"
-"g_laserguided_missile" "TODO: describe me"
-"g_lms" "TODO: describe me"
-"g_lms_campcheck_damage" "TODO: describe me"
-"g_lms_campcheck_distance" "TODO: describe me"
-"g_lms_campcheck_interval" "TODO: describe me"
-"g_lms_campcheck_message" "TODO: describe me"
-"g_lms_join_anytime" "TODO: describe me"
-"g_lms_last_join" "TODO: describe me"
-"g_lms_lives_override" "TODO: describe me"
-"g_lms_regenerate" "TODO: describe me"
-"g_lms_respawn_delay" "TODO: describe me"
-"g_lms_respawn_waves" "TODO: describe me"
-"g_lms_start_ammo_cells" "TODO: describe me"
-"g_lms_start_ammo_nails" "TODO: describe me"
-"g_lms_start_ammo_rockets" "TODO: describe me"
-"g_lms_start_ammo_shells" "TODO: describe me"
-"g_lms_start_armor" "TODO: describe me"
-"g_lms_start_health" "TODO: describe me"
-"g_maplist_allow_hidden" "TODO: describe me"
-"g_maplist_check_waypoints" "TODO: describe me"
-"g_maplist_mostrecent_count" "TODO: describe me"
-"g_maplist_selectrandom" "TODO: describe me"
-"g_maplist_shuffle" "TODO: describe me"
-"g_maplist_textonly" "TODO: describe me"
-"g_maplist_votable" "TODO: describe me"
-"g_maplist_votable_abstain" "TODO: describe me"
-"g_maplist_votable_keeptwotime" "TODO: describe me"
-"g_maplist_votable_nodetail" "TODO: describe me"
-"g_maplist_votable_screenshot_dir" "TODO: describe me"
-"g_maplist_votable_suggestions" "TODO: describe me"
-"g_maplist_votable_suggestions_override_mostrecent" "TODO: describe me"
-"g_maplist_votable_timeout" "TODO: describe me"
-"g_maxplayers" "TODO: describe me"
-"g_maxplayers_spectator_blocktime" "TODO: describe me"
-"g_maxpushtime" "TODO: describe me"
-"g_midair" "TODO: describe me"
-"g_midair_shieldtime" "TODO: describe me"
-"g_minstagib" "TODO: describe me"
-"g_minstagib_ammo_drop" "TODO: describe me"
-"g_minstagib_ammo_start" "TODO: describe me"
-"g_minstagib_extralives" "TODO: describe me"
-"g_minstagib_invis_alpha" "TODO: describe me"
-"g_minstagib_speed_jumpheight" "TODO: describe me"
-"g_minstagib_speed_moverate" "TODO: describe me"
-"g_mirrordamage" "TODO: describe me"
-"g_nexuizversion" "TODO: describe me"
-"g_nixnex" "TODO: describe me"
-"g_nixnex_with_laser" "TODO: describe me"
-"g_norecoil" "TODO: describe me"
-"g_onslaught_cp_health" "TODO: describe me"
-"g_onslaught_gen_health" "TODO: describe me"
-"g_pickup_armorlarge" "TODO: describe me"
-"g_pickup_armorlarge_max" "TODO: describe me"
-"g_pickup_armormedium" "TODO: describe me"
-"g_pickup_armormedium_max" "TODO: describe me"
-"g_pickup_armorsmall" "TODO: describe me"
-"g_pickup_armorsmall_max" "TODO: describe me"
-"g_pickup_cells" "TODO: describe me"
-"g_pickup_cells_max" "TODO: describe me"
-"g_pickup_healthlarge" "TODO: describe me"
-"g_pickup_healthlarge_max" "TODO: describe me"
-"g_pickup_healthmedium" "TODO: describe me"
-"g_pickup_healthmedium_max" "TODO: describe me"
-"g_pickup_healthmega" "TODO: describe me"
-"g_pickup_healthmega_max" "TODO: describe me"
-"g_pickup_healthsmall" "TODO: describe me"
-"g_pickup_healthsmall_max" "TODO: describe me"
-"g_pickup_items" "TODO: describe me"
-"g_pickup_nails" "TODO: describe me"
-"g_pickup_nails_max" "TODO: describe me"
-"g_pickup_respawntime_ammo" "TODO: describe me"
-"g_pickup_respawntime_long" "TODO: describe me"
-"g_pickup_respawntime_medium" "TODO: describe me"
-"g_pickup_respawntime_powerup" "TODO: describe me"
-"g_pickup_respawntime_short" "TODO: describe me"
-"g_pickup_respawntime_weapon" "TODO: describe me"
-"g_pickup_rockets" "TODO: describe me"
-"g_pickup_rockets_max" "TODO: describe me"
-"g_pickup_shells" "TODO: describe me"
-"g_pickup_shells_max" "TODO: describe me"
-"g_player_alpha" "TODO: describe me"
-"g_player_brightness" "TODO: describe me"
-"g_powerup_shield" "TODO: describe me"
-"g_powerup_strength" "TODO: describe me"
-"g_powerup_superhealth" "TODO: describe me"
-"g_projectiles_newton_style" "TODO: describe me"
-"g_race_laps_limit" "TODO: describe me"
-"g_race_qualifying" "TODO: describe me"
-"g_race_teams" "TODO: describe me"
-"g_respawn_delay" "TODO: describe me"
-"g_respawn_mapsettings" "TODO: describe me"
-"g_respawn_waves" "TODO: describe me"
-"g_rune_respawn_delay" "TODO: describe me"
-"g_rune_respawn_waves" "TODO: describe me"
-"g_runematch_allow_same" "TODO: describe me"
-"g_runematch_drop_runes_max" "TODO: describe me"
-"g_runematch_frags_killed_runeholder" "TODO: describe me"
-"g_runematch_frags_killedby_runeholder" "TODO: describe me"
-"g_runematch_frags_norune" "TODO: describe me"
-"g_runematch_point_limit" "TODO: describe me"
-"g_runematch_pointamt" "TODO: describe me"
-"g_runematch_pointrate" "TODO: describe me"
-"g_runematch_respawntime" "TODO: describe me"
-"g_runematch_rune_alpha" "TODO: describe me"
-"g_runematch_rune_color_strength" "TODO: describe me"
-"g_runematch_rune_effects" "TODO: describe me"
-"g_runematch_rune_glow_color" "TODO: describe me"
-"g_runematch_rune_glow_size" "TODO: describe me"
-"g_runematch_shuffletime" "TODO: describe me"
-"g_shocknex" "TODO: describe me"
-"g_shootfromcenter" "TODO: describe me"
-"g_shootfromeye" "TODO: describe me"
-"g_spawn_furthest" "TODO: describe me"
-"g_spawnpoints_auto_move_out_of_solid" "TODO: describe me"
-"g_spawnpoints_autodrop" "TODO: describe me"
-"g_spawnshieldtime" "TODO: describe me"
-"g_spawnsound" "TODO: describe me"
-"g_start_ammo_cells" "TODO: describe me"
-"g_start_ammo_nails" "TODO: describe me"
-"g_start_ammo_rockets" "TODO: describe me"
-"g_start_ammo_shells" "TODO: describe me"
-"g_start_delay" "TODO: describe me"
-"g_start_weapon_crylink" "TODO: describe me"
-"g_start_weapon_electro" "TODO: describe me"
-"g_start_weapon_grenadelauncher" "TODO: describe me"
-"g_start_weapon_hagar" "TODO: describe me"
-"g_start_weapon_hlac" "TODO: describe me"
-"g_start_weapon_hook" "TODO: describe me"
-"g_start_weapon_laser" "TODO: describe me"
-"g_start_weapon_minstanex" "TODO: describe me"
-"g_start_weapon_nex" "TODO: describe me"
-"g_start_weapon_porto" "TODO: describe me"
-"g_start_weapon_rocketlauncher" "TODO: describe me"
-"g_start_weapon_seeker" "TODO: describe me"
-"g_start_weapon_shotgun" "TODO: describe me"
-"g_start_weapon_uzi" "TODO: describe me"
-"g_tdm_respawn_delay" "TODO: describe me"
-"g_tdm_respawn_waves" "TODO: describe me"
-"g_tdm_teams" "TODO: describe me"
-"g_teamdamage_resetspeed" "TODO: describe me"
-"g_teamdamage_threshold" "TODO: describe me"
-"g_throughfloor" "TODO: describe me"
-"g_touchexplode" "TODO: describe me"
-"g_touchexplode_damage" "TODO: describe me"
-"g_touchexplode_edgedamage" "TODO: describe me"
-"g_touchexplode_force" "TODO: describe me"
-"g_touchexplode_radius" "TODO: describe me"
-"g_turrets" "TODO: describe me"
-"g_turrets_aimidle_delay" "TODO: describe me"
-"g_turrets_nofire" "TODO: describe me"
-"g_turrets_reloadcvars" "TODO: describe me"
-"g_turrets_targetscan_mindelay" "TODO: describe me"
-"g_turrets_unit_ewheel_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_ewheel_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_ewheel_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_ewheel_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_ewheel_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_ewheel_std_ammo" "TODO: describe me"
-"g_turrets_unit_ewheel_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_ewheel_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_ewheel_std_health" "TODO: describe me"
-"g_turrets_unit_ewheel_std_respawntime" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_force" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_ewheel_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_range" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_ewheel_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_ewheel_std_track_type" "TODO: describe me"
-"g_turrets_unit_ewheel_turnrate" "TODO: describe me"
-"g_turrets_unit_flac_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_flac_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_flac_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_flac_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_flac_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_flac_std_ammo" "TODO: describe me"
-"g_turrets_unit_flac_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_flac_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_flac_std_health" "TODO: describe me"
-"g_turrets_unit_flac_std_respawntime" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_force" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_flac_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_flac_std_target_range" "TODO: describe me"
-"g_turrets_unit_flac_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_flac_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_flac_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_flac_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_flac_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_flac_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_flac_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_flac_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_flac_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_flac_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_flac_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_flac_std_track_type" "TODO: describe me"
-"g_turrets_unit_fusreac_std_ammo" "TODO: describe me"
-"g_turrets_unit_fusreac_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_fusreac_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_fusreac_std_health" "TODO: describe me"
-"g_turrets_unit_fusreac_std_respawntime" "TODO: describe me"
-"g_turrets_unit_fusreac_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_fusreac_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_fusreac_std_target_range" "TODO: describe me"
-"g_turrets_unit_fusreac_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_fusreac_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_hellion_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_hellion_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_hellion_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_hellion_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_hellion_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_hellion_std_ammo" "TODO: describe me"
-"g_turrets_unit_hellion_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_hellion_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_hellion_std_health" "TODO: describe me"
-"g_turrets_unit_hellion_std_respawntime" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_force" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_speed_gain" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_speed_max" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_hellion_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_range" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_hellion_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_hellion_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_hellion_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_hellion_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_hellion_std_track_type" "TODO: describe me"
-"g_turrets_unit_hk_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_hk_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_hk_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_hk_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_hk_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_hk_std_ammo" "TODO: describe me"
-"g_turrets_unit_hk_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_hk_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_hk_std_health" "TODO: describe me"
-"g_turrets_unit_hk_std_respawntime" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_force" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed_accel" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed_accel2" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed_decel" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed_max" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_speed_turnrate" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_hk_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_hk_std_target_range" "TODO: describe me"
-"g_turrets_unit_hk_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_hk_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_hk_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_hk_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_hk_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_hk_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_hk_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_hk_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_hk_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_hk_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_hk_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_hk_std_track_type" "TODO: describe me"
-"g_turrets_unit_machinegun_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_machinegun_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_machinegun_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_machinegun_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_machinegun_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_machinegun_std_ammo" "TODO: describe me"
-"g_turrets_unit_machinegun_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_machinegun_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_machinegun_std_health" "TODO: describe me"
-"g_turrets_unit_machinegun_std_respawntime" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_force" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_machinegun_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_range" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_machinegun_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_machinegun_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_machinegun_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_machinegun_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_machinegun_std_track_type" "TODO: describe me"
-"g_turrets_unit_mlrs_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_mlrs_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_mlrs_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_mlrs_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_mlrs_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_mlrs_std_ammo" "TODO: describe me"
-"g_turrets_unit_mlrs_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_mlrs_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_mlrs_std_health" "TODO: describe me"
-"g_turrets_unit_mlrs_std_respawntime" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_force" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_mlrs_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_range" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_mlrs_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_mlrs_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_mlrs_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_mlrs_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_mlrs_std_track_type" "TODO: describe me"
-"g_turrets_unit_phaser_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_phaser_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_phaser_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_phaser_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_phaser_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_phaser_std_ammo" "TODO: describe me"
-"g_turrets_unit_phaser_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_phaser_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_phaser_std_health" "TODO: describe me"
-"g_turrets_unit_phaser_std_respawntime" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_force" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_phaser_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_range" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_phaser_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_phaser_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_phaser_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_phaser_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_phaser_std_track_type" "TODO: describe me"
-"g_turrets_unit_plasma_dual_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_plasma_dual_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_plasma_dual_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_plasma_dual_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_plasma_dual_aim_speed" "TODO: describe me"
-"g_turrets_unit_plasma_dual_ammo" "TODO: describe me"
-"g_turrets_unit_plasma_dual_ammo_max" "TODO: describe me"
-"g_turrets_unit_plasma_dual_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_plasma_dual_health" "TODO: describe me"
-"g_turrets_unit_plasma_dual_respawntime" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_dmg" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_force" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_radius" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_refire" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_speed" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_spread" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_volly" "TODO: describe me"
-"g_turrets_unit_plasma_dual_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_range" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_range_fire" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_range_min" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_plasma_dual_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_plasma_dual_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_plasma_dual_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_plasma_dual_track_blendrate" "TODO: describe me"
-"g_turrets_unit_plasma_dual_track_type" "TODO: describe me"
-"g_turrets_unit_plasma_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_plasma_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_plasma_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_plasma_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_plasma_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_plasma_std_ammo" "TODO: describe me"
-"g_turrets_unit_plasma_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_plasma_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_plasma_std_health" "TODO: describe me"
-"g_turrets_unit_plasma_std_respawntime" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_force" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_plasma_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_range" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_plasma_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_plasma_std_track_accel_pitch" "TODO: describe me"
-"g_turrets_unit_plasma_std_track_accel_rot" "TODO: describe me"
-"g_turrets_unit_plasma_std_track_blendrate" "TODO: describe me"
-"g_turrets_unit_plasma_std_track_type" "TODO: describe me"
-"g_turrets_unit_tesla_std_ammo" "TODO: describe me"
-"g_turrets_unit_tesla_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_tesla_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_tesla_std_health" "TODO: describe me"
-"g_turrets_unit_tesla_std_respawntime" "TODO: describe me"
-"g_turrets_unit_tesla_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_tesla_std_shot_force" "TODO: describe me"
-"g_turrets_unit_tesla_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_tesla_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_tesla_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_tesla_std_target_range" "TODO: describe me"
-"g_turrets_unit_tesla_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_tesla_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_walker_run_turnrate" "TODO: describe me"
-"g_turrets_unit_walker_std_aim_firetolerance_angle" "TODO: describe me"
-"g_turrets_unit_walker_std_aim_firetolerance_dist" "TODO: describe me"
-"g_turrets_unit_walker_std_aim_maxpitch" "TODO: describe me"
-"g_turrets_unit_walker_std_aim_maxrot" "TODO: describe me"
-"g_turrets_unit_walker_std_aim_speed" "TODO: describe me"
-"g_turrets_unit_walker_std_ammo" "TODO: describe me"
-"g_turrets_unit_walker_std_ammo_max" "TODO: describe me"
-"g_turrets_unit_walker_std_ammo_recharge" "TODO: describe me"
-"g_turrets_unit_walker_std_health" "TODO: describe me"
-"g_turrets_unit_walker_std_meele_dmg" "TODO: describe me"
-"g_turrets_unit_walker_std_meele_force" "TODO: describe me"
-"g_turrets_unit_walker_std_meele_range" "TODO: describe me"
-"g_turrets_unit_walker_std_respawntime" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_dmg" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_force" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_radius" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_refire" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_speed" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_speed_add" "TODO: describe me"
-"g_turrets_unit_walker_std_rocket_tunrate" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_dmg" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_force" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_radius" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_refire" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_speed" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_spread" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_volly" "TODO: describe me"
-"g_turrets_unit_walker_std_shot_volly_refire" "TODO: describe me"
-"g_turrets_unit_walker_std_target_range" "TODO: describe me"
-"g_turrets_unit_walker_std_target_range_fire" "TODO: describe me"
-"g_turrets_unit_walker_std_target_range_min" "TODO: describe me"
-"g_turrets_unit_walker_std_target_range_optimal" "TODO: describe me"
-"g_turrets_unit_walker_std_target_select_anglebias" "TODO: describe me"
-"g_turrets_unit_walker_std_target_select_missilebias" "TODO: describe me"
-"g_turrets_unit_walker_std_target_select_playerbias" "TODO: describe me"
-"g_turrets_unit_walker_std_target_select_rangebias" "TODO: describe me"
-"g_turrets_unit_walker_std_target_select_samebias" "TODO: describe me"
-"g_turrets_unit_walker_std_track_type" "TODO: describe me"
-"g_turrets_unit_walker_turn_turnrate" "TODO: describe me"
-"g_turrets_unit_walker_walk_turnrate" "TODO: describe me"
-"g_use_ammunition" "TODO: describe me"
-"g_vampire" "TODO: describe me"
-"g_warmup" "TODO: describe me"
-"g_warmup_allguns" "TODO: describe me"
-"g_warmup_allow_timeout" "TODO: describe me"
-"g_warmup_limit" "TODO: describe me"
-"g_warmup_start_ammo_cells" "TODO: describe me"
-"g_warmup_start_ammo_nails" "TODO: describe me"
-"g_warmup_start_ammo_rockets" "TODO: describe me"
-"g_warmup_start_ammo_shells" "TODO: describe me"
-"g_warmup_start_armor" "TODO: describe me"
-"g_warmup_start_health" "TODO: describe me"
-"g_waypointeditor" "TODO: describe me"
-"g_waypoints_for_items" "TODO: describe me"
-"g_waypointsprite_deadlifetime" "TODO: describe me"
-"g_waypointsprite_deployed_lifetime" "TODO: describe me"
-"g_waypointsprite_distancealphaexponent" "TODO: describe me"
-"g_waypointsprite_limitedrange" "TODO: describe me"
-"g_waypointsprite_minalpha" "TODO: describe me"
-"g_waypointsprite_minscale" "TODO: describe me"
-"g_waypointsprite_normdistance" "TODO: describe me"
-"g_waypointsprite_scale" "TODO: describe me"
-"g_waypointsprite_stuffbinds" "TODO: describe me"
-"g_waypointsprite_timealphaexponent" "TODO: describe me"
-"g_weapon_stay" "TODO: describe me"
-"g_weaponarena" "TODO: describe me"
-"g_weaponreplace_crylink" "TODO: describe me"
-"g_weaponreplace_electro" "TODO: describe me"
-"g_weaponreplace_grenadelauncher" "TODO: describe me"
-"g_weaponreplace_hagar" "TODO: describe me"
-"g_weaponreplace_hlac" "TODO: describe me"
-"g_weaponreplace_hook" "TODO: describe me"
-"g_weaponreplace_laser" "TODO: describe me"
-"g_weaponreplace_minstanex" "TODO: describe me"
-"g_weaponreplace_nex" "TODO: describe me"
-"g_weaponreplace_porto" "TODO: describe me"
-"g_weaponreplace_rocketlauncher" "TODO: describe me"
-"g_weaponreplace_seeker" "TODO: describe me"
-"g_weaponreplace_shotgun" "TODO: describe me"
-"g_weaponreplace_uzi" "TODO: describe me"
-"gameversion"
-"host_framerate"
-"host_speeds"
-"lastlevel" "TODO: describe me"
-"minplayers" "TODO: describe me"
-"mod_alias_supporttagscale"
-"mod_q3bsp_curves_collisions"
-"mod_q3bsp_debugtracebrush"
-"mod_q3bsp_optimizedtraceline"
-"net_connectfloodblockingtimeout"
-"net_connecttimeout"
-"net_messagetimeout"
-"nextmap" "TODO: describe me"
-"noaim"
-"noexit"
-"nomonsters"
-"pausable"
-"pr_checkextension"
-"prvm_backtraceforwarnings"
-"prvm_errordump"
-"prvm_leaktest"
-"prvm_leaktest_ignore_classnames"
-"prvm_statementprofiling"
-"prvm_traceqc"
-"quit_and_redirect" "TODO: describe me"
-"quit_when_empty" "TODO: describe me"
-"registered"
-"samelevel"
-"saved1"
-"saved2"
-"saved3"
-"saved4"
-"scratch1"
-"scratch2"
-"scratch3"
-"scratch4"
-"skill"
-"skill_auto" "TODO: describe me"
-"skin"
-"slowmo"
-"sv_accelerate"
-"sv_adminnick"
-"sv_aim"
-"sv_airaccel_qw"
-"sv_airaccel_sideways_friction"
-"sv_airaccelerate"
-"sv_allow_shownames" "TODO: describe me"
-"sv_allowdownloads"
-"sv_areagrid_mingridsize"
-"sv_autoscreenshot" "TODO: describe me"
-"sv_cheats"
-"sv_checkforpacketsduringsleep"
-"sv_clmovement_enable"
-"sv_clmovement_minping"
-"sv_clmovement_minping_disabletime"
-"sv_clmovement_waitforinput"
-"sv_clones" "TODO: describe me"
-"sv_cullentities_nevercullbmodels"
-"sv_cullentities_pvs"
-"sv_cullentities_stats"
-"sv_cullentities_trace"
-"sv_cullentities_trace_delay"
-"sv_cullentities_trace_delay_players"
-"sv_cullentities_trace_enlarge"
-"sv_cullentities_trace_prediction"
-"sv_cullentities_trace_samples"
-"sv_cullentities_trace_samples_extra"
-"sv_cullentities_trace_samples_players"
-"sv_debugmove"
-"sv_defaultcharacter" "TODO: describe me"
-"sv_defaultplayercolors" "TODO: describe me"
-"sv_defaultplayermodel" "TODO: describe me"
-"sv_defaultplayermodel_blue" "TODO: describe me"
-"sv_defaultplayermodel_pink" "TODO: describe me"
-"sv_defaultplayermodel_red" "TODO: describe me"
-"sv_defaultplayermodel_yellow" "TODO: describe me"
-"sv_defaultplayerskin" "TODO: describe me"
-"sv_defaultplayerskin_blue" "TODO: describe me"
-"sv_defaultplayerskin_pink" "TODO: describe me"
-"sv_defaultplayerskin_red" "TODO: describe me"
-"sv_defaultplayerskin_yellow" "TODO: describe me"
-"sv_doublejump" "TODO: describe me"
-"sv_echobprint"
-"sv_entpatch"
-"sv_fixedframeratesingleplayer"
-"sv_foginterval" "TODO: describe me"
-"sv_freezenonclients"
-"sv_friction"
-"sv_friction_on_land" "TODO: describe me"
-"sv_gameplayfix_blowupfallenzombies"
-"sv_gameplayfix_delayprojectiles"
-"sv_gameplayfix_droptofloorstartsolid"
-"sv_gameplayfix_droptofloorstartsolid_nudgetocorrect"
-"sv_gameplayfix_easierwaterjump"
-"sv_gameplayfix_findradiusdistancetobox"
-"sv_gameplayfix_grenadebouncedownslopes"
-"sv_gameplayfix_multiplethinksperframe"
-"sv_gameplayfix_noairborncorpse"
-"sv_gameplayfix_setmodelrealbox"
-"sv_gameplayfix_stepdown"
-"sv_gameplayfix_stepwhilejumping"
-"sv_gameplayfix_swiminbmodels"
-"sv_gameplayfix_upwardvelocityclearsongroundflag"
-"sv_gravity"
-"sv_heartbeatperiod"
-"sv_idealpitchscale"
-"sv_intermission_cdtrack" "TODO: describe me"
-"sv_jumpstep"
-"sv_jumpvelocity"
-"sv_mapchange_delay" "TODO: describe me"
-"sv_maxairspeed"
-"sv_maxidle" "TODO: describe me"
-"sv_maxidle_spectatorsareidle" "TODO: describe me"
-"sv_maxrate"
-"sv_maxspeed"
-"sv_maxvelocity"
-"sv_newflymove"
-"sv_nostep"
-"sv_playerphysicsqc"
-"sv_pogostick" "TODO: describe me"
-"sv_precacheitems" "TODO: describe me"
-"sv_precacheplayermodels" "TODO: describe me"
-"sv_precacheweapons" "TODO: describe me"
-"sv_progs"
-"sv_protocolname"
-"sv_public"
-"sv_q3acompat_machineshotgunswap" "TODO: describe me"
-"sv_random_seed"
-"sv_ratelimitlocalplayer"
-"sv_ready_restart" "TODO: describe me"
-"sv_ready_restart_after_countdown" "TODO: describe me"
-"sv_ready_restart_repeatable" "TODO: describe me"
-"sv_servermodelsonly" "TODO: describe me"
-"sv_sound_land"
-"sv_sound_watersplash"
-"sv_spectate" "TODO: describe me"
-"sv_spectator_speed_multiplier" "TODO: describe me"
-"sv_status_privacy"
-"sv_stepheight"
-"sv_stopspeed"
-"sv_timeout" "TODO: describe me"
-"sv_timeout_leadtime" "TODO: describe me"
-"sv_timeout_length" "TODO: describe me"
-"sv_timeout_number" "TODO: describe me"
-"sv_timeout_resumetime" "TODO: describe me"
-"sv_vote_call" "TODO: describe me"
-"sv_vote_change" "TODO: describe me"
-"sv_vote_commands" "TODO: describe me"
-"sv_vote_majority_factor" "TODO: describe me"
-"sv_vote_master" "TODO: describe me"
-"sv_vote_master_commands" "TODO: describe me"
-"sv_vote_nospectators" "TODO: describe me"
-"sv_vote_only_commands" "TODO: describe me"
-"sv_vote_override_mostrecent" "TODO: describe me"
-"sv_vote_simple_majority_factor" "TODO: describe me"
-"sv_vote_singlecount" "TODO: describe me"
-"sv_vote_timeout" "TODO: describe me"
-"sv_vote_wait" "TODO: describe me"
-"sv_wallfriction"
-"sv_wateraccelerate"
-"sv_waterfriction"
-"sv_writepicture_quality"
-"sys_ticrate"
-"sys_useclockgettime"
-"sys_usenoclockbutbenchmark"
-"team"
-"teamplay_default" "TODO: describe me"
-"teamplay_lockonrestart" "TODO: describe me"
-"temp1"
-"timeformat"
-"timelimit_decrement" "TODO: describe me"
-"timelimit_increment" "TODO: describe me"
-"timelimit_max" "TODO: describe me"
-"timelimit_maxovertime" "TODO: describe me"
-"timelimit_min" "TODO: describe me"
-"timelimit_override" "Time limit to override the values from mapinfo (use 0 to play without limit, and -1 to use the mapinfo's limit)"
-"welcome_message_time" "TODO: describe me"

Deleted: branches/nexuiz-2.0/data/cvars.txt.pl
===================================================================
--- branches/nexuiz-2.0/data/cvars.txt.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/cvars.txt.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,1714 +0,0 @@
-#!/usr/bin/perl
-use strict;
-use warnings;
-
-my $ignore_re = qr{
-|	_.*                              # temp cvars
-
-|	csqc_.*                          # internal
-|	gamecfg                          # internal
-|	g_configversion                  # internal
-|	g_maplist_index                  # internal
-|	halflifebsp                      # internal
-|	cvar_check_.*                    # internal
-
-|	cl_.*	                         # client
-|	con_.*	                         # client
-|	g_campaign.*                     # client
-|	gl_.*	                         # client
-|	joy.*	                         # client
-|	menu_.*	                         # client
-|	mod_q3bsp_lightmapmergepower     # client
-|	mod_q3bsp_nolightmaps            # client
-|	net_slist_.*	                 # client
-|	r_.*                             # client
-|	sbar_.*	                         # client
-|	scr_.*	                         # client
-|	userbind.*                       # client
-|	v_.*                             # client
-|	vid_.*                           # client
-
-|	g_banned_list                    # private
-|	g_ban_default_.*                 # private
-|	g_ban_sync_.*                    # private
-|	g_chat_flood_.*                  # private
-|	log_dest_udp                     # private
-|	log_file                         # private
-|	net_address                      # private
-|	port                             # private
-|	rcon_.*                          # private
-|	savedgamecfg                     # private
-|	settemp_.*                       # private
-|	sv_allowdownloads_.*             # private
-|	sv_autodemo.*                    # private
-|	sv_curl_.*                       # private
-|	sv_eventlog.*                    # private
-|	sv_heartbeatperoid               # private
-|	sv_logscores_.*                  # private
-|	sv_master.*                      # private
-|	sv_vote_master_password          # private
-|	sys_colortranslation             # private
-|	sys_specialcharactertranslation  # private
-|	timestamps                       # private
-
-|	capturelimit                     # mapinfo
-|	timelimit                        # mapinfo
-|	fraglimit                        # mapinfo
-|	g_arena                          # mapinfo
-|	g_assault                        # mapinfo
-|	g_ctf                            # mapinfo
-|	g_dm                             # mapinfo
-|	g_domination                     # mapinfo
-|	g_keyhunt                        # mapinfo
-|	g_keyhunt_teams                  # mapinfo
-|	g_onslaught                      # mapinfo
-|	g_race                           # mapinfo
-|	g_runematch                      # mapinfo
-|	g_tdm                            # mapinfo
-|	teamplay                         # mapinfo
-
-|	hostname                         # shown already
-|	g_maplist                        # too long
-|	g_maplist_mostrecent             # too long
-|	sv_motd                          # too long
-}x;
-
-my %descr;
-open my $fh, "<", "cvars.txt"
-	or die "<cvars.txt: $!";
-while(<$fh>)
-{
-	chomp;
-	/^"(.*?)\" \"(.*)\"$/ or next;
-	$descr{$1} = $2;
-}
-close $fh;
-
-open $fh, ">", "cvars.txt"
-	or die ">cvars.txt: $!";
-
-while(<DATA>)
-{
-	chomp;
-	if(/^(?:\^7)?([a-z0-9_]*) is "(.*?)" \["(.*?)"\] (.*)$/)
-	{
-		my ($cvar, $value, $default, $description) = ($1, $2, $3, $4);
-		if($cvar =~ /^$ignore_re$/)
-		{
-			next;
-		}
-		if($default ne $value)
-		{
-			die "Run this on a DEFAULT config ($cvar has been changed from $default to $value)";
-		}
-		if($description eq 'custom cvar')
-		{
-			if(defined $descr{$cvar})
-			{
-				print $fh "\"$cvar\" \"$descr{$cvar}\"\n";
-			}
-			else
-			{
-				print $fh "\"$cvar\" \"TODO: describe me\"\n";
-			}
-		}
-		else
-		{
-			print $fh "\"$cvar\"\n";
-		}
-	}
-}
-
-__DATA__
-List made using:
-nexuiz-dedicated +sys_colortranslation 2 +sys_specialcharactertranslation 0 +cvarlist +quit
-
-Nexuiz Linux 14:59:25 Dec 15 2008 8589 debug
-Trying to load library... "libz.so.1" - loaded.
-Added packfile data/common-spog.pk3 (26 files)
-data/zzz_svn-compat-5011:5013.pk3 is not a PK3 file
-unable to load pak "data/zzz_svn-compat-5011:5013.pk3"
-Added packfile data/zzz_svn-compat-5014.pk3 (527 files)
-data/zzz_svn-compat-5209:5214.pk3 is not a PK3 file
-unable to load pak "data/zzz_svn-compat-5209:5214.pk3"
-Trying to load library... "libcurl.so.4" "libcurl.so.3" - loaded.
-execing quake.rc
-execing default.cfg
-execing defaultNexuiz.cfg
-execing physicsQBR.cfg
-execing newhook.cfg
-execing ctfscoring-div0.cfg
-execing weapons.cfg
-execing normal.cfg
-Warning: Could not expand $r_showsurfaces
-Warning: Could not expand $gl_finish
-Warning: Could not expand $v_kicktime
-Warning: Could not expand $qport in alias if_dedicated
-execing turrets.cfg
-execing unit_machinegun.cfg
-execing unit_hk.cfg
-execing unit_hellion.cfg
-execing unit_mlrs.cfg
-execing unit_flac.cfg
-execing unit_fusreac.cfg
-execing unit_plasma.cfg
-execing unit_plasma2.cfg
-execing unit_tesla.cfg
-execing unit_phaser.cfg
-execing unit_walker.cfg
-execing unit_ewheel.cfg
-couldn't exec config.cfg
-execing config_update.cfg
-Warning: Could not expand $v_hwgamma in alias _update_configversion_0
-Warning: Could not expand $r_glsl_contrastboost in alias _update_configversion_0
-Warning: Could not expand $r_glsl_contrastboost in alias _update_0_r_glsl_cb_1
-Ignore the error message above, the check works fine otherwise 
-couldn't exec data/campaign.cfg
-couldn't exec autoexec.cfg
-^7_alientrap_net_banlist is "" [""] custom cvar
-^7_backup_con_chatvars_set is "0" ["0"] custom cvar
-^7_cl_color is "102" ["102"] internal storage cvar for current player colors (changed by color command)
-^7_cl_name is "Player" ["Player"] internal storage cvar for current player name (changed by name command)
-^7_cl_playermodel is "models/player/marine.zym" ["models/player/marine.zym"] internal storage cvar for current player model in Nexuiz (changed by playermodel command)
-^7_cl_playerskin is "0" ["0"] internal storage cvar for current player skin in Nexuiz (changed by playerskin command)
-^7_cl_rate is "20000" ["20000"] internal storage cvar for current rate (changed by rate command)
-^7_supports_weaponpriority is "0" ["0"] custom cvar
-^7_update_0_have_r_glsl_cb is "1" ["1"] custom cvar
-^7bot_ai_aimskill_blendrate is "2" ["2"] custom cvar
-^7bot_ai_aimskill_firetolerance_distdegrees is "180" ["180"] custom cvar
-^7bot_ai_aimskill_firetolerance_maxdegrees is "45" ["45"] custom cvar
-^7bot_ai_aimskill_firetolerance_mindegrees is "2" ["2"] custom cvar
-^7bot_ai_aimskill_fixedrate is "15" ["15"] custom cvar
-^7bot_ai_aimskill_mouse is "1" ["1"] custom cvar
-^7bot_ai_aimskill_offset is "1" ["1"] custom cvar
-^7bot_ai_aimskill_order_filter_1st is "0.2" ["0.2"] custom cvar
-^7bot_ai_aimskill_order_filter_2nd is "0.2" ["0.2"] custom cvar
-^7bot_ai_aimskill_order_filter_3th is "0.05" ["0.05"] custom cvar
-^7bot_ai_aimskill_order_filter_4th is "0.25" ["0.25"] custom cvar
-^7bot_ai_aimskill_order_filter_5th is "0.3" ["0.3"] custom cvar
-^7bot_ai_aimskill_order_mix_1st is "0.01" ["0.01"] custom cvar
-^7bot_ai_aimskill_order_mix_2nd is "0.1" ["0.1"] custom cvar
-^7bot_ai_aimskill_order_mix_3th is "0.01" ["0.01"] custom cvar
-^7bot_ai_aimskill_order_mix_4th is "0.05" ["0.05"] custom cvar
-^7bot_ai_aimskill_order_mix_5th is "0.01" ["0.01"] custom cvar
-^7bot_ai_aimskill_think is "1" ["1"] custom cvar
-^7bot_ai_chooseweaponinterval is "0.3" ["0.3"] custom cvar
-^7bot_ai_dangerdetectioninterval is "0.1" ["0.1"] custom cvar
-^7bot_ai_dangerdetectionupdates is "64" ["64"] custom cvar
-^7bot_ai_dodgeupdateinterval is "0.1" ["0.1"] custom cvar
-^7bot_ai_enemydetectioninterval is "0.5" ["0.5"] custom cvar
-^7bot_ai_keyboard_distance is "250" ["250"] custom cvar
-^7bot_ai_keyboard_treshold is "0.57" ["0.57"] custom cvar
-^7bot_ai_strategyinterval is "2" ["2"] custom cvar
-^7bot_ai_thinkinterval is "0.05" ["0.05"] custom cvar
-^7bot_ignore_bots is "0" ["0"] custom cvar
-^7bot_join_empty is "0" ["0"] custom cvar
-^7bot_nofire is "0" ["0"] custom cvar
-^7bot_number is "0" ["0"] custom cvar
-^7bot_prefix is "[BOT]" ["[BOT]"] custom cvar
-^7bot_suffix is "" [""] custom cvar
-^7bot_usemodelnames is "0" ["0"] custom cvar
-^7bot_vs_human is "0" ["0"] custom cvar
-^7capturelimit is "0" ["0"] custom cvar
-^7capturelimit_override is "-1" ["-1"] custom cvar
-^7cl_autoswitch is "1" ["1"] custom cvar
-^7cl_curl_enabled is "1" ["1"] whether client's download support is enabled
-^7cl_curl_maxdownloads is "1" ["1"] maximum number of concurrent HTTP/FTP downloads
-^7cl_curl_maxspeed is "300" ["300"] maximum download speed (KiB/s)
-^7cl_gravity is "800" ["800"] custom cvar
-^7cl_handicap is "1" ["1"] custom cvar
-^7cl_hidewaypoints is "0" ["0"] custom cvar
-^7cl_maxfps is "0" ["0"] maximum fps cap, 0 = unlimited, if game is running faster than this it will wait before running another frame (useful to make cpu time available to other programs)
-^7cl_maxidlefps is "20" ["20"] maximum fps cap when the game is not the active window (makes cpu time available to other programs
-^7cl_minfps is "40" ["40"] minimum fps target - while the rendering performance is below this, it will drift toward lower quality
-^7cl_minfps_fade is "0.2" ["0.2"] how fast the quality adapts to varying framerate
-^7cl_minfps_qualitymax is "1" ["1"] highest allowed drawdistance multiplier
-^7cl_minfps_qualitymin is "0.25" ["0.25"] lowest allowed drawdistance multiplier
-^7cl_minfps_qualitypower is "4" ["4"] raises quality value to a power of itself, higher values make quality drop more sharply in relation to framerate
-^7cl_minfps_qualityscale is "0.5" ["0.5"] multiplier for quality
-^7cl_netlocalping is "0" ["0"] lags local loopback connection by this much ping time (useful to play more fairly on your own server with people with higher pings)
-^7cl_netpacketloss_receive is "0" ["0"] drops this percentage of incoming packets, useful for testing network protocol robustness (jerky movement, effects failing to start, sounds failing to play, etc)
-^7cl_netpacketloss_send is "0" ["0"] drops this percentage of outgoing packets, useful for testing network protocol robustness (jerky movement, prediction errors, etc)
-^7cl_nogibs is "0" ["0"] custom cvar
-^7cl_playerdetailreduction is "0" ["0"] custom cvar
-^7cl_port is "0" ["0"] forces client to use chosen port number if not 0
-^7cl_shownames is "1" ["1"] custom cvar
-^7cl_teamradar is "1" ["1"] custom cvar
-^7cl_teamradar_background_alpha is "0.4" ["0.4"] custom cvar
-^7cl_teamradar_foreground_alpha is "0.8" ["0.8"] custom cvar
-^7cl_teamradar_position is "0 0" ["0 0"] custom cvar
-^7cl_teamradar_rotation is "0" ["0"] custom cvar
-^7cl_teamradar_scale is "4096" ["4096"] custom cvar
-^7cl_teamradar_size is "128 128" ["128 128"] custom cvar
-^7cl_teamradar_zoommode is "0" ["0"] custom cvar
-^7cl_weaponpriority is "14 13 9 8 11 7 6 5 4 3 2 1 10 12" ["14 13 9 8 11 7 6 5 4 3 2 1 10 12"] custom cvar
-^7cl_weaponpriority0 is "14 9 8 4" ["14 9 8 4"] custom cvar
-^7cl_weaponpriority1 is "13 7 6 5 1" ["13 7 6 5 1"] custom cvar
-^7cl_weaponpriority2 is "7 3" ["7 3"] custom cvar
-^7cl_weaponpriority3 is "7 3 2" ["7 3 2"] custom cvar
-^7cl_weaponpriority4 is "13 8 6 5 2" ["13 8 6 5 2"] custom cvar
-^7cl_weaponpriority5 is "1 12 10" ["1 12 10"] custom cvar
-^7cl_weaponpriority6 is "" [""] custom cvar
-^7cl_weaponpriority7 is "" [""] custom cvar
-^7cl_weaponpriority8 is "" [""] custom cvar
-^7cl_weaponpriority9 is "" [""] custom cvar
-^7cl_weaponpriority_useforcycling is "0" ["0"] custom cvar
-^7cl_zoomfactor is "5" ["5"] custom cvar
-^7cl_zoomsensitivity is "0" ["0"] custom cvar
-^7cl_zoomspeed is "3.5" ["3.5"] custom cvar
-^7cmdline is "/nexuiz/haggerRace/Nexuiz/darkplaces/nexuiz-dedicated +sys_colortranslation 2 +sys_specialcharactertranslation 0 +cvarlist +quit " ["/nexuiz/haggerRace/Nexuiz/darkplaces/nexuiz-dedicated +sys_colortranslation 2 +sys_specialcharactertranslation 0 +cvarlist +quit "] contains commandline the engine was launched with
-^7collision_endnudge is "0" ["0"] how much to bias collision trace end
-^7collision_enternudge is "0" ["0"] how much to bias collision entry fraction
-^7collision_impactnudge is "0.03125" ["0.03125"] how much to back off from the impact
-^7collision_leavenudge is "0" ["0"] how much to bias collision exit fraction
-^7collision_prefernudgedfraction is "1" ["1"] whether to sort collision events by nudged fraction (1) or real fraction (0)
-^7collision_startnudge is "0" ["0"] how much to bias collision trace start
-^7con_chat is "5" ["5"] how many chat lines to show in a dedicated chat area
-^7con_chatpos is "-7" ["-7"] where to put chat (negative: lines from bottom of screen, positive: lines below notify, 0: at top)
-^7con_chatsize is "10" ["10"] chat text size in virtual 2D pixels (if con_chat is enabled)
-^7con_chattime is "30" ["30"] how long chat lines last, in seconds
-^7con_chatwidth is "0.6" ["0.6"] relative chat window width
-^7con_completion_chmap is "map" ["map"] custom cvar
-^7con_completion_exec is "*.cfg" ["*.cfg"] (null)
-^7con_completion_gotomap is "map" ["map"] custom cvar
-^7con_completion_playdemo is "*.dem" ["*.dem"] (null)
-^7con_completion_ply is "*.dem" ["*.dem"] custom cvar
-^7con_completion_tdem is "*.dem" ["*.dem"] custom cvar
-^7con_completion_timedemo is "*.dem" ["*.dem"] (null)
-^7con_completion_vdomap is "map" ["map"] custom cvar
-^7con_completion_vmap is "map" ["map"] custom cvar
-^7con_nickcompletion is "1" ["1"] tab-complete nicks in console and message input
-^7con_nickcompletion_flags is "11" ["11"] Bitfield: 0: add nothing after completion. 1: add the last color after completion. 2: add a quote when starting a quote instead of the color. 4: will replace 1, will force color, even after a quote. 8: ignore non-alphanumerics. 16: ignore spaces. 
-^7con_notify is "4" ["4"] how many notify lines to show
-^7con_notifyalign is "" [""] how to align notify lines: 0 = left, 0.5 = center, 1 = right, empty string = game default)
-^7con_notifysize is "10" ["10"] notify text size in virtual 2D pixels
-^7con_notifytime is "3" ["3"] how long notify lines last, in seconds
-^7con_textsize is "8" ["8"] console text size in virtual 2D pixels
-^7coop is "0" ["0"] coop mode, 0 = no coop, 1 = coop mode, multiple players playing through the singleplayer game (coop mode also shuts off deathmatch)
-^7csqc_progcrc is "-1" ["-1"] CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1
-^7csqc_progname is "csprogs.dat" ["csprogs.dat"] name of csprogs.dat file to load
-^7csqc_progsize is "-1" ["-1"] file size of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1
-^7cutscene is "1" ["1"] enables cutscenes in nehahra, can be used by other mods
-^7cvar_check_default is "3e222928f6156061e54639483d8961f0" ["3e222928f6156061e54639483d8961f0"] custom cvar
-^7cvar_check_weapons is "bf8a055d6b6b090133b248bccf916024" ["bf8a055d6b6b090133b248bccf916024"] custom cvar
-^7deathmatch is "1" ["1"] deathmatch mode, values depend on mod but typically 0 = no deathmatch, 1 = normal deathmatch with respawning weapons, 2 = weapons stay (players can only pick up new weapons)
-^7deathmatch_force_teamplay is "0" ["0"] custom cvar
-^7developer is "0" ["0"] prints additional debugging messages and information (recommended for modders and level designers)
-^7developer_entityparsing is "0" ["0"] prints detailed network entities information each time a packet is received
-^7developer_loadfile is "0" ["0"] prints name and size of every file loaded via the FS_LoadFile function (which is almost everything)
-^7developer_loading is "0" ["0"] prints information about files as they are loaded or unloaded successfully
-^7developer_memory is "0" ["0"] prints debugging information about memory allocations
-^7developer_memorydebug is "0" ["0"] enables memory corruption checks (very slow)
-^7developer_networking is "0" ["0"] prints all received and sent packets (recommended only for debugging)
-^7edgefriction is "1" ["1"] how much you slow down when nearing a ledge you might fall off, multiplier of sv_friction (Quake used 2, QuakeWorld used 1 due to a bug in physics code)
-^7ekg is "0" ["0"] custom cvar
-^7fraglimit is "0" ["0"] ends level if this many frags is reached by any player
-^7fraglimit_override is "-1" ["-1"] custom cvar
-^7fs_empty_files_in_pack_mark_deletions is "1" ["1"] if enabled, empty files in a pak/pk3 count as not existing but cancel the search in further packs, effectively allowing patch pak/pk3 files to 'delete' files
-^7g_antilag is "2" ["2"] custom cvar
-^7g_arena is "0" ["0"] custom cvar
-^7g_arena_maxspawned is "2" ["2"] custom cvar
-^7g_arena_powerups is "0" ["0"] custom cvar
-^7g_arena_roundbased is "1" ["1"] custom cvar
-^7g_arena_warmup is "5" ["5"] custom cvar
-^7g_assault is "0" ["0"] custom cvar
-^7g_balance_armor_blockpercent is "0.6" ["0.6"] custom cvar
-^7g_balance_armor_limit is "999" ["999"] custom cvar
-^7g_balance_armor_regen is "0" ["0"] custom cvar
-^7g_balance_armor_regenlinear is "0" ["0"] custom cvar
-^7g_balance_armor_rot is "0.1" ["0.1"] custom cvar
-^7g_balance_armor_rotlinear is "0" ["0"] custom cvar
-^7g_balance_armor_stable is "100" ["100"] custom cvar
-^7g_balance_armor_start is "0" ["0"] custom cvar
-^7g_balance_cloaked_alpha is "0.25" ["0.25"] custom cvar
-^7g_balance_crylink_primary_ammo is "2" ["2"] custom cvar
-^7g_balance_crylink_primary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_crylink_primary_bouncedamagefactor is "0.5" ["0.5"] custom cvar
-^7g_balance_crylink_primary_bounces is "1" ["1"] custom cvar
-^7g_balance_crylink_primary_damage is "20" ["20"] custom cvar
-^7g_balance_crylink_primary_edgedamage is "0" ["0"] custom cvar
-^7g_balance_crylink_primary_force is "-55" ["-55"] custom cvar
-^7g_balance_crylink_primary_middle_fadetime is "5" ["5"] custom cvar
-^7g_balance_crylink_primary_middle_lifetime is "5" ["5"] custom cvar
-^7g_balance_crylink_primary_other_fadetime is "0.2" ["0.2"] custom cvar
-^7g_balance_crylink_primary_other_lifetime is "0.1" ["0.1"] custom cvar
-^7g_balance_crylink_primary_radius is "80" ["80"] custom cvar
-^7g_balance_crylink_primary_refire is "0.4" ["0.4"] custom cvar
-^7g_balance_crylink_primary_shots is "4" ["4"] custom cvar
-^7g_balance_crylink_primary_speed is "7000" ["7000"] custom cvar
-^7g_balance_crylink_primary_spread is "0.03" ["0.03"] custom cvar
-^7g_balance_crylink_primary_star_fadetime is "0.2" ["0.2"] custom cvar
-^7g_balance_crylink_primary_star_lifetime is "0.1" ["0.1"] custom cvar
-^7g_balance_crylink_secondary_ammo is "2" ["2"] custom cvar
-^7g_balance_crylink_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_crylink_secondary_bouncedamagefactor is "0.5" ["0.5"] custom cvar
-^7g_balance_crylink_secondary_bounces is "0" ["0"] custom cvar
-^7g_balance_crylink_secondary_damage is "20" ["20"] custom cvar
-^7g_balance_crylink_secondary_edgedamage is "0" ["0"] custom cvar
-^7g_balance_crylink_secondary_force is "-55" ["-55"] custom cvar
-^7g_balance_crylink_secondary_line_fadetime is "2" ["2"] custom cvar
-^7g_balance_crylink_secondary_line_lifetime is "2" ["2"] custom cvar
-^7g_balance_crylink_secondary_middle_fadetime is "5" ["5"] custom cvar
-^7g_balance_crylink_secondary_middle_lifetime is "5" ["5"] custom cvar
-^7g_balance_crylink_secondary_radius is "3" ["3"] custom cvar
-^7g_balance_crylink_secondary_refire is "0.5" ["0.5"] custom cvar
-^7g_balance_crylink_secondary_shots is "7" ["7"] custom cvar
-^7g_balance_crylink_secondary_speed is "7000" ["7000"] custom cvar
-^7g_balance_crylink_secondary_spread is "0.08" ["0.08"] custom cvar
-^7g_balance_ctf_damageforcescale is "1" ["1"] custom cvar
-^7g_balance_ctf_delay_collect is "1.0" ["1.0"] custom cvar
-^7g_balance_curse_empathy_minhealth is "20" ["20"] custom cvar
-^7g_balance_curse_empathy_takedamage is "-0.4" ["-0.4"] custom cvar
-^7g_balance_curse_slow_atkrate is "1.5" ["1.5"] custom cvar
-^7g_balance_curse_slow_jumpheight is "1.0" ["1.0"] custom cvar
-^7g_balance_curse_slow_moverate is "0.8" ["0.8"] custom cvar
-^7g_balance_curse_venom_hpmod is "0.6" ["0.6"] custom cvar
-^7g_balance_curse_venom_limitmod is "1" ["1"] custom cvar
-^7g_balance_curse_venom_rotrate is "3.0" ["3.0"] custom cvar
-^7g_balance_curse_vulner_takedamage is "2.0" ["2.0"] custom cvar
-^7g_balance_curse_weak_damage is "0.5" ["0.5"] custom cvar
-^7g_balance_curse_weak_force is "0.6" ["0.6"] custom cvar
-^7g_balance_electro_combo_damage is "70" ["70"] custom cvar
-^7g_balance_electro_combo_edgedamage is "0" ["0"] custom cvar
-^7g_balance_electro_combo_force is "200" ["200"] custom cvar
-^7g_balance_electro_combo_radius is "250" ["250"] custom cvar
-^7g_balance_electro_combo_speed is "2000" ["2000"] custom cvar
-^7g_balance_electro_primary_ammo is "2" ["2"] custom cvar
-^7g_balance_electro_primary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_electro_primary_damage is "80" ["80"] custom cvar
-^7g_balance_electro_primary_edgedamage is "0" ["0"] custom cvar
-^7g_balance_electro_primary_force is "200" ["200"] custom cvar
-^7g_balance_electro_primary_lifetime is "30" ["30"] custom cvar
-^7g_balance_electro_primary_radius is "150" ["150"] custom cvar
-^7g_balance_electro_primary_refire is "0.6" ["0.6"] custom cvar
-^7g_balance_electro_primary_speed is "2000" ["2000"] custom cvar
-^7g_balance_electro_secondary_ammo is "2" ["2"] custom cvar
-^7g_balance_electro_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_electro_secondary_damage is "60" ["60"] custom cvar
-^7g_balance_electro_secondary_edgedamage is "0" ["0"] custom cvar
-^7g_balance_electro_secondary_force is "200" ["200"] custom cvar
-^7g_balance_electro_secondary_health is "5" ["5"] custom cvar
-^7g_balance_electro_secondary_lifetime is "5" ["5"] custom cvar
-^7g_balance_electro_secondary_radius is "150" ["150"] custom cvar
-^7g_balance_electro_secondary_refire is "0.3" ["0.3"] custom cvar
-^7g_balance_electro_secondary_speed is "900" ["900"] custom cvar
-^7g_balance_electro_secondary_speed_up is "200" ["200"] custom cvar
-^7g_balance_electro_secondary_spread is "0.05" ["0.05"] custom cvar
-^7g_balance_falldamage_deadminspeed is "150" ["150"] custom cvar
-^7g_balance_falldamage_factor is "0.15" ["0.15"] custom cvar
-^7g_balance_falldamage_maxdamage is "25" ["25"] custom cvar
-^7g_balance_falldamage_minspeed is "1400" ["1400"] custom cvar
-^7g_balance_grapplehook_airfriction is "0.2" ["0.2"] custom cvar
-^7g_balance_grapplehook_force_rubber is "2000" ["2000"] custom cvar
-^7g_balance_grapplehook_force_rubber_overstretch is "1000" ["1000"] custom cvar
-^7g_balance_grapplehook_health is "130" ["130"] custom cvar
-^7g_balance_grapplehook_length_min is "50" ["50"] custom cvar
-^7g_balance_grapplehook_speed_fly is "1800" ["1800"] custom cvar
-^7g_balance_grapplehook_speed_pull is "2000" ["2000"] custom cvar
-^7g_balance_grapplehook_stretch is "50" ["50"] custom cvar
-^7g_balance_grenadelauncher_primary_ammo is "2" ["2"] custom cvar
-^7g_balance_grenadelauncher_primary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_grenadelauncher_primary_damage is "65" ["65"] custom cvar
-^7g_balance_grenadelauncher_primary_edgedamage is "35" ["35"] custom cvar
-^7g_balance_grenadelauncher_primary_force is "400" ["400"] custom cvar
-^7g_balance_grenadelauncher_primary_lifetime is "30" ["30"] custom cvar
-^7g_balance_grenadelauncher_primary_radius is "140" ["140"] custom cvar
-^7g_balance_grenadelauncher_primary_refire is "0.7" ["0.7"] custom cvar
-^7g_balance_grenadelauncher_primary_speed is "2000" ["2000"] custom cvar
-^7g_balance_grenadelauncher_primary_speed_up is "200" ["200"] custom cvar
-^7g_balance_grenadelauncher_secondary_ammo is "2" ["2"] custom cvar
-^7g_balance_grenadelauncher_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_grenadelauncher_secondary_damage is "65" ["65"] custom cvar
-^7g_balance_grenadelauncher_secondary_edgedamage is "35" ["35"] custom cvar
-^7g_balance_grenadelauncher_secondary_force is "400" ["400"] custom cvar
-^7g_balance_grenadelauncher_secondary_health is "10" ["10"] custom cvar
-^7g_balance_grenadelauncher_secondary_lifetime is "2.5" ["2.5"] custom cvar
-^7g_balance_grenadelauncher_secondary_radius is "140" ["140"] custom cvar
-^7g_balance_grenadelauncher_secondary_refire is "0.6" ["0.6"] custom cvar
-^7g_balance_grenadelauncher_secondary_speed is "1400" ["1400"] custom cvar
-^7g_balance_grenadelauncher_secondary_speed_up is "200" ["200"] custom cvar
-^7g_balance_hagar_primary_ammo is "1" ["1"] custom cvar
-^7g_balance_hagar_primary_damage is "40" ["40"] custom cvar
-^7g_balance_hagar_primary_edgedamage is "15" ["15"] custom cvar
-^7g_balance_hagar_primary_force is "100" ["100"] custom cvar
-^7g_balance_hagar_primary_lifetime is "30" ["30"] custom cvar
-^7g_balance_hagar_primary_radius is "70" ["70"] custom cvar
-^7g_balance_hagar_primary_refire is "0.15" ["0.15"] custom cvar
-^7g_balance_hagar_primary_speed is "3000" ["3000"] custom cvar
-^7g_balance_hagar_primary_spread is "0.010" ["0.010"] custom cvar
-^7g_balance_hagar_secondary_ammo is "1" ["1"] custom cvar
-^7g_balance_hagar_secondary_damage is "40" ["40"] custom cvar
-^7g_balance_hagar_secondary_edgedamage is "15" ["15"] custom cvar
-^7g_balance_hagar_secondary_force is "100" ["100"] custom cvar
-^7g_balance_hagar_secondary_lifetime is "30" ["30"] custom cvar
-^7g_balance_hagar_secondary_radius is "70" ["70"] custom cvar
-^7g_balance_hagar_secondary_refire is "0.15" ["0.15"] custom cvar
-^7g_balance_hagar_secondary_speed is "1400" ["1400"] custom cvar
-^7g_balance_hagar_secondary_spread is "0.015" ["0.015"] custom cvar
-^7g_balance_health_limit is "999" ["999"] custom cvar
-^7g_balance_health_regen is "0.1" ["0.1"] custom cvar
-^7g_balance_health_regenlinear is "0" ["0"] custom cvar
-^7g_balance_health_rot is "0.1" ["0.1"] custom cvar
-^7g_balance_health_rotlinear is "0" ["0"] custom cvar
-^7g_balance_health_stable is "100" ["100"] custom cvar
-^7g_balance_health_start is "150" ["150"] custom cvar
-^7g_balance_hlac_primary_ammo is "1" ["1"] custom cvar
-^7g_balance_hlac_primary_animtime is "0.1" ["0.1"] custom cvar
-^7g_balance_hlac_primary_damage is "25" ["25"] custom cvar
-^7g_balance_hlac_primary_edgedamage is "10" ["10"] custom cvar
-^7g_balance_hlac_primary_force is "100" ["100"] custom cvar
-^7g_balance_hlac_primary_lifetime is "5" ["5"] custom cvar
-^7g_balance_hlac_primary_radius is "70" ["70"] custom cvar
-^7g_balance_hlac_primary_refire is "0.1" ["0.1"] custom cvar
-^7g_balance_hlac_primary_speed is "9000" ["9000"] custom cvar
-^7g_balance_hlac_primary_spread_add is "0.0045" ["0.0045"] custom cvar
-^7g_balance_hlac_primary_spread_crouchmod is "0.25" ["0.25"] custom cvar
-^7g_balance_hlac_primary_spread_max is "0.25" ["0.25"] custom cvar
-^7g_balance_hlac_primary_spread_min is "0.01" ["0.01"] custom cvar
-^7g_balance_hlac_secondary_ammo is "10" ["10"] custom cvar
-^7g_balance_hlac_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_hlac_secondary_damage is "25" ["25"] custom cvar
-^7g_balance_hlac_secondary_edgedamage is "10" ["10"] custom cvar
-^7g_balance_hlac_secondary_force is "100" ["100"] custom cvar
-^7g_balance_hlac_secondary_lifetime is "5" ["5"] custom cvar
-^7g_balance_hlac_secondary_radius is "70" ["70"] custom cvar
-^7g_balance_hlac_secondary_refire is "1" ["1"] custom cvar
-^7g_balance_hlac_secondary_shots is "6" ["6"] custom cvar
-^7g_balance_hlac_secondary_speed is "9000" ["9000"] custom cvar
-^7g_balance_hlac_secondary_spread is "0.15" ["0.15"] custom cvar
-^7g_balance_hlac_secondary_spread_crouchmod is "0.5" ["0.5"] custom cvar
-^7g_balance_hook_primary_ammo is "0" ["0"] custom cvar
-^7g_balance_hook_primary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_hook_primary_refire is "0" ["0"] custom cvar
-^7g_balance_hook_secondary_ammo is "25" ["25"] custom cvar
-^7g_balance_hook_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_hook_secondary_damage is "25" ["25"] custom cvar
-^7g_balance_hook_secondary_duration is "1.5" ["1.5"] custom cvar
-^7g_balance_hook_secondary_edgedamage is "5" ["5"] custom cvar
-^7g_balance_hook_secondary_force is "-2000" ["-2000"] custom cvar
-^7g_balance_hook_secondary_gravity is "5" ["5"] custom cvar
-^7g_balance_hook_secondary_lifetime is "30" ["30"] custom cvar
-^7g_balance_hook_secondary_power is "3" ["3"] custom cvar
-^7g_balance_hook_secondary_radius is "500" ["500"] custom cvar
-^7g_balance_hook_secondary_refire is "3" ["3"] custom cvar
-^7g_balance_hook_secondary_speed is "0" ["0"] custom cvar
-^7g_balance_keyhunt_damageforcescale is "1" ["1"] custom cvar
-^7g_balance_keyhunt_delay_collect is "1.5" ["1.5"] custom cvar
-^7g_balance_keyhunt_delay_drop is "0.4" ["0.4"] custom cvar
-^7g_balance_keyhunt_delay_fadeout is "2" ["2"] custom cvar
-^7g_balance_keyhunt_delay_return is "60" ["60"] custom cvar
-^7g_balance_keyhunt_delay_round is "5" ["5"] custom cvar
-^7g_balance_keyhunt_delay_tracking is "10" ["10"] custom cvar
-^7g_balance_keyhunt_dropvelocity is "300" ["300"] custom cvar
-^7g_balance_keyhunt_maxdist is "150" ["150"] custom cvar
-^7g_balance_keyhunt_protecttime is "0.8" ["0.8"] custom cvar
-^7g_balance_keyhunt_score_capture is "100" ["100"] custom cvar
-^7g_balance_keyhunt_score_carrierfrag is "2" ["2"] custom cvar
-^7g_balance_keyhunt_score_collect is "3" ["3"] custom cvar
-^7g_balance_keyhunt_score_destroyed is "50" ["50"] custom cvar
-^7g_balance_keyhunt_score_destroyed_ownfactor is "1" ["1"] custom cvar
-^7g_balance_keyhunt_score_push is "60" ["60"] custom cvar
-^7g_balance_keyhunt_throwvelocity is "400" ["400"] custom cvar
-^7g_balance_kill_delay is "5" ["5"] custom cvar
-^7g_balance_laser_primary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_laser_primary_damage is "35" ["35"] custom cvar
-^7g_balance_laser_primary_edgedamage is "10" ["10"] custom cvar
-^7g_balance_laser_primary_force is "400" ["400"] custom cvar
-^7g_balance_laser_primary_lifetime is "30" ["30"] custom cvar
-^7g_balance_laser_primary_radius is "70" ["70"] custom cvar
-^7g_balance_laser_primary_refire is "0.7" ["0.7"] custom cvar
-^7g_balance_laser_primary_speed is "9000" ["9000"] custom cvar
-^7g_balance_laser_secondary is "0" ["0"] custom cvar
-^7g_balance_laser_secondary_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_laser_secondary_damage is "35" ["35"] custom cvar
-^7g_balance_laser_secondary_edgedamage is "10" ["10"] custom cvar
-^7g_balance_laser_secondary_force is "400" ["400"] custom cvar
-^7g_balance_laser_secondary_lifetime is "30" ["30"] custom cvar
-^7g_balance_laser_secondary_radius is "70" ["70"] custom cvar
-^7g_balance_laser_secondary_refire is "0.7" ["0.7"] custom cvar
-^7g_balance_laser_secondary_speed is "9000" ["9000"] custom cvar
-^7g_balance_minstanex_ammo is "10" ["10"] custom cvar
-^7g_balance_minstanex_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_minstanex_refire is "1" ["1"] custom cvar
-^7g_balance_nex_ammo is "5" ["5"] custom cvar
-^7g_balance_nex_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_nex_damage is "140" ["140"] custom cvar
-^7g_balance_nex_force is "600" ["600"] custom cvar
-^7g_balance_nex_refire is "1.5" ["1.5"] custom cvar
-^7g_balance_nixnex_ammo_cells is "15" ["15"] custom cvar
-^7g_balance_nixnex_ammo_nails is "45" ["45"] custom cvar
-^7g_balance_nixnex_ammo_rockets is "15" ["15"] custom cvar
-^7g_balance_nixnex_ammo_shells is "15" ["15"] custom cvar
-^7g_balance_nixnex_ammoincr_cells is "2" ["2"] custom cvar
-^7g_balance_nixnex_ammoincr_nails is "6" ["6"] custom cvar
-^7g_balance_nixnex_ammoincr_rockets is "2" ["2"] custom cvar
-^7g_balance_nixnex_ammoincr_shells is "2" ["2"] custom cvar
-^7g_balance_nixnex_incrtime is "1.6" ["1.6"] custom cvar
-^7g_balance_nixnex_roundtime is "25" ["25"] custom cvar
-^7g_balance_pause_armor_rot is "5" ["5"] custom cvar
-^7g_balance_pause_armor_rot_spawn is "10" ["10"] custom cvar
-^7g_balance_pause_health_regen is "5" ["5"] custom cvar
-^7g_balance_pause_health_regen_spawn is "0" ["0"] custom cvar
-^7g_balance_pause_health_rot is "5" ["5"] custom cvar
-^7g_balance_pause_health_rot_spawn is "10" ["10"] custom cvar
-^7g_balance_portal_health is "200" ["200"] custom cvar
-^7g_balance_portal_lifetime is "15" ["15"] custom cvar
-^7g_balance_porto_primary_ammo is "25" ["25"] custom cvar
-^7g_balance_porto_primary_lifetime is "30" ["30"] custom cvar
-^7g_balance_porto_primary_refire is "1.5" ["1.5"] custom cvar
-^7g_balance_porto_primary_speed is "2000" ["2000"] custom cvar
-^7g_balance_powerup_invincible_takedamage is "0.2" ["0.2"] custom cvar
-^7g_balance_powerup_invincible_time is "30" ["30"] custom cvar
-^7g_balance_powerup_strength_damage is "3" ["3"] custom cvar
-^7g_balance_powerup_strength_force is "4" ["4"] custom cvar
-^7g_balance_powerup_strength_selfdamage is "1.5" ["1.5"] custom cvar
-^7g_balance_powerup_strength_selfforce is "1.5" ["1.5"] custom cvar
-^7g_balance_powerup_strength_time is "30" ["30"] custom cvar
-^7g_balance_rocketlauncher_ammo is "3" ["3"] custom cvar
-^7g_balance_rocketlauncher_animtime is "0.3" ["0.3"] custom cvar
-^7g_balance_rocketlauncher_damage is "130" ["130"] custom cvar
-^7g_balance_rocketlauncher_detonatedelay is "0.2" ["0.2"] custom cvar
-^7g_balance_rocketlauncher_edgedamage is "50" ["50"] custom cvar
-^7g_balance_rocketlauncher_force is "600" ["600"] custom cvar
-^7g_balance_rocketlauncher_health is "30" ["30"] custom cvar
-^7g_balance_rocketlauncher_laserguided_allow_steal is "1" ["1"] custom cvar
-^7g_balance_rocketlauncher_laserguided_speed is "1000" ["1000"] custom cvar
-^7g_balance_rocketlauncher_laserguided_speedaccel is "0" ["0"] custom cvar
-^7g_balance_rocketlauncher_laserguided_speedstart is "1000" ["1000"] custom cvar
-^7g_balance_rocketlauncher_laserguided_turnrate is "0.75" ["0.75"] custom cvar
-^7g_balance_rocketlauncher_lifetime is "30" ["30"] custom cvar
-^7g_balance_rocketlauncher_radius is "170" ["170"] custom cvar
-^7g_balance_rocketlauncher_refire is "1" ["1"] custom cvar
-^7g_balance_rocketlauncher_speed is "850" ["850"] custom cvar
-^7g_balance_rocketlauncher_speedaccel is "0" ["0"] custom cvar
-^7g_balance_rocketlauncher_speedstart is "850" ["850"] custom cvar
-^7g_balance_rune_defense_combo_takedamage is "1.0" ["1.0"] custom cvar
-^7g_balance_rune_defense_takedamage is "0.5" ["0.5"] custom cvar
-^7g_balance_rune_regen_combo_hpmod is "0.9" ["0.9"] custom cvar
-^7g_balance_rune_regen_combo_limitmod is "1" ["1"] custom cvar
-^7g_balance_rune_regen_combo_regenrate is "0.5" ["0.5"] custom cvar
-^7g_balance_rune_regen_combo_rotrate is "1.5" ["1.5"] custom cvar
-^7g_balance_rune_regen_hpmod is "1.75" ["1.75"] custom cvar
-^7g_balance_rune_regen_limitmod is "1" ["1"] custom cvar
-^7g_balance_rune_regen_regenrate is "3.0" ["3.0"] custom cvar
-^7g_balance_rune_speed_atkrate is "0.66" ["0.66"] custom cvar
-^7g_balance_rune_speed_combo_atkrate is "1.2" ["1.2"] custom cvar
-^7g_balance_rune_speed_combo_jumpheight is "1.0" ["1.0"] custom cvar
-^7g_balance_rune_speed_combo_moverate is "0.9" ["0.9"] custom cvar
-^7g_balance_rune_speed_jumpheight is "1.4" ["1.4"] custom cvar
-^7g_balance_rune_speed_moverate is "1.25" ["1.25"] custom cvar
-^7g_balance_rune_strength_combo_damage is "0.9" ["0.9"] custom cvar
-^7g_balance_rune_strength_combo_force is "1.0" ["1.0"] custom cvar
-^7g_balance_rune_strength_damage is "2.0" ["2.0"] custom cvar
-^7g_balance_rune_strength_force is "1.5" ["1.5"] custom cvar
-^7g_balance_rune_vampire_absorb is "0.4" ["0.4"] custom cvar
-^7g_balance_rune_vampire_combo_absorb is "-0.1" ["-0.1"] custom cvar
-^7g_balance_rune_vampire_combo_minhealth is "40" ["40"] custom cvar
-^7g_balance_rune_vampire_maxhealth is "500" ["500"] custom cvar
-^7g_balance_seeker_flac_ammo is "0.5" ["0.5"] custom cvar
-^7g_balance_seeker_flac_animtime is "0.1" ["0.1"] custom cvar
-^7g_balance_seeker_flac_damage is "15" ["15"] custom cvar
-^7g_balance_seeker_flac_edgedamage is "10" ["10"] custom cvar
-^7g_balance_seeker_flac_force is "50" ["50"] custom cvar
-^7g_balance_seeker_flac_lifetime is "0.1" ["0.1"] custom cvar
-^7g_balance_seeker_flac_lifetime_rand is "0.05" ["0.05"] custom cvar
-^7g_balance_seeker_flac_radius is "100" ["100"] custom cvar
-^7g_balance_seeker_flac_refire is "0.1" ["0.1"] custom cvar
-^7g_balance_seeker_flac_speed is "3000" ["3000"] custom cvar
-^7g_balance_seeker_flac_spread is "0.4" ["0.4"] custom cvar
-^7g_balance_seeker_missile_accel is "1.05" ["1.05"] custom cvar
-^7g_balance_seeker_missile_activate_delay is "0.1" ["0.1"] custom cvar
-^7g_balance_seeker_missile_ammo is "2" ["2"] custom cvar
-^7g_balance_seeker_missile_animtime is "0.25" ["0.25"] custom cvar
-^7g_balance_seeker_missile_count is "4" ["4"] custom cvar
-^7g_balance_seeker_missile_damage is "40" ["40"] custom cvar
-^7g_balance_seeker_missile_decel is "0.9" ["0.9"] custom cvar
-^7g_balance_seeker_missile_delay is "0.25" ["0.25"] custom cvar
-^7g_balance_seeker_missile_edgedamage is "10" ["10"] custom cvar
-^7g_balance_seeker_missile_force is "250" ["250"] custom cvar
-^7g_balance_seeker_missile_lifetime is "15" ["15"] custom cvar
-^7g_balance_seeker_missile_proxy is "0" ["0"] custom cvar
-^7g_balance_seeker_missile_proxy_delay is "0.2" ["0.2"] custom cvar
-^7g_balance_seeker_missile_proxy_maxrange is "45" ["45"] custom cvar
-^7g_balance_seeker_missile_radius is "80" ["80"] custom cvar
-^7g_balance_seeker_missile_refire is "0.5" ["0.5"] custom cvar
-^7g_balance_seeker_missile_smart is "1" ["1"] custom cvar
-^7g_balance_seeker_missile_smart_mindist is "800" ["800"] custom cvar
-^7g_balance_seeker_missile_smart_trace_max is "2500" ["2500"] custom cvar
-^7g_balance_seeker_missile_smart_trace_min is "1000" ["1000"] custom cvar
-^7g_balance_seeker_missile_speed is "700" ["700"] custom cvar
-^7g_balance_seeker_missile_speed_max is "1250" ["1250"] custom cvar
-^7g_balance_seeker_missile_turnrate is "0.65" ["0.65"] custom cvar
-^7g_balance_seeker_tag_ammo is "1" ["1"] custom cvar
-^7g_balance_seeker_tag_animtime is "0.1" ["0.1"] custom cvar
-^7g_balance_seeker_tag_refire is "0.7" ["0.7"] custom cvar
-^7g_balance_seeker_tag_speed is "9000" ["9000"] custom cvar
-^7g_balance_selfdamagepercent is "0.6" ["0.6"] custom cvar
-^7g_balance_shotgun_primary_ammo is "1" ["1"] custom cvar
-^7g_balance_shotgun_primary_animtime is "0.2" ["0.2"] custom cvar
-^7g_balance_shotgun_primary_bullets is "5" ["5"] custom cvar
-^7g_balance_shotgun_primary_damage is "12" ["12"] custom cvar
-^7g_balance_shotgun_primary_force is "60" ["60"] custom cvar
-^7g_balance_shotgun_primary_refire is "0.5" ["0.5"] custom cvar
-^7g_balance_shotgun_primary_spread is "0.08" ["0.08"] custom cvar
-^7g_balance_shotgun_secondary_ammo is "1" ["1"] custom cvar
-^7g_balance_shotgun_secondary_animtime is "0.2" ["0.2"] custom cvar
-^7g_balance_shotgun_secondary_bullets is "5" ["5"] custom cvar
-^7g_balance_shotgun_secondary_damage is "12" ["12"] custom cvar
-^7g_balance_shotgun_secondary_force is "60" ["60"] custom cvar
-^7g_balance_shotgun_secondary_refire is "1.35" ["1.35"] custom cvar
-^7g_balance_shotgun_secondary_spread is "0.12" ["0.12"] custom cvar
-^7g_balance_teams is "0" ["0"] custom cvar
-^7g_balance_teams_complain is "0" ["0"] custom cvar
-^7g_balance_teams_force is "0" ["0"] custom cvar
-^7g_balance_teams_prevent_imbalance is "0" ["0"] custom cvar
-^7g_balance_uzi_first_ammo is "1" ["1"] custom cvar
-^7g_balance_uzi_first_damage is "30" ["30"] custom cvar
-^7g_balance_uzi_first_force is "50" ["50"] custom cvar
-^7g_balance_uzi_first_refire is "0.2" ["0.2"] custom cvar
-^7g_balance_uzi_first_spread is "0.01" ["0.01"] custom cvar
-^7g_balance_uzi_sustained_ammo is "1" ["1"] custom cvar
-^7g_balance_uzi_sustained_damage is "16" ["16"] custom cvar
-^7g_balance_uzi_sustained_force is "27" ["27"] custom cvar
-^7g_balance_uzi_sustained_refire is "0.1" ["0.1"] custom cvar
-^7g_balance_uzi_sustained_spread is "0.05" ["0.05"] custom cvar
-^7g_balance_weaponswitchdelay is "0.15" ["0.15"] custom cvar
-^7g_ban_default_bantime is "5400" ["5400"] custom cvar
-^7g_ban_default_masksize is "3" ["3"] custom cvar
-^7g_ban_sync_interval is "5" ["5"] custom cvar
-^7g_ban_sync_trusted_servers is "" [""] custom cvar
-^7g_ban_sync_uri is "" [""] custom cvar
-^7g_banned_list is "" [""] custom cvar
-^7g_bugrigs is "0" ["0"] custom cvar
-^7g_bugrigs_accel is "800" ["800"] custom cvar
-^7g_bugrigs_air_steering is "1" ["1"] custom cvar
-^7g_bugrigs_angle_smoothing is "5" ["5"] custom cvar
-^7g_bugrigs_friction_air is "0.00001" ["0.00001"] custom cvar
-^7g_bugrigs_friction_brake is "950" ["950"] custom cvar
-^7g_bugrigs_friction_floor is "50" ["50"] custom cvar
-^7g_bugrigs_planar_movement is "1" ["1"] custom cvar
-^7g_bugrigs_planar_movement_car_jumping is "1" ["1"] custom cvar
-^7g_bugrigs_reverse_speeding is "1" ["1"] custom cvar
-^7g_bugrigs_reverse_spinning is "1" ["1"] custom cvar
-^7g_bugrigs_reverse_stopping is "1" ["1"] custom cvar
-^7g_bugrigs_speed_pow is "2" ["2"] custom cvar
-^7g_bugrigs_speed_ref is "400" ["400"] custom cvar
-^7g_bugrigs_steer is "1" ["1"] custom cvar
-^7g_campaign is "0" ["0"] custom cvar
-^7g_campaign_index is "0" ["0"] custom cvar
-^7g_campaign_name is "" [""] custom cvar
-^7g_campaign_skill is "0" ["0"] custom cvar
-^7g_casings is "0" ["0"] custom cvar
-^7g_changeteam_banned is "0" ["0"] custom cvar
-^7g_changeteam_fragtransfer is "0" ["0"] custom cvar
-^7g_chat_flood_burst is "2" ["2"] custom cvar
-^7g_chat_flood_burst_team is "2" ["2"] custom cvar
-^7g_chat_flood_lmax is "2" ["2"] custom cvar
-^7g_chat_flood_lmax_team is "2" ["2"] custom cvar
-^7g_chat_flood_notify_flooder is "1" ["1"] custom cvar
-^7g_chat_flood_spl is "3" ["3"] custom cvar
-^7g_chat_flood_spl_team is "1" ["1"] custom cvar
-^7g_chat_nospectators is "0" ["0"] custom cvar
-^7g_chat_teamcolors is "0" ["0"] custom cvar
-^7g_cloaked is "0" ["0"] custom cvar
-^7g_configversion is "1" ["0"] custom cvar
-^7g_ctf is "0" ["0"] custom cvar
-^7g_ctf_allow_drop is "0" ["0"] custom cvar
-^7g_ctf_capture_limit is "-1" ["-1"] custom cvar
-^7g_ctf_flag_returntime is "30" ["30"] custom cvar
-^7g_ctf_flagcarrier_selfdamage is "1" ["1"] custom cvar
-^7g_ctf_flagcarrier_selfforce is "1" ["1"] custom cvar
-^7g_ctf_flagpenalty_drop is "2" ["2"] custom cvar
-^7g_ctf_flagpenalty_returned is "1" ["1"] custom cvar
-^7g_ctf_flagpenalty_suicidedrop is "2" ["2"] custom cvar
-^7g_ctf_flagscore_capture is "28" ["28"] custom cvar
-^7g_ctf_flagscore_kill is "2" ["2"] custom cvar
-^7g_ctf_flagscore_pickup_base is "-3" ["-3"] custom cvar
-^7g_ctf_flagscore_pickup_dropped_early is "2" ["2"] custom cvar
-^7g_ctf_flagscore_pickup_dropped_late is "2" ["2"] custom cvar
-^7g_ctf_flagscore_return is "5" ["5"] custom cvar
-^7g_ctf_flagscore_return_by_killer is "6" ["6"] custom cvar
-^7g_ctf_flagscore_return_rogue is "10" ["10"] custom cvar
-^7g_ctf_flagscore_return_rogue_by_killer is "10" ["10"] custom cvar
-^7g_ctf_fullbrightflags is "1" ["1"] custom cvar
-^7g_ctf_ignore_frags is "0" ["0"] custom cvar
-^7g_ctf_personalpenalty_drop is "2" ["2"] custom cvar
-^7g_ctf_personalpenalty_returned is "1" ["1"] custom cvar
-^7g_ctf_personalpenalty_suicidedrop is "2" ["2"] custom cvar
-^7g_ctf_personalscore_capture is "28" ["28"] custom cvar
-^7g_ctf_personalscore_kill is "2" ["2"] custom cvar
-^7g_ctf_personalscore_pickup_base is "-3" ["-3"] custom cvar
-^7g_ctf_personalscore_pickup_dropped_early is "2" ["2"] custom cvar
-^7g_ctf_personalscore_pickup_dropped_late is "2" ["2"] custom cvar
-^7g_ctf_personalscore_return is "5" ["5"] custom cvar
-^7g_ctf_personalscore_return_by_killer is "6" ["6"] custom cvar
-^7g_ctf_personalscore_return_rogue is "10" ["10"] custom cvar
-^7g_ctf_personalscore_return_rogue_by_killer is "10" ["10"] custom cvar
-^7g_ctf_respawn_delay is "0" ["0"] custom cvar
-^7g_ctf_respawn_waves is "0" ["0"] custom cvar
-^7g_ctf_reverse is "0" ["0"] custom cvar
-^7g_ctf_shield_force is "100" ["100"] custom cvar
-^7g_ctf_shield_max_ratio is "0" ["0"] custom cvar
-^7g_ctf_shield_min_negscore is "20" ["20"] custom cvar
-^7g_ctf_win_mode is "0" ["0"] custom cvar
-^7g_dm is "1" ["1"] custom cvar
-^7g_dm_respawn_delay is "0" ["0"] custom cvar
-^7g_dm_respawn_waves is "0" ["0"] custom cvar
-^7g_dom_respawn_delay is "0" ["0"] custom cvar
-^7g_dom_respawn_waves is "0" ["0"] custom cvar
-^7g_domination is "0" ["0"] custom cvar
-^7g_domination_default_teams is "2" ["2"] custom cvar
-^7g_domination_disable_frags is "0" ["0"] custom cvar
-^7g_domination_point_amt is "0" ["0"] custom cvar
-^7g_domination_point_capturetime is "0.1" ["0.1"] custom cvar
-^7g_domination_point_glow is "0" ["0"] custom cvar
-^7g_domination_point_limit is "-1" ["-1"] custom cvar
-^7g_domination_point_rate is "0" ["0"] custom cvar
-^7g_footsteps is "0" ["0"] custom cvar
-^7g_forced_respawn is "0" ["0"] custom cvar
-^7g_friendlyfire is "0.2" ["0.2"] custom cvar
-^7g_fullbrightitems is "0" ["0"] custom cvar
-^7g_fullbrightplayers is "0" ["0"] custom cvar
-^7g_grappling_hook is "0" ["0"] custom cvar
-^7g_grappling_hook_tarzan is "2" ["2"] custom cvar
-^7g_jump_grunt is "0" ["0"] custom cvar
-^7g_keyhunt is "0" ["0"] custom cvar
-^7g_keyhunt_point_limit is "-1" ["-1"] custom cvar
-^7g_keyhunt_teams is "0" ["0"] custom cvar
-^7g_keyhunt_teams_override is "0" ["0"] custom cvar
-^7g_laserguided_missile is "0" ["0"] custom cvar
-^7g_lms is "0" ["0"] custom cvar
-^7g_lms_campcheck_damage is "100" ["100"] custom cvar
-^7g_lms_campcheck_distance is "1800" ["1800"] custom cvar
-^7g_lms_campcheck_interval is "10" ["10"] custom cvar
-^7g_lms_campcheck_message is "^1Don't camp!" ["^1Don't camp!"] custom cvar
-^7g_lms_join_anytime is "1" ["1"] custom cvar
-^7g_lms_last_join is "3" ["3"] custom cvar
-^7g_lms_lives_override is "-1" ["-1"] custom cvar
-^7g_lms_regenerate is "0" ["0"] custom cvar
-^7g_lms_respawn_delay is "0" ["0"] custom cvar
-^7g_lms_respawn_waves is "0" ["0"] custom cvar
-^7g_lms_start_ammo_cells is "50" ["50"] custom cvar
-^7g_lms_start_ammo_nails is "150" ["150"] custom cvar
-^7g_lms_start_ammo_rockets is "50" ["50"] custom cvar
-^7g_lms_start_ammo_shells is "50" ["50"] custom cvar
-^7g_lms_start_armor is "100" ["100"] custom cvar
-^7g_lms_start_health is "250" ["250"] custom cvar
-^7g_maplist is "aggressor aneurysm basement basementctf bleach bloodprison bloodprisonctf bluesky darkzone dieselpower dismal downer evilspace farewell final_rage reslimed ruiner runningman_1on1remix runningman runningmanctf silvercity skyway slimepit soylent starship stormkeep strength toxic warfare" ["aggressor aneurysm basement basementctf bleach bloodprison bloodprisonctf bluesky darkzone dieselpower dismal downer evilspace farewell final_rage reslimed ruiner runningman_1on1remix runningman runningmanctf silvercity skyway slimepit soylent starship stormkeep strength toxic warfare"] custom cvar
-^7g_maplist_allow_hidden is "1" ["1"] custom cvar
-^7g_maplist_check_waypoints is "0" ["0"] custom cvar
-^7g_maplist_index is "0" ["0"] custom cvar
-^7g_maplist_mostrecent is "" [""] custom cvar
-^7g_maplist_mostrecent_count is "3" ["3"] custom cvar
-^7g_maplist_selectrandom is "0" ["0"] custom cvar
-^7g_maplist_shuffle is "1" ["1"] custom cvar
-^7g_maplist_textonly is "0" ["0"] custom cvar
-^7g_maplist_votable is "5" ["5"] custom cvar
-^7g_maplist_votable_abstain is "0" ["0"] custom cvar
-^7g_maplist_votable_keeptwotime is "15" ["15"] custom cvar
-^7g_maplist_votable_nodetail is "1" ["1"] custom cvar
-^7g_maplist_votable_screenshot_dir is "maps" ["maps"] custom cvar
-^7g_maplist_votable_suggestions is "2" ["2"] custom cvar
-^7g_maplist_votable_suggestions_override_mostrecent is "0" ["0"] custom cvar
-^7g_maplist_votable_timeout is "30" ["30"] custom cvar
-^7g_maxplayers is "0" ["0"] custom cvar
-^7g_maxplayers_spectator_blocktime is "5" ["5"] custom cvar
-^7g_maxpushtime is "8.0" ["8.0"] custom cvar
-^7g_midair is "0" ["0"] custom cvar
-^7g_midair_shieldtime is "0.3" ["0.3"] custom cvar
-^7g_minstagib is "0" ["0"] custom cvar
-^7g_minstagib_ammo_drop is "5" ["5"] custom cvar
-^7g_minstagib_ammo_start is "10" ["10"] custom cvar
-^7g_minstagib_extralives is "2" ["2"] custom cvar
-^7g_minstagib_invis_alpha is "0.05" ["0.05"] custom cvar
-^7g_minstagib_speed_jumpheight is "1.8" ["1.8"] custom cvar
-^7g_minstagib_speed_moverate is "1.25" ["1.25"] custom cvar
-^7g_mirrordamage is "0.5" ["0.5"] custom cvar
-^7g_nexuizversion is "2.4svn" ["2.4svn"] custom cvar
-^7g_nixnex is "0" ["0"] custom cvar
-^7g_nixnex_with_laser is "0" ["0"] custom cvar
-^7g_norecoil is "0" ["0"] custom cvar
-^7g_onslaught is "0" ["0"] custom cvar
-^7g_onslaught_cp_health is "1000" ["1000"] custom cvar
-^7g_onslaught_gen_health is "10000" ["10000"] custom cvar
-^7g_pickup_armorlarge is "100" ["100"] custom cvar
-^7g_pickup_armorlarge_max is "999" ["999"] custom cvar
-^7g_pickup_armormedium is "25" ["25"] custom cvar
-^7g_pickup_armormedium_max is "999" ["999"] custom cvar
-^7g_pickup_armorsmall is "5" ["5"] custom cvar
-^7g_pickup_armorsmall_max is "999" ["999"] custom cvar
-^7g_pickup_cells is "25" ["25"] custom cvar
-^7g_pickup_cells_max is "999" ["999"] custom cvar
-^7g_pickup_healthlarge is "50" ["50"] custom cvar
-^7g_pickup_healthlarge_max is "999" ["999"] custom cvar
-^7g_pickup_healthmedium is "25" ["25"] custom cvar
-^7g_pickup_healthmedium_max is "999" ["999"] custom cvar
-^7g_pickup_healthmega is "100" ["100"] custom cvar
-^7g_pickup_healthmega_max is "999" ["999"] custom cvar
-^7g_pickup_healthsmall is "5" ["5"] custom cvar
-^7g_pickup_healthsmall_max is "999" ["999"] custom cvar
-^7g_pickup_items is "1" ["1"] custom cvar
-^7g_pickup_nails is "120" ["120"] custom cvar
-^7g_pickup_nails_max is "999" ["999"] custom cvar
-^7g_pickup_respawntime_ammo is "15" ["15"] custom cvar
-^7g_pickup_respawntime_long is "30" ["30"] custom cvar
-^7g_pickup_respawntime_medium is "20" ["20"] custom cvar
-^7g_pickup_respawntime_powerup is "120" ["120"] custom cvar
-^7g_pickup_respawntime_short is "15" ["15"] custom cvar
-^7g_pickup_respawntime_weapon is "15" ["15"] custom cvar
-^7g_pickup_rockets is "15" ["15"] custom cvar
-^7g_pickup_rockets_max is "999" ["999"] custom cvar
-^7g_pickup_shells is "15" ["15"] custom cvar
-^7g_pickup_shells_max is "999" ["999"] custom cvar
-^7g_player_alpha is "1" ["1"] custom cvar
-^7g_player_brightness is "0" ["0"] custom cvar
-^7g_powerup_shield is "1" ["1"] custom cvar
-^7g_powerup_strength is "1" ["1"] custom cvar
-^7g_powerup_superhealth is "1" ["1"] custom cvar
-^7g_projectiles_newton_style is "2" ["2"] custom cvar
-^7g_race is "0" ["0"] custom cvar
-^7g_race_laps_limit is "-1" ["-1"] custom cvar
-^7g_race_qualifying is "2" ["2"] custom cvar
-^7g_race_teams is "0" ["0"] custom cvar
-^7g_respawn_delay is "2" ["2"] custom cvar
-^7g_respawn_mapsettings is "1" ["1"] custom cvar
-^7g_respawn_waves is "0" ["0"] custom cvar
-^7g_rune_respawn_delay is "0" ["0"] custom cvar
-^7g_rune_respawn_waves is "0" ["0"] custom cvar
-^7g_runematch is "0" ["0"] custom cvar
-^7g_runematch_allow_same is "0" ["0"] custom cvar
-^7g_runematch_drop_runes_max is "2" ["2"] custom cvar
-^7g_runematch_frags_killed_runeholder is "5" ["5"] custom cvar
-^7g_runematch_frags_killedby_runeholder is "4" ["4"] custom cvar
-^7g_runematch_frags_norune is "0" ["0"] custom cvar
-^7g_runematch_point_limit is "-1" ["-1"] custom cvar
-^7g_runematch_pointamt is "1" ["1"] custom cvar
-^7g_runematch_pointrate is "5" ["5"] custom cvar
-^7g_runematch_respawntime is "15" ["15"] custom cvar
-^7g_runematch_rune_alpha is "0.78" ["0.78"] custom cvar
-^7g_runematch_rune_color_strength is "1.0" ["1.0"] custom cvar
-^7g_runematch_rune_effects is "544" ["544"] custom cvar
-^7g_runematch_rune_glow_color is "0" ["0"] custom cvar
-^7g_runematch_rune_glow_size is "0" ["0"] custom cvar
-^7g_runematch_shuffletime is "30" ["30"] custom cvar
-^7g_shocknex is "0" ["0"] custom cvar
-^7g_shootfromcenter is "0" ["0"] custom cvar
-^7g_shootfromeye is "0" ["0"] custom cvar
-^7g_spawn_furthest is "0.5" ["0.5"] custom cvar
-^7g_spawnpoints_auto_move_out_of_solid is "0" ["0"] custom cvar
-^7g_spawnpoints_autodrop is "0" ["0"] custom cvar
-^7g_spawnshieldtime is "0" ["0"] custom cvar
-^7g_spawnsound is "1" ["1"] custom cvar
-^7g_start_ammo_cells is "0" ["0"] custom cvar
-^7g_start_ammo_nails is "0" ["0"] custom cvar
-^7g_start_ammo_rockets is "0" ["0"] custom cvar
-^7g_start_ammo_shells is "50" ["50"] custom cvar
-^7g_start_delay is "15" ["15"] custom cvar
-^7g_start_weapon_crylink is "0" ["0"] custom cvar
-^7g_start_weapon_electro is "0" ["0"] custom cvar
-^7g_start_weapon_grenadelauncher is "0" ["0"] custom cvar
-^7g_start_weapon_hagar is "0" ["0"] custom cvar
-^7g_start_weapon_hlac is "0" ["0"] custom cvar
-^7g_start_weapon_hook is "0" ["0"] custom cvar
-^7g_start_weapon_laser is "1" ["1"] custom cvar
-^7g_start_weapon_minstanex is "0" ["0"] custom cvar
-^7g_start_weapon_nex is "0" ["0"] custom cvar
-^7g_start_weapon_porto is "0" ["0"] custom cvar
-^7g_start_weapon_rocketlauncher is "0" ["0"] custom cvar
-^7g_start_weapon_seeker is "0" ["0"] custom cvar
-^7g_start_weapon_shotgun is "1" ["1"] custom cvar
-^7g_start_weapon_uzi is "0" ["0"] custom cvar
-^7g_tdm is "0" ["0"] custom cvar
-^7g_tdm_respawn_delay is "0" ["0"] custom cvar
-^7g_tdm_respawn_waves is "0" ["0"] custom cvar
-^7g_tdm_teams is "2" ["2"] custom cvar
-^7g_teamdamage_resetspeed is "30" ["30"] custom cvar
-^7g_teamdamage_threshold is "50" ["50"] custom cvar
-^7g_throughfloor is "1" ["1"] custom cvar
-^7g_touchexplode is "0" ["0"] custom cvar
-^7g_touchexplode_damage is "10" ["10"] custom cvar
-^7g_touchexplode_edgedamage is "0" ["0"] custom cvar
-^7g_touchexplode_force is "150" ["150"] custom cvar
-^7g_touchexplode_radius is "50" ["50"] custom cvar
-^7g_turrets is "1" ["1"] custom cvar
-^7g_turrets_aimidle_delay is "5" ["5"] custom cvar
-^7g_turrets_nofire is "0" ["0"] custom cvar
-^7g_turrets_reloadcvars is "1" ["1"] custom cvar
-^7g_turrets_targetscan_mindelay is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_ewheel_std_aim_firetolerance_angle is "16" ["16"] custom cvar
-^7g_turrets_unit_ewheel_std_aim_firetolerance_dist is "200" ["200"] custom cvar
-^7g_turrets_unit_ewheel_std_aim_maxpitch is "45" ["45"] custom cvar
-^7g_turrets_unit_ewheel_std_aim_maxrot is "20" ["20"] custom cvar
-^7g_turrets_unit_ewheel_std_aim_speed is "90" ["90"] custom cvar
-^7g_turrets_unit_ewheel_std_ammo is "500" ["500"] custom cvar
-^7g_turrets_unit_ewheel_std_ammo_max is "4000" ["4000"] custom cvar
-^7g_turrets_unit_ewheel_std_ammo_recharge is "100" ["100"] custom cvar
-^7g_turrets_unit_ewheel_std_health is "200" ["200"] custom cvar
-^7g_turrets_unit_ewheel_std_respawntime is "30" ["30"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_dmg is "10" ["10"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_force is "20" ["20"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_radius is "50" ["50"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_refire is "0.15" ["0.15"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_speed is "7000" ["7000"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_spread is "0.025" ["0.025"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_volly is "2" ["2"] custom cvar
-^7g_turrets_unit_ewheel_std_shot_volly_refire is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_ewheel_std_target_range is "6000" ["6000"] custom cvar
-^7g_turrets_unit_ewheel_std_target_range_fire is "4000" ["4000"] custom cvar
-^7g_turrets_unit_ewheel_std_target_range_min is "50" ["50"] custom cvar
-^7g_turrets_unit_ewheel_std_target_range_optimal is "1000" ["1000"] custom cvar
-^7g_turrets_unit_ewheel_std_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_ewheel_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_ewheel_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_ewheel_std_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_ewheel_std_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_ewheel_std_track_type is "1" ["1"] custom cvar
-^7g_turrets_unit_ewheel_turnrate is "180" ["180"] custom cvar
-^7g_turrets_unit_flac_std_aim_firetolerance_angle is "5" ["5"] custom cvar
-^7g_turrets_unit_flac_std_aim_firetolerance_dist is "200" ["200"] custom cvar
-^7g_turrets_unit_flac_std_aim_maxpitch is "35" ["35"] custom cvar
-^7g_turrets_unit_flac_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_flac_std_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_flac_std_ammo is "500" ["500"] custom cvar
-^7g_turrets_unit_flac_std_ammo_max is "1000" ["1000"] custom cvar
-^7g_turrets_unit_flac_std_ammo_recharge is "100" ["100"] custom cvar
-^7g_turrets_unit_flac_std_health is "700" ["700"] custom cvar
-^7g_turrets_unit_flac_std_respawntime is "90" ["90"] custom cvar
-^7g_turrets_unit_flac_std_shot_dmg is "35" ["35"] custom cvar
-^7g_turrets_unit_flac_std_shot_force is "50" ["50"] custom cvar
-^7g_turrets_unit_flac_std_shot_radius is "250" ["250"] custom cvar
-^7g_turrets_unit_flac_std_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_flac_std_shot_speed is "6000" ["6000"] custom cvar
-^7g_turrets_unit_flac_std_shot_spread is "0.07" ["0.07"] custom cvar
-^7g_turrets_unit_flac_std_shot_volly is "4" ["4"] custom cvar
-^7g_turrets_unit_flac_std_shot_volly_refire is "1.5" ["1.5"] custom cvar
-^7g_turrets_unit_flac_std_target_range is "4000" ["4000"] custom cvar
-^7g_turrets_unit_flac_std_target_range_fire is "3500" ["3500"] custom cvar
-^7g_turrets_unit_flac_std_target_range_min is "500" ["500"] custom cvar
-^7g_turrets_unit_flac_std_target_range_optimal is "1000" ["1000"] custom cvar
-^7g_turrets_unit_flac_std_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_flac_std_target_select_missilebias is "1" ["1"] custom cvar
-^7g_turrets_unit_flac_std_target_select_playerbias is "0" ["0"] custom cvar
-^7g_turrets_unit_flac_std_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_flac_std_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_flac_std_track_accel_pitch is "0.45" ["0.45"] custom cvar
-^7g_turrets_unit_flac_std_track_accel_rot is "0.65" ["0.65"] custom cvar
-^7g_turrets_unit_flac_std_track_blendrate is "0.15" ["0.15"] custom cvar
-^7g_turrets_unit_flac_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_fusreac_std_ammo is "0" ["0"] custom cvar
-^7g_turrets_unit_fusreac_std_ammo_max is "250" ["250"] custom cvar
-^7g_turrets_unit_fusreac_std_ammo_recharge is "250" ["250"] custom cvar
-^7g_turrets_unit_fusreac_std_health is "700" ["700"] custom cvar
-^7g_turrets_unit_fusreac_std_respawntime is "90" ["90"] custom cvar
-^7g_turrets_unit_fusreac_std_shot_dmg is "50" ["50"] custom cvar
-^7g_turrets_unit_fusreac_std_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_fusreac_std_target_range is "1024" ["1024"] custom cvar
-^7g_turrets_unit_fusreac_std_target_range_fire is "1024" ["1024"] custom cvar
-^7g_turrets_unit_fusreac_std_target_range_min is "1" ["1"] custom cvar
-^7g_turrets_unit_hellion_std_aim_firetolerance_angle is "25" ["25"] custom cvar
-^7g_turrets_unit_hellion_std_aim_firetolerance_dist is "200" ["200"] custom cvar
-^7g_turrets_unit_hellion_std_aim_maxpitch is "20" ["20"] custom cvar
-^7g_turrets_unit_hellion_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_hellion_std_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_hellion_std_ammo is "100" ["100"] custom cvar
-^7g_turrets_unit_hellion_std_ammo_max is "200" ["200"] custom cvar
-^7g_turrets_unit_hellion_std_ammo_recharge is "50" ["50"] custom cvar
-^7g_turrets_unit_hellion_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_hellion_std_respawntime is "90" ["90"] custom cvar
-^7g_turrets_unit_hellion_std_shot_dmg is "50" ["50"] custom cvar
-^7g_turrets_unit_hellion_std_shot_force is "250" ["250"] custom cvar
-^7g_turrets_unit_hellion_std_shot_radius is "100" ["100"] custom cvar
-^7g_turrets_unit_hellion_std_shot_refire is "0.15" ["0.15"] custom cvar
-^7g_turrets_unit_hellion_std_shot_speed is "750" ["750"] custom cvar
-^7g_turrets_unit_hellion_std_shot_speed_gain is "1.025" ["1.025"] custom cvar
-^7g_turrets_unit_hellion_std_shot_speed_max is "5000" ["5000"] custom cvar
-^7g_turrets_unit_hellion_std_shot_spread is "0.08" ["0.08"] custom cvar
-^7g_turrets_unit_hellion_std_shot_volly is "2" ["2"] custom cvar
-^7g_turrets_unit_hellion_std_shot_volly_refire is "4" ["4"] custom cvar
-^7g_turrets_unit_hellion_std_target_range is "6000" ["6000"] custom cvar
-^7g_turrets_unit_hellion_std_target_range_fire is "5000" ["5000"] custom cvar
-^7g_turrets_unit_hellion_std_target_range_min is "150" ["150"] custom cvar
-^7g_turrets_unit_hellion_std_target_range_optimal is "4500" ["4500"] custom cvar
-^7g_turrets_unit_hellion_std_target_select_anglebias is "0.01" ["0.01"] custom cvar
-^7g_turrets_unit_hellion_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_hellion_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_hellion_std_target_select_rangebias is "0.7" ["0.7"] custom cvar
-^7g_turrets_unit_hellion_std_target_select_samebias is "0.01" ["0.01"] custom cvar
-^7g_turrets_unit_hellion_std_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_hellion_std_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_hellion_std_track_blendrate is "0.75" ["0.75"] custom cvar
-^7g_turrets_unit_hellion_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_hk_std_aim_firetolerance_angle is "25" ["25"] custom cvar
-^7g_turrets_unit_hk_std_aim_firetolerance_dist is "250" ["250"] custom cvar
-^7g_turrets_unit_hk_std_aim_maxpitch is "20" ["20"] custom cvar
-^7g_turrets_unit_hk_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_hk_std_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_hk_std_ammo is "120" ["120"] custom cvar
-^7g_turrets_unit_hk_std_ammo_max is "240" ["240"] custom cvar
-^7g_turrets_unit_hk_std_ammo_recharge is "16" ["16"] custom cvar
-^7g_turrets_unit_hk_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_hk_std_respawntime is "90" ["90"] custom cvar
-^7g_turrets_unit_hk_std_shot_dmg is "120" ["120"] custom cvar
-^7g_turrets_unit_hk_std_shot_force is "600" ["600"] custom cvar
-^7g_turrets_unit_hk_std_shot_radius is "200" ["200"] custom cvar
-^7g_turrets_unit_hk_std_shot_refire is "5" ["5"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed is "500" ["500"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed_accel is "1.025" ["1.025"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed_accel2 is "1.05" ["1.05"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed_decel is "0.9" ["0.9"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed_max is "1000" ["1000"] custom cvar
-^7g_turrets_unit_hk_std_shot_speed_turnrate is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_hk_std_shot_spread is "0" ["0"] custom cvar
-^7g_turrets_unit_hk_std_shot_volly is "0" ["0"] custom cvar
-^7g_turrets_unit_hk_std_shot_volly_refire is "0" ["0"] custom cvar
-^7g_turrets_unit_hk_std_target_range is "6000" ["6000"] custom cvar
-^7g_turrets_unit_hk_std_target_range_fire is "5000" ["5000"] custom cvar
-^7g_turrets_unit_hk_std_target_range_min is "220" ["220"] custom cvar
-^7g_turrets_unit_hk_std_target_range_optimal is "5000" ["5000"] custom cvar
-^7g_turrets_unit_hk_std_target_select_anglebias is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_hk_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_hk_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_hk_std_target_select_rangebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_hk_std_target_select_samebias is "0.01" ["0.01"] custom cvar
-^7g_turrets_unit_hk_std_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_hk_std_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_hk_std_track_blendrate is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_hk_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_machinegun_std_aim_firetolerance_angle is "16" ["16"] custom cvar
-^7g_turrets_unit_machinegun_std_aim_firetolerance_dist is "75" ["75"] custom cvar
-^7g_turrets_unit_machinegun_std_aim_maxpitch is "25" ["25"] custom cvar
-^7g_turrets_unit_machinegun_std_aim_maxrot is "400" ["400"] custom cvar
-^7g_turrets_unit_machinegun_std_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_machinegun_std_ammo is "200" ["200"] custom cvar
-^7g_turrets_unit_machinegun_std_ammo_max is "2000" ["2000"] custom cvar
-^7g_turrets_unit_machinegun_std_ammo_recharge is "95" ["95"] custom cvar
-^7g_turrets_unit_machinegun_std_health is "256" ["256"] custom cvar
-^7g_turrets_unit_machinegun_std_respawntime is "60" ["60"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_dmg is "12" ["12"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_force is "15" ["15"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_radius is "0" ["0"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_speed is "0" ["0"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_spread is "0.025" ["0.025"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_volly is "5" ["5"] custom cvar
-^7g_turrets_unit_machinegun_std_shot_volly_refire is "1.5" ["1.5"] custom cvar
-^7g_turrets_unit_machinegun_std_target_range is "4500" ["4500"] custom cvar
-^7g_turrets_unit_machinegun_std_target_range_fire is "4000" ["4000"] custom cvar
-^7g_turrets_unit_machinegun_std_target_range_min is "2" ["2"] custom cvar
-^7g_turrets_unit_machinegun_std_target_range_optimal is "2500" ["2500"] custom cvar
-^7g_turrets_unit_machinegun_std_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_machinegun_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_machinegun_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_machinegun_std_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_machinegun_std_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_machinegun_std_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_machinegun_std_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_machinegun_std_track_blendrate is "0.2" ["0.2"] custom cvar
-^7g_turrets_unit_machinegun_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_mlrs_std_aim_firetolerance_angle is "15" ["15"] custom cvar
-^7g_turrets_unit_mlrs_std_aim_firetolerance_dist is "300" ["300"] custom cvar
-^7g_turrets_unit_mlrs_std_aim_maxpitch is "15" ["15"] custom cvar
-^7g_turrets_unit_mlrs_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_mlrs_std_aim_speed is "180" ["180"] custom cvar
-^7g_turrets_unit_mlrs_std_ammo is "300" ["300"] custom cvar
-^7g_turrets_unit_mlrs_std_ammo_max is "300" ["300"] custom cvar
-^7g_turrets_unit_mlrs_std_ammo_recharge is "50" ["50"] custom cvar
-^7g_turrets_unit_mlrs_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_mlrs_std_respawntime is "60" ["60"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_dmg is "50" ["50"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_force is "50" ["50"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_radius is "180" ["180"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_speed is "2000" ["2000"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_spread is "0.05" ["0.05"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_volly is "3" ["3"] custom cvar
-^7g_turrets_unit_mlrs_std_shot_volly_refire is "1.5" ["1.5"] custom cvar
-^7g_turrets_unit_mlrs_std_target_range is "4000" ["4000"] custom cvar
-^7g_turrets_unit_mlrs_std_target_range_fire is "3000" ["3000"] custom cvar
-^7g_turrets_unit_mlrs_std_target_range_min is "500" ["500"] custom cvar
-^7g_turrets_unit_mlrs_std_target_range_optimal is "2000" ["2000"] custom cvar
-^7g_turrets_unit_mlrs_std_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_mlrs_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_mlrs_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_mlrs_std_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_mlrs_std_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_mlrs_std_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_mlrs_std_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_mlrs_std_track_blendrate is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_mlrs_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_phaser_std_aim_firetolerance_angle is "20" ["20"] custom cvar
-^7g_turrets_unit_phaser_std_aim_firetolerance_dist is "100" ["100"] custom cvar
-^7g_turrets_unit_phaser_std_aim_maxpitch is "30" ["30"] custom cvar
-^7g_turrets_unit_phaser_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_phaser_std_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_phaser_std_ammo is "1000" ["1000"] custom cvar
-^7g_turrets_unit_phaser_std_ammo_max is "2000" ["2000"] custom cvar
-^7g_turrets_unit_phaser_std_ammo_recharge is "100" ["100"] custom cvar
-^7g_turrets_unit_phaser_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_phaser_std_respawntime is "90" ["90"] custom cvar
-^7g_turrets_unit_phaser_std_shot_dmg is "100" ["100"] custom cvar
-^7g_turrets_unit_phaser_std_shot_force is "5" ["5"] custom cvar
-^7g_turrets_unit_phaser_std_shot_radius is "8" ["8"] custom cvar
-^7g_turrets_unit_phaser_std_shot_refire is "4" ["4"] custom cvar
-^7g_turrets_unit_phaser_std_shot_speed is "4" ["4"] custom cvar
-^7g_turrets_unit_phaser_std_shot_spread is "0" ["0"] custom cvar
-^7g_turrets_unit_phaser_std_shot_volly is "0" ["0"] custom cvar
-^7g_turrets_unit_phaser_std_shot_volly_refire is "5" ["5"] custom cvar
-^7g_turrets_unit_phaser_std_target_range is "3000" ["3000"] custom cvar
-^7g_turrets_unit_phaser_std_target_range_fire is "3000" ["3000"] custom cvar
-^7g_turrets_unit_phaser_std_target_range_min is "0" ["0"] custom cvar
-^7g_turrets_unit_phaser_std_target_range_optimal is "1500" ["1500"] custom cvar
-^7g_turrets_unit_phaser_std_target_select_anglebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_phaser_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_phaser_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_phaser_std_target_select_rangebias is "0.85" ["0.85"] custom cvar
-^7g_turrets_unit_phaser_std_target_select_samebias is "0" ["0"] custom cvar
-^7g_turrets_unit_phaser_std_track_accel_pitch is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_phaser_std_track_accel_rot is "0.9" ["0.9"] custom cvar
-^7g_turrets_unit_phaser_std_track_blendrate is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_phaser_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_plasma_dual_aim_firetolerance_angle is "16" ["16"] custom cvar
-^7g_turrets_unit_plasma_dual_aim_firetolerance_dist is "250" ["250"] custom cvar
-^7g_turrets_unit_plasma_dual_aim_maxpitch is "30" ["30"] custom cvar
-^7g_turrets_unit_plasma_dual_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_plasma_dual_aim_speed is "100" ["100"] custom cvar
-^7g_turrets_unit_plasma_dual_ammo is "500" ["500"] custom cvar
-^7g_turrets_unit_plasma_dual_ammo_max is "800" ["800"] custom cvar
-^7g_turrets_unit_plasma_dual_ammo_recharge is "40" ["40"] custom cvar
-^7g_turrets_unit_plasma_dual_health is "500" ["500"] custom cvar
-^7g_turrets_unit_plasma_dual_respawntime is "60" ["60"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_dmg is "80" ["80"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_force is "100" ["100"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_radius is "150" ["150"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_speed is "2000" ["2000"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_spread is "0.015" ["0.015"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_volly is "2" ["2"] custom cvar
-^7g_turrets_unit_plasma_dual_shot_volly_refire is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_plasma_dual_target_range is "3000" ["3000"] custom cvar
-^7g_turrets_unit_plasma_dual_target_range_fire is "2500" ["2500"] custom cvar
-^7g_turrets_unit_plasma_dual_target_range_min is "100" ["100"] custom cvar
-^7g_turrets_unit_plasma_dual_target_range_optimal is "2000" ["2000"] custom cvar
-^7g_turrets_unit_plasma_dual_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_plasma_dual_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_plasma_dual_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_plasma_dual_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_dual_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_dual_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_dual_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_plasma_dual_track_blendrate is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_dual_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_plasma_std_aim_firetolerance_angle is "5" ["5"] custom cvar
-^7g_turrets_unit_plasma_std_aim_firetolerance_dist is "200" ["200"] custom cvar
-^7g_turrets_unit_plasma_std_aim_maxpitch is "30" ["30"] custom cvar
-^7g_turrets_unit_plasma_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_plasma_std_aim_speed is "180" ["180"] custom cvar
-^7g_turrets_unit_plasma_std_ammo is "400" ["400"] custom cvar
-^7g_turrets_unit_plasma_std_ammo_max is "800" ["800"] custom cvar
-^7g_turrets_unit_plasma_std_ammo_recharge is "40" ["40"] custom cvar
-^7g_turrets_unit_plasma_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_plasma_std_respawntime is "60" ["60"] custom cvar
-^7g_turrets_unit_plasma_std_shot_dmg is "80" ["80"] custom cvar
-^7g_turrets_unit_plasma_std_shot_force is "100" ["100"] custom cvar
-^7g_turrets_unit_plasma_std_shot_radius is "150" ["150"] custom cvar
-^7g_turrets_unit_plasma_std_shot_refire is "0.6" ["0.6"] custom cvar
-^7g_turrets_unit_plasma_std_shot_speed is "2000" ["2000"] custom cvar
-^7g_turrets_unit_plasma_std_shot_spread is "0.0001" ["0.0001"] custom cvar
-^7g_turrets_unit_plasma_std_shot_volly is "0" ["0"] custom cvar
-^7g_turrets_unit_plasma_std_shot_volly_refire is "0" ["0"] custom cvar
-^7g_turrets_unit_plasma_std_target_range is "3500" ["3500"] custom cvar
-^7g_turrets_unit_plasma_std_target_range_fire is "3000" ["3000"] custom cvar
-^7g_turrets_unit_plasma_std_target_range_min is "200" ["200"] custom cvar
-^7g_turrets_unit_plasma_std_target_range_optimal is "1500" ["1500"] custom cvar
-^7g_turrets_unit_plasma_std_target_select_anglebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_plasma_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_plasma_std_target_select_rangebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_plasma_std_target_select_samebias is "0.01" ["0.01"] custom cvar
-^7g_turrets_unit_plasma_std_track_accel_pitch is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_std_track_accel_rot is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_plasma_std_track_blendrate is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_plasma_std_track_type is "3" ["3"] custom cvar
-^7g_turrets_unit_tesla_std_ammo is "2500" ["2500"] custom cvar
-^7g_turrets_unit_tesla_std_ammo_max is "5000" ["5000"] custom cvar
-^7g_turrets_unit_tesla_std_ammo_recharge is "100" ["100"] custom cvar
-^7g_turrets_unit_tesla_std_health is "1000" ["1000"] custom cvar
-^7g_turrets_unit_tesla_std_respawntime is "120" ["120"] custom cvar
-^7g_turrets_unit_tesla_std_shot_dmg is "100" ["100"] custom cvar
-^7g_turrets_unit_tesla_std_shot_force is "400" ["400"] custom cvar
-^7g_turrets_unit_tesla_std_shot_refire is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_tesla_std_shot_volly is "1" ["1"] custom cvar
-^7g_turrets_unit_tesla_std_shot_volly_refire is "2.5" ["2.5"] custom cvar
-^7g_turrets_unit_tesla_std_target_range is "1024" ["1024"] custom cvar
-^7g_turrets_unit_tesla_std_target_select_missilebias is "1" ["1"] custom cvar
-^7g_turrets_unit_tesla_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_walker_run_turnrate is "22.5" ["22.5"] custom cvar
-^7g_turrets_unit_walker_std_aim_firetolerance_angle is "16" ["16"] custom cvar
-^7g_turrets_unit_walker_std_aim_firetolerance_dist is "64" ["64"] custom cvar
-^7g_turrets_unit_walker_std_aim_maxpitch is "15" ["15"] custom cvar
-^7g_turrets_unit_walker_std_aim_maxrot is "360" ["360"] custom cvar
-^7g_turrets_unit_walker_std_aim_speed is "90" ["90"] custom cvar
-^7g_turrets_unit_walker_std_ammo is "500" ["500"] custom cvar
-^7g_turrets_unit_walker_std_ammo_max is "4000" ["4000"] custom cvar
-^7g_turrets_unit_walker_std_ammo_recharge is "100" ["100"] custom cvar
-^7g_turrets_unit_walker_std_health is "500" ["500"] custom cvar
-^7g_turrets_unit_walker_std_meele_dmg is "500" ["500"] custom cvar
-^7g_turrets_unit_walker_std_meele_force is "600" ["600"] custom cvar
-^7g_turrets_unit_walker_std_meele_range is "160" ["160"] custom cvar
-^7g_turrets_unit_walker_std_respawntime is "60" ["60"] custom cvar
-^7g_turrets_unit_walker_std_rocket_dmg is "50" ["50"] custom cvar
-^7g_turrets_unit_walker_std_rocket_force is "150" ["150"] custom cvar
-^7g_turrets_unit_walker_std_rocket_radius is "150" ["150"] custom cvar
-^7g_turrets_unit_walker_std_rocket_refire is "10" ["10"] custom cvar
-^7g_turrets_unit_walker_std_rocket_speed is "650" ["650"] custom cvar
-^7g_turrets_unit_walker_std_rocket_speed_add is "2" ["2"] custom cvar
-^7g_turrets_unit_walker_std_rocket_tunrate is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_walker_std_shot_dmg is "15" ["15"] custom cvar
-^7g_turrets_unit_walker_std_shot_force is "5" ["5"] custom cvar
-^7g_turrets_unit_walker_std_shot_radius is "0" ["0"] custom cvar
-^7g_turrets_unit_walker_std_shot_refire is "0.1" ["0.1"] custom cvar
-^7g_turrets_unit_walker_std_shot_speed is "0" ["0"] custom cvar
-^7g_turrets_unit_walker_std_shot_spread is "0.05" ["0.05"] custom cvar
-^7g_turrets_unit_walker_std_shot_volly is "0" ["0"] custom cvar
-^7g_turrets_unit_walker_std_shot_volly_refire is "0" ["0"] custom cvar
-^7g_turrets_unit_walker_std_target_range is "10000" ["10000"] custom cvar
-^7g_turrets_unit_walker_std_target_range_fire is "1500" ["1500"] custom cvar
-^7g_turrets_unit_walker_std_target_range_min is "64" ["64"] custom cvar
-^7g_turrets_unit_walker_std_target_range_optimal is "500" ["500"] custom cvar
-^7g_turrets_unit_walker_std_target_select_anglebias is "0.5" ["0.5"] custom cvar
-^7g_turrets_unit_walker_std_target_select_missilebias is "0" ["0"] custom cvar
-^7g_turrets_unit_walker_std_target_select_playerbias is "1" ["1"] custom cvar
-^7g_turrets_unit_walker_std_target_select_rangebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_walker_std_target_select_samebias is "0.25" ["0.25"] custom cvar
-^7g_turrets_unit_walker_std_track_type is "1" ["1"] custom cvar
-^7g_turrets_unit_walker_turn_turnrate is "90" ["90"] custom cvar
-^7g_turrets_unit_walker_walk_turnrate is "45" ["45"] custom cvar
-^7g_use_ammunition is "1" ["1"] custom cvar
-^7g_vampire is "0" ["0"] custom cvar
-^7g_warmup is "0" ["0"] custom cvar
-^7g_warmup_allguns is "0" ["0"] custom cvar
-^7g_warmup_allow_timeout is "0" ["0"] custom cvar
-^7g_warmup_limit is "60" ["60"] custom cvar
-^7g_warmup_start_ammo_cells is "50" ["50"] custom cvar
-^7g_warmup_start_ammo_nails is "150" ["150"] custom cvar
-^7g_warmup_start_ammo_rockets is "50" ["50"] custom cvar
-^7g_warmup_start_ammo_shells is "50" ["50"] custom cvar
-^7g_warmup_start_armor is "100" ["100"] custom cvar
-^7g_warmup_start_health is "250" ["250"] custom cvar
-^7g_waypointeditor is "0" ["0"] custom cvar
-^7g_waypoints_for_items is "1" ["1"] custom cvar
-^7g_waypointsprite_deadlifetime is "1" ["1"] custom cvar
-^7g_waypointsprite_deployed_lifetime is "10" ["10"] custom cvar
-^7g_waypointsprite_distancealphaexponent is "2" ["2"] custom cvar
-^7g_waypointsprite_limitedrange is "5120" ["5120"] custom cvar
-^7g_waypointsprite_minalpha is "0.4" ["0.4"] custom cvar
-^7g_waypointsprite_minscale is "1" ["1"] custom cvar
-^7g_waypointsprite_normdistance is "512" ["512"] custom cvar
-^7g_waypointsprite_scale is "1" ["1"] custom cvar
-^7g_waypointsprite_stuffbinds is "0" ["0"] custom cvar
-^7g_waypointsprite_timealphaexponent is "1" ["1"] custom cvar
-^7g_weapon_stay is "0" ["0"] custom cvar
-^7g_weaponarena is "0" ["0"] custom cvar
-^7g_weaponreplace_crylink is "" [""] custom cvar
-^7g_weaponreplace_electro is "" [""] custom cvar
-^7g_weaponreplace_grenadelauncher is "" [""] custom cvar
-^7g_weaponreplace_hagar is "" [""] custom cvar
-^7g_weaponreplace_hlac is "" [""] custom cvar
-^7g_weaponreplace_hook is "" [""] custom cvar
-^7g_weaponreplace_laser is "" [""] custom cvar
-^7g_weaponreplace_minstanex is "" [""] custom cvar
-^7g_weaponreplace_nex is "" [""] custom cvar
-^7g_weaponreplace_porto is "" [""] custom cvar
-^7g_weaponreplace_rocketlauncher is "" [""] custom cvar
-^7g_weaponreplace_seeker is "" [""] custom cvar
-^7g_weaponreplace_shotgun is "" [""] custom cvar
-^7g_weaponreplace_uzi is "" [""] custom cvar
-^7gamecfg is "1" ["1"] unused cvar in quake, can be used by mods
-^7gameversion is "20000" ["20000"] version of game data (mod-specific), when client and server gameversion mismatch in the server browser the server is shown as incompatible
-^7gl_finish is "$gl_finish" ["$gl_finish"] custom cvar
-^7halflifebsp is "0" ["0"] indicates the current map is hlbsp format (useful to know because of different bounding box sizes)
-^7host_framerate is "0" ["0"] locks frame timing to this value in seconds, 0.05 is 20fps for example, note that this can easily run too fast, use cl_maxfps if you want to limit your framerate instead, or sys_ticrate to limit server speed
-^7host_speeds is "0" ["0"] reports how much time is used in server/graphics/sound
-^7hostname is "Nexuiz Server" ["Nexuiz Server"] server message to show in server browser
-^7joy_deadzoneforward is "0.05" ["0.05"] custom cvar
-^7joy_deadzonepitch is "0.05" ["0.05"] custom cvar
-^7joy_deadzoneside is "0.05" ["0.05"] custom cvar
-^7joy_deadzoneup is "0.05" ["0.05"] custom cvar
-^7joy_deadzoneyaw is "0.05" ["0.05"] custom cvar
-^7joy_sensitivitypitch is "0.9" ["0.9"] custom cvar
-^7joy_sensitivityyaw is "-1.8" ["-1.8"] custom cvar
-^7joyadvanced is "1" ["1"] custom cvar
-^7joyadvaxisr is "2" ["2"] custom cvar
-^7joyadvaxisx is "3" ["3"] custom cvar
-^7joyadvaxisy is "1" ["1"] custom cvar
-^7joyadvaxisz is "4" ["4"] custom cvar
-^7joypitchsensitivity is "0.9" ["0.9"] custom cvar
-^7joysidesensitivity is "1.0" ["1.0"] custom cvar
-^7joyyawsensitivity is "-1.8" ["-1.8"] custom cvar
-^7lastlevel is "" [""] custom cvar
-^7log_dest_udp is "" [""] UDP address to log messages to (in QW rcon compatible format); multiple destinations can be separated by spaces; DO NOT SPECIFY DNS NAMES HERE
-^7log_file is "" [""] filename to log messages to
-^7menu_cdtrack is "digital-pursuit" ["digital-pursuit"] custom cvar
-^7menu_maxplayers is "8" ["8"] custom cvar
-^7menu_mouse_absolute is "0" ["0"] custom cvar
-^7menu_mouse_speed is "1" ["1"] custom cvar
-^7menu_skin is "wickedz" ["wickedz"] custom cvar
-^7menu_slist_showempty is "1" ["1"] custom cvar
-^7menu_slist_showfull is "1" ["1"] custom cvar
-^7menu_slowmo is "1" ["1"] custom cvar
-^7menu_use_default_hostname is "1" ["1"] custom cvar
-^7menu_weaponarena_with_laser is "0" ["0"] custom cvar
-^7minplayers is "0" ["0"] custom cvar
-^7mod_alias_supporttagscale is "1" ["1"] support scaling factors in bone/tag attachment matrices as supported by MD3
-^7mod_q3bsp_curves_collisions is "1" ["1"] enables collisions with curves (SLOW)
-^7mod_q3bsp_debugtracebrush is "0" ["0"] selects different tracebrush bsp recursion algorithms (for debugging purposes only)
-^7mod_q3bsp_lightmapmergepower is "3" ["3"] merges the quake3 128x128 lightmap textures into larger lightmap group textures to speed up rendering, 1 = 256x256, 2 = 512x512, 3 = 1024x1024, 4 = 2048x2048, 5 = 4096x4096, ...
-^7mod_q3bsp_nolightmaps is "0" ["0"] do not load lightmaps in Q3BSP maps (to save video RAM, but be warned: it looks ugly)
-^7mod_q3bsp_optimizedtraceline is "1" ["1"] whether to use optimized traceline code for line traces (as opposed to tracebox code)
-^7net_address is "0.0.0.0" ["0.0.0.0"] network address to open ports on
-^7net_connectfloodblockingtimeout is "5" ["5"] when a connection packet is received, it will block all future connect packets from that IP address for this many seconds (cuts down on connect floods)
-^7net_connecttimeout is "30" ["30"] after requesting a connection, the client must reply within this many seconds or be dropped (cuts down on connect floods)
-^7net_messagetimeout is "300" ["300"] drops players who have not sent any packets for this many seconds
-^7net_slist_favorites is "" [""] contains a list of IP addresses and ports to always query explicitly
-^7net_slist_maxtries is "3" ["3"] how many times to ask the same server for information (more times gives better ping reports but takes longer)
-^7net_slist_pause is "0" ["0"] when set to 1, the server list won't update until it is set back to 0
-^7net_slist_queriesperframe is "4" ["4"] maximum number of server information requests to send each rendered frame (guards against low framerates causing problems)
-^7net_slist_queriespersecond is "20" ["20"] how many server information requests to send per second
-^7net_slist_timeout is "4" ["4"] how long to listen for a server information response before giving up
-^7nextmap is "" [""] custom cvar
-^7noaim is "1" ["1"] QW option to disable vertical autoaim
-^7noexit is "0" ["0"] kills anyone attempting to use an exit
-^7nomonsters is "0" ["0"] unused cvar in quake, can be used by mods
-^7pausable is "0" ["0"] allow players to pause or not
-^7port is "26000" ["26000"] server port for players to connect to
-^7pr_checkextension is "1" ["1"] indicates to QuakeC that the standard quakec extensions system is available (if 0, quakec should not attempt to use extensions)
-^7prvm_backtraceforwarnings is "0" ["0"] print a backtrace for warnings too
-^7prvm_errordump is "0" ["0"] write a savegame on crash to crash-server.dmp
-^7prvm_leaktest is "0" ["0"] try to detect memory leaks in strings or entities
-^7prvm_leaktest_ignore_classnames is "ctf_team dom_team tdm_team" ["ctf_team dom_team tdm_team"] classnames of entities to NOT leak check because they are found by find(world, classname, ...) but are actually spawned by QC code (NOT map entities)
-^7prvm_statementprofiling is "0" ["0"] counts how many times each QuakeC statement has been executed, these counts are displayed in prvm_printfunction output (if enabled)
-^7prvm_traceqc is "0" ["0"] prints every QuakeC statement as it is executed (only for really thorough debugging!)
-^7quit_and_redirect is "" [""] custom cvar
-^7quit_when_empty is "0" ["0"] custom cvar
-^7r_ambient is "4" ["4"] custom cvar
-^7r_fixtrans_auto is "0" ["0"] automatically fixtrans textures (when set to 2, it also saves the fixed versions to a fixtrans directory)
-^7r_labelsprites_roundtopixels is "1" ["1"] try to make label sprites sharper by rounding their size to 0.5x or 1x and by rounding their position to whole pixels if possible
-^7r_labelsprites_scale is "0.40625" ["0.40625"] global scale to apply to label sprites before conversion to HUD coordinates
-^7r_mipskins is "1" ["1"] mipmaps model skins so they render faster in the distance and do not display noise artifacts, can cause discoloration of skins if they contain undesirable border colors
-^7r_mipsprites is "1" ["1"] mipmaps sprites so they render faster in the distance and do not display noise artifacts
-^7r_nosurftextures is "0" ["0"] pretends there was no texture lump found in the q1bsp/hlbsp loading (useful for debugging this rare case)
-^7r_novis is "0" ["0"] draws whole level, see also sv_cullentities_pvs 0
-^7r_picmipsprites is "0" ["0"] make gl_picmip affect sprites too (saves some graphics memory in sprite heavy games)
-^7r_picmipworld is "0" ["0"] whether gl_picmip shall apply to world textures too
-^7r_showsurfaces is "$r_showsurfaces" ["$r_showsurfaces"] custom cvar
-^7r_skeletal_debugbone is "-1" ["-1"] development cvar for testing skeletal model code
-^7r_skeletal_debugbonecomponent is "3" ["3"] development cvar for testing skeletal model code
-^7r_skeletal_debugbonevalue is "100" ["100"] development cvar for testing skeletal model code
-^7r_skeletal_debugtranslatex is "1" ["1"] development cvar for testing skeletal model code
-^7r_skeletal_debugtranslatey is "1" ["1"] development cvar for testing skeletal model code
-^7r_skeletal_debugtranslatez is "1" ["1"] development cvar for testing skeletal model code
-^7r_subdivisions_collision_maxtess is "1024" ["1024"] maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)
-^7r_subdivisions_collision_maxvertices is "4225" ["4225"] maximum vertices allowed per subdivided curve
-^7r_subdivisions_collision_mintess is "1" ["1"] minimum number of subdivisions (values above 1 will smooth curves that don't need it)
-^7r_subdivisions_collision_tolerance is "15" ["15"] maximum error tolerance on curve subdivision for collision purposes (usually a larger error tolerance than for rendering)
-^7r_subdivisions_maxtess is "3" ["3"] maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)
-^7r_subdivisions_maxvertices is "65536" ["65536"] maximum vertices allowed per subdivided curve
-^7r_subdivisions_mintess is "3" ["3"] minimum number of subdivisions (values above 1 will smooth curves that don't need it)
-^7r_subdivisions_tolerance is "1000000" ["1000000"] maximum error tolerance on curve subdivision for rendering purposes (in other words, the curves will be given as many polygons as necessary to represent curves at this quality)
-^7rcon_address is "" [""] server address to send rcon commands to (when not connected to a server)
-^7rcon_password is "" [""] password to authenticate rcon commands
-^7rcon_restricted_commands is "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban "sv_cmd bans" "sv_cmd unban" status "sv_cmd teamstatus"" ["restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban "sv_cmd bans" "sv_cmd unban" status "sv_cmd teamstatus""] allowed commands for rcon when the restricted mode password was used
-^7rcon_restricted_password is "" [""] password to authenticate rcon commands in restricted mode
-^7registered is "1" ["1"] indicates if this is running registered quake (whether gfx/pop.lmp was found)
-^7samelevel is "0" ["0"] repeats same level if level ends (due to timelimit or someone hitting an exit)
-^7saved1 is "0" ["0"] unused cvar in quake that is saved to config.cfg on exit, can be used by mods
-^7saved2 is "0" ["0"] unused cvar in quake that is saved to config.cfg on exit, can be used by mods
-^7saved3 is "0" ["0"] unused cvar in quake that is saved to config.cfg on exit, can be used by mods
-^7saved4 is "0" ["0"] unused cvar in quake that is saved to config.cfg on exit, can be used by mods
-^7savedgamecfg is "0" ["0"] unused cvar in quake that is saved to config.cfg on exit, can be used by mods
-^7sbar_columns is "default" ["default"] custom cvar
-^7sbar_fontsize is "11" ["11"] custom cvar
-^7sbar_hudselector is "1" ["1"] custom cvar
-^7sbar_showbinds is "1" ["1"] custom cvar
-^7sbar_showbinds_limit is "2" ["2"] custom cvar
-^7sbar_width is "480" ["480"] custom cvar
-^7scr_screenshot_name is "nexuiz" ["nexuiz"] prefix name for saved screenshots (changes based on -game commandline, as well as which game mode is running)
-^7scratch1 is "0" ["0"] unused cvar in quake, can be used by mods
-^7scratch2 is "0" ["0"] unused cvar in quake, can be used by mods
-^7scratch3 is "0" ["0"] unused cvar in quake, can be used by mods
-^7scratch4 is "0" ["0"] unused cvar in quake, can be used by mods
-^7settemp_list is "0" ["0"] custom cvar
-^7settemp_var is "_settemp_x" ["_settemp_x"] custom cvar
-^7skill is "1" ["1"] difficulty level of game, affects monster layouts in levels, 0 = easy, 1 = normal, 2 = hard, 3 = nightmare (same layout as hard but monsters fire twice)
-^7skill_auto is "0" ["0"] custom cvar
-^7skin is "" [""] QW player skin name (example: base)
-^7slowmo is "1.0" ["1.0"] controls game speed, 0.5 is half speed, 2 is double speed
-^7sv_accelerate is "5.5" ["5.5"] rate at which a player accelerates to sv_maxspeed
-^7sv_adminnick is "" [""] nick name to use for admin messages instead of host name
-^7sv_aim is "2" ["2"] maximum cosine angle for quake's vertical autoaim, a value above 1 completely disables the autoaim, quake used 0.93
-^7sv_airaccel_qw is "0.93" ["0.93"] ratio of QW-style air control as opposed to simple acceleration
-^7sv_airaccel_sideways_friction is "0.3" ["0.3"] anti-sideways movement stabilization (reduces speed gain when zigzagging)
-^7sv_airaccelerate is "5.5" ["5.5"] rate at which a player accelerates to sv_maxairspeed while in the air, if less than 0 the sv_accelerate variable is used instead
-^7sv_allow_shownames is "1" ["1"] custom cvar
-^7sv_allowdownloads is "1" ["1"] whether to allow clients to download files from the server (does not affect http downloads)
-^7sv_allowdownloads_archive is "0" ["0"] whether to allow downloads of archives (pak/pk3)
-^7sv_allowdownloads_config is "0" ["0"] whether to allow downloads of config files (cfg)
-^7sv_allowdownloads_dlcache is "0" ["0"] whether to allow downloads of dlcache files (dlcache/)
-^7sv_allowdownloads_inarchive is "1" ["1"] whether to allow downloads from archives (pak/pk3)
-^7sv_areagrid_mingridsize is "64" ["64"] minimum areagrid cell size, smaller values work better for lots of small objects, higher values for large objects
-^7sv_autodemo_perclient is "0" ["0"] set to 1 to enable autorecorded per-client demos (they'll start to record at the beginning of a match); set it to 2 to also record client->server packets (for debugging)
-^7sv_autodemo_perclient_nameformat is "sv_autodemos/%Y-%m-%d_%H-%M" ["sv_autodemos/%Y-%m-%d_%H-%M"] The format of the sv_autodemo_perclient filename, followed by the map name, the client number and the IP address + port number, separated by underscores
-^7sv_autoscreenshot is "0" ["0"] custom cvar
-^7sv_cheats is "0" ["0"] enables cheat commands in any game, and cheat impulses in dpmod
-^7sv_checkforpacketsduringsleep is "0" ["0"] uses select() function to wait between frames which can be interrupted by packets being received, instead of Sleep()/usleep()/SDL_Sleep() functions which do not check for packets
-^7sv_clmovement_enable is "1" ["1"] whether to allow clients to use cl_movement prediction, which can cause choppy movement on the server which may annoy other players
-^7sv_clmovement_minping is "0" ["0"] if client ping is below this time in milliseconds, then their ability to use cl_movement prediction is disabled for a while (as they don't need it)
-^7sv_clmovement_minping_disabletime is "1000" ["1000"] when client falls below minping, disable their prediction for this many milliseconds (should be at least 1000 or else their prediction may turn on/off frequently)
-^7sv_clmovement_waitforinput is "4" ["4"] when a client does not send input for this many frames, force them to move anyway (unlike QuakeWorld)
-^7sv_clones is "0" ["0"] custom cvar
-^7sv_cullentities_nevercullbmodels is "0" ["0"] if enabled the clients are always notified of moving doors and lifts and other submodels of world (warning: eats a lot of network bandwidth on some levels!)
-^7sv_cullentities_pvs is "1" ["1"] fast but loose culling of hidden entities
-^7sv_cullentities_stats is "0" ["0"] displays stats on network entities culled by various methods for each client
-^7sv_cullentities_trace is "1" ["1"] somewhat slow but very tight culling of hidden entities, minimizes network traffic and makes wallhack cheats useless
-^7sv_cullentities_trace_delay is "1" ["1"] number of seconds until the entity gets actually culled
-^7sv_cullentities_trace_delay_players is "0.2" ["0.2"] number of seconds until the entity gets actually culled if it is a player entity
-^7sv_cullentities_trace_enlarge is "0" ["0"] box enlargement for entity culling
-^7sv_cullentities_trace_prediction is "1" ["1"] also trace from the predicted player position
-^7sv_cullentities_trace_samples is "1" ["1"] number of samples to test for entity culling
-^7sv_cullentities_trace_samples_extra is "2" ["2"] number of samples to test for entity culling when the entity affects its surroundings by e.g. dlight
-^7sv_cullentities_trace_samples_players is "8" ["8"] number of samples to test for entity culling when the entity is a player entity
-^7sv_curl_defaulturl is "http://www.nexuiz.com/contentdownload/getmap.php?file=" ["http://www.nexuiz.com/contentdownload/getmap.php?file="] default autodownload source URL
-^7sv_curl_serverpackages is "" [""] list of required files for the clients, separated by spaces
-^7sv_debugmove is "0" ["0"] disables collision detection optimizations for debugging purposes
-^7sv_defaultcharacter is "0" ["0"] custom cvar
-^7sv_defaultplayercolors is "" [""] custom cvar
-^7sv_defaultplayermodel is "models/player/nexus.zym" ["models/player/nexus.zym"] custom cvar
-^7sv_defaultplayermodel_blue is "" [""] custom cvar
-^7sv_defaultplayermodel_pink is "" [""] custom cvar
-^7sv_defaultplayermodel_red is "" [""] custom cvar
-^7sv_defaultplayermodel_yellow is "" [""] custom cvar
-^7sv_defaultplayerskin is "0" ["0"] custom cvar
-^7sv_defaultplayerskin_blue is "0" ["0"] custom cvar
-^7sv_defaultplayerskin_pink is "0" ["0"] custom cvar
-^7sv_defaultplayerskin_red is "0" ["0"] custom cvar
-^7sv_defaultplayerskin_yellow is "0" ["0"] custom cvar
-^7sv_doublejump is "0" ["0"] custom cvar
-^7sv_echobprint is "1" ["1"] prints gamecode bprint() calls to server console
-^7sv_entpatch is "1" ["1"] enables loading of .ent files to override entities in the bsp (for example Threewave CTF server pack contains .ent patch files enabling play of CTF on id1 maps)
-^7sv_eventlog is "0" ["0"] custom cvar
-^7sv_eventlog_console is "1" ["1"] custom cvar
-^7sv_eventlog_files is "0" ["0"] custom cvar
-^7sv_eventlog_files_counter is "0" ["0"] custom cvar
-^7sv_eventlog_files_nameprefix is "nexuiz" ["nexuiz"] custom cvar
-^7sv_eventlog_files_namesuffix is ".log" [".log"] custom cvar
-^7sv_eventlog_files_timestamps is "1" ["1"] custom cvar
-^7sv_fixedframeratesingleplayer is "1" ["1"] allows you to use server-style timing system in singleplayer (don't run faster than sys_ticrate)
-^7sv_foginterval is "0" ["0"] custom cvar
-^7sv_freezenonclients is "0" ["0"] freezes time, except for players, allowing you to walk around and take screenshots of explosions
-^7sv_friction is "5" ["5"] how fast you slow down
-^7sv_friction_on_land is "0" ["0"] custom cvar
-^7sv_gameplayfix_blowupfallenzombies is "1" ["1"] causes findradius to detect SOLID_NOT entities such as zombies and corpses on the floor, allowing splash damage to apply to them
-^7sv_gameplayfix_delayprojectiles is "1" ["1"] causes entities to not move on the same frame they are spawned, meaning that projectiles wait until the next frame to perform their first move, giving proper interpolation and rocket trails, but making weapons harder to use at low framerates
-^7sv_gameplayfix_droptofloorstartsolid is "0" ["0"] prevents items and monsters that start in a solid area from falling out of the level (makes droptofloor treat trace_startsolid as an acceptable outcome)
-^7sv_gameplayfix_droptofloorstartsolid_nudgetocorrect is "1" ["1"] tries to nudge stuck items and monsters out of walls before droptofloor is performed
-^7sv_gameplayfix_easierwaterjump is "1" ["1"] changes water jumping to make it easier to get out of water (exactly like in QuakeWorld)
-^7sv_gameplayfix_findradiusdistancetobox is "1" ["1"] causes findradius to check the distance to the corner of a box rather than the center of the box, makes findradius detect bmodels such as very large doors that would otherwise be unaffected by splash damage
-^7sv_gameplayfix_grenadebouncedownslopes is "1" ["1"] prevents MOVETYPE_BOUNCE (grenades) from getting stuck when fired down a downward sloping surface
-^7sv_gameplayfix_multiplethinksperframe is "1" ["1"] allows entities to think more often than the server framerate, primarily useful for very high fire rate weapons
-^7sv_gameplayfix_noairborncorpse is "1" ["1"] causes entities (corpses) sitting ontop of moving entities (players) to fall when the moving entity (player) is no longer supporting them
-^7sv_gameplayfix_setmodelrealbox is "1" ["1"] fixes a bug in Quake that made setmodel always set the entity box to ('-16 -16 -16', '16 16 16') rather than properly checking the model box, breaks some poorly coded mods
-^7sv_gameplayfix_stepdown is "0" ["0"] attempts to step down stairs, not just up them (prevents the familiar thud..thud..thud.. when running down stairs and slopes)
-^7sv_gameplayfix_stepwhilejumping is "1" ["1"] applies step-up onto a ledge even while airborn, useful if you would otherwise just-miss the floor when running across small areas with gaps (for instance running across the moving platforms in dm2, or jumping to the megahealth and red armor in dm2 rather than using the bridge)
-^7sv_gameplayfix_swiminbmodels is "1" ["1"] causes pointcontents (used to determine if you are in a liquid) to check bmodel entities as well as the world model, so you can swim around in (possibly moving) water bmodel entities
-^7sv_gameplayfix_upwardvelocityclearsongroundflag is "1" ["1"] prevents monsters, items, and most other objects from being stuck to the floor when pushed around by damage, and other situations in mods
-^7sv_gravity is "800" ["800"] how fast you fall (512 = roughly earth gravity)
-^7sv_heartbeatperiod is "120" ["120"] how often to send heartbeat in seconds (only used if sv_public is 1)
-^7sv_idealpitchscale is "0.8" ["0.8"] how much to look up/down slopes and stairs when not using freelook
-^7sv_intermission_cdtrack is "brainsukker" ["brainsukker"] custom cvar
-^7sv_jumpstep is "1" ["1"] whether you can step up while jumping (sv_gameplayfix_stepwhilejumping must also be 1)
-^7sv_jumpvelocity is "300" ["300"] cvar that can be used by QuakeC code for jump velocity
-^7sv_logscores_bots is "0" ["0"] custom cvar
-^7sv_logscores_console is "0" ["0"] custom cvar
-^7sv_logscores_file is "0" ["0"] custom cvar
-^7sv_logscores_filename is "scores.log" ["scores.log"] custom cvar
-^7sv_mapchange_delay is "5" ["5"] custom cvar
-^7sv_master1 is "" [""] user-chosen master server 1
-^7sv_master2 is "" [""] user-chosen master server 2
-^7sv_master3 is "" [""] user-chosen master server 3
-^7sv_master4 is "" [""] user-chosen master server 4
-^7sv_masterextra1 is "ghdigital.com" ["ghdigital.com"] default master server 1 (admin: LordHavoc)
-^7sv_masterextra2 is "dpmaster.deathmask.net" ["dpmaster.deathmask.net"] default master server 2 (admin: Willis)
-^7sv_masterextra3 is "dpmaster.tchr.no" ["dpmaster.tchr.no"] default master server 3 (admin: tChr)
-^7sv_maxairspeed is "220" ["220"] maximum speed a player can accelerate to when airborn (note that it is possible to completely stop by moving the opposite direction)
-^7sv_maxidle is "0" ["0"] custom cvar
-^7sv_maxidle_spectatorsareidle is "0" ["0"] custom cvar
-^7sv_maxrate is "1000000" ["1000000"] upper limit on client rate cvar, should reflect your network connection quality
-^7sv_maxspeed is "400" ["400"] maximum speed a player can accelerate to when on ground (can be exceeded by tricks)
-^7sv_maxvelocity is "1000000000" ["1000000000"] universal speed limit on all entities
-^7sv_motd is "" [""] custom cvar
-^7sv_newflymove is "0" ["0"] enables simpler/buggier player physics (not recommended)
-^7sv_nostep is "0" ["0"] prevents MOVETYPE_STEP entities (monsters) from moving
-^7sv_playerphysicsqc is "1" ["1"] enables QuakeC function to override player physics
-^7sv_pogostick is "0" ["0"] custom cvar
-^7sv_precacheitems is "0" ["0"] custom cvar
-^7sv_precacheplayermodels is "1" ["1"] custom cvar
-^7sv_precacheweapons is "0" ["0"] custom cvar
-^7sv_progs is "progs.dat" ["progs.dat"] selects which quakec progs.dat file to run
-^7sv_protocolname is "DP7" ["DP7"] selects network protocol to host for (values include QUAKE, QUAKEDP, NEHAHRAMOVIE, DP1 and up)
-^7sv_public is "1" ["1"] 1: advertises this server on the master server (so that players can find it in the server browser); 0: allow direct queries only; -1: do not respond to direct queries; -2: do not allow anyone to connect
-^7sv_q3acompat_machineshotgunswap is "0" ["0"] custom cvar
-^7sv_random_seed is "" [""] random seed; when set, on every map start this random seed is used to initialize the random number generator. Don't touch it unless for benchmarking or debugging
-^7sv_ratelimitlocalplayer is "0" ["0"] whether to apply rate limiting to the local player in a listen server (only useful for testing)
-^7sv_ready_restart is "0" ["0"] custom cvar
-^7sv_ready_restart_after_countdown is "0" ["0"] custom cvar
-^7sv_ready_restart_repeatable is "0" ["0"] custom cvar
-^7sv_servermodelsonly is "1" ["1"] custom cvar
-^7sv_sound_land is "" [""] sound to play when MOVETYPE_STEP entity hits the ground at high speed (empty cvar disables the sound)
-^7sv_sound_watersplash is "" [""] sound to play when MOVETYPE_FLY/TOSS/BOUNCE/STEP entity enters or leaves water (empty cvar disables the sound)
-^7sv_spectate is "1" ["1"] custom cvar
-^7sv_spectator_speed_multiplier is "1.5" ["1.5"] custom cvar
-^7sv_status_privacy is "1" ["1"] do not show IP addresses in 'status' replies to clients
-^7sv_stepheight is "34" ["34"] how high you can step up (TW_SV_STEPCONTROL extension)
-^7sv_stopspeed is "100" ["100"] how fast you come to a complete stop
-^7sv_timeout is "0" ["0"] custom cvar
-^7sv_timeout_leadtime is "4" ["4"] custom cvar
-^7sv_timeout_length is "120" ["120"] custom cvar
-^7sv_timeout_number is "2" ["2"] custom cvar
-^7sv_timeout_resumetime is "3" ["3"] custom cvar
-^7sv_vote_call is "1" ["1"] custom cvar
-^7sv_vote_change is "0" ["0"] custom cvar
-^7sv_vote_commands is "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick" ["restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick"] custom cvar
-^7sv_vote_majority_factor is "0.5" ["0.5"] custom cvar
-^7sv_vote_master is "1" ["1"] custom cvar
-^7sv_vote_master_commands is "" [""] custom cvar
-^7sv_vote_master_password is "" [""] custom cvar
-^7sv_vote_nospectators is "0" ["0"] custom cvar
-^7sv_vote_only_commands is "" [""] custom cvar
-^7sv_vote_override_mostrecent is "0" ["0"] custom cvar
-^7sv_vote_simple_majority_factor is "0" ["0"] custom cvar
-^7sv_vote_singlecount is "0" ["0"] custom cvar
-^7sv_vote_timeout is "60" ["60"] custom cvar
-^7sv_vote_wait is "120" ["120"] custom cvar
-^7sv_wallfriction is "1" ["1"] how much you slow down when sliding along a wall
-^7sv_wateraccelerate is "-1" ["-1"] rate at which a player accelerates to sv_maxspeed while in the air, if less than 0 the sv_accelerate variable is used instead
-^7sv_waterfriction is "-1" ["-1"] how fast you slow down, if less than 0 the sv_friction variable is used instead
-^7sv_writepicture_quality is "10" ["10"] WritePicture quality offset (higher means better quality, but slower)
-^7sys_colortranslation is "2" ["1"] terminal console color translation (supported values: 0 = strip color codes, 1 = translate to ANSI codes, 2 = no translation)
-^7sys_specialcharactertranslation is "0" ["1"] terminal console conchars to ASCII translation (set to 0 if your conchars.tga is for an 8bit character set or if you want raw output)
-^7sys_ticrate is "0.05" ["0.05"] how long a server frame is in seconds, 0.05 is 20fps server rate, 0.1 is 10fps (can not be set higher than 0.1), 0 runs as many server frames as possible (makes games against bots a little smoother, overwhelms network players), 0.0138889 matches QuakeWorld physics
-^7sys_useclockgettime is "0" ["0"] use POSIX clock_gettime function (which has issues if the system clock speed is far off, as it can't get fixed by NTP) for timing rather than gettimeofday (which has issues if the system time is stepped by ntpdate, or apparently on some Xen installations)
-^7sys_usenoclockbutbenchmark is "0" ["0"] don't use ANY real timing, and simulate a clock (for benchmarking); the game then runs as fast as possible. Run a QC mod with bots that does some stuff, then does a quit at the end, to benchmark a server. NEVER do this on a public server.
-^7team is "none" ["none"] QW team (4 character limit, example: blue)
-^7teamplay is "0" ["0"] teamplay mode, values depend on mod but typically 0 = no teams, 1 = no team damage no self damage, 2 = team damage and self damage, some mods support 3 = no team damage but can damage self
-^7teamplay_default is "4" ["4"] custom cvar
-^7teamplay_lockonrestart is "0" ["0"] custom cvar
-^7temp1 is "0" ["0"] general cvar for mods to use, in stock id1 this selects which death animation to use on players (0 = random death, other values select specific death scenes)
-^7timeformat is "[%Y-%m-%d %H:%M:%S] " ["[%Y-%m-%d %H:%M:%S] "] time format to use on timestamped console messages
-^7timelimit is "0" ["0"] ends level at this time (in minutes)
-^7timelimit_decrement is "5" ["5"] custom cvar
-^7timelimit_increment is "5" ["5"] custom cvar
-^7timelimit_max is "60" ["60"] custom cvar
-^7timelimit_maxovertime is "5" ["5"] custom cvar
-^7timelimit_min is "5" ["5"] custom cvar
-^7timelimit_override is "-1" ["-1"] custom cvar
-^7timestamps is "0" ["0"] prints timestamps on console messages
-^7userbind10_description is "team: roaming, icon" ["team: roaming, icon"] custom cvar
-^7userbind10_press is "say_team roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here" ["say_team roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here"] custom cvar
-^7userbind10_release is "" [""] custom cvar
-^7userbind11_description is "team: attacking, icon" ["team: attacking, icon"] custom cvar
-^7userbind11_press is "say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here" ["say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here"] custom cvar
-^7userbind11_release is "" [""] custom cvar
-^7userbind12_description is "team: killed flag, icon" ["team: killed flag, icon"] custom cvar
-^7userbind12_press is "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p" ["say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p"] custom cvar
-^7userbind12_release is "" [""] custom cvar
-^7userbind13_description is "team: dropped flag, icon" ["team: dropped flag, icon"] custom cvar
-^7userbind13_press is "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d" ["say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"] custom cvar
-^7userbind13_release is "" [""] custom cvar
-^7userbind14_description is "team: drop, icon" ["team: drop, icon"] custom cvar
-^7userbind14_press is "say_team dropped gun %w (l:%l^7); g_waypointsprite_team_here; wait; dropweapon" ["say_team dropped gun %w (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"] custom cvar
-^7userbind14_release is "" [""] custom cvar
-^7userbind15_description is "chat: nice one" ["chat: nice one"] custom cvar
-^7userbind15_press is "say :-) / nice one" ["say :-) / nice one"] custom cvar
-^7userbind15_release is "" [""] custom cvar
-^7userbind16_description is "chat: good game" ["chat: good game"] custom cvar
-^7userbind16_press is "say good game" ["say good game"] custom cvar
-^7userbind16_release is "" [""] custom cvar
-^7userbind17_description is "chat: hi / good luck" ["chat: hi / good luck"] custom cvar
-^7userbind17_press is "say hi / good luck and have fun" ["say hi / good luck and have fun"] custom cvar
-^7userbind17_release is "" [""] custom cvar
-^7userbind18_description is "scoreboard / chat history" ["scoreboard / chat history"] custom cvar
-^7userbind18_press is "+showscores; +con_chat_maximize" ["+showscores; +con_chat_maximize"] custom cvar
-^7userbind18_release is "-showscores; -con_chat_maximize" ["-showscores; -con_chat_maximize"] custom cvar
-^7userbind19_description is "toggle recording .avi" ["toggle recording .avi"] custom cvar
-^7userbind19_press is "toggle cl_capturevideo" ["toggle cl_capturevideo"] custom cvar
-^7userbind19_release is "" [""] custom cvar
-^7userbind1_description is "team: quad soon" ["team: quad soon"] custom cvar
-^7userbind1_press is "say_team quad soon" ["say_team quad soon"] custom cvar
-^7userbind1_release is "" [""] custom cvar
-^7userbind20_description is "toggle fullscreen" ["toggle fullscreen"] custom cvar
-^7userbind20_press is "toggle vid_fullscreen; vid_restart" ["toggle vid_fullscreen; vid_restart"] custom cvar
-^7userbind20_release is "" [""] custom cvar
-^7userbind21_description is "" [""] custom cvar
-^7userbind21_press is "" [""] custom cvar
-^7userbind21_release is "" [""] custom cvar
-^7userbind22_description is "" [""] custom cvar
-^7userbind22_press is "" [""] custom cvar
-^7userbind22_release is "" [""] custom cvar
-^7userbind23_description is "" [""] custom cvar
-^7userbind23_press is "" [""] custom cvar
-^7userbind23_release is "" [""] custom cvar
-^7userbind24_description is "" [""] custom cvar
-^7userbind24_press is "" [""] custom cvar
-^7userbind24_release is "" [""] custom cvar
-^7userbind25_description is "" [""] custom cvar
-^7userbind25_press is "" [""] custom cvar
-^7userbind25_release is "" [""] custom cvar
-^7userbind26_description is "" [""] custom cvar
-^7userbind26_press is "" [""] custom cvar
-^7userbind26_release is "" [""] custom cvar
-^7userbind27_description is "" [""] custom cvar
-^7userbind27_press is "" [""] custom cvar
-^7userbind27_release is "" [""] custom cvar
-^7userbind28_description is "" [""] custom cvar
-^7userbind28_press is "" [""] custom cvar
-^7userbind28_release is "" [""] custom cvar
-^7userbind29_description is "" [""] custom cvar
-^7userbind29_press is "" [""] custom cvar
-^7userbind29_release is "" [""] custom cvar
-^7userbind2_description is "team: free item, icon" ["team: free item, icon"] custom cvar
-^7userbind2_press is "say_team free item %x^7 (l:%y^7); g_waypointsprite_team_here_p" ["say_team free item %x^7 (l:%y^7); g_waypointsprite_team_here_p"] custom cvar
-^7userbind2_release is "" [""] custom cvar
-^7userbind30_description is "" [""] custom cvar
-^7userbind30_press is "" [""] custom cvar
-^7userbind30_release is "" [""] custom cvar
-^7userbind31_description is "" [""] custom cvar
-^7userbind31_press is "" [""] custom cvar
-^7userbind31_release is "" [""] custom cvar
-^7userbind32_description is "" [""] custom cvar
-^7userbind32_press is "" [""] custom cvar
-^7userbind32_release is "" [""] custom cvar
-^7userbind3_description is "team: took item, icon" ["team: took item, icon"] custom cvar
-^7userbind3_press is "say_team took item (l:%l^7); g_waypointsprite_team_here" ["say_team took item (l:%l^7); g_waypointsprite_team_here"] custom cvar
-^7userbind3_release is "" [""] custom cvar
-^7userbind4_description is "team: negative" ["team: negative"] custom cvar
-^7userbind4_press is "say_team negative" ["say_team negative"] custom cvar
-^7userbind4_release is "" [""] custom cvar
-^7userbind5_description is "team: positive" ["team: positive"] custom cvar
-^7userbind5_press is "say_team positive" ["say_team positive"] custom cvar
-^7userbind5_release is "" [""] custom cvar
-^7userbind6_description is "team: need help, icon" ["team: need help, icon"] custom cvar
-^7userbind6_press is "say_team need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_helpme; cmd voice needhelp" ["say_team need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_helpme; cmd voice needhelp"] custom cvar
-^7userbind6_release is "" [""] custom cvar
-^7userbind7_description is "team: enemy seen, icon" ["team: enemy seen, icon"] custom cvar
-^7userbind7_press is "say_team enemy seen (l:%y^7); g_waypointsprite_team_danger_p; cmd voice incoming" ["say_team enemy seen (l:%y^7); g_waypointsprite_team_danger_p; cmd voice incoming"] custom cvar
-^7userbind7_release is "" [""] custom cvar
-^7userbind8_description is "team: flag seen, icon" ["team: flag seen, icon"] custom cvar
-^7userbind8_press is "say_team flag seen (l:%y^7); g_waypointsprite_team_here_p; cmd voice seenflag" ["say_team flag seen (l:%y^7); g_waypointsprite_team_here_p; cmd voice seenflag"] custom cvar
-^7userbind8_release is "" [""] custom cvar
-^7userbind9_description is "team: defending, icon" ["team: defending, icon"] custom cvar
-^7userbind9_press is "say_team defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here" ["say_team defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here"] custom cvar
-^7userbind9_release is "" [""] custom cvar
-^7v_kicktime is "$v_kicktime" ["$v_kicktime"] custom cvar
-^7vid_x11_display is "" [""] custom cvar
-^7welcome_message_time is "8" ["8"] custom cvar
-^71546 cvar(s)

Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,6 +1,18 @@
 // Nexuiz version (formatted for humans)
 set g_nexuizversion 2.4svn
 
+//!<showbrand
+showbrand 3
+echo
+echo A warning about this being a SVN development version was set up.
+echo This build shall be used for development and testing only!
+echo
+echo If you want to disable this warning, add the line
+echo   showbrand 0
+echo to your autoexec.cfg.
+echo
+//!>showbrand
+
 // 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\""
@@ -15,8 +27,8 @@
 // later, it's overridden by config.cfg, version ranges are defined in config_update.cfg
 seta g_configversion 0
 
-// default.cfg versioning (update using update-cvarcount.sh; run that every time after adding a new cvar)
-set cvar_check_default 3a4552d8adffd3ad69fec3f0c15c62d8
+// default.cfg versioning (update using update-cvarcount.sh, run that every time after adding a new cvar)
+set cvar_check_default a53e77007f17570086417cc970eacf6e
 
 // Nexuiz version (formatted for machines)
 // used to determine if a client version is compatible
@@ -46,8 +58,9 @@
 alias lockteams "sv_cmd lockteams"
 alias unlockteams "sv_cmd unlockteams"
 alias nospectators "sv_cmd nospectators"
-alias calltimeout "cmd calltimeout" //use this command to call a timeout
-alias resumegame "cmd resumegame" //use this command if you don't need the remaining time of the timeout anymore
+alias cointoss "sv_cmd cointoss"
+alias timeout "cmd timeout" //use this command to call a timeout
+alias timein "cmd timein" //use this command to resume the game before timeout is finished
 
 alias bsp "ls maps/*.bsp"
 alias chmap "changelevel $*"
@@ -84,10 +97,102 @@
 _cl_playermodel models/player/marine.zym
 _cl_playerskin 0
 crosshair 5
+seta crosshair_per_weapon 0
+seta crosshair_color_override 0	"when 1, crosshair_color_* overrides the per-weapon color"
+seta crosshair_laser ""
+seta crosshair_laser_color_red 1
+seta crosshair_laser_color_green 0.65
+seta crosshair_laser_color_blue 0.2
+seta crosshair_laser_color_alpha 0.75
+seta crosshair_laser_size 1
+seta crosshair_shotgun ""
+seta crosshair_shotgun_color_red 0.75
+seta crosshair_shotgun_color_green 0.75
+seta crosshair_shotgun_color_blue 0.75
+seta crosshair_shotgun_color_alpha 1
+seta crosshair_shotgun_size 1
+seta crosshair_uzi ""
+seta crosshair_uzi_color_red 1
+seta crosshair_uzi_color_green 1
+seta crosshair_uzi_color_blue 0.2
+seta crosshair_uzi_color_alpha 1
+seta crosshair_uzi_size 1
+seta crosshair_grenadelauncher ""
+seta crosshair_grenadelauncher_color_red 1
+seta crosshair_grenadelauncher_color_green 0.2
+seta crosshair_grenadelauncher_color_blue 0.2
+seta crosshair_grenadelauncher_color_alpha 1
+seta crosshair_grenadelauncher_size 1
+seta crosshair_electro ""
+seta crosshair_electro_color_red 0.35
+seta crosshair_electro_color_green 0.5
+seta crosshair_electro_color_blue 1
+seta crosshair_electro_color_alpha 0.90
+seta crosshair_electro_size 1
+seta crosshair_crylink ""
+seta crosshair_crylink_color_red 0.85
+seta crosshair_crylink_color_green 0.25
+seta crosshair_crylink_color_blue 1
+seta crosshair_crylink_color_alpha 0.85
+seta crosshair_crylink_size 1
+seta crosshair_nex ""
+seta crosshair_nex_color_red 0
+seta crosshair_nex_color_green 1
+seta crosshair_nex_color_blue 1
+seta crosshair_nex_color_alpha 0.85
+seta crosshair_nex_size 1
+seta crosshair_hagar ""
+seta crosshair_hagar_color_red 1
+seta crosshair_hagar_color_green 0.75
+seta crosshair_hagar_color_blue 0.5
+seta crosshair_hagar_color_alpha 1
+seta crosshair_hagar_size 1
+seta crosshair_rocketlauncher ""
+seta crosshair_rocketlauncher_color_red 1
+seta crosshair_rocketlauncher_color_green 0.85
+seta crosshair_rocketlauncher_color_blue 0.2
+seta crosshair_rocketlauncher_color_alpha 1
+seta crosshair_rocketlauncher_size 1
+seta crosshair_porto ""
+seta crosshair_porto_color_red 0.5
+seta crosshair_porto_color_green 1
+seta crosshair_porto_color_blue 0.5
+seta crosshair_porto_color_alpha 0.85
+seta crosshair_porto_size 1
+seta crosshair_minstanex ""
+seta crosshair_minstanex_color_red 0.65
+seta crosshair_minstanex_color_green 0.65
+seta crosshair_minstanex_color_blue 1
+seta crosshair_minstanex_color_alpha 1
+seta crosshair_minstanex_size 1
+seta crosshair_hook ""
+seta crosshair_hook_color_red 0.65
+seta crosshair_hook_color_green 1
+seta crosshair_hook_color_blue 0.85
+seta crosshair_hook_color_alpha 0.85
+seta crosshair_hook_size 1
+seta crosshair_hlac ""
+seta crosshair_hlac_color_red 1
+seta crosshair_hlac_color_green 0.65
+seta crosshair_hlac_color_blue 0.2
+seta crosshair_hlac_color_alpha 1
+seta crosshair_hlac_size 1
+seta crosshair_seeker ""
+seta crosshair_seeker_color_red 1
+seta crosshair_seeker_color_green 0.35
+seta crosshair_seeker_color_blue 0.35
+seta crosshair_seeker_color_alpha 0.9
+seta crosshair_seeker_size 1
+seta crosshair_campingrifle ""
+seta crosshair_campingrifle_color_red 1
+seta crosshair_campingrifle_color_green 1
+seta crosshair_campingrifle_color_blue 0.2
+seta crosshair_campingrifle_color_alpha 1
+seta crosshair_campingrifle_size 1
 fov 90
-seta cl_zoomfactor 5  // how much +zoom will zoom (1-16)
-seta cl_zoomspeed 3.5 // how fast it will zoom (0.5-16), negative values mean instant zoom
-seta cl_zoomsensitivity 0 // how zoom changes sensitivity (0 = weakest, 1 = strongest)
+seta cl_zoomfactor 5	"how much +zoom will zoom (1-16)"
+seta cl_zoomspeed 3.5	"how fast it will zoom (0.5-16), negative values mean instant zoom"
+seta cl_zoomsensitivity 0	"how zoom changes sensitivity (0 = weakest, 1 = strongest)"
 freelook 1
 sensitivity 6
 v_gamma 1.125000
@@ -102,7 +207,7 @@
 // 2D resolution 800x600
 vid_conwidth 800
 vid_conheight 600
-set sbar_hudselector 1 // use the new nexuiz hud layout
+set sbar_hudselector 1	"use the new nexuiz hud layout"
 v_deathtilt 0 // needed for spectators (who are dead to avoid prediction)
 
 // these settings determine how much the view is affected by movement/damage
@@ -110,18 +215,22 @@
 cl_bob 0.02 // 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_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_rollangle 0 // amount of view tilt when strafing, default is 2.0
-v_kicktime 0   // how long damage kicks of the view last, default is 0.5 seconds
+v_kicktime 0 // how long damage kicks of the view last, default is 0.5 seconds
 gl_polyblend 1 // whether to use screen tints, default is 1
 
-// nexuiz-linux-*.sh will use this
-seta vid_x11_display ""
+seta vid_x11_display ""	"nexuiz-linux-*.sh will use this to start nexuiz on an other/new X display"
 // This can have three possible settings:
-//   ""            run as usual
-//   ":n"          use DISPLAY=:n, create it if needed
-//   ":n/layout"   use DISPLAY=:n, create it if needed with ServerLayout layout
+//	""		run as usual
+//	":n"		use DISPLAY=:n, create it if needed
+//	":n/layout"	use DISPLAY=:n, create it if needed with ServerLayout layout
 
 cl_autodemo_nameformat demos/%Y-%m-%d_%H-%M
 
+// taunts and voices
+seta cl_autotaunt 0.65
+seta cl_voice_directional 1	"0 = all voices are non-directional, 1 = all voices are directional, 2 = only taunts are directional"
+seta cl_voice_directional_taunt_attenuation 0.5
+
 // server settings
 hostname "Nexuiz Server"
 set sv_mapchange_delay 5
@@ -131,45 +240,45 @@
 
 // restart server if all players hit "ready"-button
 set sv_ready_restart 0
-set sv_ready_restart_after_countdown 0 //if set to 1 the players and map items are reset after the countdown ended, otherwise they're reset already at the beginning of the countdown
-set sv_ready_restart_repeatable 0 //allows the players to restart the game as often as needed
+set sv_ready_restart_after_countdown 0	"if set to 1 the players and map items are reset after the countdown ended, otherwise they're reset already at the beginning of the countdown"
+set sv_ready_restart_repeatable 0	"allows the players to restart the game as often as needed"
 
 //nifreks lockonrestart feature, used in team-based game modes, if set to 1 and all players readied up no other player can then join the game anymore, useful to block spectators from joining
 set teamplay_lockonrestart 0
 
-set g_maxplayers 0 //maximum number of players allowed to play at the same time, set to 0 to all players to join the game
-set g_maxplayers_spectator_blocktime 5 //if the players voted for the "nospectators" command, this setting defines the number of seconds a observer/spectator has time to join the game before he gets kicked
+set g_maxplayers 0	"maximum number of players allowed to play at the same time, set to 0 to all players to join the game"
+set g_maxplayers_spectator_blocktime 5	"if the players voted for the \"nospectators\" command, this setting defines the number of seconds a observer/spectator has time to join the game before he gets kicked"
 
 //tournament mod
-set g_warmup 0 //split the game into a warmup- and match-stage when set to 1
-set g_warmup_limit 60 //if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage, otherwise warmup will be limited to this time (useful for public matches)
-set g_warmup_allow_timeout 0 //if set to 0 you cannot use the calltimeout command during the warmup-stage but only during the match stage
-set g_warmup_allguns 0 //if set players start with all guns in warmup mode
-set g_warmup_start_health 250 //starting values when being in warmup-stage
+set g_warmup 0	"split the game into a warmup- and match-stage when set to 1"
+set g_warmup_limit 60	"if set to -1 the warmup-stage is not affected by any timelimit, if set to 0 the usual timelimit also affects warmup-stage, otherwise warmup will be limited to this time (useful for public matches)"
+set g_warmup_allow_timeout 0	"if set to 0 you cannot use the calltimeout command during the warmup-stage but only during the match stage"
+set g_warmup_allguns 0	"if set players start with all guns in warmup mode"
+set g_warmup_start_health 250	"starting values when being in warmup-stage"
 set g_warmup_start_armor 100
 set g_warmup_start_ammo_shells 50
 set g_warmup_start_ammo_nails 150
 set g_warmup_start_ammo_rockets 50
 set g_warmup_start_ammo_cells 50
 
-set g_chat_nospectators 0 //if set the chat sent by spectators or observers while being in match-stage can only seen by other specs/observers
-set sv_vote_nospectators 0 //if set only players can call a vote during the match-stage (thus spectators and observers can't call a vote then)
+set g_chat_nospectators 0	"if set the chat sent by spectators or observers while being in match-stage can only seen by other specs/observers"
+set sv_vote_nospectators 0	"if set only players can call a vote during the match-stage (thus spectators and observers can't call a vote then)"
 
 alias g_tourney "g_tourney_$1"
 alias g_tourney_1 "g_warmup 1; g_chat_nospectators 1; sv_vote_nospectators 1"
 alias g_tourney_0 "g_warmup 0; g_chat_nospectators 0; sv_vote_nospectators 0"
 
-set sv_timeout 0 //allows a player to call a timeout, this will pause the game for some time
-set sv_timeout_length 120 //how long the game will be paused at max, in seconds
-set sv_timeout_number 2 //how many timeouts one player is allowed to call (gets reset after a restart)
-set sv_timeout_leadtime 4 //how long the players will be informed that a timeout was calledbefore it starts, in seconds
-set sv_timeout_resumetime 3 //how long the remaining timeout-time will be after a player called the resumegame command
+set sv_timeout 0	"allows a player to call a timeout, this will pause the game for some time"
+set sv_timeout_length 120	"how long the game will be paused at max, in seconds"
+set sv_timeout_number 2	"how many timeouts one player is allowed to call (gets reset after a restart)"
+set sv_timeout_leadtime 4	"how long the players will be informed that a timeout was calledbefore it starts, in seconds"
+set sv_timeout_resumetime 3	"how long the remaining timeout-time will be after a player called the resumegame command"
 
 // use default physics
-exec physicsQBR.cfg
+exec physics25.cfg
 
-set sv_pogostick 0 // don't require releasing the space bar for jumping again
-set sv_doublejump 0 // allow Quake 2-style double jumps
+set sv_pogostick 0	"don't require releasing the space bar for jumping again"
+set sv_doublejump 0	"allow Quake 2-style double jumps"
 
 seta sv_precacheplayermodels 1
 seta sv_precacheweapons 0
@@ -179,7 +288,7 @@
 seta sv_defaultcharacter 0
 seta sv_defaultplayermodel models/player/nexus.zym
 seta sv_defaultplayerskin 0
-seta sv_defaultplayermodel_red "" // "" means see sv_defaultplayermodel
+seta sv_defaultplayermodel_red ""	"\"\" means see sv_defaultplayermodel"
 seta sv_defaultplayerskin_red 0
 seta sv_defaultplayermodel_blue ""
 seta sv_defaultplayerskin_blue 0
@@ -187,12 +296,12 @@
 seta sv_defaultplayerskin_yellow 0
 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
+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
 net_messagetimeout 300
 net_connecttimeout 30
 sv_jumpstep 1 // step up stairs while jumping, makes it easier to reach ledges
-set ekg 0
+set ekg 0	"Throw huge amounts of gibs"
 
 cl_movement 1
 cl_stairsmoothspeed 200
@@ -219,14 +328,14 @@
 seta cl_autoswitch 1
 alias autoswitch "set cl_autoswitch $1 ; cmd autoswitch $1"
 
-seta cl_playerdetailreduction 0 // the higher, the less detailed
+seta cl_playerdetailreduction 0	"the higher, the less detailed"
 
-set bot_number 0 // number of bots in server
-seta bot_usemodelnames 0 // whether bots should be named after the models
-set bot_nofire 0 // makes bots not attack at all, mainly for testing in g_waypointeditor mode
-seta bot_prefix [BOT]
-seta bot_suffix ""
-seta skill_auto 0 // when 1, "skill" gets adjusted to match the best player on the map
+set bot_number 0	"Minimum number of bots"
+seta bot_usemodelnames 0	"Use player model names for bot names"
+set bot_nofire 0	"When set, bots never fire. Mainly for testing in g_waypointeditor mode"
+seta bot_prefix [BOT]	"Prefix in front of the bot names"
+seta bot_suffix ""	"Suffix behind the bot names"
+seta skill_auto 0	"when 1, \"skill\" gets adjusted to match the best player on the map"
 // general bot AI cvars
 set bot_ai_thinkinterval 0.05
 set bot_ai_strategyinterval 2
@@ -256,19 +365,19 @@
 set bot_ai_aimskill_order_filter_3th 0.05
 set bot_ai_aimskill_order_filter_4th 0.25
 set bot_ai_aimskill_order_filter_5th 0.3
-set bot_ai_custom_weapon_priority_distances "200 1000" // Define close and far distances in any order, the bots will detect middle distances automatically. 
-set bot_ai_custom_weapon_priority_far   "11 7 15 14 4 5 8 13 6 1 3 9 2" // Desired weapons in any order. Up to the max ammount of weapons available in the system 
-set bot_ai_custom_weapon_priority_mid   "11 9 4 5 3 7 15 14 6 13 8 2 1" // same as previous 
-set bot_ai_custom_weapon_priority_close "11 3 9 13 14 8 6 4 2 5 7 15 1" // same as previous
-set bot_ai_weapon_combo 1 // Enable weapon combos 
-set bot_ai_weapon_combo_threshold 0.3 // Try to make a combo N seconds after the last attack
+set bot_ai_custom_weapon_priority_distances "200 1000"	"Define close and far distances in any order, the bots will detect middle distances automatically. "
+set bot_ai_custom_weapon_priority_far "11 7 15 14 4 5 8 13 6 1 3 9 2"	"Desired weapons in any order. Up to the max ammount of weapons available in the system "
+set bot_ai_custom_weapon_priority_mid "11 9 4 5 3 7 15 14 6 13 8 2 1"	"same as previous "
+set bot_ai_custom_weapon_priority_close "11 3 9 13 14 8 6 4 2 5 7 15 1"	"same as previous"
+set bot_ai_weapon_combo 1	"Enable weapon combos "
+set bot_ai_weapon_combo_threshold 0.3	"Try to make a combo N seconds after the last attack"
 set bot_ai_friends_aware_pickup_radius "500"
 
 // waypoint editor enable
 set g_waypointeditor 0
-set bot_ignore_bots 0
-set bot_join_empty 0
-set bot_vs_human 0 // set to positive value to make an all-bot blue team, set to negative value to make an all-bot red team, the absolute value is the ratio bots vs humans (1 for equal count)
+set bot_ignore_bots 0	"When set, bots don't shoot at other bots"
+set bot_join_empty 0	"When set, bots also play if no player has joined the server"
+set bot_vs_human 0	"Bots and humans play in different teams when set. positive values to make an all-bot blue team, set to negative values to make an all-bot red team, the absolute value is the ratio bots vs humans (1 for equal count)"
 
 alias g_waypointeditor_spawn "impulse 103"
 alias g_waypointeditor_remove "impulse 104"
@@ -277,7 +386,7 @@
 
 locs_enable 0
 pausable 0
-set g_antilag 2 // 1: re-aim to enemy that was aimed at in the past, 2: shoot completely in the past, 3: client-side hitscan
+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_shootfromeye 0
 set g_shootfromcenter 0
 set g_weapon_stay 0
@@ -286,15 +395,15 @@
 set g_powerup_shield 1
 set g_use_ammunition 1
 set g_pickup_items 1
-set g_minstagib 0		// enable minstagib
-set g_minstagib_extralives 2	// 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 0		"enable minstagib"
+set g_minstagib_extralives 2	"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.05
 set g_minstagib_speed_jumpheight 1.8
 set g_minstagib_speed_moverate 1.25
 set g_vampire 0
-set g_weaponarena "0" // put in a list of weapons to enable a weapon arena mode, or try "all" or "most"
+set g_weaponarena "0"	"put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
 set g_shocknex 0
 set g_laserguided_missile 0
 set g_midair 0
@@ -310,40 +419,40 @@
 set g_norecoil 0
 set g_throughfloor 1
 set g_maplist_mostrecent ""
-seta g_maplist_mostrecent_count 3 // number of most recent maps that are blocked from being played again
+seta g_maplist_mostrecent_count 3	"number of most recent maps that are blocked from being played again"
 seta g_maplist "aggressor aneurysm basement basementctf bleach bloodprison bloodprisonctf bluesky darkzone dieselpower dismal downer evilspace farewell final_rage reslimed ruiner runningman_1on1remix runningman runningmanctf silvercity skyway slimepit soylent starship stormkeep strength toxic warfare"
-seta g_maplist_index 0 // this is used internally for saving position in maplist cycle
-seta g_maplist_selectrandom 0 // if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle
-seta g_maplist_shuffle 1 // new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list.
+seta g_maplist_index 0	"this is used internally for saving position in maplist cycle"
+seta g_maplist_selectrandom 0	"if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
+seta g_maplist_shuffle 1	"new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list."
 // timeout for kill credit when your damage knocks someone into a death trap
-set g_maplist_check_waypoints 0 // when 1, maps are skipped if there currently are bots, but the map has no waypoints
+set g_maplist_check_waypoints 0	"when 1, maps are skipped if there currently are bots, but the map has no waypoints"
 set g_maxpushtime 8.0
 
 set g_cloaked 0
 set g_player_alpha 1
-set g_player_brightness 0 // set to 2 for brighter players
+set g_player_brightness 0	"set to 2 for brighter players"
 seta g_balance_cloaked_alpha 0.25
 
-set welcome_message_time		8
+set welcome_message_time 8
 
-alias clearmap	"disconnect"
+alias clearmap "disconnect"
 
 set g_grappling_hook 0
 set g_balance_grapplehook_health 130
 exec newhook.cfg
 
 // this means that timelimit can be overidden globally and fraglimit can be overidden for each game mode: DM/TDM, Domination, CTF, and Runematch.
-seta timelimit_override -1
-seta fraglimit_override -1
-seta capturelimit_override -1 // actual captures, if g_ctf_win_mode 0 or 1
-seta g_ctf_capture_limit -1   // points, if g_ctf_win_mode 2
-seta g_domination_point_limit -1
-seta g_runematch_point_limit -1
-seta g_keyhunt_point_limit -1
-seta g_race_laps_limit -1
+seta timelimit_override -1	"Time limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta fraglimit_override -1	"Frag limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta capturelimit_override -1	"Capture limit limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_ctf_capture_limit -1	"CTF capture limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_domination_point_limit -1	"Domination point limit limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_runematch_point_limit -1	"Runematch point limit limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_keyhunt_point_limit -1	"Keyhunt point limit limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_race_laps_limit -1	"Race laps limit limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 
-seta g_ctf_win_mode 0 // 0: captures only, 1: captures, then points, 2: points only
-seta g_ctf_ignore_frags 0 // 1: regular frags give no points
+seta g_ctf_win_mode 0	"0: captures only, 1: captures, then points, 2: points only"
+seta g_ctf_ignore_frags 0	"1: regular frags give no points"
 
 // 50% of the spawns shall be far away from any players
 set g_spawn_furthest 0.5
@@ -371,30 +480,25 @@
 seta timelimit_maxovertime 5
 
 // common team values
-set  g_tdm				0
+set g_tdm 0
 
-seta teamplay_default			4	// default teamplay setting in team games
-  // 1 = no friendly fire, self damage
-  // 2 = friendly fire and self damage enabled
-  // 3 = no friendly fire, but self damage enabled
-  // 4 = obey the following four cvars
-seta g_mirrordamage 0.3              // for teamplay 4: mirror damage factor
-seta g_friendlyfire 0.1              // for teamplay 4: fiendly fire factor
-seta g_teamdamage_threshold  50      // for teamplay 4: threshold over which to apply mirror damage
-seta g_teamdamage_resetspeed 30      // for teamplay 4: how fast player's teamdamage count decreases
+seta teamplay_defaul 4	"default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the following four cvars"
+seta g_mirrordamage 0.3	"for teamplay 4: mirror damage factor"
+seta g_friendlyfire 0.1	"for teamplay 4: fiendly fire factor"
+seta g_teamdamage_threshold 50	"for teamplay 4: threshold over which to apply mirror damage"
+seta g_teamdamage_resetspeed 30	"for teamplay 4: how fast player's teamdamage count decreases"
 
-set deathmatch_force_teamplay		0	// always play TDM on dm maps
-seta g_balance_teams			0	// automatically balance out players entering instead of asking them for their preferred team
-seta g_balance_teams_force		0	// automatically balance out teams when players move or disconnect
-seta g_balance_teams_complain   0   // when 1, complain when team balance is off
-seta g_balance_teams_prevent_imbalance	0	// prevent players from changing to larger teams
-seta g_tdm_teams			2	// how many teams are in team deathmatch
-set g_changeteam_banned			0	// not allowed to change team
-set g_changeteam_fragtransfer		0	// % of frags you get to keep when you change teams (rounded down)
+set deathmatch_force_teamplay		0	"Always play TDM instead of DM"
+seta g_balance_teams			0	"automatically balance out players entering instead of asking them for their preferred team"
+seta g_balance_teams_force		0	"automatically balance out teams when players move or disconnect"
+seta g_balance_teams_prevent_imbalance	0	"prevent players from changing to larger teams"
+seta g_tdm_teams			2	"how many teams are in team deathmatch"
+set g_changeteam_banned			0	"not allowed to change team"
+set g_changeteam_fragtransfer		0	"% of frags you get to keep when you change teams (rounded down)"
 
 // dm
 set g_dm 1
-set gamecfg 1 // deathmatch
+set gamecfg 1	// "deathmatch"
 
 // ctf
 set g_ctf 0
@@ -403,37 +507,37 @@
 set g_ctf_flagcarrier_selfforce 1
 set g_ctf_fullbrightflags 0
 set g_ctf_dynamiclights 0
-set g_ctf_allow_drop 0 // dropping allows circumventing carrierkill score, so enable this with care!
-set g_ctf_reverse 0 // when 1, bases/flags are switched :P you have to capture your OWN flag by bringing it to the ENEMY's
+set g_ctf_allow_drop 1	"dropping allows circumventing carrierkill score, so enable this with care!"
+set g_ctf_reverse 0	"when 1, bases/flags are switched :P you have to capture your OWN flag by bringing it to the ENEMY's"
 set g_balance_ctf_delay_collect 1.0
 set g_balance_ctf_damageforcescale 1
 
-set g_ctf_shield_max_ratio 0 // shield at most 0% of a team from the enemy flag (try: 0.4 for 40%)
-set g_ctf_shield_min_negscore 20 // shield the player from the flag if he's got -20 points or less
-set g_ctf_shield_force 100 // push force of the shield
-                                               
+set g_ctf_shield_max_ratio 0	"shield at most 0% of a team from the enemy flag (try: 0.4 for 40%)"
+set g_ctf_shield_min_negscore 20	"shield the player from the flag if he's got -20 points or less"
+set g_ctf_shield_force 100	"push force of the shield"
+
 exec ctfscoring-div0.cfg
 
 // runematch
 set g_runematch						0
 set g_runematch_pointrate				5
 set g_runematch_pointamt					1
-set g_runematch_shuffletime				30 // how often runes change position
-set g_runematch_respawntime				15 // how soon after being dropped to respawn
+set g_runematch_shuffletime				30 "how often runes change position"
+set g_runematch_respawntime				15 "how soon after being dropped to respawn"
 set g_runematch_frags_killedby_runeholder		4
 set g_runematch_frags_killed_runeholder			5
 set g_runematch_frags_norune				0
-set g_runematch_drop_runes_max				2 // only drop up to 2 runes, the rest should respawn
-set g_runematch_allow_same				0 // allow matching rune-curse pairs
+set g_runematch_drop_runes_max				2 "only drop up to 2 runes, the rest should respawn"
+set g_runematch_allow_same				0 "allow matching rune-curse pairs"
 set g_runematch_rune_alpha				0.78
-set g_runematch_rune_effects				544 // EF_ADDITIVE + EF_FULLBRIGHT
+set g_runematch_rune_effects				544 "EF_ADDITIVE + EF_FULLBRIGHT = 544"
 set g_runematch_rune_glow_size				0
 set g_runematch_rune_glow_color				0
-set g_runematch_rune_color_strength			1.0 //1.5
+set g_runematch_rune_color_strength			1.0
 // strength/weakness
-set g_balance_rune_strength_damage			2.0 //1.5
+set g_balance_rune_strength_damage			2.0
 set g_balance_rune_strength_force			1.5
-set g_balance_curse_weak_damage				0.5 //0.6
+set g_balance_curse_weak_damage				0.5
 set g_balance_curse_weak_force				0.6
 set g_balance_rune_strength_combo_damage	0.9
 set g_balance_rune_strength_combo_force			1.0
@@ -453,7 +557,7 @@
 set g_balance_curse_venom_hpmod				0.6
 set g_balance_rune_regen_combo_hpmod			0.9
 set g_balance_rune_regen_regenrate			3.0
-set g_balance_curse_venom_rotrate			3.0 //2
+set g_balance_curse_venom_rotrate			3.0
 set g_balance_rune_regen_combo_regenrate	0.5
 set g_balance_rune_regen_combo_rotrate			1.5
 set g_balance_rune_regen_limitmod			1
@@ -472,13 +576,13 @@
 
 // domination
 set g_domination			0
-set g_domination_default_teams		2 // default number of teams for maps that aren't domination-specific
-set g_domination_disable_frags		0 // players can't get frags normally, only get points from kills
-set g_domination_point_amt		0 // override: how many points to get per ping
-set g_domination_point_rate		0 // override: how often to give those points
-set g_domination_point_capturetime	0.1 // how long it takes to capture a point (given no interference)
-set g_domination_point_glow		0 // domination point glow (warning, slow)
-//set g_domination_balance_team_points	1 // # of points received is based on team sizes
+set g_domination_default_teams		2 "default number of teams for maps that aren't domination-specific"
+set g_domination_disable_frags		0 "players can't get frags normally, only get points from kills"
+set g_domination_point_amt		0 "override: how many points to get per ping"
+set g_domination_point_rate		0 "override: how often to give those points"
+set g_domination_point_capturetime	0.1 "how long it takes to capture a point (given no interference)"
+set g_domination_point_glow		0 "domination point glow (warning, slow)"
+//set g_domination_balance_team_points	1 "# of points received is based on team sizes"
 
 // last man standing
 set g_lms 0
@@ -491,18 +595,18 @@
 set g_lms_start_ammo_cells 50
 set g_lms_regenerate 0
 set g_lms_campcheck_interval 10
-set g_lms_campcheck_message "^1Don't camp!"
+set g_lms_campcheck_message "^1Don't	camp!"
 set g_lms_campcheck_damage 100
 set g_lms_campcheck_distance 1800
-set g_lms_last_join 3			// if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives
-set g_lms_join_anytime 1		// if true, new players can join, but get same amount of lives as the worst player
+set g_lms_last_join 3			"if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives"
+set g_lms_join_anytime 1		"if true, new players can join, but get same amount of lives as the worst player"
 
 // arena
 set g_arena 0
-set g_arena_maxspawned 2	// maximum number of players to spawn at once (the rest is spectating, waiting for their turn)
-set g_arena_roundbased 1	// if disabled, the next player will spawn as soon as someone dies
-set g_arena_warmup 5		// time, newly spawned  players have to prepare themselves in round based matches
-set g_arena_powerups 0		// enables powerups (superhealth, strength and shield), which are removed by default
+set g_arena_maxspawned 2	"maximum number of players to spawn at once (the rest is spectating, waiting for their turn)"
+set g_arena_roundbased 1	"if disabled, the next player will spawn as soon as someone dies"
+set g_arena_warmup 5		"time, newly spawned players have to prepare themselves in round based matches"
+set g_arena_powerups 0		"enables powerups (superhealth, strength and shield), which are removed by default"
 
 // onslaught
 set g_onslaught 0
@@ -519,7 +623,7 @@
 // Normal race uses fraglimit as a limit for the laps.
 // Special mode: g_race_qualifying 2. First runs a qualifying, after
 // ready-restart it turns into a race. TODO not done yet (e.g. timing display)
-set g_race_teams 0 // when 2, 3, or 4, the race is played as a team game (the team members can add up their laps)
+set g_race_teams 0	"when 2, 3, or 4, the race is played as a team game (the team members can add up their laps)"
 
 // server game balance settings
 set g_balance_armor_regen 0
@@ -563,7 +667,7 @@
 set g_balance_pause_health_rot_spawn 10
 set g_balance_pause_health_regen_spawn 0
 
-set g_footsteps 0 // serverside footstep sounds
+set g_footsteps 0	"serverside footstep sounds"
 
 // effects
 r_picmipsprites 0 // Nexuiz uses sprites that should never be picmipped (team mate, typing, waypoints)
@@ -602,6 +706,8 @@
 sv_sound_land ""
 sv_sound_watersplash ""
 
+seta cl_hitsound 1
+
 // startmap_dm is used when running with the -listen or -dedicated commandline options
 alias startmap_dm "set _sv_init 1; map aggressor"
 
@@ -631,9 +737,11 @@
 alias _weapprev_101 "impulse 16"
 alias _weapprev_110 "impulse 19"
 alias _weapprev_111 "impulse 16"
-set _supports_weaponpriority 0 // set to 1 by csqc if supported, and to 0 on disconnect
+set _supports_weaponpriority 0	"set to 1 by csqc if supported, and to 0 on disconnect"
 alias weapbest "impulse 13"
 
+alias reload "impulse 20"
+
 // movement
 bind w +forward
 bind a +moveleft
@@ -665,6 +773,7 @@
 bind MOUSE5 +hook
 bind MWHEELUP weapnext
 bind MWHEELDOWN weapprev
+bind r reload
 bind BACKSPACE dropweapon
 bind g dropweapon
 bind f +use
@@ -675,9 +784,10 @@
 bind ~ toggleconsole
 bind TAB +showscores
 bind ESCAPE togglemenu
-bind r messagemode2
 bind t messagemode
 bind y messagemode2
+bind z messagemode2
+bind u "+con_chat_maximize"
 bind i +show_info
 bind PAUSE pause
 bind F10 quit
@@ -730,35 +840,24 @@
 bind kp_pgup "+userbind 11"
 bind kp_multiply "+userbind 12"
 bind kp_slash "+userbind 13"
-bind kp_enter "+userbind 15"
-bind kp_plus "+userbind 16"
-bind kp_minus "+userbind 17"
+bind kp_enter "+userbind 16"
+bind kp_plus "+userbind 17"
+bind kp_minus "+userbind 18"
 
-// these commands can be voted
-set sv_vote_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick"
+set sv_vote_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick cointoss" "these commands can be voted"
 set sv_vote_only_commands ""
-set sv_vote_master_commands "" // maybe add kickban here (but then sv_vote_master 0)
+set sv_vote_master_commands ""	"maybe add kickban here (but then sv_vote_master 0)"
 set rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban\" status \"sv_cmd teamstatus\""
-// users can call a vote for the above commands
-set sv_vote_call 1
-// users can call a vote to become master
-set sv_vote_master 1
-// when set, users can use "vdo login (password)" to log in as master
-set sv_vote_master_password ""
-// set to 1 to allow to change you vote/mind
-set sv_vote_change 0
-// set to 1 to count votes once after timeout or to 0 to count with every vote
-set sv_vote_singlecount 0
-// a vote will timeout after this many seconds
-set sv_vote_timeout 60
-// a player can not call a vote again for this many seconds
-set sv_vote_wait 120
-// which quotient of the PLAYERS constitute a majority? (try: 0.667, 0.75 when using the above)
-set sv_vote_majority_factor 0.5
-// which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)
-set sv_vote_simple_majority_factor 0
-// note: set these two equal to JUST support simple majorities
-// when disabled, don't allow game type changes
+set sv_vote_call 1	"users can call a vote for the above commands"
+set sv_vote_master 1	"users can call a vote to become master"
+set sv_vote_master_password ""	"when set, users can use \"vdo login (password)\" to log in as master"
+set sv_vote_change 0	"set to 1 to allow to change you vote/mind"
+set sv_vote_singlecount 0	"set to 1 to count votes once after timeout or to 0 to count with every vote"
+set sv_vote_timeout 60	"a vote will timeout after this many seconds"
+set sv_vote_wait 120	"a player can not call a vote again for this many seconds"
+set sv_vote_majority_factor 0.5	"which quotient of the PLAYERS constitute a majority? (try: 0.667, 0.75 when using the above)"
+set sv_vote_simple_majority_factor 0	"which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)"
+// when disabled, don't allow game type changes "note: set these two equal to JUST support simple majorities"
 set sv_vote_override_mostrecent 0
 alias vhelp "cmd vote help"
 alias vstatus "cmd vote status"
@@ -800,13 +899,13 @@
 set g_balance_nixnex_ammoincr_cells 2
 
 // score log
-set sv_logscores_console 0		// print scores to server console
-set sv_logscores_file 0			// print scores to file
-set sv_logscores_filename scores.log	// filename
-set sv_logscores_bots 0			// exclude bots by default
+set sv_logscores_console 0		"print scores to server console"
+set sv_logscores_file 0			"print scores to file"
+set sv_logscores_filename scores.log	"filename"
+set sv_logscores_bots 0			"exclude bots by default"
 
 // spam (frag/capture) log
-set sv_eventlog 0 // the master switch for efficiency reasons
+set sv_eventlog 0	"the master switch for efficiency reasons"
 set sv_eventlog_console 1
 set sv_eventlog_files 0
 set sv_eventlog_files_timestamps 1
@@ -814,10 +913,10 @@
 set sv_eventlog_files_nameprefix nexuiz
 set sv_eventlog_files_namesuffix .log
 
-set nextmap "" // override the maplist when switching to the next map
+set nextmap ""	"override the maplist when switching to the next map"
 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_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)"
 
 // singleplayer campaign
 set g_campaign 0
@@ -847,41 +946,43 @@
 
 set sv_motd ""
 
-seta cl_shownames 1 // show player names pointed to (0: never, 1: teamplay only, 2: always)
+seta cl_shownames 1	"show player names pointed to (0: never, 1: teamplay only, 2: always)"
 set sv_allow_shownames 1
 
 net_banlist ""
 seta _alientrap_net_banlist ""
 
-set g_waypoints_for_items 1 // make waypoints out of items,  values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always
+set g_waypoints_for_items 1	"make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
 
 set g_projectiles_newton_style 2
 // possible values:
-//   0: absolute velocity projectiles (like Quake)
-//   1: relative velocity projectiles, "Newtonian" (like Tribes 2)
-//   2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
-//   3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-//   4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
+//	0: absolute velocity projectiles (like Quake)
+//	1: relative velocity projectiles, "Newtonian" (like Tribes 2)
+//	2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
+//	3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
+//	4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
 
-seta g_maplist_votable 5
+seta g_maplist_votable 6
 seta g_maplist_votable_keeptwotime 15
-seta g_maplist_votable_timeout 30 // note: must be below 50 seconds!
+seta g_maplist_votable_timeout 30	"note: must be below 50 seconds!"
 seta g_maplist_votable_suggestions 2
 seta g_maplist_votable_suggestions_override_mostrecent 0
-seta g_maplist_votable_nodetail 1 // nodetail only shows total count instead of all vote counts per map, so votes don't influence others that much
-seta g_maplist_votable_abstain 0 // when 1, you can abstain from your vote
-seta g_maplist_votable_screenshot_dir "maps" // where to look for map screenshots
-seta g_maplist_textonly 0 // use old style centerprint
+seta g_maplist_votable_nodetail 1	"nodetail only shows total count instead of all vote counts per map, so votes don't influence others that much"
+seta g_maplist_votable_abstain 0	"when 1, you can abstain from your vote"
+seta g_maplist_votable_screenshot_dir "maps"	"where to look for map screenshots"
+seta g_maplist_textonly 0	"use old style centerprint"
 alias suggestmap "cmd suggestmap $1"
 
-set g_chat_flood_spl 3            // seconds between lines to not count as flooding
-set g_chat_flood_lmax 2           // maximum number of lines per chat message at once
-set g_chat_flood_burst 2          // allow bursts of so many chat lines
-set g_chat_flood_spl_team 1       // \
-set g_chat_flood_lmax_team 2      //  } same for say_team
-set g_chat_flood_burst_team 2     // /
-set g_chat_flood_notify_flooder 1 // when 0, the flooder still can see his own message
-set g_chat_teamcolors 0           // colorize nicknames in team color for chat
+set g_chat_flood_spl 3	"normal chat: seconds between lines to not count as flooding"
+set g_chat_flood_lmax 2	"normal chat: maximum number of lines per chat message at once"
+set g_chat_flood_burst 2	"normal chat: allow bursts of so many chat lines"
+set g_chat_flood_spl_team 1	"team chat:seconds between lines to not count as flooding"
+set g_chat_flood_lmax_team 2	"team chat: maximum number of lines per chat message at once"
+set g_chat_flood_burst_team 2	"team chat: allow bursts of so many chat lines"
+set g_chat_flood_notify_flooder 1	"when 0, the flooder still can see his own message"
+set g_chat_teamcolors 0	"colorize nicknames in team color for chat"
+set g_voice_flood_spv 4	"normal voices: seconds between voices to not count as flooding"
+set g_voice_flood_spv_team 2	"team voices: seconds between voices to not count as flooding"
 
 set g_waypointsprite_normdistance 512
 set g_waypointsprite_minscale 1
@@ -893,32 +994,32 @@
 set g_waypointsprite_limitedrange 5120
 set g_waypointsprite_stuffbinds 0
 set g_waypointsprite_scale 1
-alias "g_waypointsprite_personal"       "impulse 30"
-alias "g_waypointsprite_personal_p"     "impulse 31"
-alias "g_waypointsprite_personal_d"     "impulse 32"
-alias "g_waypointsprite_team_helpme"    "impulse 33"
-alias "g_waypointsprite_team_here"      "impulse 34"
-alias "g_waypointsprite_team_here_p"    "impulse 35"
-alias "g_waypointsprite_team_here_d"    "impulse 36"
-alias "g_waypointsprite_team_danger"    "impulse 37"
-alias "g_waypointsprite_team_danger_p"  "impulse 38"
-alias "g_waypointsprite_team_danger_d"  "impulse 39"
-alias "g_waypointsprite_clear_personal" "impulse 47"
-alias "g_waypointsprite_clear"          "impulse 48"
-alias "g_waypointsprite_toggle"         "impulse 49"
+alias "g_waypointsprite_personal"	"impulse 30"
+alias "g_waypointsprite_personal_p"	"impulse 31"
+alias "g_waypointsprite_personal_d"	"impulse 32"
+alias "g_waypointsprite_team_helpme"	"impulse 33"
+alias "g_waypointsprite_team_here"	"impulse 34"
+alias "g_waypointsprite_team_here_p"	"impulse 35"
+alias "g_waypointsprite_team_here_d"	"impulse 36"
+alias "g_waypointsprite_team_danger"	"impulse 37"
+alias "g_waypointsprite_team_danger_p"	"impulse 38"
+alias "g_waypointsprite_team_danger_d"	"impulse 39"
+alias "g_waypointsprite_clear_personal"	"impulse 47"
+alias "g_waypointsprite_clear"	"impulse 48"
+alias "g_waypointsprite_toggle"	"impulse 49"
 // key for that?
 seta cl_hidewaypoints 0
 
 // command extension
-alias qc_cmd               "sv_cmd $*" // menu QC will override this to menu_cmd
-alias adminmsg             "sv_cmd adminmsg $*"
-alias teamstatus           "cmd teamstatus; sv_cmd teamstatus" // yes, it is broken on listen servers that way, but well, who cares :P
-alias printstats           "sv_cmd printstats" // print status on demand
-alias g_maplist_add        "qc_cmd maplist add $*"
-alias g_maplist_remove     "qc_cmd maplist remove $*"
-alias g_maplist_putfirst   "qc_cmd maplist remove $* ; qc_cmd maplist add $*"
-alias g_maplist_shufflenow "qc_cmd maplist shuffle"
-alias gametype             "sv_cmd gametype $*"
+alias qc_cmd	"sv_cmd $*" // menu QC will override this to menu_cmd
+alias adminmsg	"sv_cmd adminmsg $*"
+alias teamstatus	"cmd teamstatus; sv_cmd teamstatus" // yes, it is broken on listen servers that way, but well, who cares :P
+alias printstats	"sv_cmd printstats" // print status on demand
+alias g_maplist_add	"qc_cmd maplist add $*"
+alias g_maplist_remove	"qc_cmd maplist remove $*"
+alias g_maplist_putfirst	"qc_cmd maplist remove $* ; qc_cmd maplist add $*"
+alias g_maplist_shufflenow	"qc_cmd maplist shuffle"
+alias gametype	"sv_cmd gametype $*"
 
 // key hunt
 set g_keyhunt 0
@@ -943,11 +1044,11 @@
 set g_keyhunt_teams 0
 
 // so it can be stuffcmd-ed still
-set cl_gravity 800 // but ignored anyway
+set cl_gravity 800	"but ignored anyway"
 
-set g_ban_default_bantime 5400 // 90 minutes
-set g_ban_default_masksize 3   // whole 255.255.255.0 networks (set to 4 for single IPs)
-set g_banned_list ""           // format: 1 ip remainingtime ip remainingtime ...
+set g_ban_default_bantime 5400	"90 minutes"
+set g_ban_default_masksize 3	"whole 255.255.255.0 networks (set to 4 for single IPs)"
+set g_banned_list ""	"format: 1 ip remainingtime ip remainingtime ..."
 alias bans "sv_cmd bans"
 alias ban "sv_cmd ban $*"         // usage: ban address(maybe incomplete, like 1.2.3) bantime(seconds)
 alias kickban "sv_cmd kickban $*" // usage: kickban # playerno bantime(seconds) masksize(bytes)
@@ -977,14 +1078,14 @@
 seta "userbind11_press" "say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here";  seta "userbind11_release" "";  seta "userbind11_description" "team: attacking, icon"
 seta "userbind12_press" "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p"; seta "userbind12_release" ""; seta "userbind12_description" "team: killed flag, icon"
 seta "userbind13_press" "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"; seta "userbind13_release" ""; seta "userbind13_description" "team: dropped flag, icon"
-seta "userbind14_press" "say_team dropped gun %w (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop, icon"
-seta "userbind15_press" "say :-) / nice one"; seta "userbind15_release" ""; seta "userbind15_description" "chat: nice one"
-seta "userbind16_press" "say good game"; seta "userbind16_release" ""; seta "userbind16_description" "chat: good game"
-seta "userbind17_press" "say hi / good luck and have fun"; seta "userbind17_release" ""; seta "userbind17_description" "chat: hi / good luck"
-seta "userbind18_press" "+showscores; +con_chat_maximize"; seta "userbind18_release" "-showscores; -con_chat_maximize"; seta "userbind18_description" "scoreboard / chat history"
-seta "userbind19_press" "toggle cl_capturevideo"; seta "userbind19_release" ""; seta "userbind19_description" "toggle recording .avi"
-seta "userbind20_press" "toggle vid_fullscreen; vid_restart"; seta "userbind20_release" ""; seta "userbind20_description" "toggle fullscreen"
-seta "userbind21_press" ""; seta "userbind21_release" ""; seta "userbind21_description" ""
+seta "userbind14_press" "say_team dropped gun %w (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
+seta "userbind15_press" "say_team dropped flag/key %w (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
+seta "userbind16_press" "say :-) / nice one"; seta "userbind16_release" ""; seta "userbind16_description" "chat: nice one"
+seta "userbind17_press" "say good game"; seta "userbind17_release" ""; seta "userbind17_description" "chat: good game"
+seta "userbind18_press" "say hi / good luck and have fun"; seta "userbind18_release" ""; seta "userbind18_description" "chat: hi / good luck"
+seta "userbind19_press" "+showscores; +con_chat_maximize"; seta "userbind19_release" "-showscores; -con_chat_maximize"; seta "userbind19_description" "scoreboard / chat history"
+seta "userbind20_press" "toggle cl_capturevideo"; seta "userbind20_release" ""; seta "userbind20_description" "toggle recording .avi"
+seta "userbind21_press" "toggle vid_fullscreen; vid_restart"; seta "userbind21_release" ""; seta "userbind21_description" "toggle fullscreen"
 seta "userbind22_press" ""; seta "userbind22_release" ""; seta "userbind22_description" ""
 seta "userbind23_press" ""; seta "userbind23_release" ""; seta "userbind23_description" ""
 seta "userbind24_press" ""; seta "userbind24_release" ""; seta "userbind24_description" ""
@@ -1026,14 +1127,15 @@
 // for menu server list (eventually make them have engine support?)
 seta menu_slist_showfull 1
 seta menu_slist_showempty 1
+set menu_slist_modfilter "!havoc"
 
 // for menu weapon arena
 set menu_weaponarena_with_laser 0
 
 // Q3A
-set sv_q3acompat_machineshotgunswap 0 // settemp this in mapinfo for instant Q3A map conversion
+set sv_q3acompat_machineshotgunswap 0	"settemp this in mapinfo for instant Q3A map conversion"
 
-seta menu_maxplayers 8 // maxplayers value when the menu starts a game
+seta menu_maxplayers 8	"maxplayers value when the menu starts a game"
 
 // useful vote aliases
 set timelimit_increment 5
@@ -1056,15 +1158,15 @@
 alias -con_chat_maximize "_restore_con_chatvars"
 
 // tab completion
-set con_completion_playdemo *.dem
-set con_completion_timedemo *.dem
-set con_completion_ply      *.dem
-set con_completion_tdem     *.dem
-set con_completion_exec     *.cfg
-set con_completion_chmap    map
-set con_completion_gotomap  map
-set con_completion_vmap     map
-set con_completion_vdomap   map
+set con_completion_playdemo	*.dem
+set con_completion_timedemo	*.dem
+set con_completion_ply		*.dem
+set con_completion_tdem		*.dem
+set con_completion_exec		*.cfg
+set con_completion_chmap	map
+set con_completion_gotomap	map
+set con_completion_vmap		map
+set con_completion_vdomap	map
 
 // these non-saved engine cvars shall be savedG
 seta cl_port $cl_port
@@ -1092,7 +1194,7 @@
 gl_texturecompression_q3bsplightmaps 0
 gl_texturecompression_sky 1
 
-set menu_mouse_absolute 0 // TODO make this seta if the engine understands this right
+set menu_mouse_absolute 0	"TODO make this seta if the engine understands this right"
 seta menu_mouse_speed 1
 set menu_use_default_hostname 1
 alias sethostname "set menu_use_default_hostname 0; hostname $*"
@@ -1103,7 +1205,7 @@
 // Audio track names (for old-style "cd loop NUMBER" usage)
 cd remap digital-pursuit breakdown-easy brainsukker chaos-fog infight neuronal-diving subcities thru-the-mirror calling-bogus beast-of-insanity
 set sv_intermission_cdtrack brainsukker
-set menu_cdtrack digital-pursuit
+set menu_cdtrack calling-bogus
 
 // maxidle (in seconds): kick players idle for more than that amount of time
 set sv_maxidle 0
@@ -1119,8 +1221,8 @@
 alias sbar_font "loadfont user1 $*; loadfont user2 ${*}-big; sbar_columns_set"
 seta sbar_columns default
 sbar_font gfx/vera-sans
-seta sbar_showbinds 1 // 0 disables display of keybinds, 1 enables it, 2 displays longer strings
-seta sbar_showbinds_limit 2 // display so many found keybinds, 0 for unlimited
+seta sbar_showbinds 1	"0 disables display of keybinds, 1 enables it, 2 displays longer strings"
+seta sbar_showbinds_limit 2	"display so many found keybinds, 0 for unlimited"
 
 // these entities are not referenced by anything directly, they just represent
 // teams and are found by find() when needed
@@ -1128,21 +1230,21 @@
 
 sv_allowdownloads_inarchive 1 // for csprogs.dat
 
-set g_jump_grunt 0 // Do you make a grunting noise every time you jump? Is it the same grunting noise every time?
+set g_jump_grunt 0	"Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
 
 alias allready "sv_cmd allready"
 
 // note: these cvars use weapon NUMBERS. Use the menu to edit this cvar, or look the numbers up in qcsrc/common/constants.qh.
-seta cl_weaponpriority "14 13 9 8 11 7 6 5 4 15 3 2 1 10 12" // default porto and hook as LOW priority, use the weapon key numbers otherwise
+seta cl_weaponpriority "14 13 9 8 11 7 6 5 4 15 3 2 1 10 12" "default porto and hook as LOW priority, use the weapon key numbers otherwise"
 seta cl_weaponpriority_useforcycling 0
 // impulse 200, 210, 220:
-seta cl_weaponpriority0 "14 9 8 4"    // explosives    (RL Hagar Mortar)
+seta cl_weaponpriority0 "14 9 8 4"    "explosives    (RL Hagar Mortar)"
 // impulse 201, 211, 221:
-seta cl_weaponpriority1 "13 7 6 5 1"  // energy        (Nex Crylink Electro Laser)
-seta cl_weaponpriority2 "15 11 7 3"   // hitscan exact (Nex MG)
-seta cl_weaponpriority3 "15 11 7 3 2" // hitscan all   (Nex MG Shotgun)
-seta cl_weaponpriority4 "13 8 6 5 2"  // spam          (Hagar Crylink Electro Shotgun)
-seta cl_weaponpriority5 "1 12 10"     // for moving    (Laser Hook Port-O-Launch)
+seta cl_weaponpriority1 "13 7 6 5 1"  "energy        (Nex Crylink Electro Laser)"
+seta cl_weaponpriority2 "15 11 7 3"   "hitscan exact (Nex MG)"
+seta cl_weaponpriority3 "15 11 7 3 2" "hitscan all   (Nex MG Shotgun)"
+seta cl_weaponpriority4 "13 8 6 5 2"  "spam          (Hagar Crylink Electro Shotgun)"
+seta cl_weaponpriority5 "1 12 10"     "for moving    (Laser Hook Port-O-Launch)"
 seta cl_weaponpriority6 ""
 seta cl_weaponpriority7 ""
 seta cl_weaponpriority8 ""
@@ -1169,21 +1271,21 @@
 set g_weaponreplace_hlac ""
 set g_weaponreplace_campingrifle ""
 
-seta sv_status_privacy 1 // hide IP addresses from "status" replies shown to clients
+seta sv_status_privacy 1	"hide IP addresses from \"status\" replies shown to clients"
 
 seta cl_teamradar 1
-seta cl_teamradar_background_alpha 0.4 // set to -1 to disable
-seta cl_teamradar_foreground_alpha 0.8 // alpha of the map
+seta cl_teamradar_background_alpha 0.4	"set to -1 to disable"
+seta cl_teamradar_foreground_alpha 0.8	"alpha of the map"
 seta cl_teamradar_scale 4096
-seta cl_teamradar_rotation 0 // rotation mode: you set what points up. 0 = player, 1 = west, 2 = south, 3 = east, 4 = north
+seta cl_teamradar_rotation 0	"rotation mode: you set what points up. 0 = player, 1 = west, 2 = south, 3 = east, 4 = north"
 seta cl_teamradar_size "128 128"
-seta cl_teamradar_position "0 0" // 1 1 would be lower right corner, 0.5 0.5 the center (ARGH) :P
-seta cl_teamradar_zoommode 0 // zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out
+seta cl_teamradar_position "0 0" "1 1 would be lower right corner, 0.5 0.5 the center (ARGH) :P"
+seta cl_teamradar_zoommode 0	"zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out"
 alias cl_teamradar_rotate "toggle cl_teamradar_rotation 0 1 2 3 4"
 
-set g_maplist_allow_hidden 1 // allow hidden maps to be, e.g., voted for and in the maplist
+set g_maplist_allow_hidden 1	"allow hidden maps to be, e.g., voted for and in the maplist"
 
-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
+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"
 	if_dedicated set g_start_delay 15
 
 alias ons_map           "cl_cmd radar" // legacy alias
@@ -1197,9 +1299,9 @@
 alias _gl_flashblend_update_11 "gl_flashblend 0"
 alias gl_flashblend_update "_gl_flashblend_update_$r_shadow_realtime_dlight$r_showsurfaces"
 
-set sv_clones 0 // number of clones a player may make (reset by the "kill" command) a04191b92fbd93aa67214ef7e72d6d2e
+set sv_clones 0	"number of clones a player may make (reset by the \"kill\" command)"
 
-set cl_handicap 1 // the higher, the more damage you will receive (client setting)
+set cl_handicap 1	"the higher, the more damage you will receive (client setting)"
 
 exec turrets.cfg
 
@@ -1210,20 +1312,20 @@
 bind f5 menu_showteamselect
 
 set g_bugrigs 0
-set g_bugrigs_planar_movement 1 // BROTRR bug emulation
-set g_bugrigs_planar_movement_car_jumping 1 // my own bug
-set g_bugrigs_reverse_speeding 1 // BROTRR bug emulation
-set g_bugrigs_reverse_spinning 1 // BROTRR bug emulation
-set g_bugrigs_reverse_stopping 1 // BROTRR bug emulation
-set g_bugrigs_air_steering 1 // NFS bug emulation
-set g_bugrigs_angle_smoothing 5 // smooth the car angle a bit, looks nice
-set g_bugrigs_friction_floor 50 // units/sec friction on floor
-set g_bugrigs_friction_brake 950 // units/sec friction for braking
-set g_bugrigs_friction_air 0.00001 // (very small) v <- v - v^2 * g_bugrigs_friction_air
-set g_bugrigs_accel 800 // acceleration
-set g_bugrigs_speed_ref 400 // reference speed for accel and steer responsiveness
-set g_bugrigs_speed_pow 2 // reference power for accel and steer responsiveness
-set g_bugrigs_steer 1 // steering amount
+set g_bugrigs_planar_movement 1	"BROTRR bug emulation"
+set g_bugrigs_planar_movement_car_jumping 1	"my own bug"
+set g_bugrigs_reverse_speeding 1	"BROTRR bug emulation"
+set g_bugrigs_reverse_spinning 1	"BROTRR bug emulation"
+set g_bugrigs_reverse_stopping 1	"BROTRR bug emulation"
+set g_bugrigs_air_steering 1	"NFS bug emulation"
+set g_bugrigs_angle_smoothing 5	"smooth the car angle a bit, looks nice"
+set g_bugrigs_friction_floor 50	"units/sec friction on floor"
+set g_bugrigs_friction_brake 950	"units/sec friction for braking"
+set g_bugrigs_friction_air 0.00001	"(very small) v <- v - v^2 * g_bugrigs_friction_air"
+set g_bugrigs_accel 800	"acceleration"
+set g_bugrigs_speed_ref 400	"reference speed for accel and steer responsiveness"
+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
@@ -1233,13 +1335,13 @@
 
 sbar_miniscoreboard_size 0 // this mode is broken in current csqc
 
-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 nexuiz servers (do not include your own server there, or unbanning may fail)
-set g_ban_sync_timeout 45 // time out in seconds for the ban sync requests
-set g_ban_sync_trusted_servers_verify 0 // when set to 1, additional bans sent by the servers are ignored, and only bans for the requested IP are used
+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 nexuiz servers (do not include your own server there, or unbanning may fail)"
+set g_ban_sync_timeout 45	"time out in seconds for the ban sync requests"
+set g_ban_sync_trusted_servers_verify 0	"when set to 1, additional bans sent by the servers are ignored, and only bans for the requested IP are used"
 
-set g_showweaponspawns 0 // 1: display sprites for weapon spawns found on the map when a weapon key is pressed and the weapon is not available
+set g_showweaponspawns 0	"1: display sprites for weapon spawns found on the map when a weapon key is pressed and the weapon is not available"
 
 alias records "cmd records"
 
@@ -1272,10 +1374,56 @@
 //   .3 winchester magnum:
 //     caliber .3, 150 grains, bullet constant 137.7220774221867
 
-set g_ballistics_force 0 // 1: make all bullets use the ballistics code instead of hitscan
-set g_ballistics_force_uzi_speed 18000 // speed of uzi bullets if g_ballistics_force is 1
-set g_ballistics_force_uzi_bulletconstant 115 // 13.1qu
-set g_ballistics_force_shotgun_speed 12000 // speed of shotgun bullets if g_ballistics_force is 1
-set g_ballistics_force_shotgun_bulletconstant 75 // 3.8qu
+set g_ballistics_force 0	"1: make all bullets use the ballistics code instead of hitscan"
+set g_ballistics_force_uzi_speed 18000	"speed of uzi bullets if g_ballistics_force is 1"
+set g_ballistics_force_uzi_bulletconstant 115	"13.1qu"
+set g_ballistics_force_shotgun_speed 12000	"speed of shotgun bullets if g_ballistics_force is 1"
+set g_ballistics_force_shotgun_bulletconstant 75	"3.8qu"
 
-set cl_stripcolorcodes 0 // experimental feature (notes: strips ALL color codes from messages!)
+set cl_stripcolorcodes 0	"experimental feature (notes: strips ALL color codes from messages!)"
+
+sv_status_show_qcstatus 1 // Nexuiz uses this field instead of frags
+set g_full_getstatus_responses 0	"this currently breaks qstat"
+
+// Defaults and aliases for the demo camera
+alias camera_enable "set cl_demo_mousegrab 1; set _chase_active $chase_active; chase_active 2;" // Enables the camera for demo playback
+alias camera_disable "set cl_demo_mousegrab 0; chase_active $_chase_active;" // Disables the camera for demo playback
+
+set camera_speed_roll 0.9		"Camera rotation speed "
+set camera_speed_chase 4		"Camera movement speed on the x/y/z axis while chasing the player"
+set camera_speed_free 8			"Camera movement speed on the x/y/z axis in free mode"
+set camera_speed_attenuation 30		"Camera movements attenuation factor. Bigger is smoother. Applies to mouse movements."
+set camera_free 0			"Free camera instead of chasing the player"
+set camera_reset 0			"Reset the camera position"
+set camera_direction_x 0		"Move the camera on the x axis (relative to the camera angle)"
+set camera_direction_y 0		"Move the camera on the y axis (relative to the camera angle)"
+set camera_direction_z 0		"Move the camera on the z axis (relative to the camera rotation)"
+set camera_mouse_treshold 0.5		"Use to ignore small mouse movements. This allows for smoother camera control"
+set camera_chase_smoothly 0		"Attenuate player movements (only in chase mode)"
+set camera_look_player	0		"Always look to the player. Mouse input is ignored in this mode."
+set camera_look_attenuation 	8	"Attenuation of \"looking\" movements, only if camera_look_player is set. Bigger is smoother."
+set camera_forward_follows 0		"0: Move the camera forwards without changing altitude. 1: Move towards what you are looking."
+
+alias +camera_move_forward "set camera_direction_x 1"
+alias -camera_move_forward "set camera_direction_x 0"
+alias +camera_move_backward "set camera_direction_x -1"
+alias -camera_move_backward -camera_move_forward
+
+alias +camera_move_left "set camera_direction_y 1"
+alias -camera_move_left "set camera_direction_y 0"
+alias +camera_move_right "set camera_direction_y -1"
+alias -camera_move_right -camera_move_left
+
+alias +camera_move_up "set camera_direction_z 1"
+alias -camera_move_up "set camera_direction_z 0"
+alias +camera_move_down "set camera_direction_z -1"
+alias -camera_move_down -camera_move_up
+
+alias +camera_roll_right "set camera_roll 1"
+alias -camera_roll_right "set camera_roll 0"
+alias +camera_roll_left "set camera_roll -1"
+alias -camera_roll_left -camera_roll_right
+
+// "Gentle mode": show no blood
+seta sv_gentle 0	"force gentle mode for everyone, also remove references to acts of killing from the messages"
+seta cl_gentle 0	"client side gentle mode (only replaces gibs)"

Deleted: branches/nexuiz-2.0/data/defaultPro.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultPro.cfg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/defaultPro.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,37 +0,0 @@
-exec defaultNexuiz.cfg
-
-// Settings changed by Nexuiz Pro
-
-crosshair 6
-bgmvolume 0
-set sbar_hudselector 1
-cl_bob 0
-cl_bobmodel 0
-v_kicktime 0
-gl_polyblend 0
-hostname "Nexuiz Pro Server"
-set g_spawnshieldtime 0.3
-set g_norecoil 1
-set g_throughfloor 0
-set g_balance_armor_rot 0
-set g_balance_armor_rotlinear 1
-set g_balance_armor_limit 200
-set g_balance_health_regen 0
-set g_balance_health_rot 0
-set g_balance_health_regenlinear 10
-set g_balance_health_rotlinear 1
-set g_balance_health_limit 200
-set g_balance_health_start 125
-set g_balance_weaponswitchdelay 0
-set g_balance_falldamage_deadminspeed 650
-set g_balance_falldamage_minspeed 650
-set g_balance_falldamage_factor 0.0385
-set g_balance_falldamage_maxdamage 5
-seta r_ambient 20
-bind kp_enter "+userbind 12"
-bind kp_plus "+userbind 13"
-bind kp_minus "+userbind 14"
-set g_projectiles_newton_style 0
-
-exec physicsPro.cfg
-exec weaponsPro.cfg

Modified: branches/nexuiz-2.0/data/effectinfo.txt
===================================================================
--- branches/nexuiz-2.0/data/effectinfo.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/effectinfo.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -761,7 +761,7 @@
 tex 0 8
 size 25 30
 alpha 100 256 400
-color 0xff0000 0xe62b00
+color 0x000000 0x420000
 originjitter 11 11 11
 
 
@@ -850,7 +850,7 @@
 alpha 128 128 128
 // cloud of particles which expand rapidly and then slow to form a ball
 effect item_respawn
-count 64
+count 256
 type spark
 tex 41 41
 color 0x63F2EA 0x63f2EA
@@ -1201,7 +1201,7 @@
 //marker
 effect TR_KNIGHTSPIKE // used for MF_TRACER2
 type alphastatic
-color 0xFF0000 0xFF0000
+color 0x666666 0x000000
 tex 62 62
 size 1 1 
 sizeincrease -0.1
@@ -2367,13 +2367,14 @@
 type static
 color 0x20FF30 0x80FFC0
 size 1 1
+sizeincrease 5
 alpha 256 256 256
 gravity -0.4
 bounce 1.5
 airfriction 8
 liquidfriction 16
 //velocityoffset 0 0 120
-velocityjitter 16 16 16
+velocityjitter 128 128 128
 
 // effect for removing player model
 // "teleport"

Copied: branches/nexuiz-2.0/data/gfx/brand.tga (from rev 5656, trunk/data/gfx/brand.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshaircampingrifle.tga (from rev 5656, trunk/data/gfx/crosshaircampingrifle.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshaircrylink.tga (from rev 5656, trunk/data/gfx/crosshaircrylink.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairelectro.tga (from rev 5656, trunk/data/gfx/crosshairelectro.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairgrenadelauncher.tga (from rev 5656, trunk/data/gfx/crosshairgrenadelauncher.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairhagar.tga (from rev 5656, trunk/data/gfx/crosshairhagar.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairhlac.tga (from rev 5656, trunk/data/gfx/crosshairhlac.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairhook.tga (from rev 5656, trunk/data/gfx/crosshairhook.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairlaser.tga (from rev 5656, trunk/data/gfx/crosshairlaser.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairminstanex.tga (from rev 5656, trunk/data/gfx/crosshairminstanex.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairnex.tga (from rev 5656, trunk/data/gfx/crosshairnex.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairporto.tga (from rev 5656, trunk/data/gfx/crosshairporto.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairrocketlauncher.tga (from rev 5656, trunk/data/gfx/crosshairrocketlauncher.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairseeker.tga (from rev 5656, trunk/data/gfx/crosshairseeker.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairshotgun.tga (from rev 5656, trunk/data/gfx/crosshairshotgun.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshairuzi.tga (from rev 5656, trunk/data/gfx/crosshairuzi.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/menu/blueplastic (from rev 5656, trunk/data/gfx/menu/blueplastic)

Modified: branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '1 0.7 0.7'
 COLOR_DIALOG_RADAR              '0.7 0.7 1'
 COLOR_DIALOG_SERVERINFO         '0.7 0.7 1'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7
+COLOR_CVARLIST_CHANGED          '1 1 0.4'
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '0.8 0.8 0.8'
 COLOR_DIALOG_RADAR              '0.8 0.8 0.8'
 COLOR_DIALOG_SERVERINFO         '0.6 0.7 0.8'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '0.7 0.7 0.7'
 COLOR_DIALOG_RADAR              '0.7 0.7 0.7'
 COLOR_DIALOG_SERVERINFO         '0.7 0.7 0.7'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_RADAR              '1 1 1'
 COLOR_DIALOG_CREDITS            '1 1 1'
 COLOR_DIALOG_SERVERINFO         '1 1 1'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '0.5 0.75 1'
 COLOR_DIALOG_RADAR              '0.5 0.75 1'
 COLOR_DIALOG_SERVERINFO         '0.5 0.75 1'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '0.5 1 0'
 COLOR_DIALOG_RADAR              '0.5 1 0'
 COLOR_DIALOG_SERVERINFO         '0.5 1 0'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '1 0 0'
 COLOR_DIALOG_RADAR              '1 0 0'
 COLOR_DIALOG_SERVERINFO         '1 0 0'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '1 1 1'
 COLOR_DIALOG_RADAR              '1 1 1'
 COLOR_DIALOG_SERVERINFO         '1 1 1'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '1 0.875 0'
 COLOR_DIALOG_RADAR              '1 0.875 0'
 COLOR_DIALOG_SERVERINFO         '1 0.875 0'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -35,6 +35,7 @@
 COLOR_DIALOG_WEAPONS            '0.4 0.8 0.9'
 COLOR_DIALOG_RADAR              '0.4 0.8 0.9'
 COLOR_DIALOG_SERVERINFO         '0.4 0.8 0.9'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -101,6 +102,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 1 0.4' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -21,6 +21,7 @@
 COLOR_DIALOG_WEAPONS            '1 1 1'
 COLOR_DIALOG_RADAR              '1 1 1'
 COLOR_DIALOG_SERVERINFO         '1 1 1'
+COLOR_DIALOG_CVARS              '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -87,6 +88,13 @@
 // item: crosshair button
 //   uses "crosshairbutton" images
 
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '1 0 0' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
 // item: dialog
 //   uses "border" images
 //   uses "closebutton" images

Modified: branches/nexuiz-2.0/data/keybinds.txt
===================================================================
--- branches/nexuiz-2.0/data/keybinds.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/keybinds.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -16,16 +16,17 @@
 "weapnext"                              "next"
 "weaplast"                              "previously used"
 "weapbest"                              "best"
+"reload"                                "reload"
 "impulse 1"                             "laser"
 "impulse 2"                             "shotgun"
-"impulse 3"                             "machine gun"
+"impulse 3"                             "machine gun / rifle"
 "impulse 4"                             "mortar"
 "impulse 5"                             "electro"
-"impulse 6"                             "crylink"
-"impulse 7"                             "nex"
-"impulse 8"                             "hagar"
+"impulse 6"                             "crylink / hlac"
+"impulse 7"                             "nex / minstanex"
+"impulse 8"                             "hagar / seeker"
 "impulse 9"                             "rocket launcher"
-"impulse 14"                            "special weapons"
+"impulse 14"                            "porto / hook"
 ""                                      ""
 ""                                      "View"
 "+zoom"                                 "zoom"
@@ -53,7 +54,7 @@
 "menu_showteamselect"                   "team menu"
 "spec"                                  "enter spectator mode"
 "dropweapon"                            "drop weapon"
-"+use"                                  "drop key"
+"+use"                                  "drop key / drop flag"
 ""                                      ""
 ""                                      "User defined"
 "+userbind 1"                           "$userbind1"

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0000.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0001.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0002.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0003.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0004.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0005.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0006.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0007.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0008.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0009.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0010.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison/lm_0011.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison.bsp
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/bloodprison.map
===================================================================
--- branches/nexuiz-2.0/data/maps/bloodprison.map	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/maps/bloodprison.map	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,7 +2,7 @@
 "_keeplights" "1"
 "_lightmapscale" "0.25"
 "classname" "worldspawn"
-"gridsize" "64.000003 64.000003 128.000005"
+"gridsize" "64 64 128"
 "message" "Blood Prison"
 {
 ( 2080 1472 192 ) ( 2080 1472 128 ) ( 2144 1536 128 ) evil8_trim/e8support05 0 0 -90 0.5 0.5 0 0 0

Modified: branches/nexuiz-2.0/data/maps/bloodprisonctf.map
===================================================================
--- branches/nexuiz-2.0/data/maps/bloodprisonctf.map	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/maps/bloodprisonctf.map	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,7 +2,7 @@
 "_keeplights" "1"
 "_lightmapscale" "0.25"
 "classname" "worldspawn"
-"gridsize" "64.000003 64.000003 128.000005"
+"gridsize" "64.000000 64.000000 128.000000"
 "message" "Blood Prison CTF"
 {
 ( 3424 1728 192 ) ( 3424 1728 128 ) ( 3360 1664 128 ) evil8_trim/e8support05 0 0 -90 0.500000 0.500000 0 0 0

Copied: branches/nexuiz-2.0/data/maps/eggandbacon (from rev 5656, trunk/data/maps/eggandbacon)

Modified: branches/nexuiz-2.0/data/nexuiz-credits.txt
===================================================================
--- branches/nexuiz-2.0/data/nexuiz-credits.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/nexuiz-credits.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -40,8 +40,11 @@
 Michael "Tenshihan" Quinn
 *Sound FX and Player-Voices
 
+Saulo "mand1nga" Gil
+*Programmer
 
 
+
 **Past Team Members
 *In alphabetical order
 *(nickname or surname)
@@ -88,6 +91,7 @@
 Amos "torus" Dudley - Announcer voices
 William "Willis" Weilep - Master server host
 "sev" - "Wicked" menu skins
+Simon O'Callaghan - "egyptsoc" texture set
 
 Qantourisc
 Tymo

Copied: branches/nexuiz-2.0/data/physics25.cfg (from rev 5656, trunk/data/physics25.cfg)
===================================================================
--- branches/nexuiz-2.0/data/physics25.cfg	                        (rev 0)
+++ branches/nexuiz-2.0/data/physics25.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,11 @@
+sv_maxspeed 400
+sv_maxairspeed 220
+sv_accelerate 8
+sv_airaccelerate 5.5
+sv_friction 7
+edgefriction 1
+sv_stepheight 34
+set sv_jumpvelocity 300
+set sv_friction_on_land 0
+set sv_airaccel_sideways_friction 0.35
+set sv_airaccel_qw 0.95

Deleted: branches/nexuiz-2.0/data/physicsPro.cfg
===================================================================
--- branches/nexuiz-2.0/data/physicsPro.cfg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/physicsPro.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,12 +0,0 @@
-// these values match Quake3
-sv_maxspeed 320
-sv_maxairspeed $sv_maxspeed
-sv_accelerate 10
-sv_airaccelerate 1
-sv_friction 6
-edgefriction 1
-sv_stepheight 34 // this is for Nexuiz maps, Quake3 used 18
-set sv_jumpvelocity 270
-set sv_friction_on_land 0
-set sv_airaccel_sideways_friction 0
-set sv_airaccel_qw 1

Modified: branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -151,6 +151,7 @@
 float		intermission;
 float		sb_showscores;
 .string		message;
+.float renderflags;
 // float		coop;
 // float		deathmatch;
 
@@ -209,3 +210,14 @@
 // database for misc stuff
 float tempdb;
 vector hook_shotorigin;
+
+#ifdef BLURTEST
+float blurtest_time0, blurtest_time1, blurtest_radius, blurtest_power;
+#endif
+
+float servertime, serverprevtime, serverdeltatime;
+
+float ticrate;
+
+.float damageforcescale;
+.void(float thisdmg, float hittype, vector org, vector thisforce) event_damage;

Modified: branches/nexuiz-2.0/data/qcsrc/client/Main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -130,7 +130,14 @@
 	if(v_y - 240 > -1)
 		cs_project_is_b0rked = FALSE;
 
+	RegisterWeapons();
+
 	WaypointSprite_Load();
+
+	Projectile_Precache();
+	GibSplash_Precache();
+	Casings_Precache();
+	DamageInfo_Precache();
 }
 
 // CSQC_Shutdown : Called every time the CSQC code is shutdown (changing maps, quitting, etc)
@@ -319,6 +326,14 @@
 	else if(cmd == "sbar_columns_help") {
 		Cmd_Sbar_Help(argc);
 	}
+#ifdef BLURTEST
+	else if(cmd == "blurtest") {
+		blurtest_time0 = time;
+		blurtest_time1 = time + stof(argv(1));
+		blurtest_radius = stof(argv(2));
+		blurtest_power = stof(argv(3));
+	}
+#endif
 	
 	return false;
 }
@@ -470,7 +485,14 @@
 void(float bIsNewEntity) CSQC_Ent_Update =
 {
 	float t;
+	float savetime;
 	t = ReadByte();
+
+	// set up the "time" global for received entities to be correct for interpolation purposes
+	savetime = time;
+	if(servertime)
+		time = servertime;
+
 #ifdef DP_CSQC_ENTITY_REMOVE_IS_B0RKED
 	if(self.enttype)
 		if(t != self.enttype)
@@ -498,9 +520,18 @@
 		Ent_WaypointSprite();
 	else if(self.enttype == ENT_CLIENT_RADARLINK)
 		Ent_RadarLink();
+	else if(self.enttype == ENT_CLIENT_PROJECTILE)
+		Ent_Projectile();
+	else if(self.enttype == ENT_CLIENT_GIBSPLASH)
+		Ent_GibSplash();
+	else if(self.enttype == ENT_CLIENT_DAMAGEINFO)
+		Ent_DamageInfo();
+	else if(self.enttype == ENT_CLIENT_CASING)
+		Ent_Casing();
 	else
 		error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
 	
+	time = savetime;
 };
 // Destructor, but does NOT deallocate the entity by calling remove(). Also
 // used when an entity changes its type. For an entity that someone interacts
@@ -534,6 +565,8 @@
 	}
 	else if(self.enttype == ENT_CLIENT_WAYPOINT)
 		Ent_RemoveWaypointSprite();
+	else if(self.enttype == ENT_CLIENT_PROJECTILE)
+		Ent_RemoveProjectile();
 
 	self.enttype = 0;
 	self.classname = "";

Modified: branches/nexuiz-2.0/data/qcsrc/client/View.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -8,8 +8,8 @@
 	angles_held_status[wpn] = ReadByte();
 	if(angles_held_status[wpn])
 	{
-		v_x = ReadCoord();
-		v_y = ReadCoord();
+		v_x = ReadAngle();
+		v_y = ReadAngle();
 		v_z = 0;
 		angles_held[wpn] = v;
 	}
@@ -111,6 +111,7 @@
 	return v_y * 0.01745329251994329576;
 }
 
+float camera_active;
 vector GetCurrentFov(float fov)
 {
 	float zoomsensitivity, zoomspeed, zoomfactor, zoomdir;
@@ -139,7 +140,7 @@
 	if(zoomdir)
 		zoomin_effect = 0;
 
-	if(zoomin_effect)
+	if(zoomin_effect || camera_active)
 	{
 		current_viewzoom = min(1, current_viewzoom + drawframetime);
 	}
@@ -190,16 +191,20 @@
 float Sbar_WouldDrawScoreboard ();
 float zoomscript_caught;
 float view_set;
+float camera_mode;
+vector camera_offset, current_origin, mouse_angles, current_camera_offset, new_angles;
 void CSQC_UpdateView(float w, float h)
 {
 	entity e;
 	float fov;
 	float f;
-	vector v1, v2;
+	vector v1, v2, delta;
 
 	dprint_load();
 	WaypointSprite_Load();
 
+	ticrate = getstatf(STAT_SYS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
+
 	// Render the Scene
 	if(!intermission || !view_set)
 	{
@@ -231,6 +236,25 @@
 		vid_height = h;
 	}
 
+#ifdef BLURTEST
+	if(time > blurtest_time0 && time < blurtest_time1)
+	{
+		float r, t;
+
+		t = (time - blurtest_time0) / (blurtest_time1 - blurtest_time0);
+		r = t * blurtest_radius;
+		f = 1 / pow(t, blurtest_power) - 1;
+
+		cvar_set("r_glsl_postprocess", "1");
+		cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(r), " ", ftos(f), " 0 0"));
+	}
+	else
+	{
+		cvar_set("r_glsl_postprocess", "0");
+		cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0");
+	}
+#endif
+
 	Fog_Force();
 
 	drawframetime = max(0.000001, time - drawtime);
@@ -286,11 +310,170 @@
 	R_SetView(VF_DRAWWORLD, 1);
 
 	R_SetView(VF_FOV, GetCurrentFov(fov));
+
+	// Camera for demo playback
+	if (cvar("chase_active") > 1 && cvar("cl_demo_mousegrab") && isdemo())
+	{
+		float speed, attenuation;
+		vector new_origin, m;
+
+		if(!camera_active)
+			camera_active = TRUE;
+		
+		if(cvar("camera_free"))
+			speed = cvar("camera_speed_free");
+		else
+			speed = cvar("camera_speed_chase");
+			
+		attenuation = cvar("camera_speed_attenuation");
+		
+		attenuation = 1 / max(1, attenuation);
+
+		if( cvar("camera_reset") || !camera_mode )
+		{
+			camera_offset = '0 0 0';
+			new_angles = view_angles;
+			camera_offset_z += 20;
+			camera_offset_x += 20 * -cos(new_angles_y * DEG2RAD);
+			camera_offset_y += 20 * -sin(new_angles_y * DEG2RAD);
+			current_origin = view_origin;
+		}
+
+		// Camera angles
+		if( cvar("camera_roll") )
+			mouse_angles_z += cvar("camera_roll") * cvar("camera_speed_roll");
+
+		if(!cvar("camera_look_player"))
+		{
+			m = getmousepos() * 0.1;
+			if(vlen(m)>cvar("camera_mouse_treshold"))
+			{
+				mouse_angles_x += m_y * cos(mouse_angles_z * DEG2RAD) + (m_x * sin(mouse_angles_z * DEG2RAD));
+				mouse_angles_y -= m_x * cos(mouse_angles_z * DEG2RAD) + (m_y * -sin(mouse_angles_z * DEG2RAD));
+			}
+
+			while (mouse_angles_x < -180)
+				mouse_angles_x = mouse_angles_x + 360;
+			while (mouse_angles_x > 180)
+				mouse_angles_x = mouse_angles_x - 360;
+			while (mouse_angles_y < -180)
+				mouse_angles_y = mouse_angles_y + 360;
+			while (mouse_angles_y > 180)
+				mouse_angles_y = mouse_angles_y - 360;
+			
+			delta = '0 0 0';			
+			if( mouse_angles_y < -90 && new_angles_y > 0)
+				delta = '0 360 0';
+			if( mouse_angles_y > 90 && new_angles_y < -90)
+				delta = '0 -360 0';
+
+			new_angles += (mouse_angles - new_angles + delta) * attenuation;
+		}
+		
+		// Camera position
+		if( cvar("camera_direction_x") )
+		{
+			camera_offset_x += cvar("camera_direction_x") * speed * cos(new_angles_y * DEG2RAD);
+			camera_offset_y += cvar("camera_direction_x") * speed * sin(new_angles_y * DEG2RAD);
+			if( cvar("camera_forward_follows") )
+				camera_offset_z += cvar("camera_direction_x") * speed * -sin(new_angles_x * DEG2RAD);
+		}
+
+		if( cvar("camera_direction_y") )
+		{
+			camera_offset_y += cvar("camera_direction_y") * speed * cos(new_angles_y * DEG2RAD) * cos(new_angles_z * DEG2RAD);
+			camera_offset_x += cvar("camera_direction_y") * speed * -sin(new_angles_y * DEG2RAD);
+			camera_offset_z += cvar("camera_direction_y") * speed * sin(new_angles_z * DEG2RAD);
+		}
+
+		if( cvar("camera_direction_z") )
+			camera_offset_z += cvar("camera_direction_z") * speed * cos(new_angles_z * DEG2RAD);
+
+		current_camera_offset += (camera_offset - current_camera_offset) * attenuation;
+
+		// Camera modes
+		if( cvar("camera_free") )
+		{
+			if ( camera_mode == CAMERA_CHASE )
+			{
+				current_camera_offset = current_origin + current_camera_offset;
+				camera_offset = current_origin + camera_offset;
+			}
+
+			camera_mode = CAMERA_FREE;
+			new_origin = current_camera_offset;
+		}
+		else
+		{
+			if ( camera_mode == CAMERA_FREE )
+			{
+				current_origin = view_origin;
+				camera_offset = camera_offset - current_origin;
+				current_camera_offset = current_camera_offset - current_origin;
+			}
+
+			camera_mode = CAMERA_CHASE;
+			
+			if(cvar("camera_chase_smoothly"))
+				current_origin += (view_origin - current_origin) * attenuation;
+			else
+				current_origin = view_origin;
+				
+			new_origin = current_origin + current_camera_offset;
+		}
+
+		if(cvar("camera_look_player"))
+		{
+			local vector dir;
+			local float n;
+			
+			dir = normalize(view_origin - new_origin);
+			n = mouse_angles_z;
+			mouse_angles = vectoangles(dir);
+			mouse_angles_x = mouse_angles_x * -1;
+			mouse_angles_z = n;
+
+			while (mouse_angles_x < -180)
+				mouse_angles_x = mouse_angles_x + 360;
+			while (mouse_angles_x > 180)
+				mouse_angles_x = mouse_angles_x - 360;
+			while (mouse_angles_y < -180)
+				mouse_angles_y = mouse_angles_y + 360;
+			while (mouse_angles_y > 180)
+				mouse_angles_y = mouse_angles_y - 360;
+
+			delta = '0 0 0';
+			if(mouse_angles_y < -90 && new_angles_y > 0)
+				delta = '0 360 0';
+			if(mouse_angles_y > 90 && new_angles_y < -90)
+				delta = '0 -360 0';
+
+			n = 1 / max(1, cvar("camera_look_attenuation"));		
+			new_angles += (mouse_angles - new_angles + delta) * n;
+		}
+
+		while (new_angles_x < -180)
+			new_angles_x = new_angles_x + 360;
+		while (new_angles_x > 180)
+			new_angles_x = new_angles_x - 360;
+		while (new_angles_y < -180)
+			new_angles_y = new_angles_y + 360;
+		while (new_angles_y > 180)
+			new_angles_y = new_angles_y - 360;
+
+		R_SetView(VF_ANGLES, new_angles);
+		R_SetView(VF_ORIGIN, new_origin);
+	}
+	else
+	{
+		if(camera_active)
+			camera_active = FALSE;
+	}
 	
 	// Draw the Crosshair
 	float scoreboard_active;
 	scoreboard_active = Sbar_WouldDrawScoreboard();
-	R_SetView(VF_DRAWCROSSHAIR, !scoreboard_active && !ons_showmap);
+	R_SetView(VF_DRAWCROSSHAIR, 0); //Make sure engine crosshairs are always hidden
 	
 	// Draw the Engine Status Bar (the default Quake HUD)
 	R_SetView(VF_DRAWENGINESBAR, 0);
@@ -325,6 +508,52 @@
 	// next R_RenderScene call
 	drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0);
 
+	// crosshair
+	if(!scoreboard_active && !ons_showmap) {
+		string wcross_style;
+		wcross_style = cvar_string("crosshair");
+
+		if (wcross_style != "0") {
+			vector wcross_color, wcross_size;
+			string wcross_wep, wcross_name;
+			float wcross_alpha, wcross_sizefloat;
+
+			wcross_color_x = cvar("crosshair_color_red");
+			wcross_color_y = cvar("crosshair_color_green");
+			wcross_color_z = cvar("crosshair_color_blue");
+			wcross_alpha = cvar("crosshair_color_alpha");
+			wcross_sizefloat = cvar("crosshair_size");
+			if (cvar("crosshair_per_weapon")) {
+				e = get_weaponinfo(activeweapon);
+				if (e && e.netname != "")
+				{
+					wcross_wep = e.netname;
+					wcross_style = cvar_string(strcat("crosshair_", wcross_wep));
+					if(wcross_style == "")
+						wcross_style = e.netname;
+
+					if(!cvar("crosshair_color_override"))
+					{
+						wcross_color_x = cvar(strcat("crosshair_", wcross_wep, "_color_red"));
+						wcross_color_y = cvar(strcat("crosshair_", wcross_wep, "_color_green"));
+						wcross_color_z = cvar(strcat("crosshair_", wcross_wep, "_color_blue"));
+					}
+
+					wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_color_alpha"));
+					wcross_sizefloat *= cvar(strcat("crosshair_", wcross_wep, "_size"));
+				}
+			}
+
+			wcross_name = strcat("gfx/crosshair", wcross_style);
+		
+			wcross_size = drawgetimagesize(wcross_name);
+			wcross_size_x *= wcross_sizefloat;
+			wcross_size_y *= wcross_sizefloat;
+
+			drawpic('0.5 0 0' * (vid_conwidth - wcross_size_x) + '0 0.5 0' * (vid_conheight - wcross_size_y), wcross_name, wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL);
+		}
+	}
+
 	// Draw the mouse cursor
 	// NOTE: drawpic must happen after R_RenderScene for some reason
 	//drawpic(getmousepos(), "gfx/cursor.tga", '11 14 0', '1 1 1', 1, 0);
@@ -349,7 +578,7 @@
 	self = e;
 	
 	// draw radar
-	if(teamplay)
+	if(teamplay || cvar("cl_teamradar") == 2)
 	{
 		if((cvar_string("cl_teamradar") != "0" && !scoreboard_active) || ons_showmap)
 			teamradar_view();

Copied: branches/nexuiz-2.0/data/qcsrc/client/casings.qc (from rev 5656, trunk/data/qcsrc/client/casings.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/casings.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/casings.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,115 @@
+void Casing_Draw()
+{
+	if(self.move_flags & FL_ONGROUND)
+	{
+		self.move_angles_x = 0;
+		self.move_angles_z = 0;
+		self.flags &~= FL_ONGROUND;
+	}
+
+	Movetype_Physics(FALSE);
+	
+	self.renderflags = 0;
+	self.alpha = bound(0, self.cnt - time, 1);
+
+	if(self.alpha == 0)
+		remove(self);
+	else
+		R_AddEntity(self);
+}
+
+void Casing_Touch()
+{
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+	{
+		remove(self);
+		return;
+	}
+
+	if(!trace_ent || trace_ent.solid == SOLID_BSP)
+	{
+		if(vlen(self.velocity) > 50)
+		{
+			if(time >= self.nextthink)
+			{
+				string s;
+				float f;
+
+				f = floor(random() * 3) + 1;
+				switch(self.state)
+				{
+					case 1:
+						s = strcat("weapons/casings", ftos(f), ".wav");
+						break;
+					default:
+						s = strcat("weapons/brass", ftos(f), ".wav");
+						break;
+				}
+
+				sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
+			}
+		}
+	}
+
+	self.nextthink = time + 0.2;
+}
+
+void Casing_Damage(float thisdmg, float hittype, vector org, vector thisforce)
+{
+	if(thisforce_z < 0)
+		thisforce_z = 0;
+	self.move_velocity = self.move_velocity + thisforce + '0 0 100';
+	self.move_flags &~= FL_ONGROUND;
+}
+
+void Ent_Casing()
+{
+	entity casing;
+
+	casing = spawn();
+	casing.state = ReadByte();
+	casing.origin_x = ReadCoord();
+	casing.origin_y = ReadCoord();
+	casing.origin_z = ReadCoord();
+	casing.velocity = decompressShortVector(ReadShort());
+	casing.angles_x = ReadByte() * 360 / 256;
+	casing.angles_y = ReadByte() * 360 / 256;
+	casing.angles_z = ReadByte() * 360 / 256;
+
+	casing.draw = Casing_Draw;
+	casing.move_origin = casing.origin;
+	casing.move_velocity = casing.velocity + 2 * randomvec();
+	casing.move_angles = casing.angles;
+	casing.move_avelocity = '0 250 0' + 100 * randomvec();
+	casing.move_movetype = MOVETYPE_BOUNCE;
+	casing.move_touch = Casing_Touch;
+	casing.move_time = time;
+	casing.event_damage = Casing_Damage;
+	casing.solid = SOLID_TRIGGER;
+
+	switch(casing.state)
+	{
+		case 1:
+			setmodel(casing, "models/casing_shell.mdl");
+			casing.cnt = time + 30;
+			break;
+		default:
+			setmodel(casing, "models/casing_bronze.mdl");
+			casing.cnt = time + 10;
+			break;
+	}
+
+	setsize(casing, '0 0 -1', '0 0 -1');
+}
+
+void Casings_Precache()
+{
+	precache_model("models/casing_shell.mdl");
+	precache_model("models/casing_bronze.mdl");
+	precache_sound("weapons/brass1.wav");
+	precache_sound("weapons/brass2.wav");
+	precache_sound("weapons/brass3.wav");
+	precache_sound("weapons/casings1.wav");
+	precache_sound("weapons/casings2.wav");
+	precache_sound("weapons/casings3.wav");
+}

Modified: branches/nexuiz-2.0/data/qcsrc/client/csqc_builtins.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/csqc_builtins.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/csqc_builtins.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -272,3 +272,8 @@
 
 string	keynumtostring(float keynum) = #520;
 string	findkeysforcommand(string command) = #521;
+
+string(float ccase, float calpha, float cnum, string s, ...) strconv = #224;
+float(entity ent) wasfreed = #353;
+
+entity(vector org, float rad) findradius = #22;

Modified: branches/nexuiz-2.0/data/qcsrc/client/csqc_constants.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/csqc_constants.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/csqc_constants.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -61,18 +61,19 @@
 const float		STAT_MOVEVARS_TIMESCALE         = 241;
 const float		STAT_FRAGLIMIT					= 235;
 const float		STAT_TIMELIMIT					= 236;
+const float     STAT_MOVEVARS_GRAVITY           = 242;
 
 // Sound Constants
-const float		CHAN_AUTO						= 0;
-const float		CHAN_WEAPON						= 1;
-const float		CHAN_VOICE						= 2;
-const float		CHAN_ITEM						= 3;
-const float		CHAN_BODY						= 4;
+//const float		CHAN_AUTO						= 0;
+//const float		CHAN_WEAPON						= 1;
+//const float		CHAN_VOICE						= 2;
+//const float		CHAN_ITEM						= 3;
+//const float		CHAN_BODY						= 4;
 
-const float		ATTN_NONE						= 0;
-const float		ATTN_NORM						= 1;
-const float		ATTN_IDLE						= 2;
-const float		ATTN_STATIC						= 3;
+//const float		ATTN_NONE						= 0;
+//const float		ATTN_NORM						= 1;
+//const float		ATTN_IDLE						= 2;
+//const float		ATTN_STATIC						= 3;
 
 // Quake-style Point Contents
 const float		CONTENT_EMPTY					= -1;
@@ -183,3 +184,8 @@
 float MOVE_MISSILE = 2; // save as movement with .movetype == MOVETYPE_FLYMISSILE
 float MOVE_HITMODEL = 4;
 float MOVE_WORLDONLY = 3;
+
+float CAMERA_FREE = 1;
+float CAMERA_CHASE = 2;
+
+float EF_NOMODELFLAGS = 8388608;

Modified: branches/nexuiz-2.0/data/qcsrc/client/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/ctf.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/ctf.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -39,7 +39,7 @@
 			frags = getplayerkey(i, "frags");
 			if(!frags || (i+1) == player_localentnum)
 				continue;
-			if(frags == "-666" || getplayerkey(i, "topcolor") != color)
+			if(frags == "-666" || getplayerkey(i, "topcolor") != color) // FIXME use GetPlayerTeam
 				continue;
 			++p;
 			if(p > (8*order_page))
@@ -75,7 +75,7 @@
 			frags = getplayerkey(i, "frags");
 			if(!frags || (i+1) == player_localentnum)
 				continue;
-			if(frags == "-666" || getplayerkey(i, "topcolor") != color)
+			if(frags == "-666" || getplayerkey(i, "topcolor") != color) // FIXME use GetPlayerTeam
 				continue;
 			++p;
 		}
@@ -89,7 +89,7 @@
 				frags = getplayerkey(i, "frags");
 				if(!frags || (i+1) == player_localentnum)
 					continue;
-				if(frags == "-666" || getplayerkey(i, "topcolor") != color)
+				if(frags == "-666" || getplayerkey(i, "topcolor") != color) // FIXME use GetPlayerTeam
 					continue;
 				++p;
 			}
@@ -104,7 +104,7 @@
 			frags = getplayerkey(i, "frags");
 			if(!frags || (i+1) == player_localentnum)
 				continue;
-			if(frags == "-666" || getplayerkey(i, "topcolor") != color)
+			if(frags == "-666" || getplayerkey(i, "topcolor") != color) // FIXME use GetPlayerTeam
 				continue;
 			++p;
 			if(p > (8*order_page))

Copied: branches/nexuiz-2.0/data/qcsrc/client/damage.qc (from rev 5656, trunk/data/qcsrc/client/damage.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/damage.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/damage.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,261 @@
+void Ent_DamageInfo()
+{
+	float hittype, dmg, rad, edge, thisdmg;
+	vector force, org, thisforce;
+	entity oldself;
+
+	oldself = self;
+
+	hittype = ReadShort();
+	org_x = ReadCoord();
+	org_y = ReadCoord();
+	org_z = ReadCoord();
+
+	dmg = ReadByte();
+	rad = ReadByte();
+	edge = ReadByte();
+	force = decompressShortVector(ReadShort());
+
+	for(self = findradius(org, rad); self; self = self.chain)
+	{
+		if(rad)
+		{
+			thisdmg = vlen(self.origin - org) / rad;
+			if(thisdmg >= 1)
+				continue;
+			if(dmg)
+			{
+				thisdmg = dmg + (edge - dmg) * thisdmg;
+				thisforce = vlen(force) * (thisdmg / dmg) * normalize(self.origin - org);
+			}
+			else
+			{
+				thisdmg = 0;
+				thisforce = vlen(force) * normalize(self.origin - org);
+			}
+		}
+		else
+		{
+			thisdmg = dmg;
+			thisforce = force;
+		}
+
+		if(self.damageforcescale)
+			if(vlen(thisforce))
+			{
+				self.move_velocity = self.move_velocity + self.damageforcescale * thisforce;
+				self.move_flags &~= FL_ONGROUND;
+			}
+
+		if(self.event_damage)
+			self.event_damage(thisdmg, hittype, org, thisforce);
+	}
+
+	self = oldself;
+
+	setorigin(self, org); // for sound() calls
+
+	// TODO spawn particle effects and sounds based on hittype
+	
+	if(!DEATH_ISSPECIAL(hittype))
+	{
+		float hitwep, secondary, bounce, headshot;
+		vector org2, backoff;
+		float r;
+
+		hitwep = DEATH_WEAPONOFWEAPONDEATH(hittype);
+		secondary = hittype & HITTYPE_SECONDARY;
+		bounce = hittype & HITTYPE_BOUNCE;
+		headshot = hittype & HITTYPE_HEADSHOT;
+		r = random();
+
+		traceline(org - normalize(force) * 16, org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+		if(trace_fraction < 1)
+			backoff = trace_plane_normal;
+		else
+			backoff = -1 * normalize(force);
+
+		switch(hitwep)
+		{
+			case WEP_LASER:
+				org2 = org + backoff * 8;
+				sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
+				break;
+			case WEP_SHOTGUN:
+				pointparticles(particleeffectnum("shotgun_impact"), org, backoff * 1000, 1);
+				if(r < 0.05)
+					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.1)
+					sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.2)
+					sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+				break;
+			case WEP_UZI:
+				pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
+				if(r < 0.05)
+					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.1)
+					sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.2)
+					sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+				break;
+			case WEP_GRENADE_LAUNCHER:
+				org2 = org + backoff * 12;
+				pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
+				sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+				break;
+			case WEP_ELECTRO:
+				org2 = org + backoff * 8;
+				if(secondary)
+				{
+					sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+					pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
+				}
+				else
+				{
+					if(bounce)
+					{
+						// this is sent as "primary bounce" to distinguish it from secondary bounced balls
+						sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
+						pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
+					}
+					else
+					{
+						sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+						pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
+					}
+				}
+				break;
+			case WEP_CRYLINK:
+				if(secondary)
+				{
+					sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
+					pointparticles(particleeffectnum("crylink_impact"), org, '0 0 0', 1);
+				}
+				else
+				{
+					sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
+					pointparticles(particleeffectnum("crylink_impactbig"), org, '0 0 0', 1);
+				}
+				break;
+			case WEP_NEX:
+				sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
+				break;
+			case WEP_HAGAR:
+				org2 = org + backoff * 12;
+				if (r<0.15)
+					sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+				else if (r<0.7)
+					sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+				else
+					sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+				break;
+			case WEP_ROCKET_LAUNCHER:
+				org2 = org + backoff * 16;
+				sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
+				break;
+			case WEP_PORTO:
+				print("Since when does Porto send DamageInfo?\n");
+				break;
+			case WEP_MINSTANEX:
+				sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
+				break;
+			case WEP_HOOK:
+				org2 = org + backoff * 12;
+				sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
+				break;
+			case WEP_SEEKER:
+				org2 = org + backoff * 12;
+				if(secondary)
+				{
+					if (r<0.15)
+						sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
+					else if (r<0.7)
+						sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
+					else
+						sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
+					pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
+				}
+				else
+				{
+					if(bounce)
+					{
+						if (r<0.15)
+							sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
+						else if (r<0.7)
+							sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
+						else
+							sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
+						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+					}
+					else if(headshot)
+					{
+						sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+					}
+					else
+					{
+						if (r<0.15)
+							sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
+						else if (r<0.7)
+							sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
+						else
+							sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
+						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+					}
+				}
+				break;
+			case WEP_HLAC:
+				org2 = org + backoff * 12;
+				sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
+				break;
+			case WEP_CAMPINGRIFLE:
+				pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
+				if(r < 0.2)
+					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.4)
+					sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+				else if(r < 0.5)
+					sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+				break;
+			default:
+				dprint("Unhandled damage of weapon ", ftos(hitwep), "\n");
+				break;
+		}
+	}
+}
+
+void DamageInfo_Precache()
+{
+	precache_sound("weapons/crylink_impact2.wav");
+	precache_sound("weapons/crylink_impact.wav");
+	precache_sound("weapons/electro_impact.wav");
+	precache_sound("weapons/electro_impact_combo.wav");
+	precache_sound("weapons/flacexp1.wav");
+	precache_sound("weapons/flacexp2.wav");
+	precache_sound("weapons/flacexp3.wav");
+	precache_sound("weapons/grenade_impact.wav");
+	precache_sound("weapons/hagexp1.wav");
+	precache_sound("weapons/hagexp2.wav");
+	precache_sound("weapons/hagexp3.wav");
+	precache_sound("weapons/hookbomb_impact.wav");
+	precache_sound("weapons/laserimpact.wav");
+	precache_sound("weapons/neximpact.wav");
+	precache_sound ("weapons/ric1.wav");
+	precache_sound ("weapons/ric2.wav");
+	precache_sound ("weapons/ric3.wav");
+	precache_sound("weapons/rocket_impact.wav");
+	precache_sound("weapons/seekerexp1.wav");
+	precache_sound("weapons/seekerexp2.wav");
+	precache_sound("weapons/seekerexp3.wav");
+	precache_sound("weapons/tagexp1.wav");
+	precache_sound("weapons/tagexp2.wav");
+	precache_sound("weapons/tagexp3.wav");
+	precache_sound("weapons/tag_impact.wav");
+}

Copied: branches/nexuiz-2.0/data/qcsrc/client/gibs.qc (from rev 5656, trunk/data/qcsrc/client/gibs.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/gibs.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/gibs.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,179 @@
+void SUB_RemoveOnNoImpact()
+{
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+		remove(self);
+}
+
+void Gib_Touch()
+{
+	// TODO maybe bounce of walls, make more gibs, etc.
+
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+	{
+		remove(self);
+		return;
+	}
+	
+	sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(random() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
+	pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10);
+
+	remove(self);
+}
+
+void Gib_Draw()
+{
+	vector oldorg;
+	oldorg = self.origin;
+
+	Movetype_Physics(FALSE);
+	
+	if(self.touch == Gib_Touch) // don't do this for the "chunk" thingie...
+		trailparticles(self, particleeffectnum("TR_SLIGHTBLOOD"), oldorg, self.origin);
+	else
+		trailparticles(self, particleeffectnum("TR_BLOOD"), oldorg, self.origin);
+
+	self.renderflags = 0;
+	self.alpha = bound(0, self.nextthink - time, 1);
+
+	if(self.alpha == 0)
+		remove(self);
+	else
+		R_AddEntity(self);
+}
+
+void TossGib (string mdlname, vector org, vector v, float destroyontouch)
+{
+	entity gib;
+
+	// TODO remove some gibs according to cl_nogibs
+	
+	gib = spawn();
+	gib.classname = "gib";
+	gib.move_movetype = MOVETYPE_BOUNCE;
+	gib.gravity = 1;
+	gib.solid = SOLID_CORPSE;
+
+	setmodel (gib, mdlname); // precision set above
+
+	setsize (gib, '-8 -8 -8', '8 8 8');
+
+	gib.draw = Gib_Draw;
+	if(destroyontouch)
+		gib.move_touch = Gib_Touch;
+	else
+		gib.move_touch = SUB_RemoveOnNoImpact;
+
+	gib.move_origin = gib.origin = org;
+	gib.move_velocity = v + randomvec();
+	gib.move_avelocity = randomvec() * vlen(gib.move_velocity);
+	gib.move_time = time;
+	gib.damageforcescale = 3.5;
+
+	gib.nextthink = time + 12 + random () * 4;
+}
+
+void Ent_GibSplash()
+{
+	float amount, type;
+	vector org, vel, mi, ma;
+
+	float c, gibfactor, randomvalue;
+
+	type = ReadByte(); // gibbage type
+	amount = ReadByte() / 16.0; // gibbage amount
+	org_x = ReadShort() * 4 + 2;
+	org_y = ReadShort() * 4 + 2;
+	org_z = ReadShort() * 4 + 2;
+	vel = decompressShortVector(ReadShort());
+	mi = decompressShortVector(ReadShort());
+	ma = decompressShortVector(ReadShort());
+
+	if(cvar("cl_gentle"))
+		type |= 0x80; // set gentle bit
+
+	gibfactor = 1 - cvar("cl_nogibs");
+	if(gibfactor <= 0)
+		return;
+	
+	amount *= gibfactor;
+
+	if(cvar("ekg"))
+		amount *= 5;
+	
+	self.origin = org; // for the sounds
+
+	switch(type)
+	{
+		case 0x01:
+			sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
+
+			if(random() < amount)
+				TossGib("models/gibs/eye.md3", org, vel + randomvec() * 150, 0);
+			te_bloodshower(org + mi, org + ma, 1200, 1000 * amount);
+			if(random() < amount)
+				TossGib("models/gibs/bloodyskull.md3", org, vel + randomvec() * 100, 0);
+
+			for(c = 0; c < amount; ++c)
+			{
+				randomvalue = amount - c;
+					
+				if(random() < randomvalue)
+					TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/arm.md3", org, vel + randomvec() * (random() * 120 + 90),0);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/chest.md3", org + '0 0 -12', vel + randomvec() * (random() * 120 + 80),0);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/smallchest.md3", org, vel + randomvec() * (random() * 120 + 80),0);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/leg1.md3", org + '0 0 -5', vel + randomvec() * (random() * 120 + 85),0);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/leg2.md3", org + '0 0 -9', vel + randomvec() * (random() * 120 + 85),0);
+
+				// these splat on impact
+				if(random() < randomvalue)
+					TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
+				if(random() < randomvalue)
+					TossGib ("models/gibs/chunk.mdl", org, vel + randomvec() * 450,1);
+			}
+			break;
+		case 0x02:
+			pointparticles(particleeffectnum("blood"), org, vel, amount * 16);
+			break;
+		case 0x03:
+			if(random() < amount)
+				TossGib ("models/gibs/chunk.mdl", org, vel, 1);
+			break;
+		case 0x81:
+			pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount);
+			break;
+		case 0x82:
+			pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16);
+			break;
+		case 0x83:
+			// no gibs in gentle mode, sorry
+			break;
+	}
+}
+
+void GibSplash_Precache()
+{
+	precache_model("models/gibs/chunk.mdl");
+	precache_model("models/gibs/leg1.md3");
+	precache_model("models/gibs/leg2.md3");
+	precache_model("models/gibs/chest.md3");
+	precache_model("models/gibs/smallchest.md3");
+	precache_model("models/gibs/arm.md3");
+	precache_model("models/gibs/bloodyskull.md3");
+	precache_model("models/gibs/eye.md3");
+
+	precache_sound ("misc/gib.wav");
+    precache_sound ("misc/gib_splat01.wav");
+    precache_sound ("misc/gib_splat02.wav");
+    precache_sound ("misc/gib_splat03.wav");
+    precache_sound ("misc/gib_splat04.wav");
+}

Modified: branches/nexuiz-2.0/data/qcsrc/client/interpolate.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/interpolate.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/interpolate.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -10,9 +10,17 @@
 
 	dt = time - self.itime1;
 
+	if(self.iflags & IFLAG_PREVALID)
+		self.iflags |= IFLAG_VALID;
+	else
+		self.iflags |= IFLAG_PREVALID;
+
 	self.iorigin1 = self.iorigin2;
 	self.iorigin2 = self.origin;
 
+	if(self.iflags & IFLAG_AUTOANGLES)
+		self.angles = vectoangles(self.iorigin2 - self.iorigin1);
+
 	if(self.iflags & IFLAG_ANGLES)
 	{
 		fixedmakevectors(self.angles);

Modified: branches/nexuiz-2.0/data/qcsrc/client/interpolate.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/interpolate.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/interpolate.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,6 +1,10 @@
 .float iflags;
 #define IFLAG_VELOCITY 1
 #define IFLAG_ANGLES 2
+#define IFLAG_AUTOANGLES 4
+#define IFLAG_VALID 8
+#define IFLAG_PREVALID 16
+#define IFLAG_INTERNALMASK (IFLAG_VALID | IFLAG_PREVALID)
 
 // call this BEFORE reading an entity update
 void InterpolateOrigin_Undo();

Modified: branches/nexuiz-2.0/data/qcsrc/client/laser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/laser.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/laser.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -7,6 +7,8 @@
 .float count; // flags for the laser
 .vector velocity;
 .float alpha;
+.float scale; // scaling factor of the thickness
+.float modelscale; // scaling factor of the dlight
 
 // TODO move these into a heade file
 float trace_dphitq3surfaceflags;
@@ -29,20 +31,23 @@
 		if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
 			trace_endpos = self.origin + v_forward * 1048576;
 	}
-	if(self.alpha)
+	if(self.scale != 0)
 	{
-		Draw_CylindricLine(self.origin, trace_endpos, 2, "particles/laserbeam", 0, time * 3, self.colormod, self.alpha, DRAWFLAG_NORMAL); // TODO make a texture to make the laser look smoother
+		if(self.alpha)
+		{
+			Draw_CylindricLine(self.origin, trace_endpos, self.scale, "particles/laserbeam", 0, time * 3, self.colormod, self.alpha, DRAWFLAG_NORMAL); // TODO make a texture to make the laser look smoother
+		}
+		else
+		{
+			Draw_CylindricLine(self.origin, trace_endpos, self.scale, "particles/laserbeam", 0, time * 3, self.colormod, 0.5, DRAWFLAG_ADDITIVE); // TODO make a texture to make the laser look smoother
+		}
 	}
-	else
-	{
-		Draw_CylindricLine(self.origin, trace_endpos, 2, "particles/laserbeam", 0, time * 3, self.colormod, 0.5, DRAWFLAG_ADDITIVE); // TODO make a texture to make the laser look smoother
-	}
 	if not(trace_dphitq3surfaceflags & (Q3SURFACEFLAG_SKY | Q3SURFACEFLAG_NOIMPACT))
 	{
 		if(self.cnt >= 0)
 			pointparticles(self.cnt, trace_endpos, trace_plane_normal, drawframetime * 1000);
-		if(self.colormod != '0 0 0')
-			R_AddDynamicLight(trace_endpos + trace_plane_normal * 1, 50, self.colormod * 5);
+		if(self.colormod != '0 0 0' && self.modelscale != 0)
+			R_AddDynamicLight(trace_endpos + trace_plane_normal * 1, self.modelscale, self.colormod * 5);
 	}
 }
 
@@ -53,7 +58,7 @@
 
 	// 30 bytes, or 13 bytes for just moving
 	f = ReadByte();
-	self.count = (f & 0xC0);
+	self.count = (f & 0xE0);
 
 	if(self.count & 0x80)
 		self.iflags = IFLAG_VELOCITY;
@@ -75,6 +80,13 @@
 			self.alpha = ReadByte() / 255.0;
 		else
 			self.alpha = 0;
+		self.scale = 2;
+		self.modelscale = 50;
+		if(f & 0x20)
+		{
+			self.scale *= ReadByte() / 16.0; // beam radius
+			self.modelscale *= ReadByte() / 16.0; // dlight radius
+		}
 		self.cnt = ReadShort() - 1; // effect number
 	}
 	if(f & 2)
@@ -87,8 +99,8 @@
 		}
 		else
 		{
-			self.angles_x = ReadCoord();
-			self.angles_y = ReadCoord();
+			self.angles_x = ReadAngle();
+			self.angles_y = ReadAngle();
 		}
 	}
 	if(f & 4)

Copied: branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc (from rev 5656, trunk/data/qcsrc/client/movetypes.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,397 @@
+.entity move_groundentity;
+.float move_suspendedinair;
+.float move_didgravity;
+
+void _Movetype_CheckVelocity() // SV_CheckVelocity
+{
+}
+
+float _Movetype_CheckWater() // SV_CheckWater
+{
+	return FALSE;
+}
+
+void _Movetype_CheckWaterTransition() // SV_CheckWaterTransition
+{
+}
+
+void _Movetype_Impact(entity oth) // SV_Impact
+{
+	entity oldother, oldself;
+
+	oldself = self;
+	oldother = other;
+
+	if(self.move_touch)
+	{
+		other = oth;
+
+		self.move_touch();
+
+		other = oldother;
+	}
+
+	if(oth.move_touch)
+	{
+		other = self;
+		self = oth;
+
+		self.move_touch();
+
+		self = oldself;
+		other = oldother;
+	}
+}
+
+void _Movetype_LinkEdict_TouchAreaGrid() // SV_LinkEdict_TouchAreaGrid
+{
+	entity e, oldself, oldother;
+
+	oldself = self;
+	oldother = other;
+
+	for(e = findradius(0.5 * (self.absmin + self.absmax), 0.5 * vlen(self.absmax - self.absmin)); e; e = e.chain)
+	{
+		if(e.move_touch)
+		if(boxesoverlap(e.absmin, e.absmax, oldself.absmin, oldself.absmax))
+		{
+			self = e;
+			other = oldself;
+
+			trace_allsolid = FALSE;
+			trace_startsolid = FALSE;
+			trace_fraction = 1;
+			trace_inwater = FALSE;
+			trace_inopen = TRUE;
+			trace_endpos = e.origin;
+			trace_plane_normal = '0 0 1';
+			trace_plane_dist = 0;
+			trace_ent = oldself;
+
+			e.move_touch();
+		}
+	}
+
+	other = oldother;
+	self = oldself;
+}
+
+void _Movetype_LinkEdict(float touch_triggers) // SV_LinkEdict
+{
+	vector mi, ma;
+	if(self.solid == SOLID_BSP)
+	{
+		// TODO set the absolute bbox
+		mi = self.mins;
+		ma = self.maxs;
+	}
+	else
+	{
+		mi = self.mins;
+		ma = self.maxs;
+	}
+	mi = mi + self.origin;
+	ma = ma + self.origin;
+
+	if(self.move_flags & FL_ITEM)
+	{
+		mi_x -= 15;
+		mi_y -= 15;
+		mi_z -= 1;
+		ma_x += 15;
+		ma_y += 15;
+		ma_z += 1;
+	}
+	else
+	{
+		mi_x -= 1;
+		mi_y -= 1;
+		mi_z -= 1;
+		ma_x += 1;
+		ma_y += 1;
+		ma_z += 1;
+	}
+
+	self.absmin = mi;
+	self.absmax = ma;
+
+	if(touch_triggers)
+		_Movetype_LinkEdict_TouchAreaGrid();
+}
+
+float _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition
+{
+	vector org;
+	float cont;
+	org = self.move_origin + ofs;
+	
+	cont = self.dphitcontentsmask;
+	self.dphitcontentsmask = DPCONTENTS_SOLID;
+	tracebox(self.move_origin, self.mins, self.maxs, self.move_origin, MOVE_NOMONSTERS, self);
+	self.dphitcontentsmask = cont;
+
+	if(trace_startsolid)
+		return TRUE;
+
+	if(vlen(trace_endpos - self.move_origin) > 0.0001)
+		self.move_origin = trace_endpos;
+	return FALSE;
+}
+
+float _Movetype_UnstickEntity() // SV_UnstickEntity
+{
+	if(!_Movetype_TestEntityPosition('0 0 0'))
+		return TRUE;
+	if(!_Movetype_TestEntityPosition('-1 0 0')) goto success;
+	if(!_Movetype_TestEntityPosition('1 0 0')) goto success;
+	if(!_Movetype_TestEntityPosition('0 -1 0')) goto success;
+	if(!_Movetype_TestEntityPosition('0 1 0')) goto success;
+	if(!_Movetype_TestEntityPosition('-1 -1 0')) goto success;
+	if(!_Movetype_TestEntityPosition('1 -1 0')) goto success;
+	if(!_Movetype_TestEntityPosition('-1 1 0')) goto success;
+	if(!_Movetype_TestEntityPosition('1 1 0')) goto success;
+	float i;
+	for(i = 1; i <= 17; ++i)
+	{
+		if(!_Movetype_TestEntityPosition('0 0 -1' * i)) goto success;
+		if(!_Movetype_TestEntityPosition('0 0 1' * i)) goto success;
+	}
+	dprint("Some entity is stuck\n");
+	return FALSE;
+:success
+	dprint("Unstuck some entity\n");
+	_Movetype_LinkEdict(TRUE);
+	return TRUE;
+}
+
+vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVelocity
+{
+	vel = vel - ((vel * norm) * norm) * f;
+
+	if(vel_x > -0.1 && vel_x < 0.1) vel_x = 0;
+	if(vel_y > -0.1 && vel_y < 0.1) vel_y = 0;
+	if(vel_z > -0.1 && vel_z < 0.1) vel_z = 0;
+
+	return vel;
+}
+
+void _Movetype_PushEntityTrace(vector push)
+{
+	vector end;
+	float type;
+
+	end = self.move_origin + push;
+
+	if(self.move_movetype == MOVETYPE_FLYMISSILE)
+		type = MOVE_MISSILE;
+	else if(self.solid == SOLID_TRIGGER || self.solid == SOLID_NOT)
+		type = MOVE_NOMONSTERS;
+	else
+		type = MOVE_NORMAL;
+
+	tracebox(self.move_origin, self.mins, self.maxs, end, type, self);
+}
+
+float _Movetype_PushEntity(vector push, float failonstartsolid) // SV_PushEntity
+{
+	_Movetype_PushEntityTrace(push);
+
+	if(trace_startsolid && failonstartsolid)
+		return trace_fraction;
+
+	self.move_origin = trace_endpos;
+
+	if(trace_fraction < 1)
+		if(self.solid >= SOLID_TRIGGER && (!(self.move_flags & FL_ONGROUND) || (self.move_groundentity != trace_ent)))
+			_Movetype_Impact(trace_ent);
+
+	return trace_fraction;
+}
+
+void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
+{
+	if(self.move_flags & FL_ONGROUND)
+	{
+		if(self.velocity_z >= 1/32)
+			self.move_flags &~= FL_ONGROUND;
+		else if(!self.move_groundentity)
+			return;
+		else if(self.move_suspendedinair && wasfreed(self.move_groundentity))
+		{
+			self.move_groundentity = world;
+			return;
+		}
+	}
+
+	self.move_suspendedinair = FALSE;
+
+	_Movetype_CheckVelocity();
+
+	if(self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
+	{
+		self.move_didgravity = TRUE;
+		if(self.gravity)
+			self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+		else
+			self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+	}
+
+	self.move_angles = self.move_angles + self.move_avelocity * dt;
+
+	vector move;
+	move = self.move_velocity * dt;
+
+	_Movetype_PushEntity(move, TRUE);
+	if(wasfreed(self))
+		return;
+	
+	if(trace_startsolid)
+	{
+		_Movetype_UnstickEntity();
+		_Movetype_PushEntity(move, FALSE);
+		if(wasfreed(self))
+			return;
+	}
+
+	if(trace_fraction < 1)
+	{
+		if(self.move_movetype == MOVETYPE_BOUNCEMISSILE)
+		{
+			self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 2.0);
+			self.move_flags &~= FL_ONGROUND;
+		}
+		else if(self.move_movetype == MOVETYPE_BOUNCE)
+		{
+			float d, bouncefac, bouncestop;
+
+			bouncefac = self.move_bounce_factor;     if(!bouncefac)  bouncefac = 0.5;
+			bouncestop = self.move_bounce_stopspeed; if(!bouncestop) bouncestop = 60;
+
+			self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1 + bouncefac);
+
+			d = trace_plane_normal * self.move_velocity;
+			if(trace_plane_normal_z > 0.7 && d < bouncestop && d > -bouncestop)
+			{
+				self.move_flags |= FL_ONGROUND;
+				self.move_groundentity = trace_ent;
+				self.move_velocity = '0 0 0';
+				self.move_avelocity = '0 0 0';
+			}
+			else
+				self.move_flags &~= FL_ONGROUND;
+		}
+		else
+		{
+			self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1.0);
+			if(trace_plane_normal_z > 0.7)
+			{
+				self.move_flags |= FL_ONGROUND;
+				self.move_groundentity = trace_ent;
+				if(trace_ent.solid == SOLID_BSP)
+					self.move_suspendedinair = TRUE;
+				self.move_velocity = '0 0 0';
+				self.move_avelocity = '0 0 0';
+			}
+			else
+				self.move_flags &~= FL_ONGROUND;
+		}
+	}
+
+	_Movetype_CheckWaterTransition();
+}
+
+void Movetype_Physics(float matchserver) // SV_Physics_Entity
+{
+	float n, i, dt, movedt;
+
+	dt = time - self.move_time;
+
+	if(matchserver)
+	{
+		movedt = ticrate;
+		n = max(0, floor(dt / ticrate));
+		dt -= n * ticrate;
+		self.move_time += n * ticrate;
+	}
+	else
+	{
+		movedt = dt;
+		dt = 0;
+		n = 1;
+		self.move_time = time;
+	}
+
+	//self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
+	// we use the field as set by the last run of this
+
+	for(i = 0; i < n; ++i)
+	{
+		self.move_didgravity = FALSE;
+		switch(self.move_movetype)
+		{
+			case MOVETYPE_PUSH:
+			case MOVETYPE_FAKEPUSH:
+				error("SV_Physics_Pusher not implemented");
+				break;
+			case MOVETYPE_NONE:
+				break;
+			case MOVETYPE_FOLLOW:
+				error("SV_Physics_Follow not implemented");
+				break;
+			case MOVETYPE_NOCLIP:
+				_Movetype_CheckWater();
+				self.move_origin = self.move_origin + ticrate * self.move_velocity;
+				self.move_angles = self.move_angles + ticrate * self.move_avelocity;
+				_Movetype_LinkEdict(FALSE);
+				break;
+			case MOVETYPE_STEP:
+				error("SV_Physics_Step not implemented");
+				break;
+			case MOVETYPE_WALK:
+				error("SV_Physics_Walk not implemented");
+				break;
+			case MOVETYPE_TOSS:
+			case MOVETYPE_BOUNCE:
+			case MOVETYPE_BOUNCEMISSILE:
+			case MOVETYPE_FLYMISSILE:
+			case MOVETYPE_FLY:
+				_Movetype_Physics_Toss(movedt);
+				break;
+		}
+	}
+
+	self.avelocity = self.move_avelocity;
+
+	if(dt > 0 && self.move_movetype != MOVETYPE_NONE)
+	{
+		// now continue the move from move_time to time
+		self.velocity = self.move_velocity;
+		if(self.move_didgravity)
+		{
+			if(self.gravity)
+				self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+			else
+				self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+		}
+
+		self.angles = self.move_angles + dt * self.avelocity;
+
+		if(self.movetype != MOVETYPE_NOCLIP)
+		{
+			_Movetype_PushEntityTrace(dt * self.velocity);
+			if(!trace_startsolid)
+				self.origin = trace_endpos;
+		}
+		else
+			self.origin = self.move_origin + dt * self.velocity;
+	}
+	else
+	{
+		self.velocity = self.move_velocity;
+		self.angles = self.move_angles;
+		self.origin = self.move_origin;
+	}
+
+	if(!wasfreed(self))
+		setorigin(self, self.origin);
+}

Copied: branches/nexuiz-2.0/data/qcsrc/client/movetypes.qh (from rev 5656, trunk/data/qcsrc/client/movetypes.qh)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/movetypes.qh	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/movetypes.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,30 @@
+.float move_movetype;
+.float move_time;
+.vector move_origin;
+.vector move_angles;
+.vector move_velocity;
+.vector move_avelocity;
+.float move_flags;
+.void(void) move_touch;
+.float move_bounce_factor;
+.float move_bounce_stopspeed;
+
+void Movetype_Physics(float matchserver);
+
+float	MOVETYPE_NONE				= 0;
+float	MOVETYPE_ANGLENOCLIP			= 1;
+float	MOVETYPE_ANGLECLIP			= 2;
+float	MOVETYPE_WALK				= 3;
+float	MOVETYPE_STEP				= 4;
+float	MOVETYPE_FLY				= 5;
+float	MOVETYPE_TOSS				= 6;
+float	MOVETYPE_PUSH				= 7;
+float	MOVETYPE_NOCLIP				= 8;
+float	MOVETYPE_FLYMISSILE			= 9;
+float	MOVETYPE_BOUNCE				= 10;
+float	MOVETYPE_BOUNCEMISSILE	= 11;	// Like bounce but doesn't lose speed on bouncing
+float MOVETYPE_FOLLOW = 12;
+float MOVETYPE_FAKEPUSH = 13;
+
+float   FL_ITEM                 = 256;
+float	FL_ONGROUND				= 512;

Modified: branches/nexuiz-2.0/data/qcsrc/client/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/progs.src	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/progs.src	2009-01-24 19:51:12 UTC (rev 5658)
@@ -13,6 +13,7 @@
 interpolate.qh
 teamradar.qh
 waypointsprites.qh
+movetypes.qh
 
 main.qh
 
@@ -28,12 +29,17 @@
 hook.qc
 particles.qc
 laser.qc
+projectile.qc
+gibs.qc
+damage.qc
+casings.qc
 
 Main.qc
 View.qc
 interpolate.qc
 teamradar.qc
 waypointsprites.qc
+movetypes.qc
 
 ../common/util.qc
 ../common/gamecommand.qc

Copied: branches/nexuiz-2.0/data/qcsrc/client/projectile.qc (from rev 5656, trunk/data/qcsrc/client/projectile.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/projectile.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/client/projectile.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,281 @@
+void SUB_Null()
+{
+}
+
+void SUB_Stop()
+{
+	self.move_velocity = self.move_avelocity = '0 0 0';
+	self.move_movetype = MOVETYPE_NONE;
+}
+
+.float count; // set if clientside projectile
+.float cnt; // sound index
+.float gravity;
+.float snd_looping;
+
+void Projectile_Draw()
+{
+	vector oldorg;
+
+	oldorg = self.origin;
+
+	if(self.count & 0x80)
+	{
+		//self.move_flags &~= FL_ONGROUND;
+		Movetype_Physics(TRUE);
+		self.angles = vectoangles(self.velocity);
+	}
+	else
+	{
+		InterpolateOrigin_Do();
+	}
+
+	switch(self.cnt)
+	{
+		case PROJECTILE_ROCKET:
+			trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin);
+			break;
+		case PROJECTILE_TAG:
+			trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_ELECTRO_BEAM:
+			trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), oldorg, self.origin);
+			break;
+		case PROJECTILE_GRENADE:
+			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
+			self.angles -= '750 0 0' * time;
+			break;
+		case PROJECTILE_GRENADE_BOUNCING:
+			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
+			if(!(self.move_flags & FL_ONGROUND))
+				self.angles += '100 150 100' * time;
+			break;
+		case PROJECTILE_PORTO_RED:
+			// TODO add red dynamic light
+			trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_PORTO_BLUE:
+			// TODO add blue dynamic light
+			trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_FLAC:
+			trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_SEEKER:
+			trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin);
+			break;
+		case PROJECTILE_HOOKBOMB:
+			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
+			self.angles = '0 500 0' * time;
+			break;
+		case PROJECTILE_HAGAR:
+			trailparticles(self, particleeffectnum("TR_GRENADE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_HAGAR_BOUNCING:
+			trailparticles(self, particleeffectnum("TR_GRENADE"), oldorg, self.origin);
+			break;
+		case PROJECTILE_BULLET_GLOWING:
+			R_AddDynamicLight(self.origin, 50, '1 1 0');
+			break;
+		default:
+			break;
+	}
+
+	self.renderflags = 0;
+
+	if((self.count & 0x80) || (self.iflags & IFLAG_VALID))
+		R_AddEntity(self);
+}
+
+void loopsound(entity e, float ch, string samp, float vol, float attn)
+{
+	if(csqc_flags & CSQC_FLAG_COLORCODES)
+	{
+		sound(e, ch, samp, vol, attn);
+		e.snd_looping = 1;
+	}
+}
+
+void Ent_RemoveProjectile()
+{
+	if(self.snd_looping)
+		sound(self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+}
+
+void Ent_Projectile()
+{
+	float f;
+
+	InterpolateOrigin_Undo();
+
+	// projectile properties:
+	//   kind (interpolated, or clientside)
+	//
+	//   modelindex
+	//   origin
+	//   scale
+	//   if clientside:
+	//     velocity
+	//     gravity
+	//   soundindex (hardcoded list)
+	//   effects
+	//
+	// projectiles don't send angles, because they always follow the velocity
+	
+	f = ReadByte();
+	self.count = (f & 0x80);
+	self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
+	self.move_flags &~= FL_ONGROUND;
+	self.solid = SOLID_TRIGGER;
+	//self.effects = EF_NOMODELFLAGS;
+
+	// sv_gameplayfix_delayprojectiles
+	if(!self.move_time)
+		self.move_time = time + ticrate;
+	else
+		self.move_time = max(self.move_time, time);
+
+	if(!(self.count & 0x80))
+		InterpolateOrigin_Undo();
+
+	if(f & 1)
+	{
+		self.origin_x = ReadCoord();
+		self.origin_y = ReadCoord();
+		self.origin_z = ReadCoord();
+		if(self.count & 0x80)
+		{
+			self.velocity_x = ReadCoord();
+			self.velocity_y = ReadCoord();
+			self.velocity_z = ReadCoord();
+			self.gravity = ReadCoord();
+
+			self.move_origin = self.origin;
+			self.move_velocity = self.velocity;
+		}
+	}
+
+	if(f & 2)
+	{
+		self.cnt = ReadByte();
+
+		self.scale = 1;
+		switch(self.cnt)
+		{
+			case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl"); break;
+			case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3"); break;
+			case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); break;
+			case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl"); break;
+			case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl"); break;
+			case PROJECTILE_CRYLINK: setmodel(self, "models/plasmatrail.mdl"); break;
+			case PROJECTILE_ELECTRO_BEAM: setmodel(self, "models/elaser.mdl"); break;
+			case PROJECTILE_GRENADE: setmodel(self, "models/grenademodel.md3"); break;
+			case PROJECTILE_GRENADE_BOUNCING: setmodel(self, "models/grenademodel.md3"); break;
+			case PROJECTILE_LASER: setmodel(self, "models/laser.mdl"); break;
+			case PROJECTILE_HLAC: setmodel(self, "models/hlac_bullet.md3"); break;
+			case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.scale = 2; break;
+			case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
+			case PROJECTILE_PORTO_RED: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
+			case PROJECTILE_PORTO_BLUE: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
+			case PROJECTILE_HOOKBOMB: setmodel(self, "models/grenademodel.md3"); break;
+			case PROJECTILE_HAGAR: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
+			case PROJECTILE_HAGAR_BOUNCING: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
+			default:
+				error("Received invalid CSQC projectile, can't work with this!");
+				break;
+		}
+
+		self.mins = '0 0 0';
+		self.maxs = '0 0 0';
+		self.colormod = '0 0 0';
+		self.move_touch = SUB_Stop;
+		self.move_movetype = MOVETYPE_TOSS;
+
+		switch(self.cnt)
+		{
+			case PROJECTILE_ELECTRO:
+				// only new engines support sound moving with object
+				loopsound(self, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+				self.mins = '0 0 -3';
+				self.maxs = '0 0 -3';
+				self.move_movetype = MOVETYPE_BOUNCE;
+				self.move_touch = SUB_Null;
+				break;
+			case PROJECTILE_ROCKET:
+				loopsound(self, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
+				self.mins = '-3 -3 -3';
+				self.maxs = '3 3 3';
+				break;
+			case PROJECTILE_TAG:
+				loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+				self.mins = '-2 -2 -2';
+				self.maxs = '2 2 2';
+				break;
+			case PROJECTILE_GRENADE_BOUNCING:
+				self.mins = '0 0 -3';
+				self.maxs = '0 0 -3';
+				self.move_movetype = MOVETYPE_BOUNCE;
+				self.move_touch = SUB_Null;
+				break;
+			case PROJECTILE_SEEKER:
+				self.mins = '-2 -2 -2';
+				self.maxs = '2 2 2';
+				break;
+			case PROJECTILE_PORTO_RED:
+				self.colormod = '2 1 1';
+				self.alpha = 0.5;
+				self.move_movetype = MOVETYPE_BOUNCE;
+				self.move_touch = SUB_Null;
+				break;
+			case PROJECTILE_PORTO_BLUE:
+				self.colormod = '1 1 2';
+				self.alpha = 0.5;
+				self.move_movetype = MOVETYPE_BOUNCE;
+				self.move_touch = SUB_Null;
+				break;
+			case PROJECTILE_HAGAR_BOUNCING:
+				self.move_movetype = MOVETYPE_BOUNCE;
+				self.move_touch = SUB_Null;
+				break;
+			default:
+				break;
+		}
+	}
+
+	if(self.gravity)
+	{
+		if(self.move_movetype == MOVETYPE_FLY)
+			self.move_movetype = MOVETYPE_TOSS;
+		if(self.move_movetype == MOVETYPE_BOUNCEMISSILE)
+			self.move_movetype = MOVETYPE_BOUNCE;
+	}
+	else
+	{
+		if(self.move_movetype == MOVETYPE_TOSS)
+			self.move_movetype = MOVETYPE_FLY;
+		if(self.move_movetype == MOVETYPE_BOUNCE)
+			self.move_movetype = MOVETYPE_BOUNCEMISSILE;
+	}
+
+	if(!(self.count & 0x80))
+		InterpolateOrigin_Note();
+	
+	self.draw = Projectile_Draw;
+}
+
+void Projectile_Precache()
+{
+	precache_model("models/ebomb.mdl");
+	precache_model("models/elaser.mdl");
+	precache_model("models/grenademodel.md3");
+	precache_model("models/hagarmissile.mdl");
+	precache_model("models/hlac_bullet.md3");
+	precache_model("models/laser.mdl");
+	precache_model("models/plasmatrail.mdl");
+	precache_model("models/rocket.md3");
+	precache_model("models/tagrocket.md3");
+	precache_model("models/tracer.mdl");
+	precache_sound("weapons/electro_fly.wav");
+	precache_sound("weapons/rocket_fly.wav");
+	precache_sound("weapons/tag_rocket_fly.wav");
+}

Modified: branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1507,18 +1507,21 @@
 			s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
 		o = Sbar_DrawNoteLine(o, s);
 	}
+	if(warmup_stage)
+	{
+		s = "^2Currently in ^1warmup^2 stage!";
+		o = Sbar_DrawNoteLine(o, s);
+	}
 
+	// move more important stuff more to the middle so its more visible
+	o_y = vid_conheight * 0.66;
+
 	string blinkcolor;
 	if(mod(time, 1) >= 0.5)
 		blinkcolor = "^1";
 	else
 		blinkcolor = "^3";
-		
-	if(warmup_stage)
-	{
-		s = "^2Currently in ^1warmup^2 stage!";
-		o = Sbar_DrawNoteLine(o, s);
-	}
+
 	if(ready_waiting)
 	{
 		if(ready_waiting_for_me)
@@ -1564,7 +1567,36 @@
 			o = Sbar_DrawNoteLine(o, s);
 		}
 	}
+	if(teamplay)
+	{
+		entity tm;
+		float ts_min, ts_max;
+		tm = teams.sort_next;
+		if (tm)
+		{
+			for(; tm.sort_next; tm = tm.sort_next)
+			{
+				if(!tm.team_size || tm.team == COLOR_SPECTATOR)
+					continue;
+				if(!ts_min) ts_min = tm.team_size;
+				else ts_min = min(ts_min, tm.team_size);
+				if(!ts_max) ts_max = tm.team_size;
+				else ts_max = max(ts_max, tm.team_size);
+			}
+			if ((ts_max - ts_min) > 1)
+			{
+				s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
+				tm = GetTeam(myteam, false);
+				if (tm)
+				if (tm.team != COLOR_SPECTATOR)
+				if (tm.team_size == ts_max)
+					s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
 
+				o = Sbar_DrawNoteLine(o, s);
+			}
+		}
+	}
+
 	//Sbar_SortFrags();
 	Sbar_UpdatePlayerTeams();
 

Modified: branches/nexuiz-2.0/data/qcsrc/client/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/teamplay.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/teamplay.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -26,7 +26,7 @@
 {
 	if not(playerslots[i].gotscores) // unconnected
 		return COLOR_SPECTATOR;
-	else if(getplayerkey(i, "frags") == "-666")
+	else if(stof(getplayerkey(i, "frags")) == FRAGS_SPECTATOR)
 		return COLOR_SPECTATOR;
 	else
 		return GetPlayerColorForce(i);

Modified: branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -209,10 +209,13 @@
 
 	InterpolateOrigin_Undo();
 
-	// unfortunately, this needs to be exact (for the 3D display)
-	self.origin_x = ReadCoord();
-	self.origin_y = ReadCoord();
-	self.origin_z = ReadCoord();
+	if(sendflags & 64)
+	{
+		// unfortunately, this needs to be exact (for the 3D display)
+		self.origin_x = ReadCoord();
+		self.origin_y = ReadCoord();
+		self.origin_z = ReadCoord();
+	}
 
 	if(sendflags & 1)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -54,6 +54,10 @@
 const float ENT_CLIENT_NAGGER = 9; // flags [votecalledvote]
 const float ENT_CLIENT_WAYPOINT = 10; // flags origin [team displayrule] [spritename] [spritename2] [spritename3] [lifetime maxdistance hideable]
 const float ENT_CLIENT_RADARLINK = 11; // flags [startorigin] [endorigin] [startcolor+16*endcolor]
+const float ENT_CLIENT_PROJECTILE = 12;
+const float ENT_CLIENT_GIBSPLASH = 13;
+const float ENT_CLIENT_DAMAGEINFO = 14;
+const float ENT_CLIENT_CASING = 15;
 
 const float SPRITERULE_DEFAULT = 0;
 const float SPRITERULE_TEAMPLAY = 1;
@@ -299,3 +303,115 @@
 #define SP_SUICIDES 2
 #define SP_SCORE 3
 // game mode specific indices are not in common/, but in server/scores_rules.qc!
+
+// this assignment must match menu/nexuiz/dialog_settings_misc.c!
+float	CHAN_AUTO				= 0;
+	// on world: announcers, ...                     INFO
+	// on players: item pickup                       ITEMS
+	// on entities: UNUSED
+	// on csqc: UNUSED
+float	CHAN_WEAPON				= 1; // Weapon fire
+	// on world: UNUSED
+	// on players: weapon firing                     WEAPONS
+	// on entities: turret firing                    WEAPONS
+	// on csqc: UNUSED
+float	CHAN_VOICE				= 2; // Voice/Radio
+	// on world: UNUSED
+	// on players: voice                             VOICE
+	// on entities: ambient                          AMBIENT
+	// on csqc: UNUSED
+float	CHAN_TRIGGER			= 3; // Triggers/Items
+	// on world: UNUSED
+	// on players: item pickup                       ITEMS
+	// on entities: platforms moving etc.            ITEMS
+	// on csqc: UNUSED
+float	CHAN_PROJECTILE			= 4; // Projectiles
+	// on world: UNUSED
+	// on players: projectiles hitting player        SHOTS
+	// on entities: projectiles                      SHOTS
+	// on csqc: projectile sounds                    SHOTS
+float	CHAN_WEAPON2			= 5; // Nex fire (separated as it is a very long sound)
+	// on world: UNUSED
+	// on players: weapon firing                     WEAPONS
+	// on entities: turret firing                    WEAPONS
+	// on csqc: UNUSED
+float	CHAN_PAIN				= 6; // Pain
+	// on world: UNUSED
+	// on players: pain                              PAIN
+	// on entities: projectiles flying               SHOTS
+	// on csqc: player pain                          PAIN
+float	CHAN_PLAYER				= 7; // Player body
+	// on world: UNUSED
+	// on players: player sounds                     PLAYER
+	// on entities: player sounds                    PLAYER
+	// on csqc: UNUSED
+
+float	ATTN_NONE				= 0;
+float	ATTN_MIN				= 0.015625;
+float	ATTN_NORM				= 0.5;
+float	ATTN_IDLE				= 2;
+float	ATTN_STATIC				= 3;
+float	ATTN_MAX   				= 3.984375;
+
+#define VOL_BASE 0.7
+#define VOL_BASEVOICE 1.0
+
+// this sets sounds and other properties of the projectiles in csqc
+float PROJECTILE_ELECTRO = 1;
+float PROJECTILE_ROCKET = 2;
+float PROJECTILE_TAG = 3;
+float PROJECTILE_BULLET = 4;
+float PROJECTILE_CRYLINK = 5;
+float PROJECTILE_ELECTRO_BEAM = 6;
+float PROJECTILE_GRENADE = 7;
+float PROJECTILE_GRENADE_BOUNCING = 8;
+float PROJECTILE_LASER = 9;
+float PROJECTILE_HLAC = 10;
+float PROJECTILE_SEEKER = 11;
+float PROJECTILE_FLAC = 12;
+float PROJECTILE_PORTO_RED = 13;
+float PROJECTILE_PORTO_BLUE = 14;
+float PROJECTILE_HOOKBOMB = 15;
+float PROJECTILE_HAGAR = 16;
+float PROJECTILE_HAGAR_BOUNCING = 17;
+float PROJECTILE_BULLET_GLOWING = 18;
+
+// Deathtypes (weapon deathtypes are the IT_* constants below)
+// NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too.
+float	DEATH_SPECIAL_START     = 10000;
+float	DEATH_FALL				= 10000;
+float	DEATH_TELEFRAG				= 10001;
+float	DEATH_DROWN				= 10002;
+float	DEATH_HURTTRIGGER			= 10003;
+float	DEATH_LAVA				= 10004;
+float	DEATH_SLIME				= 10005;
+float	DEATH_KILL				= 10006;
+float	DEATH_NOAMMO				= 10007;
+float	DEATH_SWAMP				= 10008;
+float	DEATH_TEAMCHANGE			= 10009;
+float	DEATH_AUTOTEAMCHANGE			= 10010;
+float	DEATH_CAMP				= 10011;
+float	DEATH_SHOOTING_STAR			= 10012;
+float	DEATH_ROT				= 10013;
+float	DEATH_MIRRORDAMAGE		= 10014;
+float	DEATH_TOUCHEXPLODE      = 10015;
+float   DEATH_TURRET            = 10100;
+
+float	DEATH_WEAPONMASK        = 0xFF;
+float	DEATH_HITTYPEMASK		= 0x1F00; // which is WAY below 10000 used for normal deaths
+float	HITTYPE_SECONDARY = 0x100;
+float	HITTYPE_SPLASH = 0x200;
+float	HITTYPE_BOUNCE = 0x400;
+float	HITTYPE_HEADSHOT = 0x800;
+float	HITTYPE_RESERVED = 0x1000; // unused yet
+
+// macros to access these
+#define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
+#define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
+#define DEATH_ISWEAPON(t,w)           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
+#define DEATH_WEAPONOF(t)             (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
+#define WEP_VALID(w)                  ((w) >= WEP_FIRST && (w) <= WEP_LAST)
+
+#define FRAGS_PLAYER 0
+#define FRAGS_SPECTATOR -666
+#define FRAGS_PLAYER_NONSOLID -616

Modified: branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -141,6 +141,46 @@
 			return TRUE;
 		}
 	}
+	else if(argc >= 3 && crc16(0, argv(0)) == 38566 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 59830)
+	{
+		// other test case
+		s = strconv(2, 0, 0, substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
+
+		n = floor(random() * 6 + 2);
+
+		s2 = "";
+		for(i = 0; i < n; ++i)
+		{
+			s2 = strcat(s2, "AH");
+		}
+
+		if(random() < 0.1)
+			s2 = strcat(substring(s2, 1, strlen(s2) - 1), "A");
+
+		if(s == "")
+			s = s2;
+		else
+			if(random() < 0.8)
+				s = strcat(s, " ", s2);
+			else
+				s = strcat(s2, " ", s);
+
+		s2 = substring(s, strlen(s) - 2, 2);
+		if(s2 == "AH" || s2 == "AY")
+			s = strcat(s, "))");
+		else
+			s = strcat(s, " ))");
+
+		if(random() < 0.1)
+			s = substring(s, 0, strlen(s) - 1);
+
+		if(random() < 0.1)
+			s = strconv(1, 0, 0, s);
+
+		localcmd(strcat(argv(1), " ", s));
+
+		return TRUE;
+	}
 	else if(argc >= 3 && crc16(0, argv(0)) == 3029 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 38159)
 	{
 		// test case for terrencehill's color codes
@@ -148,7 +188,7 @@
 		s2 = "";
 		
 		n = strlen(s);
-		j = (6 * max(1, floor(strlen(s)/32 + random() * 2 - 1))) / n;
+		j = ((6 * max(1, floor(strlen(s)/32 + random() * 2 - 1))) / n) * (1 - 2 * (random() > 0.5));
 		f = random() * 6;
 
 		for(i = 0; i < n; ++i)

Modified: branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -579,7 +579,10 @@
 		}
 		else
 			fputs(fh, strcat("cdtrack ", ftos(floor(random() * 9 + 2)), "\n")); // track from 2 to 10
-		if(MapInfo_Map_supportedFeatures & MAPINFO_FEATURE_WEAPONS)       fputs(fh, "has weapons\n");
+		if(MapInfo_Map_supportedFeatures & MAPINFO_FEATURE_WEAPONS)    
+			fputs(fh, "has weapons\n");
+		else
+			fputs(fh, "// uncomment this if you added weapon pickups: has weapons\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH)      fputs(fh, "type dm 30 20\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH) fputs(fh, "type tdm 50 20 2\n");
 		if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DOMINATION)      fputs(fh, "type dom 200 20\n");
@@ -760,6 +763,10 @@
 			dprint("Map ", pFilename, " provides unknown info item ", t, ", ignored\n");
 	}
 	fclose(fh);
+
+	if(!MapInfo_Map_supportedGametypes)
+		_MapInfo_Map_ApplyGametype("30 20", pGametypeToSet, MAPINFO_TYPE_DEATHMATCH);
+
 	if(pGametypeToSet)
 		if(!(MapInfo_Map_supportedGametypes & pGametypeToSet))
 			error("Can't select the requested game type. Bailing out.");

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1301,3 +1301,9 @@
 			DEC_TO_HEXDIGIT(floor(rgb_z * 15 + 0.5))
 		);
 }
+
+// requires that m2>m1 in all coordinates, and that m4>m3
+float boxesoverlap(vector m1, vector m2, vector m3, vector m4) {return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;};
+
+// requires the same, but is a stronger condition
+float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -132,3 +132,6 @@
 vector rgb_to_hsv(vector rgb);
 vector hsv_to_rgb(vector hsv);
 string rgb_to_hexcolor(vector rgb);
+
+float boxesoverlap(vector m1, vector m2, vector m3, vector m4);
+float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/classes.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -28,6 +28,7 @@
 #include "nexuiz/dialog_settings_video.c"
 #include "nexuiz/dialog_settings_effects.c"
 #include "nexuiz/dialog_settings_audio.c"
+#include "nexuiz/dialog_settings_network.c"
 #include "nexuiz/dialog_settings_misc.c"
 #include "nexuiz/dialog_multiplayer.c"
 #include "nexuiz/dialog_multiplayer_playersetup.c"
@@ -72,6 +73,8 @@
 #include "nexuiz/dialog_multiplayer_playersetup_weapons.c"
 #include "nexuiz/weaponslist.c"
 #include "nexuiz/dialog_multiplayer_playersetup_radar.c"
-#include "nexuiz/dialog_settings_demo.c"
+#include "nexuiz/dialog_multiplayer_demo.c"
 #include "nexuiz/demolist.c"
 #include "nexuiz/colorpicker.c"
+#include "nexuiz/cvarlist.c"
+#include "nexuiz/dialog_settings_misc_cvars.c"

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -20,6 +20,7 @@
 	ATTRIB(Label, disabled, float, 0)
 	ATTRIB(Label, disabledAlpha, float, 0.3)
 	ATTRIB(Label, textEntity, entity, NULL)
+	ATTRIB(Label, allowWrap, float, 0)
 ENDCLASS(Label)
 #endif
 
@@ -54,6 +55,7 @@
 void drawLabel(entity me)
 {
 	string t;
+	vector o;
 	if(me.disabled)
 		draw_alpha *= me.disabledAlpha;
 
@@ -68,8 +70,19 @@
 	if(me.fontSize)
 		if(t)
 		{
-			if(me.allowCut)
+			if(me.allowCut) // FIXME allowCut incompatible with align != 0
 				draw_Text(me.realOrigin, draw_TextShortenToWidth(t, (1 - me.keepspaceLeft - me.keepspaceRight) / me.realFontSize_x, 0), me.realFontSize, me.colorL, me.alpha, 0);
+			else if(me.allowWrap) // FIXME allowWrap incompatible with align != 0
+			{
+				getWrappedLine_remaining = t;
+				o = me.realOrigin;
+				while(getWrappedLine_remaining)
+				{
+					t = getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight) / me.realFontSize_x);
+					draw_Text(o, t, me.realFontSize, me.colorL, me.alpha, 0);
+					o_y += me.realFontSize_y;
+				}
+			}
 			else
 				draw_Text(me.realOrigin, t, me.realFontSize, me.colorL, me.alpha, 0);
 		}

Modified: branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -287,6 +287,8 @@
 void(float bufhandle, float string_index, string str) bufstr_set = #447;
 float(float bufhandle, string str, float order) bufstr_add = #448;
 void(float bufhandle, float string_index) bufstr_free = #449;
+void(float bufhandle, string pattern, string antipattern) buf_cvarlist = #517;
+string(string name) cvar_description = #518;
 
 //DP_QC_CRC16
 //idea: div0
@@ -302,6 +304,7 @@
 float CVAR_TYPEFLAG_PRIVATE = 4;
 float CVAR_TYPEFLAG_ENGINE = 8;
 float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
+float CVAR_TYPEFLAG_READONLY = 32;
 
 //DP_QC_URI_ESCAPE
 //idea: div0

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -52,7 +52,7 @@
 void rewrapCampaign(float w, float l0, float emptyheight)
 {
 	float i, j;
-	float n, take, cantake, l;
+	float n, l;
 	string r, s;
 	for(i = 0; i < campaign_entries; ++i)
 	{
@@ -70,33 +70,13 @@
 				r = strcat(r, "\n");
 				continue;
 			}
-			for(;;)
+
+			getWrappedLine_remaining = s;
+			while(getWrappedLine_remaining)
 			{
-				cantake = draw_TextLengthUpToWidth(s, w, 0);
-				if(cantake > 0 && cantake < strlen(s))
-				{
-					take = cantake - 1;
-					while(take > 0 && substring(s, take, 1) != " ")
-						--take;
-					if(take == 0)
-					{
-						if(--l < 0) goto toolong;
-						r = strcat(r, substring(s, 0, cantake), "\n");
-						s = substring(s, cantake, strlen(s) - cantake);
-					}
-					else
-					{
-						if(--l < 0) goto toolong;
-						r = strcat(r, substring(s, 0, take), "\n");
-						s = substring(s, take + 1, strlen(s) - take);
-					}
-				}
-				else
-				{
-					if(--l < 0) goto toolong;
-					r = strcat(r, s, "\n");
-					break;
-				}
+				s = getWrappedLine(w);
+				if(--l < 0) goto toolong;
+				r = strcat(r, s, "\n");
 			}
 		}
 		goto nottoolong;

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/cvarlist.c (from rev 5656, trunk/data/qcsrc/menu/nexuiz/cvarlist.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/cvarlist.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/cvarlist.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,172 @@
+#ifdef INTERFACE
+CLASS(NexuizCvarList) EXTENDS(NexuizListBox)
+	METHOD(NexuizCvarList, configureNexuizCvarList, void(entity))
+	ATTRIB(NexuizCvarList, rowsPerItem, float, 1)
+	METHOD(NexuizCvarList, drawListBoxItem, void(entity, float, vector, float))
+	METHOD(NexuizCvarList, resizeNotify, void(entity, vector, vector, vector, vector))
+	METHOD(NexuizCvarList, keyDown, float(entity, float, float, float))
+
+	ATTRIB(NexuizCvarList, realFontSize, vector, '0 0 0')
+	ATTRIB(NexuizCvarList, realUpperMargin, float, 0)
+	ATTRIB(NexuizCvarList, columnNameOrigin, float, 0)
+	ATTRIB(NexuizCvarList, columnNameSize, float, 0)
+	ATTRIB(NexuizCvarList, columnValueOrigin, float, 0)
+	ATTRIB(NexuizCvarList, columnValueSize, float, 0)
+
+	METHOD(NexuizCvarList, setSelected, void(entity, float))
+	ATTRIB(NexuizCvarList, controlledTextbox, entity, NULL)
+	ATTRIB(NexuizCvarList, cvarNameBox, entity, NULL)
+	ATTRIB(NexuizCvarList, cvarDescriptionBox, entity, NULL)
+	ATTRIB(NexuizCvarList, cvarTypeBox, entity, NULL)
+	ATTRIB(NexuizCvarList, cvarValueBox, entity, NULL)
+	ATTRIB(NexuizCvarList, cvarDefaultBox, entity, NULL)
+
+	ATTRIB(NexuizCvarList, handle, float, -1)
+	ATTRIB(NexuizCvarList, cvarName, string, string_null)
+	ATTRIB(NexuizCvarList, cvarDescription, string, string_null)
+	ATTRIB(NexuizCvarList, cvarType, string, string_null)
+	ATTRIB(NexuizCvarList, cvarDefault, string, string_null)
+ENDCLASS(NexuizCvarList)
+entity makeNexuizCvarList();
+void CvarList_Filter_Change(entity box, entity me);
+void CvarList_Value_Change(entity box, entity me);
+void CvarList_Revert_Click(entity btn, entity me);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizCvarList()
+{
+	entity me;
+	me = spawnNexuizCvarList();
+	me.configureNexuizCvarList(me);
+	return me;
+}
+void configureNexuizCvarListNexuizCvarList(entity me)
+{
+	me.configureNexuizListBox(me);
+
+	me.handle = buf_create();
+	buf_cvarlist(me.handle, "", "_");
+	me.nItems = buf_getsize(me.handle);
+}
+void setSelectedNexuizCvarList(entity me, float i)
+{
+	string s;
+
+	setSelectedListBox(me, i);
+	if(me.nItems == 0)
+		return;
+	
+	if(me.cvarName)
+		strunzone(me.cvarName);
+	if(me.cvarDescription)
+		strunzone(me.cvarDescription);
+	if(me.cvarType)
+		strunzone(me.cvarType);
+	if(me.cvarDefault)
+		strunzone(me.cvarDefault);
+	me.cvarName = strzone(bufstr_get(me.handle, me.selectedItem));
+	me.cvarDescription = strzone(cvar_description(me.cvarName));
+	me.cvarDefault = strzone(cvar_defstring(me.cvarName));
+
+	float t;
+	t = cvar_type(me.cvarName);
+	me.cvarType = "";
+	if(t & CVAR_TYPEFLAG_SAVED)
+		me.cvarType = strcat(me.cvarType, ", will be saved to config.cfg");
+	else
+		me.cvarType = strcat(me.cvarType, ", will not be saved");
+	if(t & CVAR_TYPEFLAG_PRIVATE)
+		me.cvarType = strcat(me.cvarType, ", private");
+	if(t & CVAR_TYPEFLAG_ENGINE)
+		me.cvarType = strcat(me.cvarType, ", engine setting");
+	if(t & CVAR_TYPEFLAG_READONLY)
+		me.cvarType = strcat(me.cvarType, ", read only");
+	me.cvarType = strzone(substring(me.cvarType, 2, strlen(me.cvarType) - 2));
+
+	me.cvarNameBox.setText(me.cvarNameBox, me.cvarName);
+	me.cvarDescriptionBox.setText(me.cvarDescriptionBox, me.cvarDescription);
+	me.cvarTypeBox.setText(me.cvarTypeBox, me.cvarType);
+	me.cvarDefaultBox.setText(me.cvarDefaultBox, me.cvarDefault);
+
+	// this one can handle tempstrings
+	s = cvar_string(me.cvarName);
+	me.cvarValueBox.setText(me.cvarValueBox, s);
+	me.cvarValueBox.cursorPos = strlen(s);
+}
+void CvarList_Filter_Change(entity box, entity me)
+{
+	buf_cvarlist(me.handle, box.text, "_");
+	me.nItems = buf_getsize(me.handle);
+
+	me.setSelected(me, 0);
+}
+void resizeNotifyNexuizCvarList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
+
+	me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+	me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+	me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+
+	me.columnNameOrigin = 0;
+	me.columnValueSize = me.realFontSize_x * 20;
+	me.columnNameSize = 1 - me.columnValueSize - me.realFontSize_x;
+	me.columnValueOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
+
+	me.setSelected(me, me.selectedItem);
+}
+void drawListBoxItemNexuizCvarList(entity me, float i, vector absSize, float isSelected)
+{
+	string k, v, d;
+	float t;
+
+	vector theColor;
+	float theAlpha;
+
+	string s;
+
+	if(isSelected)
+		draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+	
+	k = bufstr_get(me.handle, i);
+
+	v = cvar_string(k);
+	d = cvar_defstring(k);
+	t = cvar_type(k);
+	if(t & CVAR_TYPEFLAG_SAVED)
+		theAlpha = SKINALPHA_CVARLIST_SAVED;
+	else
+		theAlpha = SKINALPHA_CVARLIST_TEMPORARY;
+	if(v == d)
+		theColor = SKINCOLOR_CVARLIST_UNCHANGED;
+	else
+		theColor = SKINCOLOR_CVARLIST_CHANGED;
+
+	s = draw_TextShortenToWidth(k, me.columnNameSize / me.realFontSize_x, 0);
+	draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
+	s = draw_TextShortenToWidth(v, me.columnValueSize / me.realFontSize_x, 0);
+	draw_Text(me.realUpperMargin * eY + me.columnValueOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
+}
+
+float keyDownNexuizCvarList(entity me, float scan, float ascii, float shift)
+{
+	if(keyDownListBox(me, scan, ascii, shift))
+		return 1;
+	else if(!me.controlledTextbox)
+		return 0;
+	else
+		return me.controlledTextbox.keyDown(me.controlledTextbox, scan, ascii, shift);
+}
+
+void CvarList_Value_Change(entity box, entity me)
+{
+	cvar_set(me.cvarNameBox.text, box.text);
+}
+
+void CvarList_Revert_Click(entity btn, entity me)
+{
+	me.cvarValueBox.setText(me.cvarValueBox, me.cvarDefault);
+	me.cvarValueBox.cursorPos = strlen(me.cvarDefault);
+}
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -19,9 +19,11 @@
 			setDependentStringNotEqual(e, "_cl_name", "Player");
 		me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Create",  makeNexuizServerCreateTab()));
 			setDependentStringNotEqual(e, "_cl_name", "Player");
+		me.TD(me, 1, 1, mc.makeTabButton(mc, "Demos",   makeNexuizDemoBrowserTab()));
 		me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Player Setup",  makeNexuizPlayerSettingsTab()));
 			if(cvar_string("_cl_name") == "Player")
 				e.onClick(e, e.onClickEntity); // lol animation
+
 	me.TR(me);
 	me.TR(me);
 		me.TD(me, me.rows - 2, me.columns, mc);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -108,6 +108,7 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Bot skill:"));
+			setDependent(e, "bot_number", 0, -1);
 		me.TD(me, 1, 2, e = makeNexuizTextSlider("skill"));
 			e.addValue(e, "Botlike", "0");
 			e.addValue(e, "Beginner", "1");
@@ -145,6 +146,8 @@
 			e.addValue(e, "5 choices", "5");
 			e.addValue(e, "6 choices", "6");
 			e.addValue(e, "7 choices", "7");
+			e.addValue(e, "8 choices", "8");
+			e.addValue(e, "9 choices", "9");
 			e.configureNexuizTextSliderValues(e);
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "sv_vote_simple_majority", "Simple majority wins vcall"));
@@ -159,7 +162,7 @@
 			e0.allowCut = 1;
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, e = makeNexuizButton("Start!", '0 0 0'));
+		me.TD(me, 1, me.columns, e = makeNexuizButton("Start Multiplayer!", '0 0 0'));
 			e.onClick = MapList_LoadMap;
 			e.onClickEntity = me.mapListBox;
 			me.mapListBox.startButton = e;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -7,7 +7,7 @@
 	ATTRIB(NexuizMutatorsDialog, title, string, "Mutators")
 	ATTRIB(NexuizMutatorsDialog, color, vector, SKINCOLOR_DIALOG_MUTATORS)
 	ATTRIB(NexuizMutatorsDialog, intendedWidth, float, 0.8)
-	ATTRIB(NexuizMutatorsDialog, rows, float, 16)
+	ATTRIB(NexuizMutatorsDialog, rows, float, 17)
 	ATTRIB(NexuizMutatorsDialog, columns, float, 6)
 	ATTRIB(NexuizMutatorsDialog, refilterEntity, entity, NULL)
 ENDCLASS(NexuizMutatorsDialog)

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_demo.c (from rev 5656, trunk/data/qcsrc/menu/nexuiz/dialog_multiplayer_demo.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_demo.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_demo.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,50 @@
+#ifdef INTERFACE
+CLASS(NexuizDemoBrowserTab) EXTENDS(NexuizTab)
+	METHOD(NexuizDemoBrowserTab, fill, void(entity))
+	ATTRIB(NexuizDemoBrowserTab, title, string, "Demo")
+	ATTRIB(NexuizDemoBrowserTab, intendedWidth, float, 0.9)
+	ATTRIB(NexuizDemoBrowserTab, rows, float, 22)
+	ATTRIB(NexuizDemoBrowserTab, columns, float, 6.5)
+	ATTRIB(NexuizDemoBrowserTab, name, string, "DemoBroswer")	
+ENDCLASS(NexuizDemoBrowserTab)
+entity makeNexuizDemoBrowserTab();
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizDemoBrowserTab()
+{
+	entity me;
+	me = spawnNexuizDemoBrowserTab();
+	me.configureDialog(me);
+	return me;
+}
+void fillNexuizDemoBrowserTab(entity me)
+{
+	entity e;
+	entity btn;
+	entity dlist;
+
+	me.TR(me);
+		me.TD(me, 1, me.columns, e = makeNexuizCheckBox(0, "cl_autodemo", "Record demos while playing"));
+	me.TR(me);
+	dlist = makeNexuizDemoList();
+	me.TR(me);
+		me.TD(me, 1, 0.5, e = makeNexuizTextLabel(0, "Filter:"));
+		me.TD(me, 1, 0.5, btn = makeNexuizButton("Clear", '0 0 0'));
+			btn.onClick = InputBox_Clear_Click;
+		me.TD(me, 1, me.columns - 1, e = makeNexuizInputBox(0, string_null));
+			e.onChange = DemoList_Filter_Change;
+			e.onChangeEntity = dlist;
+			btn.onClickEntity = e;
+			dlist.controlledTextbox = e;
+	me.TR(me);
+		me.TD(me, me.rows - 4, me.columns, dlist);
+	me.gotoRC(me, me.rows - 1, 0);
+		me.TD(me, 1, me.columns / 2, e = makeNexuizButton("Timedemo", '0 0 0'));
+			e.onClick = TimeDemo_Click;
+			e.onClickEntity = dlist;
+		me.TD(me, 1, me.columns / 2, e = makeNexuizButton("Play", '0 0 0'));
+			e.onClick = StartDemo_Click;
+			e.onClickEntity = dlist;
+}
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join_serverinfo.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join_serverinfo.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join_serverinfo.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -41,8 +41,7 @@
 float SLIST_FIELD_NUMBOTS;
 float SLIST_FIELD_MOD;
 float SLIST_FIELD_PING;
-string CURRENT_IP; //used by join button
-void Join_Click(entity me);
+void Join_Click(entity btn, entity me);
 #endif
 
 #ifdef IMPLEMENTATION
@@ -57,7 +56,6 @@
 
 	SLIST_FIELD_CNAME = gethostcacheindexforkey("cname");
 	me.currentServerCName = strzone(gethostcachestring(SLIST_FIELD_CNAME, i));
-	CURRENT_IP = me.currentServerCName; //used by join button
 	me.cnameLabel.setText(me.cnameLabel, me.currentServerCName);
 
 	SLIST_FIELD_QCSTATUS = gethostcacheindexforkey("qcstatus");
@@ -70,8 +68,8 @@
 	}
 	else
 	{
-		typestr = "N.A.";
-		versionstr = "N.A.";
+		typestr = "N/A";
+		versionstr = "N/A";
 	}
 	me.currentServerType = strzone(typestr);
 	me.typeLabel.setText(me.typeLabel, me.currentServerType);
@@ -178,9 +176,9 @@
 			e.onClickEntity = me;
 }
 
-void Join_Click(entity me)
+void Join_Click(entity btn, entity me)
 {
-	localcmd("connect ", CURRENT_IP, "\n");
+	localcmd("connect ", me.currentServerCName, "\n");
 }
 
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -73,6 +73,7 @@
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(0, 1, sl, "View bobbing:"));
 		me.TD(me, 1, 2, sl);
 	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Zoom Factor:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(2, 16, 0.5, "cl_zoomfactor"));
 	me.TR(me);
@@ -82,8 +83,8 @@
 		sl = makeNexuizSlider(1, 8, 0.5, "cl_zoomspeed");
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1, 1, sl, "Zoom speed:"));
 		me.TD(me, 1, 2, sl);
-
 	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 1.5, e = makeNexuizButton("Weapon settings...", '0 0 0'));
 			e.onClick = DialogOpenButton_Click;
 			e.onClickEntity = main.weaponsDialog;
@@ -92,13 +93,22 @@
 			e0.allowCut = 1;
 	me.TR(me);
 	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "crosshair_per_weapon", "Per weapon crosshairs"));
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(1, "crosshair_color_override", "Per weapon crosshair colors"));
+		setDependent(e, "crosshair_per_weapon", 1, 1);
+	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair:"));
-		for(i = 1; i <= 10; ++i)
+		for(i = 1; i <= 10; ++i) {
 			me.TDNoMargin(me, 1, 2 / 10, e = makeNexuizCrosshairButton(3, i), '0 0 0');
+			setDependent(e, "crosshair_per_weapon", 0, 0);
+		}
 	me.TR(me);
 		me.TDempty(me, 1);
-		for(i = 11; i <= 20; ++i)
+		for(i = 11; i <= 20; ++i) {
 			me.TDNoMargin(me, 1, 2 / 10, e = makeNexuizCrosshairButton(3, i), '0 0 0');
+			setDependent(e, "crosshair_per_weapon", 0, 0);
+		}
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Size:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0.40, 2, 0.05, "crosshair_size"));
@@ -108,12 +118,15 @@
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Red:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_red"));
+		setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Green:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_green"));
+		setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Blue:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_blue"));
+		setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
 	me.TR(me);
 	/*
 	 * not supported by the current csqc code
@@ -136,20 +149,8 @@
 			e.onClickEntity = main.radarDialog;
 		me.TDempty(me, 0.5);
 	me.TR(me);
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Network speed:"));
-		me.TD(me, 1, 2, e = makeNexuizTextSlider("_cl_rate"));
-			e.addValue(e, "56k", "4000");
-			e.addValue(e, "ISDN", "7000");
-			e.addValue(e, "Slow ADSL", "15000");
-			e.addValue(e, "Fast ADSL", "20000");
-			e.addValue(e, "Broadband", "25000");
-			e.configureNexuizTextSliderValues(e);
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Client UDP port:"));
-		me.TD(me, 1, 0.64, e = makeNexuizInputBox(0, "cl_port"));
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_hidewaypoints;sendcvar cl_shownames;rate $_cl_rate", COMMANDBUTTON_APPLY));
+		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_hidewaypoints;sendcvar cl_shownames", COMMANDBUTTON_APPLY));
 }
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup_weapons.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup_weapons.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup_weapons.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -6,7 +6,7 @@
 	ATTRIB(NexuizWeaponsDialog, title, string, "Weapon settings")
 	ATTRIB(NexuizWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
 	ATTRIB(NexuizWeaponsDialog, intendedWidth, float, 0.35)
-	ATTRIB(NexuizWeaponsDialog, rows, float, 14)
+	ATTRIB(NexuizWeaponsDialog, rows, float, 15)
 	ATTRIB(NexuizWeaponsDialog, columns, float, 4)
 	ATTRIB(NexuizWeaponsDialog, weaponsList, entity, NULL)
 ENDCLASS(NexuizWeaponsDialog)
@@ -24,23 +24,29 @@
 void fillNexuizWeaponsDialog(entity me)
 {
 	entity e;
+	float h0, h;
+
+	h = me.rows - 6;
+	
 	me.TR(me);
 		me.TD(me, 1, 4, makeNexuizTextLabel(0, "Weapon priority list:"));
 	me.TR(me);
-		me.TD(me, me.rows - 5, 3, e = me.weaponsList = makeNexuizWeaponsList());
-	me.gotoRC(me, (me.rows - 5) / 2, 3);
+		h0 = me.currentRow;
+		me.TD(me, h, 3, e = me.weaponsList = makeNexuizWeaponsList());
+	me.gotoRC(me, h0 + h / 2 - 1, 3);
 		me.TD(me, 1, 1, e = makeNexuizButton("Up", '0 0 0'));
 			e.onClick = WeaponsList_MoveUp_Click;
 			e.onClickEntity = me.weaponsList;
-	me.gotoRC(me, (me.rows - 5) / 2 + 1, 3);
+	me.gotoRC(me, h0 + h / 2, 3);
 		me.TD(me, 1, 1, e = makeNexuizButton("Down", '0 0 0'));
 			e.onClick = WeaponsList_MoveDown_Click;
 			e.onClickEntity = me.weaponsList;
-	me.gotoRC(me, me.rows - 4, 0);
-		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_weaponpriority_useforcycling", "Use for weapon cycling"));
+	me.gotoRC(me, h0 + h, 0);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_weaponpriority_useforcycling", "Use priority list for weapon cycling"));
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_autoswitch", "Auto switch weapons on pickup"));
 	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_drawviewmodel", "Draw 1st person weapon model"));
 	me.TR(me);
 		me.TD(me, 1, me.columns, e = makeNexuizButton("OK", '0 0 0'));

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -19,7 +19,7 @@
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Video",   makeNexuizVideoSettingsTab()));
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Effects", makeNexuizEffectsSettingsTab()));
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Audio",   makeNexuizAudioSettingsTab()));
-		me.TD(me, 1, 1, mc.makeTabButton(mc, "Demos",   makeNexuizDemoSettingsTab()));
+		me.TD(me, 1, 1, mc.makeTabButton(mc, "Network", makeNexuizNetworkSettingsTab()));
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Misc",    makeNexuizMiscSettingsTab()));
 	me.TR(me);
 	me.TR(me);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -20,7 +20,7 @@
 
 void fillNexuizAudioSettingsTab(entity me)
 {
-	entity e, s;
+	entity e, s, sl;
 
 	me.TR(me);
 		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "bgmvolume");
@@ -57,6 +57,7 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_playerchannel6volume");
+		makeMulti(s, "snd_csqcchannel6volume");
 		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Pain:"));
 		me.TD(me, 1, 2, s);
 		setDependentStringNotEqual(e, "volume", "0");
@@ -72,7 +73,7 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		s = makeNexuizDecibelsSlider(-20, 0, 0.5, "snd_entchannel4volume");
-		makeMulti(s, "snd_playerchannel4volume");
+		makeMulti(s, "snd_playerchannel4volume snd_entchannel6volume snd_csqcchannel4volume");
 		me.TD(me, 1, 0.8, e = makeNexuizSliderCheckBox(-1000000, 1, s, "Shots:"));
 		me.TD(me, 1, 2, s);
 		setDependentStringNotEqual(e, "volume", "0");
@@ -120,10 +121,43 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 2.8, e = makeNexuizCheckBox(0, "snd_swapstereo", "Swap Stereo"));
+		setDependent(e, "snd_channels", 1.5, 0.5);
 	me.TR(me);
-	
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 2.8, e = makeNexuizCheckBox(0, "snd_spatialization_control", "Headphone friendly mode"));
+		setDependent(e, "snd_channels", 1.5, 0.5);
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Directional voices:"));
+		me.TD(me, 1, 2/3, e = makeNexuizRadioButton(1, "cl_voice_directional", "0", "None"));
+		me.TD(me, 1, 2/3, e = makeNexuizRadioButton(1, "cl_voice_directional", "2", "Taunts"));
+		me.TD(me, 1, 2/3, e = makeNexuizRadioButton(1, "cl_voice_directional", "1", "All"));
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Taunt range:"));
+		setDependent(e, "cl_voice_directional", 0.5, -0.5);
+		me.TD(me, 1, 1.8, e = makeNexuizTextSlider("cl_voice_directional_taunt_attenuation"));
+			e.addValue(e, "Very short", "3");
+			e.addValue(e, "Short", "2");
+			e.addValue(e, "Normal", "0.5");
+			e.addValue(e, "Long", "0.25");
+			e.addValue(e, "Full", "0.015625");
+			e.configureNexuizTextSliderValues(e);
+		setDependent(e, "cl_voice_directional", 0.5, -0.5);
+	me.TR(me);
+		sl = makeNexuizSlider(0.15, 1, 0.05, "cl_autotaunt");
+			sl.valueDisplayMultiplier = 100;
+		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(0, 1, sl, "Automatic taunts"));
+		if(sl.value != e.savedValue)
+			e.savedValue = 0.65; // default
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizTextLabel(0.1, "Frequency:"));
+		me.TD(me, 1, 2, sl);
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_hitsound", "Hit indicator"));
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "snd_restart", COMMANDBUTTON_APPLY));
+		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "snd_restart; sendcvar cl_hitsound; sendcvar cl_autotaunt; sendcvar cl_voice_directional; sendcvar cl_voice_directional_taunt_attenuation", COMMANDBUTTON_APPLY));
 }
 #endif

Deleted: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,50 +0,0 @@
-#ifdef INTERFACE
-CLASS(NexuizDemoSettingsTab) EXTENDS(NexuizTab)
-	METHOD(NexuizDemoSettingsTab, fill, void(entity))
-	ATTRIB(NexuizDemoSettingsTab, title, string, "Demo")
-	ATTRIB(NexuizDemoSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizDemoSettingsTab, rows, float, 17)
-	ATTRIB(NexuizDemoSettingsTab, columns, float, 6.5)
-	ATTRIB(NexuizDemoSettingsTab, name, string, "DemoBroswer")	
-ENDCLASS(NexuizDemoSettingsTab)
-entity makeNexuizDemoSettingsTab();
-#endif
-
-#ifdef IMPLEMENTATION
-entity makeNexuizDemoSettingsTab()
-{
-	entity me;
-	me = spawnNexuizDemoSettingsTab();
-	me.configureDialog(me);
-	return me;
-}
-void fillNexuizDemoSettingsTab(entity me)
-{
-	entity e;
-	entity btn;
-	entity dlist;
-
-	me.TR(me);
-		me.TD(me, 1, me.columns, e = makeNexuizCheckBox(0, "cl_autodemo", "Record demos while playing"));
-	me.TR(me);
-	dlist = makeNexuizDemoList();
-	me.TR(me);
-		me.TD(me, 1, 0.5, e = makeNexuizTextLabel(0, "Filter:"));
-		me.TD(me, 1, 0.5, btn = makeNexuizButton("Clear", '0 0 0'));
-			btn.onClick = InputBox_Clear_Click;
-		me.TD(me, 1, me.columns - 1, e = makeNexuizInputBox(0, string_null));
-			e.onChange = DemoList_Filter_Change;
-			e.onChangeEntity = dlist;
-			btn.onClickEntity = e;
-			dlist.controlledTextbox = e;
-	me.TR(me);
-		me.TD(me, me.rows - 4, me.columns, dlist);
-	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns / 2, e = makeNexuizButton("Timedemo", '0 0 0'));
-			e.onClick = TimeDemo_Click;
-			e.onClickEntity = dlist;
-		me.TD(me, 1, me.columns / 2, e = makeNexuizButton("Play", '0 0 0'));
-			e.onClick = StartDemo_Click;
-			e.onClickEntity = dlist;
-}
-#endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_effects.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_effects.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_effects.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -76,15 +76,21 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Distance:"));
+			setDependent(e, "cl_decals", 1, 1);
 		me.TD(me, 1, 2, e = makeNexuizSlider(200, 500, 20, "r_drawdecals_drawdistance"));
 			setDependent(e, "cl_decals", 1, 1);
 	me.TR(me);
 		me.TDempty(me, 0.2);
 	    me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Time:"));
+	        setDependent(e, "cl_decals", 1, 1);
 	    me.TD(me, 1, 2, e = makeNexuizSlider(1, 20, 1, "cl_decals_time"));
 	        setDependent(e, "cl_decals", 1, 1);
 
 	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_gentle", "Replace gore effects for general audiences"));
+
+	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Gibs:"));
 		me.TD(me, 1, 2, e = makeNexuizTextSlider("cl_nogibs"));
 			e.addValue(e, "None", "1");
@@ -94,11 +100,8 @@
 			e.configureNexuizTextSliderValues(e);
 
 	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_coronas", "Coronas"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizCheckBox(0, "r_bloom", "Bloom"));
-			setDependent(e, "r_hdr", 0, 0);
-		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "r_hdr", "High Dynamic Range (HDR)"));
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Damage kick:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 0.5, 0.05, "v_kicktime"));
 
 	me.gotoRC(me, 2, 3.5); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Anisotropy:"));
@@ -110,10 +113,10 @@
 			e.addValue(e, "16x", "16");
 			e.configureNexuizTextSliderValues(e);
 	me.TR(me);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_offsetmapping", "Offset mapping"));
-			setDependent(e, "r_glsl", 1, 1);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_offsetmapping_reliefmapping", "Relief mapping"));
-			setDependentAND(e, "r_glsl", 1, 1, "r_glsl_offsetmapping", 1, 1);
+		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_deluxemapping", "Deluxe mapping"));
+			setDependentAND(e, "r_glsl", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
+		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_shadow_gloss", "Gloss"));
+			setDependentAND3(e, "r_glsl", 1, 1, "r_glsl_deluxemapping", 1, 2, "mod_q3bsp_nolightmaps", 0, 0);
 
 	me.TR(me);
 
@@ -133,14 +136,19 @@
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 2.8, e = makeNexuizCheckBox(0, "r_shadow_usenormalmap", "Use normal maps"));
 			setDependentOR(e, "r_shadow_realtime_dlight", 1, 1, "r_shadow_realtime_world", 1, 1);
+
 	me.TR(me);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_deluxemapping", "Deluxe mapping"));
-			setDependentAND(e, "r_glsl", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_shadow_gloss", "Gloss"));
-			setDependentAND3(e, "r_glsl", 1, 1, "r_glsl_deluxemapping", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
+		if(cvar("developer"))
+			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_showsurfaces", "Show surfaces"));
+				e.yesValue = 3;
+
+	me.TR(me);
+		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_offsetmapping", "Offset mapping"));
+			setDependent(e, "r_glsl", 1, 1);
+		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_offsetmapping_reliefmapping", "Relief mapping"));
+			setDependentAND(e, "r_glsl", 1, 1, "r_glsl_offsetmapping", 1, 1);
 	
 	me.TR(me);
-	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizCheckBox(0, "r_water", "Reflections"));
 			setDependent(e, "r_glsl", 1, 1);
 		me.TD(me, 1, 2, e = makeNexuizTextSlider("r_water_resolutionmultiplier"));
@@ -154,16 +162,13 @@
 	me.TR(me);
 
 	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Damage kick:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 0.5, 0.05, "v_kicktime"));
-
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_coronas", "Coronas"));
 	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizCheckBox(0, "r_bloom", "Bloom"));
+			setDependent(e, "r_hdr", 0, 0);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "r_hdr", "High Dynamic Range (HDR)"));
 
-	me.TR(me);
-		if(cvar("developer"))
-			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_showsurfaces", "Show surfaces"));
-
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "sendcvar cl_nogibs; r_restart", COMMANDBUTTON_APPLY));
+		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "r_restart", COMMANDBUTTON_APPLY));
 }
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -58,9 +58,11 @@
 		else if(cvar_type("joystick") & CVAR_TYPEFLAG_ENGINE)
 			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "joystick", "Use joystick input"));
 	me.TR(me);
+		if(cvar_type("vid_dgamouse") & CVAR_TYPEFLAG_ENGINE)
+			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "vid_dgamouse", "Turn off OS mouse acceleration"));
+		else if(cvar_type("apple_mouse_noaccel") & CVAR_TYPEFLAG_ENGINE)
+			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "apple_mouse_noaccel", "Turn off OS mouse acceleration"));
 	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_movement", "Client-side movement prediction"));
-	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "con_closeontoggleconsole", "\"enter console\" also closes"));
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Show binds:"));
@@ -69,10 +71,5 @@
 			e.addValue(e, "Short", "1");
 			e.addValue(e, "Long", "2");
 			e.configureNexuizTextSliderValues(e);
-	me.TR(me);
-		if(cvar_type("vid_dgamouse") & CVAR_TYPEFLAG_ENGINE)
-			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "vid_dgamouse", "Turn off OS mouse acceleration"));
-		else if(cvar_type("apple_mouse_noaccel") & CVAR_TYPEFLAG_ENGINE)
-			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "apple_mouse_noaccel", "Turn off OS mouse acceleration"));
 }
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -25,12 +25,12 @@
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizTextLabel(0, "Menu skins:"));
 	me.TR(me);
-		me.TD(me, me.rows - 2, 3, sk = makeNexuizSkinList());		
+		me.TD(me, me.rows - 2, 3, sk = makeNexuizSkinList());
 	me.gotoRC(me, me.rows - 1, 0);
 		me.TD(me, 1, 3, e = makeNexuizButton("Apply immediately", '0 0 0'));
 			e.onClick = SetSkin_Click;
 			e.onClickEntity = sk;
-		
+
 	me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "showtime", "Show current time"));
 	me.TR(me);
@@ -49,5 +49,12 @@
 		me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "3", "km/h"));
 		me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "4", "mph"));
 		me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "5", "knots"));
+	me.TR(me);
+	me.TR(me);
+		me.TDempty(me, 0.5);
+		me.TD(me, 1, 2, e = makeNexuizButton("Advanced settings...", '0 0 0'));
+			e.onClick = DialogOpenButton_Click;
+			e.onClickEntity = main.cvarsDialog;
+		me.TDempty(me, 0.5);
 }
 #endif

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc_cvars.c (from rev 5656, trunk/data/qcsrc/menu/nexuiz/dialog_settings_misc_cvars.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc_cvars.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc_cvars.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,69 @@
+#ifdef INTERFACE
+CLASS(NexuizCvarsDialog) EXTENDS(NexuizDialog)
+	METHOD(NexuizCvarsDialog, toString, string(entity))
+	METHOD(NexuizCvarsDialog, fill, void(entity))
+	METHOD(NexuizCvarsDialog, showNotify, void(entity))
+	ATTRIB(NexuizCvarsDialog, title, string, "Advanced settings")
+	ATTRIB(NexuizCvarsDialog, color, vector, SKINCOLOR_DIALOG_CVARS)
+	ATTRIB(NexuizCvarsDialog, intendedWidth, float, 0.8)
+	ATTRIB(NexuizCvarsDialog, rows, float, 25)
+	ATTRIB(NexuizCvarsDialog, columns, float, 6)
+ENDCLASS(NexuizCvarsDialog)
+#endif
+
+#ifdef IMPLEMENTATION
+void showNotifyNexuizCvarsDialog(entity me)
+{
+	loadAllCvars(me);
+}
+string toStringNexuizCvarsDialog(entity me)
+{
+	return "XXX";
+}
+void fillNexuizCvarsDialog(entity me)
+{
+	entity e, cvarlist, btn;
+	cvarlist = makeNexuizCvarList();
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Cvar filter:"));
+		me.TD(me, 1, 0.5, btn = makeNexuizButton("Clear", '0 0 0'));
+		me.TD(me, 1, me.columns - 1.5, e = makeNexuizInputBox(0, string_null));
+			e.onChange = CvarList_Filter_Change;
+			e.onChangeEntity = cvarlist;
+			btn.onClick = InputBox_Clear_Click;
+			btn.onClickEntity = e;
+			cvarlist.controlledTextbox = e; // this COULD also be the Value box, but this leads to accidentally editing stuff
+	me.TR(me);
+		me.TD(me, me.rows - me.currentRow - 7, me.columns, cvarlist);
+	me.gotoRC(me, me.rows - 7, 0);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Setting:"));
+		me.TD(me, 1, me.columns - 1, e = makeNexuizTextLabel(0, string_null));
+			cvarlist.cvarNameBox = e;
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Type:"));
+		me.TD(me, 1, me.columns - 1, e = makeNexuizTextLabel(0, string_null));
+			cvarlist.cvarTypeBox = e;
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Value:"));
+		me.TD(me, 1, me.columns - 2, e = makeNexuizInputBox(0, string_null));
+			cvarlist.cvarValueBox = e;
+			e.onChange = CvarList_Value_Change;
+			e.onChangeEntity = cvarlist;
+		me.TD(me, 1, 1, e = makeNexuizButton(string_null, SKINCOLOR_CVARLIST_REVERTBUTTON));
+			cvarlist.cvarDefaultBox = e;
+			e.onClick = CvarList_Revert_Click;
+			e.onClickEntity = cvarlist;
+			e.allowCut = 1;
+			e.marginLeft = e.marginRight = 0.5;
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Description:"));
+		me.TD(me, 1, me.columns - 1, e = makeNexuizTextLabel(0, string_null));
+			cvarlist.cvarDescriptionBox = e;
+			e.allowWrap = 1;
+	me.gotoRC(me, me.rows - 1, 0);
+		me.TD(me, 1, me.columns, e = makeNexuizButton("OK", '0 0 0'));
+			e.onClick = Dialog_Close;
+			e.onClickEntity = me;
+}
+
+#endif

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_network.c (from rev 5656, trunk/data/qcsrc/menu/nexuiz/dialog_settings_network.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_network.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_network.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,60 @@
+#ifdef INTERFACE
+CLASS(NexuizNetworkSettingsTab) EXTENDS(NexuizTab)
+	METHOD(NexuizNetworkSettingsTab, fill, void(entity))
+	ATTRIB(NexuizNetworkSettingsTab, title, string, "Audio")
+	ATTRIB(NexuizNetworkSettingsTab, intendedWidth, float, 0.9)
+	ATTRIB(NexuizNetworkSettingsTab, rows, float, 17)
+	ATTRIB(NexuizNetworkSettingsTab, columns, float, 6.5)
+ENDCLASS(NexuizNetworkSettingsTab)
+entity makeNexuizNetworkSettingsTab();
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizNetworkSettingsTab()
+{
+	entity me;
+	me = spawnNexuizNetworkSettingsTab();
+	me.configureDialog(me);
+	return me;
+}
+
+void fillNexuizNetworkSettingsTab(entity me)
+{
+	entity e;
+
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_movement", "Client-side movement prediction"));
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(1, "cl_nolerp", "Network update smoothing"));
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "shownetgraph", "Show netgraph"));
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Network speed:"));
+		me.TD(me, 1, 2, e = makeNexuizTextSlider("_cl_rate"));
+			e.addValue(e, "56k", "4000");
+			e.addValue(e, "ISDN", "7000");
+			e.addValue(e, "Slow ADSL", "15000");
+			e.addValue(e, "Fast ADSL", "20000");
+			e.addValue(e, "Broadband", "25000");
+			e.configureNexuizTextSliderValues(e);
+    me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Outgoing packets/s:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(20, 120, 1, "cl_netfps"));
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizTextLabel(0, "HTTP downloads:"));
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Downloads:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(1, 5, 1, "cl_curl_maxdownloads"));
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Speed (kB/s):"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(10, 1500, 10, "cl_curl_maxspeed"));
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Client UDP port:"));
+		me.TD(me, 1, 0.64, e = makeNexuizInputBox(0, "cl_port"));
+}
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_video.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_video.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_video.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -91,6 +91,7 @@
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBoxEx(4, 1, "vid_samples", "Use 4x multisampling"));
 	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "v_flipped", "Left handed mode"));
 	me.TR(me);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -54,8 +54,8 @@
 	entity e, btnPrev, btnNext, lblTitle;
 
 	me.TR(me);
-		me.TDempty(me, (me.columns - 2) / 2);
-		me.TD(me, 2, 2, e = makeNexuizBigButton("Instant action!", '0 0 0'));
+		me.TDempty(me, (me.columns - 3) / 2);
+		me.TD(me, 2, 3, e = makeNexuizBigButton("Instant action! (random map with bots)", '0 0 0'));
 			e.onClick = InstantAction_LoadMap;
 			e.onClickEntity = NULL;
 	me.TR(me);
@@ -76,7 +76,7 @@
 			me.campaignBox.campaignGo(me.campaignBox, 0);
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, e = makeNexuizButton("Start!", '0 0 0'));
+		me.TD(me, 1, me.columns, e = makeNexuizButton("Start Singleplayer!", '0 0 0'));
 			e.onClick = CampaignList_LoadMap;
 			e.onClickEntity = me.campaignBox;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -8,6 +8,7 @@
 	ATTRIB(MainWindow, winnerDialog, entity, NULL)
 	ATTRIB(MainWindow, radarDialog, entity, NULL)
 	ATTRIB(MainWindow, serverInfoDialog, entity, NULL)
+	ATTRIB(MainWindow, cvarsDialog, entity, NULL)
 	ATTRIB(MainWindow, mainNexposee, entity, NULL)
 	ATTRIB(MainWindow, fadedAlpha, float, SKINALPHA_BEHIND)
 ENDCLASS(MainWindow)
@@ -59,6 +60,10 @@
 	i.configureDialog(i);
 	me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 	
+	me.cvarsDialog = i = spawnNexuizCvarsDialog();
+	i.configureDialog(i);
+	me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+	
 	me.mainNexposee = n = spawnNexuizNexposee();
 	/*
 		if(checkextension("DP_GECKO_SUPPORT"))

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -20,8 +20,9 @@
 
 #define PLAYERPARM_SCORE 0
 #define PLAYERPARM_PING 1
-#define PLAYERPARM_NAME 2
-#define PLAYERPARM_COUNT 3
+#define PLAYERPARM_TEAM 2
+#define PLAYERPARM_NAME 3
+#define PLAYERPARM_COUNT 4
 
 entity makeNexuizPlayerList()
 {
@@ -35,7 +36,7 @@
 {
 	dprint(plist,"------------\n");
 
-	float buf,i;
+	float buf,i,n;
 	string s;
 
 	buf = buf_create();
@@ -48,10 +49,22 @@
 	for(i = 0; i < me.nItems; ++i)
 	{
 		s = bufstr_get(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME);
-		tokenize_sane(s);
-		bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
-		bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
-		bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(2)); // ^4Nex ^2Player
+		n = tokenize_sane(s);
+
+		if(n == 4)
+		{
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  argv(2)); // 0 for spec, else 1, 2, 3, 4
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(3)); // ^4Nex ^2Player
+		}
+		else
+		{
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  "-1");
+			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(2)); // ^4Nex ^2Player
+		}
 	}
 	me.playerList = buf;
 }
@@ -78,11 +91,29 @@
 void drawListBoxItemNexuizPlayerList(entity me, float i, vector absSize, float isSelected)
 {
 	string s;
+	float t;
+	vector rgb;
 
+	t = stof(me.getPlayerList(me, i, PLAYERPARM_TEAM));
+	if(t == 1)
+		rgb = colormapPaletteColor(4, 0);
+	else if(t == 2)
+		rgb = colormapPaletteColor(13, 0);
+	else if(t == 3)
+		rgb = colormapPaletteColor(12, 0);
+	else if(t == 4)
+		rgb = colormapPaletteColor(9, 0);
+	else
+		rgb = '1 1 1';
+	
 	s = me.getPlayerList(me, i, PLAYERPARM_NAME);
 
-	s = draw_TextShortenToWidth(s, me.columnNameSize / me.realFontSize_x, 1);
-	draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 1) * me.realFontSize_x)) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, 1, 1);
+	if(rgb != '1 1 1')
+		s = strdecolorize(s);
+
+	s = draw_TextShortenToWidth(s, me.columnNameSize / me.realFontSize_x, rgb == '1 1 1');
+
+	draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 1) * me.realFontSize_x)) * eX, s, me.realFontSize, rgb, 1, rgb == '1 1 1');
 }
 
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -172,7 +172,7 @@
 	else */
 	{
 		float m, o;
-		string s, typestr;
+		string s, typestr, modstr;
 		s = me.filterString;
 
 		m = strstrofs(s, ":", 0);
@@ -186,6 +186,8 @@
 		else
 			typestr = "";
 
+		modstr = cvar_string("menu_slist_modfilter");
+
 		m = SLIST_MASK_AND - 1;
 		resethostcachemasks();
 		if(!me.filterShowFull)
@@ -194,6 +196,13 @@
 			sethostcachemasknumber(++m, SLIST_FIELD_NUMHUMANS, 1, SLIST_TEST_GREATEREQUAL);
 		if(typestr != "")
 			sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(typestr, ":"), SLIST_TEST_STARTSWITH);
+		if(modstr != "")
+		{
+			if(substring(modstr, 0, 1) == "!")
+				sethostcachemaskstring(++m, SLIST_FIELD_MOD, substring(modstr, 1, strlen(modstr) - 1), SLIST_TEST_NOTEQUAL);
+			else
+				sethostcachemaskstring(++m, SLIST_FIELD_MOD, modstr, SLIST_TEST_EQUAL);
+		}
 		m = SLIST_MASK_OR - 1;
 		if(s != "")
 		{
@@ -240,7 +249,7 @@
 		me.refreshServerList(me, 0);
 	}
 
-	owned = (me.selectedServer == me.ipAddressBox.text);
+	owned = ((me.selectedServer == me.ipAddressBox.text) && (me.ipAddressBox.text != ""));
 
 	me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -312,3 +312,40 @@
 		campaign_won_previous = cvar(strcat("g_campaign", campaign_name, "_won"));
 	}
 }
+
+string getWrappedLine_remaining;
+string getWrappedLine(float w)
+{
+	float cantake;
+	float take;
+	string s;
+
+	s = getWrappedLine_remaining;
+
+	cantake = draw_TextLengthUpToWidth(s, w, 0);
+	if(cantake > 0 && cantake < strlen(s))
+	{
+		take = cantake - 1;
+		while(take > 0 && substring(s, take, 1) != " ")
+			--take;
+		if(take == 0)
+		{
+			getWrappedLine_remaining = substring(s, cantake, strlen(s) - cantake);
+			if(getWrappedLine_remaining == "")
+				getWrappedLine_remaining = string_null;
+			return substring(s, 0, cantake);
+		}
+		else
+		{
+			getWrappedLine_remaining = substring(s, take + 1, strlen(s) - take);
+			if(getWrappedLine_remaining == "")
+				getWrappedLine_remaining = string_null;
+			return substring(s, 0, take);
+		}
+	}
+	else
+	{
+		getWrappedLine_remaining = string_null;
+		return s;
+	}
+}

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/util.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -9,3 +9,6 @@
 void setDependentOR(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max);
 void setDependentAND3(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max, string theCvar3Name, float theCvar3Min, float theCvar3Max);
 void setDependentStringNotEqual(entity e, string theCvarName, string theCvarValue);
+
+string getWrappedLine_remaining;
+string getWrappedLine(float w);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -53,6 +53,7 @@
 	SKINVECTOR(COLOR_DIALOG_WEAPONS, '1 0.7 0.7');
 	SKINVECTOR(COLOR_DIALOG_RADAR, '0.7 0.7 1');
 	SKINVECTOR(COLOR_DIALOG_SERVERINFO, '0.7 0.7 1');
+	SKINVECTOR(COLOR_DIALOG_CVARS, '1 0 0');
 
 	// nexposee positions of windows (they are the scale transformation
 	// centers, NOT the actual positions of the windows!)
@@ -119,6 +120,13 @@
 	// item: crosshair button
 	SKINSTRING(GFX_CROSSHAIRBUTTON, "crosshairbutton");
 
+	// item: cvar list
+	SKINFLOAT(ALPHA_CVARLIST_SAVED, 1);
+	SKINFLOAT(ALPHA_CVARLIST_TEMPORARY, 0.7);
+	SKINVECTOR(COLOR_CVARLIST_CHANGED, '1 1 0.4');
+	SKINVECTOR(COLOR_CVARLIST_REVERTBUTTON, '1 0 0');
+	SKINVECTOR(COLOR_CVARLIST_UNCHANGED, '1 1 1');
+
 	// item: dialog
 	SKINSTRING(GFX_DIALOGBORDER, "border");
 	SKINSTRING(GFX_CLOSEBUTTON, "closebutton");

Deleted: branches/nexuiz-2.0/data/qcsrc/menu/todo
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/todo	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/menu/todo	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1 +0,0 @@
-TODO credits dialog

Modified: branches/nexuiz-2.0/data/qcsrc/server/arena.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -13,7 +13,6 @@
 void PutObserverInServer();
 void PutClientInServer();
 void(entity e) ReturnFlag;
-void(entity e) removedecor;
 void dom_controlpoint_setup();
 void onslaught_generator_reset();
 void onslaught_controlpoint_reset();
@@ -25,7 +24,7 @@
  * Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
  * Sets the 'warmup' global variable.
  */
-void reset_map()
+void reset_map(float norespawn)
 {
 	entity oldself;
 	oldself = self;
@@ -42,109 +41,36 @@
 	for(self = world; (self = nextent(self)); )
 	if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
 	{
-		if(self.classname == STR_ITEM_KH_KEY)
+		if(self.reset)
 		{
-			kh_Key_AssignTo(self, world);
-			//if(self.owner)
-			//	kh_Key_DropAll(self.owner, TRUE);
-			kh_Key_Remove(self);
+			self.reset();
+			continue;
 		}
-		else if(self.classname == "droppedweapon"		// cleanup
-				|| self.classname == "gib"
-				|| self.classname == "body")
+
+		if(self.team_saved)
+			self.team = self.team_saved;
+
+		if(self.flags & FL_PROJECTILE) // remove any projectiles left
 		{
+			stopsound(self, CHAN_PAIN);
 			remove(self);
 		}
-		else if(self.items & (IT_KEY1 | IT_KEY2))
-		{
-			DropFlag(self, world, world);
-			ReturnFlag(self);
-		}
-		else if(self.classname == "rune")
-		{
-			if(self.owner)
-			if(self.owner.classname != "runematch_spawn_point")
-				DropAllRunes(self.owner);
-			rune_respawn();
-		}
-		else if(self.classname == "dom_controlpoint")
-		{
-			dom_controlpoint_setup();
-		}
-		else if(self.flags & FL_ITEM)			// reset items
-		{
-			if(self.state == 1)
-			{
-				self.model = string_null;
-				self.solid = SOLID_NOT;
-			}
-			else
-			{
-				self.model = self.mdl;
-				self.solid = SOLID_TRIGGER;
-			}
-			setorigin (self, self.origin);
-			self.think = SUB_Null;
-			self.nextthink = 0;
-		}
-		else if(self.flags & FL_PROJECTILE)		// remove any projectiles left
-		{
-			sound(self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
-			remove(self);
-		}
-		else if(self.isdecor)
-		{
-			removedecor(self);
-		}
-		else if(self.classname == "onslaught_generator")
-		{
-			onslaught_generator_reset();
-		}
-		else if(self.classname == "onslaught_controlpoint")
-		{
-			onslaught_controlpoint_reset();
-		}
-		// TODO properly reset Assault
-		// General teambased game modes
-		else if(self.classname == "info_player_deathmatch")
-		{
-			self.team = self.team_saved;
-		}
-		else if(self.classname == "func_breakable")
-		{
-			func_breakable_reset();
-		}
-		else if(self.classname == "func_assault_destructible")
-		{
-			func_breakable_reset();
-		}
-		else if(self.classname == "target_objective")
-		{
-			assault_objective_reset();
-		}
-		else if(self.classname == "target_assault_roundend")
-		{
-			target_assault_roundend_reset();
-		}
 	}
 
 	// Waypoints and assault start come LAST
 	for(self = world; (self = nextent(self)); )
 	if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
 	{
-		if(self.classname == "sprite_waypoint")
+		if(self.reset2)
 		{
-			if(self.health | g_keyhunt)
-				WaypointSprite_Kill(self);
+			self.reset2();
+			continue;
 		}
-		else if(self.classname == "target_assault_roundstart")
-		{
-			self.use();
-		}
 	}
 
 	// Moving the player reset code here since the player-reset depends
 	// on spawnpoint entities which have to be reset first --blub
+	if(!norespawn)
 	FOR_EACH_CLIENT(self) {
 		if(self.flags & FL_CLIENT)				// reset all players
 		{
@@ -319,7 +245,7 @@
 			champion = find(world, classname, "player");
 			while(champion && champion.deadflag)
 				champion = find(champion, classname, "player");
-			reset_map();
+			reset_map(TRUE);
 		}
 
 		while(numspawned < maxspawned && spawnqueue_first)

Modified: branches/nexuiz-2.0/data/qcsrc/server/assault.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/assault.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/assault.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -54,6 +54,7 @@
 	self.classname = "target_objective";
 	self.use = assault_objective_use;
 	assault_objective_reset();
+	self.reset = assault_objective_reset;
 }
 
 
@@ -212,6 +213,7 @@
 	self.classname = "target_assault_roundend";
 	self.use = target_assault_roundend_use;
 	self.cnt = 0; // first round
+	self.reset = target_assault_roundend_reset;
 }
 
 void assault_roundstart_use() {
@@ -251,6 +253,7 @@
 	assault_attacker_team = COLOR_TEAM1;
 	self.classname = "target_assault_roundstart";
 	self.use = assault_roundstart_use;
+	self.reset2 = assault_roundstart_use;
 	InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET);
 }
 
@@ -269,30 +272,19 @@
 		assault_attacker_team = COLOR_TEAM1;
 	}
 
-	// swap spawn point teams
+
 	local entity ent;
-	ent = find(world, classname, "info_player_deathmatch");
-	while (ent)
+	for(ent = world; (ent = nextent(ent)); )
 	{
-		if(ent.team == COLOR_TEAM1) {
-			ent.team = COLOR_TEAM2;
-		} else {
-			ent.team = COLOR_TEAM1;
+		if(clienttype(ent) == CLIENTTYPE_NOTACLIENT)
+		{
+			if(ent.team_saved == COLOR_TEAM1)
+				ent.team_saved = COLOR_TEAM2;
+			else if(ent.team_saved == COLOR_TEAM2)
+				ent.team_saved = COLOR_TEAM1;
 		}
-		ent = find(ent, classname, "info_player_deathmatch");
 	}
 
-	// swap all destructibles
-	ent = find(world, classname, "func_assault_destructible");
-	while (ent)
-	{
-		if(ent.team == COLOR_TEAM1)
-			ent.team = COLOR_TEAM2;
-		else
-			ent.team = COLOR_TEAM1;
-		ent = find(ent, classname, "func_assault_destructible");
-	}
-
 	// reset the level with a countdown
 	cvar_set("timelimit", ftos(ceil(time - game_starttime) / 60));
 	ReadyRestartForce(); // sets game_starttime

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -49,9 +49,10 @@
 	// filter out spots for assault
 	if(spot.target != "") {
 		local entity ent;
-		float good;
+		float good, found;
 		ent = find(world, targetname, spot.target);
 		while(ent) {
+			found = 1;
 			if(ent.classname == "target_objective")
 			{
 				if(ent.health < 0 || ent.health >= ASSAULT_VALUE_INACTIVE)
@@ -90,7 +91,7 @@
 			ent = find(ent, targetname, spot.target);
 		}
 
-		if(!good)
+		if(found && !good)
 			return -1;
 	}
 
@@ -507,12 +508,12 @@
 	{
 		// Only if the player cannot play at all
 		if(PlayerScore_Add(self, SP_LMS_RANK, 0) == 666)
-			self.frags = -666;
+			self.frags = FRAGS_SPECTATOR;
 		else
-			self.frags = -667;
+			self.frags = FRAGS_SPECTATOR; // this was -667 before, is this okay?
 	}
 	else
-		self.frags = -666;
+		self.frags = FRAGS_SPECTATOR;
 }
 
 float RestrictSkin(float s)
@@ -653,6 +654,7 @@
 		self.movetype = MOVETYPE_WALK;
 		self.solid = SOLID_SLIDEBOX;
 		self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+		self.frags = FRAGS_PLAYER;
 		if(independent_players)
 			MAKE_INDEPENDENT_PLAYER(self);
 		self.flags = FL_CLIENT;
@@ -769,7 +771,6 @@
 		if(self.killcount == -666) {
 			PlayerScore_Clear(self);
 			self.killcount = 0;
-			self.frags = 0;
 		}
 
 		self.cnt = WEP_LASER;
@@ -1292,7 +1293,7 @@
 		if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0)
 		{
 			PlayerScore_Add(self, SP_LMS_RANK, 666);
-			self.frags = -666; // FIXME do we still need this?
+			self.frags = FRAGS_SPECTATOR; // FIXME do we still need this?
 		}
 	}
 
@@ -2298,12 +2299,19 @@
 		oldself = self; self = self.teamkill_soundsource;
 		oldpusher = self.pusher; self.pusher = oldself;
 
-		VoiceMessage("teamshoot_auto");
+		PlayerSound(playersound_teamshoot, CHAN_VOICE, VOICETYPE_LASTATTACKER_ONLY);
 
 		self.pusher = oldpusher;
 		self = oldself;
 	}
 
+	if(self.taunt_soundtime)
+	if(time > self.taunt_soundtime)
+	{
+		self.taunt_soundtime = 0;
+		PlayerSound(playersound_taunt, CHAN_VOICE, VOICETYPE_AUTOTAUNT);
+	}
+
 	target_voicescript_next(self);
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -70,6 +70,7 @@
  * 17: throw weapon
  * 18: next weapon according to sbar_hudselector 1 list
  * 19: previous weapon according to sbar_hudselector 1 list
+ * 20: reload if needed
  *
  * 30 to 39: create waypoints
  * 47: clear personal waypoints
@@ -119,7 +120,7 @@
 		else
 			self.impulse = imp; // retry in next frame
 	}
-	else if(imp >= 10 && imp <= 19)
+	else if(imp >= 10 && imp <= 20)
 	{
 		if(self.deadflag == DEAD_NO)
 		{
@@ -156,7 +157,10 @@
 				case 19:
 					W_PreviousWeapon (1);
 					break;
-				}
+				case 20:
+					W_Reload ();
+					break;
+			}
 		}
 		else
 			self.impulse = imp; // retry in next frame

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -85,7 +85,7 @@
 		player_setanim(self.anim_jump, FALSE, TRUE, TRUE);
 
 	if(g_jump_grunt)
-		PlayerSound(playersound_jump, CHAN_PLAYER, 0);
+		PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 }
 
 void CheckWaterJump()
@@ -497,9 +497,9 @@
 			if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
 			{
 				if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-					GlobalSound(globalsound_metalfall, CHAN_PLAYER, 0);
+					GlobalSound(globalsound_metalfall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 				else
-					GlobalSound(globalsound_fall, CHAN_PLAYER, 0);
+					GlobalSound(globalsound_fall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 			}
 		}
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -51,7 +51,6 @@
 	self.solid = oldself.solid;
 	self.takedamage = oldself.takedamage;
 	self.think = oldself.think;
-	self.gibrandom = oldself.gibrandom;
 	self.customizeentityforclient = oldself.customizeentityforclient;
 	if (keepvelocity == 1)
 		self.velocity = oldself.velocity;
@@ -62,6 +61,7 @@
 	setorigin(self, oldself.origin);
 	setsize(self, oldself.mins, oldself.maxs);
 	self.oldorigin = oldself.origin;
+	self.reset = SUB_Remove;
 	self = oldself;
 }
 
@@ -258,8 +258,8 @@
 void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
 	local float take, save;
-	if(sv_gentle < 1)	
-		pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200));
+	Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force, 2, bound(0, damage, 200) / 16);
+
 	// damage resistance (ignore most of the damage from a bullet or similar)
 	damage = max(damage - 5, 1);
 
@@ -273,13 +273,10 @@
 	else if (take > 10)
 		sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
 
-	if(independent_players)
-	if(sv_gentle < 1) {	
-		if (take > 50)
-			TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
-		if (take > 100)
-			TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.2,1);
-	}
+	if (take > 50)
+		Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force * -0.1, 3, 1);
+	if (take > 100)
+		Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force * -0.2, 3, 1);
 
 	if (!(self.flags & FL_GODMODE))
 	{
@@ -292,7 +289,7 @@
 	self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
 	self.dmg_inflictor = inflictor;
 
-	if (self.health <= -50)
+	if (self.health <= -75 && self.modelindex != 0)
 	{
 		// don't use any animations as a gib
 		self.frame = 0;
@@ -300,61 +297,9 @@
 		// view just above the floor
 		self.view_ofs = '0 0 4';
 
-		// make a juicy mess
-		local float multiplier;
-		multiplier = 1;
-		if (cvar("ekg"))
-			multiplier = 5;
-
-
-		// make a meaty mess
-		if(independent_players)
-		{
-			TossGib (self, "models/gibs/eye.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0);
-			self.solid = SOLID_TRIGGER; // undo SOLID_CORPSE
-			self.takedamage = DAMAGE_NO; // can't damage this gib, to prevent better jumps from it
-		}
-		else
-			TossGib (self, "models/gibs/eye.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0);
-		
-		if not(independent_players)
-		if(sv_gentle < 1) {
-			te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 1200 * multiplier, 1000);
-			TossGib (world, "models/gibs/bloodyskull.md3", self.origin + self.view_ofs, self.velocity,0);
-
-			local float c;
-			c = 0;
-
-			while (c < multiplier)
-			{
-				c = c + 1;
-				//TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity + randomvec() * 450,0);
-				//TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity + randomvec() * 450,0);
-				//TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity + randomvec() * 450,0);
-				//TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity + randomvec() * 450,0);
-				//TossGib (world, "models/gibs/gib5.md3", self.origin, self.velocity + randomvec() * 450,0);
-				//TossGib (world, "models/gibs/gib6.md3", self.origin, self.velocity + randomvec() * 450,0);
-
-				TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0);
-				TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0);
-				//TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0);
-				//TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0);
-				TossGib (world, "models/gibs/chest.md3", self.origin + self.view_ofs * 0.5, self.velocity + randomvec() * (random() * 120 + 80),0);
-				//TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0);
-				TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 80),0);
-				TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * (random() * 120 + 85),0);
-				TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * (random() * 120 + 85),0);
-				//TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * 150,0);
-				//TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * 150,0);
-
-				// these splat on impact
-				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
-				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
-				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
-				TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1);
-			}
-			sound (self, CHAN_PLAYER, "misc/gib.wav", VOL_BASE, ATTN_NORM);
-		}
+		Violence_GibSplash(self, 1, 1);
+		self.modelindex = 0; // restore later
+		self.solid = SOLID_NOT; // restore later
 	}
 }
 
@@ -371,11 +316,7 @@
 			damage /= sqrt(bound(1.0, attacker.cvar_cl_handicap, 100.0));
 	}
 
-	if(sv_gentle > 0) {
-		pointparticles(particleeffectnum("damage_hit"), hitloc, force, bound(0, damage, 200));
-	} else {
-		pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200));
-	}
+	Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force, 2, bound(0, damage, 200) / 16);
 
 	if(g_arena)
 	if(numspawned < 2)
@@ -399,14 +340,10 @@
 	else if (take > 10)
 		sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
 
-	if(sv_gentle < 1)
-	if not(independent_players)
-	{
-		if (take > 50)
-			TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1);
-		if (take > 100)
-			TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.2,1);
-	}
+	if (take > 50)
+		Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force * -0.1, 3, 1);
+	if (take > 100)
+		Violence_GibSplash_At(hitloc, '0 0 0', '0 0 0', force * -0.2, 3, 1);
 
 	if (time > self.spawnshieldtime)
 	{
@@ -431,13 +368,13 @@
 					// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
 					{
 						if(self.health > 75) // TODO make a "gentle" version?
-							PlayerSound(playersound_pain100, CHAN_PAIN, 0);
+							PlayerSound(playersound_pain100, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 						else if(self.health > 50)
-							PlayerSound(playersound_pain75, CHAN_PAIN, 0);
+							PlayerSound(playersound_pain75, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 						else if(self.health > 25)
-							PlayerSound(playersound_pain50, CHAN_PAIN, 0);
+							PlayerSound(playersound_pain50, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 						else if(self.health > 1)
-							PlayerSound(playersound_pain25, CHAN_PAIN, 0);
+							PlayerSound(playersound_pain25, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 					}
 				}
 
@@ -482,9 +419,9 @@
 		if(sv_gentle < 1) // TODO make a "gentle" version?
 		{
 			if(deathtype == DEATH_DROWN)
-				PlayerSound(playersound_drown, CHAN_PAIN, 0);
+				PlayerSound(playersound_drown, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 			else
-				PlayerSound(playersound_death, CHAN_PAIN, 0);
+				PlayerSound(playersound_death, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
 		}
 
 		// get rid of kill indicator
@@ -611,7 +548,6 @@
 		if(sv_gentle > 0) {
 			// remove corpse
 			PlayerCorpseDamage (inflictor, attacker, 100.0, deathtype, hitloc, force);
-			pointparticles(particleeffectnum("damage_dissolve"), self.origin, force, 1);
 		}
 	}
 }
@@ -759,15 +695,150 @@
 		self.last_selected_player = self.selected_player;
 }
 
-float GetVoiceMessageTeamsayType(string type)
+.float floodcontrol_chat;
+.float floodcontrol_chatteam;
+void Say(entity source, float teamsay, string msgin, float floodcontrol)
 {
+	string msgstr, colorstr, cmsgstr, namestr;
+	float flood;
+	entity head;
+
+	if(Ban_MaybeEnforceBan(source))
+		return;
+
+	if(!teamsay)
+		if(substring(msgin, 0, 1) == " ")
+			msgin = substring(msgin, 1, strlen(msgin) - 1); // work around DP say bug (say_team does not have this!)
+
+	msgin = formatmessage(msgin);
+
+	if(msgin == "")
+		return;
+
+	if(source.classname != "player")
+		colorstr = "^0"; // black for spectators
+	else if(teams_matter)
+		colorstr = Team_ColorCode(source.team);
+	else
+		teamsay = FALSE;
+
+	if(intermission_running)
+		teamsay = FALSE;
+
+	/*
+	 * using bprint solves this... me stupid
+	// how can we prevent the message from appearing in a listen server?
+	// for now, just give "say" back and only handle say_team
+	if(!teamsay)
+	{
+		clientcommand(self, strcat("say ", msgin));
+		return;
+	}
+	*/
+
+	if(cvar("g_chat_teamcolors"))
+		namestr = playername(source);
+	else
+		namestr = source.netname;
+	if(teamsay)
+	{
+		msgstr = strzone(strcat("\{1}\{13}", colorstr, "(^3", namestr, colorstr, ") ^7", msgin, "\n"));
+		cmsgstr = strcat(colorstr, "(^3", namestr, colorstr, ")\n^7", wordwrap(msgin, 50));
+	}
+	else
+		msgstr = strzone(strcat("\{1}", namestr, "^7: ", msgin, "\n"));
+
+	// FLOOD CONTROL
+	flood = 0;
+	if(floodcontrol)
+	{
+		float flood_spl;
+		float flood_burst;
+		float flood_lmax;
+		var .float flood_field;
+		float lines;
+		if(teamsay)
+		{
+			flood_spl = cvar("g_chat_flood_spl_team");
+			flood_burst = cvar("g_chat_flood_burst_team");
+			flood_lmax = cvar("g_chat_flood_lmax_team");
+			flood_field = floodcontrol_chatteam;
+		}
+		else
+		{
+			flood_spl = cvar("g_chat_flood_spl");
+			flood_burst = cvar("g_chat_flood_burst");
+			flood_lmax = cvar("g_chat_flood_lmax");
+			flood_field = floodcontrol_chat;
+		}
+		flood_burst = max(0, flood_burst - 1);
+		// to match explanation in default.cfg, a value of 3 must allow three-line bursts and not four!
+		lines = ceil(strlennocol(msgstr) / 75);
+		if(flood_lmax && lines > flood_lmax)
+			flood = 2;
+		else if(time >= self.flood_field)
+			self.flood_field = max(time - flood_burst * flood_spl, self.flood_field) + lines * flood_spl;
+		else
+			flood = 1;
+	}
+
+	if(flood)
+	{
+		if(cvar("g_chat_flood_notify_flooder"))
+		{
+			if(flood == 1)
+				sprint(self, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(self.flood_field - time), "^3 seconds\n"));
+			else if(flood == 2)
+				sprint(self, "^3FLOOD CONTROL: ^7message too long\n");
+		}
+		else
+			sprint(self, msgstr);
+		print("NOTE: ", playername(self), "^7 is flooding.\n");
+	}
+	else if(teamsay)
+	{
+		if(source.classname == "player")
+		{
+			FOR_EACH_REALPLAYER(head)
+			{
+				if(head.team == source.team)
+				{
+					sprint(head, msgstr);
+					centerprint(head, cmsgstr);
+				}
+			}
+		}
+		else
+		{
+			FOR_EACH_REALCLIENT(head) if(head.classname != "player")
+			{
+				sprint(head, msgstr);
+				centerprint(head, cmsgstr);
+			}
+		}
+	}
+	else
+	{
+		// TODO invent a cvar name for allowing global chat by spectators during warmup anyway
+		if(cvar("g_chat_nospectators") && source.classname != "player") {
+			FOR_EACH_REALCLIENT(head) if(head.classname != "player") {
+				sprint(head, msgstr);
+			}
+		}
+		else
+			bprint(msgstr);
+	}
+
+	strunzone(msgstr);
+}
+
+float GetVoiceMessageVoiceType(string type)
+{
 	if(type == "taunt")
-		return 0;
+		return VOICETYPE_TAUNT;
 	if(type == "teamshoot")
-		return 2;
-	if(type == "teamshoot_auto")
-		return 3;
-	return 1;
+		return VOICETYPE_LASTATTACKER;
+	return VOICETYPE_TEAMRADIO;
 }
 
 string allvoicesamples;
@@ -782,8 +853,6 @@
 #define _VOICEMSG(m) case #m: return playersound_##m;
 		ALLVOICEMSGS
 #undef _VOICEMSG
-		// exception:
-		case "teamshoot_auto": return playersound_teamshoot;
 	}
 	GetPlayerSoundSampleField_notFound = 1;
 	return playersound_taunt;
@@ -892,9 +961,10 @@
 	LoadPlayerSounds(strcat(self.model, ".sounds"), 0);
 }
 
-void GlobalSound(string sample, float chan, float teamsay)
+void GlobalSound(string sample, float chan, float voicetype)
 {
 	float n;
+	float tauntrand;
 
 	if(sample == "")
 		return;
@@ -905,65 +975,91 @@
 		sample = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization
 	else
 		sample = strcat(argv(0), ".wav"); // randomization
-
-	if(teamsay == 3) // only to last attacker
+	
+	switch(voicetype)
 	{
-		if(self.pusher)
-			if(self.pusher.team == self.team)
+		case VOICETYPE_LASTATTACKER_ONLY:
+			if(self.pusher)
+				if(self.pusher.team == self.team)
+				{
+					msg_entity = self.pusher;
+					if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+					{
+						if(msg_entity.cvar_cl_voice_directional == 1)
+							soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+						else
+							soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+					}
+				}
+			break;
+		case VOICETYPE_LASTATTACKER:
+			if(self.pusher)
+				if(self.pusher.team == self.team)
+				{
+					msg_entity = self.pusher;
+					if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+					{
+						if(msg_entity.cvar_cl_voice_directional == 1)
+							soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+						else
+							soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+					}
+					msg_entity = self;
+					if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+						soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+				}
+			break;
+		case VOICETYPE_TEAMRADIO:
+			FOR_EACH_REALCLIENT(msg_entity)
+				if(!teams_matter || msg_entity.team == self.team)
+				{
+					if(msg_entity.cvar_cl_voice_directional == 1)
+						soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+					else
+						soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+				}
+			break;
+		case VOICETYPE_AUTOTAUNT:
+			tauntrand = random();
+			FOR_EACH_REALCLIENT(msg_entity)
+				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));
+					else
+						soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+				}
+			break;
+		case VOICETYPE_TAUNT:
+			FOR_EACH_REALCLIENT(msg_entity)
 			{
-				msg_entity = self.pusher;
-				if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+				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));
+				else
+					soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
 			}
+		case VOICETYPE_PLAYERSOUND:
+			sound(self, chan, sample, VOL_BASE, ATTN_NORM);
+			break;
+		default:
+			backtrace("Invalid voice type!");
+			break;
 	}
-	else if(teamsay == 2) // only to last attacker and self
-	{
-		if(self.pusher)
-			if(self.pusher.team == self.team)
-			{
-				msg_entity = self.pusher;
-				if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
-				msg_entity = self;
-				if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
-			}
-	}
-	else if(teamsay == 0) // to everyone
-	{
-		// broadcast the sound, but it's directional
-		sound(self, chan, sample, VOL_BASE, ATTN_NORM);
-	}
-	else if(teamsay == 1) // to the same team
-	{
-		if(teams_matter)
-		{
-			entity e;
-			FOR_EACH_REALCLIENT(e)
-				if(!teams_matter || e.team == self.team)
-				{
-					msg_entity = e;
-					soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
-				}
-		}
-		else
-		{
-			sound(self, chan, sample, VOL_BASE, ATTN_NONE);
-		}
-	}
 }
 
-void PlayerSound(.string samplefield, float chan, float teamsay)
+void PlayerSound(.string samplefield, float chan, float voicetype)
 {
 	string sample;
 	sample = self.samplefield;
-	GlobalSound(sample, chan, teamsay);
+	GlobalSound(sample, chan, voicetype);
 }
 
-void VoiceMessage(string type)
+.float floodcontrol_voice;
+.float floodcontrol_voiceteam;
+void VoiceMessage(string type, string msg)
 {
 	var .string sample;
-	var float teamsay;
+	var float voicetype, ownteam;
 	sample = GetVoiceMessageSampleField(type);
 
 	if(GetPlayerSoundSampleField_notFound)
@@ -972,7 +1068,33 @@
 		return;
 	}
 
-	teamsay = GetVoiceMessageTeamsayType(type);
+	voicetype = GetVoiceMessageVoiceType(type);
+	ownteam = (voicetype == VOICETYPE_TEAMRADIO);
 
-	PlayerSound(sample, CHAN_VOICE, teamsay);
+	float flood;
+	float flood_spv;
+	var .float flood_field;
+
+	flood = 0;
+	if(ownteam)
+	{
+		flood_spv = cvar("g_voice_flood_spv_team");
+		flood_field = floodcontrol_voiceteam;
+	}
+	else
+	{
+		flood_spv = cvar("g_voice_flood_spv");
+		flood_field = floodcontrol_voice;
+	}
+
+	if(time >= self.flood_field)
+		self.flood_field = max(time, self.flood_field) + flood_spv;
+	else
+		flood = 1;
+
+	if (msg != "")
+		Say(self, ownteam, msg, 0);
+
+	if (!flood)
+		PlayerSound(sample, CHAN_VOICE, voicetype);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,3 +1,10 @@
+void W_Reload()
+{
+	if(self.switchweapon == self.weapon)
+	if(self.weaponentity.state == WS_READY)
+		weapon_action(self.weapon, WR_RELOAD);
+}
+
 // switch between weapons
 void W_SwitchWeapon(float imp)
 {
@@ -2,4 +9,10 @@
 	if (self.switchweapon != imp)
-	if (client_hasweapon(self, imp, TRUE, TRUE))
-		W_SwitchWeapon_Force(self, imp);
+	{
+		if (client_hasweapon(self, imp, TRUE, TRUE))
+			W_SwitchWeapon_Force(self, imp);
+	}
+	else
+	{
+		W_Reload();
+	}
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -351,6 +351,7 @@
 void CL_SpawnWeaponentity()
 {
 	self.weaponentity = spawn();
+	self.weaponentity.classname = "weaponentity";
 	self.weaponentity.solid = SOLID_NOT;
 	self.weaponentity.owner = self;
 	self.weaponentity.weaponentity = self.weaponentity;
@@ -365,6 +366,7 @@
 	self.weaponentity.scale = 0.61;
 
 	self.exteriorweaponentity = spawn();
+	self.exteriorweaponentity.classname = "exteriorweaponentity";
 	self.exteriorweaponentity.solid = SOLID_NOT;
 	self.exteriorweaponentity.exteriorweaponentity = self.exteriorweaponentity;
 	self.exteriorweaponentity.owner = self;

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -36,164 +36,27 @@
 {
 	nagger = spawn();
 	Net_LinkEntity(nagger);
-	nagger.SendFlags = 128;
 	nagger.SendEntity = Nagger_SendEntity;
 }
 void Nagger_VoteChanged()
 {
 	if(nagger)
-		nagger.SendFlags = 128;
+		nagger.SendFlags |= 128;
 }
 void Nagger_VoteCountChanged()
 {
 	if(nagger)
-		nagger.SendFlags = 1;
+		nagger.SendFlags |= 1;
 }
 void Nagger_ReadyCounted()
 {
 	if(nagger)
-		nagger.SendFlags = 1;
+		nagger.SendFlags |= 1;
 }
 
 void ReadyCount();
 string MapVote_Suggest(string m);
 
-.float floodcontrol_chat;
-.float floodcontrol_team;
-void Say(entity source, float teamsay, string msgin)
-{
-	string msgstr, colorstr, cmsgstr, namestr;
-	float flood;
-	entity head;
-
-	if(Ban_MaybeEnforceBan(source))
-		return;
-
-	if(!teamsay)
-		if(substring(msgin, 0, 1) == " ")
-			msgin = substring(msgin, 1, strlen(msgin) - 1); // work around DP say bug (say_team does not have this!)
-
-	msgin = formatmessage(msgin);
-
-	if(msgin == "")
-		return;
-
-	if(source.classname != "player")
-		colorstr = "^0"; // black for spectators
-	else if(teams_matter)
-		colorstr = Team_ColorCode(source.team);
-	else
-		teamsay = FALSE;
-
-	if(intermission_running)
-		teamsay = FALSE;
-
-	/*
-	 * using bprint solves this... me stupid
-	// how can we prevent the message from appearing in a listen server?
-	// for now, just give "say" back and only handle say_team
-	if(!teamsay)
-	{
-		clientcommand(self, strcat("say ", msgin));
-		return;
-	}
-	*/
-
-	if(cvar("g_chat_teamcolors"))
-		namestr = playername(source);
-	else
-		namestr = source.netname;
-	if(teamsay)
-	{
-		msgstr = strzone(strcat("\{1}\{13}", colorstr, "(^3", namestr, colorstr, ") ^7", msgin, "\n"));
-		cmsgstr = strcat(colorstr, "(^3", namestr, colorstr, ")\n^7", wordwrap(msgin, 50));
-	}
-	else
-		msgstr = strzone(strcat("\{1}", namestr, "^7: ", msgin, "\n"));
-
-	// FLOOD CONTROL
-	flood = 0;
-	{
-		float flood_spl;
-		float flood_burst;
-		float flood_lmax;
-		var .float flood_field;
-		float lines;
-		if(teamsay)
-		{
-			flood_spl = cvar("g_chat_flood_spl_team");
-			flood_burst = cvar("g_chat_flood_burst_team");
-			flood_lmax = cvar("g_chat_flood_lmax_team");
-			flood_field = floodcontrol_team;
-		}
-		else
-		{
-			flood_spl = cvar("g_chat_flood_spl");
-			flood_burst = cvar("g_chat_flood_burst");
-			flood_lmax = cvar("g_chat_flood_lmax");
-			flood_field = floodcontrol_chat;
-		}
-		flood_burst = max(0, flood_burst - 1);
-		// to match explanation in default.cfg, a value of 3 must allow three-line bursts and not four!
-		lines = ceil(strlennocol(msgstr) / 75);
-		if(flood_lmax && lines > flood_lmax)
-			flood = 2;
-		else if(time >= self.flood_field)
-			self.flood_field = max(time - flood_burst * flood_spl, self.flood_field) + lines * flood_spl;
-		else
-			flood = 1;
-	}
-
-	if(flood)
-	{
-		if(cvar("g_chat_flood_notify_flooder"))
-		{
-			if(flood == 1)
-				sprint(self, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(self.flood_field - time), "^3 seconds\n"));
-			else if(flood == 2)
-				sprint(self, "^3FLOOD CONTROL: ^7message too long\n");
-		}
-		else
-			sprint(self, msgstr);
-		print("NOTE: ", playername(self), "^7 is flooding.\n");
-	}
-	else if(teamsay)
-	{
-		if(source.classname == "player")
-		{
-			FOR_EACH_REALPLAYER(head)
-			{
-				if(head.team == source.team)
-				{
-					sprint(head, msgstr);
-					centerprint(head, cmsgstr);
-				}
-			}
-		}
-		else
-		{
-			FOR_EACH_REALCLIENT(head) if(head.classname != "player")
-			{
-				sprint(head, msgstr);
-				centerprint(head, cmsgstr);
-			}
-		}
-	}
-	else
-	{
-		// TODO invent a cvar name for allowing global chat by spectators during warmup anyway
-		if(cvar("g_chat_nospectators") && source.classname != "player") {
-			FOR_EACH_REALCLIENT(head) if(head.classname != "player") {
-				sprint(head, msgstr);
-			}
-		}
-		else
-			bprint(msgstr);
-	}
-
-	strunzone(msgstr);
-}
-
 entity GetPlayer(string name)
 {
 	float num;
@@ -265,8 +128,18 @@
 			stuffcmd(self,"menu_showteamselect\n");
 		}
 	} else if(argv(0) == "reportcvar") { // old system
+		if(substring(argv(2), 0, 1) == "$") // undefined cvar: use the default value on the server then
+		{
+			s = strcat(substring(s, argv_start_index(0), argv_end_index(1)), " \"", cvar_defstring(argv(1)), "\"");
+			tokens = tokenize_sane(s);
+		}
 		GetCvars(1);
 	} else if(argv(0) == "sentcvar") { // new system
+		if(tokens == 2) // undefined cvar: use the default value on the server then
+		{
+			s = strcat(substring(s, argv_start_index(0), argv_end_index(1)), " \"", cvar_defstring(argv(1)), "\"");
+			tokens = tokenize_sane(s);
+		}
 		GetCvars(1);
 	} else if(argv(0) == "spectate") {
 		if not(self.flags & FL_CLIENT)
@@ -351,14 +224,17 @@
 	} else if(argv(0) == "records") {
 		sprint(self, records_reply);
 	} else if(argv(0) == "voice") {
-		VoiceMessage(argv(1));
+		if(tokens >= 3)
+			VoiceMessage(argv(1), substring(s, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
+		else
+			VoiceMessage(argv(1), "");
 	} else if(argv(0) == "say") {
 		if(tokens >= 2)
-			Say(self, FALSE, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
+			Say(self, FALSE, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1);
 		//clientcommand(self, formatmessage(s));
 	} else if(argv(0) == "say_team") {
 		if(tokens >= 2)
-			Say(self, TRUE, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
+			Say(self, TRUE, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1);
 		//clientcommand(self, formatmessage(s));
 	} else if(argv(0) == "info") {
 		cmd = cvar_string(strcat("sv_info_", argv(1)));
@@ -368,7 +244,7 @@
 			wordwrap_sprint(cmd, 1111);
 	} else if(argv(0) == "suggestmap") {
 		sprint(self, strcat(MapVote_Suggest(argv(1)), "\n"));
-	} else if(argv(0) == "calltimeout") {
+	} else if(argv(0) == "timeout") {
 		if not(self.flags & FL_CLIENT)
 			return;
 		if(cvar("sv_timeout")) {
@@ -376,16 +252,16 @@
 				if(votecalled)
 					sprint(self, "^7Error: you can not call a timeout while a vote is active!\n");
 				else
-					evaluateTimeoutCall();
+					evaluateTimeout();
 			}
 			else
 				sprint(self, "^7Error: only players can call a timeout!\n");
 		}
-	} else if(argv(0) == "resumegame") {
+	} else if(argv(0) == "timein") {
 		if not(self.flags & FL_CLIENT)
 			return;
 		if(cvar("sv_timeout")) {
-			evaluateResumeGame();
+			evaluateTimein();
 		}
 	} else if(argv(0) == "teamstatus") {
 		Score_NicePrint(self);
@@ -517,7 +393,7 @@
 
 	//reset map immediately if this cvar is not set
 	if (!cvar("sv_ready_restart_after_countdown"))
-		reset_map();
+		reset_map(TRUE);
 	
 	if(cvar("sv_eventlog"))
 		GameLogEcho(":restart");
@@ -583,7 +459,7 @@
 		if(self.spawnflags & 1)
 		{
 			restart_mapalreadyrestarted = 1;
-			reset_map();
+			reset_map(TRUE);
 		}
 
 		FOR_EACH_REALCLIENT(plr) {
@@ -622,7 +498,7 @@
  *
  * This function is called when a player issues the calltimeout command.
  */
-void evaluateTimeoutCall() {
+void evaluateTimeout() {
 	if (inWarmupStage && !g_warmup_allow_timeout)
 		return sprint(self, "^7Error: You can not call a timeout in warmup-stage!\n");
 	if (time < game_starttime )
@@ -670,7 +546,7 @@
  *
  * This function is called when a player issues the resumegame command.
  */
-void evaluateResumeGame() {
+void evaluateTimein() {
 	if (!timeoutStatus)
 		return sprint(self, "^7Error: There is no active timeout which could be aborted!\n");
 	if (self != timeoutInitiator)

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,5 +1,5 @@
-string CVAR_CHECK_DEFAULT = "3a4552d8adffd3ad69fec3f0c15c62d8";
-string CVAR_CHECK_WEAPONS = "0ce586134eb7097440e850031829efe6";
+string CVAR_CHECK_DEFAULT = "a53e77007f17570086417cc970eacf6e";
+string CVAR_CHECK_WEAPONS = "2a35f7139825257d468d22354209cf54";
 float	FALSE					= 0;
 float	TRUE					= 1;
 
@@ -19,6 +19,7 @@
 float	FL_POWERUP				= 16384;
 float	FL_PROJECTILE				= 32768;
 float	FL_TOSSED				= 65536;
+float   FL_NO_WEAPON_STAY       = 131072;
 
 float	MOVETYPE_NONE				= 0;
 float	MOVETYPE_ANGLENOCLIP			= 1;
@@ -107,45 +108,6 @@
 float	TE_LAVASPLASH				= 10;
 float	TE_TELEPORT				= 11;
 
-// this assignment must match menu/nexuiz/dialog_settings_misc.c!
-float	CHAN_AUTO				= 0;
-	// on world: announcers, ...                     INFO
-	// on players: item pickup                       ITEMS
-	// on entities: UNUSED
-float	CHAN_WEAPON				= 1; // Weapon fire
-	// on world: UNUSED
-	// on players: weapon firing                     WEAPONS
-	// on entities: turret firing                    WEAPONS
-float	CHAN_VOICE				= 2; // Voice/Radio
-	// on world: UNUSED
-	// on players: voice                             VOICE
-	// on entities: ambient                          AMBIENT
-float	CHAN_TRIGGER			= 3; // Triggers/Items
-	// on world: UNUSED
-	// on players: item pickup                       ITEMS
-	// on entities: platforms moving etc.            ITEMS
-float	CHAN_PROJECTILE			= 4; // Projectiles
-	// on world: UNUSED
-	// on players: projectiles hitting player        SHOTS
-	// on entities: projectiles                      SHOTS
-float	CHAN_WEAPON2			= 5; // Nex fire (separated as it is a very long sound)
-	// on world: UNUSED
-	// on players: weapon firing                     WEAPONS
-	// on entities: turret firing                    WEAPONS
-float	CHAN_PAIN				= 6; // Pain
-	// on world: UNUSED
-	// on players: pain                              PAIN
-	// on entities: UNUSED
-float	CHAN_PLAYER				= 7; // Player body
-	// on world: UNUSED
-	// on players: player sounds                     PLAYER
-	// on entities: player sounds                    PLAYER
-
-float	ATTN_NONE				= 0;
-float	ATTN_NORM				= 0.5;
-float	ATTN_IDLE				= 2;
-float	ATTN_STATIC				= 3;
-
 float	UPDATE_GENERAL				= 0;
 float	UPDATE_STATIC				= 1;
 float	UPDATE_BINARY				= 2;
@@ -158,48 +120,12 @@
 
 #define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE)
 
-float	MSG_BROADCAST				= 0;
-float	MSG_ONE					= 1;
-float	MSG_ALL					= 2;
-float	MSG_INIT				= 3;
-float	MSG_ENTITY				= 5;
+float	MSG_BROADCAST				= 0; // unreliable
+float	MSG_ONE					= 1; // reliable
+float	MSG_ALL					= 2; // reliable
+float	MSG_INIT				= 3; // initialization
+float	MSG_ENTITY				= 5; // csqc
 
-// Deathtypes (weapon deathtypes are the IT_* constants below)
-// NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too.
-float	DEATH_SPECIAL_START     = 10000;
-float	DEATH_FALL				= 10000;
-float	DEATH_TELEFRAG				= 10001;
-float	DEATH_DROWN				= 10002;
-float	DEATH_HURTTRIGGER			= 10003;
-float	DEATH_LAVA				= 10004;
-float	DEATH_SLIME				= 10005;
-float	DEATH_KILL				= 10006;
-float	DEATH_NOAMMO				= 10007;
-float	DEATH_SWAMP				= 10008;
-float	DEATH_TEAMCHANGE			= 10009;
-float	DEATH_AUTOTEAMCHANGE			= 10010;
-float	DEATH_CAMP				= 10011;
-float	DEATH_SHOOTING_STAR			= 10012;
-float	DEATH_ROT				= 10013;
-float	DEATH_MIRRORDAMAGE		= 10014;
-float	DEATH_TOUCHEXPLODE      = 10015;
-float   DEATH_TURRET            = 10100;
-
-float	DEATH_WEAPONMASK        = 0xFF;
-float	DEATH_HITTYPEMASK		= 0x1F00; // which is WAY below 10000 used for normal deaths
-float	HITTYPE_SECONDARY = 0x100;
-float	HITTYPE_SPLASH = 0x200;
-float	HITTYPE_BOUNCE = 0x400;
-float	HITTYPE_HEADSHOT = 0x800;
-float	HITTYPE_RESERVED = 0x1000; // unused yet
-
-// macros to access these
-#define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
-#define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
-#define DEATH_ISWEAPON(t,w)           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
-#define DEATH_WEAPONOF(t)             (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
-#define WEP_VALID(w)                  ((w) >= WEP_FIRST && (w) <= WEP_LAST)
-
 vector	PL_VIEW_OFS				= '0 0 35';
 vector	PL_MIN					= '-16 -16 -24';
 vector	PL_MAX					= '16 16 45';

Copied: branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qc (from rev 5656, trunk/data/qcsrc/server/csqcprojectile.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,56 @@
+.float csqcprojectile_type;
+
+float CSQCProjectile_SendEntity(entity to, float sf)
+{
+	sf = sf & 0x3F;
+
+	if(self.csqcprojectile_clientanimate)
+		sf |= 0x80; // client animated, not interpolated
+
+	WriteByte(MSG_ENTITY, ENT_CLIENT_PROJECTILE);
+	WriteByte(MSG_ENTITY, sf);
+
+	if(sf & 1)
+	{
+		WriteCoord(MSG_ENTITY, self.origin_x);
+		WriteCoord(MSG_ENTITY, self.origin_y);
+		WriteCoord(MSG_ENTITY, self.origin_z);
+
+		if(sf & 0x80)
+		{
+			WriteCoord(MSG_ENTITY, self.velocity_x);
+			WriteCoord(MSG_ENTITY, self.velocity_y);
+			WriteCoord(MSG_ENTITY, self.velocity_z);
+			WriteCoord(MSG_ENTITY, self.gravity);
+		}
+	}
+
+	if(sf & 2)
+		WriteByte(MSG_ENTITY, self.csqcprojectile_type); // TODO maybe put this into sf?
+
+	return 1;
+}
+
+void CSQCProjectile(entity e, float clientanimate, float type)
+{
+	e.SendEntity = CSQCProjectile_SendEntity;
+	
+	e.csqcprojectile_clientanimate = clientanimate;
+	
+	if(e.movetype == MOVETYPE_TOSS || e.movetype == MOVETYPE_BOUNCE)
+	{
+		if(e.gravity == 0)
+			e.gravity = 1;
+	}
+	else
+		e.gravity = 0;
+
+	e.csqcprojectile_type = type;
+	e.SendFlags = 0xFFFFFF;
+}
+
+void UpdateCSQCProjectile(entity e)
+{
+	if(e.SendEntity == CSQCProjectile_SendEntity)
+		e.SendFlags |= 1; // send new origin data
+}

Copied: branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qh (from rev 5656, trunk/data/qcsrc/server/csqcprojectile.qh)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qh	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/csqcprojectile.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,4 @@
+.float csqcprojectile_clientanimate;
+
+void CSQCProjectile(entity e, float clientanimate, float type);
+void UpdateCSQCProjectile(entity e);

Modified: branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -115,7 +115,6 @@
 	setmodel(e, "models/onslaught/generator_shield.md3");
 	e.scale = 0.5;
 	setsize(e, e.scale * e.mins, e.scale * e.maxs);
-	print(etos(e), "\n");
 }
 
 float ctf_score_value(string parameter)
@@ -640,9 +639,13 @@
 	spawnfunc_info_player_deathmatch();
 };
 
+void item_flag_reset()
+{
+	DropFlag(self, world, world);
+	ReturnFlag(self);
+}
 
 
-
 /*QUAKED spawnfunc_item_flag_team1 (0 0.5 0.8) (-48 -48 -37) (48 48 37)
 CTF flag for team one (Red).
 Multiple are allowed.
@@ -738,6 +741,8 @@
 	WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '1 0 0');
 
 	precache_model("models/onslaught/generator_shield.md3");
+
+	self.reset = item_flag_reset;
 };
 
 /*QUAKED spawnfunc_item_flag_team2 (0 0.5 0.8) (-48 -48 -24) (48 48 64)
@@ -834,6 +839,8 @@
 	WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '0 0 1');
 
 	precache_model("models/onslaught/generator_shield.md3");
+
+	self.reset = item_flag_reset;
 };
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -12,8 +12,6 @@
 #define BUTTON_CHAT   buttonchat
 #define BUTTON_USE    buttonuse
 
-#define VOL_BASE 0.7
-
 // Globals
 
 string records_reply, lsmaps_reply, maplist_reply; // cached replies
@@ -85,6 +83,8 @@
 .vector	pos1, pos2;
 .vector	mangle;
 
+.float cvar_cl_hitsound;
+
 .float	pain_finished;			//Added by Supajoe
 .float	pain_frame;			//"
 .float	statdraintime;			// record the one-second intervals between draining health and armour when they're over 100
@@ -220,6 +220,7 @@
 float WR_PRECACHE	    = 6; // precaches models/sounds used by this weapon
 float WR_SUICIDEMESSAGE = 7; // sets w_deathtypestring or leaves it alone (and may inspect w_deathtype for details)
 float WR_KILLMESSAGE    = 8; // sets w_deathtypestring or leaves it alone
+float WR_RELOAD         = 9; // does not need to do anything
 
 void weapon_defaultspawnfunc(float wpn);
 
@@ -282,8 +283,8 @@
 .vector lastV_angle; //used when pausing the game in order to force the player to keep his old view angle fixed
 entity timeoutHandler; //responsible for centerprinting the timeout countdowns and playing sounds
 void timeoutHandler_Think();
-void evaluateTimeoutCall();
-void evaluateResumeGame();
+void evaluateTimeout();
+void evaluateTimein();
 string getTimeoutText(float addOneSecond);
 
 .float spawnshieldtime;
@@ -304,15 +305,12 @@
 .vector death_origin;
 .vector killer_origin;
 
-.float isdecor;
-
 float default_player_alpha;
 float default_weapon_alpha;
 
 .float() customizeentityforclient;
 .float cvar_cl_handicap;
 .float cvar_cl_playerdetailreduction;
-.float cvar_cl_nogibs;
 .float cvar_scr_centertime;
 .float cvar_cl_shownames;
 .string cvar_g_nexuizversion;
@@ -449,7 +447,7 @@
 		_VOICEMSG(attacking) \
 		_VOICEMSG(defending) \
 		_VOICEMSG(roaming) \
-		_VOICEMSG(positive) \
+		_VOICEMSG(affirmative) \
 		_VOICEMSG(negative) \
 		_VOICEMSG(onmyway) \
 		_VOICEMSG(seenenemy) \
@@ -464,19 +462,33 @@
 string globalsound_metalfall;
 string globalsound_step;
 string globalsound_metalstep;
+
+#define VOICETYPE_PLAYERSOUND 10
+#define VOICETYPE_TEAMRADIO 11
+#define VOICETYPE_LASTATTACKER 12
+#define VOICETYPE_LASTATTACKER_ONLY 13
+#define VOICETYPE_AUTOTAUNT 14
+#define VOICETYPE_TAUNT 15
+
 void PrecachePlayerSounds(string f);
 void PrecacheGlobalSound(string samplestring);
 void UpdatePlayerSounds();
 void ClearPlayerSounds();
-void PlayerSound(.string samplefield, float channel, float teamsay); // 0 is normal, 1 is team, 2 is last attacker
-void GlobalSound(string samplestring, float channel, float teamsay); // 0 is normal, 1 is team, 2 is last attacker
-void VoiceMessage(string type);
+void PlayerSound(.string samplefield, float channel, float voicetype);
+void GlobalSound(string samplestring, float channel, float voicetype);
+void VoiceMessage(string type, string message);
 
+// autotaunt system
+.float cvar_cl_autotaunt;
+.float cvar_cl_voice_directional;
+.float cvar_cl_voice_directional_taunt_attenuation;
+
 .float version_mismatch;
 
 float independent_players;
 #define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
-#define MAKE_INDEPENDENT_PLAYER(e) ((e).solid = SOLID_TRIGGER)
+#define MAKE_INDEPENDENT_PLAYER(e) (((e).solid = SOLID_TRIGGER) + ((e).frags = FRAGS_PLAYER_NONSOLID))
+// we're using + here instead of , because fteqcc sucks
 
 string clientstuff;
 .float stat_sys_ticrate;
@@ -511,3 +523,9 @@
 .string target3;
 .string target4;
 .float trigger_reverse;
+
+void SUB_DontUseTargets();
+void SUB_UseTargets();
+
+.void() reset; // if set, an entity is reset using this
+.void() reset2; // if set, an entity is reset using this (after calling ALL the reset functions for other entities)

Modified: branches/nexuiz-2.0/data/qcsrc/server/domination.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -490,6 +490,7 @@
 	}
 	self.think = dom_controlpoint_setup;
 	self.nextthink = time + 0.1;
+	self.reset = dom_controlpoint_setup;
 
 	if(!self.scale)
 		self.scale = 0.6;

Modified: branches/nexuiz-2.0/data/qcsrc/server/extensions.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -559,6 +559,14 @@
 //description:
 //returns the default value of a cvar, as a tempstring.
 
+//DP_QC_CVAR_DESCRIPTION
+//idea: div0
+//DarkPlaces implementation: div0
+//builtin definitions:
+string(string name) cvar_description = #518;
+//description:
+//returns the description of a cvar
+
 //DP_QC_CVAR_STRING
 //idea: VorteX
 //DarkPlaces implementation: VorteX, LordHavoc
@@ -567,6 +575,18 @@
 //description:
 //returns the value of a cvar, as a tempstring.
 
+//DP_QC_CVAR_TYPE
+//idea: div0
+//DarkPlaces implementation: div0
+//builtin definitions:
+float(string name) cvar_type = #495;
+float CVAR_TYPEFLAG_EXISTS = 1;
+float CVAR_TYPEFLAG_SAVED = 2;
+float CVAR_TYPEFLAG_PRIVATE = 4;
+float CVAR_TYPEFLAG_ENGINE = 8;
+float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
+float CVAR_TYPEFLAG_READONLY = 32;
+
 //DP_QC_EDICT_NUM
 //idea: 515
 //DarkPlaces implementation: LordHavoc
@@ -1174,6 +1194,18 @@
 // You may as such dictate the behavior as to what happens to the entity.
 // To mimic the engine's default behavior, simply call remove(self).
 
+//DP_SV_ONENTITYPREPOSTSPAWNFUNCTION
+//idea: div0
+//darkplaces implementation: div0
+//engine-called QC prototypes:
+//void() SV_OnEntityPreSpawnFunction;
+//void() SV_OnEntityPostSpawnFunction;
+//description:
+// These functions are called BEFORE or AFTER an entity is spawned the regular way.
+// You may as such dictate the behavior as to what happens to the entity.
+// SV_OnEntityPreSpawnFunction is called before even looking for the spawn function, so you can even change its classname in there. If it remove()s the entity, the spawn function will not be looked for.
+// SV_OnEntityPostSpawnFunction is called ONLY after its spawn function or SV_OnEntityNoSpawnFunction was called, and skipped if the entity got removed by either.
+
 //DP_SV_MODELFLAGS_AS_EFFECTS
 //idea: LordHavoc, Dresk
 //darkplaces implementation: LordHavoc
@@ -1274,10 +1306,15 @@
 //DP_SV_QCSTATUS
 //idea: div0
 //darkplaces implementation: div0
-//Fields whose contents are used instead of frags, or set as "qcstatus" field
-//in the getstatus/getinfo response.
+//1. A global variable
 string worldstatus;
+//Its content is set as "qcstatus" field in the rules.
+//It may be at most 255 characters, and must not contain newlines or backslashes.
+//2. A per-client field
 .string clientstatus;
+//It is sent instead of the "frags" in status responses.
+//It should always be set in a way so that stof(player.clientstatus) is a meaningful score value. Other info may be appended. If used this way, the cvar sv_status_use_qcstatus may be set to 1, and then this value will replace the frags in "status".
+//Currently, qstat does not support this and will not show player info if used and set to anything other than ftos(some integer).
 
 //DP_SV_ROTATINGBMODEL
 //idea: id Software
@@ -1777,6 +1814,13 @@
 float(float bufhandle, string str, float order) bufstr_add = #468;
 void(float bufhandle, float string_index) bufstr_free = #469;
 
+//DP_QC_STRINGBUFFERS_CVARLIST
+//idea: div0
+//darkplaces implementation: div0
+//functions to list cvars and store their names into a stringbuffer
+//cvars that start with pattern but not with antipattern will be stored into the buffer
+void(float bufhandle, string pattern, string antipattern) buf_cvarlist = #517;
+
 //DP_QC_STRREPLACE
 //idea: Sajt
 //darkplaces implementation: Sajt

Modified: branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -159,6 +159,7 @@
 
 void func_breakable_reset()
 {
+	self.team = self.team_saved;
 	func_breakable_look_restore();
 	if(self.spawnflags & 1)
 		func_breakable_behave_destroyed();
@@ -203,5 +204,8 @@
 	if(self.noise)
 		precache_sound(self.noise);
 
+	self.team_saved = self.team;
+
+	self.reset = func_breakable_reset;
 	func_breakable_reset();
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,107 +1,33 @@
-void casingtouch()
+float Casing_SendEntity(entity to, float sf)
 {
-	PROJECTILE_TOUCH;
+	WriteByte(MSG_ENTITY, ENT_CLIENT_CASING);
+	WriteByte(MSG_ENTITY, self.state); // actually type
+	WriteCoord(MSG_ENTITY, self.origin_x);
+	WriteCoord(MSG_ENTITY, self.origin_y);
+	WriteCoord(MSG_ENTITY, self.origin_z);
+	WriteShort(MSG_ENTITY, self.oldorigin_x); // acrually compressed velocity
+	WriteByte(MSG_ENTITY, self.angles_x * 256 / 360);
+	WriteByte(MSG_ENTITY, self.angles_y * 256 / 360);
+	WriteByte(MSG_ENTITY, self.angles_z * 256 / 360);
+	return TRUE;
+}
 
-	if (other.solid == SOLID_BSP)
-	if (vlen(self.velocity) >= 50)
-	if (time >= self.attack_finished_single)
-	{
-		string s;
-		float f;
-
-		f = floor(random() * 3) + 1;
-		if(self.state == 1)
-			s = strcat("weapons/casings", ftos(f), ".wav");
-		else if(self.state == 2)
-			s = strcat("weapons/steel", ftos(f), ".wav");
-		else
-			s = strcat("weapons/brass", ftos(f), ".wav");
-		sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
-	}
-	self.attack_finished_single = time + 0.2;
-	//self.touch = SUB_Null; // one tink is enough
-	//self.dest = self.origin - self.groundentity.origin;
-};
-
-void casingthink()
-{
-	local   float   p;
-	self.nextthink = time + 0.1;
-	if (self.flags & FL_ONGROUND)
-	{
-	// just keep the yaw angle
-		self.angles_x = 0;
-		self.angles_z = 0;
-		self.flags = self.flags - FL_ONGROUND;
-		self.nextthink = time + 0.5;
-	}
-	p = pointcontents(self.origin);
-	if (p == CONTENT_SOLID || p == CONTENT_LAVA || p == CONTENT_SKY)
-	{
-		removedecor(self);
-		return;
-	}
-	if (time > self.cnt)
-	{
-		self.nextthink = time;
-		self.alpha = self.alpha - frametime;
-		if (self.alpha < 0.0625)
-			removedecor(self);
-	}
-};
-
-// knock loose the casing when disturbed
-void casingknockedloosefunc()
-{
-	self.movetype = MOVETYPE_BOUNCE;
-	self.flags = self.flags - (self.flags & FL_ONGROUND);
-	self.avelocity = randomvec() * 300;
-	self.nextthink = time + 0.1;
-	self.touch = casingtouch;
-};
-
 void SpawnCasing(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype)
 {
-	local entity e;
-	if (cvar("temp1") & 2048)
-		return;
+	entity e;
 
-	e = newdecor();
-	e.isdecor = TRUE;
-	e.alpha = 1;
+	e = spawn();
 	e.state = casingtype;
-	//e.forcescale = 15;
-	e.movetype = MOVETYPE_BOUNCE;
-	e.solid = SOLID_TRIGGER;
-	e.velocity = vel + randomvec() * randomvel;
+	e.origin = org;
+	e.velocity = vel;
 	e.angles = ang;
-	e.avelocity = avel + randomvec() * randomavel;
-	e.nextthink = time;
-	e.think = casingthink;
-	e.touch = casingtouch;
-	//e.knockedloosefunc = casingknockedloosefunc;
-	e.effects = EF_LOWPRECISION;
-	e.createdtime = time;
-	if (casingtype == 1)
-	{
-		setmodel (e, "models/casing_shell.mdl"); // precision set above
-		e.cnt = time + 30;
-		// bias to make these be considered more important than other things
-		e.createdtime = time + 1;
-	}
-	else if (casingtype == 2)
-	{
-		// FIXME: this is not used and not precached, uncomment if you need it
-		//setmodel (e, "models/casing_steel.mdl"); // precision set above
-		e.cnt = time + 10;
-	}
-	else
-	{
-		setmodel (e, "models/casing_bronze.mdl"); // precision set above
-		e.cnt = time + 10;
-	}
-	if (maxclients == 1)
-		e.cnt = time + 3000;
-	setsize (e, '0 0 -1', '0 0 -1');
-	setorigin (e, org);
-};
+
+	e.oldorigin_x = compressShortVector(e.velocity);
+
+	setmodel(e, "null");
+	e.SendEntity = Casing_SendEntity;
+
+	e.nextthink = time + 0.2;
+	e.think = SUB_Remove;
+		// 0.2s should be enough time for all clients to receive this ent once, do the gibbage and be done with it
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,3 +1,50 @@
+.float dmg;
+.float dmg_edge;
+.float dmg_force;
+.float dmg_radius;
+
+float Damage_DamageInfo_SendEntity(entity to, float sf)
+{
+	WriteByte(MSG_ENTITY, ENT_CLIENT_DAMAGEINFO);
+	WriteShort(MSG_ENTITY, self.projectiledeathtype);
+	WriteCoord(MSG_ENTITY, floor(self.origin_x));
+	WriteCoord(MSG_ENTITY, floor(self.origin_y));
+	WriteCoord(MSG_ENTITY, floor(self.origin_z));
+	WriteByte(MSG_ENTITY, bound(1, self.dmg, 255));
+	WriteByte(MSG_ENTITY, bound(0, self.dmg_radius, 255));
+	WriteByte(MSG_ENTITY, bound(1, self.dmg_edge, 255));
+	WriteShort(MSG_ENTITY, self.oldorigin_x);
+	return TRUE;
+}
+
+void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, float deathtype)
+{
+	// TODO maybe call this from non-edgedamage too?
+	// TODO maybe make the client do the particle effects for the weapons and the impact sounds using this info?
+
+	entity e;
+
+	e = spawn();
+	e.classname = "damageinfo";
+	setorigin(e, org);
+	setmodel(e, "null");
+	e.think = SUB_Remove;
+	e.nextthink = time + 0.2;
+	e.projectiledeathtype = deathtype;
+	e.dmg = coredamage;
+	e.dmg_edge = edgedamage;
+	e.dmg_radius = rad;
+	e.dmg_force = vlen(force);
+	e.velocity = force;
+	e.effects = EF_NODEPTHTEST; // needs to be, sorry
+
+	e.oldorigin_x = compressShortVector(e.velocity);
+
+	e.SendEntity = Damage_DamageInfo_SendEntity;
+}
+
+#define DAMAGE_CENTERPRINT_SPACER NEWLINES
+
 float checkrules_firstblood;
 
 float yoda;
@@ -11,6 +58,7 @@
 .float teamkill_soundtime;
 .entity teamkill_soundsource;
 .entity pusher;
+.float taunt_soundtime;
 
 
 float IsDifferentTeam(entity a, entity b)
@@ -172,35 +220,35 @@
 		if (targ == attacker)
 		{
 			if (deathtype == DEATH_TEAMCHANGE) {
-				centerprint(targ, strcat("You are now on: ", ColoredTeamName(targ.team)));
+				centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "You are now on: ", ColoredTeamName(targ.team)));
 			} else if (deathtype == DEATH_AUTOTEAMCHANGE) {
-				centerprint(targ, strcat("You have been moved into a different team to improve team balance\nYou are now on: ", ColoredTeamName(targ.team)));
+				centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "You have been moved into a different team to improve team balance\nYou are now on: ", ColoredTeamName(targ.team)));
 				return;
 			} else if (deathtype == DEATH_CAMP) {
 				if(sv_gentle)
-					centerprint(targ, "^1Reconsider your tactics, camper!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Reconsider your tactics, camper!"));
 				else
-					centerprint(targ, "^1Die camper!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Die camper!"));
 			} else if (deathtype == DEATH_NOAMMO) {
 				if(sv_gentle)
-					centerprint(targ, "^1You are reinserted into the game for running out of ammo...\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You are reinserted into the game for running out of ammo..."));
 				else
-					centerprint(targ, "^1You were killed for running out of ammo...\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were killed for running out of ammo..."));
 			} else if (deathtype == DEATH_ROT) {
 				if(sv_gentle)
-					centerprint(targ, "^1You need to preserve your health\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to preserve your health"));
 				else
-					centerprint(targ, "^1You grew too old without taking your medicine\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You grew too old without taking your medicine"));
 			} else if (deathtype == DEATH_MIRRORDAMAGE) {
 				if(sv_gentle)
-					centerprint(targ, "^1Don't go against team mates!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't go against team mates!"));
 				else
-					centerprint(targ, "^1Don't shoot your team mates!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't shoot your team mates!"));
 			} else {
 				if(sv_gentle)
-					centerprint(targ, "^1You need to be more careful!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to be more careful!"));
 				else
-					centerprint(targ, "^1You killed your own dumb self!\n\n\n");
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You killed your own dumb self!"));
 			}
 
 			if(sv_gentle) {
@@ -217,7 +265,7 @@
 					GiveFrags(attacker, targ, -1);
 				}
 				if (targ.killcount > 2)
-					bprint ("^1",s,"^1 ended it all with a ",ftos(targ.killcount)," scoring spree\n");
+					bprint ("^1",s,"^1 faded after a ",ftos(targ.killcount)," point spree\n");
 			} else {
 				w = DEATH_WEAPONOF(deathtype);
 				if(WEP_VALID(w))
@@ -225,16 +273,14 @@
 					w_deathtypestring = "couldn't resist the urge to self-destruct";
 					w_deathtype = deathtype;
 					weapon_action(w, WR_SUICIDEMESSAGE);
-					bprint("^1", s, "^1 ", w_deathtypestring, "\n");
+ 					bprint("^1", s, "^1 ", w_deathtypestring, "\n");
 				}
 				else if (deathtype == DEATH_KILL)
 					bprint ("^1",s, "^1 couldn't take it anymore\n");
 				else if (deathtype == DEATH_ROT)
 					bprint ("^1",s, "^1 died\n");
 				else if (deathtype == DEATH_NOAMMO)
-				{
-					bprint ("^7",s, " ^7committed suicide. What's the point of living without ammo?\n");
-				}
+					bprint ("^7",s, "^7 committed suicide. What's the point of living without ammo?\n");
 				else if (deathtype == DEATH_CAMP)
 					bprint ("^1",s, "^1 thought he found a nice camping ground\n");
 				else if (deathtype == DEATH_MIRRORDAMAGE)
@@ -248,7 +294,7 @@
 					GiveFrags(attacker, targ, -1);
 				}
 				if (targ.killcount > 2)
-					bprint ("^1",s,"^1 ended it all with a ",ftos(targ.killcount)," kill spree\n");
+					bprint ("^1",s,"^1 ended it all after a ",ftos(targ.killcount)," kill spree\n");
 			}
 		}
 		else if (attacker.classname == "player" || attacker.classname == "gib")
@@ -256,24 +302,24 @@
 			if(teamplay && attacker.team == targ.team)
 			{
 				if(sv_gentle) {
-					centerprint(attacker, "^1Moron! You went against a teammate!\n\n\n");
-					bprint ("^1", a, "^1 took action against a teammate\n");
+					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You went against a team mate!"));
+					bprint ("^1", a, "^1 took action against a team mate\n");
 				} else {
-					centerprint(attacker, "^1Moron! You fragged a teammate!\n\n\n");
-					bprint ("^1", a, "^1 mows down a teammate\n");
+					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You fragged ", s, ", a team mate!"));
+					bprint ("^1", a, "^1 mows down a team mate\n");
 				}
 				GiveFrags(attacker, targ, -1);
 				if (targ.killcount > 2) {
 					if(sv_gentle)
-						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," scoring spree was ended by a teammate!\n");
+						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," scoring spree was ended by a team mate!\n");
 					else
-						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," kill spree was ended by a teammate!\n");
+						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," kill spree was ended by a team mate!\n");
 				}
 				if (attacker.killcount > 2) {
 					if(sv_gentle)
-						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," scoring spree by going against a teammate\n");
+						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," scoring spree by going against a team mate\n");
 					else
-						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," kill spree by killing a teammate\n");
+						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," kill spree by killing a team mate\n");
 				}
 				attacker.killcount = 0;
 
@@ -281,21 +327,31 @@
 			}
 			else
 			{
+				string blood_message, victim_message;
 				if (!checkrules_firstblood)
 				{
 					checkrules_firstblood = TRUE;
 					if(sv_gentle)
+					{
 						bprint("^1",a, "^1 was the first to score", "\n");
+						blood_message = "^1First point\n";
+						//victim_message = "^1First victim\n";  // or First casualty
+					}
 					else
+					{
 						bprint("^1",a, "^1 drew first blood", "\n");
+						blood_message = "^1First blood\n";
+						victim_message = "^1First victim\n";  // or First casualty
+					}
 				}
 
 				if(sv_gentle > 0) {
-					centerprint(attacker, strcat("^4You scored against ^7", s, "\n\n\n"));
-					centerprint(targ, strcat(a,"^1 scored against you ^7\n\n\n"));
+					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^4You scored against ^7", s));
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, a,"^1 scored against you ^7"));
 				} else {
-					centerprint(attacker, strcat("^4You fragged ^7", s, "\n\n\n"));
-					centerprint(targ, strcat("^1You were fragged by ^7", a, "\n\n\n"));
+					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, blood_message, "^4You fragged ^7", s));
+					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, victim_message, "^1You were fragged by ^7", a));
+					attacker.taunt_soundtime = time + 1;
 				}
 
 				if(sv_gentle) {
@@ -335,13 +391,14 @@
 						else
 							bprint("^1", s, "^1 ", substring(inflictor.message2, 0, p), a, "^1", substring(inflictor.message2, p+1, strlen(inflictor.message2) - (p+1)), "\n");
 					}
-                    else if(deathtype == DEATH_TURRET)
-                        bprint ("^1",s, "^1 was pushed into the line of fire by ^1", a, "\n");
-                    else if(deathtype == DEATH_TOUCHEXPLODE)
-                        bprint ("^1",s, "^1 was pushed into an accident by ^1", a, "\n");
+					else if(deathtype == DEATH_TURRET)
+						bprint ("^1",s, "^1 was pushed into the line of fire by ^1", a, "\n");
+					else if(deathtype == DEATH_TOUCHEXPLODE)
+						bprint ("^1",s, "^1 was pushed into an accident by ^1", a, "\n");
 					else
 						bprint ("^1",s, "^1 was fragged by ", a, "\n");
 				}
+
 				if(g_ctf && targ.flagcarried)
 				{
 					UpdateFrags(attacker, ctf_score_value("score_kill"));
@@ -350,13 +407,16 @@
 				}
 				else
 					GiveFrags(attacker, targ, 1);
+
 				if (targ.killcount > 2) {
 					if(sv_gentle)
 						bprint ("^1",s,"'s ^1", ftos(targ.killcount), " scoring spree was ended by ", a, "\n");
 					else
 						bprint ("^1",s,"'s ^1", ftos(targ.killcount), " kill spree was ended by ", a, "\n");
 				}
+
 				attacker.killcount = attacker.killcount + 1;
+
 				if (attacker.killcount > 2) {
 					if(sv_gentle)
 						bprint ("^1",a,"^1 made ",ftos(attacker.killcount)," scores in a row\n");
@@ -433,7 +493,7 @@
 		}
 		else
 		{
-			centerprint(targ, "^1Watch your step!\n\n\n");
+			centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Watch your step!"));
 			if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
 				bprint ("^1",s, "^1 ", inflictor.message, "\n");
 			else if (deathtype == DEATH_DROWN)
@@ -460,8 +520,8 @@
 					bprint ("^1",s, "^1 discovered a swamp\n");
 				else
 					bprint ("^1",s, "^1 is now conserved for centuries to come\n");
-            else if(deathtype == DEATH_TURRET)
-                    bprint ("^1",s, "^1 was mowed down by a turret \n");
+			else if(deathtype == DEATH_TURRET)
+				bprint ("^1",s, "^1 was mowed down by a turret \n");
 			else if(deathtype == DEATH_TOUCHEXPLODE)
 				bprint ("^1",s, "^1 died in an accident\n");
 			else
@@ -619,7 +679,7 @@
 			if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
 			{
 				targ.armorvalue -= 1;
-				centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue),"\n"));
+				centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(targ.armorvalue)));
 				damage = 0;
 				targ.hitsound += 1;
 			}
@@ -629,7 +689,7 @@
 				if (targ != attacker)
 				{
 					if (targ.classname == "player")
-						centerprint(attacker, "Secondary fire inflicts no damage!\n");
+						centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "Secondary fire inflicts no damage!"));
 					damage = 0;
 					mirrordamage = 0;
 					force = '0 0 0';
@@ -769,6 +829,7 @@
 	{
 		self.velocity = self.velocity + self.damageforcescale * force;
 		self.flags = self.flags - (self.flags & FL_ONGROUND);
+		UpdateCSQCProjectile(self);
 	}
 	// apply damage
 	if (damage != 0)
@@ -830,7 +891,7 @@
 				if(attacker.armorvalue > 0)
 				{
 					attacker.armorvalue = attacker.armorvalue - 1;
-					centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue),"\n"));
+					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
 					attacker.hitsound += 1;
 				}
 				mirrordamage = 0;
@@ -882,11 +943,22 @@
 		return 0;
 	}
 
+
 	RadiusDamage_running = 1;
 
 	blastorigin = (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5);
 	total_damage_to_creatures = 0;
 
+	if(deathtype != (WEP_HOOK | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once
+	{
+		force = inflictor.velocity;
+		if(vlen(force) == 0)
+			force = '0 0 -1';
+		else
+			force = normalize(force);
+		Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype);
+	}
+
 	targ = findradius (blastorigin, rad);
 	while (targ)
 	{

Deleted: branches/nexuiz-2.0/data/qcsrc/server/g_decors.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_decors.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_decors.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,215 +0,0 @@
-
-float maxclients; // set by spawnfunc_worldspawn code
-float numdecors;
-float maxdecors;
-.float createdtime;
-
-//void(vector org, entity en, vector dir, float splattype, float importance) newbloodsplat;
-//void(vector org, float bodydamage, float armordamage, vector vel, float damgtype) genericbleedfunc;
-
-// removes the oldest decors each frame to maintain a certain maximum decors
-void decorframe()
-{
-	local entity estart, e, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10;
-	local float bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt10, iterations;
-
-	// numdecors is allowed to be bogus as long as it is >= the real number of decors
-	// (but perfection is clearly preferable)
-	if (numdecors <= maxdecors)
-		return;
-
-	// recount all the decors
-	numdecors = 0;
-	estart = e = findchain(classname, "decor");
-	while(e)
-	{
-		numdecors = numdecors + 1;
-		e = e.chain;
-	}
-	if (numdecors <= maxdecors)
-		return; // nothing to do
-
-	// limit it to considering 10000 entities per frame,
-	// otherwise it can cause a runaway loop error
-	iterations = 0;
-	while (numdecors > maxdecors && iterations < 10000)
-	{
-		iterations = iterations + 1;
-		// find and remove the oldest decors (upto 10 at once)
-		b1 = b2  = b3  = b4  = b5  = b6 = b7 = b8 = b9 = b10 = world;
-		bt1 = bt2 = bt3 = bt4 = bt5 = bt6 = bt7 = bt8 = bt9 = bt10 = time + 10000;
-		if (iterations > 0)
-			estart = findchain(classname, "decor");
-		e = estart;
-		while(e)
-		{
-			iterations = iterations + 1;
-			if (e.createdtime < bt10)
-			{
-				if (e.createdtime < bt9)
-				{
-					if (e.createdtime < bt8)
-					{
-						if (e.createdtime < bt7)
-						{
-							if (e.createdtime < bt6)
-							{
-								if (e.createdtime < bt5)
-								{
-									if (e.createdtime < bt4)
-									{
-										if (e.createdtime < bt3)
-										{
-											if (e.createdtime < bt2)
-											{
-												if (e.createdtime < bt1)
-												{
-													b10=b9;bt10=bt9;
-													b9=b8;bt9=bt8;
-													b8=b7;bt8=bt7;
-													b7=b6;bt7=bt6;
-													b6=b5;bt6=bt5;
-													b5=b4;bt5=bt4;
-													b4=b3;bt4=bt3;
-													b3=b2;bt3=bt2;
-													b2=b1;bt2=bt1;
-													b1=e;bt1=e.createdtime;
-												}
-												else
-												{
-													b10=b9;bt10=bt9;
-													b9=b8;bt9=bt8;
-													b8=b7;bt8=bt7;
-													b7=b6;bt7=bt6;
-													b6=b5;bt6=bt5;
-													b5=b4;bt5=bt4;
-													b4=b3;bt4=bt3;
-													b3=b2;bt3=bt2;
-													b2=e;bt2=e.createdtime;
-												}
-											}
-											else
-											{
-												b10=b9;bt10=bt9;
-												b9=b8;bt9=bt8;
-												b8=b7;bt8=bt7;
-												b7=b6;bt7=bt6;
-												b6=b5;bt6=bt5;
-												b5=b4;bt5=bt4;
-												b4=b3;bt4=bt3;
-												b3=e;bt3=e.createdtime;
-											}
-										}
-										else
-										{
-											b10=b9;bt10=bt9;
-											b9=b8;bt9=bt8;
-											b8=b7;bt8=bt7;
-											b7=b6;bt7=bt6;
-											b6=b5;bt6=bt5;
-											b5=b4;bt5=bt4;
-											b4=e;bt4=e.createdtime;
-										}
-									}
-									else
-									{
-										b10=b9;bt10=bt9;
-										b9=b8;bt9=bt8;
-										b8=b7;bt8=bt7;
-										b7=b6;bt7=bt6;
-										b6=b5;bt6=bt5;
-										b5=e;bt5=e.createdtime;
-									}
-								}
-								else
-								{
-									b10=b9;bt10=bt9;
-									b9=b8;bt9=bt8;
-									b8=b7;bt8=bt7;
-									b7=b6;bt7=bt6;
-									b6=e;bt6=e.createdtime;
-								}
-							}
-							else
-							{
-								b10=b9;bt10=bt9;
-								b9=b8;bt9=bt8;
-								b8=b7;bt8=bt7;
-								b7=e;bt7=e.createdtime;
-							}
-						}
-						else
-						{
-							b10=b9;bt10=bt9;
-							b9=b8;bt9=bt8;
-							b8=e;bt8=e.createdtime;
-						}
-					}
-					else
-					{
-						b10=b9;bt10=bt9;
-						b9=e;bt9=e.createdtime;
-					}
-				}
-				else
-				{
-					b10=e;bt10=e.createdtime;
-				}
-			}
-			// failed all 10 slots
-			e = e.chain;
-		}
-		// remove the oldest decors
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b1);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b2);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b3);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b4);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b5);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b6);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b7);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b8);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b9);}
-		if (numdecors > maxdecors) {numdecors = numdecors - 1;remove(b10);}
-	}
-};
-
-entity newdecor()
-{
-	local entity e;
-	++numdecors;
-	e = spawn();
-	e.classname = "decor";
-	return e;
-};
-
-void removedecor(entity e)
-{
-	--numdecors;
-	remove(e);
-};
-
-
-// used for various little bouncing debris to avoid getting stuck in the air
-void DecorThink()
-{
-	self.nextthink = time;
-	self.flags = self.flags - (self.flags & FL_ONGROUND);
-	if (pointcontents(self.origin) == CONTENT_SOLID)
-		removedecor(self);
-};
-
-.float  createdtime;
-
-void InitDecors()
-{
-	// different number of decors in multi-player (to avoid lag on modems)
-	if (maxclients > 1)
-		maxdecors = 32;
-	else
-		maxdecors = 100;
-	// overridable by saved2 cvar on server console
-	if (cvar("decors"))
-		maxdecors = cvar("decors");
-	if (maxdecors < 1)
-		maxdecors = 1;
-};

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_lights.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -119,7 +119,7 @@
 	if (self.target)
 //	if (!(self.spawnflags & DFOLLOW))
 	{
-		self.movetype = MOVETYPE_PUSH;
+		self.movetype = MOVETYPE_NOCLIP;
 		if (!self.speed)
 			self.speed = 100;
 		InitializeEntity(self, dynlight_find_path, INITPRIO_FINDTARGET);

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -291,8 +291,75 @@
 	traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
 }
 
+float tracebox_inverted (vector v1, vector mi, vector ma, vector v2, float nomonsters, entity forent) // returns the number of traces done, for benchmarking
+{
+	vector pos, dir, t;
+	float nudge;
+
+	//nudge = 2 * cvar("collision_impactnudge"); // why not?
+	nudge = 0.5;
+
+	dir = normalize(v2 - v1);
+
+	pos = v1 + dir * nudge;
+
+	float c;
+	c = 0;
+
+	for(;;)
+	{
+		if((pos - v1) * dir >= (v2 - v1) * dir)
+		{
+			// went too far
+			trace_fraction = 1;
+			trace_endpos = v2;
+			return c;
+		}
+
+		tracebox(pos, mi, ma, v2, nomonsters, forent);
+		++c;
+
+		if(c == 50)
+		{
+			dprint("HOLY SHIT! When tracing from ", vtos(v1), " to ", vtos(v2), "\n");
+			dprint("  Nudging gets us nowhere at ", vtos(pos), "\n");
+			dprint("  trace_endpos is ", vtos(trace_endpos), "\n");
+			dprint("  trace distance is ", ftos(vlen(pos - trace_endpos)), "\n");
+		}
+
+		if(trace_startsolid)
+		{
+			// we started inside solid.
+			// then trace from endpos to pos
+			t = trace_endpos;
+			tracebox(t, mi, ma, pos, nomonsters, forent);
+			++c;
+			if(trace_startsolid)
+			{
+				// t is still inside solid? bad
+				// force advance, then, and retry
+				pos = t + dir * nudge;
+			}
+			else
+			{
+				// we actually LEFT solid!
+				trace_fraction = ((trace_endpos - v1) * dir) / ((v2 - v1) * dir);
+				return c;
+			}
+		}
+		else
+		{
+			// pos is outside solid?!? but why?!? never mind, just return it.
+			trace_endpos = pos;
+			trace_fraction = ((trace_endpos - v1) * dir) / ((v2 - v1) * dir);
+			return c;
+		}
+	}
+}
+
 void traceline_inverted (vector v1, vector v2, float nomonsters, entity forent)
 {
+#if 0
 	vector pos, dir, t;
 	float nudge;
 
@@ -341,6 +408,8 @@
 			return;
 		}
 	}
+#else
+	tracebox_inverted(v1, '0 0 0', '0 0 0', v2, nomonsters, forent);
 }
 
 /*
@@ -356,7 +425,7 @@
 {
 	vector	loc;
 	vector vec;
-	float c;
+	float c, h;
 
 	vec = mindist * '1 0 0';
 	c = 0;
@@ -373,9 +442,10 @@
 		}
 		if (c & 1)
 		{
-			vec_z = vec_y;
+			h = vec_y;
 			vec_y = vec_x;
 			vec_x = vec_z;
+			vec_z = h;
 		}
 		c = c + 1;
 	}
@@ -587,16 +657,22 @@
 		SetMovedir ();
 	self.solid = SOLID_BSP;
 	SetBrushEntityModel();
-	self.movetype = MOVETYPE_PUSH;
+	self.movetype = MOVETYPE_NONE; // why was this PUSH? -div0
 //	self.modelindex = 0;
 	self.model = "";
 };
 
-void InitMovingBrushTrigger()
+float InitMovingBrushTrigger()
 {
 // trigger angles are used for one-way touches.  An angle of 0 is assumed
 // to mean no restrictions, so use a yaw of 360 instead.
 	self.solid = SOLID_BSP;
 	SetBrushEntityModel();
 	self.movetype = MOVETYPE_PUSH;
+	if(self.modelindex == 0)
+	{
+		objerror("InitMovingBrushTrigger: no brushes found!");
+		return 0;
+	}
+	return 1;
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,4 +1,8 @@
+void SUB_DontUseTargets()
+{
+}
 
+
 void() SUB_UseTargets;
 
 void DelayThink()
@@ -165,9 +169,6 @@
 	{	// we can't just remove (self) here, because this is a touch function
 		// called wheil C code is looping through area links...
 		self.touch = SUB_Null;
-
-		self.nextthink = time + 0.1;
-		self.think = SUB_Remove;
 	}
 };
 
@@ -215,6 +216,16 @@
 	}
 }
 
+void multi_reset()
+{
+	self.touch = multi_touch;
+	self.health = self.max_health;
+	self.takedamage = DAMAGE_YES;
+	self.solid = SOLID_BBOX;
+	self.think = SUB_Null;
+	self.team = self.team_saved;
+}
+
 /*QUAKED spawnfunc_trigger_multiple (.5 .5 .5) ? notouch
 Variable sized repeatable trigger.  Must be targeted at one or more entities.  If "health" is set, the trigger must be killed to activate each time.
 If "delay" is set, the trigger waits some time after activating before firing.
@@ -230,6 +241,7 @@
 */
 void spawnfunc_trigger_multiple()
 {
+	self.reset = multi_reset;
 	if (self.sounds == 1)
 	{
 		precache_sound ("misc/secret.wav");
@@ -252,6 +264,8 @@
 
 	EXACTTRIGGER_INIT;
 
+	self.team_saved = self.team;
+
 	if (self.health)
 	{
 		if (self.spawnflags & SPAWNFLAG_NOTOUCH)
@@ -300,6 +314,7 @@
 void spawnfunc_trigger_relay()
 {
 	self.use = SUB_UseTargets;
+	self.reset = spawnfunc_trigger_relay; // this spawnfunc resets fully
 };
 
 void delay_use()
@@ -308,12 +323,18 @@
     self.nextthink = self.wait;
 }
 
+void delay_reset()
+{
+	self.think = SUB_Null;
+}
+
 void spawnfunc_trigger_delay()
 {
     if(!self.wait)
         self.wait = 1;
 
     self.use = delay_use;
+    self.reset = delay_reset;
 }
 
 //=============================================================================
@@ -349,6 +370,12 @@
 	multi_trigger ();
 };
 
+void counter_reset()
+{
+	self.count = self.cnt;
+	multi_reset();
+}
+
 /*QUAKED spawnfunc_trigger_counter (.5 .5 .5) ? nomessage
 Acts as an intermediary for an action that takes multiple inputs.
 
@@ -361,8 +388,10 @@
 	self.wait = -1;
 	if (!self.count)
 		self.count = 2;
+	self.cnt = self.count;
 
 	self.use = counter_use;
+	self.reset = counter_reset;
 };
 
 .float triggerhurttime;
@@ -588,6 +617,14 @@
 	self.nextthink = time;
 }
 
+void pointparticles_reset()
+{
+	if(self.spawnflags & 1)
+		self.state = 1;
+	else
+		self.state = 0;
+}
+
 void spawnfunc_func_pointparticles()
 {
 	if(self.model != "")
@@ -597,7 +634,6 @@
 
 	self.effects = EF_NODEPTHTEST;
 	self.SendEntity = pointparticles_SendEntity;
-	self.SendFlags = 7;
 	if(!self.modelindex)
 	{
 		vector misave, masave;
@@ -612,10 +648,8 @@
 	IFTARGETED
 	{
 		self.use = pointparticles_use;
-		if(self.spawnflags & 1)
-			self.state = 1;
-		else
-			self.state = 0;
+		self.reset = pointparticles_reset;
+		self.reset();
 	}
 	else
 		self.state = 1;
@@ -760,6 +794,7 @@
 
 void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float deathtype);
 
+.float modelscale;
 void misc_laser_aim()
 {
 	vector a;
@@ -874,11 +909,13 @@
 float laser_SendEntity(entity to, float fl)
 {
 	WriteByte(MSG_ENTITY, ENT_CLIENT_LASER);
-	fl = fl - (fl & 0xC0); // use that bit to indicate finite length laser
+	fl = fl - (fl & 0xE0); // use that bit to indicate finite length laser
 	if(self.spawnflags & 2)
 		fl |= 0x80;
 	if(self.alpha)
 		fl |= 0x40;
+	if(self.scale != 1 || self.modelscale != 1)
+		fl |= 0x20;
 	WriteByte(MSG_ENTITY, fl);
 	if(fl & 1)
 	{
@@ -893,6 +930,11 @@
 		WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
 		if(fl & 0x40)
 			WriteByte(MSG_ENTITY, self.alpha * 255.0);
+		if(fl & 0x20)
+		{
+			WriteByte(MSG_ENTITY, bound(0, self.scale * 16.0, 255));
+			WriteByte(MSG_ENTITY, bound(0, self.modelscale * 16.0, 255));
+		}
 		WriteShort(MSG_ENTITY, self.cnt + 1);
 	}
 	if(fl & 2)
@@ -905,8 +947,8 @@
 		}
 		else
 		{
-			WriteCoord(MSG_ENTITY, self.mangle_x);
-			WriteCoord(MSG_ENTITY, self.mangle_y);
+			WriteAngle(MSG_ENTITY, self.mangle_x);
+			WriteAngle(MSG_ENTITY, self.mangle_y);
 		}
 	}
 	if(fl & 4)
@@ -933,6 +975,14 @@
 	misc_laser_aim();
 }
 
+void laser_reset()
+{
+	if(self.spawnflags & 1)
+		self.state = 1;
+	else
+		self.state = 0;
+}
+
 void spawnfunc_misc_laser()
 {
 	if(self.mdl)
@@ -964,23 +1014,24 @@
 		self.message = "saw the light";
 	if (!self.message2)
 		self.message2 = "was pushed into a laser by";
+	if(!self.scale)
+		self.scale = 1;
+	if(!self.modelscale)
+		self.modelscale = 1;
 	self.think = misc_laser_think;
 	self.nextthink = time;
 	InitializeEntity(self, misc_laser_init, INITPRIO_FINDTARGET);
 
 	self.effects = EF_NODEPTHTEST;
 	self.SendEntity = laser_SendEntity;
-	self.SendFlags = 15;
 	setmodel(self, "null");
 	self.mangle = self.angles;
 
 	IFTARGETED
 	{
+		self.reset = laser_reset;
+		laser_reset();
 		self.use = laser_use;
-		if(self.spawnflags & 1)
-			self.state = 1;
-		else
-			self.state = 0;
 	}
 	else
 		self.state = 1;
@@ -1040,6 +1091,7 @@
     if(!pushdeltatime) return;
 
     other.velocity = other.velocity + normalize(targ.origin - self.origin) * self.strength * pushdeltatime;
+	other.flags &~= FL_ONGROUND;
 }
 
 // Directionless (accelerator/decelerator) mode
@@ -1180,7 +1232,8 @@
 {
 	if(self.spawnflags & 1)
 		self.state = 1;
-    self.use = flipflop_use;
+	self.use = flipflop_use;
+	self.reset = spawnfunc_trigger_flipflop; // perfect resetter
 }
 
 /*QUAKED spawnfunc_trigger_monoflop (.5 .5 .5) (-8 -8 -8) (8 8 8)
@@ -1212,6 +1265,12 @@
 	SUB_UseTargets();
 }
 
+void monoflop_reset()
+{
+	self.state = 0;
+	self.nextthink = 0;
+}
+
 void spawnfunc_trigger_monoflop()
 {
 	if(!self.wait)
@@ -1222,6 +1281,7 @@
 		self.use = monoflop_use;
 	self.think = monoflop_think;
 	self.state = 0;
+	self.reset = monoflop_reset;
 }
 
 void multivibrator_send()
@@ -1261,6 +1321,14 @@
 	}
 }
 
+void multivibrator_reset()
+{
+	if(!(self.spawnflags & 1))
+		self.nextthink = 0; // wait for a trigger event
+	else
+		self.nextthink = max(1, time);
+}
+
 /*QUAKED trigger_multivibrator (.5 .5 .5) (-8 -8 -8) (8 8 8) START_ON
 "Multivibrator" trigger gate... repeatedly sends trigger events. When triggered, turns on or off.
 -------- KEYS --------
@@ -1285,12 +1353,7 @@
 	self.nextthink = time;
 
 	IFTARGETED
-	{
-		if(!(self.spawnflags & 1))
-			self.nextthink = 0; // wait for a trigger event
-	}
-	else
-		self.nextthink = time;
+		multivibrator_reset();
 }
 
 
@@ -1322,7 +1385,28 @@
 
 
 
+void gamestart_use() {
+	activator = self;
+	SUB_UseTargets();
+	remove(self);
+}
 
+void spawnfunc_trigger_gamestart() {
+	self.use = gamestart_use;
+	self.reset2 = spawnfunc_trigger_gamestart;
+
+	if(self.wait)
+	{
+		self.think = self.use;
+		self.nextthink = game_starttime + self.wait;
+	}
+	else
+		InitializeEntity(self, gamestart_use, INITPRIO_FINDTARGET);
+}
+
+
+
+
 .entity voicescript; // attached voice script
 .float voicescript_index; // index of next voice, or -1 to use the randomized ones
 .float voicescript_nextthink; // time to play next voice
@@ -1409,3 +1493,71 @@
 		precache_sound(strcat(self.netname, "/", argv(i), ".wav"));
 	}
 }
+
+
+
+void trigger_relay_teamcheck_use()
+{
+	if(activator.team)
+	{
+		if(self.spawnflags & 2)
+		{
+			if(activator.team != self.team)
+				SUB_UseTargets();
+		}
+		else
+		{
+			if(activator.team == self.team)
+				SUB_UseTargets();
+		}
+	}
+	else
+	{
+		if(self.spawnflags & 1)
+			SUB_UseTargets();
+	}
+}
+
+void trigger_relay_teamcheck_reset()
+{
+	self.team = self.team_saved;
+}
+
+void spawnfunc_trigger_relay_teamcheck()
+{
+	self.team_saved = self.team;
+	self.use = trigger_relay_teamcheck_use;
+	self.reset = trigger_relay_teamcheck_reset;
+}
+
+
+
+void trigger_disablerelay_use()
+{
+	entity e;
+
+	float a, b;
+	a = b = 0;
+
+	for(e = world; (e = find(e, targetname, self.target)); )
+	{
+		if(e.use == SUB_UseTargets)
+		{
+			e.use = SUB_DontUseTargets;
+			++a;
+		}
+		else if(e.use == SUB_DontUseTargets)
+		{
+			e.use = SUB_UseTargets;
+			++b;
+		}
+	}
+
+	if(!a == !b)
+		print("Invalid use of trigger_disablerelay: ", ftos(a), " relays were on, ", ftos(b), " relays were off!\n");
+}
+
+void spawnfunc_trigger_disablerelay()
+{
+	self.use = trigger_disablerelay_use;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_violence.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,98 +1,44 @@
-void GibDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+float Violence_GibSplash_SendEntity(entity to, float sf)
 {
-	float r;
-	r = random ();
-	if (r < 0.60)
-		sound (self, CHAN_PROJECTILE, "misc/gib_splat01.wav", VOL_BASE, ATTN_NORM);
-	else if (r < 0.65)
-		sound (self, CHAN_PROJECTILE, "misc/gib_splat02.wav", VOL_BASE, ATTN_NORM);
-	else if (r < 0.70)
-		sound (self, CHAN_PROJECTILE, "misc/gib_splat03.wav", VOL_BASE, ATTN_NORM);
-	else if (r < 0.75)
-		sound (self, CHAN_PROJECTILE, "misc/gib_splat04.wav", VOL_BASE, ATTN_NORM);
-	
-	if(sv_gentle < 1)
-		pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10);
-	self.health = self.health - damage;
-	if (self.health <= -1000)
-	{
-		self.event_damage = SUB_Null;
-		SUB_VanishOrRemove (self);
-	}
+	WriteByte(MSG_ENTITY, ENT_CLIENT_GIBSPLASH);
+	WriteByte(MSG_ENTITY, self.state); // actually type
+	WriteByte(MSG_ENTITY, bound(1, self.cnt * 16, 255)); // gibbage amount multiplier
+	WriteShort(MSG_ENTITY, floor(self.origin_x / 4)); // not using a coord here, as gibs don't need this accuracy
+	WriteShort(MSG_ENTITY, floor(self.origin_y / 4)); // not using a coord here, as gibs don't need this accuracy
+	WriteShort(MSG_ENTITY, floor(self.origin_z / 4)); // not using a coord here, as gibs don't need this accuracy
+	WriteShort(MSG_ENTITY, self.oldorigin_x); // acrually compressed velocity
+	WriteShort(MSG_ENTITY, self.oldorigin_y); // acrually compressed mins
+	WriteShort(MSG_ENTITY, self.oldorigin_z); // acrually compressed maxs
+	return TRUE;
 }
 
-
-void GibTouch ()
+// TODO maybe convert this to a TE?
+void Violence_GibSplash_At(vector org, vector mi, vector ma, vector dir, float type, float amount)
 {
-	if(SUB_NoImpactCheck())
-	{
-		SUB_VanishOrRemove(self);
-		return;
-	}
-	GibDamage (other, other, 1000, 0, self.origin, '0 0 0');
-}
+	entity e;
 
+	e = spawn();
+	e.classname = "gibsplash";
+	e.cnt = amount;
+	e.state = type;
+	if(sv_gentle)
+		e.state |= 0x80; // "force gentle" bit
+	e.SendEntity = Violence_GibSplash_SendEntity;
+	e.nextthink = time + 0.2;
+	e.think = SUB_Remove;
+		// 0.2s should be enough time for all clients to receive this ent once, do the gibbage and be done with it
+	setmodel(e, "null");
+	e.effects = EF_NODEPTHTEST; // show gibs from around the corner
+	setorigin(e, org);
+	setsize(e, mi, ma);
+	e.velocity = dir;
 
-.float gibrandom;
-.float gibmodelindex;
-float Gib_customizeentityforclient()
-{
-	if(self.classname == "player") // the eye
-	{
-		if(sv_gentle > 0) {
-			self.model = "";
-			return TRUE;
-		}
-		if(self.gibrandom > other.cvar_cl_nogibs)
-			self.model = self.mdl;
-		else
-			self.model = "";
-		return TRUE;
-	}
-	else // other gibs - don't even need to send them
-		return (self.gibrandom > other.cvar_cl_nogibs);
-};
+	e.oldorigin_x = compressShortVector(e.velocity);
+	e.oldorigin_y = compressShortVector(e.mins);
+	e.oldorigin_z = compressShortVector(e.maxs);
+}
 
-// changes by LordHavoc on 03/30/04
-// TossGib now takes a gib entity so it can be used for tossing heads
-// gib.velocity now uses randomvec() instead of a bunch of manual random calls
-// merged Gib() into PlayerGib()
-void TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch)
+void Violence_GibSplash(entity source, float type, float amount)
 {
-	if (gib == world)
-	{
-		gib = spawn ();
-		gib.deadflag = DEAD_DEAD;
-	}
-
-	// don't set his classname to something else or it'll screw up a lot of stuff
-	if(gib.classname != "player")
-		gib.classname = "gib";
-	gib.iscreature = FALSE; // not a creature, because lava sounds on gibs are annoying
-	gib.movetype = MOVETYPE_BOUNCE;
-	gib.solid = SOLID_CORPSE;
-	gib.skin = 0;
-	gib.effects = 0;
-	gib.gibrandom = random(); // used for customize function to reduce gibs
-	gib.customizeentityforclient = Gib_customizeentityforclient;
-	gib.effects = EF_LOWPRECISION; // use less bandwidth
-
-	gib.mdl = mdlname;
-	setmodel (gib, mdlname); // precision set above
-	gib.gibmodelindex = gib.modelindex;
-	setsize (gib, '-8 -8 -8', '8 8 8');
-	setorigin (gib, org);
-
-	gib.health = -1;
-	gib.takedamage = DAMAGE_YES;
-	gib.damageforcescale = 3.5;
-	gib.event_damage = GibDamage;
-	if (destroyontouch == 1)
-		gib.touch = GibTouch;
-
-	gib.velocity = v + randomvec();
-	gib.avelocity = randomvec() * vlen(gib.velocity);
-	gib.oldvelocity = gib.velocity;
-
-	SUB_SetFade (gib, time + 12 + random () * 4, 1);
+	Violence_GibSplash_At(source.origin + source.view_ofs, source.mins - source.view_ofs, source.maxs - source.view_ofs, source.velocity, type, amount);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -156,24 +156,96 @@
 
 void cvar_changes_init()
 {
-	float fh;
-	string s, k, v, d;
-	float n;
+	float h;
+	string k, v, d;
+	float n, i;
 
 	if(cvar_changes)
 		strunzone(cvar_changes);
 	cvar_changes = string_null;
-	fh = fopen("cvars.txt", FILE_READ);
-	if(fh < 0)
-		return;
-	while((s = fgets(fh)))
+
+	h = buf_create();
+	buf_cvarlist(h, "", "_"); // exclude all _ cvars as they are temporary
+	n = buf_getsize(h);
+
+	for(i = 0; i < n; ++i)
 	{
-		n = tokenize_sane(s);
-		if(n < 1)
-			continue;
-		if(argv(0) == "//")
-			continue;
-		k = argv(0);
+		k = bufstr_get(h, i);
+
+#define BADPREFIX(p) if(substring(k, 0, strlen(p)) == p) continue
+#define BADCVAR(p) if(k == p) continue
+		// internal
+		BADPREFIX("csqc_");
+		BADPREFIX("cvar_check_");
+		BADCVAR("gamecfg");
+		BADCVAR("g_configversion");
+		BADCVAR("g_maplist_index");
+		BADCVAR("halflifebsp");
+
+		// client
+		BADPREFIX("cl_");
+		BADPREFIX("con_");
+		BADPREFIX("g_campaign");
+		BADPREFIX("gl_");
+		BADPREFIX("joy");
+		BADPREFIX("menu_");
+		BADPREFIX("net_slist_");
+		BADPREFIX("r_");
+		BADPREFIX("sbar_");
+		BADPREFIX("scr_");
+		BADPREFIX("userbind");
+		BADPREFIX("v_");
+		BADPREFIX("vid_");
+		BADCVAR("mod_q3bsp_lightmapmergepower");
+		BADCVAR("mod_q3bsp_nolightmaps");
+
+		// private
+		BADPREFIX("g_ban_");
+		BADPREFIX("g_chat_flood_");
+		BADPREFIX("rcon_");
+		BADPREFIX("settemp_");
+		BADPREFIX("sv_allowdownloads_");
+		BADPREFIX("sv_autodemo");
+		BADPREFIX("sv_curl_");
+		BADPREFIX("sv_eventlog");
+		BADPREFIX("sv_logscores_");
+		BADPREFIX("sv_master");
+		BADCVAR("g_banned_list");
+		BADCVAR("log_dest_udp");
+		BADCVAR("log_file");
+		BADCVAR("net_address");
+		BADCVAR("port");
+		BADCVAR("savedgamecfg");
+		BADCVAR("sv_heartbeatperoid");
+		BADCVAR("sv_vote_master_password");
+		BADCVAR("sys_colortranslation");
+		BADCVAR("sys_specialcharactertranslation");
+		BADCVAR("timestamps");
+
+		// mapinfo
+		BADCVAR("timelimit");
+		BADCVAR("fraglimit");
+		BADCVAR("g_arena");
+		BADCVAR("g_assault");
+		BADCVAR("g_ctf");
+		BADCVAR("g_dm");
+		BADCVAR("g_domination");
+		BADCVAR("g_keyhunt");
+		BADCVAR("g_keyhunt_teams");
+		BADCVAR("g_onslaught");
+		BADCVAR("g_race");
+		BADCVAR("g_runematch");
+		BADCVAR("g_tdm");
+		BADCVAR("teamplay");
+
+		// long
+		BADCVAR("hostname");
+		BADCVAR("g_maplist");
+		BADCVAR("g_maplist_mostrecent");
+		BADCVAR("sv_motd");
+#undef BADPREFIX
+#undef BADCVAR
+
 		v = cvar_string(k);
 		d = cvar_defstring(k);
 		if(v != d)
@@ -186,7 +258,7 @@
 			}
 		}
 	}
-	fclose(fh);
+	buf_del(h);
 	if(cvar_changes == "")
 		cvar_changes = "// this server runs at default settings\n";
 	else
@@ -761,7 +833,8 @@
 	{
 		bprint( "Maplist is empty!  Resetting it to default map list.\n" );
 		cvar_set("g_maplist", MapInfo_ListAllowedMaps(0, MAPINFO_FLAG_HIDDEN));
-		ShuffleMaplist();
+		if(cvar("g_maplist_shuffle"))
+			ShuffleMaplist();
 		localcmd("\nmenu_cmd sync\n");
 		Map_Count = tokenizebyseparator(cvar_string("g_maplist"), " ");
 	}
@@ -880,7 +953,8 @@
 			{
 				bprint( "Maplist contains no single playable map!  Resetting it to default map list.\n" );
 				cvar_set("g_maplist", MapInfo_ListAllowedMaps(0, MAPINFO_FLAG_HIDDEN));
-				ShuffleMaplist();
+				if(cvar("g_maplist_shuffle"))
+					ShuffleMaplist();
 				localcmd("\nmenu_cmd sync\n");
 			}
 			else
@@ -1522,6 +1596,7 @@
 		{
 			leaderfrags = WinningConditionHelper_topscore;
 
+			if (limit)
 			if (leaderfrags == limit - 1)
 				play2all("announcer/robotic/1fragleft.wav");
 			else if (leaderfrags == limit - 2)
@@ -1901,7 +1976,8 @@
 	{
 		bprint( "Maplist contains no single playable map!  Resetting it to default map list.\n" );
 		cvar_set("g_maplist", MapInfo_ListAllowedMaps(0, MAPINFO_FLAG_HIDDEN));
-		ShuffleMaplist();
+		if(cvar("g_maplist_shuffle"))
+			ShuffleMaplist();
 		localcmd("\nmenu_cmd sync\n");
 		for(i = 0; i < 100 && mapvote_count < nmax; ++i)
 			MapVote_AddVotable(GetNextMap(), FALSE);
@@ -2335,14 +2411,14 @@
 		{
 			if(self.enemy.typehitsound)
 				play2(self, "misc/typehit.wav");
-			else if(self.enemy.hitsound)
+			else if(self.enemy.hitsound && self.cvar_cl_hitsound)
 				play2(self, "misc/hit.wav");
 		}
 		else
 		{
 			if(self.typehitsound)
 				play2(self, "misc/typehit.wav");
-			else if(self.hitsound)
+			else if(self.hitsound && self.cvar_cl_hitsound)
 				play2(self, "misc/hit.wav");
 		}
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,49 +1,65 @@
 string GotoMap(string m);
 
-#if 0
-// TODO make this algorithm work (no idea why it is failing), it would be much faster
 float FullTraceFraction(vector a, vector mi, vector ma, vector b)
 {
 	vector c;
-	float d;
-	if(a_z > b_z)
-		return 0;
-	tracebox(a, mi, ma, b, MOVE_WORLDONLY, world);
-	if(trace_startsolid)
+	float white, black;
+
+	white = 0.001;
+	black = 0.001;
+
+	c = a;
+
+	float n, m;
+	n = m = 0;
+
+	while(vlen(c - b) > 1)
 	{
-		// a leaves solid, then hits trace_endpos
-		// where does a leave solid?
+		++m;
+
+		tracebox(c, mi, ma, b, MOVE_WORLDONLY, world);
+		++n;
+
+		if(!trace_startsolid)
+		{
+			black += vlen(trace_endpos - c);
+			c = trace_endpos;
+		}
+
+		n += tracebox_inverted(c, mi, ma, b, MOVE_WORLDONLY, world);
+
+		white += vlen(trace_endpos - c);
 		c = trace_endpos;
-		tracebox(c, mi, ma, a, MOVE_WORLDONLY, world);
-		// a to trace_endpos is solid
-		// trace_endpos to c is not solid
-		d = trace_endpos_z - a_z;
-		return FullTraceFraction(c + '0 0 1', mi, ma, b) + d;
 	}
-	else
-	{
-		// a hits trace_endpos
-		return FullTraceFraction(trace_endpos + '0 0 1', mi, ma, b);
-	}
+
+	if(n > 200)
+		dprint("HOLY SHIT! FullTraceFraction: ", ftos(n), " total traces, ", ftos(m), " iterations\n");
+
+	return white / (black + white);
 }
 
-float RadarMapAtPoint(float x, float y, float w, float h)
+float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize, float q)
 {
 	vector a, b, mi, ma;
+
 	mi = '0 0 0';
 	ma = '1 0 0' * w + '0 1 0' * h;
-	a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * world.mins_z;
-	b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * world.maxs_z;
-	return floor(FullTraceFraction(a, mi, ma, b) / (world.maxs_z - world.mins_z) * 255);
+	a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+	b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * (zsize + zmin);
+
+	return FullTraceFraction(a, mi, ma, b);
 }
-#else
-float RadarMapAtPoint(float x, float y, float w, float h, float zmin, float zsize)
+float RadarMapAtPoint_Block(float x, float y, float w, float h, float zmin, float zsize, float q)
 {
 	vector o, mi, ma;
 	float i, r;
 	vector dz;
+
+	q = 256 * q - 1;
+	// 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
+
 	mi = '0 0 0';
-	dz = (zsize / 256) * '0 0 1';
+	dz = (zsize / q) * '0 0 1';
 	ma = '1 0 0' * w + '0 1 0' * h + dz;
 	o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
 
@@ -57,38 +73,69 @@
 		return 0;
 	
 	r = 0;
-	for(i = 0; i < 255; ++i)
+	for(i = 0; i < q; ++i)
 	{
 		tracebox(o + dz * i, mi, ma, o + dz * i, MOVE_WORLDONLY, world);
 		if(trace_startsolid)
 			++r;
 	}
-	return r / 255.0; // 0 .. 1
+	return r / q;
 }
-#endif
+float RadarMapAtPoint_Sample(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+	vector a, b, mi, ma;
 
-string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF";
+	q *= 4; // choose q so it matches the regular algorithm in speed
 
-float RADAR_WIDTH = 512;
-float RADAR_HEIGHT = 512;
-float sharpen_buffer[RADAR_WIDTH * 3];
+	q = 256 * q - 1;
+	// 256q-1 is the ideal sample count to map equal amount of sample values to one pixel value
 
+	mi = '0 0 0';
+	ma = '1 0 0' * w + '0 1 0' * h;
+	a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+	b = '1 0 0' * w + '0 1 0' * h + '0 0 1' * zsize;
+	
+	float c, i;
+	c = 0;
+
+	for(i = 0; i < q; ++i)
+	{
+		vector v;
+		v_x = a_x + random() * b_x;
+		v_y = a_y + random() * b_y;
+		v_z = a_z + random() * b_z;
+		traceline(v, v, MOVE_WORLDONLY, world);
+		if(trace_startsolid)
+			++c;
+	}
+
+	return c / q;
+}
+
+// FF is contained twice, to map 256 to FF too
+// removes the need to bound()
+string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF";
+
+float RADAR_WIDTH_MAX = 2048;
+float RADAR_HEIGHT_MAX = 2048;
+float sharpen_buffer[RADAR_WIDTH_MAX * 3];
+
 void sharpen_set(float x, float v)
 {
-	sharpen_buffer[x + 2 * RADAR_WIDTH] = v;
+	sharpen_buffer[x + 2 * RADAR_WIDTH_MAX] = v;
 }
 
 float sharpen_getpixel(float x, float y)
 {
 	if(x < 0)
 		return 0;
-	if(x >= RADAR_WIDTH)
+	if(x >= RADAR_WIDTH_MAX)
 		return 0;
 	if(y < 0)
 		return 0;
 	if(y > 2)
 		return 0;
-	return sharpen_buffer[x + y * RADAR_WIDTH];
+	return sharpen_buffer[x + y * RADAR_WIDTH_MAX];
 }
 
 float sharpen_get(float x, float a)
@@ -109,25 +156,44 @@
 	return bound(0, sum * a, 1);
 }
 
-void sharpen_shift()
+void sharpen_shift(float w)
 {
 	float i;
-	for(i = 0; i < RADAR_WIDTH; ++i)
+	for(i = 0; i < w; ++i)
 	{
-		sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH];
-		sharpen_buffer[i + RADAR_WIDTH] = sharpen_buffer[i + 2 * RADAR_WIDTH];
-		sharpen_buffer[i + 2 * RADAR_WIDTH] = 0;
+		sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH_MAX];
+		sharpen_buffer[i + RADAR_WIDTH_MAX] = sharpen_buffer[i + 2 * RADAR_WIDTH_MAX];
+		sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
 	}
 }
 
-void sharpen_init()
+void sharpen_init(float w)
 {
 	float i;
-	for(i = 0; i < 3 * RADAR_WIDTH; ++i)
+	for(i = 0; i < w; ++i)
+	{
 		sharpen_buffer[i] = 0;
+		sharpen_buffer[i + RADAR_WIDTH_MAX] = 0;
+		sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0;
+	}
 }
 
 entity radarmapper;
+void RadarMap_Next()
+{
+	if(radarmapper.count & 4)
+	{
+		localcmd("quit\n");
+	}
+	else if(radarmapper.count & 2)
+	{
+		localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(radarmapper.count), strcat(" --res ", ftos(radarmapper.size_x), " ", ftos(radarmapper.size_y), " --sharpen ", ftos(radarmapper.ltime), " --qual ", ftos(radarmapper.size_z)), "\"\n"));
+		GotoNextMap();
+	}
+	remove(radarmapper);
+	radarmapper = world;
+}
+
 // rough map entity
 //   cnt: current line
 //   size: pixel width/height
@@ -142,8 +208,6 @@
 	{
 		// initialize
 		get_mi_min_max_texcoords(1);
-		self.size_x = RADAR_WIDTH;
-		self.size_y = RADAR_HEIGHT;
 		self.mins = mi_picmin;
 		self.maxs_x = (mi_picmax_x - mi_picmin_x) / self.size_x;
 		self.maxs_y = (mi_picmax_y - mi_picmin_y) / self.size_y;
@@ -153,23 +217,24 @@
 		if(!(self.count & 1))
 		{
 			self.cnt = fopen(self.netname, FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.tga"), FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.png"), FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_radar.jpg"), FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.tga"), FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.png"), FILE_READ);
+			if(self.cnt < 0)
+				self.cnt = fopen(strcat("gfx/", mi_shortname, "_mini.jpg"), FILE_READ);
 			if(self.cnt >= 0)
 			{
+				fclose(self.cnt);
+
 				print(self.netname, " already exists, aborting (you may want to specify --force)\n");
-				if(self.count & 4)
-				{
-					localcmd("quit\n");
-				}
-				else if(self.count & 2)
-				{
-					if(self.count & 1)
-						localcmd(strcat("defer 1 \"sv_cmd radarmap --force --loop", ftos(self.ltime), "\"\n"));
-					else
-						localcmd(strcat("defer 1 \"sv_cmd radarmap --loop ", ftos(self.ltime), "\"\n"));
-					GotoNextMap();
-				}
-				remove(self);
-				radarmapper = world;
+				RadarMap_Next();
 				return;
 			}
 		}
@@ -193,16 +258,38 @@
 		}
 		self.frame += 1;
 		self.nextthink = time;
-		sharpen_init();
+		sharpen_init(self.size_x);
 	}
 	else if(self.frame <= self.size_y)
 	{
 		// fill the sharpen buffer with this line
-		sharpen_shift();
-		for(x = 0; x < self.size_x; ++x)
+		sharpen_shift(self.size_x);
+		i = self.count & 24;
+
+		switch(i)
 		{
-			l = RadarMapAtPoint(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z);
-			sharpen_set(x, l);
+			case 0:
+			default:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
+			case 8:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Trace(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
+			case 16:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Sample(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
 		}
 
 		// do we have enough lines?
@@ -213,7 +300,7 @@
 			for(x = 0; x < self.size_x; ++x)
 			{
 				l = sharpen_get(x, self.ltime);
-				fputs(self.cnt, substring(doublehex, 2 * floor(l * 255.0 + 0.5), 2));
+				fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
 			}
 			if(self.frame == self.size_y)
 				fputs(self.cnt, "\"\n");
@@ -227,13 +314,13 @@
 		// is this the last line? then write back the missing line
 		if(self.frame == self.size_y)
 		{
-			sharpen_shift();
+			sharpen_shift(self.size_x);
 			// write a pixel line
 			fputs(self.cnt, "\"");
 			for(x = 0; x < self.size_x; ++x)
 			{
 				l = sharpen_get(x, self.ltime);
-				fputs(self.cnt, substring(doublehex, 2 * floor(l * 255.0 + 0.5), 2));
+				fputs(self.cnt, substring(doublehex, 2 * floor(l * 256.0), 2));
 			}
 			if(self.frame == self.size_y)
 				fputs(self.cnt, "\"\n");
@@ -253,20 +340,7 @@
 		fputs(self.cnt, "};\n");
 		fclose(self.cnt);
 		print("Finished. Please edit data/", self.netname, " with an image editing application and place it in the TGA format in the gfx folder.\n");
-		if(self.count & 4)
-		{
-			localcmd("quit\n");
-		}
-		else if(self.count & 2)
-		{
-			if(self.count & 1)
-				localcmd(strcat("defer 1 \"sv_cmd radarmap --force --loop", ftos(self.ltime), "\"\n"));
-			else
-				localcmd(strcat("defer 1 \"sv_cmd radarmap --loop ", ftos(self.ltime), "\"\n"));
-			GotoNextMap();
-		}
-		remove(self);
-		radarmapper = world;
+		RadarMap_Next();
 	}
 }
 
@@ -279,8 +353,11 @@
 	radarmapper.classname = "radarmapper";
 	radarmapper.think = RadarMap_Think;
 	radarmapper.nextthink = time;
-	radarmapper.count = 0;
+	radarmapper.count = 8; // default to the --trace method, as it is faster now
 	radarmapper.ltime = 1;
+	radarmapper.size_x = 512;
+	radarmapper.size_y = 512;
+	radarmapper.size_z = 1;
 
 	for(i = 1; i < argc; ++i)
 	{
@@ -290,9 +367,55 @@
 			radarmapper.count |= 2;
 		else if(argv(i) == "--quit")
 			radarmapper.count |= 4;
+		else if(argv(i) == "--block")
+		{
+			radarmapper.count &~= 24;
+		}
+		else if(argv(i) == "--trace")
+		{
+			radarmapper.count &~= 24;
+			radarmapper.count |= 8;
+		}
+		else if(argv(i) == "--sample")
+		{
+			radarmapper.count &~= 24;
+			radarmapper.count |= 16;
+		}
+		else if(argv(i) == "--flags") // for the recursive call
+		{
+			++i;
+			radarmapper.count = stof(argv(i));
+		}
+		else if(argv(i) == "--sharpen") // for the recursive call
+		{
+			++i;
+			radarmapper.ltime = stof(argv(i));
+		}
+		else if(argv(i) == "--res") // resolution
+		{
+			++i;
+			radarmapper.size_x = stof(argv(i));
+			++i;
+			radarmapper.size_y = stof(argv(i));
+		}
+		else if(argv(i) == "--qual") // quality multiplier
+		{
+			++i;
+			radarmapper.size_z = stof(argv(i));
+		}
 		else
-			radarmapper.ltime = stof(argv(i));
+		{
+			remove(radarmapper);
+			radarmapper = world;
+			print("Usage: sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample] [--sharpen N] [--res W H] [--qual Q]\n");
+			print("The quality factor Q is roughly proportional to the time taken.\n");
+			print("--trace supports no quality factor; its result should look like --block with infinite quality factor.\n");
+			print("--block \n");
+			return;
+		}
 	}
+
+	print("Radarmap entity spawned.\n");
 }
 
 void BBox()
@@ -687,6 +810,22 @@
 		return;
 	}
 
+	if(argv(0) == "cointoss")
+	{
+		bprint("^3Throwing coin... Result: ");
+		if (random() > 0.5)
+			bprint("^1heads ^3!\n");
+		else
+			bprint("^1tails ^3!\n");
+		return;
+	}
+
+	if(argv(0) == "__FORCE_READY_RESTART")
+	{
+		reset_map(FALSE);
+		return;
+	}
+
 	print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -351,13 +351,18 @@
 	local float spreadpenalty=10;
 	local float distancefromfloor;
 
-	local float af;
+	local float af, ct, combo_time;
 
 	traceline(self.enemy.origin,self.enemy.origin-'0 0 1000',TRUE,world);
 	distancefromfloor = self.enemy.origin_z - trace_endpos_z;
 	
 	af = ATTACK_FINISHED(self);
+	ct = cvar("bot_ai_weapon_combo_threshold");
 
+	// Bots with no skill will be 4 times more slower than "godlike" bots when doing weapon combos
+	// Ideally this 4 should be calculated as longest_weapon_refire / bot_ai_weapon_combo_threshold
+	combo_time = time + ct + (ct * ((-0.3*skill)+3));
+
 	// Custom weapon list based on distance to the enemy
 	local float i; i = 0;
 	if(bot_custom_weapon){
@@ -368,8 +373,7 @@
 				w = bot_weapons_far[i];
 				if ( client_hasweapon(self, w, TRUE, FALSE) ){
 					if ( self.weapon == w){
-						if( cvar("bot_ai_weapon_combo") && 
-							af > time + cvar("bot_ai_weapon_combo_threshold"))
+						if( cvar("bot_ai_weapon_combo") && af > combo_time)
 							continue;
 					} else {
 						self.switchweapon = w;
@@ -385,8 +389,7 @@
 				w = bot_weapons_mid[i];
 				if ( client_hasweapon(self, w, TRUE, FALSE) ){
 					if ( self.weapon == w){
-						if( cvar("bot_ai_weapon_combo") && 
-							af > time + cvar("bot_ai_weapon_combo_threshold"))
+						if( cvar("bot_ai_weapon_combo") && af > combo_time)
 							continue;
 					} else {
 						self.switchweapon = w;
@@ -401,8 +404,7 @@
 			w = bot_weapons_close[i];
 			if ( client_hasweapon(self, w, TRUE, FALSE) ){
 				if ( self.weapon == w){
-					if( cvar("bot_ai_weapon_combo") && 
-						af > time + cvar("bot_ai_weapon_combo_threshold"))
+					if( cvar("bot_ai_weapon_combo") && af > combo_time)
 						continue;
 				} else {
 					self.switchweapon = w;
@@ -425,7 +427,7 @@
 
 	if (client_hasweapon(self, WEP_ROCKET_LAUNCHER, TRUE, FALSE)  && 
 		!(	cvar("bot_ai_weapon_combo") && self.weapon == WEP_ROCKET_LAUNCHER && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		rocket = (cvar("g_balance_rocketlauncher_damage")/cvar("g_balance_rocketlauncher_refire")*0.75)
@@ -433,7 +435,7 @@
 			
 	if (client_hasweapon(self, WEP_NEX, TRUE, FALSE)  && 
 		!( 	cvar("bot_ai_weapon_combo") && self.weapon == WEP_NEX && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		nex = (cvar("g_balance_nex_damage")/cvar("g_balance_nex_refire")*1.0)
@@ -447,7 +449,7 @@
 	if (client_hasweapon(self, WEP_GRENADE_LAUNCHER, TRUE, FALSE) && 
 		!( 
 			cvar("bot_ai_weapon_combo") && self.weapon == WEP_GRENADE_LAUNCHER && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		grenade = (cvar("g_balance_grenadelauncher_primary_damage")/cvar("g_balance_grenadelauncher_primary_refire")*1.0)
@@ -455,7 +457,7 @@
 			
 	if (client_hasweapon(self, WEP_ELECTRO, TRUE, FALSE) && 
 		!( 	cvar("bot_ai_weapon_combo") && self.weapon == WEP_ELECTRO && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		electro = (cvar("g_balance_electro_primary_damage")/cvar("g_balance_electro_primary_refire")*0.75)
@@ -473,7 +475,7 @@
 			
 	if (client_hasweapon(self, WEP_SHOTGUN, TRUE, FALSE) && 
 		!(	cvar("bot_ai_weapon_combo") && self.weapon == WEP_SHOTGUN && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		shotgun = (cvar("g_balance_shotgun_primary_damage")*cvar("g_balance_shotgun_primary_bullets")/cvar("g_balance_shotgun_primary_refire")*1.0)
@@ -481,7 +483,7 @@
 			
 	if (client_hasweapon(self, WEP_LASER, FALSE, FALSE) && 
 		!(	cvar("bot_ai_weapon_combo") && self.weapon == WEP_LASER && 
-			af > time + cvar("bot_ai_weapon_combo_threshold") 
+			af > combo_time
 		)
 	)
 		laser = (cvar("g_balance_laser_primary_damage")/cvar("g_balance_laser_primary_refire")*1.0)

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -238,12 +238,9 @@
 		if ((noteam && (!bot_ignore_bots || clienttype(head) == CLIENTTYPE_REAL)) || head.team != self.team)
 		if (vlen(head.origin - org) < sradius)
 		{
-			t = 100 / (head.health + head.armorvalue);
-			if (t > 0)
-			{
-				//dprint("found: "); dprint(head.netname); dprint("\n");
-				navigation_routerating(head, t * ratingscale, 500);
-			}
+			t = (self.health + self.armorvalue ) / (head.health + head.armorvalue );
+		//	clientcommand(self, strcat("say rating ", ftos(t*ratingscale)));
+			navigation_routerating(head, t * ratingscale, 2000);
 		}
 	}
 };
@@ -679,7 +676,7 @@
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
 		havocbot_goalrating_items(10000, self.origin, 10000);
-		havocbot_goalrating_enemyplayers(5000, self.origin, 20000);
+		havocbot_goalrating_enemyplayers(10000, self.origin, 20000);
 		//havocbot_goalrating_waypoints(1, self.origin, 1000);
 		navigation_goalrating_end();
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -69,7 +69,7 @@
 void kh_Controller_SetThink(float t, string msg, kh_Think_t func)  // runs occasionaly
 {
 	kh_Controller_Thinkfunc = func;
-	kh_controller.cnt = t;
+	kh_controller.cnt = ceil(t);
 	if(kh_Controller_Waitmsg != "")
 		strunzone(kh_Controller_Waitmsg);
 	if(msg == "")
@@ -367,6 +367,12 @@
 			self.team = attacker.team;
 }
 
+void key_reset()
+{
+	kh_Key_AssignTo(self, world);
+	kh_Key_Remove(self);
+}
+
 void kh_Key_Spawn(entity initial_owner, float angle)  // runs every time a new flag is created, ie after all the keys have been collected
 {
 	entity key;
@@ -386,6 +392,7 @@
 	key.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
 	setsize(key, KH_KEY_MIN, KH_KEY_MAX);
 	key.colormod = TeamColor(initial_owner.team) * KH_KEY_BRIGHTNESS;
+	key.reset = key_reset;
 
 	switch(initial_owner.team)
 	{
@@ -820,6 +827,13 @@
 void kh_WaitForPlayers()  // delay start of the round until enough players are present
 {
 	string teams_missing;
+
+	if(time < game_starttime)
+	{
+		kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+		return;
+	}
+
 	teams_missing = kh_CheckEnoughPlayers();
 	if(teams_missing == "")
 		kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
@@ -833,6 +847,12 @@
 	float i, players, teem;
 	entity player;
 
+	if(time < game_starttime)
+	{
+		kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+		return;
+	}
+
 	teams_missing = kh_CheckEnoughPlayers();
 	if(teams_missing != "")
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -533,7 +533,6 @@
 		s = strcat1(argv(f));
 	GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
 	GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
-	GetCvars_handleFloat(s, f, cvar_cl_nogibs, "cl_nogibs");
 	GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime");
 	GetCvars_handleFloat(s, f, cvar_cl_shownames, "cl_shownames");
 	GetCvars_handleString(s, f, cvar_g_nexuizversion, "g_nexuizversion");
@@ -549,6 +548,10 @@
 	GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[7], "cl_weaponpriority7", W_FixWeaponOrder_AllowIncomplete);
 	GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[8], "cl_weaponpriority8", W_FixWeaponOrder_AllowIncomplete);
 	GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[9], "cl_weaponpriority9", W_FixWeaponOrder_AllowIncomplete);
+	GetCvars_handleFloat(s, f, cvar_cl_autotaunt, "cl_autotaunt");
+	GetCvars_handleFloat(s, f, cvar_cl_voice_directional, "cl_voice_directional");
+	GetCvars_handleFloat(s, f, cvar_cl_voice_directional_taunt_attenuation, "cl_voice_directional_taunt_attenuation");
+	GetCvars_handleFloat(s, f, cvar_cl_hitsound, "cl_hitsound");
 
 	// fixup of switchweapon (needed for LMS or when spectating is disabled, as PutClientInServer comes too early)
 	if(f > 0)
@@ -624,7 +627,6 @@
 
 #define CENTERPRIO_POINT 1
 #define CENTERPRIO_SPAM 2
-#define CENTERPRIO_REBALANCE 2
 #define CENTERPRIO_VOTE 4
 #define CENTERPRIO_NORMAL 5
 #define CENTERPRIO_SHIELDING 7
@@ -686,12 +688,6 @@
 	return  v;
 };
 
-// requires that m2>m1 in all coordinates, and that m4>m3
-float boxesoverlap(vector m1, vector m2, vector m3, vector m4) {return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;};
-
-// requires the same, but is a stronger condition
-float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
-
 float g_pickup_shells;
 float g_pickup_shells_max;
 float g_pickup_nails;
@@ -732,6 +728,7 @@
 float warmup_start_ammo_cells;
 float warmup_start_health;
 float warmup_start_armorvalue;
+float g_weapon_stay;
 
 entity get_weaponinfo(float w);
 
@@ -914,6 +911,28 @@
 		start_weapons &~= WEPBIT_HOOK;
 		warmup_start_weapons &~= WEPBIT_HOOK;
 	}
+
+	if(g_weapon_stay == 2)
+	{
+		if(!start_ammo_shells) start_ammo_shells = g_pickup_shells;
+		if(!start_ammo_nails) start_ammo_shells = g_pickup_nails;
+		if(!start_ammo_cells) start_ammo_shells = g_pickup_cells;
+		if(!start_ammo_rockets) start_ammo_shells = g_pickup_rockets;
+		if(!warmup_start_ammo_shells) warmup_start_ammo_shells = g_pickup_shells;
+		if(!warmup_start_ammo_nails) warmup_start_ammo_shells = g_pickup_nails;
+		if(!warmup_start_ammo_cells) warmup_start_ammo_shells = g_pickup_cells;
+		if(!warmup_start_ammo_rockets) warmup_start_ammo_shells = g_pickup_rockets;
+	}
+
+	start_ammo_shells = max(0, start_ammo_shells);
+	start_ammo_nails = max(0, start_ammo_nails);
+	start_ammo_cells = max(0, start_ammo_cells);
+	start_ammo_rockets = max(0, start_ammo_rockets);
+
+	warmup_start_ammo_shells = max(0, warmup_start_ammo_shells);
+	warmup_start_ammo_nails = max(0, warmup_start_ammo_nails);
+	warmup_start_ammo_cells = max(0, warmup_start_ammo_cells);
+	warmup_start_ammo_rockets = max(0, warmup_start_ammo_rockets);
 }
 
 float g_bugrigs;
@@ -1026,6 +1045,10 @@
 	g_pickup_healthmega                = cvar("g_pickup_healthmega");
 	g_pickup_healthmega_max            = cvar("g_pickup_healthmega_max");
 
+	g_weapon_stay = cvar("g_weapon_stay");
+	if(!g_weapon_stay && (cvar("deathmatch") == 2))
+		g_weapon_stay = 1;
+
 	if not(inWarmupStage)
 	{
 		game_starttime                 = cvar("g_start_delay");
@@ -1066,15 +1089,52 @@
 void(entity e, float chan, string samp, float vol, float atten) sound = #8;
 float precache_sound_index (string s) = #19;
 
+#define SND_VOLUME      1
+#define SND_ATTENUATION 2
+#define SND_LARGEENTITY 8
+#define SND_LARGESOUND  16
+
 void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten)
 {
-	WriteByte(dest, 6);
-	WriteByte(dest, 27); // all bits except SND_LOOPING
-	WriteByte(dest, vol * 255);
-	WriteByte(dest, atten * 64);
-	WriteEntity(dest, e);
-	WriteByte(dest, chan);
-	WriteShort(dest, precache_sound_index(samp));
+	float entno, idx;
+	entno = num_for_edict(e);
+	idx = precache_sound_index(samp);
+
+	float sflags;
+	sflags = 0;
+
+	atten = floor(atten * 64);
+	vol = floor(vol * 255);
+
+	if(vol != 255)
+		sflags |= SND_VOLUME;
+	if(atten != 64)
+		sflags |= SND_ATTENUATION;
+	if(entno >= 8192)
+		sflags |= SND_LARGEENTITY;
+	if(idx >= 256)
+		sflags |= SND_LARGESOUND;
+
+	WriteByte(dest, SVC_SOUND);
+	WriteByte(dest, sflags);
+	if(sflags & SND_VOLUME)
+		WriteByte(dest, vol * 255);
+	if(sflags & SND_ATTENUATION)
+		WriteByte(dest, atten);
+	if(sflags & SND_LARGEENTITY)
+	{
+		WriteShort(dest, entno);
+		WriteByte(dest, chan);
+	}
+	else
+	{
+		WriteShort(dest, entno * 8 + chan);
+	}
+	if(sflags & SND_LARGESOUND)
+		WriteShort(dest, idx);
+	else
+		WriteByte(dest, idx);
+
 	WriteCoord(dest, o_x);
 	WriteCoord(dest, o_y);
 	WriteCoord(dest, o_z);
@@ -1089,7 +1149,42 @@
 {
 	soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten);
 }
+void stopsoundto(float dest, entity e, float chan)
+{
+	float entno;
+	entno = num_for_edict(e);
 
+	if(entno >= 8192)
+	{
+		float idx, sflags;
+		idx = precache_sound_index("misc/null.wav");
+		sflags = SND_LARGEENTITY;
+		if(idx >= 256)
+			sflags |= SND_LARGESOUND;
+		WriteByte(dest, SVC_SOUND);
+		WriteByte(dest, sflags);
+		WriteShort(dest, entno);
+		WriteByte(dest, chan);
+		if(sflags & SND_LARGESOUND)
+			WriteShort(dest, idx);
+		else
+			WriteByte(dest, idx);
+		WriteCoord(dest, e.origin_x);
+		WriteCoord(dest, e.origin_y);
+		WriteCoord(dest, e.origin_z);
+	}
+	else
+	{
+		WriteByte(dest, SVC_STOPSOUND);
+		WriteShort(dest, entno * 8 + chan);
+	}
+}
+void stopsound(entity e, float chan)
+{
+	stopsoundto(MSG_BROADCAST, e, chan); // unreliable, gets there fast
+	stopsoundto(MSG_ALL, e, chan); // in case of packet loss
+}
+
 void play2(entity e, string filename)
 {
 	//stuffcmd(e, strcat("play2 ", filename, "\n"));
@@ -1103,7 +1198,7 @@
 	if(time > player.announcetime)
 	if(clienttype(player) == CLIENTTYPE_REAL)
 	{
-		player.announcetime = time + 0.3;
+		player.announcetime = time + 0.8;
 		play2(player, msg);
 		return TRUE;
 	}
@@ -1230,20 +1325,6 @@
 
 	// gore and miscellaneous sounds
 	//precache_sound ("misc/h2ohit.wav");
-	precache_model ("models/gibs/bloodyskull.md3");
-	precache_model ("models/gibs/chunk.mdl");
-	precache_model ("models/gibs/eye.md3");
-	precache_model ("models/gibs/gib1.md3");
-	precache_model ("models/gibs/gib2.md3");
-	precache_model ("models/gibs/gib3.md3");
-	precache_model ("models/gibs/gib4.md3");
-	precache_model ("models/gibs/gib5.md3");
-	precache_model ("models/gibs/gib6.md3");
-	precache_model ("models/gibs/smallchest.md3");
-	precache_model ("models/gibs/chest.md3");
-	precache_model ("models/gibs/arm.md3");
-	precache_model ("models/gibs/leg1.md3");
-	precache_model ("models/gibs/leg2.md3");
 	precache_model ("models/hook.md3");
 	precache_sound ("misc/armorimpact.wav");
 	precache_sound ("misc/bodyimpact1.wav");
@@ -1334,6 +1415,10 @@
 		}
 	}
 
+	precache_model("models/elaser.mdl");
+	precache_model("models/laser.mdl");
+	precache_model("models/ebomb.mdl");
+
 #if 0
 	// Disabled this code because it simply does not work (e.g. ignores bgmvolume, overlaps with "cd loop" controlled tracks).
 
@@ -1660,8 +1745,7 @@
 #define SUB_OwnerCheck() (other && (other == self.owner))
 
 #define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } } while(0)
-const string STR_MISC_NULL_WAV = "misc/null.wav";
-#define PROJECTILE_TOUCH_NOSOUND do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { sound (self, CHAN_PROJECTILE, STR_MISC_NULL_WAV, VOL_BASE, ATTN_NORM); remove(self); return; } } while(0)
+#define PROJECTILE_TOUCH_NOSOUND do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { stopsound(self, CHAN_PAIN); remove(self); return; } } while(0)
 
 float MAX_IPBAN_URIS = 16;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -560,6 +560,20 @@
 	}
 }
 
+void onslaught_generator_reset()
+{
+	self.team = self.team_saved;
+	self.lasthealth = self.max_health = self.health = cvar("g_onslaught_gen_health");
+	self.takedamage = DAMAGE_AIM;
+	self.bot_attack = TRUE;
+	self.iscaptured = TRUE;
+	self.islinked = TRUE;
+	self.isshielded = TRUE;
+	self.enemy.solid = SOLID_NOT;
+	self.think = onslaught_generator_delayed;
+	self.nextthink = time + 0.2;
+}
+
 /*QUAKED spawnfunc_onslaught_generator (0 .5 .8) (-32 -32 -24) (32 32 64)
 Base generator.
 
@@ -618,22 +632,10 @@
 	WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
 
 	onslaught_updatelinks();
+
+	self.reset = onslaught_generator_reset;
 };
 
-void onslaught_generator_reset()
-{
-	self.team = self.team_saved;
-	self.lasthealth = self.max_health = self.health = cvar("g_onslaught_gen_health");
-	self.takedamage = DAMAGE_AIM;
-	self.bot_attack = TRUE;
-	self.iscaptured = TRUE;
-	self.islinked = TRUE;
-	self.isshielded = TRUE;
-	self.enemy.solid = SOLID_NOT;
-	self.think = onslaught_generator_delayed;
-	self.nextthink = time + 0.2;
-}
-
 .float waslinked;
 void onslaught_controlpoint_icon_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
@@ -797,6 +799,27 @@
 	self.colormap = e.colormap;
 };
 
+void onslaught_controlpoint_reset()
+{
+	if(self.goalentity && self.goalentity != world)
+		remove(self.goalentity);
+	self.goalentity = world;
+	self.team = 0;
+	self.colormap = 1024;
+	self.iscaptured = FALSE;
+	self.islinked = FALSE;
+	self.isshielded = TRUE;
+	self.enemy.solid = SOLID_NOT;
+	self.enemy.colormap = self.colormap;
+	self.think = self.enemy.think = SUB_Null;
+	self.nextthink = 0; // don't like SUB_Null :P
+	
+	onslaught_updatelinks();
+
+	activator = self;
+	SUB_UseTargets(); // to reset the structures, playerspawns etc.
+}
+
 /*QUAKED spawnfunc_onslaught_controlpoint (0 .5 .8) (-32 -32 0) (32 32 128)
 Control point.  Be sure to give this enough clearance so that the shootable part has room to exist
 
@@ -851,29 +874,10 @@
 	WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
 
 	onslaught_updatelinks();
+
+	self.reset = onslaught_controlpoint_reset;
 };
 
-void onslaught_controlpoint_reset()
-{
-	if(self.goalentity && self.goalentity != world)
-		remove(self.goalentity);
-	self.goalentity = world;
-	self.team = 0;
-	self.colormap = 1024;
-	self.iscaptured = FALSE;
-	self.islinked = FALSE;
-	self.isshielded = TRUE;
-	self.enemy.solid = SOLID_NOT;
-	self.enemy.colormap = self.colormap;
-	self.think = self.enemy.think = SUB_Null;
-	self.nextthink = 0; // don't like SUB_Null :P
-	
-	onslaught_updatelinks();
-
-	activator = self;
-	SUB_UseTargets(); // to reset the structures, playerspawns etc.
-}
-
 float onslaught_link_send(entity to, float sendflags)
 {
 	WriteByte(MSG_ENTITY, ENT_CLIENT_RADARLINK);

Copied: branches/nexuiz-2.0/data/qcsrc/server/monsters (from rev 5656, trunk/data/qcsrc/server/monsters)

Modified: branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,13 +2,13 @@
     Simulate drag
     self.velocity = movelib_vdrag(self.velocity,0.02,0.5);
 **/
-vector movelib_drag(float drag, float exp)
+vector movelib_dragvec(float drag, float exp)
 {
     float lspeed,ldrag;
 
     lspeed = vlen(self.velocity);
     ldrag = lspeed * drag;
-    ldrag = ldrag * drag * exp;
+    ldrag = ldrag * (drag * exp);
     ldrag = 1 - (ldrag / lspeed);
 
     return self.velocity * ldrag;
@@ -50,19 +50,82 @@
     return new_vel * new_bias + self.velocity * (1-new_bias);
 }
 
+.float  movelib_lastupdate;
+void movelib_move(vector force,float max_velocity,float drag,float mass,float breakforce)
+{
+    float deltatime;
+    float acceleration;
+    //float mspeed;
 
-/**
-    Applies absolute force to a velocity
-**/
-vector movelib_accelerate(vector vel,float force)
+    deltatime = time - self.movelib_lastupdate;
+    if (deltatime > 0.15) deltatime = 0;
+    self.movelib_lastupdate = time;
+    if(!deltatime) return;
+
+    //mspeed = vlen(self.velocity);
+
+    if(mass)
+        acceleration = vlen(force) / mass;
+    else
+        acceleration = vlen(force);
+
+    if(self.flags & FL_ONGROUND)
+    {
+        if(breakforce)
+        {
+            breakforce = 1 - ((breakforce / mass) * deltatime);
+            self.velocity = self.velocity * breakforce;
+        }
+
+        self.velocity = self.velocity + force * (acceleration * deltatime);
+    }
+
+    self.velocity = self.velocity + '0 0 -1' * sv_gravity * deltatime;
+
+    if(drag)
+        self.velocity = movelib_dragvec(drag, 1);
+
+    if(max_velocity)
+    if(vlen(self.velocity) > max_velocity)
+        self.velocity = normalize(self.velocity) * max_velocity;
+}
+
+void movelib_move_simple(vector newdir,float velo,float turnrate)
 {
-    return normalize(vel) * (vlen(vel) + force);
+    vector olddir;
+
+    olddir = normalize(self.velocity);
+
+    self.velocity = normalize(olddir + newdir * turnrate) * velo;
 }
-vector movelib_decelerate(vector vel,float force)
+
+/*
+vector movelib_accelerate(float force)
 {
-    return normalize(vel) * (vlen(vel) - force);
+    vector vel;
+    vel = self.velocity;
+    vel = normalize(vel) * (vlen(vel) + force);
+    self.velocity = self.velocity  + vel;
 }
 
+
+vector movelib_decelerate(float force,float mass)
+{
+    vector vel;
+    float decel;
+
+    if(mass)
+        decel = force / mass;
+    else
+        decel = force;
+
+    vel = self.velocity;
+    vel = normalize(vel) * max((vlen(vel) - decel),0);
+    self.velocity = self.velocity - vel;
+
+    if(vlen(self.velocity) < 5) self.velocity = '0 0 0';
+}
+*/
 vector movelib_velocity_transfer(entity source,entity destination)
 {
     return '0 0 0';

Modified: branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,6 +2,10 @@
 #define PLF_NOOPTIMIZE 2
 #define PLF_SUBPATH3D  4
 
+#define PT_QUICKSTAR 1
+#define PT_QUICKBOX  2
+#define PT_ASTAR     4  // FIXME NOT IMPLEMENTED
+
 //#define PATHLIB_RDFIELDS
 #ifdef PATHLIB_RDFIELDS
     #define path_flags lip
@@ -21,13 +25,13 @@
 #endif
 
 #define pathlib_garbagetime 120
-#define pathib_maxdivide 256
+#define pathib_maxdivide 512
 
 .float(vector start,vector end) path_validate;
 
 float pathlib_stdproc_path_validate(vector start,vector end)
 {
-    tracebox(start, self.mins, self.maxs, end, MOVE_NORMAL, self);
+    tracebox(start, self.mins, self.maxs, end, MOVE_WORLDONLY, self);
 
     if(vlen(trace_endpos - end) < 32)
         return 1;
@@ -35,13 +39,13 @@
     return 0;
 }
 
-vector pathlib_groundsnap(vector where,entity path)
+vector pathlib_groundsnap(vector where)
 {
     float lsize;
 
     lsize = vlen(self.mins - self.maxs) * 0.25;
 
-    traceline(where + ('0 0 1' * lsize) ,where - '0 0 10000',MOVE_NORMAL,self);
+    traceline(where + ('0 0 1' * lsize) ,where - '0 0 10240',MOVE_WORLDONLY,self);
 
     return trace_endpos + ('0 0 1' * lsize);
 
@@ -68,33 +72,46 @@
     if(next)
     {
         point.path_next = next;
-        //point.path_nodelength = vlen(point.origin - next.origin)
     }
     else
         point.classname = "path_end";
 
-    if(point.owner.path_flags & PLF_GROUNDSNAP)
-        where = pathlib_groundsnap(where,parent);
+    if (point.owner.path_flags & PLF_GROUNDSNAP)
+        where = pathlib_groundsnap(where);
 
-
     setorigin(point,where);
 
 
     return point;
 }
 
-vector pathlib_findsubpath(entity start,vector vcrash,entity end,float maxsize)
+/*
+float pathlib_scoresubpath(vector start,vector point,vector end,float minstep)
 {
-    float x,y,z;
+    float dist_stp,dist_pte,dist_total;
+
+    dist_stp = vlen(start - point);
+    if(dist_stp < minstep)
+        return 100000000;
+
+    dist_pte = vlen(point - end);
+    dist_total = dist_stp + dist_pte;
+    return -1;
+}
+*/
+
+vector pathlib_subpath_quickbox(entity start,vector vcrash,entity end,float maxsize)
+{
+
     float step;
+    float pathscore;
+    float pathscore_best;
     float dist;
-    float pathlength;
-    float pathlength_best;
-    vector bestpoint;
-    vector point;
+    vector bestpoint,point;
     float zmin,zmax;
+    vector box;
 
-    pathlength_best = 1000000;
+    pathscore_best = 0;
 
     step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
 
@@ -109,59 +126,152 @@
         zmax = 1;
     }
 
-    for(z = zmin; z < zmax; z += step)
-    for(y = -maxsize; y < maxsize; y += step)
-    for(x = -maxsize; x < maxsize; x += step)
+    for(box_z = zmin; box_z < zmax; box_z += step)
+    for(box_y = -maxsize; box_y < maxsize; box_y += step)
+    for(box_x = -maxsize; box_x < maxsize; box_x += step)
     {
 
-        point_z = vcrash_z + z;
-        point_x = vcrash_x + x;
-        point_y = vcrash_y + y;
+        point = vcrash + box;
 
-
         if(start.owner.path_flags & PLF_GROUNDSNAP)
-            point = pathlib_groundsnap(point,start);
+            point = pathlib_groundsnap(point);
 
         if(self.path_validate(start.origin,point))
         {
             dist = vlen(start.origin - point);
             if(dist > step)
             {
-                pathlength = dist + vlen(point - end.origin);
-                if(pathlength < pathlength_best)
+                pathscore = 1 / (dist + vlen(point - end.origin));
+                if(pathscore > pathscore_best)
                 {
                     bestpoint = point;
-                    pathlength_best = pathlength;
+                    pathscore_best = pathscore;
                 }
             }
         }
 
     }
 
-    if(pathlength_best != 1000000)
+    if(pathscore_best != 0)
         return bestpoint;
 
-    return vcrash;
+    return start.origin;
 }
 
-float pathlib_path(entity start,entity end)
+vector pathlib_subpath_quickstar(entity start,entity end,float gridsize)
 {
+    vector point, best_point;
+    float  score, best_score;
+    vector dir_end;
+
+    dir_end   = normalize(end.origin - start.origin);
+    dir_end_x = dir_end_x * -1;
+
+    makevectors(dir_end);
+
+    best_score = 0;
+    score      = 0;
+
+    best_point = start.origin;
+
+    // Forward
+    point = start.origin + v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Forward-right
+    point = start.origin + (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+
+    // Forward-left
+    point = start.origin + (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+
+    // Right
+    point = start.origin + v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Left
+    point = start.origin - v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back
+    point = start.origin - v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back-right
+
+    point = start.origin - (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back-left
+    point = start.origin - (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    return(best_point);
+}
+
+float pathlib_path(entity start,entity end,float pathing_method)
+{
     vector vcrash;
     vector subpath_point;
     entity subpoint;
 
     // Fail.
     if(start.cnt > pathib_maxdivide)
+    {
+        bprint("To many segments!\n");
         return 0;
+    }
 
     if(self.path_validate(start.origin,end.origin))
         return 1;
 
     vcrash = trace_endpos;
 
-    subpath_point = pathlib_findsubpath(start,vcrash,end,start.owner.path_subpathing_size);
+    switch(pathing_method)
+    {
+        case PT_QUICKSTAR:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            break;
+        case PT_QUICKBOX:
+            subpath_point = pathlib_subpath_quickbox(start,vcrash,end,start.owner.path_subpathing_size);
+            break;
+        case PT_ASTAR:
+            dprint("Pathlib error: A* pathing not implemented!\n");
+            return 0;
+        default:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            dprint("Pathlib warning: unknown pathing method, using quickstar!\n");
+            break;
+    }
 
-    if(subpath_point == vcrash)
+    if(subpath_point == start.origin)
         return 0; // Fail.
 
     subpoint = pathlib_createpoint(start,end,start.owner,subpath_point);
@@ -173,7 +283,7 @@
     if(self.path_validate(start.origin,end.origin))
         return 1;
 
-    return pathlib_path(subpoint,end);
+    return pathlib_path(subpoint,end,pathing_method);
 }
 
 void pathlib_path_optimize(entity start,entity end)
@@ -208,14 +318,17 @@
 {
     entity e;
 
-    e = findentity(start, owner, start);
+    e = findchainentity(owner, start);
     while(e)
     {
-        remove(e);
-        e = findentity(start, owner, start);
+        e.think = SUB_Remove;
+        e.nextthink = time;
+        e = e.chain;
     }
 }
 
+//#define DEBUGPATHING
+#ifdef DEBUGPATHING
 void pathlib_showpath(entity start)
 {
     entity e;
@@ -227,10 +340,16 @@
     }
 }
 
+void path_dbg_think()
+{
+    pathlib_showpath(self);
+    self.nextthink = time + 1;
+}
+#endif
 /**
-    Run a A*-like pathing from 'from' to 'to'
+    Pathing from 'from' to 'to'
 **/
-entity pathlib_makepath(vector from, vector to,float pathflags,float subpathing_size, float subpathing_bboxexpand)
+entity pathlib_makepath(vector from, vector to,float pathflags,float subpathing_size, float subpathing_bboxexpand,float pathing_method)
 {
     entity e_start,e_end;
 
@@ -244,6 +363,13 @@
     if(subpathing_bboxexpand < 1)
         subpathing_bboxexpand = 1;
 
+    if(pathflags & PLF_GROUNDSNAP)
+    {
+        //bprint("SnapIT!\n");
+        from = pathlib_groundsnap(from);
+        to = pathlib_groundsnap(to);
+    }
+
     e_start = pathlib_createpoint(world,world,world,from);
     e_start.path_flags = pathflags;
 
@@ -256,20 +382,54 @@
     e_start.path_next = e_end;
     e_start.cnt = 0;
 
-    if(!pathlib_path(e_start,e_end))
+    if(!pathlib_path(e_start,e_end,pathing_method))
     {
+        bprint("Fail, Fail, Fail!\n");
         pathlib_deletepath(e_start);
         remove(e_start);
+
         return world;
     }
 
     pathlib_path_optimize(e_start,e_end);
 
+#ifdef DEBUGPATHING
+    e_start.think = path_dbg_think;
+    e_start.nextthink = time + 1;
+#endif
+
     return e_start;
 
 }
 
+/*
+.entity goalcurrent, goalstack01, goalstack02, goalstack03;
+.entity goalstack04, goalstack05, goalstack06, goalstack07;
+.entity goalstack08, goalstack09, goalstack10, goalstack11;
+.entity goalstack12, goalstack13, goalstack14, goalstack15;
+.entity goalstack16, goalstack17, goalstack18, goalstack19;
+.entity goalstack20, goalstack21, goalstack22, goalstack23;
+.entity goalstack24, goalstack25, goalstack26, goalstack27;
+.entity goalstack28, goalstack29, goalstack30, goalstack31;
+*/
 
+#define node_left  goalstack01
+#define node_right goalstack02
+#define node_front goalstack03
+#define node_back  goalstack04
+
+#define node_open    goalstack05
+#define node_closed  goalstack06
+#define node_blocked goalstack07
+
+
+
+float pointinbox(vector point,vector box,float ssize)
+{
+    return 0;
+}
+#ifdef DEBUGPATHING
+
 /* TESTING */
 void pathlib_test_think()
 {
@@ -298,7 +458,7 @@
     }
 
     setsize(self,'-50 -50 0','50 50 50');
-    path = pathlib_makepath(self.origin,end.origin, PLF_GROUNDSNAP,500,1.25);
+    path = pathlib_makepath(self.origin,end.origin, PLF_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
 
     if(!path)
     {
@@ -317,3 +477,5 @@
     self.think = pathlib_test_dinit;
     self.nextthink = time + 2;
 }
+
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/server/portals.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/portals.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/portals.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -84,6 +84,12 @@
 	vector old_yawforward;
 	float planeshift, s, t;
 
+	if not(teleporter.enemy)
+	{
+		backtrace("Portal_TeleportPlayer called without other portal being set. Stop.");
+		return 0;
+	}
+
 	from = teleporter.origin;
 	transform = teleporter.portal_transform;
 
@@ -195,8 +201,21 @@
 
 	if(player.flagcarried)
 		DropFlag(player.flagcarried, player, world);
+
+	if not(teleporter.enemy)
+	{
+		backtrace("Portal_TeleportPlayer ended up without other portal being set BEFORE TeleportPlayer. Stop.");
+		return 0;
+	}
+
 	TeleportPlayer(teleporter, player, to, ang, newvel, teleporter.enemy.absmin, teleporter.enemy.absmax);
 
+	if not(teleporter.enemy)
+	{
+		backtrace("Portal_TeleportPlayer ended up without other portal being set AFTER TeleportPlayer. Stop.");
+		return 0;
+	}
+
 	// reset fade counter
 	teleporter.portal_wants_to_vanish = 0;
 	teleporter.fade_time = time + cvar("g_balance_portal_lifetime");

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-01-24 19:51:12 UTC (rev 5658)
@@ -19,6 +19,8 @@
 ../common/mapinfo.qh
 ../common/util.qc
 
+csqcprojectile.qh
+
 portals.qh
 
 g_hook.qh
@@ -52,12 +54,6 @@
 g_subs.qc
 
 
-// tZork's libs
-movelib.qc
-steerlib.qc
-pathlib.qc
-
-
 runematch.qc
 arena.qc
 
@@ -68,8 +64,13 @@
 
 cl_physics.qc
 
+// tZork's libs
+movelib.qc
+steerlib.qc
+pathlib.qc
+//animation.qc
+
 g_world.qc
-g_decors.qc
 g_casings.qc
 
 t_jumppads.qc
@@ -157,3 +158,10 @@
 func_breakable.qc
 
 ../common/items.qc
+
+monsters/defs.qc
+monsters/fight.qc
+monsters/ai.qc
+monsters/m_monsters.qc
+
+csqcprojectile.qc

Modified: branches/nexuiz-2.0/data/qcsrc/server/runematch.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/runematch.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/runematch.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -446,6 +446,14 @@
 	}
 }
 
+void rune_reset()
+{
+	if(self.owner)
+		if(self.owner.classname != "runematch_spawn_point")
+			DropAllRunes(self.owner);
+	rune_respawn();
+}
+
 void spawn_runes()
 {
 	float r, num, max_num, rn, cs, numrunes, runes_left, curses_left, tries, prevent_same;
@@ -581,6 +589,7 @@
 		e.movetype = MOVETYPE_TOSS;
 		e.solid = SOLID_TRIGGER;
 		e.flags = FL_ITEM;
+		e.reset = rune_reset;
 		setmodel(e, "models/runematch/rune.mdl"); // precision set below
 		setorigin(e, spot.origin);
 		setsize(e, '0 0 -35', '0 0 0');

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -88,6 +88,10 @@
 float TeamScore_AddToTeam(float t, float scorefield, float score)
 {
 	entity s;
+
+	if(gameover)
+		score = 0;
+
 	if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
 	if(t <= 0 || t >= 16)
 		error("Adding score to invalid team!");
@@ -284,6 +288,10 @@
 float PlayerScore_Add(entity player, float scorefield, float score)
 {
 	entity s;
+
+	if(gameover)
+		score = 0;
+
 	if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
 	s = player.scorekeeper;
 	if(!s)
@@ -323,10 +331,14 @@
 	float c;
 	string s;
 	entity p;
+	float fullstatus;
+
 	s = GetGametype();
 	s = strcat(s, ":", cvar_string("g_nexuizversion"));
 	s = strcat(s, "::", GetPlayerScoreString(world, 2)); // make this 1 once we can
 
+	fullstatus = cvar("g_full_getstatus_responses");
+
 	if(teamscores_entities_count)
 	{
 		float t;
@@ -427,21 +439,25 @@
 
 	FOR_EACH_CLIENT(p)
 	{
-		/* this breaks qstat :( find a way to make qstat parse this at least as an int first
-		s = GetPlayerScoreString(p, 1);
-		if(clienttype(p) == CLIENTTYPE_REAL)
-			s = strcat(s, ":human");
+		if(fullstatus)
+		{
+			s = GetPlayerScoreString(p, 1);
+			if(clienttype(p) == CLIENTTYPE_REAL)
+				s = strcat(s, ":human");
+			else
+				s = strcat(s, ":bot");
+			if(p.classname == "player" || g_arena || g_lms)
+				s = strcat(s, ":", ftos(p.team));
+			else
+				s = strcat(s, ":spectator");
+		}
 		else
-			s = strcat(s, ":bot");
-		if(p.classname == "player" || g_arena || g_lms)
-			s = strcat(s, ":", ftos(p.team));
-		else
-			s = strcat(s, ":spectator");
-		*/
-		if(p.classname == "player" || g_arena || g_lms)
-			s = GetPlayerScoreString(p, 2);
-		else
-			s = "-666";
+		{
+			if(p.classname == "player" || g_arena || g_lms)
+				s = GetPlayerScoreString(p, 2);
+			else
+				s = "-666";
+		}
 
 		if(p.clientstatus)
 			strunzone(p.clientstatus);

Modified: branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,4 +1,20 @@
 /**
+    Uniform pull towards a point
+**/
+vector steerlib_pull(vector point)
+{
+    return normalize(point - self.origin);
+}
+
+/**
+    Uniform push from a point
+**/
+vector steerlib_push(vector point)
+{
+    return normalize(self.origin - point);
+}
+
+/**
     Pull toward a point, The further away, the stronger the pull.
 **/
 vector steerlib_arrive(vector point,float maximal_distance)
@@ -25,6 +41,51 @@
     return  direction * (1-(distance / maximal_distance));
 }
 
+vector steerlib_attract2(vector point, float min_influense,float max_distance,float max_influense)
+{
+    float distance;
+    vector direction;
+    float influense;
+
+    distance  = bound(0.00001,vlen(self.origin - point),max_distance);
+    direction = normalize(point - self.origin);
+
+    influense = 1 - (distance / max_distance);
+    influense = min_influense + (influense * (max_influense - min_influense));
+
+    return  direction * influense;
+}
+
+/*
+vector steerlib_attract2(vector point, float maximal_distance,float min_influense,float max_influense,float distance)
+{
+    //float distance;
+    vector current_direction;
+    vector target_direction;
+    float i_target,i_current;
+
+    if(!distance)
+        distance = vlen(self.origin - point);
+
+    distance = bound(0.001,distance,maximal_distance);
+
+    target_direction = normalize(point - self.origin);
+    current_direction = normalize(self.velocity);
+
+    i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
+    i_current = 1 - i_target;
+
+    // i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
+
+    string s;
+    s = ftos(i_target);
+    bprint("IT: ",s,"\n");
+    s = ftos(i_current);
+    bprint("IC  : ",s,"\n");
+
+    return  normalize((target_direction * i_target) + (current_direction * i_current));
+}
+*/
 /**
     Move away from a point.
 **/
@@ -40,7 +101,7 @@
 }
 
 /**
-    Keep at ideal_distance away from point
+    Try to keep at ideal_distance away from point
 **/
 vector steerlib_standoff(vector point,float ideal_distance)
 {
@@ -63,6 +124,11 @@
 
 /**
     A random heading in a forward halfcicrle
+
+    use like:
+    self.target = steerlib_waner(256,32,self.target)
+
+    where range is the cicrle radius and tresh is how close we need to be to pick a new heading.
 **/
 vector steerlib_waner(float range,float tresh,vector oldpoint)
 {
@@ -81,7 +147,7 @@
 }
 
 /**
-    Dodge a point-
+    Dodge a point. dont work to well.
 **/
 vector steerlib_dodge(vector point,vector dodge_dir,float min_distance)
 {
@@ -121,6 +187,8 @@
 /**
     All members want to be in the center, and keep away from eachother.
     The furtehr form the center the more they want to be there.
+
+    This results in a aligned movement (?!) much like flocking.
 **/
 vector steerlib_swarm(float radius, float standoff,float separation_force,float swarm_force)
 {
@@ -155,52 +223,36 @@
 {
     vector vup_left,vup_right,vdown_left,vdown_right;
     float fup_left,fup_right,fdown_left,fdown_right;
+    vector upwish,downwish,leftwish,rightwish;
     vector v_left,v_down;
-    //vector point;
 
-    /*
-    traceline(self.origin,self.origin + v_forward * length,MOVE_NOMONSTERS,self);
-    if(trace_fraction == 1)
-        return '0 0 0';
-    */
-
     v_left = v_right * -1;
     v_down = v_up * -1;
 
     vup_left = (v_forward + (v_left * pitch + v_up * pitch)) * length;
     traceline(self.origin, self.origin +  vup_left,MOVE_NOMONSTERS,self);
-    //vup_left = trace_endpos;
     fup_left = trace_fraction;
 
     //te_lightning1(world,self.origin, trace_endpos);
 
     vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length;
     traceline(self.origin,self.origin + vup_right ,MOVE_NOMONSTERS,self);
-    //vup_right = trace_endpos;
     fup_right = trace_fraction;
 
     //te_lightning1(world,self.origin, trace_endpos);
 
     vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length;
     traceline(self.origin,self.origin + vdown_left,MOVE_NOMONSTERS,self);
-    //vdown_left = trace_endpos;
     fdown_left = trace_fraction;
 
     //te_lightning1(world,self.origin, trace_endpos);
 
     vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length;
     traceline(self.origin,self.origin + vdown_right,MOVE_NOMONSTERS,self);
-    //vdown_right = trace_endpos;
     fdown_right = trace_fraction;
 
     //te_lightning1(world,self.origin, trace_endpos);
 
-    //(v_for * f_for) +
-
-    //point = self.origin + (vup_left * fup_left) + (vup_right * fup_right) +
-    //        (vdown_left * fdown_left) + (vdown_right * fdown_right);
-
-    vector upwish,downwish,leftwish,rightwish;
     upwish    = v_up    * (fup_left   + fup_right);
     downwish  = v_down  * (fdown_left + fdown_right);
     leftwish  = v_left  * (fup_left   + fdown_left);
@@ -208,9 +260,6 @@
 
     return (upwish+leftwish+downwish+rightwish) * 0.25;
 
-    //point = point * 0.2; // /5
-
-   // return normalize(point - self.origin) * (1- (fup_left+fup_right+fdown_left+fdown_right) * 0.25);
 }
 
 
@@ -219,7 +268,7 @@
 //     Testting                             //
 // Everything below this point is a mess :D //
 //////////////////////////////////////////////
-#define TLIBS_TETSLIBS
+//#define TLIBS_TETSLIBS
 #ifdef TLIBS_TETSLIBS
 void flocker_die()
 {
@@ -245,8 +294,8 @@
     self.angles_x = self.angles_x * -1;
 
     dodgemove   = steerlib_traceavoid(0.35,1000);
-    swarmmove   = steerlib_swarm(1000,100,150,400);
-    reprellmove = steerlib_repell(self.owner.enemy.origin+self.enemy.velocity,1000) * 700;
+    swarmmove   = steerlib_flock(500,75,700,500);
+    reprellmove = steerlib_repell(self.owner.enemy.origin+self.enemy.velocity,2000) * 700;
 
     if(vlen(dodgemove) == 0)
     {
@@ -256,13 +305,13 @@
     else
         self.pos1 = normalize(self.velocity);
 
-    dodgemove = dodgemove * 700;
+    dodgemove = dodgemove * vlen(self.velocity) * 5;
 
     newmove = swarmmove + reprellmove + wandermove + dodgemove;
-    self.velocity = movelib_inertmove_byspeed(newmove,900,0.4,0.8);
+    self.velocity = movelib_inertmove_byspeed(newmove,300,0.2,0.9);
     //self.velocity  = movelib_inertmove(dodgemove,0.65);
 
-    self.velocity = movelib_drag(0.02,0.6);
+    self.velocity = movelib_dragvec(0.01,0.6);
 
     self.angles = vectoangles(self.velocity);
 
@@ -349,15 +398,15 @@
     }
 
     if(self.enemy)
-        attractmove = steerlib_attract(self.enemy.origin,5000) * 1100;
+        attractmove = steerlib_attract(self.enemy.origin+self.enemy.velocity * 0.1,5000) * 1250;
     else
         attractmove = normalize(self.velocity) * 200;
 
-    dodgemove = steerlib_traceavoid(0.35,1500) * 1700;
+    dodgemove = steerlib_traceavoid(0.35,1500) * vlen(self.velocity);
 
     newmove = dodgemove + attractmove;
-    self.velocity = movelib_inertmove_byspeed(newmove,850,0.5,0.9);
-    self.velocity = movelib_drag(0.01,0.5);
+    self.velocity = movelib_inertmove_byspeed(newmove,1250,0.3,0.7);
+    self.velocity = movelib_dragvec(0.01,0.5);
 
 
     self.angles = vectoangles(self.velocity);
@@ -395,3 +444,5 @@
     self.enemy.owner     = self;
 }
 #endif
+
+

Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -19,7 +19,7 @@
 				if (self.waterlevel != 3)
 				{
 					if(self.air_finished < time + 9)
-						PlayerSound(playersound_gasp, CHAN_PLAYER, 0);
+						PlayerSound(playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 					self.air_finished = time + 12;
 					self.dmg = 2;
 				}
@@ -107,9 +107,9 @@
 					if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
 					{
 						if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-							GlobalSound(globalsound_metalstep, CHAN_PLAYER, 0);
+							GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 						else
-							GlobalSound(globalsound_step, CHAN_PLAYER, 0);
+							GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
 					}
 				}
 			}

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -108,12 +108,20 @@
 	}
 	else
 	{
-		if (cvar("deathmatch") == 2 || cvar("g_weapon_stay"))
+		if (g_weapon_stay == 1)
+		if not(item.flags & FL_NO_WEAPON_STAY)
+		if (item.flags & FL_WEAPON)
 		{
-			if (item.flags & FL_WEAPON && player.weapons & item.weapons && item.classname != "droppedweapon")
-				return 0;
-			if (player.weapons & item.weapons && item.flags & FL_TOSSED)	// don't let players stack ammo by tossing weapons
-				return 0;
+			if(item.classname == "droppedweapon")
+			{
+				if (player.weapons & item.weapons)	// don't let players stack ammo by tossing weapons
+					goto skip;
+			}
+			else
+			{
+				if (player.weapons & item.weapons)
+					goto skip;
+			}
 		}
 
 		// in case the player has autoswitch enabled do the following:
@@ -200,6 +208,7 @@
 		}
 	}
 
+:skip
 	// always eat teamed entities
 	if(item.team)
 		pickedup = TRUE;
@@ -238,7 +247,7 @@
 
 	if (self.classname == "droppedweapon")
 		remove (self);
-	else if((self.flags & FL_WEAPON) && !self.team && (cvar("deathmatch") == 2 || cvar("g_weapon_stay")))
+	else if((self.flags & FL_WEAPON) && !(self.flags & FL_NO_WEAPON_STAY) && g_weapon_stay)
 		return;
 	else
 	{
@@ -286,6 +295,23 @@
 	}
 }
 
+void Item_Reset()
+{
+	if(self.state == 1)
+	{
+		self.model = string_null;
+		self.solid = SOLID_NOT;
+	}
+	else
+	{
+		self.model = self.mdl;
+		self.solid = SOLID_TRIGGER;
+	}
+	setorigin (self, self.origin);
+	self.think = SUB_Null;
+	self.nextthink = 0;
+}
+
 // Savage: used for item garbage-collection
 // TODO: perhaps nice special effect?
 void RemoveItem(void)
@@ -344,6 +370,7 @@
 	// is it a dropped weapon?
 	if (self.classname == "droppedweapon")
 	{
+		self.reset = SUB_Remove;
 		// it's a dropped weapon
 		self.movetype = MOVETYPE_TOSS;
 		self.solid = SOLID_TRIGGER;
@@ -361,6 +388,7 @@
 	}
 	else
 	{
+		self.reset = Item_Reset;
 		// it's a level item
 		if(self.spawnflags & 1)
 			self.noalign = 1;
@@ -686,7 +714,25 @@
 		if(!self.ammofield)
 			self.ammofield = cvar(strcat("g_pickup_", Item_CounterFieldName(e.items)));
 	}
+	else
+	{
+		self.flags |= FL_NO_WEAPON_STAY;
+	}
 
+	// weapon stay isn't supported for teamed weapons
+	if(self.team)
+		self.flags |= FL_NO_WEAPON_STAY;
+
+	if(g_weapon_stay == 2)
+	{
+		self.ammo_shells = 0;
+		self.ammo_nails = 0;
+		self.ammo_cells = 0;
+		self.ammo_rockets = 0;
+		// weapon stay 2: don't use ammo on weapon pickups; instead
+		// initialize all ammo types to the pickup ammo unless set by g_start_ammo_*
+	}
+
 	StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, e.message, 0, e.weapons, FL_WEAPON, weapon_pickupevalfunc, e.bot_pickupbasevalue);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(e.weapon, WR_PRECACHE);
@@ -719,7 +765,7 @@
 	{
 		minstagib_items(IT_CELLS);
 		self.think = minst_remove_item;
-		self.nextthink = time + cvar("sys_ticrate");
+		self.nextthink = time;
 		return;
 	}
 	weapon_defaultspawnfunc(WEP_NEX);
@@ -731,7 +777,7 @@
 	{
 		minstagib_items(IT_CELLS);
 		self.think = minst_remove_item;
-		self.nextthink = time + cvar("sys_ticrate");
+		self.nextthink = time;
 		return;
 	}
 	weapon_defaultspawnfunc(WEP_MINSTANEX);
@@ -743,7 +789,7 @@
 	{
 		minstagib_items(IT_CELLS);
 		self.think = minst_remove_item;
-		self.nextthink = time + cvar("sys_ticrate");
+		self.nextthink = time;
 		return;
 	}
 	weapon_defaultspawnfunc(WEP_ROCKET_LAUNCHER);

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -108,14 +108,9 @@
 	if (other.classname != "corpse")
 	if (other.classname != "body")
 	if (other.classname != "gib")
-	if (other.classname != "missile")
-	if (other.classname != "rocket")
 	if (other.classname != "casing")
-	if (other.classname != "grenade")
-	if (other.classname != "plasma")
-	if (other.classname != "plasma_prim")
-	if (other.classname != "plasma_chain")
 	if (other.classname != "droppedweapon")
+	if (!other.projectiledeathtype || other.classname == "bullet")
 		return;
 
 	if (other.deadflag && other.iscreature)
@@ -130,6 +125,8 @@
 	// reset tracking of oldvelocity for impact damage (sudden velocity changes)
 	other.oldvelocity = other.velocity = self.movedir;
 
+	UpdateCSQCProjectile(other);
+
 	if (other.classname == "player")
 	{
 		if(self.pushltime < time)  // prevent "snorring" sound when a player hits the jumppad more than once

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,12 +1,25 @@
+.float dmgtime2;
+void generic_plat_blocked()
+{
+    if(self.dmg && other.takedamage != DAMAGE_NO) {
+        if(self.dmgtime2 < time) {
+            Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+            self.dmgtime2 = time + self.dmgtime;
+        }
 
+        // Gib dead/dying stuff
+        if(other.deadflag != DEAD_NO)
+            Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+    }
+}
+
+
 float	STATE_TOP		= 0;
 float	STATE_BOTTOM	= 1;
 float	STATE_UP		= 2;
 float	STATE_DOWN		= 3;
 
 .entity trigger_field;
-//.float dmgtime;
-.float dmgtime2;
 
 void() plat_center_touch;
 void() plat_outside_touch;
@@ -140,14 +153,24 @@
 	plat_go_down();
 };
 
-void plat_init_movedown()
+.string sound1, sound2;
+
+void plat_reset()
 {
-	setorigin (self, self.pos2);
-	self.state = 2;
+	IFTARGETED
+	{
+		setorigin (self, self.pos1);
+		self.state = 4;
+		self.use = plat_use;
+	}
+	else
+	{
+		setorigin (self, self.pos2);
+		self.state = 2;
+		self.use = plat_trigger_use;
+	}
 }
 
-.string sound1, sound2;
-
 void spawnfunc_path_corner() { };
 void spawnfunc_func_plat()
 {
@@ -198,7 +221,8 @@
 	self.angles = '0 0 0';
 
 	self.classname = "plat";
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	self.effects |= EF_LOWPRECISION;
 	setsize (self, self.mins , self.maxs);
 
@@ -211,17 +235,10 @@
 	self.pos2 = self.origin;
 	self.pos2_z = self.origin_z - self.size_z + 8;
 
-	self.use = plat_trigger_use;
-
 	plat_spawn_inside_trigger ();	// the "start moving" trigger
 
-	IFTARGETED
-	{
-		self.state = 4;
-		self.use = plat_use;
-	}
-	else
-		InitializeEntity(self, plat_init_movedown, INITPRIO_SETLOCATION);
+	self.reset = plat_reset;
+	plat_reset();
 };
 
 
@@ -230,6 +247,9 @@
 {
 	self.think = train_next;
 	self.nextthink = self.ltime + self.wait;
+
+	if(self.noise != "")
+		stopsoundto(MSG_BROADCAST, self, CHAN_TRIGGER); // send this as unreliable only, as the train will resume operation shortly anyway
 };
 
 void train_next()
@@ -256,6 +276,9 @@
 		else
 			SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
 	}
+
+	if(self.noise != "")
+		sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
 };
 
 void func_train_find()
@@ -277,37 +300,33 @@
 */
 void spawnfunc_func_train()
 {
+	if (self.noise != "")
+		precache_sound(self.noise);
+
 	if (!self.target)
 		objerror("func_train without a target");
 	if (!self.speed)
 		self.speed = 100;
 
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	self.effects |= EF_LOWPRECISION;
 
 	// wait for targets to spawn
 	InitializeEntity(self, func_train_find, INITPRIO_SETLOCATION);
-};
 
+	self.blocked = generic_plat_blocked;
+	if(self.dmg & (!self.message))
+		self.message = " was squished";
+    if(self.dmg && (!self.message2))
+		self.message2 = "was squished by";
+	if(self.dmg && (!self.dmgtime))
+		self.dmgtime = 0.25;
+	self.dmgtime2 = time;
 
+	// TODO make a reset function for this one
+};
 
-void rotating_blocked()
-{
-
-    if(self.dmg && other.takedamage != DAMAGE_NO) {
-        if(self.dmgtime2 < time) {
-            Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
-            self.dmgtime2 = time + self.dmgtime;
-        }
-
-        // Gib dead/dying stuff
-        if(other.deadflag != DEAD_NO)
-            Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
-    }
-
-
-}
-
 /*QUAKED spawnfunc_func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS
 Brush model that spins in place on one axis (default Z).
 speed   : speed to rotate (in degrees per second)
@@ -318,7 +337,7 @@
 
 void spawnfunc_func_rotating()
 {
-	if (self.noise)
+	if (self.noise != "")
 	{
 		precache_sound(self.noise);
 		ambientsound(self.origin, self.noise, VOL_BASE, ATTN_IDLE);
@@ -346,14 +365,17 @@
 
     self.dmgtime2 = time;
 
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	// no EF_LOWPRECISION here, as rounding angles is bad
 
-    self.blocked = rotating_blocked;
+    self.blocked = generic_plat_blocked;
 
 	// wait for targets to spawn
 	self.nextthink = self.ltime + 999999999;
 	self.think = SUB_Null;
+
+	// TODO make a reset function for this one
 };
 
 .float height;
@@ -362,7 +384,7 @@
 	local vector v;
 	self.nextthink = time + 0.1;
 	// calculate sinewave using makevectors
-	makevectors((time * self.owner.cnt + self.owner.phase * 360) * '0 1 0');
+	makevectors((self.nextthink * self.owner.cnt + self.owner.phase * 360) * '0 1 0');
 	v = self.owner.destvec + self.owner.movedir * v_forward_y;
 	// * 10 so it will arrive in 0.1 sec
 	self.owner.velocity = (v - self.owner.origin) * 10;
@@ -371,7 +393,7 @@
 void bobbing_blocked()
 {
 	// no need to duplicate code
-	rotating_blocked();
+	generic_plat_blocked();
 }
 
 /*QUAKED spawnfunc_func_bobbing (0 .5 .8) ? X_AXIS Y_AXIS
@@ -386,10 +408,10 @@
 void spawnfunc_func_bobbing()
 {
 	local entity controller;
-	if (self.noise)
+	if (self.noise != "")
 	{
 		precache_sound(self.noise);
-		ambientsound(self.origin, self.noise, VOL_BASE, ATTN_IDLE);
+		soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
 	}
 	if (!self.speed)
 		self.speed = 4;
@@ -418,7 +440,8 @@
 	else // Z
 		self.movedir = '0 0 1' * self.height;
 
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 
 	// wait for targets to spawn
 	controller = spawn();
@@ -431,6 +454,8 @@
 
 	// Savage: Reduce bandwith, critical on e.g. nexdm02
 	self.effects |= EF_LOWPRECISION;
+
+	// TODO make a reset function for this one
 };
 
 // button and multiple button
@@ -484,6 +509,15 @@
 	SUB_CalcMove (self.pos2, self.speed, button_wait);
 };
 
+void button_reset()
+{
+	self.health = self.max_health;
+	setorigin(self, self.pos1);
+	self.frame = 0;			// use normal textures
+	self.state = STATE_BOTTOM;
+	if (self.health)
+		self.takedamage = DAMAGE_YES;	// can be shot again
+}
 
 void button_use()
 {
@@ -550,7 +584,8 @@
 {
 	SetMovedir ();
 
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	self.effects |= EF_LOWPRECISION;
 
 	self.blocked = button_blocked;
@@ -577,10 +612,10 @@
     if(self.noise != "")
         precache_sound(self.noise);
 
-	self.state = STATE_BOTTOM;
-
 	self.pos1 = self.origin;
 	self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip);
+
+	button_reset();
 };
 
 
@@ -869,7 +904,7 @@
 };
 
 
-void door_rotating_blocked()
+void door_generic_plat_blocked()
 {
 
     if((self.spawnflags & 8) && (other.takedamage != DAMAGE_NO)) { // KIll Kill Kill!!
@@ -1143,6 +1178,13 @@
 	self.pos1 = self.origin;
 }
 
+void door_reset()
+{
+	setorigin(self, self.pos1);
+	self.state = STATE_BOTTOM;
+	self.think = SUB_Null;
+}
+
 void spawnfunc_func_door()
 {
 	//if (!self.deathtype) // map makers can override this
@@ -1150,7 +1192,8 @@
 	SetMovedir ();
 
 	self.max_health = self.health;
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	self.effects |= EF_LOWPRECISION;
 	self.classname = "door";
 
@@ -1204,6 +1247,8 @@
 // LinkDoors can't be done until all of the doors have been spawned, so
 // the sizes can be detected properly.
 	InitializeEntity(self, LinkDoors, INITPRIO_LINKDOORS);
+
+	self.reset = door_reset;
 };
 
 /*QUAKED spawnfunc_func_door_rotating (0 .5 .8) ? START_OPEN BIDIR DOOR_DONT_LINK BIDIR_IN_DOWN x TOGGLE X_AXIS Y_AXIS
@@ -1234,6 +1279,13 @@
 FIXME: only one sound set available at the time being
 */
 
+void door_rotating_reset()
+{
+	self.angles = self.pos1;
+	self.state = STATE_BOTTOM;
+	self.think = SUB_Null;
+}
+
 void door_rotating_init_startopen()
 {
 	self.angles = self.movedir;
@@ -1262,7 +1314,8 @@
 	self.angles = '0 0 0';
 
 	self.max_health = self.health;
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	//self.effects |= EF_LOWPRECISION;
 	self.classname = "door_rotating";
 
@@ -1315,6 +1368,8 @@
 // LinkDoors can't be done until all of the doors have been spawned, so
 // the sizes can be detected properly.
 	InitializeEntity(self, LinkDoors, INITPRIO_LINKDOORS);
+
+	self.reset = door_rotating_reset;
 };
 
 /*
@@ -1487,6 +1542,16 @@
 	}
 };
 
+void secret_reset()
+{
+	if (self.spawnflags&SECRET_YES_SHOOT)
+	{
+		self.health = 10000;
+		self.takedamage = DAMAGE_YES;
+	}
+	setorigin(self, self.oldorigin);
+	self.think = SUB_Null;
+}
 
 /*QUAKED spawnfunc_func_door_secret (0 .5 .8) ? open_once 1st_left 1st_down no_shoot always_shoot
 Basic secret door. Slides back, then to the side. Angle determines direction.
@@ -1517,7 +1582,8 @@
 	self.mangle = self.angles;
 	self.angles = '0 0 0';
 	self.classname = "door";
-	InitMovingBrushTrigger();
+	if not(InitMovingBrushTrigger())
+		return;
 	self.effects |= EF_LOWPRECISION;
 
 	self.touch = secret_touch;
@@ -1539,5 +1605,234 @@
 	self.oldorigin = self.origin;
 	if (!self.wait)
 		self.wait = 5;		// 5 seconds before closing
+
+	self.reset = secret_reset;
+	secret_reset();
 };
 
+/*QUAKED spawnfunc_func_fourier (0 .5 .8) ?
+Brush model that moves in a pattern of added up sine waves, can be used e.g. for circular motions.
+netname: list of <frequencymultiplier> <phase> <x> <y> <z> quadruples, separated by spaces; note that phase 0 represents a sine wave, and phase 0.25 a cosine wave (by default, it uses 1 0 0 0 1, to match func_bobbing's defaults
+speed: how long one cycle of frequency multiplier 1 in seconds (default 4)
+height: amplitude modifier (default 32)
+phase: cycle timing adjustment (0-1 as a fraction of the cycle, default 0)
+noise: path/name of looping .wav file to play.
+dmg: Do this mutch dmg every .dmgtime intervall when blocked
+dmgtime: See above.
+*/
+
+void func_fourier_controller_think()
+{
+	local vector v;
+	float n, i, t;
+
+	self.nextthink = time + 0.1;
+
+	n = floor((tokenize_sane(self.owner.netname)) / 5);
+	t = self.nextthink * self.owner.cnt + self.owner.phase * 360;
+
+	v = self.owner.destvec;
+
+	for(i = 0; i < n; ++i)
+	{
+		makevectors((t * stof(argv(i*5)) + stof(argv(i*5+1)) * 360) * '0 1 0');
+		v = v + ('1 0 0' * stof(argv(i*5+2)) + '0 1 0' * stof(argv(i*5+3)) + '0 0 1' * stof(argv(i*5+4))) * self.owner.height * v_forward_y;
+	}
+
+	// * 10 so it will arrive in 0.1 sec
+	self.owner.velocity = (v - self.owner.origin) * 10;
+};
+
+void spawnfunc_func_fourier()
+{
+	local entity controller;
+	if (self.noise != "")
+	{
+		precache_sound(self.noise);
+		soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+	}
+
+	if (!self.speed)
+		self.speed = 4;
+	if (!self.height)
+		self.height = 32;
+	self.destvec = self.origin;
+	self.cnt = 360 / self.speed;
+
+	self.blocked = generic_plat_blocked;
+	if(self.dmg & (!self.message))
+		self.message = " was squished";
+    if(self.dmg && (!self.message2))
+		self.message2 = "was squished by";
+	if(self.dmg && (!self.dmgtime))
+		self.dmgtime = 0.25;
+	self.dmgtime2 = time;
+
+	if(self.netname == "")
+		self.netname = "1 0 0 0 1";
+
+	if not(InitMovingBrushTrigger())
+		return;
+
+	// wait for targets to spawn
+	controller = spawn();
+	controller.classname = "func_fourier_controller";
+	controller.owner = self;
+	controller.nextthink = time + 1;
+	controller.think = func_fourier_controller_think;
+	self.nextthink = self.ltime + 999999999;
+	self.think = SUB_Null;
+
+	// Savage: Reduce bandwith, critical on e.g. nexdm02
+	self.effects |= EF_LOWPRECISION;
+
+	// TODO make a reset function for this one
+};
+
+// reusing some fields havocbots declared
+.entity wp00, wp01, wp02, wp03;
+
+.float targetfactor, target2factor, target3factor, target4factor;
+.vector targetnormal, target2normal, target3normal, target4normal;
+
+vector func_vectormamamam_origin(entity o, float t)
+{
+	vector v, p;
+	float f;
+	entity e;
+
+	f = o.spawnflags;
+	v = '0 0 0';
+
+	e = o.wp00;
+	if(e)
+	{
+		p = e.origin + t * e.velocity;
+		if(f & 1)
+			v = v + (p * o.targetnormal) * o.targetnormal * o.targetfactor;
+		else
+			v = v + (p - (p * o.targetnormal) * o.targetnormal) * o.targetfactor;
+	}
+
+	e = o.wp01;
+	if(e)
+	{
+		p = e.origin + t * e.velocity;
+		if(f & 2)
+			v = v + (p * o.target2normal) * o.target2normal * o.target2factor;
+		else
+			v = v + (p - (p * o.target2normal) * o.target2normal) * o.target2factor;
+	}
+
+	e = o.wp02;
+	if(e)
+	{
+		p = e.origin + t * e.velocity;
+		if(f & 4)
+			v = v + (p * o.target3normal) * o.target3normal * o.target3factor;
+		else
+			v = v + (p - (p * o.target3normal) * o.target3normal) * o.target3factor;
+	}
+
+	e = o.wp03;
+	if(e)
+	{
+		p = e.origin + t * e.velocity;
+		if(f & 8)
+			v = v + (p * o.target4normal) * o.target4normal * o.target4factor;
+		else
+			v = v + (p - (p * o.target4normal) * o.target4normal) * o.target4factor;
+	}
+
+	return v;
+}
+
+void func_vectormamamam_controller_think()
+{
+	self.nextthink = time + 0.1;
+	self.owner.velocity = (self.owner.destvec + func_vectormamamam_origin(self.owner, 0.1) - self.owner.origin) * 10;
+}
+
+void func_vectormamamam_findtarget()
+{
+	if(self.target != "")
+		self.wp00 = find(world, targetname, self.target);
+
+	if(self.target2 != "")
+		self.wp01 = find(world, targetname, self.target2);
+
+	if(self.target3 != "")
+		self.wp02 = find(world, targetname, self.target3);
+
+	if(self.target4 != "")
+		self.wp03 = find(world, targetname, self.target4);
+
+	if(!self.wp00 && !self.wp01 && !self.wp02 && !self.wp03)
+		objerror("No reference entity found, so there is nothing to move. Aborting.");
+
+	self.destvec = self.origin - func_vectormamamam_origin(self.owner, 0);
+
+	local entity controller;
+	controller = spawn();
+	controller.classname = "func_vectormamamam_controller";
+	controller.owner = self;
+	controller.nextthink = time + 1;
+	controller.think = func_vectormamamam_controller_think;
+}
+
+void spawnfunc_func_vectormamamam()
+{
+	if (self.noise != "")
+	{
+		precache_sound(self.noise);
+		soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+	}
+
+	if(!self.targetfactor)
+		self.targetfactor = 1;
+
+	if(!self.target2factor)
+		self.target2factor = 1;
+
+	if(!self.target3factor)
+		self.target3factor = 1;
+
+	if(!self.target4factor)
+		self.target4factor = 1;
+
+	if(vlen(self.targetnormal))
+		self.targetnormal = normalize(self.targetnormal);
+
+	if(vlen(self.target2normal))
+		self.target2normal = normalize(self.target2normal);
+
+	if(vlen(self.target3normal))
+		self.target3normal = normalize(self.target3normal);
+
+	if(vlen(self.target4normal))
+		self.target4normal = normalize(self.target4normal);
+
+	self.blocked = generic_plat_blocked;
+	if(self.dmg & (!self.message))
+		self.message = " was squished";
+    if(self.dmg && (!self.message2))
+		self.message2 = "was squished by";
+	if(self.dmg && (!self.dmgtime))
+		self.dmgtime = 0.25;
+	self.dmgtime2 = time;
+
+	if(self.netname == "")
+		self.netname = "1 0 0 0 1";
+
+	if not(InitMovingBrushTrigger())
+		return;
+
+	// wait for targets to spawn
+	self.nextthink = self.ltime + 999999999;
+	self.think = SUB_Null;
+
+	// Savage: Reduce bandwith, critical on e.g. nexdm02
+	self.effects |= EF_LOWPRECISION;
+
+	InitializeEntity(self, func_vectormamamam_findtarget, INITPRIO_FINDTARGET);
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,9 +1,46 @@
+void tdeath(entity player, entity teleporter, entity telefragger, vector telefragmin, vector telefragmax)
+{
+	entity head;
+	vector deathmin;
+	vector deathmax;
+	float deathradius;
+	deathmin = player.absmin;
+	deathmax = player.absmax;
+	if(telefragmin != telefragmax)
+	{
+		if(deathmin_x > telefragmin_x) deathmin_x = telefragmin_x;
+		if(deathmin_y > telefragmin_y) deathmin_y = telefragmin_y;
+		if(deathmin_z > telefragmin_z) deathmin_z = telefragmin_z;
+		if(deathmax_x < telefragmax_x) deathmax_x = telefragmax_x;
+		if(deathmax_y < telefragmax_y) deathmax_y = telefragmax_y;
+		if(deathmax_z < telefragmax_z) deathmax_z = telefragmax_z;
+	}
+	deathradius = max(vlen(deathmin), vlen(deathmax));
+	for(head = findradius(player.origin, deathradius); head; head = head.chain)
+		if(head != player)
+			if(head.takedamage)
+				if(boxesoverlap(deathmin, deathmax, head.absmin, head.absmax))
+				{
+					if ((player.classname == "player") && (player.health >= 1))
+						Damage (head, teleporter, telefragger, 10000, DEATH_TELEFRAG, head.origin, '0 0 0');
+					else if (telefragger.health < 1) // corpses gib
+						Damage (head, teleporter, telefragger, 10000, DEATH_TELEFRAG, head.origin, '0 0 0');
+					else // dead bodies and monsters gib themselves instead of telefragging
+						Damage (telefragger, teleporter, telefragger, 10000, DEATH_TELEFRAG, telefragger.origin, '0 0 0');
+				}
+}
+
+void spawn_tdeath(vector v0, entity e, vector v)
+{
+	tdeath(e, e, e, '0 0 0', '0 0 0');
+}
+
 .entity pusher;
 void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax)
 {
-	entity head;
 	entity oldself;
 	entity telefragger;
+	vector from;
 
 	if(teleporter.owner)
 		telefragger = teleporter.owner;
@@ -22,6 +59,7 @@
 
 	// Relocate the player
 	// assuming to allows PL_MIN to PL_MAX box and some more
+	from = player.origin;
 	setorigin (player, to);
 	player.angles = to_angles;
 	player.fixangle = TRUE;
@@ -29,37 +67,8 @@
 
 	if(player.classname == "player")
 	{
-		// Kill anyone else in the teleporter box (NO MORE TDEATH)
 		if(player.takedamage && player.deadflag == DEAD_NO && !g_race)
-		{
-			vector deathmin;
-			vector deathmax;
-			float deathradius;
-			deathmin = player.absmin;
-			deathmax = player.absmax;
-			if(telefragmin != telefragmax)
-			{
-				if(deathmin_x > telefragmin_x) deathmin_x = telefragmin_x;
-				if(deathmin_y > telefragmin_y) deathmin_y = telefragmin_y;
-				if(deathmin_z > telefragmin_z) deathmin_z = telefragmin_z;
-				if(deathmax_x < telefragmax_x) deathmax_x = telefragmax_x;
-				if(deathmax_y < telefragmax_y) deathmax_y = telefragmax_y;
-				if(deathmax_z < telefragmax_z) deathmax_z = telefragmax_z;
-			}
-			deathradius = max(vlen(deathmin), vlen(deathmax));
-			for(head = findradius(player.origin, deathradius); head; head = head.chain)
-				if(head != player)
-					if(head.takedamage)
-						if(boxesoverlap(deathmin, deathmax, head.absmin, head.absmax))
-						{
-							if ((player.classname == "player") && (player.health >= 1))
-								Damage (head, teleporter, telefragger, 10000, DEATH_TELEFRAG, head.origin, '0 0 0');
-							else if (telefragger.health < 1) // corpses gib
-								Damage (head, teleporter, telefragger, 10000, DEATH_TELEFRAG, head.origin, '0 0 0');
-							else // dead bodies and monsters gib themselves instead of telefragging
-								Damage (telefragger, teleporter, telefragger, 10000, DEATH_TELEFRAG, telefragger.origin, '0 0 0');
-						}
-		}
+			tdeath(player, teleporter, telefragger, telefragmin, telefragmax);
 
 		// hide myself a tic
 		player.effects = player.effects | EF_NODRAW;
@@ -96,7 +105,7 @@
 
 void Teleport_Touch (void)
 {
-	entity oldself;
+	entity oldself, e;
 
 	if (other.health < 1)
 		return;
@@ -110,13 +119,35 @@
 	if(other.classname == "player")
 		RemoveGrapplingHook(other);
 
-	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0');
+	if(self.enemy)
+	{
+		e = self.enemy;
+	}
+	else
+	{
+		RandomSelection_Init();
+		for(e = world; (e = find(e, targetname, self.target)); )
+		{
+			if(e.cnt)
+				RandomSelection_Add(e, 0, e.cnt, 0);
+			else
+				RandomSelection_Add(e, 0, 1, 0);
+		}
+		e = RandomSelection_chosen_ent;
+	}
 
-	if(self.enemy.target)
+	if(!e)
 	{
+		sprint(other, "Teleport destination vanished. Sorry... please complain to the mapper.\n");
+	}
+
+	TeleportPlayer(self, other, e.origin + '0 0 1' * (1 - other.mins_z - 24), e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0');
+
+	if(e.target)
+	{
 		oldself = self;
 		activator = other;
-		self = self.enemy;
+		self = e;
 		SUB_UseTargets();
 		self = oldself;
 	}
@@ -124,6 +155,8 @@
 
 void spawnfunc_info_teleport_destination (void)
 {
+	self.classname = "info_teleport_destination";
+
 	self.mangle = self.angles;
 	self.angles = '0 0 0';
 
@@ -134,7 +167,7 @@
 	{
 	}
 	else
-		objerror ("Teleport destination without a targetname");
+		objerror ("^3Teleport destination without a targetname");
 }
 
 void spawnfunc_misc_teleporter_dest (void)
@@ -149,18 +182,39 @@
 
 void teleport_findtarget (void)
 {
-	// now enable touch
-	self.touch = Teleport_Touch;
+	entity e;
+	float n;
 
-	self.enemy = find (world, targetname, self.target);
-	if (!self.enemy)
+	n = 0;
+	for(e = world; (e = find(e, targetname, self.target)); )
 	{
+		++n;
+		if(e.movetype == MOVETYPE_NONE)
+			waypoint_spawnforteleporter(self, e.origin, 0);
+		if(e.classname != "info_teleport_destination")
+			print("^3MAPPER ERROR: teleporter does target an invalid teleport destination entity. Angles will not work.\n");
+	}
+
+	if(n == 0)
+	{
+		// no dest!
 		objerror ("Teleporter with nonexistant target");
 		return;
 	}
+	else if(n == 1)
+	{
+		// exactly one dest - bots love that
+		self.enemy = find(e, targetname, self.target);
+		self.dest = self.enemy.origin;
+	}
+	else
+	{
+		// have to use random selection every single time
+		self.enemy = world;
+	}
 
-	self.dest = self.enemy.origin;
-	waypoint_spawnforteleporter(self, self.dest, 0);
+	// now enable touch
+	self.touch = Teleport_Touch;
 }
 
 void spawnfunc_trigger_teleport (void)

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -165,7 +165,7 @@
 	float fraglimit_override, timelimit_override;
 
 	VoteReset();
-	
+
 	teams_matter = 0;
 	cvar_set("teamplay", "0");
 
@@ -179,7 +179,7 @@
 	world.maxs = mi_max;
 
 	MapInfo_LoadMapSettings(mapname);
-	
+
 	if not(cvar_value_issafe(world.fog))
 	{
 		print("The current map contains a potentially harmful fog setting, ignored\n");
@@ -482,7 +482,7 @@
 	if (cache_mutatormsg != "") {
 		s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg);
 	}
-	
+
 	if(cache_lastmotd != cvar_string("sv_motd"))
 	{
 		if(cache_lastmotd)
@@ -1203,43 +1203,13 @@
 	centerprint(selected, strcat("You have been moved into a different team to improve team balance\nYou are now on: ", ColoredTeamName(selected.team)));
 }
 
-float lastRebalanceInfo;
 void CauseRebalance(float source_team, float howmany_toomany)
 {
-	float steam;
-	entity head;
-
 	if(IsTeamBalanceForced() == 1)
 	{
 		bprint("Rebalancing Teams\n");
 		ShufflePlayerOutOfTeam(source_team);
 	}
-	else
-	{
-		if(cvar("g_balance_teams_complain"))
-		if(howmany_toomany < cvar("g_balance_teams_complain"))
-			return;
-		if(time < lastRebalanceInfo + 90)
-			return;
-		lastRebalanceInfo = time;
-		if(source_team == 1)
-			steam = COLOR_TEAM1;
-		else if(source_team == 2)
-			steam = COLOR_TEAM2;
-		else if(source_team == 3)
-			steam = COLOR_TEAM3;
-		else if(source_team == 4)
-			steam = COLOR_TEAM4;
-		print("Team ", ftos(source_team), " too large, complaining.\n");
-		FOR_EACH_REALPLAYER(head)
-		{
-			if(head.team == steam)
-			{
-				sprint(head, "\{1}\{13}^3SERVER NOTICE:^7 One of you please change teams!\n");
-				centerprint_atprio(head, CENTERPRIO_REBALANCE, "^3SERVER NOTICE:\n\n^7Someone of you please change teams!");
-			}
-		}
-	}
 }
 
 // part of g_balance_teams_force
@@ -1314,8 +1284,6 @@
 	audit_teams_time = time + 0.7 + random()*0.3;
 }
 
-
-
 // code from here on is just to support maps that don't have team entities
 void tdm_spawnteam (string teamname, float teamcolor)
 {

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -128,7 +128,7 @@
     self.deadflag           = DEAD_DEAD;
     self.tur_head.deadflag  = self.deadflag;
 
-    sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     org2 = self.origin + '0 0 40';
 
 // Explotion grafix
@@ -289,24 +289,25 @@
     self = baseent;
 
     if (teamplay != 0)
+    if (self.team == attacker.team)
     {
-        if (self.team == attacker.team)
+        // This does not happen anymore. Re-enable if you fix that.
+        //if(attacker.flags & FL_CLIENT)
+            //if not(attacker.isbot)
+                //sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
+
+        if(cvar("g_friendlyfire"))
         {
-            sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
+            self = oldself;
             return;
         }
         else
         {
-            /*
-            // This will get enoying fast...
-            FOR_EACH_PLAYER(player)
-            	if(player.team == self.team)
-            		sprint(player, "The enemy is attacking your base!");
-            */
+            damage = damage * cvar("g_friendlyfire");
         }
     }
 
-    baseent.health = baseent.health - damage;
+    self.health = self.health - damage;
 
     // thorw head slightly off aim when hit?
     if (oldself.classname == "turret_head")

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -177,32 +177,31 @@
         real_angle = wish_angle - (self.angles + self.tur_head.angles);
     else
     {
-        //if(vlen(wish_angle - self.tur_head.angles) > vlen(self.tur_head.angles - wish_angle))
         real_angle = wish_angle - self.tur_head.angles;
-        //else
-        //    real_angle =  self.tur_head.angles - wish_angle;
+
     }
 
-    /*
-    if(real_angle_y > 180)
-        bprint("^3");
-    if(real_angle_y < -180)
-        bprint("^1");
-    string s;
-    s = vtos(real_angle);
-    bprint("RA1: ",s);
-    */
+    if(real_angle_x > self.tur_head.angles_x)
+    {
+        if(real_angle_x >= 180)
+            real_angle_x -= 360;
+    }
+    else
+    {
+        if(real_angle_x <= -180)
+            real_angle_x += 360;
+    }
+    if(real_angle_y > self.tur_head.angles_y)
+    {
+        if(real_angle_y >= 180)
+            real_angle_y -= 360;
+    }
+    else
+    {
+        if(real_angle_y <= -180)
+            real_angle_y += 360;
+    }
 
-
-    if (real_angle_x < 0) real_angle_x += 360;
-    if (real_angle_x > 180) real_angle_x -= 360;
-
-    if (real_angle_y < 0) real_angle_y += 360;
-    if (real_angle_y >= 180) real_angle_y -= 360;
-
-    //s = vtos(real_angle);
-    //bprint(" RA2: ",s,"\n");
-
     // Limit pitch
 
     if (self.track_flags & TFL_TRACK_PITCH)
@@ -426,6 +425,7 @@
 			return -5.5;
 	}
 
+
     // Missile
     if (e_target.flags & FL_PROJECTILE)
     {
@@ -459,13 +459,13 @@
     {
         v_tmp = real_origin(e_target) + ((e_target.mins + e_target.maxs) * 0.5);
         //v_tmp = e_target.origin;
-        traceline(e_turret.origin,v_tmp,0,e_turret);
+        traceline(e_turret.origin + e_turret.tur_aimorg,v_tmp,0,e_turret);
 
         if (e_turret.aim_firetolerance_dist < vlen(v_tmp - trace_endpos))
             return -10;
     }
 
-    // Can we even aim this thing? (anglecheck)
+    // Can we even aim this thing?
     tvt_thadv = angleofs(e_turret.tur_head,e_target);
     tvt_tadv  = angleofs(e_turret,e_target);
     tvt_thadf = vlen(tvt_thadv);
@@ -501,44 +501,39 @@
 entity turret_select_target()
 {
     entity e;        // target looper entity
-    entity e_enemy;  // currently best scoreing enemy
-
-    float score;     // current target (e) score
-    float m_score;   // current best target (e_enemy) score
+    float  score;    // target looper entity score
+    entity e_enemy;  // currently best scoreing target
+    float  m_score;  // currently best scoreing target's score
     float f;
-    // string s;
+
+    m_score = 0;
+    if(self.enemy)
+    if(turret_validate_target(self,e,self.target_select_flags) > 0)
+    {
+        e_enemy = self.enemy;
+        m_score = self.turret_score_target(self,e_enemy) * self.target_select_samebias;
+    }
+
     e = findradius(self.origin,self.target_range);
 
-    // Nothing to aim at.
+    // Nothing to aim at?
     if (!e) return world;
 
-    m_score = 0;
-
     while (e)
     {
         f = turret_validate_target(self,e,self.target_select_flags);
-        //s = ftos(f);
-        //bprint(e.netname, " = ",s,"\n");
         if (f > 0)
         {
-
             score = self.turret_score_target(self,e);
-
             if ((score > m_score) && (score > 0))
             {
                 e_enemy = e;
                 m_score = score;
             }
         }
-
         e = e.chain;
     }
 
-//    self.tur_lastscore = m_score;
-
-    //if (self.enemy != e_enemy)
-    //self.volly_counter = 0;
-
     return e_enemy;
 }
 
@@ -731,9 +726,13 @@
     dprint("^1Bang, ^3your dead^7 ",self.enemy.netname,"! ^1(turret with no real firefunc)\n");
 }
 
+/*
+    When .used a turret switched team to activator.team.
+    If activator is world, the turrets goes inactive.
+*/
 void turret_stdproc_use()
 {
-    // bprint("Used:",self.netname, " By ",other.netname,"\n");
+     //bprint("Used:",self.netname, " By ",other.classname,"\n");
 
     self.team = activator.team;
 
@@ -742,38 +741,6 @@
     else
         self.tur_active = 1;
 
-    // ONS Uses _use to communicate.
-    //if (g_onslaught)
-    /*
-    if (1) // if anyone ever figures out why i needed a active toggle here, fix this
-    {
-        entity e;
-
-        if (self.targetname)
-        {
-            e = find(world,target,self.targetname);
-            if (e != world)
-                self.team = e.team;
-        }
-
-        if (self.team != self.tur_head.team)
-            turret_stdproc_respawn();
-
-        if(self.team == 0)
-            self.tur_active = 0;
-        else
-            self.tur_active = 1;
-
-    }
-    else
-    {
-        if (self.tur_active)
-            self.tur_active = 0;
-        else
-            self.tur_active = 1;
-    }
-    */
-
 }
 
 /*
@@ -1105,9 +1072,11 @@
 
     self.tur_active = 1;
 
-    if (g_onslaught)
-        self.use();
+    //if (g_onslaught)
+    //    self.use();
 
+    //turret_stdproc_use();
+
     return 1;
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,5 +1,31 @@
 //--// Some support routines //--//
 
+float shortangle_f(float ang1,float ang2)
+{
+    if(ang1 > ang2)
+    {
+        if(ang1 >= 180)
+            return ang1 - 360;
+    }
+    else
+    {
+        if(ang1 <= -180)
+            return ang1 + 360;
+    }
+
+    return ang1;
+}
+vector shortangle_v(vector ang1,vector ang2)
+{
+    vector vtmp;
+    vtmp_x = shortangle_f(ang1_x,ang2_x);
+    vtmp_y = shortangle_f(ang1_y,ang2_y);
+    vtmp_z = shortangle_f(ang1_z,ang2_z);
+
+    return vtmp;
+}
+
+
 // Get real origin
 vector real_origin(entity ent)
 {

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -39,7 +39,7 @@
     float d_score;      // Distance score
     //float da_score;     // Distance from aimpoint score
     float a_score;      // Angular score
-    float s_score;      // samescore (same target as last time)
+    //float s_score;      // samescore (same target as last time)
     float m_score;      // missile score
     float p_score;      // player score
 
@@ -47,7 +47,7 @@
 
     if(!e_target) return 0;
 
-    if (e_target == e_turret.enemy) s_score = 1;
+    //if (e_target == e_turret.enemy) s_score = 1;
 
     if (e_turret.tur_defend)
     {
@@ -84,13 +84,13 @@
         p_score = 1;
 
     d_score = max(d_score,0);
-    s_score = max(s_score,0);
+    //s_score = max(s_score,0);
     a_score = max(a_score,0);
     m_score = max(m_score,0);
     p_score = max(p_score,0);
 
+    // (s_score * e_turret.target_select_samebias) +
     score = (d_score * e_turret.target_select_rangebias) +
-            (s_score * e_turret.target_select_samebias) +
             (a_score * e_turret.target_select_anglebias) +
             (m_score * e_turret.target_select_missilebias) +
             (p_score * e_turret.target_select_playerbias);

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,15 +1,19 @@
 /**
     turret_checkpoint
-    Semi smart pathing system for move capable turrets.
 **/
 
-#define checkpoint_path swampslug
-#define checkpoint_target enemy
 
-#define checkpoint_cache_who flagcarried
+#define checkpoint_target goalstack03
+
+/*
+#define checkpoint_cache_who  flagcarried
 #define checkpoint_cache_from lastrocket
-#define checkpoint_cache_to selected_player
+#define checkpoint_cache_to   selected_player
+*/
 
+#define pathgoal    goalstack01
+#define pathcurrent goalstack02
+
 entity path_makeorcache(entity forwho,entity start, entity end)
 {
     entity oldself;
@@ -17,21 +21,14 @@
     oldself = self;
     self = forwho;
 
-    pth = pathlib_makepath(start.origin,end.origin,PLF_GROUNDSNAP,500,1.5);
+    pth = pathlib_makepath(start.origin,end.origin,PLF_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
+
     self = oldself;
     return pth;
 }
 
 void turret_checkpoint_use()
 {
-    if(other.checkpoint_path)
-        pathlib_deletepath(other.checkpoint_path);
-
-    other.checkpoint_path = world;
-
-    if(self.checkpoint_target)
-        other.checkpoint_path = path_makeorcache(other,self,self.checkpoint_target);
-
 }
 
 /*QUAKED turret_checkpoint (1 0 1) (-32 -32 -32) (32 32 32)
@@ -43,15 +40,21 @@
 If a loop is of targets are formed, any unit entering this loop will patrol it indefinitly.
 If the checkpoint chain in not looped, the unit will go "Roaming" when the last point is reached.
 */
-void spawnfunc_turret_checkpoint()
+void turret_checkpoint_init()
 {
     if(self.target != "")
     {
-        self.checkpoint_target = find(world,targetname,self.target);
-        if(!self.checkpoint_target)
+        self.enemy = find(world,targetname,self.target);
+        if(self.enemy == world)
             dprint("A turret_checkpoint faild to find its target!\n");
     }
+}
 
+void spawnfunc_turret_checkpoint()
+{
+    setorigin(self,self.origin);
+    self.think = turret_checkpoint_init;
+    self.nextthink = time + 0.25;
 }
 
 // Compat.

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -14,7 +14,7 @@
 #else
     RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }
@@ -26,7 +26,7 @@
     vector v;
     float f,i;
 
-    for(i=0;i<2;++i)
+    for (i=0;i<1;++i)
     {
         f = gettagindex(self.tur_head,"tag_fire");
         v = gettaginfo(self.tur_head,f);
@@ -34,7 +34,7 @@
         self.tur_shotorg = v;
         turret_do_updates(self);
 
-        sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", 1, ATTN_NORM);
+        sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
         pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg_updated, self.tur_shotdir_updated * 1000, 1);
 
         proj                    = spawn ();
@@ -56,61 +56,172 @@
         proj.enemy           = self.enemy;
         proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
-        self.tur_head.frame += 1;
+        self.tur_head.frame += 2;
 
         if (self.tur_head.frame > 3)
-        self.tur_head.frame = 0;
-        }
+            self.tur_head.frame = 0;
+    }
 
 }
 
-void ewheel_postthink()
+#define EWHEEL_MASS 50
+#define EWHEEL_MAXSPEED 1500
+#define EWHEEL_ACCEL_SLOW 50
+#define EWHEEL_ACCEL_FAST 150
+#define EWHEEL_BREAK_SLOW 100
+#define EWHEEL_BREAK_FAST 250
+
+void ewheel_enemymove()
 {
-    vector wish_angle,real_angle;
-    float turn_limit;
+    vector wish_angle,real_angle,steer,avoid;
+    float turn_limit,angle_ofs;
 
-    if (!self.enemy)
+    //steer = steerlib_attract2(point,0.5,2000,0.95);
+    steer = steerlib_pull(self.enemy.origin);
+    avoid = steerlib_traceavoid(0.3,350);
+
+    wish_angle = normalize(avoid * 0.5 + steer);
+    wish_angle = vectoangles(wish_angle);
+    real_angle = wish_angle - self.angles;
+
+    if (real_angle_x > self.angles_x)
     {
-        self.velocity = '0 0 0';
-        return;
+        if (real_angle_x >= 180)
+            real_angle_x -= 360;
     }
+    else
+    {
+        if (real_angle_x <= -180)
+            real_angle_x += 360;
+    }
 
-    wish_angle = normalize(self.enemy.origin - self.origin);
+    if (real_angle_y > self.tur_head.angles_y)
+    {
+        if (real_angle_y >= 180)
+            real_angle_y -= 360;
+    }
+    else
+    {
+        if (real_angle_y <= -180)
+            real_angle_y += 360;
+    }
+
+    turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
+    // Convert from dgr / sec to dgr / tic
+    turn_limit    = turn_limit / (1 / self.ticrate);
+    angle_ofs     = fabs(real_angle_y);
+    real_angle_y  = bound(turn_limit * -1,real_angle_y,turn_limit);
+    self.angles_y = (self.angles_y + real_angle_y);
+
+    // Simulate banking
+    self.angles_z = bound(-45,real_angle_y * -1,45);
+
+
+    if (self.frame > 40)
+        self.frame = 1;
+
+    makevectors(self.angles);
+
+    if (self.tur_dist_enemy > self.target_range_optimal)
+    {
+        if ( angle_ofs < 10 )
+        {
+            self.frame += 2;
+            movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,0,EWHEEL_MASS,0);
+        }
+        else if (angle_ofs < 16)
+        {
+            self.frame += 0.5;
+            movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
+        }
+        else
+        {
+            movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);
+        }
+    }
+    else
+        movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);
+}
+
+void ewheel_roammove()
+{
+    movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
+    self.angles_z = 0;
+
+    /*
+    vector wish_angle,real_angle,steer,avoid;
+    float turn_limit,angle_ofs;
+    float dist;
+
+    return;
+
+    dist = vlen(self.origin - self.pos1);
+
+    //steer = steerlib_attract2(point,0.5,2000,0.95);
+    steer = steerlib_pull(self.pos1);
+    avoid = steerlib_traceavoid(0.3,350);
+
+    wish_angle = normalize(avoid * 0.5 + steer);
     wish_angle = vectoangles(wish_angle);
     real_angle = wish_angle - self.angles;
 
-    if (real_angle_y < 0) real_angle_y += 360;
-    if (real_angle_y > 180) real_angle_y -= 360;
+    real_angle_y = shortangle_f(real_angle_y,self.angles_y);
 
     turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
     // Convert from dgr/sec to dgr/tic
     turn_limit  = turn_limit / (1 / self.ticrate);
+    angle_ofs = fabs(real_angle_y);
+
     real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);
-    self.angles_y = self.angles_y + real_angle_y;
-    self.angles_z = bound(-10,real_angle_y * -1,10);
+    self.angles_y = (self.angles_y + real_angle_y);
 
+    self.angles_z = bound(-12,real_angle_y * -1,12);
+
     if(self.frame > 40)
         self.frame = 1;
 
-    self.angles_z = 0;
-    if(self.tur_dist_enemy > self.target_range_optimal)
+    makevectors(self.angles);
+    float lspeed;
+    lspeed = vlen(self.velocity);
+
+    if((dist < 64)||(self.phase < time))
     {
-        self.angles_z = bound(-15,real_angle_y * -1,15);
-        makevectors(self.angles);
-        self.velocity = v_forward * 250;
-        self.frame += 2;
-        return;
+        movelib_move('0 0 0',150,0,50,200);
+        self.pos1 = self.origin + v_forward * 256 + randomvec() * 128;
+        self.pos1_z = self.origin_z;
+        self.phase = time + 5;
     }
+    else if(dist < 128)
+    {
+        self.frame += 1;
+        if(lspeed > 100)
+            movelib_move(v_forward * 50,150,0,50,50);
+        else
+            movelib_move(v_forward * 100,150,0,50,0);
+    }
+    else
+    {
+        self.frame += 1;
+        if(angle_ofs > 10)
+            movelib_move(v_forward * 50,150,0,50,50);
+        else
+            movelib_move(v_forward * 250,150,0,50,0);
+    }
+    */
+}
 
-    self.velocity = '0 0 0';
+void ewheel_postthink()
+{
+    if (self.enemy)
+        ewheel_enemymove();
+    else
+        ewheel_roammove();
 
-
 }
 
+
 void ewheel_respawnhook()
 {
-
-
     setorigin(self,self.pos1);
 
     //self.angles = self.wkr_spawn.angles;
@@ -165,6 +276,7 @@
     //self.flags      = FL_CLIENT;
     self.iscreature = TRUE;
     self.movetype   = MOVETYPE_WALK;
+    self.gravity = 0.01;
     self.solid      = SOLID_SLIDEBOX;
     self.takedamage = DAMAGE_AIM;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -9,7 +9,7 @@
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
     setmodel(proj, "models/turrets/pd_proj.md3");
@@ -43,11 +43,11 @@
 
     ftmp = crandom();
     if (ftmp<-0.7)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+        sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
     else if (ftmp<0.4)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+        sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
     else if (ftmp<1)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+        sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
 
 
     self.event_damage = SUB_Null;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -27,11 +27,10 @@
 {
     local entity missile;
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile = spawn ();
     setorigin(missile, self.tur_shotorg_updated);
-    sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
     setmodel (missile, "models/turrets/mlrs_rocket.md3"); // precision set below
     setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
 
@@ -57,6 +56,9 @@
     missile.tur_aimpos         = randomvec() * 128;
     te_explosion (missile.origin);
 
+	CSQCProjectile(missile, FALSE, PROJECTILE_ROCKET);
+	missile.effects |= EF_NODEPTHTEST; // projectile has a fly sound
+
     // switch tubes
     self.tur_shotorg_y = self.tur_shotorg_y * -1;
 
@@ -142,6 +144,8 @@
         self.think = turret_hellion_missile_explode;
         self.nextthink = time + itime;
     }
+
+	UpdateCSQCProjectile(self);
 }
 
 void turret_hellion_missile_explode()
@@ -157,7 +161,7 @@
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     org2 = findbetterlocation (self.origin, 16);
 
     // LordHavoc: TE_TEI_BIGEXPLOSION

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -85,13 +85,12 @@
     local entity missile;
     //local entity flash2;
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile                    = spawn ();
     missile.solid            = SOLID_BBOX;
     setmodel (missile, "models/turrets/hunter2.md3"); // precision set below
-    setsize (missile, missile.mins,missile.maxs); // give it some size so it can be shot
-    sound    (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+    setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
     setorigin(missile, self.tur_shotorg_updated);
 
     missile.scale            = 1;
@@ -116,6 +115,9 @@
     missile.cnt              = time + 30;
     missile.ticrate          = max(cvar("sys_ticrate"),0.05);
 
+	CSQCProjectile(missile, FALSE, PROJECTILE_ROCKET);
+	missile.effects |= EF_NODEPTHTEST; // projectile has a fly sound
+
     te_explosion (missile.origin);
 
     if (self.tur_head.frame == 0)
@@ -304,7 +306,7 @@
         self.cnt = time + 0.25;
         self.nextthink = 0;
         self.movetype         = MOVETYPE_BOUNCE;
-        sound    (self, CHAN_VOICE, "", 0.4, ATTN_NORM);
+        sound    (self, CHAN_VOICE, "", 0.4 * VOL_BASE, ATTN_NORM);
         return;
     }
 
@@ -344,6 +346,8 @@
     self.atime = time + 0.2;
     //}
 #endif
+
+	UpdateCSQCProjectile(self);
 }
 
 void turret_hk_missile_explode()
@@ -363,7 +367,7 @@
         return;
 
     //vector	org2;
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     org2 = findbetterlocation (self.origin, 16);
 
     // LordHavoc: TE_TEI_BIGEXPLOSION

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -7,7 +7,7 @@
 {
 
     entity flash;
-    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
     fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
 
     te_smallflash(self.tur_shotorg_updated);

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -20,12 +20,11 @@
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile                    = spawn ();
     setmodel (missile, "models/turrets/rocket.md3"); // precision set below
     setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
-    sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
     setorigin(missile, self.tur_shotorg_updated);
     missile.classname          = "mlrs_missile";
     missile.owner              = self;
@@ -46,6 +45,9 @@
     missile.solid              = SOLID_BBOX;
     missile.enemy              = self.enemy;
 
+	CSQCProjectile(missile, TRUE, PROJECTILE_ROCKET);
+	missile.effects |= EF_NODEPTHTEST; // projectile has a fly sound
+
     te_explosion (missile.origin);
 
     //self.tur_head.frame = 7 - self.volly_counter;
@@ -64,7 +66,7 @@
     }
 
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     org2 = findbetterlocation (self.origin, 16);
     pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -35,12 +35,12 @@
 
 void beam_think()
 {
-    if ((time > self.cnt)||(self.owner.deadflag != DEAD_NO))
+    if ((time > self.cnt) || (self.owner.deadflag != DEAD_NO))
     {
         self.owner.attack_finished_single = time + self.owner.shot_refire;
         self.owner.fireflag = 2;
         self.owner.tur_head.frame = 10;
-        sound (self, CHAN_PROJECTILE, "", 1, ATTN_NORM);
+        sound (self, CHAN_PROJECTILE, "", VOL_BASE, ATTN_NORM);
         remove(self);
         return;
     }
@@ -50,7 +50,7 @@
     if (time - self.shot_spread > 0)
     {
         self.shot_spread = time + 2;
-        sound (self, CHAN_VOICE, "turrets/phaser.ogg", 1, ATTN_NORM);
+        sound (self, CHAN_VOICE, "turrets/phaser.ogg", VOL_BASE, ATTN_NORM);
     }
 
 
@@ -93,7 +93,7 @@
     beam.enemy = self.enemy;
     beam.bot_dodge = TRUE;
     beam.bot_dodgerating = beam.shot_dmg;
-    sound (beam, CHAN_PROJECTILE, "turrets/phaser.ogg", 1, ATTN_NORM);
+    sound (beam, CHAN_PROJECTILE, "turrets/phaser.ogg", VOL_BASE, ATTN_NORM);
     self.fireflag = 1;
 
     beam.attack_finished_single = self.attack_finished_single;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -32,7 +32,7 @@
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg_updated, self.tur_shotdir_updated * 1000, 1);
 
     proj                    = spawn ();
@@ -69,7 +69,7 @@
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj                    = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
     setsize(proj, '0 0 0', '0 0 0');
@@ -125,7 +125,7 @@
 #else
     RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,3 +1,5 @@
+//#define rocket_rack tur_head.enemy
+
 #define ANIM_NO 0
 #define ANIM_WALK 1
 #define ANIM_RUN 1.1
@@ -8,6 +10,7 @@
 #define ANIM_LAND 5
 #define ANIM_PAIN 6
 #define ANIM_MEELE 7
+
 .float animflag;
 
 .entity wkr_props;
@@ -27,33 +30,29 @@
 .entity goalstack28, goalstack29, goalstack30, goalstack31;
 */
 
+
 float walker_firecheck()
 {
-    if (!turret_stdproc_firecheck()) return 0;
-    //if(self.tur_cannon.frame != 0) return 0;
-
-    //if(self.walking  == 1) self.walking = 2;
-    //if(self.walking != 0)
-    //    return 0;
-
-    return 1;
+    return turret_stdproc_firecheck();
 }
 
-void walker_meele_dmg()
+void walker_meele_do_dmg()
 {
     vector where;
     entity e;
-
     makevectors(self.angles);
     where = self.origin + v_forward * 128;
 
-    e = findradius(where,80);
+    e = findradius(where,128);
     while (e)
     {
         if (turret_validate_target(self,e,self.target_validate_flags))
             if (e != self)
-                Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg "),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );
+            {
+                //bprint(self.netname, " is meele hitting ",e.netname,"\n");
+                Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg"),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );
 
+            }
         e = e.chain;
     }
 }
@@ -61,27 +60,22 @@
 void walker_animate()
 {
 
-    if (self.tur_head.frame != 0)
-        self.tur_head.frame = self.tur_head.frame +1;
-
-    if (self.tur_head.frame > 12)
-        self.tur_head.frame = 0;
-
-
     switch (self.animflag)
     {
     case ANIM_NO:
-        //if(self.frame != 0)
-        //    self.frame = 0;
+        if(self.frame != 0)
+            self.frame = 0;
         break;
 
     case ANIM_WALK:
         self.frame = self.frame + 1;
         if (self.frame > 25)
             self.frame = 5;
+
         break;
 
     case ANIM_RUN:
+
         self.frame = self.frame + 2;
         if (self.frame > 25)
             self.frame = 5;
@@ -114,7 +108,7 @@
         break;
 
     case ANIM_PAIN:
-        if (self.frame < 90) self.frame = 90;
+        if (self.frame < 60) self.frame = 90;
         self.frame = self.frame + 1;
         if (self.frame > 95)
             self.animflag = ANIM_NO;
@@ -125,7 +119,7 @@
         self.frame = self.frame + 1;
 
         if (self.frame == 133)
-            walker_meele_dmg();
+            walker_meele_do_dmg();
 
         if (self.frame > 140)
             self.animflag = ANIM_NO;
@@ -133,6 +127,7 @@
     }
 }
 
+
 void walker_rocket_explode()
 {
     vector org2;
@@ -145,14 +140,10 @@
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
     org2 = findbetterlocation (self.origin, 16);
 
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
+    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
 
     RadiusDamage (self, self.owner, cvar("g_turrets_unit_walker_std_rocket_dmg"), 0, cvar("g_turrets_unit_walker_std_rocket_radius"), world, cvar("g_turrets_unit_walker_std_rocket_force"), DEATH_TURRET, world);
 
@@ -166,17 +157,8 @@
     if (self.health <= 0) walker_rocket_explode();
 }
 
-
-/*
-g_turrets_unit_walker_std_rocket_refire
-g_turrets_unit_walker_std_rocket_dmg
-g_turrets_unit_walker_std_rocket_radius
-g_turrets_unit_walker_std_rocket_force
-g_turrets_unit_walker_std_rocket_tunrate
-g_turrets_unit_walker_std_rocket_speed
-g_turrets_unit_walker_std_rocket_speed_add
-*/
-
+//#define WALKER_ROCKET_MOVE movelib_move(newdir * 275,900,0.1,10)
+#define WALKER_ROCKET_MOVE movelib_move_simple(newdir,1000,cvar("g_turrets_unit_walker_std_rocket_tunrate")); UpdateCSQCProjectile(self)
 void walker_rocket_loop();
 void walker_rocket_think()
 {
@@ -218,7 +200,6 @@
 
     olddir = normalize(self.velocity);
 
-    // Accelerate
     m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
 
     // Enemy dead? just keep on the current heading then.
@@ -234,33 +215,36 @@
 
     if (self.enemy)
     {
-        // Predict enemy position
         itime = max(edist / m_speed,1);
-        newdir = normalize((self.enemy.origin + self.tur_shotorg) - self.origin);
+        newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);
     }
     else
     {
-        //pre_pos = self.origin + olddir;
         newdir  = olddir;
     }
 
-    // Turn
-    newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
+    WALKER_ROCKET_MOVE;
 
-    self.velocity = newdir * m_speed;
 
     // Turn model
     self.angles = vectoangles(self.velocity);
 
-    if (time+itime < time+0.1)
+    if (time + itime < time + 0.1)
     {
-        self.think = turret_hellion_missile_explode;
+        self.think = walker_rocket_explode;
         self.nextthink = time + itime;
     }
 }
 
 void walker_rocket_loop3()
 {
+    if (self.tur_health < time)
+    {
+        self.think = walker_rocket_explode;
+        self.nextthink = time;
+        return;
+    }
+
     self.nextthink = time + 0.1;
 
     if (vlen(self.origin - self.tur_shotorg) < 128 )
@@ -270,22 +254,24 @@
     }
 
     vector newdir;
-    vector olddir;
-    float m_speed;
 
-    m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
-    olddir = normalize(self.velocity);
-    newdir = normalize(self.tur_shotorg  - self.origin);
-    newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
+    newdir = steerlib_pull(self.tur_shotorg);
+    WALKER_ROCKET_MOVE;
 
-    self.velocity = newdir * m_speed;
     self.angles = vectoangles(self.velocity);
 }
 
 void walker_rocket_loop2()
 {
-    self.nextthink = time + 0;
+    if (self.tur_health < time)
+    {
+        self.think = walker_rocket_explode;
+        self.nextthink = time;
+        return;
+    }
 
+    self.nextthink = time;
+
     if (vlen(self.origin - self.tur_shotorg) < 128 )
     {
         self.tur_shotorg = self.origin - '0 0 200';
@@ -294,21 +280,16 @@
     }
 
     vector newdir;
-    vector olddir;
-    float m_speed;
 
-    m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
-    olddir = normalize(self.velocity);
-    newdir = normalize(self.tur_shotorg  - self.origin);
-    newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
-    self.velocity = newdir * m_speed;
+    newdir = steerlib_pull(self.tur_shotorg);
+    WALKER_ROCKET_MOVE;
+
     self.angles = vectoangles(self.velocity);
 
 }
 
 void walker_rocket_loop()
 {
-
     self.nextthink= time + 0;
     self.tur_shotorg = self.origin + '0 0 400';
     self.think = walker_rocket_loop2;
@@ -328,8 +309,7 @@
     rocket = spawn ();
     setorigin(rocket, org);
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
-    sound (rocket, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     setmodel (rocket, "models/turrets/rocket.md3"); // precision set below
     setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
 
@@ -352,33 +332,45 @@
 
     rocket.event_damage       = walker_rocket_damage;
 
-    rocket.nextthink          = time + 0.2;
+    rocket.nextthink          = time + 0.25;
     rocket.solid              = SOLID_BBOX;
     rocket.movetype           = MOVETYPE_FLYMISSILE;
     rocket.effects            = EF_LOWPRECISION;
-    rocket.velocity           = ((v_forward + v_up * 0.35) +(randomvec() * 0.15))* cvar("g_turrets_unit_walker_std_rocket_speed");
+    rocket.velocity           = ((v_forward + v_up * 0.25) +(randomvec() * 0.1))* cvar("g_turrets_unit_walker_std_rocket_speed");
     rocket.angles             = vectoangles(rocket.velocity);
     rocket.touch              = walker_rocket_explode;
     rocket.flags              = FL_PROJECTILE;
     rocket.solid              = SOLID_BBOX;
     rocket.tur_health         = time + 9;
 
+	CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET);
+	rocket.effects |= EF_NODEPTHTEST; // projectile has a fly sound
+
     te_explosion (rocket.origin);
 
 }
 
+/*
 #define s_turn 10
 #define s_walk 100
 #define s_run 300
 #define s_accel1 8
 #define s_accel2 16
 #define s_decel 8
+*/
 
 void rv_think()
 {
     float f;
     vector org;
+    entity oldself;
 
+    if(self.owner.deadflag != DEAD_NO)
+    {
+        remove(self);
+        return;
+    }
+
     self.cnt = self.cnt -1;
 
     if (self.cnt < 0)
@@ -395,233 +387,198 @@
     org = self.owner.origin + gettaginfo(self.owner,f);
 
 
+
     self.nextthink = time + 0.2;
+    oldself = self;
     self = self.owner;
     walker_fire_rocket(org);
+    self=oldself;
 }
 
+/*
+void acb_run()
+{
+    //bprint("run\n");
+    animation_set(self,5,25,40,AF_ENDCALLBACK,5);
+}
+void acb_walk()
+{
+    bprint("walk\n");
+    animation_set(self,5,25,20,AF_ENDCALLBACK,5);
+}
+void acb_meele()
+{
+    walker_do_meele();
+}
+
+void set_acb(void() acb_func)
+{
+    self.animator_callback = acb_func;
+    if(animation_query(self) != AS_RUNNING)
+    {
+        bprint("Not running\n");
+        acb_func();
+    }
+    else
+    {
+        if not(self.animator.anim_flags & AF_ENDCALLBACK)
+            self.animator.anim_flags = self.animator.anim_flags | AF_ENDCALLBACK;
+    }
+}
+*/
+
 void walker_postthink()
 {
     vector wish_angle;
     vector real_angle;
-    float turn_limit;
+    vector steer;
+    float vel;
 
-    if ((self.flags & FL_ONGROUND)&&(self.animflag != ANIM_MEELE))
-        self.animflag = ANIM_NO;
+    //if (self.flags & FL_ONGROUND)
+    //if (self.animflag != ANIM_MEELE)
+    //    self.animflag = ANIM_NO;
 
+    if (self.tur_head.attack_finished_single < time)
     if (self.enemy)
-        if (self.tur_head.attack_finished_single < time)
-        {
-            entity rv;
-            rv = spawn();
-            rv.think = rv_think;
-            rv.nextthink = time;
-            rv.cnt = 4;
-            rv.owner = self;
+    {
+        entity rv;
 
-            self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
-        }
+        rv = spawn();
+        rv.think = rv_think;
+        rv.nextthink = time;
+        rv.cnt = 4;
+        rv.owner = self;
 
+        self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
+    }
 
-    if (self.checkpoint_path)
+    // Do we have a path?
+    if (self.pathcurrent)
     {
-        if (vlen(self.origin  - self.goalcurrent.origin) < 64)
-            if (self.goalcurrent.path_next == world)
+        //set_acb(acb_walk);
+        self.animflag = ANIM_WALK;
+
+        // Are we close enougth to a path node to switch to the next?
+        if (vlen(self.origin  - self.pathcurrent.origin) < 64)
+            if (self.pathcurrent.path_next == world)
             {
+                // Path endpoint reached
+                pathlib_deletepath(self.pathcurrent.owner);
+                self.pathcurrent = world;
 
-                self.checkpoint_path = world; // Path endpoint reached, go roaming.
+                if(self.pathgoal)
+                {
+                    if(self.pathgoal.use)
+                        self.pathgoal.use();
+
+                    if(self.pathgoal.enemy)
+                    {
+                        self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PLF_GROUNDSNAP,1500,2,PT_QUICKBOX);
+                        self.pathgoal = self.pathgoal.enemy;
+                    }
+                }
+                else
+                    self.pathgoal = world;
             }
             else
-                self.goalcurrent = self.goalcurrent.path_next;
+                self.pathcurrent = self.pathcurrent.path_next;
 
-        self.animflag = ANIM_WALK;
+        steer = steerlib_attract2(self.pathcurrent.origin,0.5,2000,0.95);
+        vel = 150;
     }
     else // Roaming mode
     {
-
         if (self.enemy)
         {
-            wish_angle = angleofs(self,self.enemy); //normalize(self.origin-self.enemy.origin);
+            wish_angle = angleofs(self,self.enemy);
+            steer = steerlib_pull(self.enemy.origin);
 
             if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
             {
-
                 if (fabs(wish_angle_y) < 15)
+                {
+                    vel = 0;
+                    //set_acb(acb_meele);
+                    //walker_do_meele();
                     self.animflag = ANIM_MEELE;
+                    return;
+                }
             }
             else
             {
                 if (fabs(wish_angle_y) < 15)
+                {
+                    //set_acb(acb_run);
                     self.animflag = ANIM_RUN;
+                    vel = 300;
+                }
                 else if (fabs(wish_angle_y) < 30)
+                {
+                    //set_acb(acb_walk);
                     self.animflag = ANIM_WALK;
+                    vel = 150;
+                }
                 else
-                    self.animflag = ANIM_TURN;
+                {
+                    //set_acb(acb_walk);
+                    self.animflag = ANIM_WALK;
+                    vel = 50;
+                }
             }
-
         }
         else
+        {
+            vel = 0;
+
             if(self.animflag != ANIM_MEELE)
                 self.animflag = ANIM_NO;
+        }
     }
 
+    // Align the walker to the ground
 
-    float s_speed;
+    self.angles_x = self.angles_x  * -1;
+    makevectors(self.angles);
+    self.angles_x = self.angles_x  * -1;
 
-    s_speed = vlen(self.velocity);
+    traceline(self.origin + '0 0 15', self.origin - '0 0 150' ,MOVE_WORLDONLY,self);
+    wish_angle = (trace_endpos);
+    traceline(self.origin  + v_forward * 10 + '0 0 15', self.origin + v_forward * 10 - '0 0 150' ,MOVE_WORLDONLY,self);
+    real_angle = vectoangles(normalize( trace_endpos - wish_angle));
 
-    // Turn on the spot
-    if (self.animflag == ANIM_TURN)
-    {
-        if (self.enemy)
-            wish_angle = normalize(self.enemy.origin - self.origin);
-        else
-            wish_angle = normalize(self.goalcurrent.origin - self.origin);
+    self.angles_x = real_angle_x;
+    self.angles_z = real_angle_z;
 
-        wish_angle = vectoangles(wish_angle);
-
-        real_angle = wish_angle - self.angles;
-
-        if (real_angle_x < 0) real_angle_x += 360;
-        if (real_angle_x > 180) real_angle_x -= 360;
-
-        if (real_angle_y < 0) real_angle_y += 360;
-        if (real_angle_y > 180) real_angle_y -= 360;
-
-        turn_limit = cvar("g_turrets_unit_walker_turn_turnrate");
-        // Convert from dgr/sec to dgr/tic
-        turn_limit  = turn_limit / (1 / self.ticrate);
-
-        //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
-        real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
-
-        self.angles_y = self.angles_y + real_angle_y;
-
-        if (self.enemy)
-            v_forward = normalize(self.enemy.origin - self.origin);
-        else
-            v_forward = normalize(self.goalcurrent.origin - self.origin);
-
-        makevectors(self.angles);
-
-        if (s_speed > s_turn)
-            self.velocity = (v_forward * max((s_speed - s_decel),s_turn));
-        if (s_speed < s_turn)
-            self.velocity = (v_forward * min((s_speed + s_accel1),s_turn));
+    if(vel == 0)
+    {
+        self.velocity = '0 0 0';
+        //animator_remove(self);
     }
-    else if (self.animflag == ANIM_WALK) // Gg walking
+    else
     {
-        if (self.goalcurrent)
-            wish_angle = normalize(self.goalcurrent.origin - self.origin);
-        else
-            if (self.enemy)
-                wish_angle = normalize(self.enemy.origin - self.origin);
-            else
-                wish_angle = self.angles;
+        steer  = steer * 0.5  + steerlib_traceavoid(0.3,256);
+        float vz;
+        vz = self.velocity_z;
+        movelib_move_simple(steer * 200,vel,0.5);
+        self.velocity_z = vz;
 
+        wish_angle = vectoangles(self.velocity);
 
-        wish_angle = vectoangles(wish_angle);                  // And make a angle
         real_angle = wish_angle - self.angles;
 
-        if (real_angle_x < 0) real_angle_x += 360;
-        if (real_angle_x > 180) real_angle_x -= 360;
+        real_angle_y = shortangle_f(real_angle_y,self.angles_y);
 
-        if (real_angle_y < 0) real_angle_y += 360;
-        if (real_angle_y > 180) real_angle_y -= 360;
-
-        turn_limit = cvar("g_turrets_unit_walker_walk_turnrate");
-        // Convert from dgr/sec to dgr/tic
-        turn_limit  = turn_limit / (1 / self.ticrate);
-
-        //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
-        real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
-
-        self.angles_y = self.angles_y + real_angle_y;
-
-        if (self.goalcurrent)
-            v_forward = normalize(self.goalcurrent.origin - self.origin);
-        else
-            if (self.enemy)
-                v_forward = normalize(self.enemy.origin - self.origin);
-
-        makevectors(self.angles);
-        self.velocity = v_forward * s_walk;
-
-        //if(self.flags & FL_ONGROUND)
-        /*
-        {
-            float s_z;
-            s_z = self.velocity_z;
-            if(s_speed > s_walk)
-                self.velocity = (v_forward * max((s_speed - s_decel),s_walk));
-            if(s_speed <= s_walk)
-                self.velocity = (v_forward * min((s_speed + s_accel1),s_walk));
-            self.velocity_z = s_z;//s_walk;
-        }
-        */
-
-
+        self.angles_y = self.angles_y + bound(-5,real_angle_y,5);
     }
-    else if (self.animflag == ANIM_RUN) // Move fast, turn slow
-    {
-        if (self.goalcurrent)
-            wish_angle = normalize(self.goalcurrent.origin - self.origin);
-        else
-            if (self.enemy)
-                wish_angle = normalize(self.enemy.origin - self.origin);
-            else
-                wish_angle = self.angles;
+    walker_animate();
 
-        wish_angle = vectoangles(wish_angle);                  // And make a angle
-        real_angle = wish_angle - self.angles;
+    if (self.tur_head.frame != 0)
+        self.tur_head.frame = self.tur_head.frame +1;
 
-        if (real_angle_x < 0) real_angle_x += 360;
-        if (real_angle_x > 180) real_angle_x -= 360;
+    if (self.tur_head.frame > 12)
+        self.tur_head.frame = 0;
 
-        if (real_angle_y < 0) real_angle_y += 360;
-        if (real_angle_y > 180) real_angle_y -= 360;
 
-        turn_limit = cvar("g_turrets_unit_walker_run_turnrate");
-        // Convert from dgr/sec to dgr/tic
-        turn_limit  = turn_limit / (1 / self.ticrate);
-
-        //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
-        real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
-
-        self.angles_y = self.angles_y + real_angle_y;
-
-
-        if (self.enemy)
-            v_forward = normalize(self.enemy.origin - self.origin);
-        else
-            v_forward = normalize(self.goalcurrent.origin - self.origin);
-
-        makevectors(self.angles);
-
-        if (self.flags & FL_ONGROUND)
-        {
-            if (s_speed > s_run)
-                self.velocity = (v_forward * max((s_speed - s_decel),s_run));
-            if (s_speed <= s_run)
-                self.velocity = (v_forward * min((s_speed + s_accel2),s_run));
-        }
-    }
-    else
-    {
-
-        if (self.flags & FL_ONGROUND)
-        {
-            makevectors(self.angles);
-            if (s_speed > 0)
-                self.velocity = min(s_speed - s_decel,0) * v_forward;
-        }
-    }
-
-
-
-    walker_animate();
-
-
 }
 
 void walker_attack()
@@ -632,7 +589,7 @@
 
     self.tur_head.frame = self.tur_head.frame + 1;
 
-    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
+    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
 
 
     fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
@@ -659,11 +616,14 @@
     self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
 }
 
+
 void walker_respawnhook()
 {
     vector vtmp;
     entity e;
 
+    //load_unit_settings(self.rocket_rack,"walker_std_rocket",1);
+
     self.origin = self.wkr_spawn.origin;
     self.wkr_props.solid = SOLID_BBOX;
     self.wkr_props.alpha = 1;
@@ -680,46 +640,48 @@
         {
             bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
             self.target = "";
-
-            //remove(self);
-            //return;
         }
 
         if (e.classname != "turret_checkpoint")
             dprint("Warning: not a turrret path\n");
         else
-            self.goalcurrent = e;
+        {
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathgoal = e;
+        }
     }
 }
 void walker_diehook()
 {
+    //animator_remove(self);
 
+    if(self.pathcurrent)
+        pathlib_deletepath(self.pathcurrent.owner);
+
+    self.pathcurrent = world;
+
     self.wkr_props.solid = SOLID_NOT;
     self.wkr_props.alpha = -1;
+
+    if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
+    {
+
+        remove(self.wkr_props);
+        //remove(self.rocket_rack);
+        remove(self.wkr_spawn);
+    }
+
 }
 
 //.string target_start;
 void turret_walker_dinit()
 {
-    if (self.netname == "")      self.netname     = "Walker Turret";
 
-    /*
-    if (self.target != "")
-    {
-        e = find(world,targetname,self.target);
-        if (!e)
-        {
-            bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
-            self.target = "";
-        }
+    entity e;
 
-        if (e.classname != "turret_checkpoint")
-            dprint("Warning: not a turrret path\n");
-        else
-            self.goalcurrent = e;
-    }
-    */
+    if (self.netname == "")      self.netname     = "Walker Turret";
 
+
     self.wkr_props = spawn();
     self.wkr_spawn = spawn();
 
@@ -754,6 +716,7 @@
     self.wkr_spawn.angles   = self.angles;
     self.wkr_spawn.solid    = SOLID_NOT;
 
+
     traceline(self.wkr_spawn.origin + '0 0 10', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
     setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
 
@@ -773,7 +736,7 @@
     //setsize(self,'-70 -70 0','70 70 55');
 
     self.tur_shotorg = v;
-    self.tur_aimorg  = v;
+    self.tur_aimorg  = v;// + '0 0 10';
 
     self.idle_aim = '0 0 0';
 
@@ -786,6 +749,26 @@
 
     self.turret_postthink = walker_postthink;
 
+    if (self.target != "")
+    {
+        e = find(world,targetname,self.target);
+        if (!e)
+        {
+            bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
+            self.target = "";
+        }
+
+        if (e.classname != "turret_checkpoint")
+            dprint("Warning: not a turrret path\n");
+        else
+        {
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathgoal = e;
+        }
+    }
+
+    //self.solid    = SOLID_NOT;
+
 }
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -6,13 +6,17 @@
 
 void W_Campingrifle_ReloadedAndReady()
 {
+	float t;
 	self.campingrifle_bulletcounter = 0;
-	ATTACK_FINISHED(self) = time;
+	t = ATTACK_FINISHED(self) - cvar("g_balance_campingrifle_reloadtime") + 1;
+	ATTACK_FINISHED(self) = t;
 	w_ready();
 }
 
 void W_Campingrifle_Reload()
 {
+	float t;
+
 	if (self.campingrifle_bulletcounter == 0)
 		return;
 	
@@ -27,7 +31,8 @@
 
 	sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
 
-	ATTACK_FINISHED(self) = time + cvar("g_balance_campingrifle_reloadtime") + 1;
+	t = max(time, ATTACK_FINISHED(self)) + cvar("g_balance_campingrifle_reloadtime") + 1;
+	ATTACK_FINISHED(self) = t;
 
 	weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_Campingrifle_ReloadedAndReady);
 }
@@ -46,7 +51,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_nails -= pAmmo;
 
-	W_SetupShot (self, '32 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
+	W_SetupShot (self, '32 8 -4', FALSE, 2, "weapons/campingrifle_fire.wav");
 	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
 
 	if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
@@ -58,7 +63,7 @@
 	fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
 
 	if (cvar("g_casings") >= 2)
-		SpawnCasing (w_shotorg + v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
+		SpawnCasing (w_shotorg - v_forward * 15, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
 	
 	self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
 }
@@ -130,22 +135,11 @@
 	}
 	else if (req == WR_PRECACHE)
 	{		
-		precache_model ("models/tracer.mdl");
 		precache_model ("models/weapons/g_campingrifle.md3");
 		precache_model ("models/weapons/v_campingrifle.md3");
 		precache_model ("models/weapons/w_campingrifle.zym");
 		precache_sound ("weapons/campingrifle_reload.wav");
-		precache_sound ("weapons/ric1.wav");
-		precache_sound ("weapons/ric2.wav");
-		precache_sound ("weapons/ric3.wav");
 		precache_sound ("weapons/campingrifle_fire.wav");
-		if (cvar("g_casings") >= 2)
-		{
-			precache_sound ("weapons/brass1.wav");
-			precache_sound ("weapons/brass2.wav");
-			precache_sound ("weapons/brass3.wav");
-			precache_model ("models/casing_bronze.mdl");
-		}
 	}
 	else if (req == WR_SETUP)
 	{
@@ -189,5 +183,9 @@
 			}
 		}
 	}
+	else if (req == WR_RELOAD)
+	{
+		W_Campingrifle_Reload();
+	}
 	return TRUE;
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -118,17 +118,13 @@
 {
 	float f;
 
-	if (DEATH_ISWEAPON(self.projectiledeathtype, WEP_SHOTGUN))
-		pointparticles(particleeffectnum("shotgun_impact"), self.origin, normalize(self.velocity) * 1000, 1);
-	else
-		pointparticles(particleeffectnum("machinegun_impact"), self.origin, normalize(self.velocity) * 1000, 1);
+	f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
 
+	if(other.solid == SOLID_BSP)
+		Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype);
+
 	if(other && other != self.enemy)
 	{
-		self.enemy = other; // don't hit the same player twice with the same bullet
-
-		f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
-
 		headshot = 0;
 		yoda = 0;
 		damage_headshotbonus = self.dmg_edge;
@@ -147,6 +143,8 @@
 
 		//sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 	}
+
+	self.enemy = other; // don't hit the same player twice with the same bullet
 }
 
 .void(void) W_BallisticBullet_LeaveSolid_think_save;
@@ -164,12 +162,15 @@
 	self.W_BallisticBullet_LeaveSolid_think_save = SUB_Null;
 
 	self.flags &~= FL_ONGROUND;
-	self.effects &~= EF_NODRAW;
 
-	if (DEATH_ISWEAPON(self.projectiledeathtype, WEP_SHOTGUN))
-		pointparticles(particleeffectnum("shotgun_impact"), self.origin, normalize(self.velocity) * 1000, 1);
-	else
-		pointparticles(particleeffectnum("machinegun_impact"), self.origin, normalize(self.velocity) * 1000, 1);
+	if(self.enemy.solid == SOLID_BSP)
+	{
+		float f;
+		f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
+		Damage_DamageInfo(self.origin, 0, 0, 0, self.dmg_force * normalize(self.velocity) * f, self.projectiledeathtype);
+	}
+	
+	UpdateCSQCProjectile(self);
 }
 
 // a fake logarithm function
@@ -233,7 +234,6 @@
 
 	self.velocity = '0 0 0';
 	self.flags |= FL_ONGROUND; // prevent moving
-	self.effects |= EF_NODRAW;
 	self.W_BallisticBullet_LeaveSolid_velocity = vel;
 
 	return 1;
@@ -261,6 +261,7 @@
 {
 	entity proj;
 	proj = spawn();
+	proj.classname = "bullet";
 	proj.owner = self;
 	proj.solid = SOLID_BBOX;
 	if(gravityfactor > 0)
@@ -277,10 +278,9 @@
 	proj.angles = vectoangles(proj.velocity);
 	proj.dmg_radius = cvar("g_ballistics_materialconstant") / bulletconstant;
 	// so: bulletconstant = bullet mass / area of bullet circle
-	setmodel(proj, "models/tracer.mdl");
+	setmodel(proj, "null");
 	setsize(proj, '0 0 0', '0 0 0');
 	setorigin(proj, start);
-	proj.effects = EF_LOWPRECISION | tracereffects;
 	proj.flags = FL_PROJECTILE;
 
 	proj.touch = W_BallisticBullet_Touch;
@@ -290,6 +290,11 @@
 	proj.projectiledeathtype = dtype;
 
 	proj.oldvelocity = proj.velocity;
+
+	if(tracereffects & EF_RED)
+		CSQCProjectile(proj, TRUE, PROJECTILE_BULLET_GLOWING);
+	else
+		CSQCProjectile(proj, TRUE, PROJECTILE_BULLET);
 }
 
 void fireBullet (vector start, vector dir, float spread, float damage, float force, float dtype, float tracer)
@@ -323,22 +328,18 @@
 		e.nextthink = time + vlen(trace_endpos - start) / 6000;
 		e.velocity = dir * 6000;
 		e.angles = vectoangles(e.velocity);
-		setmodel (e, "models/tracer.mdl"); // precision set below
+		setmodel (e, "null"); // precision set below
 		setsize (e, '0 0 0', '0 0 0');
 		setorigin (e, start);
-		e.effects = EF_LOWPRECISION;
 		e.flags = FL_PROJECTILE;
+
+		CSQCProjectile(e, TRUE, PROJECTILE_BULLET);
 	}
 
 	if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY))
 	{
 		if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-		{
-			if (DEATH_ISWEAPON(dtype, WEP_SHOTGUN))
-				pointparticles(particleeffectnum("shotgun_impact"), trace_endpos, trace_plane_normal * 1000, 1);
-			else
-				pointparticles(particleeffectnum("machinegun_impact"), trace_endpos, trace_plane_normal * 1000, 1);
-		}
+			Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * force, dtype);
 		Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,5 +1,4 @@
 .float gravity;
-const vector proj_color = '1 1 1';
 
 .entity realowner;
 
@@ -8,8 +7,6 @@
 	float finalhit;
 	float f;
 	PROJECTILE_TOUCH;
-	sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
-	pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1);
 	finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
 	if(finalhit)
 		f = 1;
@@ -28,6 +25,8 @@
 	self.owner = world;
 	self.projectiledeathtype |= HITTYPE_BOUNCE;
 	//self.scale = 1 + self.cnt;
+
+	UpdateCSQCProjectile(self);
 }
 
 void W_Crylink_Touch2 (void)
@@ -35,8 +34,6 @@
 	float finalhit;
 	float f;
 	PROJECTILE_TOUCH;
-	sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
-	pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
 	finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
 	if(finalhit)
 		f = 1;
@@ -55,6 +52,8 @@
 	self.owner = world;
 	self.projectiledeathtype |= HITTYPE_BOUNCE;
 //	self.scale = 1 + 1 * self.cnt;
+
+	UpdateCSQCProjectile(self);
 }
 
 void W_Crylink_Attack (void)
@@ -62,11 +61,15 @@
 	local float counter, shots;
 	local entity proj;
 	local vector s;
+	vector forward, right, up;
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
 
 	W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
+	forward = v_forward;
+	right = v_right;
+	up = v_up;
 
 	shots = cvar("g_balance_crylink_primary_shots");
 	pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
@@ -83,23 +86,22 @@
 		proj.projectiledeathtype = WEP_CRYLINK;
 		//proj.gravity = 0.001;
 
-		setmodel (proj, "models/plasmatrail.mdl"); // precision set below
+		setmodel (proj, "null"); // precision set below
 		setsize (proj, '0 0 0', '0 0 0');
 		setorigin (proj, w_shotorg);
 
+
 		s = '0 0 0';
 		if (counter == 0)
 			s = '0 0 0';
-		else if (counter == 1)
-			s = '0 0 1';
-		else if (counter == 2)
-			s = '0 -0.71 -0.71';
-		else if (counter == 3)
-			s = '0 0.71 -0.71';
 		else
-			s = randomvec();
+		{
+			makevectors('0 360 0' * (0.75 + (counter - 0.5) / (shots - 1)));
+			s_y = v_forward_x;
+			s_z = v_forward_y;
+		}
 		s = s * cvar("g_balance_crylink_primary_spread");
-		proj.velocity = (w_shotdir + v_right * s_y + v_up * s_z) * cvar("g_balance_crylink_primary_speed");
+		proj.velocity = (w_shotdir + right * s_y + up * s_z) * cvar("g_balance_crylink_primary_speed");
 //		proj.velocity = (w_shotdir + randomvec() * cvar("g_balance_crylink_primary_spread")) * cvar("g_balance_crylink_primary_speed");
 		W_SetupProjectileVelocity(proj);
 		proj.touch = W_Crylink_Touch;
@@ -110,15 +112,16 @@
 		else
 			SUB_SetFade(proj, time + cvar("g_balance_crylink_primary_other_lifetime"), cvar("g_balance_crylink_primary_other_fadetime"));
 		proj.cnt = cvar("g_balance_crylink_primary_bounces");
-		proj.scale = 1 + 1 * proj.cnt;
+		//proj.scale = 1 + 1 * proj.cnt;
 
 		proj.angles = vectoangles (proj.velocity);
 
 		//proj.glow_size = 20;
 
-		proj.effects = EF_LOWPRECISION;
 		proj.flags = FL_PROJECTILE;
-		proj.colormod = proj_color;
+
+		CSQCProjectile(proj, TRUE, PROJECTILE_CRYLINK);
+
 		counter = counter + 1;
 	}
 }
@@ -148,7 +151,7 @@
 		proj.projectiledeathtype = WEP_CRYLINK | HITTYPE_SECONDARY;
 		//proj.gravity = 0.001;
 
-		setmodel (proj, "models/plasmatrail.mdl"); // precision set below
+		setmodel (proj, "null"); // precision set below
 		setsize (proj, '0 0 0', '0 0 0');
 		setorigin (proj, w_shotorg);
 
@@ -160,15 +163,16 @@
 		else
 			SUB_SetFade(proj, time + cvar("g_balance_crylink_secondary_line_lifetime"), cvar("g_balance_crylink_secondary_line_fadetime"));
 		proj.cnt = cvar("g_balance_crylink_secondary_bounces");
-		proj.scale = 1 + 1 * proj.cnt;
+		//proj.scale = 1 + 1 * proj.cnt;
 
 		proj.angles = vectoangles (proj.velocity);
 
 		//proj.glow_size = 20;
 
-		proj.effects = EF_LOWPRECISION;
 		proj.flags = FL_PROJECTILE;
-		proj.colormod = proj_color;
+
+		CSQCProjectile(proj, TRUE, PROJECTILE_CRYLINK);
+
 		counter = counter + 1;
 	}
 }
@@ -224,15 +228,11 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/plasma.mdl");
-		precache_model ("models/plasmatrail.mdl");
 		precache_model ("models/weapons/g_crylink.md3");
 		precache_model ("models/weapons/v_crylink.md3");
 		precache_model ("models/weapons/w_crylink.zym");
 		precache_sound ("weapons/crylink_fire.wav");
 		precache_sound ("weapons/crylink_fire2.wav");
-		precache_sound ("weapons/crylink_impact.wav");
-		precache_sound ("weapons/crylink_impact2.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_CRYLINK);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,9 +1,6 @@
 
 void W_Plasma_Explode (void)
 {
-	vector org2;
-	org2 = findbetterlocation (self.origin, 8);
-
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
@@ -13,28 +10,17 @@
 	self.event_damage = SUB_Null;
 	if (self.movetype == MOVETYPE_BOUNCE)
 	{
-		pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
 		RadiusDamage (self, self.owner, cvar("g_balance_electro_secondary_damage"), cvar("g_balance_electro_secondary_edgedamage"), cvar("g_balance_electro_secondary_radius"), world, cvar("g_balance_electro_secondary_force"), self.projectiledeathtype, other);
 	}
 	else
 	{
-		pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 		RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), self.projectiledeathtype, other);
 	}
 
-	sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-
 	remove (self);
 }
 
 void W_Plasma_Explode_Combo (void) {
-	vector org2;
-
-	org2 = findbetterlocation (self.origin, 8);
-	pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
-
-	sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), WEP_ELECTRO | HITTYPE_BOUNCE, other); // use THIS type for a combo because primary can't bounce
 	remove (self);
@@ -42,18 +28,21 @@
 
 void W_Plasma_Touch (void)
 {
-	PROJECTILE_TOUCH_NOSOUND;
+	PROJECTILE_TOUCH;
 	if (other.takedamage == DAMAGE_AIM) {
 		W_Plasma_Explode ();
 	} else {
 		sound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
+
+	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
+		UpdateCSQCProjectile(self);
 }
 
 void W_Plasma_TouchExplode (void)
 {
-	PROJECTILE_TOUCH_NOSOUND;
+	PROJECTILE_TOUCH;
 	W_Plasma_Explode ();
 }
 
@@ -101,18 +90,19 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_primary_ammo");
-	proj.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
 	proj.movetype = MOVETYPE_FLY;
 	proj.velocity = w_shotdir * cvar("g_balance_electro_primary_speed");
 	W_SetupProjectileVelocity(proj);
 	proj.angles = vectoangles(proj.velocity);
 	proj.touch = W_Plasma_TouchExplode;
 	proj.flags = FL_PROJECTILE;
-	setmodel(proj, "models/elaser.mdl"); // precision set above
+	setmodel(proj, "null"); // precision set above
 	setsize(proj, '0 0 0', '0 0 0');
 
-	// LordHavoc: disabled because no one likes this sound and it sometimes never stops due to packet loss
-	//sound (proj, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+	//sound (proj, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+	//sounds bad
+
+	CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM);
 }
 
 void W_Electro_Attack2()
@@ -137,14 +127,13 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_secondary_ammo");
-	proj.effects = EF_LOWPRECISION;
 	//proj.glow_size = 50;
 	//proj.glow_color = 45;
 	proj.movetype = MOVETYPE_BOUNCE;
 	proj.velocity = (w_shotdir + randomvec() * cvar("g_balance_electro_secondary_spread")) * cvar("g_balance_electro_secondary_speed") + v_up * cvar("g_balance_electro_secondary_speed_up");
 	W_SetupProjectileVelocity(proj);
 	proj.touch = W_Plasma_Touch;
-	setmodel(proj, "models/ebomb.mdl"); // precision set above
+	setmodel(proj, "null"); // precision set above
 	setsize(proj, '0 0 -3', '0 0 -3');
 	proj.takedamage = DAMAGE_YES;
 	proj.damageforcescale = 4;
@@ -152,8 +141,8 @@
 	proj.event_damage = W_Plasma_Damage;
 	proj.flags = FL_PROJECTILE;
 
-	// LordHavoc: disabled because no one likes this sound and it sometimes never stops due to packet loss
-	//sound (proj, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+	CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO);
+	proj.effects = EF_NODEPTHTEST;
 }
 
 void spawnfunc_weapon_electro (void)
@@ -204,16 +193,12 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/ebomb.mdl");
-		precache_model ("models/elaser.mdl");
 		precache_model ("models/weapons/g_electro.md3");
 		precache_model ("models/weapons/v_electro.md3");
 		precache_model ("models/weapons/w_electro.zym");
 		precache_sound ("weapons/electro_bounce.wav");
 		precache_sound ("weapons/electro_fire.wav");
 		precache_sound ("weapons/electro_fire2.wav");
-		precache_sound ("weapons/electro_fly.wav");
-		precache_sound ("weapons/electro_impact.wav");
 		precache_sound ("weapons/electro_impact_combo.wav");
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,10 +1,5 @@
 void W_Grenade_Explode (void)
 {
-	vector	org2;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
-	sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
-
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
@@ -19,20 +14,15 @@
 
 void W_Grenade_Explode2 (void)
 {
-	vector	org2;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
-	sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
-
-	self.event_damage = SUB_Null;
-	RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other);
-
 	if(other.takedamage == DAMAGE_AIM)
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
 				if(IsFlying(other))
 					announce(self.owner, "announcer/male/airshot.wav");
 
+	self.event_damage = SUB_Null;
+	RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other);
+
 	remove (self);
 }
 
@@ -67,6 +57,9 @@
 			sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
+
+	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
+		UpdateCSQCProjectile(self);
 }
 
 void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -96,10 +89,8 @@
 	gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
 	gren.movetype = MOVETYPE_BOUNCE;
 	gren.solid = SOLID_BBOX;
-	gren.effects = EF_LOWPRECISION;
-	gren.modelflags = MF_TRACER2;
 	gren.projectiledeathtype = WEP_GRENADE_LAUNCHER;
-	setmodel(gren, "models/grenademodel.md3"); // precision set above
+	setmodel(gren, "null"); // precision set above
 	setsize(gren, '0 0 0', '0 0 0');
 	setorigin(gren, w_shotorg);
 
@@ -109,10 +100,11 @@
 	gren.touch = W_Grenade_Touch1;
 	gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up");
 	W_SetupProjectileVelocity(gren);
-	gren.avelocity_x = random () * -500 - 500;
 
 	gren.angles = vectoangles (gren.velocity);
 	gren.flags = FL_PROJECTILE;
+
+	CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE);	
 }
 
 void W_Grenade_Attack2 (void)
@@ -133,10 +125,8 @@
 	gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
 	gren.movetype = MOVETYPE_BOUNCE;
 	gren.solid = SOLID_BBOX;
-	gren.effects = EF_LOWPRECISION;
-	gren.modelflags = MF_TRACER2;
 	gren.projectiledeathtype = WEP_GRENADE_LAUNCHER | HITTYPE_SECONDARY;
-	setmodel(gren, "models/grenademodel.md3"); // precision set above
+	setmodel(gren, "null"); // precision set above
 	setsize(gren, '0 0 -3', '0 0 -3');
 	setorigin(gren, w_shotorg);
 
@@ -150,10 +140,11 @@
 	gren.event_damage = W_Grenade_Damage;
 	gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_secondary_speed") + v_up * cvar("g_balance_grenadelauncher_secondary_speed_up");
 	W_SetupProjectileVelocity(gren);
-	gren.avelocity = '100 150 100';
 
 	gren.angles = vectoangles (gren.velocity);
 	gren.flags = FL_PROJECTILE;
+
+	CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING);	
 }
 
 void spawnfunc_weapon_grenadelauncher (void)
@@ -202,7 +193,6 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/grenademodel.md3");
 		precache_model ("models/weapons/g_gl.md3");
 		precache_model ("models/weapons/v_gl.md3");
 		precache_model ("models/weapons/w_gl.zym");
@@ -213,7 +203,6 @@
 		precache_sound ("weapons/grenade_bounce5.wav");
 		precache_sound ("weapons/grenade_bounce6.wav");
 		precache_sound ("weapons/grenade_fire.wav");
-		precache_sound ("weapons/grenade_impact.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_GRENADE_LAUNCHER);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,17 +1,5 @@
 void W_Hagar_Explode (void)
 {
-	vector	org2;
-	float b;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
-	b = crandom();
-	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
-	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
-	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), self.projectiledeathtype, other);
 
@@ -20,18 +8,6 @@
 
 void W_Hagar_Explode2 (void)
 {
-	vector	org2;
-	float b;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
-	b = crandom();
-	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
-	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
-	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), self.projectiledeathtype, other);
 
@@ -57,6 +33,9 @@
 		self.owner = world;
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
 	}
+
+	if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough
+		UpdateCSQCProjectile(self);
 }
 
 void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -90,14 +69,12 @@
 	missile.scale = 0.4; // BUG: the model is too big
 	missile.projectiledeathtype = WEP_HAGAR;
 	setorigin (missile, w_shotorg);
-	setmodel (missile, "models/hagarmissile.mdl"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	//missile.takedamage = DAMAGE_YES;
 	//missile.damageforcescale = 4;
 	//missile.health = 10;
 	//missile.event_damage = W_Hagar_Damage;
-	missile.effects = EF_LOWPRECISION;
-	missile.modelflags = MF_GRENADE;
 
 	missile.movetype = MOVETYPE_FLY;
 	missile.velocity = (w_shotdir + randomvec() * cvar("g_balance_hagar_primary_spread")) * cvar("g_balance_hagar_primary_speed");
@@ -105,6 +82,8 @@
 
 	missile.angles = vectoangles (missile.velocity);
 	missile.flags = FL_PROJECTILE;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR);
 }
 
 void W_Hagar_Attack2 (void)
@@ -132,14 +111,12 @@
 	missile.scale = 0.4; // BUG: the model is too big
 	missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY;
 	setorigin (missile, w_shotorg);
-	setmodel (missile, "models/hagarmissile.mdl"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	//missile.takedamage = DAMAGE_YES;
 	//missile.damageforcescale = 4;
 	//missile.health = 10;
 	//missile.event_damage = W_Hagar_Damage;
-	missile.effects = EF_LOWPRECISION;
-	missile.modelflags = MF_GRENADE;
 
 	missile.movetype = MOVETYPE_BOUNCEMISSILE;
 	missile.velocity = (w_shotdir + randomvec() * cvar("g_balance_hagar_secondary_spread")) * cvar("g_balance_hagar_secondary_speed");
@@ -148,6 +125,8 @@
 
 	missile.angles = vectoangles (missile.velocity);
 	missile.flags = FL_PROJECTILE;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR_BOUNCING);
 }
 
 void spawnfunc_weapon_hagar (void)
@@ -182,14 +161,10 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/hagarmissile.mdl");
 		precache_model ("models/weapons/g_hagar.md3");
 		precache_model ("models/weapons/v_hagar.md3");
 		precache_model ("models/weapons/w_hagar.zym");
 		precache_sound ("weapons/hagar_fire.wav");
-		precache_sound ("weapons/hagexp1.wav");
-		precache_sound ("weapons/hagexp2.wav");
-		precache_sound ("weapons/hagexp3.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_HAGAR);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,44 +1,22 @@
 .float HLAC_bulletcounter;
 void W_HLAC_Touch (void)
 {
-	vector	dir;
-	vector org2;
-	vector normal;
-
 	PROJECTILE_TOUCH;
 
-	normal = trace_plane_normal;
-	dir = normalize (self.owner.origin - self.origin);
-	org2 = findbetterlocation (self.origin, 8);
-
-	pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);
-
 	self.event_damage = SUB_Null;
 
     RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
-	sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
 
 	remove (self);
 }
 
 void W_HLAC_Touch2 (void)
 {
-	vector	dir;
-	vector org2;
-	vector normal;
-
 	PROJECTILE_TOUCH;
 
-	normal = trace_plane_normal;
-	dir = normalize (self.owner.origin - self.origin);
-	org2 = findbetterlocation (self.origin, 8);
+	self.event_damage = SUB_Null;
 
-	pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);
-
-	//self.event_damage = SUB_Null;
-
     RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
-	sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
 
 	remove (self);
 }
@@ -77,7 +55,7 @@
 	missile.movetype = MOVETYPE_FLY;
 	missile.solid = SOLID_BBOX;
 
-	setmodel (missile, "models/hlac_bullet.md3"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	setorigin (missile, w_shotorg);
 
@@ -91,9 +69,10 @@
 
     missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");
 
-	missile.effects = EF_LOWPRECISION;
 	missile.flags = FL_PROJECTILE;
 	missile.projectiledeathtype = WEP_HLAC;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC);
 }
 
 void W_HLAC_Attack2f (void)
@@ -121,7 +100,7 @@
 	missile.movetype = MOVETYPE_FLY;
 	missile.solid = SOLID_BBOX;
 
-	setmodel (missile, "models/hlac_bullet.md3"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	setorigin (missile, w_shotorg);
 
@@ -135,9 +114,10 @@
 
     missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");
 
-	missile.effects = EF_LOWPRECISION;
 	missile.flags = FL_PROJECTILE;
 	missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC);
 }
 
 void W_HLAC_Attack2 (void)
@@ -220,16 +200,11 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-	    precache_sound ("weapons/laserimpact.wav");
-        precache_sound ("weapons/lasergun_fire.wav");
-
         precache_model ("models/weapons/g_hlac.md3");
 		precache_model ("models/weapons/v_hlac.md3");
 		precache_model ("models/weapons/w_hlac.zym");
 		precache_sound ("weapons/lasergun_fire.wav");
 
-		precache_model ("models/hlac_bullet.md3");
-
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_HLAC);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -6,8 +6,8 @@
 .float dmg_duration;
 .float dmg_last;
 .float hook_refire;
-.float hook_datehooked;
-.float hook_datehooked_delay;
+.float hook_time_hooked;
+.float hook_time_ammodecrease;
 
 void W_Hook_ExplodeThink (void)
 {
@@ -20,6 +20,7 @@
 	self.dmg_last = dmg_remaining_next;
 
 	RadiusDamage (self, self.owner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.owner, self.dmg_force * f, self.projectiledeathtype, world);
+	self.projectiledeathtype |= HITTYPE_BOUNCE;
 	//RadiusDamage (self, world, self.dmg * f, self.dmg_edge * f, self.dmg_radius, world, self.dmg_force * f, self.projectiledeathtype, world);
 
 	if(dt < self.dmg_duration)
@@ -30,12 +31,6 @@
 
 void W_Hook_Explode2 (void)
 {
-	vector org2;
-
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
-	sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 	self.touch = SUB_Null;
 
@@ -73,10 +68,8 @@
 	gren.bot_dodgerating = cvar("g_balance_hook_secondary_damage");
 	gren.movetype = MOVETYPE_TOSS;
 	gren.solid = SOLID_BBOX;
-	gren.effects = EF_LOWPRECISION;
-	gren.modelflags = MF_TRACER2;
 	gren.projectiledeathtype = WEP_HOOK | HITTYPE_SECONDARY;
-	setmodel(gren, "models/grenademodel.md3"); // precision set above // FIXME replace
+	setmodel(gren, "null"); // precision set above // FIXME replace
 	setsize(gren, '0 0 0', '0 0 0');
 	setorigin(gren, w_shotorg);
 
@@ -94,6 +87,8 @@
 
 	gren.angles = '0 0 0';
 	gren.flags = FL_PROJECTILE;
+
+	CSQCProjectile(gren, TRUE, PROJECTILE_HOOKBOMB);
 }
 
 void spawnfunc_weapon_hook (void)
@@ -151,19 +146,19 @@
 			hooked_time_max = cvar("g_balance_hook_primary_hooked_time_max");			
 			if (hooked_time_max > 0)
 			{
-				if ( time > self.hook_datehooked + hooked_time_max )
+				if ( time > self.hook_time_hooked + hooked_time_max )
 					self.hook_state |= HOOK_REMOVING;
 			}
 			
 			hooked_ammodecrease_delay = cvar("g_balance_hook_primary_hooked_ammodecrease_delay");
 			if (hooked_ammodecrease_delay > 0)
 			{
-				if ( time > self.hook_datehooked_delay + hooked_ammodecrease_delay )
+				if ( time > self.hook_time_ammodecrease )
 				{
 					if ( self.ammo_cells >= 1 )
 					{
 						self.ammo_cells -= 1;
-						self.hook_datehooked_delay = time;
+						self.hook_time_ammodecrease = time + hooked_ammodecrease_delay;
 					}
 					else
 					{
@@ -174,7 +169,10 @@
 			}
 		}
 		else
-			self.hook_datehooked = self.hook_datehooked_delay = time;				
+		{
+			self.hook_time_hooked = time;				
+			self.hook_time_ammodecrease = time + cvar("g_balance_hook_primary_hooked_time_free");
+		}
 
 		if (self.BUTTON_CROUCH)
 		{
@@ -207,10 +205,9 @@
 		precache_model ("models/weapons/g_hookgun.md3");
 		precache_model ("models/weapons/v_hookgun.md3");
 		precache_model ("models/weapons/w_hookgun.zym");
+		precache_sound ("weapons/hook_impact.wav"); // done by g_hook.qc
 		precache_sound ("weapons/hook_fire.wav");
-		precache_sound ("weapons/hook_impact.wav");
 		precache_sound ("weapons/hookbomb_fire.wav");
-		precache_sound ("weapons/hookbomb_impact.wav");
 	}
 	else if (req == WR_SETUP)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,25 +2,13 @@
 
 void W_Laser_Touch (void)
 {
-	vector	dir;
-	vector org2;
-	vector normal;
-
 	PROJECTILE_TOUCH;
 
-	normal = trace_plane_normal;
-	dir = normalize (self.owner.origin - self.origin);
-	org2 = findbetterlocation (self.origin, 8);
-
-	pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);
-
-
 	self.event_damage = SUB_Null;
 	if (self.dmg)
 		RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), self.projectiledeathtype, other);
 	else
 		RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), self.projectiledeathtype, other);
-	sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
 
 	remove (self);
 }
@@ -48,7 +36,7 @@
 	if(issecondary)
 		missile.projectiledeathtype |= HITTYPE_SECONDARY;
 
-	setmodel (missile, "models/laser.mdl"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	setorigin (missile, w_shotorg);
 
@@ -67,8 +55,9 @@
 	else
 		missile.nextthink = time + cvar("g_balance_laser_primary_lifetime");
 
-	missile.effects = EF_LOWPRECISION;
 	missile.flags = FL_PROJECTILE;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_LASER);
 }
 
 float w_laser(float req)
@@ -116,11 +105,9 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/laser.mdl");
 		precache_model ("models/weapons/v_laser.md3");
 		precache_model ("models/weapons/w_laser.zym");
 		precache_sound ("weapons/lasergun_fire.wav");
-		precache_sound ("weapons/laserimpact.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_LASER);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -41,9 +41,7 @@
 	trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos);
 	// flash and burn the wall
 	if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-		pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1);
-	// play a sound
-	soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+		Damage_DamageInfo(trace_endpos, 10000, 0, 0, 800 * w_shotdir, WEP_MINSTANEX);
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 	{
@@ -165,7 +163,6 @@
 		precache_model ("models/weapons/v_minstanex.md3");
 		precache_model ("models/weapons/w_minstanex.zym");
 		precache_sound ("weapons/minstanexfire.wav");
-		precache_sound ("weapons/neximpact.wav");
 		w_laser(WR_PRECACHE);
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -17,14 +17,10 @@
 	trailparticles(world, particleeffectnum("nex_beam"), w_shotorg, trace_endpos);
 	// flash and burn the wall
 	if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-		pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1);
-	// play a sound
-	soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+		Damage_DamageInfo(trace_endpos, cvar("g_balance_nex_damage"), 0, 0, cvar("g_balance_nex_force") * w_shotdir, WEP_NEX);
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-	{
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo");
-	}
 }
 
 void spawnfunc_weapon_nex (void); // defined in t_items.qc
@@ -51,7 +47,6 @@
 		precache_model ("models/weapons/v_nex.md3");
 		precache_model ("models/weapons/w_nex.zym");
 		precache_sound ("weapons/nexfire.wav");
-		precache_sound ("weapons/neximpact.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_NEX);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -123,6 +123,7 @@
 			trace_plane_normal = norm;
 			W_Porto_Fail(0);
 		}
+		CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE); // change type
 	}
 	else
 	{
@@ -147,7 +148,6 @@
 			W_Porto_Fail(0);
 		}
 	}
-
 }
 
 void W_Porto_Attack (void)
@@ -168,10 +168,9 @@
 	gren.bot_dodgerating = 200;
 	gren.movetype = MOVETYPE_BOUNCEMISSILE;
 	gren.solid = SOLID_BBOX;
-	gren.effects = EF_LOWPRECISION | EF_RED | EF_ADDITIVE;
+	gren.effects = EF_RED;
 	gren.scale = 4;
-	gren.modelflags = MF_TRACER;
-	setmodel(gren, "models/grenademodel.md3"); // precision set above
+	setmodel(gren, "null"); // precision set above
 	setsize(gren, '0 0 0', '0 0 0');
 	setorigin(gren, w_shotorg);
 
@@ -193,6 +192,8 @@
 	gren.right_vector = v_right;
 
 	gren.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+
+	CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_RED);
 }
 
 void spawnfunc_weapon_porto (void)
@@ -238,8 +239,8 @@
 					WriteByte(MSG_ONE, TE_CSQC_HOLDANGLES);
 					WriteByte(MSG_ONE, WEP_PORTO);
 					WriteByte(MSG_ONE, 1);
-					WriteCoord(MSG_ONE, self.v_angle_x);
-					WriteCoord(MSG_ONE, self.v_angle_y);
+					WriteAngle(MSG_ONE, self.v_angle_x);
+					WriteAngle(MSG_ONE, self.v_angle_y);
 				});
 				self.porto_v_angle_held = 1;
 			}
@@ -259,7 +260,6 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/grenademodel.md3");
 		precache_model ("models/weapons/g_porto.md3");
 		precache_model ("models/weapons/v_porto.md3");
 		precache_model ("models/weapons/w_porto.zym");

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -3,13 +3,6 @@
 
 void W_Rocket_Explode (void)
 {
-	vector	org2;
-	sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-	org2 = findbetterlocation (self.origin, 16);
-
-	pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-
-	//effect (org2, "models/sprites/rockexpl.spr", 0, 12, 35);
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), self.projectiledeathtype, other);
 
@@ -176,13 +169,16 @@
 				W_Rocket_RemoteExplode();
 		}
 	}
+
+	if(self.csqcprojectile_clientanimate == 0)
+		UpdateCSQCProjectile(self);
 }
 
 void W_Rocket_Touch (void)
 {
 	if(self.owner && self.owner.lastrocket == self)
 		self.owner.lastrocket = world;
-	PROJECTILE_TOUCH_NOSOUND;
+	PROJECTILE_TOUCH;
 	W_Rocket_Explode ();
 }
 
@@ -225,7 +221,7 @@
 	missile.movetype = MOVETYPE_FLY;
 	missile.solid = SOLID_BBOX;
 	missile.projectiledeathtype = WEP_ROCKET_LAUNCHER;
-	setmodel (missile, "models/rocket.md3"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
 
 	setorigin (missile, w_shotorg - v_forward * 3); // move it back so it hits the wall at the right point
@@ -240,10 +236,11 @@
 	missile.think = W_Rocket_Think;
 	missile.nextthink = time;
 	missile.cnt = time + cvar("g_balance_rocketlauncher_lifetime");
-	missile.effects = EF_LOWPRECISION;
-	sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
 	missile.flags = FL_PROJECTILE;
 
+	CSQCProjectile(missile, cvar("g_balance_rocketlauncher_speedaccel") == 0 && cvar("g_laserguided_missiles") == 0, PROJECTILE_ROCKET);
+	missile.effects |= EF_NODEPTHTEST; // because of fly sound
+
 	// muzzle flash for 1st person view
 	flash = spawn ();
 	flash.scale = 1.2;
@@ -436,14 +433,11 @@
 	else if (req == WR_PRECACHE)
 	{
 		precache_model ("models/flash.md3");
-		precache_model ("models/rocket.md3");
 		precache_model ("models/weapons/g_rl.md3");
 		precache_model ("models/weapons/v_rl.md3");
 		precache_model ("models/weapons/w_rl.zym");
 		precache_sound ("weapons/rocket_det.wav");
 		precache_sound ("weapons/rocket_fire.wav");
-		precache_sound ("weapons/rocket_fly.wav");
-		precache_sound ("weapons/rocket_impact.wav");
 		if (g_laserguided_missile)
 		{
 			precache_model ("models/laser_dot.mdl"); // rocket launcher

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -4,19 +4,6 @@
 
 void Seeker_Missile_Explode ()
 {
-	vector	org2;
-	float b;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
-
-	b = crandom();
-	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
-	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
-	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
 
@@ -123,6 +110,7 @@
 	self.angles = vectoangles(self.velocity);			// turn model in the new flight direction
 	self.nextthink = time + 0.05;
 
+	UpdateCSQCProjectile(self);
 }
 
 
@@ -141,7 +129,6 @@
 		W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
 }
 
-#define EF_ROCKET				16777216
 void Seeker_Missile_Animate()
 {
 	self.frame = self.frame +1;
@@ -155,13 +142,14 @@
 	{
 		self.think           = Seeker_Missile_Think;
 		self.nextthink       = time + cvar("g_balance_seeker_missile_activate_delay");
-		self.effects         = EF_LOWPRECISION | EF_NOSHADOW | EF_ROCKET;
 
 		if (cvar("g_balance_seeker_guided_proxy"))
 			self.movetype    = MOVETYPE_BOUNCEMISSILE;
 		else
 			self.movetype    = MOVETYPE_FLYMISSILE;
 	}
+
+	UpdateCSQCProjectile(self);
 }
 
 void Seeker_Fire_Missile(vector f_org)
@@ -193,7 +181,6 @@
 	missile.cnt             = time + cvar("g_balance_seeker_missile_lifetime");
 	missile.enemy           = self.enemy;
 	missile.switchweapon           = cvar("g_balance_seeker_missile_speed");
-	missile.effects         = EF_LOWPRECISION | EF_NOSHADOW;// | EF_ROCKET;
 	missile.solid           = SOLID_BBOX;
 	missile.scale           = 2;
 	missile.takedamage          = DAMAGE_YES;
@@ -202,7 +189,7 @@
 	missile.projectiledeathtype = WEP_SEEKER;
 
 	setorigin (missile, w_shotorg);
-	setmodel  (missile, "models/tagrocket.md3");
+	setmodel  (missile, "null");
 	setsize (missile, '-2 -2 -2', '2 2 2');
 
 
@@ -216,6 +203,7 @@
 	missile.switchweapon = vlen(missile.velocity);
 	missile.angles = vectoangles (missile.velocity);
 
+	CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER);
 }
 
 void Seeker_Vollycontroler_Think()
@@ -269,23 +257,10 @@
 
 void Seeker_Tag_Explode ()
 {
-	vector	org2;
-	float b;
-
 	//if(other==self.owner)
 	//    return;
+	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE);
 
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
-
-	b = crandom();
-	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
-	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
-	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
-
 	remove (self);
 }
 
@@ -300,15 +275,13 @@
 	vector dir;
 	vector org2;
 
-	PROJECTILE_TOUCH_NOSOUND;
-
 	dir     = normalize (self.owner.origin - self.origin);
 	org2    = findbetterlocation (self.origin, 8);
 
 	te_knightspike(org2);
 
 	self.event_damage = SUB_Null;
-	sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT);
 
 	if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
 	{
@@ -357,37 +330,24 @@
 	missile.event_damage    = Seeker_Tag_Explode;
 	missile.health          = 5;
 
-	setmodel (missile, "models/laser.mdl"); // TODO make this seeker specific
+	setmodel (missile, "null");
 	setorigin (missile, w_shotorg);
 	setsize (missile, '0 0 0', '0 0 0');
 
-	missile.effects     = EF_FULLBRIGHT | EF_NOSHADOW | EF_LOWPRECISION;
-	missile.modelflags  = MF_TRACER3;
-	sound (missile, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
 	missile.flags       = FL_PROJECTILE;
 
 	missile.velocity    = w_shotdir  * cvar("g_balance_seeker_tag_speed");
 	missile.movetype    = MOVETYPE_BOUNCEMISSILE;
 	W_SetupProjectileVelocity(missile);
 	missile.angles = vectoangles (missile.velocity);
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_TAG);
+	missile.effects = EF_NODEPTHTEST;
 }
 
 
 void Seeker_Flac_Explode ()
 {
-	vector	org2;
-	float b;
-	org2 = findbetterlocation (self.origin, 12);
-	pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
-
-	b = crandom();
-	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
-	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
-	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
-
 	self.event_damage = SUB_Null;
 
 	RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
@@ -430,7 +390,7 @@
 	}
 	W_SetupShot (self, f_org, FALSE, 2, "weapons/flac_fire.wav");
 
-		pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+	pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
 	missile = spawn ();
 	missile.owner = missile.realowner = self;
@@ -445,13 +405,10 @@
 	missile.scale = 0.4; // BUG: the model is too big
 	missile.projectiledeathtype = WEP_SEEKER;
 	setorigin (missile, w_shotorg);
-	setmodel (missile, "models/hagarmissile.mdl"); // precision set below
+	setmodel (missile, "null"); // precision set below
 	setsize (missile, '0 0 0', '0 0 0');
 	missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
 
-	missile.effects = EF_LOWPRECISION;
-	missile.modelflags = MF_TRACER3;
-
 	missile.movetype = MOVETYPE_FLY;
 	w_shotdir = w_shotdir + '0 0 0.3';
 	missile.velocity    = (w_shotdir  + randomvec() * cvar("g_balance_seeker_flac_spread")) * cvar("g_balance_seeker_flac_speed");
@@ -460,6 +417,8 @@
 
 	missile.angles = vectoangles (missile.velocity);
 	missile.flags = FL_PROJECTILE;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_FLAC);
 }
 
 void spawnfunc_weapon_seeker (void)
@@ -491,25 +450,12 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/hagarmissile.mdl");
-		precache_model ("models/tagrocket.md3");
 		precache_model ("models/weapons/g_seeker.md3");
 		precache_model ("models/weapons/v_seeker.md3");
 		precache_model ("models/weapons/w_seeker.zym");
 		precache_sound ("weapons/tag_fire.wav");
-		precache_sound ("weapons/tag_impact.wav");
-		precache_sound ("weapons/tagexp1.wav");
-		precache_sound ("weapons/tagexp2.wav");
-		precache_sound ("weapons/tagexp3.wav");
-		precache_sound ("weapons/tag_rocket_fly.wav");
 		precache_sound ("weapons/flac_fire.wav");
-		precache_sound ("weapons/flacexp1.wav");
-		precache_sound ("weapons/flacexp2.wav");
-		precache_sound ("weapons/flacexp3.wav");
 		precache_sound ("weapons/seeker_fire.wav");
-		precache_sound ("weapons/seekerexp1.wav");
-		precache_sound ("weapons/seekerexp2.wav");
-		precache_sound ("weapons/seekerexp3.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_SEEKER);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -23,7 +23,7 @@
 
 	// casing code
 	if (cvar("g_casings") >= 1)
-		SpawnCasing (w_shotorg, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
+		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
 
 	// muzzle flash for 1st person view
 	flash = spawn();
@@ -66,7 +66,7 @@
 
 	// casing code
 	if (cvar("g_casings") >= 1)
-		SpawnCasing (w_shotorg, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
+		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
 
 	flash = spawn();
 	setorigin(flash, '53 5 0');
@@ -122,22 +122,11 @@
 	else if (req == WR_PRECACHE)
 	{
 		precache_model ("models/uziflash.md3");
-		precache_model ("models/tracer.mdl");
 		precache_model ("models/weapons/g_shotgun.md3");
 		precache_model ("models/weapons/v_shotgun.md3");
 		precache_model ("models/weapons/w_shotgun.zym");
 		precache_sound ("misc/itempickup.wav");
-		precache_sound ("weapons/ric1.wav");
-		precache_sound ("weapons/ric2.wav");
-		precache_sound ("weapons/ric3.wav");
 		precache_sound ("weapons/shotgun_fire.wav");
-		if (cvar("g_casings") >= 1)
-		{
-			precache_sound ("weapons/casings1.wav");
-			precache_sound ("weapons/casings2.wav");
-			precache_sound ("weapons/casings3.wav");
-			precache_model ("models/casing_shell.mdl");
-		}
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_SHOTGUN);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -70,7 +70,7 @@
 
 	// casing code
 	if (cvar("g_casings") >= 2)
-		SpawnCasing (w_shotorg + v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
+		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
 }
 
 // weapon frames
@@ -127,22 +127,11 @@
 	}
 	else if (req == WR_PRECACHE)
 	{
-		precache_model ("models/tracer.mdl");
 		precache_model ("models/uziflash.md3");
 		precache_model ("models/weapons/g_uzi.md3");
 		precache_model ("models/weapons/v_uzi.md3");
 		precache_model ("models/weapons/w_uzi.zym");
-		precache_sound ("weapons/ric1.wav");
-		precache_sound ("weapons/ric2.wav");
-		precache_sound ("weapons/ric3.wav");
 		precache_sound ("weapons/uzi_fire.wav");
-		if (cvar("g_casings") >= 2)
-		{
-			precache_sound ("weapons/brass1.wav");
-			precache_sound ("weapons/brass2.wav");
-			precache_sound ("weapons/brass3.wav");
-			precache_model ("models/casing_bronze.mdl");
-		}
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_UZI);

Modified: branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2009-01-24 19:51:12 UTC (rev 5658)
@@ -30,7 +30,7 @@
 	if(o != e.origin)
 	{
 		setorigin(e, o);
-		e.SendFlags |= 128;
+		e.SendFlags |= 64;
 	}
 }
 
@@ -165,10 +165,14 @@
 {
 	WriteByte(MSG_ENTITY, ENT_CLIENT_WAYPOINT);
 	WriteByte(MSG_ENTITY, sendflags);
-	WriteCoord(MSG_ENTITY, self.origin_x);
-	WriteCoord(MSG_ENTITY, self.origin_y);
-	WriteCoord(MSG_ENTITY, self.origin_z);
 
+	if(sendflags & 64)
+	{
+		WriteCoord(MSG_ENTITY, self.origin_x);
+		WriteCoord(MSG_ENTITY, self.origin_y);
+		WriteCoord(MSG_ENTITY, self.origin_z);
+	}
+
 	if(sendflags & 1)
 	{
 		WriteByte(MSG_ENTITY, self.team);
@@ -209,6 +213,14 @@
 	return TRUE;
 }
 
+void WaypointSprite_Reset()
+{
+	// if a WP wants to time out, let it time out immediately; other WPs ought to be reset/killed by their owners
+
+	if(self.health) // there was there before: || g_keyhunt, do we really need this?
+		WaypointSprite_Kill(self);
+}
+
 entity WaypointSprite_Spawn(
 	string spr, // sprite
 	float lifetime, float maxdistance, // lifetime, max distance
@@ -248,6 +260,7 @@
 	wp.SendEntity = WaypointSprite_SendEntity;
 	wp.customizeentityforclient = WaypointSprite_Customize;
 	wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
+	wp.reset2 = WaypointSprite_Reset;
 	return wp;
 }
 

Copied: branches/nexuiz-2.0/data/scripts/egyptsoc.shader (from rev 5656, trunk/data/scripts/egyptsoc.shader)
===================================================================
--- branches/nexuiz-2.0/data/scripts/egyptsoc.shader	                        (rev 0)
+++ branches/nexuiz-2.0/data/scripts/egyptsoc.shader	2009-01-24 19:51:12 UTC (rev 5658)
@@ -0,0 +1,2165 @@
+//**********************************************************************
+//
+//	Title  : egyptsoc.shader
+//	Author : Sock
+//	Date   : 1st July 2001
+//	Email  : sock at planetquake.com
+//	URL    : http://www.planetquake.com/simland
+//	Version: 1.6
+//
+//  If you use any of these Egyptian shader/textures I kindly ask
+//  YOU to give me credit for my work within your README file or
+//  TEXT file distributed with your map/mod.
+//
+//**********************************************************************
+//
+// Index of shaders (128) :-
+//
+// (32) 32x32 light sources : 01 = Cross, 02 = Triangle, 03 = Star, 04 = Flower
+//
+// lig_032-01b1-2k  lig_032-02b1-2k  lig_032-03b1-2k  lig_032-04b1-2k  - Blue + grey bckgrd
+// lig_032-01b2-2k  lig_032-02b2-2k  lig_032-03b2-2k  lig_032-04b2-2k  - Blue + yellow bckgrd
+// lig_032-01r1-2k  lig_032-02r1-2k  lig_032-03r1-2k  lig_032-04r1-2k  - Red + grey bckgrd
+// lig_032-01r2-2k  lig_032-02r2-2k  lig_032-03r2-2k  lig_032-04r2-2k  - Red + yellow bckgrd
+// lig_032-01y1-2k  lig_032-02y1-2k  lig_032-03y1-2k  lig_032-04y1-2k  - Yellow + grey bckgrd
+// lig_032-01y2-2k  lig_032-02y2-2k  lig_032-03y2-2k  lig_032-04y2-2k  - Yellow + yellow bckgrd
+// lig_032-01w1-2k  lig_032-02w1-2k  lig_032-03w1-2k  lig_032-04w1-2k  - White + grey bckgrd
+// lig_032-01w2-2k  lig_032-02w2-2k  lig_032-03w2-2k  lig_032-04w2-2k  - White + yellow bckgrd
+//
+// (40) 64x64 light sources : 01 = Anhk, 02 = Circle, 04 = Cross, 05 = Square, 06 = Triangle
+//
+// lig_064-01b1-2k  lig_064-02b1-2k  lig_064-04b1-2k  lig_064-05b1-2k  lig_064-06b1-2k  - Blue + grey bckgrd
+// lig_064-01b2-2k  lig_064-02b2-2k  lig_064-04b2-2k  lig_064-05b2-2k  lig_064-06b2-2k  - Blue + yellow bckgrd
+// lig_064-01r1-2k  lig_064-02r1-2k  lig_064-04r1-2k  lig_064-05r1-2k  lig_064-06r1-2k  - Red + grey bckgrd
+// lig_064-01r2-2k  lig_064-02r2-2k  lig_064-04r2-2k  lig_064-05r2-2k  lig_064-06r2-2k  - Red + yellow bckgrd
+// lig_064-01y1-2k  lig_064-02y1-2k  lig_064-04y1-2k  lig_064-05y1-2k  lig_064-06y1-2k  - Yellow + grey bckgrd
+// lig_064-01y2-2k  lig_064-02y2-2k  lig_064-04y2-2k  lig_064-05y2-2k  lig_064-06y2-2k  - Yellow + yellow bckgrd
+// lig_064-01w1-2k  lig_064-02w1-2k  lig_064-04w1-2k  lig_064-05w1-2k  lig_064-06w1-2k  - White + grey bckgrd
+// lig_064-01w2-2k  lig_064-02w2-2k  lig_064-04w2-2k  lig_064-05w2-2k  lig_064-06w2-2k  - White + yellow bckgrd
+//
+// (18) 256x64 Band style light : 01 = Single, 02 = ZigZag, 03 = Triangle
+//
+// lig_b064-01a  lig_b064-02a  lig_b064-03a  - Blue + grey bckgrd
+// lig_b064-01b  lig_b064-02b  lig_b064-03b  - Blue + yellow bckgrd
+// lig_b064-01c  lig_b064-02c  lig_b064-03c  - Yellow + grey bckgrd
+// lig_b064-01d	 lig_b064-02d  lig_b064-03d  - Yellow + yellow bckgrd
+// lig_b064-01e  lig_b064-02e  lig_b064-03e  - Red + grey bckgrd
+// lig_b064-01f	 lig_b064-02f  lig_b064-03f  - Red + yellow bckgrd
+//
+// (06) Vertical style light - 2 bar with additional border 96x192
+//
+// lig_v192-01ba  - Blue + grey bckgrd
+// lig_v192-01bb  - Blue + yellow bckgrd
+// lig_v192-01ya  - Yellow + grey bckgrd
+// lig_v192-01yb  - Yellow + yellow bckgrd
+// lig_v192-01wa  - White + grey bckgrd
+// lig_v192-01wb  - White + yellow bckgrd
+//
+// (06) Weapon Markers 1 - 2 rot swirls + FAST glowing symbols
+//
+// wmblue_floor1a  wmblue_floor1b  - Blue symbols and swirls
+// wmgold_floor1a  wmgold_floor1b  - Gold symbols and swirls
+// wmred_floor1a   wmred_floor1b   - Red symbols and swirls
+//
+// (06) Jump Pads 1 - 1 rot swirl + 1 jumppad stretch + SLOW glowing symbols
+//
+// jpblue_floor1a  jpblue_floor1b  - Blue symbols and swirls
+// jpgold_floor1a  jpgold_floor1b  - Gold symbols and swirls
+// jpred_floor1a   jpred_floor1b   - Red symbols and swirls
+//
+// (12) Weapon Markers with Glowing central areas
+//
+// s128-01wc  s128-02wc  - Blue + grey bckgrd
+// s128-01wd  s128-02wd  - Blue + yellow bckgrd
+// s128-01we  s128-02we  - Gold + grey bckgrd
+// s128-01wcr s128-02wcr - Red + grey bckgrd
+// s128-01wdr s128-02wdr - Red + yellow bckgrd
+//
+// (08) Grates in grey/yellow to match other tiles
+//
+// grate1a  grate1b  - square 32x32 design
+// grate2a  grate2b  - small rectangle design
+// grate3a  grate3b  - ring 32x32 design
+// grate4a  grate4b  - detail version of ring design
+//
+
+//**********************************************************************//
+// LIGHT 32 - 01 : Cross design light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_032-01b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-01b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-01r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-01r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-01y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-01y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-01w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-01w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-01w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-01w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-01w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 32 - 02 : Triangle light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_032-02b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-02b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-02r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-02r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-02y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-02y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-02w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-02w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-02w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-02w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-02w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 32 - 03 : Star design light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_032-03b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-03b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-03r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-03r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-03y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-03y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-03w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-03w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-03w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-03w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-03w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 32 - 04 : Flower design light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_032-04b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-04b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-04r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_032-04r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-04y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-04y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-04w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_032-04w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_032-04w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_032-04w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_032-04w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 64 - 01 : Standard Ankh light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_064-01b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_064-01b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-01r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_064-01r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-01y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-01y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-01w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-01w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-01w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-01w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-01w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 64 - 02 : Standard Circle light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_064-02b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_064-02b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-02r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+
+textures/egyptsoc_sfx/lig_064-02r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-02y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-02y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-02w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-02w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-02w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-02w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-02w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 64 - 04 : Circle template with cross bars across light source  //
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_064-04b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-04w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-04w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-04w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-04w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 64 - 05 : Standard Square light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_064-05b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-05w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-05w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-05w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-05w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT 64 - 06 : Triangle light source				//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_064-06b1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06b1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06b1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06b1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06b2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06b2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06b2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06b2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06r1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06r1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06r1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06r1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06r2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06r2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06r2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06r2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06y1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06y1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06y1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06y1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06y2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06y2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06y2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06y2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06w1-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06w1.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06w1_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06w1.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/lig_064-06w2-2k
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_064-06w2.tga
+	q3map_lightimage textures/egyptsoc_sfx/lig_064-06w2_glow.tga
+	q3map_surfacelight 2000
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_sfx/lig_064-06w2.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// LIGHT BAND 64 - 01 : Single glowing stripe 256x64			//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_b064-01a
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01a.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01a.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-01b
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01b.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01b.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-01c
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01c.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01c.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-01d
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01d.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01d.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-01e
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01e.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01e.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-01f
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-01f.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-01f.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+// LIGHT BAND 64 - 02 : ZigZag glowing stripe 256x64			//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_b064-02a
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02a.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02a.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-02b
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02b.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02b.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-02c
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02c.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02c.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-02d
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02d.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02d.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-02e
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02e.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02e.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-02f
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-02f.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-02f.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+// LIGHT BAND 64 - 03 : Triangle glowing pattern 256x64			//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_b064-03a
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03a.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03a.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-03b
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03b.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03b.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-03c
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03c.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03c.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-03d
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03d.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03d.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-03e
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03e.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03e.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_b064-03f
+{
+	qer_editorimage textures/egyptsoc_sfx/lig_b064-03f.tga
+	{
+		map textures/egyptsoc_sfx/lig_b064-03f.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+// BLUE LIGHT 192 - 01 : 2 bar with additional border 96x192		//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_v192-01ba
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01ba.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01ba.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_v192-01bb
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01bb.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01bb.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+// YELLOW LIGHT 192 - 01 : 2 bar with additional border 96x192		//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_v192-01ya
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01ya.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01ya.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_v192-01yb
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01yb.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01yb.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+// WHITE LIGHT 192 - 01 : 2 bar with additional border 96x192		//
+//**********************************************************************//
+textures/egyptsoc_sfx/lig_v192-01wa
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01wa.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01wa.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+textures/egyptsoc_sfx/lig_v192-01wb
+{       
+	qer_editorimage textures/egyptsoc_sfx/lig_v192-01wb.tga
+	{
+		map textures/egyptsoc_sfx/lig_v192-01wb.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc filter
+	}
+}
+
+//**********************************************************************//
+//									//
+// FLOOR 1A								//
+//									//
+// Weapon Markers 1 - 2 rot swirls + FAST glowing symbols		//
+//**********************************************************************//
+textures/egyptsoc_sfx/wmblue_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ab.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ab_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1ab.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/wmgold_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ag.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ag_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1ag.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/wmred_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ar.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ar_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1ar.tga
+		rgbgen identity
+	}
+        {
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+//									//
+// FLOOR 1B								//
+//									//
+// Weapon Markers 1 - 2 rot swirls + FAST glowing symbols		//
+//**********************************************************************//
+textures/egyptsoc_sfx/wmblue_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1bb.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1b_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1bb.tga
+		rgbgen identity
+	}
+        {
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/wmgold_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1bg.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1gg_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1bg.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/wmred_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1br.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1br_glow.tga	
+	q3map_surfacelight 100
+	{
+		map textures/egyptsoc_floor/jumppad1br.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+//									//
+// FLOOR 1A								//
+//									//
+// Jump Pads 1 - 1 rot swirl + 1 jumppad stretch + SLOW glowing symbols //
+//**********************************************************************//
+textures/egyptsoc_sfx/jpblue_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ab.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ab_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1ab.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/jpgold_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ag.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ag_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1ag.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/jpred_floor1a
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1ar.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1ar_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1ar.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+//									//
+// FLOOR 1B								//
+//									//
+// Jump Pads 1 - 1 rot swirl + 1 jumppad stretch + SLOW glowing symbols //
+//**********************************************************************//
+textures/egyptsoc_sfx/jpblue_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1bb.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1bb_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1bb.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/jpgold_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1bg.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1bg_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1bg.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/jpred_floor1b
+{
+	qer_editorimage textures/egyptsoc_floor/jumppad1br.tga
+	q3map_lightimage textures/egyptsoc_floor/jumppad1br_glow.tga	
+	q3map_surfacelight 400
+	{
+		map textures/egyptsoc_floor/jumppad1br.tga
+		rgbgen identity
+	}
+	{
+		map $lightmap
+                blendFunc GL_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// S128-01 : Weapon Markers with glowing central area's			//
+//**********************************************************************//
+textures/egyptsoc_sfx/s128-01wc
+{
+	qer_editorimage textures/egyptsoc_trim/s128-01c.tga
+	q3map_lightimage textures/egyptsoc_trim/s128-01c_glow.tga
+	light 1
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_trim/s128-01c.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/s128-01wd
+{
+	qer_editorimage textures/egyptsoc_trim/s128-01d.tga
+	q3map_lightimage textures/egyptsoc_trim/s128-01d_glow.tga
+	light 1
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_trim/s128-01d.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/s128-01we
+{
+	qer_editorimage textures/egyptsoc_trim/s128-01e.tga
+	q3map_lightimage textures/egyptsoc_trim/s128-01e_glow.tga
+	light 1
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_trim/s128-01e.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/s128-01wcr
+{
+	qer_editorimage textures/egyptsoc_trimd/s128-01cr.tga
+	q3map_lightimage textures/egyptsoc_trimd/s128-01cr_glow.tga
+	light 1
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_trimd/s128-01cr.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_sfx/s128-01wdr
+{
+	qer_editorimage textures/egyptsoc_trimd/s128-01dr.tga
+	q3map_lightimage textures/egyptsoc_trimd/s128-01dr_glow.tga
+	light 1
+	surfaceparm nomarks
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/egyptsoc_trimd/s128-01dr.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+		rgbGen identity
+	}
+}
+
+//**********************************************************************//
+// GRATE : 128x128 designs						//
+//**********************************************************************//
+// grate1a  grate1b  - square 32x32 design
+// grate2a  grate2b  - small rectangle design
+// grate3a  grate3b  - ring 32x32 design
+// grate4a  grate4b  - detail version of ring design
+//
+textures/egyptsoc_floor/grate1a
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate1a.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate1b
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate1b.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate2a
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate2a.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate2b
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate2b.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate3a
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate3a.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate3b
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate3b.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate4a
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate4a.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}
+
+textures/egyptsoc_floor/grate4b
+{
+	surfaceparm	metalsteps		
+	cull none
+	{
+		map textures/egyptsoc_floor/grate4b.tga
+		blendFunc GL_ONE GL_ZERO
+		alphaFunc GE128
+		depthWrite
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		blendFunc GL_DST_COLOR GL_ZERO
+		depthFunc equal
+		rgbGen identity
+	}
+}

Modified: branches/nexuiz-2.0/data/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/scripts/entities.def	2009-01-24 19:51:12 UTC (rev 5658)
@@ -91,7 +91,8 @@
 */
 
 /*QUAKED func_door_rotating (0 .5 .8) ? START_OPEN BIDIR DOOR_DONT_LINK BIDIR_IN_DOWN - TOGGLE X_AXIS Y_AXIS
-Normal rotating door entity. By default, the door will activate when player walks close to it or when damage is inflicted to it.
+Normal rotating door entity that opens by rotating around an axis (default: Z). Use an origin brush to specify the rotation axis.
+By default, the door will activate when player walks close to it or when damage is inflicted to it.
 If DOOR_DONT_LINK is not set, the door will be linked with all doors it touches.
 BIDIR makes the door work bidirectional, so that the opening direction is always away from the requestor.
 The usage of bidirectional doors requires two manually instantiated triggers (trigger_multiple), the one to open it in the other direction
@@ -184,7 +185,7 @@
 */
 
 /*QUAKED func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS
-Brush entity that spins in place on one axis (default Z). Use an origin brush to specify define the rotation axis.
+Brush entity that spins in place on one axis (default Z). Use an origin brush to specify the rotation axis.
 To rotate around another axis, make a func_wall with an explicit avelocity given.
 -------- KEYS --------
 speed: speed to rotate (in degrees per second)
@@ -221,6 +222,11 @@
 -------- KEYS --------
 speed: default/initial speed of train (default 100 or overridden by speed value of targeted path_corner)
 target: targetname of first path_corner to move to at the default speed; ideally, this path_corner shall be exactly where the train starts
+noise: path/name of .wav or .ogg file to play while moving. Use looping sounds only (e.g. sound/world/drone6.wav - See Notes).
+dmg: damage a player who gets crushed by it receives
+dmgtime: interval to apply dmg to a player who is s in the way
+message: death message when a player gets crushed
+message2: death message when someone gets pushed into this (default: "was thrown into a world of hurt by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
 */
 
 /*QUAKED info_location (1 1 0) (-8 -8 -8) (8 8 8) 
@@ -567,6 +573,8 @@
 dmg: damage inflicted by the beam per second, or -1 for an instant-death ray
 targetname: name to target this (then its state is toggled)
 alpha: when set, makes a dark laser of the given strength; may be combined with colormod
+scale: scales the beam thickness (default 1)
+modelscale: scales the dynamic light radius at the endpoint (default 1, -1 to turn off)
 -------- SPAWNFLAGS --------
 START_ON: when targeted, the laser will start switched on
 FINITE: the laser does not extend over its target like light would do, but stops there (takes more bandwidth)
@@ -689,6 +697,7 @@
 target: target to activate when a teleporter targeting this is used
 angle: direction in which player will look when teleported, OR use
 angles: pitch and yaw when coming out of the teleporter (also specifies the direction the player will aim when coming out)
+cnt: weight for random selection, in case a teleporter points at multiple misc_teleporter_dest
 */
 
 /*QUAKED onslaught_controlpoint (0 .5 .8) (-32 -32 0) (32 32 128) 
@@ -888,6 +897,9 @@
 More than one "trigger event" can be delayed at once, as opposed to trigger_delay.
 -------- KEYS --------
 target: trigger all entities with this targetname when triggered
+target2: trigger all entities with this targetname when triggered
+target3: trigger all entities with this targetname when triggered
+target4: trigger all entities with this targetname when triggered
 targetname: name that identifies this entity so it can be triggered
 delay: delay the triggering by the given time
 message: print this message to the player who activated the trigger
@@ -906,7 +918,7 @@
 Touching this will teleport players to the location of the targeted misc_teleporter_dest entity.
 Note that in Nexuiz, teleporters preserve momentum of the player using them.
 -------- KEYS --------
-target: this must point to a misc_teleporter_dest entity.
+target: this must point to a misc_teleporter_dest entity. If it points to more than one, a destination is randomly selected on teleport.
 */
 
 /*QUAKED weapon_crylink (1 0 .5) (-30 -30 0) (30 30 32) FLOATING
@@ -1114,6 +1126,16 @@
 START_ON: assume it is already turned on (when targeted)
 */
 
+/*QUAKED trigger_gamestart (.5 .5 .5) (-8 -8 -8) (8 8 8)
+Triggers once when the game starts, then no longer does anything.
+-------- KEYS --------
+target: trigger all entities with this targetname when starting the game
+target2: trigger all entities with this targetname when starting the game
+target3: trigger all entities with this targetname when starting the game
+target4: trigger all entities with this targetname when starting the game
+wait: wait so many seconds before triggering
+*/
+
 /*QUAKED misc_follow (.5 .5 .5) (-8 -8 -8) (8 8 8)
 Makes one entity follow another. Will not work with all entities.
 -------- KEYS --------
@@ -1304,3 +1326,67 @@
 model="models/weapons/g_campingrifle.md3"
 */
 
+/*QUAKED func_fourier (0 .5 .8) ?
+Solid entity that oscillates according to a sum of sine waves.
+-------- KEYS --------
+speed: amount of time in seconds for one complete oscillation cycle in the base frequency (default 4).
+height: sets the amount of travel of the oscillation movement (default 32). 
+phase: sets the start offset of the oscillation cycle. Values must be 0 < phase < 1. Any integer phase value is the same as no offset (default 0).
+noise: path/name of .wav or .ogg file to play. Use looping sounds only (e.g. sound/world/drone6.wav - See Notes).
+dmg: damage a player who gets crushed by it receives
+dmgtime: interval to apply dmg to a player who is s in the way
+message: death message when a player gets crushed
+message2: death message when someone gets pushed into this (default: "was thrown into a world of hurt by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
+netname: list of <frequencymultiplier> <phase> <x> <y> <z> quadruples, separated by spaces; note that phase 0 represents a sine wave, and phase 0.25 a cosine wave (by default, it uses 1 0 0 0 1, to match func_bobbing's defaults
+*/
+
+/*QUAKED func_vectormamamam (0 .5 .8) ? PROJECT_ON_TARGETNORMAL TARGET2NORMAL_IS_DIRECTION TARGET3NORMAL_IS_DIRECTION TARGET4NORMAL_IS_DIRECTION
+Solid entity that moves according to the movement of multiple given entities (max 4)
+-------- KEYS --------
+target: first reference entity
+targetfactor: factor by which to take the first reference entity (default 1).
+targetnormal: if set, the first reference entity's location is first projected onto a plane with that normal
+target2: second reference entity
+target2factor: factor by which to take the second reference entity (default 1).
+target2normal: if set, the second reference entity's location is first projected onto a plane with that normal
+target3: third reference entity (optional)
+target3factor: factor by which to take the third reference entity (default 1).
+target3normal: if set, the third reference entity's location is first projected onto a plane with that normal
+target4: fourth reference entity (optional)
+target4factor: factor by which to take the fourth reference entity (default 1).
+target4normal: if set, the fourth reference entity's location is first projected onto a plane with that normal
+noise: path/name of .wav or .ogg file to play. Use looping sounds only (e.g. sound/world/drone6.wav - See Notes).
+dmg: damage a player who gets crushed by it receives
+dmgtime: interval to apply dmg to a player who is s in the way
+message: death message when a player gets crushed
+message2: death message when someone gets pushed into this (default: "was thrown into a world of hurt by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
+-------- SPAWNFLAGS --------
+PROJECT_ON_TARGETNORMAL: target's origin is projected onto the given direction vector, not on the plane perpendicular to it
+PROJECT_ON_TARGET2NORMAL: target2's origin is projected onto the given direction vector, not on the plane perpendicular to it
+PROJECT_ON_TARGET3NORMAL: target3's origin is projected onto the given direction vector, not on the plane perpendicular to it
+PROJECT_ON_TARGET4NORMAL: target4's origin is projected onto the given direction vector, not on the plane perpendicular to it
+*/
+
+/*QUAKED trigger_relay_teamcheck (.5 .5 .5) (-8 -8 -8) (8 8 8) NOTEAM_TOO INVERT
+Works similar to trigger_relay, but only relays trigger events if the team of the activator matches this entity's team
+-------- KEYS --------
+target: trigger all entities with this targetname when triggered
+target2: trigger all entities with this targetname when triggered
+target3: trigger all entities with this targetname when triggered
+target4: trigger all entities with this targetname when triggered
+targetname: name that identifies this entity so it can be triggered
+delay: delay the triggering by the given time
+message: print this message to the player who activated the trigger
+killtarget: remove all entities with this targetname when triggered
+team: 5 for red, 14 for blue, 13 for yellow, 10 for pink team
+-------- SPAWNFLAGS --------
+NOTEAM_TOO: also relay events if the activator has no team set
+INVERT: only relay the event if this entity has the matching team
+*/
+
+/*QUAKED trigger_disablerelay (.5 .5 .5) (-8 -8 -8) (8 8 8) 
+Disables a trigger_relay temporarily (until triggered again)
+-------- KEYS --------
+target: disable/enable all relays with this targetname when triggered
+targetname: name that identifies this entity so it can be triggered
+*/

Modified: branches/nexuiz-2.0/data/scripts/shaderlist.txt
===================================================================
--- branches/nexuiz-2.0/data/scripts/shaderlist.txt	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/scripts/shaderlist.txt	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,46 +1,47 @@
-blacksky
-common
-dsi
-e7
-el3dm1
-evil1_grates
-evil2
-evil3
-evil4_techtrims
-evil5
-evil6_floors
-evil6_lights
-evil6_support
-evil6_trims
-evil6_walls
-evil8_base
+blacksky
+common
+dsi
+e7
+el3dm1
+evil1_grates
+evil2
+evil3
+evil4_techtrims
+evil5
+evil6_floors
+evil6_lights
+evil6_support
+evil6_trims
+evil6_walls
+evil8_base
 eX
 final_rage
-flags
-harlequin_sky
-kaznexctf2
-leiprojectile
-liquids
-mflag
-morphed
-nexdm18_rmx
+flags
+harlequin_sky
+kaznexctf2
+leiprojectile
+liquids
+mandelbrotsky
+mflag
+morphed
+nexdm18_rmx
 official_cmp1
-portals
-reaper
-ruiner
-savdm6ish
-sav-graysky1
-sav-liquids
-sfx
-stralenex1
-stralenex8
-strength
-swamp
-terrain_alphafade
-terrain_dotproduct2projected
-terrain_dotproduct2
-test3
-toxic
-tree
-tznex01
-water
+portals
+reaper
+ruiner
+savdm6ish
+sav-graysky1
+sav-liquids
+sfx
+stralenex1
+stralenex8
+strength
+swamp
+terrain_alphafade
+terrain_dotproduct2
+terrain_dotproduct2projected
+test3
+toxic
+tree
+tznex01
+water

Copied: branches/nexuiz-2.0/data/sound/misc/medplat1.ogg (from rev 5656, trunk/data/sound/misc/medplat1.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/misc/medplat1.wav
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/misc/medplat2.ogg (from rev 5656, trunk/data/sound/misc/medplat2.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/misc/medplat2.wav
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/misc/powerup.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/plats/medplat1.ogg (from rev 5656, trunk/data/sound/plats/medplat1.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/plats/medplat1.wav
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/plats/medplat2.ogg (from rev 5656, trunk/data/sound/plats/medplat2.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/plats/medplat2.wav
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/campingrifle_fire.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/campingrifle_reload.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/crylink_fire2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/crylink_impact.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/crylink_impact2.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/weapons/electro_fly.ogg (from rev 5656, trunk/data/sound/weapons/electro_fly.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/weapons/electro_fly.wav
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/hagexp2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/hookbomb_fire.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/hookbomb_impact.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/weapons/rocket_fly.ogg (from rev 5656, trunk/data/sound/weapons/rocket_fly.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/weapons/rocket_fly.wav
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/rocket_mode.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/seeker_fire.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/shotgun_fire.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/weapons/tag_rocket_fly.ogg (from rev 5656, trunk/data/sound/weapons/tag_rocket_fly.ogg)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/weapons/tag_rocket_fly.wav
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/weapons/uzi_fire.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/eggandbacon (from rev 5656, trunk/data/textures/eggandbacon)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_floor (from rev 5656, trunk/data/textures/egyptsoc_floor)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_mat (from rev 5656, trunk/data/textures/egyptsoc_mat)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_sfx (from rev 5656, trunk/data/textures/egyptsoc_sfx)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_trim (from rev 5656, trunk/data/textures/egyptsoc_trim)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_trimd (from rev 5656, trunk/data/textures/egyptsoc_trimd)

Copied: branches/nexuiz-2.0/data/textures/egyptsoc_wall (from rev 5656, trunk/data/textures/egyptsoc_wall)

Modified: branches/nexuiz-2.0/data/textures/flags/flag_blue_norm.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/flags/flag_red_norm.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/portals/portals_blue_norm.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/portals/portals_red_norm.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/update-cvarcount.sh
===================================================================
--- branches/nexuiz-2.0/data/update-cvarcount.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/update-cvarcount.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -2,20 +2,20 @@
 
 countd=`awk '/^seta? g_/ { print $2; }' defaultNexuiz.cfg | sort -u | md5sum | cut -c 1-32`
 countw=`awk '/^seta? g_/ { print $2; }' weapons.cfg       | sort -u | md5sum | cut -c 1-32`
-countp=`awk '/^seta? g_/ { print $2; }' weaponsPro.cfg    | sort -u | md5sum | cut -c 1-32`
+counth=`awk '/^seta? g_/ { print $2; }' weaponsHavoc.cfg  | sort -u | md5sum | cut -c 1-32`
 
-if [ "$countw" != "$countp" ]; then
-	echo "Mismatch between weapons.cfg and weaponsPro.cfg. Aborting."
+if [ "$countw" != "$counth" ]; then
+	echo "Mismatch between weapons.cfg and weaponsHavoc.cfg. Aborting."
 	exit 1
 fi
 
 sed -i "s/^set cvar_check_default .*/set cvar_check_default $countd/" defaultNexuiz.cfg
 sed -i "s/^set cvar_check_weapons .*/set cvar_check_weapons $countw/" weapons.cfg
-sed -i "s/^set cvar_check_weapons .*/set cvar_check_weapons $countw/" weaponsPro.cfg
+sed -i "s/^set cvar_check_weapons .*/set cvar_check_weapons $countw/" weaponsHavoc.cfg
 
 sed -i "s/^string CVAR_CHECK_DEFAULT = .*/string CVAR_CHECK_DEFAULT = \"$countd\";/" qcsrc/server/constants.qh
 sed -i "s/^string CVAR_CHECK_WEAPONS = .*/string CVAR_CHECK_WEAPONS = \"$countw\";/" qcsrc/server/constants.qh
 
-make
+[ -z "$DO_NOT_RUN_MAKE" ] && make
 
-echo "New checksums: $countd, $countw"
+echo "New checksums: $countd, $countw; please recompile!"


Property changes on: branches/nexuiz-2.0/data/update-cvarcount.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/nexuiz-2.0/data/weapons.cfg
===================================================================
--- branches/nexuiz-2.0/data/weapons.cfg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/weapons.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -3,7 +3,7 @@
 //
 // And... don't forget to edit weaponsPro.cfg too.
 
-set cvar_check_weapons 0ce586134eb7097440e850031829efe6
+set cvar_check_weapons 2a35f7139825257d468d22354209cf54
 
 set g_start_weapon_laser 1
 set g_start_weapon_shotgun 1
@@ -241,11 +241,12 @@
 set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 
 // TESTING: on-hand hook with bomb
-set g_balance_hook_primary_ammo 1 // hook monkeys
-set g_balance_hook_primary_refire 0 // hook monkeys
+set g_balance_hook_primary_ammo 2 // hook monkeys set 0
+set g_balance_hook_primary_refire 0 // hook monkeys set 0
 set g_balance_hook_primary_animtime 0.3 // good shoot anim
 set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_ammodecrease_delay 2.5 // no ammo used if nagative or 0
+set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
+set g_balance_hook_primary_hooked_ammodecrease_delay 0.5 // remove one cell every 0.5 seconds
 set g_balance_hook_secondary_damage 25 // not much
 set g_balance_hook_secondary_edgedamage 5 // not much
 set g_balance_hook_secondary_radius 500 // LOTS
@@ -347,9 +348,9 @@
 
 // NOTE: maps should not use this weapon yet
 set g_balance_campingrifle_magazinecapacity 12
-set g_balance_campingrifle_reloadtime 1.4
-set g_balance_campingrifle_primary_damage 90
-set g_balance_campingrifle_primary_headshotaddeddamage 160
+set g_balance_campingrifle_reloadtime 1.1 // this + primary animtime = 1.4 = exactly 2 shots
+set g_balance_campingrifle_primary_damage 80
+set g_balance_campingrifle_primary_headshotaddeddamage 120
 set g_balance_campingrifle_primary_spread 0
 set g_balance_campingrifle_primary_force 2
 set g_balance_campingrifle_primary_speed 35000
@@ -358,8 +359,8 @@
 set g_balance_campingrifle_primary_animtime 0.3
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_secondary_damage 60
-set g_balance_campingrifle_secondary_headshotaddeddamage 0
+set g_balance_campingrifle_secondary_damage 42
+set g_balance_campingrifle_secondary_headshotaddeddamage 18 // 60 damage only on head
 set g_balance_campingrifle_secondary_spread 0.008
 set g_balance_campingrifle_secondary_force 1
 set g_balance_campingrifle_secondary_speed 20000

Deleted: branches/nexuiz-2.0/data/weaponsPro.cfg
===================================================================
--- branches/nexuiz-2.0/data/weaponsPro.cfg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/data/weaponsPro.cfg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,366 +0,0 @@
-set cvar_check_weapons 0ce586134eb7097440e850031829efe6
-
-set g_start_weapon_laser 1
-set g_start_weapon_shotgun 1
-set g_start_weapon_uzi 0
-set g_start_weapon_grenadelauncher 0
-set g_start_weapon_electro 0
-set g_start_weapon_crylink 0
-set g_start_weapon_nex 0
-set g_start_weapon_hagar 0
-set g_start_weapon_rocketlauncher 0
-set g_start_weapon_minstanex 0
-set g_start_weapon_porto 0
-set g_start_weapon_hook 0
-set g_start_weapon_hlac 0
-set g_start_weapon_seeker 0
-set g_start_weapon_campingrifle 0
-set g_start_ammo_shells 40
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_pickup_shells 30
-set g_pickup_shells_max 120
-set g_pickup_nails 50
-set g_pickup_nails_max 200
-set g_pickup_rockets 30
-set g_pickup_rockets_max 120
-set g_pickup_cells 30
-set g_pickup_cells_max 120
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 200
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 100
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 200
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 100
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 100
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 100
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 200
-set g_pickup_respawntime_short 15
-set g_pickup_respawntime_medium 20
-set g_pickup_respawntime_long 30
-set g_pickup_respawntime_powerup 120
-set g_pickup_respawntime_weapon 15
-set g_pickup_respawntime_ammo 15
-
-set g_balance_laser_primary_damage 20
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 400
-set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 9000
-set g_balance_laser_primary_refire 0.3
-set g_balance_laser_primary_animtime 0.3
-set g_balance_laser_primary_lifetime 30
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 20
-set g_balance_laser_secondary_edgedamage 10
-set g_balance_laser_secondary_force 400
-set g_balance_laser_secondary_radius 70
-set g_balance_laser_secondary_speed 9000
-set g_balance_laser_secondary_refire 0.3
-set g_balance_laser_secondary_animtime 0.3
-set g_balance_laser_secondary_lifetime 30
-
-set g_balance_shotgun_primary_bullets 4
-set g_balance_shotgun_primary_damage 6
-set g_balance_shotgun_primary_force 0
-set g_balance_shotgun_primary_spread 0.06
-set g_balance_shotgun_primary_refire 0.3
-set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_secondary_bullets 4
-set g_balance_shotgun_secondary_damage 6
-set g_balance_shotgun_secondary_force 0
-set g_balance_shotgun_secondary_spread 0.06
-set g_balance_shotgun_secondary_refire 1
-set g_balance_shotgun_secondary_animtime 0.2
-set g_balance_shotgun_secondary_ammo 1
-
-set g_balance_uzi_first_damage 30
-set g_balance_uzi_first_force 0
-set g_balance_uzi_first_spread 0.01
-set g_balance_uzi_first_refire 0.4
-set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 10
-set g_balance_uzi_sustained_force 0
-set g_balance_uzi_sustained_spread 0.03
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_grenadelauncher_primary_damage 60
-set g_balance_grenadelauncher_primary_edgedamage 20
-set g_balance_grenadelauncher_primary_force 400
-set g_balance_grenadelauncher_primary_radius 140
-set g_balance_grenadelauncher_primary_speed 2000
-set g_balance_grenadelauncher_primary_speed_up 200
-set g_balance_grenadelauncher_primary_lifetime 30
-set g_balance_grenadelauncher_primary_refire 0.5
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_secondary_damage 60
-set g_balance_grenadelauncher_secondary_edgedamage 20
-set g_balance_grenadelauncher_secondary_force 400
-set g_balance_grenadelauncher_secondary_radius 140
-set g_balance_grenadelauncher_secondary_speed 1400
-set g_balance_grenadelauncher_secondary_speed_up 200
-set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_refire 0.5
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 10
-
-set g_balance_electro_primary_damage 50
-set g_balance_electro_primary_edgedamage 10
-set g_balance_electro_primary_force 200
-set g_balance_electro_primary_radius 200
-set g_balance_electro_primary_speed 2000
-set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.5
-set g_balance_electro_primary_animtime 0.3
-set g_balance_electro_primary_ammo 2
-set g_balance_electro_secondary_damage 50
-set g_balance_electro_secondary_spread 0
-set g_balance_electro_secondary_edgedamage 10
-set g_balance_electro_secondary_force 200
-set g_balance_electro_secondary_radius 200
-set g_balance_electro_secondary_speed 700
-set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_lifetime 5
-set g_balance_electro_secondary_refire 0.3
-set g_balance_electro_secondary_animtime 0.3
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 5
-set g_balance_electro_combo_damage 70
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 200
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_speed 2000
-
-set g_balance_crylink_primary_damage 15
-set g_balance_crylink_primary_edgedamage 0
-set g_balance_crylink_primary_force 0
-set g_balance_crylink_primary_radius 20
-set g_balance_crylink_primary_speed 7000
-set g_balance_crylink_primary_spread 0
-set g_balance_crylink_primary_shots 1
-set g_balance_crylink_primary_bounces 0
-set g_balance_crylink_primary_refire 0.1
-set g_balance_crylink_primary_animtime 0.1
-set g_balance_crylink_primary_ammo 1
-set g_balance_crylink_primary_bouncedamagefactor 0.5
-
-set g_balance_crylink_primary_middle_lifetime 30 // range: virtually infinite
-set g_balance_crylink_primary_middle_fadetime 0
-set g_balance_crylink_primary_star_lifetime 0.1 // range: 700 full, fades to 2100
-set g_balance_crylink_primary_star_fadetime 0.2
-set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2100
-set g_balance_crylink_primary_other_fadetime 0.2
-
-set g_balance_crylink_secondary_damage 15
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force 100
-set g_balance_crylink_secondary_radius 20
-set g_balance_crylink_secondary_speed 7000
-set g_balance_crylink_secondary_spread 0.08
-set g_balance_crylink_secondary_shots 5
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.6
-set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 5
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-
-set g_balance_crylink_secondary_middle_lifetime 30 // range: virtually infinite
-set g_balance_crylink_secondary_middle_fadetime 0
-set g_balance_crylink_secondary_line_lifetime 30 // range: virtually infinite
-set g_balance_crylink_secondary_line_fadetime 0
-
-set g_balance_nex_damage 70
-set g_balance_nex_force 0
-set g_balance_nex_refire 0.7
-set g_balance_nex_animtime 0.3
-set g_balance_nex_ammo 5
-
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-
-set g_balance_hagar_primary_damage 40
-set g_balance_hagar_primary_edgedamage 20
-set g_balance_hagar_primary_force 0
-set g_balance_hagar_primary_radius 120
-set g_balance_hagar_primary_spread 0
-set g_balance_hagar_primary_speed 3000
-set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.3
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary_damage 40
-set g_balance_hagar_secondary_edgedamage 20
-set g_balance_hagar_secondary_force 0
-set g_balance_hagar_secondary_radius 120
-set g_balance_hagar_secondary_spread 0
-set g_balance_hagar_secondary_speed 1400
-set g_balance_hagar_secondary_lifetime 30
-set g_balance_hagar_secondary_refire 0.3
-set g_balance_hagar_secondary_ammo 1
-
-set g_balance_rocketlauncher_damage 90
-set g_balance_rocketlauncher_edgedamage 45
-set g_balance_rocketlauncher_force 800
-set g_balance_rocketlauncher_radius 110
-set g_balance_rocketlauncher_speed 1000
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
-set g_balance_rocketlauncher_lifetime 30
-set g_balance_rocketlauncher_refire 1
-set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 30
-set g_balance_rocketlauncher_detonatedelay 0.2 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_laserguided_speed 1000  //650
-set g_balance_rocketlauncher_laserguided_speedaccel 0
-set g_balance_rocketlauncher_laserguided_speedstart 1000
-set g_balance_rocketlauncher_laserguided_turnrate	0.75  //0.5
-set g_balance_rocketlauncher_laserguided_allow_steal	1
-
-// TESTING: port-o-launch
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_speed 2000
-set g_balance_porto_primary_lifetime 30
-set g_balance_porto_primary_ammo 25
-set g_balance_portal_health 200 // these get recharged whenever the portal is used
-set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
-
-// TESTING: on-hand hook with bomb
-set g_balance_hook_primary_ammo 1 // hook monkeys
-set g_balance_hook_primary_refire 0 // hook monkeys
-set g_balance_hook_primary_animtime 0.3 // good shoot anim
-set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_ammodecrease_delay 2.5 // no ammo used if nagative or 0
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 500 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 25 // a whole pack
-set g_balance_hook_secondary_lifetime 30 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.3 // good shoot anim
-set g_balance_hook_secondary_power 3 // effect behaves like a square function
-set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
-
-// HLAC 
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.25
-set g_balance_hlac_primary_spread_add 0.0045
-set g_balance_hlac_primary_spread_crouchmod 0.25
-
-set g_balance_hlac_primary_damage 23
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 100
-set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
-set g_balance_hlac_primary_lifetime 5
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.1
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary_spread 0.15
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 23
-set g_balance_hlac_secondary_edgedamage 10
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.3
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
-
-
-// TAG Seeker
-set g_balance_seeker_tag_speed   9000
-set g_balance_seeker_tag_ammo    1
-set g_balance_seeker_tag_animtime 0.1
-set g_balance_seeker_tag_refire  0.7
-
-set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_activate_delay 0.1
-
-set g_balance_seeker_missile_speed        700
-set g_balance_seeker_missile_accel		1.05
-set g_balance_seeker_missile_decel		0.9
-
-set g_balance_seeker_missile_speed_max    1250
-set g_balance_seeker_missile_turnrate     0.65
-
-set g_balance_seeker_missile_damage       40
-set g_balance_seeker_missile_edgedamage   10
-set g_balance_seeker_missile_radius       80
-set g_balance_seeker_missile_force        250
-
-set g_balance_seeker_missile_count		    4
-set g_balance_seeker_missile_lifetime 	    15
-set g_balance_seeker_missile_refire           0.5
-set g_balance_seeker_missile_animtime 	    0.25
-set g_balance_seeker_missile_ammo             2
-
-set g_balance_seeker_missile_proxy            0
-set g_balance_seeker_missile_proxy_maxrange   45
-set g_balance_seeker_missile_proxy_delay      0.2
-
-// World avoidance
-set g_balance_seeker_missile_smart             1
-set g_balance_seeker_missile_smart_mindist     800
-set g_balance_seeker_missile_smart_trace_max   2500
-set g_balance_seeker_missile_smart_trace_min   1000
-// End new seeker
-
-
-set g_balance_seeker_flac_lifetime      0.1
-set g_balance_seeker_flac_lifetime_rand 0.05
-set g_balance_seeker_flac_speed         3000
-set g_balance_seeker_flac_spread	    0.4
-
-set g_balance_seeker_flac_damage       15
-set g_balance_seeker_flac_edgedamage   10
-set g_balance_seeker_flac_radius       100
-set g_balance_seeker_flac_force        50
-
-set g_balance_seeker_flac_refire       0.1
-set g_balance_seeker_flac_animtime     0.1
-set g_balance_seeker_flac_ammo         0.5
-
-// NOTE: maps should not use this weapon yet
-set g_balance_campingrifle_magazinecapacity 12
-set g_balance_campingrifle_reloadtime 1.4
-set g_balance_campingrifle_primary_damage 90
-set g_balance_campingrifle_primary_headshotaddeddamage 160
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.7
-set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_secondary_damage 60
-set g_balance_campingrifle_secondary_headshotaddeddamage 0
-set g_balance_campingrifle_secondary_spread 0.008
-set g_balance_campingrifle_secondary_force 1
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.12
-set g_balance_campingrifle_secondary_animtime 0.06
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_health 5
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu

Copied: branches/nexuiz-2.0/havoc (from rev 5656, trunk/havoc)

Copied: branches/nexuiz-2.0/misc/artwork (from rev 5656, trunk/misc/artwork)

Deleted: branches/nexuiz-2.0/misc/assault-circuit-board-creator.pl
===================================================================
--- branches/nexuiz-2.0/misc/assault-circuit-board-creator.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/assault-circuit-board-creator.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,278 +0,0 @@
-#!/usr/bin/perl
-
-# script that creates an "assault circuit"
-
-use strict;
-use warnings;
-
-my @objectives = @ARGV;
-
-if(!@objectives)
-{
-	print STDERR <<EOF;
-Assault Circuit Board Creator
-
-Usage: 
-  [brushprimit=1 \\]
-  [ofs_x=offset \\]
-  [ofs_y=offset \\]
-  [ofs_z=offset \\]
-  perl $0 breakables1[,buttons1] breakables2[,buttons2] breakables3[,buttons3] ... \\
-  > file.map
-
-Example:
-  ofs_z=1024 perl $0 1 1 3,2 1 > assault.map
-EOF
-	exit 1;
-}
-
-my $bp = $ENV{brushprimit};
-my @ofs = ($ENV{ofs_x} || 0, $ENV{ofs_y} || 0, $ENV{ofs_z} || 0);
-
-my $BRUSHDEF_START = $bp ? "{\nbrushDef\n{" : "{";
-my $BRUSHDEF_END   = $bp ? "}\n}" : "}";
-my $BRUSHDEF_PRE   = $bp ? "( ( 0.03125 0 -0 ) ( -0 0.03125 0 ) ) " : "";
-my $BRUSHDEF_POST  = $bp ? " 0 0 0" : " 0 0 0 0.500000 0.500000 0 0 0";
-
-sub BrushRectangle($@@)
-{
-    my ($shader, $x0, $y0, $z0, $x1, $y1, $z1) = @_;
-    return <<EOF;
-$BRUSHDEF_START
-( $x1 $y1 $z1 ) ( $x1 $y0 $z1 ) ( $x0 $y1 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-( $x1 $y1 $z1 ) ( $x0 $y1 $z1 ) ( $x1 $y1 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-( $x1 $y1 $z1 ) ( $x1 $y1 $z0 ) ( $x1 $y0 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-( $x0 $y0 $z0 ) ( $x1 $y0 $z0 ) ( $x0 $y1 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-( $x0 $y0 $z0 ) ( $x0 $y0 $z1 ) ( $x1 $y0 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-( $x0 $y0 $z0 ) ( $x0 $y1 $z0 ) ( $x0 $y0 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
-$BRUSHDEF_END
-EOF
-}
-
-sub Entity(%)
-{
-	my (%h) = @_;
-	my @brushes = ();
-	if(ref $h{model} eq 'ARRAY')
-	{
-		@brushes = @{$h{model}};
-		delete $h{model};
-	}
-	return join "", ("{\n", (map { qq{"$_" "$h{$_}"\n} } keys %h), @brushes, "}\n");
-	# "
-}
-
-sub FindDamage($)
-{
-	my ($cnt) = @_;
-
-	my $dmg;
-
-	# 1. divisible by 10?
-	$dmg = (1 + int(10 / $cnt)) * 10;
-	return $dmg
-		if $dmg * ($cnt - 1) < 100;
-
-	# 2. divisible by 5?
-	$dmg = (1 + int(20 / $cnt)) * 5;
-	return $dmg
-		if $dmg * ($cnt - 1) < 100;
-
-	# 3. divisible by 2?
-	$dmg = (1 + int(50 / $cnt)) * 2;
-	return $dmg
-		if $dmg * ($cnt - 1) < 100;
-
-	# 4. divisible by 1?
-	$dmg = (1 + int(100 / $cnt));
-	return $dmg
-		if $dmg * ($cnt - 1) < 100;
-
-	# 5. give up
-	return (100 / $cnt + 100 / ($cnt + 1)) / 2;
-}
-
-sub ObjectiveSpawns($@)
-{
-	my ($target, $x, $y, $z) = @_;
-
-	my @l = ();
-
-	$z -= 64;
-
-	for(1..6)
-	{
-		my $xx = $x - 32;
-		my $yy = $y + ($_ - 3.5) * 64;
-		my $zz = $z - 8 - 32; # align feet to 64-grid
-		push @l, Entity
-			classname => "info_player_attacker",
-			target => $target,
-			origin => "$xx $yy $zz";
-
-		$xx = $x + 32;
-		push @l, Entity
-			classname => "info_player_defender",
-			target => $target,
-			origin => "$xx $yy $zz";
-	}
-
-	return @l;
-}
-
-my @assault_entities = ();
-
-my $obj_prev = undef;
-my $des_prev = undef;
-
-my @prevorigin = @ofs;
-
-for my $i(0.. at objectives - 1)
-{
-	my @origin =
-	(
-		$ofs[0] + ($i + 1) * 256,
-		$ofs[1] + 0,
-		$ofs[2] + 0
-	);
-
-	my $count = $objectives[$i];
-	$count =~ /^(\d+)(?:,(\d+))?$/s
-		or die "Invalid count spec: must be number or number,number";
-	my $count_destroy = $1;
-	my $count_push = $2 || 0;
-	$count = $count_destroy + $count_push;
-
-	my $obj = "obj$i";
-	my $des = "obj$i\_destructible";
-	my $dec = "obj$i\_decrease";
-
-	if($i == 0)
-	{
-		push @assault_entities, Entity
-			classname => "target_assault_roundstart",
-			target => $obj,
-			target2 => $des,
-			origin => "@prevorigin";
-	}
-	else
-	{
-		push @assault_entities, Entity
-			classname => "target_objective",
-			targetname => $obj_prev,
-			target => $obj,
-			target2 => $des,
-			origin => "@prevorigin";
-
-		push @assault_entities, ObjectiveSpawns $obj_prev, @prevorigin;
-
-		push @assault_entities, Entity
-			classname => "func_assault_wall",
-			target => $obj_prev,
-			model => [
-				BrushRectangle
-					"dsi/dsiglass",
-					$origin[0] - 128 - 32,
-					$origin[1] - 512,
-					$origin[2] - 512,
-					$origin[0] - 128 + 32,
-					$origin[1] + 512,
-					$origin[2] + 512
-			];
-	}
-
-	@prevorigin = @origin;
-
-	$origin[2] += 64;
-
-	my $dmg = FindDamage($count);
-
-	push @assault_entities, Entity
-		classname => "target_objective_decrease",
-		targetname => $dec,
-		target => $obj,
-		dmg => $dmg,
-		origin => "@origin";
-
-	$origin[2] += 64;
-
-	for(1..$count_destroy)
-	{
-		push @assault_entities, Entity
-			classname => "func_assault_destructible",
-			targetname => $des,
-			target => $dec,
-			health => 1000,
-			mdl => "rocket_explode",
-			count => 1,
-			noise => "weapons/rocket_impact.wav",
-			dmg => 50,
-			dmg_edge => 0,
-			dmg_radius => 150,
-			dmg_force => 200,
-			model => [
-				BrushRectangle
-					"dsi/cretebase",
-					$origin[0] - 16,
-					$origin[1] - 16,
-					$origin[2] - 16,
-					$origin[0] + 16,
-					$origin[1] + 16,
-					$origin[2] + 16
-			];
-
-		$origin[2] += 64;
-	}
-
-	for(1..$count_push)
-	{
-		push @assault_entities, Entity
-			classname => "func_button",
-			target => $dec,
-			angle => -2,
-			model => [
-				BrushRectangle
-					"dsi/dablue",
-					$origin[0] - 16,
-					$origin[1] - 16,
-					$origin[2] - 16,
-					$origin[0] + 16,
-					$origin[1] + 16,
-					$origin[2] + 16
-			];
-
-		$origin[2] += 64;
-	}
-
-	$obj_prev = $obj;
-	$des_prev = $des;
-}
-
-my $obj = "roundend";
-my @origin =
-(
-	$ofs[0] + (@objectives + 1) * 256,
-	$ofs[1] + 0,
-	$ofs[2] + 0
-);
-
-push @assault_entities, Entity
-	classname => "target_objective",
-	targetname => $obj_prev,
-	target => $obj,
-	origin => "@prevorigin";
-
-push @assault_entities, ObjectiveSpawns $obj_prev, @prevorigin;
-
-push @assault_entities, Entity
-	classname => "target_assault_roundend",
-	targetname => $obj,
-	origin => "@origin";
-
-my $map = join "",
-(
-	Entity(classname => "worldspawn"),
-	@assault_entities
-);
-
-print $map;

Deleted: branches/nexuiz-2.0/misc/autoshader.sh
===================================================================
--- branches/nexuiz-2.0/misc/autoshader.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/autoshader.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,195 +0,0 @@
-#!/bin/sh
-
-if ! [ -d "textures" ] && ! [ -d "env" ]; then
-	echo "Sorry, must be run from a directory with a textures subfolder. Giving up."
-	exit 1
-fi
-
-case "$0" in
-	*/*)
-		mydir=${0%/*}
-		;;
-	*)
-		mydir=.
-		;;
-esac
-
-makeshader()
-{
-	s=`texnormalize "$1"`
-	dir=${s#textures/}
-	dir=${dir%%/*}
-	echo scripts/$dir.shader
-	mkdir -p scripts
-	cat <<EOF >>"scripts/$dir.shader"
-$s
-{
-	qer_editorimage $1
-	qer_trans 0.5
-	// maybe: surfaceparm nonsolid
-	surfaceparm trans
-	surfaceparm alphashadow
-	surfaceparm nomarks
-	cull disable
-	{
-		map $s
-		blendfunc blend
-		// or: alphafunc GE128
-	}
-	{
-		map \$lightmap
-		blendfunc filter
-		rgbGen identity
-	}
-}
-EOF
-}
-
-makeskyshader()
-{
-	coords=`sh "$mydir/brightspot.sh" "$1"`
-	s=`texnormalize "$1"`
-	case "$coords" in
-		*\ *)
-			;;
-		*)
-			coords="-42 -42"
-			echo >&2 "NOTE: brightspot tool did not work"
-			;;
-	esac
-	s=${s%_up}
-	s=${s#env/}
-	dir=${s%%/*}
-	echo >&2 "appending to scripts/$dir.shader"
-	echo scripts/$dir.shader
-	mkdir -p scripts
-	cat <<EOF >>"scripts/$dir.shader"
-textures/$s
-{
-	qer_editorimage $1
-	surfaceparm noimpact
-	surfaceparm nolightmap
-	surfaceparm sky
-	surfaceparm nomarks
-	q3map_sunExt .5 .5 .7 $coords 2 16 // red green blue intensity degrees elevation deviance samples
-	q3map_surfacelight 150 // intensity
-	skyparms env/$s - -
-}
-EOF
-}
-
-texnormalize()
-{
-	echo "$1" | sed 's/\.[Jj][Pp][Gg]$\|\.[Tt][Gg][Aa]$\|\.[Pp][Nn][Gg]$//;'
-}
-
-allshadernames() # prints all shader names or texture names
-{
-	cat scripts/*.shader 2>/dev/null | tr '\r' '\n' | {
-		mode=root
-		while IFS= read -r LINE; do
-			LINE=`echo "$LINE" | sed 's,//.*,,; s/\s\+/ /g; s/^ //; s/ $//; s/"//g;'`
-			[ -n "$LINE" ] || continue
-			set -- $LINE
-			case "$mode:$1" in
-				root:'{')
-					mode=shader
-					;;
-				root:*)
-					texnormalize "$1"
-					;;
-
-				shader:'{')
-					mode=stage
-					;;
-				shader:'}')
-					mode=root
-					;;
-				shader:skyparms)
-					echo "`texnormalize "$1"`_up"
-					;;
-
-				stage:'}')
-					mode=shader
-					;;
-				stage:map)
-					texnormalize "$2"
-					;;
-				stage:clampmap)
-					texnormalize "$2"
-					;;
-				stage:animmap)
-					shift
-					shift
-					for X in "$@"; do
-						texnormalize "$X"
-					done
-					;;
-			esac
-		done
-	}
-}
-
-allshaders=`allshadernames`
-lf="
-"
-
-has_shader()
-{
-	sh=`texnormalize "$1"`
-	case "$lf$allshaders$lf" in
-		*"$lf$sh$lf"*)
-			return 0
-			;;
-	esac
-	return 1
-}
-
-has_alpha()
-{
-	convert "$1" -depth 8 RGBA:- | xxd -c 4 -g 1 | grep -v " ff  " >/dev/null
-}
-
-autoshaders()
-{
-	{
-		[ -d "textures" ] && find textures -type f \( -iname \*.tga -o -iname \*.png \) -print | while IFS= read -r TEX; do
-			case `texnormalize "$TEX"` in
-				*_norm|*_shirt|*_pants|*_glow|*_gloss|*_bump)
-					# ignore these (they are used implicitly)
-					continue
-					;;
-			esac
-			if has_shader "$TEX"; then
-				echo>&2 "    $TEX has an associated shader, ignoring."
-			else
-				if has_alpha "$TEX"; then
-					echo>&2 "*** $TEX has alpha but no shader, creating default alpha shader."
-					makeshader "$TEX"
-				else
-					echo>&2 "    $TEX has no shader and no alpha, fine."
-				fi
-			fi
-		done
-		[ -d "env" ] && find env -type f \( -iname \*_up.tga -o -iname \*_up.png -o -iname \*_up.jpg \) -print | while IFS= read -r TEX; do
-			if has_shader "$TEX"; then
-				echo>&2 "    $TEX has an associated shader, ignoring."
-			else
-				echo>&2 "*** $TEX is sky but has no shader, creating default sky shader."
-				makeskyshader "$TEX"
-			fi
-		done
-	} | sort -u
-}
-
-aashaders=`autoshaders`
-
-if [ -n "$aashaders" ]; then
-	cat <<EOF
-The following shader files have been automatically created or appended to:
-
-$aashaders
-
-Please edit them to your needs, and possibly rename them.
-EOF
-fi

Deleted: branches/nexuiz-2.0/misc/brightspot.c
===================================================================
--- branches/nexuiz-2.0/misc/brightspot.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/brightspot.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,195 +0,0 @@
-#include <stdio.h>
-#include <math.h>
-
-// USAGE: see brightspot.sh (and in the future brightspot.bat)
-// It should output the right parameters for the sun direction in q3map2's format.
-// But probably is broken.
-
-#define false 0
-#define true 1
-
-int flip[6*3] =
-{
-	false, false,  true, // "rt"
-	 true,  true,  true, // "lf"
-	false,  true, false, // "bk"
-	 true, false, false, // "ft"
-	false, false,  true, // "up"
-	false, false,  true  // "dn"
-};
-
-static const double skyboxtexcoord2f[6*4*2] =
-{
-    // skyside[0]
-    0, 1,
-    1, 1,
-    1, 0,
-    0, 0,
-    // skyside[1]
-    1, 0,
-    0, 0,
-    0, 1,
-    1, 1,
-    // skyside[2]
-    1, 1,
-    1, 0,
-    0, 0,
-    0, 1,
-    // skyside[3]
-    0, 0,
-    0, 1,
-    1, 1,
-    1, 0,
-    // skyside[4]
-    0, 1,
-    1, 1,
-    1, 0,
-    0, 0,
-    // skyside[5]
-    0, 1,
-    1, 1,
-    1, 0,
-    0, 0
-};
-
-
-static const double skyboxvertex3f[6*4*3] =
-{
-        // skyside[0]
-         16, -16,  16,
-         16, -16, -16,
-         16,  16, -16,
-         16,  16,  16,
-        // skyside[1]
-        -16,  16,  16,
-        -16,  16, -16,
-        -16, -16, -16,
-        -16, -16,  16,
-        // skyside[2]
-         16,  16,  16,
-         16,  16, -16,
-        -16,  16, -16,
-        -16,  16,  16,
-        // skyside[3]
-        -16, -16,  16,
-        -16, -16, -16,
-         16, -16, -16,
-         16, -16,  16,
-        // skyside[4]
-        -16, -16,  16,
-         16, -16,  16,
-         16,  16,  16,
-        -16,  16,  16,
-        // skyside[5]
-         16, -16, -16,
-        -16, -16, -16,
-        -16,  16, -16,
-         16,  16, -16
-};
-
-void Unmap2f(double x, double y, const double *corners, double *u, double *v)
-{
-	// x - corners[0] == *u * (corners[2] - corners[0]) + *v * (corners[4] - corners[2]);
-	// y - corners[1] == *u * (corners[3] - corners[1]) + *v * (corners[5] - corners[3]);
-	
-	double xc0 = x - corners[0];
-	double yc1 = y - corners[1];
-	double c20 = corners[2] - corners[0];
-	double c31 = corners[3] - corners[1];
-	double c42 = corners[4] - corners[2];
-	double c53 = corners[5] - corners[3];
-
-	// xc0 == *u * c20 + *v * c42;
-	// yc1 == *u * c31 + *v * c53;
-
-	double det = c20 * c53 - c31 * c42;
-	double du = xc0 * c53 - yc1 * c42;
-	double dv = c20 * yc1 - c31 * xc0;
-
-	*u = du / det;
-	*v = dv / det;
-}
-
-void Map3f(double u, double v, const double *corners, double *x, double *y, double *z)
-{
-	*x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
-	*y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
-	*z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
-}
-
-void MapCoord(int pic, int y, int x, double vec[3])
-{
-	int h;
-	int flipx = flip[3*pic+0];
-	int flipy = flip[3*pic+1];
-	int flipdiag = flip[3*pic+2];
-	double u, v;
-
-	if(flipx)
-		x = 511 - x;
-
-	if(flipy)
-		y = 511 - y;
-
-	if(flipdiag)
-	{
-		h = x; x = y; y = h;
-	}
-
-	Unmap2f((x + 0.5) / 512.0, (y + 0.5) / 512.0, skyboxtexcoord2f + 4*2*pic, &u, &v);
-	Map3f(u, v, skyboxvertex3f + 6*2*pic, &vec[0], &vec[1], &vec[2]);
-}
-
-int main(int argc, char **argv)
-{
-	FILE *f;
-	int i, j, k;
-	unsigned char picture[6][512][512];
-	unsigned char max;
-	double brightvec[3];
-	double pitch, yaw, l;
-
-	if(argc != 2)
-	{
-		fprintf(stderr, "Usage: %s imagefile.gray\n", *argv);
-		return 1;
-	}
-
-	f = fopen(argv[1], "rb");
-	if(!f)
-	{
-		perror("fopen");
-		return 1;
-	}
-	fread(&picture, sizeof(picture), 1, f);
-	fclose(f);
-
-	brightvec[0] = brightvec[1] = brightvec[2] = 0;
-	max = 0;
-	for(i = 0; i < 6; ++i)
-		for(j = 0; j < 512; ++j)
-			for(k = 0; k < 512; ++k)
-				if(picture[i][j][k] > max)
-					max = picture[i][j][k];
-	for(i = 0; i < 6; ++i)
-		for(j = 0; j < 512; ++j)
-			for(k = 0; k < 512; ++k)
-			{
-				double vec[3], f;
-				MapCoord(i, j, k, vec);
-				f = pow(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2], -1.5); // I know what I am doing.
-				f *= exp(10 * (picture[i][j][k] - max));
-				brightvec[0] += f * vec[0];
-				brightvec[1] += f * vec[1];
-				brightvec[2] += f * vec[2];
-			}
-
-	l = sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1] + brightvec[2]*brightvec[2]);
-	fprintf(stderr, "vec = %f %f %f\n", brightvec[0] / l, brightvec[1] / l, brightvec[2] / l);
-	
-	pitch = atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
-	yaw = atan2(brightvec[1], brightvec[0]);
-
-	printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);
-	return 0;
-}

Deleted: branches/nexuiz-2.0/misc/brightspot.sh
===================================================================
--- branches/nexuiz-2.0/misc/brightspot.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/brightspot.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-if [ -z "$1" ]; then
-	echo>&2 "Usage: $0 foo_rt.jpg"
-	exit 1
-fi
-
-brightspot=
-if which brightspot-bin >/dev/null; then
-	brightspot=brightspot-bin
-else
-	case "$0" in
-		*/*)
-			mydir=${0%/*}
-			;;
-		*)
-			mydir=.
-			;;
-	esac
-	brightspot="$mydir/brightspot-bin"
-	[ "$brightspot" -nt "$mydir/brightspot.c" ] || gcc -lm -O3 -Wall -Wextra "$mydir/brightspot.c" -o "$brightspot" || exit 1
-fi
-
-i=$1
-ext=${i##*.}
-name=${i%.*}
-name=${name%_[rlbfud][tfktpn]}
-
-{
-	convert "$name"_rt."$ext" -depth 8 -geometry 512x512 GRAY:-
-	convert "$name"_lf."$ext" -depth 8 -geometry 512x512 GRAY:-
-	convert "$name"_bk."$ext" -depth 8 -geometry 512x512 GRAY:-
-	convert "$name"_ft."$ext" -depth 8 -geometry 512x512 GRAY:-
-	convert "$name"_up."$ext" -depth 8 -geometry 512x512 GRAY:-
-	convert "$name"_dn."$ext" -depth 8 -geometry 512x512 GRAY:-
-} | "$brightspot" /dev/stdin

Deleted: branches/nexuiz-2.0/misc/bsp2ent
===================================================================
--- branches/nexuiz-2.0/misc/bsp2ent	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/bsp2ent	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,39 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use Fcntl qw/:seek/;
-
-sub get($$)
-{
-	my ($fh, $n) = @_;
-	read $fh, my $v, $n
-		or die "read: $!";
-	return $v;
-}
-
-use constant LUMP_ENTITIES => 0;
-
-if(!@ARGV)
-{
-	die "Usage: bsp2ent BSPFILE > ENTFILE\n";
-}
-
-my $bspfile = $ARGV[0];
-open my $fh, '<', $bspfile
-	or die "open $bspfile: $!";
-get($fh, 4) eq 'IBSP'
-	or die "$bspfile is no IBSP";
-unpack('V', get($fh, 4)) == 0x2e
-	or die "$bspfile is no Q3 BSP";
-my @directory = map
-{
-	[unpack('VV', get($fh, 8))] # offset, length
-}
-0..16;
-
-seek($fh, $directory[LUMP_ENTITIES][0], SEEK_SET);
-my $ent = get($fh, $directory[LUMP_ENTITIES][1]);
-$ent =~ s/\000//g;
-
-print $ent;

Deleted: branches/nexuiz-2.0/misc/bsptool.pl
===================================================================
--- branches/nexuiz-2.0/misc/bsptool.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/bsptool.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,515 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use Image::Magick;
-use POSIX qw/floor ceil/;
-
-my @lumpname = qw/entities textures planes nodes leafs leaffaces leafbrushes models brushes brushsides vertices triangles effects faces lightmaps lightgrid pvs advertisements/;
-my %lumpid = map { $lumpname[$_] => $_ } 0.. at lumpname-1;
-my $msg = "";
-my @bsp;
-
-# READ THE BSP
-
-if(!@ARGV || $ARGV[0] eq '-h' || $ARGV[0] eq '--help')
-{
-	print <<EOF;
-Usage:
-  $0 filename.bsp [operations...]
-
-Operations are:
-  Information requests:
-    -i                print info about the BSP file
-    -xlumpname        extract a lump (see -i)
-
-  Changes:
-    -dlumpname        delete a lump (see -i)
-    -rlumpname        replace a lump (see -i) by the data from standard input
-    -gfilename.tga    save the lightgrid as filename.tga (debugging)
-    -Gratio           scale down the lightgrid to reduce BSP file size
-    -ljpgNNN          externalize the lightmaps as JPEG, quality NNN (number from 1 to 100)
-    -lpng             externalize the lightmaps as PNG
-    -ltga             externalize the lightmaps as TGA
-    -mMESSAGE         set the BSP file comment message
-
-  Save commands:
-    -o                actually apply the changes to the BSP
-    -ofilename2.bsp   save the changes to a new BSP file
-EOF
-	exit;
-}
-
-my $fn = shift @ARGV;
-$fn =~ /(.*)\.bsp$/
-	or die "invalid input file name (must be a .bsp): $fn";
-my $basename = $1;
-open my $fh, "<", $fn
-	or die "$fn: $!";
-
-read $fh, my $header, 8;
-
-die "Invalid BSP format"
-	if $header ne "IBSP\x2e\x00\x00\x00";
-
-for(0..16)
-{
-	read $fh, my $lump, 8;
-	my ($offset, $length) = unpack "VV", $lump;
-
-	push @bsp, [$offset, $length, undef];
-}
-
-for(@bsp)
-{
-	my ($offset, $length, $data) = @$_;
-	seek $fh, $offset, 0;
-	read $fh, $data, $length;
-	length $data == $length
-		or die "Incomplete BSP lump at $offset\n";
-	$_->[2] = $data;
-}
-
-close $fh;
-
-# STRUCT DECODING
-
-sub DecodeLump($@)
-{
-	my ($lump, @fields) = @_;
-	my @decoded;
-
-	my $spec = "";
-	my @decoders;
-
-	my $item;
-	my @data;
-	my $idx;
-
-	for(@fields)
-	{
-		if(/^(\w*)=(.*?)(\d*)$/)
-		{
-			$spec .= "$2$3 ";
-			my $f = $1;
-			my $n = $3;
-			if($n eq '')
-			{
-				push @decoders, sub { $item->{$f} = $data[$idx++]; };
-			}
-			else
-			{
-				push @decoders, sub { $item->{$f} = [ map { $data[$idx++] } 1..$n ]; };
-			}
-		}
-	}
-
-	my $itemlen = length pack $spec, ();
-	my $len = length $lump;
-
-	die "Invalid lump size: $len not divisible by $itemlen"
-		if $len % $itemlen;
-
-	my $items = $len / $itemlen;
-	for(0..$items - 1)
-	{
-		@data = unpack $spec, substr $lump, $_ * $itemlen, $itemlen;
-		$item = {};
-		$idx = 0;
-		$_->() for @decoders;
-		push @decoded, $item;
-	}
-	@decoded;
-}
-
-sub EncodeLump($@)
-{
-	my ($items, @fields) = @_;
-	my @decoded;
-
-	my @encoders;
-
-	my $item;
-	my @data;
-	my $idx;
-	my $data = "";
-
-	for(@fields)
-	{
-		if(/^(\w*)=(.*?)(\d*)$/)
-		{
-			my $spec = "$2$3";
-			my $f = $1;
-			my $n = $3;
-			if($n eq '')
-			{
-				push @encoders, sub { $data .= pack $spec, $item->{$f}; };
-			}
-			else
-			{
-				push @encoders, sub { $data .= pack $spec, @{$item->{$f}}; };
-			}
-		}
-	}
-
-	for my $i(@$items)
-	{
-		$item = $i;
-		$_->() for @encoders;
-	}
-
-	$data;
-}
-
-sub EncodeDirection(@)
-{
-	my ($x, $y, $z) = @_;
-
-	return [
-		map { ($_ / 0.02454369260617025967) & 0xFF }
-		(
-			atan2(sqrt($x * $x + $y * $y), $z),
-			atan2($y, $x)
-		)
-	];
-}
-
-sub DecodeDirection($)
-{
-	my ($dir) = @_;
-
-	my ($pitch, $yaw) = map { $_ * 0.02454369260617025967 } @$dir; # maps 256 to 2pi
-
-	return (
-		cos($yaw) * sin($pitch),
-		sin($yaw) * sin($pitch),
-		cos($pitch)
-	);
-}
-
-sub IntervalIntersection($$$$)
-{
-	my ($a, $al, $b, $bl) = @_;
-	my $a0 = $a - 0.5 * $al;
-	my $a1 = $a + 0.5 * $al;
-	my $b0 = $b - 0.5 * $bl;
-	my $b1 = $b + 0.5 * $bl;
-	my $left = ($a0 > $b0) ? $a0 : $b0;
-	my $right = ($a1 > $b1) ? $b1 : $a1;
-	die "Non-intersecting intervals $a $al $b $bl"
-		if $right < $left;
-	return $right - $left;
-}
-
-sub BoxIntersection(@)
-{
-	my ($x, $y, $z, $w, $h, $d, $x2, $y2, $z2, $w2, $h2, $d2) = @_;
-	return
-		IntervalIntersection($x, $w, $x2, $w2)
-		*
-		IntervalIntersection($y, $h, $y2, $h2)
-		*
-		IntervalIntersection($z, $d, $z2, $d2);
-}
-
-# OPTIONS
-
-for(@ARGV)
-{
-	if(/^-i$/) # info
-	{
-		my $total = 17 * 8 + 8 + length($msg);
-		my $max = 0;
-		for(0.. at bsp-1)
-		{
-			my $nl = length $bsp[$_]->[2];
-			$total += $nl;
-			print "BSP lump $_ ($lumpname[$_]): offset $bsp[$_]->[0] length $bsp[$_]->[1] newlength $nl\n";
-			my $endpos = $bsp[$_]->[0] + $bsp[$_]->[1];
-			$max = $endpos if $max < $endpos;
-		}
-		print "BSP file size will change from $max to $total bytes\n";
-	}
-	elsif(/^-d(.+)$/) # delete a lump
-	{
-		my $id = $lumpid{$1};
-		die "invalid lump $1 to remove"
-			unless defined $id;
-		$bsp[$id]->[2] = "";
-	}
-	elsif(/^-r(.+)$/) # replace a lump
-	{
-		my $id = $lumpid{$1};
-		die "invalid lump $1 to replace"
-			unless defined $id;
-		$bsp[$id]->[2] = do { undef local $/; scalar <STDIN>; };
-	}
-	elsif(/^-m(.*)$/) # change the message
-	{
-		$msg = $1;
-	}
-	elsif(/^-l(jpg|png|tga)(\d+)?$/) # externalize lightmaps (deleting the internal ones)
-	{
-		my $ext = $1;
-		my $quality = $2;
-		my %lightmaps = ();
-		my $faces = $bsp[$lumpid{faces}]->[2];
-		my $lightmaps = $bsp[$lumpid{lightmaps}]->[2];
-		my @values = DecodeLump $faces,
-			qw/texture=V effect=V type=V vertex=V n_vertexes=V meshvert=V n_meshverts=V lm_index=V lm_start=f2 lm_size=f2 lm_origin=f3 lm_vec_0=f3 lm_vec_1=f3 normal=f3 size=V2/;
-		my $oddfound = 0;
-		for(@values)
-		{
-			my $l = $_->{lm_index};
-			next if $l >= 2**31; # signed
-			$oddfound = 1
-				if $l % 2;
-			++$lightmaps{$l};
-		}
-		if(!$oddfound)
-		{
-			$lightmaps{$_+1} = $lightmaps{$_} for keys %lightmaps;
-		}
-		for(sort { $a <=> $b } keys %lightmaps)
-		{
-			print STDERR "Lightmap $_ was used $lightmaps{$_} times\n";
-
-			# export that lightmap
-			my $lmsize = 128 * 128 * 3;
-			next if length $lightmaps < ($_ + 1) * $lmsize;
-			my $lmdata = substr $lightmaps, $_ * $lmsize, $lmsize;
-			my $img = Image::Magick->new(size => '128x128', depth => 8, magick => 'RGB');
-			$img->BlobToImage($lmdata);
-			my $outfn = sprintf "%s/lm_%04d.$ext", $basename, $_;
-			mkdir $basename;
-			$img->Set(quality => $quality)
-				if defined $quality;
-			my $err = $img->Write($outfn);
-			die $err
-				if $err;
-			print STDERR "Wrote $outfn\n";
-		}
-
-		# nullify the lightmap lump
-		$bsp[$lumpid{lightmaps}]->[2] = "";
-	}
-	elsif(/^-g(.+)$/) # export light grid as an image (for debugging)
-	{
-		my $filename = $1;
-		my @models = DecodeLump $bsp[$lumpid{models}]->[2],
-			qw/mins=f3 maxs=f3 face=V n_faces=V brush=V n_brushes=V/;
-		my $entities = $bsp[$lumpid{entities}]->[2];
-		my @entitylines = split /\r?\n/, $entities;
-		my $gridsize = "64 64 128";
-		for(@entitylines)
-		{
-			last if $_ eq '}';
-			/^\s*"gridsize"\s+"(.*)"$/
-				and $gridsize = $1;
-		}
-		my @scale = map { 1 / $_ } split / /, $gridsize;
-		my @imins = map { ceil($models[0]{mins}[$_] * $scale[$_]) } 0..2;
-		my @imaxs = map { floor($models[0]{maxs}[$_] * $scale[$_]) } 0..2;
-		my @isize = map { $imaxs[$_] - $imins[$_] + 1 } 0..2;
-		my $isize = $isize[0] * $isize[1] * $isize[2];
-		my @gridcells = DecodeLump $bsp[$lumpid{lightgrid}]->[2],
-			qw/ambient=C3 directional=C3 dir=C2/;
-		die "Cannot decode light grid"
-			unless $isize == @gridcells;
-
-		# sum up the "ambient" light over all pixels
-		my @pixels;
-		my $max = 1;
-		for my $y(0..$isize[1]-1)
-		{
-			for my $x(0..$isize[0]-1)
-			{
-				my ($r, $g, $b) = (0, 0, 0);
-				for my $z(0..$isize[2]-1)
-				{
-					my $cell = $gridcells[$x + $y * $isize[0] + $z * $isize[0] * $isize[1]];
-					$r += $cell->{ambient}->[0];
-					$g += $cell->{ambient}->[1];
-					$b += $cell->{ambient}->[2];
-				}
-				push @pixels, [$r, $g, $b];
-				$max = $r if $max < $r;
-				$max = $g if $max < $g;
-				$max = $b if $max < $b;
-			}
-		}
-		my $pixeldata = "";
-		for my $p(@pixels)
-		{
-			$pixeldata .= pack "CCC", map { 255 * $p->[$_] / $max } 0..2;
-		}
-
-		my $img = Image::Magick->new(size => sprintf("%dx%d", $isize[0], $isize[1]), depth => 8, magick => 'RGB');
-		$img->BlobToImage($pixeldata);
-		$img->Write($filename);
-		print STDERR "Wrote $filename\n";
-	}
-	elsif(/^-G(.+)$/) # decimate light grid
-	{
-		my $decimate = $1;
-		my $filter = 1; # 0 = nearest, 1 = box filter
-
-		my @models = DecodeLump $bsp[$lumpid{models}]->[2],
-			qw/mins=f3 maxs=f3 face=V n_faces=V brush=V n_brushes=V/;
-		my $entities = $bsp[$lumpid{entities}]->[2];
-		my @entitylines = split /\r?\n/, $entities;
-		my $gridsize = "64 64 128";
-		my $gridsizeindex = undef;
-		for(0.. at entitylines-1)
-		{
-			my $l = $entitylines[$_];
-			last if $l eq '}';
-			if($l =~ /^\s*"gridsize"\s+"(.*)"$/)
-			{
-				$gridsize = $1;
-				$gridsizeindex = $_;
-			}
-		}
-		my @scale = map { 1 / $_ } split / /, $gridsize;
-		my @imins = map { ceil($models[0]{mins}[$_] * $scale[$_]) } 0..2;
-		my @imaxs = map { floor($models[0]{maxs}[$_] * $scale[$_]) } 0..2;
-		my @isize = map { $imaxs[$_] - $imins[$_] + 1 } 0..2;
-		my $isize = $isize[0] * $isize[1] * $isize[2];
-		my @gridcells = DecodeLump $bsp[$lumpid{lightgrid}]->[2],
-			qw/ambient=C3 directional=C3 dir=C2/;
-		die "Cannot decode light grid"
-			unless $isize == @gridcells;
-
-		# get the new grid size values
-		my @newscale = map { $_ / $decimate } @scale;
-		my $newgridsize = join " ", map { 1 / $_ } @newscale;
-		my @newimins = map { ceil($models[0]{mins}[$_] * $newscale[$_]) } 0..2;
-		my @newimaxs = map { floor($models[0]{maxs}[$_] * $newscale[$_]) } 0..2;
-		my @newisize = map { $newimaxs[$_] - $newimins[$_] + 1 } 0..2;
-
-		# do the decimation
-		my @newgridcells = ();
-		for my $z($newimins[2]..$newimaxs[2])
-		{
-			# the coords are MIDPOINTS of the grid cells!
-			my @oldz = grep { $_ >= $imins[2] && $_ <= $imaxs[2] } floor(($z - 0.5) * $decimate + 0.5) .. ceil(($z + 0.5) * $decimate - 0.5);
-			my $innerz_raw = $z * $decimate;
-			my $innerz = floor($innerz_raw + 0.5);
-			$innerz = $imins[2] if $innerz < $imins[2];
-			$innerz = $imaxs[2] if $innerz > $imaxs[2];
-			for my $y($newimins[1]..$newimaxs[1])
-			{
-				my @oldy = grep { $_ >= $imins[1] && $_ <= $imaxs[1] } floor(($y - 0.5) * $decimate + 0.5) .. ceil(($y + 0.5) * $decimate - 0.5);
-				my $innery_raw = $y * $decimate;
-				my $innery = floor($innery_raw + 0.5);
-				$innery = $imins[1] if $innery < $imins[1];
-				$innery = $imaxs[1] if $innery > $imaxs[1];
-				for my $x($newimins[0]..$newimaxs[0])
-				{
-					my @oldx = grep { $_ >= $imins[0] && $_ <= $imaxs[0] } floor(($x - 0.5) * $decimate + 0.5) .. ceil(($x + 0.5) * $decimate - 0.5);
-					my $innerx_raw = $x * $decimate;
-					my $innerx = floor($innerx_raw + 0.5);
-					$innerx = $imins[0] if $innerx < $imins[0];
-					$innerx = $imaxs[0] if $innerx > $imaxs[0];
-
-					my @vec = (0, 0, 0);
-					my @dir = (0, 0, 0);
-					my @amb = (0, 0, 0);
-					my $weight = 0;
-					my $innercell = $gridcells[($innerx - $imins[0]) + $isize[0] * ($innery - $imins[1]) + $isize[0] * $isize[1] * ($innerz - $imins[2])];
-					for my $Z(@oldz)
-					{
-						for my $Y(@oldy)
-						{
-							for my $X(@oldx)
-							{
-								my $cell = $gridcells[($X - $imins[0]) + $isize[0] * ($Y - $imins[1]) + $isize[0] * $isize[1] * ($Z - $imins[2])];
-
-								my $cellweight = BoxIntersection(
-									$X, $Y, $Z, 1, 1, 1,
-									map { $_ * $decimate } $x, $y, $z, 1, 1, 1
-								);
-
-								$dir[$_] += $cellweight * $cell->{directional}->[$_] for 0..2;
-								$amb[$_] += $cellweight * $cell->{ambient}->[$_] for 0..2;
-								my @norm = DecodeDirection $cell->{dir};
-								$vec[$_] += $cellweight * $norm[$_] for 0..2;
-								$weight += $cellweight;
-							}
-						}
-					}
-					if($weight)
-					{
-						$dir[$_] /= $weight for 0..2;
-						$dir[$_] *= $filter for 0..2;
-						$dir[$_] += (1 - $filter) * $innercell->{directional}->[$_] for 0..2;
-
-						$amb[$_] /= $weight for 0..2;
-						$amb[$_] *= $filter for 0..2;
-						$amb[$_] += (1 - $filter) * $innercell->{ambient}->[$_] for 0..2;
-
-						my @norm = DecodeDirection $innercell->{dir};
-						$vec[$_] /= $weight for 0..2;
-						$vec[$_] *= $filter for 0..2;
-						$vec[$_] += (1 - $filter) * $norm[$_] for 0..2;
-
-						$innercell = {
-							ambient => \@amb,
-							directional => \@dir,
-							dir => EncodeDirection @norm
-						};
-					}
-
-					push @newgridcells, $innercell;
-				}
-			}
-		}
-
-		$bsp[$lumpid{lightgrid}]->[2] = EncodeLump \@newgridcells,
-			qw/ambient=C3 directional=C3 dir=C2/;
-		splice @entitylines, $gridsizeindex, 1, ()
-			if defined $gridsizeindex;
-		splice @entitylines, 1, 0, qq{"gridsize" "$newgridsize"};
-		$bsp[$lumpid{entities}]->[2] = join "\n", @entitylines;
-	}
-	elsif(/^-x(.+)$/) # extract lump to stdout
-	{
-		my $id = $lumpid{$1};
-		die "invalid lump $1 to extract"
-			unless defined $id;
-		print $bsp[$id]->[2];
-	}
-	elsif(/^-o(.+)?$/) # write the final BSP file
-	{
-		my $outfile = $1;
-		$outfile = $fn
-			if not defined $outfile;
-		open my $fh, ">", $outfile
-			or die "$outfile: $!";
-		print $fh $header;
-		my $pos = 17 * 8 + tell($fh) + length $msg;
-		for(@bsp)
-		{
-			$_->[0] = $pos;
-			$_->[1] = length $_->[2];
-			$pos += $_->[1];
-			print $fh pack "VV", $_->[0], $_->[1];
-		}
-		print $fh $msg;
-		for(@bsp)
-		{
-			print $fh $_->[2];
-		}
-		close $fh;
-		print STDERR "Wrote $outfile\n";
-	}
-	else
-	{
-		die "Invalid option: $_";
-	}
-}
-
-# TODO:
-#   features like:
-#     decimate light grid
-#     edit lightmaps/grid

Deleted: branches/nexuiz-2.0/misc/crc16.c
===================================================================
--- branches/nexuiz-2.0/misc/crc16.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/crc16.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,97 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-
-// this CRC matches DP
-// output is:
-//   filesize.crc16
-// usage:
-//   mv csprogs.dat csprogs.dat.`crc16 < csprogs.dat`
-// see script csqcarchive.sh
-
-/*
-============================================================================
-
-					CRC FUNCTIONS
-
-============================================================================
-*/
-
-// this is a 16 bit, non-reflected CRC using the polynomial 0x1021
-// and the initial and final xor values shown below...  in other words, the
-// CCITT standard CRC used by XMODEM
-
-#define CRC_INIT_VALUE	0xffff
-#define CRC_XOR_VALUE	0x0000
-
-static unsigned short crctable[256] =
-{
-	0x0000,	0x1021,	0x2042,	0x3063,	0x4084,	0x50a5,	0x60c6,	0x70e7,
-	0x8108,	0x9129,	0xa14a,	0xb16b,	0xc18c,	0xd1ad,	0xe1ce,	0xf1ef,
-	0x1231,	0x0210,	0x3273,	0x2252,	0x52b5,	0x4294,	0x72f7,	0x62d6,
-	0x9339,	0x8318,	0xb37b,	0xa35a,	0xd3bd,	0xc39c,	0xf3ff,	0xe3de,
-	0x2462,	0x3443,	0x0420,	0x1401,	0x64e6,	0x74c7,	0x44a4,	0x5485,
-	0xa56a,	0xb54b,	0x8528,	0x9509,	0xe5ee,	0xf5cf,	0xc5ac,	0xd58d,
-	0x3653,	0x2672,	0x1611,	0x0630,	0x76d7,	0x66f6,	0x5695,	0x46b4,
-	0xb75b,	0xa77a,	0x9719,	0x8738,	0xf7df,	0xe7fe,	0xd79d,	0xc7bc,
-	0x48c4,	0x58e5,	0x6886,	0x78a7,	0x0840,	0x1861,	0x2802,	0x3823,
-	0xc9cc,	0xd9ed,	0xe98e,	0xf9af,	0x8948,	0x9969,	0xa90a,	0xb92b,
-	0x5af5,	0x4ad4,	0x7ab7,	0x6a96,	0x1a71,	0x0a50,	0x3a33,	0x2a12,
-	0xdbfd,	0xcbdc,	0xfbbf,	0xeb9e,	0x9b79,	0x8b58,	0xbb3b,	0xab1a,
-	0x6ca6,	0x7c87,	0x4ce4,	0x5cc5,	0x2c22,	0x3c03,	0x0c60,	0x1c41,
-	0xedae,	0xfd8f,	0xcdec,	0xddcd,	0xad2a,	0xbd0b,	0x8d68,	0x9d49,
-	0x7e97,	0x6eb6,	0x5ed5,	0x4ef4,	0x3e13,	0x2e32,	0x1e51,	0x0e70,
-	0xff9f,	0xefbe,	0xdfdd,	0xcffc,	0xbf1b,	0xaf3a,	0x9f59,	0x8f78,
-	0x9188,	0x81a9,	0xb1ca,	0xa1eb,	0xd10c,	0xc12d,	0xf14e,	0xe16f,
-	0x1080,	0x00a1,	0x30c2,	0x20e3,	0x5004,	0x4025,	0x7046,	0x6067,
-	0x83b9,	0x9398,	0xa3fb,	0xb3da,	0xc33d,	0xd31c,	0xe37f,	0xf35e,
-	0x02b1,	0x1290,	0x22f3,	0x32d2,	0x4235,	0x5214,	0x6277,	0x7256,
-	0xb5ea,	0xa5cb,	0x95a8,	0x8589,	0xf56e,	0xe54f,	0xd52c,	0xc50d,
-	0x34e2,	0x24c3,	0x14a0,	0x0481,	0x7466,	0x6447,	0x5424,	0x4405,
-	0xa7db,	0xb7fa,	0x8799,	0x97b8,	0xe75f,	0xf77e,	0xc71d,	0xd73c,
-	0x26d3,	0x36f2,	0x0691,	0x16b0,	0x6657,	0x7676,	0x4615,	0x5634,
-	0xd94c,	0xc96d,	0xf90e,	0xe92f,	0x99c8,	0x89e9,	0xb98a,	0xa9ab,
-	0x5844,	0x4865,	0x7806,	0x6827,	0x18c0,	0x08e1,	0x3882,	0x28a3,
-	0xcb7d,	0xdb5c,	0xeb3f,	0xfb1e,	0x8bf9,	0x9bd8,	0xabbb,	0xbb9a,
-	0x4a75,	0x5a54,	0x6a37,	0x7a16,	0x0af1,	0x1ad0,	0x2ab3,	0x3a92,
-	0xfd2e,	0xed0f,	0xdd6c,	0xcd4d,	0xbdaa,	0xad8b,	0x9de8,	0x8dc9,
-	0x7c26,	0x6c07,	0x5c64,	0x4c45,	0x3ca2,	0x2c83,	0x1ce0,	0x0cc1,
-	0xef1f,	0xff3e,	0xcf5d,	0xdf7c,	0xaf9b,	0xbfba,	0x8fd9,	0x9ff8,
-	0x6e17,	0x7e36,	0x4e55,	0x5e74,	0x2e93,	0x3eb2,	0x0ed1,	0x1ef0
-};
-
-unsigned short CRC_Block(const unsigned char *data, size_t size)
-{
-	unsigned short crc = CRC_INIT_VALUE;
-	while (size--)
-		crc = (crc << 8) ^ crctable[(crc >> 8) ^ (*data++)];
-	return crc ^ CRC_XOR_VALUE;
-}
-
-int main()
-{
-	unsigned char *buf;
-	size_t bufsize = 0;
-	size_t newbufsize;
-	size_t nread;
-
-	for(;;)
-	{
-		newbufsize = 2 * bufsize + 1;
-		buf = realloc(buf, newbufsize);
-		nread = fread(buf + bufsize, 1, newbufsize - bufsize, stdin);
-		if(nread != newbufsize - bufsize)
-		{
-			// output checksum
-			unsigned short crc = CRC_Block(buf, bufsize + nread);
-			printf("%ju.%u\n", (uintmax_t) (bufsize + nread), crc);
-
-			// exit
-			break;
-		}
-		bufsize = newbufsize;
-	}
-
-	return 0;
-}

Deleted: branches/nexuiz-2.0/misc/csqcarchive.sh
===================================================================
--- branches/nexuiz-2.0/misc/csqcarchive.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/csqcarchive.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,46 +0,0 @@
-#!/bin/sh
-
-set -e
-
-make crc16
-crc16=`pwd`/crc16
-out=`pwd`/csqcarchive.zip
-
-t=`mktemp -dt csqcarchive.XXXXXX`
-cd "$t"
-
-revs()
-{
-	{
-		svn log svn://svn.icculus.org/nexuiz/$1/data/qcsrc/common
-		echo
-		svn log svn://svn.icculus.org/nexuiz/$1/data/qcsrc/client
-	} | {
-		while IFS= read -r LINE; do
-			if [ "$LINE" = "------------------------------------------------------------------------" ]; then
-				read -r REV REST
-				case "$REV" in
-					r*)
-						echo ${REV#r}
-						;;
-				esac
-			fi
-		done
-	} | sort -n
-}
-
-rm -f "$out"
-for repo in branches/nexuiz-2.0 trunk; do
-	for rev in `revs $repo`; do
-		if [ "$rev" -lt 3789 ]; then
-			continue
-		fi
-		svn checkout -r"$rev" svn://svn.icculus.org/nexuiz/$repo/data/qcsrc
-		rm -f Makefile csprogs.dat
-		wget -OMakefile "http://svn.icculus.org/*checkout*/nexuiz/$repo/data/Makefile?revision=$rev" || continue
-		make csprogs.dat || continue
-		nm="csprogs.dat.`$crc16 < csprogs.dat`"
-		mv csprogs.dat "$nm"
-		zip -9r "$out" "$nm"
-	done
-done

Deleted: branches/nexuiz-2.0/misc/democonv-15-20.pl
===================================================================
--- branches/nexuiz-2.0/misc/democonv-15-20.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/democonv-15-20.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,100 +0,0 @@
-#!/usr/bin/perl
-
-# usage:
-#   ./democonv-15-20.pl infile outfile
-
-use strict;
-use warnings;
-
-# constants
-my $svc_print = "\010";
-my $svc_serverinfo = "\013";
-
-my %maps = (
-	nexdm01 => 'basement',
-	nexdm02 => 'bleach',
-	nexdm03 => 'slimepit',
-	nexdm04 => 'skyway',
-	nexdm05 => 'downer',
-	nexdm06 => 'starship',
-	nexdm07 => 'dsi',
-	nexdm08 => 'glowarena',
-	nexdm09 => 'aneurysm',
-	nexdm10 => 'stormkeep',
-	nexdm11 => 'ruinsofslaughter',
-	nexdm12 => 'evilspace',
-	nexdm13 => 'dismal',
-	nexdm14 => 'soylent',
-	nexdm15 => 'oilrig',
-	nexdm16 => 'silvercity',
-	nexdm17 => 'dieselpower',
-	nexdm18 => 'runningman',
-	nexdm18_1on1remix => 'runningman_1on1remix',
-	nexdmextra1 => 'darkzone',
-	nexdmextra2 => 'aggressor',
-	nexctf01 => 'basementctf',
-	nexctf02 => 'runningmanctf',
-);
-
-# opening the files
-
-push @ARGV, "$ARGV[0]-converted.dem"
-	if @ARGV == 1;
-
-die "Usage: $0 infile outfile"
-	if @ARGV != 2;
-my ($in, $out) = @ARGV;
-
-$in ne $out
-	or die "Input and output file may not be the same!";
-
-open my $infh, "<", $in
-	or die "open $in: $!";
-binmode $infh;
-
-open my $outfh, ">", $out
-	or die "open $out: $!";
-binmode $outfh;
-
-sub TranslateMapname($)
-{
-	my ($map) = @_;
-	return $maps{$map}
-		if exists $maps{$map};
-	return $map;
-}
-
-# 1. CD track
-
-$/ = "\012";
-my $cdtrack = <$infh>;
-print $outfh $cdtrack;
-
-# 2. packets
-
-for(;;)
-{
-	last
-		unless 4 == read $infh, my $length, 4;
-	$length = unpack("V", $length);
-	die "Invalid demo packet"
-		unless 12 == read $infh, my $angles, 12;
-	die "Invalid demo packet"
-		unless $length == read $infh, my($data), $length;
-
-	$data =~ s{
-		^
-		($svc_print
-			[^\0]*\0
-		$svc_serverinfo....
-			[^\0]*\0
-			maps/)([^\0]*)(\.bsp\0)
-	}{$1 . TranslateMapname($2) . $3}sex;
-
-	print $outfh pack("V", length $data);
-	print $outfh $angles;
-	print $outfh $data;
-}
-
-close $outfh;
-close $infh;

Deleted: branches/nexuiz-2.0/misc/demosplit.pl
===================================================================
--- branches/nexuiz-2.0/misc/demosplit.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/demosplit.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,72 +0,0 @@
-#!/usr/bin/perl
-
-# usage:
-#   ./demosplit.pl demo.dem
-# splits the demo into separate demos for each map played and writes them
-# to demo-0000.dem, demo-0001.dem ...
-
-use strict;
-use warnings;
-
-# constants
-my $svc_signon = "\001";
-
-# opening the files
-
-die "Usage: $0 infile"
-	if @ARGV != 1;
-my ($in) = @ARGV;
-
-my $demoname = [$in =~ /^(.*)\.dem$/]->[0];
-$demoname = "out"
-	if not defined $demoname;
-
-open my $infh, "<", $in
-	or die "open $in: $!";
-binmode $infh;
-
-# 1. CD track
-
-$/ = "\012";
-my $cdtrack = <$infh>;
-
-# 2. packets
-
-my $outfh;
-my $outnum = 0;
-
-for(;;)
-{
-	last
-		unless 4 == read $infh, my $length, 4;
-	$length = unpack("V", $length);
-	die "Invalid demo packet"
-		unless 12 == read $infh, my $angles, 12;
-	die "Invalid demo packet"
-		unless $length == read $infh, my($data), $length;
-
-	if($data =~ m{
-		^
-		$svc_signon
-		$
-	}sx)
-	{
-		close $outfh
-			if $outfh;
-		my $outname = sprintf("%s-%04d.dem", $demoname, $outnum++);
-		open $outfh, ">", $outname
-			or die "open $outname: $!";
-		binmode $outfh;
-		print $outfh $cdtrack;
-		print "Writing to $outname...\n";
-	}
-
-	die "No signon received"
-		unless $outfh;
-	print $outfh pack("V", length $data);
-	print $outfh $angles;
-	print $outfh $data;
-}
-
-close $outfh;
-close $infh;

Deleted: branches/nexuiz-2.0/misc/demotc-race-record-extractor.sh
===================================================================
--- branches/nexuiz-2.0/misc/demotc-race-record-extractor.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/demotc-race-record-extractor.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-d=$1
-i=0
-perl demotc.pl grep "$d" 'all-time fastest lap record with (.*)\n' | while IFS=" " read -r timecode result; do
-	timecode=${timecode%:}
-	result=${result#\"}
-	result=${result%\"}
-
-	echo "Possible record found at $timecode: $result, extracting..."
-
-	minutes=${result%%:*}
-	result=${result#*:}
-	seconds=${result%%.*}
-	result=${result#*.}
-	tenths=$result
-
-	timecode_start=`echo "$timecode - $minutes*60 - $seconds - $tenths*0.1 - 2" | bc -l`
-	timecode_end=`echo "$timecode + 2" | bc -l`
-	i=$(($i + 1))
-	perl demotc.pl cut "$d" "playback-$i.dem" "$timecode_start" "$timecode_end"
-	perl demotc.pl cut "$d" "capture-$i.dem" "$timecode_start" "$timecode_end" --capture
-done

Deleted: branches/nexuiz-2.0/misc/demotc.pl
===================================================================
--- branches/nexuiz-2.0/misc/demotc.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/demotc.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,172 +0,0 @@
-#!/usr/bin/perl
-
-# Fake demo "cutting" tool
-# works by looking for time codes in the demo
-# and injecting playback speed commands
-
-use strict;
-use warnings;
-
-sub sanitize($)
-{
-	my ($str) = @_;
-	$str =~ y/\000-\037//d;
-	return $str;
-}
-
-# opening the files
-
-my ($in, $out, $tc0, $tc1, $pattern, $capture);
-
-my $mode = shift @ARGV;
-$mode = 'help' if not defined $mode;
-
-if($mode eq 'grep' && @ARGV == 2)
-{
-	$in = $ARGV[0];
-	$pattern = $ARGV[1];
-}
-elsif($mode eq 'uncut' && @ARGV == 2)
-{
-	$in = $ARGV[0];
-	$out = $ARGV[1];
-}
-elsif($mode eq 'cut' && (@ARGV == 4 || @ARGV == 5))
-{
-	$in = $ARGV[0];
-	$out = $ARGV[1];
-	$tc0 = $ARGV[2];
-	$tc1 = $ARGV[3];
-	$capture = (@ARGV == 5);
-}
-else
-{
-	die "Usage: $0 cut infile outfile tc_start tc_end [--capture], or $0 uncut infile outfile, or $0 grep infile pattern\n"
-}
-
-if($mode ne 'grep')
-{
-	$in ne $out
-		or die "Input and output file may not be the same!";
-}
-
-open my $infh, "<", $in
-	or die "open $in: $!";
-binmode $infh;
-
-my $outfh;
-if($mode ne 'grep') # cutting
-{
-	open $outfh, ">", $out
-		or die "open $out: $!";
-	binmode $outfh;
-}
-
-# 1. CD track
-
-$/ = "\012";
-my $cdtrack = <$infh>;
-print $outfh $cdtrack if $mode ne 'grep';
-
-# 2. packets
-
-my $tc = undef;
-
-my $first = 1;
-my $demo_started = 0;
-my $demo_stopped = 0;
-my $inject_buffer = "";
-
-for(;;)
-{
-	last
-		unless 4 == read $infh, my $length, 4;
-	$length = unpack("V", $length);
-	die "Invalid demo packet"
-		unless 12 == read $infh, my $angles, 12;
-	die "Invalid demo packet"
-		unless $length == read $infh, my($data), $length;
-	
-	# remove existing cut marks
-	$data =~ s{^\011\n//CUTMARK\n[^\0]*\0}{};
-	
-	if(substr($data, 0, 1) eq "\007") # svc_time
-	{
-		$tc = unpack "f", substr $data, 1, 4;
-	}
-
-	if($mode eq 'cut' && defined $tc)
-	{
-		if($first)
-		{
-			$inject_buffer = "\011\n//CUTMARK\nslowmo 100\n\000";
-			$first = 0;
-		}
-		if($demo_started < 1 && $tc > $tc0 - 50)
-		{
-			$inject_buffer = "\011\n//CUTMARK\nslowmo 10\n\000";
-			$demo_started = 1;
-		}
-		if($demo_started < 2 && $tc > $tc0 - 5)
-		{
-			$inject_buffer = "\011\n//CUTMARK\nslowmo 1\n\000";
-			$demo_started = 2;
-		}
-		if($demo_started < 3 && $tc > $tc0)
-		{
-			if($capture)
-			{
-				$inject_buffer = "\011\n//CUTMARK\ncl_capturevideo 1\n\000";
-			}
-			else
-			{
-				$inject_buffer = "\011\n//CUTMARK\nslowmo 0; defer 1 \"slowmo 1\"\n\000";
-			}
-			$demo_started = 3;
-		}
-		if(!$demo_stopped && $tc > $tc1)
-		{
-			if($capture)
-			{
-				$inject_buffer = "\011\n//CUTMARK\ncl_capturevideo 0; defer 0.5 \"disconnect\"\n\000";
-			}
-			else
-			{
-				$inject_buffer = "\011\n//CUTMARK\ndefer 0.5 \"disconnect\"\n\000";
-			}
-			$demo_stopped = 1;
-		}
-	}
-	elsif($mode eq 'grep')
-	{
-		if(my @l = ($data =~ /$pattern/))
-		{
-			if(defined $tc)
-			{
-				print "$tc:";
-			}
-			else
-			{
-				print "start:";
-			}
-			for(@l)
-			{
-				print " \"", sanitize($_), "\"";
-			}
-			print "\n";
-		}
-	}
-	
-	next if $mode eq 'grep';
-	if(length($inject_buffer . $data) < 65536)
-	{
-		$data = $inject_buffer . $data;
-		$inject_buffer = "";
-	}
-	print $outfh pack("V", length $data);
-	print $outfh $angles;
-	print $outfh $data;
-}
-
-close $outfh if $mode ne 'grep';
-close $infh;

Deleted: branches/nexuiz-2.0/misc/dependencies.pl
===================================================================
--- branches/nexuiz-2.0/misc/dependencies.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/dependencies.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,303 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my %files = ();
-my %shaders = ();
-
-sub ReadShaders()
-{
-	for my $sf(<scripts/*.shader>)
-	{
-		my $curshader = undef;
-		my @tex = ();
-		my $level = 0;
-		open my $fh, "<", $sf
-			or die "<$sf: $!";
-		while(<$fh>)
-		{
-			s/\r//gs;
-			chomp;
-
-			s/\/\/.*//s;
-			s/^\s+//;
-			s/\s+$//;
-			next if /^$/;
-
-			my @line = map { s/"//g; $_; } split /\s+/, $_;
-
-			if($line[0] eq '{')
-			{
-				++$level;
-			}
-			elsif($line[0] eq '}')
-			{
-				--$level;
-				if($level <= 0)
-				{
-					$level = 0;
-					if(defined $curshader)
-					{
-						$shaders{lc $curshader} = { shaderfile => $sf, textures => [ @tex ] };
-					}
-					$curshader = undef;
-				}
-			}
-			elsif($level == 0)
-			{
-				$curshader = $line[0];
-				@tex = ();
-			}
-			elsif($level == 1 and lc $line[0] eq 'qer_editorimage')
-			{
-				push @tex, $line[1];
-			}
-			elsif($level == 1 and lc $line[0] eq 'qer_lightimage')
-			{
-				push @tex, $line[1];
-			}
-			elsif($level == 1 and lc $line[0] eq 'skyparms')
-			{
-				for(qw/rt lf ft bk up dn/)
-				{
-					push @tex, "$line[1]_$_";
-					push @tex, "$line[3]_$_";
-				}
-			}
-			elsif($level == 2 and lc $line[0] eq 'map')
-			{
-				push @tex, $line[1];
-			}
-			elsif($level == 2 and lc $line[0] eq 'animmap')
-			{
-				for(2..(@line - 1))
-				{
-					push @tex, $line[$_];
-				}
-			}
-		}
-	}
-}
-
-sub AddFile($)
-{
-	my ($file) = @_;
-	return 0
-		unless -e $file;
-	++$files{$file};
-	return 1;
-}
-
-sub AddSound($)
-{
-	my ($tex) = @_;
-	$tex =~ s/\.ogg$|\.wav$//i;
-	AddFile "$tex.ogg" or
-	AddFile "$tex.wav" or
-	AddFile "sound/$tex.ogg" or
-	AddFile "sound/$tex.wav";
-}
-
-sub AddTexture($)
-{
-	my ($tex) = @_;
-	$tex =~ s/\.jpg$|\.tga$|\.png$//i;
-	AddFile "$tex.jpg" or
-	AddFile "$tex.tga" or
-	AddFile "$tex.png"
-		or return 0;
-	for('_shirt', '_pants', '_glow', '_norm', '_bump', '_gloss')
-	{
-		AddFile "$tex$_.jpg" or
-		AddFile "$tex$_.tga" or
-		AddFile "$tex$_.png";
-	}
-	return 1;
-}
-
-sub AddShader($)
-{
-	my ($shader) = @_;
-	$shader =~ s/\.jpg$|\.tga$|\.png$//i;
-	my $si = $shaders{lc $shader};
-	if(not defined $si)
-	{
-		AddTexture $shader
-			or warn "Unknown shader used: $shader";
-	}
-	else
-	{
-		AddFile $si->{shaderfile};
-		AddTexture $_
-			for @{$si->{textures}};
-	}
-}
-
-sub AddMapDependencies($)
-{
-	my ($data) = @_;
-	for(/^"noise.*" "(.*)"/gm)
-	{
-		AddSound $1;
-	}
-	for(/^"sound.*" "(.*)"/gm)
-	{
-		AddSound $1;
-	}
-	for(/^"music" "(.*)"/gm)
-	{
-		AddSound $1;
-	}
-	for(/^"model" "(.*)"/gm)
-	{
-		# TODO make this AddModel
-		# TODO and find the shaders the model uses
-		AddFile $1;
-	}
-	for(/^"lodmodel.*" "(.*)"/gm)
-	{
-		AddFile $1;
-	}
-}
-
-sub AddMapinfoDependencies($)
-{
-	my ($data) = @_;
-	for($data =~ /^cdtrack (.*)$/gm)
-	{
-		AddSound "sound/cdtracks/$1";
-	}
-}
-
-sub AddCfgDependencies($)
-{
-	my ($data) = @_;
-	for($data =~ /^cd loop "?(.*?)"?$/gm)
-	{
-		AddSound "sound/cdtracks/$1";
-	}
-}
-
-sub AddShaderDependencies($)
-{
-	my ($data) = @_;
-
-	my $n = length($data) / 72;
-	for(0..($n-1))
-	{
-		my $s = substr $data, $_ * 72, 64;
-		$s =~ s/\0.*$//s;
-		AddShader $s;
-	}
-}
-
-sub AddFaceDependencies($$)
-{
-	my ($base, $data) = @_;
-
-	my $n = length($data) / 104;
-	for(0..($n-1))
-	{
-		my $l = unpack "V", substr $data, $_ * 104 + 28, 4;
-		AddTexture sprintf "maps/%s/lm_%04d", $base, $l;
-		AddTexture sprintf "maps/%s/lm_%04d", $base, $l | 1; # deluxe
-	}
-}
-
-
-ReadShaders();
-
-for(<maps/*.ent>)
-{
-	AddFile $_;
-
-	my $data = do {
-		undef local $/;
-		open my $fh, "<", $_
-			or die "<$_: $!";
-		<$fh>;
-	};
-	AddMapDependencies $data;
-}
-
-for(<maps/*.bsp>)
-{
-	AddFile $_;
-
-	m!^maps/(.*)\.bsp! or die "perl is stupid";
-	my $b = $1;
-	AddFile "maps/$b.mapinfo";
-	AddFile "maps/$b.jpg";
-	AddFile "maps/$b.cfg";
-	AddFile "maps/$b.waypoints";
-	AddFile "maps/$b.rtlights";
-	AddTexture "gfx/$b\_radar.tga";
-	AddTexture "gfx/$b\_mini.tga";
-
-	my $data = do {
-		undef local $/;
-		open my $fh, "<", "maps/$b.mapinfo"
-			or warn "<maps/$b.mapinfo: $!";
-		<$fh>;
-	};
-	AddMapinfoDependencies $data;
-
-	$data = do {
-		undef local $/;
-		open my $fh, "<", "maps/$b.cfg"
-			or warn "<maps/$b.cfg: $!";
-		<$fh>;
-	};
-	AddCfgDependencies $data;
-
-	$data = do {
-		undef local $/;
-		open my $fh, "-|", 'bsptool.pl', $_, '-xentities'
-			or die "<$_: $!";
-		<$fh>;
-	};
-	AddMapDependencies $data;
-
-	$data = do {
-		undef local $/;
-		open my $fh, "-|", 'bsptool.pl', $_, '-xfaces'
-			or die "<$_: $!";
-		<$fh>;
-	};
-	AddFaceDependencies $b, $data;
-
-	$data = do {
-		undef local $/;
-		open my $fh, "-|", 'bsptool.pl', $_, '-xtextures'
-			or die "<$_: $!";
-		<$fh>;
-	};
-	AddShaderDependencies $data;
-}
-
-sub RecurseDir($);
-sub RecurseDir($)
-{
-	my ($dir) = @_;
-	if(-d $dir)
-	{
-		for(<$dir/*>)
-		{
-			RecurseDir $_;
-		}
-	}
-	else
-	{
-		warn "Unused file: $dir"
-			unless $files{$dir};
-	}
-}
-
-for(<*>)
-{
-	RecurseDir $_;
-}
-
-print "$_\0"
-	for sort keys %files;

Deleted: branches/nexuiz-2.0/misc/entmerge.pl
===================================================================
--- branches/nexuiz-2.0/misc/entmerge.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/entmerge.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,595 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use Carp;
-$SIG{__DIE__} = sub { 
-	Carp::cluck "Exception: $@";
-};
-
-# ent file managing tool
-# usage:
-#
-#   map -> ent:
-#     perl entmerge.pl $scalefactor             < mapname.map > mapname.ent
-#
-#   ent -> map:
-#     perl entmerge.pl $scalefactor mapname.ent < mapname.map > mapname-merged.map
-#
-#   bsp -> ent:
-#     perl bsptool.pl mapname.bsp -xentities                  > mapname.ent
-#                                                          
-#   ent -> bsp:                                            
-#     perl bsptool.pl mapname.bsp -rentities                  < mapname.ent
-
-sub DotProduct($$)
-{
-	my ($a, $b) = @_;
-	return	$a->[0]*$b->[0]
-		+	$a->[1]*$b->[1]
-		+	$a->[2]*$b->[2];
-}
-
-sub CrossProduct($$)
-{
-	my ($a, $b) = @_;
-	return	[
-		$a->[1]*$b->[2] - $a->[2]*$b->[1],
-		$a->[2]*$b->[0] - $a->[0]*$b->[2],
-		$a->[0]*$b->[1] - $a->[1]*$b->[0]
-	];
-}
-
-sub VectorMAM(@)
-{
-	my (@data) = @_;
-	my $out = [0, 0, 0];
-	for my $coord(0..2)
-	{
-		my $c = 0;
-		$c += $data[2*$_ + 0] * $data[2*$_ + 1]->[$coord]
-			for 0..(@data/2 - 1);
-		$out->[$coord] = $c;
-	}
-	return $out;
-}
-
-sub VectorLength2($)
-{
-	my ($v) = @_;
-	return DotProduct $v, $v;
-}
-
-sub VectorLength($)
-{
-	my ($v) = @_;
-	return sqrt VectorLength2 $v;
-}
-
-sub VectorNormalize($)
-{
-	my ($v) = @_;
-	return VectorMAM 1/VectorLength($v), $v;
-}
-
-sub Polygon_QuadForPlane($$)
-{
-	my ($plane, $quadsize) = @_;
-
-	my $quadup;
-	if(abs($plane->[2]) > abs($plane->[0]) && abs($plane->[2]) > abs($plane->[1]))
-	{
-		$quadup = [1, 0, 0];
-	}
-	else
-	{
-		$quadup = [0, 0, 1];
-	}
-
-	$quadup = VectorMAM 1, $quadup, -DotProduct($quadup, $plane), $plane;
-	$quadup = VectorMAM $plane->[3], VectorNormalize $quadup;
-
-	my $quadright = CrossProduct $quadup, $plane;
-
-	return [
-		VectorMAM($plane->[3], $plane, -$quadsize*2, $quadright, +$quadsize*2, $quadup),
-		VectorMAM($plane->[3], $plane, +$quadsize*2, $quadright, +$quadsize*2, $quadup),
-		VectorMAM($plane->[3], $plane, +$quadsize*2, $quadright, -$quadsize*2, $quadup),
-		VectorMAM($plane->[3], $plane, -$quadsize*2, $quadright, -$quadsize*2, $quadup)
-	];
-}
-
-sub Polygon_Clip($$$)
-{
-	my ($points, $plane, $epsilon) = @_;
-
-	if(@$points < 1)
-	{
-		return [];
-	}
-
-	my $n = 0;
-	my $ndist = DotProduct($points->[$n], $plane) - $plane->[3];
-
-	my @outfrontpoints = ();
-
-	for my $i(0..@$points - 1)
-	{
-		my $p = $n;
-		my $pdist = $ndist;
-		$n = ($i+1) % @$points;
-		$ndist = DotProduct($points->[$n], $plane) - $plane->[3];
-		if($pdist >= -$epsilon)
-		{
-			push @outfrontpoints, $points->[$p];
-		}
-		if(($pdist > $epsilon && $ndist < -$epsilon) || ($pdist < -$epsilon && $ndist > $epsilon))
-		{
-			my $frac = $pdist / ($pdist - $ndist);
-			push @outfrontpoints, VectorMAM 1-$frac, $points->[$p], $frac, $points->[$n];
-		}
-	}
-
-	return \@outfrontpoints;
-}
-
-sub MakePlane($$$)
-{
-	my ($p, $q, $r) = @_;
-
-	my $a = VectorMAM 1, $q, -1, $p;
-	my $b = VectorMAM 1, $r, -1, $p;
-	my $n = VectorNormalize CrossProduct $a, $b;
-
-	return [ @$n, DotProduct $n, $p ];
-}
-
-sub GetBrushWindings($)
-{
-	my ($planes) = @_;
-
-	my @windings = ();
-
-	for my $i(0..(@$planes - 1))
-	{
-		my $winding = Polygon_QuadForPlane $planes->[$i], 65536;
-
-		for my $j(0..(@$planes - 1))
-		{
-			next
-				if $i == $j;
-			$winding = Polygon_Clip $winding, $planes->[$j], 1/64.0;
-		}
-
-		push @windings, $winding
-			unless @$winding == 0;
-	}
-
-	return \@windings;
-}
-
-sub GetBrushMinMax($)
-{
-	my ($brush) = @_;
-
-	if($brush->[0] =~ /^\(/)
-	{
-		# plain brush
-		my @planes = ();
-		for(@$brush)
-		{
-			/^\(\s+(\S+)\s+(\S+)\s+(\S+)\s+\)\s+\(\s+(\S+)\s+(\S+)\s+(\S+)\s+\)\s+\(\s+(\S+)\s+(\S+)\s+(\S+)\s+\)\s+/
-				or die "Invalid line in plain brush: $_";
-			push @planes, MakePlane [ $1, $2, $3 ], [ $4, $5, $6 ], [ $7, $8, $9 ];
-			# for any three planes, find their intersection
-			# check if the intersection is inside all other planes
-		}
-		
-		my $windings = GetBrushWindings \@planes;
-
-		my (@mins, @maxs);
-
-		for(@$windings)
-		{
-			for my $v(@$_)
-			{
-				if(@mins)
-				{
-					for(0..2)
-					{
-						$mins[$_] = $v->[$_] if $mins[$_] > $v->[$_];
-						$maxs[$_] = $v->[$_] if $maxs[$_] < $v->[$_];
-					}
-				}
-				else
-				{
-					@mins = @$v;
-					@maxs = @$v;
-				}
-			}
-		}
-
-		return undef
-			unless @mins;
-		return \@mins, \@maxs;
-	}
-
-	die "Cannot decode this brush yet! brush is @$brush";
-}
-
-sub BrushOrigin($)
-{
-	my ($brushes) = @_;
-
-	my @org = ();
-
-	for my $brush(@$brushes)
-	{
-		my $isorigin = 0;
-		for(@$brush)
-		{
-			$isorigin = 1
-				if /\bcommon\/origin\b/;
-		}
-		if($isorigin)
-		{
-			my ($mins, $maxs) = GetBrushMinMax $brush;
-			@org = map { 0.5 * ($mins->[$_] + $maxs->[$_]) } 0..2
-				if defined $mins;
-		}
-	}
-
-	return \@org
-		if @org;
-	return undef;
-}
-
-sub ParseEntity($)
-{
-	my ($fh) = @_;
-
-	my %ent = ( );
-	my @brushes = ( );
-
-	while(<$fh>)
-	{
-		chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
-
-		if(/^\{$/)
-		{
-			# entity starts
-			while(<$fh>)
-			{
-				chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
-
-				if(/^"(.*?)" "(.*)"$/)
-				{
-					# key-value pair
-					$ent{$1} = $2;
-				}
-				elsif(/^\{$/)
-				{
-					my $brush = [];
-					push @brushes, $brush;
-
-					while(<$fh>)
-					{
-						chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
-
-						if(/^\{$/)
-						{
-							# patch?
-							push @$brush, $_;
-
-							while(<$fh>)
-							{
-								chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
-
-								if(/^\}$/)
-								{
-									push @$brush, $_;
-
-									last;
-								}
-								else
-								{
-									push @$brush, $_;
-								}
-							}
-						}
-						elsif(/^\}$/)
-						{
-							# end of brush
-							last;
-						}
-						else
-						{
-							push @$brush, $_;
-						}
-					}
-				}
-				elsif(/^\}$/)
-				{
-					return \%ent, \@brushes;
-				}
-			}
-		}
-		else
-		{
-			die "Unexpected line in top level: >>$_<<";
-		}
-	}
-
-	return undef;
-}
-
-sub UnparseEntity($$)
-{
-	my ($ent, $brushes) = @_;
-	my %ent = %$ent;
-
-	my $s = "{\n";
-
-	for(sort keys %ent)
-	{
-		$s .= "\"$_\" \"$ent{$_}\"\n";
-	}
-
-	if(defined $brushes)
-	{
-		for(@$brushes)
-		{
-			$s .= "{\n";
-			$s .= "$_\n" for @$_;
-			$s .= "}\n";
-		}
-	}
-
-	$s .= "}\n";
-	return $s;
-}
-
-my ($scale, $in_ent) = @ARGV;
-
-$scale = 1
-	if not defined $scale;
-
-my @submodels = ();
-my @entities = ();
-my @entities_skipped = ();
-
-# THIS part is always a .map file
-my $first = 1;
-my $keeplights;
-for(;;)
-{
-	my ($ent, $brushes) = ParseEntity \*STDIN;
-
-	defined $ent
-		or last;
-	
-	if($first && $ent->{classname} eq 'worldspawn')
-	{
-		$keeplights = $ent->{_keeplights};
-		delete $ent->{_keeplights};
-		@submodels = ($brushes);
-	}
-	else
-	{
-		if($first)
-		{
-			push @entities, { classname => "worldspawn" };
-			@submodels = ([]);
-		}
-
-		if($ent->{classname} eq 'worldspawn')
-		{
-			$ent->{classname} = "worldspawn_renamed";
-		}
-
-		if(grep { $_ eq $ent->{classname} } qw/group_info func_group misc_model _decal _skybox/)
-		{
-			push @entities_skipped, [$ent, $brushes];
-			next;
-		}
-
-		if(!$keeplights && $ent->{classname} =~ /^light/)
-		{
-			push @entities_skipped, [$ent, $brushes];
-			next;
-		}
-
-		if(@$brushes)
-		{
-			my $i = @submodels;
-			push @submodels, $brushes;
-			$ent->{model} = sprintf "*%d", $i;
-		}
-	}
-
-	push @entities, $ent;
-
-	$first = 0;
-}
-
-if($first)
-{
-	push @entities, { classname => "worldspawn" };
-	@submodels = ([]);
-}
-
-if(defined $in_ent)
-{
-	# translate map using ent to map
-	open my $fh, "<", $in_ent
-		or die "$in_ent: $!";
-
-	# THIS part is always an .ent file now
-	my @entities_entfile = ();
-	$first = 1;
-	
-	my $clear_all_worldlights;
-
-	for(;;)
-	{
-		my ($ent, $brushes) = ParseEntity $fh;
-
-		defined $ent
-			or last;
-		
-		if($first && $ent->{classname} eq 'worldspawn')
-		{
-		}
-		else
-		{
-			if($first)
-			{
-				push @entities_entfile, { classname => "worldspawn" };
-			}
-
-			if($ent->{classname} eq 'worldspawn')
-			{
-				$ent->{classname} = "worldspawn_renamed";
-			}
-
-			if(!$keeplights && $ent->{classname} =~ /^light/)
-			{
-				# light entity detected!
-				# so let's replace all light entities
-				$clear_all_worldlights = 1;
-			}
-		}
-
-		if(defined $ent->{model} and $ent->{model} =~ /^\*(\d+)$/)
-		{
-			my $entfileorigin = [ split /\s+/, ($ent->{origin} || "0 0 0") ];
-			my $baseorigin = BrushOrigin $submodels[$1];
-
-			if(defined $baseorigin)
-			{
-				my $org = VectorMAM 1, $entfileorigin, -1, $baseorigin;
-				$ent->{origin} = sprintf "%.6f %.6f %.6f", @$org;
-			}
-		}
-
-		push @entities_entfile, $ent;
-		$first = 0;
-	}
-	close $fh;
-
-	if($keeplights && !$entities_entfile[0]->{keeplights})
-	{
-		# PROBLEM:
-		# the .ent file was made without keeplights
-		# merging it with the .map would delete all lights
-		# so insert all light entities here!
-		@entities_skipped = (@entities_skipped,
-			map
-			{
-				my $submodel = undef;
-				if(defined $_->{model} and $_->{model} =~ /^\*(\d+)$/)
-				{
-					$submodel = $submodels[$1];
-				}
-				[ $_, $submodel ]
-			}
-			grep
-			{
-				$_->{classname} =~ /^light/
-			}
-			@entities
-		);
-	}
-
-	if($clear_all_worldlights)
-	{
-		# PROBLEM:
-		# the .ent file was made with keeplights
-		# the .map did not indicate so!
-		# so we must delete all lights from the skipped entity list
-		@entities_skipped = grep { $_->[0]->{classname} !~ /^light/ } @entities_skipped;
-	}
-
-	if($first)
-	{
-		push @entities_entfile, { classname => "worldspawn" };
-	}
-
-	$first = 1;
-	for(@entities_entfile)
-	{
-		my %e = %$_;
-		my $submodel = undef;
-
-		$e{gridsize} = "64 64 128" if not exists $e{gridsize} and $first;
-		$e{lip} /= $scale if exists $e{lip};
-		$e{origin} = sprintf '%.6f %.6f %.6f', map { $_ / $scale } split /\s+/, $e{origin} if exists $e{origin};
-		$e{gridsize} = sprintf '%.6f %.6f %.6f', map { $_ / $scale } split /\s+/, $e{gridsize} if exists $e{gridsize} and $first;
-
-		if($first)
-		{
-			$submodel = $submodels[0];
-			if($keeplights)
-			{
-				$e{_keeplights} = 1;
-			}
-			else
-			{
-				delete $e{_keeplights};
-			}
-		}
-		elsif(defined $e{model} and $e{model} =~ /^\*(\d+)$/)
-		{
-			$submodel = $submodels[$1];
-			delete $e{model};
-		}
-		print UnparseEntity \%e, $submodel;
-		$first = 0;
-	}
-	for(@entities_skipped)
-	{
-		print UnparseEntity $_->[0], $_->[1];
-		$first = 0;
-	}
-}
-else
-{
-	# translate map to ent
-	$first = 1;
-	for(@entities)
-	{
-		my %e = %$_;
-
-		if($first)
-		{
-			if($keeplights)
-			{
-				$e{_keeplights} = 1;
-			}
-			else
-			{
-				delete $e{_keeplights};
-			}
-		}
-
-		if(defined $e{model} and $e{model} =~ /^\*(\d+)$/)
-		{
-			my $oldorigin = [ split /\s+/, ($e{origin} || "0 0 0") ];
-			my $org = BrushOrigin $submodels[$1];
-
-			if(defined $org)
-			{
-				$org = VectorMAM 1, $org, 1, $oldorigin;
-				$e{origin} = sprintf "%.6f %.6f %.6f", @$org;
-			}
-		}
-
-		$e{gridsize} = "64 64 128" if not exists $e{gridsize} and $first;
-		$e{lip} *= $scale if exists $e{lip};
-		$e{origin} = sprintf '%.6f %.6f %.6f', map { $_ * $scale } split /\s+/, $e{origin} if exists $e{origin};
-		$e{gridsize} = sprintf '%.6f %.6f %.6f', map { $_ * $scale } split /\s+/, $e{gridsize} if exists $e{gridsize} and $first;
-
-		print UnparseEntity \%e, undef;
-		$first = 0;
-	}
-}

Deleted: branches/nexuiz-2.0/misc/fiximage.pl
===================================================================
--- branches/nexuiz-2.0/misc/fiximage.pl	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/fiximage.pl	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,105 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-# Usage:
-#   convert image.tga -depth 8 RGBA:- | perl fiximage.pl 72 | convert -depth 8 -size 72x56 RGBA:- output.tga
-
-my ($width) = @ARGV;
-
-my @pixels = ();
-
-for(;;)
-{
-	read STDIN, my $data, 4
-		or last;
-	my ($r, $g, $b, $a) = unpack "CCCC", $data;
-	push @pixels, [$r, $g, $b, $a];
-}
-
-my $height = @pixels / $width;
-my @fixlater;
-for my $y(0..($height-1))
-{
-	for my $x(0..($width-1))
-	{
-		next
-			if $pixels[$x + $y * $width][3] != 0;
-		# alpha is zero? Replace by weighted average.
-		my ($r, $g, $b, $a) = (0, 0, 0);
-		for my $dy(-1..1)
-		{
-			next if $y + $dy < 0;
-			next if $y + $dy >= $height;
-			for my $dx(-1..1)
-			{
-				next if $x + $dx < 0;
-				next if $x + $dx >= $width;
-				my $pix = $pixels[($x + $dx) + ($y + $dy) * $width];
-				$r += $pix->[0] * $pix->[3];
-				$g += $pix->[1] * $pix->[3];
-				$b += $pix->[2] * $pix->[3];
-				$a += $pix->[3];
-			}
-		}
-		if($a == 0)
-		{
-			push @fixlater, [$x, $y];
-			$pixels[$x + $y * $width] = [0, 0, 0, 0, undef];
-			next;
-		}
-		$r = int ($r / $a);
-		$g = int ($g / $a);
-		$b = int ($b / $a);
-		print STDERR "Fixing ($x, $y -> $r, $g, $b, $a)\n";
-		$pixels[$x + $y * $width] = [$r, $g, $b, 0];
-	}
-}
-
-while(@fixlater)
-{
-	print STDERR "Pixels left: ", scalar(@fixlater), "\n";
-
-	# These pixels have no neighbors with a non-zero alpha.
-	my @fixels = @fixlater;
-	@fixlater = ();
-	my @pixelsorig = @pixels;
-	for(@fixels)
-	{
-		my ($x, $y) = @$_;
-		my ($r, $g, $b, $a) = (0, 0, 0, 0);
-		for my $dy(-1..1)
-		{
-			next if $y + $dy < 0;
-			next if $y + $dy >= $height;
-			for my $dx(-1..1)
-			{
-				next if $x + $dx < 0;
-				next if $x + $dx >= $width;
-				my $pix = $pixelsorig[($x + $dx) + ($y + $dy) * $width];
-				next
-					if @$pix == 5;
-				$r += $pix->[0];
-				$g += $pix->[1];
-				$b += $pix->[2];
-				$a += 1;
-			}
-		}
-		if($a == 0)
-		{
-			push @fixlater, [$x, $y];
-			next;
-		}
-		$r = int ($r / $a);
-		$g = int ($g / $a);
-		$b = int ($b / $a);
-		#print STDERR "Fixing later ($x, $y -> $r, $g, $b, $a)\n";
-		$pixels[$x + $y * $width] = [$r, $g, $b, 0];
-	}
-}
-
-for(@pixels)
-{
-	print pack "CCCC", @$_;
-}

Deleted: branches/nexuiz-2.0/misc/hslimage.c
===================================================================
--- branches/nexuiz-2.0/misc/hslimage.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/hslimage.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,104 +0,0 @@
-#include <math.h>
-#include <stdio.h>
-
-#define MARGIN_X 0
-#define MARGIN_Y 0
-
-void hsl_to_rgb(float hsl_x, float hsl_y, float hsl_z, float *rgb_x, float *rgb_y, float *rgb_z)
-{
-	float mi, ma, maminusmi, h;
-
-	if(hsl_z <= 0.5)
-		maminusmi = hsl_y * 2 * hsl_z;
-	else
-		maminusmi = hsl_y * (2 - 2 * hsl_z);
-	
-	// hsl_z     = 0.5 * mi + 0.5 * ma
-	// maminusmi =     - mi +       ma
-	mi = hsl_z - 0.5 * maminusmi;
-	ma = hsl_z + 0.5 * maminusmi;
-
-	h = hsl_x - 6 * floor(hsl_x / 6);
-
-	//else if(ma == rgb_x)
-	//	h = 60 * (rgb_y - rgb_z) / (ma - mi);
-	if(h <= 1)
-	{
-		*rgb_x = ma;
-		*rgb_y = h * (ma - mi) + mi;
-		*rgb_z = mi;
-	}
-	//else if(ma == rgb_y)
-	//	h = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
-	else if(h <= 2)
-	{
-		*rgb_x = (2 - h) * (ma - mi) + mi;
-		*rgb_y = ma;
-		*rgb_z = mi;
-	}
-	else if(h <= 3)
-	{
-		*rgb_x = mi;
-		*rgb_y = ma;
-		*rgb_z = (h - 2) * (ma - mi) + mi;
-	}
-	//else // if(ma == rgb_z)
-	//	h = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
-	else if(h <= 4)
-	{
-		*rgb_x = mi;
-		*rgb_y = (4 - h) * (ma - mi) + mi;
-		*rgb_z = ma;
-	}
-	else if(h <= 5)
-	{
-		*rgb_x = (h - 4) * (ma - mi) + mi;
-		*rgb_y = mi;
-		*rgb_z = ma;
-	}
-	//else if(ma == rgb_x)
-	//	h = 60 * (rgb_y - rgb_z) / (ma - mi);
-	else // if(h <= 6)
-	{
-		*rgb_x = ma;
-		*rgb_y = mi;
-		*rgb_z = (6 - h) * (ma - mi) + mi;
-	}
-}
-
-void hslimage_color(float v_x, float v_y, float margin_x, float margin_y, float *rgb_x, float *rgb_y, float *rgb_z)
-{
-	v_x = (v_x - margin_x) / (1 - 2 * margin_x);
-	v_y = (v_y - margin_y) / (1 - 2 * margin_y);
-	if(v_x < 0) v_x = 0;
-	if(v_y < 0) v_y = 0;
-	if(v_x > 1) v_x = 1;
-	if(v_y > 1) v_y = 1;
-	if(v_y > 0.875) // grey bar
-		hsl_to_rgb(0, 0, v_x, rgb_x, rgb_y, rgb_z);
-	else
-		hsl_to_rgb(v_x * 6, 1, (v_y / 0.875), rgb_x, rgb_y, rgb_z);
-}
-
-int main()
-{
-	int x, y;
-	float r, g, b;
-
-	for(y = 0; y < 512; ++y)
-	{
-		for(x = 0; x < 512; ++x)
-		{
-			hslimage_color(x / 512.0, y / 512.0, MARGIN_X, MARGIN_Y, &r, &g, &b);
-			/*
-			putc(floor(r * 15 + 0.5) * 17, stdout);
-			putc(floor(g * 15 + 0.5) * 17, stdout);
-			putc(floor(b * 15 + 0.5) * 17, stdout);
-			*/
-			putc(floor(r * 255 + 0.5), stdout);
-			putc(floor(g * 255 + 0.5), stdout);
-			putc(floor(b * 255 + 0.5), stdout);
-		}
-	}
-	return 0;
-}

Deleted: branches/nexuiz-2.0/misc/jpeg-if-not-alpha.sh
===================================================================
--- branches/nexuiz-2.0/misc/jpeg-if-not-alpha.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/jpeg-if-not-alpha.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,29 +0,0 @@
-#!/bin/sh
-
-set -e
-
-: ${qual:=95}
-
-for X in "$@"; do
-	case "$X" in
-		*.jpg)
-			if [ -n "$scaledown" ]; then
-				mogrify -geometry "$scaledown>" -quality 100 "$X"
-			fi
-			jpegoptim --strip-all -m$qual "$X"
-			;;
-		*.png|*.tga)
-			if [ -n "$scaledown" ]; then
-				mogrify -geometry "$scaledown>" -quality 100 "$X"
-			fi
-			if convert "$X" -depth 16 RGBA:- | perl -e 'while(read STDIN, $_, 8) { substr($_, 6, 2) eq "\xFF\xFF" or exit 1; ++$pix; } exit not $pix;'; then
-				echo "$X has no alpha, converting"
-				convert "$X" -quality 100 "${X%.*}.jpg"
-				jpegoptim --strip-all -m$qual "${X%.*}.jpg"
-				rm -f "$X"
-			else
-				echo "$X has alpha, not converting"
-			fi
-			;;
-	esac
-done

Deleted: branches/nexuiz-2.0/misc/makebuild.sh
===================================================================
--- branches/nexuiz-2.0/misc/makebuild.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/makebuild.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,373 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Options:
-#   pw=foo          extract password
-#   version=2.5     make a FINAL build
-#   tag=FOO         insert FOO before the date in build names
-
-base=`pwd`
-
-# customizable specific stuff
-basepk3=$base/data20080229.pk3 # 2.4
-hotbasepk3= # hotfix
-nexdir=$base/nexuiz
-nexprodir=$base/nexuiz/pro
-dpdir=$base/darkplaces
-tmpdir=/tmp/NEX
-zipdir=$base/builds
-buildfiles=$base/nexuiz/misc/buildfiles
-mingwdlls=$buildfiles/w32
-osxapps=$buildfiles/osx
-copystrip=$buildfiles/copystrip
-zipdiff=$base/nexuiz/misc/zipdiff
-fteqccdir="$base/fteqcc"
-fteqccflags=""
-menuqc=menu
-newest=NEWEST
-aft="perl -I/chroot/debian-etch/usr/share/aft /chroot/debian-etch/usr/bin/aft"
-# end system specific stuff
-
-case "$pw" in
-	'')
-		zipflags=
-		;;
-	*)
-		zipflags="-P $pw"
-		;;
-esac
-
-: ${date:=`date +%Y%m%d`}
-: ${versiontag:=}
-echo "date stamp: $date"
-
-case "$version" in
-	'')
-		version=2-svntest-$date
-		versiontag=test
-		defaultcfg=
-		ext=
-		;;
-	*)
-		version=$version
-		versiontag=$versiontag
-		defaultcfg=
-		ext=_$version
-		;;
-esac
-
-mk7z()
-{
-	7za a -tzip -mx=9 "$@"
-	chmod 644 "$1"
-}
-
-#if [ -n "$EXPERIMENTAL" ]; then
-#	basepk3=$base/data20071231.pk3 # newer build to make smaller patches
-#	nexdir=$base/nexuiz
-#fi
-
-# TODO normalize the builds
-platforms='x86 amd64 osx'
-buildon()
-{
-	host=$1
-	prefix=$2
-	fteqccname=$3
-	path=$4
-	makeflags=$5
-	strip=$6
-
-	fteqcc_cflags=
-	case "$fteqccname" in
-		*.exe)
-			fteqcc_cflags=win
-			;;
-	esac
-
-	rm -f "$fteqccdir"/*.o
-	rm -f "$fteqccdir"/*.bin
-	rsync --exclude "*.o" --exclude "*.d" --exclude "nexuiz-*" --delete-excluded --delete -zvaSHP . "$copystrip" "$fteqccdir" "$host:$path"
-	ssh "$host" ". ~/.profile && cd $path && COPYSTRIP_STRIP=$strip PATH=$path/copystrip:\$PATH make $makeflags clean nexuiz && cd ${fteqccdir##*/} && make $makeflags $fteqcc_cflags"
-	rsync --exclude "*.o" --exclude "*.d" --delete-excluded --delete -zvaSHP "$host:$path/." .
-	for P in -dedicated -sdl -glx -wgl -agl -dedicated.exe -sdl.exe .exe; do
-		[ -f nexuiz$P ] && mv nexuiz$P "$tmpdir/$prefix$P"
-		[ -f nexuiz$P-withdebug ] && mv nexuiz$P-withdebug "$tmpdir/debuginfo/$prefix$P"
-	done
-	case "$fteqccname" in
-		*.exe)
-			mv "${fteqccdir##*/}"/fteqcc.exe "$tmpdir/fteqcc/$fteqccname"
-			;;
-		*)
-			mv "${fteqccdir##*/}"/fteqcc.bin "$tmpdir/fteqcc/$fteqccname"
-			;;
-	esac
-	make clean
-}
-
-build()
-{
-	buildon nexmacbuild                           nexuiz-osx          fteqcc-osx          /tmp/Darkplaces.build 'CC="gcc -g -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4"' strip
-	buildon eos.thruhere.net                      nexuiz-linux-686    fteqcc-linux-686    /tmp/Darkplaces.build 'CC="gcc -g" DP_MODPLUG_STATIC_LIBDIR=/home/divverent/modplug-i386/lib' strip
-	buildon alientrap.org                         nexuiz-linux-x86_64 fteqcc-linux-x86_64 /tmp/Darkplaces.build 'CC="gcc -g -Wl,--hash-style=sysv" DP_MODPLUG_STATIC_LIBDIR=/home/divverent/modplug-x86_64/lib' strip
-	buildon alientrap.org                         nexuiz              fteqcc.exe          /tmp/Darkplaces.build 'DP_MAKE_TARGET=mingw CC="/chroot/debian-etch/usr/bin/i586-mingw32msvc-gcc -g -DSUPPORTDIRECTX -I/home/divverent/dxheaders" WINDRES=/chroot/debian-etch/usr/bin/i586-mingw32msvc-windres SDL_CONFIG=/home/divverent/sdl-win32/SDL-1.2.13/bin/sdl-config' /chroot/debian-etch/usr/bin/i586-mingw32msvc-strip
-		mv "$tmpdir/nexuiz-osx-agl"     "$tmpdir/Nexuiz.app/Contents/MacOS/nexuiz-osx-agl-bin"
-		mv "$tmpdir/nexuiz-osx-sdl"     "$tmpdir/Nexuiz-SDL.app/Contents/MacOS/nexuiz-osx-sdl-bin"
-}
-
-# avoid dupes
-i=
-while [ -f "$zipdir/nexuiz$date$i$ext.zip" ]; do
-	if [ -z "$i" ]; then
-		i=a
-	else
-		i=`echo "$i" | tr a-y b-z`
-	fi
-done
-ext=$i$ext
-
-echo "Using build name nexuiz$date$ext"
-sleep 3
-
-# check for remains
-conflicts=`find "$dpdir" "$nexdir" -name '*.orig' -o -name '*.rej' -o -name '*.mine' -o -name '.#*' -o -name '.*~'`
-if [ -n "$conflicts" ]; then
-	echo "CONFLICTS OR UNNEEDED FILES HAVE BEEN FOUND!"
-	echo "NOT PROCEEDING"
-	echo
-	echo "$conflicts"
-	exit 1
-fi
-
-set -x
-
-# prepare temp dir
-rm -rf "$tmpdir"
-mkdir -p "$tmpdir"
-
-# clean up and patch DP
-cd "$dpdir"
-quilt pop -a || true
-svn revert -R .
-if [ -s patches/series ]; then
-	quilt push -a # apply all patches
-fi
-
-# prepare directory structure
-cp -r "$osxapps"/*.app "$tmpdir"
-mkdir "$tmpdir/debuginfo"
-mkdir "$tmpdir/fteqcc"
-
-# prepare fteqcc build
-svn export "$fteqccdir" "$tmpdir/fteqcc/source"
-svn info "$fteqccdir" > "$tmpdir/fteqcc/source/fteqcc-base-revision.txt"
-fteqccrev=$((`grep "Last Changed Rev:" "$tmpdir/fteqcc/source/fteqcc-base-revision.txt" | cut -d : -f 2`))
-echo "fteqcc rev $fteqccrev"
-
-# build all executables
-rm -f *.exe nexuiz-* *-withdebug* *.o
-make clean
-build
-rm -f *.exe nexuiz-* *-withdebug '.#'* *.o
-rm -rf fteqcc copystrip
-make clean
-
-# move shell scripts and license
-cd "$tmpdir"
-cp "$nexdir/"nexuiz-*.sh "$tmpdir/"
-cp "$nexdir/gpl.txt" "$tmpdir/"
-
-# prepare data
-cd "$nexdir/data"
-svn export . "$tmpdir/data"
-svn info . > "$tmpdir/data/nexuiz-data-base-revision.txt"
-svn log > "$tmpdir/data/ChangeLog"
-
-# prepare pro
-cd "$nexprodir"
-svn export . "$tmpdir/pro"
-
-# prepare Docs
-cd "$nexdir/Docs"
-svn export . "$tmpdir/Docs"
-
-# make gamesource
-cd "$tmpdir/data"
-mkdir -p "$tmpdir/sources"
-mk7z ../sources/gamesource$date.zip qcsrc nexuiz-data-base-revision.txt ChangeLog
-
-# make enginesource
-cd "$dpdir"
-svn export . "$tmpdir/darkplaces"
-svn info > "$tmpdir/darkplaces/nexuiz-base-revision.txt"
-svn diff > "$tmpdir/darkplaces/nexuiz-engine-changes.diff"
-svn log > "$tmpdir/darkplaces/ChangeLog"
-cd "$tmpdir"
-mk7z "$tmpdir/sources/enginesource$date.zip" "darkplaces"
-rm -rf darkplaces
-
-# make fteqcc archive
-cd "$tmpdir"
-zip -9r "$tmpdir/sources/fteqcc-binaries-and-source-rev$fteqccrev.zip" "fteqcc"
-rm -rf fteqcc
-
-# clean fteqcc dir
-cd "$fteqccdir"
-rm -f *.o *.bin
-make
-
-# make local compiler
-cd "$tmpdir/data"
-make FTEQCC="$fteqccdir/fteqcc.bin"
-
-# prepare root
-rm -rf "$tmpdir/data/qcsrc"
-cd "$tmpdir/Docs"
-perl -pi -e '/^#---SET nexversion=([0-9.]*)$/ and $_ = "#---SET nexversion='$version'\n"' FAQ.aft
-perl -pi -e '/^\s*Version ([0-9.]*)<\/div>$/ and $_ = "Version '$version'</div>\n"' Readme.htm
-cp "$dpdir/darkplaces.txt" .
-$aft FAQ.aft
-$aft FAQ.aft
-rm FAQ.aft-TOC
-cd "$tmpdir/data"
-mv common-spog.pk3 ..
-perl -pi -e '/^set g_nexuizversion "?([0-9.]*)[^"]*"?/ and $_ = "set g_nexuizversion '$version'\n"' default.cfg
-if [ -n "$versiontag" ]; then
-	perl -pi -e '/^set g_nexuizversion/ and $_ = "showbrand 3\n$_"' default.cfg
-	cp "$buildfiles/brand/$versiontag.tga" gfx/brand.tga
-fi
-echo >> default.cfg
-echo "$defaultcfg" >> default.cfg
-mk7z ../data.pk3 .
-cd "$tmpdir/pro"
-perl -pi -e '/^set g_nexuizversion "?([0-9.]*)[^"]*"?/ and $_ = "set g_nexuizversion '$version-pro'\n"' default.cfg
-if [ -n "$versiontag" ]; then
-	perl -pi -e '/^set g_nexuizversion/ and $_ = "showbrand 3\n$_"' default.cfg
-fi
-echo >> default.cfg
-echo "$defaultcfg" >> default.cfg
-mk7z ../pro.pk3 .
-
-# make data pk3
-cd "$tmpdir"
-rm -rf data
-mkdir data
-mv data.pk3 data/data$tag$date.pk3
-mv common-spog.pk3 data/
-rm -rf pro
-mkdir pro
-mv pro.pk3 pro/data$tag${date}pro.pk3
-
-cp -r "$mingwdlls"/* .
-# fix up permissions
-chmod 644 *.dll *.exe
-
-# make main structure
-mkdir Nexuiz
-mv * Nexuiz/ || true
-
-find . -name .svn -exec rm -rf {} \; -prune
-
-rm -f "$zipdir/nexuiz$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuiz$date$ext.zip"           Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/data/data$tag$date.pk3 Nexuiz/data/common-spog.pk3 Nexuiz/pro/*
-ln -snf nexuiz$date$ext.zip "$zipdir/nexuiz-$newest.zip"
-
-rm -f "$zipdir/nexuizengineonly$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuizengineonly$date$ext.zip" Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll
-ln -snf nexuizengineonly$date$ext.zip "$zipdir/nexuizengineonly-$newest.zip"
-
-rm -f "$zipdir/nexuizsource$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuizsource$date$ext.zip"     Nexuiz/gpl.txt                                            Nexuiz/sources
-ln -snf nexuizsource$date$ext.zip "$zipdir/nexuizsource-$newest.zip"
-
-# TODO remove these excludes after the version after 2.4.2
-$zipdiff -o "Nexuiz/data/datapatch$tag$date.pk3" -f "$basepk3" -t Nexuiz/data/data$tag$date.pk3 \
-	-x 'sound/cdtracks/track*.ogg' \
-	-x 'sound/cdtracks/brainsukker.ogg' \
-	-x 'sound/cdtracks/breakdown-easy.ogg' \
-	-x 'sound/cdtracks/calling-bogus.ogg' \
-	-x 'sound/cdtracks/chaos-fog.ogg' \
-	-x 'sound/cdtracks/digital-pursuit.ogg' \
-	-x 'sound/cdtracks/infight.ogg' \
-	-x 'sound/cdtracks/neuronal-diving.ogg' \
-	-x 'sound/cdtracks/subcities.ogg' \
-	-x 'sound/cdtracks/thru-the-mirror.ogg'
-mkdir -p sound/cdtracks
-ln -snf track001.ogg sound/cdtracks/digital-pursuit.ogg
-ln -snf track002.ogg sound/cdtracks/breakdown-easy.ogg
-ln -snf track003.ogg sound/cdtracks/brainsukker.ogg
-ln -snf track004.ogg sound/cdtracks/chaos-fog.ogg
-ln -snf track005.ogg sound/cdtracks/infight.ogg
-ln -snf track006.ogg sound/cdtracks/neuronal-diving.ogg
-ln -snf track007.ogg sound/cdtracks/subcities.ogg
-ln -snf track008.ogg sound/cdtracks/thru-the-mirror.ogg
-ln -snf track009.ogg sound/cdtracks/calling-bogus.ogg
-zip -9yr "Nexuiz/data/datapatch$tag$date.pk3" sound/cdtracks/*
-rm -rf sound
-[ -n "$hotbasepk3" ] && $zipdiff -o "Nexuiz/data/datapatch$tag$date""hotfix.pk3" -f "$hotbasepk3" -t Nexuiz/data/data$tag$date.pk3
-mkdir -p gfx
-if unzip "Nexuiz/data/data$tag$date.pk3" gfx/brand.tga; then
-	zip -9r "Nexuiz/data/datapatch$tag$date.pk3" gfx/brand.tga
-	[ -n "$hotbasepk3" ] && zip -9r "Nexuiz/data/datapatch$tag$date""hotfix.pk3" gfx/brand.tga
-	rm -rf gfx
-fi
-
-rm -f "$zipdir/nexuizpatch$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuizpatch$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/data/datapatch$tag$date.pk3 Nexuiz/pro/*
-ln -snf nexuizpatch$date$ext.zip "$zipdir/nexuizpatch-$newest.zip"
-
-[ -n "$hotbasepk3" ] && rm -f "$zipdir/nexuizhotfix$date$ext.zip"
-[ -n "$hotbasepk3" ] && zip $zipflags -9yr "$zipdir/nexuizhotfix$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/nexuiz* Nexuiz/Nexuiz* Nexuiz/*.dll Nexuiz/sources Nexuiz/Docs Nexuiz/data/datapatch$tag$date""hotfix.pk3 Nexuiz/pro/*
-[ -n "$hotbasepk3" ] && ln -snf nexuizhotfix$date$ext.zip "$zipdir/nexuizhotfix-$newest.zip"
-
-rm -f "$zipdir/nexuizdocs$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuizdocs$date$ext.zip"       Nexuiz/gpl.txt Nexuiz/Docs
-ln -snf nexuizdocs$date$ext.zip "$zipdir/nexuizdocs-$newest.zip"
-
-rm -f "$zipdir/nexuizdebug$date$ext.zip"
-zip $zipflags -9yr "$zipdir/nexuizdebug$date$ext.zip"      Nexuiz/gpl.txt Nexuiz/debuginfo/* Nexuiz/sources
-ln -snf nexuizdebug$date$ext.zip "$zipdir/nexuizdebug-$newest.zip"
-
-case "$versiontag" in
-	test)
-		;;
-	*)
-		cat <<'EOF'
-
-NOTE: This is a RELEASE BUILD.
-
-To upload and finish the build, these things have to be done:
-
-- Test the build:
-  - On Linux/ATI
-  - On Vista/nvidia
-  - On Vista/ATI
-  - On Vista/Intel
-  - On OSX/ATI
-  - Turn on "developer 1"; watch out for suspicious messages.
-  - While testing, make sure all campaign levels are tested. In CTF/KH levels,
-    try to do a capture. After that, finish the game by prvm_edictset server 1
-    frags 1000.
-  - Play on a server running the new code. Ideally, that server should be public
-    and "somewhat compatible" to old clients, and some other players should be
-    on it.
-- Post the build on the forum as a test release. E.g. run this script again
-  with the "version" variable NOT SET, so the build gets marked "testing only",
-  and upload it and post it on the forum for testing. Mention the test server
-  that is already running the new code. Wait for at least one week for critical
-  bug reports.
-- If needed, fix the reported bugs and re-run this script for a release build.
-  Possibly repeat the testing process.
-- Upload the "final" build you have just made to Sourceforge (upload.sf.net,
-  incoming). Use the naming scheme nexuiz-25.zip, nexuizpatch-24-to-25.zip
-- Make the download available on sourceforge.
-- Announce the build on the forum; update the downloads website. Note that the
-  download may be still unavailable because of the SF mirror system.
-- Wait for the mirrors to catch up.
-- Edit the website: make a new news item for the new release, change the logo
-  image in the top left for the new version (ask [-z-]).
-
-EOF
-		;;
-esac

Copied: branches/nexuiz-2.0/misc/mediasource (from rev 5656, trunk/misc/mediasource)

Deleted: branches/nexuiz-2.0/misc/nexuiz-map-compiler
===================================================================
--- branches/nexuiz-2.0/misc/nexuiz-map-compiler	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/nexuiz-map-compiler	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,233 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use POSIX;
-
-# change these to match your system, or define them in ~/.nexuiz-map-compiler
-# (just copy paste this part to the file ~/.nexuiz-map-compiler)
-
-	# Path to Nexuiz (where the data directory is in)
-	our $NEXUIZDIR   = '/home/polzer/Nexvn/nexuiz';
-
-	# Path to your q3map2 program. You find it in your GtkRadiant/install
-	# directory.
-	our $Q3MAP2      = '/home/users4/ommz/polzer/bin/q3map2.x86';
-
-	# General flags for q3map2 (for example -threads 4)
-	our $Q3MAP2FLAGS = '';
-
-	# Default flags for the -bsp stage
-	our $BSPFLAGS    = '-samplesize 8 -minsamplesize 4 -mv 1000000 -mi 6000000';
-
-	# Default flags for the -vis stage
-	our $VISFLAGS    = '';
-
-	# Default flags for the -light stage
-	our $LIGHTFLAGS  = '-deluxe -patchshadows -samples 3 -lightmapsize 512 -bounce 8 -fastbounce -bouncegrid';
-
-# end of user changable part
-
-do "$ENV{HOME}/.nexuiz-map-compiler";
-
-sub Usage()
-{
-	print <<EOF;
-Usage:
-$0 mapname [-bsp bspflags...] [-vis visflags...] [-light lightflags...]
-EOF
-	exit 1;
-}
-
-my $options =
-{
-	bsp => [split /\s+/, $BSPFLAGS],
-	vis => [split /\s+/, $VISFLAGS],
-	light => [split /\s+/, $LIGHTFLAGS],
-	maps => [],
-	scale => 1
-};
-
-my $curmode = 'maps';
-
-while(@ARGV)
-{
-	$_ = shift @ARGV;
-	my $enterflags = undef;
-	if($_ eq '-bsp' or $_ eq '-meta')
-	{
-		$enterflags = 'bsp';
-	}
-	elsif($_ eq '-vis')
-	{
-		$enterflags = 'vis';
-	}
-	elsif($_ eq '-light')
-	{
-		$enterflags = 'light';
-	}
-	elsif($_ eq '-map')
-	{
-		$curmode = 'maps';
-	}
-	elsif($_ eq '-scale')
-	{
-		$options->{scale} = (shift @ARGV) || 1;
-	}
-	elsif($_ eq '-novis')
-	{
-		$options->{vis} = undef;
-	}
-	elsif($_ eq '-nolight')
-	{
-		$options->{light} = undef;
-	}
-	elsif($_ =~ /^-/ and $curmode eq 'maps')
-	{
-		$curmode = 'bsp';
-		push @{$options->{$curmode}}, $_;
-	}
-	else
-	{
-		push @{$options->{$curmode}}, $_;
-	}
-	if(defined $enterflags)
-	{
-		$curmode = $enterflags;
-		if($ARGV[0] eq '+')
-		{
-			shift @ARGV;
-		}
-		else
-		{
-			$options->{$curmode} = [];
-		}
-	}
-}
-
-my $game = 'compile.' . int rand 99999999; # mktemp on win32?
-
-sub q3map2(@)
-{
-	my @args = ($Q3MAP2, split(/\s+/, $Q3MAP2FLAGS), '-game', 'nexuiz', '-fs_basepath', $NEXUIZDIR, '-fs_game', $game, '-v', @_);
-	print "\$ @args\n";
-	return !system @args;
-}
-
-(my $mapdir = getcwd()) =~ s!/[^/]*(?:$)!!;
-$mapdir = "/" if $mapdir eq "";
-
-unlink "$NEXUIZDIR/$game";
-mkdir "$NEXUIZDIR";
-eval
-{
-	symlink "$mapdir", "$NEXUIZDIR/$game"
-		or die "THROW: Setting up directory structure, $mapdir -> $NEXUIZDIR/$game: $!";
-	1;
-}
-or do
-{
-	die $1
-		if $@ =~ /^THROW: (.*)/s;
-	# if we get here, symlinks do not work, as symlink() itself raised the exception
-	# this should only happen on Win32
-	if($^O ne "MSWin32")
-	{
-		die "Symlinks not supported ($@) but invalid OS signature, this must be MSWin32, but $^O got reported";
-	}
-
-	# TODO support Windows here somehow
-	# maybe by copying all files and copying back the finished compile? (ugh)
-	die "Windows is not supported yet.";
-};
-
-my ($prescale, $postscale) = ($options->{scale} =~ /^([0-9.]+)(?::([0-9.]+))?$/);
-$postscale = 1 if not defined $postscale;
-
-for my $m(@{$options->{maps}})
-{
-	if($prescale != 1 or $postscale != 1)
-	{
-		open my $checkfh, "<", "$m.map"
-			or die "open $m.map: $!";
-		my $keeplights = 0;
-		while(<$checkfh>)
-		{
-			/^\s*"_keeplights"\s+"1"\s*$/
-				or next;
-			$keeplights = 1;
-		}
-		close $checkfh;
-		die "$m does not define _keeplights to 1"
-			unless $keeplights;
-	}
-
-	my %shaders = map { m!/([^/.]*)\.shader(?:$)! ? ($1 => 1) : () } glob "../scripts/*.shader";
-	open my $shaderlist, "+<", "$NEXUIZDIR/data/scripts/shaderlist.txt"
-		or die "open $NEXUIZDIR/data/scripts/shaderlist.txt: $!";
-	my $previous_shaderlist = "";
-	while(<$shaderlist>)
-	{
-		$previous_shaderlist .= $_;
-		y/\r\n//d;
-		delete $shaders{$_};
-	}
-	my $restore_shaderlist = sub
-	{
-		open $shaderlist, ">", "$NEXUIZDIR/data/scripts/shaderlist.txt";
-		print $shaderlist $previous_shaderlist;
-		close $shaderlist;
-	};
-	local $SIG{INT} = sub
-	{
-		print "SIGINT caught, cleaning up...\n";
-		$restore_shaderlist->();
-		exit 0;
-	};
-	eval
-	{
-		for(keys %shaders)
-		{
-			print $shaderlist "$_\n";
-		}
-		close $shaderlist;
-
-		unlink <$m/lm_*>; # delete old external lightmaps
-		q3map2 '-bsp', '-meta', @{$options->{bsp}},   "$m.map"
-			or die "-bsp: $?";
-		if($prescale != 1)
-		{
-			q3map2 '-scale', $prescale, "$m.bsp"
-				or die "-scale: $?";
-			rename "${m}_s.bsp", "$m.bsp"
-				or die "rename ${m}_s.bsp $m.bsp: $!";
-		}
-		if(defined $options->{vis})
-		{
-			q3map2 '-vis',          @{$options->{vis}},   "$m.map"
-				or die "-vis: $?";
-		}
-		if(defined $options->{light})
-		{
-			q3map2 '-light',        @{$options->{light}}, "$m.map"
-				or die "-light: $?";
-		}
-		if($postscale != 1)
-		{
-			q3map2 '-scale', $postscale, "$m.bsp"
-				or die "-scale: $?";
-			rename "${m}_s.bsp", "$m.bsp"
-				or die "rename ${m}_s.bsp $m.bsp: $!";
-		}
-
-		unlink "$m.srf";
-
-		$restore_shaderlist->();
-		1;
-	}
-	or do
-	{
-		$restore_shaderlist->();
-		die $@;
-	};
-}

Deleted: branches/nexuiz-2.0/misc/sb-flag-carrying.svg
===================================================================
--- branches/nexuiz-2.0/misc/sb-flag-carrying.svg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/sb-flag-carrying.svg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,220 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.44"
-   width="503"
-   height="470"
-   version="1.0"
-   sodipodi:docbase="/home/users4/ommz/polzer/WWW/temp/running-marine"
-   sodipodi:docname="flag-carrying.svg"
-   inkscape:export-filename="/home/users4/ommz/polzer/WWW/temp/running-marine/flag-carrying-blue.png"
-   inkscape:export-xdpi="19.617588"
-   inkscape:export-ydpi="19.617588">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs5">
-    <linearGradient
-       id="linearGradient3763">
-      <stop
-         style="stop-color:red;stop-opacity:1;"
-         offset="0"
-         id="stop3765" />
-      <stop
-         id="stop3775"
-         offset="0.33000001"
-         style="stop-color:yellow;stop-opacity:1;" />
-      <stop
-         style="stop-color:red;stop-opacity:1;"
-         offset="0.66000003"
-         id="stop3777" />
-      <stop
-         style="stop-color:yellow;stop-opacity:1;"
-         offset="1"
-         id="stop3767" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2801">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop2803" />
-      <stop
-         id="stop2809"
-         offset="0.94999999"
-         style="stop-color:white;stop-opacity:1;" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop2805" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient2844"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.539066,0,0,1.902367,2.172742,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3780"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.376665,0,0,1.902367,2.162274,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3788"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.450701,0,0,1.902367,2.167046,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3793"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.450701,0,0,1.902367,2.167046,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <mask
-       maskUnits="userSpaceOnUse"
-       id="mask3790">
-      <rect
-         transform="matrix(0,1,-1,0,0,0)"
-         style="opacity:1;fill:url(#linearGradient3793);fill-opacity:1;stroke:none;stroke-width:7.87110186;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect1878"
-         width="225.11722"
-         height="511.84491"
-         x="2.137996"
-         y="-511.84491" />
-    </mask>
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-height="645"
-     inkscape:window-width="1019"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     guidetolerance="10.0"
-     gridtolerance="10.0"
-     objecttolerance="10.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="true"
-     gridspacingx="2.5mm"
-     gridspacingy="2.5mm"
-     grid_units="mm"
-     inkscape:grid-points="false"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-bbox="true"
-     inkscape:zoom="0.83829788"
-     inkscape:cx="287.59931"
-     inkscape:cy="273.85808"
-     inkscape:window-x="232"
-     inkscape:window-y="222"
-     inkscape:current-layer="svg2" />
-  <g
-     id="g1880"
-     clip-path="none"
-     mask="url(#mask3790)">
-    <g
-       inkscape:export-ydpi="9.7539482"
-       inkscape:export-xdpi="9.7539482"
-       transform="matrix(0.934555,0,0,0.934555,55.17645,61.98067)"
-       style="opacity:0.3"
-       id="g3727"
-       clip-path="none">
-      <path
-         sodipodi:nodetypes="ccccscccscccccccccccccccccccccccccc"
-         id="path3723"
-         d="M 77.936648,416.64918 C 66.929291,403.69748 47.183112,391.08021 47.468568,373.29631 C 61.580167,359.55032 81.18305,352.59514 97.68777,341.87372 C 110.74595,338.06729 118.44307,325.60734 131.14032,321.25949 C 135.23774,323.22955 138.01636,322.87548 140.0172,321.10616 C 145.99641,315.81884 145.02996,297.89311 151.55592,291.58386 C 160.41708,277.70343 159.66836,263.16374 151.9131,249.96044 C 155.45664,243.72563 166.71663,233.58495 153.20463,230.91525 C 150.00252,215.17855 175.41335,202.075 175.86122,197.3583 C 176.33392,192.38001 161.41329,172.43211 164.3281,159.50104 C 176.9793,149.65115 169.78762,127.26772 185.31798,119.25569 C 192.29054,113.20477 210.4602,112.16805 212.11472,108.77965 C 201.12352,97.080172 196.85491,76.451388 208.74212,64.292723 C 224.70534,54.897624 253.66981,63.271708 249.38462,85.387324 C 246.46527,97.938613 255.64422,119.85276 235.95305,120.95585 C 230.47567,135.53763 249.4295,147.25179 253.87515,160.6006 C 265.05211,172.03304 281.81019,176.78954 296.25889,178.5893 C 310.67702,185.99278 288.95145,207.16258 276.86491,208.87501 C 266.07803,212.64746 260.99023,200.43911 248.56706,199.24357 C 238.83475,180.87439 228.23756,204.15442 225.12821,214.88295 C 213.65178,221.44238 218.19122,227.13612 229.18395,228.95525 C 245.80155,238.06299 267.29134,240.22536 282.438,253.76183 C 299.52394,258.59567 310.08927,275.78366 295.39762,289.93827 C 298.94588,304.03742 292.54903,321.6244 289.93715,337.16017 C 278.51909,356.2747 292.73993,376.18783 309.33405,385.30202 C 313.65263,407.67285 287.14409,394.36219 275.71731,391.48441 C 260.84112,389.40428 250.51246,374.97195 260.19241,361.87832 C 261.27126,344.49092 263.85189,326.74433 259.40604,309.69521 C 257.08074,299.89268 265.30058,279.83135 249.8705,289.28304 C 236.68476,288.01966 223.42917,279.26247 210.09004,284.32363 C 197.57182,299.06507 191.69147,317.89165 180.59757,333.39344 C 175.89821,346.24998 171.80041,359.44265 155.36011,356.73483 C 136.17465,361.97053 118.11284,370.88329 98.07399,372.33299 C 72.235605,375.57602 96.62115,400.99427 88.93957,414.97797 C 86.16289,418.03926 81.55,417.41052 77.936648,416.64918 z "
-         style="fill:red;fill-opacity:1;stroke:black;stroke-width:5.35013991;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="ccsccscc"
-         id="path3725"
-         d="M 279.0423,191.87383 L 330.33071,-14.440493 C 304.24885,-21.480848 277.5851,-19.962497 250.79521,-25.067388 C 225.00536,-31.478574 192.76761,-48.637795 192.76761,-48.637795 L 175.66896,20.143756 C 175.66896,20.143756 207.91424,37.272644 233.7041,43.683836 C 259.49396,50.095029 296.03668,50.066395 296.03668,50.066395 L 261.84691,187.59917"
-         style="fill:blue;fill-opacity:1;stroke:black;stroke-width:5.35013991;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;opacity:1" />
-    </g>
-    <use
-       style="opacity:0.7"
-       transform="translate(-18.6911,0)"
-       height="470"
-       width="503"
-       id="use3731"
-       xlink:href="#g3727"
-       y="0"
-       x="0" />
-    <use
-       style="opacity:0.7"
-       height="470"
-       width="503"
-       transform="translate(-18.6911,0)"
-       id="use3733"
-       xlink:href="#use3731"
-       y="0"
-       x="0" />
-    <use
-       style="opacity:0.7"
-       height="470"
-       width="503"
-       transform="translate(-18.6911,0)"
-       id="use3735"
-       xlink:href="#use3733"
-       y="0"
-       x="0" />
-    <use
-       style="opacity:0.7"
-       height="470"
-       width="503"
-       transform="translate(-18.6911,0)"
-       id="use3737"
-       xlink:href="#use3735"
-       y="0"
-       x="0" />
-    <path
-       sodipodi:nodetypes="ccccscccscccccccccccccccccccccccccc"
-       id="path1873"
-       d="M 146.70363,451.36224 C 136.41665,439.25817 117.96276,427.46664 118.22954,410.8466 C 131.4176,398.00022 149.73758,391.50022 165.16214,381.48046 C 177.36573,377.92315 184.55911,366.27864 196.42539,362.21533 C 200.25466,364.05646 202.85143,363.72556 204.72132,362.07204 C 210.30922,357.13075 209.40602,340.37817 215.50489,334.48182 C 223.78613,321.5098 223.08641,307.92166 215.8387,295.58245 C 219.15033,289.75568 229.67341,280.27865 217.0457,277.78367 C 214.05316,263.07686 237.80097,250.83087 238.21953,246.42286 C 238.6613,241.77037 224.71715,223.12796 227.4412,211.04316 C 239.26444,201.8379 232.54342,180.91935 247.05739,173.43167 C 253.57364,167.77675 270.55418,166.80788 272.10042,163.64124 C 261.82854,152.70743 257.83929,133.4287 268.94854,122.06576 C 283.86705,113.28552 310.93594,121.11156 306.93119,141.77982 C 304.2029,153.50969 312.78113,173.98967 294.37865,175.02056 C 289.25974,188.64804 306.97314,199.59557 311.12784,212.07076 C 321.57332,222.75501 337.23467,227.20022 350.73778,228.88219 C 364.21231,235.80115 343.90857,255.58549 332.61304,257.18585 C 322.5321,260.71142 317.77727,249.30204 306.16714,248.18474 C 297.07176,231.01774 287.1681,252.7742 284.26224,262.80061 C 273.53689,268.93075 277.77925,274.25187 288.05256,275.95194 C 303.58262,284.46363 323.66601,286.48448 337.8214,299.13506 C 353.78915,303.65255 363.66303,319.71567 349.93287,332.94393 C 353.24892,346.12036 347.27071,362.55636 344.82976,377.07539 C 334.15896,394.93897 347.44912,413.54889 362.95723,422.0666 C 366.99318,442.97337 342.2195,430.53383 331.54054,427.84438 C 317.63792,425.90039 307.98522,412.41258 317.03167,400.17586 C 318.03991,383.92638 320.45165,367.34122 316.29676,351.40788 C 314.12364,342.24687 321.80553,323.49846 307.38528,332.33158 C 295.06248,331.15088 282.6744,322.96681 270.20825,327.69674 C 258.50928,341.47343 253.01377,359.0679 242.64591,373.55518 C 238.2541,385.57032 234.42448,397.8996 219.06012,395.36899 C 201.13025,400.26204 184.2505,408.5915 165.52309,409.94633 C 141.3757,412.97712 164.16533,436.73187 156.98647,449.80041 C 154.39151,452.66135 150.08051,452.07376 146.70363,451.36224 z "
-       style="fill:red;fill-opacity:1;stroke:black;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1"
-       clip-path="none" />
-    <path
-       sodipodi:nodetypes="ccsccscc"
-       id="path3671"
-       d="M 334.64793,241.29732 L 382.57977,48.485235 C 358.20483,41.905636 333.28609,43.324619 308.24947,38.553817 C 284.14743,32.562211 254.01948,16.525975 254.01948,16.525975 L 238.03985,80.806118 C 238.03985,80.806118 268.17484,96.814006 292.27689,102.80562 C 316.37893,108.79723 350.53011,108.77047 350.53011,108.77047 L 318.57789,237.30241"
-       style="fill:blue;fill-opacity:1;stroke:black;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       clip-path="none" />
-  </g>
-</svg>

Deleted: branches/nexuiz-2.0/misc/sb-flag-dropped.svg
===================================================================
--- branches/nexuiz-2.0/misc/sb-flag-dropped.svg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/sb-flag-dropped.svg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg5531"
-   sodipodi:version="0.32"
-   inkscape:version="0.44"
-   sodipodi:docbase="/home/users4/ommz/polzer/WWW/temp/running-marine"
-   sodipodi:docname="flag-dropped.svg"
-   inkscape:export-filename="/home/users4/ommz/polzer/WWW/temp/running-marine/flag-dropped-blue.png"
-   inkscape:export-xdpi="13.401096"
-   inkscape:export-ydpi="13.401096">
-  <defs
-     id="defs5533" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.7"
-     inkscape:cx="375"
-     inkscape:cy="574.45286"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="854"
-     inkscape:window-height="582"
-     inkscape:window-x="153"
-     inkscape:window-y="185" />
-  <metadata
-     id="metadata5536">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <path
-       style="opacity:0.4;fill:#6f6f6f;fill-opacity:1;stroke:black;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 128.57143,612.36219 L 240,442.36218 L 545.71428,463.79076 L 372.85714,636.6479 L 128.57143,612.36219 z "
-       id="path5540"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       sodipodi:nodetypes="cccsccscc"
-       id="path3671"
-       d="M 260.11602,526.80611 L 269.0491,540.74905 L 436.33978,433.56795 C 423.14748,412.0414 404.06506,395.95356 389.14932,375.28684 C 375.75138,354.37505 364.8752,322.02443 364.8752,322.02443 L 309.10345,357.75672 C 309.10345,357.75672 320.00421,390.09157 333.40215,411.00337 C 346.80009,431.91517 371.63495,455.35729 371.63495,455.35729 L 260.11602,526.80611 z "
-       style="fill:blue;fill-opacity:1;stroke:black;stroke-width:7.47643995;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-  </g>
-</svg>

Deleted: branches/nexuiz-2.0/misc/sb-flag-shielded.svg
===================================================================
--- branches/nexuiz-2.0/misc/sb-flag-shielded.svg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/sb-flag-shielded.svg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   width="503"
-   height="470"
-   version="1.0"
-   sodipodi:docbase="/home/users4/ommz/polzer/WWW/temp/running-marine"
-   sodipodi:docname="sb-flag-shielded.svg"
-   inkscape:export-filename="/home/users4/ommz/polzer/WWW/temp/running-marine/flag-carrying-blue.png"
-   inkscape:export-xdpi="13.401096"
-   inkscape:export-ydpi="13.401096"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs5">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 235 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="503 : 235 : 1"
-       inkscape:persp3d-origin="251.5 : 156.66667 : 1"
-       id="perspective31" />
-    <linearGradient
-       id="linearGradient3763">
-      <stop
-         style="stop-color:red;stop-opacity:1;"
-         offset="0"
-         id="stop3765" />
-      <stop
-         id="stop3775"
-         offset="0.33000001"
-         style="stop-color:yellow;stop-opacity:1;" />
-      <stop
-         style="stop-color:red;stop-opacity:1;"
-         offset="0.66000003"
-         id="stop3777" />
-      <stop
-         style="stop-color:yellow;stop-opacity:1;"
-         offset="1"
-         id="stop3767" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2801">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop2803" />
-      <stop
-         id="stop2809"
-         offset="0.94999999"
-         style="stop-color:white;stop-opacity:1;" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop2805" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient2844"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.539066,0,0,1.902367,2.172742,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3780"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.376665,0,0,1.902367,2.162274,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3788"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.450701,0,0,1.902367,2.167046,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2801"
-       id="linearGradient3793"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.450701,0,0,1.902367,2.167046,-512.696)"
-       x1="-0.064449146"
-       y1="134.97579"
-       x2="499.41825"
-       y2="134.97579" />
-    <mask
-       maskUnits="userSpaceOnUse"
-       id="mask3790">
-      <rect
-         transform="matrix(0,1,-1,0,0,0)"
-         style="opacity:1;fill:url(#linearGradient3793);fill-opacity:1;stroke:none;stroke-width:7.87110186;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect1878"
-         width="225.11722"
-         height="511.84491"
-         x="2.137996"
-         y="-511.84491" />
-    </mask>
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-height="765"
-     inkscape:window-width="1019"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     guidetolerance="10.0"
-     gridtolerance="10.0"
-     objecttolerance="10.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="true"
-     grid_units="mm"
-     inkscape:grid-points="false"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-bbox="true"
-     inkscape:zoom="0.83829788"
-     inkscape:cx="322.19322"
-     inkscape:cy="177.03021"
-     inkscape:window-x="26"
-     inkscape:window-y="68"
-     inkscape:current-layer="svg2">
-    <inkscape:grid
-       id="GridFromPre046Settings"
-       type="xygrid"
-       originx="0px"
-       originy="0px"
-       spacingx="1.25mm"
-       spacingy="1.25mm"
-       color="#0000ff"
-       empcolor="#0000ff"
-       opacity="0.2"
-       empopacity="0.4"
-       empspacing="5"
-       units="mm"
-       visible="true"
-       enabled="true" />
-  </sodipodi:namedview>
-  <path
-     id="path3671"
-     d="M 255.85515,350.70413 L 303.78699,157.89205 C 279.41205,151.31245 254.49331,152.73143 229.45669,147.96063 C 205.35465,141.96902 175.2267,125.93279 175.2267,125.93279 L 159.24707,190.21293 C 159.24707,190.21293 189.38206,206.22082 213.48411,212.21243 C 237.58615,218.20404 271.73733,218.17728 271.73733,218.17728 L 239.78511,346.70922"
-     style="fill:#0000ff;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-     mask="none" />
-  <path
-     style="opacity:1;fill:#aa0000;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 233.59375,27.09375 C 117.46186,27.09375 23.21875,121.33686 23.21875,237.46875 C 23.218748,353.60065 117.46186,447.84375 233.59375,447.84375 C 349.72564,447.84374 444,353.60064 444,237.46875 C 444,121.33687 349.72564,27.09375 233.59375,27.09375 z M 233.59375,71.375 C 325.27682,71.375 399.6875,145.78568 399.6875,237.46875 C 399.6875,279.3234 384.20404,317.59332 358.625,346.8125 L 124.28125,112.5 C 153.50236,86.913055 191.73187,71.375 233.59375,71.375 z M 108.59375,128.125 L 342.96875,362.46875 C 313.74534,388.06512 275.46426,403.5625 233.59375,403.5625 C 141.91068,403.56249 67.5,329.15182 67.5,237.46875 C 67.499999,195.61411 83.014714,157.34418 108.59375,128.125 z"
-     id="path3211" />
-</svg>

Deleted: branches/nexuiz-2.0/misc/sb-flag-taken.svg
===================================================================
--- branches/nexuiz-2.0/misc/sb-flag-taken.svg	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/sb-flag-taken.svg	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.44"
-   width="503"
-   height="470"
-   version="1.0"
-   sodipodi:docbase="/home/users4/ommz/polzer/WWW/temp/running-marine"
-   sodipodi:docname="flag-taken.svg"
-   inkscape:export-filename="/home/users4/ommz/polzer/WWW/temp/running-marine/flag-taken-blue.png"
-   inkscape:export-xdpi="9.7539482"
-   inkscape:export-ydpi="9.7539482">
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs5" />
-  <sodipodi:namedview
-     inkscape:window-height="625"
-     inkscape:window-width="854"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     guidetolerance="10.0"
-     gridtolerance="10.0"
-     objecttolerance="10.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="true"
-     gridspacingx="2.5mm"
-     gridspacingy="2.5mm"
-     grid_units="mm"
-     inkscape:grid-points="false"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-bbox="true"
-     inkscape:zoom="0.41914894"
-     inkscape:cx="287.59931"
-     inkscape:cy="103.2055"
-     inkscape:window-x="122"
-     inkscape:window-y="154"
-     inkscape:current-layer="svg2" />
-  <g
-     id="g3727"
-     style="opacity:0.3"
-     transform="matrix(0.934555,0,0,0.934555,55.17645,61.98067)"
-     inkscape:export-xdpi="9.7539482"
-     inkscape:export-ydpi="9.7539482">
-    <path
-       style="fill:red;fill-opacity:1;stroke:black;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 77.936648,416.64918 C 66.929291,403.69748 47.183112,391.08021 47.468568,373.29631 C 61.580167,359.55032 81.18305,352.59514 97.68777,341.87372 C 110.74595,338.06729 118.44307,325.60734 131.14032,321.25949 C 135.23774,323.22955 138.01636,322.87548 140.0172,321.10616 C 145.99641,315.81884 145.02996,297.89311 151.55592,291.58386 C 160.41708,277.70343 159.66836,263.16374 151.9131,249.96044 C 155.45664,243.72563 166.71663,233.58495 153.20463,230.91525 C 150.00252,215.17855 175.41335,202.075 175.86122,197.3583 C 176.33392,192.38001 161.41329,172.43211 164.3281,159.50104 C 176.9793,149.65115 169.78762,127.26772 185.31798,119.25569 C 192.29054,113.20477 210.4602,112.16805 212.11472,108.77965 C 201.12352,97.080172 196.85491,76.451388 208.74212,64.292723 C 224.70534,54.897624 253.66981,63.271708 249.38462,85.387324 C 246.46527,97.938613 255.64422,119.85276 235.95305,120.95585 C 230.47567,135.53763 249.4295,147.25179 253.87515,160.6006 C 265.05211,172.03304 281.81019,176.78954 296.25889,178.5893 C 310.67702,185.99278 288.95145,207.16258 276.86491,208.87501 C 266.07803,212.64746 260.99023,200.43911 248.56706,199.24357 C 238.83475,180.87439 228.23756,204.15442 225.12821,214.88295 C 213.65178,221.44238 218.19122,227.13612 229.18395,228.95525 C 245.80155,238.06299 267.29134,240.22536 282.438,253.76183 C 299.52394,258.59567 310.08927,275.78366 295.39762,289.93827 C 298.94588,304.03742 292.54903,321.6244 289.93715,337.16017 C 278.51909,356.2747 292.73993,376.18783 309.33405,385.30202 C 313.65263,407.67285 287.14409,394.36219 275.71731,391.48441 C 260.84112,389.40428 250.51246,374.97195 260.19241,361.87832 C 261.27126,344.49092 263.85189,326.74433 259.40604,309.69521 C 257.08074,299.89268 265.30058,279.83135 249.8705,289.28304 C 236.68476,288.01966 223.42917,279.26247 210.09004,284.32363 C 197.57182,299.06507 191.69147,317.89165 180.59757,333.39344 C 175.89821,346.24998 171.80041,359.44265 155.36011,356.73483 C 136.17465,361.97053 118.11284,370.88329 98.07399,372.33299 C 72.235605,375.57602 96.62115,400.99427 88.93957,414.97797 C 86.16289,418.03926 81.55,417.41052 77.936648,416.64918 z "
-       id="path3723"
-       sodipodi:nodetypes="ccccscccscccccccccccccccccccccccccc" />
-    <path
-       style="fill:blue;fill-opacity:1;stroke:black;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
-       d="M 279.0423,191.87383 L 330.33071,-14.440493 C 304.24885,-21.480848 277.5851,-19.962497 250.79521,-25.067388 C 225.00536,-31.478574 192.76761,-48.637795 192.76761,-48.637795 L 175.66896,20.143756 C 175.66896,20.143756 207.91424,37.272644 233.7041,43.683836 C 259.49396,50.095029 296.03668,50.066395 296.03668,50.066395 L 261.84691,187.59917"
-       id="path3725"
-       sodipodi:nodetypes="ccsccscc" />
-  </g>
-  <use
-     x="0"
-     y="0"
-     xlink:href="#g3727"
-     id="use3731"
-     width="503"
-     height="470"
-     transform="translate(-18.6911,0)"
-     style="opacity:0.7" />
-  <use
-     x="0"
-     y="0"
-     xlink:href="#use3731"
-     id="use3733"
-     transform="translate(-18.6911,0)"
-     width="503"
-     height="470"
-     style="opacity:0.7" />
-  <use
-     x="0"
-     y="0"
-     xlink:href="#use3733"
-     id="use3735"
-     transform="translate(-18.6911,0)"
-     width="503"
-     height="470"
-     style="opacity:0.7" />
-  <use
-     x="0"
-     y="0"
-     xlink:href="#use3735"
-     id="use3737"
-     transform="translate(-18.6911,0)"
-     width="503"
-     height="470"
-     style="opacity:0.7" />
-  <g
-     id="g3739"
-     transform="matrix(0.934555,0,0,0.934555,55.17645,61.98067)">
-    <path
-       sodipodi:nodetypes="ccccscccscccccccccccccccccccccccccc"
-       id="path1873"
-       d="M 97.936648,416.64918 C 86.929291,403.69748 67.183112,391.08021 67.468568,373.29631 C 81.580167,359.55032 101.18305,352.59514 117.68777,341.87372 C 130.74595,338.06729 138.44307,325.60734 151.14032,321.25949 C 155.23774,323.22955 158.01636,322.87548 160.0172,321.10616 C 165.99641,315.81884 165.02996,297.89311 171.55592,291.58386 C 180.41708,277.70343 179.66836,263.16374 171.9131,249.96044 C 175.45664,243.72563 186.71663,233.58495 173.20463,230.91525 C 170.00252,215.17855 195.41335,202.075 195.86122,197.3583 C 196.33392,192.38001 181.41329,172.43211 184.3281,159.50104 C 196.9793,149.65115 189.78762,127.26772 205.31798,119.25569 C 212.29054,113.20477 230.4602,112.16805 232.11472,108.77965 C 221.12352,97.080172 216.85491,76.451388 228.74212,64.292723 C 244.70534,54.897624 273.66981,63.271708 269.38462,85.387324 C 266.46527,97.938613 275.64422,119.85276 255.95305,120.95585 C 250.47567,135.53763 269.4295,147.25179 273.87515,160.6006 C 285.05211,172.03304 301.81019,176.78954 316.25889,178.5893 C 330.67702,185.99278 308.95145,207.16258 296.86491,208.87501 C 286.07803,212.64746 280.99023,200.43911 268.56706,199.24357 C 258.83475,180.87439 248.23756,204.15442 245.12821,214.88295 C 233.65178,221.44238 238.19122,227.13612 249.18395,228.95525 C 265.80155,238.06299 287.29134,240.22536 302.438,253.76183 C 319.52394,258.59567 330.08927,275.78366 315.39762,289.93827 C 318.94588,304.03742 312.54903,321.6244 309.93715,337.16017 C 298.51909,356.2747 312.73993,376.18783 329.33405,385.30202 C 333.65263,407.67285 307.14409,394.36219 295.71731,391.48441 C 280.84112,389.40428 270.51246,374.97195 280.19241,361.87832 C 281.27126,344.49092 283.85189,326.74433 279.40604,309.69521 C 277.08074,299.89268 285.30058,279.83135 269.8705,289.28304 C 256.68476,288.01966 243.42917,279.26247 230.09004,284.32363 C 217.57182,299.06507 211.69147,317.89165 200.59757,333.39344 C 195.89821,346.24998 191.80041,359.44265 175.36011,356.73483 C 156.17465,361.97053 138.11284,370.88329 118.07399,372.33299 C 92.235605,375.57602 116.62115,400.99427 108.93957,414.97797 C 106.16289,418.03926 101.55,417.41052 97.936648,416.64918 z "
-       style="fill:red;fill-opacity:1;stroke:black;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="ccsccscc"
-       id="path3671"
-       d="M 299.0423,191.87383 L 350.33071,-14.440493 C 324.24885,-21.480848 297.5851,-19.962497 270.79521,-25.067388 C 245.00536,-31.478574 212.76761,-48.637795 212.76761,-48.637795 L 195.66896,20.143756 C 195.66896,20.143756 227.91424,37.272644 253.7041,43.683836 C 279.49396,50.095029 316.03668,50.066395 316.03668,50.066395 L 281.84691,187.59917"
-       style="fill:blue;fill-opacity:1;stroke:black;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-  </g>
-</svg>

Deleted: branches/nexuiz-2.0/misc/spherefunc2skybox.c
===================================================================
--- branches/nexuiz-2.0/misc/spherefunc2skybox.c	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/spherefunc2skybox.c	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,269 +0,0 @@
-#include <stdio.h>
-#include <err.h>
-#include <stdint.h>
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-
-double rnd()
-{
-	return rand() / (RAND_MAX + 1.0);
-}
-
-typedef void (*mapfunc_t) (double x_in, double y_in, double *x_out, double *y_out, double *z_out);
-typedef void (*colorfunc_t) (double x, double y, double z, double *r, double *g, double *b);
-
-void color_test(double x, double y, double z, double *r, double *g, double *b)
-{
-	// put in a nice function here
-	*r = 0.5 + 0.5 * x;
-	*g = 0.5 + 0.5 * y;
-	*b = 0.5 + 0.5 * z;
-}
-
-double mandelbrot_iter(double zx, double zy, double cx, double cy, int maxiter)
-{
-	double tmp;
-	int i;
-
-	double f, fprev;
-
-	f = 0;
-
-	for(i = 1; i < maxiter; ++i)
-	{
-		tmp = zx;
-		zx = zx * zx - zy * zy + cx;
-		zy = 2 * tmp * zy + cy;
-		fprev = f;
-		f = zx * zx + zy * zy;
-		if(f > 4)
-			break;
-	}
-
-	if(i >= maxiter)
-		return i;
-	else
-	{
-		// f: the greater, the more in 0 direction
-		//    the smaller, the more in 1 direction
-		// fprev:
-		//    the greater, the more in 0 direction
-		return i + 1 / (f - 4 + 1); // f = 16: + 0, f = 4: + 1
-	}
-	// i.e. 0 for i=1, 1 for i=maxiter
-}
-
-double mandelbrot_range(double zx, double zy, double cx, double cy, int maxiter, double offset)
-{
-	double i = mandelbrot_iter(zx, zy, cx, cy, maxiter);
-	// map linearily 1/(offset + iter) so that:
-	//   0       -> 0
-	//   maxiter -> 1
-	// i.e. solve:
-	//   f(iter) = A/(offset + iter) + B
-	// that is:
-	//   f(0)       = A/offset + B = 0
-	//   f(maxiter) = A/(offset + maxiter) + B = 1
-	// -->
-	//   1/(1/(offset + maxiter) - 1/offset) = A
-	//   B =          1 + offset / maxiter
-	//   A = -offset (1 + offset / maxiter)
-	// -->
-	//   f(iter) = -offset (1 + offset / maxiter) / (offset + iter) + 1 + offset / maxiter
-	//           = -offset (1 + offset / maxiter) / (offset + iter) + 1 + offset / maxiter
-	//           = iter (offset + maxiter)   /   maxiter (offset + iter)
-	return (i * (offset + maxiter)) / ((i + offset) * maxiter);
-}
-
-double color_mandelbrot_parms[13];
-double mandelbrot_miniter = -1;
-#define MAXITER 8192
-
-double iter_mandelbrot_raw(double x, double y, double z)
-{
-	z -= color_mandelbrot_parms[6];
-	x /= fabs(z);
-	y /= fabs(z);
-
-	if(z > 0)
-		return mandelbrot_range(color_mandelbrot_parms[4], color_mandelbrot_parms[5], color_mandelbrot_parms[0] + x * color_mandelbrot_parms[2], color_mandelbrot_parms[1] + y * color_mandelbrot_parms[3], MAXITER, color_mandelbrot_parms[9]);
-	else
-		return 0;
-}
-
-void iter_mandelbrot_raw_initialize_min()
-{
-	if(mandelbrot_miniter >= 0)
-		return;
-	// randomly sample 256 points
-	// mandelbrot them
-	// set that as miniter
-	int i = 0;
-	double x, y, z;
-	mandelbrot_miniter = MAXITER;
-	for(i = 0; i < 8192; ++i)
-	{
-		x = rnd() * 2 - 1;
-		y = rnd() * 2 - 1;
-		z = rnd() * 2 - 1;
-		double f = sqrt(x*x + y*y + z*z);
-		x /= f;
-		y /= f;
-		z /= f;
-		double a = (z - color_mandelbrot_parms[6]) / (color_mandelbrot_parms[7] - color_mandelbrot_parms[6]);
-		a = (a - color_mandelbrot_parms[8]) / (1 - color_mandelbrot_parms[8]);
-		if(a < 1)
-			continue;
-		double iterations = iter_mandelbrot_raw(x, y, z);
-		if(iterations == 0)
-			continue;
-		if(iterations < mandelbrot_miniter)
-			mandelbrot_miniter = iterations;
-	}
-}
-
-void color_mandelbrot(double x, double y, double z, double *r, double *g, double *b)
-{
-	iter_mandelbrot_raw_initialize_min();
-
-	double iterations = iter_mandelbrot_raw(x, y, z);
-	//printf("iter = %f\n", iterations);
-	double a = (z - color_mandelbrot_parms[6]) / (color_mandelbrot_parms[7] - color_mandelbrot_parms[6]);
-	a = (a - color_mandelbrot_parms[8]) / (1 - color_mandelbrot_parms[8]);
-	if(a < 0)
-		a = 0;
-	if(a > 1)
-		a = 1;
-	iterations = iterations * a + mandelbrot_miniter * (1-a);
-	*r = pow(iterations, color_mandelbrot_parms[10]);
-	*g = pow(iterations, color_mandelbrot_parms[11]);
-	*b = pow(iterations, color_mandelbrot_parms[12]);
-}
-
-void map_back(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = 2 * x_in - 1;
-	*y_out = +1;
-	*z_out = 1 - 2 * y_in;
-}
-
-void map_right(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = +1;
-	*y_out = 1 - 2 * x_in;
-	*z_out = 1 - 2 * y_in;
-}
-
-void map_front(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = 1 - 2 * x_in;
-	*y_out = -1;
-	*z_out = 1 - 2 * y_in;
-}
-
-void map_left(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = -1;
-	*y_out = 2 * x_in - 1;
-	*z_out = 1 - 2 * y_in;
-}
-
-void map_up(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = 2 * y_in - 1;
-	*y_out = 1 - 2 * x_in;
-	*z_out = +1;
-}
-
-void map_down(double x_in, double y_in, double *x_out, double *y_out, double *z_out)
-{
-	*x_out = 1 - 2 * y_in;
-	*y_out = 1 - 2 * x_in;
-	*z_out = -1;
-}
-
-void writepic(colorfunc_t f, mapfunc_t m, const char *fn, int width, int height)
-{
-	int x, y;
-	uint8_t tga[18];
-
-	FILE *file = fopen(fn, "wb");
-	if(!file)
-		err(1, "fopen %s", fn);
-
-	memset(tga, 0, sizeof(tga));
-	tga[2] = 2;          // uncompressed type
-	tga[12] = (width >> 0) & 0xFF;
-	tga[13] = (width >> 8) & 0xFF;
-	tga[14] = (height >> 0) & 0xFF;
-	tga[15] = (height >> 8) & 0xFF;
-	tga[16] = 24;        // pixel size
-
-	fwrite(&tga, sizeof(tga), 1, file);
-	for(y = height-1; y >= 0; --y)
-		for(x = 0; x < width; ++x)
-		{
-			uint8_t rgb[3];
-			double rr, gg, bb;
-			double xx, yy;
-			double xxx, yyy, zzz;
-			double r;
-			xx = (x + 0.5) / width;
-			yy = (y + 0.5) / height;
-			m(xx, yy, &xxx, &yyy, &zzz);
-			r = sqrt(xxx*xxx + yyy*yyy + zzz*zzz);
-			xxx /= r;
-			yyy /= r;
-			zzz /= r;
-			f(xxx, yyy, zzz, &rr, &gg, &bb);
-			rgb[2] = floor(rnd() + rr * 255);
-			rgb[1] = floor(rnd() + gg * 255);
-			rgb[0] = floor(rnd() + bb * 255);
-			fwrite(rgb, sizeof(rgb), 1, file);
-		}
-	
-	fclose(file);
-}
-
-void map_all(const char *fn, colorfunc_t f, int width, int height)
-{
-	char buf[1024];
-	snprintf(buf, sizeof(buf), "%s_bk.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_back, buf, width, height);
-	snprintf(buf, sizeof(buf), "%s_ft.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_front, buf, width, height);
-	snprintf(buf, sizeof(buf), "%s_rt.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_right, buf, width, height);
-	snprintf(buf, sizeof(buf), "%s_lf.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_left, buf, width, height);
-	snprintf(buf, sizeof(buf), "%s_up.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_up, buf, width, height);
-	snprintf(buf, sizeof(buf), "%s_dn.tga", fn); buf[sizeof(buf) - 1] = 0; writepic(f, map_down, buf, width, height);
-}
-
-int main(int argc, char **argv)
-{
-	colorfunc_t f;
-	if(argc < 4)
-		errx(1, "usage: %s filename res func parms...", *argv);
-	int res = atoi(argv[2]);
-	if(!strcmp(argv[3], "mandel"))
-	{
-		f = color_mandelbrot;
-		color_mandelbrot_parms[0]  = argc<= 4 ?  -0.740 :  atof(argv[4]); // shift xy
-		color_mandelbrot_parms[1]  = argc<= 5 ?  -0.314 :  atof(argv[5]);
-		color_mandelbrot_parms[2]  = argc<= 6 ?  -0.003 :  atof(argv[6]); // mul xy
-		color_mandelbrot_parms[3]  = argc<= 7 ?  -0.003 :  atof(argv[7]);
-		color_mandelbrot_parms[4]  = argc<= 8 ?   0.420 :  atof(argv[8]); // shift z
-		color_mandelbrot_parms[5]  = argc<= 9 ?   0.000 :  atof(argv[9]);
-		color_mandelbrot_parms[6]  = argc<=10 ?  -0.8   : atof(argv[10]); // horizon
-		color_mandelbrot_parms[7]  = argc<=11 ?  -0.7   : atof(argv[11]);
-		color_mandelbrot_parms[8]  = argc<=12 ?   0.5   : atof(argv[12]);
-		color_mandelbrot_parms[9]  = argc<=13 ? 400     : atof(argv[13]); // coloring
-		color_mandelbrot_parms[10] = argc<=14 ?   0.6   : atof(argv[14]);
-		color_mandelbrot_parms[11] = argc<=15 ?   0.5   : atof(argv[15]);
-		color_mandelbrot_parms[12] = argc<=16 ?   0.2   : atof(argv[16]);
-	}
-	else
-	{
-		f = color_test;
-	}
-	map_all(argv[1], color_mandelbrot, res, res);
-	return 0;
-}

Deleted: branches/nexuiz-2.0/misc/testbuild.sh
===================================================================
--- branches/nexuiz-2.0/misc/testbuild.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/testbuild.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-cd nexuiz
-../darkplaces/nexuiz-glx "$@"

Copied: branches/nexuiz-2.0/misc/tools (from rev 5656, trunk/misc/tools)

Deleted: branches/nexuiz-2.0/misc/zipdiff
===================================================================
--- branches/nexuiz-2.0/misc/zipdiff	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/misc/zipdiff	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,171 +0,0 @@
-#!/bin/sh
-
-usage()
-{
-	cat <<EOF
-Usage:
-  $0 -o difference.zip -f from.zip -t to.zip
-  $0 -f from.zip -t to.zip
-EOF
-	exit 1
-}
-
-output=
-from=
-to=
-excludes=
-
-while [ $# -gt 0 ]; do
-	o=$1
-	shift
-	case "$o" in
-		-o)
-			output=$1
-			shift
-			;;
-		-f)
-			from=$1
-			shift
-			;;
-		-t)
-			to=$1
-			shift
-			;;
-		-x)
-			excludes="$excludes $1"
-			shift
-			;;
-		*)
-			usage
-			;;
-	esac
-done
-
-[ -n "$from" ] || usage
-[ -n "$to" ] || usage
-
-found()
-{
-	type=$1
-	source=$2
-	echo >&2 "$type: $source"
-	case "$type" in
-		new|changed|deleted)
-			echo "$source"
-			;;
-		excluded)
-			;;
-		deleted|*)
-			echo >&2 " * Sorry, can't handle deletion of $source."
-			;;
-	esac
-}
-
-tempdir=`mktemp -d -t zipdiff.XXXXXX`
-
-newline="
-"
-fromlist="$(zipinfo -1 "$from" | grep -v /\$)"
-tolist="$(zipinfo -1 "$to" | grep -v /\$)"
-
-diffit()
-{
-	echo "$fromlist" | while IFS= read -r line; do
-		case "$newline$tolist$newline" in
-			*$newline$line$newline*)
-				;;
-			*)
-				isexcluded=false
-
-				for P in $excludes; do
-					case "$line" in
-						$P)
-							found excluded "$line"
-							isexcluded=true
-							break
-							;;
-					esac
-				done
-
-				if ! $isexcluded; then
-					found deleted "$line"
-				fi
-				;;
-		esac
-	done
-	echo "$tolist" | while IFS= read -r line; do
-		case "$newline$fromlist$newline" in
-			*$newline$line$newline*)
-				# check if equal
-				isexcluded=false
-
-				for P in $excludes; do
-					case "$line" in
-						$P)
-							found excluded "$line"
-							isexcluded=true
-							break
-							;;
-					esac
-				done
-
-				if ! $isexcluded; then
-					unzip -p "$from" "$line" > "$tempdir/v1"
-					unzip -p "$to" "$line" > "$tempdir/v2"
-					if ! diff --brief "$tempdir/v1" "$tempdir/v2" >/dev/null 2>&1; then
-						found changed "$line"
-					fi
-					rm "$tempdir/v1"
-					rm "$tempdir/v2"
-				fi
-				;;
-			*)
-				# check if equal
-				isexcluded=false
-
-				for P in $excludes; do
-					case "$line" in
-						$P)
-							found excluded "$line"
-							isexcluded=true
-							break
-							;;
-					esac
-				done
-
-				if ! $isexcluded; then
-					found new "$line"
-				fi
-				;;
-		esac
-	done
-}
-
-result=`diffit`
-
-case "$output" in
-	'')
-		;;
-	*)
-		rm -f "$output"
-		echo "$result" | while IFS= read -r line; do
-			echo >&2 "extracting $line..."
-			dline=./$line
-			mkdir -p "$tempdir/${dline%/*}"
-			unzip -p "$to" "$line" > "$tempdir/$line" # this may create an empty file - don't care, DP handles this as deletion
-		done
-		case "$output" in
-			/*)
-				;;
-			*)
-				output=`pwd`/$output
-				;;
-		esac
-		cd "$tempdir"
-		#zip -9r "$output" .
-		7za a -tzip -mx=9 "$output" .
-		cd ..
-		;;
-esac
-
-rm -rf "$tempdir"

Modified: branches/nexuiz-2.0/nexuiz-linux-glx.sh
===================================================================
--- branches/nexuiz-2.0/nexuiz-linux-glx.sh	2009-01-24 19:48:11 UTC (rev 5657)
+++ branches/nexuiz-2.0/nexuiz-linux-glx.sh	2009-01-24 19:51:12 UTC (rev 5658)
@@ -1,9 +1,9 @@
 #!/bin/sh
 
-path="`dirname \"${0}\"`"
-link="`readlink \"${0}\"`"
+path=`dirname "${0}"`
+link=`readlink "${0}"`
 
-[ -n "${link}" ] && path="`dirname \"${link}\"`"
+[ -n "${link}" ] && path=`dirname "${link}"`
 cd "${path}"
 
 case "${0##*/}" in

Copied: branches/nexuiz-2.0/server (from rev 5656, trunk/server)




More information about the nexuiz-commits mailing list