r5122 - in branches/nexuiz-2.0: . Docs Docs/server data data/gfx 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/models data/models/player data/models/sprites data/qcsrc/client data/qcsrc/common data/qcsrc/menu data/qcsrc/menu/item data/qcsrc/menu/nexuiz data/qcsrc/server data/scripts data/sound/announcer/male data/sound/ctf data/sound/misc data/sound/player data/sound/player/carni-lycan/coms data/sound/player/carni-lycan/player data/sound/player/fricka data/sound/player/fricka/player data/sound/player/insurrectionist/coms data/sound/player/pyria-skadi data/sound/player/pyria-skadi/player data/sound/player/reptilian/player data/sound/player/soldier/coms data/sound/player/specop/coms data/sound/player/specop/player data/sound/player/torus data/sound/porto data/sound/weapons data/textures

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Nov 27 08:33:47 EST 2008


Author: div0
Date: 2008-11-27 08:33:46 -0500 (Thu, 27 Nov 2008)
New Revision: 5122

Added:
   branches/nexuiz-2.0/Docs/htmlfiles/
   branches/nexuiz-2.0/data/sound/player/fricka/coms/
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/coms/
   branches/nexuiz-2.0/data/textures/portals/
Removed:
   branches/nexuiz-2.0/Docs/FAQ.aft
   branches/nexuiz-2.0/Docs/FAQ.html
   branches/nexuiz-2.0/Docs/Readme.htm
   branches/nexuiz-2.0/Docs/basics.aft
   branches/nexuiz-2.0/Docs/say-escapes.txt
   branches/nexuiz-2.0/data/sound/player/lava.ogg
   branches/nexuiz-2.0/data/sound/player/slime.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/needhelp2.ogg
   branches/nexuiz-2.0/data/textures/marine_bump.tga
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/Docs/basics.html
   branches/nexuiz-2.0/Docs/server/server.cfg
   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/ctfscoring-div0.cfg
   branches/nexuiz-2.0/data/defaultNexuiz.cfg
   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/gfx/sb_kh_full.tga
   branches/nexuiz-2.0/data/gfx/sb_kh_outline.tga
   branches/nexuiz-2.0/data/gfx/sb_playercolor_pants.tga
   branches/nexuiz-2.0/data/gfx/sb_playercolor_shirt.tga
   branches/nexuiz-2.0/data/high.cfg
   branches/nexuiz-2.0/data/low.cfg
   branches/nexuiz-2.0/data/med.cfg
   branches/nexuiz-2.0/data/models/player/carni.zym.sounds
   branches/nexuiz-2.0/data/models/player/headhunter.zym.sounds
   branches/nexuiz-2.0/data/models/player/insurrectionist.zym.sounds
   branches/nexuiz-2.0/data/models/player/lurk.zym.sounds
   branches/nexuiz-2.0/data/models/player/lycanthrope.zym.sounds
   branches/nexuiz-2.0/data/models/player/marine.zym.sounds
   branches/nexuiz-2.0/data/models/player/nexus.zym.sounds
   branches/nexuiz-2.0/data/models/player/pyria.zym.sounds
   branches/nexuiz-2.0/data/models/player/shock.zym.sounds
   branches/nexuiz-2.0/data/models/player/skadi.zym.sounds
   branches/nexuiz-2.0/data/models/player/specop.zym.sounds
   branches/nexuiz-2.0/data/models/player/visitant.zym.sounds
   branches/nexuiz-2.0/data/models/player/xolar.zym.sounds
   branches/nexuiz-2.0/data/models/portal.md3
   branches/nexuiz-2.0/data/models/sprites/make-sprites.sh
   branches/nexuiz-2.0/data/mutator_reset.cfg
   branches/nexuiz-2.0/data/nexuiz-credits.txt
   branches/nexuiz-2.0/data/normal.cfg
   branches/nexuiz-2.0/data/omg.cfg
   branches/nexuiz-2.0/data/physicsPro.cfg
   branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
   branches/nexuiz-2.0/data/qcsrc/client/View.qc
   branches/nexuiz-2.0/data/qcsrc/client/main.qh
   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/teamradar.qc
   branches/nexuiz-2.0/data/qcsrc/client/teamradar.qh
   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/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/listbox.c
   branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh
   branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.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_mapinfo.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.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_demo.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/mainwindow.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c
   branches/nexuiz-2.0/data/qcsrc/menu/progs.src
   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/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_subs.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_world.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/portals.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/race.qc
   branches/nexuiz-2.0/data/qcsrc/server/scores.qc
   branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc
   branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/sys.qh
   branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
   branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/server/vote.qc
   branches/nexuiz-2.0/data/qcsrc/server/vote.qh
   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_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/scripts/entities.def
   branches/nexuiz-2.0/data/scripts/shaderlist.txt
   branches/nexuiz-2.0/data/sound/announcer/male/airshot.ogg
   branches/nexuiz-2.0/data/sound/announcer/male/impressive.ogg
   branches/nexuiz-2.0/data/sound/ctf/take.wav
   branches/nexuiz-2.0/data/sound/misc/armor1.wav
   branches/nexuiz-2.0/data/sound/misc/armor25.wav
   branches/nexuiz-2.0/data/sound/misc/gib.wav
   branches/nexuiz-2.0/data/sound/misc/hit.wav
   branches/nexuiz-2.0/data/sound/misc/itempickup.ogg
   branches/nexuiz-2.0/data/sound/misc/powerup.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/attackinfive.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/incoming.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/meet.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/seenflag.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death1.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death2.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death3.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/drown.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/fall1.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/falling.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/gasp.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/jump.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain25.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain50.ogg
   branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/default.sounds
   branches/nexuiz-2.0/data/sound/player/fricka/player/death1.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/death2.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/death3.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/drown.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/fall1.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/falling.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/gasp.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/jump.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/pain25.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/pain50.ogg
   branches/nexuiz-2.0/data/sound/player/fricka/player/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/insurrectionist/coms/taunt1.ogg
   branches/nexuiz-2.0/data/sound/player/insurrectionist/coms/taunt2.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death1.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death2.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death3.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/drown.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/fall1.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/falling.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/gasp.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/jump.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain25.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain50.ogg
   branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/reptilian/player/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/reptilian/player/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/soldier/coms/attackinfive.ogg
   branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt1.ogg
   branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt2.ogg
   branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt3.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/attack.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/attackinfive.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/coverme.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/defend.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/freelance1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/freelance2.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/incoming.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/meet.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/needhelp1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/seenflag.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/taunt1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/taunt2.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/taunt3.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot2.ogg
   branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot3.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/death1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/death2.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/death3.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/drown.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/fall1.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/falling.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/gasp.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/jump.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/pain25.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/pain50.ogg
   branches/nexuiz-2.0/data/sound/player/specop/player/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/torus/attack.ogg
   branches/nexuiz-2.0/data/sound/player/torus/coverme.ogg
   branches/nexuiz-2.0/data/sound/player/torus/death.ogg
   branches/nexuiz-2.0/data/sound/player/torus/drown.ogg
   branches/nexuiz-2.0/data/sound/player/torus/fall.ogg
   branches/nexuiz-2.0/data/sound/player/torus/flagseen.ogg
   branches/nexuiz-2.0/data/sound/player/torus/gasp.ogg
   branches/nexuiz-2.0/data/sound/player/torus/hooah.ogg
   branches/nexuiz-2.0/data/sound/player/torus/incoming.ogg
   branches/nexuiz-2.0/data/sound/player/torus/jump.ogg
   branches/nexuiz-2.0/data/sound/player/torus/letsgo.ogg
   branches/nexuiz-2.0/data/sound/player/torus/needhelp.ogg
   branches/nexuiz-2.0/data/sound/player/torus/pain100.ogg
   branches/nexuiz-2.0/data/sound/player/torus/pain25.ogg
   branches/nexuiz-2.0/data/sound/player/torus/pain50.ogg
   branches/nexuiz-2.0/data/sound/player/torus/pain75.ogg
   branches/nexuiz-2.0/data/sound/player/torus/taunt.ogg
   branches/nexuiz-2.0/data/sound/player/torus/teamshoot.ogg
   branches/nexuiz-2.0/data/sound/player/torus/waypoint.ogg
   branches/nexuiz-2.0/data/sound/porto/bounce.ogg
   branches/nexuiz-2.0/data/sound/porto/create.ogg
   branches/nexuiz-2.0/data/sound/porto/expire.ogg
   branches/nexuiz-2.0/data/sound/porto/explode.ogg
   branches/nexuiz-2.0/data/sound/porto/fire.ogg
   branches/nexuiz-2.0/data/sound/porto/unsupported.ogg
   branches/nexuiz-2.0/data/sound/weapons/crylink_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/electro_fly.wav
   branches/nexuiz-2.0/data/sound/weapons/electro_impact_combo.ogg
   branches/nexuiz-2.0/data/sound/weapons/hagar_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/hook_impact.ogg
   branches/nexuiz-2.0/data/sound/weapons/lasergun_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/minstanexfire.ogg
   branches/nexuiz-2.0/data/sound/weapons/nexfire.ogg
   branches/nexuiz-2.0/data/sound/weapons/neximpact.ogg
   branches/nexuiz-2.0/data/sound/weapons/rocket_det.ogg
   branches/nexuiz-2.0/data/sound/weapons/rocket_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/shotgun_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/tink1.ogg
   branches/nexuiz-2.0/data/sound/weapons/uzi_fire.ogg
   branches/nexuiz-2.0/data/sound/weapons/weapon_switch.ogg
   branches/nexuiz-2.0/data/sound/weapons/weaponpickup.ogg
   branches/nexuiz-2.0/data/textures/marine.tga
   branches/nexuiz-2.0/data/textures/marine_glow.tga
   branches/nexuiz-2.0/data/textures/marine_pants.tga
   branches/nexuiz-2.0/data/textures/marine_shirt.tga
   branches/nexuiz-2.0/data/textures/specop.tga
   branches/nexuiz-2.0/data/ultimate.cfg
   branches/nexuiz-2.0/data/ultra.cfg
   branches/nexuiz-2.0/data/weapons.cfg
   branches/nexuiz-2.0/data/weaponsPro.cfg
Log:
r4978 | div0 | 2008-11-04 12:57:51 +0100 (Tue, 04 Nov 2008) | 2 lines
update change list
r4979 | div0 | 2008-11-04 13:25:14 +0100 (Tue, 04 Nov 2008) | 2 lines
use tag_rocket_fly.wav
r4980 | div0 | 2008-11-04 13:37:10 +0100 (Tue, 04 Nov 2008) | 2 lines
support for more weapon sounds
r4981 | esteel | 2008-11-04 18:03:08 +0100 (Tue, 04 Nov 2008) | 2 lines
correct small typo in cryPlink sounds
r4982 | esteel | 2008-11-04 18:09:24 +0100 (Tue, 04 Nov 2008) | 1 line
also correct typo wav/ogg files
r4983 | div0 | 2008-11-04 20:25:46 +0100 (Tue, 04 Nov 2008) | 2 lines
fix hagar and crylink bounce
r4984 | esteel | 2008-11-04 21:05:51 +0100 (Tue, 04 Nov 2008) | 1 line
reworked Documents in the style of the nexuiz.com homepage, thanks to shaggy for the work
r4985 | div0 | 2008-11-05 08:32:47 +0100 (Wed, 05 Nov 2008) | 2 lines
sv_clones party
r4986 | div0 | 2008-11-05 10:06:23 +0100 (Wed, 05 Nov 2008) | 2 lines
g_balance_electro_combo_speed
r4987 | div0 | 2008-11-05 13:48:59 +0100 (Wed, 05 Nov 2008) | 2 lines
use tag_impact
r4988 | div0 | 2008-11-05 13:55:32 +0100 (Wed, 05 Nov 2008) | 2 lines
unbreak pro
r4989 | div0 | 2008-11-05 15:13:54 +0100 (Wed, 05 Nov 2008) | 2 lines
Updated Tenshihan sounds from the beta 4.0.0 pack
r4990 | esteel | 2008-11-05 16:44:59 +0100 (Wed, 05 Nov 2008) | 2 lines
removed old file references that are .wav now
r4991 | div0 | 2008-11-05 21:03:07 +0100 (Wed, 05 Nov 2008) | 2 lines
fixed volume levels
r4992 | div0 | 2008-11-05 21:19:42 +0100 (Wed, 05 Nov 2008) | 2 lines
clean up voice message stuff a bit
r4993 | div0 | 2008-11-05 21:26:40 +0100 (Wed, 05 Nov 2008) | 2 lines
add the new stuff to default.sounds
r4994 | div0 | 2008-11-05 21:56:53 +0100 (Wed, 05 Nov 2008) | 2 lines
added the new sounds name sto the sounds files
r4995 | lordhavoc | 2008-11-06 13:49:06 +0100 (Thu, 06 Nov 2008) | 2 lines
edgefriction should be 1 (it's a multiplier for friction)
r4996 | div0 | 2008-11-06 14:14:09 +0100 (Thu, 06 Nov 2008) | 2 lines
use armor10
r4997 | div0 | 2008-11-06 14:27:17 +0100 (Thu, 06 Nov 2008) | 2 lines
fix some announcers
r4998 | div0 | 2008-11-06 14:35:07 +0100 (Thu, 06 Nov 2008) | 2 lines
fix the sound madness once and for all: change ogg to wav everywhere
r4999 | div0 | 2008-11-06 14:41:53 +0100 (Thu, 06 Nov 2008) | 2 lines
icolor
r5000 | div0 | 2008-11-06 15:02:52 +0100 (Thu, 06 Nov 2008) | 2 lines
two more rows in settings, flashblend
r5001 | div0 | 2008-11-06 15:19:45 +0100 (Thu, 06 Nov 2008) | 2 lines
support v_flipped
r5002 | div0 | 2008-11-07 07:41:41 +0100 (Fri, 07 Nov 2008) | 2 lines
use weapons/casing.wav for casings
r5003 | div0 | 2008-11-07 17:06:58 +0100 (Fri, 07 Nov 2008) | 2 lines
allow separate cvars for voter and master commands; make voting defaults more conservative
r5004 | div0 | 2008-11-07 17:14:55 +0100 (Fri, 07 Nov 2008) | 2 lines
more vote cvars
r5005 | div0 | 2008-11-07 17:16:40 +0100 (Fri, 07 Nov 2008) | 2 lines
remove kickban, as master can be voted too
r5006 | div0 | 2008-11-07 17:18:28 +0100 (Fri, 07 Nov 2008) | 2 lines
more of this
r5007 | morphed | 2008-11-07 17:28:07 +0100 (Fri, 07 Nov 2008) | 1 line
new marine skin
r5008 | div0 | 2008-11-07 21:44:46 +0100 (Fri, 07 Nov 2008) | 2 lines
add a "flag shielded" indicator
r5009 | div0 | 2008-11-07 21:46:11 +0100 (Fri, 07 Nov 2008) | 1 line
r5010 | div0 | 2008-11-07 22:39:26 +0100 (Fri, 07 Nov 2008) | 2 lines
move the "shielded" icons to the right place
r5011 | div0 | 2008-11-07 22:40:25 +0100 (Fri, 07 Nov 2008) | 2 lines
fixtrans
r5012 | div0 | 2008-11-08 09:41:05 +0100 (Sat, 08 Nov 2008) | 2 lines
Tenshihan 4.1.0, better g_casings support. Please test, maybe make default now?
r5013 | div0 | 2008-11-08 09:42:54 +0100 (Sat, 08 Nov 2008) | 2 lines
updated compat pack
r5014 | div0 | 2008-11-08 09:44:14 +0100 (Sat, 08 Nov 2008) | 2 lines
typo fixes
r5015 | div0 | 2008-11-08 17:35:48 +0100 (Sat, 08 Nov 2008) | 2 lines
remove "NOTE: crashed before even initializing the world, not saving persistent data\n" warning on first server start
r5016 | div0 | 2008-11-08 17:39:10 +0100 (Sat, 08 Nov 2008) | 2 lines
get rid of menu_cmd spam
r5017 | div0 | 2008-11-08 17:42:15 +0100 (Sat, 08 Nov 2008) | 2 lines
redundancy...
r5018 | div0 | 2008-11-08 18:18:13 +0100 (Sat, 08 Nov 2008) | 2 lines
slightly improved specop face... maybe someone else revert this commit, and redo it the right way, if he can, this is just lame select/color balance, and retouch, editing
r5019 | div0 | 2008-11-08 21:25:46 +0100 (Sat, 08 Nov 2008) | 2 lines
target_voicescript beginnign
r5020 | div0 | 2008-11-08 22:35:10 +0100 (Sat, 08 Nov 2008) | 2 lines
support weapon arena in the toString too
r5021 | div0 | 2008-11-09 08:20:21 +0100 (Sun, 09 Nov 2008) | 2 lines
weapon arena modes "all" and "most"
r5022 | div0 | 2008-11-09 11:11:56 +0100 (Sun, 09 Nov 2008) | 2 lines
new weapon arena menu controls, enjoy! Original code by MirceaKitsune
r5023 | div0 | 2008-11-09 11:18:32 +0100 (Sun, 09 Nov 2008) | 2 lines
push low gravity up a little
r5024 | div0 | 2008-11-09 11:23:22 +0100 (Sun, 09 Nov 2008) | 2 lines
make it not depend on an uncommitted fix to fteqcc yet... yes, I know there are now 28 more warnings. Can't help it.
r5025 | div0 | 2008-11-09 19:23:29 +0100 (Sun, 09 Nov 2008) | 2 lines
menu_use_default_hostname, sethostname command to override the menu's hostname
r5026 | div0 | 2008-11-09 21:22:12 +0100 (Sun, 09 Nov 2008) | 2 lines
applied most of MirceaKitsune's menu changes
r5027 | div0 | 2008-11-09 21:24:49 +0100 (Sun, 09 Nov 2008) | 2 lines
I committed this too, I thought...
r5028 | div0 | 2008-11-09 21:25:06 +0100 (Sun, 09 Nov 2008) | 2 lines
remove debug print :P
r5029 | div0 | 2008-11-10 08:17:04 +0100 (Mon, 10 Nov 2008) | 2 lines
more menu updates
r5030 | div0 | 2008-11-10 11:56:37 +0100 (Mon, 10 Nov 2008) | 2 lines
fix precache
r5031 | div0 | 2008-11-10 12:32:55 +0100 (Mon, 10 Nov 2008) | 2 lines
prevent QC crash when a flag carrier had no flag carrier sprite, but WHY?
r5032 | div0 | 2008-11-10 13:36:45 +0100 (Mon, 10 Nov 2008) | 2 lines
ctf: block capture records when having >1 player on the server (bots are still allowed).
r5033 | div0 | 2008-11-10 15:29:41 +0100 (Mon, 10 Nov 2008) | 2 lines
handicap
r5034 | div0 | 2008-11-10 16:52:19 +0100 (Mon, 10 Nov 2008) | 3 lines
trgger_multiple: support target, target2, target3, target4
info_player_*: trigger target2, ..., target4 (can't safely trigger target, I suppose)
r5035 | div0 | 2008-11-10 16:56:27 +0100 (Mon, 10 Nov 2008) | 2 lines
target2 handling improved
r5036 | div0 | 2008-11-10 17:07:50 +0100 (Mon, 10 Nov 2008) | 2 lines
more properties for voice script
r5037 | div0 | 2008-11-10 20:22:58 +0100 (Mon, 10 Nov 2008) | 2 lines
possibly allow untested welcome message disabling again
r5038 | div0 | 2008-11-12 08:10:03 +0100 (Wed, 12 Nov 2008) | 2 lines
detect screen size using new DP feature
r5039 | div0 | 2008-11-12 13:29:03 +0100 (Wed, 12 Nov 2008) | 2 lines
oops, accidentally committed
r5040 | esteel | 2008-11-12 14:38:46 +0100 (Wed, 12 Nov 2008) | 2 lines
Ronans server info dialog
r5041 | div0 | 2008-11-12 17:54:55 +0100 (Wed, 12 Nov 2008) | 2 lines
improved server info dialog
r5042 | div0 | 2008-11-12 21:32:45 +0100 (Wed, 12 Nov 2008) | 2 lines
alpha=1 here was a bad idea
r5043 | esteel | 2008-11-12 21:34:27 +0100 (Wed, 12 Nov 2008) | 3 lines
toggle favorites is now on mouse3 and INS
show serverinfo is now on mouse2 and space
r5044 | esteel | 2008-11-12 21:35:15 +0100 (Wed, 12 Nov 2008) | 2 lines
gnah, forgot to remove the // DOUBLE CLICK comment :P
r5045 | div0 | 2008-11-12 21:39:34 +0100 (Wed, 12 Nov 2008) | 2 lines
fix the default skin writing
r5046 | esteel | 2008-11-12 22:07:57 +0100 (Wed, 12 Nov 2008) | 2 lines
added info button to the join menu, removed some trailing whitespace too
r5047 | esteel | 2008-11-12 22:11:39 +0100 (Wed, 12 Nov 2008) | 2 lines
small change to g_warmup and readynagger calling
r5048 | esteel | 2008-11-13 17:41:20 +0100 (Thu, 13 Nov 2008) | 2 lines
experimental timedemo button for the demos menu
r5049 | esteel | 2008-11-13 19:46:36 +0100 (Thu, 13 Nov 2008) | 2 lines
fix stupid mistake and swap play/timedemo buttons
r5050 | esteel | 2008-11-14 15:31:53 +0100 (Fri, 14 Nov 2008) | 2 lines
experimental support for q3's music field in the worldspawn
r5051 | esteel | 2008-11-14 15:36:34 +0100 (Fri, 14 Nov 2008) | 2 lines
experimental support for q3's music field in the worldspawn, should not forget this file..
r5052 | div0 | 2008-11-15 22:52:25 +0100 (Sat, 15 Nov 2008) | 3 lines
fix memory leak in demo list
fix player list color handling (was there without need), someone please test this
r5053 | div0 | 2008-11-16 07:41:30 +0100 (Sun, 16 Nov 2008) | 2 lines
fix align
r5054 | div0 | 2008-11-16 07:53:09 +0100 (Sun, 16 Nov 2008) | 2 lines
fix TDM
r5055 | div0 | 2008-11-16 08:11:35 +0100 (Sun, 16 Nov 2008) | 2 lines
possibly fix hurttrigger message2, someone try it
r5056 | div0 | 2008-11-18 09:02:50 +0100 (Tue, 18 Nov 2008) | 2 lines
Contributed trigger_heal patch.
r5057 | esteel | 2008-11-18 16:12:22 +0100 (Tue, 18 Nov 2008) | 1 line
wonder if those make phonies help anyone?!?
r5058 | div0 | 2008-11-19 13:50:36 +0100 (Wed, 19 Nov 2008) | 2 lines
mask spectatee effects with EFMASK_CHEAP; add a loddebug cvar (1 = force lod 0, 2 = force lod 1, 3 = force lod 2)
r5059 | div0 | 2008-11-19 14:05:29 +0100 (Wed, 19 Nov 2008) | 2 lines
MirceaKitsune's next changes
r5060 | div0 | 2008-11-19 15:35:07 +0100 (Wed, 19 Nov 2008) | 2 lines
make weaponarena laser a checkbox (dirty hack)
r5061 | savagex | 2008-11-19 19:08:25 +0100 (Wed, 19 Nov 2008) | 5 lines
Promote morfar to project (co-)maintainership.
Congratulations!
r5062 | div0 | 2008-11-19 19:53:43 +0100 (Wed, 19 Nov 2008) | 2 lines
make the div0 scoring conform to the poll
r5063 | div0 | 2008-11-19 20:22:46 +0100 (Wed, 19 Nov 2008) | 2 lines
fix impulse 99 not giving unlimited portals
r5064 | div0 | 2008-11-20 15:18:30 +0100 (Thu, 20 Nov 2008) | 2 lines
hidden cvar: car-like physics mode; misc_gamemodel: extra spawnflags; properly support scale on SOLID_BSP misc_gamemodels by adjusting mins/maxs
r5065 | esteel | 2008-11-20 23:08:32 +0100 (Thu, 20 Nov 2008) | 1 line
added grappling hook, port-o-launch, minstanex, hlac and tag seeker to basics. changed basics.html so that after updating the .aft file you can copy the html part over to basics.html almost 1-by-1
r5066 | div0 | 2008-11-21 07:36:09 +0100 (Fri, 21 Nov 2008) | 2 lines
stronger alignment
r5067 | esteel | 2008-11-21 10:52:15 +0100 (Fri, 21 Nov 2008) | 2 lines
added ONS, AS and RACE to basics documentation
r5068 | div0 | 2008-11-21 11:27:33 +0100 (Fri, 21 Nov 2008) | 2 lines
force chase cam in "big rigs" mode
r5069 | div0 | 2008-11-21 13:46:52 +0100 (Fri, 21 Nov 2008) | 2 lines
improve big rigs mode
r5070 | div0 | 2008-11-21 13:50:00 +0100 (Fri, 21 Nov 2008) | 2 lines
rename cvar from g_bigrigs to g_bugrigs ;)
r5071 | div0 | 2008-11-21 14:57:34 +0100 (Fri, 21 Nov 2008) | 2 lines
more bug rigs improvements
r5072 | m0rfar | 2008-11-21 17:40:52 +0100 (Fri, 21 Nov 2008) | 2 lines
New portal models by ai!
I helped with .skin and .shader files. And changed the qc code to use the correct skins.
r5073 | div0 | 2008-11-22 09:02:55 +0100 (Sat, 22 Nov 2008) | 2 lines
new toys: g_bugrigs 2 for a more realistic mode (no steering in air); align the race car to the velocity when in air (looks cool, no gameplay change)
r5074 | div0 | 2008-11-22 09:03:41 +0100 (Sat, 22 Nov 2008) | 2 lines
less buggy :P
r5075 | div0 | 2008-11-22 09:26:41 +0100 (Sat, 22 Nov 2008) | 2 lines
explicitly precache the forced model
r5076 | div0 | 2008-11-22 09:43:08 +0100 (Sat, 22 Nov 2008) | 2 lines
race-qualifying -> race better
r5077 | div0 | 2008-11-22 09:48:26 +0100 (Sat, 22 Nov 2008) | 2 lines
portals in the compat pack
r5078 | div0 | 2008-11-22 09:50:00 +0100 (Sat, 22 Nov 2008) | 2 lines
ctfscoring-div0: move one penalty point from return to drop; one extra point for retaking the flag to compensate
r5079 | div0 | 2008-11-22 09:57:31 +0100 (Sat, 22 Nov 2008) | 2 lines
fix timelimit -1 again
r5080 | div0 | 2008-11-22 20:10:31 +0100 (Sat, 22 Nov 2008) | 2 lines
prevent too high accel/turn rates
r5081 | div0 | 2008-11-22 20:45:54 +0100 (Sat, 22 Nov 2008) | 2 lines
g_bugrigs another speedhack fix
r5082 | esteel | 2008-11-23 01:51:43 +0100 (Sun, 23 Nov 2008) | 3 lines
added hlac and seeker textures to build-compat-pack.sh
i guess someone forget them, or are they intented as a surprise? then please revert this commit
r5083 | div0 | 2008-11-23 12:15:25 +0100 (Sun, 23 Nov 2008) | 2 lines
hopefully no change to race car physics, but now parametrized. Five Big Rigs bugs are now controlled by cvars and can be turned off to get "more real" race car physics!
r5084 | div0 | 2008-11-23 12:29:46 +0100 (Sun, 23 Nov 2008) | 2 lines
g_bugrigs_planar_movement_car_jumping - a new bug is now on/off too
r5085 | div0 | 2008-11-23 20:50:16 +0100 (Sun, 23 Nov 2008) | 2 lines
new mutator: g_touchexplode (spawn explosion where two players touch). Ideal with g_bugrigs.
r5086 | div0 | 2008-11-23 21:13:34 +0100 (Sun, 23 Nov 2008) | 2 lines
touchexplode: fix for noclip
r5087 | div0 | 2008-11-23 21:30:41 +0100 (Sun, 23 Nov 2008) | 2 lines
yet another fix attempt for touchexplode
r5088 | div0 | 2008-11-23 21:32:38 +0100 (Sun, 23 Nov 2008) | 2 lines
disable planar jump when touchexplode
r5089 | m0rfar | 2008-11-24 19:54:32 +0100 (Mon, 24 Nov 2008) | 3 lines
Portal model source.
Added Nexuiz logo on portals. Requires gl_picmip 2 or better to see it (that's expected).
Minor vortex shader update.
r5090 | div0 | 2008-11-25 07:23:44 +0100 (Tue, 25 Nov 2008) | 2 lines
hopefully fix campcheck
r5091 | div0 | 2008-11-25 09:07:15 +0100 (Tue, 25 Nov 2008) | 2 lines
align the car better to the surface
r5092 | div0 | 2008-11-25 09:19:14 +0100 (Tue, 25 Nov 2008) | 2 lines
fix air friction
r5093 | div0 | 2008-11-25 09:21:01 +0100 (Tue, 25 Nov 2008) | 2 lines
enable a tiny amount of air friction (sorry, FruitieX)
r5094 | div0 | 2008-11-25 10:11:00 +0100 (Tue, 25 Nov 2008) | 3 lines
    // whatever happens, allow 60 seconds of idling directly after connect for map loading
r5095 | esteel | 2008-11-25 15:13:37 +0100 (Tue, 25 Nov 2008) | 2 lines
for now rather use g_start_delay 15 instead of g_warmup 1 for dedicated servers, people seem to like it more
r5096 | esteel | 2008-11-25 15:15:18 +0100 (Tue, 25 Nov 2008) | 2 lines
add hook sounds to build-compatpack, the hook bomb ones are still missing though
r5097 | div0 | 2008-11-25 18:33:43 +0100 (Tue, 25 Nov 2008) | 3 lines
comments in cl_physics.qc
handicap: apply handicap both to dealt and to received damage, but only square rooted. So a player with handicap 4 deals 0.5x damage, and receives 2x, making him 4x weaker in comparison.
r5098 | div0 | 2008-11-25 21:54:07 +0100 (Tue, 25 Nov 2008) | 2 lines
fix bug in func_breakable, that breaks assault
r5099 | div0 | 2008-11-26 09:28:42 +0100 (Wed, 26 Nov 2008) | 2 lines
assault sprites
r5100 | div0 | 2008-11-26 09:29:31 +0100 (Wed, 26 Nov 2008) | 2 lines
assault: fix lots of bugs, initial waypointsprites support
r5101 | div0 | 2008-11-26 09:52:48 +0100 (Wed, 26 Nov 2008) | 2 lines
assault: (untested) make breakables show a radar wave when attacked
r5102 | div0 | 2008-11-26 10:20:21 +0100 (Wed, 26 Nov 2008) | 2 lines
alternate way to project waypoint sprites that are out of the screen
r5103 | div0 | 2008-11-26 10:37:02 +0100 (Wed, 26 Nov 2008) | 2 lines
allow 32 concurrent radar pings
r5104 | div0 | 2008-11-26 10:39:57 +0100 (Wed, 26 Nov 2008) | 2 lines
assault
r5105 | div0 | 2008-11-26 10:41:10 +0100 (Wed, 26 Nov 2008) | 2 lines
vid_pixelheight now is a float
r5106 | div0 | 2008-11-26 10:42:13 +0100 (Wed, 26 Nov 2008) | 2 lines
weapon stay mutator
r5107 | div0 | 2008-11-26 11:20:42 +0100 (Wed, 26 Nov 2008) | 2 lines
more assault fixes (timelimit)
r5108 | div0 | 2008-11-26 11:24:50 +0100 (Wed, 26 Nov 2008) | 2 lines
assault changes to entities.def
r5109 | div0 | 2008-11-26 20:23:12 +0100 (Wed, 26 Nov 2008) | 2 lines
fix obvious bug in race player soritng. hopefully this fixes the pole positions.
r5110 | div0 | 2008-11-26 21:27:53 +0100 (Wed, 26 Nov 2008) | 2 lines
players still in the wrong order? add a debug print
r5111 | div0 | 2008-11-26 21:44:45 +0100 (Wed, 26 Nov 2008) | 2 lines
more debug (will remove it later)
r5112 | div0 | 2008-11-26 21:46:31 +0100 (Wed, 26 Nov 2008) | 2 lines
sorry, this way is better
r5113 | div0 | 2008-11-27 09:06:32 +0100 (Thu, 27 Nov 2008) | 4 lines
breakable: add support for causing damage, and playing a sound
seeker: allow following func_breakable
assault: fixes
r5114 | div0 | 2008-11-27 09:10:04 +0100 (Thu, 27 Nov 2008) | 3 lines
add the ACBC Assault Circuit Board Creator
a script that makes an assault map template given objective counts
r5115 | div0 | 2008-11-27 09:10:44 +0100 (Thu, 27 Nov 2008) | 2 lines
we have space for thicker walls
r5116 | div0 | 2008-11-27 09:14:57 +0100 (Thu, 27 Nov 2008) | 2 lines
fix offset handling
r5117 | div0 | 2008-11-27 11:58:21 +0100 (Thu, 27 Nov 2008) | 2 lines
bsp tool
r5118 | div0 | 2008-11-27 14:03:22 +0100 (Thu, 27 Nov 2008) | 2 lines
Tenshihan v4.2.0; SPecop is female again
r5119 | div0 | 2008-11-27 14:04:22 +0100 (Thu, 27 Nov 2008) | 2 lines
oops, bug in specop.zym.sounds
r5120 | div0 | 2008-11-27 14:15:59 +0100 (Thu, 27 Nov 2008) | 2 lines
mapinfo: don't write a "cdtrack" if the map has music set in worldspawn
r5121 | div0 | 2008-11-27 14:28:52 +0100 (Thu, 27 Nov 2008) | 2 lines
changes

Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/.patchsets	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-4976
+revisions_applied = 1-5121

Deleted: branches/nexuiz-2.0/Docs/FAQ.aft
===================================================================
--- branches/nexuiz-2.0/Docs/FAQ.aft	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/FAQ.aft	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,161 +0,0 @@
-#--- AFT (Almost Free Text) source file for Nexuiz FAQ
-#--- WARNING: ALWAYS RUN AFT TWICE! (otherwise the toc is missing/not up to date)
-#--- use AFT v5.096 or later (http://www.maplefish.com/todd/aft.html)
-
-#---SET nexversion=3
-#---SET zipname=nexuiz-<version>.zip
-
-*Title: Nexuiz %nexversion% FAQ
-			http://nexuiz.com	http://alientrap.org
-
-------
-
-*TOC
-
-------
-
-* Troubleshooting
-
-** How do I install Nexuiz?
-Just unzip the |%zipname%| file.  You can do this with any archive program (like [7zip (http://7zip.org)]).  It's very important to keep the directory structure while unpacking (in WinZip this option is called "Use folder names").  The directory structure should look like this afterwards:
-^<<
-Nexuiz/
-|-- Docs/
-|   |-- *
-|   `-- server/
-|       `-- *
-|-- data/
-|   |-- common-spog.pk3
-|   `-- data*.pk3
-|-- pro/
-|   `-- data*.pk3
-|-- Nexuiz.app/
-|   `-- *
-|-- Nexuiz-SDL.app/
-|   `-- *
-|-- sources/
-|   `-- *
-|-- *.exe
-|-- *.dll
-`-- nexuiz-linux-*
-^>>
-
-** When I start Nexuiz all I see is a black screen or a black screen with some checkered squares
-This happens when the engine can't load the data*.pk3 file or has trouble to initialize OpenGL.  The reasons could be:
-	1. you unpacked the zip file without folder names (see [How do I install Nexuiz?])
-	2. on Linux: the current directory is not your Nexuiz/ folder.  See [How can I place a shortcut to Nexuiz on my Linux desktop?] on how to fix this
-	3. 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
-	4. the engine could not initialize OpenGL.  Please install the latest drivers for your graphic card.  You will probably find one for your card there: [intel (http://intel.com)] [ati (http://ati.com)] [nvidia (http://nvidia.com)]
-	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.
-
-** 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.
-
-** 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).
-
-** Mouse is too slow and sensitivity is at top (on Mac / Linux)
-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 |Turn off OS mouse acceleration| in the |Settings / Input| menu.  Or the same via console: |apple__mouse__noaccel 0; vid__restart| ([How do I open the console?])
-Linux: A similar problem can arise on Linux.  Its also |Turn off OS mouse acceleration| in the |Settings / Input| menu but the console command is different: |vid__dga 0; vid__restart| ([How do I open the console?])
-
-** I can't switch to 32 bit color depth (on Windows)
-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.
-
-** When I join a server or after a map change I see nothing but a black screen, but I can still move and shoot
-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 [wiki page (http://alientrap.org/wiki/pmwiki.php?n=Main.CustomMaps)] 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 "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?])
-
-On Mac: IS THERE A 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|
-
-On Windows: Click Start->Run, and enter drwtsn32, click Ok in the next window, run Nexuiz and wait for the crash.  Then go to |C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson| there should be a file called "drwtsn32.log", give that file along with the engine's build date to the developers.  You'll see that date when you open the ingame console ([How do I open the console?]).  Note that some folders of that path may be hidden or have a translated name if you're using a non-english windows.
-
-** Where can i get more help?
-Visit [the official Nexuiz forum (http://alientrap.org/forum)] there is a [support and bug report area (http://alientrap.org/forum/viewforum.php?f=3)].  Or get on [IRC (http://en.wikipedia.org/wiki/Internet__Relay__Chat)] 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)
-
-* General questions
-
-** 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.
-
-** 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.
-
-** How do I open the console?
-Press |\[shift]+\[escape]|.  To close it press |\[escape]|.  While playing ` or ^ will also open the console.
-
-** 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.
-
-	!                            !
-	! code   ! color             !
-	!----------------------------!
-	! ^0     ! black             !
-	!----------------------------!
-	! ^1     ! red               !
-	!----------------------------!
-	! ^2     ! green             !
-	!----------------------------!
-	! ^3     ! yellow            !
-	!----------------------------!
-	! ^4     ! blue              !
-	!----------------------------!
-	! ^5     ! aqua              !
-	!----------------------------!
-	! ^6     ! pink              !
-	!----------------------------!
-	! ^7     ! white             !
-	!----------------------------!
-	! ^8     ! light grey        !
-	!----------------------------!
-	! ^9     ! 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).
-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)]
-
-* Server setup
-
-** How do I start a server?
-Use the |Multiplayer / Create| menu to start a |listen server|.  You will always have to play yourself in a |listen server|.
-If you want to create a server without being forced to play yourself please take a look at the file |readme.txt| in the |Docs/server/| directory where the |dedicated server| is explained.
-
-** Which ports do I have to open in firewall/forward from my router to run a server?
-The default port is 26000 UDP.  You can change that in the |Multiplayer / Create| menu or by starting Nexuiz with the parameter |-port <port>| or having a line |port <port>| 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 |nexuiz.exe| or |nexuiz-dedicated.exe| and right click on it.  Select properties and |-port <port>| in the "Target:" line.  Be sure that the "Start in:" line contains the full path to your Nexuiz folder and click "OK".  The parameter will be used if you start Nexuiz via that new shortcut.
-
-** Is there some kind of rcon?
-Yes starting with Nexuiz 2.0 there is rcon (QuakeWorld compatible).  To use it you must enter |rcon__password <password>| 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 |rcon <command>| if you are connected to the server or will have to set |rcon__address <ip/hostname>| or |rcon__address <ip/hostname>:<port>| to point to the server.  There are also external rcon tools but make sure you use a QW compatible rcon tool.
-
-** How can i kick people who are using special characters in their names?
-Enter |status| 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 |kick # <player id> <reason>| (notice the space after #).
-
-* Development
-
-** How do i set up gtkradiant to create/edit Nexuiz maps?
-There's a [guide (http://www.alientrap.org/forum/viewtopic.php?t=10)] on gtkradiant setup in the forums.
-There are also [Windows tool (http://www.alientrap.org/forum/viewtopic.php?p=33)] that will help you to setup gtkradiant 1.4 and a [Linux script (http://www.alientrap.org/forum/viewtopic.php?p=841)] to configure gtkradiant 1.5.
-
-** Where can i get latest development versions of the source code?
-_Engine:_ instructions are available at http://icculus.org/twilight/darkplaces/download.html look for |Accessing the SVN server| (you will need a [svn client (http://subversion.tigris.org/project_packages.html)], beta builds are available [here (http://icculus.org/twilight/darkplaces/files/)])
-
-_Game data:_ to check out the Nexuiz svn, you'll need a [svn client (http://subversion.tigris.org/project_packages.html)].  To check out the repository with a command line svn client, do
-^<<
-svn co svn://svn.icculus.org/nexuiz/trunk/
-^>>
-To compile the game code you need [fteqcc (http://sourceforge.net/project/showfiles.php?group\_id=116842&package\_id=129507)].  Just download it and run it twice, once in |data/qcsrc/menu| and once in |data/qcsrc/server|.

Deleted: branches/nexuiz-2.0/Docs/FAQ.html
===================================================================
--- branches/nexuiz-2.0/Docs/FAQ.html	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/FAQ.html	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,363 +0,0 @@
-<!--  AFT (Almost Free Text) source file for Nexuiz FAQ -->
-<!--  WARNING: ALWAYS RUN AFT TWICE! (otherwise the toc is missing/not up to date) -->
-<!--  use AFT v5.096 or later (http://www.maplefish.com/todd/aft.html) -->
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<title>Nexuiz 3 FAQ</title>
-	<meta name="author" content="">
-	<meta name="GENERATOR" content = "Almost Free Text v5.096; Copyright 1996-2005 Todd Coram. All rights reserved.">
-<style type="text/css">
-  <!--
-html { background: #eee; color: #000; }
-
-body { background: #eee; color: #000; margin: 0; padding: 0;}
-
-div.body {
-	background: #fff; color: #000;
-	margin: 0 1em 0 1em; padding: 1em;
-	font-family: serif;
-	font-size: 1em; line-height: 1.2em;
-	border-width: 0 1px 0 1px;
-	border-style: solid;
-	border-color: #aaa;
-}
-
-div.block {
-	background: #F8F8FF; color: #000;
-	margin: 1em; padding: 0 1em 0 1em;
-	border-width: 1px;
-	border-style: solid;
-	border-color: #909090;
-}
-
-table {
-	background: #F8F8F8; color: #000;
-	margin: 1em;
-	border-width: 0 0 0 1px;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-td {
-	border-width: 0 1px 1px 0;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-th {
-	background: #F8F8FF;
-	border-width: 1px 1px 2px 0;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-
-/* body text, headings, and rules */
-
-p { margin: 0; text-indent: 0em; margin: 0 0 0.5em 0 }
-
-h1, h2, h3, h4, h5, h6 {
-	color: #206020; background: transparent;
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-weight: normal;
-}
-
-h1 { font-size: 1.69em; margin: 1.4em 0 0.4em 0; }
-h2 { font-size: 1.44em; margin: 1.4em 0 0.4em 0; }
-h3 { font-size: 1.21em; margin: 1.4em 0 0.4em 0; }
-h4 { font-size: 1.00em; margin: 1.4em 0 0.4em 0; }
-h5 { font-size: 0.81em; margin: 1.4em 0 0.4em 0; }
-h6 { font-size: 0.64em; margin: 1.4em 0 0.4em 0; }
-
-hr {
-	color: transparent; background: transparent;
-	height: 0px; margin: 0.6em 0;
-	border-width: 1px ;
-	border-style: solid;
-	border-color: #999;
-}
-
-/* bulleted lists and definition lists */
-
-ul { margin: 0 1em 0.6em 2em; padding: 0; }
-li { margin: 0.4em 0 0 0; }
-
-dl { margin: 0.6em 1em 0.6em 2em; }
-dt { color: #206020; }
-
-tt { color: #602020; }
-
-/* links */
-
-a.link {
-	color: #33c; background: transparent;
-	text-decoration: none;
-}
-
-a:hover {
-	color: #000; background: transparent;
-}
-
-body > a {
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-size: 0.81em;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	color: #206020; background: transparent;
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-weight: normal;
-}
-
-  -->
-</style>
-</head>
-<body>
-<div class="body">
-
-<br><center><h1><a name="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">Troubleshooting</a></h2>
-<!-- Start SectLevel2 -->
-<h3><a name="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/
-|   `-- data*.pk3
-|-- Nexuiz.app/
-|   `-- *
-|-- Nexuiz-SDL.app/
-|   `-- *
-|-- sources/
-|   `-- *
-|-- *.exe
-|-- *.dll
-`-- nexuiz-linux-*
-</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">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">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?">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">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)">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)">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">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">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?">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">General questions</a></h2>
-<!-- Start SectLevel2 -->
-<h3><a name="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?">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?">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?">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?">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?">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">Server setup</a></h2>
-<!-- Start SectLevel2 -->
-<h3><a name="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?">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?">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?">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">Development</a></h2>
-<!-- Start SectLevel2 -->
-<h3><a name="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?">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-->
-<!-- End SectLevel2 -->
-<!--End Section 1-->
-<!-- End SectLevel1 -->
-<hr>
-<br>
-<p align="right"> <small>This document was generated using <a class="link" href="http://www.maplefish.com/todd/aft.html">AFT v5.096</a></small> </p>
-</body>
-</html>
-

Deleted: branches/nexuiz-2.0/Docs/Readme.htm
===================================================================
--- branches/nexuiz-2.0/Docs/Readme.htm	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/Readme.htm	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,195 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-
-<html>
-	<head>
-		<title>Nexuiz - Readme</title>
-		<style type="text/css">BODY  {
-	CURSOR: default; FONT-FAMILY: inherit
-}
-BODY {
-	PADDING-RIGHT: 1em; PADDING-LEFT: 1em; FONT-SIZE: 0.8em; PADDING-BOTTOM: 1em; MARGIN: 0em; COLOR: white; PADDING-TOP: 1em; FONT-FAMILY: Verdana,sans-serif; BACKGROUND-COLOR: black
-}
-A {
-	CURSOR: auto; COLOR: darkorange; TEXT-DECORATION: none
-}
-A:hover {
-	COLOR: orange; BACKGROUND-COLOR: black
-}
-DIV#links {
-	PADDING-RIGHT: 0em; BORDER-TOP: gray 0.2em solid; PADDING-LEFT: 0em; FLOAT: left; PADDING-BOTTOM: 0em; MARGIN: 0em; WIDTH: 10em; COLOR: gray; PADDING-TOP: 0em; BORDER-BOTTOM: gray 0.2em solid; BACKGROUND-COLOR: darkred; FONT-VARIANT: small-caps
-}
-DIV#links A {
-	PADDING-RIGHT: 0.5em; DISPLAY: block; PADDING-LEFT: 0.5em; PADDING-BOTTOM: 0.5em; MARGIN: 0em; WIDTH: 100%; PADDING-TOP: 0.5em
-}
-SPAN.linktext {
-	PADDING-RIGHT: 0.5em; MARGIN-TOP: -0.5em; PADDING-LEFT: 0.5em; LEFT: 1em; VISIBILITY: hidden; PADDING-BOTTOM: 0.5em; WIDTH: 9em; CURSOR: default; PADDING-TOP: 0.5em; FONT-STYLE: italic; POSITION: absolute; TEXT-ALIGN: left; FONT-VARIANT: normal
-}
-DIV#links A:hover SPAN.linktext {
-	TOP: 11em
-}
-A:hover SPAN.linktext {
-	VISIBILITY: visible
-}
-DIV#title {
-	FONT-WEIGHT: bold; FONT-SIZE: 2em; MARGIN-BOTTOM: 0.5em; COLOR: #ef7b14; FONT-FAMILY: serif; TEXT-ALIGN: center; FONT-VARIANT: small-caps
-}
-DIV#title DIV {
-	FONT-SIZE: 50%; COLOR: #efa752
-}
-DIV#main {
-	MARGIN-LEFT: 12em; PADDING-TOP: 1em; TEXT-ALIGN: justify
-}
-DIV#main DIV {
-	MARGIN: 0em 0em 1.5em
-}
-DIV.quote {
-	MARGIN: 1em 5%
-}
-H1 {
-	FONT-WEIGHT: bolder; FONT-SIZE: 1.5em; MARGIN: 0.1em 0em 0.3em; COLOR: #ef7b14; BORDER-BOTTOM: gray 0.1em solid; FONT-FAMILY: serif; FONT-VARIANT: small-caps
-}
-H2 {
-	FONT-WEIGHT: bolder; FONT-SIZE: 1.5em; MARGIN: 0.1em 0em 0.3em; COLOR: #ef7b14; BORDER-BOTTOM: gray 0.1em solid; FONT-FAMILY: serif; FONT-VARIANT: small-caps
-}
-H3 {
-	FONT-WEIGHT: bolder; FONT-SIZE: 1.5em; MARGIN: 0.1em 0em 0.3em; COLOR: #ef7b14; BORDER-BOTTOM: gray 0.1em solid; FONT-FAMILY: serif; FONT-VARIANT: small-caps
-}
-H4 {
-	FONT-WEIGHT: bolder; FONT-SIZE: 1.5em; MARGIN: 0.1em 0em 0.3em; COLOR: #ef7b14; BORDER-BOTTOM: gray 0.1em solid; FONT-FAMILY: serif; FONT-VARIANT: small-caps
-}
-DIV#footer {
-	FONT-SIZE: 0.75em; COLOR: #607339; PADDING-TOP: 2em; TEXT-ALIGN: right
-}
-DIV#footer DIV {
-	FLOAT: left
-}
-DIV#footer DIV A {
-	TEXT-ALIGN: left
-}
-</style>
-		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-	</head>
-
-	<body>
-		<div id="links">
-			<a href="#intro"><span class="linktext">Introduction to Nexuiz </span>Introduction </a><a href="#system"><span class="linktext">System requirements and tweaking </span>Tweaking </a><a href="#controls"><span class="linktext">Basic controls and movement techniques </span>Controls </a><a href="#license"><span class="linktext">Nexuiz license and terms of use </span>license </a></div>
-		<div id="title">
-			<a href="#launch">Nexuiz</a>
-			<div>
-				Version 3</div>
-		</div>
-		<div id="main">
-			<br>
-			<br>
-			<h1 id="intro">Introduction</h1>
-			<div>
-				<p>Nexuiz is a 3d deathmatch game based on the <a href="http://www.idsoftware.com/"><span class="linktext">The Quake1 engine was the first 3D game engine to feature fully a textured 3D environment. Originally developped by iDsoftware, it has since been released into the open source community.</span>Quake1</a> engine. It is a 3d deathmatch game made entirely over the internet. The purpose of the game is to bring deathmatch back to the basics, with perfect weapon balancing and fast paced action, keeping itself away from the current trend of realistic shooters. It uses HFX textures by <a href="http://evillair.net/"><span class="linktext">EvilLair is a talented texture designer made famous by his Quake3 textures</span>Evil Lair</a>, and has many maps to frag in.</p>
-				<p>With an advanced UI the user can select between over a dozen different player models with an average of two skins for each and can connect to our master server to play people from all over the world. The game's content and source are released under the <a href="http://www.gnu.org/"><span class="linktext">The GNU General Public License (GPL) is one of the most common open-source licenses and was the license id Software chose to release the Quake1 engine under </span>GPL</a>, meaning it is entirely free and any of it can be used in other free projects, even if modified. This is a first for any large game project of its type. We hope this will support the free game community and encourage more GPL projects.</p>
-				<p>If you would like to support the project please see its website for donating: <a href="http://www.nexuiz.com/"><span class="linktext">www.Nexuiz.com is the official Nexuiz website</span>http://www.nexuiz.com</a></p>
-			</div>
-			<h1 id="system">Sytem requirements and tweaking</h1>
-			<div>
-				<p>200mb of hard drive space</p>
-				<p><b>High Quality:</b></p>
-				<ul>
-					<li>
-						<p><i>Features:</i><br>
-						</p>
-						<ul>
-							<li>Realtime lights and shadows
-							<li>Bloom
-							<li>high detailed maps
-							<li>1024x768 or higher resolution
-						</ul>
-						<li>
-						<p><i>Requirements:</i><br>
-						</p>
-						<ul>
-							<li>1.5 or higher Intel pentium4 or AMD 1500
-							<li>ATI 9600 or nVidia 5700fx video cards
-							<li>256 or more MB of ram
-						</ul>
-					</li>
-				</ul>
-				<p><b>Low Quality:</b></p>
-				<ul>
-					<li>
-					<p><i>Features:</i></p>
-					<ul>
-						<li>No realtime lights
-						<li>No bloom
-						<li>low detailed maps
-						<li>800x600 or lower resolution
-					</ul>
-					<br>
-					<li><i>Requirements:</i>
-					<ul>
-						<li>800mhz processor
-						<li>GeForce level video card
-						<li>256 MB of ram
-					</ul>
-					</LI>
-				</ul>
-			</div>
-			<h1 id="controls">Controls</h1>
-			<div>
-				<p>Here are the basic default controls for Nexuiz, although all of these can easily be changed at any time from the in-game menu system.</p>
-				<p><b>Default controls:</b></p>
-				<ul>
-					<li>
-						<p><i>General:</i></p>
-						<ul>
-							<li>Talk: <b>T</b>
-							<li>TeamTalk: <b>Y</b>
-							<li>Show scoreboard: <b>TAB</b>
-							<li>Throw weapon: <b>Backspace</b>
-							<li>Show welcome message: <b>I</b>
-							<li>Vote yes: <b>F1</b>
-							<li>Vote no: <b>F2</b>
-							<li>Spectate: <b>F3</b>
-							<li>Ready: <b>F4</b>
-							<li>Team select menu: <b>F5</b>
-						</ul>
-					</li>
-					<li>
-						<p><i>Movement:</i></p>
-						<ul>
-							<li>Forward: <b>W</b>
-							<li>Backward: <b>S</b>
-							<li>Left: <b>A</b>
-							<li>Right: <b>D</b>
-							<li>Fire: <b>Left-click</b> <i>or </i><b>Control</b>
-							<li>Alt fire: <b>Right-click</b> <i>or </i><b>Alternate</b>
-							<li>Crouch: <b>Shift</b>
-							<li>Jump: <b>Space</b>
-						</ul>
-					</li>
-					<li>
-						<p><i>Weapons:</i></p>
-						<ul>
-							<li>Laser: <b>1</b>
-							<li>Shotgun: <b>2</b>
-							<li>Machine gun: <b>3</b>
-							<li>Grenades: <b>4</b>
-							<li>Electro: <b>5</b>
-							<li>Crylink: <b>6</b>
-							<li>NexGun: <b>7</b>
-							<li>Hagar: <b>8</b>
-							<li>Rockets: <b>9</b>
-						</ul>
-					</li>
-				</ul>
-			</div>
-			<h1 id="license">license</h1>
-			<div>
-				<p>COPYRIGHT 2005-2006, Nexuiz Team</p>
-				<p>This file is part of Nexuiz. Nexuiz is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Nexuiz is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Nexuiz; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>
-				<p><a href="http://www.gnu.org/copyleft/gpl.html">Link to the Gnu GPL</a></p>
-			</div>
-		</div>
-
-			
-			<!-- 2004 Joshua Seigler. If you use this please put my name on the bottom somewhere. --><!-- code modified by innovati for the purposes of Nexuiz readme file -->
-	</body>
-
-</html>

Deleted: branches/nexuiz-2.0/Docs/basics.aft
===================================================================
--- branches/nexuiz-2.0/Docs/basics.aft	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/basics.aft	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,134 +0,0 @@
-#--- AFT (Almost Free Text) source file for Nexuiz Basics Guide
-#--- WARNING: ALWAYS RUN AFT TWICE! (otherwise the toc is missing/not up to date)
-#--- use AFT v5.096 or later (http://www.maplefish.com/todd/aft.html)
-
-*Title: Nexuiz Basics explained
-			http://nexuiz.com	http://alientrap.org
-
-------
-
-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.
-
-*_Getting Comfortable_
-
-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.
-
-
-**''Reducing Clutter''
-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 ''music'' in the ''settings/misc'' menu to ''off'').  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.
-
-Similarly, eye-candy can make the game very appealing to look at, but can also act to obscure in-game events - the flares and smoke caused by rockets, for example, can make spotting your target much more difficult in the heat of battle.  Eye-candy also incurs performance hits on slower machines, which can make playing difficult.  Bloom might be nice to look at, but it is often just distracting when playing.  So again, many players disable some of the visual effects, so as to make the game easier to play in this regard (things to turn off include ''Bloom'', ''HDR'', ''Gloss'', ''Coronas'' and all the Realtime stuff in the ''settings/effects'' menu).  Although it may seem as if removing visual (and audio) effects will make the game less immersive by reducing the mood which the game designers were aiming for, in the long run it will make it much more rewarding and fun to play.  Darkness and shadows can create creepiness and realism, but you simply don't notice these things in a fast-paced multi player battle.  On the contrary, they make it harder to spot opponents or items and end up being frustrating.  Better to play the game in campaign mode with full visual effects to see how pretty it can be, and then, once you're over the initial craving for eye-candy, start tuning the game to be more functional in multi player.
-
-In this regard, one of the first things to adjust is the brightness and contrast (in the ''settings/video'' 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 ''multiplayer/player setup'' menu.
-
-
-**''Controlling Your Character''
-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.
-
-In terms of weapon controls, try to get out of the habit of using the mouse's scroll-wheel to select which weapon to use.  This is a very slow and unreliable way of changing weapons, and in a fast-paced deathmatch your ability to correctly and immediately pick the most appropriate gun for the job is critical.  For example, if you hit someone pretty hard with the rocket launcher, and he has taken a lot of damage, you should switch to the shotgun or machine gun to finish him off, rather than worrying about whether you'll be able to hit him again with the slower and more inaccurate rockets.  Using the mouse wheel to switch may well take too long, and you also have to keep an eye on the weapons as they scroll by (unless your mouse has very good scroll feedback, ''and'' you've memorized the order of weapons, ''and'' you know which weapons you currently have, ''and'' you can figure out on the fly how many scrolls you need to get to the shotgun!).  On the other hand, if you have configured, say, the G key to switch to the shotgun, you can easily switch quickly and reliably, and finish him off in an instant.  For this reason, it's extremely helpful to configure weapon-selection keys around the ones you use for moving.  It's also obviously handy to use a similar layout in all the games you play.  For example, you can have G as the key for 'all shotgun like weapons' in each game.  All 'rocket like' weapons can go on R, and all 'sniper guns' on T, and so on - or whatever suits you!  This way you do not need to think about which key you need for which gun - just what you want to do.  You can change those ''key bindings'' in the ''settings/input'' menu.
-
-Finally, adjust your mouse sensitivity.  Sensitivity controls how much (or fast) your view turns when moving the mouse.  You can make it high sensitivity, which means you need to move the mouse only a short distance to turn fast or far; or you can make it low sensitivity, so that you turn slowly and have to move the mouse further.  A high sensitivity reduces the need to lift and reposition the mouse, and it will help you when doing lots of turns.  A low sensitivity will help you to aim more easily, and also make your aim more steady if you are nervous and have slightly shaky hands.  For the most part, the level of sensitivity you choose depends on how you aim.  This is a very personal thing and you will have to see what you like - again, select the setting which is most comfortable for you.  However, a good rule of thumb when you're learning to play is to configure your sensitivity a little lower than you're comfortable with, and try to get used to it.  After a few hours you will probably find that you have acclimatized, and are aiming better than before.  Keep reducing the sensitivity below your comfort zone until you are happy with your aim, or until it definitely becomes too low for you.  You'd be surprised the difference this makes.  Also consider that you can either use your wrist or your arm to aim - and you'll probably do one or the other more naturally.  Using the wrist is more exact, and thus high sensitivity is found more often among wrist aimers; using the arm involves more mouse movements, and so low sensitivity is common to arm aimers.  As a rule of thumb your sensitivity should be set so that you can comfortably perform a 180 degree turn with one sweep of your mouse.  The sensitivity setting can be found in the ''settings/input'' menu.
-
-
-*_Playing_
-
-**''Identifying Your Opponent''
-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 |Auto| 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 |Auto| button you can also press F6, thats a shortcut for the |Auto| 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 ''TAB''.  The weapon color and the color behind your name is your team color.  Try to only hit the OTHER team(s) :).
-
-**''Hitting Your Opponent''
-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.
-
-When you use direct-hit (hitscan) weapons like the shotgun, machine gun, or nex, you 'just' have to directly aim with the crosshair and hit fire.  Obviously this can be much harder than it sounds, particularly when both you and your opponent are moving.  Therefore, you should use geometry to your advantage, to reduce the relative movement between you as much as possible, so that you have as much time as possible to aim.  When someone is moving from one side of your view to the other it is harder to aim at him than when is moving towards or away from you.  In the latter case he will hardly change his position relative to yours, and this gives you more time to aim at him.  In the former, his position is changing a lot, and so you have to react to how he moves very quickly and accurately to ensure a good shot.  The same principle applies when your opponent uses a jump pad.  He will prescribe a trajectory in the air, and at its highest point he will stop for a moment.  It is easier to aim at him at this point than when he is accelerating off the jump-pad.
-
-In addition to using geometry to your advantage, when you're moving relative to your opponent it is sometimes easier to ''not'' aim with the mouse, but rather to leave it steady at the right height, and use the strafe buttons to move your cross hair onto him.  If you have the advantage of his not seeing you, or being unable to shoot at you, or even if you simply have a health and armor advantage over him, you can even just aim at some point and wait for him to walk into your cross hair.  However, always bear in mind that people will generally move unpredictably so as to lessen their chances of being hit - so unless you're sure of where he's going, don't sacrifice your own movement advantage for a hit that might never come.
-
-Using projectiles weapons such as the mortar, rocket launcher, and electro, can be both easier and harder than using hitscan weapons.  You must still consider the same geometric factors, but you also have to keep in mind that your projectile will take some time to travel the distance between you and your opponent.  In that time they will continue moving!  So it's absolutely no use to aim directly at them.  It will take some experience with each weapon, and with getting used to how people move, but you should eventually develop a good instinct for where your opponent will be at the time when your projectile will land (and where the projectile itself will land), and thus be able to 'lead' him when you aim.  If your target moves to the right, aim further to the right and press fire.  Also consider that almost all projectiles will explode when they hit something hard, and that explosion will also cause damage to players nearby (splash damage).  You can use splash damage to your advantage, so that rather than trying to predict the exact spot at which to aim your projectile (which is very difficult), you can aim at the general area of floor or wall where you expect your opponent to be and let the splash damage do its work.  Along these lines, you'll find that it's much easier to aim at his feet and use the splash damage from the explosion on the floor than it is to hit him directly.
-
-Also bear in mind that people try to evade projectiles; and it is even comparatively easy to do this at distance.  If you fire to their left they will see it coming, and change direction to the right.  You can use this to your advantage by boxing them in with explosions - just fire another one to their right.  If you correctly place both projectiles, they will be unable to evade the splash damage from one of them.  Either they will avoid the first and be hit by the second, or they will backtrack to avoid the second and be hit by the first.  Or, even better, they'll not see the first one at all and be hit directly.
-
-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 ''can'' 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.
-
-**''Controlling The Map''
-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.
-
-The health and armor system in Nexuiz is different to other games in that it tends toward an equilibrium of 100 health and 100 armor.  You can collect as much health and armor as you like, but it will degenerate toward these values.  The more health and armor you have, the faster it will degenerate - but when you pick them up the degeneration stops momentarily.  Because of this, you can't just load up on health and armor and head off into battle - you need to constantly replenish to remain strong.  On the converse, though, when your health is below 100 it will slowly ''re''generate (armor will not).  The lower it is, the faster it will replenish.  This regeneration stops for a few seconds if you are hurt, so just running away after a fight is not usually enough to restore you to useful levels again - you have to wait a while to regain your full health, and so picking up health after a fight is still important.
-
-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, "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." 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.
-
-**''Using Weapons Effectively''
-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.
-
-Almost all weapons in Nexuiz have two firing modes, so make sure you know both.  You normally (depending on game-mode) start equipped with two weapons: the laser and the shotgun, so we'll start with these.  You can bind these weapons to a key at the ''settings/input'' menu or in the console using the command ''bind key "impulse _n_"'', where n is the number of the weapon, below.
-
-	*The laser is not often used as a weapon, as it does not do much damage - but it's a useful tool to move around the map, because it has a significant push.  The 'explosion' from its projectile will push you and other players around a lot.  The trick to using it to move around is to use this push to gain speed or to do huge jumps.  For an easy start, take the laser, look down at the floor, and press fire.  It will push you high into the air.  If you press jump and fire at the same time, you will get even higher - but it depends on the timing, and, for more advanced jumps, also on the angle you fire at the floor, as well as how fast and in which direction you move.  Play around with it, and watch others, and you will learn a very useful skill in Nexuiz.  The secondary fire mode of the laser switches back to the last used weapon.  The laser does not use up any ammo.
-
-	*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.
-
-	*The machinegun is also quite self-explanatory.  It shoots hitscan bullets (do not get fooled by the eyecandy from the tracers, the mg IS HITSCAN it hits the moment you press fire were you aim) at a high rate of fire, and can do significant damage.  The primary fire mode has a high spread and is thus quite inaccurate - but it fires very fast and deals more damage per second than any other weapon.  It is therefore devastating when used at close quarters.  One of the machinegun's unique features is that the first bullet after pressing fire does more damage than the rest - keep this in mind when using it.  The secondary fire mode is much slower, but more accurate, and does even more damage per bullet, the same as the primary modes ''first'' bullets.  It is therefore very useful as an improvised sniper weapon for long range kills.  Like the shotgun, it is an excellent finishing weapon, but its effective use relies heavily on a good, steady aim.  The machinegun uses bullet ammo which is not shared with any other weapons.
-
-	*The mortar is a grenade-launcher on steroids.  Both firing modes shoot a fast-moving projectile grenade which is influenced by gravity, and thus moves in a trajectory.  The primary fire mode shoots grenades that explode on impact while the secondary fire mode shoots grenades which will bounce off objects, and either explode on contact with an other player, or after a few seconds if they are not triggered.  The grenades' arc makes them harder to aim, but also hard to dodge.  Since they deal quite high damage, with an excellent rate of fire, the mortar is a solid all-round weapon once you've got the hang of aiming it.  The mortar uses rocket ammo which is shared with the rocket launcher and the hagar.
-
-	*The electro is a rather underestimated gun.  Contrary to its name, it does not deal electricity damage, but rather fires plasma - understanding this will help you to use it well.  The primary fire mode shoots a plasma projectile which does quite high damage on impact.  It also explodes rather like a rocket or grenade, and is quite comparable in use to the Quake 2 rocket launcher.  The secondary fire mode spits out balls of contained plasma that will bounce like grenades, and deal similarly high damage.  Those blobs have a short trajectory and so do not get very far - but they're useful for blocking a way, or for spamming around your opponent so that he is hedged in by them.  If you use the primary fire mode to hit these contained plasma blobs, they will explode more violently then without, causing a lot of damage.  This combo is very effective in corridors and small rooms.  The electro uses cell ammo which is shared with the crylink and the nex.
-
-	*The crylink is comparable to the shotgun, except that it is not hitscan but shoots plasma projectiles; so it's harder to aim but also does more damage.  The primary fire mode shoots several projectiles at a high rate of fire and narrow spread, while the secondary fire mode has a wider, horizontal spread and lower rate of fire.  The crylink uses cell ammo which is shared with the electro and the nex.
-
-	*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 crylink and the electro.
-
-	*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 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 and the hagar.
-
-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.  So a good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode and hurt him!
-
-**''Using Jumping Effectively''
-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 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 ''lots'' 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.
-
-You should also know that you gain a bit extra speed moving forward simply by jumping.  When you walk, there is friction from the floor which keeps you at a constant speed.  If you jump as you walk, the amount you touch the floor is considerably less, and so the friction does not slow you down as much.  The longer you jump, the faster you go.  The most simple way to do this is to run forward, jump, and then while you are in the air release and repress/hold the jump button.  Your character will jump again the moment you land, without you having to worry about timing hitting the jump key.  Just repeat it a few times and you will notice you get faster and faster.  Unlike other games, Nexuiz does not need you to do this with strange key combinations or even with circular movements of the mouse - trying to do these will generally make you slower.  The only time that strafe-jumping (holding one of the strafe-keys while jumping) is useful is for the very first jump you make.  This can increase your jump speed a little - although not by much.
-
-Another useful thing to know about movement is that if you run and jump, you can release the forward key and instead press the left or right key, and turn your mouse in the same direction.  Doing so will turn or 'bend' your jump in this direction.  This is a useful trick to get around corners, to become less predictable, and also to avoid having to stop jumping to change direction.
-
-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 (http://www.alientrap.org/forum).
-
-**''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.
-
-**''Game Types''
-Nexuiz supports several different game modes and some smaller changes called mutators.  Both are displayed when you connect to a server.
-
-**''Modes''
-	*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).
-	*Team Deathmatch (TDM) is similar, but pits teams of players against each other.  Only shoot players with a different color than yourself.  Look at your gun to see your color.  The team with the most frags wins.
-	*Capture The Flag (CTF) is a team match in which you have two teams, two bases, and two flags.  You have to get into the enemy base, grab their flag, and bring it back to your own flag to score.  Scoring gives the most points, normal fragging and returning the flag gives some points.  The team with the most points wins.  CTF is a surprisingly complicated game mode, so see the comprehensive CTF guide in the Nexuiz forum for more information ({+http://alientrap.org/forum/viewtopic.php?t=849+}).
-	*Instagib removes all items from the map, and equips everyone with a nexgun.  One hit will kill, and this means some very fast action.  The player with the most frags wins.
-	*Minstagib is an improved instagib.  You can pick up lives, so you can survive two shots, and you can pick up an item to become almost invisible.  The secondary fire mode is the laser, so you can laser jump around the map.
-	*Runematch places five runes into the map in addition to the normal items.  A rune gives you a bonus but also a curse - but you only get points for fragging if you carry a rune, so make sure you have one.  You also get points for fragging a rune carrier, and for just holding a rune (but fragging is the quicker way to gain points).  The player with the most points wins.
-	*Domination is also a team mode.  Throughout the map are domination points.  Touch them and your team will own that point.  You get points for each second you own such a domination point.  Touch points the other team holds to turn it into your own.  The team with the most points wins.
-	*Last Man Standing (LMS) puts all players into a map without any items.  Each player has several lives, and starts with all weapons when he spawns.  Each time you are fragged you lose a life.  The winner is the last surviving player.
-	*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.
-
-**''Mutators''
-	*The hook mutator will add grappling hook which can be used to move through the map like spider man.  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 which you can use to guide the most recently fired rocket.
-	*Vampire will add whatever damage you do to your opponent to your own health.
-	*Nixnex will remove normal guns from the map and give all players the same gun.  That gun is changed after a while.
-	*Footsteps will add footstep sounds to your movements.
-There are some more of these mutators, but those are the most important ones.
-
-A list of useful links:
-	*The official Nexuiz forum: {+http://alientrap.org/forum+}
-	*The semiofficial Nexuiz wiki: {+http://alientrap.org/wiki+}
-	*The official Nexuiz ladder: {+http://planetnexuiz.com/ladder+}
-	*The Official Nexuiz tournaments: {+http://planetnexuiz.com/tourney+}
-	*General Nexuiz Tips and Tricks: {+http://alientrap.org/forum/viewtopic.php?t=90+}
-	*How to get more help via IRC: {+http://alientrap.org/forum/viewtopic.php?t=497+}
-	*CTF guide and ctf MAPS guide: {+http://alientrap.org/forum/viewtopic.php?t=849+}
-	*Team communication explained: {+http://alientrap.org/forum/viewtopic.php?t=555+}
-	*A few useful jumps: http://esteel.planetnexuiz.de/nexuiz/demos/jumps.pk3  (copy the file into Nexuiz/data and you should find the demos in the demos menu)
-	*FPS settings: {+http://alientrap.org/forum/viewtopic.php?t=1628+}
-	*A list of all available variables in Nexuiz: {+http://alientrap.org/wiki/pmwiki.php?n=Main.GameTweaks+}
-	*A list of all available commands in Nexuiz: {+http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands+}
-	*Some info about generic strategy in games: {+http://alientrap.org/forum/viewtopic.php?t=3496+}

Modified: branches/nexuiz-2.0/Docs/basics.html
===================================================================
--- branches/nexuiz-2.0/Docs/basics.html	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/basics.html	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,134 +1,84 @@
-<!--  AFT (Almost Free Text) source file for Nexuiz Basics Guide -->
-<!--  WARNING: ALWAYS RUN AFT TWICE! (otherwise the toc is missing/not up to date) -->
-<!--  use AFT v5.096 or later (http://www.maplefish.com/todd/aft.html) -->
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
-<title>Nexuiz Basics explained</title>
-	<meta name="author" content="">
-	<meta name="GENERATOR" content = "Almost Free Text v5.096; Copyright 1996-2005 Todd Coram. All rights reserved.">
-<style type="text/css">
-  <!--
-html { background: #eee; color: #000; }
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="author" content="Tyler Mulligan of www.detrition.net a.k.a -z- of www.nexuizninjaz.com" />
+<meta name="Description" content="Nexuiz is a free open-source fast paced first person shooter (FPS) that runs on Windows, Linux and OSX.  Nexuiz utilizes the darkplaces engine modeled after the Quake series." />
+<meta name="Keywords" content="Nexuiz, Nexiuz, first person shooter, darkplaces, open-source game, open source game, free game, linux game, deathmatch, death match, ctf, quake, alientrap, alien trap, ninjaz" />
+<title>Nexuiz - A free open-source fast paced first person shooter (FPS) for Windows, Linux and OSX</title>
+<link rel="stylesheet" href="htmlfiles/style.css" type="text/css"></link>
+<link rel="shortcut icon" href="favicon.ico"></link>
+</head>
+<body>
+<div id="container">
+	<div id="left">
+		<div id="logo">
 
-body { background: #eee; color: #000; margin: 0; padding: 0;}
+			<a href="http://www.nexuiz.com" title="Nexuiz - Simple, fast, intense and completely free"><img src="htmlfiles/img/nexuiz_logo.jpg" alt="Nexuiz is a free open-source fast paced first person shooter that runs on Windows, Linux and OSX." width="201" height="193" border="0" title="Nexuiz is a free open-source fast paced first person shooter that runs on Windows, Linux and OSX." /></a>
+		</div>
+		<!-- Sidebar -->
+	  <div id="sidebar">
+			<a href="news.php" title="Latest Nexuiz News"><img src="htmlfiles/img/headers/latest_news.gif" alt="Latest News" width="168" height="16" border="0" class="imgHeader" style="margin-top:0;" title="Latest Nexuiz News" /></a>
+			<div id="news">
+			  <div class="newsPost">
+						<h1><a href="http://nexuiz.com/news.php" title="Two Nexuiz 1v1 Tourneys">nexuiz.com/news - for nexuiz news updates</a></h1>
+			  </div>
+		</div>
+			<!-- Downloads -->
+			<a href="downloads.php" title="Nexuiz Downloads (Game, Maps)"><img src="htmlfiles/img/headers/downloads.gif" alt="Downloads" width="145" height="15" border="0" class="imgHeader" title="Downloads" /></a>
+			<a id="download_nexuiz" href="http://downloads.sourceforge.net/nexuiz/nexuiz-242.zip" title="Download Nexuiz from Source Forge - Left Click">&nbsp;</a>
+			<!--<a id="download_q3_mappack" href="http://downloads.sourceforge.net/nexuiz/nexmappack_r2.zip" title="Download Nexuiz Q3 Mappack from Source
+			Forge - Left Click">&nbsp;</a>-->
+			<h2 class="page"><a href="http://nexuiz.com/downloads.php" title="Nexuiz Download Mirrors">Mirrors -&gt;</a></h2>
+			<!-- Help Wanted -->
 
-div.body {
-	background: #fff; color: #000;
-	margin: 0 1em 0 1em; padding: 1em;
-	font-family: serif;
-	font-size: 1em; line-height: 1.2em;
-	border-width: 0 1px 0 1px;
-	border-style: solid;
-	border-color: #aaa;
-}
+			<img src="htmlfiles/img/headers/help_wanted.gif" alt="Help Wanted" width="165" height="15" class="imgHeader" title="Help Wanted" />			
+			<form action="https://www.paypal.com/cgi-bin/webscr" method="post" name="donate_form"> <input name="cmd" value="_s-xclick" type="hidden" />
+			<a id="donate" href="javascript:document.donate_form.submit();" title="Help The Aliens, Please Donate">&nbsp;</a>
+			<noscript>
+				<!-- It not an elegant solution but I don't expect many users to arrive with JS turned off -->
+				<input name="submit" type="image" src="htmlfiles/img/donate_button_noscript.jpg" alt="Help this project - Donate to the aliens" width="166" height="43" /> 
+			</noscript>
+			<h2 class="page"><a href="http://nexuiz.com/donators.php" title="Those who have donated to Nexuiz">Donators -&gt;</a></h2>
+			<input name="encrypted" value="-----BEGIN PKCS7-----MIIHBgYJKoZIhvcNAQcEoIIG9zCCBvMCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBfp40KRLmnxKPY06C4gjvEiWZchbxK6bgD7ZdjhdWO5Vbwo4T4Ro+HE041PVVqIxPlJgO80l3aQpBtfhC66FfM2kIF1BjLs1zzhQM89XoPGViS3e4kbmzxkMnpdiZFmOsR5Fs5NJYiVaMnVGcoQ+K3+KsyOehZGket7GwUeNFMRzELMAkGBSsOAwIaBQAwgYMGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIb1QeJqVIc5SAYOPcI23W84XMGt8mSfHE1Gf0/GZAM7NvqLiHF0BeaecRW1Bc85O0tL9OduZiraGf7WVnAmP5kp1D0irXsA5+N2l15WADxwNQ/GoCAU293l0dAQ7Qy4F3vh6eSii18MaH2KCCA4cwggODMIIC7KADAgECAgEAMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTAeFw0wNDAyMTMxMDEzMTVaFw0zNTAyMTMxMDEzMTVaMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwUdO3fxEzEtcnI7ZKZL412XvZPugoni7i7D7prCe0AtaHTc97CYgm7NsAtJyxNLixmhLV8pyIEaiHXWAh8fPKW+R017+EmXrr9EaquPmsVvTywAAE1PMNOKqo2kl4Gxiz9zZqIajOm1fZGWcGS0f5JQ2kBqNbvbg2/Za+GJ/qwUCAwEAAaOB7jCB6zAdBgNVHQ4EFgQUlp98u8ZvF71ZP1LXChvsENZklGswgbsGA1UdIwSBszCBsIAUlp98u8ZvF71ZP1LXChvsENZklGuhgZSkgZEwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAgV86VpqAWuXvX6Oro4qJ1tYVIT5DgWpE692Ag422H7yRIr/9j/iKG4Thia/Oflx4TdL+IFJBAyPK9v6zZNZtBgPBynXb048hsP16l2vi0k5Q2JKiPDsEfBhGI+HnxLXEaUWAcVfCsQFvd2A1sxRr67ip5y2wwBelUecP3AjJ+YcxggGaMIIBlgIBATCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA1MDUxMjE5MDQ0OFowIwYJKoZIhvcNAQkEMRYEFC7mlfdaA7Pg2eBhxI5xQTe7ydTtMA0GCSqGSIb3DQEBAQUABIGAfR38tX84huxk9JjvhggcSMxzHbmDxpxInBU6/lbyqAu7iT5KJn7rcJgaH5ZVyKNoNQLGp9IxweBrcMiYUQNVxShm9+hunXhQmj5r7AMGaxNZ0mE8mQRW1ZTaz7TLz1HkDFA+R0Dm8HYyDQA4L505cBiWNEsKC17VwNK1G7CEVvA=-----END PKCS7-----" type="hidden" /></form>
+			
+		  <!-- Created By -->
+		  <img src="htmlfiles/img/headers/created_by.gif" alt="Created By" width="145" height="15" class="imgHeader" title="Created By" />
 
-div.block {
-	background: #F8F8FF; color: #000;
-	margin: 1em; padding: 0 1em 0 1em;
-	border-width: 1px;
-	border-style: solid;
-	border-color: #909090;
-}
+	  <a id="alien_trap" href="http://www.alientrap.org" title="Developed by Alien Trap" target="_blank">&nbsp;</a>	  </div>
+		<!-- end sidebar -->	</div><!-- end left -->
+	<div id="right">
+		<div id="header">
+			<a href="http://nexuiz.com" title="Nexuiz - Simple, fast, intense and completely free"><img src="htmlfiles/img/nexuiz_header.jpg" alt="Nexuiz is a free open-source fast paced first person shooter that runs on Windows, Linux and OSX." width="766" height="107" border="0" title="Nexuiz - Simple, fast, intense and completely free" /></a>
+		</div>
+		<div id="menu">
+			<ul>
 
-table {
-	background: #F8F8F8; color: #000;
-	margin: 1em;
-	border-width: 0 0 0 1px;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-td {
-	border-width: 0 1px 1px 0;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-th {
-	background: #F8F8FF;
-	border-width: 1px 1px 2px 0;
-	border-style: solid;
-	border-color: #C0C0C0;
-}
-
-
-/* body text, headings, and rules */
-
-p { margin: 0; text-indent: 0em; margin: 0 0 0.5em 0 }
-
-h1, h2, h3, h4, h5, h6 {
-	color: #206020; background: transparent;
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-weight: normal;
-}
-
-h1 { font-size: 1.69em; margin: 1.4em 0 0.4em 0; }
-h2 { font-size: 1.44em; margin: 1.4em 0 0.4em 0; }
-h3 { font-size: 1.21em; margin: 1.4em 0 0.4em 0; }
-h4 { font-size: 1.00em; margin: 1.4em 0 0.4em 0; }
-h5 { font-size: 0.81em; margin: 1.4em 0 0.4em 0; }
-h6 { font-size: 0.64em; margin: 1.4em 0 0.4em 0; }
-
-hr {
-	color: transparent; background: transparent;
-	height: 0px; margin: 0.6em 0;
-	border-width: 1px ;
-	border-style: solid;
-	border-color: #999;
-}
-
-/* bulleted lists and definition lists */
-
-ul { margin: 0 1em 0.6em 2em; padding: 0; }
-li { margin: 0.4em 0 0 0; }
-
-dl { margin: 0.6em 1em 0.6em 2em; }
-dt { color: #206020; }
-
-tt { color: #602020; }
-
-/* links */
-
-a.link {
-	color: #33c; background: transparent;
-	text-decoration: none;
-}
-
-a:hover {
-	color: #000; background: transparent;
-}
-
-body > a {
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-size: 0.81em;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	color: #206020; background: transparent;
-	font-family: Optima, Arial, Helvetica, sans-serif;
-	font-weight: normal;
-}
-
-  -->
-</style>
-</head>
-<body>
-<div class="body">
-
-<br><center><h1><a name="AFT-top">Nexuiz Basics explained</a></h1></center>
+				<li class="first"><a href="../readme.html" title="Nexuiz - Latest News">About </a></li>
+				<li><a href="basics.html" title="Nexuiz - Media (Screenshots, videos and graphics)">Nexuiz Basics</a></li>
+				<li><a href="say-esc.html" title="Nexuiz Information  (General, System Requirements)">Say Escapes</a></li>
+				<li><a href="irc.html" title="Nexuiz - Downloads (Game, Maps)">IRC</a></li>
+				<li><a href="faq.html" title="Official Nexuiz FAQ">FAQ</a></li>
+				<li class="first"></li>
+				<li class="first"></li>
+		  </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>
 <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_"><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''"><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>
@@ -139,7 +89,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''"><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>
@@ -152,15 +102,15 @@
 <!--End Section 2-->
 <!-- End SectLevel2 -->
 <!--End Section 1-->
-<h2><a name="_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''"><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''"><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>
@@ -180,7 +130,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''"><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>
@@ -191,7 +141,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''"><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>
@@ -202,12 +152,21 @@
 <li>The laser is not often used as a weapon, as it does not do much damage - but it's a useful tool to move around the map, because it has a significant push.  The 'explosion' from its projectile will push you and other players around a lot.  The trick to using it to move around is to use this push to gain speed or to do huge jumps.  For an easy start, take the laser, look down at the floor, and press fire.  It will push you high into the air.  If you press jump and fire at the same time, you will get even higher - but it depends on the timing, and, for more advanced jumps, also on the angle you fire at the floor, as well as how fast and in which direction you move.  Play around with it, and watch others, and you will learn a very useful skill in Nexuiz.  The secondary fire mode of the laser switches back to the last used weapon.  The laser does not use up any ammo.</li>
 </ul>
 <ul>
+<li>The grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects 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>
+</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>
 </ul>
 <ul>
 <li>The machinegun is also quite self-explanatory.  It shoots hitscan bullets (do not get fooled by the eyecandy from the tracers, the mg IS HITSCAN it hits the moment you press fire were you aim) at a high rate of fire, and can do significant damage.  The primary fire mode has a high spread and is thus quite inaccurate - but it fires very fast and deals more damage per second than any other weapon.  It is therefore devastating when used at close quarters.  One of the machinegun's unique features is that the first bullet after pressing fire does more damage than the rest - keep this in mind when using it.  The secondary fire mode is much slower, but more accurate, and does even more damage per bullet, the same as the primary modes <em>first</em> bullets.  It is therefore very useful as an improvised sniper weapon for long range kills.  Like the shotgun, it is an excellent finishing weapon, but its effective use relies heavily on a good, steady aim.  The machinegun uses bullet ammo which is not shared with any other weapons.</li>
 </ul>
 <ul>
+<li>The HLAC (heavy laser assault cannon) is a similar gun but fires highly accelerated laser bolts at an insane refire rate.  The bolds explode on impact and for some extra damage the secondary firemode files several of them at once.  This is only gun that has reduced spread when crouching!  Beware of your cell ammo, this baby eats it like crazy.</li>
+</ul>
+<ul>
 <li>The mortar is a grenade-launcher on steroids.  Both firing modes shoot a fast-moving projectile grenade which is influenced by gravity, and thus moves in a trajectory.  The primary fire mode shoots grenades that explode on impact while the secondary fire mode shoots grenades which will bounce off objects, and either explode on contact with an other player, or after a few seconds if they are not triggered.  The grenades' arc makes them harder to aim, but also hard to dodge.  Since they deal quite high damage, with an excellent rate of fire, the mortar is a solid all-round weapon once you've got the hang of aiming it.  The mortar uses rocket ammo which is shared with the rocket launcher and the hagar.</li>
 </ul>
 <ul>
@@ -220,16 +179,23 @@
 <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 crylink 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 to train steady aim and fast movement.</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 and the rocket launcher.</li>
 </ul>
 <ul>
 <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 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 one 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.</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.  So a good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode and hurt him!
+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.  So a good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode and hurt him!  This is also the primary way to make sure the t.a.g. seekers rockets do not hit you!
+Also not 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''"><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 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>
@@ -243,7 +209,7 @@
 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''"><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>
@@ -251,33 +217,83 @@
 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.
 </p>
 <!--End Section 2-->
-<h3><a name="''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''"><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>
+<ul>
 <li>Team Deathmatch (TDM) is similar, but pits teams of players against each other.  Only shoot players with a different color than yourself.  Look at your gun to see your color.  The team with the most frags wins.</li>
+</ul>
+<ul>
 <li>Capture The Flag (CTF) is a team match in which you have two teams, two bases, and two flags.  You have to get into the enemy base, grab their flag, and bring it back to your own flag to score.  Scoring gives the most points, normal fragging and returning the flag gives some points.  The team with the most points wins.  CTF is a surprisingly complicated game mode, so see the comprehensive CTF guide in the Nexuiz forum for more information (<a class="link" href="http://alientrap.org/forum/viewtopic.php?t=849">http://alientrap.org/forum/viewtopic.php?t=849</a>).</li>
-<li>Instagib removes all items from the map, and equips everyone with a nexgun.  One hit will kill, and this means some very fast action.  The player with the most frags wins.</li>
-<li>Minstagib is an improved instagib.  You can pick up lives, so you can survive two shots, and you can pick up an item to become almost invisible.  The secondary fire mode is the laser, so you can laser jump around the map.</li>
+</ul>
+<ul>
+<li>Minstagib is an improved instagib.  You can pick up lives, so you can survive two shots, and you can pick up an item to become almost invisible.  This is were the minstanex got its name from.</li>
+</ul>
+<ul>
 <li>Runematch places five runes into the map in addition to the normal items.  A rune gives you a bonus but also a curse - but you only get points for fragging if you carry a rune, so make sure you have one.  You also get points for fragging a rune carrier, and for just holding a rune (but fragging is the quicker way to gain points).  The player with the most points wins.</li>
-<li>Domination is also a team mode.  Throughout the map are domination points.  Touch them and your team will own that point.  You get points for each second you own such a domination point.  Touch points the other team holds to turn it into your own.  The team with the most points wins.</li>
+</ul>
+<ul>
+<li>Domination (DOM) is also a team mode.  Throughout the map are domination points.  Touch them and your team will own that point.  You get points for each second you own such a domination point.  Touch points the other team holds to turn it into your own.  The team with the most points wins.</li>
+</ul>
+<ul>
 <li>Last Man Standing (LMS) puts all players into a map without any items.  Each player has several lives, and starts with all weapons when he spawns.  Each time you are fragged you lose a life.  The winner is the last surviving player.</li>
+</ul>
+<ul>
 <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>
 </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>
+</ul>
+<ul>
+<li>Assault (AS) is a similar team mode and also new in Nexuiz 2.4.  There are objects in the map, only one is active at a time and you have to complete that one to unlock the next objective.  One round ends if the last objective is completed or timelimit is hit.  After the round the teams swap the attackers/defender roles.</li>
+</ul>
+<ul>
+<li>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:</li>
+</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>
+</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>
+</ul>
+</ul>
+<ul>
+<ul>
+<li>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. </li>
+</ul>
+</ul>
 <!--End Section 2-->
-<h3><a name="''Mutators''"><em>Mutators</em></a></h3>
+<h3><a name="''Mutators''"id="''Mutators''"><em>Mutators</em></a></h3>
 <ul>
-<li>The hook mutator will add grappling hook which can be used to move through the map like spider man.  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>Laser-guided rockets will give you a laser dot which you can use to guide the most recently fired rocket.</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 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>
+</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>
+</ul>
+<ul>
 <li>Vampire will add whatever damage you do to your opponent to your own health.</li>
+</ul>
+<ul>
 <li>Nixnex will remove normal guns from the map and give all players the same gun.  That gun is changed after a while.</li>
+</ul>
+<ul>
 <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>
+</ul>
 <p class="Body">
 There are some more of these mutators, but those are the most important ones.
 </p>
@@ -285,20 +301,44 @@
 A list of useful links:
 <ul>
 <li>The official Nexuiz forum: <a class="link" href="http://alientrap.org/forum">http://alientrap.org/forum</a></li>
+</ul>
+</p>
+<ul>
 <li>The semiofficial Nexuiz wiki: <a class="link" href="http://alientrap.org/wiki">http://alientrap.org/wiki</a></li>
+</ul>
+<ul>
 <li>The official Nexuiz ladder: <a class="link" href="http://planetnexuiz.com/ladder">http://planetnexuiz.com/ladder</a></li>
+</ul>
+<ul>
 <li>The Official Nexuiz tournaments: <a class="link" href="http://planetnexuiz.com/tourney">http://planetnexuiz.com/tourney</a></li>
+</ul>
+<ul>
 <li>General Nexuiz Tips and Tricks: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=90">http://alientrap.org/forum/viewtopic.php?t=90</a></li>
+</ul>
+<ul>
 <li>How to get more help via IRC: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=497">http://alientrap.org/forum/viewtopic.php?t=497</a></li>
+</ul>
+<ul>
 <li>CTF guide and ctf MAPS guide: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=849">http://alientrap.org/forum/viewtopic.php?t=849</a></li>
+</ul>
+<ul>
 <li>Team communication explained: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=555">http://alientrap.org/forum/viewtopic.php?t=555</a></li>
+</ul>
+<ul>
 <li>A few useful jumps: <a class="link" href="http://esteel.planetnexuiz.de/nexuiz/demos/jumps.pk3">http://esteel.planetnexuiz.de/nexuiz/demos/jumps.pk3</a>  (copy the file into Nexuiz/data and you should find the demos in the demos menu)</li>
+</ul>
+<ul>
 <li>FPS settings: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=1628">http://alientrap.org/forum/viewtopic.php?t=1628</a></li>
+</ul>
+<ul>
 <li>A list of all available variables in Nexuiz: <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.GameTweaks">http://alientrap.org/wiki/pmwiki.php?n=Main.GameTweaks</a></li>
+</ul>
+<ul>
 <li>A list of all available commands in Nexuiz: <a class="link" href="http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands">http://alientrap.org/wiki/pmwiki.php?n=Main.ConsoleCommands</a></li>
+</ul>
+<ul>
 <li>Some info about generic strategy in games: <a class="link" href="http://alientrap.org/forum/viewtopic.php?t=3496">http://alientrap.org/forum/viewtopic.php?t=3496</a></li>
 </ul>
-</p>
 <!--End Section 2-->
 <!-- End SectLevel2 -->
 <!--End Section 1-->
@@ -306,6 +346,32 @@
 <hr>
 <br>
 <p align="right"> <small>This document was generated using <a class="link" href="http://www.maplefish.com/todd/aft.html">AFT v5.096</a></small> </p>
+	    </div>
+		  <p><br style="clear:left" />
+        </p>
+	  </div>
+	  <!-- end content -->
+		<div id="footer">
+			<p id="ninja"><a href="http://www.detrition.net" title="Tyler Mulligan's Working Portfolio" target="_blank">page created by</a> <a href="http://www.nexuizninjaz.com" title="Nexuiz Ninjaz - Practicing the ninja arts of Nexuiz" target="_blank">a ninja</a></p>
+			<ul>
+
+				<li class="first"><a href="http://alientrap.org/nexuiz/news.php" title="Nexuiz - Latest News">News</a></li>
+				<li><a href="http://alientrap.org/nexuiz/media.php" title="Nexuiz - Media (Screenshots, videos and graphics)">Media</a></li>
+				<li><a href="http://alientrap.org/nexuiz/information.php" title="Nexuiz Information  (General, System Requirements)">Info</a></li>
+				<li><a href="http://alientrap.org/nexuiz/team.php" title="The Nexuiz Team">Team</a></li>
+				<li><a href="http://alientrap.org/nexuiz/links.php" title="Nexuiz Links">Links</a></li>
+				<li><a href="http://alientrap.org/forum/index.php?c=3" title="Official Nexuiz Forums" target="_blank">Forums</a></li>
+				<li><a href="http://planetnexuiz.com/ladder/" title="Nexuiz Ladder" target="_blank">Ladder</a></li>
+				<li><a href="http://planetnexuiz.com/tourney/" title="Nexuiz Tournaments" target="_blank">Tournament</a></li>
+			</ul>		</div><!-- end footer -->
+		<p class="subFooter">Come to the Nexuiz IRC channel: <a href="irc://irc.quakenet.org/nexuiz" title="#nexuiz on irc.quakenet.org">#nexuiz on irc.quakenet.org</a> or the team channel: <a href="irc://irc.anynet.org/alientrap" title="#alientrap on irc.anynet.org">#alientrap on irc.anynet.org</a></p>
+
+		<div id="valid">
+			<a id="valid_css" href="http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Falientrap.org%2Fnexuiz%2Findex.php">&nbsp;</a>
+			<a id="valid_xhtml" href="http://validator.w3.org/check?uri=http%3A%2F%2Falientrap.org%2Fnexuiz%2Findex.php">&nbsp;</a>
+			<p>&copy; 2004-2008 Nexuiz.com</p>
+	  </div>
+	</div><!-- end right -->
+</div>
 </body>
 </html>
-

Copied: branches/nexuiz-2.0/Docs/htmlfiles (from rev 5121, trunk/Docs/htmlfiles)

Deleted: branches/nexuiz-2.0/Docs/say-escapes.txt
===================================================================
--- branches/nexuiz-2.0/Docs/say-escapes.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/say-escapes.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,35 +0,0 @@
-In a message you "say", you can use the following escapes:
-
-%%        literal percent sign
-%a        current armor value
-%h        current health
-%w        current weapon
-%W        current ammo type
-
-%x        name of entity pointed at
-%p        name of player you look at
-
-%l        current location
-%y        location pointed at
-%d        location last died at
-
-The latter three need location data or use nearby weapons instead. Location
-data are entities of type target_location with a netname that replaces the
-escape.
-
-The location entity for a point is chosen by the following algorithm:
-
-- the closest four entities are found
-- of these, the first one which is actually VISIBLE to the point is chosen
-- if there is no line of sight from the point to any of the four location
-  entities, the closest one is chosen
-
-Of course you can use these escapes in key bindings and aliases; examples:
-
-alias asay_ctf_flagcarrier "say_team flag carrier at %y"
-alias asay_ctf_haveflag "say_team (%l) have the flag"
-alias asay_willgo "say_team will go to %y"
-alias asay_support "say_team (%l) need help, %h%%"
-alias asay_killed "say_team got killed at %d"
-alias asay_noammo "say_team (%l) need %W for %w"
-alias asay_drop "say_team (%l) dropped %w ; impulse 17"

Modified: branches/nexuiz-2.0/Docs/server/server.cfg
===================================================================
--- branches/nexuiz-2.0/Docs/server/server.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/Docs/server/server.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -69,8 +69,7 @@
 // from the line start and change them to your liking.
 
 //rcon_password "" // you can use rcon if this password is set.  you need to set the same password in your client if you want to issue rcon commands
-//rcon_restricted_commands "" // commands a "restricted" rcon user may use, seperated by space
-//rcon_restricted_password "" // put here the password for a "restricted" rcon user
+//rcon_restricted_password "" // put here the password for a "restricted" rcon user (see below)
 
 //bot_number 0 // number of bots to add
 //skill 1 // the bots skill level
@@ -84,9 +83,12 @@
 //g_maplist_votable_abstain 0 // when 1, people get a "don't care" selection in the vote screen
 //g_maplist_votable_nodetail 1 // when 1, people can't see how many voted for what (to thwart abusive "influential" first votes)
 
-//sv_vote_commands "restart timelimit fraglimit chmap gotomap g_grappling_hook sv_defaultplayer_fbskin_green sv_defaultplayer_fbskin_red sv_defaultplayer_fbskin_orange sv_defaultplayer_fbskin_off endmatch reducematchtime extendmatchtime allready" // players can vote for those commands or use them if they are masters.  You can also add 'kick kickban' to allow players to remove punks with a vote.  In that case it also helps to disable sv_status_privacy
+//sv_vote_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick" // players can vote for those commands or use them if they are masters. You canm also add 'g_grappling_hook' for hook voting, and 'sv_defaultplayer_fbskin_green sv_defaultplayer_fbskin_red sv_defaultplayer_fbskin_orange sv_defaultplayer_fbskin_off' for fbskin voting.
+//sv_vote_master_commands "" // add commands masters can use if logged in or elected. You may want to put 'kickban' here, so masters can keep out punks. It may be good to also put "sv_status_privacy 0" then...
+//rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban\" status \"sv_cmd teamstatus\"" // commands for the (stronger) rcon restricted
+
 //sv_vote_call 1 // 0 will disable the normal voting
-//sv_vote_master 1 // 0 will disable voting to become masters
+//sv_vote_master 1 // 0 will disable voting to become masters, good if you prefer to use the master password instead
 //sv_vote_master_password "" // when set, vdo login master will allow you to run votable commands directly using vdo
 //sv_vote_majority_factor 0.5 // 0.666 will require a 2/3 majority instead of a regular 1/2 one
 //sv_vote_simple_majority_factor 0 // 0.666 will win votes by a 2/3 majority of the VOTERS (not the players!)

Modified: branches/nexuiz-2.0/changes-since-last-release
===================================================================
--- branches/nexuiz-2.0/changes-since-last-release	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/changes-since-last-release	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,4 @@
-CHANGES since 2.4.2 to r4887:
+CHANGES since 2.4.2 to r4976:
 compat-q3a: switch crylink/hagar, as crylink is closer to BFG and hagar is closer to Plasmagun
 game: airshot announcer
 game: alternate HUD is now default
@@ -16,12 +16,15 @@
 game: crylink bounce does half damage
 game: crylink primary does 2 cells
 game: crylink weakened
+game: ctf capture records now can only be made on an otherwise empty server, prevents "assisted" records
 game: ctf flag touching when dead bug fixed
 game: ctf win mode 3 = scores, but no frags
 game: cvar cl_weaponpriority* (custom weapon orders)
 game: cvar cl_weaponpriority_useforcycling
 game: cvar g_balance_ctf_damageforcescale
+game: cvar g_balance_electro_combo_speed
 game: cvar g_balance_teams_complain can now be turned off
+game: cvar g_bugrigs*
 game: cvar g_ctf_allow_drop
 game: cvar g_ctf_fullbrightflags
 game: cvar g_instagib REMOVED (no demand)
@@ -30,8 +33,10 @@
 game: cvar g_spawn_furthest
 game: cvar g_spawnpoints_auto_move_out_of_solid
 game: cvar g_start_delay
+game: cvar g_touchexplode
 game: cvar g_warmup
 game: cvar g_weaponreplace_*
+game: cvar sv_clones
 game: cvar sv_gentle
 game: cvar sv_maxidle
 game: cvar sv_ready_restart_after_countdown
@@ -59,12 +64,14 @@
 game: new music track by meoblast001 (TODO nexuiz-credits.txt)
 game: new particles
 game: new tokenizer fixing weirdly split kick reasons/vote commands
+game: new weapon and player sounds
 game: performance improved (fteqcc -O3)
 game: race game type
 game: rocket launcher detonation fixed when button was pressed only for a very short time
 game: scoreboard improved
 game: scores per-team
 game: sounds: model specific player sounds
+game: strength and shield have better performance now
 game: sv_foginterval
 game: team radar (sv_cmd bbox, sv_cmd radarmap commands to create/debug it!)
 game: teamkill and typekill complaints
@@ -84,30 +91,38 @@
 mapping: entity func_sparks
 mapping: entity func_train now supports -1 wait on path_corner, making it NOT wait
 mapping: entity info_null now removes itself (as it should); this DOES break some maps that need fixing now
+mapping: entity info_player_start now triggers other entities when someone spawns
 mapping: entity misc_follow
 mapping: entity misc_laser changed and improved
+mapping: entity misc_gamemodel, func_illusionary replacing misc_models
 mapping: entity target_spawn (BEWARE OF THE)
 mapping: entity trigger_flipflop, trigger_monoflip, trigger_multivibrator
+mapping: entity trigger_heal
 mapping: entity trigger_hurt now can set a message2 as death message for push-kills
 mapping: entity trigger_items
 mapping: field nottargeted overrides targetname checks in e.g. func_door (so it can be used for misc_follow without needing an extra trigger)
 mapping: field team on items
 mapping: LOD for misc_models and similar entities
 mapping: mapname.cfg is deprecated. Use clientsettemp_for_type and cdtrack in mapname.mapinfo
+mapping: target2, target3, target4 as extra target fields
+mapping: triggers now MUST be common/trigger; their exact shape now works (no longer their bbox)
 mapping: turrets
-mapping: triggers now MUST be common/trigger; their exact shape now works (no longer their bbox)
 mapping: zeroradiant support, bugfix patchset updated
 map: reslimed: less distracting fog
 map: some more TDM map settings
 map: starship and silvercity: no CTF
 menu: channel mixer
+menu: demo browser
 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: multicampaign
 menu: new playermodel previews (sev)
 menu: new skin "wickedz"
 menu: play button in map info
 menu: server favorites
+menu: server info
 menu: skin selector
 menu: weapon priority dialog
 menuskins: big buttons as extra graphics
@@ -115,5 +130,6 @@
 menuskins: HEIGHT_DIALOGBORDER
 menu: wicked skins
 misc: +exec benchmark.cfg
+models: specop now knows that she is female
 rcon2irc: disconnect fix
 rcon2irc: irc_trigger

Modified: branches/nexuiz-2.0/data/Makefile
===================================================================
--- branches/nexuiz-2.0/data/Makefile	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/Makefile	2008-11-27 13:33:46 UTC (rev 5122)
@@ -55,3 +55,23 @@
 		cd $$TDIR; \
 		$(RM) -r qcsrc common-spog.pk3 \
 		$(ZIP) $$ABSPK3NAME .
+
+.PHONY: log
+log:
+	cd .. && svn log -r HEAD:BASE
+
+.PHONY: logv
+logv:
+	cd .. && svn log -r HEAD:BASE -v
+
+.PHONY: update
+update:
+	cd .. && svn up
+
+.PHONY: logupdate
+logupdate:
+	cd .. && svn log -r HEAD:BASE && svn up
+
+.PHONY: logvupdate
+logvupdate:
+	cd .. && svn log -r HEAD:BASE -v && svn up

Modified: branches/nexuiz-2.0/data/build-compat-pack.sh
===================================================================
--- branches/nexuiz-2.0/data/build-compat-pack.sh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/build-compat-pack.sh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -23,6 +23,8 @@
 	gfx/runningman_1on1remix_mini.tga
 	gfx/runningmanctf_mini.tga
 	gfx/runningman_mini.tga
+	gfx/sb_flag_blue_shielded.tga
+	gfx/sb_flag_red_shielded.tga
 	gfx/sb_kh_full.tga
 	gfx/sb_kh_outline.tga
 	gfx/sb_playercolor_base.tga
@@ -50,6 +52,12 @@
 	models/player/visitant.zym.sounds
 	models/player/xolar.zym.sounds
 	models/portal.md3
+	models/portal.md3_0.skin
+	models/portal.md3_1.skin
+	models/portal.md3_2.skin
+	models/sprites/as-defend_frame0.tga
+	models/sprites/as-destroy_frame0.tga
+	models/sprites/as-push_frame0.tga
 	models/sprites/bluebase.tga
 	models/sprites/danger.tga
 	models/sprites/defend.tga
@@ -140,6 +148,7 @@
 	models/weapons/w_porto.zym
     models/weapons/w_seeker.zym
 	particles/particlefont.tga
+	scripts/portals.shader
 	sound/announcer/male/airshot.ogg
 	sound/announcer/male/electrobitch.ogg
 	sound/announcer/male/headshot.ogg
@@ -156,6 +165,7 @@
 	sound/kh/collect.wav
 	sound/kh/destroy.wav
 	sound/kh/drop.wav
+	sound/misc/armor10.wav
 	sound/misc/armor1.wav
 	sound/misc/armor25.wav
 	sound/misc/footstep01.wav
@@ -217,6 +227,22 @@
 	sound/player/carni-lycan/player/pain50.ogg
 	sound/player/carni-lycan/player/pain75.ogg
 	sound/player/default.sounds
+	sound/player/fricka/coms/attackinfive.ogg
+	sound/player/fricka/coms/attack.ogg
+	sound/player/fricka/coms/coverme.ogg
+	sound/player/fricka/coms/defend.ogg
+	sound/player/fricka/coms/flagseen.ogg
+	sound/player/fricka/coms/freelance1.ogg
+	sound/player/fricka/coms/freelance2.ogg
+	sound/player/fricka/coms/incoming.ogg
+	sound/player/fricka/coms/taunt1.ogg
+	sound/player/fricka/coms/taunt2.ogg
+	sound/player/fricka/coms/taunt3.ogg
+	sound/player/fricka/coms/taunt4.ogg
+	sound/player/fricka/coms/teamshoot1.ogg
+	sound/player/fricka/coms/teamshoot2.ogg
+	sound/player/fricka/coms/teamshoot3.ogg
+	sound/player/fricka/coms/waypoint.ogg
 	sound/player/fricka/player/death1.ogg
 	sound/player/fricka/player/death2.ogg
 	sound/player/fricka/player/death3.ogg
@@ -277,6 +303,7 @@
 	sound/player/marine/coms/teamshoot1.ogg
 	sound/player/marine/coms/teamshoot2.ogg
 	sound/player/marine/coms/teamshoot3.ogg
+	sound/player/marine/coms/teamshoot4.ogg
 	sound/player/marine/player/death1.ogg
 	sound/player/marine/player/death2.ogg
 	sound/player/marine/player/death3.ogg
@@ -289,6 +316,26 @@
 	sound/player/marine/player/pain25.ogg
 	sound/player/marine/player/pain50.ogg
 	sound/player/marine/player/pain75.ogg
+	sound/player/pyria-skadi/coms/attack1.ogg
+	sound/player/pyria-skadi/coms/attack2.ogg
+	sound/player/pyria-skadi/coms/attackinfive.ogg
+	sound/player/pyria-skadi/coms/coverme.ogg
+	sound/player/pyria-skadi/coms/defend.ogg
+	sound/player/pyria-skadi/coms/freelance1.ogg
+	sound/player/pyria-skadi/coms/freelance2.ogg
+	sound/player/pyria-skadi/coms/incoming.ogg
+	sound/player/pyria-skadi/coms/meet.ogg
+	sound/player/pyria-skadi/coms/needhelp1.ogg
+	sound/player/pyria-skadi/coms/seenflag.ogg
+	sound/player/pyria-skadi/coms/taunt1.ogg
+	sound/player/pyria-skadi/coms/taunt2.ogg
+	sound/player/pyria-skadi/coms/taunt3.ogg
+	sound/player/pyria-skadi/coms/taunt4.ogg
+	sound/player/pyria-skadi/coms/taunt5.ogg
+	sound/player/pyria-skadi/coms/teamshoot1.ogg
+	sound/player/pyria-skadi/coms/teamshoot2.ogg
+	sound/player/pyria-skadi/coms/teamshoot3.ogg
+	sound/player/pyria-skadi/coms/teamshoot4.ogg
 	sound/player/pyria-skadi/player/death1.ogg
 	sound/player/pyria-skadi/player/death2.ogg
 	sound/player/pyria-skadi/player/death3.ogg
@@ -330,7 +377,7 @@
 	sound/player/reptilian/player/pain25.ogg
 	sound/player/reptilian/player/pain50.ogg
 	sound/player/reptilian/player/pain75.ogg
-	sound/player/slime.ogg
+	sound/player/slime.wav
 	sound/player/soldier/coms/attackinfive.ogg
 	sound/player/soldier/coms/attack.ogg
 	sound/player/soldier/coms/coverme.ogg
@@ -376,9 +423,11 @@
 	sound/player/specop/coms/taunt1.ogg
 	sound/player/specop/coms/taunt2.ogg
 	sound/player/specop/coms/taunt3.ogg
+	sound/player/specop/coms/taunt4.ogg
 	sound/player/specop/coms/teamshoot1.ogg
 	sound/player/specop/coms/teamshoot2.ogg
 	sound/player/specop/coms/teamshoot3.ogg
+	sound/player/specop/coms/teamshoot4.ogg
 	sound/player/specop/player/death1.ogg
 	sound/player/specop/player/death2.ogg
 	sound/player/specop/player/death3.ogg
@@ -416,12 +465,25 @@
 	sound/porto/explode.ogg
 	sound/porto/fire.ogg
 	sound/porto/unsupported.ogg
+	sound/weapons/brass1.ogg
+	sound/weapons/brass2.ogg
+	sound/weapons/brass3.ogg
+	sound/weapons/casings1.ogg
+	sound/weapons/casings2.ogg
+	sound/weapons/casings3.ogg
+	sound/weapons/crylink_fire2.ogg
 	sound/weapons/crylink_fire.ogg
+	sound/weapons/crylink_impact2.ogg
+	sound/weapons/crylink_impact.ogg
 	sound/weapons/electro_bounce.ogg
 	sound/weapons/electro_fire2.ogg
 	sound/weapons/electro_fire.ogg
 	sound/weapons/electro_fly.wav
 	sound/weapons/electro_impact.ogg
+	sound/weapons/flacexp1.ogg
+	sound/weapons/flacexp2.ogg
+	sound/weapons/flacexp3.ogg
+	sound/weapons/flac_fire.ogg
 	sound/weapons/grenade_bounce1.ogg
 	sound/weapons/grenade_bounce2.ogg
 	sound/weapons/grenade_bounce3.ogg
@@ -435,6 +497,8 @@
 	sound/weapons/hagexp2.ogg
 	sound/weapons/hagexp3.ogg
 	sound/weapons/hook_fire.ogg
+	sound/weapons/hook_fire.wav
+	sound/weapons/hook_impact.wav
 	sound/weapons/lasergun_fire.ogg
 	sound/weapons/laserimpact.ogg
 	sound/weapons/minstanexfire.ogg
@@ -444,11 +508,23 @@
 	sound/weapons/rocket_fire.ogg
 	sound/weapons/rocket_fly.wav
 	sound/weapons/rocket_impact.ogg
+	sound/weapons/rocket_mode.ogg
+	sound/weapons/seekerexp1.ogg
+	sound/weapons/seekerexp2.ogg
+	sound/weapons/seekerexp3.ogg
+	sound/weapons/seeker_fire.ogg
 	sound/weapons/shotgun_fire.ogg
 	sound/weapons/strength_fire.ogg
+	sound/weapons/tagexp1.ogg
+	sound/weapons/tagexp2.ogg
+	sound/weapons/tagexp3.ogg
+	sound/weapons/tag_fire.ogg
+	sound/weapons/tag_impact.ogg
+	sound/weapons/tag_rocket_fly.wav
 	sound/weapons/uzi_fire.ogg
 	sound/weapons/weaponpickup.ogg
 	sound/weapons/weapon_switch.ogg
+	textures/hlac.tga
 	textures/hookgun_gloss.tga
 	textures/hookgun_norm.tga
 	textures/hookgun_pants.tga
@@ -463,6 +539,23 @@
 	textures/portalgun_glow.tga
 	textures/portalgun_norm.tga
 	textures/portalgun.tga
+	textures/portals/portals_blue_gloss.tga
+	textures/portals/portals_blue_glow.tga
+	textures/portals/portals_blue_norm.tga
+	textures/portals/portals_blue.tga
+	textures/portals/portals_blue_vortex.tga
+	textures/portals/portals_inactive.tga
+	textures/portals/portals_inactive_vortex.tga
+	textures/portals/portals_red_gloss.tga
+	textures/portals/portals_red_glow.tga
+	textures/portals/portals_red_norm.tga
+	textures/portals/portals_red.tga
+	textures/portals/portals_red_vortex.tga
+	textures/seeker_gloss.tga
+	textures/seeker_glow.tga
+	textures/seeker_norm.tga
+	textures/seeker_pants.tga
+	textures/seeker.tga
 "
 
 rev=`svnversion`

Modified: branches/nexuiz-2.0/data/ctfscoring-div0.cfg
===================================================================
--- branches/nexuiz-2.0/data/ctfscoring-div0.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/ctfscoring-div0.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,7 +1,9 @@
-set g_ctf_flagscore_pickup_base                  -1
+// Scoring from the democratic poll at http://www.alientrap.org/forum/viewtopic.php?p=49529#49529
+
+set g_ctf_flagscore_pickup_base                  -3
 set g_ctf_flagscore_pickup_dropped_early          2
 set g_ctf_flagscore_pickup_dropped_late           2
-set g_ctf_flagscore_capture                      25
+set g_ctf_flagscore_capture                      28
 set g_ctf_flagscore_kill                          3
 set g_ctf_flagpenalty_drop                        2
 set g_ctf_flagpenalty_suicidedrop                 2
@@ -10,16 +12,17 @@
 set g_ctf_flagscore_return_rogue                 10
 set g_ctf_flagscore_return_by_killer              5
 set g_ctf_flagscore_return_rogue_by_killer       10
-// succeeded capture (pickup capture)            24 (0 for enemy)
-// failed capture (pickup kill drop return)      -4 (8 for enemy)
+
+// succeeded capture (pickup capture)            25 (0 for enemy)
+// failed capture (pickup kill drop return)      -6 (8 for enemy)
 // failed (shot into void) (pickup kill drop)    -4 (3 for enemy)
 // capture retry (kill drop pickup)               0 (3 for enemy)
 // suicide, then retake (suicidedrop pickup)      0 (0 for enemy)
 
-set g_ctf_personalscore_pickup_base                  -1
+set g_ctf_personalscore_pickup_base                  -3
 set g_ctf_personalscore_pickup_dropped_early          2
 set g_ctf_personalscore_pickup_dropped_late           2
-set g_ctf_personalscore_capture                      25
+set g_ctf_personalscore_capture                      28
 set g_ctf_personalscore_kill                          3
 set g_ctf_personalpenalty_drop                        2
 set g_ctf_personalpenalty_suicidedrop                 2

Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -138,8 +138,7 @@
 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
-	if_dedicated set g_warmup 1
+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
@@ -285,7 +284,7 @@
 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
+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
@@ -395,6 +394,10 @@
 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
                                                
 exec ctfscoring-nex242.cfg
 
@@ -719,7 +722,10 @@
 bind kp_minus "+userbind 17"
 
 // these commands can be voted
-set sv_vote_commands "restart timelimit fraglimit chmap gotomap g_grappling_hook sv_defaultplayer_fbskin_green sv_defaultplayer_fbskin_red sv_defaultplayer_fbskin_orange sv_defaultplayer_fbskin_off endmatch reducematchtime extendmatchtime allready"
+set sv_vote_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick"
+set sv_vote_only_commands ""
+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
@@ -762,11 +768,6 @@
 alias spec "cmd spectate"
 bind F3 spec
 
-// alias for switching the teamselect menu
-alias menu_showteamselect "menu_cmd directmenu TeamSelect"
-alias menu_sync "menu_cmd sync"
-bind f5 menu_showteamselect
-
 // NixNex (No-Items x Nexuiz) - at each time, everyone uses the same weapon,
 // and in regular intervals, this weapon is cycled
 set g_nixnex 0
@@ -1013,6 +1014,9 @@
 seta menu_slist_showfull 1
 seta menu_slist_showempty 1
 
+// 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
 
@@ -1076,6 +1080,8 @@
 
 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 $*"
 
 // force fog for people who turn it off in game (set this to like 5 if you suspect people are "cheating" that way)
 set sv_foginterval 0
@@ -1169,6 +1175,7 @@
 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
+	if_dedicated set g_start_delay 15
 
 alias ons_map           "cl_cmd radar" // legacy alias
 alias radar             "cl_cmd radar"
@@ -1181,4 +1188,36 @@
 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 cl_handicap 1 // the higher, the more damage you will receive (client setting)
+
 exec turrets.cfg
+
+// must be at the bottom of this file:
+// alias for switching the teamselect menu
+alias menu_showteamselect "menu_cmd directmenu TeamSelect"
+alias menu_sync "menu_cmd sync"
+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_touchexplode 0
+set g_touchexplode_radius 50
+set g_touchexplode_damage 10
+set g_touchexplode_edgedamage 0
+set g_touchexplode_force 150

Modified: branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/default/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '0.7 0.7 1'
 COLOR_DIALOG_WEAPONS            '1 0.7 0.7'
 COLOR_DIALOG_RADAR              '0.7 0.7 1'
+COLOR_DIALOG_SERVERINFO         '0.7 0.7 1'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.4 0.4 0.7'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.4 0.4 0.7'

Modified: branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '0.7 0.7 1'
 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'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.2 0.7 0.2'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.4 0.4 0.7'

Modified: branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/simplygray/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '0.7 0.7 0.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'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0 0.9 0.9'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.4 0.4 0.7'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblack/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_WEAPONS            '1 0.7 0.7'
 COLOR_DIALOG_RADAR              '1 1 1'
 COLOR_DIALOG_CREDITS            '1 1 1'
+COLOR_DIALOG_SERVERINFO         '1 1 1'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.9 0.9 0.9'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedblue/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '0.5 0.75 1'
 COLOR_DIALOG_WEAPONS            '0.5 0.75 1'
 COLOR_DIALOG_RADAR              '0.5 0.75 1'
+COLOR_DIALOG_SERVERINFO         '0.5 0.75 1'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.5 0.75 1'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedgreen/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '0.5 1 0'
 COLOR_DIALOG_WEAPONS            '0.5 1 0'
 COLOR_DIALOG_RADAR              '0.5 1 0'
+COLOR_DIALOG_SERVERINFO         '0.5 1 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.5 1 0'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedred/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '1 0 0'
 COLOR_DIALOG_WEAPONS            '1 0 0'
 COLOR_DIALOG_RADAR              '1 0 0'
+COLOR_DIALOG_SERVERINFO         '1 0 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '1 0 0'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedwhite/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '1 1 1'
 COLOR_DIALOG_WEAPONS            '1 1 1'
 COLOR_DIALOG_RADAR              '1 1 1'
+COLOR_DIALOG_SERVERINFO         '1 1 1'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.9 0.9 0.9'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedyellow/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '1 0.875 0'
 COLOR_DIALOG_WEAPONS            '1 0.875 0'
 COLOR_DIALOG_RADAR              '1 0.875 0'
+COLOR_DIALOG_SERVERINFO         '1 0.875 0'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '1 0.875 0'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/wickedz/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -34,6 +34,7 @@
 COLOR_DIALOG_CREDITS            '0.4 0.8 0.9'
 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'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -173,6 +174,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.6 0.4 0.1'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.75 0.75 0.75'

Modified: branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/gfx/menu/xaw/skinvalues.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -20,6 +20,7 @@
 COLOR_DIALOG_CREDITS            '1 1 1'
 COLOR_DIALOG_WEAPONS            '1 1 1'
 COLOR_DIALOG_RADAR              '1 1 1'
+COLOR_DIALOG_SERVERINFO         '1 1 1'
 
 // nexposee positions of windows (they are the scale transformation
 // centers, NOT the actual positions of the windows!)
@@ -159,6 +160,10 @@
 ALPHA_SERVERLIST_FAVORITE       0.8
 COLOR_SERVERLIST_FAVORITE       '1 1 1'
 
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0 0 0'
+
 // item: skin list
 COLOR_SKINLIST_TITLE            '1 1 1'
 COLOR_SKINLIST_AUTHOR           '0.5 0.5 0.5'

Modified: branches/nexuiz-2.0/data/gfx/sb_kh_full.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/sb_kh_outline.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/sb_playercolor_pants.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/gfx/sb_playercolor_shirt.tga
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/high.cfg
===================================================================
--- branches/nexuiz-2.0/data/high.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/high.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 4
 cl_nogibs 0
 cl_particles_quality 1
 gl_picmip 0

Modified: branches/nexuiz-2.0/data/low.cfg
===================================================================
--- branches/nexuiz-2.0/data/low.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/low.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 2
 cl_nogibs 0
 cl_particles_quality 0.20
 gl_flashblend 1

Modified: branches/nexuiz-2.0/data/med.cfg
===================================================================
--- branches/nexuiz-2.0/data/med.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/med.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 2
 cl_nogibs 0
 cl_particles_quality 0.5
 gl_picmip 2

Modified: branches/nexuiz-2.0/data/models/player/carni.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/carni.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/carni.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: carni-lycan
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/carni-lycan/coms/attack 0
-//attackinfive sound/player/carni-lycan/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/carni-lycan/coms/attackinfive 0
 coverme sound/player/carni-lycan/coms/coverme 0
 defend sound/player/carni-lycan/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/carni-lycan/coms/freelance 2
-//incoming sound/player/carni-lycan/incoming 0
-//meet sound/player/carni-lycan/waypoint 0
-//needhelp sound/player/carni-lycan/needhelp 0
-//seenflag sound/player/carni-lycan/flagseen 0
-//taunt sound/player/carni-lycan/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/carni-lycan/coms/incoming 0
+meet sound/player/carni-lycan/coms/meet 0
+needhelp sound/player/carni-lycan/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/carni-lycan/coms/seenflag 0
+taunt sound/player/carni-lycan/coms/taunt 3
 teamshoot sound/player/carni-lycan/coms/teamshoot 3
 death sound/player/carni-lycan/player/death 3
 drown sound/player/carni-lycan/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/carni-lycan/player/falling 0
 gasp sound/player/carni-lycan/player/gasp 0
 jump sound/player/carni-lycan/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/carni-lycan/player/pain50 0
 pain75 sound/player/carni-lycan/player/pain75 0
 pain100 sound/player/carni-lycan/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/headhunter.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/headhunter.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/headhunter.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: carni-lycan
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/carni-lycan/coms/attack 0
-//attackinfive sound/player/carni-lycan/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/carni-lycan/coms/attackinfive 0
 coverme sound/player/carni-lycan/coms/coverme 0
 defend sound/player/carni-lycan/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/carni-lycan/coms/freelance 2
-//incoming sound/player/carni-lycan/incoming 0
-//meet sound/player/carni-lycan/waypoint 0
-//needhelp sound/player/carni-lycan/needhelp 0
-//seenflag sound/player/carni-lycan/flagseen 0
-//taunt sound/player/carni-lycan/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/carni-lycan/coms/incoming 0
+meet sound/player/carni-lycan/coms/meet 0
+needhelp sound/player/carni-lycan/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/carni-lycan/coms/seenflag 0
+taunt sound/player/carni-lycan/coms/taunt 3
 teamshoot sound/player/carni-lycan/coms/teamshoot 3
 death sound/player/carni-lycan/player/death 3
 drown sound/player/carni-lycan/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/carni-lycan/player/falling 0
 gasp sound/player/carni-lycan/player/gasp 0
 jump sound/player/carni-lycan/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/carni-lycan/player/pain50 0
 pain75 sound/player/carni-lycan/player/pain75 0
 pain100 sound/player/carni-lycan/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/insurrectionist.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/insurrectionist.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/insurrectionist.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: insurrectionist
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/insurrectionist/coms/attack 0
-//attackinfive sound/player/insurrectionist/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/insurrectionist/coms/attackinfive 0
 coverme sound/player/insurrectionist/coms/coverme 0
 defend sound/player/insurrectionist/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/insurrectionist/coms/freelance 2
-//incoming sound/player/insurrectionist/incoming 0
-//meet sound/player/insurrectionist/waypoint 0
-//needhelp sound/player/insurrectionist/needhelp 0
-//seenflag sound/player/insurrectionist/flagseen 0
-//taunt sound/player/insurrectionist/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/insurrectionist/coms/incoming 0
+meet sound/player/insurrectionist/coms/meet 0
+needhelp sound/player/insurrectionist/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/insurrectionist/coms/seenflag 0
+taunt sound/player/insurrectionist/coms/taunt 4
 teamshoot sound/player/insurrectionist/coms/teamshoot 3
 death sound/player/insurrectionist/player/death 3
 drown sound/player/insurrectionist/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/insurrectionist/player/falling 0
 gasp sound/player/insurrectionist/player/gasp 0
 jump sound/player/insurrectionist/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/insurrectionist/player/pain50 0
 pain75 sound/player/insurrectionist/player/pain75 0
 pain100 sound/player/insurrectionist/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/lurk.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/lurk.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/lurk.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: reptilian
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/reptilian/coms/attack 0
-//attackinfive sound/player/reptilian/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/reptilian/coms/attackinfive 0
 coverme sound/player/reptilian/coms/coverme 0
 defend sound/player/reptilian/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/reptilian/coms/freelance 2
-//incoming sound/player/reptilian/incoming 0
-//meet sound/player/reptilian/waypoint 0
-//needhelp sound/player/reptilian/needhelp 0
-//seenflag sound/player/reptilian/flagseen 0
-//taunt sound/player/reptilian/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/reptilian/coms/incoming 0
+meet sound/player/reptilian/coms/meet 0
+needhelp sound/player/reptilian/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/reptilian/coms/seenflag 0
+taunt sound/player/reptilian/coms/taunt 3
 teamshoot sound/player/reptilian/coms/teamshoot 3
 death sound/player/reptilian/player/death 3
 drown sound/player/reptilian/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/reptilian/player/falling 0
 gasp sound/player/reptilian/player/gasp 0
 jump sound/player/reptilian/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/reptilian/player/pain50 0
 pain75 sound/player/reptilian/player/pain75 0
 pain100 sound/player/reptilian/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/lycanthrope.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/lycanthrope.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/lycanthrope.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: carni-lycan
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/carni-lycan/coms/attack 0
-//attackinfive sound/player/carni-lycan/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/carni-lycan/coms/attackinfive 0
 coverme sound/player/carni-lycan/coms/coverme 0
 defend sound/player/carni-lycan/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/carni-lycan/coms/freelance 2
-//incoming sound/player/carni-lycan/incoming 0
-//meet sound/player/carni-lycan/waypoint 0
-//needhelp sound/player/carni-lycan/needhelp 0
-//seenflag sound/player/carni-lycan/flagseen 0
-//taunt sound/player/carni-lycan/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/carni-lycan/coms/incoming 0
+meet sound/player/carni-lycan/coms/meet 0
+needhelp sound/player/carni-lycan/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/carni-lycan/coms/seenflag 0
+taunt sound/player/carni-lycan/coms/taunt 3
 teamshoot sound/player/carni-lycan/coms/teamshoot 3
 death sound/player/carni-lycan/player/death 3
 drown sound/player/carni-lycan/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/carni-lycan/player/falling 0
 gasp sound/player/carni-lycan/player/gasp 0
 jump sound/player/carni-lycan/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/carni-lycan/player/pain50 0
 pain75 sound/player/carni-lycan/player/pain75 0
 pain100 sound/player/carni-lycan/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/marine.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/marine.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/marine.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: marine
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/marine/coms/attack 0
+//attacking sound/player/carni-lycan/player/attacking 0
 attackinfive sound/player/marine/coms/attackinfive 0
 coverme sound/player/marine/coms/coverme 0
 defend sound/player/marine/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/marine/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
 incoming sound/player/marine/coms/incoming 0
-//meet sound/player/marine/waypoint 0
+meet sound/player/marine/coms/meet 0
 needhelp sound/player/marine/coms/needhelp 2
-//seenflag sound/player/marine/coms/flagseen 0
-taunt sound/player/marine/coms/taunt 1
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/marine/coms/seenflag 0
+taunt sound/player/marine/coms/taunt 3
 teamshoot sound/player/marine/coms/teamshoot 4
 death sound/player/marine/player/death 3
 drown sound/player/marine/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/marine/player/fall 1
 gasp sound/player/marine/player/gasp 0
 jump sound/player/marine/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/marine/player/pain50 0
 pain75 sound/player/marine/player/pain75 0
 pain100 sound/player/marine/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: soldier
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/soldier/coms/attack 0
-//attackinfive sound/player/soldier/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/soldier/coms/attackinfive 0
 coverme sound/player/soldier/coms/coverme 0
 defend sound/player/soldier/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/soldier/coms/freelance 2
-//incoming sound/player/soldier/incoming 0
-//meet sound/player/soldier/waypoint 0
-//needhelp sound/player/soldier/needhelp 0
-//seenflag sound/player/soldier/flagseen 0
-//taunt sound/player/soldier/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+//incoming sound/player/soldier/coms/incoming 0
+meet sound/player/soldier/coms/meet 0
+needhelp sound/player/soldier/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/soldier/coms/seenflag 0
+taunt sound/player/soldier/coms/taunt 3
 teamshoot sound/player/soldier/coms/teamshoot 3
 death sound/player/soldier/player/death 3
 drown sound/player/soldier/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/soldier/player/falling 0
 gasp sound/player/soldier/player/gasp 0
 jump sound/player/soldier/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/soldier/player/pain50 0
 pain75 sound/player/soldier/player/pain75 0
 pain100 sound/player/soldier/player/pain100 0
-//

Modified: branches/nexuiz-2.0/data/models/player/pyria.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/pyria.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/pyria.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
-//attack sound/player/pyria-skadi/coms/attack 0
-//attackinfive sound/player/pyria-skadi/letsgo 0
+//TAG: pyria-skadi
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/pyria-skadi/coms/attack 2
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/pyria-skadi/coms/attackinfive 0
 //coverme sound/player/pyria-skadi/coms/coverme 0
 //defend sound/player/pyria-skadi/coms/defend 0
-//freelance sound/player/pyria-skadi/coms/freelance 2
-//incoming sound/player/pyria-skadi/incoming 0
-//meet sound/player/pyria-skadi/waypoint 0
-//needhelp sound/player/pyria-skadi/needhelp 0
-//seenflag sound/player/pyria-skadi/flagseen 0
-//taunt sound/player/pyria-skadi/player/taunt 1
-//teamshoot sound/player/pyria-skadi/coms/teamshoot 3
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
+freelance sound/player/pyria-skadi/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
+//incoming sound/player/pyria-skadi/coms/incoming 0
+meet sound/player/pyria-skadi/coms/meet 0
+needhelp sound/player/pyria-skadi/coms/needhelp 1
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/pyria-skadi/coms/seenflag 0
+taunt sound/player/pyria-skadi/coms/taunt 5
+teamshoot sound/player/pyria-skadi/coms/teamshoot 4
 death sound/player/pyria-skadi/player/death 3
 drown sound/player/pyria-skadi/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/pyria-skadi/player/falling 0
 gasp sound/player/pyria-skadi/player/gasp 0
 jump sound/player/pyria-skadi/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/pyria-skadi/player/pain50 0
 pain75 sound/player/pyria-skadi/player/pain75 0
 pain100 sound/player/pyria-skadi/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/shock.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/shock.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/shock.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: marine
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/marine/coms/attack 0
+//attacking sound/player/carni-lycan/player/attacking 0
 attackinfive sound/player/marine/coms/attackinfive 0
 coverme sound/player/marine/coms/coverme 0
 defend sound/player/marine/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/marine/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
 incoming sound/player/marine/coms/incoming 0
-//meet sound/player/marine/waypoint 0
+meet sound/player/marine/coms/meet 0
 needhelp sound/player/marine/coms/needhelp 2
-//seenflag sound/player/marine/coms/flagseen 0
-taunt sound/player/marine/coms/taunt 1
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/marine/coms/seenflag 0
+taunt sound/player/marine/coms/taunt 3
 teamshoot sound/player/marine/coms/teamshoot 4
 death sound/player/marine/player/death 3
 drown sound/player/marine/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/marine/player/fall 1
 gasp sound/player/marine/player/gasp 0
 jump sound/player/marine/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/marine/player/pain50 0
 pain75 sound/player/marine/player/pain75 0
 pain100 sound/player/marine/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/skadi.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/skadi.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/skadi.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
-//attack sound/player/pyria-skadi/coms/attack 0
-//attackinfive sound/player/pyria-skadi/letsgo 0
+//TAG: pyria-skadi
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/pyria-skadi/coms/attack 2
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/pyria-skadi/coms/attackinfive 0
 //coverme sound/player/pyria-skadi/coms/coverme 0
 //defend sound/player/pyria-skadi/coms/defend 0
-//freelance sound/player/pyria-skadi/coms/freelance 2
-//incoming sound/player/pyria-skadi/incoming 0
-//meet sound/player/pyria-skadi/waypoint 0
-//needhelp sound/player/pyria-skadi/needhelp 0
-//seenflag sound/player/pyria-skadi/flagseen 0
-//taunt sound/player/pyria-skadi/player/taunt 1
-//teamshoot sound/player/pyria-skadi/coms/teamshoot 3
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
+freelance sound/player/pyria-skadi/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
+//incoming sound/player/pyria-skadi/coms/incoming 0
+meet sound/player/pyria-skadi/coms/meet 0
+needhelp sound/player/pyria-skadi/coms/needhelp 1
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/pyria-skadi/coms/seenflag 0
+taunt sound/player/pyria-skadi/coms/taunt 5
+teamshoot sound/player/pyria-skadi/coms/teamshoot 4
 death sound/player/pyria-skadi/player/death 3
 drown sound/player/pyria-skadi/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/pyria-skadi/player/falling 0
 gasp sound/player/pyria-skadi/player/gasp 0
 jump sound/player/pyria-skadi/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/pyria-skadi/player/pain50 0
 pain75 sound/player/pyria-skadi/player/pain75 0
 pain100 sound/player/pyria-skadi/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/specop.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/specop.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/specop.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: specop
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/specop/coms/attack 0
-//attackinfive sound/player/specop/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/specop/coms/attackinfive 0
 coverme sound/player/specop/coms/coverme 0
 defend sound/player/specop/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/specop/coms/freelance 2
-//incoming sound/player/specop/incoming 0
-//meet sound/player/specop/waypoint 0
-//needhelp sound/player/specop/needhelp 0
-//seenflag sound/player/specop/flagseen 0
-//taunt sound/player/specop/player/taunt 1
-teamshoot sound/player/specop/coms/teamshoot 3
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/specop/coms/incoming 0
+meet sound/player/specop/coms/meet 0
+needhelp sound/player/specop/coms/needhelp 1
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/specop/coms/seenflag 0
+taunt sound/player/specop/coms/taunt 4
+teamshoot sound/player/specop/coms/teamshoot 4
 death sound/player/specop/player/death 3
 drown sound/player/specop/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/specop/player/falling 0
 gasp sound/player/specop/player/gasp 0
 jump sound/player/specop/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/specop/player/pain50 0
 pain75 sound/player/specop/player/pain75 0
 pain100 sound/player/specop/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/visitant.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/visitant.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/visitant.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
-//attack sound/player/fricka/coms/attack 0
-//attackinfive sound/player/fricka/letsgo 0
+//TAG: fricka
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/fricka/coms/attack 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/fricka/coms/attackinfive 0
 //coverme sound/player/fricka/coms/coverme 0
-//defend sound/player/fricka/coms/defend 0
-//freelance sound/player/fricka/coms/freelance 2
-//incoming sound/player/fricka/incoming 0
-//meet sound/player/fricka/waypoint 0
-//needhelp sound/player/fricka/needhelp 0
-//seenflag sound/player/fricka/flagseen 0
-//taunt sound/player/fricka/player/taunt 1
-//teamshoot sound/player/fricka/coms/teamshoot 3
+defend sound/player/fricka/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
+freelance sound/player/fricka/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
+incoming sound/player/fricka/coms/incoming 0
+meet sound/player/fricka/coms/waypoint 0
+//needhelp sound/player/fricka/coms/needhelp 0
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/fricka/coms/flagseen 0
+taunt sound/player/fricka/coms/taunt 4
+teamshoot sound/player/fricka/coms/teamshoot 3
 death sound/player/fricka/player/death 3
 drown sound/player/fricka/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/fricka/player/falling 0
 gasp sound/player/fricka/player/gasp 0
 jump sound/player/fricka/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/fricka/player/pain50 0
 pain75 sound/player/fricka/player/pain75 0
 pain100 sound/player/fricka/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/xolar.zym.sounds
===================================================================
--- branches/nexuiz-2.0/data/models/player/xolar.zym.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/player/xolar.zym.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,28 @@
+//TAG: soldier
+//affirmative sound/player/carni-lycan/player/affirmative 0
 attack sound/player/soldier/coms/attack 0
-//attackinfive sound/player/soldier/letsgo 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/soldier/coms/attackinfive 0
 coverme sound/player/soldier/coms/coverme 0
 defend sound/player/soldier/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
 freelance sound/player/soldier/coms/freelance 2
-//incoming sound/player/soldier/incoming 0
-//meet sound/player/soldier/waypoint 0
-//needhelp sound/player/soldier/needhelp 0
-//seenflag sound/player/soldier/flagseen 0
-//taunt sound/player/soldier/player/taunt 1
+//getflag sound/player/carni-lycan/player/getflag 0
+//incoming sound/player/soldier/coms/incoming 0
+meet sound/player/soldier/coms/meet 0
+needhelp sound/player/soldier/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/soldier/coms/seenflag 0
+taunt sound/player/soldier/coms/taunt 3
 teamshoot sound/player/soldier/coms/teamshoot 3
 death sound/player/soldier/player/death 3
 drown sound/player/soldier/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
 falling sound/player/soldier/player/falling 0
 gasp sound/player/soldier/player/gasp 0
 jump sound/player/soldier/player/jump 0
@@ -18,4 +30,3 @@
 pain50 sound/player/soldier/player/pain50 0
 pain75 sound/player/soldier/player/pain75 0
 pain100 sound/player/soldier/player/pain100 0
-//
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/portal.md3
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/models/sprites/make-sprites.sh
===================================================================
--- branches/nexuiz-2.0/data/models/sprites/make-sprites.sh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/models/sprites/make-sprites.sh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -130,13 +130,19 @@
 		shift
 		shift
 		pngsprite "${name}_frame$frame" "$color" "$bgcolor" "$text"
+		convert "${name}_frame$frame.png" "${name}_frame$frame.tga"
 		args="$args -sprite ${name}_frame$frame.png $(($sprwidth / 2)) $(($sprheight - 1)) $interval"
 		frame=$(($frame + 1))
 	done
 	./makespr32 -o "$name.sp2" -proj 5 -group $args
 }
 
+sprite as-push            "PUSH"          ff8000 000000 0.0
+sprite as-destroy         "DESTROY"       ff8000 000000 0.0
+sprite as-defend          "DEFEND"        0080ff 000000 0.0
 sprite bluebase           "BLUE BASE"     0000ff 000000 0.0
+sprite bluebase           "BLUE BASE"     0000ff 000000 0.0
+sprite bluebase           "BLUE BASE"     0000ff 000000 0.0
 sprite danger             "DANGER"        ff0000 ffff00 0.0
 sprite flagcarrier        "FLAG CARRIER"  ffff00 000000 0.0
 sprite helpme             "HELP ME"       ffff00 ff0000 0.0

Modified: branches/nexuiz-2.0/data/mutator_reset.cfg
===================================================================
--- branches/nexuiz-2.0/data/mutator_reset.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/mutator_reset.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -8,6 +8,7 @@
 set g_nixnex_with_laser 0
 set g_norecoil 0
 set g_weaponarena 0
+set g_weapon_stay 0
 set g_vampire 0
 set g_race_qualifying 2
 set slowmo 1.0

Modified: branches/nexuiz-2.0/data/nexuiz-credits.txt
===================================================================
--- branches/nexuiz-2.0/data/nexuiz-credits.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/nexuiz-credits.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -6,16 +6,19 @@
 Forest "LordHavoc" Hale
 *Lead Programmer and Co-Designer
 
-SavageX
-*Project Maintainer
-
 Rudolf "div0" Polzer
 *Programmer
 
 
+**Project maintainers:
 
-**Development Team
+Kristian "morfar" Johansson
 
+SavageX
+
+
+**Development Team:
+
 Andreas "Black" Kirsch
 *Programmer
 
@@ -35,7 +38,7 @@
 *Web Developer and Interaction Designer
 
 Michael "Tenshihan" Quinn
-*Sound FX
+*Sound FX and Player-Voices
 
 
 
@@ -92,7 +95,6 @@
 Attila "WW3" Houtkooper
 GreEn`mArine
 Dan "Digger" Korostelev
-Kristian "morfar" Johansson
 leileilol
 Jody Gallagher
 Donkey
@@ -132,4 +134,5 @@
 FruitieX
 Edward "Ed" Holness
 MirceaKitsune
-ROnan
+Ronan
+Shaggy

Modified: branches/nexuiz-2.0/data/normal.cfg
===================================================================
--- branches/nexuiz-2.0/data/normal.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/normal.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 2
 cl_nogibs 0
 cl_particles_quality 0.5
 gl_picmip 1

Modified: branches/nexuiz-2.0/data/omg.cfg
===================================================================
--- branches/nexuiz-2.0/data/omg.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/omg.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
-cl_decals 1
+cl_decals 0
+cl_decals_time 2
 cl_nogibs 0
 cl_particles_quality 0.20
 gl_flashblend 1

Modified: branches/nexuiz-2.0/data/physicsPro.cfg
===================================================================
--- branches/nexuiz-2.0/data/physicsPro.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/physicsPro.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -4,7 +4,7 @@
 sv_accelerate 10
 sv_airaccelerate 1
 sv_friction 6
-edgefriction 0
+edgefriction 1
 sv_stepheight 34 // this is for Nexuiz maps, Quake3 used 18
 set sv_jumpvelocity 270
 set sv_friction_on_land 0

Modified: branches/nexuiz-2.0/data/qcsrc/client/Defs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/Defs.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -59,7 +59,7 @@
 void()		CSQC_Init;
 void()		CSQC_Shutdown;
 float(float f, float t, float n)	CSQC_InputEvent;
-void()		CSQC_UpdateView;
+void(float w, float h)		CSQC_UpdateView;
 float(string s)	CSQC_ConsoleCommand;
 
 //these fields are read and set by the default player physics

Modified: branches/nexuiz-2.0/data/qcsrc/client/View.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/View.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/View.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -175,7 +175,7 @@
 
 	float frustumx, frustumy, fovx, fovy;
 	frustumy = tan(fov * 0.00872664625997164788) * 0.75 * current_viewzoom;
-	frustumx = frustumy * vid_width / vid_height / cvar("vid_pixelheight");
+	frustumx = frustumy * vid_width / vid_height / vid_pixelheight;
 	fovx = atan2(frustumx, 1) / 0.00872664625997164788;
 	fovy = atan2(frustumy, 1) / 0.00872664625997164788;
 
@@ -189,11 +189,13 @@
 void PostInit(void);
 float Sbar_WouldDrawScoreboard ();
 float zoomscript_caught;
-void CSQC_UpdateView(void)
+void CSQC_UpdateView(float w, float h)
 {
 	entity e;
 	float fov;
 	float f;
+	vector v1, v2;
+
 	dprint_load();
 	WaypointSprite_Load();
 
@@ -205,23 +207,24 @@
 	view_right = v_right;
 	view_up = v_up;
 
-#if 0
-	if(cs_project_is_b0rked)
+	f = floor(cvar("v_flipped"));
+	cvar_set("v_flipped", ftos(!f));
+	v1 = cs_unproject('-100 -100 1000');
+	cvar_set("v_flipped", ftos(f));
+	v2 = cs_unproject('-100 -100 1000');
+
+	if(v1 == v2)
 	{
-#endif
+		// non-supporting engine
 		vid_width = cvar("vid_width");
 		vid_height = cvar("vid_height");
-#if 0
 	}
 	else
 	{
-		// THIS IS BROKEN if you had just shot (kicktime)
-		vector v;
-		v = cs_project(view_origin + 1024 * view_forward);
-		vid_width = floor(v_x * 2 + 0.5);
-		vid_height = floor(v_y * 2 + 0.5);
+		// supporting engine
+		vid_width = w;
+		vid_height = h;
 	}
-#endif
 
 	Fog_Force();
 
@@ -289,6 +292,7 @@
 	// Set the console size vars
 	vid_conwidth = cvar("vid_conwidth");
 	vid_conheight = cvar("vid_conheight");
+	vid_pixelheight = cvar("vid_pixelheight");
 
 	// fetch this one only once per frame
 	sbar_showbinds = cvar("sbar_showbinds");

Modified: branches/nexuiz-2.0/data/qcsrc/client/main.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/main.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/main.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -139,4 +139,4 @@
 float current_zoomfraction;
 
 float cs_project_is_b0rked;
-float vid_width, vid_height;
+float vid_width, vid_height, vid_pixelheight;

Modified: branches/nexuiz-2.0/data/qcsrc/client/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/progs.src	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/progs.src	2008-11-27 13:33:46 UTC (rev 5122)
@@ -7,6 +7,7 @@
 ../common/constants.qh
 csqc_builtins.qc
 ../common/util.qh
+../common/items.qh
 
 ../common/mapinfo.qh
 interpolate.qh
@@ -37,3 +38,4 @@
 ../common/util.qc
 ../common/gamecommand.qc
 ../common/mapinfo.qc
+../common/items.qc

Modified: branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -355,7 +355,7 @@
 string Sbar_DefaultColumnLayout()
 {
 	return strcat( // fteqcc sucks
-		"ping pl color name | ",
+		"ping pl name | ",
 		"+noteams/kills +noteams/deaths +noteams/suicides -noteams,tdm/frags ", // tdm already has this in "score"
 		"+kh/caps +kh/pushes +kh/destroyed ",
 		"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
@@ -1781,8 +1781,8 @@
 	vector pos;
 	
 	stat_items = getstati(STAT_ITEMS);
-	redflag = (stat_items/32768) & 3;
-	blueflag = (stat_items/131072) & 3;
+	redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
+	blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
 
 	/**
 	 * FTEQCC BUG!
@@ -1814,6 +1814,10 @@
 	case 1: drawpic(pos, "gfx/sb_flag_red_taken", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
 	case 2: drawpic(pos, "gfx/sb_flag_red_lost", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
 	case 3: drawpic(pos, "gfx/sb_flag_red_carrying", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
+	default:
+		if(stat_items & IT_CTF_SHIELDED)
+			if(myteam == COLOR_TEAM2)
+				drawpic(pos, "gfx/sb_flag_red_shielded", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
 	}
 
 	pos_y -= 64;
@@ -1823,5 +1827,9 @@
 	case 1: drawpic(pos, "gfx/sb_flag_blue_taken", '0 0 0', '1 1 1', 1, 0); break;
 	case 2: drawpic(pos, "gfx/sb_flag_blue_lost", '0 0 0', '1 1 1', 1, 0); break;
 	case 3: drawpic(pos, "gfx/sb_flag_blue_carrying", '0 0 0', '1 1 1', 1, 0); break;
+	default:
+		if(stat_items & IT_CTF_SHIELDED)
+			if(myteam == COLOR_TEAM1)
+				drawpic(pos, "gfx/sb_flag_blue_shielded", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/client/teamradar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/teamradar.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/teamradar.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -4,6 +4,7 @@
 vector teamradar_size2d; // 2D size
 float teamradar_size; // 2D scale factor
 float cl_teamradar_scale; // window size = ...qu
+float v_flipped;
 
 float vlen_maxnorm2d(vector v)
 {
@@ -33,6 +34,8 @@
 	out_y = - out_y; // screen space is reversed
 
 	out = out * teamradar_size;
+	if(v_flipped)
+		out_x = -out_x;
 	out += teamradar_origin2d;
 	return out;
 }
@@ -61,10 +64,20 @@
 			R_BeginPolygon(minimapname, DRAWFLAG_SCREEN | DRAWFLAG_MIPMAP);
 		else
 			R_BeginPolygon(minimapname, DRAWFLAG_ADDITIVE);
-		R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord0), yinvert(mi_pictexcoord0), '1 1 1', fg);
-		R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord1), yinvert(mi_pictexcoord1), '1 1 1', fg);
-		R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord2), yinvert(mi_pictexcoord2), '1 1 1', fg);
-		R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord3), yinvert(mi_pictexcoord3), '1 1 1', fg);
+		if(v_flipped)
+		{
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord3), yinvert(mi_pictexcoord3), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord2), yinvert(mi_pictexcoord2), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord1), yinvert(mi_pictexcoord1), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord0), yinvert(mi_pictexcoord0), '1 1 1', fg);
+		}
+		else
+		{
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord0), yinvert(mi_pictexcoord0), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord1), yinvert(mi_pictexcoord1), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord2), yinvert(mi_pictexcoord2), '1 1 1', fg);
+			R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord3), yinvert(mi_pictexcoord3), '1 1 1', fg);
+		}
 		R_EndPolygon();
 	}
 }
@@ -76,6 +89,12 @@
 	coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord3d));
 
 	makevectors(pangles - '0 1 0' * teamradar_angle);
+	if(v_flipped)
+	{
+		v_forward_x = -v_forward_x;
+		v_right_x = -v_right_x;
+		v_up_x = -v_up_x;
+	}
 	v_forward_z = 0;
 	v_forward = normalize(v_forward);
 	v_forward_y *= -1.0;
@@ -102,20 +121,28 @@
 	R_EndPolygon();
 };
 
-void draw_teamradar_icon(vector coord, float icon, float pingtime, vector rgb, float a)
+void draw_teamradar_icon(vector coord, float icon, entity pingdata, vector rgb, float a)
 {
 	float dt;
 	vector v;
+	float i;
 
 	coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord));
 	drawpic(coord - '4 4 0', strcat("gfx/teamradar_icon_", ftos(icon)), '8 8 0', rgb, a, 0);
-	if(pingtime != 0)
+
+	if(pingdata)
 	{
-		dt = time - pingtime;
-		if(dt > 1)
-			return;
-		v = '2 2 0' * teamradar_size * dt;
-		drawpic(coord - 0.5 * v, "gfx/teamradar_ping", v, '1 1 1', 1 - dt, DRAWFLAG_ADDITIVE);
+		for(i = 0; i < MAX_TEAMRADAR_TIMES; ++i)
+		{
+			dt = pingdata.(teamradar_times[i]);
+			if(dt == 0)
+				continue;
+			dt = time - dt;
+			if(dt > 1)
+				continue;
+			v = '2 2 0' * teamradar_size * dt;
+			drawpic(coord - 0.5 * v, "gfx/teamradar_ping", v, '1 1 1', 1 - dt, DRAWFLAG_ADDITIVE);
+		}
 	}
 }
 
@@ -152,6 +179,7 @@
 
 void teamradar_loadcvars()
 {
+	v_flipped = cvar("v_flipped");
 	if(ons_showmap)
 	{
 		cl_teamradar_scale = 42; // dummy, not used (see zoommode)
@@ -305,7 +333,7 @@
 	for(tm = world; (tm = find(tm, classname, "radarlink")); )
 		draw_teamradar_link(tm.origin, tm.velocity, tm.team);
 	for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); )
-		draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm.teamradar_time, tm.teamradar_color, tm.alpha);
+		draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, tm.alpha);
 	for(tm = world; (tm = find(tm, classname, "entcs_receiver")); )
 	{
 		color2 = GetPlayerColor(tm.sv_entnum);

Modified: branches/nexuiz-2.0/data/qcsrc/client/teamradar.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/teamradar.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/teamradar.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,6 +1,9 @@
 void teamradar_view();
 
+#define MAX_TEAMRADAR_TIMES 32
+
 // to make entities have dots on the team radar
 .float teamradar_icon;
-.float teamradar_time;
+.float teamradar_times[MAX_TEAMRADAR_TIMES];
+.float teamradar_time_index;
 .vector teamradar_color;

Modified: branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/client/waypointsprites.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -142,8 +142,14 @@
 		// scale it to be just in view
 		vector d;
 		float f1, f2;
-		d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
 
+		// get the waypoint angle vector
+		d_x = view_right * (self.origin - view_origin) * vid_conwidth / vid_width;
+		d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight);
+		d_z = 0;
+		
+		//d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
+
 		f1 = d_x / vid_conwidth;
 		f2 = d_y / vid_conheight;
 
@@ -248,7 +254,10 @@
 		f = ReadByte();
 		self.teamradar_icon = (f & 0x7F);
 		if(f & 0x80)
-			self.teamradar_time = time;
+		{
+			self.(teamradar_times[self.teamradar_time_index]) = time;
+			self.teamradar_time_index = mod(self.teamradar_time_index + 1, MAX_TEAMRADAR_TIMES);
+		}
 		self.teamradar_color_x = ReadByte() / 255.0;
 		self.teamradar_color_y = ReadByte() / 255.0;
 		self.teamradar_color_z = ReadByte() / 255.0;

Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -66,6 +66,7 @@
 const float RADARICON_HELPME = 1;
 const float RADARICON_CONTROLPOINT = 1;
 const float RADARICON_GENERATOR = 1;
+const float RADARICON_OBJECTIVE = 1;
 
 ///////////////////////////
 // key constants
@@ -298,55 +299,3 @@
 #define SP_SUICIDES 2
 #define SP_SCORE 3
 // game mode specific indices are not in common/, but in server/scores_rules.qc!
-
-// Weapon indexes
-// %weaponaddpoint
-float WEP_FIRST				=  1;
-float WEP_LASER				=  1; float WEPBIT_LASER			= 1; // always: 2^(w-1)
-float WEP_SHOTGUN			=  2; float WEPBIT_SHOTGUN			= 2;
-float WEP_UZI				=  3; float WEPBIT_UZI				= 4;
-float WEP_GRENADE_LAUNCHER	=  4; float WEPBIT_GRENADE_LAUNCHER	= 8;
-float WEP_ELECTRO			=  5; float WEPBIT_ELECTRO			= 16;
-float WEP_CRYLINK			=  6; float WEPBIT_CRYLINK			= 32;
-float WEP_NEX				=  7; float WEPBIT_NEX				= 64;
-float WEP_HAGAR				=  8; float WEPBIT_HAGAR			= 128;
-float WEP_ROCKET_LAUNCHER	=  9; float WEPBIT_ROCKET_LAUNCHER	= 256;
-float WEP_PORTO				= 10; float WEPBIT_PORTO			= 512;
-float WEP_MINSTANEX			= 11; float WEPBIT_MINSTANEX		= 1024;
-float WEP_HOOK     			= 12; float WEPBIT_HOOK     		= 2048;
-float WEP_HLAC			    = 13; float WEPBIT_HLAC		        = 4096;
-float WEP_SEEKER			= 14; float WEPBIT_SEEKER		    = 8192;
-float WEP_LAST				= 14; float WEPBIT_ALL              = 16383;
-float WEP_COUNT             = 15;
-
-float	IT_UNLIMITED_WEAPON_AMMO  = 1;
-// when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
-float	IT_UNLIMITED_SUPERWEAPONS = 2;
-// when this bit is set, using a superweapon does not throw it away. Checkpoints can give this powerup.
-float	IT_UNLIMITED_AMMO         = 3;
-// both of these combined
-float	IT_SHELLS				= 256;
-float	IT_NAILS				= 512;
-float	IT_ROCKETS				= 1024;
-float	IT_CELLS				= 2048;
-float	IT_SUPERWEAPON			= 4096;
-float	IT_AMMO					= 7936;
-float	IT_STRENGTH				= 8192;
-float	IT_INVINCIBLE			= 16384;
-float	IT_HEALTH				= 32768;
-// union:
-	// for items:
-	float	IT_KEY1					= 131072;
-	float	IT_KEY2					= 262144;
-	// for players:
-	float	IT_RED_FLAG_TAKEN		= 32768;
-	float	IT_RED_FLAG_LOST		= 65536;
-	float	IT_RED_FLAG_CARRING		= 98304;
-	float	IT_BLUE_FLAG_TAKEN		= 131072;
-	float	IT_BLUE_FLAG_LOST		= 262144;
-	float	IT_BLUE_FLAG_CARRING	= 393216;
-// end
-float	IT_5HP					= 524288;
-float	IT_25HP					= 1048576;
-float	IT_ARMOR_SHARD			= 2097152;
-float	IT_ARMOR				= 4194304;

Modified: branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/common/mapinfo.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -306,6 +306,8 @@
 	return 0;
 }
 
+float _MapInfo_Map_has_worldspawn_music;
+
 float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
 {
 	string fn;
@@ -336,6 +338,7 @@
 	inWorldspawn = 2;
 	MapInfo_Map_supportedGametypes = 0;
 	spawnpoints = 0;
+	_MapInfo_Map_has_worldspawn_music = 0;
 
 	for(;;)
 	{
@@ -354,6 +357,10 @@
 				MapInfo_Map_author = v;
 			else if(k == "_description")
 				MapInfo_Map_description = v;
+			else if(k == "music")
+				_MapInfo_Map_has_worldspawn_music = 1;
+			else if(k == "noise")
+				_MapInfo_Map_has_worldspawn_music = 1;
 			else if(k == "message")
 			{
 				i = strstrofs(v, " by ", 0);
@@ -467,8 +474,15 @@
 	if(!(pThisType & pWantedType))
 		return;
 	
-	cvar_set("fraglimit", car(s));
-	s = cdr(s);
+	if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT) // these modes don't use fraglimit
+	{
+		cvar_set("fraglimit", "0");
+	}
+	else
+	{
+		cvar_set("fraglimit", car(s));
+		s = cdr(s);
+	}
 
 	cvar_set("timelimit", car(s));
 	s = cdr(s);
@@ -552,7 +566,10 @@
 		fputs(fh, strcat("title ", MapInfo_Map_title, "\n"));
 		fputs(fh, strcat("description ", MapInfo_Map_description, "\n"));
 		fputs(fh, strcat("author ", MapInfo_Map_author, "\n"));
-		fputs(fh, strcat("cdtrack ", ftos(floor(random() * 9 + 2)), "\n")); // track from 2 to 10
+		if(_MapInfo_Map_has_worldspawn_music)
+			fputs(fh, strcat("// (uses worldspawn.music) // cdtrack ", ftos(floor(random() * 9 + 2)), "\n"));
+		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_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");

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1052,3 +1052,82 @@
 	argv_end_index = func_null;
 	return _tokenizebyseparator_builtin(s, sep);
 }
+
+float power2of(float e)
+{
+	return pow(2, e);
+}
+float log2of(float x)
+{
+	// NOTE: generated code
+	if(x > 2048)
+		if(x > 131072)
+			if(x > 1048576)
+				if(x > 4194304)
+					return 23;
+				else
+					if(x > 2097152)
+						return 22;
+					else
+						return 21;
+			else
+				if(x > 524288)
+					return 20;
+				else
+					if(x > 262144)
+						return 19;
+					else
+						return 18;
+		else
+			if(x > 16384)
+				if(x > 65536)
+					return 17;
+				else
+					if(x > 32768)
+						return 16;
+					else
+						return 15;
+			else
+				if(x > 8192)
+					return 14;
+				else
+					if(x > 4096)
+						return 13;
+					else
+						return 12;
+	else
+		if(x > 32)
+			if(x > 256)
+				if(x > 1024)
+					return 11;
+				else
+					if(x > 512)
+						return 10;
+					else
+						return 9;
+			else
+				if(x > 128)
+					return 8;
+				else
+					if(x > 64)
+						return 7;
+					else
+						return 6;
+		else
+			if(x > 4)
+				if(x > 16)
+					return 5;
+				else
+					if(x > 8)
+						return 4;
+					else
+						return 3;
+			else
+				if(x > 2)
+					return 2;
+				else
+					if(x > 1)
+						return 1;
+					else
+						return 0;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -116,3 +116,6 @@
 float tokenize_sane(string s);
 float tokenize_insane(string s);
 float tokenizebyseparator(string s, string sep);
+
+float power2of(float e);
+float log2of(float x);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/classes.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -42,6 +42,8 @@
 #include "nexuiz/textslider.c"
 #include "nexuiz/colorbutton.c"
 #include "nexuiz/dialog_multiplayer_join.c"
+#include "nexuiz/dialog_multiplayer_join_serverinfo.c"
+#include "nexuiz/playerlist.c"
 #include "nexuiz/listbox.c"
 #include "nexuiz/serverlist.c"
 #include "nexuiz/inputbox.c"

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -10,6 +10,7 @@
 	ATTRIB(ListBox, focusable, float, 1)
 	ATTRIB(ListBox, selectedItem, float, 0)
 	ATTRIB(ListBox, size, vector, '0 0 0')
+	ATTRIB(ListBox, origin, vector, '0 0 0')
 	ATTRIB(ListBox, scrollPos, float, 0) // measured in window heights, fixed when needed
 	ATTRIB(ListBox, previousValue, float, 0)
 	ATTRIB(ListBox, pressed, float, 0) // 0 = normal, 1 = scrollbar dragging, 2 = item dragging, 3 = released
@@ -45,6 +46,7 @@
 void resizeNotifyListBox(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
 	me.size = absSize;
+	me.origin = absOrigin;
 	me.controlWidth = me.scrollbarWidth / absSize_x;
 }
 void configureListBoxListBox(entity me, float theScrollbarWidth, float theItemHeight)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -259,7 +259,7 @@
 float(string s1, string s2) strcasecmp = #229;
 float(string s1, string s2, float len) strncasecmp = #230;
 
-string(string s) strdecolorize(string s) = #477;
+string(string s) strdecolorize = #477;
 
 //DP_QC_STRINGBUFFERS
 //idea: ??

Modified: branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -63,6 +63,8 @@
 	menuInitialized = 1;
 	GameCommand_Init();
 
+	RegisterWeapons();
+
 	fh = -1;
 	if(cvar_string("menu_skin") != "")
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -191,7 +191,6 @@
 			else
 				j = mod(j + step, n);
 			s = search_getfilename(me.campaignGlob, j);
-			print(s, "\n");
 			s = substring(s, 13, strlen(s) - 17);
 			cvar_set("g_campaign_name", s);
 			me.loadCvars(me);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -25,6 +25,7 @@
 
 entity makeNexuizDemoList();
 void StartDemo_Click(entity btn, entity me);
+void TimeDemo_Click(entity btn, entity me);
 void DemoList_Filter_Change(entity box, entity me);
 #endif
 
@@ -64,6 +65,8 @@
     	s="demos/*.dem";
 	
     //dprint("Search demos with the pattern ", s, "\n");    
+	if(me.listDemo >= 0)
+		search_end(me.listDemo);
     me.listDemo = search_begin(s, FALSE, TRUE);
     if(me.listDemo < 0)
     	me.nItems=0;
@@ -131,6 +134,13 @@
     me.startDemo(me);
 }
 
+void TimeDemo_Click(entity btn, entity me)
+{
+    string s;
+    s = me.demoName(me,me.selectedItem);
+    localcmd("timedemo demos/", s, ".dem\nwait\ntogglemenu\n");	
+}
+
 void clickListBoxItemNexuizDemoList(entity me, float i, vector where)
 {
     if(i == me.lastClickedDemo)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -17,11 +17,11 @@
 	me.TR(me);
 		me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Servers",  makeNexuizServerListTab()));
 			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, e = mc.makeTabButton(mc, "Player Setup",  makeNexuizPlayerSettingsTab()));
 			if(cvar_string("_cl_name") == "Player")
 				e.onClick(e, e.onClickEntity); // lol animation
-		me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Create",  makeNexuizServerCreateTab()));
-			setDependentStringNotEqual(e, "_cl_name", "Player");
 	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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -82,7 +82,7 @@
 		me.TDempty(me, 0.5);
 
 	me.gotoRC(me, 3, 3.5); me.setFirstColumn(me, me.currentColumn);
-		me.TD(me, 1, 3, e = makeNexuizTextLabel(0, "Settings:"));
+		me.TD(me, 1, 3, e = makeNexuizTextLabel(0, "Match settings:"));
 	me.TR(me);
 		me.sliderTimelimit = makeNexuizSlider(1.0, 60.0, 0.5, "timelimit_override");
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(0, 1, me.sliderTimelimit, "Time limit:"));
@@ -100,23 +100,6 @@
 		me.TD(me, 1, 2.8, e = makeNexuizSliderCheckBox(-1, 0, me.sliderFraglimit, "Use map specified default"));
 	me.TR(me);
 	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBoxEx(2, 0, "g_antilag", "AntiLag"));
-	me.TR(me);
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Map voting:"));
-		me.TD(me, 1, 2, e = makeNexuizTextSlider("g_maplist_votable"));
-			e.addValue(e, "No voting", "0");
-			e.addValue(e, "2 choices", "2");
-			e.addValue(e, "3 choices", "3");
-			e.addValue(e, "4 choices", "4");
-			e.addValue(e, "5 choices", "5");
-			e.addValue(e, "6 choices", "6");
-			e.addValue(e, "7 choices", "7");
-			e.configureNexuizTextSliderValues(e);
-	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "sv_vote_simple_majority", "Simple majority wins vcall"));
-	me.TR(me);
-	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Number of players:"));
 		me.TD(me, 1, 2, makeNexuizSlider(1, 32, 1, "menu_maxplayers"));
 	me.TR(me);
@@ -150,6 +133,23 @@
 			setDependent(e, "bot_number", 0, -1);
 	me.TR(me);
 	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBoxEx(2, 0, "g_antilag", "AntiLag"));
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Map voting:"));
+		me.TD(me, 1, 2, e = makeNexuizTextSlider("g_maplist_votable"));
+			e.addValue(e, "No voting", "0");
+			e.addValue(e, "2 choices", "2");
+			e.addValue(e, "3 choices", "3");
+			e.addValue(e, "4 choices", "4");
+			e.addValue(e, "5 choices", "5");
+			e.addValue(e, "6 choices", "6");
+			e.addValue(e, "7 choices", "7");
+			e.configureNexuizTextSliderValues(e);
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "sv_vote_simple_majority", "Simple majority wins vcall"));
+	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizButton("Mutators...", '0 0 0'));
 			e.onClick = DialogOpenButton_Click;
 			e.onClickEntity = main.mutatorsDialog;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mapinfo.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -91,14 +91,12 @@
 	w = me.columns - me.currentColumn;
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Title:"));
 		me.TD(me, 1, w-1, e = makeNexuizTextLabel(0, ""));
-			e.alpha = 1;
 			e.colorL = SKINCOLOR_MAPLIST_TITLE;
 			e.allowCut = 1;
 			me.titleLabel = e;
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Author:"));
 		me.TD(me, 1, w-1, e = makeNexuizTextLabel(0, ""));
-			e.alpha = 1;
 			e.colorL = SKINCOLOR_MAPLIST_AUTHOR;
 			e.allowCut = 1;
 			me.authorLabel = 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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -6,9 +6,9 @@
 	METHOD(NexuizMutatorsDialog, close, void(entity))
 	ATTRIB(NexuizMutatorsDialog, title, string, "Mutators")
 	ATTRIB(NexuizMutatorsDialog, color, vector, SKINCOLOR_DIALOG_MUTATORS)
-	ATTRIB(NexuizMutatorsDialog, intendedWidth, float, 0.6)
-	ATTRIB(NexuizMutatorsDialog, rows, float, 9)
-	ATTRIB(NexuizMutatorsDialog, columns, float, 4)
+	ATTRIB(NexuizMutatorsDialog, intendedWidth, float, 0.8)
+	ATTRIB(NexuizMutatorsDialog, rows, float, 16)
+	ATTRIB(NexuizMutatorsDialog, columns, float, 6)
 	ATTRIB(NexuizMutatorsDialog, refilterEntity, entity, NULL)
 ENDCLASS(NexuizMutatorsDialog)
 #endif
@@ -16,8 +16,50 @@
 #ifdef IMPLEMENTATION
 void showNotifyNexuizMutatorsDialog(entity me)
 {
-        loadAllCvars(me);
+	loadAllCvars(me);
 }
+
+string weaponarenastring;
+string weaponarenastring_cvar;
+string WeaponArenaString()
+{
+	string s;
+	float n, i, j;
+	entity e;
+	s = cvar_string("g_weaponarena");
+	if(s == "0")
+		return "";
+	if(s == "all")
+		return "All Weapons Arena";
+	if(s == "most")
+		return "Most Weapons Arena";
+	if(s == weaponarenastring_cvar)
+		return weaponarenastring;
+	if(weaponarenastring)
+		strunzone(weaponarenastring);
+	if(weaponarenastring_cvar)
+		strunzone(weaponarenastring_cvar);
+
+	weaponarenastring_cvar = strzone(s);
+
+	n = tokenize_sane(s);
+	s = "";
+	for(i = 0; i < n; ++i)
+	{
+		for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+		{
+			e = get_weaponinfo(j);
+			if(argv(i) == e.netname)
+				s = strcat(s, " & ", e.message);
+		}
+	}
+	s = strcat(substring(s, 3, strlen(s) - 3), " Arena");
+	
+	weaponarenastring = strzone(s);
+
+	return weaponarenastring;
+}
+
 string toStringNexuizMutatorsDialog(entity me)
 {
 	string s;
@@ -26,8 +68,8 @@
 		s = strcat(s, ", MinstaGib");
 	if(cvar("g_nixnex"))
 		s = strcat(s, ", NixNex");
-	if(cvar("g_rocketarena"))
-		s = strcat(s, ", RL arena");
+	if(cvar_string("g_weaponarena") != "0")
+		s = strcat(s, ", ", WeaponArenaString());
 	if(cvar("sv_gravity") < 800)
 		s = strcat(s, ", Low gravity");
 	if(cvar("g_cloaked"))
@@ -42,14 +84,73 @@
 		s = strcat(s, ", Midair");
 	if(cvar("g_vampire"))
 		s = strcat(s, ", Vampire");
+	if(cvar("g_weapon_stay"))
+		s = strcat(s, ", Weapons stay");
 	if(s == "")
 		return "None";
 	else
 		return substring(s, 2, strlen(s) - 2);
 }
+
+
+
+// WARNING: dirty hack. TODO clean this up by putting this behaviour in extra classes.
+void loadCvarsLaserWeaponArenaWeaponButton(entity me)
+{
+	tokenize_sane(cvar_string("g_weaponarena"));
+	me.checked = (argv(0) == me.cvarValue);
+}
+
+void saveCvarsLaserWeaponArenaWeaponButton(entity me)
+{
+	string suffix;
+	suffix = "";
+	if(me.cvarValue != "laser")
+		if(cvar("menu_weaponarena_with_laser"))
+			suffix = " laser";
+	if(me.checked)
+		cvar_set(me.cvarName, strcat(me.cvarValue, suffix));
+	else
+		cvar_set(me.cvarName, me.cvarOffValue);
+}
+
+.void(entity) draw_weaponarena;
+.void(entity) saveCvars_weaponarena;
+void saveCvarsLaserWeaponArenaLaserButton(entity me)
+{
+	// run the old function
+	me.saveCvars_weaponarena(me);
+
+	me.disabled = ((cvar_string("g_weaponarena") == "0") || (cvar_string("g_weaponarena") == "laser"));
+
+	if not(me.disabled)
+	{
+		// check for the laser suffix
+		string s;
+		s = cvar_string("g_weaponarena");
+		if(me.checked && substring(s, strlen(s) - 6, 6) != " laser")
+			s = strcat(s, " laser");
+		else if(!me.checked && substring(s, strlen(s) - 6, 6) == " laser")
+			s = substring(s, 0, strlen(s) - 6);
+		cvar_set("g_weaponarena", s);
+	}
+}
+
+void preDrawLaserWeaponArenaLaserButton(entity me)
+{
+	me.disabled = ((cvar_string("g_weaponarena") == "0") || (cvar_string("g_weaponarena") == "laser"));
+	// run the old function
+	me.draw_weaponarena(me);
+}
+// WARNING: end of dirty hack. Do not try this at home.
+
+
+
 void fillNexuizMutatorsDialog(entity me)
 {
-	entity e, s;
+	entity e, s, w;
+	float i, j;
+	string str, hstr;
 	me.TR(me);
 		me.TD(me, 1, 2, makeNexuizTextLabel(0, "Game mutators:"));
 	me.TR(me);
@@ -64,31 +165,59 @@
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_midair", "Midair"));
 	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_vampire", "Vampire"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_weapon_stay", "Weapons stay"));
+	me.TR(me);
+		s = makeNexuizSlider(80, 400, 8, "sv_gravity");
+			s.valueDigits = 0;
+			s.valueDisplayMultiplier = 0.125; // show gravity in percent
+		me.TD(me, 1, 2, e = makeNexuizSliderCheckBox(800, 1, s, "Low gravity"));
+			e.savedValue = 200; // good on silvercity
+	me.TR(me);
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 1.8, s);
 
 	me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
-		me.TD(me, 1, 2, makeNexuizTextLabel(0, "Arena mutators:"));
+		me.TD(me, 1, 4, makeNexuizTextLabel(0, "Weapon arenas:"));
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, string_null, string_null, "Regular"));
+		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, string_null, string_null, "Regular (no arena)"));
+	for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i, ++j)
+	{
+		w = get_weaponinfo(i);
+		if(j & 1 == 0)
+			me.TR(me);
+		str = w.netname;
+		hstr = w.message;
+		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, "g_weaponarena", strzone(str), strzone(hstr)));
+			e.cvarOffValue = "0";
+			// custom load/save logic that ignores a " laser" suffix, or adds it 
+			e.loadCvars = loadCvarsLaserWeaponArenaWeaponButton;
+			e.saveCvars = saveCvarsLaserWeaponArenaWeaponButton;
+			e.loadCvars(e);
+	}
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, "g_minstagib", string_null, "MinstaGib"));
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 3.8, e = makeNexuizCheckBox(0, "menu_weaponarena_with_laser", "with laser"));
+			// hook the draw function to gray it out
+			e.draw_weaponarena = e.draw;
+			e.draw = preDrawLaserWeaponArenaLaserButton;
+			// hook the save function to notify about the cvar
+			e.saveCvars_weaponarena = e.saveCvars;
+			e.saveCvars = saveCvarsLaserWeaponArenaLaserButton;
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, "g_nixnex", string_null, "NixNex"));
+		me.TD(me, 1, 4, makeNexuizTextLabel(0, "Special arenas:"));
 	me.TR(me);
+		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, "g_minstagib", string_null, "MinstaGib"));
+	me.TR(me);
+		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, "g_nixnex", string_null, "NixNex"));
+	me.TR(me);
 		me.TDempty(me, 0.2);
-		me.TD(me, 1, 1.8, e = makeNexuizCheckBox(1, "g_nixnex_with_laser", "with laser"));
+		me.TD(me, 1, 3.8, e = makeNexuizCheckBox(0, "g_nixnex_with_laser", "with laser"));
 			setDependent(e, "g_nixnex", 1, 1);
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, "g_weaponarena", "rocketlauncher", "Rocket launcher arena"));
+		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, "g_weaponarena", "all", "All weapons"));
 			e.cvarOffValue = "0";
 
-	me.gotoRC(me, me.rows - 2, 0);
-		s = makeNexuizSlider(80, 400, 8, "sv_gravity");
-			s.valueDigits = 0;
-			s.valueDisplayMultiplier = 0.125; // show gravity in percent
-		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(800, 1, s, "Low gravity"));
-			e.savedValue = 200; // good on silvercity
-		me.TD(me, 1, 3, s);
-
 	me.gotoRC(me, me.rows - 1, 0);
 		me.TD(me, 1, me.columns, e = makeNexuizButton("OK", '0 0 0'));
 			e.onClick = Dialog_Close;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -62,11 +62,13 @@
 			e.onClick = ServerList_Favorite_Click;
 			e.onClickEntity = slist;
 			slist.favoriteButton = e;
-		me.TD(me, 1, me.columns - 0.6 - 1.5 - 1, e = makeNexuizButton("Join!", '0 0 0'));
+		me.TD(me, 1, 1, e = makeNexuizButton("Info", '0 0 0'));
+			e.onClick = ServerList_Info_Click;
+			e.onClickEntity = slist;
+			slist.infoButton = e;
+		me.TD(me, 1, me.columns - 0.6 - 1.5 - 1 - 1, e = makeNexuizButton("Join!", '0 0 0'));
 			e.onClick = ServerList_Connect_Click;
 			e.onClickEntity = slist;
 			slist.connectButton = e;
 }
 #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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -78,12 +78,15 @@
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(-1, 1, sl, "Zoom speed:"));
 		me.TD(me, 1, 2, sl);
 	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_autoswitch", "Auto switch weapons on pickup"));
+		sl = makeNexuizSlider(0.45, 0.75, 0.01, "cl_bobcycle");
+		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(0, 1, sl, "View bobbing:"));
+		me.TD(me, 1, 2, sl);
+
 	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizButton("Weapon order...", '0 0 0'));
+		me.TD(me, 1, 1.5, e = makeNexuizButton("Weapon settings...", '0 0 0'));
 			e.onClick = DialogOpenButton_Click;
 			e.onClickEntity = main.weaponsDialog;
-		me.TD(me, 1, 2, e0 = makeNexuizTextLabel(0, string_null));
+		me.TD(me, 1, 1.5, e0 = makeNexuizTextLabel(0, string_null));
 			e0.textEntity = main.weaponsDialog;
 			e0.allowCut = 1;
 	me.TR(me);

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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_playersetup_weapons.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,10 +3,10 @@
 	METHOD(NexuizWeaponsDialog, toString, string(entity))
 	METHOD(NexuizWeaponsDialog, fill, void(entity))
 	METHOD(NexuizWeaponsDialog, showNotify, void(entity))
-	ATTRIB(NexuizWeaponsDialog, title, string, "Weapon order")
+	ATTRIB(NexuizWeaponsDialog, title, string, "Weapon settings")
 	ATTRIB(NexuizWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
-	ATTRIB(NexuizWeaponsDialog, intendedWidth, float, 0.3)
-	ATTRIB(NexuizWeaponsDialog, rows, float, 9.5)
+	ATTRIB(NexuizWeaponsDialog, intendedWidth, float, 0.35)
+	ATTRIB(NexuizWeaponsDialog, rows, float, 13)
 	ATTRIB(NexuizWeaponsDialog, columns, float, 4)
 	ATTRIB(NexuizWeaponsDialog, weaponsList, entity, NULL)
 ENDCLASS(NexuizWeaponsDialog)
@@ -27,18 +27,22 @@
 	me.TR(me);
 		me.TD(me, 1, 4, makeNexuizTextLabel(0, "Weapon priority list:"));
 	me.TR(me);
-		me.TD(me, me.rows - 3, 3, e = me.weaponsList = makeNexuizWeaponsList());
-	me.gotoRC(me, (me.rows - 1) / 2 - 1, 3);
+		me.TD(me, me.rows - 5, 3, e = me.weaponsList = makeNexuizWeaponsList());
+	me.gotoRC(me, (me.rows - 5) / 2, 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 - 1) / 2, 3);
+	me.gotoRC(me, (me.rows - 5) / 2 + 1, 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 - 2, 0);
+	me.gotoRC(me, me.rows - 4, 0);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_weaponpriority_useforcycling", "Use 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.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'));
 			e.onClick = Dialog_Close;
 			e.onClickEntity = me;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -4,7 +4,7 @@
 	ATTRIB(NexuizSettingsDialog, title, string, "Settings")
 	ATTRIB(NexuizSettingsDialog, color, vector, SKINCOLOR_DIALOG_SETTINGS)
 	ATTRIB(NexuizSettingsDialog, intendedWidth, float, 0.96)
-	ATTRIB(NexuizSettingsDialog, rows, float, 17)
+	ATTRIB(NexuizSettingsDialog, rows, float, 19)
 	ATTRIB(NexuizSettingsDialog, columns, float, 6)
 ENDCLASS(NexuizSettingsDialog)
 #endif

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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizAudioSettingsTab, fill, void(entity))
 	ATTRIB(NexuizAudioSettingsTab, title, string, "Audio")
 	ATTRIB(NexuizAudioSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizAudioSettingsTab, rows, float, 15)
+	ATTRIB(NexuizAudioSettingsTab, rows, float, 17)
 	ATTRIB(NexuizAudioSettingsTab, columns, float, 6.5)
 ENDCLASS(NexuizAudioSettingsTab)
 entity makeNexuizAudioSettingsTab();

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_demo.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizDemoSettingsTab, fill, void(entity))
 	ATTRIB(NexuizDemoSettingsTab, title, string, "Demo")
 	ATTRIB(NexuizDemoSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizDemoSettingsTab, rows, float, 15)
+	ATTRIB(NexuizDemoSettingsTab, rows, float, 17)
 	ATTRIB(NexuizDemoSettingsTab, columns, float, 6.5)
 	ATTRIB(NexuizDemoSettingsTab, name, string, "DemoBroswer")	
 ENDCLASS(NexuizDemoSettingsTab)
@@ -40,7 +40,10 @@
 	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, e = makeNexuizButton("Play", '0 0 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;
 }

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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_effects.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizEffectsSettingsTab, fill, void(entity))
 	ATTRIB(NexuizEffectsSettingsTab, title, string, "Effects")
 	ATTRIB(NexuizEffectsSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizEffectsSettingsTab, rows, float, 15)
+	ATTRIB(NexuizEffectsSettingsTab, rows, float, 17)
 	ATTRIB(NexuizEffectsSettingsTab, columns, float, 6.5)
 ENDCLASS(NexuizEffectsSettingsTab)
 entity makeNexuizEffectsSettingsTab();
@@ -17,44 +17,7 @@
 	me.configureDialog(me);
 	return me;
 }
-/*
- * cl_decals 1
- * cl_nogibs 0
- * cl_particles_quality 1
- * cl_particles_snow 1
- * r_bloom 1
- * r_coronas 1
- * r_glsl_deluxemapping 1
- * r_glsl_offsetmapping 1
- * r_glsl_offsetmapping_reliefmapping 0
- * r_hdr 0
- * r_shadow_usenormalmap 1
- * r_shadow_gloss 1
- * r_shadow_realtime_dlight 1
- * r_shadow_realtime_dlight_shadows 1
- * r_shadow_realtime_world 1
- * r_shadow_realtime_world_shadows 1
- * r_depthfirst 2
- * r_showsurfaces 0
- * r_water 1
- * r_water_resolutionmultiplier 0.5
- *
- *
- * [X] cl_decals
- * [X] !cl_nogibs
- * Particles: |--v--|
- * [X] Bloom [X] HDR
- * [X] Coronas
- * [X] Deluxemapping [X] Gloss
- * [X] Offsetmapping [X] Reliefmapping
- * [X] dlights [X] normalmaps [X] shadows
- * [X] rtworld [X] shadows
- * [X] depth first world [X] depth first models (?????)
- * [X] OMGLOLWTFBBQ (showsurfaces)
- * [X] water |----------v----|
- *
- *
- */
+
 void fillNexuizEffectsSettingsTab(entity me)
 {
 	entity e;
@@ -101,10 +64,17 @@
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_decals", "Decals"));
 	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Decals distance:"));
+		me.TDempty(me, 0.2);
+		me.TD(me, 1, 0.8, e = makeNexuizTextLabel(0, "Distance:"));
 		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:"));
+	    me.TD(me, 1, 2, e = makeNexuizSlider(1, 20, 1, "cl_decals_time"));
+	        setDependent(e, "cl_decals", 1, 1);
+
+	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");
@@ -116,6 +86,7 @@
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_coronas", "Coronas"));
 	me.TR(me);
+	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)"));
@@ -130,36 +101,37 @@
 			e.addValue(e, "16x", "16");
 			e.configureNexuizTextSliderValues(e);
 	me.TR(me);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_deluxemapping", "Deluxe mapping"));
+		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_shadow_gloss", "Gloss"));
-			setDependentAND(e, "r_glsl", 1, 1, "r_glsl_deluxemapping", 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, 2, e = makeNexuizCheckBox(0, "r_shadow_realtime_dlight", "Realtime dynamic lighting"));
+		me.TD(me, 1, 3, e = makeNexuizRadioButton(1, string_null, string_null, "No dynamic lighting"));
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizRadioButton(1, "gl_flashblend", string_null, "Flash blend approximation"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizRadioButton(1, "r_shadow_realtime_dlight", string_null, "Realtime dynamic lighting"));
 		me.TD(me, 1, 1, e = makeNexuizCheckBox(0, "r_shadow_realtime_dlight_shadows", "Shadows"));
 			setDependent(e, "r_shadow_realtime_dlight", 1, 1);
-
 	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "r_shadow_realtime_world", "Realtime world lighting"));
 		me.TD(me, 1, 1, e = makeNexuizCheckBox(0, "r_shadow_realtime_world_shadows", "Shadows"));
 			setDependent(e, "r_shadow_realtime_world", 1, 1);
-
 	me.TR(me);
 		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.TR(me);
-		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_offsetmapping", "Offset mapping"));
+		me.TD(me, 1, 1.5, e = makeNexuizCheckBox(0, "r_glsl_deluxemapping", "Deluxe 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_shadow_gloss", "Gloss"));
+			setDependentAND(e, "r_glsl", 1, 1, "r_glsl_deluxemapping", 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"));
@@ -183,12 +155,6 @@
 			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; gl_flashblend_update; r_restart", COMMANDBUTTON_APPLY));
+		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "sendcvar cl_nogibs; r_restart", COMMANDBUTTON_APPLY));
 }
-/*
- * [X] depth first world [X] depth first models (?????)
- * [X] OMGLOLWTFBBQ (showsurfaces)
- *
- *
- */
 #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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizInputSettingsTab, fill, void(entity))
 	ATTRIB(NexuizInputSettingsTab, title, string, "Input")
 	ATTRIB(NexuizInputSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizInputSettingsTab, rows, float, 15)
+	ATTRIB(NexuizInputSettingsTab, rows, float, 17)
 	ATTRIB(NexuizInputSettingsTab, columns, float, 6.5)
 ENDCLASS(NexuizInputSettingsTab)
 entity makeNexuizInputSettingsTab();
@@ -58,6 +58,7 @@
 		else if(cvar_type("joystick") & CVAR_TYPEFLAG_ENGINE)
 			me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "joystick", "Use joystick input"));
 	me.TR(me);
+	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"));

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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_misc.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizMiscSettingsTab, fill, void(entity))
 	ATTRIB(NexuizMiscSettingsTab, title, string, "Misc")
 	ATTRIB(NexuizMiscSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizMiscSettingsTab, rows, float, 15)
+	ATTRIB(NexuizMiscSettingsTab, rows, float, 17)
 	ATTRIB(NexuizMiscSettingsTab, columns, float, 6.5)
 ENDCLASS(NexuizMiscSettingsTab)
 entity makeNexuizMiscSettingsTab();

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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_video.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,7 +3,7 @@
 	METHOD(NexuizVideoSettingsTab, fill, void(entity))
 	ATTRIB(NexuizVideoSettingsTab, title, string, "Video")
 	ATTRIB(NexuizVideoSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizVideoSettingsTab, rows, float, 15)
+	ATTRIB(NexuizVideoSettingsTab, rows, float, 17)
 	ATTRIB(NexuizVideoSettingsTab, columns, float, 6.5)
 ENDCLASS(NexuizVideoSettingsTab)
 entity makeNexuizVideoSettingsTab();
@@ -36,6 +36,7 @@
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "r_glsl", "Use OpenGL 2.0 shaders (GLSL)"));
 	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 1.5, e = makeNexuizTextLabel(0, "Vertex Buffer Objects (VBOs)"));
 	me.TR(me);
 		me.TDempty(me, 0.2);
@@ -46,17 +47,21 @@
 		me.TD(me, 1, 0.9, e = makeNexuizRadioButton(1, "gl_vbo", "2", "Vertex only"));
 		me.TD(me, 1, 2.1, e = makeNexuizRadioButton(1, "gl_vbo", "3", "Vertex, some Triangles (compatible)"));
 	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Depth first:"));
+		me.TD(me, 1, 2, e = makeNexuizTextSlider("r_depthfirst"));
+			e.addValue(e, "Disabled", "0");
+			e.addValue(e, "World", "1");
+			e.addValue(e, "All", "2");
+			e.configureNexuizTextSliderValues(e);
+	me.TR(me);
+	me.TR(me);
 		me.TD(me, 1, 1.5, e = makeNexuizTextLabel(0, "Texture compression"));
 		me.TD(me, 1, 0.5, e = makeNexuizRadioButton(2, "gl_texturecompression", "0", "None"));
 		me.TD(me, 1, 0.5, e = makeNexuizRadioButton(2, "gl_texturecompression", "1", "Fast"));
 		me.TD(me, 1, 0.5, e = makeNexuizRadioButton(2, "gl_texturecompression", "2", "Good"));
 	me.TR(me);
-		me.TD(me, 1, 3, e = makeNexuizCheckBoxEx(4, 1, "vid_samples", "Use 4x multisampling"));
-
-	me.TR(me);
 		if(cvar_type("apple_multithreadedgl") & CVAR_TYPEFLAG_ENGINE)
 			me.TD(me, 1, 3, e = makeNexuizCheckBox(1, "apple_multithreadedgl", "Disable multithreaded OpenGL"));
-
 	me.TR(me);
 		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "gl_finish", "Wait for GPU to finish each frame"));
 
@@ -82,15 +87,12 @@
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Scene brightness:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0.5, 2.0, 0.05, "r_hdr_scenebrightness"));
-
 	me.TR(me);
 	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Depth first:"));
-		me.TD(me, 1, 2, e = makeNexuizTextSlider("r_depthfirst"));
-			e.addValue(e, "Disabled", "0");
-			e.addValue(e, "World", "1");
-			e.addValue(e, "All", "2");
-			e.configureNexuizTextSliderValues(e);
+		me.TD(me, 1, 3, e = makeNexuizCheckBoxEx(4, 1, "vid_samples", "Use 4x multisampling"));
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "v_flipped", "Left handed mode"));
+	me.TR(me);
 
 	me.gotoRC(me, me.rows - 1, 0);
 		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/mainwindow.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -7,6 +7,7 @@
 	ATTRIB(MainWindow, userbindEditDialog, entity, NULL)
 	ATTRIB(MainWindow, winnerDialog, entity, NULL)
 	ATTRIB(MainWindow, radarDialog, entity, NULL)
+	ATTRIB(MainWindow, serverInfoDialog, entity, NULL)
 	ATTRIB(MainWindow, mainNexposee, entity, NULL)
 	ATTRIB(MainWindow, fadedAlpha, float, SKINALPHA_BEHIND)
 ENDCLASS(MainWindow)
@@ -54,6 +55,10 @@
 	i.configureDialog(i);
 	me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 	
+	me.serverInfoDialog = i = spawnNexuizServerInfoDialog();
+	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/maplist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -274,7 +274,9 @@
 	}
 	if(MapInfo_CheckMap(m))
 	{
-		localcmd("\ndisconnect\nwait\nmaxplayers $menu_maxplayers\ng_maplist_shufflenow\nhostname \"", strdecolorize(cvar_string("_cl_name")), "'s Nexuiz server\"\n");
+		localcmd("\ndisconnect\nwait\nmaxplayers $menu_maxplayers\ng_maplist_shufflenow\n");
+		if(cvar("menu_use_default_hostname"))
+			localcmd("hostname \"", strdecolorize(cvar_string("_cl_name")), "'s Nexuiz server\"\n");
 		MapInfo_LoadMap(m);
 	}
 	else

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/serverlist.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -41,6 +41,7 @@
 	ATTRIB(NexuizServerList, sortButton4, entity, NULL)
 	ATTRIB(NexuizServerList, sortButton5, entity, NULL)
 	ATTRIB(NexuizServerList, connectButton, entity, NULL)
+	ATTRIB(NexuizServerList, infoButton, entity, NULL)
 	ATTRIB(NexuizServerList, currentSortOrder, float, 0)
 	ATTRIB(NexuizServerList, currentSortField, float, -1)
 	ATTRIB(NexuizServerList, lastClickedServer, float, -1)
@@ -52,6 +53,7 @@
 void ServerList_ShowFull_Click(entity box, entity me);
 void ServerList_Filter_Change(entity box, entity me);
 void ServerList_Favorite_Click(entity btn, entity me);
+void ServerList_Info_Click(entity btn, entity me);
 #endif
 
 #ifdef IMPLEMENTATION
@@ -243,6 +245,7 @@
 	me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
 
 	me.connectButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
+	me.infoButton.disabled = ((me.nItems == 0) || !owned);
 
 	found = 0;
 	if(me.selectedServer)
@@ -458,6 +461,11 @@
 		ToggleFavorite(ipstr);
 	}
 }
+void ServerList_Info_Click(entity btn, entity me)
+{
+	main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
+	DialogOpenButton_Click(me, main.serverInfoDialog);
+}
 void clickListBoxItemNexuizServerList(entity me, float i, vector where)
 {
 	if(i == me.lastClickedServer)
@@ -486,7 +494,7 @@
 		theAlpha = SKINALPHA_SERVERLIST_EMPTY;
 	else
 		theAlpha = 1;
-	
+
 	p = gethostcachenumber(SLIST_FIELD_PING, i);
 #define PING_LOW 75
 #define PING_MED 200
@@ -533,14 +541,23 @@
 float keyDownNexuizServerList(entity me, float scan, float ascii, float shift)
 {
 	float i;
+	vector org, sz;
 
+	org = boxToGlobal(eY * (me.selectedItem * me.itemHeight - me.scrollPos), me.origin, me.size);
+	sz = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size);
+
 	if(scan == K_ENTER)
 	{
 		ServerList_Connect_Click(NULL, me);
 		return 1;
 	}
-	else if(scan == K_INS)
+	else if(scan == K_MOUSE2 || scan == K_SPACE)
 	{
+		main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
+		DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
+	}
+	else if(scan == K_INS || scan == K_MOUSE3)
+	{
 		i = me.selectedItem;
 		if(i < me.nItems)
 			ToggleFavorite(me.selectedServer);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c	2008-11-27 13:33:46 UTC (rev 5122)
@@ -76,43 +76,27 @@
 		cvar_set("cl_weaponpriority", swapInPriorityList(cvar_string("cl_weaponpriority"), me.selectedItem, i));
 	return f;
 }
-string WeaponName(float w)
-{
-	switch(w)
-	{
-		//%weaponaddpoint
-		case WEP_LASER:            return "Laser";
-		case WEP_SHOTGUN:          return "Shotgun";
-		case WEP_UZI:              return "Machine Gun";
-		case WEP_GRENADE_LAUNCHER: return "Mortar";
-		case WEP_ELECTRO:          return "Electro";
-		case WEP_CRYLINK:          return "Crylink";
-		case WEP_NEX:              return "Nex";
-		case WEP_HAGAR:            return "Hagar";
-		case WEP_ROCKET_LAUNCHER:  return "Rocket Launcher";
-		case WEP_PORTO:            return "Port-O-Launch";
-		case WEP_MINSTANEX:        return "MinstaNex";
-		case WEP_HOOK:             return "Grappling Hook";
-		case WEP_HLAC:             return "Heavy Laser Assault Cannon";
-		case WEP_SEEKER:           return "T.A.G. Seeker";
-		default:                   return "(fix qcsrc/menu/nexuiz/weaponslist.c)";
-	}
-}
 string toStringNexuizWeaponsList(entity me)
 {
 	float n, i;
 	string s;
+	entity e;
 	n = tokenize_sane(cvar_string("cl_weaponpriority"));
 	s = "";
 	for(i = 0; i < n; ++i)
-		s = strcat(s, WeaponName(stof(argv(i))), ", ");
+	{
+		e = get_weaponinfo(stof(argv(i)));
+		s = strcat(s, e.message, ", ");
+	}
 	return substring(s, 0, strlen(s) - 2);
 }
 void drawListBoxItemNexuizWeaponsList(entity me, float i, vector absSize, float isSelected)
 {
+	entity e;
 	if(isSelected)
 		draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
-	draw_Text(me.realUpperMargin * eY, WeaponName(stof(argv(i))), me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+	e = get_weaponinfo(stof(argv(i)));
+	draw_Text(me.realUpperMargin * eY, e.message, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
 }
 
 float keyDownNexuizWeaponsList(entity me, float scan, float ascii, float shift)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/progs.src	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/progs.src	2008-11-27 13:33:46 UTC (rev 5122)
@@ -11,6 +11,7 @@
 ../common/constants.qh
 ../common/mapinfo.qh
 ../common/campaign_common.qh
+../common/items.qh
 
 gamecommand.qh
 menu.qh
@@ -36,3 +37,4 @@
 ../common/campaign_file.qc
 ../common/campaign_setup.qc
 ../common/mapinfo.qc
+../common/items.qc

Modified: branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/menu/skin-customizables.inc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,7 +1,7 @@
 #if 0
 "Perl code to convert this to a skinvalues.txt file.";
-print "title <TITLE>\n";
-print "author <AUTHOR>\n";
+print "title Generic\n";
+print "author Morphed\n";
 print "\n";
 while(<DATA>)
 {
@@ -52,7 +52,7 @@
 	SKINVECTOR(COLOR_DIALOG_CREDITS, '0.7 0.7 1');
 	SKINVECTOR(COLOR_DIALOG_WEAPONS, '1 0.7 0.7');
 	SKINVECTOR(COLOR_DIALOG_RADAR, '0.7 0.7 1');
-	SKINVECTOR(COLOR_DIALOG_DEMOBROSWER, '0.7 0.7 1');
+	SKINVECTOR(COLOR_DIALOG_SERVERINFO, '0.7 0.7 1');
 
 	// nexposee positions of windows (they are the scale transformation
 	// centers, NOT the actual positions of the windows!)
@@ -192,6 +192,10 @@
 	SKINFLOAT(ALPHA_SERVERLIST_FAVORITE, 0.8);
 	SKINVECTOR(COLOR_SERVERLIST_FAVORITE, '1 1 1');
 
+	// item: server info
+	SKINVECTOR(COLOR_SERVERINFO_NAME, '1 1 1');
+	SKINVECTOR(COLOR_SERVERINFO_IP, '0.4 0.4 0.7');
+
 	// item: skin list
 	SKINVECTOR(COLOR_SKINLIST_TITLE, '1 1 1');
 	SKINVECTOR(COLOR_SKINLIST_AUTHOR, '0.4 0.4 0.7');

Modified: branches/nexuiz-2.0/data/qcsrc/server/arena.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -18,6 +18,8 @@
 void onslaught_generator_reset();
 void onslaught_controlpoint_reset();
 void func_breakable_reset();
+void assault_objective_reset();
+void target_assault_roundend_reset();
 
 /**
  * Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
@@ -108,19 +110,38 @@
 		{
 			self.team = self.team_saved;
 		}
-		else if(self.classname == "func_breakable" || self.classname == "func_assault_destructible")
+		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 come LAST (keyhunt keys reference them)
+	// Waypoints and assault start come LAST
 	for(self = world; (self = nextent(self)); )
+	if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+	{
 		if(self.classname == "sprite_waypoint")
 		{
 			if(self.health | g_keyhunt)
 				WaypointSprite_Kill(self);
 		}
+		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

Modified: branches/nexuiz-2.0/data/qcsrc/server/assault.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/assault.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/assault.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,39 +1,24 @@
 void spawnfunc_func_breakable();
+void target_objective_decrease_activate();
+.entity assault_decreaser;
+.entity assault_sprite;
 
-//=============================================================================
-
-/*QUAKED spawnfunc_info_player_attacker (1 0 0) (-16 -16 -24) (16 16 45) INITIAL
-Normal attacker spawning location for Nexuiz Asssault
--------- KEYS --------
-angle : direction in which player will look when spawning in the game. Does not apply to bots.
-target : this should point to a spawnfunc_target_objective to decide when this spawning point is active.
-nobots : when set to 1, bots will never use this spawn point to respawn in the game.
-nohumans : when set to 1, human players will never use this spawn point to respawn in the game.
-notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
-notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
-notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
--------- SPAWNFLAGS --------
-INITIAL : makes the spawnpoint the initial place for the player to spawn at the beginning of the game.*/
 void spawnfunc_info_player_attacker() {
+	if(!g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM1; // red, gets swapped every round
 	spawnfunc_info_player_deathmatch();
 }
 
-//=============================================================================
-
-/*QUAKED spawnfunc_info_player_defender (0 1 0) (-16 -16 -24) (16 16 45) INITIAL
-Normal defender spawning location for Nexuiz Asssault
--------- KEYS --------
-angle : direction in which player will look when spawning in the game. Does not apply to bots.
-target : this should point to a spawnfunc_target_objective to decide when this spawning point is active.
-nobots : when set to 1, bots will never use this spawn point to respawn in the game.
-nohumans : when set to 1, human players will never use this spawn point to respawn in the game.
-notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
-notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
-notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
--------- SPAWNFLAGS --------
-INITIAL : makes the spawnpoint the initial place for the player to spawn at the beginning of the game.*/
 void spawnfunc_info_player_defender() {
+	if(!g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM2; // blue, gets swapped every round
 	spawnfunc_info_player_deathmatch();
 }
@@ -45,155 +30,143 @@
 }
 
 void assault_objective_use() {
+	if(other.classname == "info_player_deathmatch") // a spawn, a spawn
+		return;
+
 	// activate objective
 	self.health = 100;
-	self.nextthink = time + 0.1;
-}
+	print("^2Activated objective ", self.targetname, "=", etos(self), "\n");
+	print("Activator is ", activator.classname, "\n");
 
-void assault_objective_think() {
-	if(self.health < 0) {
-		//self.effects = 0;
-		activator = self;
-		SUB_UseTargets();
-	} else {
-		//self.effects = EF_STARDUST;
-		self.nextthink = time + 0.1;
+	entity oldself;
+	oldself = self;
+
+	for(self = world; (self = find(self, target, oldself.targetname)); )
+	{
+		if(self.classname == "target_objective_decrease")
+			target_objective_decrease_activate();
 	}
 
+	self = oldself;
 }
-//=============================================================================
 
-/*QUAKED spawnfunc_target_objective (0 .5 0) (-8 -8 -8) (8 8 8)
-Objective controller for Nexuiz Assault. When active it has 100 health. If it falls below 0 then
-it'll trigger the next targeted entity (usually the next objective or spawnfunc_target_assault_roundend etc.)
--------- KEYS --------
-targetname : point to e.g. next objective*/
 void spawnfunc_target_objective() {
 	self.classname = "target_objective";
-	self.think = assault_objective_think;
 	self.use = assault_objective_use;
 	assault_objective_reset();
 }
 
-float assault_objective_decrease_customizeforclient() {
-	if(!self.spawnflags)
-		return FALSE;
 
-	if(self.cnt == 0) {
-		if(other.team == assault_attacker_team)
-			if(self.spawnflags == 1)
-				setmodel(self, "models/sprites/push.sp2");
-			else
-				setmodel(self, "models/sprites/destroy.sp2");
-		else
-			setmodel(self, "models/sprites/defend.sp2");
-	} else {
-		return FALSE;
+// decrease the health of targeted objectives
+void assault_objective_decrease_use() {
+	if(activator.team != assault_attacker_team) {
+		// wrong team triggered decrease
+		return;
 	}
-	return TRUE;
-}
 
+	if(other.assault_sprite.classname == "assault_decreaser_sprite")
+		WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
+	else
+		return; // already activated! cannot activate again!
 
-void assault_objective_decrease_think() {
+	if(self.enemy.health < ASSAULT_VALUE_INACTIVE)
+	{
+		if(self.enemy.health - self.dmg > 0.5)
+		{
+			PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.dmg);
+			self.enemy.health = self.enemy.health - self.dmg;
+		}
+		else
+		{
+			PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.enemy.health);
+			PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1);
+			self.enemy.health = -1;
 
-	local entity objective;
-	local float found;
-	found = 0;
-	objective = find(world, targetname, self.target);
-	while(objective && found == 0) {
-		if(objective.classname == "target_objective") {
-			found = 1;
-			if(objective.health < ASSAULT_VALUE_INACTIVE) { // targeted objective is active
-				if(self.cnt == 1 && self.max_health >= ASSAULT_VALUE_INACTIVE) {
-					// decrease was fired already, but objective did recover (round reset)
-					self.cnt = 0;
-				}
-			} else { // objective isn't active
-				self.cnt = 1;
-			}
-			self.max_health = objective.health; // save current objective status for next think
+			entity oldself, oldactivator;
+
+			oldself = self;
+			self = oldself.enemy;
+				oldactivator = activator;
+				activator = oldself;
+					SUB_UseTargets();
+				activator = oldactivator;
+			self = oldself;
 		}
 	}
+}
 
-	if(!self.spawnflags) {
-		local entity ent;
-		ent = find(world, target, self.targetname);
-		if(ent) {
-			if(ent.classname == "func_assault_destructible")
-				self.spawnflags = 2;
+void assault_setenemytoobjective()
+{
+	local entity objective;
+	for(objective = world; (objective = find(objective, targetname, self.target)); ) {
+		if(objective.classname == "target_objective") {
+			if(self.enemy == world)
+				self.enemy = objective;
 			else
-				self.spawnflags = 1;
+				objerror("more than one objective as target - fix the map!");
+			break;
 		}
 	}
 
-	self.nextthink = time + 0.2;
+	if(self.enemy == world)
+		objerror("no objective as target - fix the map!");
 }
 
+float assault_decreaser_sprite_visible(entity e)
+{
+	entity decreaser;
+	entity object;
 
-// decrease the health of targeted objectives
-void assault_objective_decrease_use() {
+	decreaser = self.assault_decreaser;
 
-	if(self.cnt > 0) {
-		// did already fire
-		return;
-	}
+	if(decreaser.enemy.health >= ASSAULT_VALUE_INACTIVE)
+		return FALSE;
 
-	if(activator.team != assault_attacker_team) {
-		// wrong team triggered decrease
-		return;
-	}
+	return TRUE;
+}
 
-	local entity ent;
-	ent = find(world, targetname, self.target);
-	while(ent) {
-		if(ent.health > 0 && ent.health < ASSAULT_VALUE_INACTIVE)
-			ent.health = ent.health - self.dmg;
-		ent = find(ent, targetname, self.target);
+void target_objective_decrease_activate()
+{
+	entity ent, spr;
+	self.owner = world;
+	for(ent = world; (ent = find(ent, target, self.targetname)); )
+	{
+		if(ent.assault_sprite != world)
+			WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
+
+		spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
+		spr.assault_decreaser = self;
+		spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
+		spr.classname = "assault_decreaser_sprite";
+		WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY);
+		if(ent.classname == "func_assault_destructible")
+			WaypointSprite_UpdateSprites(spr, "as-defend", "as-destroy", "as-destroy");
+		else
+			WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
+		WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
 	}
+}
 
-	self.cnt = 1;
+void target_objective_decrease_findtarget()
+{
+	assault_setenemytoobjective();
 }
 
 //=============================================================================
 
-/*QUAKED target_objective_decrease (0 .5 0) (-8 -8 -8) (8 8 8)
-When triggered decreases health of the targeted spawnfunc_target_objective.
--------- KEYS --------
-targetname : point to a spawnfunc_target_objective entity*/
 void spawnfunc_target_objective_decrease() {
 
 	self.classname = "target_objective_decrease";
 
-	precache_model("models/sprites/defend.sp2");
-	precache_model("models/sprites/destroy.sp2");
-	precache_model("models/sprites/push.sp2");
-
 	if(!self.dmg) {
 		self.dmg = 101;
 	}
-	self.cnt = 0; // not used yet
 	self.use = assault_objective_decrease_use;
-	self.mdl = "models/sprites/here.sp2";
-	self.effects = EF_NODEPTHTEST;
 	self.health = ASSAULT_VALUE_INACTIVE;
 	self.max_health = ASSAULT_VALUE_INACTIVE;
-	self.think = assault_objective_decrease_think;
-	self.customizeentityforclient = assault_objective_decrease_customizeforclient;
-	self.nextthink = time;
-}
+	self.enemy = world;
 
-
-void assault_destructible_reset() {
-	self.health = self.max_health;
-	self.model = self.mdl;
-	self.solid = SOLID_BSP;
-	self.colormod = '1 1 1';
-	self.cnt = 0; // not active
-	if(self.spawnflags)
-	{
-		activator = self;
-		self.use();
-	}
+	InitializeEntity(self, target_objective_decrease_findtarget, INITPRIO_FINDTARGET);
 }
 
 // destructible walls that can be used to trigger target_objective_decrease
@@ -203,17 +176,7 @@
 }
 
 void assault_wall_think() {
-	local entity ent;
-	local float notvisible;
-	notvisible = 0;
-	ent = find(world, targetname, self.target);
-	while(ent) {
-		if(ent.classname == "target_objective" && ent.health < 0)
-			notvisible = 1;
-		ent = find(ent, targetname, self.target);
-	}
-
-	if(notvisible) {
+	if(self.enemy.health < 0) {
 		self.model = "";
 		self.solid = SOLID_NOT;
 	} else {
@@ -231,10 +194,12 @@
 	self.solid = SOLID_BSP;
 	self.think = assault_wall_think;
 	self.nextthink = time;
+	InitializeEntity(self, assault_setenemytoobjective, INITPRIO_FINDTARGET);
 }
 
 
 void target_assault_roundend_reset() {
+	print("round end reset\n");
 	self.cnt = self.cnt + 1; // up round counter
 	self.winning = 0; // up round
 }
@@ -244,10 +209,6 @@
 }
 
 void spawnfunc_target_assault_roundend() {
-	if(!self.health)
-		self.health = 300; // 5 minutes
-
-	cvar_set("timelimit", ftos(self.health/60));
 	self.winning = 0; // round not yet won by attackers
 	self.classname = "target_assault_roundend";
 	self.use = target_assault_roundend_use;
@@ -259,27 +220,27 @@
 	activator = self;
 	SUB_UseTargets();
 
-/*
+	/*
 #ifdef TTURRETS_ENABLED
-    entity ent,oldself;
+entity ent,oldself;
 
 	//(Re)spawn all turrets
 	oldself = self;
 	ent = find(world, classname, "turret_main");
 	while(ent) {
-	    // Swap turret teams
-        if(ent.team == COLOR_TEAM1)
-            ent.team = COLOR_TEAM2;
-        else
-            ent.team = COLOR_TEAM1;
+	// Swap turret teams
+	if(ent.team == COLOR_TEAM1)
+	ent.team = COLOR_TEAM2;
+	else
+	ent.team = COLOR_TEAM1;
 
-        self = ent;
+	self = ent;
 
-        // Dubbles as teamchange
-        turret_stdproc_respawn();
-        //ent.turret_spawnfunc();
+	// Dubbles as teamchange
+	turret_stdproc_respawn();
+	//ent.turret_spawnfunc();
 
-		ent = find(ent, classname, "turret_main");
+	ent = find(ent, classname, "turret_main");
 	}
 	self = oldself;
 #endif
@@ -291,32 +252,17 @@
 	assault_attacker_team = COLOR_TEAM1;
 	self.classname = "target_assault_roundstart";
 	self.use = assault_roundstart_use;
-	self.think = assault_roundstart_use;
-	self.nextthink = time + 0.1;
+	InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET);
 }
 
 // trigger new round
 // reset objectives, toggle spawnpoints, reset triggers, ...
 void assault_new_round() {
+	bprint("ASSAULT: new round\n");
 
 	// up round counter
 	self.winning = self.winning + 1;
-	// set end time for next round
-	self.cnt = time + self.health;
 
-	// swap spawn point teams
-	local entity ent;
-	local entity oldself;
-
-	// reward attackers for winning the round
-	ent = find(world, classname, "player");
-	while(ent) {
-		if(ent.team == assault_attacker_team) {
-			UpdateFrags(ent, 10);
-		}
-		ent = find(ent, classname, "player");
-	}
-
 	// swap attacker/defender roles
 	if(assault_attacker_team == COLOR_TEAM1) {
 		assault_attacker_team = COLOR_TEAM2;
@@ -324,92 +270,32 @@
 		assault_attacker_team = COLOR_TEAM1;
 	}
 
+	// swap spawn point teams
+	local entity ent;
+	local entity oldself;
 	ent = find(world, classname, "info_player_deathmatch");
 	while (ent)
 	{
-		oldself = self;
-		self = ent;
-		if(self.team == COLOR_TEAM1) {
-			self.team = COLOR_TEAM2;
+		if(ent.team == COLOR_TEAM1) {
+			ent.team = COLOR_TEAM2;
 		} else {
-			self.team = COLOR_TEAM1;
+			ent.team = COLOR_TEAM1;
 		}
-		self = oldself;
-
 		ent = find(ent, classname, "info_player_deathmatch");
 	}
 
-	// reset all objectives
-	ent = find(world, classname, "target_objective");
-	while (ent)
-	{
-		oldself = self;
-		self = ent;
-		assault_objective_reset();
-		self = oldself;
-
-		ent = find(ent, classname, "target_objective");
-	}
-
-	// reset round end triggers
-	ent = find(world, classname, "target_assault_roundend");
-	while (ent)
-	{
-		oldself = self;
-		self = ent;
-		target_assault_roundend_reset();
-		self = oldself;
-
-		ent = find(ent, classname, "target_assault_roundend");
-	}
-
-	// reset all target_object_decrease
-	ent = find(world, classname, "target_objective_decrease");
-	while (ent)
-	{
-		ent.cnt = 0;
-		ent = find(ent, classname, "target_objective_decrease");
-	}
-
-	// reset all spawnfunc_func_assault_destructible
+	// swap all destructibles
 	ent = find(world, classname, "func_assault_destructible");
 	while (ent)
 	{
-		oldself = self;
-		self = ent;
-
-        if(ent.team == COLOR_TEAM1)
-            ent.team = COLOR_TEAM2;
-        else
-            ent.team = COLOR_TEAM1;
-
-		assault_destructible_reset();
-		self = oldself;
+		if(ent.team == COLOR_TEAM1)
+			ent.team = COLOR_TEAM2;
+		else
+			ent.team = COLOR_TEAM1;
 		ent = find(ent, classname, "func_assault_destructible");
 	}
 
-	ent = find(world, classname, "target_assault_roundstart");
-	while (ent)
-	{
-		oldself = self;
-		self = ent;
-		self.use();
-		self = oldself;
-		ent = find(ent, classname, "target_assault_roundstart");
-	}
-
-	// actually restart round... how to do that?
-	ent = find(world, classname, "player");
-	while(ent) {
-		oldself = self;
-		self = ent;
-		PutClientInServer();
-		self = oldself;
-		ent = find(ent, classname, "player");
-
-	}
-
-
+	// 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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,3 @@
-// let's abuse an existing field
 #define SPAWNPOINT_SCORE frags
 
 .float wantswelcomemessage;
@@ -586,6 +585,21 @@
 				setcolor(self, cvar("sv_defaultplayercolors"));
 }
 
+void PlayerTouchExplode(entity p1, entity p2)
+{
+	vector org;
+	org = (p1.origin + p2.origin) * 0.5;
+	org_z += (p1.mins_z + p2.mins_z) * 0.5;
+
+	te_explosion(org);
+
+	entity e;
+	e = spawn();
+	setorigin(e, org);
+	RadiusDamage(e, world, g_touchexplode_damage, g_touchexplode_edgedamage, g_touchexplode_radius, world, g_touchexplode_force, DEATH_TOUCHEXPLODE, world);
+	remove(e);
+}
+
 /*
 =============
 PutClientInServer
@@ -620,7 +634,7 @@
 		self.classname = "observer";
 
 	if(self.classname == "player") {
-		entity	spot;
+		entity spot, oldself;
 
 		race_PreSpawn();
 
@@ -789,6 +803,15 @@
 				centerprint(self, "You are defending!\n");
 		}
 
+		target_voicescript_clear(self);
+
+		oldself = self;
+		self = spot;
+			activator = oldself;
+				SUB_UseTargets();
+			activator = world;
+		self = oldself;
+
 	} else if(self.classname == "observer") {
 		PutObserverInServer ();
 	}
@@ -854,6 +877,9 @@
 	self.parm_idlesince = parm1;
 	if(self.parm_idlesince == -(86400 * 366))
 		self.parm_idlesince = time;
+
+	// whatever happens, allow 60 seconds of idling directly after connect for map loading
+	self.parm_idlesince = max(self.parm_idlesince, time - sv_maxidle + 60);
 }
 
 /*
@@ -914,7 +940,7 @@
 		if(clienttype(self.owner) == CLIENTTYPE_REAL)
 		{
 			if(self.cnt <= 10)
-				announce(self.owner, strcat("announcer/robotic/", ftos(self.cnt), ".ogg"));
+				announce(self.owner, strcat("announcer/robotic/", ftos(self.cnt), ".wav"));
 			if(self.owner.killindicator_teamchange)
 			{
 				if(self.owner.killindicator_teamchange == -1)
@@ -1246,14 +1272,17 @@
 			MapVote_UpdateData(MSG_ONE);
 		}
 		ScoreInfo_Write(MSG_ONE);
-	}
 
-	if(inWarmupStage)
-	{
-		msg_entity = self;
-		WriteByte(MSG_ONE, SVC_TEMPENTITY);
-		WriteByte(MSG_ONE, TE_CSQC_WARMUP);
-		WriteByte(MSG_ONE, 1);
+		if(inWarmupStage)
+		{
+			msg_entity = self;
+			WriteByte(MSG_ONE, SVC_TEMPENTITY);
+			WriteByte(MSG_ONE, TE_CSQC_WARMUP);
+			WriteByte(MSG_ONE, 1);
+		}
+
+		if(cvar("g_bugrigs"))
+			stuffcmd(self, "cl_cmd settemp chase_active 1\n");
 	}
 
 	if(g_lms)
@@ -1729,7 +1758,7 @@
 	self.armortype = spectatee.armortype;
 	self.armorvalue = spectatee.armorvalue;
 	self.currentammo = spectatee.currentammo;
-	self.effects = spectatee.effects;
+	self.effects = spectatee.effects & EFMASK_CHEAP; // eat performance
 	self.health = spectatee.health;
 	self.impulse = 0;
 	self.items = spectatee.items;
@@ -1808,7 +1837,7 @@
 		{
 			self.respawn_countdown = number - 1;
 			if(ceil(self.death_time - (time + 0.5)) == number) // only say it if it is the same number even in 0.5s; to prevent overlapping sounds
-				announce(self, strcat("announcer/robotic/", ftos(number), ".ogg"));
+				announce(self, strcat("announcer/robotic/", ftos(number), ".wav"));
 		}
 	}
 }
@@ -1937,10 +1966,8 @@
 			self.flags = self.flags | FL_JUMPRELEASED;
 		}
 	}
-	/*
 	if(self.BUTTON_ZOOM)
 		self.wantswelcomemessage = 0;
-	*/
 	if(self.wantswelcomemessage)
 		PrintWelcomeMessage(self);
 }
@@ -1976,15 +2003,15 @@
 			self.flags = self.flags | FL_JUMPRELEASED;
 		}
 	}
-	/*
 	if(self.BUTTON_ZOOM)
 		self.wantswelcomemessage = 0;
-	*/
 	if(self.wantswelcomemessage)
 		PrintWelcomeMessage(self);
 	self.flags = self.flags | FL_CLIENT | FL_NOTARGET;
 }
 
+.float touchexplode_time;
+
 /*
 =============
 PlayerPreThink
@@ -2132,6 +2159,24 @@
 			return;
 		}
 
+		if(g_touchexplode)
+		if(time > self.touchexplode_time)
+		if(self.classname == "player")
+		if(self.deadflag == DEAD_NO)
+		if not(IS_INDEPENDENT_PLAYER(self))
+		FOR_EACH_PLAYER(other) if(self != other)
+		{
+			if(time > other.touchexplode_time)
+			if(other.classname == "player")
+			if(other.deadflag == DEAD_NO)
+			if not(IS_INDEPENDENT_PLAYER(other))
+			if(boxesoverlap(self.absmin, self.absmax, other.absmin, other.absmax))
+			{
+				PlayerTouchExplode(self, other);
+				self.touchexplode_time = other.touchexplode_time = time + 0.2;
+			}
+		}
+
 		if(g_lms && !self.deadflag && cvar("g_lms_campcheck_interval"))
 		{
 			vector dist;
@@ -2162,6 +2207,8 @@
 			}
 		}
 
+		self.oldorigin = self.origin;
+
 		if (self.BUTTON_CROUCH && !self.hook.state)
 		{
 			if (!self.crouch)
@@ -2251,6 +2298,8 @@
 		self.pusher = oldpusher;
 		self = oldself;
 	}
+
+	target_voicescript_next(self);
 }
 
 
@@ -2280,7 +2329,7 @@
 		if(timeleft <= 0)
 		{
 			bprint("^3", self.netname, "^3 was kicked for idling.\n");
-			announce(self, "announcer/robotic/terminated.ogg");
+			announce(self, "announcer/robotic/terminated.wav");
 			dropclient(self);
 			return;
 		}
@@ -2289,7 +2338,7 @@
 			if(timeleft != self.idlekick_lasttimeleft)
 			{
 				centerprint_atprio(self, CENTERPRIO_IDLEKICK, strcat("^3Stop idling!\n^3Disconnecting in ", ftos(timeleft), "..."));
-				announce(self, strcat("announcer/robotic/", ftos(timeleft), ".ogg"));
+				announce(self, strcat("announcer/robotic/", ftos(timeleft), ".wav"));
 			}
 		}
 		else

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -307,186 +307,195 @@
 	}
 	else if(imp >= 140 && imp <= 149 || imp == 99) // 10 cheats ought to be enough for anyone
 	{
-		if(sv_cheats)
 		if(self.deadflag == DEAD_NO)
 		{
-			switch(imp)
+			if(sv_cheats || (self.lip < sv_clones))
 			{
-				case 99:
-					self.weapons |= WEPBIT_ALL;
-					self.items |= IT_UNLIMITED_WEAPON_AMMO;
-					self.ammo_shells = g_pickup_shells_max;
-					self.ammo_nails = g_pickup_nails_max;
-					self.ammo_rockets = g_pickup_rockets_max;
-					self.ammo_cells = g_pickup_cells_max;
-					self.health = g_pickup_healthsmall_max;
-					self.armorvalue = g_pickup_armorsmall_max;
-					self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
-					self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
-					self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
-					// precache weapon models/sounds
-					wep = WEP_FIRST;
-					while (wep <= WEP_LAST)
-					{
-						weapon_action(wep, WR_PRECACHE);
-						wep = wep + 1;
-					}
-					break;
-				case 140:
-					makevectors (self.v_angle);
-					self.velocity = self.velocity + v_forward * 300;
-					CopyBody(1);
-					self.lip += 1;
-					self.velocity = self.velocity - v_forward * 300;
-					break;
-				case 141:
-					if(self.waypointsprite_deployed_personal)
-					{
-						self.speedrunning = TRUE;
-						tracebox(self.waypointsprite_deployed_personal.origin, self.mins, self.maxs, self.waypointsprite_deployed_personal.origin, MOVE_WORLDONLY, self);
-						if(trace_startsolid)
+				switch(imp)
+				{	
+					 case 140:
+						makevectors (self.v_angle);
+						self.velocity = self.velocity + v_forward * 300;
+						CopyBody(1);
+						self.lip += 1;
+						self.velocity = self.velocity - v_forward * 300;
+						break;
+					case 142:
+						CopyBody(0);
+						self.lip += 1;
+						break;
+				 }
+			}
+
+			if(sv_cheats)
+			{
+				switch(imp)
+				{
+					case 99:
+						self.weapons |= WEPBIT_ALL;
+						self.items |= IT_UNLIMITED_AMMO;
+						self.ammo_shells = g_pickup_shells_max;
+						self.ammo_nails = g_pickup_nails_max;
+						self.ammo_rockets = g_pickup_rockets_max;
+						self.ammo_cells = g_pickup_cells_max;
+						self.health = g_pickup_healthsmall_max;
+						self.armorvalue = g_pickup_armorsmall_max;
+						self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
+						self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
+						self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
+						// precache weapon models/sounds
+						wep = WEP_FIRST;
+						while (wep <= WEP_LAST)
 						{
-							sprint(self, "Cannot move there, cheater - only waypoints set using g_waypointsprite_personal work\n");
+							weapon_action(wep, WR_PRECACHE);
+							wep = wep + 1;
 						}
-						else
+						break;
+					case 141:
+						if(self.waypointsprite_deployed_personal)
 						{
-							// Abort speedrun, teleport back
-							setorigin(self, self.waypointsprite_deployed_personal.origin);
-							self.oldvelocity = self.velocity = self.personal_velocity;
-							self.angles = self.personal_v_angle;
-							self.fixangle = TRUE;
-							if(self.flagcarried)
+							self.speedrunning = TRUE;
+							tracebox(self.waypointsprite_deployed_personal.origin, self.mins, self.maxs, self.waypointsprite_deployed_personal.origin, MOVE_WORLDONLY, self);
+							if(trace_startsolid)
 							{
-								bprint("The ", self.flagcarried.netname, " was returned to base by its carrier\n");
-								ReturnFlag(self.flagcarried);
+								sprint(self, "Cannot move there, cheater - only waypoints set using g_waypointsprite_personal work\n");
 							}
+							else
+							{
+								// Abort speedrun, teleport back
+								setorigin(self, self.waypointsprite_deployed_personal.origin);
+								self.oldvelocity = self.velocity = self.personal_velocity;
+								self.angles = self.personal_v_angle;
+								self.fixangle = TRUE;
+								if(self.flagcarried)
+								{
+									bprint("The ", self.flagcarried.netname, " was returned to base by its carrier\n");
+									ReturnFlag(self.flagcarried);
+								}
+							}
+							self.ammo_rockets = 999;
+							self.ammo_nails = 999;
+							self.ammo_cells = 999;
+							self.ammo_shells = 999;
+							self.health = start_health;
+							self.armorvalue = start_armorvalue;
+							self.weapons |= weaponsInMap;
+							self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
+							self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
+							self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
 						}
-						self.ammo_rockets = 999;
-						self.ammo_nails = 999;
-						self.ammo_cells = 999;
-						self.ammo_shells = 999;
-						self.health = start_health;
-						self.armorvalue = start_armorvalue;
-						self.weapons |= weaponsInMap;
-						self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
-						self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
-						self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
-					}
-					else if(self.deadflag != DEAD_NO)
-						sprint(self, "UR DEAD AHAHAH))\n");
-					else
-						sprint(self, "No waypoint set, cheater (use g_waypointsprite_personal to set one)\n");
-					break;
-				case 142:
-					CopyBody(0);
-					self.lip += 1;
-					break;
-				case 143:
-					good = DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP;
-					evil = DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER;
-					evilsurf = Q3SURFACEFLAG_SKY;
+						else if(self.deadflag != DEAD_NO)
+							sprint(self, "UR DEAD AHAHAH))\n");
+						else
+							sprint(self, "No waypoint set, cheater (use g_waypointsprite_personal to set one)\n");
+						break;
+					case 143:
+						good = DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP;
+						evil = DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER;
+						evilsurf = Q3SURFACEFLAG_SKY;
 
-					m = self.dphitcontentsmask;
-					self.dphitcontentsmask = good | evil;
+						m = self.dphitcontentsmask;
+						self.dphitcontentsmask = good | evil;
 
-					org = world.mins;
-					delta = world.maxs - world.mins;
+						org = world.mins;
+						delta = world.maxs - world.mins;
 
-					maxattempts = ((sv_cheats >= 2) ? 100000 : 100);
+						maxattempts = ((sv_cheats >= 2) ? 100000 : 100);
 
-					for(i = 0; i < maxattempts; ++i)
-					{
-						start_x = org_x + random() * delta_x;
-						start_y = org_y + random() * delta_y;
-						start_z = org_z + random() * delta_z;
+						for(i = 0; i < maxattempts; ++i)
+						{
+							start_x = org_x + random() * delta_x;
+							start_y = org_y + random() * delta_y;
+							start_z = org_z + random() * delta_z;
 
-						// rule 1: start inside world bounds, and outside
-						// solid, and don't start from somewhere where you can
-						// fall down to evil
-						tracebox(start, self.mins, self.maxs, start - '0 0 1' * delta_z, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
-						if(trace_startsolid)
-							continue;
-						dprint("hit contents ", ftos(trace_dphitcontents), "\n");
-						if(trace_dphitcontents & evil)
-							continue;
-						if(trace_dphitq3surfaceflags & evilsurf)
-							continue;
+							// rule 1: start inside world bounds, and outside
+							// solid, and don't start from somewhere where you can
+							// fall down to evil
+							tracebox(start, self.mins, self.maxs, start - '0 0 1' * delta_z, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
+							if(trace_startsolid)
+								continue;
+							dprint("hit contents ", ftos(trace_dphitcontents), "\n");
+							if(trace_dphitcontents & evil)
+								continue;
+							if(trace_dphitq3surfaceflags & evilsurf)
+								continue;
 
-						// rule 2: if we are too high, lower the point
-						if(trace_fraction * delta_z > 1024)
-							start = trace_endpos + '0 0 1024';
-						enddown = trace_endpos;
+							// rule 2: if we are too high, lower the point
+							if(trace_fraction * delta_z > 1024)
+								start = trace_endpos + '0 0 1024';
+							enddown = trace_endpos;
 
-						// these can be traceLINES as we already verified the starting box
-						traceline(start, start + '1 0 0' * delta_x, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
-						traceline(start, start - '1 0 0' * delta_x, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
-						traceline(start, start + '0 1 0' * delta_y, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
-						traceline(start, start - '0 1 0' * delta_y, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
-						traceline(start, start + '0 0 1' * delta_z, MOVE_NORMAL, self);
-						if(trace_fraction >= 1)
-							continue;
+							// these can be traceLINES as we already verified the starting box
+							traceline(start, start + '1 0 0' * delta_x, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
+							traceline(start, start - '1 0 0' * delta_x, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
+							traceline(start, start + '0 1 0' * delta_y, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
+							traceline(start, start - '0 1 0' * delta_y, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
+							traceline(start, start + '0 0 1' * delta_z, MOVE_NORMAL, self);
+							if(trace_fraction >= 1)
+								continue;
 
-						end_x = org_x + random() * delta_x;
-						end_y = org_y + random() * delta_y;
-						end_z = org_z + random() * delta_z;
-						end = start + normalize(end - start) * vlen(delta);
+							end_x = org_x + random() * delta_x;
+							end_y = org_y + random() * delta_y;
+							end_z = org_z + random() * delta_z;
+							end = start + normalize(end - start) * vlen(delta);
 
-						// rule 3: start TO end must not be too short
-						tracebox(start, self.mins, self.maxs, end, MOVE_NORMAL, self);
-						if(trace_startsolid)
-							continue;
-						if(trace_fraction < 256 / vlen(delta))
-							continue;
+							// rule 3: start TO end must not be too short
+							tracebox(start, self.mins, self.maxs, end, MOVE_NORMAL, self);
+							if(trace_startsolid)
+								continue;
+							if(trace_fraction < 256 / vlen(delta))
+								continue;
 
-						// rule 4: don't want to look at sky
-						if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
-							continue;
+							// rule 4: don't want to look at sky
+							if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
+								continue;
 
-						// rule 5: we must not end up in trigger_hurt
-						if(tracebox_hits_trigger_hurt(start, self.mins, self.maxs, enddown))
+							// rule 5: we must not end up in trigger_hurt
+							if(tracebox_hits_trigger_hurt(start, self.mins, self.maxs, enddown))
+							{
+								dprint("trigger_hurt! ouch! and nothing else could find it!\n");
+								continue;
+							}
+
+							break;
+						}
+
+						if(i < maxattempts)
 						{
-							dprint("trigger_hurt! ouch! and nothing else could find it!\n");
-							continue;
+							self.origin = start;
+							self.angles = vectoangles(end - start);
+							self.angles_x = -self.angles_x;
+							self.fixangle = TRUE;
+							self.velocity = '0 0 0';
+							dprint("Needed ", ftos(i + 1), " attempts\n");
 						}
+						else
+							sprint(self, "Emergency teleport could not find a good location, forget it!\n");
 
+						self.dphitcontentsmask = m;
 						break;
-					}
-
-					if(i < maxattempts)
-					{
-						self.origin = start;
-						self.angles = vectoangles(end - start);
-						self.angles_x = -self.angles_x;
-						self.fixangle = TRUE;
-						self.velocity = '0 0 0';
-						dprint("Needed ", ftos(i + 1), " attempts\n");
-					}
-					else
-						sprint(self, "Emergency teleport could not find a good location, forget it!\n");
-
-					self.dphitcontentsmask = m;
-					break;
-				case 144:
-					makevectors(self.v_angle);
-					traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * MAX_SHOT_DISTANCE, FALSE, self);
-					if (trace_fraction < 1)
-						printsurfaceinfo(trace_ent, trace_endpos);
-					break;
-				case 145:
-					makevectors(self.v_angle);
-					traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 65536, FALSE, self);
-					sprint(self, strcat("distance: ", ftos(fabs(vlen(trace_endpos - (self.origin + self.view_ofs)))), "\n"));
-					break;
+					case 144:
+						makevectors(self.v_angle);
+						traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * MAX_SHOT_DISTANCE, FALSE, self);
+						if (trace_fraction < 1)
+							printsurfaceinfo(trace_ent, trace_endpos);
+						break;
+					case 145:
+						makevectors(self.v_angle);
+						traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 65536, FALSE, self);
+						sprint(self, strcat("distance: ", ftos(fabs(vlen(trace_endpos - (self.origin + self.view_ofs)))), "\n"));
+						break;
+				}
 			}
 		}
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -117,6 +117,232 @@
 	}
 };
 
+float racecar_angle(float forward, float down)
+{
+	float ret, angle_mult;
+
+	if(forward < 0)
+	{
+		forward = -forward;
+		down = -down;
+	}
+
+	ret = vectoyaw('0 1 0' * down + '1 0 0' * forward);
+
+	angle_mult = forward / (800 + forward);
+
+	if(ret > 180)
+		return ret * angle_mult + 360 * (1 - angle_mult);
+	else
+		return ret * angle_mult;
+}
+
+void RaceCarPhysics()
+{
+	// using this move type for "big rigs"
+	// the engine does not push the entity!
+
+	float accel, steer, f;
+	vector angles_save, rigvel;
+
+	angles_save = self.angles;
+	accel = bound(-1, self.movement_x / sv_maxspeed, 1);
+	steer = bound(-1, self.movement_y / sv_maxspeed, 1);
+
+	if(g_bugrigs_reverse_speeding)
+	{
+		if(accel < 0)
+		{
+			// back accel is DIGITAL
+			// to prevent speedhack
+			if(accel < -0.5)
+				accel = -1;
+			else
+				accel = 0;
+		}
+	}
+
+	self.angles_x = 0;
+	self.angles_z = 0;
+	makevectors(self.angles); // new forward direction!
+
+	if(self.flags & FL_ONGROUND || g_bugrigs_air_steering)
+	{
+		float myspeed, upspeed, steerfactor, accelfactor;
+
+		myspeed = self.velocity * v_forward;
+		upspeed = self.velocity * v_up;
+
+		// responsiveness factor for steering and acceleration
+		f = 1 / (1 + pow(max(-myspeed, myspeed) / g_bugrigs_speed_ref, g_bugrigs_speed_pow));
+		//MAXIMA: f(v) := 1 / (1 + (v / g_bugrigs_speed_ref) ^ g_bugrigs_speed_pow);
+
+		if(myspeed < 0 && g_bugrigs_reverse_spinning)
+			steerfactor = -myspeed * g_bugrigs_steer;
+		else
+			steerfactor = -myspeed * f * g_bugrigs_steer;
+
+		if(myspeed < 0 && g_bugrigs_reverse_speeding)
+			accelfactor = g_bugrigs_accel;
+		else
+			accelfactor = f * g_bugrigs_accel;
+		//MAXIMA: accel(v) := f(v) * g_bugrigs_accel;
+
+		if(accel < 0)
+		{
+			if(myspeed > 0)
+			{
+				myspeed = max(0, myspeed - frametime * (g_bugrigs_friction_floor - g_bugrigs_friction_brake * accel));
+			}
+			else
+			{
+				if(!g_bugrigs_reverse_speeding)
+					myspeed = min(0, myspeed + frametime * g_bugrigs_friction_floor);
+			}
+		}
+		else
+		{
+			if(myspeed >= 0)
+			{
+				myspeed = max(0, myspeed - frametime * g_bugrigs_friction_floor);
+			}
+			else
+			{
+				if(g_bugrigs_reverse_stopping)
+					myspeed = 0;
+				else
+					myspeed = min(0, myspeed + frametime * (g_bugrigs_friction_floor + g_bugrigs_friction_brake * accel));
+			}
+		}
+		// terminal velocity = velocity at which 50 == accelfactor, that is, 1549 units/sec
+		//MAXIMA: friction(v) := g_bugrigs_friction_floor;
+
+		self.angles_y += steer * frametime * steerfactor; // apply steering
+		makevectors(self.angles); // new forward direction!
+
+		myspeed += accel * accelfactor * frametime;
+
+		rigvel = myspeed * v_forward + '0 0 1' * upspeed;
+	}
+	else
+	{
+		myspeed = vlen(self.velocity);
+
+		// responsiveness factor for steering and acceleration
+		f = 1 / (1 + pow(max(0, myspeed / g_bugrigs_speed_ref), g_bugrigs_speed_pow));
+		steerfactor = -myspeed * f;
+		self.angles_y += steer * frametime * steerfactor; // apply steering
+
+		rigvel = self.velocity;
+		makevectors(self.angles); // new forward direction!
+	}
+
+	rigvel = rigvel * max(0, 1 - vlen(rigvel) * g_bugrigs_friction_air * frametime);
+	//MAXIMA: airfriction(v) := v * v * g_bugrigs_friction_air;
+	//MAXIMA: total_acceleration(v) := accel(v) - friction(v) - airfriction(v);
+	//MAXIMA: solve(total_acceleration(v) = 0, v);
+
+	if(g_bugrigs_planar_movement)
+	{
+		vector rigvel_xy, neworigin, up;
+		float mt;
+
+		rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+		rigvel_xy = rigvel;
+		rigvel_xy_z = 0;
+
+		if(g_bugrigs_planar_movement_car_jumping && !g_touchexplode) // touchexplode is a better way to handle collisions
+			mt = MOVE_NORMAL;
+		else
+			mt = MOVE_NOMONSTERS;
+
+		tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 1024', mt, self);
+		up = trace_endpos - self.origin;
+
+		// BUG RIGS: align the move to the surface instead of doing collision testing
+		// can we move?
+		tracebox(trace_endpos, self.mins, self.maxs, trace_endpos + rigvel_xy * frametime, mt, self);
+
+		// align to surface
+		tracebox(trace_endpos, self.mins, self.maxs, trace_endpos - up + '0 0 1' * rigvel_z * frametime, mt, self);
+
+		if(trace_fraction < 0.5)
+		{
+			trace_fraction = 1;
+			neworigin = self.origin;
+		}
+		else
+			neworigin = trace_endpos;
+
+		if(trace_fraction < 1)
+		{
+			// now set angles_x so that the car points parallel to the surface
+			self.angles = vectoangles(
+					'1 0 0' * v_forward_x * trace_plane_normal_z
+					+
+					'0 1 0' * v_forward_y * trace_plane_normal_z
+					+
+					'0 0 1' * -(v_forward_x * trace_plane_normal_x + v_forward_y * trace_plane_normal_y)
+					);
+			self.flags |= FL_ONGROUND;
+		}
+		else
+		{
+			// now set angles_x so that the car points forward, but is tilted in velocity direction
+			self.flags (-) FL_ONGROUND;
+		}
+
+		self.velocity = (neworigin - self.origin) * (1.0 / frametime);
+		self.movetype = MOVETYPE_NOCLIP;
+	}
+	else
+	{
+		rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+		self.velocity = rigvel;
+		self.movetype = MOVETYPE_FLY;
+	}
+
+	trace_fraction = 1;
+	tracebox(self.origin, self.mins, self.maxs, self.origin - '0 0 4', MOVE_NORMAL, self);
+	if(trace_fraction != 1)
+	{
+		self.angles = vectoangles2(
+				'1 0 0' * v_forward_x * trace_plane_normal_z
+				+
+				'0 1 0' * v_forward_y * trace_plane_normal_z
+				+
+				'0 0 1' * -(v_forward_x * trace_plane_normal_x + v_forward_y * trace_plane_normal_y),
+				trace_plane_normal
+				);
+	}
+	else
+	{
+		vector vel_local;
+
+		vel_local_x = v_forward * self.velocity;
+		vel_local_y = v_right * self.velocity;
+		vel_local_z = v_up * self.velocity;
+
+		self.angles_x = racecar_angle(vel_local_x, vel_local_z);
+		self.angles_z = racecar_angle(-vel_local_y, vel_local_z);
+	}
+
+	// smooth the angles
+	vector vf1, vu1, smoothangles;
+	makevectors(self.angles);
+	f = bound(0, frametime * g_bugrigs_angle_smoothing, 1);
+	if(f == 0)
+		f = 1;
+	vf1 = v_forward * f;
+	vu1 = v_up * f;
+	makevectors(angles_save);
+	vf1 = vf1 + v_forward * (1 - f);
+	vu1 = vu1 + v_up * (1 - f);
+	smoothangles = vectoangles2(vf1, vu1);
+	self.angles_x = -smoothangles_x;
+	self.angles_z =  smoothangles_z;
+}
+
 .vector movement_old;
 .float buttons_old;
 .vector v_angle_old;
@@ -159,7 +385,7 @@
 	if (clienttype(self) == CLIENTTYPE_BOT)
 		bot_think();
 
-	if (self.movetype == MOVETYPE_NONE)
+	if (self.movetype == MOVETYPE_NONE && self.disableclientprediction != 2)
 		return;
 
 	if (self.punchangle != '0 0 0')
@@ -249,7 +475,7 @@
 	if (self.deadflag)
 		return;
 
-	if (!self.fixangle)
+	if (!self.fixangle && !g_bugrigs)
 	{
 		self.angles_x = 0;
 		self.angles_y = self.v_angle_y;
@@ -310,6 +536,10 @@
 			self.teleport_time = 0;
 		}
 	}
+	else if (g_bugrigs && self.classname == "player")
+	{
+		RaceCarPhysics();
+	}
 	else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
 	{
 		// noclipping or flying

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -364,7 +364,13 @@
 {
 	local float take, save, waves, sdelay;
 
-	damage = damage * bound(1.0, self.cvar_cl_handicap, 100.0);
+	if(!DEATH_ISSPECIAL(deathtype))
+	{
+		damage *= sqrt(bound(1.0, self.cvar_cl_handicap, 100.0));
+		if(self != attacker)
+			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 {
@@ -764,7 +770,7 @@
 	return 1;
 }
 
-string allvoicesamples = "attack attackinfive coverme defend freelance incoming meet needhelp seenflag taunt teamshoot";
+string allvoicesamples;
 float GetPlayerSoundSampleField_notFound;
 float GetPlayerSoundSampleField_fixed;
 .string GetVoiceMessageSampleField(string type)
@@ -773,18 +779,11 @@
 	GetPlayerSoundSampleField_fixed = 0;
 	switch(type)
 	{
-		case "attack":            return playersound_attack;
-		case "attackinfive":      return playersound_attackinfive;
-		case "coverme":           return playersound_coverme;
-		case "defend":            return playersound_defend;
-		case "freelance":         return playersound_freelance;
-		case "incoming":          return playersound_incoming;
-		case "meet":              return playersound_meet;
-		case "needhelp":          return playersound_needhelp;
-		case "seenflag":          return playersound_seenflag;
-		case "taunt":             return playersound_taunt;
-		case "teamshoot":         return playersound_teamshoot;
-		case "teamshoot_auto":    return playersound_teamshoot;
+#define _VOICEMSG(m) case #m: return playersound_##m;
+		ALLVOICEMSGS
+#undef _VOICEMSG
+		// exception:
+		case "teamshoot_auto": return playersound_teamshoot;
 	}
 	GetPlayerSoundSampleField_notFound = 1;
 	return playersound_taunt;
@@ -796,15 +795,9 @@
 	GetPlayerSoundSampleField_fixed = 0;
 	switch(type)
 	{
-		case "death":        return playersound_death;
-		case "drown":        return playersound_drown;
-		case "falling":      return playersound_falling;
-		case "gasp":         return playersound_gasp;
-		case "jump":         return playersound_jump;
-		case "pain25":       return playersound_pain25;
-		case "pain50":       return playersound_pain50;
-		case "pain75":       return playersound_pain75;
-		case "pain100":      return playersound_pain100;
+#define _VOICEMSG(m) case #m: return playersound_##m;
+		ALLPLAYERSOUNDS
+#undef _VOICEMSG
 	}
 	GetPlayerSoundSampleField_notFound = 1;
 	return playersound_taunt;
@@ -843,30 +836,22 @@
 		PrecacheGlobalSound(strcat(argv(1), " ", argv(2)));
 	}
 	fclose(fh);
+
+	if not(allvoicesamples)
+	{
+#define _VOICEMSG(m) allvoicesamples = strcat(allvoicesamples, " ", #m);
+		ALLVOICEMSGS
+#undef _VOICEMSG
+		allvoicesamples = strzone(substring(allvoicesamples, 1, strlen(allvoicesamples) - 1));
+	}
 }
 
 void ClearPlayerSounds()
 {
-	if(self.playersound_attack      ) { strunzone(self.playersound_attack      ); self.playersound_attack = string_null; }
-	if(self.playersound_attackinfive) { strunzone(self.playersound_attackinfive); self.playersound_attackinfive = string_null; }
-	if(self.playersound_coverme     ) { strunzone(self.playersound_coverme     ); self.playersound_coverme = string_null; }
-	if(self.playersound_defend      ) { strunzone(self.playersound_defend      ); self.playersound_defend = string_null; }
-	if(self.playersound_freelance   ) { strunzone(self.playersound_freelance   ); self.playersound_freelance = string_null; }
-	if(self.playersound_incoming    ) { strunzone(self.playersound_incoming    ); self.playersound_incoming = string_null; }
-	if(self.playersound_meet        ) { strunzone(self.playersound_meet        ); self.playersound_meet = string_null; }
-	if(self.playersound_needhelp    ) { strunzone(self.playersound_needhelp    ); self.playersound_needhelp = string_null; }
-	if(self.playersound_seenflag    ) { strunzone(self.playersound_seenflag    ); self.playersound_seenflag = string_null; }
-	if(self.playersound_taunt       ) { strunzone(self.playersound_taunt       ); self.playersound_taunt = string_null; }
-	if(self.playersound_teamshoot   ) { strunzone(self.playersound_teamshoot   ); self.playersound_teamshoot = string_null; }
-	if(self.playersound_death       ) { strunzone(self.playersound_death       ); self.playersound_death = string_null; }
-	if(self.playersound_drown       ) { strunzone(self.playersound_drown       ); self.playersound_drown = string_null; }
-	if(self.playersound_falling     ) { strunzone(self.playersound_falling     ); self.playersound_falling = string_null; }
-	if(self.playersound_gasp        ) { strunzone(self.playersound_gasp        ); self.playersound_gasp = string_null; }
-	if(self.playersound_jump        ) { strunzone(self.playersound_jump        ); self.playersound_jump = string_null; }
-	if(self.playersound_pain25      ) { strunzone(self.playersound_pain25      ); self.playersound_pain25 = string_null; }
-	if(self.playersound_pain50      ) { strunzone(self.playersound_pain50      ); self.playersound_pain50 = string_null; }
-	if(self.playersound_pain75      ) { strunzone(self.playersound_pain75      ); self.playersound_pain75 = string_null; }
-	if(self.playersound_pain100     ) { strunzone(self.playersound_pain100     ); self.playersound_pain100 = string_null; }
+#define _VOICEMSG(m) if(self.playersound_##m) { strunzone(self.playersound_##m); self.playersound_##m = string_null; }
+	ALLPLAYERSOUNDS
+	ALLVOICEMSGS
+#undef _VOICEMSG
 }
 
 void LoadPlayerSounds(string f, float first)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -102,11 +102,6 @@
 		W_CycleWeapon(self.cvar_cl_weaponpriority, +1);
 }
 
-string W_FixWeaponOrder(string order, float complete)
-{
-	return fixPriorityList(order, WEP_FIRST, WEP_LAST, complete);
-}
-
 string W_FixWeaponOrder_AllowIncomplete(string order)
 {
 	return W_FixWeaponOrder(order, 0);
@@ -448,24 +443,3 @@
 					W_SwitchWeapon(nixnex_weapon);
 	}
 }
-
-void RegisterWeapons()
-{
-	// %weaponaddpoint
-	register_weapon(WEP_LASER,            w_laser,     0,              1, 1,     0, "laser",     "laser",           "Laser");
-	register_weapon(WEP_SHOTGUN,          w_shotgun,   IT_SHELLS,      2, 1,  2500, "shotgun",   "shotgun",         "Shotgun");
-	register_weapon(WEP_UZI,              w_uzi,       IT_NAILS,       3, 1,  5000, "uzi",       "uzi",             "Machine Gun");
-	register_weapon(WEP_GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS,     4, 1,  5000, "gl",        "grenadelauncher", "Mortar");
-	register_weapon(WEP_ELECTRO,          w_electro,   IT_CELLS,       5, 1,  5000, "electro",   "electro",         "Electro");
-	register_weapon(WEP_CRYLINK,          w_crylink,   IT_CELLS,       6, 1,  5000, "crylink",   "crylink",         "Crylink");
-	register_weapon(WEP_NEX,              w_nex,       IT_CELLS,       7, 1, 10000, "nex",       "nex",             "Nex");
-	register_weapon(WEP_HAGAR,            w_hagar,     IT_ROCKETS,     8, 1,  5000, "hagar",     "hagar",           "Hagar");
-	register_weapon(WEP_ROCKET_LAUNCHER,  w_rlauncher, IT_ROCKETS,     9, 1, 10000, "rl",        "rocketlauncher",  "Rocket Launcher");
-	register_weapon(WEP_PORTO,            w_porto,     IT_SUPERWEAPON, 0, 0,     0, "porto" ,    "porto",           "Port-O-Launch");
-	register_weapon(WEP_MINSTANEX,        w_minstanex, IT_CELLS,       7, 0, 10000, "minstanex", "minstanex",       "MinstaNex");
-	register_weapon(WEP_HOOK,             w_hook,      IT_CELLS,       0, 0,     0, "hookgun",   "hook",            "Grappling Hook");
-	register_weapon(WEP_SEEKER,           w_seeker,    IT_ROCKETS,     8, 1,     0, "seeker",    "seeker",          "T.A.G. Seeker");
-	register_weapon(WEP_HLAC,             w_hlac,      IT_CELLS,       6, 1,     0, "hlac",      "hlac",            "Heavy Laser Assault Cannon");
-
-	register_weapons_done();
-}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -338,7 +338,7 @@
 			self.model = "";
 	}
 	self.effects = self.owner.effects | EF_LOWPRECISION;
-	self.effects = self.effects - (self.effects & (EF_BLUE | EF_RED)); // eat performance
+	self.effects = self.effects & EFMASK_CHEAP; // eat performance
 	if(self.owner.alpha >= 0)
 		self.alpha = self.owner.alpha;
 	else
@@ -637,85 +637,3 @@
 
 	missile.velocity = W_CalculateProjectileVelocity(missile.owner.velocity, missile.velocity);
 }
-
-
-// WEAPON PLUGIN SYSTEM
-entity weapon_info[24];
-entity dummy_weapon_info;
-.float(float) weapon_func;
-string weaponpriority_hudselector_0;
-string weaponpriority_hudselector_1;
-
-void register_weapon(float id, float(float) func, float ammotype, float i, float normalweapon, float pickupbasevalue, string modelname, string shortname, string name)
-{
-	entity e;
-	weapon_info[id - 1] = e = spawn();
-	e.classname = "weapon_info";
-	e.weapon = id;
-	e.weapons = power2of(id - 1);
-	e.netname = shortname;
-	e.message = name;
-	e.items = ammotype;
-	e.weapon_func = func;
-	e.mdl = modelname;
-	e.model = strzone(strcat("models/weapons/g_", modelname, ".md3"));
-	e.spawnflags = normalweapon;
-	e.impulse = i;
-	e.bot_pickupbasevalue = pickupbasevalue;
-}
-float w_null(float dummy)
-{
-	return 0;
-}
-void register_weapons_done()
-{
-	entity wi;
-
-	dummy_weapon_info = spawn();
-	dummy_weapon_info.classname = "weapon_info";
-	dummy_weapon_info.weapon = 0;
-	dummy_weapon_info.weapons = 0;
-	dummy_weapon_info.netname = "@!#%'n Tuba";
-	dummy_weapon_info.items = 0;
-	dummy_weapon_info.weapon_func = w_null;
-	dummy_weapon_info.mdl = "";
-	dummy_weapon_info.model = "";
-	dummy_weapon_info.spawnflags = 0;
-	dummy_weapon_info.impulse = -1;
-	dummy_weapon_info.bot_pickupbasevalue = 0;
-
-	float i;
-	weaponpriority_hudselector_0 = "";
-	for(i = 24; i >= 1; --i)
-		if(weapon_info[i-1])
-			weaponpriority_hudselector_0 = strcat(weaponpriority_hudselector_0, " ", ftos(i));
-
-	float imp;
-	weaponpriority_hudselector_1 = "";
-	for(i = 1; i <= 24; ++i)
-	{
-		wi = weapon_info[i-1];
-		if(wi && wi.impulse == 0)
-			weaponpriority_hudselector_1 = strcat(weaponpriority_hudselector_1, " ", ftos(i));
-	}
-	for(imp = 9; imp > 0; --imp)
-		for(i = 1; i <= 24; ++i)
-		{
-			wi = weapon_info[i-1];
-			if(wi && wi.impulse == imp)
-				weaponpriority_hudselector_1 = strcat(weaponpriority_hudselector_1, " ", ftos(i));
-		}
-
-	weaponpriority_hudselector_0 = strzone(substring(weaponpriority_hudselector_0, 1, strlen(weaponpriority_hudselector_0) - 1));
-	weaponpriority_hudselector_1 = strzone(substring(weaponpriority_hudselector_1, 1, strlen(weaponpriority_hudselector_1) - 1));
-}
-entity get_weaponinfo(float id)
-{
-	entity w;
-	if(id < WEP_FIRST || id > WEP_LAST)
-		return dummy_weapon_info;
-	w = weapon_info[id - 1];
-	if(w)
-		return w;
-	return dummy_weapon_info;
-}

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -325,7 +325,7 @@
 	} else if(argv(0) == "ready") {
 		if not(self.flags & FL_CLIENT)
 			return;
-		if((inWarmupStage && 0 < g_warmup_limit) // with unlimited warmup players have to be able to restart
+		if((inWarmupStage && 0 <= g_warmup_limit) // with unlimited warmup players have to be able to restart
 		   || cvar("sv_ready_restart"))
 		{
 			if(timeoutStatus) {
@@ -480,7 +480,7 @@
 	}
 }
 
-void ReadyRestart()
+void ReadyRestartForce()
 {
 	local entity e;
 
@@ -488,10 +488,6 @@
 
 	VoteReset();
 
-	// no arena, assault support yet...
-	if(g_arena | g_assault | gameover | intermission_running | race_completing)
-		localcmd("restart\n");
-
 	// clear overtime
 	if(checkrules_overtimeend)
 		checkrules_overtimeend = 0;
@@ -539,14 +535,23 @@
 	//reset map immediately if this cvar is not set
 	if (!cvar("sv_ready_restart_after_countdown"))
 		reset_map();
-
-	// reset ALL scores
-	Score_ClearAll();
 	
 	if(cvar("sv_eventlog"))
 		GameLogEcho(":restart");
 }
 
+void ReadyRestart()
+{
+	// no arena, assault support yet...
+	if(g_arena | g_assault | gameover | intermission_running | race_completing)
+		localcmd("restart\n");
+
+	// reset ALL scores
+	Score_ClearAll();
+
+	ReadyRestartForce();
+}
+
 /**
  * Counts how many players are ready. If not enough players are ready, the function
  * does nothing. If all players are ready, the timelimit will be extended and the
@@ -572,11 +577,11 @@
 
 	readycount = r;
 
+	Nagger_ReadyCounted();
+
 	if(r) // at least one is ready
 	if(r == p) // and, everyone is ready
 		ReadyRestart();
-
-	Nagger_ReadyCounted();
 }
 
 /**
@@ -618,7 +623,7 @@
 		}
 
 		if(f <= 3) {
-			play2all(strcat("announcer/robotic/", ftos(f), ".ogg"));
+			play2all(strcat("announcer/robotic/", ftos(f), ".wav"));
 		}
 		self.nextthink = game_starttime - (f - 1);
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -155,6 +155,8 @@
 float	EF_BRIGHTLIGHT				= 4;
 float	EF_DIMLIGHT				= 8;
 
+#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;
@@ -179,6 +181,7 @@
 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;

Modified: branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -13,6 +13,111 @@
 
 #define FLAG_CARRY_POS '-15 0 7'
 
+.float ctf_captureshielded; // set to 1 if the player is too bad to be allowed to capture
+
+float captureshield_min_negscore; // punish at -20 points
+float captureshield_max_ratio; // punish at most 30% of each team
+float captureshield_force; // push force of the shield
+
+float ctf_captureshield_shielded(entity p)
+{
+	float s, se;
+	entity e;
+	float players_worseeq, players_total;
+
+	if(captureshield_max_ratio <= 0)
+		return FALSE;
+
+	s = PlayerScore_Add(p, SP_SCORE, 0);
+	if(s >= -captureshield_min_negscore)
+		return FALSE;
+
+	players_total = players_worseeq = 0;
+	FOR_EACH_PLAYER(e)
+	{
+		if(e.team != p.team)
+			continue;
+		se = PlayerScore_Add(e, SP_SCORE, 0);
+		if(se <= s)
+			++players_worseeq;
+		++players_total;
+	}
+
+	// player is in the worse half, if >= half the players are better than him, or consequently, if < half of the players are worse
+	// use this rule here
+	
+	if(players_worseeq >= players_total * captureshield_max_ratio)
+		return FALSE;
+
+	return TRUE;
+}
+
+void ctf_captureshield_update(entity p, float dir)
+{
+	float should;
+	if(dir == p.ctf_captureshielded) // 0: shield only, 1: unshield only
+	{
+		should = ctf_captureshield_shielded(p);
+		if(should != dir)
+		{
+			if(should)
+			{
+				centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Make some defensive scores before trying again.");
+				// TODO csqc notifier for this
+			}
+			else
+			{
+				centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.");
+				// TODO csqc notifier for this
+			}
+			p.ctf_captureshielded = should;
+		}
+	}
+}
+
+float ctf_captureshield_customize()
+{
+	if not(other.ctf_captureshielded)
+		return FALSE;
+	if(self.team == other.team)
+		return FALSE;
+	return TRUE;
+}
+
+void ctf_captureshield_touch()
+{
+	if not(other.ctf_captureshielded)
+		return;
+	if(self.team == other.team)
+		return;
+	vector mymid;
+	vector othermid;
+	mymid = (self.absmin + self.absmax) * 0.5;
+	othermid = (other.absmin + other.absmax) * 0.5;
+	Damage(other, self, self, 0, DEATH_HURTTRIGGER, mymid, normalize(othermid - mymid) * captureshield_force);
+	centerprint_atprio(other, CENTERPRIO_SHIELDING, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.");
+}
+
+void ctf_captureshield_spawn()
+{
+	entity e;
+	e = spawn();
+	e.enemy = self;
+	e.team = self.team;
+	e.touch = ctf_captureshield_touch;
+	e.customizeentityforclient = ctf_captureshield_customize;
+	e.classname = "ctf_captureshield";
+	e.effects = EF_ADDITIVE;
+	e.movetype = MOVETYPE_NOCLIP;
+	e.solid = SOLID_TRIGGER;
+	e.avelocity = '7 0 11';
+	setorigin(e, self.origin);
+	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)
 {
 	if(g_ctf_win_mode != 2)
@@ -70,6 +175,7 @@
 		droptofloor();
 		self.movetype = MOVETYPE_TOSS;
 	}
+	InitializeEntity(self, ctf_captureshield_spawn, INITPRIO_SETLOCATION);
 };
 
 void LogCTF(string mode, float flagteam, entity actor)
@@ -143,11 +249,20 @@
 	else
 		UpdateFrags(p, -ctf_score_value("penalty_drop"));
 	PlayerScore_Add(p, SP_CTF_DROPS, +1);
+	ctf_captureshield_update(p, 0); // shield only
 	e.playerid = attacker.playerid;
 	e.ctf_droptime = time;
 	
-	WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
-	WaypointSprite_DetachCarrier(p);
+	if(p.waypointsprite_attachedforcarrier)
+	{
+		WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
+		WaypointSprite_DetachCarrier(p);
+	}
+	else
+	{
+		bprint("\{1}^1Flag carrier had no flag sprite?!?\n");
+		backtrace("Flag carrier had no flag sprite?!?");
+	}
 	LogCTF("dropped", p.team, p);
 
 	setattachment(e, world, "");
@@ -191,6 +306,12 @@
 
 	self.nextthink = time + 0.1;
 
+	if(self == ctf_worldflaglist) // only for the first flag
+	{
+		FOR_EACH_CLIENT(e)
+			ctf_captureshield_update(e, 1); // release shield only
+	}
+
 	AnimateFlag();
 
 	if(self.speedrunning)
@@ -271,35 +392,38 @@
 		{
 			return;
 		}
-		t = time - other.flagcarried.flagpickuptime;
-		s = ftos_decimals(t, 2);
-		s0 = ftos_decimals(flagcaptimerecord, 2);
-		h0 = db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"));
-		h1 = other.netname;
-		if(h0 == h1)
-			h0 = "his";
-		else
-			h0 = strcat(h0, "^7's"); // h0: display text for previous netname
-		if (flagcaptimerecord == 0)
+		if(player_count - currentbots <= 1) // at most one human
 		{
-			bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, " seconds\n");
-			flagcaptimerecord = t;
-			db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
-			db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
-			GameLogEcho(strcat(":recordset:", ftos(other.playerid), ":", ftos(t)));
+			t = time - other.flagcarried.flagpickuptime;
+			s = ftos_decimals(t, 2);
+			s0 = ftos_decimals(flagcaptimerecord, 2);
+			h0 = db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"));
+			h1 = other.netname;
+			if(h0 == h1)
+				h0 = "his";
+			else
+				h0 = strcat(h0, "^7's"); // h0: display text for previous netname
+			if (flagcaptimerecord == 0)
+			{
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, " seconds\n");
+				flagcaptimerecord = t;
+				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
+				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
+				GameLogEcho(strcat(":recordset:", ftos(other.playerid), ":", ftos(t)));
+			}
+			else if (t < flagcaptimerecord)
+			{
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", breaking ", strcat(h0, " previous record of ", s0, " seconds\n"));
+				flagcaptimerecord = t;
+				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
+				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
+				GameLogEcho(strcat(":recordset:", ftos(other.playerid), ":", ftos(t)));
+			}
+			else
+			{
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", failing to break ", strcat(h0, " record of ", s0, " seconds\n"));
+			}
 		}
-		else if (t < flagcaptimerecord)
-		{
-			bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", breaking ", strcat(h0, " previous record of ", s0, " seconds\n"));
-			flagcaptimerecord = t;
-			db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
-			db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
-			GameLogEcho(strcat(":recordset:", ftos(other.playerid), ":", ftos(t)));
-		}
-		else
-		{
-			bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", failing to break ", strcat(h0, " record of ", s0, " seconds\n"));
-		}
 
 		PlayerTeamScore_Add(other, SP_CTF_CAPS, ST_CTF_CAPS, 1);
 		LogCTF("capture", other.flagcarried.team, other);
@@ -318,6 +442,7 @@
 	if (other.team == COLOR_TEAM1 || other.team == COLOR_TEAM2) // only red and blue team can steal flags
 	if (other.team != self.team)
 	if (!other.flagcarried)
+	if (!other.ctf_captureshielded)
 	{
 		if (other.next_take_time > time)
 			return;
@@ -365,7 +490,10 @@
 			// punish the player who last had it
 			FOR_EACH_PLAYER(player)
 				if(player.playerid == self.dropperid)
+				{
 					PlayerScore_Add(player, SP_SCORE, -ctf_score_value("penalty_returned"));
+					ctf_captureshield_update(player, 0); // shield only
+				}
 
 			// punish the team who was last carrying it
 			if(self.team == COLOR_TEAM1)
@@ -441,6 +569,11 @@
 */
 void spawnfunc_info_player_team1()
 {
+	if(g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM1; // red
 	spawnfunc_info_player_deathmatch();
 };
@@ -456,6 +589,11 @@
 */
 void spawnfunc_info_player_team2()
 {
+	if(g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM2; // blue
 	spawnfunc_info_player_deathmatch();
 };
@@ -471,6 +609,11 @@
 */
 void spawnfunc_info_player_team3()
 {
+	if(g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM3; // purple
 	spawnfunc_info_player_deathmatch();
 };
@@ -486,6 +629,11 @@
 */
 void spawnfunc_info_player_team4()
 {
+	if(g_assault)
+	{
+		remove(self);
+		return;
+	}
 	self.team = COLOR_TEAM4; // yellow
 	spawnfunc_info_player_deathmatch();
 };
@@ -584,6 +732,8 @@
 
 	WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 37', self, sprite);
 	WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '1 0 0');
+
+	precache_model("models/onslaught/generator_shield.md3");
 };
 
 /*QUAKED spawnfunc_item_flag_team2 (0 0.5 0.8) (-48 -48 -24) (48 48 64)
@@ -676,6 +826,8 @@
 
 	WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 37', self, sprite);
 	WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '0 0 1');
+
+	precache_model("models/onslaught/generator_shield.md3");
 };
 
 
@@ -744,6 +896,10 @@
 {
 	InitializeEntity(world, ctf_delayedinit, INITPRIO_GAMETYPE);
 	flagcaptimerecord = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time")));
+
+	captureshield_min_negscore = cvar("g_ctf_shield_min_negscore");
+	captureshield_max_ratio = cvar("g_ctf_shield_max_ratio");
+	captureshield_force = cvar("g_ctf_shield_force");
 };
 
 void ctf_setstatus2(entity flag, float shift)
@@ -763,15 +919,19 @@
 
 void ctf_setstatus()
 {
-	self.items = self.items - (self.items & IT_RED_FLAG_TAKEN);
-	self.items = self.items - (self.items & IT_RED_FLAG_LOST);
-	self.items = self.items - (self.items & IT_BLUE_FLAG_TAKEN);
-	self.items = self.items - (self.items & IT_BLUE_FLAG_LOST);
+	self.items (-) IT_RED_FLAG_TAKEN;
+	self.items (-) IT_RED_FLAG_LOST;
+	self.items (-) IT_BLUE_FLAG_TAKEN;
+	self.items (-) IT_BLUE_FLAG_LOST;
+	self.items (-) IT_CTF_SHIELDED;
 
 	if (g_ctf) {
 		local entity flag;
 		float redflags, blueflags;
 
+		if(self.ctf_captureshielded)
+			self.items |= IT_CTF_SHIELDED;
+
 		redflags = 0;
 		blueflags = 0;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -34,6 +34,7 @@
 float g_pickup_respawntime_powerup;
 float g_maplist_allow_hidden;
 
+float sv_clones;
 float sv_cheats;
 float sv_gentle;
 float sv_foginterval;
@@ -74,6 +75,7 @@
 //.float	style;
 //.float	skill;
 .float	sounds;
+.string	music;
 
 .string killtarget;
 
@@ -236,25 +238,6 @@
 .float welcomemessage_time;
 .float version;
 
-// esteel's voting
-float votecalled;
-string votecalledvote;
-string votecalledvote_display;
-float votecalledmaster;
-entity votecaller;
-float votefinished;
-.float vote_master;
-.float vote_next;
-.float vote_vote;
-void VoteThink();
-float VoteAllowed(string vote);
-void VoteReset();
-void VoteAccept();
-void VoteReject();
-void VoteTimeout();
-void VoteStop(entity stopper);
-void VoteCount();
-
 // Laser target for laser-guided weapons
 .entity lasertarget;
 .float laser_on;
@@ -436,26 +419,44 @@
 .float(entity to, float sendflags) SendEntity;
 
 // player sounds, voice messages
-.string playersound_attack;
-.string playersound_attackinfive;
-.string playersound_coverme;
-.string playersound_defend;
-.string playersound_freelance;
-.string playersound_incoming;
-.string playersound_meet;
-.string playersound_needhelp;
-.string playersound_seenflag;
-.string playersound_taunt;
-.string playersound_teamshoot;
-.string playersound_death;
-.string playersound_drown;
-.string playersound_falling; // not yet implemented, FIXME
-.string playersound_gasp;
-.string playersound_jump;
-.string playersound_pain25;
-.string playersound_pain50;
-.string playersound_pain75;
-.string playersound_pain100;
+// TODO implemented fall and falling
+#define ALLPLAYERSOUNDS \
+		_VOICEMSG(death) \
+		_VOICEMSG(drown) \
+		_VOICEMSG(fall) \
+		_VOICEMSG(falling) \
+		_VOICEMSG(gasp) \
+		_VOICEMSG(jump) \
+		_VOICEMSG(pain25) \
+		_VOICEMSG(pain50) \
+		_VOICEMSG(pain75) \
+		_VOICEMSG(pain100)
+#define ALLVOICEMSGS \
+		_VOICEMSG(attack) \
+		_VOICEMSG(attackinfive) \
+		_VOICEMSG(coverme) \
+		_VOICEMSG(defend) \
+		_VOICEMSG(freelance) \
+		_VOICEMSG(incoming) \
+		_VOICEMSG(meet) \
+		_VOICEMSG(needhelp) \
+		_VOICEMSG(seenflag) \
+		_VOICEMSG(taunt) \
+		_VOICEMSG(teamshoot) \
+		_VOICEMSG(attacking) \
+		_VOICEMSG(defending) \
+		_VOICEMSG(roaming) \
+		_VOICEMSG(positive) \
+		_VOICEMSG(negative) \
+		_VOICEMSG(onmyway) \
+		_VOICEMSG(seenenemy) \
+		_VOICEMSG(getflag) \
+		_VOICEMSG(droppedflag) \
+		_VOICEMSG(flagcarriertakingdamage)
+#define _VOICEMSG(m) .string playersound_##m;
+ALLPLAYERSOUNDS
+ALLVOICEMSGS
+#undef _VOICEMSG
 string globalsound_fall;
 string globalsound_metalfall;
 string globalsound_step;
@@ -499,3 +500,10 @@
 // reset to 0 on weapon switch
 // may be useful to all weapons
 .float bulletcounter;
+
+void target_voicescript_next(entity pl);
+void target_voicescript_clear(entity pl);
+
+.string target2;
+.string target3;
+.string target4;

Modified: branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/func_breakable.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,6 +1,10 @@
-// TODO add assault's colormodding to this, make assault redirect to this one
-// TODO add the fields this uses to the entities.def when done
+.entity sprite;
 
+.float dmg;
+.float dmg_edge;
+.float dmg_radius;
+.float dmg_force;
+
 .string mdl_dead; // or "" to hide when broken
 .string debris; // space separated list of debris models
 // other fields:
@@ -116,8 +120,16 @@
 void func_breakable_destroy() {
 	float n, i;
 
+	activator = self.owner;
+
 	func_breakable_destroyed();
 
+	if(self.noise)
+		sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+
+	if(self.dmg)
+		RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
+
 	// now throw around the debris
 	n = tokenize_sane(self.debris);
 	for(i = 0; i < n; ++i)
@@ -133,13 +145,16 @@
 {
 	if(self.state == 1)
 		return;
+	if(self.team)
+		if(attacker.team == self.team)
+			return;
+	if(self.sprite)
+		WaypointSprite_Ping(self.sprite);
 	self.health = self.health - damage;
+	func_breakable_colormod();
+
 	if(self.health < 0)
-	{
-		activator = attacker;
-		func_breakable_destroy();
-	}
-	func_breakable_colormod();
+		W_PrepareExplosionByDamage(attacker, func_breakable_destroy);
 }
 
 void func_breakable_reset()
@@ -163,10 +178,19 @@
 	if(self.count == 0)
 		self.count = 1;
 
+	if(!self.message)
+		self.message = "got too close to an explosion";
+	if(!self.message2)
+		self.message2 = "was pushed into an explosion by";
+	if(!self.dmg_radius)
+		self.dmg_radius = 150;
+	if(!self.dmg_force)
+		self.dmg_force = 200;
+
 	self.mdl = self.model;
 	SetBrushEntityModel();
 	self.mins_save = self.mins;
-	self.maxs_save = self.mins;
+	self.maxs_save = self.maxs;
 
 	self.use = func_breakable_restore;
 
@@ -176,6 +200,8 @@
 	n = tokenize_sane(self.debris);
 	for(i = 0; i < n; ++i)
 		precache_model(argv(i));
+	if(self.noise)
+		precache_sound(self.noise);
 
 	func_breakable_reset();
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -5,7 +5,19 @@
 	if (other.solid == SOLID_BSP)
 	if (vlen(self.velocity) >= 50)
 	if (time >= self.attack_finished_single)
-	sound (self, CHAN_PROJECTILE, "weapons/tink1.wav", 0.5 * VOL_BASE, ATTN_NORM);
+	{
+		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;
@@ -57,6 +69,7 @@
 	e = newdecor();
 	e.isdecor = TRUE;
 	e.alpha = 1;
+	e.state = casingtype;
 	//e.forcescale = 15;
 	e.movetype = MOVETYPE_BOUNCE;
 	e.solid = SOLID_TRIGGER;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -325,7 +325,7 @@
 						bprint ("^1",s, "^1 was shot into space by ", a, "\n");
 					else if (deathtype == DEATH_SWAMP)
 						bprint ("^1",s, "^1 was conserved by ", a, "\n");
-					else if (deathtype == DEATH_HURTTRIGGER && attacker.message2 != "")
+					else if (deathtype == DEATH_HURTTRIGGER && inflictor.message2 != "")
 					{
 						p = strstrofs(inflictor.message2, "#", 0);
 						if(p < 0)
@@ -335,6 +335,8 @@
 					}
                     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");
 				}
@@ -368,7 +370,7 @@
 						bprint (a,"^7 made a ^1TRIPLE SCORE\n");
 					} else {
 						bprint (a,"^7 made a ^1TRIPLE FRAG\n");
-						announce(attacker, "announcer/male/03kills.ogg");
+						announce(attacker, "announcer/male/03kills.wav");
 					}
 				}
 				else if (attacker.killcount == 5)
@@ -377,7 +379,7 @@
 						bprint (a,"^7 unleashes ^1SCORING RAGE\n");
 					} else {
 						bprint (a,"^7 unleashes ^1RAGE\n");
-						announce(attacker, "announcer/male/05kills.ogg");
+						announce(attacker, "announcer/male/05kills.wav");
 					}
 				}
 				else if (attacker.killcount == 10)
@@ -386,7 +388,7 @@
 						bprint (a,"^7 made ^1TEN SCORES IN A ROW!\n");
 					} else {
 						bprint (a,"^7 starts the ^1MASSACRE!\n");
-						announce(attacker, "announcer/male/10kills.ogg");
+						announce(attacker, "announcer/male/10kills.wav");
 					}
 				}
 				else if (attacker.killcount == 15)
@@ -395,7 +397,7 @@
 						bprint (a,"^7 made ^1FIFTEEN SCORES IN A ROW!\n");
 					} else {
 						bprint (a,"^7 executes ^1MAYHEM!\n");
-						announce(attacker, "announcer/male/15kills.ogg");
+						announce(attacker, "announcer/male/15kills.wav");
 					}
 				}
 				else if (attacker.killcount == 20)
@@ -404,7 +406,7 @@
 						bprint (a,"^7 made ^1TWENTY SCORES IN A ROW!\n");
 					} else {
 						bprint (a,"^7 is a ^1BERSERKER!\n");
-						announce(attacker, "announcer/male/20kills.ogg");
+						announce(attacker, "announcer/male/20kills.wav");
 					}
 				}
 				else if (attacker.killcount == 25)
@@ -413,7 +415,7 @@
 						bprint (a,"^7 made ^1TWENTY FIFE SCORES IN A ROW!\n");
 					} else {
 						bprint (a,"^7 inflicts ^1CARNAGE!\n");
-						announce(attacker, "announcer/male/25kills.ogg");
+						announce(attacker, "announcer/male/25kills.wav");
 					}
 				}
 				else if (attacker.killcount == 30)
@@ -422,7 +424,7 @@
 						bprint (a,"^7 made ^1THIRTY SCORES IN A ROW!\n");
 					} else {
 						bprint (a,"^7 unleashes ^1ARMAGEDDON!\n");
-						announce(attacker, "announcer/male/30kills.ogg");
+						announce(attacker, "announcer/male/30kills.wav");
 					}
 				}
 			}
@@ -430,8 +432,8 @@
 		else
 		{
 			centerprint(targ, "^1Watch your step!\n\n\n");
-			if (deathtype == DEATH_HURTTRIGGER && attacker.message != "")
-				bprint ("^1",s, "^1 ", attacker.message, "\n");
+			if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
+				bprint ("^1",s, "^1 ", inflictor.message, "\n");
 			else if (deathtype == DEATH_DROWN)
 				if(sv_gentle)
 					bprint ("^1",s, "^1 was in the water for too long\n");
@@ -458,6 +460,8 @@
 					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_TOUCHEXPLODE)
+				bprint ("^1",s, "^1 died in an accident\n");
 			else
 				if(sv_gentle)
 					bprint ("^1",s, "^1 needs a restart\n");
@@ -465,7 +469,7 @@
 					bprint ("^1",s, "^1 died\n");
 			GiveFrags(targ, targ, -1);
 			if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) {
-				announce(targ, "announcer/male/botlike.ogg");
+				announce(targ, "announcer/male/botlike.wav");
 			}
 
 			if (targ.killcount > 2)
@@ -912,7 +916,7 @@
 							{
 								if(targ.iscreature)
 									total_damage_to_creatures += finaldmg;
-								if(targ == directhitentity)
+								if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
 									Damage (targ, inflictor, attacker, finaldmg, deathtype, nearest, force);
 								else
 									Damage (targ, inflictor, attacker, finaldmg, deathtype | HITTYPE_SPLASH, nearest, force);

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -372,12 +372,25 @@
 .float loddistance1;
 .float loddistance2;
 
+vector NearestPointOnBox(entity box, vector org);
 float LOD_customize()
 {
 	float d;
 
+	if(cvar("loddebug"))
+	{
+		d = cvar("loddebug");
+		if(d == 1)
+			self.modelindex = self.lodmodelindex0;
+		else if(d == 2)
+			self.modelindex = self.lodmodelindex1;
+		else // if(d == 3)
+			self.modelindex = self.lodmodelindex2;
+		return TRUE;
+	}
+
 	// TODO csqc network this so it only gets sent once
-	d = vlen(self.origin - other.origin);
+	d = vlen(NearestPointOnBox(self, other.origin) - other.origin);
 	if(d < self.loddistance1)
 		self.modelindex = self.lodmodelindex0;
 	else if(!self.lodmodelindex2 || d < self.loddistance2)
@@ -456,7 +469,10 @@
 		InitializeEntity(self, LODmodel_attach, INITPRIO_FINDTARGET);
  	}
 	setorigin(self, self.origin);
-	setsize(self, self.mins, self.maxs);
+	if(self.scale)
+		setsize(self, self.mins * self.scale, self.maxs * self.scale);
+	else
+		setsize(self, self.mins, self.maxs);
 }
 
 /*

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -30,6 +30,8 @@
 void SUB_UseTargets()
 {
 	local entity t, stemp, otemp, act;
+	string s;
+	float i;
 
 //
 // check for a delay
@@ -65,45 +67,47 @@
 //
 // kill the killtagets
 //
-	if (self.killtarget)
+	s = self.killtarget;
+	if (s != "")
 	{
-		t = world;
-		do
-		{
-			t = find (t, targetname, self.killtarget);
-			if (!t)
-				return;
-			remove (t);
-		} while ( 1 );
+		for(t = world; (t = find(t, targetname, s)); )
+			remove(t);
 	}
 
 //
 // fire targets
 //
-	if (self.target)
+	act = activator;
+	stemp = self;
+	otemp = other;
+
+	for(i = 0; i < 4; ++i)
 	{
-		act = activator;
-		t = world;
-		do
+		switch(i)
 		{
-			t = find (t, targetname, self.target);
-			if (!t)
+			default:
+			case 0: s = stemp.target; break;
+			case 1: s = stemp.target2; break;
+			case 2: s = stemp.target3; break;
+			case 3: s = stemp.target4; break;
+		}
+		if (s != "")
+		{
+			for(t = world; (t = find(t, targetname, s)); )
+			if(t.use)
 			{
-				return;
+				print(stemp.classname, " ", stemp.targetname, " -> ", t.classname, " ", t.targetname, "\n");
+				self = t;
+				other = stemp;
+				activator = act;
+				self.use();
 			}
-			stemp = self;
-			otemp = other;
-			self = t;
-			other = stemp;
-			if (self.use)
-				self.use ();
-			self = stemp;
-			other = otemp;
-			activator = act;
-		} while ( 1 );
+		}
 	}
 
-
+	activator = act;
+	self = stemp;
+	other = otemp;
 };
 
 
@@ -432,7 +436,60 @@
 	return FALSE;
 }
 
+//////////////////////////////////////////////////////////////
+//
+//
+//
+//Trigger heal --a04191b92fbd93aa67214ef7e72d6d2e
+//
+//////////////////////////////////////////////////////////////
 
+.float triggerhealtime;
+void trigger_heal_touch()
+{
+	// only do the EXACTTRIGGER_TOUCH checks when really needed (saves some cpu)
+	if (other.iscreature)
+	{
+		if (other.takedamage)
+		if (other.triggerhealtime < time)
+		{
+			EXACTTRIGGER_TOUCH;
+			other.triggerhealtime = time + 1;
+			
+			if (other.health < self.max_health)
+			{
+				other.health = min(other.health + self.health, self.max_health);
+				other.pauserothealth_finished = max(other.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
+				sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+			}
+		}
+	}
+};
+
+void spawnfunc_trigger_heal()
+{
+	EXACTTRIGGER_INIT;
+	self.touch = trigger_heal_touch;
+	if (!self.health)
+		self.health = 10;
+	if (!self.max_health)
+		self.max_health = 200; //Max health topoff for field
+	if(self.noise == "")
+		self.noise = "misc/mediumhealth.wav";
+	precache_sound(self.noise);
+};
+
+
+//////////////////////////////////////////////////////////////
+//
+//
+//
+//End trigger_heal
+//
+//////////////////////////////////////////////////////////////
+
+
+
 // TODO add a way to do looped sounds with sound(); then complete this entity
 .float volume, atten;
 void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);}
@@ -1242,3 +1299,93 @@
 {
 	InitializeEntity(self, follow_init, 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
+.float voicescript_voiceend; // time when this voice ends
+
+void target_voicescript_clear(entity pl)
+{
+	pl.voicescript = world;
+}
+
+void target_voicescript_use()
+{
+	if(activator.voicescript != self)
+	{
+		activator.voicescript = self;
+		activator.voicescript_index = 0;
+		activator.voicescript_nextthink = time + self.delay;
+	}
+}
+
+void target_voicescript_next(entity pl)
+{
+	entity vs;
+	float i, n;
+
+	vs = pl.voicescript;
+	if(!vs)
+		return;
+	if(vs.message == "")
+		return;
+	if(pl.classname != "player")
+		return;
+	if(gameover)
+		return;
+
+	if(time >= pl.voicescript_voiceend)
+	{
+		if(time >= pl.voicescript_nextthink)
+		{
+			// get the next voice...
+			n = tokenize_sane(vs.message);
+
+			if(pl.voicescript_index < vs.cnt)
+				i = pl.voicescript_index * 2;
+			else if(n > vs.cnt * 2)
+				i = mod(pl.voicescript_index - vs.cnt, (n - vs.cnt * 2 - 1) / 2) * 2 + vs.cnt * 2 + 1;
+			else
+				i = -1;
+
+			if(i >= 0)
+			{
+				play2(pl, strcat(vs.netname, "/", argv(i), ".wav"));
+				pl.voicescript_voiceend = time + stof(argv(i + 1));
+			}
+			else
+				pl.voicescript = world;
+
+			pl.voicescript_index += 1;
+			pl.voicescript_nextthink = pl.voicescript_voiceend + vs.wait * (0.5 + random());
+		}
+	}
+}
+
+void spawnfunc_target_voicescript()
+{
+	// netname: directory of the sound files
+	// message: list of "sound file" duration "sound file" duration, a *, and again a list
+	//          foo1 4.1 foo2 4.0 foo3 3.1 * fool1 1.1 fool2 7.1 fool3 9.1 fool4 3.7
+	// wait: average time between messages
+	// delay: initial delay before the first message
+	
+	float i, n;
+	self.use = target_voicescript_use;
+
+	n = tokenize_sane(self.message);
+	self.cnt = n / 2;
+	for(i = 0; i+1 < n; i += 2)
+	{
+		if(argv(i) == "*")
+		{
+			self.cnt = i / 2;
+			++i;
+		}
+		precache_sound(strcat(self.netname, "/", argv(i), ".wav"));
+	}
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -225,7 +225,10 @@
 	RegisterWeapons();
 
 	if(GotoFirstMap())
+	{
+		world_initialized = -1; // don't complain
 		return;
+	}
 
 	if(sv_cheats)
 		ServerProgsDB = db_create();
@@ -401,9 +404,9 @@
 	Nagger_Init();
 
 	next_pingtime = time + 5;
+	InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
+
 	world_initialized = 1;
-
-	InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
 }
 
 void spawnfunc_light (void)
@@ -1267,16 +1270,11 @@
 	{
 		if(ent.winning)	// round end has been triggered by attacking team
 		{
+			bprint("ASSAULT: round completed...\n");
 			SetWinners(team, assault_attacker_team);
-			if(assault_attacker_team == COLOR_TEAM1)
-			{
-				team1_score = team1_score + 50;
-			}
-			else
-			{
-				team2_score = team2_score + 50;
-			}
 
+			TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0));
+
 			if(ent.cnt == 1) // this was the second round
 			{
 				status = WINNING_YES;
@@ -1286,7 +1284,6 @@
 				local entity oldself;
 				oldself = self;
 				self = ent;
-				cvar_set("timelimit", ftos((2*time)/60)); // FIXME use game_starttime here
 				assault_new_round();
 				self = oldself;
 			}
@@ -1294,7 +1291,6 @@
 	}
 
 	return status;
-
 }
 
 // LMS winning condition: game terminates if and only if there's at most one
@@ -1473,31 +1469,7 @@
 
 	// NEVER initiate overtime
 	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
-	// do NOT support equality when the laps are all raced!
 	{
-		float totalplayers;
-		float playerswithlaps;
-		float readyplayers;
-		entity head;
-		totalplayers = playerswithlaps = readyplayers = 0;
-		FOR_EACH_PLAYER(head)
-		{
-			++totalplayers;
-			if(PlayerScore_Add(head, SP_RACE_FASTEST, 0))
-				++playerswithlaps;
-			if(head.ready)
-				++readyplayers;
-		}
-
-		// at least 2/3 of the players have completed a lap: start the RACE
-		// otherwise, the players should end the qualifying on their own
-		if(readyplayers || ((totalplayers >= 3) && (playerswithlaps * 3 >= totalplayers * 2)))
-		{
-			checkrules_overtimeend = 0;
-			ReadyRestart();
-			return WINNING_NEVER;
-		}
-
 		return WINNING_YES;
 	}
 
@@ -1636,7 +1608,36 @@
 	else
 	{
 		if (timelimit && time >= timelimit)
-			InitiateOvertime();
+		{
+			if(g_race && g_race_qualifying == 2 && timelimit > 0)
+			{
+				float totalplayers;
+				float playerswithlaps;
+				float readyplayers;
+				entity head;
+				totalplayers = playerswithlaps = readyplayers = 0;
+				FOR_EACH_PLAYER(head)
+				{
+					++totalplayers;
+					if(PlayerScore_Add(head, SP_RACE_FASTEST, 0))
+						++playerswithlaps;
+					if(head.ready)
+						++readyplayers;
+				}
+
+				// at least 2/3 of the players have completed a lap: start the RACE
+				// otherwise, the players should end the qualifying on their own
+				if(readyplayers || ((totalplayers >= 3) && (playerswithlaps * 3 >= totalplayers * 2)))
+				{
+					checkrules_overtimeend = 0;
+					ReadyRestart(); // go to race
+				}
+				else
+					InitiateOvertime();
+			}
+			else
+				InitiateOvertime();
+		}
 	}
 
 	if (checkrules_overtimeend && time >= checkrules_overtimeend)
@@ -2327,7 +2328,7 @@
 
 void SV_Shutdown()
 {
-	if(world_initialized)
+	if(world_initialized > 0)
 	{
 		world_initialized = 0;
 		print("Saving persistent data...\n");
@@ -2344,7 +2345,7 @@
 
 		MapInfo_Shutdown();
 	}
-	else
+	else if(world_initialized == 0)
 	{
 		print("NOTE: crashed before even initializing the world, not saving persistent data\n");
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -58,11 +58,11 @@
 .entity kh_previous_owner;
 .float kh_previous_owner_playerid;
 
-string kh_sound_capture = "sound/kh/capture.wav";
-string kh_sound_destroy = "sound/kh/destroy.wav";
-string kh_sound_drop = "sound/kh/drop.wav";
-string kh_sound_collect = "sound/kh/collect.wav";
-string kh_sound_alarm = "sound/kh/alarm.wav";  // the new siren/alarm
+string kh_sound_capture = "kh/capture.wav";
+string kh_sound_destroy = "kh/destroy.wav";
+string kh_sound_drop = "kh/drop.wav";
+string kh_sound_collect = "kh/collect.wav";
+string kh_sound_alarm = "kh/alarm.wav";  // the new siren/alarm
 
 float kh_key_dropped, kh_key_carried;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -627,6 +627,7 @@
 #define CENTERPRIO_REBALANCE 2
 #define CENTERPRIO_VOTE 4
 #define CENTERPRIO_NORMAL 5
+#define CENTERPRIO_SHIELDING 7
 #define CENTERPRIO_MAPVOTE 9
 #define CENTERPRIO_IDLEKICK 50
 #define CENTERPRIO_ADMIN 99
@@ -752,8 +753,34 @@
 
 	g_weaponarena = 0;
 	s = cvar_string("g_weaponarena");
-	if(s != "0")
+	if(s == "0")
 	{
+	}
+	else if(s == "all")
+	{
+		g_weaponarena_list = "All Weapons";
+		for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+		{
+			e = get_weaponinfo(j);
+			g_weaponarena |= e.weapons;
+			weapon_action(e.weapon, WR_PRECACHE);
+		}
+	}
+	else if(s == "most")
+	{
+		g_weaponarena_list = "Most Weapons";
+		for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+		{
+			e = get_weaponinfo(j);
+			if(e.spawnflags & WEPSPAWNFLAG_NORMAL)
+			{
+				g_weaponarena |= e.weapons;
+				weapon_action(e.weapon, WR_PRECACHE);
+			}
+		}
+	}
+	else
+	{
 		t = tokenize_sane(s);
 		g_weaponarena_list = "";
 		for(i = 0; i < t; ++i)
@@ -836,7 +863,7 @@
 			e = get_weaponinfo(i);
 			if(!(e.weapon))
 				continue;
-			if(((e.spawnflags & 1) && g_lms) || cvar(strcat("g_start_weapon_", e.netname)))
+			if(((e.spawnflags & WEPSPAWNFLAG_NORMAL) && g_lms) || cvar(strcat("g_start_weapon_", e.netname)))
 			{
 				start_weapons |= e.weapons;
 				weapon_action(e.weapon, WR_PRECACHE);
@@ -872,7 +899,7 @@
 					e = get_weaponinfo(i);
 					if(!(e.weapon))
 						continue;
-					if(e.spawnflags & 1)
+					if(e.spawnflags & WEPSPAWNFLAG_NORMAL)
 					{
 						warmup_start_weapons |= e.weapons;
 						weapon_action(e.weapon, WR_PRECACHE);
@@ -889,8 +916,53 @@
 	}
 }
 
+float g_bugrigs;
+float g_bugrigs_planar_movement;
+float g_bugrigs_planar_movement_car_jumping;
+float g_bugrigs_reverse_spinning;
+float g_bugrigs_reverse_speeding;
+float g_bugrigs_reverse_stopping;
+float g_bugrigs_air_steering;
+float g_bugrigs_angle_smoothing;
+float g_bugrigs_friction_floor;
+float g_bugrigs_friction_brake;
+float g_bugrigs_friction_air;
+float g_bugrigs_accel;
+float g_bugrigs_speed_ref;
+float g_bugrigs_speed_pow;
+float g_bugrigs_steer;
+
+float g_touchexplode;
+float g_touchexplode_radius;
+float g_touchexplode_damage;
+float g_touchexplode_edgedamage;
+float g_touchexplode_force;
+
 void readlevelcvars(void)
 {
+ 	g_bugrigs = cvar("g_bugrigs");
+ 	g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement");
+ 	g_bugrigs_planar_movement_car_jumping = cvar("g_bugrigs_planar_movement_car_jumping");
+ 	g_bugrigs_reverse_spinning = cvar("g_bugrigs_reverse_spinning");
+ 	g_bugrigs_reverse_speeding = cvar("g_bugrigs_reverse_speeding");
+ 	g_bugrigs_reverse_stopping = cvar("g_bugrigs_reverse_stopping");
+ 	g_bugrigs_air_steering = cvar("g_bugrigs_air_steering");
+ 	g_bugrigs_angle_smoothing = cvar("g_bugrigs_angle_smoothing");
+ 	g_bugrigs_friction_floor = cvar("g_bugrigs_friction_floor");
+ 	g_bugrigs_friction_brake = cvar("g_bugrigs_friction_brake");
+ 	g_bugrigs_friction_air = cvar("g_bugrigs_friction_air");
+ 	g_bugrigs_accel = cvar("g_bugrigs_accel");
+ 	g_bugrigs_speed_ref = cvar("g_bugrigs_speed_ref");
+ 	g_bugrigs_speed_pow = cvar("g_bugrigs_speed_pow");
+ 	g_bugrigs_steer = cvar("g_bugrigs_steer");
+
+	g_touchexplode = cvar("g_touchexplode");
+	g_touchexplode_radius = cvar("g_touchexplode_radius");
+	g_touchexplode_damage = cvar("g_touchexplode_damage");
+	g_touchexplode_edgedamage = cvar("g_touchexplode_edgedamage");
+	g_touchexplode_force = cvar("g_touchexplode_force");
+
+ 	sv_clones = cvar("sv_clones");
 	sv_cheats = cvar("sv_cheats");
 	sv_gentle = cvar("sv_gentle");
 	sv_foginterval = cvar("sv_foginterval");
@@ -1112,6 +1184,41 @@
 		//precache_model("models/player/visitant.zym");
 	}
 
+	if(cvar("sv_defaultcharacter"))
+	{
+		string s;
+		s = cvar_string("sv_defaultplayermodel_red");
+		if(s != "")
+		{
+			precache_model(s);
+			PrecachePlayerSounds(strcat(s, ".sounds"));
+		}
+		s = cvar_string("sv_defaultplayermodel_blue");
+		if(s != "")
+		{
+			precache_model(s);
+			PrecachePlayerSounds(strcat(s, ".sounds"));
+		}
+		s = cvar_string("sv_defaultplayermodel_yellow");
+		if(s != "")
+		{
+			precache_model(s);
+			PrecachePlayerSounds(strcat(s, ".sounds"));
+		}
+		s = cvar_string("sv_defaultplayermodel_pink");
+		if(s != "")
+		{
+			precache_model(s);
+			PrecachePlayerSounds(strcat(s, ".sounds"));
+		}
+		s = cvar_string("sv_defaultplayermodel");
+		if(s != "")
+		{
+			precache_model(s);
+			PrecachePlayerSounds(strcat(s, ".sounds"));
+		}
+	}
+
 	if (g_footsteps)
 	{
 		PrecacheGlobalSound((globalsound_step = "misc/footstep0 6"));
@@ -1164,9 +1271,9 @@
 	precache_sound ("announcer/male/25kills.wav");
 	precache_sound ("announcer/male/30kills.wav");
 	precache_sound ("announcer/male/botlike.wav");
-	precache_sound ("announcer/male/yoda.ogg");
-	precache_sound ("announcer/male/headshot.ogg");
-	precache_sound ("announcer/male/impressive.ogg");
+	precache_sound ("announcer/male/yoda.wav");
+	precache_sound ("announcer/male/headshot.wav");
+	precache_sound ("announcer/male/impressive.wav");
 
 	// announcer sounds - robotic
 	precache_sound ("announcer/robotic/prepareforbattle.wav");
@@ -1192,16 +1299,16 @@
 	precache_model ("models/sprites/8.spr32");
 	precache_model ("models/sprites/9.spr32");
 	precache_model ("models/sprites/10.spr32");
-	precache_sound ("announcer/robotic/1.ogg");
-	precache_sound ("announcer/robotic/2.ogg");
-	precache_sound ("announcer/robotic/3.ogg");
-	precache_sound ("announcer/robotic/4.ogg");
-	precache_sound ("announcer/robotic/5.ogg");
-	precache_sound ("announcer/robotic/6.ogg");
-	precache_sound ("announcer/robotic/7.ogg");
-	precache_sound ("announcer/robotic/8.ogg");
-	precache_sound ("announcer/robotic/9.ogg");
-	precache_sound ("announcer/robotic/10.ogg");
+	precache_sound ("announcer/robotic/1.wav");
+	precache_sound ("announcer/robotic/2.wav");
+	precache_sound ("announcer/robotic/3.wav");
+	precache_sound ("announcer/robotic/4.wav");
+	precache_sound ("announcer/robotic/5.wav");
+	precache_sound ("announcer/robotic/6.wav");
+	precache_sound ("announcer/robotic/7.wav");
+	precache_sound ("announcer/robotic/8.wav");
+	precache_sound ("announcer/robotic/9.wav");
+	precache_sound ("announcer/robotic/10.wav");
 
 	// common weapon precaches
 	precache_sound ("weapons/weapon_switch.wav");
@@ -1224,6 +1331,9 @@
 		}
 	}
 
+	if (!self.noise && self.music) // quake 3 uses the music field
+		self.noise = self.music;
+
 	// plays music for the level if there is any
 	if (self.noise)
 	{
@@ -1426,85 +1536,6 @@
 .float nottargeted;
 #define IFTARGETED if(!self.nottargeted && self.targetname != "")
 
-float power2of(float e)
-{
-	return pow(2, e);
-}
-float log2of(float x)
-{
-	// NOTE: generated code
-	if(x > 2048)
-		if(x > 131072)
-			if(x > 1048576)
-				if(x > 4194304)
-					return 23;
-				else
-					if(x > 2097152)
-						return 22;
-					else
-						return 21;
-			else
-				if(x > 524288)
-					return 20;
-				else
-					if(x > 262144)
-						return 19;
-					else
-						return 18;
-		else
-			if(x > 16384)
-				if(x > 65536)
-					return 17;
-				else
-					if(x > 32768)
-						return 16;
-					else
-						return 15;
-			else
-				if(x > 8192)
-					return 14;
-				else
-					if(x > 4096)
-						return 13;
-					else
-						return 12;
-	else
-		if(x > 32)
-			if(x > 256)
-				if(x > 1024)
-					return 11;
-				else
-					if(x > 512)
-						return 10;
-					else
-						return 9;
-			else
-				if(x > 128)
-					return 8;
-				else
-					if(x > 64)
-						return 7;
-					else
-						return 6;
-		else
-			if(x > 4)
-				if(x > 16)
-					return 5;
-				else
-					if(x > 8)
-						return 4;
-					else
-						return 3;
-			else
-				if(x > 2)
-					return 2;
-				else
-					if(x > 1)
-						return 1;
-					else
-						return 0;
-}
-
 void Net_LinkEntity(entity e)
 {
 	e.model = "net_entity";
@@ -1620,7 +1651,7 @@
 	return 0;
 }
 
-#define SUB_OwnerCheck() (other == self.owner)
+#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";

Modified: branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -324,7 +324,7 @@
 	{
 		// self.max_health / 300 gives 5 minutes of overtime.
 		// control points reduce the overtime duration.
-		sound(self, CHAN_TRIGGER, "sound/onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
 		d = 1;
 		e = findchain(classname, "onslaught_controlpoint");
 		while (e)
@@ -348,13 +348,13 @@
 		self.count = self.count - 1;
 		org = randompos(self.origin + self.mins + '8 8 8', self.origin + self.maxs + '-8 -8 -8');
 		pointparticles(particleeffectnum("onslaught_generator_smallexplosion"), org, '0 0 0', 1);
-		sound(self, CHAN_TRIGGER, "sound/weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 	}
 	else
 	{
 		org = self.origin;
 		pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
-		sound(self, CHAN_TRIGGER, "sound/weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
 	}
 };
 
@@ -370,7 +370,7 @@
 			if (time > self.pain_finished)
 			if (attacker.classname == "player")
 			{
-				play2(attacker, "sound/onslaught/damageblockedbyshield.wav");
+				play2(attacker, "onslaught/damageblockedbyshield.wav");
 				self.pain_finished = time + 1;
 			}
 			return;
@@ -379,7 +379,7 @@
 		{
 			self.pain_finished = time + 5;
 			bprint(ColoredTeamName(self.team), " generator under attack!\n");
-			play2team(self.team, "sound/onslaught/generator_underattack.wav");
+			play2team(self.team, "onslaught/generator_underattack.wav");
 		}
 	}
 	self.health = self.health - damage;
@@ -580,10 +580,10 @@
 	local entity e;
 	precache_model("models/onslaught/generator.md3");
 	precache_model("models/onslaught/generator_shield.md3");
-	precache_sound("sound/onslaught/generator_decay.wav");
-	precache_sound("sound/weapons/grenade_impact.wav");
-	precache_sound("sound/weapons/rocket_impact.wav");
-	precache_sound("sound/onslaught/generator_underattack.wav");
+	precache_sound("onslaught/generator_decay.wav");
+	precache_sound("weapons/grenade_impact.wav");
+	precache_sound("weapons/rocket_impact.wav");
+	precache_sound("onslaught/generator_underattack.wav");
 	if (!self.team)
 		objerror("team must be set");
 	self.team_saved = self.team;
@@ -646,7 +646,7 @@
 		if (time > self.pain_finished)
 		if (attacker.classname == "player")
 		{
-			play2(attacker, "sound/onslaught/damageblockedbyshield.wav");
+			play2(attacker, "onslaught/damageblockedbyshield.wav");
 			self.pain_finished = time + 1;
 		}
 		return;
@@ -654,7 +654,7 @@
 	if (time > self.pain_finished)
 	if (attacker.classname == "player")
 	{
-		play2team(self.team, "sound/onslaught/controlpoint_underattack.wav");
+		play2team(self.team, "onslaught/controlpoint_underattack.wav");
 		self.pain_finished = time + 5;
 	}
 	self.health = self.health - damage;
@@ -664,7 +664,7 @@
 	self.colormod = '2 2 2';
 	if (self.health < 0)
 	{
-		sound(self, CHAN_TRIGGER, "sound/weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 		pointparticles(particleeffectnum("onslaught_controlpoint_explosion"), self.origin, '0 0 0', 1);
 		{
 			string t;
@@ -744,7 +744,7 @@
 		self.health = self.max_health;
 		self.count = self.count * 0.2; // slow repair rate from now on
 		self.think = onslaught_controlpoint_icon_think;
-		sound(self, CHAN_TRIGGER, "sound/onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
 		bprint(ColoredTeamName(self.team), " captured ", self.owner.message, " control point\n");
 		self.owner.iscaptured = TRUE;
 		onslaught_updatelinks();
@@ -792,7 +792,7 @@
 	e.think = onslaught_controlpoint_icon_buildthink;
 	e.nextthink = time + 0.1;
 	e.count = e.max_health / 50; // how long it takes to build
-	sound(e, CHAN_TRIGGER, "sound/onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
+	sound(e, CHAN_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
 	self.team = e.team;
 	self.colormap = e.colormap;
 };
@@ -818,11 +818,11 @@
 	precache_model("models/onslaught/controlpoint_pad.md3");
 	precache_model("models/onslaught/controlpoint_shield.md3");
 	precache_model("models/onslaught/controlpoint_icon.md3");
-	precache_sound("sound/onslaught/controlpoint_build.wav");
-	precache_sound("sound/onslaught/controlpoint_built.wav");
-	precache_sound("sound/weapons/grenade_impact.wav");
-	precache_sound("sound/onslaught/damageblockedbyshield.wav");
-	precache_sound("sound/onslaught/controlpoint_underattack.wav");
+	precache_sound("onslaught/controlpoint_build.wav");
+	precache_sound("onslaught/controlpoint_built.wav");
+	precache_sound("weapons/grenade_impact.wav");
+	precache_sound("onslaught/damageblockedbyshield.wav");
+	precache_sound("onslaught/controlpoint_underattack.wav");
 	self.solid = SOLID_BSP;
 	self.movetype = MOVETYPE_NONE;
 	setmodel(self, "models/onslaught/controlpoint_pad.md3");

Modified: branches/nexuiz-2.0/data/qcsrc/server/portals.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/portals.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/portals.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -312,44 +312,44 @@
 void Portal_Think();
 void Portal_MakeBrokenPortal(entity portal)
 {
+	portal.skin = 2;
 	portal.solid = SOLID_NOT;
 	portal.touch = SUB_Null;
 	portal.think = SUB_Null;
 	portal.effects = 0;
-	//portal.colormod = '1 1 1';
 	portal.nextthink = 0;
 	portal.takedamage = DAMAGE_NO;
 }
 
 void Portal_MakeWaitingPortal(entity portal)
 {
+	portal.skin = 2;
 	portal.solid = SOLID_NOT;
 	portal.touch = SUB_Null;
 	portal.think = SUB_Null;
 	portal.effects = EF_ADDITIVE;
-	portal.colormod = '1 1 1';
 	portal.nextthink = 0;
 	portal.takedamage = DAMAGE_YES;
 }
 
 void Portal_MakeInPortal(entity portal)
 {
+	portal.skin = 0;
 	portal.solid = SOLID_TRIGGER;
 	portal.touch = Portal_Touch;
 	portal.think = Portal_Think;
 	portal.effects = EF_RED;
-	portal.colormod = '1 0 0';
 	portal.nextthink = time;
 	portal.takedamage = DAMAGE_NO;
 }
 
 void Portal_MakeOutPortal(entity portal)
 {
+	portal.skin = 1;
 	portal.solid = SOLID_NOT;
 	portal.touch = SUB_Null;
 	portal.think = SUB_Null;
 	portal.effects = EF_STARDUST | EF_BLUE;
-	portal.colormod = '0 0 1';
 	portal.nextthink = 0;
 	portal.takedamage = DAMAGE_YES;
 }
@@ -425,14 +425,14 @@
 	if(killed)
 	{
 		fixedmakevectors(portal.angles);
-		sound(portal, CHAN_PROJECTILE, "porto/explode.ogg", VOL_BASE, ATTN_NORM);
+		sound(portal, CHAN_PROJECTILE, "porto/explode.wav", VOL_BASE, ATTN_NORM);
 		pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4);
 		remove(portal);
 	}
 	else
 	{
 		Portal_MakeBrokenPortal(portal);
-		sound(portal, CHAN_PROJECTILE, "porto/expire.ogg", VOL_BASE, ATTN_NORM);
+		sound(portal, CHAN_PROJECTILE, "porto/expire.wav", VOL_BASE, ATTN_NORM);
 		SUB_SetFade(portal, time, 0.5);
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2008-11-27 13:33:46 UTC (rev 5122)
@@ -3,12 +3,14 @@
 ../common/util-pre.qh
 sys.qh
 builtins.qh
+extensions.qh
 constants.qh
 ../common/constants.qh
-defs.qh		// Should rename this, it has fields and globals
-extensions.qh
 ../common/util.qh
+../common/items.qh
 
+defs.qh		// Should rename this, it has fields and globals
+
 //// tZork Turrets ////
 tturrets/include/turrets_early.qh
 
@@ -152,3 +154,5 @@
 
 target_spawn.qc
 func_breakable.qc
+
+../common/items.qc

Modified: branches/nexuiz-2.0/data/qcsrc/server/race.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/race.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/race.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -386,6 +386,9 @@
 
 void checkpoint_use()
 {
+	if(other.classname == "info_player_deathmatch") // a spawn, a spawn
+		return;
+
 	other = activator;
 	checkpoint_passed();
 }
@@ -559,6 +562,8 @@
 {
 	race_ClearRecords();
 
+	PlayerScore_Sort(race_place);
+
 	if(g_race_qualifying == 2)
 	{
 		g_race_qualifying = 0;
@@ -566,6 +571,4 @@
 		cvar_set("fraglimit", ftos(race_fraglimit));
 		ScoreRules_race();
 	}
-
-	PlayerScore_Sort(race_place);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -594,6 +594,9 @@
 {
 	entity p, plist, pprev, pbest, pbestprev, pfirst, plast;
 	float i;
+
+	DumpStats(0);
+
 	plist = world;
 
 	FOR_EACH_CLIENT(p)
@@ -630,6 +633,9 @@
 		pbest.chain = world;
 
 		pbest.field = ++i;
+
+		print("DEBUG: place ", ftos(i), " is ", pbest.netname, "\n");
+
 		if not(pfirst)
 			pfirst = pbest;
 		if(plast)

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -35,7 +35,7 @@
 void ScoreRules_generic()
 {
 	CheckAllowedTeams(world);
-	if(teamplay)
+	if(teams_matter)
 	{
 		CheckAllowedTeams(world);
 		ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE);
@@ -161,3 +161,14 @@
 	}
 	ScoreRules_basics_end();
 }
+
+// Assault stuff
+#define ST_ASSAULT_OBJECTIVES 1
+#define SP_ASSAULT_OBJECTIVES 4
+void ScoreRules_assault()
+{
+	ScoreRules_basics(2, SFL_SORT_PRIO_SECONDARY, SFL_SORT_PRIO_SECONDARY, TRUE);
+	ScoreInfo_SetLabel_TeamScore(  ST_ASSAULT_OBJECTIVES,    "objectives",      SFL_SORT_PRIO_PRIMARY);
+	ScoreInfo_SetLabel_PlayerScore(SP_ASSAULT_OBJECTIVES,    "objectives",      SFL_SORT_PRIO_PRIMARY);
+	ScoreRules_basics_end();
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -143,6 +143,7 @@
 	UncustomizeEntitiesRun();
 	InitializeEntitiesRun();
 
+	sv_gravity = cvar("sv_gravity");
 	sv_maxairspeed = cvar("sv_maxairspeed");
 	sv_maxspeed = cvar ("sv_maxspeed");
 	sv_friction = cvar ("sv_friction");

Modified: branches/nexuiz-2.0/data/qcsrc/server/sys.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sys.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/sys.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 #pragma flag off fastarrays // make dp behave with new fteqcc versions. remove when dp bug with fteqcc fastarrays is fixed
+#define SVQC
 
 // DO NOT modify the contents of this file, or you will risk incompatibility with the game engine.
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -64,12 +64,12 @@
 			// play some cool sounds ;)
 			centerprint(player, "\n");
 			if(player.health <= 5)
-				announce(player, "announcer/robotic/lastsecond.ogg");
+				announce(player, "announcer/robotic/lastsecond.wav");
 			else if(player.health < 50)
-				announce(player, "announcer/robotic/narrowly.ogg");
+				announce(player, "announcer/robotic/narrowly.wav");
 			// sound not available
 			// else if(item.items == IT_CELLS)
-			//	play2(player, "announce/robotic/ammo.ogg");
+			//	play2(player, "announce/robotic/ammo.wav");
 
 			if (item.weapons & WEPBIT_MINSTANEX)
 				W_GiveWeapon (player, WEP_MINSTANEX, "Nex");
@@ -83,7 +83,7 @@
 		{
 			pickedup = TRUE;
 			// sound not available
-			// play2(player, "announce/robotic/extra.ogg\nplay2 announce/robotic/_lives.ogg");
+			// play2(player, "announce/robotic/extra.ogg\nplay2 announce/robotic/_lives.wav");
 			player.armorvalue = player.armorvalue + cvar("g_minstagib_extralives");
 			sprint(player, "^3You picked up some extra lives\n");
 		}
@@ -93,7 +93,7 @@
 		{
 			pickedup = TRUE;
 			// sound not available
-			// play2(player, "announce/robotic/invisible.ogg");
+			// play2(player, "announce/robotic/invisible.wav");
 			player.strength_finished = max(player.strength_finished, time) + cvar("g_balance_powerup_strength_time");
 		}
 
@@ -102,7 +102,7 @@
 		{
 			pickedup = TRUE;
 			// sound not available
-			// play2(player, "announce/robotic/speed.ogg");
+			// play2(player, "announce/robotic/speed.wav");
 			player.invincible_finished = max(player.invincible_finished, time) + cvar("g_balance_powerup_strength_time");
 		}
 	}
@@ -802,7 +802,7 @@
 		self.armorvalue = g_pickup_armormedium;
 	if(!self.max_armorvalue)
 		self.max_armorvalue = g_pickup_armormedium_max;
-	StartItem ("models/items/g_armormedium.md3", "misc/armor1.wav", g_pickup_respawntime_medium, "25 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 20000);
+	StartItem ("models/items/g_armormedium.md3", "misc/armor10.wav", g_pickup_respawntime_medium, "25 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 20000);
 }
 
 void spawnfunc_item_armor_large (void) {
@@ -948,6 +948,25 @@
 	self.use = func_wall_use;
 }
 
+void gamemodel_drop()
+{
+	if(self.spawnflags & 3 == 1) // ALIGN_ORIGIN
+	{
+		traceline(self.origin, self.origin - '0 0 4096', MOVE_NOMONSTERS, self);
+		setorigin(self, trace_endpos);
+	}
+	else if(self.spawnflags & 3 == 2) // ALIGN_BOTTOM
+	{
+		tracebox(self.origin, self.mins, self.maxs, self.origin - '0 0 4096', MOVE_NOMONSTERS, self);
+		setorigin(self, trace_endpos);
+	}
+	else if(self.spawnflags & 3 == 3) // ALIGN_ORIGIN | ALIGN_BOTTOM
+	{
+		traceline(self.origin, self.origin - '0 0 4096', MOVE_NOMONSTERS, self);
+		setorigin(self, trace_endpos - '0 0 1' * self.mins_z);
+	}
+}
+
 .float modelscale;
 void spawnfunc_misc_gamemodel (void)
 {
@@ -955,6 +974,8 @@
 		self.scale = self.modelscale;
 	SetBrushEntityModel();
 	self.use = func_wall_use;
+
+	InitializeEntity(self, gamemodel_drop, INITPRIO_DROPTOFLOOR);
 }
 
 float target_item_func_set(float a, float b)

Modified: branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -294,8 +294,6 @@
 void trigger_relay_if_use()
 {
 	float n;
-	var .string fld;
-	entity e;
 	n = self.count;
 
 	// TODO make this generic AND faster than nextent()ing through all, if somehow possible

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -152,9 +152,10 @@
 	teamplay_default = cvar("teamplay_default");
 
 	if(teamplay_default)
-		cvar_set("teamplay", ftos(teamplay_default));
+		teamplay = teamplay_default;
 	else
-		cvar_set("teamplay", "3");
+		teamplay = 3;
+	cvar_set("teamplay", ftos(teamplay));
 
 	teams_matter = 1;
 }
@@ -283,6 +284,7 @@
 		game = GAME_ASSAULT;
 		gamemode_name = "Assault";
 		ActivateTeamplay();
+		ScoreRules_assault();
 	}
 
 	if(g_onslaught)

Modified: branches/nexuiz-2.0/data/qcsrc/server/vote.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vote.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/vote.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -66,7 +66,7 @@
 	entity victim;
 	vote_argc = tokenize_sane(vote);
 
-	if(!VoteAllowed(argv(0)))
+	if(!VoteAllowed(argv(0), cmd))
 	{
 		return FALSE;
 	}
@@ -383,9 +383,10 @@
 	return substring(all, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
 }
 
-float VoteAllowed(string votecommand) {
+float VoteAllowed(string votecommand, string cmd) {
+	local float index;
+
 	tokenize_sane(cvar_string("sv_vote_commands"));
-	local float index;
 	index = 0;
 	while(argv(index) != "") {
 		if(votecommand == argv(index)) {
@@ -393,6 +394,19 @@
 		}
 		++index;
 	}
+
+	if(cmd == "vdo")
+		tokenize_sane(cvar_string("sv_vote_master_commands"));
+	else
+		tokenize_sane(cvar_string("sv_vote_only_commands"));
+	index = 0;
+	while(argv(index) != "") {
+		if(votecommand == argv(index)) {
+			return TRUE;
+		}
+		++index;
+	}
+
 	return FALSE;
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/vote.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vote.qh	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/vote.qh	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,3 +1,13 @@
+float votecalled;
+string votecalledvote;
+string votecalledvote_display;
+float votecalledmaster;
+entity votecaller;
+float votefinished;
+.float vote_master;
+.float vote_next;
+.float vote_vote;
+
 string GetKickVoteVictim_newcommand;
 string GetKickVoteVictim_reason;
 
@@ -9,7 +19,7 @@
 string ValidateMap(string m, entity e);
 void VoteThink();
 string VoteParse(string s, float tokens);
-float VoteAllowed(string votecommand);
+float VoteAllowed(string vote, string cmd);
 void VoteReset();
 void VoteAccept();
 void VoteReject();

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -8,6 +8,7 @@
 	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)
@@ -34,6 +35,7 @@
 	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)
@@ -129,7 +131,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
 
-	W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
+	W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire2.wav");
 
 	shots = cvar("g_balance_crylink_secondary_shots");
 	pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
@@ -228,6 +230,9 @@
 		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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -8,7 +8,7 @@
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
 				if(IsFlying(other))
-					announce(self.owner, "announcer/male/electrobitch.ogg");
+					announce(self.owner, "announcer/male/electrobitch.wav");
 
 	self.event_damage = SUB_Null;
 	if (self.movetype == MOVETYPE_BOUNCE)
@@ -59,6 +59,8 @@
 
 void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
+	if(self.health <= 0)
+		return;
 	self.health = self.health - damage;
 	if (self.health <= 0)
 	{
@@ -70,6 +72,7 @@
 			self.owner = inflictor.owner;
 			self.classname = "plasma_chain";
 			self.think = W_Plasma_Explode_Combo;
+			self.nextthink = time + vlen(self.origin - inflictor.origin) / cvar("g_balance_electro_combo_speed"); // delay combo chains, looks cooler
 		}
 		else
 			self.think = W_Plasma_Explode;

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -9,7 +9,7 @@
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
 				if(IsFlying(other))
-					announce(self.owner, "announcer/male/airshot.ogg");
+					announce(self.owner, "announcer/male/airshot.wav");
 
 	self.event_damage = SUB_Null;
 	RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), self.projectiledeathtype, other);
@@ -31,7 +31,7 @@
 		if(other.classname == "player")
 			if(IsDifferentTeam(self.owner, other))
 				if(IsFlying(other))
-					announce(self.owner, "announcer/male/airshot.ogg");
+					announce(self.owner, "announcer/male/airshot.wav");
 
 	remove (self);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -15,20 +15,20 @@
 	if(g_minstagib)
 	{
 		if(yoda)
-			announce(self, "announcer/male/yoda.ogg");
+			announce(self, "announcer/male/yoda.wav");
 	}
 	else
 	{
 		if(yoda && flying)
-			announce(self, "announcer/male/yoda.ogg");
+			announce(self, "announcer/male/yoda.wav");
 		if(headshot)
 		{
-			announce(self, "announcer/male/headshot.ogg");
+			announce(self, "announcer/male/headshot.wav");
 			print("h\n");
 		}
 		if(damage_goodhits && self.minstanex_lasthit)
 		{
-			if(announce(self, "announcer/male/impressive.ogg"))
+			if(announce(self, "announcer/male/impressive.wav"))
 				damage_goodhits = 0; // only every second time
 		}
 	}
@@ -67,67 +67,67 @@
 		{
 			centerprint(self, "you're dead now...\n");
 			Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/terminated.ogg");
+			announce(self, "announcer/robotic/terminated.wav");
 		}
 		if (self.health == 10)
 		{
 			centerprint(self, "^11^7 second left to find some ammo\n");
 			Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/1.ogg");
+			announce(self, "announcer/robotic/1.wav");
 		}
 		if (self.health == 20)
 		{
 			centerprint(self, "^12^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/2.ogg");
+			announce(self, "announcer/robotic/2.wav");
 		}
 		if (self.health == 30)
 		{
 			centerprint(self, "^13^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/3.ogg");
+			announce(self, "announcer/robotic/3.wav");
 		}
 		if (self.health == 40)
 		{
 			centerprint(self, "^14^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/4.ogg");
+			announce(self, "announcer/robotic/4.wav");
 		}
 		if (self.health == 50)
 		{
 			centerprint(self, "^15^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/5.ogg");
+			announce(self, "announcer/robotic/5.wav");
 		}
 		if (self.health == 60)
 		{
 			centerprint(self, "^36^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/6.ogg");
+			announce(self, "announcer/robotic/6.wav");
 		}
 		if (self.health == 70)
 		{
 			centerprint(self, "^37^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/7.ogg");
+			announce(self, "announcer/robotic/7.wav");
 		}
 		if (self.health == 80)
 		{
 			centerprint(self, "^38^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/8.ogg");
+			announce(self, "announcer/robotic/8.wav");
 		}
 		if (self.health == 90)
 		{
 			centerprint(self, "^39^7 seconds left to find some ammo\n");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/9.ogg");
+			announce(self, "announcer/robotic/9.wav");
 		}
 		if (self.health == 100)
 		{
 			centerprint(self, "get some ammo or\nyou'll be dead in ^310^7 seconds...");
 			Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
-			announce(self, "announcer/robotic/10.ogg");
+			announce(self, "announcer/robotic/10.wav");
 		}
 	}
 	self.minstagib_nextthink = time + 1;

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -9,7 +9,7 @@
 	FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, cvar("g_balance_nex_damage"), cvar("g_balance_nex_force"), WEP_NEX);
 
 	if(yoda && flying)
-		announce(self, "announcer/male/yoda.ogg");
+		announce(self, "announcer/male/yoda.wav");
 
 	pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -91,19 +91,19 @@
 
 	if(self.owner.playerid != self.playerid)
 	{
-		sound(self, CHAN_PROJECTILE, "porto/unsupported.ogg", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
 		remove(self);
 	}
 	else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
 	{
-		sound(self, CHAN_PROJECTILE, "porto/bounce.ogg", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_PROJECTILE, "porto/bounce.wav", VOL_BASE, ATTN_NORM);
 		// just reflect
 		self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
 		self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
 	}
 	else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		sound(self, CHAN_PROJECTILE, "porto/unsupported.ogg", VOL_BASE, ATTN_NORM);
+		sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
 		W_Porto_Fail(0);
 	}
 	else if(self.effects & EF_RED)
@@ -111,7 +111,7 @@
 		self.effects += EF_BLUE - EF_RED;
 		if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id))
 		{
-			sound(self, CHAN_PROJECTILE, "porto/create.ogg", VOL_BASE, ATTN_NORM);
+			sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
 			trace_plane_normal = norm;
 			centerprint(self.owner, "^1In^7-portal created.\n");
 			self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
@@ -119,7 +119,7 @@
 		}
 		else
 		{
-			sound(self, CHAN_PROJECTILE, "porto/unsupported.ogg", VOL_BASE, ATTN_NORM);
+			sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
 			trace_plane_normal = norm;
 			W_Porto_Fail(0);
 		}
@@ -130,20 +130,20 @@
 		{
 			if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id))
 			{
-				sound(self, CHAN_PROJECTILE, "porto/create.ogg", VOL_BASE, ATTN_NORM);
+				sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
 				trace_plane_normal = norm;
 				centerprint(self.owner, "^4Out^7-portal created.\n");
 				W_Porto_Success();
 			}
 			else
 			{
-				sound(self, CHAN_PROJECTILE, "porto/unsupported.ogg", VOL_BASE, ATTN_NORM);
+				sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
 				W_Porto_Fail(0);
 			}
 		}
 		else
 		{
-			sound(self, CHAN_PROJECTILE, "porto/unsupported.ogg", VOL_BASE, ATTN_NORM);
+			sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
 			W_Porto_Fail(0);
 		}
 	}
@@ -156,7 +156,7 @@
 
 	if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
 		self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
-	W_SetupShot (self, '0 0 0', FALSE, 4, "porto/fire.ogg");
+	W_SetupShot (self, '0 0 0', FALSE, 4, "porto/fire.wav");
 
 	//pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -264,12 +264,12 @@
 		precache_model ("models/weapons/v_porto.md3");
 		precache_model ("models/weapons/w_porto.zym");
 		precache_model ("models/portal.md3");
-		precache_sound ("porto/bounce.ogg");
-		precache_sound ("porto/create.ogg");
-		precache_sound ("porto/expire.ogg");
-		precache_sound ("porto/explode.ogg");
-		precache_sound ("porto/fire.ogg");
-		precache_sound ("porto/unsupported.ogg");
+		precache_sound ("porto/bounce.wav");
+		precache_sound ("porto/create.wav");
+		precache_sound ("porto/expire.wav");
+		precache_sound ("porto/explode.wav");
+		precache_sound ("porto/fire.wav");
+		precache_sound ("porto/unsupported.wav");
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_PORTO);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -241,7 +241,7 @@
 	missile.nextthink = time;
 	missile.cnt = time + cvar("g_balance_rocketlauncher_lifetime");
 	missile.effects = EF_LOWPRECISION;
-	sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4 * VOL_BASE, ATTN_NORM);
+	sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
 	missile.flags = FL_PROJECTILE;
 
 	// muzzle flash for 1st person view
@@ -387,7 +387,7 @@
 					}
 				}
 				if(rockfound)
-					sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
+					sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
 				else
 				{
 					if (weapon_prepareattack(0, cvar("g_balance_rocketlauncher_refire")))
@@ -406,7 +406,7 @@
 				self.exteriorweaponentity.attack_finished_single = time + 0.4;
 				self.laser_on = !self.laser_on;
 				// UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
-				sound (self, CHAN_WEAPON2, "weapons/tink1.wav", VOL_BASE, ATTN_NORM);
+				sound (self, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
 			}
 		}
 		else
@@ -429,7 +429,7 @@
 					}
 				}
 				if(rockfound)
-					sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
+					sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
 			}
 		}
 	}
@@ -445,7 +445,10 @@
 		precache_sound ("weapons/rocket_fly.wav");
 		precache_sound ("weapons/rocket_impact.wav");
 		if (g_laserguided_missile)
+		{
 			precache_model ("models/laser_dot.mdl"); // rocket launcher
+			precache_sound ("weapons/rocket_mode.wav");
+		}
 	}
 	else if (req == WR_SETUP)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -11,11 +11,11 @@
 
 	b = crandom();
 	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
 	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
 	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+		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);
@@ -33,7 +33,7 @@
 void Seeker_Missile_Think()
 {
 	entity e;
-	vector desireddir, olddir, newdir;
+	vector desireddir, olddir, newdir, eorg;
 	float turnrate;
 	float dist;
 
@@ -56,10 +56,11 @@
 	if (self.enemy != world)
 	{
 		e               = self.enemy;
+		eorg            = 0.5 * (e.absmin + e.absmax);
 		turnrate        = cvar("g_balance_seeker_missile_turnrate");		    // how fast to turn
-		desireddir      = normalize(e.origin - self.origin);
+		desireddir      = normalize(eorg - self.origin);
 		olddir          = normalize(self.velocity);				            // get my current direction
-		dist            = vlen(e.origin - self.origin);
+		dist            = vlen(eorg - self.origin);
 
 		// Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
 		if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
@@ -68,7 +69,7 @@
 			if ( vlen(self.origin + olddir * self.wait) < dist)
 				traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
 			else
-				traceline(self.origin, self.enemy.origin, FALSE, self);
+				traceline(self.origin, eorg, FALSE, self);
 
 			// Setup adaptive tracelength
 			self.wait = vlen(self.origin - trace_endpos);
@@ -171,7 +172,7 @@
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
 
 	makevectors(self.v_angle);
-	W_SetupShot (self, f_org, FALSE, 2, "weapons/hagar_fire.wav");
+	W_SetupShot (self, f_org, FALSE, 2, "weapons/seeker_fire.wav");
 	pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
 	//self.detornator         = FALSE;
@@ -279,11 +280,11 @@
 
 	b = crandom();
 	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
 	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
 	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
 
 	remove (self);
 }
@@ -299,7 +300,7 @@
 	vector dir;
 	vector org2;
 
-	PROJECTILE_TOUCH;
+	PROJECTILE_TOUCH_NOSOUND;
 
 	dir     = normalize (self.owner.origin - self.origin);
 	org2    = findbetterlocation (self.origin, 8);
@@ -307,7 +308,7 @@
 	te_knightspike(org2);
 
 	self.event_damage = SUB_Null;
-	sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", 1, ATTN_NORM);
+	sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
 
 	if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
 	{
@@ -338,7 +339,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
 
-	W_SetupShot (self, '56 13 -15', FALSE, 2, "weapons/hagar_fire.wav");
+	W_SetupShot (self, '56 13 -15', FALSE, 2, "weapons/tag_fire.wav");
 
 	missile                 = spawn();
 	missile.owner           = self;
@@ -362,6 +363,7 @@
 
 	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");
@@ -380,11 +382,11 @@
 
 	b = crandom();
 	if (b<-0.7)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
 	else if (b<0.4)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
 	else if (b<1)
-		sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+		sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
 
 	self.event_damage = SUB_Null;
 
@@ -426,7 +428,7 @@
 			f_org = '40 9.5 -29';
 			break;
 	}
-	W_SetupShot (self, f_org, FALSE, 2, "weapons/hagar_fire.wav");
+	W_SetupShot (self, f_org, FALSE, 2, "weapons/flac_fire.wav");
 
 		pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -494,11 +496,20 @@
 		precache_model ("models/weapons/g_seeker.md3");
 		precache_model ("models/weapons/v_seeker.md3");
 		precache_model ("models/weapons/w_seeker.zym");
-		precache_sound ("weapons/hagar_fire.wav");
-		precache_sound ("weapons/hagexp1.wav");
-		precache_sound ("weapons/hagexp2.wav");
-		precache_sound ("weapons/hagexp3.wav");
-		precache_sound ("weapons/laserimpact.wav");
+		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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -131,9 +131,13 @@
 		precache_sound ("weapons/ric2.wav");
 		precache_sound ("weapons/ric3.wav");
 		precache_sound ("weapons/shotgun_fire.wav");
-		precache_sound ("weapons/tink1.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	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc	2008-11-27 13:33:46 UTC (rev 5122)
@@ -136,10 +136,14 @@
 		precache_sound ("weapons/ric1.wav");
 		precache_sound ("weapons/ric2.wav");
 		precache_sound ("weapons/ric3.wav");
-		precache_sound ("weapons/tink1.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/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/scripts/entities.def	2008-11-27 13:33:46 UTC (rev 5122)
@@ -221,6 +221,7 @@
 Attacking team's player spawning location in Assault. Should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 target: this should point to a target_objective to decide when this spawning point is active.
+target2: trigger all entities with this targetname when someone spawns
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
 */
 
@@ -228,6 +229,7 @@
 Normal player spawning location in game types without team spawns. Should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+target: trigger all entities with this targetname when someone spawns
 targetname: when targeted by a func_button, pressing the button will assign the spawn point to the team of the activator as an additional spawn point, or reassign it if it was already assigned. Also used to assign spawn points to Onslaught control points.
 */
 
@@ -235,6 +237,7 @@
 Defending team's player spawning location in Assault. Should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 target: this should point to a target_objective to decide when this spawning point is active.
+target2: trigger all entities with this targetname when someone spawns
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
 */
 
@@ -242,6 +245,7 @@
 Red team's player spawning location in e.g. CTF and Onslaught. Should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+target: trigger all entities with this targetname when someone spawns
 targetname: when targeted by a func_button, pressing the button will reassign the spawn point to the team of the activator. If a team has no more spawn point left, it immediately loses.
 */
 
@@ -249,6 +253,7 @@
 Blue team's player spawning location in e.g. CTF and Onslaught. Should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+target: trigger all entities with this targetname when someone spawns
 targetname: when targeted by a func_button, pressing the button will reassign the spawn point to the team of the activator. If a team has no more spawn point left, it immediately loses.
 */
 
@@ -256,6 +261,7 @@
 Yellow team's player spawning location, but there is no game mode to use this yet. Anyway, should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+target: trigger all entities with this targetname when someone spawns
 targetname: when targeted by a func_button, pressing the button will reassign the spawn point to the team of the activator. If a team has no more spawn point left, it immediately loses.
 */
 
@@ -263,6 +269,7 @@
 Pink team's player spawning location, but there is no game mode to use this yet. Anyway, should touch the floor, but not the walls, and should point where the player should look when he spawns there.
 -------- KEYS --------
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
+target: trigger all entities with this targetname when someone spawns
 targetname: when targeted by a func_button, pressing the button will reassign the spawn point to the team of the activator. If a team has no more spawn point left, it immediately loses.
 */
 
@@ -545,7 +552,7 @@
 EXTRUDE_TERRAIN: always extrude downwards (for terrain)
 */
 
-/*QUAKED misc_gamemodel (0 .5 .8) (-8 -8 -8) (8 8 8)
+/*QUAKED misc_gamemodel (0 .5 .8) (-8 -8 -8) (8 8 8) ALIGN_ORIGIN ALIGN_BOTTOM
 A way to load models from a map by the engine (e.g. self-animated zym models).
 Is non-solid by default.
 The keys below actually apply to most engine-loaded model entities as they are engine features; however, they are described here as they aren't overridden by game code in misc_models. Its q3map2 keys below will work on any brush entity!
@@ -572,6 +579,9 @@
 _castshadows: Allows per-entity control over shadow casting. Defaults to 0 on entities, 1 on world. 0 = no shadow casting. 1 = cast shadows on world. > 1 = cast shadows on entities with _rs (or _receiveshadows) with the corresponding value, AND world. Negative values imply same, but DO NOT cast shadows on world.
 targetname: if targeted by a misc_model, its brushes get inserted into this
 _celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
+-------- SPAWNFLAGS --------
+ALIGN_ORIGN: align the origin to the surface below the model
+ALIGN_BOTTOM: align the bottom of the model to the surface below it
 */
 
 /*QUAKED func_illusionary (0 .5 .8) ? 
@@ -684,20 +694,25 @@
 Ending a round means swapping attacker/defender teams, resetting objectives and rewarding the winning team.
 Every assault map needs this entity. There should only be one per map.
 -------- KEYS --------
-health: Time in seconds how long a round in assault shall last. Default is 300 seconds.
 targetname: Name to target this entity
 */
 
 /*QUAKED target_assault_roundstart (.5 0 .5) (-8 -8 -8) (8 8 8) 
 This entity triggers its targets whenever a new assault round is started. This can be used to e.g. activate the first objective.
 -------- KEYS --------
-target: targetname of the entity/entities to be triggered
+target: targetname of entities to be enabled/triggered on round start (e.g. the first target_objective)
+target2: targetname of entities to be enabled/triggered on round start (e.g. the func_assault_destructibles targeting the target_objective)
+target3: targetname of entities to be enabled/triggered on round start
+target4: targetname of entities to be enabled/triggered on round start
 */
 
 /*QUAKED target_objective (.5 0 .5) (-8 -8 -8) (8 8 8) 
 target_objective controls an objective. Once triggered the objective is active and has 100 "health" points. If this "health" falls below zero it is assumed this objective has been fulfilled and entities targeted will be triggered (e.g. to activate the next objective or to end this round). Use target_objective_decrease to decrease the objective health.
 -------- KEYS --------
-target: targetname of the entity to be triggered once this objective is fulfilled.
+target: targetname of entities to be enabled/triggered on objective fulfilling (e.g. the next target_objective, or target_assault_roundend)
+target2: targetname of entities to be enabled/triggered on objective fulfilling (e.g. the func_assault_destructibles targeting the target_objective)
+target3: targetname of entities to be enabled/triggered on objective fulfilling
+target4: targetname of entities to be enabled/triggered on objective fulfilling
 targetname: targetname for this entity so it can be triggered by other entities.
 */
 
@@ -707,7 +722,7 @@
 -------- KEYS --------
 target: The targetname of the target_objective you want to manipulate.
 targetname: Name for other entities to target this entity.
-dmg: The amount of "health"-points you want to subtract from the objective health. Defaults to 101.
+dmg: The amount of "health"-points you want to subtract from the objective health. Defaults to 101. Also used as score for triggering this objective.
 */
 
 /*QUAKED target_position (0 .5 0) (-8 -8 -8) (8 8 8) 
@@ -782,6 +797,9 @@
 sounds: 1 to play misc/secret.wav, 2 to play misc/talk.wav, 3 to play misc/trigger1.wav
 noise: path to sound file, if you want to play something else
 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
@@ -991,6 +1009,7 @@
 NOTE for race_place: when the race starts after the qualifying, the player with the fastest map ends up at the info_player_race with race_place 1, and so on. If there are too many players, or if someone comes in later, he will spawn at an info_player_race with race_place not set. So for each trigger_race_checkpoint, there must be at least one corresponding info_player_race with race_place NOT set.
 -------- KEYS --------
 target: this should point to a trigger_race_checkpoint to decide when this spawning point is active. The checkpoint has to be AFTER this spawn.
+target2: trigger all entities with this targetname when someone spawns
 cnt: weight of spawn point for random selection. Set to a lower value if you have many spawn points close together. Default value is 1.
 race_place: if target points to the trigger_race_checkpoint with cnt 0 (finish line), this sets which place the spawn corresponds to; the special value 0 stands for spawns for players who come in later (have to be behind the ones with race_place set to an actual place), and -1 marks the spawnpoint for qualifying mode only
 */
@@ -1146,6 +1165,13 @@
 count: particle effect multiplier
 mdl_dead: optional replacement model to show when destroyed
 debris: names of debris models to show when destroyed, separated by spaces
+noise: sound to play when destroyed
+dmg: damage to deal to the environment when destroyed
+dmg_edge: edge damage to deal to the environment when destroyed
+dmg_radius: damage radius
+dmg_force: damage force
+message: death message when a player gets hit by the explosion
+message2: death message when someone gets pushed into this (default: "was pushed into an explosion by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
 -------- SPAWNFLAGS --------
 DISABLED: do not allow damaging this until it is first activated
 INDICATE: indicate amount of damage already taken by coloring
@@ -1184,3 +1210,11 @@
 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
 model="models/weapons/g_seeker.md3"
 */
+
+/*QUAKED trigger_heal (.5 .5 .5) ?
+Any object touching this will be healed.
+-------- KEYS --------
+health: health to give per second (default 10)
+max_health: max health this trigger will give (default 200)
+noise: sound file to play (use misc/null.wav to make it silent), default = item_health_medium sound
+*/

Modified: branches/nexuiz-2.0/data/scripts/shaderlist.txt
===================================================================
--- branches/nexuiz-2.0/data/scripts/shaderlist.txt	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/scripts/shaderlist.txt	2008-11-27 13:33:46 UTC (rev 5122)
@@ -23,7 +23,8 @@
 mflag
 morphed
 nexdm18_rmx
-official_cmp1
+official_cmp1
+portals
 reaper
 ruiner
 savdm6ish

Modified: branches/nexuiz-2.0/data/sound/announcer/male/airshot.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/announcer/male/impressive.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/ctf/take.wav
===================================================================
(Binary files differ)

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

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

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

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

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

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

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/attackinfive.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/incoming.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/meet.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/coms/seenflag.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/death3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/drown.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/fall1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/falling.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/gasp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/jump.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain25.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain50.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/carni-lycan/player/pain75.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/default.sounds
===================================================================
--- branches/nexuiz-2.0/data/sound/player/default.sounds	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/sound/player/default.sounds	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,16 +1,27 @@
+//affirmative sound/player/torus/affirmative 0
 attack sound/player/torus/attack 0
+//attacking sound/player/torus/attacking 0
 attackinfive sound/player/torus/letsgo 0
 coverme sound/player/torus/coverme 0
 //defend sound/player/voice/defend 1
+//defending sound/player/torus/defending 0
+//droppedflag sound/player/voice/droppedflag 0
+//flagcarriertakingdamage sound/player/voice/flagcarriertakingdamage 0
 //freelance sound/player/voice/freelance 1
+//getflag sound/player/voice/getflag 0
 incoming sound/player/torus/incoming 0
 meet sound/player/torus/waypoint 0
 needhelp sound/player/torus/needhelp 0
+//negative sound/player/torus/negative 0
+//onmyway sound/player/torus/onmyway 0
+//roaming sound/player/torus/roaming 0
+//seenenemy sound/player/torus/seenenemy 0
 seenflag sound/player/torus/flagseen 0
 taunt sound/player/torus/taunt 0
 teamshoot sound/player/torus/teamshoot 0
 death sound/player/torus/death 0
 drown sound/player/torus/drown 0
+//fall sound/debug/v_falling 0
 //falling sound/debug/v_falling 0
 gasp sound/player/torus/gasp 0
 jump sound/player/torus/jump 0
@@ -18,4 +29,3 @@
 pain50 sound/player/torus/pain50 0
 pain75 sound/player/torus/pain75 0
 pain100 sound/player/torus/pain100 0
-// TODO take out ALL the debug sounds, before I will remove them again! Deadline is Oct 1 2008.

Copied: branches/nexuiz-2.0/data/sound/player/fricka/coms (from rev 5121, trunk/data/sound/player/fricka/coms)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/death1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/death2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/death3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/drown.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/fall1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/falling.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/gasp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/jump.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/pain25.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/pain50.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/fricka/player/pain75.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/insurrectionist/coms/taunt1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/insurrectionist/coms/taunt2.ogg
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/player/lava.ogg
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/player/pyria-skadi/coms (from rev 5121, trunk/data/sound/player/pyria-skadi/coms)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/death3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/drown.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/fall1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/falling.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/gasp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/jump.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain25.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain50.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/pyria-skadi/player/pain75.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/reptilian/player/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/reptilian/player/pain75.ogg
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/player/slime.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/soldier/coms/attackinfive.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/soldier/coms/taunt3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/attack.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/attackinfive.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/coverme.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/defend.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/freelance1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/freelance2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/incoming.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/meet.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/needhelp1.ogg
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/sound/player/specop/coms/needhelp2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/seenflag.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/taunt1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/taunt2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/taunt3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/coms/teamshoot3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/death1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/death2.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/death3.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/drown.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/fall1.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/falling.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/gasp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/jump.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/pain25.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/pain50.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/specop/player/pain75.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/attack.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/coverme.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/death.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/drown.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/fall.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/flagseen.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/gasp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/hooah.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/incoming.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/jump.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/letsgo.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/needhelp.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/pain100.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/pain25.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/pain50.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/pain75.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/taunt.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/teamshoot.ogg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/sound/player/torus/waypoint.ogg
===================================================================
(Binary files differ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Deleted: branches/nexuiz-2.0/data/textures/marine_bump.tga
===================================================================
(Binary files differ)

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

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

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

Copied: branches/nexuiz-2.0/data/textures/portals (from rev 5121, trunk/data/textures/portals)

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

Modified: branches/nexuiz-2.0/data/ultimate.cfg
===================================================================
--- branches/nexuiz-2.0/data/ultimate.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/ultimate.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 10
 cl_nogibs 0
 cl_particles_quality 1
 gl_picmip 0

Modified: branches/nexuiz-2.0/data/ultra.cfg
===================================================================
--- branches/nexuiz-2.0/data/ultra.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/ultra.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_time 10
 cl_nogibs 0
 cl_particles_quality 1
 gl_picmip 0

Modified: branches/nexuiz-2.0/data/weapons.cfg
===================================================================
--- branches/nexuiz-2.0/data/weapons.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/weapons.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -134,6 +134,7 @@
 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 20
 set g_balance_crylink_primary_edgedamage 0

Modified: branches/nexuiz-2.0/data/weaponsPro.cfg
===================================================================
--- branches/nexuiz-2.0/data/weaponsPro.cfg	2008-11-27 13:28:52 UTC (rev 5121)
+++ branches/nexuiz-2.0/data/weaponsPro.cfg	2008-11-27 13:33:46 UTC (rev 5122)
@@ -10,6 +10,8 @@
 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_ammo_shells 40
 set g_start_ammo_nails 0
 set g_start_ammo_rockets 0
@@ -132,6 +134,7 @@
 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
@@ -211,6 +214,7 @@
 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
@@ -240,3 +244,91 @@
 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
+
+// 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 30
+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 30
+set g_balance_hlac_secondary_edgedamage 10
+set g_balance_hlac_secondary_force 150
+set g_balance_hlac_secondary_radius 100
+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
+
+




More information about the nexuiz-commits mailing list