r5912 - in branches/nexuiz-2.0: . Docs Docs/htmlfiles data data/gfx data/gfx/menu/wickedz data/maps data/maps/stormkeep data/maps/toxic data/models/ctf data/models/player data/qcsrc/client data/qcsrc/common data/qcsrc/menu/nexuiz data/qcsrc/server data/qcsrc/server/tturrets/include data/qcsrc/server/tturrets/system data/qcsrc/server/tturrets/units data/scripts misc/buildfiles/w32 misc/tools misc/tools/ttf2conchars server server/rcon2irc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Feb 20 09:23:53 EST 2009


Author: div0
Date: 2009-02-20 09:23:51 -0500 (Fri, 20 Feb 2009)
New Revision: 5912

Added:
   branches/nexuiz-2.0/data/gfx/desertfactory_radar.tga
   branches/nexuiz-2.0/data/gfx/keys/
   branches/nexuiz-2.0/data/maps/accident/
   branches/nexuiz-2.0/data/maps/racetrack/
   branches/nexuiz-2.0/misc/buildfiles/w32/libtheora.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/ogg.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/vorbis.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/vorbisenc.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/vorbisfile.dll
Removed:
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0006.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0007.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0008.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0009.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0010.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0011.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0012.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0013.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0014.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0015.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0016.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0017.tga
   branches/nexuiz-2.0/misc/buildfiles/w32/libogg.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/libvorbis.dll
   branches/nexuiz-2.0/misc/buildfiles/w32/libvorbisfile.dll
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/Docs/basics.html
   branches/nexuiz-2.0/Docs/htmlfiles/basics.aft
   branches/nexuiz-2.0/changes-since-last-release
   branches/nexuiz-2.0/data/build-compat-pack.sh
   branches/nexuiz-2.0/data/defaultNexuiz.cfg
   branches/nexuiz-2.0/data/effectinfo.txt
   branches/nexuiz-2.0/data/gfx/inv_weapon13.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedz/background.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedz/background_ingame.tga
   branches/nexuiz-2.0/data/gfx/menu/wickedz/ingame_background.psd
   branches/nexuiz-2.0/data/maps/accident.bsp
   branches/nexuiz-2.0/data/maps/desertfactory.bsp
   branches/nexuiz-2.0/data/maps/desertfactory.map
   branches/nexuiz-2.0/data/maps/desertfactory.mapinfo
   branches/nexuiz-2.0/data/maps/racetrack.bsp
   branches/nexuiz-2.0/data/maps/racetrack.map
   branches/nexuiz-2.0/data/maps/stormkeep.bsp
   branches/nexuiz-2.0/data/maps/stormkeep.map
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0000.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0001.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0002.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0003.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0004.tga
   branches/nexuiz-2.0/data/maps/stormkeep/lm_0005.tga
   branches/nexuiz-2.0/data/maps/toxic.bsp
   branches/nexuiz-2.0/data/maps/toxic/lm_0000.tga
   branches/nexuiz-2.0/data/maps/toxic/lm_0001.tga
   branches/nexuiz-2.0/data/maps/toxic/lm_0002.tga
   branches/nexuiz-2.0/data/maps/toxic/lm_0003.tga
   branches/nexuiz-2.0/data/maps/toxic/lm_0004.tga
   branches/nexuiz-2.0/data/maps/toxic/lm_0005.tga
   branches/nexuiz-2.0/data/models/ctf/flags.md3_0.skin
   branches/nexuiz-2.0/data/models/ctf/flags.md3_1.skin
   branches/nexuiz-2.0/data/models/player/carni.zym_0.skin
   branches/nexuiz-2.0/data/models/player/carni.zym_1.skin
   branches/nexuiz-2.0/data/models/player/crash.zym_0.skin
   branches/nexuiz-2.0/data/models/player/grunt.zym_0.skin
   branches/nexuiz-2.0/data/models/player/headhunter.zym_0.skin
   branches/nexuiz-2.0/data/models/player/insurrectionist.zym_0.skin
   branches/nexuiz-2.0/data/models/player/jeandarc.zym_0.skin
   branches/nexuiz-2.0/data/models/player/lurk.zym_0.skin
   branches/nexuiz-2.0/data/models/player/lurk.zym_1.skin
   branches/nexuiz-2.0/data/models/player/lycanthrope.zym_0.skin
   branches/nexuiz-2.0/data/models/player/marine.zym_0.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_0.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_1.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_2.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_3.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_4.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_5.skin
   branches/nexuiz-2.0/data/models/player/nexus.zym_6.skin
   branches/nexuiz-2.0/data/models/player/pyria.zym_0.skin
   branches/nexuiz-2.0/data/models/player/shock.zym_0.skin
   branches/nexuiz-2.0/data/models/player/skadi.zym_0.skin
   branches/nexuiz-2.0/data/models/player/specop.zym_0.skin
   branches/nexuiz-2.0/data/models/player/visitant.zym_0.skin
   branches/nexuiz-2.0/data/qcsrc/client/Main.qc
   branches/nexuiz-2.0/data/qcsrc/client/View.qc
   branches/nexuiz-2.0/data/qcsrc/client/casings.qc
   branches/nexuiz-2.0/data/qcsrc/client/damage.qc
   branches/nexuiz-2.0/data/qcsrc/client/particles.qc
   branches/nexuiz-2.0/data/qcsrc/client/projectile.qc
   branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
   branches/nexuiz-2.0/data/qcsrc/common/constants.qh
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c
   branches/nexuiz-2.0/data/qcsrc/server/arena.qc
   branches/nexuiz-2.0/data/qcsrc/server/bots.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.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/extensions.qh
   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_world.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/pathlib.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/t_teleporters.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
   branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
   branches/nexuiz-2.0/data/scripts/entities.def
   branches/nexuiz-2.0/data/scripts/shaderlist.txt
   branches/nexuiz-2.0/data/scripts/toxic.shader
   branches/nexuiz-2.0/data/shotorigin_adjuster.cfg
   branches/nexuiz-2.0/data/unit_ewheel.cfg
   branches/nexuiz-2.0/data/unit_flac.cfg
   branches/nexuiz-2.0/data/unit_hellion.cfg
   branches/nexuiz-2.0/data/unit_machinegun.cfg
   branches/nexuiz-2.0/data/unit_mlrs.cfg
   branches/nexuiz-2.0/data/unit_plasma.cfg
   branches/nexuiz-2.0/data/unit_plasma2.cfg
   branches/nexuiz-2.0/data/unit_walker.cfg
   branches/nexuiz-2.0/data/update-cvarcount.sh
   branches/nexuiz-2.0/data/weapons.cfg
   branches/nexuiz-2.0/data/weaponsHavoc.cfg
   branches/nexuiz-2.0/misc/tools/assault-circuit-board-creator.pl
   branches/nexuiz-2.0/misc/tools/autoshader.sh
   branches/nexuiz-2.0/misc/tools/brightspot.sh
   branches/nexuiz-2.0/misc/tools/csqcarchive.sh
   branches/nexuiz-2.0/misc/tools/demotc-race-record-extractor.sh
   branches/nexuiz-2.0/misc/tools/entmerge.pl
   branches/nexuiz-2.0/misc/tools/fiximage.pl
   branches/nexuiz-2.0/misc/tools/polycount.pl
   branches/nexuiz-2.0/misc/tools/shader-checksums.pl
   branches/nexuiz-2.0/misc/tools/ttf2conchars/foo.sh
   branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf
   branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl
   branches/nexuiz-2.0/server/readme.txt
Log:
r5811 | div0 | 2009-02-09 15:23:31 +0100 (Mon, 09 Feb 2009) | 2 lines
new "accident" build with external lightmaps. Currently has only 1 bounce, more will come later. Please test this one though.
r5812 | div0 | 2009-02-09 15:43:03 +0100 (Mon, 09 Feb 2009) | 2 lines
accident finished compile (8 bounces). Enjoy!
r5813 | mand1nga | 2009-02-09 15:58:59 +0100 (Mon, 09 Feb 2009) | 6 lines
Bot improvements:
Use the 2nd best rated goal if something happened to the primary goal (ie: someone picked it up before). This is cheaper than forcing a whole strategy re-think.
Anti lemming behavior workaround
Force strategy re-think upon respawn
Moved keyboard emulation out of movetogoal()
Made them "try" to jump out of lava
r5814 | div0 | 2009-02-09 16:26:16 +0100 (Mon, 09 Feb 2009) | 2 lines
racetrack recompiled. Now ALL maps come with external LMs again.
r5815 | m0rfar | 2009-02-09 20:02:13 +0100 (Mon, 09 Feb 2009) | 1 line
use fuzzy shadows on Toxic
r5816 | m0rfar | 2009-02-09 21:08:06 +0100 (Mon, 09 Feb 2009) | 1 line
removed "empty" trigger_push
r5817 | mand1nga | 2009-02-10 01:38:00 +0100 (Tue, 10 Feb 2009) | 1 line
fixed msg when changing nick (courtesy of Surb and/or -z-)
r5818 | div0 | 2009-02-10 07:05:56 +0100 (Tue, 10 Feb 2009) | 3 lines
irc_nick_alternates;
fix name change bug
r5819 | div0 | 2009-02-10 07:14:55 +0100 (Tue, 10 Feb 2009) | 2 lines
fix the last commit
r5820 | div0 | 2009-02-10 07:19:18 +0100 (Tue, 10 Feb 2009) | 2 lines
change hardcoded 30s to a irc_reconnect_delay var
r5821 | div0 | 2009-02-10 08:02:39 +0100 (Tue, 10 Feb 2009) | 2 lines
fix two bugs in reconnecting code
r5822 | div0 | 2009-02-10 08:30:29 +0100 (Tue, 10 Feb 2009) | 2 lines
handle "cannot send to channel" errors by reconnecting too
r5823 | div0 | 2009-02-10 09:16:12 +0100 (Tue, 10 Feb 2009) | 2 lines
slight improvement for csqc rendered projectiles: draw only for 0.02s in a fixed spot when they spawn
r5824 | div0 | 2009-02-10 10:21:47 +0100 (Tue, 10 Feb 2009) | 2 lines
change uzi secondary spread to 0.008 (equal to CR secondary). The bullet still is slower and weaker, so it fits.
r5825 | esteel | 2009-02-10 11:53:18 +0100 (Tue, 10 Feb 2009) | 1 line
updated basics.html with ballistic bullets and some minor fixes/changes
r5826 | div0 | 2009-02-10 13:24:56 +0100 (Tue, 10 Feb 2009) | 2 lines
fix inverse logic in projectile drawing
r5827 | div0 | 2009-02-10 21:37:08 +0100 (Tue, 10 Feb 2009) | 2 lines
new race record marker (for extracting the records from demos)
r5828 | div0 | 2009-02-10 21:56:46 +0100 (Tue, 10 Feb 2009) | 2 lines
fix a simple (but not related to the big bug) bug in CTF
r5829 | div0 | 2009-02-11 06:45:39 +0100 (Wed, 11 Feb 2009) | 7 lines
g_antilag_bullets:
Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - USE WITH EXTREME CARE (severely changes weapon balance), also disables bullet tracer effects
Stays 0 by default, for weapon balance.
Also, improved Uzi (less damage, less force, faster refire, higher DPS in the end) to work better without bullets antilag.
r5830 | div0 | 2009-02-11 07:02:47 +0100 (Wed, 11 Feb 2009) | 2 lines
add some debugging checks to finally find the reason of the write to a wrong entity
r5831 | div0 | 2009-02-11 08:41:22 +0100 (Wed, 11 Feb 2009) | 2 lines
cl_casings cvar
r5832 | div0 | 2009-02-11 09:10:12 +0100 (Wed, 11 Feb 2009) | 4 lines
showpressedkeys.
But... don't use a SLIDER for such a setting. Either make it radio buttons, or a single checkbox.
r5833 | div0 | 2009-02-11 10:44:23 +0100 (Wed, 11 Feb 2009) | 2 lines
fix a simple div by zero
r5834 | m0rfar | 2009-02-11 14:58:31 +0100 (Wed, 11 Feb 2009) | 2 lines
fixed a strange curve which caused armor shards to float
it also uses 12 less LM images for an unknown reason :P
r5835 | div0 | 2009-02-11 15:26:52 +0100 (Wed, 11 Feb 2009) | 2 lines
bullets with g_antilag_bullets now have some poor excuse of a trail. Warning, it crashes DP :P
r5836 | div0 | 2009-02-11 16:09:13 +0100 (Wed, 11 Feb 2009) | 2 lines
oops, remove the caverna shader line that was accidentally added
r5837 | div0 | 2009-02-11 16:32:12 +0100 (Wed, 11 Feb 2009) | 2 lines
add a somewhat working tr_bullet trail effect to make antilagged bullets visible
r5838 | div0 | 2009-02-11 17:50:03 +0100 (Wed, 11 Feb 2009) | 2 lines
avoid sending small trails
r5839 | div0 | 2009-02-11 21:25:09 +0100 (Wed, 11 Feb 2009) | 2 lines
avoid touching QC files when they don't change (works better with make)
r5840 | tzork | 2009-02-11 22:23:42 +0100 (Wed, 11 Feb 2009) | 1 line
remove g_balance_seeker_missile_activate_delay (csqc projectiles want constant or no updates)
r5841 | tzork | 2009-02-11 22:35:32 +0100 (Wed, 11 Feb 2009) | 4 lines
make TFL_DMG_HEADSHAKE work
make TFL_SHOOT_VOLLYALWAYS work
improve TFL_FIRECHECK_AFF
better prediction (still needs a better way system_aimprocs)
r5842 | tzork | 2009-02-11 22:41:19 +0100 (Wed, 11 Feb 2009) | 4 lines
Make all turrets use csqc projectiles
use TFL_DMG_HEADSHAKE for some units.
make flac turret somewhat functional (sponsored by uglyhakk inc)
r5843 | tzork | 2009-02-11 22:43:18 +0100 (Wed, 11 Feb 2009) | 1 line
Better defaults for turrets & ballistic bullet configs for machinegun and walker
r5844 | mand1nga | 2009-02-11 22:45:56 +0100 (Wed, 11 Feb 2009) | 6 lines
Bots: Evaluate the risks of picking up items or chasing players before rating them as potential goals
Pretty good avoidance of edges on space maps
Removal of goals leading to (dangerous) edges from the goal stack
Prioritize movements over attacks when bots are under water/slime/lava
Reverted scale for rating enemies on dm mode
r5845 | mand1nga | 2009-02-11 23:11:58 +0100 (Wed, 11 Feb 2009) | 2 lines
Extended previous tZork commit to weaponsHavoc and updated checksums
r5846 | div0 | 2009-02-11 23:21:22 +0100 (Wed, 11 Feb 2009) | 4 lines
bring Uzi back to old settings, make CR weaker, ballistic projectiles.
Please run a server with THESE settings, then set log_dest_udp to 141.2.16.23:26668 and sv_eventlog 1 , sv_eventlog_console 1 to record weapon stats.
r5847 | mand1nga | 2009-02-12 00:13:14 +0100 (Thu, 12 Feb 2009) | 1 line
Adjusted distances for bots weapon priorities
r5848 | mand1nga | 2009-02-12 00:18:32 +0100 (Thu, 12 Feb 2009) | 1 line
Updated background menu images for SVN and 2.5 by [-z-]. Waiting for background_ingame.tga to be updated and the final .psd
r5849 | div0 | 2009-02-12 08:14:31 +0100 (Thu, 12 Feb 2009) | 2 lines
turn off autotaunts by default; make sure the checkbox will set them to 0.65 if they were off.
r5850 | div0 | 2009-02-12 08:30:34 +0100 (Thu, 12 Feb 2009) | 2 lines
hopefully fix score display in LMS
r5851 | div0 | 2009-02-12 08:52:45 +0100 (Thu, 12 Feb 2009) | 2 lines
better default column layouts
r5852 | div0 | 2009-02-12 08:55:07 +0100 (Thu, 12 Feb 2009) | 2 lines
get rid of some columns in LMS
r5853 | div0 | 2009-02-12 09:03:40 +0100 (Thu, 12 Feb 2009) | 2 lines
fix "cannot be executed" message on sbar_columns_set command
r5854 | div0 | 2009-02-12 09:10:53 +0100 (Thu, 12 Feb 2009) | 2 lines
use a box for the flag again - the model is badly misaligned
r5855 | div0 | 2009-02-12 09:13:21 +0100 (Thu, 12 Feb 2009) | 2 lines
argh, last fix was bad. this one is good.
r5856 | div0 | 2009-02-12 11:20:51 +0100 (Thu, 12 Feb 2009) | 2 lines
remove most naggers in intermission
r5857 | div0 | 2009-02-12 11:48:32 +0100 (Thu, 12 Feb 2009) | 2 lines
make it possible to spectate in LMS (but spectators can't go back into the game)
r5858 | esteel | 2009-02-12 12:06:06 +0100 (Thu, 12 Feb 2009) | 1 line
bullets are hitscan again, change basics.html to reflect that and some more fixes and improvements
r5859 | div0 | 2009-02-12 12:23:08 +0100 (Thu, 12 Feb 2009) | 2 lines
SP_LMS_RANK) // allow writing to this field in intermission as it is needed for newly joining players
r5860 | esteel | 2009-02-12 16:21:04 +0100 (Thu, 12 Feb 2009) | 1 line
small typo
r5861 | div0 | 2009-02-12 16:41:36 +0100 (Thu, 12 Feb 2009) | 2 lines
make the bullet trail more visible, and also use less particles for it
r5862 | mand1nga | 2009-02-13 04:09:16 +0100 (Fri, 13 Feb 2009) | 4 lines
Bots: Avoid getting stuck against a wall, remove goals leading to it.
Fixed compilation order of bot sources
Removed rocketlauncher from "close" weapon priority list because it means suicide :)
r5863 | mand1nga | 2009-02-13 04:26:50 +0100 (Fri, 13 Feb 2009) | 2 lines
Bots: Set better values for facing-wall detection cvars
r5864 | esteel | 2009-02-13 13:22:35 +0100 (Fri, 13 Feb 2009) | 2 lines
added the cl_showpressed keys graphics to build-compat-pack.sh and fixed a few indentions
r5865 | div0 | 2009-02-13 17:37:17 +0100 (Fri, 13 Feb 2009) | 2 lines
fix distribution
r5866 | div0 | 2009-02-13 18:29:31 +0100 (Fri, 13 Feb 2009) | 2 lines
support glitchy shader files in parsing
r5867 | div0 | 2009-02-13 18:51:26 +0100 (Fri, 13 Feb 2009) | 2 lines
allow more glitchy shader files (matches DP)
r5868 | div0 | 2009-02-13 18:58:58 +0100 (Fri, 13 Feb 2009) | 2 lines
allow even more moronic .shader files
r5869 | div0 | 2009-02-13 19:17:52 +0100 (Fri, 13 Feb 2009) | 2 lines
compensate for more glitches
r5870 | div0 | 2009-02-13 19:18:08 +0100 (Fri, 13 Feb 2009) | 2 lines
oops
r5871 | div0 | 2009-02-13 19:46:12 +0100 (Fri, 13 Feb 2009) | 2 lines
try to make this shader parsing match DP's exactly
r5872 | div0 | 2009-02-13 20:22:49 +0100 (Fri, 13 Feb 2009) | 2 lines
hopefully fix ready restart after countdown
r5873 | mand1nga | 2009-02-13 21:38:16 +0100 (Fri, 13 Feb 2009) | 2 lines
Bots: Removed bot_ai_facingwall_timeout as its not worth to have it. Some other minor fixes.
r5874 | div0 | 2009-02-13 21:53:02 +0100 (Fri, 13 Feb 2009) | 2 lines
decal fixes
r5875 | esteel | 2009-02-15 10:52:18 +0100 (Sun, 15 Feb 2009) | 1 line
make g_tourney 1 allow spectator chat during warmup
r5876 | div0 | 2009-02-15 21:24:57 +0100 (Sun, 15 Feb 2009) | 3 lines
weaken Mortar and Hagar a little, we'll test this later.
Hope this fixes the relative weapon balance of the explosives (RL should be > Mortar and Hagar, you know)
r5877 | lordhavoc | 2009-02-15 21:30:59 +0100 (Sun, 15 Feb 2009) | 2 lines
use Q3 skin syntax, not the stupid DP-specific one
r5878 | div0 | 2009-02-16 18:13:59 +0100 (Mon, 16 Feb 2009) | 2 lines
properly expire centerprints when scr_centertime <= 0
r5879 | m0rfar | 2009-02-16 21:44:47 +0100 (Mon, 16 Feb 2009) | 2 lines
* flipped TAG weapon icon
* made rocket projectile smaller (scale 2) and made the trail less black
r5880 | m0rfar | 2009-02-16 22:18:02 +0100 (Mon, 16 Feb 2009) | 1 line
[ 2605358 ] desertfactory : few items tweak by Ronan
r5881 | div0 | 2009-02-17 10:29:03 +0100 (Tue, 17 Feb 2009) | 2 lines
DP_QC_GETTAGINFO_BONEPROPERTIES
r5882 | div0 | 2009-02-17 10:30:53 +0100 (Tue, 17 Feb 2009) | 2 lines
merge extensions.qh
r5883 | div0 | 2009-02-17 12:50:53 +0100 (Tue, 17 Feb 2009) | 2 lines
use $PATH
r5884 | div0 | 2009-02-17 13:39:23 +0100 (Tue, 17 Feb 2009) | 2 lines
allow to temporarily hide the shot origin editor
r5885 | div0 | 2009-02-17 15:46:38 +0100 (Tue, 17 Feb 2009) | 2 lines
fix projectile delaying
r5886 | div0 | 2009-02-17 15:46:54 +0100 (Tue, 17 Feb 2009) | 2 lines
make use of EF_TELEPORT_BIT for weapon animation
r5887 | div0 | 2009-02-17 15:47:16 +0100 (Tue, 17 Feb 2009) | 2 lines
remove the debug projectile on electro
r5888 | div0 | 2009-02-17 16:05:18 +0100 (Tue, 17 Feb 2009) | 3 lines
fix some animtimes... should be no gameplay change
r5889 | esteel | 2009-02-17 17:41:11 +0100 (Tue, 17 Feb 2009) | 2 lines
explain cl_weaponpriorityX cvars
r5890 | div0 | 2009-02-17 20:28:38 +0100 (Tue, 17 Feb 2009) | 2 lines
fix centerprint bug
r5891 | esteel | 2009-02-18 15:09:58 +0100 (Wed, 18 Feb 2009) | 2 lines
end some % say-escapes with ^7 to make sure the text afterwards is white
r5892 | esteel | 2009-02-18 16:45:23 +0100 (Wed, 18 Feb 2009) | 2 lines
small typo fixed
r5893 | div0 | 2009-02-19 07:02:10 +0100 (Thu, 19 Feb 2009) | 2 lines
theora and ogg dlls as found by terencehill (please test these, and remove the old ones)
r5894 | mand1nga | 2009-02-19 15:45:28 +0100 (Thu, 19 Feb 2009) | 6 lines
Commited timelimit_overtime patch by GreEn`mArine
Tracker Id: 2614179
Now overtime means overtime :)
Added cvars timelimit_overtime 2, timelimit_overtimes 0, timelimit_suddendeath 5
Warning: cvar timelimit_maxovertime was removed
r5895 | esteel | 2009-02-19 18:24:04 +0100 (Thu, 19 Feb 2009) | 1 line
unready feature.. needs more testing though
r5896 | esteel | 2009-02-19 18:28:58 +0100 (Thu, 19 Feb 2009) | 2 lines
heh, didn't i say it needs more testing? sorry
r5897 | esteel | 2009-02-19 18:37:32 +0100 (Thu, 19 Feb 2009) | 1 line
obey fteqcc
r5898 | mand1nga | 2009-02-19 19:28:35 +0100 (Thu, 19 Feb 2009) | 2 lines
Updated menu backgrounds by [-z-]
r5899 | esteel | 2009-02-19 20:43:00 +0100 (Thu, 19 Feb 2009) | 1 line
fixed typo in ready code
r5900 | esteel | 2009-02-19 22:04:19 +0100 (Thu, 19 Feb 2009) | 2 lines
show the WelcomeMessage only on join for welcome_message_time seconds or when +show_info if pressed because many people did not know you can make this msg disappear with +zoom.\
add a line telling specs and observers about +show_info in the upper right
r5901 | esteel | 2009-02-19 22:54:35 +0100 (Thu, 19 Feb 2009) | 1 line
make ready toggle the readystate and remove the unready command, people seem to like this more
r5902 | div0 | 2009-02-20 08:07:56 +0100 (Fri, 20 Feb 2009) | 2 lines
set some x bits
r5903 | esteel | 2009-02-20 09:30:03 +0100 (Fri, 20 Feb 2009) | 2 lines
set another x bit\
moved files from misc/tools/ObjToMap/objtomap to misc/tools/ObjToMap .. no reason to have that extra dir or is there?!?
r5904 | esteel | 2009-02-20 09:54:30 +0100 (Fri, 20 Feb 2009) | 1 line
gnah, java.. how could i forget
r5905 | div0 | 2009-02-20 10:15:44 +0100 (Fri, 20 Feb 2009) | 2 lines
turn some errors into warnings with error recovery so we can release
r5906 | div0 | 2009-02-20 10:24:29 +0100 (Fri, 20 Feb 2009) | 2 lines
disable the voice messages that still lack content (re-enable them if tenshihan makes them); looks like we can't announce the player sounds as a feature for 2.5
r5907 | div0 | 2009-02-20 10:29:44 +0100 (Fri, 20 Feb 2009) | 2 lines
update changes list
r5908 | div0 | 2009-02-20 10:30:29 +0100 (Fri, 20 Feb 2009) | 2 lines
fix rev no
r5909 | esteel | 2009-02-20 11:10:37 +0100 (Fri, 20 Feb 2009) | 1 line
sync changes-since-last-release with the devwiki improvements
r5910 | div0 | 2009-02-20 13:59:34 +0100 (Fri, 20 Feb 2009) | 2 lines
angles "un-holding" fixed

Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/.patchsets	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-5809
+revisions_applied = 1-5910

Modified: branches/nexuiz-2.0/Docs/basics.html
===================================================================
--- branches/nexuiz-2.0/Docs/basics.html	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/Docs/basics.html	2009-02-20 14:23:51 UTC (rev 5912)
@@ -107,8 +107,8 @@
 <!-- Start SectLevel2 -->
 <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) :).
+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 explanation 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 beside your name is your team color.  Try to only hit the OTHER team(s) :).
 </p>
 <!--End Section 2-->
 <h3><a name="''Hitting Your Opponent''" id="''Hitting Your Opponent''"><em>Hitting Your Opponent</em></a></h3>
@@ -116,27 +116,24 @@
 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>
 <p class="Body">
-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.
+When you use direct-hit (hitscan) weapons like the shotgun, machinegun, campingrifle and the 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.
 </p>
 <p class="Body">
-In addition to using geometry to your advantage, when you're moving relative to your opponent it is sometimes easier to <em>not</em> 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.
+In addition to using geometry to your advantage, when you're moving relative to your opponent it is sometimes easier to <em>not</em> aim with the mouse, but rather to leave it steady at the right height, and use the strafe buttons to move yourself and thus 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.
 </p>
 <p class="Body">
-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.
+Using projectile weapons such as the mortar, electro, hagar or rocket launcher 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.  Just note how off your hit was and try to adjust next time.  It takes a few matches to get the hang of this.  Also consider that almost all projectiles will explode when they hit something hard, and those explosions will also cause damage to players nearby (splash damage).  Now thats the part that makes projectile weapons easier to use.  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.
 </p>
 <p class="Body">
 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.
 </p>
-<p class="Body">
-A special feature in Nexuiz is that walls do not block explosions, so you can't hide behind them.  Similarly, if you know that someone is on the floor above you, shoot at the ceiling, and with a little luck the explosion might hurt him.  This <em>can</em> be changed by a server admin, but the default allows for more fun; and it's also nice to see how good people are at guessing where their opponents are.
-</p>
 <!--End Section 2-->
 <h3><a name="''Controlling The Map''" id="''Controlling The Map''"><em>Controlling The Map</em></a></h3>
 <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>
 <p class="Body">
-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 <em>re</em>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.
+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 <em>re</em>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 helps staying alive but is usually not enough to restore you to useful battle ready levels again - you have to wait a while to regain your full health, and so picking up health after a fight is still important.
 </p>
 <p class="Body">
 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.
@@ -147,67 +144,70 @@
 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>
 <p class="Body">
-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.  You can bind these weapons to a key at the <em>settings/input</em> menu or in the console using the command <em>bind key &quot;impulse <strong>n</strong>&quot;</em>, where n is the number of the weapon, below.
+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.  You can bind these weapons to a key at the <em>settings/input</em> menu or in the console using the command <em>bind key &quot;impulse <strong>n</strong>&quot;</em>, where n is the number of the weapon.
 </p>
 <ul>
-<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>
+<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.  For example if you just run forwards, look down and press fire it will catapult you forward with great speed.  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 and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.</li>
+<li>The grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.  There is also a mutator that adds a off-hand hook which can be used all the time, uses no ammo but only does the pulling part.</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 portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.</li>
+<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 players and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.</li>
 </ul>
 <ul>
-<li>The shotgun is very similar to that of other games.  It shoots several hitscan pellets with a high spread, so it does very high damage at close range, but becomes very inaccurate at distance.  It is also very useful to knock opponents out after you already hit them hard with a rocket or other projectile, and subsequently closed to a distance where these are no longer as useful, because it's hard to miss with at close range.  The primary fire mode fires once with a short reload, while the secondary fire mode shoots three very quick shots, but with a long reload afterwards.  Starting with Nexuiz 2.3 the secondary firemode will also have a higher spread so the primary is useful for a longer distance then the secondary firemode.  The shotgun uses pellet ammo which is not shared with any other weapons.</li>
+<li>The shotgun is very similar to that of other games.  It shoots several bullets 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 because it's hard to miss with the shotgun 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.  The secondary firemode also has 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 just as the camping rifle.</li>
+<li>The machinegun is also quite self-explanatory.  It shoots bullets 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 most other weapons.  It is therefore devastating when used at close quarters.  One of the machinegun's unique features is that the first bullet after pressing fire have less spread and does more damage than the rest - keep this in mind when using it.  The secondary fire mode is much slower, but its the same as the primary modes <em>first</em> bullets.  This firemode is therefore very useful as an improvised sniper weapon for mid 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 just as the camping rifle.</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 mode fires several of them at once.  This is only gun that has reduced spread when crouching!  Beware of your cell ammo (shared with electro, crylink and (minsta)nex), 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, TAG and the hagar.</li>
+<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, TAG and the hagar.</li>
 </ul>
 <ul>
-<li>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, hlac and the (minsta)nex.</li>
+<li>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 extra damage.  This combo is very effective in corridors and small rooms.  The electro uses cell ammo which is shared with the crylink, hlac and the (minsta)nex.</li>
 </ul>
 <ul>
-<li>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, HLAC and the (minsta)nex.</li>
+<li>The crylink is comparable to the shotgun but shoots slow plasma projectiles; so it's harder to aim but they also do more damage.  The primary fire mode shoots several bouncing projectiles at a high rate of fire and narrow spread.  Each bounce causes splash damage so try to hit the floor near someone for damage from both the splash and the bullets themself.  The secondary fire mode has a wider, horizontal spread and lower rate of fire.  This mode does not bounce but does more damage and is sometimes easier to aim.  The crylink uses cell ammo which is shared with the electro, HLAC and the (minsta)nex.</li>
 </ul>
 <ul>
 <li>The nex is a powerful sniper weapon.  Its primary fire mode fires a hitscan antimatter lance for significant damage, but requires a very precise aim, and has a relatively long reload time.  The secondary fire mode activates zoom.  The nex uses cell ammo which is shared with the hlac, crylink, minstanex and the electro.</li>
 </ul>
 <ul>
-<li>The minsta nex is the snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.</li>
+<li>The minsta nex is a snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.</li>
 </ul>
 <ul>
-<li>The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.</li>
+<li>The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  The primary mode is quite similar to the nex but fires a bullet.  The rate of fire is quite moderate.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  Its also the only gun that can do headshots, which cause extra damage so aim with care and this gun can out-perform the nex.  The machinegun uses the same bullet ammo as the camping rifle.</li>
 </ul>
 <ul>
 <li>The hagar can be compared to the plasma gun from Quake3.  It has a very high rate of fire, with moderate damage, and some splash damage.  The primary fire mode shoots small projectile missiles at high speed and an extraordinary rate of fire.  The secondary fire mode shoots the same missiles, but at a slower speed and rate of fire, and without the instant trigger.  This means that they will bounce once when hitting a floor or wall, giving you the opportunity to fire around corners, or double your chances to hit someone by spamming an area.  The hagar uses rocket ammo which is shared with the mortar, TAG and the rocket launcher.</li>
 </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, TAG and the hagar.</li>
+<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 flying rockets at once.  This means that you don't need to hit your opponent directly - just get the rocket <em>near</em> him, and use the secondary fire to cause splash damage which will badly hurt him.  The rocket launcher uses rocket ammo which is shared with the mortar, TAG and the hagar.</li>
 </ul>
 <ul>
-<li>The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.</li>
+<li>The T.A.G. seeker is a unique weapon system.  The primary fire mode launches a small tagging device.  <em>If</em> it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming (tag-)rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.</li>
 </ul>
 <p class="Body">
-Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
+Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him which his own weapon!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode before they hit you by setting them off.
 Also note that some objects are affected / pushed by explosion like the keys in Keyhunt or the flags in Capture the Flag.
 </p>
+<p class="Body">
+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.  Furthermore bullets are ballistic, which means they are affected by gravity much like real bullets and can also pierce walls and enemies like real bullets.  That enables you to hit several enemies or enemies behind walls/floors up to a certain thickness.
+</p>
 <!--End Section 2-->
 <h3><a name="''Using Jumping Effectively''" id="''Using Jumping Effectively''"><em>Using Jumping Effectively</em></a></h3>
 <p class="Body">
 You will need to be able to get around the map quickly and efficiently if you are to hunt down your opponents, and collect items well.  As already mentioned, the laser is useful for jumping and gaining speed - but you can use all explosive weapons for a similar effect.  Other weapons, however, will cause (much) more damage to your health, and not all offer the same strong push as the laser.  The rocket launcher will push you twice as far, but you will also take <em>lots</em> more damage.  The mortar has the same push as the laser, but its explosion is bigger so the timing and the right angle are less of an issue.  For this reason, the mortar is better for a beginner to learn these sorts of jumps.
 </p>
 <p class="Body">
-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.
+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 of time you touch the floor is considerably less, and so the friction does not slow you down as much.  The longer or rather more often 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 he lands, 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 and its complicated to learn.
 </p>
 <p class="Body">
-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.
+Another useful thing to know about movement is that if you are flying/jumping, 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.  After getting used to this you can get around maps very fast and maintain a high speed.
 </p>
 <p class="Body">
 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>).

Modified: branches/nexuiz-2.0/Docs/htmlfiles/basics.aft
===================================================================
--- branches/nexuiz-2.0/Docs/htmlfiles/basics.aft	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/Docs/htmlfiles/basics.aft	2009-02-20 14:23:51 UTC (rev 5912)
@@ -33,73 +33,73 @@
 *_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) :).
+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 explanation 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 beside 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.
+When you use direct-hit (hitscan) weapons like the shotgun, machinegun, campingrifle and the 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.
+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 yourself and thus 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.
+Using projectile weapons such as the mortar, electro, hagar or rocket launcher 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.  Just note how off your hit was and try to adjust next time.  It takes a few matches to get the hang of this.  Also consider that almost all projectiles will explode when they hit something hard, and those explosions will also cause damage to players nearby (splash damage).  Now thats the part that makes projectile weapons easier to use.  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.
+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 helps staying alive but is usually not enough to restore you to useful battle ready 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.  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.
+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.  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.
 
-	*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 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.  For example if you just run forwards, look down and press fire it will catapult you forward with great speed.  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 grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.
+	*The grappling hook is an other movement tool.  The primary mode attaches itself to all sorts of solid objects and will pull you there to move through the map like spider man.  You can get very fast that way or reach spots you would not get to by other means.  The secondary firemode drops a small gravity bomb that will affect enemy players and also releases a lot of smoke which will make you harder to see and hit.  The gravity bomb uses cell ammo.  There is also a mutator that adds a off-hand hook which can be used all the time, uses no ammo but only does the pulling part.
 
-	*The port-o-launch is the perfection of movement.  The grenade it launches creates two portals.  On first impact it creates the entrace portal, on secondary impact the exit portal.  If you enter the first one you (or others and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.
+	*The 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 players and also projectiles!!) will be teleported to the secondary portal.  As the first portal will teleport everything it can't be hit but the second portal is quite fragile and thanks to the used wormhole technology will take the other portal along if it lost too much energy.  The wormhole is also the reason why the portals energy decays after some time.  You can replenish the energy by simply teleporting something thru it.
 
-	*The shotgun is very similar to that of other games.  It shoots several hitscan pellets with a high spread, so it does very high damage at close range, but becomes very inaccurate at distance.  It is also very useful to knock opponents out after you already hit them hard with a rocket or other projectile, and subsequently closed to a distance where these are no longer as useful, because it's hard to miss with at close range.  The primary fire mode fires once with a short reload, while the secondary fire mode shoots three very quick shots, but with a long reload afterwards.  Starting with Nexuiz 2.3 the secondary firemode will also have a higher spread so the primary is useful for a longer distance then the secondary firemode.  The shotgun uses pellet ammo which is not shared with any other weapons.
+	*The shotgun is very similar to that of other games.  It shoots several bullets 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 because it's hard to miss with the shotgun 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.  The secondary firemode also has 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 just as the camping rifle.
+	*The machinegun is also quite self-explanatory.  It shoots bullets 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 most other weapons.  It is therefore devastating when used at close quarters.  One of the machinegun's unique features is that the first bullet after pressing fire have less spread and does more damage than the rest - keep this in mind when using it.  The secondary fire mode is much slower, but its the same as the primary modes ''first'' bullets.  This firemode is therefore very useful as an improvised sniper weapon for mid 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 just as the camping rifle.
 
 	*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 mode fires several of them at once.  This is only gun that has reduced spread when crouching!  Beware of your cell ammo (shared with electro, crylink and (minsta)nex), this baby eats it like crazy.
 
-	*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, TAG and the hagar.
+	*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, TAG 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, hlac and the (minsta)nex.
+	*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 extra damage.  This combo is very effective in corridors and small rooms.  The electro uses cell ammo which is shared with the crylink, hlac and the (minsta)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, HLAC and the (minsta)nex.
+	*The crylink is comparable to the shotgun but shoots slow plasma projectiles; so it's harder to aim but they also do more damage.  The primary fire mode shoots several bouncing projectiles at a high rate of fire and narrow spread.  Each bounce causes splash damage so try to hit the floor near someone for damage from both the splash and the bullets themself.  The secondary fire mode has a wider, horizontal spread and lower rate of fire.  This mode does not bounce but does more damage and is sometimes easier to aim.  The crylink uses cell ammo which is shared with the electro, HLAC and the (minsta)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 hlac, crylink, minstanex and the electro.
 
-	*The minsta nex is the snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.
+	*The minsta nex is a snipers wet dream.  Similar to the nex but MUCH more powerful.  One hit, one kill, no kidding!  The secondary firemode is identical to the lasers primary shot.  Back in the glory days this gun was used solely in Minstagib to train steady aim and fast movement, now this gun can spread fear in every gamemode.  Cell ammo is also used by nex, crylink, hlac and electro.
 
-	*The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  It fires fast, medium-to-high damage, wall piercing projectiles and is fed with bullets ammo.  The primary mode feels very much like a standard sniper rifle and is harder to use than the nex due to the projectile ballistics.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  The machinegun uses the same bullet ammo as the camping rifle.
+	*The camping rifle is a kind of mixture of a sniper rifle and an assault gun.  The primary mode is quite similar to the nex but fires a bullet.  The rate of fire is quite moderate.  The secondary mode can be used to empty the whole magazine of bullets in an quick burst.  This firemode is less wall piercing and has some spread to it but is deadly at mid-to-close range.  The magazine is reloaded automatically if you equip the rifle.  Its also the only gun that can do headshots, which cause extra damage so aim with care and this gun can out-perform the nex.  The machinegun uses the same bullet ammo as the camping rifle.
 
 	*The hagar can be compared to the plasma gun from Quake3.  It has a very high rate of fire, with moderate damage, and some splash damage.  The primary fire mode shoots small projectile missiles at high speed and an extraordinary rate of fire.  The secondary fire mode shoots the same missiles, but at a slower speed and rate of fire, and without the instant trigger.  This means that they will bounce once when hitting a floor or wall, giving you the opportunity to fire around corners, or double your chances to hit someone by spamming an area.  The hagar uses rocket ammo which is shared with the mortar, TAG and the rocket launcher.
 
-	*The rocket launcher is a little different from that of other games, in that the rockets move relatively slowly.  The primary fire mode shoots a slow-moving, high-damage rocket projectile at a medium rate of fire.  The secondary fire mode will explode all your rockets at once.  This means that you don't need to hit your opponent directly - just get the rocket ''near'' him, and use the secondary fire to cause splash damage which will badly hurt him.  The rocket launcher uses rocket ammo which is shared with the mortar, TAG and the hagar.
+	*The 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 flying rockets at once.  This means that you don't need to hit your opponent directly - just get the rocket ''near'' him, and use the secondary fire to cause splash damage which will badly hurt him.  The rocket launcher uses rocket ammo which is shared with the mortar, TAG and the hagar.
 
-	*The T.A.G. seeker is a unique weapon system.  The primary fire mode launcher a small tagging device.  If it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming tag-rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.
+	*The T.A.G. seeker is a unique weapon system.  The primary fire mode launches a small tagging device.  ''If'' it hits someone it will automatically release several target seeking rockets that will follow the tagged target for quite a while.  Its fun watching them run!  The secondary firemode launches small rockets that explode after a few meters and thus create a sort of explosion shield that will severely damage everyone in its radius and also stops incoming (tag-)rockets.  Rocket ammo is shared with the mortar, hagar and rocketlauncher.
 
-Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode by setting them off.
+Now that you know all the guns you also have to understand that in Nexuiz each projectile can be set off by explosions.  So its possible to blow up the rocket an opponent is shooting at you.  A good strategy against someone with a rocketlauncher is to spam him with the hagar.  Chances are high you make his own rocket explode shortly after he launched it and hurt him which his own weapon!  This is also the primary way to make sure the T.A.G. seekers rockets do not hit you!  Make them explode before they hit you by setting them off.
 Also note that some objects are affected / pushed by explosion like the keys in Keyhunt or the flags in Capture the Flag.
 
+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.  Furthermore bullets are ballistic, which means they are affected by gravity much like real bullets and can also pierce walls and enemies like real bullets.  That enables you to hit several enemies or enemies behind walls/floors up to a certain thickness.
+
 **''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 (much) more damage to your health, and not all offer the same strong push as the laser.  The rocket launcher will push you twice as far, but you will also take ''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.
+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 of time you touch the floor is considerably less, and so the friction does not slow you down as much.  The longer or rather more often 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 he lands, 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 and its complicated to learn.
 
-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.
+Another useful thing to know about movement is that if you are flying/jumping, 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.  After getting used to this you can get around maps very fast and maintain a high speed.
 
 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).
 

Modified: branches/nexuiz-2.0/changes-since-last-release
===================================================================
--- branches/nexuiz-2.0/changes-since-last-release	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/changes-since-last-release	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,10 +1,11 @@
-CHANGES since 2.4.2 to r5703:
+CHANGES since 2.4.2 to r5904:
 compat-q3a: switch crylink/hagar, as crylink is closer to BFG and hagar is closer to Plasmagun
-game: airshot announcer
-game: all projectiles are clientside now, massive bandwidth reduction
+game: airshot announcer for midair hits with the mortar
+game: all projectiles and their effects are clientside now, massive bandwidth reduction
 game: alternate HUD is now default
 game: antilag improved
 game: assault bugfixed
+game: ballistics for bullets (but antilagged by default), that is all bullet guns (shotgun, machinegun, campingrifle) are affected by gravity and can pierce walls and players up to a certain thickness depending on gun)
 game: bots try to not take items near team mates
 game: cl_gentle, clientside gib replacement for general audiences
 game: cmd maplist improved
@@ -17,30 +18,30 @@
 game: command records
 game: command vlogin must be used instead of vdo login now
 game: command weapbest
-game: crosshairs added
-game: crylink bounce does half damage
-game: crylink primary does 2 cells
-game: crylink weakened
+game: more crosshairs added
+game: crylink tweaked (bounce does half damage, damage lowered, primary consumes 2 cells)
 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 scoring now uses flags, not frags
+game: ctf scoring now uses flags, not frags (added several scoring options and configs)
 game: custom weapon priorities for bots
-game: cvar cl_weaponpriority* (custom weapon orders)
-game: cvar cl_weaponpriority_useforcycling
+game: cvar cl_casings
+game: cvar cl_showpressedkeys
+game: cvar cl_weaponpriority* (up to 10 custom weapon orders can be bound to a key)
+game: cvar cl_weaponpriority_useforcycling (uses the menu set weapon priority for the normal next/prev commands)
 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_ballistics_force, makes MG and SG projectiles
+game: cvar g_balance_electro_combo_speed (secondary balls explode delayed, in a kind of chain reaction)
+game: better visual hint for unbalanced teams
 game: cvar g_bloodloss - a new pointless mutator ;)
 game: cvar g_bugrigs*
 game: cvar g_ctf_allow_drop
 game: cvar g_ctf_fullbrightflags
 game: cvar g_ctf_ignore_frags
-game: cvar g_instagib REMOVED (no demand)
+game: cvar g_instagib REMOVED (use arena mutator with minstanex)
 game: cvar g_jump_grunt
-game: cvar g_maxplayers
+game: cvar g_maxplayers (allows to create spectator slots)
 game: cvar g_pickup_respawntime*
-game: cvar g_showweaponspawns
+game: cvar g_pinata
+game: cvar g_showweaponspawns (shows the location of guns on the maps if trying to switch to a gun that is not carried)
 game: cvar g_spawn_furthest
 game: cvar g_spawnpoints_auto_move_out_of_solid
 game: cvar g_spawnshield_time automatically disables itself when shooting
@@ -55,6 +56,7 @@
 game: cvar sv_ready_restart_nag
 game: cvar sv_ready_restart_repeatable
 game: cvar teamplay_lockonrestart
+game: cvar timelimit_overtime, timelimit_overtimes, timelimit_suddendeath (timelimit_maxovertime removed)
 game: fix flag falling through bunker
 game: fix q3skoredm1
 game: fix some memory leaks
@@ -65,41 +67,46 @@
 game: hook can pull players (but detaches when that player shoots you)
 game: hook detaches when teleporting
 game: hook is no longer "seta"
-game: hook jitter-less
+game: hook jitter-less (full client side drawing)
 game: hook sky-attach bug fixed
-game: hook takes ammo
+game: hook weapon consumes cell ammo
 game: improved bot ai: teamworking, items rating and weapon combos
-game: improved weapon system, new weapons Port-O-Launch, MinstaNex, On-hand hook, TAG Seeker, HLAC; now up to 24 weapons supported
-game: IP ban syncing support
+game: improved weapon system, new weapons Port-O-Launch, MinstaNex, On-hand hook, TAG Seeker, HLAC, Camping Rifle; now up to 24 weapons supported
+game: headshot announcer for the camping rifle
+game: IP ban syncing support (servers can share a ban list, can be used as a kind of global IP ban system)
 game: item respawn: 20s for 50health and 25armor
 game: kick banned players also when they try to talk
-game: lemmings countdown ;)
+game: lemmings countdown ('kill' and switching teams is no longer instant)
 game: log can get :time: events
-game: map voting: nodetail 1 as default
-game: map voting: with previews
+game: map voting: nodetail 1 as default (does not show what others voted for)
+game: map voting: map preview images to help identify the maps
 game: more different death types
 game: new music track by meoblast001 (TODO nexuiz-credits.txt)
-game: new particles
+game: new particle effects
 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: race game type (see Docs/basics.html for more details)
+game: ready now toggles the ready state
 game: rocket launcher detonation fixed when button was pressed only for a very short time
-game: scoreboard improved
+game: scoreboard much improved
 game: scores per-team
+game: show the WelcomeMessage only on join for welcome_message_time seconds or when +show_info is pressed because many people did not know you can make this msg disappear with +zoom. add a line telling specs and observers about +show_info in the upper right
 game: sounds: model specific player sounds
-game: strength and shield have better performance now
+game: carrying strength and shield has less of a performance impact now
 game: sv_foginterval
-game: teamkill and typekill complaints
+game: teamkill and typekill complaints and sounds
 game: team radar (sv_cmd bbox, sv_cmd radarmap commands to create/debug it!)
 game: texturecompression for lightmaps off (workaround for OS X bug)
-game: timeout feature
+game: timeout/in feature
 game: turrets
 game: vote call is now possible for server admins too
 game: weapons rebalanced according to frag statistics
 game: zoom unlagged, detect zoom scripts (for spectating/demos)
+game: some voice command samples are used along with team messages
 map: aggressor supports keyhunt
-map: all maps recompiled, now with external lightmaps
+map: all maps recompiled, now with external lightmaps which look way better
+map: new maps accident, desertfactory, racetrack
 mapping: added egyptsoc textures
 mapping: allow mins/maxs specification for brush entities instead of models (as alternative)
 mapping: automatic shader generator script
@@ -138,9 +145,8 @@
 menu: input box margin now in chars, not percent
 menu: more settings
 menu: mouse fixed in -game pro (now havoc)
-menu: multicampaign
+menu: multicampaign is back
 menu: new playermodel previews (sev)
-menu: new skin "wickedz"
 menu: play button in map info
 menu: server favorites
 menu: server info
@@ -149,9 +155,11 @@
 menu: skin selector
 menuskins: HEIGHT_DIALOGBORDER
 menu: weapon priority dialog
-menu: wicked skins
+menu: wicked skins (7 different)
+menu: blueplastic skin
 misc: +exec benchmark.cfg
 misc: new color codes ^xRGB
+misc: capturing to ogg/theora video (cl_capturevideo_ogg; requires theora and vorbisenc dlls)
 models: new flag model
 models: specop now knows that she is female
 rcon2irc: disconnect fix

Modified: branches/nexuiz-2.0/data/build-compat-pack.sh
===================================================================
--- branches/nexuiz-2.0/data/build-compat-pack.sh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/build-compat-pack.sh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -20,6 +20,13 @@
 	gfx/inv_weapon13.tga
 	gfx/inv_weapon14.tga
 	gfx/inv_weapon9.tga
+	gfx/keys/key_backward.tga
+	gfx/keys/key_bg.tga
+	gfx/keys/key_crouch.tga
+	gfx/keys/key_forward.tga
+	gfx/keys/key_jump.tga
+	gfx/keys/key_left.tga
+	gfx/keys/key_right.tga
 	gfx/reslimed_mini.tga
 	gfx/runningman_1on1remix_mini.tga
 	gfx/runningmanctf_mini.tga
@@ -44,8 +51,8 @@
 	models/ctf/flags.md3
 	models/ctf/flags.md3_0.skin
 	models/ctf/flags.md3_1.skin
-    models/hlac_bullet.md3
-    models/hlac_bullet.tga
+	models/hlac_bullet.md3
+	models/hlac_bullet.tga
 	models/player/carni.zym.sounds
 	models/player/headhunter.zym.sounds
 	models/player/insurrectionist.zym.sounds
@@ -118,8 +125,8 @@
 	models/sprites/wpn-seeker_frame0.tga
 	models/sprites/wpn-shotgun_frame0.tga
 	models/sprites/wpn-uzi_frame0.tga
-    models/tagrocket.md3
-    models/tagrocket.tga
+	models/tagrocket.md3
+	models/tagrocket.tga
 	models/turrets/base-gib1.md3
 	models/turrets/base-gib2.md3
 	models/turrets/base-gib3.md3
@@ -156,23 +163,23 @@
 	models/turrets/walker_props.md3
 	models/turrets/walker_spawn.md3
 	models/weapons/g_campingrifle.md3
-    models/weapons/g_hlac.md3
+	models/weapons/g_hlac.md3
 	models/weapons/g_hookgun.md3
 	models/weapons/g_minstanex.md3
 	models/weapons/g_porto.md3
-    models/weapons/g_seeker.md3
+	models/weapons/g_seeker.md3
 	models/weapons/v_campingrifle.md3
-    models/weapons/v_hlac.md3
+	models/weapons/v_hlac.md3
 	models/weapons/v_hookgun.md3
 	models/weapons/v_minstanex.md3
 	models/weapons/v_porto.md3
-    models/weapons/v_seeker.md3
+	models/weapons/v_seeker.md3
 	models/weapons/w_campingrifle.zym
-    models/weapons/w_hlac.zym
+	models/weapons/w_hlac.zym
 	models/weapons/w_hookgun.zym
 	models/weapons/w_minstanex.zym
 	models/weapons/w_porto.zym
-    models/weapons/w_seeker.zym
+	models/weapons/w_seeker.zym
 	particles/particlefont.tga
 	scripts/eggandbacon.shader
 	scripts/egyptsoc.shader

Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -27,7 +27,7 @@
 seta g_configversion 0
 
 // default.cfg versioning (update using update-cvarcount.sh, run that every time after adding a new cvar)
-set cvar_check_default 9351678ef3ad9cea04f929f91bca7684
+set cvar_check_default 1e27a8f2f0ba60542af81e2272d39ad7
 
 // Nexuiz version (formatted for machines)
 // used to determine if a client version is compatible
@@ -226,7 +226,7 @@
 cl_autodemo_nameformat demos/%Y-%m-%d_%H-%M
 
 // taunts and voices
-seta cl_autotaunt 0.65
+seta cl_autotaunt 0
 seta cl_voice_directional 1	"0 = all voices are non-directional, 1 = all voices are directional, 2 = only taunts are directional"
 seta cl_voice_directional_taunt_attenuation 0.5
 
@@ -264,7 +264,7 @@
 set sv_vote_nospectators 0	"if set only players can call a vote (thus spectators and observers can't call a vote)"
 
 alias g_tourney "g_tourney_$1"
-alias g_tourney_1 "g_warmup 1; g_chat_nospectators 1; sv_vote_nospectators 1"
+alias g_tourney_1 "g_warmup 1; g_chat_nospectators 2; sv_vote_nospectators 1"
 alias g_tourney_0 "g_warmup 0; g_chat_nospectators 0; sv_vote_nospectators 0"
 
 set sv_timeout 0	"allows a player to call a timeout, this will pause the game for some time"
@@ -353,13 +353,14 @@
 set bot_ai_keyboard_treshold 0.57
 set bot_ai_aimskill_offset 1
 set bot_ai_aimskill_think 1
-set bot_ai_custom_weapon_priority_distances "200 1000"	"Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
+set bot_ai_custom_weapon_priority_distances "300 850"	"Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
 set bot_ai_custom_weapon_priority_far "11 7 15 14 4 5 8 13 6 1 3 9 2"	"Desired weapons for far distances ordered by priority"
 set bot_ai_custom_weapon_priority_mid "11 9 4 5 3 7 15 14 6 13 8 2 1"	"Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "11 3 9 13 14 8 6 4 2 5 7 15 1"	"Desired weapons for close distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "11 3 13 14 8 6 4 2 5 7 15 1"	"Desired weapons for close distances ordered by priority"
 set bot_ai_weapon_combo 1	"Enable bots to do weapon combos"
 set bot_ai_weapon_combo_threshold 0.3	"Try to make a combo N seconds after the last attack"
 set bot_ai_friends_aware_pickup_radius "500"	"Bots will not pickup items if a team mate is this distance near the item"
+set bot_ai_ignoregoal_timeout 3	"Ignore goals making bots to get stuck in front of a wall for N seconds"
 // Better don't touch these, there are hard to tweak!
 set bot_ai_aimskill_order_mix_1st 0.01
 set bot_ai_aimskill_order_mix_2nd 0.1
@@ -386,6 +387,7 @@
 locs_enable 0
 pausable 0
 set g_antilag 2	"AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
+set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
 set g_shootfromeye 0
 set g_shootfromcenter 0
 set g_pinata 0
@@ -476,8 +478,10 @@
 // honor g_respawn_mapsettings_delay and g_respawn_mapsettings_waves
 set g_respawn_mapsettings 1
 
-// maximum overtime
-seta timelimit_maxovertime 5
+// overtime
+seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
+seta timelimit_overtimes 0 "how many overtimes to add at max"
+seta timelimit_suddendeath 5 "number of minutes suddendeath mode lasts after all overtimes were added and still no winner was found"
 
 // common team values
 set g_tdm 0
@@ -686,6 +690,9 @@
 seta cl_gibs_velocity_scale 1 "gib throw velocity force scale"
 seta cl_gibs_velocity_random 1 "gib throw velocity randomness scale"
 seta cl_gibs_velocity_up 0 "extra z velocity for gibs"
+seta cl_casings 1 "enable or disable bullet casings"
+seta cl_casings_shell_time 30 "shell casing lifetime"
+seta cl_casings_bronze_time 10 "bullet casings lifetime"
 cl_stainmaps 0
 cl_particles_smoke 1
 r_glsl 1
@@ -1085,8 +1092,8 @@
 seta "userbind11_press" "say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here";  seta "userbind11_release" "";  seta "userbind11_description" "team: attacking, icon"
 seta "userbind12_press" "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p"; seta "userbind12_release" ""; seta "userbind12_description" "team: killed flag, icon"
 seta "userbind13_press" "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"; seta "userbind13_release" ""; seta "userbind13_description" "team: dropped flag, icon"
-seta "userbind14_press" "say_team dropped gun %w (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
-seta "userbind15_press" "say_team dropped flag/key %w (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
+seta "userbind14_press" "say_team dropped gun %w^7 (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
+seta "userbind15_press" "say_team dropped flag/key %w^7 (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
 seta "userbind16_press" "say :-) / nice one"; seta "userbind16_release" ""; seta "userbind16_description" "chat: nice one"
 seta "userbind17_press" "say good game"; seta "userbind17_release" ""; seta "userbind17_description" "chat: good game"
 seta "userbind18_press" "say hi / good luck and have fun"; seta "userbind18_release" ""; seta "userbind18_description" "chat: hi / good luck"
@@ -1245,19 +1252,16 @@
 // note: these cvars use weapon NUMBERS. Use the menu to edit this cvar, or look the numbers up in qcsrc/common/constants.qh.
 seta cl_weaponpriority "14 13 9 8 11 7 6 5 4 15 3 2 1 10 12" "default porto and hook as LOW priority, use the weapon key numbers otherwise"
 seta cl_weaponpriority_useforcycling 0
-// impulse 200, 210, 220:
-seta cl_weaponpriority0 "14 9 8 4"    "explosives    (RL Hagar Mortar)"
-// impulse 201, 211, 221:
-seta cl_weaponpriority1 "13 7 6 5 1"  "energy        (Nex Crylink Electro Laser)"
-seta cl_weaponpriority2 "15 11 7 3"   "hitscan exact (Nex MG)"
-seta cl_weaponpriority3 "15 11 7 3 2" "hitscan all   (Nex MG Shotgun)"
-seta cl_weaponpriority4 "13 8 6 5 2"  "spam          (Hagar Crylink Electro Shotgun)"
-seta cl_weaponpriority5 "1 12 10"     "for moving    (Laser Hook Port-O-Launch)"
-seta cl_weaponpriority6 ""
-seta cl_weaponpriority7 ""
-seta cl_weaponpriority8 ""
-// impulse 209, 219, 229:
-seta cl_weaponpriority9 ""
+seta cl_weaponpriority0 "14 9 8 4"    "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun.  Default value: explosives (RL Hagar Mortar)"
+seta cl_weaponpriority1 "13 7 6 5 1"  "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun.  Default value: energy (Nex Crylink Electro Laser)"
+seta cl_weaponpriority2 "15 11 7 3"   "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun.  Default value: hitscan exact (Nex MG)"
+seta cl_weaponpriority3 "15 11 7 3 2" "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun.  Default value: hitscan all (Nex MG Shotgun)"
+seta cl_weaponpriority4 "13 8 6 5 2"  "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun.  Default value: spam (Hagar Crylink Electro Shotgun)"
+seta cl_weaponpriority5 "1 12 10"     "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun.  Default value: for moving    (Laser Hook Port-O-Launch)"
+seta cl_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun."
+seta cl_weaponpriority7 "" "use impulse 207 for prev gun from this list, 217 for best gun, 227 for next gun."
+seta cl_weaponpriority8 "" "use impulse 208 for prev gun from this list, 218 for best gun, 228 for next gun."
+seta cl_weaponpriority9 "" "use impulse 209 for prev gun from this list, 219 for best gun, 229 for next gun."
 
 // NOTE: this only replaces weapons on the map
 // use g_start_weapon_* to also replace the on-startup weapons!
@@ -1287,7 +1291,7 @@
 seta cl_teamradar_scale 4096
 seta cl_teamradar_rotation 0	"rotation mode: you set what points up. 0 = player, 1 = west, 2 = south, 3 = east, 4 = north"
 seta cl_teamradar_size "128 128"
-seta cl_teamradar_position "0 0" "1 1 would be lower right corner, 0.5 0.5 the center (ARGH) :P"
+seta cl_teamradar_position "0 0" "1 0 would be upper right corner, 0.5 0.5 the center"
 seta cl_teamradar_zoommode 0	"zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out"
 alias cl_teamradar_rotate "toggle cl_teamradar_rotation 0 1 2 3 4"
 
@@ -1406,3 +1410,6 @@
 seta cl_gentle 0	"client side gentle mode (only replaces gibs)"
 
 seta sbar_increment_maptime 0 // set to 1 if you prefer an increasing timer
+
+seta cl_showpressedkeys	0	"Show which movement keys someone is pressing: 1 for spectating, 2 for always"
+set cl_showpressedkeys_position "1 0.8"	"1 0 would be upper right corner, 0.5 0.5 the center"

Modified: branches/nexuiz-2.0/data/effectinfo.txt
===================================================================
--- branches/nexuiz-2.0/data/effectinfo.txt	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/effectinfo.txt	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1921,7 +1921,7 @@
 effect TR_ROCKET
 trailspacing 5
 type alphastatic
-color 0x303030 0x000000
+color 0x000000 0x666666
 tex 0 8
 size 1 4
 bounce 1
@@ -3152,4 +3152,12 @@
 velocityjitter 256 256 256
 
 
-
+// bullet trail (somewhat like a tracer)
+effect tr_bullet
+trailspacing 128
+type spark
+color 0x800000 0xFF8020
+alpha 256 256 2560
+size 3 3
+stretchfactor 0.6
+velocitymultiplier 0.7

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

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

Copied: branches/nexuiz-2.0/data/gfx/keys (from rev 5910, trunk/data/gfx/keys)

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

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

Modified: branches/nexuiz-2.0/data/gfx/menu/wickedz/ingame_background.psd
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/maps/accident (from rev 5910, trunk/data/maps/accident)

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

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

Modified: branches/nexuiz-2.0/data/maps/desertfactory.map
===================================================================
--- branches/nexuiz-2.0/data/maps/desertfactory.map	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/maps/desertfactory.map	2009-02-20 14:23:51 UTC (rev 5912)
@@ -9048,9 +9048,9 @@
 // entity 107
 {
 "classname" "target_position"
-"origin" "656 400 896"
+"origin" "656 592 896"
 "targetname" "jump01"
-"angle" "-90"
+"angle" "90"
 }
 // entity 108
 {
@@ -9083,9 +9083,9 @@
 // entity 111
 {
 "classname" "target_position"
-"origin" "2048 2880 896"
+"origin" "1896 2880 896"
 "targetname" "jump02"
-"angle" "-90"
+"angle" "180"
 }
 // entity 112
 {
@@ -9111,7 +9111,7 @@
 // entity 114
 {
 "classname" "target_position"
-"origin" "1088 1568 896"
+"origin" "1088 1472 896"
 "targetname" "jump03"
 "angle" "-90"
 }
@@ -10512,331 +10512,235 @@
 }
 // entity 318
 {
-"classname" "weapon_nex"
-"origin" "1792 2336 320"
+"classname" "weapon_uzi"
+"origin" "896 3128 800"
 }
 // entity 319
 {
-"classname" "weapon_uzi"
-"origin" "704 3008 320"
+"classname" "weapon_grenadelauncher"
+"origin" "1248 368 784"
 }
 // entity 320
 {
-"classname" "weapon_hagar"
-"origin" "2208 2880 208"
-}
-// entity 321
-{
-"classname" "weapon_grenadelauncher"
-"origin" "1984 448 256"
-}
-// entity 322
-{
 "classname" "weapon_electro"
 "origin" "1440 1696 560"
 }
-// entity 323
+// entity 321
 {
 "classname" "item_armor_small"
 "origin" "1016 704 768"
 }
-// entity 324
+// entity 322
 {
 "classname" "item_armor_small"
 "origin" "696 704 768"
 }
-// entity 325
+// entity 323
 {
 "classname" "item_armor_small"
-"origin" "760 704 768"
+"origin" "856 704 768"
 }
-// entity 326
+// entity 324
 {
 "classname" "item_armor_small"
-"origin" "824 704 768"
-}
-// entity 327
-{
-"classname" "item_armor_small"
-"origin" "888 704 768"
-}
-// entity 328
-{
-"classname" "item_armor_small"
-"origin" "952 704 768"
-}
-// entity 329
-{
-"classname" "item_armor_small"
 "origin" "1480 704 768"
 }
-// entity 330
+// entity 325
 {
 "classname" "item_armor_small"
 "origin" "1800 704 768"
 }
-// entity 331
+// entity 326
 {
 "classname" "item_armor_small"
-"origin" "1608 704 768"
+"origin" "1640 704 768"
 }
-// entity 332
+// entity 327
 {
-"classname" "item_armor_small"
-"origin" "1544 704 768"
-}
-// entity 333
-{
-"classname" "item_armor_small"
-"origin" "1672 704 768"
-}
-// entity 334
-{
-"classname" "item_armor_small"
-"origin" "1736 704 768"
-}
-// entity 335
-{
 "classname" "item_armor_medium"
 "origin" "1792 2336 768"
 }
-// entity 336
+// entity 328
 {
 "classname" "item_health_small"
 "origin" "1792 2888 768"
 }
-// entity 337
+// entity 329
 {
 "classname" "item_health_small"
-"origin" "1792 2760 768"
+"origin" "1792 2728 768"
 }
-// entity 338
+// entity 330
 {
 "classname" "item_health_small"
-"origin" "1792 2632 768"
-}
-// entity 339
-{
-"classname" "item_health_small"
-"origin" "1792 2824 768"
-}
-// entity 340
-{
-"classname" "item_health_small"
-"origin" "1792 2696 768"
-}
-// entity 341
-{
-"classname" "item_health_small"
 "origin" "1792 2568 768"
 }
-// entity 342
+// entity 331
 {
 "classname" "item_health_small"
 "origin" "1792 2104 768"
 }
-// entity 343
+// entity 332
 {
 "classname" "item_health_small"
-"origin" "1792 1976 768"
+"origin" "1792 1944 768"
 }
-// entity 344
+// entity 333
 {
 "classname" "item_health_small"
-"origin" "1792 1848 768"
-}
-// entity 345
-{
-"classname" "item_health_small"
-"origin" "1792 2040 768"
-}
-// entity 346
-{
-"classname" "item_health_small"
-"origin" "1792 1912 768"
-}
-// entity 347
-{
-"classname" "item_health_small"
 "origin" "1792 1784 768"
 }
-// entity 348
+// entity 334
 {
 "classname" "item_health_mega"
 "origin" "448 3136 768"
 }
-// entity 349
+// entity 335
 {
 "classname" "item_armor_small"
 "origin" "352 1864 768"
 }
-// entity 350
+// entity 336
 {
 "classname" "item_armor_small"
 "origin" "352 1736 768"
 }
-// entity 351
+// entity 337
 {
 "classname" "item_armor_small"
-"origin" "352 1800 768"
-}
-// entity 352
-{
-"classname" "item_armor_small"
-"origin" "352 1672 768"
-}
-// entity 353
-{
-"classname" "item_armor_small"
 "origin" "352 1608 768"
 }
-// entity 354
+// entity 338
 {
 "classname" "item_armor_small"
 "origin" "352 2392 768"
 }
-// entity 355
+// entity 339
 {
 "classname" "item_armor_small"
-"origin" "352 2328 768"
-}
-// entity 356
-{
-"classname" "item_armor_small"
 "origin" "352 2520 768"
 }
-// entity 357
+// entity 340
 {
 "classname" "item_armor_small"
-"origin" "352 2456 768"
-}
-// entity 358
-{
-"classname" "item_armor_small"
 "origin" "352 2264 768"
 }
-// entity 359
+// entity 341
 {
 "classname" "item_health_medium"
 "origin" "352 2064 768"
 }
-// entity 360
+// entity 342
 {
 "classname" "item_health_medium"
 "origin" "1248 704 768"
 }
-// entity 361
+// entity 343
 {
 "classname" "info_player_deathmatch"
 "origin" "2032 704 792"
 "angle" "180"
 }
-// entity 362
+// entity 344
 {
 "classname" "info_player_deathmatch"
 "origin" "832 3344 792"
 "angle" "-90"
 }
-// entity 363
+// entity 345
 {
 "classname" "info_player_deathmatch"
 "origin" "248 1792 284"
 }
-// entity 364
+// entity 346
 {
 "classname" "info_player_deathmatch"
 "origin" "1152 1008 280"
 "angle" "-90"
 }
-// entity 365
+// entity 347
 {
 "classname" "info_player_deathmatch"
 "origin" "1792 1344 344"
 "angle" "90"
 }
-// entity 366
+// entity 348
 {
 "classname" "info_player_deathmatch"
-"origin" "2192 2336 792"
-"angle" "180"
+"origin" "1392 2336 792"
 }
-// entity 367
+// entity 349
 {
 "classname" "info_player_deathmatch"
 "origin" "2240 704 280"
 "angle" "180"
 }
-// entity 368
+// entity 350
 {
 "classname" "info_player_deathmatch"
 "origin" "1536 3296 344"
 "angle" "-90"
 }
-// entity 369
+// entity 351
 {
 "classname" "item_rockets"
 "origin" "320 3072 320"
 "angle" "-90"
 }
-// entity 370
+// entity 352
 {
 "classname" "item_rockets"
 "origin" "2176 1408 336"
 "angle" "180"
 }
-// entity 371
+// entity 353
 {
 "classname" "item_rockets"
 "origin" "960 256 272"
 "angle" "90"
 }
-// entity 372
+// entity 354
 {
 "classname" "item_cells"
-"origin" "2144 3040 224"
-}
-// entity 373
-{
-"classname" "item_cells"
 "origin" "1472 992 272"
 }
-// entity 374
+// entity 355
 {
 "classname" "item_cells"
 "origin" "768 1408 320"
 }
-// entity 375
+// entity 356
 {
 "classname" "item_cells"
 "origin" "816 1424 320"
 }
-// entity 376
+// entity 357
 {
 "classname" "item_bullets"
 "origin" "576 3200 320"
 }
-// entity 377
+// entity 358
 {
 "classname" "item_bullets"
 "origin" "1472 2624 336"
 }
-// entity 378
+// entity 359
 {
 "classname" "item_bullets"
 "origin" "896 3136 320"
 }
-// entity 379
+// entity 360
 {
 "classname" "item_shells"
 "origin" "1152 2800 320"
 "angle" "180"
 }
-// entity 380
+// entity 361
 {
 "classname" "item_shells"
 "origin" "1408 2448 336"
 }
-// entity 381
+// entity 362
 {
 "classname" "misc_model"
 "origin" "1632 400 256"
@@ -10844,35 +10748,35 @@
 "angle" "180"
 "spawnflags" "4"
 }
-// entity 382
+// entity 363
 {
 "classname" "misc_model"
 "origin" "864 1008 256"
 "model" "models/desertfactory/objects_metal/boiler01.ase"
 "spawnflags" "4"
 }
-// entity 383
+// entity 364
 {
 "classname" "misc_model"
 "origin" "1600 2752 320"
 "model" "models/desertfactory/objects_wood/newspaper01.ase"
 "angle" "-30"
 }
-// entity 384
+// entity 365
 {
 "classname" "misc_model"
 "origin" "288 1520 265"
 "model" "models/desertfactory/objects_wood/newspaper02.ase"
 "angle" "105"
 }
-// entity 385
+// entity 366
 {
 "classname" "misc_model"
 "origin" "1408 896 256"
 "model" "models/desertfactory/objects_wood/newspaper03.ase"
 "angle" "30"
 }
-// entity 386
+// entity 367
 {
 "classname" "misc_model"
 "origin" "1200 1856 256"
@@ -10880,42 +10784,42 @@
 "angle" "-180"
 "_castshadows" "0"
 }
-// entity 387
+// entity 368
 {
 "classname" "misc_model"
 "origin" "208 2336 256"
 "model" "models/desertfactory/structure_wood/vines01.ase"
 "_castshadows" "0"
 }
-// entity 388
+// entity 369
 {
 "classname" "misc_model"
 "origin" "704 2336 260"
 "model" "models/desertfactory/structure_stone/sand01.ase"
 "spawnflags" "4"
 }
-// entity 389
+// entity 370
 {
 "classname" "misc_model"
 "origin" "464 1248 256"
 "model" "models/desertfactory/structure_stone/sand02.ase"
 "spawnflags" "4"
 }
-// entity 390
+// entity 371
 {
 "classname" "misc_model"
 "origin" "2112 2880 208"
 "model" "models/desertfactory/structure_stone/sand03.ase"
 "spawnflags" "4"
 }
-// entity 391
+// entity 372
 {
 "classname" "misc_model"
 "origin" "2256 704 256"
 "model" "models/desertfactory/structure_stone/sand04.ase"
 "spawnflags" "4"
 }
-// entity 392
+// entity 373
 {
 "classname" "misc_model"
 "origin" "2240 1152 256"
@@ -10923,7 +10827,7 @@
 "spawnflags" "4"
 "angle" "-90"
 }
-// entity 393
+// entity 374
 {
 "classname" "misc_model"
 "origin" "1168 1328 768"
@@ -10931,14 +10835,14 @@
 "spawnflags" "4"
 "angle" "-180"
 }
-// entity 394
+// entity 375
 {
 "classname" "misc_model"
 "origin" "1376 2784 320"
 "model" "models/desertfactory/structure_stone/sand06.ase"
 "spawnflags" "4"
 }
-// entity 395
+// entity 376
 {
 "classname" "misc_model"
 "origin" "1312 1120 256"
@@ -10946,7 +10850,7 @@
 "spawnflags" "4"
 "angle" "-90"
 }
-// entity 396
+// entity 377
 {
 "classname" "misc_model"
 "origin" "2240 3328 320"
@@ -10954,14 +10858,14 @@
 "spawnflags" "4"
 "angle" "-90"
 }
-// entity 397
+// entity 378
 {
 "classname" "misc_model"
 "origin" "1344 3328 320"
 "model" "models/desertfactory/structure_stone/sand05.ase"
 "spawnflags" "4"
 }
-// entity 398
+// entity 379
 {
 "classname" "misc_model"
 "origin" "1152 2944 768"
@@ -10969,35 +10873,35 @@
 "spawnflags" "4"
 "angle" "-180"
 }
-// entity 399
+// entity 380
 {
 "classname" "misc_model"
 "origin" "1184 1440 264"
 "model" "models/desertfactory/objects_plants/grass02.ase"
 "angle" "60"
 }
-// entity 400
+// entity 381
 {
 "classname" "misc_model"
 "origin" "1072 1392 264"
 "model" "models/desertfactory/objects_plants/grass03.ase"
 "angle" "30"
 }
-// entity 401
+// entity 382
 {
 "classname" "misc_model"
 "origin" "1344 2752 320"
 "model" "models/desertfactory/objects_plants/grass02.ase"
 "angle" "30"
 }
-// entity 402
+// entity 383
 {
 "classname" "misc_model"
 "origin" "2176 576 256"
 "model" "models/desertfactory/objects_plants/grass02.ase"
 "angle" "60"
 }
-// entity 403
+// entity 384
 {
 "classname" "target_speaker"
 "origin" "448 3136 928"
@@ -11005,7 +10909,7 @@
 "volume" "0.5"
 "atten" "3.5"
 }
-// entity 404
+// entity 385
 {
 "classname" "target_speaker"
 "origin" "240 4032 296"
@@ -11013,7 +10917,7 @@
 "atten" "3.5"
 "volume" "1"
 }
-// entity 405
+// entity 386
 {
 "classname" "target_speaker"
 "origin" "2032 704 576"
@@ -11021,7 +10925,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 406
+// entity 387
 {
 "classname" "target_speaker"
 "origin" "1792 1552 576"
@@ -11029,7 +10933,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 407
+// entity 388
 {
 "classname" "target_speaker"
 "origin" "1792 2336 576"
@@ -11037,7 +10941,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 408
+// entity 389
 {
 "classname" "target_speaker"
 "origin" "1632 400 768"
@@ -11045,7 +10949,7 @@
 "volume" "1"
 "atten" "2"
 }
-// entity 409
+// entity 390
 {
 "classname" "target_speaker"
 "origin" "2112 1952 288"
@@ -11053,7 +10957,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 410
+// entity 391
 {
 "classname" "target_speaker"
 "origin" "264 1416 272"
@@ -11061,7 +10965,7 @@
 "atten" "3.5"
 "volume" "0.5"
 }
-// entity 411
+// entity 392
 {
 "classname" "target_speaker"
 "origin" "704 2816 272"
@@ -11069,7 +10973,7 @@
 "atten" "3.5"
 "volume" "0.5"
 }
-// entity 412
+// entity 393
 {
 "classname" "target_speaker"
 "origin" "1120 1376 272"
@@ -11077,7 +10981,7 @@
 "atten" "3.5"
 "volume" "0.5"
 }
-// entity 413
+// entity 394
 {
 "classname" "target_speaker"
 "origin" "960 2336 1248"
@@ -11085,7 +10989,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 414
+// entity 395
 {
 "classname" "target_speaker"
 "origin" "960 1792 1248"
@@ -11093,7 +10997,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 415
+// entity 396
 {
 "classname" "target_speaker"
 "origin" "448 1792 1248"
@@ -11101,7 +11005,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 416
+// entity 397
 {
 "classname" "target_speaker"
 "origin" "448 2336 1248"
@@ -11109,7 +11013,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 417
+// entity 398
 {
 "classname" "target_speaker"
 "origin" "960 1792 736"
@@ -11117,7 +11021,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 418
+// entity 399
 {
 "classname" "target_speaker"
 "origin" "448 1792 736"
@@ -11125,7 +11029,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 419
+// entity 400
 {
 "classname" "target_speaker"
 "origin" "960 2336 736"
@@ -11133,7 +11037,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 420
+// entity 401
 {
 "classname" "target_speaker"
 "origin" "448 2336 736"
@@ -11141,7 +11045,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 421
+// entity 402
 {
 "classname" "target_speaker"
 "origin" "1248 704 576"
@@ -11149,7 +11053,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 422
+// entity 403
 {
 "classname" "target_speaker"
 "origin" "2240 2880 384"
@@ -11157,7 +11061,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 423
+// entity 404
 {
 "classname" "target_speaker"
 "origin" "960 1792 480"
@@ -11165,7 +11069,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 424
+// entity 405
 {
 "classname" "target_speaker"
 "origin" "448 2336 480"
@@ -11173,7 +11077,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 425
+// entity 406
 {
 "classname" "target_speaker"
 "origin" "960 2336 480"
@@ -11181,7 +11085,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 426
+// entity 407
 {
 "classname" "target_speaker"
 "origin" "960 1792 992"
@@ -11189,7 +11093,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 427
+// entity 408
 {
 "classname" "target_speaker"
 "origin" "448 1792 992"
@@ -11197,7 +11101,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 428
+// entity 409
 {
 "classname" "target_speaker"
 "origin" "960 2336 992"
@@ -11205,7 +11109,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 429
+// entity 410
 {
 "classname" "target_speaker"
 "origin" "448 2336 992"
@@ -11213,7 +11117,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 430
+// entity 411
 {
 "classname" "target_speaker"
 "origin" "448 1792 480"
@@ -11221,7 +11125,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 431
+// entity 412
 {
 "classname" "target_speaker"
 "origin" "208 1792 384"
@@ -11229,7 +11133,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 432
+// entity 413
 {
 "classname" "target_speaker"
 "origin" "2288 704 384"
@@ -11237,7 +11141,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 433
+// entity 414
 {
 "classname" "target_speaker"
 "origin" "2240 3136 384"
@@ -11245,7 +11149,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 434
+// entity 415
 {
 "classname" "target_speaker"
 "origin" "2240 2624 384"
@@ -11253,7 +11157,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 435
+// entity 416
 {
 "classname" "target_speaker"
 "origin" "1792 3120 576"
@@ -11261,7 +11165,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 436
+// entity 417
 {
 "classname" "target_speaker"
 "origin" "1008 2944 848"
@@ -11270,7 +11174,7 @@
 "atten" "3.5"
 "targetname" "radiomessage"
 }
-// entity 437
+// entity 418
 {
 "classname" "target_speaker"
 "origin" "464 704 576"
@@ -11278,7 +11182,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 438
+// entity 419
 {
 "classname" "target_speaker"
 "origin" "1632 400 384"
@@ -11286,7 +11190,7 @@
 "volume" "1"
 "atten" "2"
 }
-// entity 439
+// entity 420
 {
 "classname" "target_speaker"
 "origin" "864 1008 768"
@@ -11294,7 +11198,7 @@
 "volume" "1"
 "atten" "2"
 }
-// entity 440
+// entity 421
 {
 "classname" "target_speaker"
 "origin" "864 1008 384"
@@ -11302,7 +11206,7 @@
 "volume" "1"
 "atten" "2"
 }
-// entity 441
+// entity 422
 {
 "classname" "target_speaker"
 "origin" "896 2816 1152"
@@ -11310,7 +11214,7 @@
 "atten" "3.5"
 "volume" "0.75"
 }
-// entity 442
+// entity 423
 {
 "classname" "target_speaker"
 "origin" "1248 704 224"
@@ -11318,7 +11222,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 443
+// entity 424
 {
 "classname" "target_speaker"
 "origin" "1632 704 224"
@@ -11326,7 +11230,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 444
+// entity 425
 {
 "classname" "target_speaker"
 "origin" "1792 1952 288"
@@ -11334,7 +11238,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 445
+// entity 426
 {
 "classname" "target_speaker"
 "origin" "864 704 224"
@@ -11342,7 +11246,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 446
+// entity 427
 {
 "classname" "target_speaker"
 "origin" "1024 448 1152"
@@ -11350,7 +11254,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 447
+// entity 428
 {
 "classname" "target_speaker"
 "origin" "1632 400 1152"
@@ -11358,7 +11262,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 448
+// entity 429
 {
 "classname" "target_speaker"
 "origin" "864 1008 1152"
@@ -11366,7 +11270,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 449
+// entity 430
 {
 "classname" "target_speaker"
 "origin" "832 2368 1152"
@@ -11374,7 +11278,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 450
+// entity 431
 {
 "classname" "target_speaker"
 "origin" "976 1792 1152"
@@ -11382,7 +11286,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 451
+// entity 432
 {
 "classname" "target_speaker"
 "origin" "864 1792 1152"
@@ -11390,7 +11294,7 @@
 "atten" "3"
 "volume" "0.75"
 }
-// entity 452
+// entity 433
 {
 "classname" "target_speaker"
 "origin" "2112 1952 768"
@@ -11398,7 +11302,7 @@
 "atten" "2"
 "volume" "1"
 }
-// entity 453
+// entity 434
 {
 "classname" "target_speaker"
 "origin" "1440 1696 448"
@@ -11406,7 +11310,7 @@
 "atten" "2"
 "volume" "1"
 }
-// entity 454
+// entity 435
 {
 "classname" "target_speaker"
 "origin" "2032 704 1024"
@@ -11414,7 +11318,7 @@
 "atten" "2"
 "volume" "1"
 }
-// entity 455
+// entity 436
 {
 "classname" "target_speaker"
 "origin" "1792 3120 1024"
@@ -11422,14 +11326,14 @@
 "atten" "2"
 "volume" "1"
 }
-// entity 456
+// entity 437
 {
 "classname" "misc_model"
 "origin" "1008 2944 816"
 "model" "models/desertfactory/objects_metal/radio01.ase"
 "angle" "-153"
 }
-// entity 457
+// entity 438
 {
 "classname" "target_speaker"
 "origin" "960 3136 928"
@@ -11437,7 +11341,7 @@
 "volume" "0.5"
 "atten" "3.5"
 }
-// entity 458
+// entity 439
 {
 "classname" "target_speaker"
 "origin" "1008 2944 824"
@@ -11445,7 +11349,7 @@
 "volume" "1"
 "atten" "3.5"
 }
-// entity 459
+// entity 440
 {
 "classname" "trigger_multiple"
 "target" "radiomessage"
@@ -11461,20 +11365,20 @@
 ( 988 2928 816 ) ( 988 2960 816 ) ( 988 2928 840 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 460
+// entity 441
 {
 "classname" "misc_model"
 "origin" "184 1920 704"
 "model" "models/desertfactory/structure_stone/hole04.ase"
 "angle" "90"
 }
-// entity 461
+// entity 442
 {
 "classname" "misc_model"
 "origin" "1536 1224 704"
 "model" "models/desertfactory/structure_stone/hole04.ase"
 }
-// entity 462
+// entity 443
 {
 "classname" "misc_model"
 "origin" "544 288 256"
@@ -11482,14 +11386,14 @@
 "spawnflags" "4"
 "angle" "90"
 }
-// entity 463
+// entity 444
 {
 "classname" "misc_model"
 "origin" "1504 3360 320"
 "model" "models/desertfactory/structure_stone/bricks01.ase"
 "spawnflags" "4"
 }
-// entity 464
+// entity 445
 {
 "classname" "misc_model"
 "origin" "1576 3344 320"
@@ -11497,7 +11401,7 @@
 "spawnflags" "4"
 "angle" "-90"
 }
-// entity 465
+// entity 446
 {
 "classname" "misc_model"
 "origin" "1536 3376 320"
@@ -11505,14 +11409,14 @@
 "spawnflags" "4"
 "angle" "-180"
 }
-// entity 466
+// entity 447
 {
 "classname" "misc_model"
 "origin" "228 1940 264"
 "model" "models/desertfactory/structure_stone/bricks01.ase"
 "spawnflags" "4"
 }
-// entity 467
+// entity 448
 {
 "classname" "misc_model"
 "origin" "264 1904 264"
@@ -11520,7 +11424,7 @@
 "spawnflags" "4"
 "angle" "-90"
 }
-// entity 468
+// entity 449
 {
 "classname" "misc_model"
 "origin" "1472 1168 256"
@@ -11528,13 +11432,13 @@
 "spawnflags" "4"
 "angle" "90"
 }
-// entity 469
+// entity 450
 {
 "classname" "misc_model"
 "origin" "1536 3400 320"
 "model" "models/desertfactory/structure_stone/hole04.ase"
 }
-// entity 470
+// entity 451
 {
 "classname" "misc_model"
 "origin" "1544 1152 256"
@@ -11542,14 +11446,14 @@
 "spawnflags" "4"
 "angle" "-180"
 }
-// entity 471
+// entity 452
 {
 "classname" "misc_model"
 "origin" "1512 1136 256"
 "model" "models/desertfactory/structure_stone/bricks01.ase"
 "spawnflags" "4"
 }
-// entity 472
+// entity 453
 {
 "classname" "misc_model"
 "origin" "228 1880 260"
@@ -11557,20 +11461,20 @@
 "spawnflags" "4"
 "angle" "90"
 }
-// entity 473
+// entity 454
 {
 "classname" "misc_model"
 "origin" "1064 3032 768"
 "model" "models/desertfactory/objects_wood/chair01.ase"
 "angle" "180"
 }
-// entity 474
+// entity 455
 {
 "classname" "misc_model"
 "origin" "1224 1272 768"
 "model" "models/desertfactory/structure_metal/drain01.ase"
 }
-// entity 475
+// entity 456
 {
 "classname" "func_pointparticles"
 "impulse" "4"
@@ -11586,7 +11490,7 @@
 ( 232 787 368 ) ( 232 819 368 ) ( 232 787 400 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 476
+// entity 457
 {
 "classname" "func_pointparticles"
 "impulse" "4"
@@ -11602,7 +11506,7 @@
 ( 1650 1008 296 ) ( 1650 1040 296 ) ( 1650 1008 328 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 477
+// entity 458
 {
 "classname" "func_pointparticles"
 "impulse" "1"
@@ -11620,7 +11524,7 @@
 ( 1652 1007 312 ) ( 1652 1039 312 ) ( 1652 1007 344 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 478
+// entity 459
 {
 "classname" "trigger_multivibrator"
 "origin" "1654 1024 512"
@@ -11628,7 +11532,7 @@
 "respawntime" "20"
 "target" "steamburst01"
 }
-// entity 479
+// entity 460
 {
 "classname" "target_speaker"
 "origin" "1654 1024 280"
@@ -11636,7 +11540,7 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 480
+// entity 461
 {
 "classname" "target_speaker"
 "origin" "304 752 352"
@@ -11644,7 +11548,7 @@
 "atten" "2"
 "volume" "1"
 }
-// entity 481
+// entity 462
 {
 "classname" "target_speaker"
 "origin" "842 384 280"
@@ -11652,68 +11556,68 @@
 "atten" "3"
 "volume" "1"
 }
-// entity 482
+// entity 463
 {
 "classname" "misc_model"
 "origin" "1272 2784 432"
 "model" "models/desertfactory/objects_metal/sign_ladder.ase"
 "angle" "90"
 }
-// entity 483
+// entity 464
 {
 "classname" "misc_model"
 "origin" "464 1224 592"
 "model" "models/desertfactory/objects_metal/sign_exit.ase"
 }
-// entity 484
+// entity 465
 {
 "classname" "misc_model"
 "origin" "1272 3120 656"
 "model" "models/desertfactory/objects_metal/sign_exit.ase"
 "angle" "90"
 }
-// entity 485
+// entity 466
 {
 "classname" "misc_model"
 "origin" "522 3376 768"
 "model" "models/desertfactory/structure_wood/hole02.ase"
 "spawnflags" "4"
 }
-// entity 486
+// entity 467
 {
 "classname" "misc_model"
 "origin" "528 2784 280"
 "model" "models/desertfactory/objects_plants/grass03.ase"
 "angle" "30"
 }
-// entity 487
+// entity 468
 {
 "classname" "misc_model"
 "origin" "232 4008 208"
 "model" "models/desertfactory/objects_plants/grass03.ase"
 "angle" "-75"
 }
-// entity 488
+// entity 469
 {
 "classname" "misc_model"
 "origin" "192 4032 208"
 "model" "models/desertfactory/structure_metal/toilet01.ase"
 }
-// entity 489
+// entity 470
 {
 "classname" "light"
 "origin" "224 4032 320"
 "light" "32"
 "_color" "1 0.95 0.9"
 }
-// entity 490
+// entity 471
 {
 "classname" "misc_model"
 "origin" "192 4032 208"
 "model" "models/desertfactory/structure_wood/toilethut01.ase"
 "spawnflags" "4"
 }
-// entity 491
+// entity 472
 {
 "classname" "func_pointparticles"
 "impulse" "4"
@@ -11731,7 +11635,7 @@
 ( 838 370 296 ) ( 838 402 296 ) ( 838 370 328 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 492
+// entity 473
 {
 "classname" "func_pointparticles"
 "impulse" "1"
@@ -11749,7 +11653,7 @@
 ( 840 367 312 ) ( 840 399 312 ) ( 840 367 344 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 493
+// entity 474
 {
 "classname" "trigger_multivibrator"
 "origin" "842 384 512"
@@ -11759,7 +11663,7 @@
 "targetname" "steam02_secret"
 "spawnflags" "1"
 }
-// entity 494
+// entity 475
 {
 "classname" "trigger_multiple"
 "wait" "8"
@@ -11775,7 +11679,7 @@
 ( 2084 1984 332 ) ( 2084 2048 332 ) ( 2084 1984 364 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 495
+// entity 476
 {
 "classname" "trigger_monoflop"
 "origin" "960 384 512"
@@ -11784,7 +11688,7 @@
 "targetname" "steam02_monoflop"
 "wait" "8"
 }
-// entity 496
+// entity 477
 {
 "classname" "trigger_teleport"
 "target" "toilet_to"
@@ -11798,13 +11702,13 @@
 ( 840 372 268 ) ( 840 388 268 ) ( 840 372 276 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 497
+// entity 478
 {
 "classname" "misc_teleporter_dest"
 "origin" "200 4032 240"
 "targetname" "toilet_to"
 }
-// entity 498
+// entity 479
 {
 "classname" "func_door"
 "spawnflags" "36"
@@ -11821,7 +11725,7 @@
 ( 832 360 244 ) ( 832 368 244 ) ( 832 360 260 ) common/weapclip 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 499
+// entity 480
 {
 "classname" "trigger_hurt"
 "dmg" "5"
@@ -11829,14 +11733,14 @@
 // brush 0
 {
 ( 912 408 320 ) ( 912 320 320 ) ( 816 408 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 912 432 288 ) ( 816 432 288 ) ( 912 432 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 928 408 288 ) ( 928 408 256 ) ( 928 320 288 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 912 416 288 ) ( 816 416 288 ) ( 912 416 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 912 408 288 ) ( 912 408 256 ) ( 912 320 288 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 ( 816 320 256 ) ( 912 320 256 ) ( 816 408 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 816 304 256 ) ( 816 304 288 ) ( 912 304 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 800 320 256 ) ( 800 408 256 ) ( 800 320 288 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 816 320 256 ) ( 816 320 288 ) ( 912 320 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 816 320 256 ) ( 816 408 256 ) ( 816 320 288 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 500
+// entity 481
 {
 "classname" "trigger_hurt"
 "message" "decided to take a bath in the steaming hot poisonous gas bursting out of the tubes."
@@ -11844,14 +11748,14 @@
 // brush 0
 {
 ( 1680 1088 320 ) ( 1680 992 320 ) ( 1584 1088 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 1680 1104 320 ) ( 1584 1104 320 ) ( 1680 1104 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 1696 1088 320 ) ( 1696 1088 256 ) ( 1696 992 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 1680 1088 320 ) ( 1584 1088 320 ) ( 1680 1088 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 1680 1088 320 ) ( 1680 1088 256 ) ( 1680 992 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 ( 1584 992 256 ) ( 1680 992 256 ) ( 1584 1088 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 1584 976 256 ) ( 1584 976 320 ) ( 1680 976 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
-( 1568 992 256 ) ( 1568 1088 256 ) ( 1568 992 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 1584 992 256 ) ( 1584 992 320 ) ( 1680 992 256 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
+( 1584 992 256 ) ( 1584 1088 256 ) ( 1584 992 320 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 501
+// entity 482
 {
 "classname" "trigger_teleport"
 "target" "toilet_from"
@@ -11865,14 +11769,14 @@
 ( 136 4032 208 ) ( 136 4072 208 ) ( 136 4032 400 ) common/trigger 0 0 0 0.25 0.25 134217728 0 0
 }
 }
-// entity 502
+// entity 483
 {
 "classname" "misc_teleporter_dest"
 "origin" "1632 1040 352"
 "angle" "-90"
 "targetname" "toilet_from"
 }
-// entity 503
+// entity 484
 {
 "classname" "target_speaker"
 "origin" "1056 3280 272"
@@ -11880,7 +11784,7 @@
 "atten" "3.5"
 "volume" "0.5"
 }
-// entity 504
+// entity 485
 {
 "classname" "misc_model"
 "origin" "1952 1952 264"
@@ -11888,3 +11792,29 @@
 "angle" "-90"
 "_receiveshadows" "0"
 }
+// entity 486
+{
+"classname" "weapon_nex"
+"origin" "2208 2880 208"
+}
+// entity 487
+{
+"classname" "item_rockets"
+"origin" "2144 3040 224"
+"angle" "-90"
+}
+// entity 488
+{
+"classname" "weapon_hagar"
+"origin" "2192 2336 784"
+}
+// entity 489
+{
+"classname" "item_armor_large"
+"origin" "1024 1376 800"
+}
+// entity 490
+{
+"classname" "item_armor_large"
+"origin" "2208 1120 256"
+}

Modified: branches/nexuiz-2.0/data/maps/desertfactory.mapinfo
===================================================================
--- branches/nexuiz-2.0/data/maps/desertfactory.mapinfo	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/maps/desertfactory.mapinfo	2009-02-20 14:23:51 UTC (rev 5912)
@@ -7,3 +7,4 @@
 type tdm 30 20 2
 type lms 9 20
 type arena 10 20
+type kh 1000 20 2

Copied: branches/nexuiz-2.0/data/maps/racetrack (from rev 5910, trunk/data/maps/racetrack)

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

Modified: branches/nexuiz-2.0/data/maps/racetrack.map
===================================================================
--- branches/nexuiz-2.0/data/maps/racetrack.map	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/maps/racetrack.map	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,887 +1,882 @@
-
-// entity 0
-{
-"classname" "worldspawn"
-"gridsize" "256 256 382"
-// brush 0
-{
-( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
-( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( -6520 6928 5416 ) ( 9800 -6728 5416 ) ( 9800 6928 5416 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
-}
-// brush 1
-{
-( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
-( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 9856 5784 0 ) ( -6464 5784 8 ) ( 9856 5784 8 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
-}
-// brush 2
-{
-( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
-( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( 7928 -7008 8 ) ( 7928 6648 0 ) ( 7928 6648 8 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
-}
-// brush 3
-{
-( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
-( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( -7080 6928 -856 ) ( 9240 -6728 -856 ) ( -7080 -6728 -856 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-}
-// brush 4
-{
-( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 9464 -4416 0 ) ( -6856 -4416 8 ) ( -6856 -4416 0 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
-}
-// brush 5
-{
-( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
-( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
-( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
-( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( -5216 -6728 8 ) ( -5216 6928 0 ) ( -5216 -6728 0 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
-}
-// brush 6
-{
-( 3136 1664 1664 ) ( 3136 -896 1664 ) ( 576 1664 1664 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 3136 1664 4064 ) ( 576 1664 4064 ) ( 3136 1664 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 640 -896 1648 ) ( 3200 -896 1648 ) ( 640 1664 1648 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 576 -896 -736 ) ( 576 -896 4064 ) ( 3136 -896 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 576 -896 -736 ) ( 576 1664 -736 ) ( 576 -896 4064 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 512 1664 352 ) ( 1600 -1088 224 ) ( 512 1664 224 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 2064 1840 -64 ) ( 2288 560 -64 ) ( 2064 1840 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 1872 1792 -64 ) ( 2448 384 -64 ) ( 1872 1792 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-}
-// brush 7
-{
-( 3136 1664 1664 ) ( 3136 -896 1664 ) ( 576 1664 1664 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 3136 1664 4064 ) ( 3136 1664 -736 ) ( 3136 -896 4064 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 640 -896 1648 ) ( 3200 -896 1648 ) ( 640 1664 1648 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 576 -896 -736 ) ( 576 -896 4064 ) ( 3136 -896 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 2112 1792 224 ) ( 3328 -960 224 ) ( 2112 1792 352 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 2064 1840 64 ) ( 2288 560 -64 ) ( 2064 1840 -64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-( 2160 768 -64 ) ( 3328 -768 -64 ) ( 2160 768 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
-}
-}
-// entity 1
-{
-"classname" "misc_model"
-"origin" "24 0 0"
-"model" "models/race/racetrack.ase"
-"modelscale" "30"
-"spawnflags" "6"
-}
-// entity 2
-{
-"classname" "misc_model"
-"origin" "1424 656 5248"
-"model" "models/race/clouds.md3"
-"modelscale_vec" "132.5 104 24"
-"_castshadows" "0"
-"_receiveshadows" "0"
-}
-// entity 3
-{
-"classname" "trigger_hurt"
-"message" "fall of the track"
-"spawnflags" "4"
-// brush 0
-{
-( 8016 5792 216 ) ( 8016 -4928 216 ) ( -5376 5792 216 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-( 8016 6048 -336 ) ( -5376 6048 -336 ) ( 8016 6048 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-( 8016 6048 -336 ) ( 8016 6048 -896 ) ( 8016 -4672 -336 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-( -5376 -4672 -896 ) ( 8016 -4672 -896 ) ( -5376 6048 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-( -5376 -4672 -896 ) ( -5376 -4672 -336 ) ( 8016 -4672 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-( -5376 -4672 -896 ) ( -5376 6048 -896 ) ( -5376 -4672 -336 ) common/trigger 0 0 0 0.5 0.5 0 0 0
-}
-}
-// entity 4
-{
-"classname" "trigger_push"
-"target" "info_null1"
-}
-// entity 5
-{
-"classname" "trigger_impulse"
-"strength" "23"
-// brush 0
-{
-( -1718.8261108398 666.8485412598 1011.4663543701 ) ( -1889.1460418701 -104.2349395752 1362.0621643066 ) ( -1889.3058776855 709.2946472168 1022.0009613037 ) common/trigger 48.7728385925 36.2005767822 -13.9820575714 0.5013611913 0.5809952617 0 0 0
-( -1737.451675415 495.7475738525 554.9529876709 ) ( -1907.9314575195 538.1936798096 565.4876098633 ) ( -1739.8721923828 489.6474914551 540.3608703613 ) common/trigger 24.0353469849 19.0857849121 -1.8616751432 0.553583622 0.5806270838 0 0 0
-( -1697.451675415 591.7475738525 554.9529876709 ) ( -1699.8721923828 585.6474914551 540.3608703613 ) ( -1867.7716217041 -179.3359069824 905.5487976074 ) common/trigger 43.9748268127 63.2830429077 -25.7402610779 0.5398185849 0.5129211545 0 0 0
-( -2016.6718902588 -142.9898834229 893.4912872314 ) ( -1846.1921234131 -185.4359893799 882.9566802979 ) ( -1846.3519592285 628.0935974121 542.8954772949 ) common/trigger 33.5633354187 52.7816543579 -13.9820575714 0.5013611913 0.5809952617 0 0 0
-( -2016.6718902588 -142.9898834229 901.4912872314 ) ( -2014.2513885498 -136.8898010254 916.0834197998 ) ( -1846.1921234131 -185.4359893799 890.9566802979 ) common/trigger 36.4860115051 22.6666526794 -1.8616751432 0.553583622 0.5806270838 0 0 0
-( -1992.6718902588 -142.9898834229 901.4912872314 ) ( -1822.3519592285 628.0935974121 550.8954772949 ) ( -1990.2513885498 -136.8898010254 916.0834197998 ) common/trigger 43.9748268127 63.2830429077 -25.7402610779 0.5398185849 0.5129211545 0 0 0
-}
-}
-// entity 6
-{
-"classname" "light"
-"origin" "2408 -792 2168"
-"light" "500"
-}
-// entity 7
-{
-"classname" "light"
-"origin" "1144 1832 1976"
-"light" "500"
-}
-// entity 8
-{
-"classname" "light"
-"origin" "1320 1424 1976"
-"light" "500"
-}
-// entity 9
-{
-"classname" "light"
-"origin" "1440 1008 1976"
-"light" "500"
-}
-// entity 10
-{
-"classname" "light"
-"origin" "1576 528 2024"
-"light" "500"
-}
-// entity 11
-{
-"classname" "light"
-"origin" "1784 96 2064"
-"light" "500"
-}
-// entity 12
-{
-"classname" "light"
-"origin" "2064 -344 2128"
-"light" "500"
-}
-// entity 13
-{
-"classname" "light"
-"origin" "896 1448 872"
-"light" "500"
-}
-// entity 14
-{
-"classname" "light"
-"origin" "3936 544 1440"
-"light" "500"
-}
-// entity 15
-{
-"classname" "light"
-"origin" "3432 808 1312"
-"light" "500"
-}
-// entity 16
-{
-"classname" "light"
-"origin" "2920 984 1224"
-"light" "500"
-}
-// entity 17
-{
-"classname" "light"
-"origin" "2368 1136 1104"
-"light" "500"
-}
-// entity 18
-{
-"classname" "light"
-"origin" "1848 1264 1008"
-"light" "500"
-}
-// entity 19
-{
-"classname" "light"
-"origin" "1432 1352 920"
-"light" "500"
-}
-// entity 20
-{
-"classname" "light"
-"origin" "-152 2712 2032"
-"light" "1500"
-}
-// entity 21
-{
-"classname" "light"
-"origin" "4600 -1064 2112"
-"light" "1500"
-}
-// entity 22
-{
-"classname" "light"
-"origin" "120 -2272 2280"
-"light" "1500"
-}
-// entity 23
-{
-"classname" "light"
-"origin" "-2032 -200 1256"
-"light" "1500"
-}
-// entity 24
-{
-"classname" "item_health_small"
-"origin" "-696 440 2152"
-}
-// entity 25
-{
-"classname" "item_health_small"
-"origin" "-152 -160 2152"
-}
-// entity 26
-{
-"classname" "item_health_small"
-"origin" "-216 -88 2152"
-}
-// entity 27
-{
-"classname" "item_health_small"
-"origin" "-280 -24 2152"
-}
-// entity 28
-{
-"classname" "item_health_small"
-"origin" "-352 64 2152"
-}
-// entity 29
-{
-"classname" "item_health_small"
-"origin" "-408 120 2152"
-}
-// entity 30
-{
-"classname" "item_health_small"
-"origin" "-456 176 2152"
-}
-// entity 31
-{
-"classname" "item_health_small"
-"origin" "-504 232 2152"
-}
-// entity 32
-{
-"classname" "item_health_small"
-"origin" "-568 296 2152"
-}
-// entity 33
-{
-"classname" "item_health_small"
-"origin" "-640 376 2152"
-}
-// entity 34
-{
-"classname" "weapon_electro"
-"origin" "-1392 1944 2000"
-}
-// entity 35
-{
-"classname" "item_armor_medium"
-"origin" "1832 328 1816"
-}
-// entity 36
-{
-"classname" "weapon_hagar"
-"origin" "3560 -1472 1960"
-}
-// entity 37
-{
-"classname" "item_health_large"
-"origin" "3368 664 1040"
-}
-// entity 38
-{
-"classname" "weapon_crylink"
-"origin" "3464 896 1040"
-}
-// entity 39
-{
-"classname" "weapon_uzi"
-"origin" "-272 1536 552"
-}
-// entity 40
-{
-"classname" "item_health_medium"
-"origin" "384 2424 1872"
-}
-// entity 41
-{
-"classname" "item_armor_small"
-"origin" "4688 -280 1592"
-}
-// entity 42
-{
-"classname" "item_armor_small"
-"origin" "4712 -728 1704"
-}
-// entity 43
-{
-"classname" "item_armor_small"
-"origin" "4736 -648 1680"
-}
-// entity 44
-{
-"classname" "item_armor_small"
-"origin" "4736 -560 1664"
-}
-// entity 45
-{
-"classname" "item_armor_small"
-"origin" "4736 -464 1640"
-}
-// entity 46
-{
-"classname" "item_armor_small"
-"origin" "4704 -376 1616"
-}
-// entity 47
-{
-"classname" "item_armor_small"
-"origin" "-2104 -32 904"
-}
-// entity 48
-{
-"classname" "item_armor_small"
-"origin" "-1992 568 696"
-}
-// entity 49
-{
-"classname" "item_armor_small"
-"origin" "-2024 472 736"
-}
-// entity 50
-{
-"classname" "item_armor_small"
-"origin" "-2056 368 744"
-}
-// entity 51
-{
-"classname" "item_armor_small"
-"origin" "-2072 288 792"
-}
-// entity 52
-{
-"classname" "item_armor_small"
-"origin" "-2096 176 792"
-}
-// entity 53
-{
-"classname" "item_armor_small"
-"origin" "-2104 72 832"
-}
-// entity 54
-{
-"classname" "weapon_grenadelauncher"
-"origin" "-1144 -2304 1960"
-}
-// entity 55
-{
-"classname" "trigger_race_checkpoint"
-"cnt" "0"
-"targetname" "finish"
-// brush 0
-{
-( -39.5352935791 -1769.8847503662 2664 ) ( 468.7110748291 -2722.8200073242 2664 ) ( -145.4169921875 -1826.3565673828 2664 ) common/trigger 7.5777893066 17.9038391113 28.0731525421 0.5 0.5 0 0 0
-( 0.4647064209 -1881.8847503662 2496 ) ( -105.4169921875 -1938.3565673828 2496 ) ( 0.4647064209 -1881.8847503662 1976 ) common/trigger 34.8744659424 48 0 0.5666701794 0.5 0 0 0
-( -79.5352935791 -1785.8847503662 2496 ) ( -79.5352935791 -1785.8847503662 1976 ) ( 428.7110748291 -2738.8200073242 2496 ) common/trigger 21.6214580536 48 0 0.5666701794 0.5 0 0 0
-( 362.8293762207 -2779.2918243408 1976 ) ( 468.7110748291 -2722.8200073242 1976 ) ( -145.4169921875 -1826.3565673828 1976 ) common/trigger 7.5777893066 17.9038391113 28.0731525421 0.5 0.5 0 0 0
-( 274.8293762207 -2635.2918243408 1976 ) ( 274.8293762207 -2635.2918243408 2496 ) ( 380.7110748291 -2578.8200073242 1976 ) common/trigger 4.7554168701 48 0 0.5666701794 0.5 0 0 0
-( 338.8293762207 -2771.2918243408 1976 ) ( -169.4169921875 -1818.3565673828 1976 ) ( 338.8293762207 -2771.2918243408 2496 ) common/trigger 43.2687797546 48 0 0.5666701794 0.5 0 0 0
-}
-}
-// entity 56
-{
-"classname" "info_player_race"
-"origin" "-760 -2712 2120"
-"angle" "8.43983"
-"race_place" "10"
-"target" "finish"
-}
-// entity 57
-{
-"classname" "info_player_race"
-"origin" "-56 -2384 2120"
-"angle" "28.8759"
-"race_place" "1"
-"target" "finish"
-}
-// entity 58
-{
-"classname" "info_player_race"
-"origin" "-96 -2544 2120"
-"angle" "28.8759"
-"race_place" "2"
-"target" "finish"
-}
-// entity 59
-{
-"classname" "info_player_race"
-"origin" "-192 -2360 2120"
-"angle" "28.8759"
-"race_place" "3"
-"target" "finish"
-}
-// entity 60
-{
-"classname" "info_player_race"
-"origin" "-256 -2608 2120"
-"angle" "28.8759"
-"race_place" "4"
-"target" "finish"
-}
-// entity 61
-{
-"classname" "info_player_race"
-"origin" "-336 -2400 2120"
-"angle" "28.8759"
-"race_place" "5"
-"target" "finish"
-}
-// entity 62
-{
-"classname" "info_player_race"
-"origin" "-496 -2440 2120"
-"angle" "20.5309"
-"race_place" "7"
-"target" "finish"
-}
-// entity 63
-{
-"classname" "info_player_race"
-"origin" "-432 -2672 2120"
-"angle" "20.5309"
-"race_place" "6"
-"target" "finish"
-}
-// entity 64
-{
-"classname" "info_player_race"
-"origin" "-624 -2448 2120"
-"angle" "20.5309"
-"race_place" "9"
-"target" "finish"
-}
-// entity 65
-{
-"classname" "info_player_race"
-"origin" "-600 -2696 2120"
-"angle" "20.5309"
-"race_place" "8"
-"target" "finish"
-}
-// entity 66
-{
-"classname" "info_player_race"
-"origin" "-904 -2680 2120"
-"angle" "5.38179"
-"race_place" "12"
-"target" "finish"
-}
-// entity 67
-{
-"classname" "info_player_race"
-"origin" "-768 -2448 2120"
-"angle" "20.5309"
-"race_place" "11"
-"target" "finish"
-}
-// entity 68
-{
-"classname" "trigger_race_checkpoint"
-"cnt" "1"
-"targetname" "cp1"
-// brush 0
-{
-( -61.7871551514 3285.9476928711 2392 ) ( -63.4424133301 2205.9489746094 2392 ) ( -181.7870178223 3286.1316223145 2392 ) common/trigger 5.6465148926 11.6982297897 -0.0878135562 0.5 0.5 0 0 0
-( -69.1151580811 3264.111907959 2224 ) ( -189.115020752 3264.2958221436 2224 ) ( -69.1151580811 3264.111907959 1704 ) common/trigger 56.3670310974 16 0 0.6350824237 0.5 0 0 0
-( -82.0361785889 3269.111907959 2224 ) ( -82.0361785889 3269.111907959 1704 ) ( -83.6914215088 2189.1131744385 2224 ) common/trigger 14.5520057678 16 0 0.6350824237 0.5 0 0 0
-( -183.4422607422 2206.1328887939 1704 ) ( -63.4424133301 2205.9489746094 1704 ) ( -181.7870178223 3286.1316223145 1704 ) common/trigger 5.6465148926 11.6982297897 -0.0878135562 0.5 0.5 0 0 0
-( -199.1115112305 2118.689956665 1704 ) ( -199.1115112305 2118.689956665 2224 ) ( -79.1116485596 2118.5060424805 1704 ) common/trigger 38.8484382629 16 0 0.6350824237 0.5 0 0 0
-( -215.4422607422 2206.1328887939 1704 ) ( -213.7870178223 3286.1316223145 1704 ) ( -215.4422607422 2206.1328887939 2224 ) common/trigger 59.3673248291 16 0 0.6350824237 0.5 0 0 0
-}
-}
-// entity 69
-{
-"classname" "info_player_race"
-"origin" "-672 2816 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 70
-{
-"classname" "info_player_race"
-"origin" "-448 2864 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 71
-{
-"classname" "info_player_race"
-"origin" "-448 2768 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 72
-{
-"classname" "info_player_race"
-"origin" "-440 2680 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 73
-{
-"classname" "info_player_race"
-"origin" "-432 2584 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 74
-{
-"classname" "info_player_race"
-"origin" "-672 2536 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 75
-{
-"classname" "info_player_race"
-"origin" "-672 2640 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 76
-{
-"classname" "info_player_race"
-"origin" "-664 2728 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 77
-{
-"classname" "info_player_race"
-"origin" "-560 2680 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 78
-{
-"classname" "info_player_race"
-"origin" "-552 2768 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 79
-{
-"classname" "info_player_race"
-"origin" "-560 2856 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 80
-{
-"classname" "info_player_race"
-"origin" "-560 2576 1824"
-"angle" "0.531739"
-"target" "cp1"
-}
-// entity 81
-{
-"classname" "trigger_race_checkpoint"
-"targetname" "cp2"
-"cnt" "2"
-// brush 0
-{
-( 4137.2494506836 -717.72605896 2424 ) ( 5118.4794311523 -1168.933013916 2424 ) ( 4087.1153411865 -826.7516174316 2424 ) common/trigger 23.2200832367 42.5259971619 65.3052215576 0.5 0.5 0 0 0
-( 4154.0509185791 -733.4808044434 2256 ) ( 4103.916809082 -842.506362915 2256 ) ( 4154.0509185791 -733.4808044434 1736 ) common/trigger 54.4435424805 16 0 0.6985179186 0.5 0 0 0
-( 4132.8645324707 -759.456237793 2256 ) ( 4132.8645324707 -759.456237793 1736 ) ( 5114.0945129395 -1210.663192749 2256 ) common/trigger 45.0993652344 16 0 -0.6985179186 0.5 0 0 0
-( 5068.3453369141 -1277.9585723877 1736 ) ( 5118.4794311523 -1168.933013916 1736 ) ( 4087.1153411865 -826.7516174316 1736 ) common/trigger 23.2200832367 42.5259971619 65.3052215576 0.5 0.5 0 0 0
-( 5117.3226318359 -1320.6152954102 1736 ) ( 5117.3226318359 -1320.6152954102 2256 ) ( 5167.456741333 -1211.5897369385 1736 ) common/trigger 25.4721679688 16 0 0.6985179186 0.5 0 0 0
-( 5052.3453369141 -1309.9585723877 1736 ) ( 4071.1153411865 -858.7516174316 1736 ) ( 5052.3453369141 -1309.9585723877 2256 ) common/trigger 56.7001953125 16 0 -0.6985179186 0.5 0 0 0
-}
-}
-// entity 82
-{
-"classname" "info_player_race"
-"origin" "4320 -1240 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 83
-{
-"classname" "info_player_race"
-"origin" "4376 -1296 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 84
-{
-"classname" "info_player_race"
-"origin" "4464 -1360 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 85
-{
-"classname" "info_player_race"
-"origin" "4536 -1424 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 86
-{
-"classname" "info_player_race"
-"origin" "4472 -1496 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 87
-{
-"classname" "info_player_race"
-"origin" "4392 -1424 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 88
-{
-"classname" "info_player_race"
-"origin" "4312 -1360 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 89
-{
-"classname" "info_player_race"
-"origin" "4256 -1304 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 90
-{
-"classname" "info_player_race"
-"origin" "4184 -1368 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 91
-{
-"classname" "info_player_race"
-"origin" "4248 -1440 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 92
-{
-"classname" "info_player_race"
-"origin" "4328 -1496 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 93
-{
-"classname" "info_player_race"
-"origin" "4400 -1568 2080"
-"angle" "40.3826"
-"target" "cp2"
-}
-// entity 94
-{
-"classname" "trigger_race_checkpoint"
-"targetname" "cp3"
-"cnt" "3"
-// brush 0
-{
-( -2638.4434814453 -101.7411651611 1520 ) ( -1558.7772369385 -74.8933410645 1520 ) ( -2635.4603881836 -221.7040710449 1520 ) common/trigger 8.2419624329 0.3149719238 91.4244613647 0.4999999702 0.4999999702 0 0 0
-( -2616.4219055176 -108.4903411865 1352 ) ( -2613.4388122559 -228.4532470703 1352 ) ( -2616.4219055176 -108.4903411865 832 ) common/trigger 36.2236671448 0 0 0.7779637575 0.5 0 0 0
-( -2627.8096008301 -129.733215332 1352 ) ( -2627.8096008301 -129.733215332 832 ) ( -1548.1433410645 -102.8854064941 1352 ) common/trigger 31.5328521729 0 0 -0.7779637575 0.5 0 0 0
-( -1555.7941436768 -194.856262207 832 ) ( -1558.7772369385 -74.8933410645 832 ) ( -2635.4603881836 -221.7040710449 832 ) common/trigger 8.2419624329 0.3149719238 91.4244613647 0.4999999702 0.4999999702 0 0 0
-( -1493.0391845703 -211.5950622559 832 ) ( -1493.0391845703 -211.5950622559 1352 ) ( -1496.022277832 -91.6321411133 832 ) common/trigger 7.2522315979 0 0 0.7779637575 0.5 0 0 0
-( -1555.7941436768 -234.856262207 832 ) ( -2635.4603881836 -261.7040710449 832 ) ( -1555.7941436768 -234.856262207 1352 ) common/trigger 24.9449615479 0 0 -0.7779637575 0.5 0 0 0
-}
-}
-// entity 95
-{
-"classname" "info_player_race"
-"origin" "-1544 888 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 96
-{
-"classname" "info_player_race"
-"origin" "-1760 1024 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 97
-{
-"classname" "info_player_race"
-"origin" "-1688 976 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 98
-{
-"classname" "info_player_race"
-"origin" "-1624 944 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 99
-{
-"classname" "info_player_race"
-"origin" "-1664 720 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 100
-{
-"classname" "info_player_race"
-"origin" "-1880 856 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 101
-{
-"classname" "info_player_race"
-"origin" "-1808 808 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 102
-{
-"classname" "info_player_race"
-"origin" "-1744 776 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 103
-{
-"classname" "info_player_race"
-"origin" "-1608 800 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 104
-{
-"classname" "info_player_race"
-"origin" "-1824 936 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 105
-{
-"classname" "info_player_race"
-"origin" "-1752 888 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 106
-{
-"classname" "info_player_race"
-"origin" "-1688 856 616"
-"angle" "-114.654"
-"target" "cp3"
-}
-// entity 107
-{
-"classname" "info_player_race"
-"origin" "-168 -2592 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 108
-{
-"classname" "info_player_race"
-"origin" "-304 -2360 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 109
-{
-"classname" "info_player_race"
-"origin" "-256 -2448 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 110
-{
-"classname" "info_player_race"
-"origin" "-208 -2528 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 111
-{
-"classname" "info_player_race"
-"origin" "-16 -2520 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 112
-{
-"classname" "info_player_race"
-"origin" "-152 -2288 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 113
-{
-"classname" "info_player_race"
-"origin" "-104 -2376 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 114
-{
-"classname" "info_player_race"
-"origin" "-56 -2456 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 115
-{
-"classname" "info_player_race"
-"origin" "-96 -2560 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 116
-{
-"classname" "info_player_race"
-"origin" "-232 -2328 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 117
-{
-"classname" "info_player_race"
-"origin" "-184 -2416 2432"
-"angle" "24.31"
-"target" "finish"
-}
-// entity 118
-{
-"classname" "info_player_race"
-"origin" "-136 -2496 2432"
-"angle" "24.31"
-"target" "finish"
-}
+
+// entity 0
+{
+"classname" "worldspawn"
+"gridsize" "256 256 382"
+// brush 0
+{
+( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
+( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( -6520 6928 5416 ) ( 9800 -6728 5416 ) ( 9800 6928 5416 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
+}
+// brush 1
+{
+( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
+( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 9856 5784 0 ) ( -6464 5784 8 ) ( 9856 5784 8 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
+}
+// brush 2
+{
+( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
+( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( 7928 -7008 8 ) ( 7928 6648 0 ) ( 7928 6648 8 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
+}
+// brush 3
+{
+( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
+( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( -7080 6928 -856 ) ( 9240 -6728 -856 ) ( -7080 -6728 -856 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+}
+// brush 4
+{
+( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( 8184 6648 8 ) ( 8184 6648 0 ) ( 8184 -7008 8 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 9464 -4416 0 ) ( -6856 -4416 8 ) ( -6856 -4416 0 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
+}
+// brush 5
+{
+( 9800 6928 5672 ) ( 9800 -6728 5672 ) ( -6520 6928 5672 ) common/caulk 48 0 0 0.5 0.5 0 0 0
+( 9856 6040 8 ) ( -6464 6040 8 ) ( 9856 6040 0 ) common/caulk -0 0 0 0.5 0.5 0 0 0
+( -7080 -6728 -1112 ) ( 9240 -6728 -1112 ) ( -7080 6928 -1112 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -6856 -4672 0 ) ( -6856 -4672 8 ) ( 9464 -4672 0 ) common/caulk 16 0 0 0.5 0.5 0 0 0
+( -5472 -6728 0 ) ( -5472 6928 0 ) ( -5472 -6728 8 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( -5216 -6728 8 ) ( -5216 6928 0 ) ( -5216 -6728 0 ) race/nicesky 0 0 0 0.5 0.5 0 0 0
+}
+// brush 6
+{
+( 3136 1664 1664 ) ( 3136 -896 1664 ) ( 576 1664 1664 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 3136 1664 4064 ) ( 576 1664 4064 ) ( 3136 1664 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 640 -896 1648 ) ( 3200 -896 1648 ) ( 640 1664 1648 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 576 -896 -736 ) ( 576 -896 4064 ) ( 3136 -896 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 576 -896 -736 ) ( 576 1664 -736 ) ( 576 -896 4064 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 512 1664 352 ) ( 1600 -1088 224 ) ( 512 1664 224 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 2064 1840 -64 ) ( 2288 560 -64 ) ( 2064 1840 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 1872 1792 -64 ) ( 2448 384 -64 ) ( 1872 1792 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+}
+// brush 7
+{
+( 3136 1664 1664 ) ( 3136 -896 1664 ) ( 576 1664 1664 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 3136 1664 4064 ) ( 3136 1664 -736 ) ( 3136 -896 4064 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 640 -896 1648 ) ( 3200 -896 1648 ) ( 640 1664 1648 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 576 -896 -736 ) ( 576 -896 4064 ) ( 3136 -896 -736 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 2112 1792 224 ) ( 3328 -960 224 ) ( 2112 1792 352 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 2064 1840 64 ) ( 2288 560 -64 ) ( 2064 1840 -64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+( 2160 768 -64 ) ( 3328 -768 -64 ) ( 2160 768 64 ) common/caulk 0 0 0 0.5 0.5 0 0 0
+}
+}
+// entity 1
+{
+"classname" "misc_model"
+"origin" "24 0 0"
+"model" "models/race/racetrack.ase"
+"modelscale" "30"
+"spawnflags" "6"
+}
+// entity 2
+{
+"classname" "misc_model"
+"origin" "1424 656 5248"
+"model" "models/race/clouds.md3"
+"modelscale_vec" "132.5 104 24"
+"_castshadows" "0"
+"_receiveshadows" "0"
+}
+// entity 3
+{
+"classname" "trigger_hurt"
+"message" "fall of the track"
+"spawnflags" "4"
+// brush 0
+{
+( 8016 5792 216 ) ( 8016 -4928 216 ) ( -5376 5792 216 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+( 8016 6048 -336 ) ( -5376 6048 -336 ) ( 8016 6048 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+( 8016 6048 -336 ) ( 8016 6048 -896 ) ( 8016 -4672 -336 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+( -5376 -4672 -896 ) ( 8016 -4672 -896 ) ( -5376 6048 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+( -5376 -4672 -896 ) ( -5376 -4672 -336 ) ( 8016 -4672 -896 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+( -5376 -4672 -896 ) ( -5376 6048 -896 ) ( -5376 -4672 -336 ) common/trigger 0 0 0 0.5 0.5 0 0 0
+}
+}
+// entity 4
+{
+"classname" "trigger_impulse"
+"strength" "23"
+// brush 0
+{
+( -1718.8261108398 666.8485412598 1011.4663543701 ) ( -1889.1460418701 -104.2349395752 1362.0621643066 ) ( -1889.3058776855 709.2946472168 1022.0009613037 ) common/trigger 48.7728385925 36.2005767822 -13.9820575714 0.5013611913 0.5809952617 0 0 0
+( -1737.451675415 495.7475738525 554.9529876709 ) ( -1907.9314575195 538.1936798096 565.4876098633 ) ( -1739.8721923828 489.6474914551 540.3608703613 ) common/trigger 24.0353469849 19.0857849121 -1.8616751432 0.553583622 0.5806270838 0 0 0
+( -1697.451675415 591.7475738525 554.9529876709 ) ( -1699.8721923828 585.6474914551 540.3608703613 ) ( -1867.7716217041 -179.3359069824 905.5487976074 ) common/trigger 43.9748268127 63.2830429077 -25.7402610779 0.5398185849 0.5129211545 0 0 0
+( -2016.6718902588 -142.9898834229 893.4912872314 ) ( -1846.1921234131 -185.4359893799 882.9566802979 ) ( -1846.3519592285 628.0935974121 542.8954772949 ) common/trigger 33.5633354187 52.7816543579 -13.9820575714 0.5013611913 0.5809952617 0 0 0
+( -2016.6718902588 -142.9898834229 901.4912872314 ) ( -2014.2513885498 -136.8898010254 916.0834197998 ) ( -1846.1921234131 -185.4359893799 890.9566802979 ) common/trigger 36.4860115051 22.6666526794 -1.8616751432 0.553583622 0.5806270838 0 0 0
+( -1992.6718902588 -142.9898834229 901.4912872314 ) ( -1822.3519592285 628.0935974121 550.8954772949 ) ( -1990.2513885498 -136.8898010254 916.0834197998 ) common/trigger 43.9748268127 63.2830429077 -25.7402610779 0.5398185849 0.5129211545 0 0 0
+}
+}
+// entity 5
+{
+"classname" "light"
+"origin" "2408 -792 2168"
+"light" "500"
+}
+// entity 6
+{
+"classname" "light"
+"origin" "1144 1832 1976"
+"light" "500"
+}
+// entity 7
+{
+"classname" "light"
+"origin" "1320 1424 1976"
+"light" "500"
+}
+// entity 8
+{
+"classname" "light"
+"origin" "1440 1008 1976"
+"light" "500"
+}
+// entity 9
+{
+"classname" "light"
+"origin" "1576 528 2024"
+"light" "500"
+}
+// entity 10
+{
+"classname" "light"
+"origin" "1784 96 2064"
+"light" "500"
+}
+// entity 11
+{
+"classname" "light"
+"origin" "2064 -344 2128"
+"light" "500"
+}
+// entity 12
+{
+"classname" "light"
+"origin" "896 1448 872"
+"light" "500"
+}
+// entity 13
+{
+"classname" "light"
+"origin" "3936 544 1440"
+"light" "500"
+}
+// entity 14
+{
+"classname" "light"
+"origin" "3432 808 1312"
+"light" "500"
+}
+// entity 15
+{
+"classname" "light"
+"origin" "2920 984 1224"
+"light" "500"
+}
+// entity 16
+{
+"classname" "light"
+"origin" "2368 1136 1104"
+"light" "500"
+}
+// entity 17
+{
+"classname" "light"
+"origin" "1848 1264 1008"
+"light" "500"
+}
+// entity 18
+{
+"classname" "light"
+"origin" "1432 1352 920"
+"light" "500"
+}
+// entity 19
+{
+"classname" "light"
+"origin" "-152 2712 2032"
+"light" "1500"
+}
+// entity 20
+{
+"classname" "light"
+"origin" "4600 -1064 2112"
+"light" "1500"
+}
+// entity 21
+{
+"classname" "light"
+"origin" "120 -2272 2280"
+"light" "1500"
+}
+// entity 22
+{
+"classname" "light"
+"origin" "-2032 -200 1256"
+"light" "1500"
+}
+// entity 23
+{
+"classname" "item_health_small"
+"origin" "-696 440 2152"
+}
+// entity 24
+{
+"classname" "item_health_small"
+"origin" "-152 -160 2152"
+}
+// entity 25
+{
+"classname" "item_health_small"
+"origin" "-216 -88 2152"
+}
+// entity 26
+{
+"classname" "item_health_small"
+"origin" "-280 -24 2152"
+}
+// entity 27
+{
+"classname" "item_health_small"
+"origin" "-352 64 2152"
+}
+// entity 28
+{
+"classname" "item_health_small"
+"origin" "-408 120 2152"
+}
+// entity 29
+{
+"classname" "item_health_small"
+"origin" "-456 176 2152"
+}
+// entity 30
+{
+"classname" "item_health_small"
+"origin" "-504 232 2152"
+}
+// entity 31
+{
+"classname" "item_health_small"
+"origin" "-568 296 2152"
+}
+// entity 32
+{
+"classname" "item_health_small"
+"origin" "-640 376 2152"
+}
+// entity 33
+{
+"classname" "weapon_electro"
+"origin" "-1392 1944 2000"
+}
+// entity 34
+{
+"classname" "item_armor_medium"
+"origin" "1832 328 1816"
+}
+// entity 35
+{
+"classname" "weapon_hagar"
+"origin" "3560 -1472 1960"
+}
+// entity 36
+{
+"classname" "item_health_large"
+"origin" "3368 664 1040"
+}
+// entity 37
+{
+"classname" "weapon_crylink"
+"origin" "3464 896 1040"
+}
+// entity 38
+{
+"classname" "weapon_uzi"
+"origin" "-272 1536 552"
+}
+// entity 39
+{
+"classname" "item_health_medium"
+"origin" "384 2424 1872"
+}
+// entity 40
+{
+"classname" "item_armor_small"
+"origin" "4688 -280 1592"
+}
+// entity 41
+{
+"classname" "item_armor_small"
+"origin" "4712 -728 1704"
+}
+// entity 42
+{
+"classname" "item_armor_small"
+"origin" "4736 -648 1680"
+}
+// entity 43
+{
+"classname" "item_armor_small"
+"origin" "4736 -560 1664"
+}
+// entity 44
+{
+"classname" "item_armor_small"
+"origin" "4736 -464 1640"
+}
+// entity 45
+{
+"classname" "item_armor_small"
+"origin" "4704 -376 1616"
+}
+// entity 46
+{
+"classname" "item_armor_small"
+"origin" "-2104 -32 904"
+}
+// entity 47
+{
+"classname" "item_armor_small"
+"origin" "-1992 568 696"
+}
+// entity 48
+{
+"classname" "item_armor_small"
+"origin" "-2024 472 736"
+}
+// entity 49
+{
+"classname" "item_armor_small"
+"origin" "-2056 368 744"
+}
+// entity 50
+{
+"classname" "item_armor_small"
+"origin" "-2072 288 792"
+}
+// entity 51
+{
+"classname" "item_armor_small"
+"origin" "-2096 176 792"
+}
+// entity 52
+{
+"classname" "item_armor_small"
+"origin" "-2104 72 832"
+}
+// entity 53
+{
+"classname" "weapon_grenadelauncher"
+"origin" "-1144 -2304 1960"
+}
+// entity 54
+{
+"classname" "trigger_race_checkpoint"
+"cnt" "0"
+"targetname" "finish"
+// brush 0
+{
+( -39.5352935791 -1769.8847503662 2664 ) ( 468.7110748291 -2722.8200073242 2664 ) ( -145.4169921875 -1826.3565673828 2664 ) common/trigger 7.5777893066 17.9038391113 28.0731525421 0.5 0.5 0 0 0
+( 0.4647064209 -1881.8847503662 2496 ) ( -105.4169921875 -1938.3565673828 2496 ) ( 0.4647064209 -1881.8847503662 1976 ) common/trigger 34.8744659424 48 0 0.5666701794 0.5 0 0 0
+( -79.5352935791 -1785.8847503662 2496 ) ( -79.5352935791 -1785.8847503662 1976 ) ( 428.7110748291 -2738.8200073242 2496 ) common/trigger 21.6214580536 48 0 0.5666701794 0.5 0 0 0
+( 362.8293762207 -2779.2918243408 1976 ) ( 468.7110748291 -2722.8200073242 1976 ) ( -145.4169921875 -1826.3565673828 1976 ) common/trigger 7.5777893066 17.9038391113 28.0731525421 0.5 0.5 0 0 0
+( 274.8293762207 -2635.2918243408 1976 ) ( 274.8293762207 -2635.2918243408 2496 ) ( 380.7110748291 -2578.8200073242 1976 ) common/trigger 4.7554168701 48 0 0.5666701794 0.5 0 0 0
+( 338.8293762207 -2771.2918243408 1976 ) ( -169.4169921875 -1818.3565673828 1976 ) ( 338.8293762207 -2771.2918243408 2496 ) common/trigger 43.2687797546 48 0 0.5666701794 0.5 0 0 0
+}
+}
+// entity 55
+{
+"classname" "info_player_race"
+"origin" "-760 -2712 2120"
+"angle" "8.43983"
+"race_place" "10"
+"target" "finish"
+}
+// entity 56
+{
+"classname" "info_player_race"
+"origin" "-56 -2384 2120"
+"angle" "28.8759"
+"race_place" "1"
+"target" "finish"
+}
+// entity 57
+{
+"classname" "info_player_race"
+"origin" "-96 -2544 2120"
+"angle" "28.8759"
+"race_place" "2"
+"target" "finish"
+}
+// entity 58
+{
+"classname" "info_player_race"
+"origin" "-192 -2360 2120"
+"angle" "28.8759"
+"race_place" "3"
+"target" "finish"
+}
+// entity 59
+{
+"classname" "info_player_race"
+"origin" "-256 -2608 2120"
+"angle" "28.8759"
+"race_place" "4"
+"target" "finish"
+}
+// entity 60
+{
+"classname" "info_player_race"
+"origin" "-336 -2400 2120"
+"angle" "28.8759"
+"race_place" "5"
+"target" "finish"
+}
+// entity 61
+{
+"classname" "info_player_race"
+"origin" "-496 -2440 2120"
+"angle" "20.5309"
+"race_place" "7"
+"target" "finish"
+}
+// entity 62
+{
+"classname" "info_player_race"
+"origin" "-432 -2672 2120"
+"angle" "20.5309"
+"race_place" "6"
+"target" "finish"
+}
+// entity 63
+{
+"classname" "info_player_race"
+"origin" "-624 -2448 2120"
+"angle" "20.5309"
+"race_place" "9"
+"target" "finish"
+}
+// entity 64
+{
+"classname" "info_player_race"
+"origin" "-600 -2696 2120"
+"angle" "20.5309"
+"race_place" "8"
+"target" "finish"
+}
+// entity 65
+{
+"classname" "info_player_race"
+"origin" "-904 -2680 2120"
+"angle" "5.38179"
+"race_place" "12"
+"target" "finish"
+}
+// entity 66
+{
+"classname" "info_player_race"
+"origin" "-768 -2448 2120"
+"angle" "20.5309"
+"race_place" "11"
+"target" "finish"
+}
+// entity 67
+{
+"classname" "trigger_race_checkpoint"
+"cnt" "1"
+"targetname" "cp1"
+// brush 0
+{
+( -61.7871551514 3285.9476928711 2392 ) ( -63.4424133301 2205.9489746094 2392 ) ( -181.7870178223 3286.1316223145 2392 ) common/trigger 5.6465148926 11.6982297897 -0.0878135562 0.5 0.5 0 0 0
+( -69.1151580811 3264.111907959 2224 ) ( -189.115020752 3264.2958221436 2224 ) ( -69.1151580811 3264.111907959 1704 ) common/trigger 56.3670310974 16 0 0.6350824237 0.5 0 0 0
+( -82.0361785889 3269.111907959 2224 ) ( -82.0361785889 3269.111907959 1704 ) ( -83.6914215088 2189.1131744385 2224 ) common/trigger 14.5520057678 16 0 0.6350824237 0.5 0 0 0
+( -183.4422607422 2206.1328887939 1704 ) ( -63.4424133301 2205.9489746094 1704 ) ( -181.7870178223 3286.1316223145 1704 ) common/trigger 5.6465148926 11.6982297897 -0.0878135562 0.5 0.5 0 0 0
+( -199.1115112305 2118.689956665 1704 ) ( -199.1115112305 2118.689956665 2224 ) ( -79.1116485596 2118.5060424805 1704 ) common/trigger 38.8484382629 16 0 0.6350824237 0.5 0 0 0
+( -215.4422607422 2206.1328887939 1704 ) ( -213.7870178223 3286.1316223145 1704 ) ( -215.4422607422 2206.1328887939 2224 ) common/trigger 59.3673248291 16 0 0.6350824237 0.5 0 0 0
+}
+}
+// entity 68
+{
+"classname" "info_player_race"
+"origin" "-672 2816 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 69
+{
+"classname" "info_player_race"
+"origin" "-448 2864 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 70
+{
+"classname" "info_player_race"
+"origin" "-448 2768 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 71
+{
+"classname" "info_player_race"
+"origin" "-440 2680 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 72
+{
+"classname" "info_player_race"
+"origin" "-432 2584 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 73
+{
+"classname" "info_player_race"
+"origin" "-672 2536 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 74
+{
+"classname" "info_player_race"
+"origin" "-672 2640 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 75
+{
+"classname" "info_player_race"
+"origin" "-664 2728 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 76
+{
+"classname" "info_player_race"
+"origin" "-560 2680 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 77
+{
+"classname" "info_player_race"
+"origin" "-552 2768 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 78
+{
+"classname" "info_player_race"
+"origin" "-560 2856 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 79
+{
+"classname" "info_player_race"
+"origin" "-560 2576 1824"
+"angle" "0.531739"
+"target" "cp1"
+}
+// entity 80
+{
+"classname" "trigger_race_checkpoint"
+"targetname" "cp2"
+"cnt" "2"
+// brush 0
+{
+( 4137.2494506836 -717.72605896 2424 ) ( 5118.4794311523 -1168.933013916 2424 ) ( 4087.1153411865 -826.7516174316 2424 ) common/trigger 23.2200832367 42.5259971619 65.3052215576 0.5 0.5 0 0 0
+( 4154.0509185791 -733.4808044434 2256 ) ( 4103.916809082 -842.506362915 2256 ) ( 4154.0509185791 -733.4808044434 1736 ) common/trigger 54.4435424805 16 0 0.6985179186 0.5 0 0 0
+( 4132.8645324707 -759.456237793 2256 ) ( 4132.8645324707 -759.456237793 1736 ) ( 5114.0945129395 -1210.663192749 2256 ) common/trigger 45.0993652344 16 0 -0.6985179186 0.5 0 0 0
+( 5068.3453369141 -1277.9585723877 1736 ) ( 5118.4794311523 -1168.933013916 1736 ) ( 4087.1153411865 -826.7516174316 1736 ) common/trigger 23.2200832367 42.5259971619 65.3052215576 0.5 0.5 0 0 0
+( 5117.3226318359 -1320.6152954102 1736 ) ( 5117.3226318359 -1320.6152954102 2256 ) ( 5167.456741333 -1211.5897369385 1736 ) common/trigger 25.4721679688 16 0 0.6985179186 0.5 0 0 0
+( 5052.3453369141 -1309.9585723877 1736 ) ( 4071.1153411865 -858.7516174316 1736 ) ( 5052.3453369141 -1309.9585723877 2256 ) common/trigger 56.7001953125 16 0 -0.6985179186 0.5 0 0 0
+}
+}
+// entity 81
+{
+"classname" "info_player_race"
+"origin" "4320 -1240 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 82
+{
+"classname" "info_player_race"
+"origin" "4376 -1296 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 83
+{
+"classname" "info_player_race"
+"origin" "4464 -1360 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 84
+{
+"classname" "info_player_race"
+"origin" "4536 -1424 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 85
+{
+"classname" "info_player_race"
+"origin" "4472 -1496 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 86
+{
+"classname" "info_player_race"
+"origin" "4392 -1424 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 87
+{
+"classname" "info_player_race"
+"origin" "4312 -1360 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 88
+{
+"classname" "info_player_race"
+"origin" "4256 -1304 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 89
+{
+"classname" "info_player_race"
+"origin" "4184 -1368 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 90
+{
+"classname" "info_player_race"
+"origin" "4248 -1440 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 91
+{
+"classname" "info_player_race"
+"origin" "4328 -1496 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 92
+{
+"classname" "info_player_race"
+"origin" "4400 -1568 2080"
+"angle" "40.3826"
+"target" "cp2"
+}
+// entity 93
+{
+"classname" "trigger_race_checkpoint"
+"targetname" "cp3"
+"cnt" "3"
+// brush 0
+{
+( -2638.4434814453 -101.7411651611 1520 ) ( -1558.7772369385 -74.8933410645 1520 ) ( -2635.4603881836 -221.7040710449 1520 ) common/trigger 8.2419624329 0.3149719238 91.4244613647 0.4999999702 0.4999999702 0 0 0
+( -2616.4219055176 -108.4903411865 1352 ) ( -2613.4388122559 -228.4532470703 1352 ) ( -2616.4219055176 -108.4903411865 832 ) common/trigger 36.2236671448 0 0 0.7779637575 0.5 0 0 0
+( -2627.8096008301 -129.733215332 1352 ) ( -2627.8096008301 -129.733215332 832 ) ( -1548.1433410645 -102.8854064941 1352 ) common/trigger 31.5328521729 0 0 -0.7779637575 0.5 0 0 0
+( -1555.7941436768 -194.856262207 832 ) ( -1558.7772369385 -74.8933410645 832 ) ( -2635.4603881836 -221.7040710449 832 ) common/trigger 8.2419624329 0.3149719238 91.4244613647 0.4999999702 0.4999999702 0 0 0
+( -1493.0391845703 -211.5950622559 832 ) ( -1493.0391845703 -211.5950622559 1352 ) ( -1496.022277832 -91.6321411133 832 ) common/trigger 7.2522315979 0 0 0.7779637575 0.5 0 0 0
+( -1555.7941436768 -234.856262207 832 ) ( -2635.4603881836 -261.7040710449 832 ) ( -1555.7941436768 -234.856262207 1352 ) common/trigger 24.9449615479 0 0 -0.7779637575 0.5 0 0 0
+}
+}
+// entity 94
+{
+"classname" "info_player_race"
+"origin" "-1544 888 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 95
+{
+"classname" "info_player_race"
+"origin" "-1760 1024 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 96
+{
+"classname" "info_player_race"
+"origin" "-1688 976 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 97
+{
+"classname" "info_player_race"
+"origin" "-1624 944 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 98
+{
+"classname" "info_player_race"
+"origin" "-1664 720 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 99
+{
+"classname" "info_player_race"
+"origin" "-1880 856 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 100
+{
+"classname" "info_player_race"
+"origin" "-1808 808 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 101
+{
+"classname" "info_player_race"
+"origin" "-1744 776 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 102
+{
+"classname" "info_player_race"
+"origin" "-1608 800 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 103
+{
+"classname" "info_player_race"
+"origin" "-1824 936 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 104
+{
+"classname" "info_player_race"
+"origin" "-1752 888 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 105
+{
+"classname" "info_player_race"
+"origin" "-1688 856 616"
+"angle" "-114.654"
+"target" "cp3"
+}
+// entity 106
+{
+"classname" "info_player_race"
+"origin" "-168 -2592 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 107
+{
+"classname" "info_player_race"
+"origin" "-304 -2360 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 108
+{
+"classname" "info_player_race"
+"origin" "-256 -2448 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 109
+{
+"classname" "info_player_race"
+"origin" "-208 -2528 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 110
+{
+"classname" "info_player_race"
+"origin" "-16 -2520 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 111
+{
+"classname" "info_player_race"
+"origin" "-152 -2288 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 112
+{
+"classname" "info_player_race"
+"origin" "-104 -2376 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 113
+{
+"classname" "info_player_race"
+"origin" "-56 -2456 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 114
+{
+"classname" "info_player_race"
+"origin" "-96 -2560 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 115
+{
+"classname" "info_player_race"
+"origin" "-232 -2328 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 116
+{
+"classname" "info_player_race"
+"origin" "-184 -2416 2432"
+"angle" "24.31"
+"target" "finish"
+}
+// entity 117
+{
+"classname" "info_player_race"
+"origin" "-136 -2496 2432"
+"angle" "24.31"
+"target" "finish"
+}

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

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

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

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

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

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

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

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

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

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

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

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

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0012.tga
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0013.tga
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0014.tga
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0015.tga
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0016.tga
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/maps/stormkeep/lm_0017.tga
===================================================================
(Binary files differ)

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

Modified: branches/nexuiz-2.0/data/maps/stormkeep.map
===================================================================
--- branches/nexuiz-2.0/data/maps/stormkeep.map	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/maps/stormkeep.map	2009-02-20 14:23:51 UTC (rev 5912)
@@ -5411,7 +5411,7 @@
 ( 1808 -400 -32 ) ( 1880 -400 -32 ) ( 1808 176 -32 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1864 -384 0 ) ( 1792 -384 0 ) ( 1792 192 0 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 -376 -160 ) ( 1856 200 -160 ) ( 1856 200 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1864 200 -160 ) ( 1792 200 -160 ) ( 1792 200 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1864 168 -160 ) ( 1792 168 -160 ) ( 1792 168 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1792 200 -160 ) ( 1792 -376 -160 ) ( 1792 -376 -168 ) e7/e7trimlight 0 0 0 0.5 0.5 0 0 0
 ( 1816 -960 -160 ) ( 1888 -960 -160 ) ( 1888 -960 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 }
@@ -5420,7 +5420,7 @@
 ( 1880 -400 -32 ) ( 1808 -400 -32 ) ( 1808 176 -32 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1816 -960 -160 ) ( 1888 -960 -160 ) ( 1888 -960 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1792 200 -160 ) ( 1792 -376 -160 ) ( 1792 -376 -168 ) e7/e7brickfloor01 0 0 0 0.5 0.5 0 0 0
-( 1864 200 -160 ) ( 1792 200 -160 ) ( 1792 200 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1864 168 -160 ) ( 1792 168 -160 ) ( 1792 168 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 -376 -160 ) ( 1856 200 -160 ) ( 1856 200 -168 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1808 -384 -160 ) ( 1880 -384 -160 ) ( 1808 192 -160 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 }
@@ -5428,7 +5428,7 @@
 {
 ( 1816 -960 -128 ) ( 1888 -960 -128 ) ( 1888 -960 -136 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1792 200 -128 ) ( 1792 -376 -128 ) ( 1792 -376 -136 ) e7/e7brickfloor01 0 0 0 0.5 0.5 0 0 0
-( 1864 200 -128 ) ( 1792 200 -128 ) ( 1792 200 -136 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1864 168 -128 ) ( 1792 168 -128 ) ( 1792 168 -136 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 -376 -128 ) ( 1856 200 -128 ) ( 1856 200 -136 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1864 -384 128 ) ( 1792 -384 128 ) ( 1792 192 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1808 -400 0 ) ( 1880 -400 0 ) ( 1808 176 0 ) common/caulk 0 0 0 0.5 0.5 0 4 0
@@ -5618,7 +5618,7 @@
 ( 1792 336 160 ) ( 1792 192 160 ) ( 1792 192 128 ) e7/e7bmtrim2 0 0 0 0.5 0.5 0 0 0
 ( 1856 576 160 ) ( 1792 576 160 ) ( 1792 576 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 192 160 ) ( 1856 336 160 ) ( 1856 336 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1792 192 160 ) ( 1856 192 160 ) ( 1856 192 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1792 168 160 ) ( 1856 168 160 ) ( 1856 168 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1792 192 160 ) ( 1792 336 160 ) ( 1856 336 160 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 336 128 ) ( 1792 336 128 ) ( 1792 192 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 }
@@ -10614,7 +10614,7 @@
 }
 // brush 1166
 {
-( 1536 600 -40 ) ( 1520 600 -40 ) ( 1520 576 -40 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1536 600 -48 ) ( 1520 600 -48 ) ( 1520 576 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1520 576 -32 ) ( 1520 600 -32 ) ( 1536 600 -32 ) e7/e7brnmetal 0 0 0 0.5 0.5 0 0 0
 ( 1512 560 -32 ) ( 1528 560 -32 ) ( 1528 560 -40 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1536 576 -32 ) ( 1536 600 -32 ) ( 1536 600 -40 ) common/caulk 0 0 0 0.5 0.5 0 4 0
@@ -10841,7 +10841,7 @@
 {
 ( 1856 264 -48 ) ( 1832 264 -48 ) ( 1832 168 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1832 168 128 ) ( 1832 264 128 ) ( 1856 264 128 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1832 200 96 ) ( 1856 200 96 ) ( 1856 200 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
+( 1840 168 96 ) ( 1864 168 96 ) ( 1864 168 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 168 128 ) ( 1856 264 128 ) ( 1856 264 -16 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1856 576 96 ) ( 1832 576 96 ) ( 1832 576 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 1832 264 96 ) ( 1832 168 96 ) ( 1832 168 -48 ) common/caulk 0 0 0 0.5 0.5 0 4 0
@@ -10974,15 +10974,6 @@
 }
 // brush 1206
 {
-( 1520 576 -32 ) ( 1520 560 -32 ) ( 1520 560 -64 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1536 576 -32 ) ( 1520 576 -32 ) ( 1520 576 -64 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1536 560 -32 ) ( 1536 576 -32 ) ( 1536 576 -64 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1520 560 -32 ) ( 1536 560 -32 ) ( 1536 560 -64 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-( 1520 560 -32 ) ( 1520 576 -32 ) ( 1536 576 -32 ) common/nodraw 0 0 0 0.5 0.5 0 12 0
-( 1536 576 -64 ) ( 1520 576 -64 ) ( 1520 560 -64 ) common/caulk 0 0 0 0.5 0.5 0 4 0
-}
-// brush 1207
-{
 ( 1024 -1232 680 ) ( 1024 -1240 680 ) ( 1024 -1240 312 ) harlequin_sky/jf-nebula_sky 0 0 0 0.5 0.5 0 0 0
 ( 1064 -1232 680 ) ( 1024 -1232 680 ) ( 1024 -1232 312 ) harlequin_sky/jf-nebula_sky 0 0 0 0.5 0.5 0 0 0
 ( 1064 -1240 680 ) ( 1064 -1232 680 ) ( 1064 -1232 312 ) harlequin_sky/jf-nebula_sky 0 0 0 0.5 0.5 0 0 0
@@ -10990,7 +10981,7 @@
 ( 1024 -1240 680 ) ( 1024 -1232 680 ) ( 1064 -1232 680 ) harlequin_sky/jf-nebula_sky 0 0 0 0.5 0.5 0 0 0
 ( 1064 -1232 312 ) ( 1024 -1232 312 ) ( 1024 -1240 312 ) harlequin_sky/jf-nebula_sky 0 0 0 0.5 0.5 0 0 0
 }
-// brush 1208
+// brush 1207
 {
 ( -448 -8 192 ) ( -448 -144 192 ) ( -448 -144 160 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 512 64 288 ) ( -448 64 288 ) ( -448 48 256 ) e7/e7trimlight -200 0 0 0.5 0.5 0 0 0
@@ -10999,7 +10990,7 @@
 ( 528 48 256 ) ( -448 48 256 ) ( -448 -8 256 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 ( 512 -144 288 ) ( 512 512 288 ) ( 576 -144 160 ) common/caulk 0 0 0 0.5 0.5 0 4 0
 }
-// brush 1209
+// brush 1208
 {
 ( -1208 896 96 ) ( -760 896 96 ) ( -760 896 64 ) e7/e7trimlight 0 0 0 0.5 0.5 0 0 0
 ( -960 944 96 ) ( -960 1200 96 ) ( -960 1200 64 ) e7/e7trimlight -80 0 0 0.5 0.5 0 0 0
@@ -11010,7 +11001,7 @@
 ( -968 1208 96 ) ( -968 1208 72 ) ( -960 1200 96 ) e7/e7trimlight -80 0 0 0.5 0.5 0 0 0
 ( -968 904 72 ) ( -968 904 96 ) ( -960 912 72 ) e7/e7trimlight 0 0 0 0.5 0.5 0 0 0
 }
-// brush 1210
+// brush 1209
 {
 ( 1280 -424 -192 ) ( 1280 -448 -192 ) ( 1344 -448 -192 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 ( 1344 -448 -160 ) ( 1280 -448 -160 ) ( 1280 -424 -160 ) evil8_floor/e8cretefloor01b 0 0 0 0.5 0.5 134217728 0 0
@@ -11020,7 +11011,7 @@
 ( 1280 -512 -64 ) ( 1352 -512 -64 ) ( 1352 -512 -320 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 ( 1368 -472 -168 ) ( 1368 -472 -320 ) ( 1368 -512 -320 ) e7/e7bmtrim2 0 0 0 0.5 0.5 134217728 0 0
 }
-// brush 1211
+// brush 1210
 {
 ( 1344 -512 -192 ) ( 1344 -448 -192 ) ( 1368 -512 -192 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 ( 1344 -448 -216 ) ( 1344 -512 -216 ) ( 1368 -512 -216 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
@@ -11030,7 +11021,7 @@
 ( 1280 -448 -64 ) ( 1280 -512 -64 ) ( 1280 -512 -320 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 ( 1280 -424 -320 ) ( 1320 -424 -320 ) ( 1320 -424 -168 ) e7/e7brickfloor01 0 0 0 0.5 0.5 134217728 0 0
 }
-// brush 1212
+// brush 1211
 {
 ( -168 -16 24 ) ( -160 -16 24 ) ( -168 -16 -40 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
 ( -176 -96 -48 ) ( -176 -80 -48 ) ( -176 -80 80 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
@@ -11039,7 +11030,7 @@
 ( -160 0 96 ) ( -288 0 96 ) ( -288 0 -32 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
 ( -160 -16 -32 ) ( -160 0 -32 ) ( -288 0 -32 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
 }
-// brush 1213
+// brush 1212
 {
 ( -168 -128 24 ) ( -176 -128 24 ) ( -168 -128 -40 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
 ( -176 -96 -48 ) ( -176 -80 -48 ) ( -176 -80 80 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
@@ -11048,7 +11039,7 @@
 ( -288 -144 -32 ) ( -288 -144 96 ) ( -160 -144 96 ) e7/e7brickfloor01 0 0 0 0.5 0.5 134217728 0 0
 ( -160 -16 -32 ) ( -160 0 -32 ) ( -288 0 -32 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 }
-// brush 1214
+// brush 1213
 {
 ( -280 -128 24 ) ( -288 -128 24 ) ( -280 -128 -40 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
 ( -272 -80 88 ) ( -272 -80 -40 ) ( -272 -96 -40 ) e7/e7brnmetal 0 0 0 0.5 0.5 134217728 0 0
@@ -11057,7 +11048,7 @@
 ( -288 -144 96 ) ( -160 -144 96 ) ( -160 -144 -32 ) e7/e7brickfloor01 0 0 0 0.5 0.5 134217728 0 0
 ( -160 0 -32 ) ( -288 0 -32 ) ( -288 -16 -32 ) common/caulk 0 0 0 0.5 0.5 134217728 4 0
 }
-// brush 1215
+// brush 1214
 {
 ( -1280 1528 -32 ) ( -1280 1560 -32 ) ( -1280 1528 0 ) common/caulk 0 0 0 0.5 0.5 0 0 0
 ( -1280 1528 -32 ) ( -1280 1528 0 ) ( -1232 1528 -32 ) common/caulk 0 0 0 0.5 0.5 0 0 0
@@ -11066,7 +11057,7 @@
 ( -1184 1664 0 ) ( -1232 1664 0 ) ( -1184 1664 -32 ) common/caulk 0 0 0 0.5 0.5 0 0 0
 ( -1232 1560 0 ) ( -1232 1528 0 ) ( -1280 1560 0 ) common/caulk 0 0 0 0.5 0.5 0 0 0
 }
-// brush 1216
+// brush 1215
 {
 ( -1216 1680 -32 ) ( -1216 1712 -32 ) ( -1216 1680 0 ) common/caulk 0 0 0 0.5 0.5 0 0 0
 ( -1216 1664 -32 ) ( -1216 1664 0 ) ( -1144 1664 -32 ) e7/e7bmtrim2 0 0 0 0.5 0.5 0 0 0
@@ -11087,45 +11078,13 @@
 e7/e7brnmetal
 ( 3 3 0 0 0 )
 (
-( ( 1536 560 -32 12 -4.375 ) ( 1536 568 -32 12 -4.4375 ) ( 1536 576 -32 12 -4.5 ) )
-( ( 1784 560 -32 13.9375 -4.375 ) ( 1784 560 -32 13.046875 -2.90625 ) ( 1804 576 -32 14.09375 -4.5 ) )
-( ( 1776 168 -32 13.875 -1.3125 ) ( 1784 168 -32 13.9375 -1.3125 ) ( 1792 168 -32 14 -1.3125 ) )
+( ( 1536 560 -32 22 -4.375 ) ( 1536 568 -32 22 -4.4375 ) ( 1536 576 -32 22 -4.5 ) )
+( ( 1784 560 -32 23.9375 -4.375 ) ( 1784 560 -32 23.9375 -4.375 ) ( 1804 576 -32 24.09375 -4.5 ) )
+( ( 1776 168 -32 23.875 -1.3125 ) ( 1784 168 -32 23.9375 -1.3125 ) ( 1792 168 -32 24 -1.3125 ) )
 )
 }
 }
-// brush 1
-{
-patchDef2
-{
-e7/e7brnmetal
-( 3 3 0 0 0 )
-(
-( ( 1536 576 -40 12 -4.5 ) ( 1536 568 -40 12 -4.4375 ) ( 1536 560 -40 12 -4.375 ) )
-( ( 1804 576 -40 14.09375 -4.5 ) ( 1804 576 -40 13.046875 -2.90625 ) ( 1784 560 -40 13.9375 -4.375 ) )
-( ( 1792 168 -40 14 -1.3125 ) ( 1784 168 -40 13.9375 -1.3125 ) ( 1776 168 -40 13.875 -1.3125 ) )
-)
 }
-}
-// brush 2
-{
-patchDef2
-{
-e7/e7brnmetal
-( 9 3 0 0 0 )
-(
-( ( 1536 560 -40 0 0.0625 ) ( 1536 560 -36 0 0.03125 ) ( 1536 560 -32 0 0 ) )
-( ( 1784 560 -40 0.53125 0.0625 ) ( 1784 560 -36 0.53125 0.03125 ) ( 1784 560 -32 0.53125 0 ) )
-( ( 1776 168 -40 1.0625 0.0625 ) ( 1776 168 -36 1.0625 0.03125 ) ( 1776 168 -32 1.0625 0 ) )
-( ( 1784 168 -40 1.125 0.0625 ) ( 1784 168 -36 1.125 0.03125 ) ( 1784 168 -32 1.125 0 ) )
-( ( 1792 168 -40 1.1875 0.0625 ) ( 1792 168 -36 1.1875 0.03125 ) ( 1792 168 -32 1.1875 0 ) )
-( ( 1804 576 -40 1.71875 0.0625 ) ( 1804 576 -36 1.71875 0.03125 ) ( 1804 576 -32 1.71875 0 ) )
-( ( 1536 576 -40 2.25 0.0625 ) ( 1536 576 -36 2.25 0.03125 ) ( 1536 576 -32 2.25 0 ) )
-( ( 1536 568 -40 2.3125 0.0625 ) ( 1536 568 -36 2.3125 0.03125 ) ( 1536 568 -32 2.3125 0 ) )
-( ( 1536 560 -40 2.375 0.0625 ) ( 1536 560 -36 2.375 0.03125 ) ( 1536 560 -32 2.375 0 ) )
-)
-}
-}
-}
 // entity 2
 {
 "classname" "func_group"
@@ -11137,33 +11096,15 @@
 evil8_floor/e8cretefloor01c
 ( 3 3 0 0 0 )
 (
-( ( 1536 168 -32 11.9375 -1.3125 ) ( 1536 168 -32 11.9375 -1.3125 ) ( 1536 168 -32 11.9375 -1.3125 ) )
-( ( 1536 168 -32 11.9375 -1.3125 ) ( 1536 168 -32 11.9375 -1.3125 ) ( 1536 168 -32 11.9375 -1.3125 ) )
-( ( 1776 168 -32 13.875 -1.3125 ) ( 1784 560 -32 13.9375 -4.375 ) ( 1536 560 -32 12 -4.375 ) )
+( ( 1536 168 -32 22 -1.3125 ) ( 1536 168 -32 22 -1.3125 ) ( 1536 168 -32 22 -1.3125 ) )
+( ( 1536 168 -32 22 -1.3125 ) ( 1536 168 -32 22 -1.3125 ) ( 1536 168 -32 22 -1.3125 ) )
+( ( 1776 168 -32 23.875 -1.3125 ) ( 1784 560 -32 23.9375 -4.375 ) ( 1536 560 -32 22 -4.375 ) )
 )
 }
 }
 }
 // entity 3
 {
-"classname" "func_group"
-"type" "patchCapped"
-// brush 0
-{
-patchDef2
-{
-common/caulk
-( 3 3 0 0 0 )
-(
-( ( 1536 560 -48 0 1 ) ( 1536 560 -40 0 0.5 ) ( 1536 560 -32 0 0 ) )
-( ( 1784 560 -48 6.25 1 ) ( 1784 560 -40 6.25 0.5 ) ( 1784 560 -32 6.25 0 ) )
-( ( 1776 168 -48 18.5 1 ) ( 1776 168 -40 18.5 0.5 ) ( 1776 168 -32 18.5 0 ) )
-)
-}
-}
-}
-// entity 4
-{
 "classname" "trigger_push"
 "target" "hagarjump"
 // brush 0
@@ -11176,285 +11117,285 @@
 ( -384 -776 -184 ) ( -512 -776 -184 ) ( -512 -904 -184 ) common/trigger 0 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 5
+// entity 4
 {
 "classname" "light"
 "origin" "-704 -912 -8"
 "light" "50"
 }
-// entity 6
+// entity 5
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "origin" "152 -616 -40"
 "light" "25"
 }
-// entity 7
+// entity 6
 {
 "classname" "light"
 "light" "25"
 "origin" "152 -600 -40"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 8
+// entity 7
 {
 "classname" "light"
 "origin" "1216 944 216"
 "light" "50"
 }
-// entity 9
+// entity 8
 {
 "classname" "light"
 "light" "20"
 "origin" "1256 1024 -16"
 }
-// entity 10
+// entity 9
 {
 "classname" "light"
 "light" "20"
 "origin" "1256 1152 -16"
 }
-// entity 11
+// entity 10
 {
 "classname" "light"
 "light" "20"
 "origin" "1176 1152 -16"
 }
-// entity 12
+// entity 11
 {
 "classname" "light"
 "light" "20"
 "origin" "1176 1024 -16"
 }
-// entity 13
+// entity 12
 {
 "classname" "light"
 "light" "50"
 "origin" "1760 216 272"
 }
-// entity 14
+// entity 13
 {
 "classname" "light"
 "light" "50"
 "origin" "1632 216 272"
 }
-// entity 15
+// entity 14
 {
 "classname" "light"
 "light" "50"
 "origin" "1504 216 272"
 }
-// entity 16
+// entity 15
 {
 "classname" "light"
 "light" "50"
 "origin" "1376 216 272"
 }
-// entity 17
+// entity 16
 {
 "classname" "light"
 "light" "50"
 "origin" "1248 216 272"
 }
-// entity 18
+// entity 17
 {
 "classname" "light"
 "light" "50"
 "origin" "1120 216 272"
 }
-// entity 19
+// entity 18
 {
 "classname" "light"
 "light" "50"
 "origin" "992 216 272"
 }
-// entity 20
+// entity 19
 {
 "classname" "light"
 "light" "50"
 "origin" "864 216 272"
 }
-// entity 21
+// entity 20
 {
 "classname" "light"
 "light" "50"
 "origin" "736 216 272"
 }
-// entity 22
+// entity 21
 {
 "classname" "light"
 "origin" "712 352 272"
 "light" "50"
 }
-// entity 23
+// entity 22
 {
 "classname" "light"
 "origin" "712 472 272"
 "light" "50"
 }
-// entity 24
+// entity 23
 {
 "classname" "light"
 "origin" "712 600 272"
 "light" "50"
 }
-// entity 25
+// entity 24
 {
 "classname" "light"
 "origin" "712 736 272"
 "light" "50"
 }
-// entity 26
+// entity 25
 {
 "classname" "light"
 "origin" "712 864 272"
 "light" "50"
 }
-// entity 27
+// entity 26
 {
 "classname" "light"
 "origin" "440 960 272"
 "light" "25"
 }
-// entity 28
+// entity 27
 {
 "classname" "light"
 "origin" "440 832 272"
 "light" "25"
 }
-// entity 29
+// entity 28
 {
 "classname" "light"
 "origin" "440 704 272"
 "light" "25"
 }
-// entity 30
+// entity 29
 {
 "classname" "light"
 "origin" "-544 968 272"
 "light" "100"
 }
-// entity 31
+// entity 30
 {
 "classname" "light"
 "origin" "-416 968 272"
 "light" "100"
 }
-// entity 32
+// entity 31
 {
 "classname" "light"
 "origin" "-376 960 272"
 "light" "25"
 }
-// entity 33
+// entity 32
 {
 "classname" "light"
 "origin" "-376 840 272"
 "light" "25"
 }
-// entity 34
+// entity 33
 {
 "classname" "light"
 "origin" "-376 704 272"
 "light" "25"
 }
-// entity 35
+// entity 34
 {
 "classname" "light"
 "origin" "1776 256 272"
 "light" "50"
 }
-// entity 36
+// entity 35
 {
 "classname" "light"
 "origin" "1760 368 272"
 "light" "50"
 }
-// entity 37
+// entity 36
 {
 "classname" "light"
 "origin" "1728 456 272"
 "light" "50"
 }
-// entity 38
+// entity 37
 {
 "classname" "light"
 "origin" "1672 520 272"
 "light" "50"
 }
-// entity 39
+// entity 38
 {
 "classname" "light"
 "origin" "1592 560 272"
 "light" "50"
 }
-// entity 40
+// entity 39
 {
 "classname" "light"
 "origin" "1016 952 272"
 "light" "50"
 }
-// entity 41
+// entity 40
 {
 "classname" "light"
 "origin" "1144 952 272"
 "light" "50"
 }
-// entity 42
+// entity 41
 {
 "classname" "light"
 "origin" "1528 600 272"
 "light" "50"
 }
-// entity 43
+// entity 42
 {
 "classname" "light"
 "origin" "1528 728 272"
 "light" "50"
 }
-// entity 44
+// entity 43
 {
 "classname" "light"
 "origin" "1528 856 272"
 "light" "50"
 }
-// entity 45
+// entity 44
 {
 "classname" "light"
 "origin" "1400 952 272"
 "light" "50"
 }
-// entity 46
+// entity 45
 {
 "classname" "light"
 "origin" "1272 952 272"
 "light" "50"
 }
-// entity 47
+// entity 46
 {
 "classname" "light"
 "origin" "1568 -504 -16"
 "light" "50"
 }
-// entity 48
+// entity 47
 {
 "classname" "light"
 "origin" "1440 -504 -16"
 "light" "50"
 }
-// entity 49
+// entity 48
 {
 "classname" "light"
 "origin" "1312 -504 -16"
 "light" "50"
 }
-// entity 50
+// entity 49
 {
 "classname" "light"
 "origin" "1272 -576 -16"
 "light" "20"
 }
-// entity 51
+// entity 50
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11504,157 +11445,157 @@
 }
 }
 }
-// entity 52
+// entity 51
 {
 "classname" "light"
 "origin" "1608 -576 -16"
 "light" "20"
 }
-// entity 53
+// entity 52
 {
 "classname" "light"
 "light" "20"
 "origin" "1336 -752 -16"
 }
-// entity 54
+// entity 53
 {
 "classname" "light"
 "light" "20"
 "origin" "1272 -672 -16"
 }
-// entity 55
+// entity 54
 {
 "classname" "light"
 "origin" "1608 -672 -16"
 "light" "20"
 }
-// entity 56
+// entity 55
 {
 "classname" "light"
 "origin" "1560 -752 -16"
 "light" "20"
 }
-// entity 57
+// entity 56
 {
 "classname" "light"
 "origin" "1440 -784 -16"
 "light" "20"
 }
-// entity 58
+// entity 57
 {
 "classname" "light"
 "light" "20"
 "origin" "1768 -696 -16"
 }
-// entity 59
+// entity 58
 {
 "classname" "light"
 "light" "20"
 "origin" "1744 -800 -16"
 }
-// entity 60
+// entity 59
 {
 "classname" "light"
 "origin" "1704 -864 -16"
 "light" "20"
 }
-// entity 61
+// entity 60
 {
 "classname" "light"
 "origin" "1624 -920 -16"
 "light" "20"
 }
-// entity 62
+// entity 61
 {
 "classname" "light"
 "origin" "1528 -944 -16"
 "light" "20"
 }
-// entity 63
+// entity 62
 {
 "classname" "light"
 "origin" "1408 -944 -16"
 "light" "20"
 }
-// entity 64
+// entity 63
 {
 "classname" "light"
 "origin" "1304 -936 -16"
 "light" "20"
 }
-// entity 65
+// entity 64
 {
 "classname" "light"
 "origin" "1216 -896 -16"
 "light" "20"
 }
-// entity 66
+// entity 65
 {
 "classname" "light"
 "origin" "1152 -824 -24"
 "light" "20"
 }
-// entity 67
+// entity 66
 {
 "classname" "light"
 "light" "20"
 "origin" "1120 -760 -16"
 }
-// entity 68
+// entity 67
 {
 "classname" "light"
 "origin" "1112 -696 -16"
 "light" "20"
 }
-// entity 69
+// entity 68
 {
 "classname" "light"
 "light" "20"
 "origin" "1104 -640 -16"
 }
-// entity 70
+// entity 69
 {
 "classname" "light"
 "light" "50"
 "origin" "1104 -416 -16"
 }
-// entity 71
+// entity 70
 {
 "classname" "light"
 "light" "50"
 "origin" "1104 -288 -16"
 }
-// entity 72
+// entity 71
 {
 "classname" "light"
 "light" "50"
 "origin" "1104 -160 -16"
 }
-// entity 73
+// entity 72
 {
 "classname" "light"
 "origin" "1104 -40 -16"
 "light" "50"
 }
-// entity 74
+// entity 73
 {
 "classname" "light"
 "origin" "1104 88 -16"
 "light" "50"
 }
-// entity 75
+// entity 74
 {
 "classname" "light"
 "origin" "1280 160 -16"
 "light" "50"
 }
-// entity 76
+// entity 75
 {
 "classname" "light"
 "origin" "1152 160 -16"
 "light" "50"
 }
-// entity 77
+// entity 76
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11665,14 +11606,14 @@
 e7/e7trimlight
 ( 3 3 0 0 0 )
 (
-( ( 1792 200 288 0 1 ) ( 1792 200 272 0 0.5 ) ( 1792 200 256 0 0 ) )
-( ( 1792 576 288 2.9375 1 ) ( 1792 576 272 2.9375 0.5 ) ( 1792 576 256 2.9375 0 ) )
-( ( 1536 576 288 4.9375 1 ) ( 1536 576 272 4.9375 0.5 ) ( 1536 576 256 4.9375 0 ) )
+( ( 1792 168 288 0 0 ) ( 1792 168 272 0 -0.5 ) ( 1792 168 256 0 -1 ) )
+( ( 1800 576 288 3.1875 0 ) ( 1800 576 272 3.1875 -0.5 ) ( 1800 576 256 3.1875 -1 ) )
+( ( 1536 576 288 5.1875 0 ) ( 1536 576 272 5.1875 -0.5 ) ( 1536 576 256 5.1875 -1 ) )
 )
 }
 }
 }
-// entity 78
+// entity 77
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11683,14 +11624,14 @@
 e7/e7brickfloor01
 ( 3 3 0 0 0 )
 (
-( ( 1792 200 256 0 0.78125 ) ( 1792 200 208 0 0.40625 ) ( 1792 200 160 0 0.03125 ) )
-( ( 1792 576 256 2.9375 0.78125 ) ( 1792 576 208 2.9375 0.40625 ) ( 1792 576 160 2.9375 0.03125 ) )
-( ( 1536 576 256 4.9375 0.78125 ) ( 1536 576 208 4.9375 0.40625 ) ( 1536 576 160 4.9375 0.03125 ) )
+( ( 1792 168 256 0 0 ) ( 1792 168 208 0 -0.375 ) ( 1792 168 160 0 -0.75 ) )
+( ( 1800 576 256 3.1875 0 ) ( 1800 576 208 3.1875 -0.375 ) ( 1800 576 160 3.1875 -0.75 ) )
+( ( 1536 576 256 5.1875 0 ) ( 1536 576 208 5.1875 -0.375 ) ( 1536 576 160 5.1875 -0.75 ) )
 )
 }
 }
 }
-// entity 79
+// entity 78
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11701,14 +11642,14 @@
 e7/e7bmtrim2
 ( 3 3 0 0 0 )
 (
-( ( 1792 200 160 0 1 ) ( 1792 200 144 0 0.5 ) ( 1792 200 128 0 0 ) )
-( ( 1792 576 160 2.9375 1 ) ( 1792 576 144 2.9375 0.5 ) ( 1792 576 128 2.9375 0 ) )
-( ( 1536 576 160 4.9375 1 ) ( 1536 576 144 4.9375 0.5 ) ( 1536 576 128 4.9375 0 ) )
+( ( 1792 168 160 0 0 ) ( 1792 168 144 0 -0.5 ) ( 1792 168 128 0 -1 ) )
+( ( 1800 576 160 3.1875 0 ) ( 1800 576 144 3.1875 -0.5 ) ( 1800 576 128 3.1875 -1 ) )
+( ( 1536 576 160 5.1875 0 ) ( 1536 576 144 5.1875 -0.5 ) ( 1536 576 128 5.1875 -1 ) )
 )
 }
 }
 }
-// entity 80
+// entity 79
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11719,14 +11660,14 @@
 e7/e7brickfloor01
 ( 3 3 0 0 0 )
 (
-( ( 1792 200 128 0 1 ) ( 1792 200 64 0 0.5 ) ( 1792 200 -0.000002 0 0 ) )
-( ( 1792 576 128 2.9375 1 ) ( 1792 576 64 2.9375 0.5 ) ( 1792 576 -0.000002 2.9375 0 ) )
-( ( 1536 576 128 4.9375 1 ) ( 1536 576 64 4.9375 0.5 ) ( 1536 576 -0.000002 4.9375 0 ) )
+( ( 1792 168 128 0 0 ) ( 1792 168 64 0 -0.5 ) ( 1792 168 -0.000002 0 -1 ) )
+( ( 1800 576 128 3.1875 0 ) ( 1800 576 64 3.1875 -0.5 ) ( 1800 576 -0.000002 3.1875 -1 ) )
+( ( 1536 576 128 5.1875 0 ) ( 1536 576 64 5.1875 -0.5 ) ( 1536 576 -0.000002 5.1875 -1 ) )
 )
 }
 }
 }
-// entity 81
+// entity 80
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -11734,321 +11675,295 @@
 {
 patchDef2
 {
-common/caulk
-( 3 3 0 0 0 )
-(
-( ( 1536 576 -32 48 -18 ) ( 1792 576 -32 56 -18 ) ( 1792 200 -32 56 -6.25 ) )
-( ( 1792 576 -32 56 -18 ) ( 1792 576 -32 56 -18 ) ( 1792 576 -32 56 -18 ) )
-( ( 1792 576 -32 56 -18 ) ( 1792 576 -32 56 -18 ) ( 1792 576 -32 56 -18 ) )
-)
-}
-}
-// brush 1
-{
-patchDef2
-{
-common/caulk
-( 3 3 0 0 0 )
-(
-( ( 1792 200 0 56 -6.25 ) ( 1792 576 0 56 -18 ) ( 1536 576 0 48 -18 ) )
-( ( 1792 576 0 56 -18 ) ( 1792 576 0 56 -18 ) ( 1792 576 0 56 -18 ) )
-( ( 1792 576 0 56 -18 ) ( 1792 576 0 56 -18 ) ( 1792 576 0 56 -18 ) )
-)
-}
-}
-// brush 2
-{
-patchDef2
-{
 e7/e7trimlight
 ( 3 3 0 0 0 )
 (
-( ( 1792 200 0 0.03125 1 ) ( 1792 200 -16 0.03125 0.5 ) ( 1792 200 -32 0.03125 0 ) )
-( ( 1792 576 0 2.96875 1 ) ( 1792 576 -16 2.96875 0.5 ) ( 1792 576 -32 2.96875 0 ) )
-( ( 1536 576 0 4.96875 1 ) ( 1536 576 -16 4.96875 0.5 ) ( 1536 576 -32 4.96875 0 ) )
+( ( 1792 168 0 0 0 ) ( 1792 168 -16 0 -0.5 ) ( 1792 168 -32 0 -1 ) )
+( ( 1800 576 0 3.1875 0 ) ( 1800 576 -16 3.1875 -0.5 ) ( 1800 576 -32 3.1875 -1 ) )
+( ( 1536 576 0 5.1875 0 ) ( 1536 576 -16 5.1875 -0.5 ) ( 1536 576 -32 5.1875 -1 ) )
 )
 }
 }
 }
-// entity 82
+// entity 81
 {
 "classname" "light"
 "light" "50"
 "origin" "-1048 -432 64"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 83
+// entity 82
 {
 "classname" "light"
 "origin" "-1064 -448 64"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 84
+// entity 83
 {
 "classname" "light"
 "light" "50"
 "origin" "-576 -912 -16"
 }
-// entity 85
+// entity 84
 {
 "classname" "light"
 "light" "50"
 "origin" "-448 -912 -16"
 }
-// entity 86
+// entity 85
 {
 "classname" "light"
 "origin" "-360 -832 -16"
 "light" "50"
 }
-// entity 87
+// entity 86
 {
 "classname" "light"
 "origin" "-360 -704 -16"
 "light" "50"
 }
-// entity 88
+// entity 87
 {
 "classname" "light"
 "origin" "-360 -576 -16"
 "light" "50"
 }
-// entity 89
+// entity 88
 {
 "classname" "light"
 "origin" "-360 -448 -16"
 "light" "50"
 }
-// entity 90
+// entity 89
 {
 "classname" "light"
 "origin" "-416 -408 -16"
 "light" "50"
 }
-// entity 91
+// entity 90
 {
 "classname" "light"
 "origin" "-544 -408 -16"
 "light" "50"
 }
-// entity 92
+// entity 91
 {
 "classname" "light"
 "light" "50"
 "origin" "-776 -288 -16"
 }
-// entity 93
+// entity 92
 {
 "classname" "light"
 "origin" "-864 -200 -16"
 "light" "50"
 }
-// entity 94
+// entity 93
 {
 "classname" "light"
 "origin" "-992 -200 -16"
 "light" "50"
 }
-// entity 95
+// entity 94
 {
 "classname" "light"
 "light" "50"
 "origin" "-1072 -200 -16"
 }
-// entity 96
+// entity 95
 {
 "classname" "light"
 "light" "50"
 "origin" "-1072 -328 -16"
 }
-// entity 97
+// entity 96
 {
 "classname" "light"
 "light" "50"
 "origin" "-1072 -456 -16"
 }
-// entity 98
+// entity 97
 {
 "classname" "light"
 "light" "50"
 "origin" "-1072 -584 -16"
 }
-// entity 99
+// entity 98
 {
 "classname" "light"
 "light" "50"
 "origin" "-1064 -680 -16"
 }
-// entity 100
+// entity 99
 {
 "classname" "light"
 "light" "50"
 "origin" "-936 -680 -16"
 }
-// entity 101
+// entity 100
 {
 "classname" "light"
 "light" "50"
 "origin" "-808 -680 -16"
 }
-// entity 102
+// entity 101
 {
 "classname" "light"
 "light" "50"
 "origin" "-568 -816 136"
 }
-// entity 103
+// entity 102
 {
 "classname" "light"
 "origin" "-568 -880 136"
 "light" "50"
 }
-// entity 104
+// entity 103
 {
 "classname" "light"
 "light" "50"
 "origin" "-568 -752 136"
 }
-// entity 105
+// entity 104
 {
 "classname" "light"
 "origin" "-568 -688 136"
 "light" "50"
 }
-// entity 106
+// entity 105
 {
 "classname" "light"
 "light" "50"
 "origin" "-568 -560 136"
 }
-// entity 107
+// entity 106
 {
 "classname" "light"
 "origin" "-568 -624 136"
 "light" "50"
 }
-// entity 108
+// entity 107
 {
 "classname" "light"
 "light" "50"
 "origin" "-568 -496 136"
 }
-// entity 109
+// entity 108
 {
 "classname" "light"
 "origin" "-568 -432 136"
 "light" "50"
 }
-// entity 110
+// entity 109
 {
 "classname" "light"
 "origin" "-224 -160 144"
 "light" "25"
 }
-// entity 111
+// entity 110
 {
 "classname" "light"
 "light" "25"
 "origin" "-120 -184 144"
 }
-// entity 112
+// entity 111
 {
 "classname" "light"
 "light" "25"
 "origin" "-120 -320 144"
 }
-// entity 113
+// entity 112
 {
 "classname" "light"
 "light" "25"
 "origin" "-224 -376 144"
 }
-// entity 114
+// entity 113
 {
 "classname" "light"
 "origin" "-328 -320 144"
 "light" "25"
 }
-// entity 115
+// entity 114
 {
 "classname" "light"
 "origin" "-328 -192 144"
 "light" "25"
 }
-// entity 116
+// entity 115
 {
 "classname" "light"
 "light" "25"
 "origin" "192 -160 -16"
 }
-// entity 117
+// entity 116
 {
 "classname" "light"
 "origin" "-64 -160 -16"
 "light" "25"
 }
-// entity 118
+// entity 117
 {
 "classname" "light"
 "origin" "64 -160 -16"
 "light" "25"
 }
-// entity 119
+// entity 118
 {
 "classname" "light"
 "light" "25"
 "origin" "96 -360 -16"
 }
-// entity 120
+// entity 119
 {
 "classname" "light"
 "light" "25"
 "origin" "-32 -360 -16"
 }
-// entity 121
+// entity 120
 {
 "classname" "light"
 "light" "25"
 "origin" "-160 -360 -16"
 }
-// entity 122
+// entity 121
 {
 "classname" "light"
 "light" "25"
 "origin" "-280 -360 -16"
 }
-// entity 123
+// entity 122
 {
 "classname" "light"
 "light" "25"
 "origin" "-304 -320 -16"
 }
-// entity 124
+// entity 123
 {
 "classname" "light"
 "origin" "-56 -64 -16"
 "light" "25"
 }
-// entity 125
+// entity 124
 {
 "classname" "light"
 "light" "25"
 "origin" "-32 -120 -16"
 }
-// entity 126
+// entity 125
 {
 "classname" "light"
 "origin" "96 -112 -16"
 "light" "25"
 }
-// entity 127
+// entity 126
 {
 "classname" "light"
 "light" "25"
 "origin" "120 -64 -16"
 }
-// entity 128
+// entity 127
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12098,7 +12013,7 @@
 }
 }
 }
-// entity 129
+// entity 128
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12148,7 +12063,7 @@
 }
 }
 }
-// entity 130
+// entity 129
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12198,7 +12113,7 @@
 }
 }
 }
-// entity 131
+// entity 130
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12248,7 +12163,7 @@
 }
 }
 }
-// entity 132
+// entity 131
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12298,151 +12213,151 @@
 }
 }
 }
-// entity 133
+// entity 132
 {
 "classname" "light"
 "light" "25"
 "origin" "448 -152 -16"
 }
-// entity 134
+// entity 133
 {
 "classname" "light"
 "light" "25"
 "origin" "576 -152 -16"
 }
-// entity 135
+// entity 134
 {
 "classname" "light"
 "light" "25"
 "origin" "704 -152 -16"
 }
-// entity 136
+// entity 135
 {
 "classname" "light"
 "origin" "760 -192 -16"
 "light" "25"
 }
-// entity 137
+// entity 136
 {
 "classname" "light"
 "origin" "752 -320 -16"
 "light" "25"
 }
-// entity 138
+// entity 137
 {
 "classname" "light"
 "origin" "752 -448 -16"
 "light" "25"
 }
-// entity 139
+// entity 138
 {
 "classname" "light"
 "origin" "760 -704 -16"
 "light" "25"
 }
-// entity 140
+// entity 139
 {
 "classname" "light"
 "origin" "760 -824 -16"
 "light" "25"
 }
-// entity 141
+// entity 140
 {
 "classname" "light"
 "light" "25"
 "origin" "760 -952 -16"
 }
-// entity 142
+// entity 141
 {
 "classname" "light"
 "origin" "704 -984 -16"
 "light" "25"
 }
-// entity 143
+// entity 142
 {
 "classname" "light"
 "origin" "576 -984 -16"
 "light" "25"
 }
-// entity 144
+// entity 143
 {
 "classname" "light"
 "origin" "448 -984 -16"
 "light" "25"
 }
-// entity 145
+// entity 144
 {
 "classname" "light"
 "origin" "320 -984 -16"
 "light" "25"
 }
-// entity 146
+// entity 145
 {
 "classname" "light"
 "origin" "192 -984 -16"
 "light" "25"
 }
-// entity 147
+// entity 146
 {
 "classname" "light"
 "origin" "200 -904 184"
 "light" "15"
 }
-// entity 148
+// entity 147
 {
 "classname" "light"
 "origin" "320 -904 184"
 "light" "15"
 }
-// entity 149
+// entity 148
 {
 "classname" "light"
 "origin" "448 -904 184"
 "light" "15"
 }
-// entity 150
+// entity 149
 {
 "classname" "light"
 "origin" "576 -904 184"
 "light" "15"
 }
-// entity 151
+// entity 150
 {
 "classname" "light"
 "origin" "704 -904 184"
 "light" "15"
 }
-// entity 152
+// entity 151
 {
 "classname" "light"
 "origin" "136 -960 -16"
 "light" "25"
 }
-// entity 153
+// entity 152
 {
 "classname" "light"
 "origin" "136 -832 -16"
 "light" "25"
 }
-// entity 154
+// entity 153
 {
 "classname" "light"
 "origin" "136 -704 -16"
 "light" "25"
 }
-// entity 155
+// entity 154
 {
 "classname" "light"
 "origin" "136 -576 -16"
 "light" "25"
 }
-// entity 156
+// entity 155
 {
 "classname" "light"
 "origin" "136 -448 -16"
 "light" "25"
 }
-// entity 157
+// entity 156
 {
 "classname" "trigger_push"
 "target" "strengthjump"
@@ -12460,7 +12375,7 @@
 ( 88 768 -24 ) ( 88 640 -24 ) ( -24 640 -24 ) common/trigger 0 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 158
+// entity 157
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12480,7 +12395,7 @@
 }
 }
 }
-// entity 159
+// entity 158
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12513,7 +12428,7 @@
 }
 }
 }
-// entity 160
+// entity 159
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12544,7 +12459,7 @@
 }
 }
 }
-// entity 161
+// entity 160
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12588,7 +12503,7 @@
 }
 }
 }
-// entity 162
+// entity 161
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12638,7 +12553,7 @@
 }
 }
 }
-// entity 163
+// entity 162
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12658,7 +12573,7 @@
 }
 }
 }
-// entity 164
+// entity 163
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -12678,553 +12593,553 @@
 }
 }
 }
-// entity 165
+// entity 164
 {
 "classname" "light"
 "light" "50"
 "origin" "32 712 -16"
 }
-// entity 166
+// entity 165
 {
 "classname" "light"
 "origin" "-496 152 -16"
 "light" "25"
 }
-// entity 167
+// entity 166
 {
 "classname" "light"
 "light" "25"
 "origin" "-80 624 -16"
 }
-// entity 168
+// entity 167
 {
 "classname" "light"
 "origin" "208 624 -16"
 "light" "25"
 }
-// entity 169
+// entity 168
 {
 "classname" "light"
 "light" "50"
 "origin" "1440 -496 72"
 }
-// entity 170
+// entity 169
 {
 "classname" "light"
 "light" "20"
 "origin" "1784 -576 -16"
 }
-// entity 171
+// entity 170
 {
 "classname" "light"
 "light" "20"
 "origin" "1784 -448 -16"
 }
-// entity 172
+// entity 171
 {
 "classname" "light"
 "light" "20"
 "origin" "1784 -320 -16"
 }
-// entity 173
+// entity 172
 {
 "classname" "light"
 "light" "20"
 "origin" "1784 -192 -16"
 }
-// entity 174
+// entity 173
 {
 "classname" "light"
 "light" "50"
 "origin" "1784 -64 -16"
 }
-// entity 175
+// entity 174
 {
 "classname" "light"
 "light" "50"
 "origin" "1784 64 -16"
 }
-// entity 176
+// entity 175
 {
 "classname" "light"
 "light" "20"
 "origin" "1784 192 -16"
 }
-// entity 177
+// entity 176
 {
 "classname" "light"
 "origin" "1776 256 -16"
 "light" "20"
 }
-// entity 178
+// entity 177
 {
 "classname" "light"
 "origin" "1760 368 -16"
 "light" "20"
 }
-// entity 179
+// entity 178
 {
 "classname" "light"
 "origin" "1728 456 -16"
 "light" "20"
 }
-// entity 180
+// entity 179
 {
 "classname" "light"
 "origin" "1672 520 -16"
 "light" "20"
 }
-// entity 181
+// entity 180
 {
 "classname" "light"
 "origin" "1592 560 -16"
 "light" "20"
 }
-// entity 182
+// entity 181
 {
 "classname" "light"
 "origin" "1528 648 -16"
 "light" "20"
 }
-// entity 183
+// entity 182
 {
 "classname" "light"
 "origin" "1528 776 -16"
 "light" "20"
 }
-// entity 184
+// entity 183
 {
 "classname" "light"
 "origin" "1528 904 -16"
 "light" "20"
 }
-// entity 185
+// entity 184
 {
 "classname" "light"
 "light" "20"
 "origin" "1504 936 -16"
 }
-// entity 186
+// entity 185
 {
 "classname" "light"
 "light" "20"
 "origin" "1376 936 -16"
 }
-// entity 187
+// entity 186
 {
 "classname" "light"
 "light" "100"
 "origin" "-160 784 272"
 }
-// entity 188
+// entity 187
 {
 "classname" "light"
 "origin" "-96 784 272"
 "light" "100"
 }
-// entity 189
+// entity 188
 {
 "classname" "light"
 "light" "100"
 "origin" "-32 784 272"
 }
-// entity 190
+// entity 189
 {
 "classname" "light"
 "origin" "32 784 272"
 "light" "100"
 }
-// entity 191
+// entity 190
 {
 "classname" "light"
 "light" "100"
 "origin" "96 784 272"
 }
-// entity 192
+// entity 191
 {
 "classname" "light"
 "origin" "160 784 272"
 "light" "100"
 }
-// entity 193
+// entity 192
 {
 "classname" "light"
 "light" "100"
 "origin" "224 784 272"
 }
-// entity 194
+// entity 193
 {
 "classname" "light"
 "light" "50"
 "origin" "1352 264 -16"
 }
-// entity 195
+// entity 194
 {
 "classname" "light"
 "origin" "1320 376 -16"
 "light" "20"
 }
-// entity 196
+// entity 195
 {
 "classname" "light"
 "light" "20"
 "origin" "732 200 -16"
 }
-// entity 197
+// entity 196
 {
 "classname" "light"
 "origin" "424 1392 272"
 "light" "50"
 }
-// entity 198
+// entity 197
 {
 "classname" "light"
 "light" "50"
 "origin" "576 1456 272"
 }
-// entity 199
+// entity 198
 {
 "classname" "light"
 "origin" "-1224 1392 64"
 "light" "10"
 }
-// entity 200
+// entity 199
 {
 "classname" "light"
 "light" "10"
 "origin" "-1224 1328 64"
 }
-// entity 201
+// entity 200
 {
 "classname" "light"
 "origin" "-1224 1264 64"
 "light" "10"
 }
-// entity 202
+// entity 201
 {
 "classname" "light"
 "light" "10"
 "origin" "-1184 1208 64"
 }
-// entity 203
+// entity 202
 {
 "classname" "light"
 "origin" "-1120 1208 64"
 "light" "10"
 }
-// entity 204
+// entity 203
 {
 "classname" "light"
 "light" "10"
 "origin" "-1056 1208 64"
 }
-// entity 205
+// entity 204
 {
 "classname" "light"
 "origin" "-992 1208 64"
 "light" "10"
 }
-// entity 206
+// entity 205
 {
 "classname" "light"
 "origin" "-552 1256 64"
 "light" "10"
 }
-// entity 207
+// entity 206
 {
 "classname" "light"
 "light" "10"
 "origin" "-552 1320 64"
 }
-// entity 208
+// entity 207
 {
 "classname" "light"
 "origin" "-552 1384 64"
 "light" "10"
 }
-// entity 209
+// entity 208
 {
 "classname" "light"
 "light" "10"
 "origin" "-552 1448 64"
 }
-// entity 210
+// entity 209
 {
 "classname" "light"
 "origin" "-552 1512 64"
 "light" "10"
 }
-// entity 211
+// entity 210
 {
 "classname" "light"
 "light" "10"
 "origin" "-552 1576 64"
 }
-// entity 212
+// entity 211
 {
 "classname" "light"
 "origin" "-552 1640 64"
 "light" "10"
 }
-// entity 213
+// entity 212
 {
 "classname" "light"
 "light" "10"
 "origin" "-624 1672 64"
 }
-// entity 214
+// entity 213
 {
 "classname" "light"
 "origin" "-688 1672 64"
 "light" "10"
 }
-// entity 215
+// entity 214
 {
 "classname" "light"
 "light" "10"
 "origin" "-752 1672 64"
 }
-// entity 216
+// entity 215
 {
 "classname" "light"
 "origin" "-816 1672 64"
 "light" "10"
 }
-// entity 217
+// entity 216
 {
 "classname" "light"
 "light" "10"
 "origin" "-880 1672 64"
 }
-// entity 218
+// entity 217
 {
 "classname" "light"
 "origin" "-944 1672 64"
 "light" "10"
 }
-// entity 219
+// entity 218
 {
 "classname" "light"
 "light" "10"
 "origin" "-1008 1672 64"
 }
-// entity 220
+// entity 219
 {
 "classname" "light"
 "origin" "-1072 1672 64"
 "light" "10"
 }
-// entity 221
+// entity 220
 {
 "classname" "light"
 "light" "10"
 "origin" "-1136 1672 64"
 }
-// entity 222
+// entity 221
 {
 "classname" "light"
 "origin" "-1200 1672 64"
 "light" "10"
 }
-// entity 223
+// entity 222
 {
 "classname" "light"
 "light" "10"
 "origin" "-1224 1648 64"
 }
-// entity 224
+// entity 223
 {
 "classname" "light"
 "origin" "-1224 1584 64"
 "light" "10"
 }
-// entity 225
+// entity 224
 {
 "classname" "light"
 "light" "10"
 "origin" "-1224 1520 64"
 }
-// entity 226
+// entity 225
 {
 "classname" "light"
 "origin" "-1224 1456 64"
 "light" "10"
 }
-// entity 227
+// entity 226
 {
 "classname" "light"
 "origin" "-1208 1512 -16"
 "light" "25"
 }
-// entity 228
+// entity 227
 {
 "classname" "light"
 "light" "25"
 "origin" "-928 1656 -16"
 }
-// entity 229
+// entity 228
 {
 "classname" "light"
 "light" "25"
 "origin" "-800 1656 -16"
 }
-// entity 230
+// entity 229
 {
 "classname" "light"
 "light" "25"
 "origin" "-672 1656 -16"
 }
-// entity 231
+// entity 230
 {
 "classname" "light"
 "light" "25"
 "origin" "-584 1632 -16"
 }
-// entity 232
+// entity 231
 {
 "classname" "light"
 "light" "25"
 "origin" "-584 1504 -16"
 }
-// entity 233
+// entity 232
 {
 "classname" "light"
 "light" "25"
 "origin" "-584 1376 -16"
 }
-// entity 234
+// entity 233
 {
 "classname" "light"
 "light" "25"
 "origin" "-584 1248 -16"
 }
-// entity 235
+// entity 234
 {
 "classname" "light"
 "light" "25"
 "origin" "-992 1224 -16"
 }
-// entity 236
+// entity 235
 {
 "classname" "light"
 "origin" "-1056 1224 -16"
 "light" "25"
 }
-// entity 237
+// entity 236
 {
 "classname" "light"
 "origin" "-1184 1224 -16"
 "light" "25"
 }
-// entity 238
+// entity 237
 {
 "classname" "light"
 "light" "25"
 "origin" "-1208 1256 -16"
 }
-// entity 239
+// entity 238
 {
 "classname" "light"
 "light" "25"
 "origin" "-1208 1384 -16"
 }
-// entity 240
+// entity 239
 {
 "classname" "light"
 "light" "25"
 "origin" "-952 1128 -16"
 }
-// entity 241
+// entity 240
 {
 "classname" "light"
 "light" "25"
 "origin" "-952 1008 -16"
 }
-// entity 242
+// entity 241
 {
 "classname" "light"
 "light" "25"
 "origin" "-664 984 -16"
 }
-// entity 243
+// entity 242
 {
 "classname" "light"
 "light" "25"
 "origin" "-536 984 -16"
 }
-// entity 244
+// entity 243
 {
 "classname" "light"
 "light" "25"
 "origin" "-408 984 -16"
 }
-// entity 245
+// entity 244
 {
 "classname" "light"
 "light" "25"
 "origin" "-296 872 -16"
 }
-// entity 246
+// entity 245
 {
 "classname" "light"
 "light" "10"
 "origin" "-520 1232 64"
 }
-// entity 247
+// entity 246
 {
 "classname" "light"
 "origin" "-488 1240 64"
 "light" "10"
 }
-// entity 248
+// entity 247
 {
 "classname" "light"
 "light" "50"
 "origin" "-1120 1064 192"
 }
-// entity 249
+// entity 248
 {
 "classname" "light"
 "origin" "-1120 1296 192"
 "light" "50"
 }
-// entity 250
+// entity 249
 {
 "classname" "light"
 "light" "50"
 "origin" "-1120 1480 192"
 }
-// entity 251
+// entity 250
 {
 "classname" "light"
 "origin" "1080 264 -16"
 "light" "50"
 }
-// entity 252
+// entity 251
 {
 "classname" "light"
 "light" "20"
 "origin" "1088 936 -16"
 }
-// entity 253
+// entity 252
 {
 "classname" "light"
 "light" "20"
 "origin" "960 936 -16"
 }
-// entity 254
+// entity 253
 {
 "classname" "light"
 "light" "50"
 "origin" "1528 952 272"
 }
-// entity 255
+// entity 254
 {
 "classname" "light"
 "light" "50"
 "origin" "712 400 -16"
 }
-// entity 256
+// entity 255
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13257,7 +13172,7 @@
 }
 }
 }
-// entity 257
+// entity 256
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13281,7 +13196,7 @@
 }
 }
 }
-// entity 258
+// entity 257
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13299,7 +13214,7 @@
 }
 }
 }
-// entity 259
+// entity 258
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13317,7 +13232,7 @@
 }
 }
 }
-// entity 260
+// entity 259
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13337,7 +13252,7 @@
 }
 }
 }
-// entity 261
+// entity 260
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13355,7 +13270,7 @@
 }
 }
 }
-// entity 262
+// entity 261
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13373,7 +13288,7 @@
 }
 }
 }
-// entity 263
+// entity 262
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13391,7 +13306,7 @@
 }
 }
 }
-// entity 264
+// entity 263
 {
 "classname" "func_group"
 "type" "patchCapped"
@@ -13409,27 +13324,27 @@
 }
 }
 }
-// entity 265
+// entity 264
 {
 "classname" "light"
 "origin" "-288 -184 -16"
 "light" "25"
 }
-// entity 266
+// entity 265
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "origin" "-872 872 120"
 "light" "25"
 }
-// entity 267
+// entity 266
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "light" "25"
 "origin" "-856 872 120"
 }
-// entity 268
+// entity 267
 {
 "classname" "trigger_push"
 "target" "crylinkjump"
@@ -13443,85 +13358,85 @@
 ( -1200 1664 0 ) ( -1200 1664 8 ) ( -1200 1528 -32 ) common/trigger 0 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 269
+// entity 268
 {
 "classname" "light"
 "origin" "-120 848 -16"
 "light" "25"
 }
-// entity 270
+// entity 269
 {
 "classname" "light"
 "light" "25"
 "origin" "-120 984 -16"
 }
-// entity 271
+// entity 270
 {
 "classname" "light"
 "origin" "-120 1112 -16"
 "light" "25"
 }
-// entity 272
+// entity 271
 {
 "classname" "light"
 "light" "25"
 "origin" "-24 1176 -16"
 }
-// entity 273
+// entity 272
 {
 "classname" "light"
 "origin" "96 1176 -16"
 "light" "25"
 }
-// entity 274
+// entity 273
 {
 "classname" "light"
 "light" "25"
 "origin" "200 1304 -16"
 }
-// entity 275
+// entity 274
 {
 "classname" "light"
 "origin" "112 1392 -16"
 "light" "25"
 }
-// entity 276
+// entity 275
 {
 "classname" "light"
 "light" "25"
 "origin" "-16 1392 -16"
 }
-// entity 277
+// entity 276
 {
 "classname" "light"
 "origin" "-144 1392 -16"
 "light" "25"
 }
-// entity 278
+// entity 277
 {
 "classname" "light"
 "light" "25"
 "origin" "-272 1392 -16"
 }
-// entity 279
+// entity 278
 {
 "classname" "light"
 "origin" "-400 1392 -16"
 "light" "25"
 }
-// entity 280
+// entity 279
 {
 "classname" "light"
 "light" "25"
 "origin" "-448 1312 -16"
 }
-// entity 281
+// entity 280
 {
 "classname" "light"
 "origin" "-520 1208 -16"
 "light" "25"
 }
-// entity 282
+// entity 281
 {
 "classname" "trigger_push"
 "target" "electrojump"
@@ -13535,1311 +13450,1311 @@
 ( 1024 1248 0 ) ( 1024 1376 0 ) ( 1024 1248 -32 ) common/trigger 0 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 283
+// entity 282
 {
 "classname" "light"
 "light" "20"
 "origin" "1376 1360 -24"
 }
-// entity 284
+// entity 283
 {
 "classname" "light"
 "origin" "1376 1272 -24"
 "light" "20"
 }
-// entity 285
+// entity 284
 {
 "classname" "light"
 "light" "20"
 "origin" "1304 1384 -16"
 }
-// entity 286
+// entity 285
 {
 "classname" "light"
 "origin" "1184 1384 -16"
 "light" "20"
 }
-// entity 287
+// entity 286
 {
 "classname" "light"
 "light" "20"
 "origin" "1048 1384 -16"
 }
-// entity 288
+// entity 287
 {
 "classname" "light"
 "origin" "928 1384 -16"
 "light" "20"
 }
-// entity 289
+// entity 288
 {
 "classname" "light"
 "light" "20"
 "origin" "920 1312 -16"
 }
-// entity 290
+// entity 289
 {
 "classname" "light"
 "light" "20"
 "origin" "928 1240 -16"
 }
-// entity 291
+// entity 290
 {
 "classname" "light"
 "origin" "1048 1240 -16"
 "light" "20"
 }
-// entity 292
+// entity 291
 {
 "classname" "light"
 "light" "20"
 "origin" "1312 1240 -24"
 }
-// entity 293
+// entity 292
 {
 "classname" "light"
 "origin" "232 -24 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 294
+// entity 293
 {
 "classname" "light"
 "light" "25"
 "origin" "232 -72 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 295
+// entity 294
 {
 "classname" "light"
 "origin" "232 -120 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 296
+// entity 295
 {
 "classname" "light"
 "light" "25"
 "origin" "344 -120 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 297
+// entity 296
 {
 "classname" "light"
 "origin" "344 -72 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 298
+// entity 297
 {
 "classname" "light"
 "light" "25"
 "origin" "344 -24 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 299
+// entity 298
 {
 "classname" "light"
 "light" "25"
 "origin" "-168 -120 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 300
+// entity 299
 {
 "classname" "light"
 "origin" "-168 -72 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 301
+// entity 300
 {
 "classname" "light"
 "light" "25"
 "origin" "-168 -24 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 302
+// entity 301
 {
 "classname" "light"
 "origin" "-280 -24 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 303
+// entity 302
 {
 "classname" "light"
 "light" "25"
 "origin" "-280 -72 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 304
+// entity 303
 {
 "classname" "light"
 "origin" "-280 -120 -16"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 305
+// entity 304
 {
 "classname" "light"
 "light" "50"
 "origin" "0 -360 112"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 306
+// entity 305
 {
 "classname" "light"
 "origin" "-60 -359 112"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 307
+// entity 306
 {
 "classname" "light"
 "light" "50"
 "origin" "60 -361 112"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 308
+// entity 307
 {
 "classname" "light"
 "origin" "60 -169 112"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 309
+// entity 308
 {
 "classname" "light"
 "light" "50"
 "origin" "-60 -167 112"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 310
+// entity 309
 {
 "classname" "light"
 "origin" "0 -168 112"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 311
+// entity 310
 {
 "classname" "light"
 "light" "50"
 "origin" "-168 -376 -40"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 312
+// entity 311
 {
 "classname" "light"
 "origin" "-280 -376 -40"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 313
+// entity 312
 {
 "classname" "light"
 "light" "50"
 "origin" "-264 664 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 314
+// entity 313
 {
 "classname" "light"
 "origin" "-264 712 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 315
+// entity 314
 {
 "classname" "light"
 "light" "50"
 "origin" "-264 760 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 316
+// entity 315
 {
 "classname" "light"
 "origin" "-152 760 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 317
+// entity 316
 {
 "classname" "light"
 "light" "50"
 "origin" "-152 712 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 318
+// entity 317
 {
 "classname" "light"
 "origin" "-152 664 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 319
+// entity 318
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "light" "50"
 "origin" "600 232 -16"
 }
-// entity 320
+// entity 319
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "origin" "640 232 -16"
 "light" "50"
 }
-// entity 321
+// entity 320
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "light" "50"
 "origin" "680 232 -16"
 }
-// entity 322
+// entity 321
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "origin" "680 344 -16"
 "light" "50"
 }
-// entity 323
+// entity 322
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "light" "50"
 "origin" "640 344 -16"
 }
-// entity 324
+// entity 323
 {
 "classname" "light"
 "_color" "0.455000 0.560000 0.620000"
 "origin" "600 344 -16"
 "light" "50"
 }
-// entity 325
+// entity 324
 {
 "classname" "light"
 "light" "50"
 "origin" "824 -632 -16"
 "_color" "0.73 0.79 0.84"
 }
-// entity 326
+// entity 325
 {
 "classname" "light"
 "origin" "872 -632 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 327
+// entity 326
 {
 "classname" "light"
 "light" "50"
 "origin" "920 -632 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 328
+// entity 327
 {
 "classname" "light"
 "origin" "968 -632 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 329
+// entity 328
 {
 "classname" "light"
 "light" "50"
 "origin" "1016 -632 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 330
+// entity 329
 {
 "classname" "light"
 "origin" "1064 -632 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 331
+// entity 330
 {
 "classname" "light"
 "light" "50"
 "origin" "1064 -520 -16"
 "_color" "0.73 0.79 0.84"
 }
-// entity 332
+// entity 331
 {
 "classname" "light"
 "origin" "1016 -520 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 333
+// entity 332
 {
 "classname" "light"
 "light" "50"
 "origin" "968 -520 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 334
+// entity 333
 {
 "classname" "light"
 "origin" "920 -520 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 335
+// entity 334
 {
 "classname" "light"
 "light" "50"
 "origin" "872 -520 -16"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 336
+// entity 335
 {
 "classname" "light"
 "origin" "824 -520 -16"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 337
+// entity 336
 {
 "classname" "light"
 "origin" "-224 448 576"
 "light" "50"
 }
-// entity 338
+// entity 337
 {
 "classname" "light"
 "light" "50"
 "origin" "-224 280 576"
 }
-// entity 339
+// entity 338
 {
 "classname" "light"
 "light" "50"
 "origin" "-56 448 576"
 }
-// entity 340
+// entity 339
 {
 "classname" "light"
 "origin" "-56 280 576"
 "light" "50"
 }
-// entity 341
+// entity 340
 {
 "classname" "light"
 "origin" "144 448 576"
 "light" "50"
 }
-// entity 342
+// entity 341
 {
 "classname" "light"
 "light" "50"
 "origin" "144 280 576"
 }
-// entity 343
+// entity 342
 {
 "classname" "light"
 "light" "50"
 "origin" "352 448 576"
 }
-// entity 344
+// entity 343
 {
 "classname" "light"
 "origin" "352 280 576"
 "light" "50"
 }
-// entity 345
+// entity 344
 {
 "classname" "light"
 "light" "15"
 "origin" "200 -768 184"
 }
-// entity 346
+// entity 345
 {
 "classname" "light"
 "light" "15"
 "origin" "320 -768 184"
 }
-// entity 347
+// entity 346
 {
 "classname" "light"
 "light" "15"
 "origin" "448 -768 184"
 }
-// entity 348
+// entity 347
 {
 "classname" "light"
 "light" "15"
 "origin" "576 -768 184"
 }
-// entity 349
+// entity 348
 {
 "classname" "light"
 "light" "15"
 "origin" "704 -768 184"
 }
-// entity 350
+// entity 349
 {
 "classname" "light"
 "origin" "200 -640 184"
 "light" "15"
 }
-// entity 351
+// entity 350
 {
 "classname" "light"
 "origin" "320 -640 184"
 "light" "15"
 }
-// entity 352
+// entity 351
 {
 "classname" "light"
 "origin" "448 -640 184"
 "light" "15"
 }
-// entity 353
+// entity 352
 {
 "classname" "light"
 "origin" "576 -640 184"
 "light" "15"
 }
-// entity 354
+// entity 353
 {
 "classname" "light"
 "origin" "704 -640 184"
 "light" "15"
 }
-// entity 355
+// entity 354
 {
 "classname" "light"
 "light" "15"
 "origin" "200 -512 184"
 }
-// entity 356
+// entity 355
 {
 "classname" "light"
 "light" "15"
 "origin" "320 -512 184"
 }
-// entity 357
+// entity 356
 {
 "classname" "light"
 "light" "15"
 "origin" "448 -512 184"
 }
-// entity 358
+// entity 357
 {
 "classname" "light"
 "light" "15"
 "origin" "576 -512 184"
 }
-// entity 359
+// entity 358
 {
 "classname" "light"
 "light" "15"
 "origin" "704 -512 184"
 }
-// entity 360
+// entity 359
 {
 "classname" "light"
 "origin" "200 -384 184"
 "light" "15"
 }
-// entity 361
+// entity 360
 {
 "classname" "light"
 "origin" "320 -384 184"
 "light" "15"
 }
-// entity 362
+// entity 361
 {
 "classname" "light"
 "origin" "448 -384 184"
 "light" "15"
 }
-// entity 363
+// entity 362
 {
 "classname" "light"
 "origin" "576 -384 184"
 "light" "15"
 }
-// entity 364
+// entity 363
 {
 "classname" "light"
 "origin" "704 -384 184"
 "light" "15"
 }
-// entity 365
+// entity 364
 {
 "classname" "light"
 "light" "15"
 "origin" "200 -288 184"
 }
-// entity 366
+// entity 365
 {
 "classname" "light"
 "light" "15"
 "origin" "320 -288 184"
 }
-// entity 367
+// entity 366
 {
 "classname" "light"
 "light" "15"
 "origin" "448 -288 184"
 }
-// entity 368
+// entity 367
 {
 "classname" "light"
 "light" "15"
 "origin" "576 -288 184"
 }
-// entity 369
+// entity 368
 {
 "classname" "light"
 "light" "15"
 "origin" "704 -288 184"
 }
-// entity 370
+// entity 369
 {
 "classname" "light"
 "origin" "440 -648 -48"
 "light" "50"
 }
-// entity 371
+// entity 370
 {
 "classname" "light"
 "origin" "288 -256 -168"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 372
+// entity 371
 {
 "classname" "light"
 "origin" "-224 -800 -112"
 "light" "50"
 }
-// entity 373
+// entity 372
 {
 "classname" "light"
 "light" "50"
 "origin" "-224 -608 -112"
 }
-// entity 374
+// entity 373
 {
 "classname" "light"
 "light" "20"
 "origin" "904 868 -16"
 }
-// entity 375
+// entity 374
 {
 "classname" "light"
 "light" "20"
 "origin" "904 704 -16"
 }
-// entity 376
+// entity 375
 {
 "classname" "light"
 "light" "20"
 "origin" "904 576 -16"
 }
-// entity 377
+// entity 376
 {
 "classname" "light"
 "origin" "232 -592 536"
 "light" "50"
 }
-// entity 378
+// entity 377
 {
 "classname" "light"
 "light" "50"
 "origin" "480 -600 536"
 }
-// entity 379
+// entity 378
 {
 "classname" "light"
 "origin" "736 -600 536"
 "light" "50"
 }
-// entity 380
+// entity 379
 {
 "classname" "light"
 "light" "50"
 "origin" "232 -288 536"
 }
-// entity 381
+// entity 380
 {
 "classname" "light"
 "origin" "480 -296 536"
 "light" "50"
 }
-// entity 382
+// entity 381
 {
 "classname" "light"
 "light" "50"
 "origin" "736 -296 536"
 }
-// entity 383
+// entity 382
 {
 "classname" "light"
 "origin" "192 -776 536"
 "light" "50"
 }
-// entity 384
+// entity 383
 {
 "classname" "light"
 "light" "50"
 "origin" "440 -784 536"
 }
-// entity 385
+// entity 384
 {
 "classname" "light"
 "origin" "696 -784 536"
 "light" "50"
 }
-// entity 386
+// entity 385
 {
 "classname" "light"
 "origin" "-40 -32 -72"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 387
+// entity 386
 {
 "classname" "light"
 "light" "25"
 "origin" "-40 -72 -72"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 388
+// entity 387
 {
 "classname" "light"
 "origin" "-40 -112 -72"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 389
+// entity 388
 {
 "classname" "light"
 "light" "25"
 "origin" "104 -32 -72"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 390
+// entity 389
 {
 "classname" "light"
 "origin" "104 -72 -72"
 "light" "25"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 391
+// entity 390
 {
 "classname" "light"
 "light" "25"
 "origin" "104 -112 -72"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 392
+// entity 391
 {
 "classname" "light"
 "origin" "440 552 264"
 "light" "25"
 }
-// entity 393
+// entity 392
 {
 "classname" "light"
 "light" "25"
 "origin" "504 448 272"
 }
-// entity 394
+// entity 393
 {
 "classname" "light"
 "origin" "504 320 272"
 "light" "25"
 }
-// entity 395
+// entity 394
 {
 "classname" "light"
 "light" "25"
 "origin" "504 192 272"
 }
-// entity 396
+// entity 395
 {
 "classname" "light"
 "origin" "416 72 272"
 "light" "25"
 }
-// entity 397
+// entity 396
 {
 "classname" "light"
 "light" "25"
 "origin" "288 72 272"
 }
-// entity 398
+// entity 397
 {
 "classname" "light"
 "origin" "168 72 272"
 "light" "25"
 }
-// entity 399
+// entity 398
 {
 "classname" "light"
 "light" "25"
 "origin" "32 72 272"
 }
-// entity 400
+// entity 399
 {
 "classname" "light"
 "origin" "-96 72 272"
 "light" "25"
 }
-// entity 401
+// entity 400
 {
 "classname" "light"
 "light" "25"
 "origin" "-216 72 272"
 }
-// entity 402
+// entity 401
 {
 "classname" "light"
 "origin" "-344 72 272"
 "light" "25"
 }
-// entity 403
+// entity 402
 {
 "classname" "light"
 "light" "25"
 "origin" "-424 192 272"
 }
-// entity 404
+// entity 403
 {
 "classname" "light"
 "origin" "-424 320 272"
 "light" "25"
 }
-// entity 405
+// entity 404
 {
 "classname" "light"
 "light" "25"
 "origin" "-424 448 272"
 }
-// entity 406
+// entity 405
 {
 "classname" "light"
 "light" "50"
 "origin" "800 1400 272"
 }
-// entity 407
+// entity 406
 {
 "classname" "light"
 "origin" "928 1400 272"
 "light" "50"
 }
-// entity 408
+// entity 407
 {
 "classname" "light"
 "light" "50"
 "origin" "1056 1400 272"
 }
-// entity 409
+// entity 408
 {
 "classname" "light"
 "origin" "1088 1304 272"
 "light" "50"
 }
-// entity 410
+// entity 409
 {
 "classname" "light"
 "light" "50"
 "origin" "1064 1232 272"
 }
-// entity 411
+// entity 410
 {
 "classname" "light"
 "origin" "936 1224 272"
 "light" "50"
 }
-// entity 412
+// entity 411
 {
 "classname" "light"
 "light" "25"
 "origin" "904 1168 272"
 }
-// entity 413
+// entity 412
 {
 "classname" "light"
 "origin" "904 1032 272"
 "light" "25"
 }
-// entity 414
+// entity 413
 {
 "classname" "light"
 "light" "50"
 "origin" "288 1392 272"
 }
-// entity 415
+// entity 414
 {
 "classname" "light"
 "origin" "168 1392 272"
 "light" "50"
 }
-// entity 416
+// entity 415
 {
 "classname" "light"
 "light" "50"
 "origin" "40 1392 272"
 }
-// entity 417
+// entity 416
 {
 "classname" "light"
 "origin" "-88 1392 272"
 "light" "50"
 }
-// entity 418
+// entity 417
 {
 "classname" "light"
 "light" "50"
 "origin" "-216 1392 272"
 }
-// entity 419
+// entity 418
 {
 "classname" "light"
 "origin" "-344 1392 272"
 "light" "50"
 }
-// entity 420
+// entity 419
 {
 "classname" "light"
 "light" "50"
 "origin" "-480 1368 272"
 }
-// entity 421
+// entity 420
 {
 "classname" "light"
 "origin" "-520 1232 272"
 "light" "50"
 }
-// entity 422
+// entity 421
 {
 "classname" "light"
 "light" "50"
 "origin" "-672 1192 272"
 }
-// entity 423
+// entity 422
 {
 "classname" "light"
 "origin" "-752 1120 272"
 "light" "25"
 }
-// entity 424
+// entity 423
 {
 "classname" "light"
 "light" "25"
 "origin" "-752 992 272"
 }
-// entity 425
+// entity 424
 {
 "classname" "light"
 "light" "10"
 "origin" "-968 1152 64"
 }
-// entity 426
+// entity 425
 {
 "classname" "light"
 "origin" "-968 1088 64"
 "light" "10"
 }
-// entity 427
+// entity 426
 {
 "classname" "light"
 "light" "10"
 "origin" "-968 1024 64"
 }
-// entity 428
+// entity 427
 {
 "classname" "light"
 "origin" "-968 960 64"
 "light" "10"
 }
-// entity 429
+// entity 428
 {
 "classname" "light"
 "light" "10"
 "origin" "-968 896 64"
 }
-// entity 430
+// entity 429
 {
 "classname" "light"
 "origin" "-1288 864 64"
 "light" "10"
 }
-// entity 431
+// entity 430
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 800 64"
 }
-// entity 432
+// entity 431
 {
 "classname" "light"
 "origin" "-1288 736 64"
 "light" "10"
 }
-// entity 433
+// entity 432
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 672 64"
 }
-// entity 434
+// entity 433
 {
 "classname" "light"
 "origin" "-1288 608 64"
 "light" "10"
 }
-// entity 435
+// entity 434
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 544 64"
 }
-// entity 436
+// entity 435
 {
 "classname" "light"
 "origin" "-1288 480 64"
 "light" "10"
 }
-// entity 437
+// entity 436
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 416 64"
 }
-// entity 438
+// entity 437
 {
 "classname" "light"
 "origin" "-1288 352 64"
 "light" "10"
 }
-// entity 439
+// entity 438
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 288 64"
 }
-// entity 440
+// entity 439
 {
 "classname" "light"
 "origin" "-1288 224 64"
 "light" "10"
 }
-// entity 441
+// entity 440
 {
 "classname" "light"
 "light" "10"
 "origin" "-1288 160 64"
 }
-// entity 442
+// entity 441
 {
 "classname" "light"
 "origin" "-1288 96 64"
 "light" "10"
 }
-// entity 443
+// entity 442
 {
 "classname" "light"
 "light" "10"
 "origin" "-1248 904 64"
 }
-// entity 444
+// entity 443
 {
 "classname" "light"
 "origin" "-1184 904 64"
 "light" "10"
 }
-// entity 445
+// entity 444
 {
 "classname" "light"
 "light" "10"
 "origin" "-1120 904 64"
 }
-// entity 446
+// entity 445
 {
 "classname" "light"
 "origin" "-1056 904 64"
 "light" "10"
 }
-// entity 447
+// entity 446
 {
 "classname" "light"
 "light" "10"
 "origin" "-1000 904 64"
 }
-// entity 448
+// entity 447
 {
 "classname" "light"
 "light" "10"
 "origin" "-480 1312 64"
 }
-// entity 449
+// entity 448
 {
 "classname" "light"
 "origin" "-480 1376 64"
 "light" "10"
 }
-// entity 450
+// entity 449
 {
 "classname" "light"
 "light" "10"
 "origin" "-424 1416 64"
 }
-// entity 451
+// entity 450
 {
 "classname" "light"
 "origin" "-480 1416 64"
 "light" "10"
 }
-// entity 452
+// entity 451
 {
 "classname" "light"
 "origin" "-352 1416 64"
 "light" "10"
 }
-// entity 453
+// entity 452
 {
 "classname" "light"
 "origin" "-288 1416 64"
 "light" "10"
 }
-// entity 454
+// entity 453
 {
 "classname" "light"
 "light" "10"
 "origin" "-224 1416 64"
 }
-// entity 455
+// entity 454
 {
 "classname" "light"
 "origin" "-160 1416 64"
 "light" "10"
 }
-// entity 456
+// entity 455
 {
 "classname" "light"
 "origin" "-96 1416 64"
 "light" "10"
 }
-// entity 457
+// entity 456
 {
 "classname" "light"
 "light" "10"
 "origin" "-32 1416 64"
 }
-// entity 458
+// entity 457
 {
 "classname" "light"
 "light" "10"
 "origin" "32 1416 64"
 }
-// entity 459
+// entity 458
 {
 "classname" "light"
 "origin" "96 1416 64"
 "light" "10"
 }
-// entity 460
+// entity 459
 {
 "classname" "light"
 "origin" "160 1416 64"
 "light" "10"
 }
-// entity 461
+// entity 460
 {
 "classname" "light"
 "light" "10"
 "origin" "224 1416 64"
 }
-// entity 462
+// entity 461
 {
 "classname" "light"
 "origin" "232 1384 64"
 "light" "10"
 }
-// entity 463
+// entity 462
 {
 "classname" "light"
 "light" "10"
 "origin" "232 1320 64"
 }
-// entity 464
+// entity 463
 {
 "classname" "light"
 "origin" "232 1256 64"
 "light" "10"
 }
-// entity 465
+// entity 464
 {
 "classname" "light"
 "light" "10"
 "origin" "216 1200 64"
 }
-// entity 466
+// entity 465
 {
 "classname" "light"
 "origin" "160 1144 64"
 "light" "10"
 }
-// entity 467
+// entity 466
 {
 "classname" "light"
 "light" "10"
 "origin" "104 1144 64"
 }
-// entity 468
+// entity 467
 {
 "classname" "light"
 "origin" "40 1144 64"
 "light" "10"
 }
-// entity 469
+// entity 468
 {
 "classname" "light"
 "light" "10"
 "origin" "-24 1144 64"
 }
-// entity 470
+// entity 469
 {
 "classname" "light"
 "origin" "-88 1144 64"
 "light" "10"
 }
-// entity 471
+// entity 470
 {
 "classname" "light"
 "light" "10"
 "origin" "-88 1072 64"
 }
-// entity 472
+// entity 471
 {
 "classname" "light"
 "origin" "-88 1008 64"
 "light" "10"
 }
-// entity 473
+// entity 472
 {
 "classname" "light"
 "light" "10"
 "origin" "-88 944 64"
 }
-// entity 474
+// entity 473
 {
 "classname" "light"
 "origin" "-88 880 64"
 "light" "10"
 }
-// entity 475
+// entity 474
 {
 "classname" "light"
 "light" "10"
 "origin" "-88 824 64"
 }
-// entity 476
+// entity 475
 {
 "classname" "light"
 "origin" "-1224 1208 64"
 "light" "10"
 }
-// entity 477
+// entity 476
 {
 "classname" "light"
 "origin" "-568 1672 64"
 "light" "10"
 }
-// entity 478
+// entity 477
 {
 "classname" "light"
 "origin" "-992 -800 144"
 "light" "50"
 }
-// entity 479
+// entity 478
 {
 "classname" "light"
 "origin" "-480 1264 64"
 "light" "10"
 }
-// entity 480
+// entity 479
 {
 "classname" "light"
 "origin" "-600 -128 184"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 481
+// entity 480
 {
 "classname" "light"
 "light" "50"
 "origin" "-600 -160 184"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 482
+// entity 481
 {
 "classname" "light"
 "light" "50"
 "origin" "-744 -128 184"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 483
+// entity 482
 {
 "classname" "light"
 "origin" "-744 -160 184"
 "light" "50"
 "_color" "0.455000 0.560000 0.620000"
 }
-// entity 484
+// entity 483
 {
 "classname" "light"
 "light" "50"
 "origin" "288 -256 -112"
 "_color" "0.73 0.79 0.84"
 }
-// entity 485
+// entity 484
 {
 "classname" "misc_model"
 "model" "models/mapobjects/morphed_tele/telepad.ase"
 "origin" "1208 288 -32"
 }
-// entity 486
+// entity 485
 {
 "classname" "misc_model"
 "model" "models/mapobjects/morphed_tele/telepad.ase"
 "origin" "-656 224 16"
 }
-// entity 487
+// entity 486
 {
 "classname" "light"
 "origin" "1136 280 -16"
 "light" "50"
 }
-// entity 488
+// entity 487
 {
 "classname" "light"
 "light" "50"
 "origin" "1216 200 -16"
 }
-// entity 489
+// entity 488
 {
 "classname" "light"
 "origin" "1296 280 -16"
 "light" "50"
 }
-// entity 490
+// entity 489
 {
 "classname" "light"
 "origin" "-640 224 40"
 "light" "100"
 }
-// entity 491
+// entity 490
 {
 "classname" "trigger_teleport"
 "target" "tele1"
@@ -14853,7 +14768,7 @@
 ( -640 296 16 ) ( -664 296 16 ) ( -664 144 16 ) common/trigger 0 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 492
+// entity 491
 {
 "classname" "trigger_teleport"
 "target" "tele2"
@@ -14867,429 +14782,429 @@
 ( 1304 280 104 ) ( 1152 280 104 ) ( 1152 280 -32 ) common/trigger 16 0 0 0.5 0.5 0 7 0
 }
 }
-// entity 493
+// entity 492
 {
 "classname" "item_strength"
 "origin" "32 456 -8"
 }
-// entity 494
+// entity 493
 {
 "classname" "target_position"
 "targetname" "crylinkjump"
 "origin" "-1120 1240 216"
 }
-// entity 495
+// entity 494
 {
 "classname" "item_armor1"
 "origin" "-936 1128 8"
 }
-// entity 496
+// entity 495
 {
 "classname" "item_armor1"
 "origin" "-936 1176 8"
 }
-// entity 497
+// entity 496
 {
 "classname" "item_health25"
 "origin" "-1256 640 -24"
 }
-// entity 498
+// entity 497
 {
 "classname" "item_rockets"
 "origin" "-1256 784 -24"
 }
-// entity 499
+// entity 498
 {
 "classname" "weapon_grenadelauncher"
 "origin" "288 -256 -152"
 }
-// entity 500
+// entity 499
 {
 "classname" "weapon_crylink"
 "origin" "-1120 968 144"
 }
-// entity 501
+// entity 500
 {
 "classname" "item_health25"
 "angle" "180"
 "origin" "176 1240 -16"
 }
-// entity 502
+// entity 501
 {
 "classname" "item_health25"
 "angle" "180"
 "origin" "176 1336 -16"
 }
-// entity 503
+// entity 502
 {
 "classname" "target_position"
 "targetname" "electrojump"
 "origin" "920 1312 192"
 }
-// entity 504
+// entity 503
 {
 "classname" "target_position"
 "targetname" "hagarjump"
 "origin" "-472 -840 16"
 }
-// entity 505
+// entity 504
 {
 "classname" "info_player_deathmatch"
 "origin" "-200 464 24"
 }
-// entity 506
+// entity 505
 {
 "classname" "weapon_hagar"
 "origin" "-992 -800 88"
 }
-// entity 507
+// entity 506
 {
 "classname" "item_armor25"
 "origin" "-924 -144 88"
 }
-// entity 508
+// entity 507
 {
 "classname" "target_position"
 "origin" "32 712 216"
 "targetname" "strengthjump"
 }
-// entity 509
+// entity 508
 {
 "classname" "item_armor1"
 "origin" "1760 304 -16"
 }
-// entity 510
+// entity 509
 {
 "classname" "item_armor1"
 "origin" "1752 360 -16"
 }
-// entity 511
+// entity 510
 {
 "classname" "item_armor1"
 "origin" "1735 416 -16"
 }
-// entity 512
+// entity 511
 {
 "classname" "item_armor1"
 "origin" "1704 472 -16"
 }
-// entity 513
+// entity 512
 {
 "classname" "item_armor1"
-"origin" "1656 520 -16"
+"origin" "1652.000000 516.000000 -16.000000"
 }
-// entity 514
+// entity 513
 {
 "classname" "item_health100"
 "origin" "1696 -264 -16"
 }
-// entity 515
+// entity 514
 {
 "classname" "weapon_rocketlauncher"
 "origin" "1344 -128 -144"
 }
-// entity 516
+// entity 515
 {
 "classname" "item_cells"
 "origin" "528 1448 144"
 }
-// entity 517
+// entity 516
 {
 "classname" "item_cells"
 "origin" "608 1448 144"
 }
-// entity 518
+// entity 517
 {
 "classname" "item_health25"
 "origin" "-408 -448 -8"
 }
-// entity 519
+// entity 518
 {
 "classname" "item_health25"
 "origin" "-464 -448 -8"
 }
-// entity 520
+// entity 519
 {
 "classname" "func_sparks"
 "origin" "-472 40 -8"
 }
-// entity 521
+// entity 520
 {
 "classname" "item_rockets"
 "angle" "90"
 "origin" "1304 -488 -144"
 }
-// entity 522
+// entity 521
 {
 "classname" "weapon_electro"
 "origin" "1368 1312 8"
 }
-// entity 523
+// entity 522
 {
 "classname" "item_cells"
 "origin" "1024 896 -16"
 }
-// entity 524
+// entity 523
 {
 "classname" "item_cells"
 "origin" "1408 896 -16"
 }
-// entity 525
+// entity 524
 {
 "classname" "item_armor1"
 "origin" "1208 -752 0"
 }
-// entity 526
+// entity 525
 {
 "classname" "item_armor1"
 "origin" "1280 -824 0"
 }
-// entity 527
+// entity 526
 {
 "classname" "item_armor1"
 "origin" "1376 -872 0"
 }
-// entity 528
+// entity 527
 {
 "classname" "item_armor1"
 "origin" "1512 -872 0"
 }
-// entity 529
+// entity 528
 {
 "classname" "item_armor1"
 "origin" "1608 -824 0"
 }
-// entity 530
+// entity 529
 {
 "classname" "item_armor1"
 "origin" "1664 -776 0"
 }
-// entity 531
+// entity 530
 {
 "classname" "item_armor1"
 "origin" "1704 -712 0"
 }
-// entity 532
+// entity 531
 {
 "classname" "item_health25"
 "angle" "135"
 "origin" "568 -800 -128"
 }
-// entity 533
+// entity 532
 {
 "classname" "item_health25"
 "origin" "200 -800 -128"
 "angle" "45"
 }
-// entity 534
+// entity 533
 {
 "classname" "item_rockets"
 "angle" "135"
 "origin" "16 -256 -176"
 }
-// entity 535
+// entity 534
 {
 "classname" "item_rockets"
 "angle" "315"
 "origin" "-240 -256 -176"
 }
-// entity 536
+// entity 535
 {
 "classname" "item_health25"
 "angle" "270"
 "origin" "-920 1624 8"
 }
-// entity 537
+// entity 536
 {
 "classname" "item_health25"
 "angle" "270"
 "origin" "-824 1624 8"
 }
-// entity 538
+// entity 537
 {
 "classname" "weapon_nex"
 "origin" "32 -24 24"
 }
-// entity 539
+// entity 538
 {
 "classname" "item_health1"
 "origin" "-464 200 32"
 }
-// entity 540
+// entity 539
 {
 "classname" "item_health1"
 "origin" "-464 264 32"
 }
-// entity 541
+// entity 540
 {
 "classname" "item_health1"
 "origin" "-464 328 32"
 }
-// entity 542
+// entity 541
 {
 "classname" "item_health1"
 "origin" "-464 392 32"
 }
-// entity 543
+// entity 542
 {
 "classname" "item_health1"
 "origin" "-464 456 32"
 }
-// entity 544
+// entity 543
 {
 "classname" "item_health1"
 "origin" "192 -920 8"
 }
-// entity 545
+// entity 544
 {
 "classname" "item_health1"
 "origin" "256 -920 8"
 }
-// entity 546
+// entity 545
 {
 "classname" "item_health1"
 "origin" "320 -920 8"
 }
-// entity 547
+// entity 546
 {
 "classname" "item_health1"
 "origin" "384 -920 8"
 }
-// entity 548
+// entity 547
 {
 "classname" "item_health1"
 "origin" "448 -920 8"
 }
-// entity 549
+// entity 548
 {
 "classname" "item_health1"
 "origin" "512 -920 8"
 }
-// entity 550
+// entity 549
 {
 "classname" "item_health1"
 "origin" "576 -920 8"
 }
-// entity 551
+// entity 550
 {
 "classname" "item_health1"
 "origin" "640 -920 8"
 }
-// entity 552
+// entity 551
 {
 "classname" "item_armor1"
 "origin" "-936 1032 8"
 }
-// entity 553
+// entity 552
 {
 "classname" "item_armor1"
 "origin" "-936 1080 8"
 }
-// entity 554
+// entity 553
 {
 "classname" "item_armor1"
 "origin" "-936 936 8"
 }
-// entity 555
+// entity 554
 {
 "classname" "item_armor1"
 "origin" "-936 984 8"
 }
-// entity 556
+// entity 555
 {
 "classname" "item_cells"
 "origin" "480 -808 -128"
 }
-// entity 557
+// entity 556
 {
 "classname" "item_cells"
 "origin" "256 -808 -128"
 }
-// entity 558
+// entity 557
 {
 "classname" "item_cells"
 "origin" "-288 1344 16"
 }
-// entity 559
+// entity 558
 {
 "classname" "item_cells"
 "origin" "-192 1344 16"
 }
-// entity 560
+// entity 559
 {
 "classname" "item_cells"
 "origin" "-96 1344 16"
 }
-// entity 561
+// entity 560
 {
 "classname" "item_rockets"
 "origin" "-1056 -384 -24"
 }
-// entity 562
+// entity 561
 {
 "classname" "item_rockets"
 "origin" "-1056 -576 -24"
 }
-// entity 563
+// entity 562
 {
 "classname" "info_player_deathmatch"
 "origin" "536 1336 200"
 }
-// entity 564
+// entity 563
 {
 "classname" "info_player_deathmatch"
 "origin" "-80 -240 40"
 }
-// entity 565
+// entity 564
 {
 "classname" "info_player_deathmatch"
 "angle" "315"
 "origin" "960 888 40"
 }
-// entity 566
+// entity 565
 {
 "classname" "info_player_deathmatch"
 "angle" "270"
 "origin" "-672 1032 192"
 }
-// entity 567
+// entity 566
 {
 "classname" "info_player_deathmatch"
 "origin" "-1040 -448 8"
 }
-// entity 568
+// entity 567
 {
 "classname" "info_player_deathmatch"
 "angle" "315"
 "origin" "1144 120 -120"
 }
-// entity 569
+// entity 568
 {
 "classname" "misc_teleporter_dest"
 "targetname" "tele1"
 "angle" "90"
 "origin" "1216 312 0"
 }
-// entity 570
+// entity 569
 {
 "classname" "misc_teleporter_dest"
 "targetname" "tele2"
 "origin" "-704 232 40"
 "angle" "180"
 }
-// entity 571
+// entity 570
 {
 "classname" "info_player_deathmatch"
 "angle" "315"
 "origin" "1144 120 -120"
 }
-// entity 572
+// entity 571
 {
 "classname" "dom_team"
 "model" "models/domination/dom_unclaimed.md3"
 "origin" "0 152 192"
 }
-// entity 573
+// entity 572
 {
 "classname" "dom_team"
 "netname" "^4Blue Team^3"
@@ -15300,7 +15215,7 @@
 "model" "models/domination/dom_blue.md3"
 "origin" "0 152 160"
 }
-// entity 574
+// entity 573
 {
 "classname" "dom_team"
 "netname" "^1Red Team^3"
@@ -15311,7 +15226,7 @@
 "model" "models/domination/dom_red.md3"
 "origin" "0 152 128"
 }
-// entity 575
+// entity 574
 {
 "classname" "dom_team"
 "netname" "^6Pink Team^3"
@@ -15322,7 +15237,7 @@
 "model" "models/domination/dom_pink.md3"
 "origin" "0 152 96"
 }
-// entity 576
+// entity 575
 {
 "classname" "dom_controlpoint"
 "message" " has captured the ^1Hallways"
@@ -15330,7 +15245,7 @@
 "frags" "3"
 "wait" "5"
 }
-// entity 577
+// entity 576
 {
 "classname" "dom_controlpoint"
 "message" " has captured the ^1Lavaroom"
@@ -15338,7 +15253,7 @@
 "frags" "1"
 "wait" "5"
 }
-// entity 578
+// entity 577
 {
 "classname" "dom_controlpoint"
 "message" " controls the ^1Nex & Strength"
@@ -15346,7 +15261,7 @@
 "frags" "1"
 "wait" "5"
 }
-// entity 579
+// entity 578
 {
 "classname" "dom_controlpoint"
 "message" " has captured the ^1Upper Platform"
@@ -15354,7 +15269,7 @@
 "frags" "1"
 "wait" "5"
 }
-// entity 580
+// entity 579
 {
 "classname" "dom_controlpoint"
 "message" " has captured the ^1Teleport Room"
@@ -15362,103 +15277,103 @@
 "frags" "1"
 "wait" "5"
 }
-// entity 581
+// entity 580
 {
 "classname" "light"
 "origin" "416 12 -16"
 "light" "25"
 }
-// entity 582
+// entity 581
 {
 "classname" "light"
 "origin" "-496 400 -16"
 "light" "25"
 }
-// entity 583
+// entity 582
 {
 "classname" "light"
 "origin" "-496 276 -16"
 "light" "25"
 }
-// entity 584
+// entity 583
 {
 "classname" "light"
 "origin" "-128 12 -16"
 "light" "25"
 }
-// entity 585
+// entity 584
 {
 "classname" "light"
 "origin" "192 12 -16"
 "light" "25"
 }
-// entity 586
+// entity 585
 {
 "classname" "light"
 "origin" "-472 40 -16"
 "light" "25"
 }
-// entity 587
+// entity 586
 {
 "classname" "light"
 "origin" "-372 12 -16"
 "light" "25"
 }
-// entity 588
+// entity 587
 {
 "classname" "light"
 "origin" "-320 624 -16"
 "light" "25"
 }
-// entity 589
+// entity 588
 {
 "classname" "light"
 "origin" "-432 568 -16"
 "light" "25"
 }
-// entity 590
+// entity 589
 {
 "classname" "light"
 "origin" "560 68 -16"
 "light" "25"
 }
-// entity 591
+// entity 590
 {
 "classname" "light"
 "origin" "336 624 -16"
 "light" "25"
 }
-// entity 592
+// entity 591
 {
 "classname" "light"
 "origin" "492 568 -16"
 "light" "25"
 }
-// entity 593
+// entity 592
 {
 "classname" "light"
 "origin" "560 420 -16"
 "light" "25"
 }
-// entity 594
+// entity 593
 {
 "classname" "light"
 "origin" "560 192 -16"
 "light" "25"
 }
-// entity 595
+// entity 594
 {
 "classname" "light"
 "light" "20"
 "origin" "1112 368 -16"
 }
-// entity 596
+// entity 595
 {
 "classname" "light"
 "light" "20"
 "origin" "988 200 -16"
 }
-// entity 597
+// entity 596
 {
 "classname" "light"
 "light" "20"

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

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

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

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

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

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

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

Modified: branches/nexuiz-2.0/data/models/ctf/flags.md3_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/ctf/flags.md3_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/ctf/flags.md3_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,3 +1,3 @@
-replace "flag" "textures/flags/flag_red"
-replace "flag_cloth" "textures/flags/flag_red_cloth"
-replace "flag_laser" "textures/flags/flag_red_laser"
+flag,textures/flags/flag_red
+flag_cloth,textures/flags/flag_red_cloth
+flag_laser,textures/flags/flag_red_laser

Modified: branches/nexuiz-2.0/data/models/ctf/flags.md3_1.skin
===================================================================
--- branches/nexuiz-2.0/data/models/ctf/flags.md3_1.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/ctf/flags.md3_1.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,3 +1,3 @@
-replace "flag" "textures/flags/flag_blue"
-replace "flag_cloth" "textures/flags/flag_blue_cloth"
-replace "flag_laser" "textures/flags/flag_blue_laser"
+flag,textures/flags/flag_blue
+flag_cloth,textures/flags/flag_blue_cloth
+flag_laser,textures/flags/flag_blue_laser

Modified: branches/nexuiz-2.0/data/models/player/carni.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/carni.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/carni.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "carni2" "carni"
\ No newline at end of file
+carni2,carni
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/carni.zym_1.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/carni.zym_1.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/carni.zym_1.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "carni2" "carniarmor"
+carni2,carniarmor

Modified: branches/nexuiz-2.0/data/models/player/crash.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/crash.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/crash.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "mechanical12" "quark"
+mechanical12,quark

Modified: branches/nexuiz-2.0/data/models/player/grunt.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/grunt.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/grunt.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "grunt" "grunt"
\ No newline at end of file
+grunt,grunt
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/headhunter.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/headhunter.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/headhunter.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "headhunter" "headhunter"
\ No newline at end of file
+headhunter,headhunter
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/insurrectionist.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/insurrectionist.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/insurrectionist.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "insurrectionist" "insurrectionist"
\ No newline at end of file
+insurrectionist,insurrectionist
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/jeandarc.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/jeandarc.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/jeandarc.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "jeandarc1" "heroine"
+jeandarc1,heroine

Modified: branches/nexuiz-2.0/data/models/player/lurk.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/lurk.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/lurk.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "lurk" "lurk"
\ No newline at end of file
+lurk,lurk
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/lurk.zym_1.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/lurk.zym_1.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/lurk.zym_1.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "lurk" "reptile"
\ No newline at end of file
+lurk,reptile
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/lycanthrope.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/lycanthrope.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/lycanthrope.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "lycanthrope1" "lycanthrope"
+lycanthrope1,lycanthrope

Modified: branches/nexuiz-2.0/data/models/player/marine.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/marine.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/marine.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "marine" "marine"
\ No newline at end of file
+marine,marine
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "nexus"
\ No newline at end of file
+nexus,nexus
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_1.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_1.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_1.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "mulder"
+nexus,mulder

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_2.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_2.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_2.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "xolar"
+nexus,xolar

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_3.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_3.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_3.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "fbgreen"
+nexus,fbgreen

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_4.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_4.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_4.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "fbred"
+nexus,fbred

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_5.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_5.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_5.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "fborange"
+nexus,fborange

Modified: branches/nexuiz-2.0/data/models/player/nexus.zym_6.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/nexus.zym_6.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/nexus.zym_6.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "nexus" "fbcolored"
+nexus,fbcolored

Modified: branches/nexuiz-2.0/data/models/player/pyria.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/pyria.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/pyria.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "pyria" "pyria"
\ No newline at end of file
+pyria,pyria
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/shock.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/shock.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/shock.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "shock" "shock"
\ No newline at end of file
+shock,shock
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/skadi.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/skadi.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/skadi.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "femaleshock" "skadi"
\ No newline at end of file
+femaleshock,skadi
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/specop.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/specop.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/specop.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "specop" "specop"
\ No newline at end of file
+specop,specop
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/models/player/visitant.zym_0.skin
===================================================================
--- branches/nexuiz-2.0/data/models/player/visitant.zym_0.skin	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/models/player/visitant.zym_0.skin	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1 +1 @@
-replace "visitant" "fricka"
+visitant,fricka

Modified: branches/nexuiz-2.0/data/qcsrc/client/Main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/Main.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -80,8 +80,6 @@
 	//registercmd("ctf_menu");
 	registercmd("ons_map");
 	//registercmd("menu_action");
-	registercmd("sbar_columns_set");
-	registercmd("sbar_columns_help");
 
 	registercmd("+button3");
 	registercmd("-button3");
@@ -367,7 +365,8 @@
 	self.origin = view_origin + view_forward * self.view_ofs_x + view_right * self.view_ofs_y + view_up * self.view_ofs_z;
 	self.angles = view_angles;
 	self.angles_x = -self.angles_x;
-	R_AddEntity(self);
+	if not(self.cnt)
+		R_AddEntity(self);
 }
 void ShotOrg_Draw2D()
 {
@@ -474,6 +473,12 @@
 			debug_shotorg.view_ofs = debug_shotorg.view_ofs * (stof(argv(1)) / debug_shotorg.view_ofs_x); // closer/farther, same xy pos
 		localcmd("sv_cmd debug_shotorg \"", vtos(debug_shotorg.view_ofs), "\"\n");
 	}
+	else if(cmd == "shotorg_toggle_hide") {
+		if(debug_shotorg)
+		{
+			debug_shotorg.cnt = !debug_shotorg.cnt;
+		}
+	}
 	else if(cmd == "shotorg_end") {
 		if(debug_shotorg)
 		{
@@ -656,6 +661,8 @@
 		angles_held_y = ReadAngle();
 		angles_held_z = 0;
 	}
+	else
+		angles_held_status = 0;
 	
 	if(newspectatee_status != spectatee_status)
 	{
@@ -998,6 +1005,10 @@
 			Net_ReadSpawn();
 			bHandled = true;
 			break;
+		case TE_CSQC_ZCURVEPARTICLES:
+			Net_ReadZCurveParticles();
+			bHandled = true;
+			break;
 		default:
 			// No special logic for this temporary entity; return 0 so the engine can handle it
 			bHandled = false;

Modified: branches/nexuiz-2.0/data/qcsrc/client/View.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,6 +2,8 @@
 vector polyline[16];
 float trace_dphitcontents;
 float Q3SURFACEFLAG_SLICK = 2; // low friction surface
+float DPCONTENTS_SOLID = 1; // blocks player movement
+float DPCONTENTS_BODY = 32; // blocks player movement
 float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement
 void Porto_Draw()
 {
@@ -29,7 +31,7 @@
 	for(;;)
 	{
 		dir = nextdir;
-		traceline(p, p + 65536 * dir, TRUE, world);
+		traceline(p, p + 65536 * dir, TRUE, porto);
 		if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 			return;
 		nextdir = dir - 2 * (dir * trace_plane_normal) * trace_plane_normal; // mirror dir at trace_plane_normal
@@ -94,8 +96,6 @@
 	previous_game_starttime = startTime;
 }
 
-float DPCONTENTS_SOLID = 1; // hit a bmodel, not a bounding box
-float DPCONTENTS_BODY = 32; // hit a bounding box, not a bmodel
 void Porto_Init()
 {
 	porto = spawn();
@@ -317,6 +317,11 @@
 	// Draw the World (and sky)
 	R_SetView(VF_DRAWWORLD, 1);
 
+	// Set the console size vars
+	vid_conwidth = cvar("vid_conwidth");
+	vid_conheight = cvar("vid_conheight");
+	vid_pixelheight = cvar("vid_pixelheight");
+
 	R_SetView(VF_FOV, GetCurrentFov(fov));
 
 	// Camera for demo playback
@@ -353,11 +358,6 @@
 	// Draw the Engine Status Bar (the default Quake HUD)
 	R_SetView(VF_DRAWENGINESBAR, 0);
 
-	// 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");
 	sbar_showbinds_limit = cvar("sbar_showbinds_limit");
@@ -413,6 +413,12 @@
 			teamradar_view();
 	}
 
+	if (cvar("cl_showpressedkeys")) // draw pressed keys when spectating and playing
+	{
+		if(spectatee_status > 0 || cvar("cl_showpressedkeys") >= 2)
+			Sbar_DrawPressedKeys();
+	}
+
 	// draw sbar
 	if(cvar("r_letterbox") == 0)
 	if(cvar("viewsize") < 120)

Modified: branches/nexuiz-2.0/data/qcsrc/client/casings.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/casings.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/casings.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -75,31 +75,33 @@
 	casing.angles_x = ReadByte() * 360 / 256;
 	casing.angles_y = ReadByte() * 360 / 256;
 	casing.angles_z = ReadByte() * 360 / 256;
+	
+	if(cvar("cl_casings")) {
+		casing.draw = Casing_Draw;
+		casing.move_origin = casing.origin;
+		casing.move_velocity = casing.velocity + 2 * prandomvec();
+		casing.move_angles = casing.angles;
+		casing.move_avelocity = '0 250 0' + 100 * prandomvec();
+		casing.move_movetype = MOVETYPE_BOUNCE;
+		casing.move_touch = Casing_Touch;
+		casing.move_time = time;
+		casing.event_damage = Casing_Damage;
+		casing.solid = SOLID_TRIGGER;
 
-	casing.draw = Casing_Draw;
-	casing.move_origin = casing.origin;
-	casing.move_velocity = casing.velocity + 2 * prandomvec();
-	casing.move_angles = casing.angles;
-	casing.move_avelocity = '0 250 0' + 100 * prandomvec();
-	casing.move_movetype = MOVETYPE_BOUNCE;
-	casing.move_touch = Casing_Touch;
-	casing.move_time = time;
-	casing.event_damage = Casing_Damage;
-	casing.solid = SOLID_TRIGGER;
+		switch(casing.state)
+		{
+			case 1:
+				setmodel(casing, "models/casing_shell.mdl");
+				casing.cnt = time + cvar("cl_casings_shell_time");
+				break;
+			default:
+				setmodel(casing, "models/casing_bronze.mdl");
+				casing.cnt = time + cvar("cl_casings_bronze_time");
+				break;
+		}
 
-	switch(casing.state)
-	{
-		case 1:
-			setmodel(casing, "models/casing_shell.mdl");
-			casing.cnt = time + 30;
-			break;
-		default:
-			setmodel(casing, "models/casing_bronze.mdl");
-			casing.cnt = time + 10;
-			break;
-	}
-
-	setsize(casing, '0 0 -1', '0 0 -1');
+		setsize(casing, '0 0 -1', '0 0 -1');
+	} else remove(self);
 }
 
 void Casings_Precache()

Modified: branches/nexuiz-2.0/data/qcsrc/client/damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/damage.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/damage.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,6 +1,6 @@
 void Ent_DamageInfo()
 {
-	float hittype, dmg, rad, edge, thisdmg;
+	float hittype, dmg, rad, edge, thisdmg, forcemul;
 	vector force, org, thisforce;
 	entity oldself;
 
@@ -16,6 +16,14 @@
 	edge = ReadByte();
 	force = decompressShortVector(ReadShort());
 
+	if(rad < 0)
+	{
+		rad = -rad;
+		forcemul = -1;
+	}
+	else
+		forcemul = 1;
+
 	for(self = findradius(org, rad); self; self = self.chain)
 	{
 		if(rad)
@@ -26,18 +34,18 @@
 			if(dmg)
 			{
 				thisdmg = dmg + (edge - dmg) * thisdmg;
-				thisforce = vlen(force) * (thisdmg / dmg) * normalize(self.origin - org);
+				thisforce = forcemul * vlen(force) * (thisdmg / dmg) * normalize(self.origin - org);
 			}
 			else
 			{
 				thisdmg = 0;
-				thisforce = vlen(force) * normalize(self.origin - org);
+				thisforce = forcemul * vlen(force) * normalize(self.origin - org);
 			}
 		}
 		else
 		{
 			thisdmg = dmg;
-			thisforce = force;
+			thisforce = forcemul * force;
 		}
 
 		if(self.damageforcescale)
@@ -70,7 +78,7 @@
 		r = prandom();
 
 		traceline(org - normalize(force) * 16, org + normalize(force) * 16, MOVE_NOMONSTERS, world);
-		if(trace_fraction < 1)
+		if(trace_fraction < 1 && hitwep != WEP_NEX && hitwep != WEP_MINSTANEX)
 			backoff = trace_plane_normal;
 		else
 			backoff = -1 * normalize(force);
@@ -78,12 +86,13 @@
 		switch(hitwep)
 		{
 			case WEP_LASER:
-				org2 = org + backoff * 8;
+				org2 = org + backoff * 6;
+				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				break;
 			case WEP_SHOTGUN:
-				pointparticles(particleeffectnum("shotgun_impact"), org, backoff * 1000, 1);
+				org2 = org + backoff * 2;
+				pointparticles(particleeffectnum("shotgun_impact"), org2, backoff * 1000, 1);
 				if(r < 0.05)
 					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 				else if(r < 0.1)
@@ -92,7 +101,8 @@
 					sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
 				break;
 			case WEP_UZI:
-				pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
+				org2 = org + backoff * 2;
+				pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1);
 				if(r < 0.05)
 					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 				else if(r < 0.1)
@@ -106,93 +116,96 @@
 				sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 				break;
 			case WEP_ELECTRO:
-				org2 = org + backoff * 8;
+				org2 = org + backoff * 6;
 				if(secondary)
 				{
+					pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
 					sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-					pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
 				}
 				else
 				{
 					if(bounce)
 					{
 						// this is sent as "primary bounce" to distinguish it from secondary bounced balls
+						pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
 						sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
-						pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
 					}
 					else
 					{
+						pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 						sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-						pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 					}
 				}
 				break;
 			case WEP_CRYLINK:
+				org2 = org + backoff * 2;
 				if(secondary)
 				{
+					pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1);
 					sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
-					pointparticles(particleeffectnum("crylink_impact"), org, '0 0 0', 1);
 				}
 				else
 				{
+					pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1);
 					sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
-					pointparticles(particleeffectnum("crylink_impactbig"), org, '0 0 0', 1);
 				}
 				break;
 			case WEP_NEX:
+				org2 = org + backoff * 6;
+				pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
 				sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
 				break;
 			case WEP_HAGAR:
-				org2 = org + backoff * 12;
+				org2 = org + backoff * 6;
+				pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 				if (r<0.15)
 					sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
 				else if (r<0.7)
 					sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
 				else
 					sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 				break;
 			case WEP_ROCKET_LAUNCHER:
-				org2 = org + backoff * 16;
+				org2 = org + backoff * 12;
+				pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
 				sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
 				break;
 			case WEP_PORTO:
 				print("Since when does Porto send DamageInfo?\n");
 				break;
 			case WEP_MINSTANEX:
+				org2 = org + backoff * 6;
+				pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
 				sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
 				break;
 			case WEP_HOOK:
-				org2 = org + backoff * 12;
+				org2 = org + backoff * 2;
+				pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
 				sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
 				break;
 			case WEP_SEEKER:
-				org2 = org + backoff * 12;
+				org2 = org + backoff * 6;
 				if(secondary)
 				{
+					pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
 					if (r<0.15)
 						sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
 					else if (r<0.7)
 						sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
 					else
 						sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
-					pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
 				}
 				else
 				{
 					if(bounce)
 					{
+						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 						if (r<0.15)
 							sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
 						else if (r<0.7)
 							sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
 						else
 							sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
-						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 					}
 					else if(headshot)
 					{
@@ -200,23 +213,24 @@
 					}
 					else
 					{
+						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 						if (r<0.15)
 							sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
 						else if (r<0.7)
 							sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
 						else
 							sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
-						pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 					}
 				}
 				break;
 			case WEP_HLAC:
-				org2 = org + backoff * 12;
+				org2 = org + backoff * 6;
+				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
-				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				break;
 			case WEP_CAMPINGRIFLE:
-				pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
+				org2 = org + backoff * 2;
+				pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1);
 				if(r < 0.2)
 					sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 				else if(r < 0.4)

Modified: branches/nexuiz-2.0/data/qcsrc/client/particles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/particles.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/particles.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -189,3 +189,57 @@
 	else
 		self.draw = Draw_Snow;
 }
+
+entity zcurve;
+void zcurveparticles(float effectnum, vector start, vector end, float end_dz, float speed, float depth)
+{
+	// end_dz:
+	//   IF IT WERE A STRAIGHT LINE, it'd end end_dz above end
+
+	vector mid;
+	mid = (start + end) * 0.5;
+
+	end_dz *= 0.25;
+	mid_z += end_dz;
+
+	--depth;
+	if(depth < 0 || normalize(mid - start) * normalize(end - start) > 0.999999)
+	// TODO make this a variable threshold
+	// currently: 0.081 degrees
+	// 0.99999 would be 0.256 degrees and is visible
+	{
+		zcurve.velocity = speed * normalize(end - start);
+		trailparticles(zcurve, effectnum, start, end);
+	}
+	else
+	{
+		zcurveparticles(effectnum, start, mid, end_dz, speed, depth);
+		zcurveparticles(effectnum, mid, end, end_dz, speed, depth);
+	}
+}
+
+void Net_ReadZCurveParticles()
+{
+	vector start, end;
+	float end_dz;
+	float effectnum, speed;
+
+	if(!zcurve)
+	{
+		zcurve = spawn();
+		zcurve.classname = "zcurve";
+	}
+
+	effectnum = ReadShort();
+
+	start_x = ReadCoord();
+	start_y = ReadCoord();
+	start_z = ReadCoord();
+	end_x = ReadCoord();
+	end_y = ReadCoord();
+	end_z = ReadCoord();
+	end_dz = ReadCoord();
+	speed = ReadShort() * 16;
+
+	zcurveparticles(effectnum, start, end, end_dz, speed, 5); // at most 32 segments
+}

Modified: branches/nexuiz-2.0/data/qcsrc/client/projectile.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/projectile.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/projectile.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -59,6 +59,10 @@
 		case PROJECTILE_HAGAR_BOUNCING:
 			trailparticles(self, particleeffectnum("TR_GRENADE"), from, to);
 			break;
+		case PROJECTILE_BULLET:
+		case PROJECTILE_BULLET_GLOWING:
+			trailparticles(self, particleeffectnum("tr_bullet"), from, to);
+			break;
 		default:
 			break;
 	}
@@ -69,7 +73,12 @@
 {
 	vector rot;
 	vector trailorigin;
+	float f;
+	float drawn;
+	float t;
 
+	f = self.move_flags;
+
 	if(self.count & 0x80)
 	{
 		//self.move_flags &~= FL_ONGROUND;
@@ -82,8 +91,19 @@
 		InterpolateOrigin_Do();
 	}
 
-	if(!(self.move_flags & FL_ONGROUND))
+	if(self.count & 0x80)
 	{
+		drawn = (time >= self.spawntime - 0.02);
+		t = max(time, self.spawntime);
+	}
+	else
+	{
+		drawn = (self.iflags & IFLAG_VALID);
+		t = time;
+	}
+
+	if(!(f & FL_ONGROUND))
+	{
 		rot = '0 0 0';
 		switch(self.cnt)
 		{
@@ -101,7 +121,7 @@
 			default:
 				break;
 		}
-		self.angles = AnglesTransform_Multiply(self.angles, rot * (time - self.spawntime));
+		self.angles = AnglesTransform_Multiply(self.angles, rot * (t - self.spawntime));
 
 		fixedmakevectors(self.angles);
 
@@ -115,9 +135,15 @@
 			default:
 				break;
 		}
-		Projectile_DrawTrail(trailorigin);
+		if(drawn)
+			Projectile_DrawTrail(trailorigin);
+		else
+			self.trail_oldorigin = trailorigin;
 	}
 
+	if(!drawn)
+		return;
+
 	switch(self.cnt)
 	{
 		case PROJECTILE_BULLET_GLOWING:
@@ -129,8 +155,7 @@
 
 	self.renderflags = 0;
 
-	if((self.count & 0x80) || (self.iflags & IFLAG_VALID))
-		R_AddEntity(self);
+	R_AddEntity(self);
 }
 
 void loopsound(entity e, float ch, string samp, float vol, float attn)
@@ -179,11 +204,12 @@
 	self.solid = SOLID_TRIGGER;
 	//self.effects = EF_NOMODELFLAGS;
 
-	// sv_gameplayfix_delayprojectiles
 	if(!self.move_time)
 	{
-		self.move_time = time + ticrate;
-		self.spawntime = time + ticrate;
+		// for some unknown reason, we don't need to care for
+		// sv_gameplayfix_delayprojectiles here.
+		self.move_time = time;
+		self.spawntime = time;
 	}
 	else
 		self.move_time = max(self.move_time, time);
@@ -218,7 +244,7 @@
 		switch(self.cnt)
 		{
 			case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl"); break;
-			case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3"); self.scale = 3; break;
+			case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3"); self.scale = 2; break;
 			case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); break;
 			case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl"); break;
 			case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl"); break;

Modified: branches/nexuiz-2.0/data/qcsrc/client/sbar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/client/sbar.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -356,9 +356,12 @@
 {
 	return strcat( // fteqcc sucks
 		"ping pl name | ",
-		"+noteams/kills +noteams/deaths +noteams/suicides -noteams,tdm/frags ", // tdm already has this in "score"
+		"-teams,race,lms/kills -teams,race,lms/deaths -teams,lms/suicides -race,dm,tdm/frags ", // tdm already has this in "score"
+		"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
+		"+lms/lives +lms/rank ",
 		"+kh/caps +kh/pushes +kh/destroyed ",
-		"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
+		"+race/laps +race/time +race/fastest ",
+		"+as/objectives ",
 		"-lms/score");
 }
 
@@ -1144,12 +1147,13 @@
 			if(me.sv_entnum == player_localentnum - 1)
 				break;
 		}
-		pl = players;
+		pl = players.sort_next;
 		if(pl == me)
 			pl = pl.sort_next;
 		
 		if(pl) {
-			distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
+			distribution = me.(scores[ps_primary]);
+			distribution -= pl.(scores[ps_primary]);
 		} else
 			distribution = 0;
 		
@@ -1530,7 +1534,10 @@
 
 	centerprint_fontsize = Sbar_GetFontsize("scr_centersize");
 
-	centerprint_expire = max(centerprint_expire, time); // if any of the returns happens, this message will fade out
+	centerprint_expire = min(centerprint_expire, time); // if any of the returns happens, this message will fade out
+
+	if(cvar("scr_centertime") <= 0)
+		return;
 	
 	if(strMessage == "")
 		return;
@@ -1703,6 +1710,30 @@
 	return offset + sbar_fontsize_y * '0 1 0';
 }
 
+void Sbar_DrawPressedKeys(void)
+{
+	vector pos, bgsize;
+	float center_y;
+	float pressedkeys;
+	
+	pos = stov(cvar_string("cl_showpressedkeys_position"));
+
+	bgsize = '126 75 0';
+
+	pos = '1 0 0' * (vid_conwidth - bgsize_x) * pos_x
+	    + '0 1 0' * (vid_conheight - bgsize_y) * pos_y;
+	pos -= '-15 -6 0'; // adjust to the origin of these numbers
+	
+	pressedkeys = getstatf(STAT_PRESSED_KEYS);
+	drawpic(pos + '-15   -6   0', "gfx/keys/key_bg.tga",           bgsize, '1 1 1', .1, DRAWFLAG_NORMAL);
+	drawpic(pos + ' 83.5  9   0', "gfx/keys/key_crouch.tga",   ' 24 24 0', '1 1 1', .5 * ((pressedkeys & KEY_CROUCH) + 1), DRAWFLAG_NORMAL);
+	drawpic(pos + ' 32   -1.5 0', "gfx/keys/key_forward.tga",  ' 32 32 0', '1 1 1', .5 * ((pressedkeys & KEY_FORWARD) + 1), DRAWFLAG_NORMAL);
+	drawpic(pos + '-11.5  9   0', "gfx/keys/key_jump.tga",     ' 24 24 0', '1 1 1', .5 * ((pressedkeys & KEY_JUMP) + 1), DRAWFLAG_NORMAL);
+	drawpic(pos + ' -1   32   0', "gfx/keys/key_left.tga",     ' 32 32 0', '1 1 1', .5 * ((pressedkeys & KEY_LEFT) + 1), DRAWFLAG_NORMAL);
+	drawpic(pos + ' 32   32   0', "gfx/keys/key_backward.tga", ' 32 32 0', '1 1 1', .5 * ((pressedkeys & KEY_BACKWARD) + 1), DRAWFLAG_NORMAL);
+	drawpic(pos + ' 65   32   0', "gfx/keys/key_right.tga",    ' 32 32 0', '1 1 1', .5 * ((pressedkeys & KEY_RIGHT) + 1), DRAWFLAG_NORMAL);
+}
+
 void Sbar_Draw (void)
 {
 	float i;
@@ -1713,7 +1744,7 @@
 
 	sbar_fontsize = Sbar_GetFontsize("sbar_fontsize");
 	
-	if(spectatee_status)
+	if(spectatee_status && !intermission)
 	{
 		if(spectatee_status == -1)
 			s = "^1Observing";
@@ -1733,6 +1764,9 @@
 			s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
 		o = Sbar_DrawNoteLine(o, s);
 
+		s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
+		o = Sbar_DrawNoteLine(o, s);
+
 		if(gametype == GAME_ARENA)
 			s = "^1Wait for your turn to join";
 		else if(gametype == GAME_LMS)
@@ -1759,7 +1793,7 @@
 			o = Sbar_DrawNoteLine(o, s);
 		}
 	}
-	if(warmup_stage)
+	if(warmup_stage && !intermission)
 	{
 		s = "^2Currently in ^1warmup^2 stage!";
 		o = Sbar_DrawNoteLine(o, s);
@@ -1774,7 +1808,7 @@
 	else
 		blinkcolor = "^3";
 
-	if(ready_waiting)
+	if(ready_waiting && !intermission)
 	{
 		if(ready_waiting_for_me)
 		{
@@ -1792,7 +1826,7 @@
 		}
 		o = Sbar_DrawNoteLine(o, s);
 	}
-	else if(warmup_stage) 
+	else if(warmup_stage && !intermission) 
 	{
 		s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
 		o = Sbar_DrawNoteLine(o, s);
@@ -1819,7 +1853,7 @@
 			o = Sbar_DrawNoteLine(o, s);
 		}
 	}
-	if(teamplay)
+	if(teamplay && !intermission)
 	{
 		entity tm;
 		float ts_min, ts_max;

Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -45,6 +45,7 @@
 const float TE_CSQC_PICTURE = 100;
 const float TE_CSQC_RACE = 101;
 const float TE_CSQC_SPAWN = 102;
+const float TE_CSQC_ZCURVEPARTICLES = 103;
 
 const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@ -214,6 +215,15 @@
 const float K_MOUSE16		=	529;
 
 ///////////////////////////
+// keys pressed
+const float KEY_FORWARD		=	1;
+const float KEY_BACKWARD	=	2;
+const float KEY_LEFT		=	4;
+const float KEY_RIGHT		=	8;
+const float KEY_JUMP		=	16;
+const float KEY_CROUCH		=	32;
+
+///////////////////////////
 // cvar constants
 
 float CVAR_SAVE 	= 1;
@@ -231,6 +241,7 @@
 const float STAT_GAMESTARTTIME = 37;
 const float STAT_STRENGTH_FINISHED = 38;
 const float STAT_INVINCIBLE_FINISHED = 39;
+const float STAT_PRESSED_KEYS = 42;
 const float CTF_STATE_ATTACK = 1;
 const float CTF_STATE_DEFEND = 2;
 const float CTF_STATE_COMMANDER = 3;
@@ -398,7 +409,9 @@
 
 #define FRAGS_PLAYER 0
 #define FRAGS_SPECTATOR -666
+#define FRAGS_LMS_LOSER -616
 #define FRAGS_PLAYER_NONSOLID -616
+// we can use this frags value for both
 
 //misc. stuff
 #define NEWLINES "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_audio.c	2009-02-20 14:23:51 UTC (rev 5912)
@@ -147,6 +147,7 @@
 	me.TR(me);
 		sl = makeNexuizSlider(0.15, 1, 0.05, "cl_autotaunt");
 			sl.valueDisplayMultiplier = 100;
+			sl.valueDigits = 0;
 		me.TD(me, 1, 1, e = makeNexuizSliderCheckBox(0, 1, sl, "Automatic taunts"));
 		if(sl.value != e.savedValue)
 			e.savedValue = 0.65; // default

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_settings_input.c	2009-02-20 14:23:51 UTC (rev 5912)
@@ -71,5 +71,9 @@
 			e.addValue(e, "Short", "1");
 			e.addValue(e, "Long", "2");
 			e.configureNexuizTextSliderValues(e);
+	me.TR(me);
+		me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_showpressedkeys", "Show pressed keys"));
+			e.noValue = 0;
+			e.yesValue = 2;
 }
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/server/arena.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/arena.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -93,7 +93,7 @@
 				{
 					//NEW: changed behaviour so that it prevents that previous spectators/observers suddenly spawn as players
 					if (self.classname == "player") {
-						PlayerScore_Clear(self);
+						//PlayerScore_Clear(self);
 						if(g_lms)
 							PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives());
 						self.killcount = 0;

Modified: branches/nexuiz-2.0/data/qcsrc/server/bots.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -366,11 +366,12 @@
 // used during navigation_goalrating_begin/end sessions
 float navigation_bestrating;
 entity navigation_bestgoal;
+entity navigation_alternativegoal;
+.entity alternativegoal;
 
 
 
 
-
 /////////////////////////////////////////////////////////////////////////////
 // spawnfunc_waypoint management
 /////////////////////////////////////////////////////////////////////////////
@@ -1252,6 +1253,7 @@
 		//dprint(ftos(f));
 		if (navigation_bestrating < f)
 		{
+			navigation_alternativegoal = navigation_bestgoal;
 			navigation_bestrating = f;
 			navigation_bestgoal = e;
 		}
@@ -1325,6 +1327,7 @@
 {
 	if (self.havocbot_role == havocbot_role_ctf_offense)
 		dprint(navigation_bestgoal.classname, " (with rating ", ftos(navigation_bestrating), ")\n");
+	self.alternativegoal = navigation_alternativegoal;
 	navigation_routetogoal(navigation_bestgoal);
 };
 
@@ -1367,6 +1370,7 @@
 .float(entity player, entity item) bot_pickupevalfunc;
 .float bot_pickupbasevalue;
 .float bot_canfire;
+.float bot_strategytime;
 
 // used for aiming currently
 // FIXME: make the weapon code use these and then replace the calculations here with a call to the weapon code
@@ -1621,6 +1625,11 @@
 
 void bot_lagfunc(float t, float f1, float f2, entity e1, vector v1, vector v2, vector v3, vector v4)
 {
+	if(self.flags & FL_INWATER)
+	{
+		self.bot_aimtarg = world;
+		return;
+	}
 	self.bot_aimtarg = e1;
 	self.bot_aimlatency = self.ping; // FIXME?  Shouldn't this be in the lag item?
 	self.bot_aimselforigin = v1;
@@ -1940,10 +1949,13 @@
 	if (self.deadflag)
 	{
 		if (self.deadflag == DEAD_DEAD)
+		{
 			self.BUTTON_JUMP = 1; // press jump to respawn
-		return;
+			self.bot_strategytime = 0;
+			return;
+		}
 	}
-
+	
 	// now call the current bot AI (havocbot for example)
 	self.bot_ai();
 };

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -74,7 +74,6 @@
 
 #define SPAWNPOINT_SCORE frags
 
-.float wantswelcomemessage;
 .string netname_previous;
 
 void spawnfunc_info_player_survivor (void)
@@ -564,7 +563,6 @@
 	self.punchvector = '0 0 0';
 	self.oldvelocity = self.velocity;
 	self.customizeentityforclient = Client_customizeentityforclient;
-	self.wantswelcomemessage = 1;
 
 	if(g_arena)
 	{
@@ -584,7 +582,7 @@
 		if(PlayerScore_Add(self, SP_LMS_RANK, 0) == 666)
 			self.frags = FRAGS_SPECTATOR;
 		else
-			self.frags = FRAGS_SPECTATOR; // this was -667 before, is this okay?
+			self.frags = FRAGS_LMS_LOSER;
 	}
 	else
 		self.frags = FRAGS_SPECTATOR;
@@ -1327,7 +1325,7 @@
 		if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0)
 		{
 			PlayerScore_Add(self, SP_LMS_RANK, 666);
-			self.frags = FRAGS_SPECTATOR; // FIXME do we still need this?
+			self.frags = FRAGS_SPECTATOR;
 		}
 	}
 
@@ -1766,6 +1764,49 @@
 	zoomstate_set = 1;
 }
 
+void GetPressedKeys(void) {
+	if (self.movement_x > 0) // get if movement keys are pressed
+	{	// forward key pressed
+		self.pressedkeys |= KEY_FORWARD;
+		self.pressedkeys &~= KEY_BACKWARD;
+	}
+	else if (self.movement_x < 0)
+	{	// backward key pressed
+		self.pressedkeys |= KEY_BACKWARD;
+		self.pressedkeys &~= KEY_FORWARD;
+	}
+	else
+	{	// no x input
+		self.pressedkeys &~= KEY_FORWARD;
+		self.pressedkeys &~= KEY_BACKWARD;
+	}
+	
+	if (self.movement_y > 0)
+	{	// right key pressed
+		self.pressedkeys |= KEY_RIGHT;
+		self.pressedkeys &~= KEY_LEFT;
+	}
+	else if (self.movement_y < 0)
+	{	// left key pressed
+		self.pressedkeys |= KEY_LEFT;
+		self.pressedkeys &~= KEY_RIGHT;
+	}
+	else
+	{	// no y input
+		self.pressedkeys &~= KEY_RIGHT;
+		self.pressedkeys &~= KEY_LEFT;
+	}
+	
+	if (self.BUTTON_JUMP) // get if jump and crouch keys are pressed
+		self.pressedkeys |= KEY_JUMP;
+	else
+		self.pressedkeys &~= KEY_JUMP;
+	if (self.BUTTON_CROUCH)
+		self.pressedkeys |= KEY_CROUCH;
+	else
+		self.pressedkeys &~= KEY_CROUCH;
+}
+
 /*
 ======================
 spectate mode routines
@@ -1781,6 +1822,7 @@
 	self.items = spectatee.items;
 	self.strength_finished = spectatee.strength_finished;
 	self.invincible_finished = spectatee.invincible_finished;
+	self.pressedkeys = spectatee.pressedkeys;
 	self.weapons = spectatee.weapons;
 	self.switchweapon = spectatee.switchweapon;
 	self.weapon = spectatee.weapon;
@@ -1825,7 +1867,6 @@
 		msg_entity = self;
 		WriteByte(MSG_ONE, SVC_SETVIEW);
 		WriteEntity(MSG_ONE, self.enemy);
-		self.wantswelcomemessage = 1;
 	 	//stuffcmd(self, "set viewsize $tmpviewsize \n");
 		if(!SpectateUpdate())
 			PutObserverInServer();
@@ -1985,10 +2026,7 @@
 			self.flags |= FL_JUMPRELEASED;
 		}
 	}
-	if(self.BUTTON_ZOOM)
-		self.wantswelcomemessage = 0;
-	if(self.wantswelcomemessage)
-		PrintWelcomeMessage(self);
+	PrintWelcomeMessage(self);
 }
 
 void SpectatorThink()
@@ -2022,10 +2060,7 @@
 			self.flags |= FL_JUMPRELEASED;
 		}
 	}
-	if(self.BUTTON_ZOOM)
-		self.wantswelcomemessage = 0;
-	if(self.wantswelcomemessage)
-		PrintWelcomeMessage(self);
+	PrintWelcomeMessage(self);
 	self.flags |= FL_CLIENT | FL_NOTARGET;
 }
 
@@ -2106,13 +2141,8 @@
 
 		CheckRules_Player();
 
-		if(self.BUTTON_INFO)
-			PrintWelcomeMessage(self);
+		PrintWelcomeMessage(self);
 
-		if(g_lms || !cvar("sv_spectate"))
-		if((time - self.jointime) <= cvar("welcome_message_time"))
-			PrintWelcomeMessage(self);
-
 		if (intermission_running)
 		{
 			IntermissionThink ();	// otherwise a button could be missed between
@@ -2387,7 +2417,6 @@
 		if (intermission_running)
 			return;		// intermission or finale
 
-		//PrintWelcomeMessage(self);
 		//if (TetrisPostFrame()) return;
 
 		// restart countdown
@@ -2449,7 +2478,7 @@
 					self.race_penalty_nagged = 0;
 				}
 			}
-		
+		GetPressedKeys();
 	} else if (self.classname == "observer") {
 		//do nothing
 	} else if (self.classname == "spectator") {

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -254,6 +254,7 @@
 .string weaponname;
 void CL_Weaponentity_Think()
 {
+	float tb;
 	self.nextthink = time;
 	if (intermission_running)
 		self.frame = WFRAME_IDLE;
@@ -277,13 +278,13 @@
 		else
 			self.model = "";
 	}
+
+	tb = (self.effects & EF_TELEPORT_BIT);
 	self.effects = self.owner.effects | EF_LOWPRECISION;
-	self.effects = self.effects - (self.effects & (EF_FULLBRIGHT)); // can mask team color, so get rid of it
+	self.effects &~= EF_FULLBRIGHT; // can mask team color, so get rid of it
+	self.effects &~= EF_TELEPORT_BIT;
+	self.effects |= tb;
 
-	if (self.owner.teleport_time)
-		// owner is currently being teleported, so don't apply EF_NODRAW otherwise the viewmodel would "blink"
-		self.effects &~= EF_NODRAW;
-
 	if(self.owner.alpha != 0)
 		self.alpha = self.owner.alpha;
 	else
@@ -553,7 +554,13 @@
 	if (fr >= 0)
 	{
 		if (self.weaponentity != world)
+		{
+			if(fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2)
+			{
+				BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+			}
 			self.weaponentity.frame = fr;
+		}
 	}
 
 	if(self.weapon_think == w_ready && func != w_ready && self.weaponentity.state == WS_RAISE)

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -99,6 +99,7 @@
 
 //float ctf_clientcommand();
 float readyrestart_happened;
+.float lms_spectate_warning;
 void SV_ParseClientCommand(string s) {
 	local string cmd;
 	local float tokens, f, effectnum;
@@ -158,8 +159,22 @@
 	} else if(argv(0) == "spectate") {
 		if not(self.flags & FL_CLIENT)
 			return;
-		if(g_lms || g_arena)
-			return; // don't allow spectating in lms, unless player runs out of lives
+		if(g_arena)
+			return;
+		if(g_lms)
+		{
+			if(self.lms_spectate_warning)
+			{
+				// mark player as spectator
+				PlayerScore_Add(self, SP_LMS_RANK, 666 - PlayerScore_Add(self, SP_LMS_RANK, 0));
+			}
+			else
+			{
+				self.lms_spectate_warning = 1;
+				sprint(self, "WARNING: you won't be able to enter the game again after spectating in LMS. Use the same command again to spectate anyway.\n");
+				return;
+			}
+		}
 		if(self.classname == "player" && cvar("sv_spectate") == 1) {
 			if(self.flagcarried)
 				DropFlag(self.flagcarried, world, world);
@@ -212,22 +227,28 @@
 	} 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) {
-				return sprint(self, "^1You cannot reset the game while a timeout is active!\n");
-			}
-
+			if(!readyrestart_happened || cvar("sv_ready_restart_repeatable"))
 			{
-				if(!readyrestart_happened || cvar("sv_ready_restart_repeatable"))
+				if (self.ready) // toggle
 				{
+					self.ready = FALSE;
+					bprint(self.netname, "^2 is ^1NOT^2 ready\n");
+				}
+				else
+				{
 					self.ready = TRUE;
 					bprint(self.netname, "^2 is ready\n");
+				}
+
+				// cannot reset the game while a timeout is active!
+				if(!timeoutStatus)
 					ReadyCount();
-				} else {
-					sprint(self, "^1game has already been restarted\n");
-				}
+			} else {
+				sprint(self, "^1Game has already been restarted\n");
 			}
 		}
 	} else if(argv(0) == "maplist") {
@@ -361,8 +382,16 @@
 	VoteReset();
 
 	// clear overtime
-	if(checkrules_overtimeend)
-		checkrules_overtimeend = 0;
+	if (checkrules_overtimesadded > 0) {
+		//we have to decrease timelimit to its original value again!!
+		float newTL;
+		newTL = cvar("timelimit");
+		newTL -= checkrules_overtimesadded * cvar("timelimit_overtime");
+		cvar_set("timelimit", ftos(newTL));
+	}
+	
+	checkrules_suddendeathend = checkrules_overtimesadded = checkrules_suddendeathwarning = 0;
+	
 
 	readyrestart_happened = 1;
 	game_starttime = time + RESTART_COUNTDOWN;
@@ -457,6 +486,7 @@
  */
 void restartTimer_Think() {
 	restart_mapalreadyrestarted = 1;
+	Score_ClearAll();
 	reset_map(TRUE);
 	remove(self);
 	return;

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,5 +1,5 @@
-string CVAR_CHECK_DEFAULT = "9351678ef3ad9cea04f929f91bca7684";
-string CVAR_CHECK_WEAPONS = "4cd91ef6c8a9627168a5e85f581e1e0f";
+string CVAR_CHECK_DEFAULT = "1e27a8f2f0ba60542af81e2272d39ad7";
+string CVAR_CHECK_WEAPONS = "f156bf358766dfc169eb26dc36a765b9";
 
 float	FALSE					= 0;
 float	TRUE					= 1;
@@ -119,7 +119,7 @@
 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)
+#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT)
 
 float	MSG_BROADCAST				= 0; // unreliable
 float	MSG_ONE					= 1; // reliable

Modified: branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -149,6 +149,12 @@
 
 void place_flag()
 {
+	if(self.classname != "item_flag_team")
+	{
+		backtrace("PlaceFlag a non-flag");
+		return;
+	}
+
 	if(!self.t_width)
 		self.t_width = 0.1; // frame animation rate
 	if(!self.t_length)
@@ -194,10 +200,16 @@
 
 void RegenFlag(entity e)
 {
+	if(e.classname != "item_flag_team")
+	{
+		backtrace("RegenFlag a non-flag");
+		return;
+	}
+
 	setattachment(e, world, "");
 	e.damageforcescale = 0;
 	e.movetype = MOVETYPE_NONE;
-	if(!self.noalign)
+	if(!e.noalign)
 		e.movetype = MOVETYPE_TOSS;
 	e.solid = SOLID_TRIGGER;
 	// TODO: play a sound here
@@ -210,6 +222,12 @@
 
 void ReturnFlag(entity e)
 {
+	if(e.classname != "item_flag_team")
+	{
+		backtrace("ReturnFlag a non-flag");
+		return;
+	}
+
 	if (e.owner)
 	if (e.owner.flagcarried == e)
 	{
@@ -227,6 +245,12 @@
 {
 	local entity p;
 
+	if(e.classname != "item_flag_team")
+	{
+		backtrace("DropFlag a non-flag");
+		return;
+	}
+
 	if(e.speedrunning)
 	{
 		ReturnFlag(e);

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -422,8 +422,6 @@
 #define ALLPLAYERSOUNDS \
 		_VOICEMSG(death) \
 		_VOICEMSG(drown) \
-		_VOICEMSG(fall) \
-		_VOICEMSG(falling) \
 		_VOICEMSG(gasp) \
 		_VOICEMSG(jump) \
 		_VOICEMSG(pain25) \
@@ -433,29 +431,35 @@
 #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(affirmative) \
-		_VOICEMSG(negative) \
-		_VOICEMSG(onmyway) \
-		_VOICEMSG(seenenemy) \
-		_VOICEMSG(getflag) \
-		_VOICEMSG(droppedflag) \
-		_VOICEMSG(flagcarriertakingdamage)
+		_VOICEMSG(teamshoot)
+
 #define _VOICEMSG(m) .string playersound_##m;
 ALLPLAYERSOUNDS
 ALLVOICEMSGS
 #undef _VOICEMSG
+
+// reserved sound names for the future (models lack sounds for them):
+//		_VOICEMSG(affirmative) \
+//		_VOICEMSG(attacking) \
+//		_VOICEMSG(defending) \
+//		_VOICEMSG(roaming) \
+//		_VOICEMSG(onmyway) \
+//		_VOICEMSG(droppedflag) \
+//		_VOICEMSG(flagcarriertakingdamage) \
+//		_VOICEMSG(negative) \
+//		_VOICEMSG(seenenemy) \
+//		_VOICEMSG(fall) \
+//		_VOICEMSG(getflag) \
+//		_VOICEMSG(incoming) \
+//		_VOICEMSG(coverme) \
+//		_VOICEMSG(needhelp) \
+//		_VOICEMSG(defend) \
+//		_VOICEMSG(freelance) \
+//		_VOICEMSG(falling) \
+
 string globalsound_fall;
 string globalsound_metalfall;
 string globalsound_step;
@@ -492,6 +496,7 @@
 .float stat_sys_ticrate;
 .float phase;
 .float weapons;
+.float pressedkeys;
 
 .float porto_forbidden;
 
@@ -531,3 +536,7 @@
 void ClientData_Touch(entity e);
 
 vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
+
+// the QC VM sucks
+#define BITXOR(v,b)        ((v) + (b) - 2 * ((v) & (b)))
+#define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))

Modified: branches/nexuiz-2.0/data/qcsrc/server/extensions.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/extensions.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -51,15 +51,6 @@
 //description:
 //made +use and -use commands work, they now control the .buttonuse field (.button1 was used by many mods for other purposes).
 
-// LordHavoc: HIGHLY experimental, do not implement this in other engines
-//DP_CGAME
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
-//SVC definitions:
-float svc_cgame = 50; // [short] length [bytes] data
-//description:
-//contains network messages to client gamecode.
-
 //DP_CL_LOADSKY
 //idea: Nehahra, LordHavoc
 //darkplaces implementation: LordHavoc
@@ -192,6 +183,16 @@
 //description:
 //entity emits bouncing sparkles in every direction
 
+//DP_EF_TELEPORT_BIT
+//idea: id software
+//darkplaces implementation: div0
+//effects bit:
+float   EF_TELEPORT_BIT = 2097152;
+//description:
+//when toggled, interpolation of the entity is skipped for one frame. Useful for teleporting.
+//to toggle this bit in QC, you can do:
+//  self.effects += (EF_TELEPORT_BIT - 2 * (self.effects & EF_TELEPORT_BIT));
+
 //DP_ENT_ALPHA
 //idea: Nehahra
 //darkplaces implementation: LordHavoc
@@ -734,6 +735,22 @@
 //gettagindex returns the number of a tag on an entity, this number is the same as set by setattachment (in the .tag_index field), allowing the qc to save a little cpu time by keeping the number around if it wishes (this could already be done by calling setattachment and saving off the tag_index).
 //gettaginfo returns the origin of the tag in worldspace and sets v_forward, v_right, and v_up to the current orientation of the tag in worldspace, this automatically resolves all dependencies (attachments, including viewmodelforclient), this means you could fire a shot from a tag on a gun entity attached to the view for example.
 
+//DP_QC_GETTAGINFO_BONEPROPERTIES
+//idea: daemon
+//DarkPlaces implementation: div0
+//global definitions:
+float gettaginfo_parent;
+string gettaginfo_name;
+vector gettaginfo_offset;
+vector gettaginfo_forward;
+vector gettaginfo_right;
+vector gettaginfo_up;
+//description:
+//when this extension is present, gettaginfo fills in some globals with info about the bone that had been queried
+//gettaginfo_parent is set to the number of the parent bone, or 0 if it is a root bone
+//gettaginfo_name is set to the name of the bone whose index had been specified in gettaginfo
+//gettaginfo_offset, gettaginfo_forward, gettaginfo_right, gettaginfo_up contain the transformation matrix of the bone relative to its parent. Note that the matrix may contain a scaling component.
+
 //DP_QC_MINMAXBOUND
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -1265,6 +1282,10 @@
 float(string effectname) particleeffectnum = #335; // same as in CSQC
 void(entity ent, float effectnum, vector start, vector end) trailparticles = #336; // same as in CSQC
 void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC
+//SVC definitions:
+//float svc_trailparticles = 60; // [short] entnum [short] effectnum [vector] start [vector] end
+//float svc_pointparticles = 61; // [short] effectnum [vector] start [vector] velocity [short] count
+//float svc_pointparticles1 = 62; // [short] effectnum [vector] start, same as svc_pointparticles except velocity is zero and count is 1
 //description:
 //provides the ability to spawn non-standard particle effects, typically these are defined in a particle effect information file such as effectinfo.txt in darkplaces.
 //this is a port of particle effect features from clientside QC (EXT_CSQC) to server QC, as these effects are potentially useful to all games even if they do not make use of EXT_CSQC.

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -958,7 +958,10 @@
 			force = '0 0 -1';
 		else
 			force = normalize(force);
-		Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype);
+		if(forceintensity >= 0)
+			Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype);
+		else
+			Damage_DamageInfo(blastorigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype);
 	}
 
 	targ = findradius (blastorigin, rad);

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -568,6 +568,11 @@
 		}
 	}
 
+	if(cvar("loddebug") < 0)
+	{
+		self.lodmodel1 = self.lodmodel2 = ""; // don't even initialize
+	}
+
 	if(self.lodmodel1 != "")
 	{
 		vector mi, ma;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -547,6 +547,8 @@
 	addstat(STAT_STRENGTH_FINISHED, AS_FLOAT, strength_finished);
 	addstat(STAT_INVINCIBLE_FINISHED, AS_FLOAT, invincible_finished);
 
+	addstat(STAT_PRESSED_KEYS, AS_FLOAT, pressedkeys);
+
 	next_pingtime = time + 5;
 	InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
 
@@ -1324,25 +1326,57 @@
 float checkrules_oneminutewarning;
 
 float checkrules_equality;
-float checkrules_overtimewarning;
-float checkrules_overtimeend;
+float checkrules_suddendeathwarning;
+float checkrules_suddendeathend;
+float checkrules_overtimesadded; //how many overtimes have been already added
+float checkrules_status;
 
+float WINNING_NO = 0; // no winner, but time limits may terminate the game
+float WINNING_YES = 1; // winner found
+float WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached
+float WINNING_STARTSUDDENDEATHOVERTIME = 3; // no winner, enter suddendeath overtime NOW
+
 void InitiateOvertime()
 {
-	if(!checkrules_overtimeend)
-		checkrules_overtimeend = time + 60 * cvar("timelimit_maxovertime");
+	// Check first whether normal overtimes could be added before initiating suddendeath mode
+	// - for this timelimit_overtime needs to be >0 of course
+	// - also check the winning condition calculated in the previous frame and only add normal overtime
+	//   again, if at the point at which timelimit would be extended again, still no winner was found
+	if ((checkrules_overtimesadded < cvar("timelimit_overtimes")) && cvar("timelimit_overtime") && (checkrules_status == WINNING_NEVER)) 
+	{
+		++checkrules_overtimesadded;
+		//add one more overtime by simply extending the timelimit
+		float tl;
+		tl = cvar("timelimit");
+		tl += cvar("timelimit_overtime");
+		cvar_set("timelimit", ftos(tl));
+		string minutesPlural;
+		if (cvar("timelimit_overtime") == 1)
+			minutesPlural = " ^3minute";
+		else
+			minutesPlural = " ^3minutes";
+		
+		bcenterprint(
+			strcat(
+				"^3Now playing ^1OVERTIME^3!\n\n^3Added ^1",
+				ftos(cvar("timelimit_overtime")),
+				minutesPlural,
+				" to the game!"
+			)
+		);
+	}
+	else 
+	{
+		if(!checkrules_suddendeathend)
+			checkrules_suddendeathend = time + 60 * cvar("timelimit_suddendeath");
+	}
 }
 
-float WINNING_NO = 0; // no winner, but time limits may terminate the game
-float WINNING_YES = 1; // winner found
-float WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached
-float WINNING_STARTOVERTIME = 3; // no winner, enter overtime NOW
-
 float GetWinningCode(float fraglimitreached, float equality)
 {
 	if(equality)
 		if(fraglimitreached)
-			return WINNING_STARTOVERTIME;
+			return WINNING_STARTSUDDENDEATHOVERTIME;
 		else
 			return WINNING_NEVER;
 	else
@@ -1650,12 +1684,12 @@
 	wc = WinningCondition_Scores(fraglimit);
 
 	// ALWAYS initiate overtime, unless EVERYONE has finished the race!
-	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
+	if(wc == WINNING_YES || wc == WINNING_STARTSUDDENDEATHOVERTIME)
 	// do NOT support equality when the laps are all raced!
 	{
 		FOR_EACH_PLAYER(p)
 			if not(p.race_completed)
-				return WINNING_STARTOVERTIME;
+				return WINNING_STARTSUDDENDEATHOVERTIME;
 		return WINNING_YES;
 	}
 	return wc;
@@ -1668,7 +1702,7 @@
 	wc = WinningCondition_Scores(limit);
 
 	// NEVER initiate overtime
-	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
+	if(wc == WINNING_YES || wc == WINNING_STARTSUDDENDEATHOVERTIME)
 	{
 		return WINNING_YES;
 	}
@@ -1750,7 +1784,6 @@
 */
 void CheckRules_World()
 {
-	local float status;
 	local float timelimit;
 	local float fraglimit;
 
@@ -1801,12 +1834,11 @@
 		return;
 	}
 
-	if(checkrules_overtimeend)
+	if(checkrules_suddendeathend)
 	{
-		if(!checkrules_overtimewarning)
+		if(!checkrules_suddendeathwarning)
 		{
-			checkrules_overtimewarning = TRUE;
-			//announceall("announcer/robotic/1minuteremains.wav");
+			checkrules_suddendeathwarning = TRUE;
 			if(g_race && !g_race_qualifying)
 				bcenterprint("^3Everyone, finish your lap! The race is over!");
 			else
@@ -1837,7 +1869,7 @@
 				// otherwise, the players should end the qualifying on their own
 				if(readyplayers || ((totalplayers >= 3) && (playerswithlaps * 3 >= totalplayers * 2)))
 				{
-					checkrules_overtimeend = 0;
+					checkrules_suddendeathend = 0;
 					ReadyRestart(); // go to race
 				}
 				else
@@ -1848,7 +1880,7 @@
 		}
 	}
 
-	if (checkrules_overtimeend && time >= checkrules_overtimeend)
+	if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
 	{
 		NextLevel();
 		return;
@@ -1860,51 +1892,51 @@
 		play2all("announcer/robotic/1minuteremains.wav");
 	}
 
-	status = WinningCondition_RanOutOfSpawns();
-	if(status == WINNING_YES)
+	checkrules_status = WinningCondition_RanOutOfSpawns();
+	if(checkrules_status == WINNING_YES)
 	{
 		bprint("Hey! Someone ran out of spawns!\n");
 	}
 	else if(g_race && !g_race_qualifying && timelimit >= 0)
 	{
-		status = WinningCondition_Race(fraglimit);
+		checkrules_status = WinningCondition_Race(fraglimit);
 	}
 	else if(g_race && g_race_qualifying == 2 && timelimit >= 0)
 	{
-		status = WinningCondition_QualifyingThenRace(fraglimit);
+		checkrules_status = WinningCondition_QualifyingThenRace(fraglimit);
 	}
 	else if(g_assault)
 	{
-		status = WinningCondition_Assault(); // TODO remove this?
+		checkrules_status = WinningCondition_Assault(); // TODO remove this?
 	}
 	else if(g_lms)
 	{
-		status = WinningCondition_LMS();
+		checkrules_status = WinningCondition_LMS();
 	}
 	else if (g_onslaught)
 	{
-		status = WinningCondition_Onslaught(); // TODO remove this?
+		checkrules_status = WinningCondition_Onslaught(); // TODO remove this?
 	}
 	else
 	{
-		status = WinningCondition_Scores(fraglimit);
+		checkrules_status = WinningCondition_Scores(fraglimit);
 	}
 
-	if(status == WINNING_STARTOVERTIME)
+	if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME)
 	{
-		status = WINNING_NEVER;
+		checkrules_status = WINNING_NEVER;
 		InitiateOvertime();
 	}
 
-	if(status == WINNING_NEVER)
+	if(checkrules_status == WINNING_NEVER)
 		// equality cases! Nobody wins if the overtime ends in a draw.
 		ClearWinners();
 
-	if(checkrules_overtimeend)
-		if(status != WINNING_NEVER || time >= checkrules_overtimeend)
-			status = WINNING_YES;
+	if(checkrules_suddendeathend)
+		if(checkrules_status != WINNING_NEVER || time >= checkrules_suddendeathend)
+			checkrules_status = WINNING_YES;
 
-	if(status == WINNING_YES)
+	if(checkrules_status == WINNING_YES)
 		NextLevel();
 };
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,6 +2,8 @@
 .void() havocbot_role;
 void() havocbot_chooserole;
 .float havocbot_keyboardskill;
+.float facingwalltime, ignoregoaltime;
+.entity ignoregoal;
 
 vector havocbot_dodge()
 {
@@ -55,10 +57,82 @@
 	*/
 };
 
-//.float havocbotignoretime;
 .float havocbot_keyboardtime;
 .float havocbot_ducktime;
 .vector havocbot_keyboard;
+void havocbot_keyboard_movement(vector destorg)
+{
+	local vector keyboard;
+	local float blend, maxspeed;
+
+	maxspeed = cvar("sv_maxspeed");	
+
+	if (time < self.havocbot_keyboardtime)
+		return;
+
+	self.havocbot_keyboardtime =
+		max(
+			self.havocbot_keyboardtime
+				+ bound(0,0.05/(skill+self.havocbot_keyboardskill),0.05)
+				+random()*bound(0,0.025/(skill+self.havocbot_keyboardskill),100)
+		, time);
+	keyboard = self.movement * (1.0 / maxspeed);
+
+	local float trigger, trigger1;
+	blend = bound(0,skill*0.1,1);
+	trigger = cvar("bot_ai_keyboard_treshold");
+	trigger1 = 0 - trigger;
+
+	// categorize forward movement
+	// at skill < 1.5 only forward
+	// at skill < 2.5 only individual directions
+	// at skill < 4.5 only individual directions, and forward diagonals
+	// at skill >= 4.5, all cases allowed
+	if (keyboard_x > trigger)
+	{
+		keyboard_x = 1;
+		if (skill < 2.5)
+			keyboard_y = 0;
+	}
+	else if (keyboard_x < trigger1 && skill > 1.5)
+	{
+		keyboard_x = -1;
+		if (skill < 4.5)
+			keyboard_y = 0;
+	}
+	else
+	{
+		keyboard_x = 0;
+		if (skill < 1.5)
+			keyboard_y = 0;
+	}
+	if (skill < 4.5)
+		keyboard_z = 0;
+
+	if (keyboard_y > trigger)
+		keyboard_y = 1;
+	else if (keyboard_y < trigger1)
+		keyboard_y = -1;
+	else
+		keyboard_y = 0;
+
+	if (keyboard_z > trigger)
+		keyboard_z = 1;
+	else if (keyboard_z < trigger1)
+		keyboard_z = -1;
+	else
+		keyboard_z = 0;
+
+	self.havocbot_keyboard = keyboard * maxspeed;
+	if (self.havocbot_ducktime>time) self.BUTTON_CROUCH=TRUE;
+
+	keyboard = self.havocbot_keyboard;
+	blend = bound(0,vlen(destorg-self.origin)/cvar("bot_ai_keyboard_distance"),1); // When getting close move with 360 degree
+	//dprint("movement ", vtos(self.movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
+	self.movement = self.movement + (keyboard - self.movement) * blend;
+};
+
+//.float havocbotignoretime;
 //.vector bot_dodgevector;
 //.float bot_dodgevector_time;
 //.float bot_dodgevector_jumpbutton;
@@ -91,13 +165,26 @@
 
 	if (self.goalcurrent == world)
 		return;
+
 	navigation_poptouchedgoals();
 	if (self.goalcurrent == world)
 	{
-		// ran out of goals, rethink strategy as soon as possible
-		self.bot_strategytime = 0;
+		if(self.alternativegoal==world)
+		{
+			// ran out of goals, rethink strategy as soon as possible
+			self.bot_strategytime = 0;
+			return;
+		}
+		// try to use the alternative goal
+		navigation_findnearestwaypoint(self.alternativegoal, TRUE);
+		navigation_routetogoal(self.alternativegoal);
+		self.alternativegoal = world;
 		return;
 	}
+
+//	te_wizspike(self.goalcurrent.origin);
+//	te_lightning2(world, self.origin, self.goalcurrent.origin);
+
 	m1 = self.goalcurrent.origin + self.goalcurrent.mins;
 	m2 = self.goalcurrent.origin + self.goalcurrent.maxs;
 	destorg = self.origin;
@@ -109,23 +196,21 @@
 	dir = normalize(diff);
 	flatdir = diff;flatdir_z = 0;
 	flatdir = normalize(flatdir);
+
 	//if (self.bot_dodgevector_time < time)
 	{
 	//	self.bot_dodgevector_time = time + cvar("bot_ai_dodgeupdateinterval");
 	//	self.bot_dodgevector_jumpbutton = 1;
 		evadeobstacle = '0 0 0';
 		evadelava = '0 0 0';
-		if (!self.waterlevel)
+		if (self.waterlevel)
 		{
-			// Since new update in air contol, we can move in air
-			//if (!(self.flags & FL_ONGROUND))
-			//{
-			//	// prevent goal checks when we can't walk
-			//	if (self.bot_strategytime < time + 0.1)
-			//		self.bot_strategytime = time + 0.1;
-			//	return;
-			//}
-
+			makevectors(self.v_angle);
+			self.BUTTON_JUMP = TRUE;
+			evadelava_z = 1;
+		}
+		else
+		{
 			// jump if going toward an obstacle that doesn't look like stairs we
 			// can walk up directly
 			tracebox(self.origin, self.mins, self.maxs, self.origin + self.velocity * 0.2, FALSE, self);
@@ -144,18 +229,75 @@
 				}
 			}
 
-			traceline(self.origin + self.velocity * 0.3, self.origin + self.velocity * 0.3 + '0 0 -1000', TRUE, world);
-			s = pointcontents(trace_endpos + '0 0 1');
-			if (s == CONTENT_LAVA || s == CONTENT_SLIME)
-				evadelava = normalize(self.velocity) * -1;
+			// avoiding dangers and obstacles
+			// TODO: don't make this check every frame
+			if(self.flags & FL_ONGROUND)
+			{
+				local vector dst_ahead, dst_down;
+				dst_ahead = self.origin + self.view_ofs + (self.velocity * 0.3);
+				dst_down = dst_ahead + '0 0 -1500';				
+				
+				traceline(self.origin + self.view_ofs , dst_ahead, TRUE, world);
 
+				// Check head-banging against walls
+				if(vlen(self.origin + self.view_ofs - trace_endpos) < 2)
+				{
+					if(self.facingwalltime && time > self.facingwalltime)
+					{
+						self.ignoregoal = self.goalcurrent;
+						self.ignoregoaltime = time + cvar("bot_ai_ignoregoal_timeout");
+						navigation_poproute();
+					}
+					else
+					{
+						self.facingwalltime = time + 0.05;
+					}
+				}
+				else
+				{
+					self.facingwalltime = 0;
+
+					if(self.ignoregoal != world && time > self.ignoregoaltime)
+					{
+						self.ignoregoal = world;
+						self.ignoregoaltime = 0;
+					}
+				}
+			
+				// Check for water/slime/lava and edges
+				if(trace_fraction == 1){
+					traceline(dst_ahead , dst_down, TRUE, world);
+					//	te_lightning2(world, self.origin, dst_ahead);	// Draw "ahead" look 
+					s = pointcontents(trace_endpos + '0 0 1');
+					if (s != CONTENT_SOLID)
+					if (s == CONTENT_LAVA || s == CONTENT_SLIME)
+						evadelava = normalize(self.velocity) * -1;
+					else if (s == CONTENT_SKY)
+						evadeobstacle = normalize(self.velocity) * -1;
+					else if (tracebox_hits_trigger_hurt(dst_ahead, self.mins, self.maxs, trace_endpos))
+					{
+						//	te_lightning2(world, dst_ahead, dst_down);	// Draw "downwards" look
+						// if ain't a safe goal with "holes" (like the soylent jumpad)
+						if(!boxesoverlap(dst_ahead - self.view_ofs + self.mins, dst_ahead - self.view_ofs + self.maxs, 
+								self.goalcurrent.absmin, self.goalcurrent.absmax))
+						{
+							// Remove dangerous dynamic goals from stack
+							if (self.goalcurrent.classname == "player" || self.goalcurrent.classname == "droppedweapon")
+								navigation_poproute();
+							// try to stop
+							flatdir = '0 0 0';
+							evadeobstacle = normalize(self.velocity) * -1;
+						}
+					}
+				}
+			}
+
 			dir = flatdir;
 			evadeobstacle_z = 0;
 			evadelava_z = 0;
 			makevectors(self.v_angle_y * '0 1 0');
 		}
-		else
-			makevectors(self.v_angle);
+
 		dodge = havocbot_dodge();
 		dodge = dodge * bound(0,3+skill*0.1,1);
 		evadelava = evadelava * bound(1,3-skill,3); //Noobs fear lava a lot and take more distance from it
@@ -176,79 +318,13 @@
 	self.movement_y = dir * v_right * maxspeed;
 	self.movement_z = dir * v_up * maxspeed;
 
+	// Emulate keyboard interface
 	if (skill < 10)
-	{
-		// Emulate keyboard interface;
-		local vector keyboard;
-		local float blend;
-		if (time >= self.havocbot_keyboardtime)
-		{
-			self.havocbot_keyboardtime =
-				max(
-					self.havocbot_keyboardtime
-						+ bound(0,0.05/(skill+self.havocbot_keyboardskill),0.05)
-						+random()*bound(0,0.025/(skill+self.havocbot_keyboardskill),100)
-				, time);
-			keyboard = self.movement * (1.0 / maxspeed);
+		havocbot_keyboard_movement(destorg);
 
-			local float trigger, trigger1;
-			blend = bound(0,skill*0.1,1);
-			trigger = cvar("bot_ai_keyboard_treshold");
-			trigger1 = 0 - trigger;
-
-			// categorize forward movement
-			// at skill < 1.5 only forward
-			// at skill < 2.5 only individual directions
-			// at skill < 4.5 only individual directions, and forward diagonals
-			// at skill >= 4.5, all cases allowed
-			if (keyboard_x > trigger)
-			{
-				keyboard_x = 1;
-				if (skill < 2.5)
-					keyboard_y = 0;
-			}
-			else if (keyboard_x < trigger1 && skill > 1.5)
-			{
-				keyboard_x = -1;
-				if (skill < 4.5)
-					keyboard_y = 0;
-			}
-			else
-			{
-				keyboard_x = 0;
-				if (skill < 1.5)
-					keyboard_y = 0;
-			}
-			if (skill < 4.5)
-				keyboard_z = 0;
-
-			if (keyboard_y > trigger)
-				keyboard_y = 1;
-			else if (keyboard_y < trigger1)
-				keyboard_y = -1;
-			else
-				keyboard_y = 0;
-
-			if (keyboard_z > trigger)
-				keyboard_z = 1;
-			else if (keyboard_z < trigger1)
-				keyboard_z = -1;
-			else
-				keyboard_z = 0;
-
-			self.havocbot_keyboard = keyboard * maxspeed;
-			if (self.havocbot_ducktime>time) self.BUTTON_CROUCH=TRUE;
-		}
-		keyboard = self.havocbot_keyboard;
-		blend = bound(0,vlen(destorg-self.origin)/cvar("bot_ai_keyboard_distance"),1); // When getting close move with 360 degree
-		//dprint("movement ", vtos(self.movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
-		self.movement = self.movement + (keyboard - self.movement) * blend;
-	}
-
 	if ((dir * v_up) >= cvar("sv_jumpvelocity")*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
 	if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill)*0.1,1)) self.BUTTON_JUMP=TRUE;
 	if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill,10);
-
 };
 
 .float havocbot_chooseenemy_finished;
@@ -317,7 +393,7 @@
 		head = head.chain;
 	}
 	self.enemy = best;
-	self.havocbot_stickenemy = 1;
+	self.havocbot_stickenemy = TRUE;
 };
 
 .float bot_chooseweapontime;
@@ -533,6 +609,8 @@
 void havocbot_aim()
 {
 	local vector selfvel, enemyvel;
+	if(self.flags & FL_INWATER)
+		return;
 	if (time < self.nextaim)
 		return;
 	self.nextaim = time + 0.1;
@@ -559,6 +637,9 @@
 		// token has been used this frame
 		bot_strategytoken_taken = TRUE;
 	}
+	if(self.deadflag)
+		return;
+
 	havocbot_chooseenemy();
 	if (self.bot_chooseweapontime < time )
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,7 +1,6 @@
 
 .float havocbot_role_timeout;
 .void() havocbot_previous_role;
-.float bot_strategytime;
 .void() havocbot_role;
 float bot_ignore_bots;
 
@@ -103,11 +102,30 @@
 		friend_distance = 10000; enemy_distance = 10000;
 		rating = 0;
 	
-		if(!head.solid || distance > sradius ){
+		if(!head.solid || distance > sradius || head == self.ignoregoal )
+		{
 			head = head.chain;
 			continue;		
 		}
 
+		// Check if the item can be picked up safely
+		if(head.classname == "droppedweapon")
+		{
+			traceline(head.origin, head.origin + '0 0 -1500', TRUE, world);
+
+			d = pointcontents(trace_endpos + '0 0 1');
+			if(d & CONTENT_WATER || d & CONTENT_SLIME || d & CONTENT_LAVA)
+			{
+				head = head.chain;
+				continue;		
+			}
+			if(tracebox_hits_trigger_hurt(head.origin, head.mins, head.maxs, trace_endpos))
+			{
+				head = head.chain;
+				continue;
+			}
+		}
+		
 		if(teamplay)
 		{
 			discard = FALSE;
@@ -115,7 +133,7 @@
 			FOR_EACH_PLAYER(player)
 			{
 
-				if ( self == player || player.deadflag != DEAD_NO)
+				if ( self == player || player.deadflag )
 					continue;
 
 				d = vlen(player.origin - head.origin); // distance between player and item
@@ -227,19 +245,39 @@
 	local entity head;
 	local float t, noteam;
 	noteam = ((self.team == 0) || (teamplay == 0)); // fteqcc sucks
-	//dprint("teamplay is "); dprint(ftos(teamplay)); dprint(", own team is ");
-	//dprint(ftos(self.team)); dprint(" -> noteam is "); dprint(ftos(noteam));
-	//dprint("\n");
 
 	FOR_EACH_PLAYER(head)
 	{
 		if (self != head)
 		if (head.health > 0)
 		if ((noteam && (!bot_ignore_bots || clienttype(head) == CLIENTTYPE_REAL)) || head.team != self.team)
-		if (vlen(head.origin - org) < sradius)
 		{
+			if (vlen(head.origin - org) > sradius)
+				continue;
+				
+			// rate only visible enemies
+			/*
+			traceline(self.origin + self.view_ofs, head.origin, MOVE_NOMONSTERS, self);
+			if (trace_fraction < 1 || trace_ent != head)
+				continue;
+			*/
+			
+			if(head.flags & FL_INWATER || head.flags & FL_PARTIALGROUND)
+				continue;
+			
+			// not falling
+			if(head.flags & FL_ONGROUND == 0)
+			{
+				traceline(head.origin, head.origin + '0 0 -1500', TRUE, world);
+				t = pointcontents(trace_endpos + '0 0 1');
+				if( t != CONTENT_SOLID )
+				if(t & CONTENT_WATER || t & CONTENT_SLIME || t & CONTENT_LAVA)
+					continue;
+				if(tracebox_hits_trigger_hurt(head.origin, head.mins, head.maxs, trace_endpos))
+					continue;
+			}
+
 			t = (self.health + self.armorvalue ) / (head.health + head.armorvalue );
-		//	clientcommand(self, strcat("say rating ", ftos(t*ratingscale)));
 			navigation_routerating(head, t * ratingscale, 2000);
 		}
 	}
@@ -676,7 +714,7 @@
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
 		havocbot_goalrating_items(10000, self.origin, 10000);
-		havocbot_goalrating_enemyplayers(10000, self.origin, 20000);
+		havocbot_goalrating_enemyplayers(5000, self.origin, 20000);
 		//havocbot_goalrating_waypoints(1, self.origin, 1000);
 		navigation_goalrating_end();
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1967,3 +1967,36 @@
 	else
 		return FALSE;
 }
+
+void zcurveparticles(float effectno, vector start, vector end, float end_dz, float spd)
+{
+	WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
+	WriteByte(MSG_BROADCAST, TE_CSQC_ZCURVEPARTICLES);
+	WriteShort(MSG_BROADCAST, effectno);
+	WriteCoord(MSG_BROADCAST, start_x);
+	WriteCoord(MSG_BROADCAST, start_y);
+	WriteCoord(MSG_BROADCAST, start_z);
+	WriteCoord(MSG_BROADCAST, end_x);
+	WriteCoord(MSG_BROADCAST, end_y);
+	WriteCoord(MSG_BROADCAST, end_z);
+	WriteCoord(MSG_BROADCAST, end_dz);
+	WriteShort(MSG_BROADCAST, spd / 16);
+}
+
+void zcurveparticles_from_tracetoss(float effectno, vector start, vector end, vector vel)
+{
+	float end_dz;
+	vector vecxy, velxy;
+
+	vecxy = end - start; vecxy_z = 0;
+	velxy = vel;         velxy_z = 0;
+
+	if(vlen(velxy) < 0.000001 * fabs(vel_z))
+	{
+		trailparticles(world, effectno, start, end);
+		return;
+	}
+
+	end_dz = vlen(vecxy) / vlen(velxy) * vel_z - (end_z - start_z);
+	zcurveparticles(effectno, start, end, end_dz, vlen(vel));
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,6 +1,6 @@
-#define PLF_GROUNDSNAP 1
-#define PLF_NOOPTIMIZE 2
-#define PLF_SUBPATH3D  4
+#define PFL_GROUNDSNAP 1
+#define PFL_NOOPTIMIZE 2
+#define PFL_SUBPATH3D  4
 
 #define PT_QUICKSTAR 1
 #define PT_QUICKBOX  2
@@ -76,7 +76,7 @@
     else
         point.classname = "path_end";
 
-    if (point.owner.path_flags & PLF_GROUNDSNAP)
+    if (point.owner.path_flags & PFL_GROUNDSNAP)
         where = pathlib_groundsnap(where);
 
     setorigin(point,where);
@@ -115,7 +115,7 @@
 
     step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
 
-    if(start.owner.path_flags & PLF_SUBPATH3D)
+    if(start.owner.path_flags & PFL_SUBPATH3D)
     {
         zmin = maxsize * -1;
         zmax = maxsize;
@@ -133,7 +133,7 @@
 
         point = vcrash + box;
 
-        if(start.owner.path_flags & PLF_GROUNDSNAP)
+        if(start.owner.path_flags & PFL_GROUNDSNAP)
             point = pathlib_groundsnap(point);
 
         if(self.path_validate(start.origin,point))
@@ -363,9 +363,8 @@
     if(subpathing_bboxexpand < 1)
         subpathing_bboxexpand = 1;
 
-    if(pathflags & PLF_GROUNDSNAP)
+    if(pathflags & PFL_GROUNDSNAP)
     {
-        //bprint("SnapIT!\n");
         from = pathlib_groundsnap(from);
         to = pathlib_groundsnap(to);
     }
@@ -458,7 +457,7 @@
     }
 
     setsize(self,'-50 -50 0','50 50 50');
-    path = pathlib_makepath(self.origin,end.origin, PLF_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
+    path = pathlib_makepath(self.origin,end.origin, PFL_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
 
     if(!path)
     {

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-02-20 14:23:51 UTC (rev 5912)
@@ -48,8 +48,8 @@
 bots.qc
 
 // LordHavoc's bots
+havocbot.qc
 havocbot_roles.qc
-havocbot.qc
 
 g_subs.qc
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/race.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/race.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/race.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -153,6 +153,7 @@
 						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/time"), ftos(t));
 						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/netname"), e.netname);
 						GameLogEcho(strcat(":recordset:", ftos(e.playerid), ":", ftos(t / 10)));
+						stuffcmd(e, strcat("//RACE RECORD SET ", mmsss(t), "\n"));
 					}
 					else if(t < grecordtime)
 					{
@@ -163,6 +164,7 @@
 						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/time"), ftos(t));
 						db_put(ServerProgsDB, strcat(GetMapname(), "/racerecord/netname"), e.netname);
 						GameLogEcho(strcat(":recordset:", ftos(e.playerid), ":", ftos(t / 10)));
+						stuffcmd(e, strcat("//RACE RECORD SET ", mmsss(t), "\n"));
 					}
 					else
 					{

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -293,6 +293,7 @@
 	entity s;
 
 	if(gameover)
+	if not(g_lms && scorefield == SP_LMS_RANK) // allow writing to this field in intermission as it is needed for newly joining players
 		score = 0;
 
 	if(!scores_initialized) return 0; // FIXME remove this when everything uses this system

Modified: branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/scores_rules.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -155,7 +155,7 @@
 	}
 	else
 	{
-		ScoreInfo_SetLabel_TeamScore(  ST_RACE_LAPS,    "laps",      0);
+		//ScoreInfo_SetLabel_TeamScore(  ST_RACE_LAPS,    "laps",      0);
 		ScoreInfo_SetLabel_PlayerScore(SP_RACE_LAPS,    "laps",      SFL_SORT_PRIO_PRIMARY);
 		ScoreInfo_SetLabel_PlayerScore(SP_RACE_TIME,    "time",      SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER | SFL_TIME);
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -64,6 +64,7 @@
 	player.angles = to_angles;
 	player.fixangle = TRUE;
 	player.velocity = to_velocity;
+	BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
 
 	UpdateCSQCProjectile(player);
 
@@ -72,10 +73,6 @@
 		if(player.takedamage && player.deadflag == DEAD_NO && !g_race)
 			tdeath(player, teleporter, telefragger, telefragmin, telefragmax);
 
-		// hide myself a tic
-		player.effects = player.effects | EF_NODRAW;
-		player.teleport_time = time + cvar("sys_ticrate");
-
 		// player no longer is on ground
 		player.flags &~= FL_ONGROUND;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -367,11 +367,11 @@
 {
 	string s, mutator, modifications, motd;
 
-	/*if(self.welcomemessage_time > time)
+	if(self.cvar_scr_centertime == 0) return;
+	if((time - self.jointime) > cvar("welcome_message_time")
+	   && !self.BUTTON_INFO)
 		return;
-	self.welcomemessage_time = time + 0.8; */
 
-	if(self.cvar_scr_centertime == 0) return;
 	if( !(timeoutStatus >= 1 || (time < game_starttime) ) ) { //really print the WelcomeMessage to the player every frame when timeout-seconds are shown or the game is restarted, to make sure that the shown number is accurate
 		if(self.welcomemessage_time > time) return;
 		self.welcomemessage_time = time + self.cvar_scr_centertime * 0.6;
@@ -485,7 +485,6 @@
 	s = strcat(s, "\n");
 
 	centerprint(pl, s);
-	//sprint(pl, s);
 }
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -25,5 +25,6 @@
 #include "../units/unit_tessla.qc"  /// Chain lightning capabale turret
 #include "../units/unit_walker.qc"
 #include "../units/unit_ewheel.qc"
+//#include "../units/unit_hive.qc"
 
 #endif // TTURRETS_ENABLED

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -3,7 +3,7 @@
 
 #ifdef TTURRETS_ENABLED
 
-#message "with tZork turrets rc2"
+#message "with tZork turrets"
 
 vector real_origin(entity ent);
 
@@ -39,9 +39,9 @@
 #define TFL_AIM_NO                  1
 /// Go for ground, not direct hit
 #define TFL_AIM_GROUND              2
-/// Go for ground, not direct hit if target is on ground too
+/// Go for ground, not direct hit, but only if target is on ground.
 #define TFL_AIM_GROUND2              4
-/// Use balistic aim (not implemented)
+/// Use balistic aim. FIXME: not implemented
 #define TFL_AIM_BALISTIC            8
 /// Try to predict target movement (does not account for gravity)
 #define TFL_AIM_LEAD                16
@@ -53,9 +53,9 @@
 #define TFL_AIM_BEHIND              128
 /// blend real and predicted z positions. (fake bounce prediction)
 #define TFL_AIM_ZEASE               256
-/// Try to do real prediction of targets z pos at impact.
+// Try to do real prediction of targets z pos at impact.
 //#define TFL_AIM_ZPREDICT            256
-/// Just poitn at target's current location
+/// Simply aim at target's current location
 #define TFL_AIM_SIMPLE              512
 
 /// track (turn and pitch head) flags
@@ -73,7 +73,7 @@
 #define TFL_TRACKTYPE_STEPMOTOR    1
 /// Smoth absolute movement. Looks ok, fair accuracy.
 #define TFL_TRACKTYPE_FLUIDPRECISE 2
-/// Simulated inertia. "Wobbly mode" Looks kool, can mean terrible accuracy depending on how the feilds below are set
+/// Simulated inertia. "Wobbly mode" Looks kool, can mean really bad accuracy depending on how the feilds below are set
 #define TFL_TRACKTYPE_FLUIDINERTIA 3
 /// TFL_TRACKTYPE_FLUIDINERTIA: pitch multiplier
 .float track_accel_pitch;
@@ -191,7 +191,7 @@
 #define  TFL_DMG_RETALIATEONTEAM 16
 /// Loses target when damaged
 #define  TFL_DMG_TARGETLOSS      32
-/// Reciving damage trows off aim
+/// Reciving damage trows off aim (pointless atm, aim gets recalculated to fast). not implemented.
 #define  TFL_DMG_AIMSHAKE        64
 /// Reciving damage slaps the head arround
 #define  TFL_DMG_HEADSHAKE       128
@@ -212,32 +212,49 @@
 */
 /// Turrets internal ai speed
 .float      ticrate;
-/// Where to point the head when no target
+
+/// Where to point the when no target
 .vector     idle_aim;
+
 /// Top part of turret
 .entity     tur_head;
+
 /// Start/respawn health
 .float      tur_health;
+
 /// Defend this entity (or ratehr this entitys position)
 .entity     tur_defend;
+
 /// on/off toggle.
 .float      tur_active;
+
 /// Aim from this point,
 .vector     tur_aimorg;
+
 /// and shoot from here. (could be non constant, think MLRS)
 .vector     tur_shotorg;
+
 /// Aim at this spot
 .vector     tur_aimpos;
+
 /// Predicted time the round will impact
 .float      tur_impacttime;
+
 /// Predicted place the round will impact
 .vector     tur_impactpoint;
+
 /// What entity the aimtrace hit, if any.
 .entity     tur_impactent;
+
 /// Distance to enemy
 .float      tur_dist_enemy;
+
+/// Distance to aimspot
+.float      tur_dist_aimpos;
+
 /// Distance impact<->aim
-.float      tur_dist_toaimpos;
+.float      tur_dist_impact_to_aimpos;
+
 /// Decresment counter form .shot_volly to 0.
 .float      volly_counter;
 
@@ -261,7 +278,7 @@
 .float shot_force;
 /// < 1 = shoot # times at target (if possible)
 .float shot_volly;
-/// Refire after a compleated or borken volly.
+/// Refire after a compleated volly.
 .float shot_volly_refire;
 
 /// Consider targets within this range
@@ -294,7 +311,7 @@
 */
 /// Maximum offset between impact and aim spot to fire
 .float aim_firetolerance_dist;
-/// Maximum angular offset between head and aimspot to fire
+// Maximum angular offset between head and aimspot to fire
 //.float aim_firetolerance_angle;
 /// How fast can i rotate/pitch (per second in stepmotor mode, base force in smooth modes)
 .float aim_speed;
@@ -340,7 +357,7 @@
 .float() turret_firecheckfunc;
 // Execure BEFORE main ai loop. return 0 to cancel any following proccessing.
 //.float() turret_prethink;
-/// Execure AFTER main AI loop UNLESS turret_prethink returnd 0
+/// Execure AFTER main AI loop
 .void()  turret_postthink;
 
 /// Add a target
@@ -373,7 +390,7 @@
 
 removed.
 */
-/// function used to aim, usualy turret_stdproc_aim_generic
+// function used to aim, usualy turret_stdproc_aim_generic
 //.vector() turret_aim;
 
 /*

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -52,10 +52,11 @@
 vector turret_stdproc_aim_generic()
 {
     vector pre_pos;
-    // entity mover;
+    float distance,impact_time,i,mintime;
+    vector prep;
 
-    if (self.aim_flags == TFL_AIM_NO)
-        return self.idle_aim;
+    //if (self.aim_flags == TFL_AIM_NO)
+    //  return self.idle_aim;
 
     // Baseline
     pre_pos = real_origin(self.enemy);
@@ -63,41 +64,63 @@
     if(self.aim_flags & TFL_AIM_SIMPLE)
         return pre_pos;
 
+    // This is not accurate enougth
+    //pre_pos = bot_shotlead(pre_pos, self.enemy.velocity, self.shot_speed, 0.01); //self.enemy.velocity;  * (self.tur_dist_aimpos / self.shot_speed);
+
+    // Keep track of when we can shoot the next tim and
+    // try to predict where the target will be then, so we can put our aimpoint there.
+    // + sys_ticrate becouse projectiles dont move during the first tic of their life.
+    mintime = max(self.attack_finished_single - time,0) + (sys_ticrate * 2);
+
+    if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target
+        pre_pos += normalize(normalize(self.enemy.velocity) * 16);
+
+    if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target
+        pre_pos -= normalize(normalize(self.enemy.velocity) * 16);
+
     // Lead?
-    //pre_pos = pre_pos + bot_shotlead(self.enemy.origin, self.enemy.velocity, self.shot_speed, 0.01); //self.enemy.velocity;  * (self.tur_dist_enemy / self.shot_speed);
     if (self.aim_flags & TFL_AIM_LEAD)
-        if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime
+    if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)       // Need to conpensate for shot traveltime
+    {
+        // FIXME: this cant be the best way to do this..
+        prep = pre_pos;
+        for(i = 0; i < 3; ++i)
         {
-            pre_pos = pre_pos + self.enemy.velocity  * (self.tur_dist_enemy / self.shot_speed);
+            distance = vlen(prep - self.tur_shotorg_updated);
+            impact_time = distance / self.shot_speed;
+            prep = pre_pos + self.enemy.velocity * (impact_time + mintime);
 
-            // FIXME slow projectiles misspredict (well all do, bit the slow ons miss :P)
+
         }
-        else if (self.turrcaps_flags & TFL_TURRCAPS_HITSCAN)   // Hitscan gun, conpensate for frametime and posibly refire offset.
-            pre_pos = pre_pos + self.enemy.velocity * (frametime + min(max(self.attack_finished_single - time,0),self.ticrate*2));
-        else                                                   // No lead
-            pre_pos += self.enemy.velocity;
 
+        /* no worky well :/
+        if not(self.enemy.flags & FL_ONGROUND)
+        {
+            float z;
+            z = self.enemy.velocity_z;
+            z = z - (sv_gravity * impact_time);
+            prep_z += z;
+        }
+        */
 
+
+        pre_pos = prep;
+    }
+    else
+    {
+        pre_pos = pre_pos + self.enemy.velocity * mintime;
+    }
+
+
     // Smooth out predict-Z?
-    /*
     if (self.aim_flags & TFL_AIM_ZEASE)
     {
         vector v;
         v = real_origin(self.enemy);
-        pre_pos_z = (pre_pos_z  + v_z) * 0.5;
+        pre_pos_z = (pre_pos_z + v_z) * 0.5;
     }
-    */
 
-    /*
-    if (self.aim_flags & TFL_AIM_INFRONT)   // Aim a bit in front of the target
-        pre_pos -= normalize(self.tur_aimorg_updated - pre_pos) * 32;
-
-    if (self.aim_flags & TFL_AIM_BEHIND)    // Aim a bit behind the target
-        pre_pos += normalize(self.tur_aimorg_updated - pre_pos) * 32;
-
-    */
     // This turret should hit the ground neer a target rather the do a direct hit
-
     if ( (self.aim_flags & TFL_AIM_GROUND) ||
          ((self.aim_flags & TFL_AIM_GROUND2) && (self.enemy.flags & FL_ONGROUND)) )
     {
@@ -105,12 +128,6 @@
         pre_pos = trace_endpos;
     }
 
-
-
-
-
-
-
     return pre_pos;
 }
 
@@ -130,7 +147,7 @@
 
     pre_pos = real_origin(self.enemy);
 
-    self.tur_dist_toaimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);
+    self.tur_dist_impact_to_aimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);
 
     self.tur_impacttime = time;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -279,17 +279,12 @@
 {
     entity baseent;
 
-    // Damage func is shared on all parts as standard, we need to know what the master entity of this turret is.
-
     if (self.owner)
         baseent = self.owner;
     else
         baseent = self;
 
-    //oldself = self;
-    //self = baseent;
 
-
     if (self.health <= 0) return;
 
     if (teamplay != 0)
@@ -299,36 +294,31 @@
         //if(attacker.flags & FL_CLIENT)
         if(clienttype(attacker) == CLIENTTYPE_REAL)
             sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
-            //if not(attacker.isbot)
 
-
         if(cvar("g_friendlyfire"))
-        {
-            //self = oldself;
-            return;
-        }
-        else
-        {
             damage = damage * cvar("g_friendlyfire");
-        }
+        else
+            return;
     }
 
     self.health = self.health - damage;
 
     // thorw head slightly off aim when hit?
     if (self.classname == "turret_head")
-        if (self.damage_flags & TFL_DMG_HEADSHAKE)
-            self.tur_head.angles = self.tur_head.angles + randomvec() * damage;
+        if (baseent.damage_flags & TFL_DMG_HEADSHAKE)
+        {
+            self.angles_x = self.angles_x + random() * damage;
+            self.angles_y = self.angles_y + random() * damage;
+        }
 
-    if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
-        self.velocity = self.velocity + vforce;
+    if (baseent.turrcaps_flags & TFL_TURRCAPS_MOVE)
+        baseent.velocity = baseent.velocity + vforce;
 
+    // FIXME: Better damage feedback
     // Start burning when we have 10% or less health left
-    if (self.health < (self.tur_health * 0.1))
-        self.effects = EF_FLAME;
+    //if (self.health < (self.tur_health * 0.1))
+    //    self.effects = EF_FLAME;
 
-   // self = oldself;
-
     if (self.health <= 0)
     {
         baseent.event_damage           = SUB_Null;
@@ -338,10 +328,6 @@
         baseent.nextthink = time;
         baseent.think = turret_stdproc_die;
     }
-
-
-
-
 }
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -99,6 +99,8 @@
 **/
 void turret_do_updates(entity e_turret)
 {
+    vector enemy_pos;
+
     if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
     {
         e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
@@ -113,22 +115,32 @@
         makevectors(e_turret.tur_head.angles);
         e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
     }
-    // v_right = (v_right * -1);
+    enemy_pos = real_origin(e_turret.enemy);
+
     e_turret.tur_shotorg_updated = e_turret.origin + v_forward * e_turret.tur_shotorg_x + v_right * e_turret.tur_shotorg_y + v_up * e_turret.tur_shotorg_z;
-
-    e_turret.tur_shotdir_updated = normalize((e_turret.tur_shotorg_updated + v_forward) - e_turret.tur_shotorg_updated);
     e_turret.tur_aimorg_updated = e_turret.origin + v_forward * e_turret.tur_aimorg_x + v_right * e_turret.tur_aimorg_y + v_up * e_turret.tur_aimorg_z;
+    e_turret.tur_shotdir_updated = v_forward; // normalize((e_turret.tur_shotorg_updated + v_forward) - e_turret.tur_shotorg_updated);
 
+    e_turret.tur_dist_enemy = vlen(e_turret.tur_aimorg_updated - enemy_pos);
+    e_turret.tur_dist_aimpos = vlen(e_turret.tur_aimorg_updated - e_turret.tur_aimpos);
 
-    e_turret.tur_dist_enemy = vlen(e_turret.tur_aimorg_updated - real_origin(e_turret.enemy));
+    //traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated + (e_turret.tur_shotdir_updated * e_turret.tur_dist_aimpos),MOVE_NORMAL,e_turret);
+    tracebox(e_turret.tur_aimorg_updated, '-1 -1 -1','1 1 1',e_turret.tur_aimorg_updated + (e_turret.tur_shotdir_updated * e_turret.tur_dist_aimpos),MOVE_NORMAL,e_turret);
 
-    traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated+(e_turret.tur_shotdir_updated * e_turret.tur_dist_enemy),MOVE_NORMAL,e_turret);
+    //traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimpos,MOVE_NORMAL,e_turret);
 
     e_turret.tur_impactpoint = trace_endpos;
     e_turret.tur_impactent = trace_ent;
-    //e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
-    e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
-    e_turret.tur_dist_toaimpos = vlen(trace_endpos - e_turret.tur_aimpos);
+    e_turret.tur_dist_impact_to_aimpos = vlen(trace_endpos - e_turret.tur_aimpos);
+    e_turret.tur_impacttime = vlen(e_turret.tur_aimorg_updated - trace_endpos) / e_turret.shot_speed;
+
+
+/*
+.float      tur_dist_enemy;
+.float      tur_dist_aimpos;
+.float      tur_dist_impact_to_aimpos;
+*/
+
 }
 
 /**
@@ -137,9 +149,9 @@
 **/
 void turret_stdproc_track()
 {
-    vector wish_angle;  // This is where we'd need to be
+    vector wish_angle;  // This is where we want to aim
 
-    vector real_angle;  // This is where we can go
+    vector real_angle;  // This is where we can aim
     float f_tmp;
 
 
@@ -155,7 +167,7 @@
         if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
             wish_angle = self.idle_aim + self.angles;
         else
-            if(cvar("g_turrets_aimidle_delay") > (time - self.lip))
+            if(time > self.lip)
                 wish_angle = self.idle_aim;
             else
                 wish_angle = self.tur_head.angles;
@@ -249,6 +261,7 @@
         if (self.track_flags & TFL_TRACK_PITCH) self.tur_head.avelocity_x = real_angle_x;
         if (self.track_flags & TFL_TRACK_ROT)   self.tur_head.avelocity_y = real_angle_y;
         self.tur_head.avelocity_z = real_angle_z;
+        setsize(self,self.mins,self.maxs);
     }
 
     // Limit pitch
@@ -317,6 +330,13 @@
     if (self.firecheck_flags & TFL_FIRECHECK_REFIRE)
         if (self.attack_finished_single >= time) return 0;
 
+    // Special case..
+    if((self.shoot_flags & TFL_SHOOT_VOLLYALWAYS) && (self.volly_counter != self.shot_volly))
+    {
+        return 1;
+    }
+
+
     //
     if (self.firecheck_flags & TFL_FIRECHECK_DEAD)
         if (self.enemy.deadflag != DEAD_NO) return 0;
@@ -329,17 +349,17 @@
     if (self.firecheck_flags & TFL_FIRECHECK_OWM_AMMO)
         if (self.ammo < self.shot_dmg) return 0;
 
-    // Other's ammo? (carefull using this...)
+    // Other's ammo? (support-supply units)
     if (self.firecheck_flags & TFL_FIRECHECK_OTHER_AMMO)
         if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
 
     if (self.firecheck_flags & TFL_FIRECHECK_DISTANCES)
     {
         // Not close enougth?
-        if (self.tur_dist_enemy > self.target_range_fire) return 0;
+        if (self.tur_dist_aimpos > self.target_range_fire) return 0;
 
         // To close?
-        if (self.tur_dist_enemy < self.target_range_min) return 0;
+        if (self.tur_dist_aimpos < self.target_range_min) return 0;
     }
 
     // Try to avoid FF?
@@ -348,7 +368,7 @@
 
     // aim<->predicted impact
     if (self.firecheck_flags & TFL_FIRECHECK_AIMDIST)
-        if (self.tur_dist_toaimpos  > self.aim_firetolerance_dist) return 0;
+        if (self.tur_dist_impact_to_aimpos  > self.aim_firetolerance_dist) return 0;
 
     // Volly status
     if (self.shot_volly > 1)
@@ -643,8 +663,31 @@
     }
     else
     {
+        // Special case for volly always. if it fired once it must compleate the volly.
+        if((self.shoot_flags & TFL_SHOOT_VOLLYALWAYS) && (self.volly_counter != self.shot_volly))
+        {
+            // Predict or whatnot
+            if not((self.aim_flags & TFL_AIM_NO))
+                self.tur_aimpos = turret_stdproc_aim_generic();
+
+
+            // Turn & pitch
+            if (!self.track_flags & TFL_TRACK_NO)
+                turret_stdproc_track();
+
+            turret_do_updates(self);
+
+            // Fire!
+            if (self.turret_firecheckfunc() != 0)
+                turret_fire();
+
+            self.turret_postthink();
+
+            return;
+        }
+
         // Check if we have a vailid enemy, and try to find one if we dont.
-        if ((turret_validate_target(self,self.enemy,self.target_validate_flags) <= 0) || (self.cnt < time))
+        if ((turret_validate_target(self,self.enemy,self.target_validate_flags) <= 0) && (self.cnt < time))
         {
             self.enemy = turret_select_target();
             self.cnt = time + cvar("g_turrets_targetscan_mindelay");
@@ -665,19 +708,19 @@
             return;
         }
         else
-            self.lip = time; // Keep track of the last time we had a target.
+            self.lip = time + cvar("g_turrets_aimidle_delay"); // Keep track of the last time we had a target.
 
-        turret_do_updates(self);
+        //turret_do_updates(self);
 
         // Predict or whatnot
         if not((self.aim_flags & TFL_AIM_NO))
             self.tur_aimpos = turret_stdproc_aim_generic();
 
         // Fire?
-        if (self.turret_firecheckfunc() != 0)
-            turret_fire();
+        //if (self.turret_firecheckfunc() != 0)
+        //    turret_fire();
 
-        turret_do_updates(self);
+        //turret_do_updates(self);
 
         // Turn & pitch
         if (!self.track_flags & TFL_TRACK_NO)
@@ -696,28 +739,31 @@
 
 void turret_fire()
 {
-    if (cvar("g_turrets_nofire") != 0)   return;
-    if ((!self.tur_active) || (self.deadflag != DEAD_NO)) return;
+    if (cvar("g_turrets_nofire") != 0)
+        return;
 
+    if ((!self.tur_active) || (self.deadflag != DEAD_NO))
+        return;
+
     self.turret_firefunc();
 
-    self.attack_finished_single    = time + self.shot_refire;
-    self.ammo               = self.ammo - self.shot_dmg;
-    self.volly_counter      = self.volly_counter - 1;
-
-
+    self.attack_finished_single = time + self.shot_refire;
+    self.ammo                   = self.ammo - self.shot_dmg;
+    self.volly_counter          = self.volly_counter - 1;
     if (self.volly_counter <= 0)
     {
         self.volly_counter = self.shot_volly;
-        if (self.shoot_flags & TFL_SHOOT_CLEARTARGET) self.enemy = world;
 
+        if (self.shoot_flags & TFL_SHOOT_CLEARTARGET)
+            self.enemy = world;
+
         if (self.shot_volly > 1)
             self.attack_finished_single = time + self.shot_volly_refire;
     }
 
 
 #ifdef TURRET_DEBUG
-    if (self.enemy) paint_target3(self.tur_aimpos ,64,self.tur_dbg_rvec,self.tur_impacttime+0.25);
+    if (self.enemy) paint_target3(self.tur_aimpos, 64, self.tur_dbg_rvec, self.tur_impacttime + 0.25);
 #endif
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -21,7 +21,7 @@
     oldself = self;
     self = forwho;
 
-    pth = pathlib_makepath(start.origin,end.origin,PLF_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
+    pth = pathlib_makepath(start.origin,end.origin,PFL_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
 
     self = oldself;
     return pth;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -39,8 +39,8 @@
 
         proj                    = spawn ();
         setorigin(proj, self.tur_shotorg_updated);
-        setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
-        setmodel(proj, "models/laser.mdl"); // precision set above
+        //setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
+        //setmodel(proj, "models/laser.mdl"); // precision set above
         proj.classname       = "ewheel bolt";
         proj.owner           = self;
         proj.bot_dodge       = FALSE;
@@ -49,13 +49,15 @@
         proj.nextthink       = time + 9;
         proj.solid           = SOLID_BBOX;
         proj.movetype        = MOVETYPE_FLYMISSILE;
-        proj.velocity        = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+        proj.velocity        = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
         proj.angles          = vectoangles(proj.velocity);
         proj.touch           = turret_ewheel_projectile_explode;
-        proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
+        //proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
         proj.enemy           = self.enemy;
         proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
+        CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
+
         self.tur_head.frame += 2;
 
         if (self.tur_head.frame > 3)
@@ -65,9 +67,9 @@
 }
 
 #define EWHEEL_MASS 50
-#define EWHEEL_MAXSPEED 1500
-#define EWHEEL_ACCEL_SLOW 50
-#define EWHEEL_ACCEL_FAST 150
+#define EWHEEL_MAXSPEED 800
+#define EWHEEL_ACCEL_SLOW 25
+#define EWHEEL_ACCEL_FAST 100
 #define EWHEEL_BREAK_SLOW 100
 #define EWHEEL_BREAK_FAST 250
 
@@ -122,7 +124,7 @@
 
     makevectors(self.angles);
 
-    if (self.tur_dist_enemy > self.target_range_optimal)
+    if (self.tur_dist_aimpos > self.target_range_optimal)
     {
         if ( angle_ofs < 10 )
         {

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -12,7 +12,7 @@
     sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
-    setmodel(proj, "models/turrets/pd_proj.md3");
+    // setmodel(proj, "models/turrets/pd_proj.md3");
     setsize(proj, '0 0 0', '0 0 0');
     proj.classname          = "turret_fire";
     proj.owner              = self;
@@ -21,15 +21,19 @@
     proj.solid              = SOLID_NOT;
     proj.movetype           = MOVETYPE_FLYMISSILE;
     proj.flags              = FL_PROJECTILE;
-    proj.effects            = EF_LOWPRECISION;
-    proj.takedamage         = DAMAGE_YES;
-    proj.health             = 10;
-    proj.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    // proj.effects            = EF_LOWPRECISION;
+    proj.takedamage         = DAMAGE_NO;
+    //proj.health             =  100;
+    proj.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     proj.angles             = vectoangles(proj.velocity);
     proj.touch              = turret_flac_projectile_explode;
     proj.think              = turret_flac_projectile_explode;
-    proj.nextthink          = time + (vlen(self.tur_aimpos - self.tur_shotorg_updated) / self.shot_speed) + (random() * self.shot_spread);
+    proj.nextthink          = time + max(self.tur_impacttime,(self.shot_radius * 3) / self.shot_speed);
+    proj.enemy              = self.enemy;
+    proj.cnt                = time + 5;
 
+    CSQCProjectile(proj, TRUE, PROJECTILE_HAGAR, TRUE);
+
     self.tur_head.frame = self.tur_head.frame + 1;
     if (self.tur_head.frame >= 4) self.tur_head.frame = 0;
 
@@ -39,6 +43,15 @@
 {
     float ftmp;
 
+    // FIXME: tur_impacttime is not accurate enougth, this is a dirty hakk to make flac work.
+    if(self.enemy != world)
+    if(self.cnt < time)
+    if(vlen(self.origin - self.enemy.origin) > self.owner.shot_radius * 0.5)
+    {
+        self.nextthink = time; //vlen(self.origin - self.enemy.origin) / self.owner.shot_speed;
+        return;
+    }
+
     te_explosion (self.origin);
 
     ftmp = crandom();
@@ -54,12 +67,11 @@
 
 
 #ifdef TURRET_DEBUG
-
     ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
 
     remove (self);
@@ -81,6 +93,8 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/flac.md3");
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -11,8 +11,8 @@
 
     if (self.ammo < self.shot_dmg) return 0;
     if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
-    if (self.tur_dist_enemy > self.target_range_fire) return 0;
-    if (self.tur_dist_enemy < self.target_range_min) return 0;
+    if (self.tur_dist_aimpos > self.target_range_fire) return 0;
+    if (self.tur_dist_aimpos < self.target_range_min) return 0;
 
     return 1;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -38,14 +38,15 @@
     missile.bot_dodge          = TRUE;
     missile.bot_dodgerating    = self.shot_dmg;
     missile.takedamage         = DAMAGE_YES;
+    missile.event_damage       = turret_hellion_missile_damage;
     missile.damageforcescale   = 2;
-    missile.health             = 50;
+    missile.health             = 10;
     missile.enemy              = self.enemy;
     missile.think              = turret_hellion_missile_think;
-    missile.nextthink          = time + 0.2;
+    missile.nextthink          = time;// + 0.2;
     missile.solid              = SOLID_BBOX;
-    missile.movetype           = MOVETYPE_FLYMISSILE;
-    missile.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed; // + ('0 0 1' * self.shot_speed * 0.15);
+    missile.movetype           = MOVETYPE_FLY;
+    missile.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     missile.angles             = vectoangles(missile.velocity);
     missile.touch              = turret_hellion_missile_explode;
     missile.flags              = FL_PROJECTILE;
@@ -77,15 +78,12 @@
     vector pre_pos;
     float itime;
 
-    self.nextthink          = time + 0.1;
+    self.nextthink = time + 0.05;
 
-    // Enemy in range?
-    if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.25)
-        turret_hellion_missile_explode();
-
     olddir = normalize(self.velocity);
 
-    if (self.tur_health < time) turret_hellion_missile_explode();
+    if(self.tur_health < time)
+        turret_hellion_missile_explode();
 
     // Enemy dead? just keep on the current heading then.
     if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
@@ -94,55 +92,48 @@
         // Make sure we dont return to tracking a respawned player
         self.enemy = world;
 
-        // Accelerate
-        self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
         // Turn model
         self.angles = vectoangles(self.velocity);
 
-        //if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 10) )
-        //    turret_hellion_missile_explode();
+        if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 5) )
+            turret_hellion_missile_explode();
 
-        // return;
-    }
+        // Accelerate
+        self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
 
-    olddir = normalize(self.velocity);
+        UpdateCSQCProjectile(self);
 
-    if (self.enemy)
-    {
-        // Predict enemy position
-        itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
-        pre_pos = self.enemy.origin + self.enemy.velocity * itime;
+        return;
     }
-    else
-    {
-        pre_pos = self.origin + olddir * 1024;
-    }
 
+    // Enemy in range?
+    if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.2)
+        turret_hellion_missile_explode();
+
+    // Predict enemy position
+    itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
+    pre_pos = self.enemy.origin + self.enemy.velocity * itime;
+
     pre_pos = (pre_pos + self.enemy.origin) * 0.5;
 
     //pre_pos += randomvec() * 128; //self.tur_aimpos * (sin(32) * time) ;
 
-
     // Find out the direction to that place
     newdir = normalize(pre_pos - self.origin);
 
     // Turn
-    newdir = normalize(olddir + newdir * 0.5);
+    newdir = normalize(olddir + newdir * 0.35);
 
-    // Accelerate
-    self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
     // Turn model
     self.angles = vectoangles(self.velocity);
 
-    if (time+itime < time+0.1)
-    {
+    // Accelerate
+    self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
+
+    if (itime < 0.05)
         self.think = turret_hellion_missile_explode;
-        self.nextthink = time + itime;
-    }
 
-	UpdateCSQCProjectile(self);
+    UpdateCSQCProjectile(self);
 }
 
 void turret_hellion_missile_explode()

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -7,11 +7,12 @@
 {
 
     entity flash;
+
     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, cvar("g_balance_uzi_speed"), 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
 
     te_smallflash(self.tur_shotorg_updated);
-    trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
+    //  trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
 
     // muzzle flash for 3rd person view
     flash = spawn();
@@ -32,8 +33,8 @@
     if (self.netname == "")      self.netname     = "Machinegun Turret";
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
-    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;// | TFL_TURRCAPS_MISSILEKILL;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
 
     if (turret_stdproc_init("machinegun_std") == 0)
     {
@@ -41,6 +42,8 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/machinegun.md3");
 
@@ -64,6 +67,7 @@
 {
     //precache_model ("models/turrets/machinegun.md3");
     //precache_model ("models/turrets/base.md3");
+    precache_sound ("weapons/uzi_fire.wav");
 
     self.think = turret_machinegun_std_init;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -7,11 +7,7 @@
 {
 
     // 0 = full, 6 = empty
-
     self.tur_head.frame = rint(6 - (self.ammo / self.shot_dmg));
-
-    //if ((self.tur_head.frame >= 6) && (self.attack_finished_single <= time))
-    //    self.tur_head.frame = 0;
 }
 
 void turret_mlrs_attack()
@@ -29,14 +25,17 @@
     missile.owner              = self;
     missile.bot_dodge          = TRUE;
     missile.bot_dodgerating    = self.shot_dmg;
-    missile.takedamage         = DAMAGE_YES;
+    missile.takedamage         = DAMAGE_NO;
     missile.damageforcescale   = 4;
-    missile.health             = 30;
+    //missile.health             = 25;
     missile.think              = turret_mlrs_rocket_explode;
+
     missile.nextthink          = time + max(self.tur_impacttime,(self.shot_radius * 2) / self.shot_speed);
+    //missile.nextthink          = missile.nextthink + random() * self.shot_spread;
+
     missile.solid              = SOLID_BBOX;
     missile.movetype           = MOVETYPE_FLYMISSILE;
-    missile.velocity           = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    missile.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     missile.angles             = vectoangles(missile.velocity);
     missile.touch              = turret_mlrs_rocket_explode;
     missile.flags              = FL_PROJECTILE;
@@ -74,10 +73,10 @@
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
 #endif
 
-    // Target dead, get another is still targeting the same.
+    // Target dead, Tell turret.
     if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
         self.owner.enemy = world;
 
@@ -90,7 +89,7 @@
 
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_INFRONT;
 
     if (turret_stdproc_init("mlrs_std") == 0)
     {
@@ -98,6 +97,11 @@
         return;
     }
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
+    self.shoot_flags |= TFL_SHOOT_VOLLYALWAYS;
+    self.volly_counter = self.shot_volly;
+
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/mlrs.md3");
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -9,20 +9,35 @@
 
 void turret_plasma_postthink()
 {
+
+
     if (self.tur_head.frame != 0)
         self.tur_head.frame = self.tur_head.frame + 1;
 
-    if (self.tur_head.frame >= 5)
+    if (self.tur_head.frame > 5)
         self.tur_head.frame = 0;
 
+    /*
+    float h;
+    h = self.health / self.tur_health;
+    if(h<0.95)
+    {
+        if( (0.5 + random()) > h)
+        {
+            //bprint("Spark!\n");
+            //void(vector org, vector vel, float howmany) te_spark = #411;
+            te_spark(0.5 * (self.absmin + self.absmax) + (randomvec() * 64),randomvec() * 256,(1 - h) * 50);
+        }
+    }
+    */
 }
 
-void turret_plasma_dualpostthink()
+void turret_plasma_dual_postthink()
 {
     if (self.tur_head.frame != 0)
         self.tur_head.frame = self.tur_head.frame + 1;
 
-    if (self.tur_head.frame >= 6)
+    if (self.tur_head.frame > 6)
         self.tur_head.frame = 0;
 }
 
@@ -38,33 +53,36 @@
     proj                    = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
     setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
-    setmodel(proj, "models/elaser.mdl"); // precision set above
+    //setmodel(proj, "models/elaser.mdl"); // precision set above
     proj.classname       = "plasmabomb";
     proj.owner           = self;
-    proj.bot_dodge       = FALSE;
-    //proj.bot_dodgerating = self.shot_dmg;
+    proj.bot_dodge       = TRUE;
+    proj.bot_dodgerating = self.shot_dmg;
     proj.think           = turret_plasma_projectile_explode;
     proj.nextthink       = time + 9;
     proj.solid           = SOLID_BBOX;
     proj.movetype        = MOVETYPE_FLYMISSILE;
-    proj.velocity        = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    proj.velocity        = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     proj.angles          = vectoangles(proj.velocity);
     proj.touch           = turret_plasma_projectile_explode;
     proj.flags           = FL_PROJECTILE;
-    proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
+    //proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
     proj.enemy           = self.enemy;
     proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
-    if(self.tur_head.frame )
-        self.tur_head.frame = 0;
+    CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
 
+    if (self.tur_head.frame == 0)
+        self.tur_head.frame = 1;
 }
 
 void turret_plasma_dual_attack()
 {
     entity proj;
 
-    if (self.tur_head.frame > 2)
+    if (self.tur_head.frame != 0)
+        self.tur_head.frame = 3;
+    else
         self.tur_head.frame = 1;
 
     turret_tag_fire_update();
@@ -73,7 +91,7 @@
     proj                    = spawn ();
     setorigin(proj, self.tur_shotorg_updated);
     setsize(proj, '0 0 0', '0 0 0');
-    setmodel(proj, "models/elaser.mdl"); // precision set above
+    //setmodel(proj, "models/elaser.mdl"); // precision set above
     proj.classname       = "plasmabomb";
     proj.owner           = self;
     proj.bot_dodge       = TRUE;
@@ -82,20 +100,15 @@
     proj.nextthink       = time + 9;
     proj.solid           = SOLID_BBOX;
     proj.movetype        = MOVETYPE_FLYMISSILE;
-    proj.velocity        = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+    proj.velocity        = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
     proj.angles          = vectoangles(proj.velocity);
     proj.touch           = turret_plasma_projectile_explode;
     proj.flags           = FL_PROJECTILE;
-    proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
+    // proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;
     proj.enemy           = self.enemy;
     proj.flags           = FL_PROJECTILE | FL_NOTARGET;
 
-    if (self.tur_head.frame == 0)
-        self.tur_head.frame = 1;
-
-    // Snapback the head
-    // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
-
+    CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
 }
 
 void turret_plasma_projectile_explode()
@@ -115,7 +128,6 @@
 
     self.event_damage = SUB_Null;
 
-
 #ifdef TURRET_DEBUG
     float d;
 
@@ -134,27 +146,32 @@
 {
     if (self.netname == "")      self.netname     = "Plasma Cannon";
 
+    // What ammo to use
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+
+    // How to aim
     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
 
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     if (turret_stdproc_init("plasma_std") == 0)
     {
         remove(self);
         return;
     }
+    self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/plasma.md3");
 
-
     if (!turret_tag_setup(0))
         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
 
-    // Our fire routine
-    self.turret_firefunc  = turret_plasma_dual_attack;
+    // Our fireing routine
+    self.turret_firefunc  = turret_plasma_attack;
 
-    // re-color badge & handle recoil effect
-    self.turret_postthink = turret_plasma_dualpostthink;
+    // Custom per turret frame stuff. usualy animation.
+    self.turret_postthink = turret_plasma_postthink;
 }
 
 
@@ -162,8 +179,14 @@
 {
     if (self.netname == "")      self.netname     = "Dual Plasma Cannon";
 
+    // What ammo to use
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
 
+    // How to aim at targets
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
+
+    self.damage_flags |= TFL_DMG_HEADSHAKE;
+
     if (turret_stdproc_init("plasma_dual") == 0)
     {
         remove(self);
@@ -173,17 +196,15 @@
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/plasmad.md3");
 
+
     if (!turret_tag_setup(0))
         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
 
-    // select aim
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
+    // Our fireing routine
+    self.turret_firefunc  = turret_plasma_dual_attack;
 
-    // Our fire routine
-    self.turret_firefunc  = turret_plasma_attack;
-
-    // re-color badge & handle recoil effect
-    self.turret_postthink = turret_plasma_postthink;
+    // Custom per turret frame stuff. usualy animation.
+    self.turret_postthink = turret_plasma_dual_postthink;
 }
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -48,11 +48,8 @@
     {
         if (turret_validate_target(self,e,self.target_validate_flags))
             if (e != self)
-            {
-                //bprint(self.netname, " is meele hitting ",e.netname,"\n");
                 Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg"),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );
 
-            }
         e = e.chain;
     }
 }
@@ -71,7 +68,6 @@
         self.frame = self.frame + 1;
         if (self.frame > 25)
             self.frame = 5;
-
         break;
 
     case ANIM_RUN:
@@ -154,7 +150,8 @@
 {
     self.health = self.health - damage;
     self.velocity = self.velocity + vforce;
-    if (self.health <= 0) walker_rocket_explode();
+    if (self.health <= 0)
+        walker_rocket_explode();
 }
 
 //#define WALKER_ROCKET_MOVE movelib_move(newdir * 275,900,0.1,10)
@@ -162,14 +159,13 @@
 void walker_rocket_loop();
 void walker_rocket_think()
 {
-    vector olddir,newdir;
+    vector newdir;
     float edist;
     float itime;
     float m_speed;
 
-    self.nextthink          = time + 0.1;
+    self.nextthink = time;
 
-    olddir = normalize(self.velocity);
     edist = vlen(self.enemy.origin - self.origin);
 
     // Simulate crude guidance
@@ -179,8 +175,10 @@
             self.tur_shotorg = randomvec() * min(edist,64);
         else
             self.tur_shotorg = randomvec() * min(edist,256);
+
         self.cnt = time + 0.5;
     }
+
     if (edist < 256)
         self.tur_shotorg = '0 0 0';
 
@@ -192,14 +190,13 @@
         return;
     }
 
-    if ((random() < 0.01) && (self.shot_dmg != 1337))
+    if (self.shot_dmg != 1337)
+    if (random() < 0.01)
     {
         walker_rocket_loop();
         return;
     }
 
-    olddir = normalize(self.velocity);
-
     m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
 
     // Enemy dead? just keep on the current heading then.
@@ -220,40 +217,34 @@
     }
     else
     {
-        newdir  = olddir;
+        newdir  = normalize(self.velocity);
     }
 
-    WALKER_ROCKET_MOVE;
-
-
     // Turn model
     self.angles = vectoangles(self.velocity);
 
-    if (time + itime < time + 0.1)
-    {
-        self.think = walker_rocket_explode;
-        self.nextthink = time + itime;
-    }
+
+    WALKER_ROCKET_MOVE;
+    //UpdateCSQCProjectile(self);
 }
 
 void walker_rocket_loop3()
 {
+    vector newdir;
+    self.nextthink = time;
+
     if (self.tur_health < time)
     {
         self.think = walker_rocket_explode;
-        self.nextthink = time;
         return;
     }
 
-    self.nextthink = time + 0.1;
-
     if (vlen(self.origin - self.tur_shotorg) < 128 )
     {
         self.think = walker_rocket_think;
         return;
     }
 
-    vector newdir;
 
     newdir = steerlib_pull(self.tur_shotorg);
     WALKER_ROCKET_MOVE;
@@ -263,15 +254,16 @@
 
 void walker_rocket_loop2()
 {
+    vector newdir;
+
+    self.nextthink = time;
+
     if (self.tur_health < time)
     {
         self.think = walker_rocket_explode;
-        self.nextthink = time;
         return;
     }
 
-    self.nextthink = time;
-
     if (vlen(self.origin - self.tur_shotorg) < 128 )
     {
         self.tur_shotorg = self.origin - '0 0 200';
@@ -279,18 +271,14 @@
         return;
     }
 
-    vector newdir;
-
+    self.angles = vectoangles(self.velocity);
     newdir = steerlib_pull(self.tur_shotorg);
     WALKER_ROCKET_MOVE;
-
-    self.angles = vectoangles(self.velocity);
-
 }
 
 void walker_rocket_loop()
 {
-    self.nextthink= time + 0;
+    self.nextthink = time;
     self.tur_shotorg = self.origin + '0 0 400';
     self.think = walker_rocket_loop2;
     self.shot_dmg = 1337;
@@ -306,6 +294,8 @@
     makevectors(self.angles);
     //self.angles_x *= -1;
 
+    te_explosion (org);
+
     rocket = spawn ();
     setorigin(rocket, org);
 
@@ -314,12 +304,14 @@
 
     rocket.classname          = "walker_rocket";
     rocket.owner              = self;
+
     rocket.bot_dodge          = TRUE;
     rocket.bot_dodgerating    = 50;
+
     rocket.takedamage         = DAMAGE_YES;
 
     rocket.damageforcescale   = 2;
-    rocket.health             = 10;
+    rocket.health             = 25;
     rocket.tur_shotorg        = randomvec() * 512;
     rocket.cnt                = time + 1;
     rocket.enemy              = self.enemy;
@@ -331,20 +323,16 @@
 
     rocket.event_damage       = walker_rocket_damage;
 
-    rocket.nextthink          = time + 0.25;
-    rocket.solid              = SOLID_BBOX;
-    rocket.movetype           = MOVETYPE_FLYMISSILE;
-    rocket.velocity           = ((v_forward + v_up * 0.25) +(randomvec() * 0.1))* cvar("g_turrets_unit_walker_std_rocket_speed");
+    rocket.nextthink          = time;// + 0.25;
+    rocket.movetype           = MOVETYPE_FLY;
+    rocket.velocity           = normalize((v_forward + v_up * 0.25) + (randomvec() * 0.1)) * cvar("g_turrets_unit_walker_std_rocket_speed");
     rocket.angles             = vectoangles(rocket.velocity);
     rocket.touch              = walker_rocket_explode;
     rocket.flags              = FL_PROJECTILE;
     rocket.solid              = SOLID_BBOX;
     rocket.tur_health         = time + 9;
 
-	CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, FALSE); // no cull, fly sound
-
-    te_explosion (rocket.origin);
-
+	CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
 }
 
 /*
@@ -383,13 +371,11 @@
 
     org = self.owner.origin + gettaginfo(self.owner,f);
 
-
-
     self.nextthink = time + 0.2;
     oldself = self;
     self = self.owner;
     walker_fire_rocket(org);
-    self=oldself;
+    self = oldself;
 }
 
 /*
@@ -470,7 +456,7 @@
 
                     if(self.pathgoal.enemy)
                     {
-                        self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PLF_GROUNDSNAP,1500,2,PT_QUICKBOX);
+                        self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PFL_GROUNDSNAP,1500,2,PT_QUICKBOX);
                         self.pathgoal = self.pathgoal.enemy;
                     }
                 }
@@ -490,7 +476,7 @@
             wish_angle = angleofs(self,self.enemy);
             steer = steerlib_pull(self.enemy.origin);
 
-            if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
+            if (self.tur_dist_aimpos < cvar("g_turrets_unit_walker_std_meele_range"))
             {
                 if (fabs(wish_angle_y) < 15)
                 {
@@ -588,7 +574,7 @@
 
     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
 
-    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, cvar("g_balance_uzi_speed"), 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+    fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
     te_smallflash(self.tur_shotorg_updated);
 
     if (!(self.uzi_bulletcounter & 3))
@@ -641,7 +627,7 @@
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);
             self.pathgoal = e;
         }
     }
@@ -681,8 +667,8 @@
     self.wkr_spawn = spawn();
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
-    self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
-    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+    self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
+    self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
 
     self.turret_respawnhook = walker_respawnhook;
     self.turret_diehook = walker_diehook;
@@ -712,8 +698,9 @@
     self.wkr_spawn.solid    = SOLID_NOT;
 
 
-    traceline(self.wkr_spawn.origin + '0 0 10', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
+    traceline(self.wkr_spawn.origin + '0 0 16', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
     setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
+    setorigin(self,self.wkr_spawn.origin);
 
     setmodel(self,"models/turrets/walker_body.md3");
     setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");
@@ -749,7 +736,7 @@
         e = find(world,targetname,self.target);
         if (!e)
         {
-            bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
+            dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
             self.target = "";
         }
 
@@ -757,7 +744,7 @@
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PLF_GROUNDSNAP,500,2,PT_QUICKBOX);
+            self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);
             self.pathgoal = e;
         }
     }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -128,8 +128,9 @@
 		headshot = 0;
 		yoda = 0;
 		damage_headshotbonus = self.dmg_edge;
-		railgun_start = self.origin - 2 * frametime * self.oldvelocity;
-		railgun_end = self.origin + 2 * frametime * self.oldvelocity;
+		railgun_start = self.origin - 2 * frametime * self.velocity;
+		railgun_end = self.origin + 2 * frametime * self.velocity;
+
 		Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
 		damage_headshotbonus = 0;
 
@@ -191,6 +192,10 @@
 	float maxdist;
 	float E0_m, Es_m;
 
+	// outside the world? forget it
+	if(self.origin_x > world.maxs_x || self.origin_y > world.maxs_y || self.origin_z > world.maxs_z || self.origin_x < world.mins_x || self.origin_y < world.mins_y || self.origin_z < world.mins_z)
+		return 0;
+
 	// E(s) = E0 - constant * s, constant = area of bullet circle * material constant / mass
 	v0 = vlen(vel);
 
@@ -259,6 +264,9 @@
 
 void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
 {
+	float lag, dt, savetime;
+	entity pl, oldself;
+
 	entity proj;
 	proj = spawn();
 	proj.classname = "bullet";
@@ -289,6 +297,84 @@
 
 	proj.oldvelocity = proj.velocity;
 
+	if(cvar("g_antilag_bullets"))
+	if(pSpeed >= cvar("g_antilag_bullets"))
+	{
+		// NOTE: this may severely throw off weapon balance
+		lag = ANTILAG_LATENCY(self);
+		if(lag < 0.001)
+			lag = 0;
+		if(clienttype(self) != CLIENTTYPE_REAL)
+			lag = 0;
+		if(cvar("g_antilag") == 0)
+			lag = 0; // only do hitscan, but no antilag
+
+		if(lag)
+			FOR_EACH_PLAYER(pl)
+				antilag_takeback(pl, time - lag);
+
+		oldself = self;
+		self = proj;
+
+		savetime = frametime;
+		frametime = 0.05;
+
+		for(;;)
+		{
+			// DP tracetoss is stupid and always traces in 0.05s
+			// ticks. This makes it trace in 0.05*0.125s ticks
+			// instead.
+			vector v0;
+			float g0;
+			v0 = self.velocity;
+			g0 = self.gravity;
+			self.velocity = self.velocity * 0.125;
+			self.gravity *= 0.125 * 0.125;
+			trace_fraction = 0;
+			tracetoss(self, oldself);
+			self.velocity = v0;
+			self.gravity = g0;
+
+			if(vlen(trace_endpos - self.origin) > 32)
+				zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity);
+			if(trace_fraction == 1)
+				break;
+				// won't hit anything anytime soon (DP's
+				// tracetoss does 200 tics of, here,
+				// 0.05*0.125s, that is, 1.25 seconds
+
+			other = trace_ent;
+			dt = vlen(trace_endpos - self.origin) / vlen(self.velocity); // this is only approximate!
+			setorigin(self, trace_endpos);
+			self.velocity_z -= sv_gravity * dt;
+
+			if(!SUB_OwnerCheck())
+			{
+				if(SUB_NoImpactCheck())
+					break;
+
+				// hit the player
+				W_BallisticBullet_Hit ();
+			}
+
+			// go through solid!
+			if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius))
+				break;
+
+			W_BallisticBullet_LeaveSolid_think();
+		}
+		frametime = savetime;
+		self = oldself;
+
+		if(lag)
+			FOR_EACH_PLAYER(pl)
+				antilag_restore(pl);
+
+		remove(proj);
+
+		return;
+	}
+
 	if(tracereffects & EF_RED)
 		CSQCProjectile(proj, TRUE, PROJECTILE_BULLET_GLOWING, TRUE);
 	else

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -138,6 +138,14 @@
 	proj.event_damage = W_Plasma_Damage;
 	proj.flags = FL_PROJECTILE;
 
+#if 0
+	entity p2;
+	p2 = spawn();
+	copyentity(proj, p2);
+	setmodel(p2, "models/ebomb.mdl");
+	setsize(p2, proj.mins, proj.maxs);
+#endif
+
 	CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -33,6 +33,7 @@
 {
 	self.event_damage = SUB_Null;
 	self.touch = SUB_Null;
+	self.effects |= EF_NODRAW;
 
 	self.think = W_Hook_ExplodeThink;
 	self.nextthink = time;

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -216,7 +216,6 @@
 		{
 			if(!self.BUTTON_ATCK2)
 			{
-				msg_entity = self;
 				self.porto_v_angle_held = 0;
 
 				ClientData_Touch(self);
@@ -227,7 +226,6 @@
 			if(self.BUTTON_ATCK2)
 			{
 				self.porto_v_angle = self.v_angle;
-				msg_entity = self;
 				self.porto_v_angle_held = 1;
 
 				ClientData_Touch(self);

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -141,7 +141,7 @@
 	if(self.frame == 5)
 	{
 		self.think           = Seeker_Missile_Think;
-		self.nextthink       = time + cvar("g_balance_seeker_missile_activate_delay");
+		self.nextthink       = time;// + cvar("g_balance_seeker_missile_activate_delay"); // cant dealy with csqc projectiles
 
 		if (cvar("g_balance_seeker_guided_proxy"))
 			self.movetype    = MOVETYPE_BOUNCEMISSILE;
@@ -177,7 +177,7 @@
 	missile.touch           = Seeker_Missile_Touch;
 
 	missile.event_damage    = Seeker_Missile_Damage;
-	missile.nextthink       = time + 0.2;// + cvar("g_balance_seeker_missile_activate_delay");
+	missile.nextthink       = time;// + 0.2;// + cvar("g_balance_seeker_missile_activate_delay");
 	missile.cnt             = time + cvar("g_balance_seeker_missile_lifetime");
 	missile.enemy           = self.enemy;
 	missile.switchweapon           = cvar("g_balance_seeker_missile_speed");

Modified: branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2009-02-20 14:23:51 UTC (rev 5912)
@@ -103,6 +103,11 @@
 {
 	if(!wp)
 		return;
+	if(wp.classname != "sprite_waypoint")
+	{
+		backtrace("Trying to disown a non-waypointsprite");
+		return;
+	}
 	if(wp.owner)
 	{
 		if(wp.exteriormodeltoclient == wp.owner)

Modified: branches/nexuiz-2.0/data/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/scripts/entities.def	2009-02-20 14:23:51 UTC (rev 5912)
@@ -375,7 +375,7 @@
 model="models/items/a_cells.md3"
 */
 
-/*QUAKED item_flag_team1 (1 0 0) (-48 -48 -37) (48 48 37) 
+/*QUAKED item_flag_team1 (1 0 0) (-32 -32 0) (32 32 74) 
 CTF flag for team one (Red). Use more than one if you really insist.
 -------- KEYS --------
 model: model to use
@@ -384,11 +384,11 @@
 noise1: sound played when flag is returned
 noise2: sound played when flag is captured
 noise3: sound played when flag is lost in the field and respawns itself
--------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
-model="models/ctf/radiant/flag_red_radiant.md3"
+-------- ZBQRY SBE ENQVNAG BAYL - QB ABG FRG GUVF NF N XRL --------
+zbqry="zbqryf/pgs/enqvnag/synt_erq_enqvnag.zq3"
 */
 
-/*QUAKED item_flag_team2 (0 0 1) (-48 -48 -37) (48 48 37) 
+/*QUAKED item_flag_team2 (0 0 1) (-32 -32 0) (32 32 74) 
 CTF flag for team two (Blue). Use more than one if you really insist.
 -------- KEYS --------
 model: model to use
@@ -397,8 +397,8 @@
 noise1: sound played when flag is returned
 noise2: sound played when flag is captured
 noise3: sound played when flag is lost in the field and respawns itself
--------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
-model="models/ctf/radiant/flag_blue_radiant.md3"
+-------- ZBQRY SBE ENQVNAG BAYL - QB ABG FRG GUVF NF N XRL --------
+zbqry="zbqryf/pgs/enqvnag/synt_oyhr_enqvnag.zq3"
 */
 
 /*QUAKED item_health_large (.9 .3 .3) (-30 -30 0) (30 30 48) FLOATING

Modified: branches/nexuiz-2.0/data/scripts/shaderlist.txt
===================================================================
--- branches/nexuiz-2.0/data/scripts/shaderlist.txt	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/scripts/shaderlist.txt	2009-02-20 14:23:51 UTC (rev 5912)
@@ -22,6 +22,7 @@
 final_rage
 flags
 harlequin_sky
+hlac
 kaznexctf2
 leiprojectile
 liquids

Modified: branches/nexuiz-2.0/data/scripts/toxic.shader
===================================================================
--- branches/nexuiz-2.0/data/scripts/toxic.shader	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/scripts/toxic.shader	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,14 +1,17 @@
 textures/toxic/toxic_sky
 {
 	qer_editorimage env/green_dark/green_dark_lf.tga
-	q3map_lightimage env/green_dark/green_dark_lf.tga
+	q3map_lightimage env/green_dark/green_dark_lf.tga
+	skyParms env/green_dark/green_dark 128 -
+
 	surfaceparm noimpact
 	surfaceparm nolightmap
 	surfaceparm nomarks
-	surfaceparm sky
-	q3map_surfacelight 200
-	q3map_sun 0.55 0.55 0.55 100 215 40
-	skyParms env/green_dark/green_dark 128 -
+	surfaceparm sky
+
+	q3map_surfacelight 200
+//	q3map_sunExt red green blue intensity degrees elevation deviance samples
+	q3map_sunExt 0.55 0.55 0.55 100 215 40 4 4
 }
 
 textures/toxic/toxic_grate

Modified: branches/nexuiz-2.0/data/shotorigin_adjuster.cfg
===================================================================
--- branches/nexuiz-2.0/data/shotorigin_adjuster.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/shotorigin_adjuster.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,6 +2,7 @@
 echo "Move the shot origin forward/backward using INS and PGUP keys."
 echo "Move the shot origin forward/backward without changing its position in the view using NUM + and - keys."
 echo "Move it to the default shot origin using the NUM * key."
+echo "Temporarily hide the shot origin using the NUM INS/0 key."
 echo "Write it down and press NUM / when done."
 
 cl_cmd shotorg_move "0 0 0" // init
@@ -22,6 +23,8 @@
 
 bind KP_ENTER "commandmode _load_shotorigin_from_bone"
 
+bind KP_INS "cl_cmd shotorg_toggle_hide"
+
 alias _load_shotorigin_from_bone "sv_cmd gettaginfo w 0 $1 \"cl_cmd shotorg_set \\\"\" \"\\\"\""
 
 prvm_edictset server 1 alpha 0.8

Modified: branches/nexuiz-2.0/data/unit_ewheel.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_ewheel.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_ewheel.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,33 +2,32 @@
 set g_turrets_unit_ewheel_std_respawntime 30
 
 // dgr / sec
-set g_turrets_unit_ewheel_turnrate 180
+set g_turrets_unit_ewheel_turnrate 240
 
-set g_turrets_unit_ewheel_std_shot_dmg 10
-set g_turrets_unit_ewheel_std_shot_refire 0.15
-set g_turrets_unit_ewheel_std_shot_spread 0.025
-set g_turrets_unit_ewheel_std_shot_force 	20
+set g_turrets_unit_ewheel_std_shot_dmg 15
+set g_turrets_unit_ewheel_std_shot_refire 0.2
+set g_turrets_unit_ewheel_std_shot_spread 0.015
+set g_turrets_unit_ewheel_std_shot_force 	50
 set g_turrets_unit_ewheel_std_shot_radius 50
-set g_turrets_unit_ewheel_std_shot_speed 7000
+set g_turrets_unit_ewheel_std_shot_speed 5000
 
 set g_turrets_unit_ewheel_std_shot_volly 2
-set g_turrets_unit_ewheel_std_shot_volly_refire 0.5
+set g_turrets_unit_ewheel_std_shot_volly_refire 0.6
 
-// Note this is the effective range for rocket engagement
-set g_turrets_unit_ewheel_std_target_range 6000
-set g_turrets_unit_ewheel_std_target_range_fire 4000
-set g_turrets_unit_ewheel_std_target_range_optimal 1000
+set g_turrets_unit_ewheel_std_target_range 5000
+set g_turrets_unit_ewheel_std_target_range_fire 3500
+set g_turrets_unit_ewheel_std_target_range_optimal 900
 set g_turrets_unit_ewheel_std_target_range_min 50
 
 set g_turrets_unit_ewheel_std_target_select_rangebias 0.25
-set g_turrets_unit_ewheel_std_target_select_samebias 0.25
+set g_turrets_unit_ewheel_std_target_select_samebias 2
 set g_turrets_unit_ewheel_std_target_select_anglebias 0.5
 set g_turrets_unit_ewheel_std_target_select_playerbias 1
 set g_turrets_unit_ewheel_std_target_select_missilebias 0
 
 set g_turrets_unit_ewheel_std_ammo_max 4000
 set g_turrets_unit_ewheel_std_ammo 500
-set g_turrets_unit_ewheel_std_ammo_recharge 100
+set g_turrets_unit_ewheel_std_ammo_recharge 50
 
 set g_turrets_unit_ewheel_std_aim_firetolerance_dist 200
 set g_turrets_unit_ewheel_std_aim_firetolerance_angle 16

Modified: branches/nexuiz-2.0/data/unit_flac.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_flac.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_flac.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,19 +1,19 @@
 set g_turrets_unit_flac_std_health 700	
 set g_turrets_unit_flac_std_respawntime 90
 
-set g_turrets_unit_flac_std_shot_dmg 35
-set g_turrets_unit_flac_std_shot_refire 0.1
-set g_turrets_unit_flac_std_shot_radius 250
-set g_turrets_unit_flac_std_shot_speed 6000
-set g_turrets_unit_flac_std_shot_spread 0.07
+set g_turrets_unit_flac_std_shot_dmg 50
+set g_turrets_unit_flac_std_shot_refire 0.2
+set g_turrets_unit_flac_std_shot_radius 190
+set g_turrets_unit_flac_std_shot_speed 3000
+set g_turrets_unit_flac_std_shot_spread 0.0125
 set g_turrets_unit_flac_std_shot_force 50
-set g_turrets_unit_flac_std_shot_volly 4
-set g_turrets_unit_flac_std_shot_volly_refire 1.5
+set g_turrets_unit_flac_std_shot_volly 0
+set g_turrets_unit_flac_std_shot_volly_refire 0
 
 set g_turrets_unit_flac_std_target_range 4000
 set g_turrets_unit_flac_std_target_range_min 500
-set g_turrets_unit_flac_std_target_range_fire 3500
-set g_turrets_unit_flac_std_target_range_optimal 1000
+set g_turrets_unit_flac_std_target_range_fire 3900
+set g_turrets_unit_flac_std_target_range_optimal 100
 
 set g_turrets_unit_flac_std_target_select_rangebias 0.25
 set g_turrets_unit_flac_std_target_select_samebias 0.25
@@ -25,14 +25,13 @@
 set g_turrets_unit_flac_std_ammo 500
 set g_turrets_unit_flac_std_ammo_recharge 100
 
-set g_turrets_unit_flac_std_aim_firetolerance_dist 200
+set g_turrets_unit_flac_std_aim_firetolerance_dist 300
 set g_turrets_unit_flac_std_aim_firetolerance_angle 5
-set g_turrets_unit_flac_std_aim_speed 100
+set g_turrets_unit_flac_std_aim_speed 120
 set g_turrets_unit_flac_std_aim_maxrot 360
 set g_turrets_unit_flac_std_aim_maxpitch 35
 
 set g_turrets_unit_flac_std_track_type 3
-set g_turrets_unit_flac_std_track_accel_pitch 0.45
-set g_turrets_unit_flac_std_track_accel_rot 0.65
-set g_turrets_unit_flac_std_track_blendrate 0.15
-
+set g_turrets_unit_flac_std_track_accel_pitch 0.25
+set g_turrets_unit_flac_std_track_accel_rot 0.5
+set g_turrets_unit_flac_std_track_blendrate 0.25

Modified: branches/nexuiz-2.0/data/unit_hellion.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_hellion.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_hellion.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,12 +2,12 @@
 set g_turrets_unit_hellion_std_respawntime 90
 
 set g_turrets_unit_hellion_std_shot_dmg 50
-set g_turrets_unit_hellion_std_shot_refire 0.15
-set g_turrets_unit_hellion_std_shot_radius 100
+set g_turrets_unit_hellion_std_shot_refire 0.25
+set g_turrets_unit_hellion_std_shot_radius 80
 
-set g_turrets_unit_hellion_std_shot_speed 750
-set g_turrets_unit_hellion_std_shot_speed_max 5000
-set g_turrets_unit_hellion_std_shot_speed_gain 1.025
+set g_turrets_unit_hellion_std_shot_speed 650
+set g_turrets_unit_hellion_std_shot_speed_max 4000
+set g_turrets_unit_hellion_std_shot_speed_gain 1.01
 
 set g_turrets_unit_hellion_std_shot_spread 0.08
 set g_turrets_unit_hellion_std_shot_force 250

Modified: branches/nexuiz-2.0/data/unit_machinegun.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_machinegun.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_machinegun.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,14 +1,14 @@
 set g_turrets_unit_machinegun_std_health 256	
 set g_turrets_unit_machinegun_std_respawntime 60
 
-set g_turrets_unit_machinegun_std_shot_dmg 12
-set g_turrets_unit_machinegun_std_shot_refire 0.1
-set g_turrets_unit_machinegun_std_shot_spread 0.025
-set g_turrets_unit_machinegun_std_shot_force 15
+set g_turrets_unit_machinegun_std_shot_dmg 15
+set g_turrets_unit_machinegun_std_shot_refire 0.05
+set g_turrets_unit_machinegun_std_shot_spread 0.05
+set g_turrets_unit_machinegun_std_shot_force 20
 set g_turrets_unit_machinegun_std_shot_radius 0
-set g_turrets_unit_machinegun_std_shot_speed 0
+set g_turrets_unit_machinegun_std_shot_speed 34920
 set g_turrets_unit_machinegun_std_shot_volly 5
-set g_turrets_unit_machinegun_std_shot_volly_refire 1.5
+set g_turrets_unit_machinegun_std_shot_volly_refire 0.5
 
 set g_turrets_unit_machinegun_std_target_range 4500
 set g_turrets_unit_machinegun_std_target_range_min 2
@@ -21,13 +21,13 @@
 set g_turrets_unit_machinegun_std_target_select_playerbias 1
 set g_turrets_unit_machinegun_std_target_select_missilebias 0
 
-set g_turrets_unit_machinegun_std_ammo_max 2000
-set g_turrets_unit_machinegun_std_ammo 200
-set g_turrets_unit_machinegun_std_ammo_recharge 95
+set g_turrets_unit_machinegun_std_ammo_max 1500
+set g_turrets_unit_machinegun_std_ammo 300
+set g_turrets_unit_machinegun_std_ammo_recharge 75
 
-set g_turrets_unit_machinegun_std_aim_firetolerance_dist 75
+set g_turrets_unit_machinegun_std_aim_firetolerance_dist 80
 set g_turrets_unit_machinegun_std_aim_firetolerance_angle 16
-set g_turrets_unit_machinegun_std_aim_speed 100
+set g_turrets_unit_machinegun_std_aim_speed 240
 set g_turrets_unit_machinegun_std_aim_maxrot 400
 set g_turrets_unit_machinegun_std_aim_maxpitch 25
 

Modified: branches/nexuiz-2.0/data/unit_mlrs.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_mlrs.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_mlrs.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,20 +1,20 @@
 set g_turrets_unit_mlrs_std_health 500	
 set g_turrets_unit_mlrs_std_respawntime 60
 
-set g_turrets_unit_mlrs_std_shot_dmg 50
-set g_turrets_unit_mlrs_std_shot_refire 0.1
-set g_turrets_unit_mlrs_std_shot_radius 180
+set g_turrets_unit_mlrs_std_shot_dmg 70
+set g_turrets_unit_mlrs_std_shot_refire 0.2
+set g_turrets_unit_mlrs_std_shot_radius 125
 set g_turrets_unit_mlrs_std_shot_speed 2000
-set g_turrets_unit_mlrs_std_shot_spread 0.05
-set g_turrets_unit_mlrs_std_shot_force 50
+set g_turrets_unit_mlrs_std_shot_spread 0.025
+set g_turrets_unit_mlrs_std_shot_force 25
 
 set g_turrets_unit_mlrs_std_shot_volly 3
-set g_turrets_unit_mlrs_std_shot_volly_refire 1.5
+set g_turrets_unit_mlrs_std_shot_volly_refire 2.5
 
-set g_turrets_unit_mlrs_std_target_range 4000
+set g_turrets_unit_mlrs_std_target_range 3000
 set g_turrets_unit_mlrs_std_target_range_min 500
-set g_turrets_unit_mlrs_std_target_range_fire 3000
-set g_turrets_unit_mlrs_std_target_range_optimal 2000
+set g_turrets_unit_mlrs_std_target_range_fire 2000
+set g_turrets_unit_mlrs_std_target_range_optimal 500
 
 set g_turrets_unit_mlrs_std_target_select_rangebias 0.25
 set g_turrets_unit_mlrs_std_target_select_samebias 0.25
@@ -22,13 +22,13 @@
 set g_turrets_unit_mlrs_std_target_select_playerbias 1
 set g_turrets_unit_mlrs_std_target_select_missilebias 0
 
-set g_turrets_unit_mlrs_std_ammo_max 300
-set g_turrets_unit_mlrs_std_ammo 300
-set g_turrets_unit_mlrs_std_ammo_recharge 50
+set g_turrets_unit_mlrs_std_ammo_max 420
+set g_turrets_unit_mlrs_std_ammo 420
+set g_turrets_unit_mlrs_std_ammo_recharge 35
 
-set g_turrets_unit_mlrs_std_aim_firetolerance_dist 300
-set g_turrets_unit_mlrs_std_aim_firetolerance_angle 15
-set g_turrets_unit_mlrs_std_aim_speed 180
+set g_turrets_unit_mlrs_std_aim_firetolerance_dist 50
+set g_turrets_unit_mlrs_std_aim_firetolerance_angle 5
+set g_turrets_unit_mlrs_std_aim_speed 120
 set g_turrets_unit_mlrs_std_aim_maxrot 360
 set g_turrets_unit_mlrs_std_aim_maxpitch 15
 

Modified: branches/nexuiz-2.0/data/unit_plasma.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_plasma.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_plasma.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -10,7 +10,7 @@
 //Traveling at this speed
 set g_turrets_unit_plasma_std_shot_speed 2000
 //With a random direction of
-set g_turrets_unit_plasma_std_shot_spread 0.0001
+set g_turrets_unit_plasma_std_shot_spread 0.015
 //Pushing things this hard
 set g_turrets_unit_plasma_std_shot_force 100
 //Each volly is this many shots
@@ -25,7 +25,7 @@
 // If thise or closer, fire
 set g_turrets_unit_plasma_std_target_range_fire 3000
 // If we have a choise, prefer the ones closer to this distance
-set g_turrets_unit_plasma_std_target_range_optimal 1500
+set g_turrets_unit_plasma_std_target_range_optimal 500
 
 
 // Targetselect is made for each turret based on range, angle (turrets needs to turn to aim at), if its a player / missile
@@ -46,11 +46,11 @@
 set g_turrets_unit_plasma_std_ammo_recharge 40
 
 // If predicted emeypos is this or closer to predicted impact, fire is ok
-set g_turrets_unit_plasma_std_aim_firetolerance_dist 200
+set g_turrets_unit_plasma_std_aim_firetolerance_dist 100
 // If angle ofset to predicted emeypos is this or less, fire is ok
 set g_turrets_unit_plasma_std_aim_firetolerance_angle 5
 // Aim how fast (for g_turrets_unit_plasma_std_track_type=1 this is dgr/sec, for 2 & 3 its the maximum force added each sec)
-set g_turrets_unit_plasma_std_aim_speed 180
+set g_turrets_unit_plasma_std_aim_speed 200
 // Max rottation of head
 set g_turrets_unit_plasma_std_aim_maxrot 360
 // Max tilt of head

Modified: branches/nexuiz-2.0/data/unit_plasma2.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_plasma2.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_plasma2.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -2,31 +2,31 @@
 set g_turrets_unit_plasma_dual_respawntime 60
 
 set g_turrets_unit_plasma_dual_shot_dmg 80
-set g_turrets_unit_plasma_dual_shot_refire 0.1
+set g_turrets_unit_plasma_dual_shot_refire 0.35
 set g_turrets_unit_plasma_dual_shot_radius 150
 set g_turrets_unit_plasma_dual_shot_speed 2000
 set g_turrets_unit_plasma_dual_shot_spread 0.015
 set g_turrets_unit_plasma_dual_shot_force 100
 
-set g_turrets_unit_plasma_dual_shot_volly 2
-set g_turrets_unit_plasma_dual_shot_volly_refire 0.5
+set g_turrets_unit_plasma_dual_shot_volly 0
+set g_turrets_unit_plasma_dual_shot_volly_refire 0
 
 set g_turrets_unit_plasma_dual_target_range 3000
-set g_turrets_unit_plasma_dual_target_range_min 100
+set g_turrets_unit_plasma_dual_target_range_min 80
 set g_turrets_unit_plasma_dual_target_range_fire 2500
-set g_turrets_unit_plasma_dual_target_range_optimal 2000
+set g_turrets_unit_plasma_dual_target_range_optimal 1000
 
-set g_turrets_unit_plasma_dual_target_select_rangebias 0.25
-set g_turrets_unit_plasma_dual_target_select_samebias 0.25
-set g_turrets_unit_plasma_dual_target_select_anglebias 0.5
+set g_turrets_unit_plasma_dual_target_select_rangebias 0.2
+set g_turrets_unit_plasma_dual_target_select_samebias 0.4
+set g_turrets_unit_plasma_dual_target_select_anglebias 0.4
 set g_turrets_unit_plasma_dual_target_select_playerbias 1
 set g_turrets_unit_plasma_dual_target_select_missilebias 0
 
 set g_turrets_unit_plasma_dual_ammo_max 800
 set g_turrets_unit_plasma_dual_ammo 500
-set g_turrets_unit_plasma_dual_ammo_recharge 40
+set g_turrets_unit_plasma_dual_ammo_recharge 64
 
-set g_turrets_unit_plasma_dual_aim_firetolerance_dist 250
+set g_turrets_unit_plasma_dual_aim_firetolerance_dist 300
 set g_turrets_unit_plasma_dual_aim_firetolerance_angle 16
 
 set g_turrets_unit_plasma_dual_aim_speed 100
@@ -35,6 +35,6 @@
 
 set g_turrets_unit_plasma_dual_track_type 3
 set g_turrets_unit_plasma_dual_track_accel_pitch 0.25
-set g_turrets_unit_plasma_dual_track_accel_rot 0.5
+set g_turrets_unit_plasma_dual_track_accel_rot 0.25
 set g_turrets_unit_plasma_dual_track_blendrate 0.25
 

Modified: branches/nexuiz-2.0/data/unit_walker.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_walker.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/unit_walker.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -7,22 +7,22 @@
 set g_turrets_unit_walker_run_turnrate  22.5
 
 // Main machineguns prop's
-set g_turrets_unit_walker_std_shot_dmg 15
+set g_turrets_unit_walker_std_shot_dmg 10
 set g_turrets_unit_walker_std_shot_refire 0.1
-set g_turrets_unit_walker_std_shot_spread 0.05
+set g_turrets_unit_walker_std_shot_spread 0.035
 set g_turrets_unit_walker_std_shot_force 	5
 set g_turrets_unit_walker_std_shot_radius 0
-set g_turrets_unit_walker_std_shot_speed 0
+set g_turrets_unit_walker_std_shot_speed 18000
 
-set g_turrets_unit_walker_std_shot_volly 0
-set g_turrets_unit_walker_std_shot_volly_refire 0
+set g_turrets_unit_walker_std_shot_volly 5
+set g_turrets_unit_walker_std_shot_volly_refire 0.5
 
 // Note this is the effective range for rocket engagement
-set g_turrets_unit_walker_std_target_range 10000
+set g_turrets_unit_walker_std_target_range 5500
 
-set g_turrets_unit_walker_std_target_range_fire 1500
-set g_turrets_unit_walker_std_target_range_optimal 500
-set g_turrets_unit_walker_std_target_range_min 64
+set g_turrets_unit_walker_std_target_range_fire 2000
+set g_turrets_unit_walker_std_target_range_optimal 100
+set g_turrets_unit_walker_std_target_range_min 0
 
 set g_turrets_unit_walker_std_target_select_rangebias 0.25
 set g_turrets_unit_walker_std_target_select_samebias 0.25
@@ -37,21 +37,21 @@
 set g_turrets_unit_walker_std_aim_firetolerance_dist 64
 set g_turrets_unit_walker_std_aim_firetolerance_angle 16
 set g_turrets_unit_walker_std_aim_speed 90
-set g_turrets_unit_walker_std_aim_maxrot 360
+set g_turrets_unit_walker_std_aim_maxrot 400	
 set g_turrets_unit_walker_std_aim_maxpitch 15
 
 set g_turrets_unit_walker_std_track_type 1
 
-// "Swively" homing rockets that sometimes loop
+// "Wobbly" homing rockets that sometimes loop
 set g_turrets_unit_walker_std_rocket_refire 10
 set g_turrets_unit_walker_std_rocket_dmg 50
 set g_turrets_unit_walker_std_rocket_radius 150
 set g_turrets_unit_walker_std_rocket_force 150
-set g_turrets_unit_walker_std_rocket_tunrate 0.5
-set g_turrets_unit_walker_std_rocket_speed 650
+set g_turrets_unit_walker_std_rocket_tunrate 0.6
+set g_turrets_unit_walker_std_rocket_speed 900
 set g_turrets_unit_walker_std_rocket_speed_add 2
 
 // Meele attack. Only happens when theres a target directly in front 
-set g_turrets_unit_walker_std_meele_range 160
+set g_turrets_unit_walker_std_meele_range 150
 set g_turrets_unit_walker_std_meele_dmg 500
 set g_turrets_unit_walker_std_meele_force 600
\ No newline at end of file

Modified: branches/nexuiz-2.0/data/update-cvarcount.sh
===================================================================
--- branches/nexuiz-2.0/data/update-cvarcount.sh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/update-cvarcount.sh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -13,9 +13,18 @@
 sed -i "s/^set cvar_check_weapons .*/set cvar_check_weapons $countw/" weapons.cfg
 sed -i "s/^set cvar_check_weapons .*/set cvar_check_weapons $countw/" weaponsHavoc.cfg
 
-sed -i "s/^string CVAR_CHECK_DEFAULT = .*/string CVAR_CHECK_DEFAULT = \"$countd\";/" qcsrc/server/constants.qh
-sed -i "s/^string CVAR_CHECK_WEAPONS = .*/string CVAR_CHECK_WEAPONS = \"$countw\";/" qcsrc/server/constants.qh
+sed "
+	s/^string CVAR_CHECK_DEFAULT = .*/string CVAR_CHECK_DEFAULT = \"$countd\";/;
+	s/^string CVAR_CHECK_WEAPONS = .*/string CVAR_CHECK_WEAPONS = \"$countw\";/;
+" qcsrc/server/constants.qh > qcsrc/server/constants.qh.new
 
-[ -z "$DO_NOT_RUN_MAKE" ] && make
-
-echo "New checksums: $countd, $countw; please recompile!"
+if ! diff qcsrc/server/constants.qh qcsrc/server/constants.qh.new; then
+	mv qcsrc/server/constants.qh.new qcsrc/server/constants.qh
+	if [ -z "$DO_NOT_RUN_MAKE" ]; then
+		make
+	else
+		echo "New checksums: $countd, $countw; please recompile!"
+	fi
+else
+	rm -f qcsrc/server/constants.qh.new
+fi

Modified: branches/nexuiz-2.0/data/weapons.cfg
===================================================================
--- branches/nexuiz-2.0/data/weapons.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/weapons.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -3,7 +3,7 @@
 //
 // And... don't forget to edit weaponsPro.cfg too.
 
-set cvar_check_weapons 4cd91ef6c8a9627168a5e85f581e1e0f
+set cvar_check_weapons f156bf358766dfc169eb26dc36a765b9
 
 set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
@@ -92,7 +92,7 @@
 
 set g_balance_uzi_first_damage 30
 set g_balance_uzi_first_force 50
-set g_balance_uzi_first_spread 0.02
+set g_balance_uzi_first_spread 0.015
 set g_balance_uzi_first_refire 0.2
 set g_balance_uzi_first_ammo 1
 set g_balance_uzi_sustained_damage 15
@@ -110,7 +110,7 @@
 set g_balance_grenadelauncher_primary_speed 2000
 set g_balance_grenadelauncher_primary_speed_up 200
 set g_balance_grenadelauncher_primary_lifetime 30
-set g_balance_grenadelauncher_primary_refire 0.7
+set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
 set g_balance_grenadelauncher_secondary_damage 65
@@ -120,7 +120,7 @@
 set g_balance_grenadelauncher_secondary_speed 1400
 set g_balance_grenadelauncher_secondary_speed_up 200
 set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_refire 0.6
+set g_balance_grenadelauncher_secondary_refire 0.7
 set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 10
@@ -200,19 +200,19 @@
 set g_balance_minstanex_animtime 0.3
 set g_balance_minstanex_ammo 10
 
-set g_balance_hagar_primary_damage 38
+set g_balance_hagar_primary_damage 37
 set g_balance_hagar_primary_edgedamage 15
 set g_balance_hagar_primary_force 100
-set g_balance_hagar_primary_radius 70
+set g_balance_hagar_primary_radius 65
 set g_balance_hagar_primary_spread 0.010
 set g_balance_hagar_primary_speed 3000
 set g_balance_hagar_primary_lifetime 30
 set g_balance_hagar_primary_refire 0.15
 set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary_damage 38
+set g_balance_hagar_secondary_damage 37
 set g_balance_hagar_secondary_edgedamage 15
 set g_balance_hagar_secondary_force 100
-set g_balance_hagar_secondary_radius 70
+set g_balance_hagar_secondary_radius 65
 set g_balance_hagar_secondary_spread 0.015
 set g_balance_hagar_secondary_speed 1400
 set g_balance_hagar_secondary_lifetime 30
@@ -302,11 +302,11 @@
 // 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_animtime 0.3
 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_activate_delay 0.1
 
 set g_balance_seeker_missile_speed        700
 set g_balance_seeker_missile_accel		1.05
@@ -323,7 +323,7 @@
 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_animtime 	    0.3
 set g_balance_seeker_missile_ammo             2
 
 set g_balance_seeker_missile_proxy            0
@@ -355,8 +355,8 @@
 // NOTE: maps should not use this weapon yet
 set g_balance_campingrifle_magazinecapacity 8
 set g_balance_campingrifle_reloadtime 1.1 // this + primary animtime = 1.4 = exactly 2 shots
-set g_balance_campingrifle_primary_damage 80
-set g_balance_campingrifle_primary_headshotaddeddamage 120
+set g_balance_campingrifle_primary_damage 60
+set g_balance_campingrifle_primary_headshotaddeddamage 100
 set g_balance_campingrifle_primary_spread 0
 set g_balance_campingrifle_primary_force 2
 set g_balance_campingrifle_primary_speed 35000
@@ -365,14 +365,14 @@
 set g_balance_campingrifle_primary_animtime 0.3
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_secondary_damage 42
-set g_balance_campingrifle_secondary_headshotaddeddamage 18 // 60 damage only on head
+set g_balance_campingrifle_secondary_damage 35
+set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
 set g_balance_campingrifle_secondary_spread 0.008
 set g_balance_campingrifle_secondary_force 1
 set g_balance_campingrifle_secondary_speed 20000
 set g_balance_campingrifle_secondary_lifetime 5
 set g_balance_campingrifle_secondary_refire 0.12
-set g_balance_campingrifle_secondary_animtime 0.06
+set g_balance_campingrifle_secondary_animtime 0.1
 set g_balance_campingrifle_secondary_ammo 10
 set g_balance_campingrifle_secondary_health 5
 set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu

Modified: branches/nexuiz-2.0/data/weaponsHavoc.cfg
===================================================================
--- branches/nexuiz-2.0/data/weaponsHavoc.cfg	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/data/weaponsHavoc.cfg	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,4 +1,4 @@
-set cvar_check_weapons 4cd91ef6c8a9627168a5e85f581e1e0f
+set cvar_check_weapons f156bf358766dfc169eb26dc36a765b9
 
 set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
@@ -301,7 +301,7 @@
 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_activate_delay 0.1
 
 set g_balance_seeker_missile_speed        700
 set g_balance_seeker_missile_accel		1.05

Deleted: branches/nexuiz-2.0/misc/buildfiles/w32/libogg.dll
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/misc/buildfiles/w32/libtheora.dll (from rev 5910, trunk/misc/buildfiles/w32/libtheora.dll)
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/misc/buildfiles/w32/libvorbis.dll
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/misc/buildfiles/w32/libvorbisfile.dll
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/misc/buildfiles/w32/ogg.dll (from rev 5910, trunk/misc/buildfiles/w32/ogg.dll)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/misc/buildfiles/w32/vorbis.dll (from rev 5910, trunk/misc/buildfiles/w32/vorbis.dll)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/misc/buildfiles/w32/vorbisenc.dll (from rev 5910, trunk/misc/buildfiles/w32/vorbisenc.dll)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/misc/buildfiles/w32/vorbisfile.dll (from rev 5910, trunk/misc/buildfiles/w32/vorbisfile.dll)
===================================================================
(Binary files differ)


Property changes on: branches/nexuiz-2.0/misc/tools/assault-circuit-board-creator.pl
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/autoshader.sh
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/brightspot.sh
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/csqcarchive.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/nexuiz-2.0/misc/tools/demotc-race-record-extractor.sh
===================================================================
--- branches/nexuiz-2.0/misc/tools/demotc-race-record-extractor.sh	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/misc/tools/demotc-race-record-extractor.sh	2009-02-20 14:23:51 UTC (rev 5912)
@@ -1,8 +1,17 @@
 #!/bin/sh
 
+case "$2" in
+	old)
+		PATTERN='all-time fastest lap record with (.*)\n'
+		;;
+	new|*)
+		PATTERN='//RACE RECORD SET (.*)\n'
+		;;
+esac
+
 d=$1
 i=0
-perl demotc.pl grep "$d" 'all-time fastest lap record with (.*)\n' | while IFS=" " read -r timecode result; do
+demotc.pl grep "$d" "$PATTERN" | while IFS=" " read -r timecode result; do
 	timecode=${timecode%:}
 	result=${result#\"}
 	result=${result%\"}
@@ -18,6 +27,6 @@
 	timecode_start=`echo "$timecode - $minutes*60 - $seconds - $tenths*0.1 - 2" | bc -l`
 	timecode_end=`echo "$timecode + 2" | bc -l`
 	i=$(($i + 1))
-	perl demotc.pl cut "$d" "playback-$i.dem" "$timecode_start" "$timecode_end"
-	perl demotc.pl cut "$d" "capture-$i.dem" "$timecode_start" "$timecode_end" --capture
+	demotc.pl cut "$d" "playback-$i.dem" "$timecode_start" "$timecode_end"
+	demotc.pl cut "$d" "capture-$i.dem" "$timecode_start" "$timecode_end" --capture
 done


Property changes on: branches/nexuiz-2.0/misc/tools/demotc-race-record-extractor.sh
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/entmerge.pl
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/fiximage.pl
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: branches/nexuiz-2.0/misc/tools/polycount.pl
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/nexuiz-2.0/misc/tools/shader-checksums.pl
===================================================================
--- branches/nexuiz-2.0/misc/tools/shader-checksums.pl	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/misc/tools/shader-checksums.pl	2009-02-20 14:23:51 UTC (rev 5912)
@@ -4,6 +4,64 @@
 use warnings;
 use Digest::MD5;
 
+my $data = do { undef local $/; <STDIN>; };
+my $com_token;
+sub gettoken($)
+{
+	my ($returnnewline) = @_;
+	$com_token = undef;
+
+skipwhite:
+	if($returnnewline)
+	{
+		$data =~ s/^[ \t]*//;
+	}
+	else
+	{
+		$data =~ s/^[ \t\r\n]*//;
+	}
+
+	return 0
+		if $data eq "";
+
+	$data =~ s/^\r\n/\n/;
+
+	$data =~ s/^\/\/[^\r\n]*// and goto skipwhite;
+
+	$data =~ s/^\/\*.*?\*\/// and goto skipwhite;
+
+	if($data =~ s/^(["'])(.*?)\1//)
+	{
+		my $str = $1;
+		my %q = ( "\\" => "\\", "n" => "\n", "t" => "\t" );
+		$str =~ s/\\([\\nt])/$q{$1}/ge;
+		$com_token = $str;
+		return 1;
+	}
+
+	if($data =~ s/^\r//)
+	{
+		$com_token = "\n";
+		return 1;
+	}
+
+	if($data =~ s/^([][\n{})(:,;])//)
+	{
+		$com_token = $1;
+		return 1;
+	}
+
+	if($data =~ s/^([^][ \t\r\n{})(:,;]*)//)
+	{
+		$com_token = $1;
+		return 1;
+	}
+
+	die "fallthrough?";
+	$com_token = "";
+	return 1;
+}
+
 sub normalize_path($)
 {
 	my ($p) = @_;
@@ -13,90 +71,106 @@
 	return $p;
 }
 
-my $find_texture_names;
-$find_texture_names = grep { /^-t$/ } @ARGV;
+my $find_texture_names = grep { /^-t$/ } @ARGV;
+my $dump_shaders = grep { /^-d$/ } @ARGV;
+my @match = grep { !/^-/ } @ARGV;
 
-my $shadertext = "";
-my $level = 0;
+my $shadertext;
 my $curshader;
-while(<STDIN>)
+
+while(gettoken 0)
 {
-	s/\r//gs;
-	chomp;
+	$curshader = normalize_path $com_token;
+	$shadertext = "";
 
-	s/\/\/.*//s;
-	s/^\s+//;
-	s/\s+$//;
-	next if /^$/;
-
-	my @line = map { s/"//g; $_; } split /\s+/, $_;
-
-	$shadertext .= "@line\n";
-
-	if($line[0] eq '{')
+	if(!gettoken(0) || $com_token ne "{")
 	{
-		die "{ line contains other stuff"
-			unless @line == 1;
-		die "{ line without shader name"
-			unless defined $curshader;
-		die "{ line in level $level"
-			if $level >= 2;
-		++$level;
+		die "parsing error - expected \"{\", found \"$com_token\"";
 	}
-	elsif($line[0] eq '}')
+	
+	$shadertext .= "{\n";
+
+	while(gettoken 0)
 	{
-		die "} line contains other stuff"
-			unless @line == 1;
-		die "} line without shader name"
-			unless defined $curshader;
-		die "{ line in level $level"
-			if $level <= 0;
-		--$level;
-		if($level <= 0)
+		last if $com_token eq "}";
+
+		if($com_token eq "{")
 		{
-			$level = 0;
-			printf "%s  %s\n", Digest::MD5::md5_hex($shadertext), $curshader;
+			# shader layer
+			# we're not actually parsing this
 
-			if($find_texture_names)
+			$shadertext .= "	{\n";
+
+			while(gettoken 0)
 			{
-				# find out possibly loaded textures
-				my @maps = ($shadertext =~ /^map ([^\$].*)$/gim);
-				for($shadertext =~ /^animmap \S+ (.*)$/gim)
+				last if $com_token eq "}";
+				next if $com_token eq "\n";
+
+				my @parameter = ();
+
+				while($com_token ne "\n" && $com_token ne "}")
 				{
-					push @maps, split / /, $_;
+					push @parameter, $com_token;
+					last unless gettoken 1;
 				}
-				for($shadertext =~ /^skyparms (.*)$/gim)
+
+				$shadertext .= "		@parameter\n";
+
+				last if $com_token eq "}";
+			}
+
+			$shadertext .= "	}\n";
+		}
+
+		my @parameter = ();
+
+		while($com_token ne "\n" && $com_token ne "}")
+		{
+			push @parameter, $com_token;
+			last unless gettoken 1;
+		}
+
+		next if @parameter < 1;
+
+		$shadertext .= "	@parameter\n";
+	}
+
+	$shadertext .= "}\n";
+
+	if(!@match || grep { $_ eq $curshader } @match)
+	{
+		printf "%s  %s\n", Digest::MD5::md5_hex($shadertext), $curshader;
+
+		if($find_texture_names)
+		{
+			# find out possibly loaded textures
+			my @maps = ($shadertext =~ /^(?:clampmap|map|q3r_lightimage|q3r_editorimage) ([^\$].*)$/gim);
+			for($shadertext =~ /^animmap \S+ (.*)$/gim)
+			{
+				push @maps, split / /, $_;
+			}
+			for($shadertext =~ /^skyparms (.*)$/gim)
+			{
+				for(split / /, $_)
 				{
-					for(split / /, $_)
-					{
-						next if $_ eq "-";
-						push @maps, "$_"."_lf";
-						push @maps, "$_"."_ft";
-						push @maps, "$_"."_rt";
-						push @maps, "$_"."_bk";
-						push @maps, "$_"."_up";
-						push @maps, "$_"."_dn";
-					}
+					next if $_ eq "-";
+					push @maps, "$_"."_lf";
+					push @maps, "$_"."_ft";
+					push @maps, "$_"."_rt";
+					push @maps, "$_"."_bk";
+					push @maps, "$_"."_up";
+					push @maps, "$_"."_dn";
 				}
-				@maps = ($curshader)
-					if @maps == 0;
-				printf "* %s  %s\n", $_, $curshader
-					for map { normalize_path $_ } @maps;
 			}
+			@maps = ($curshader)
+				if @maps == 0;
+			printf "* %s  %s\n", $_, $curshader
+				for map { normalize_path $_ } @maps;
+		}
 
-			$curshader = undef;
+		if($dump_shaders)
+		{
+			print "| $_\n" for split /\n/, $shadertext;
 		}
 	}
-	elsif($level == 0)
-	{
-		die "shader name already set"
-			if defined $curshader;
-		$curshader = normalize_path $line[0];
-		$shadertext = "";
-	}
 }
-
-if($level != 0)
-{
-	die "missing } line";
-}


Property changes on: branches/nexuiz-2.0/misc/tools/ttf2conchars/foo.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf
===================================================================
--- branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf	2009-02-20 14:23:51 UTC (rev 5912)
@@ -5,6 +5,7 @@
 # IRC configuration
 irc_server = irc.oftc.net
 irc_nick = testNex
+irc_nick_alternates = testNex_ testNex__
 irc_user = banme
 irc_channel = #Nexuiz-Pwayers
 
@@ -28,6 +29,7 @@
 #dp_server_from_wan =
 #dp_listen = 141.2.16.23:27771
 #dp_status_delay = 30
+#irc_reconnect_delay = 300
 #irc_admin_timeout = 3600
 #irc_local = 141.2.16.23
 #irc_ping_delay = 120

Modified: branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl
===================================================================
--- branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl	2009-02-20 14:23:51 UTC (rev 5912)
@@ -634,6 +634,7 @@
 our %config = (
 	irc_server => undef,
 	irc_nick => undef,
+	irc_nick_alternates => "",
 	irc_user => undef,
 	irc_channel => undef,
 	irc_ping_delay => 120,
@@ -660,6 +661,8 @@
 	irc_admin_password => "",
 	irc_admin_timeout => 3600,
 
+	irc_reconnect_delay => 300,
+
 	plugins => "",
 );
 
@@ -796,15 +799,15 @@
 	delete $channels{irc};
 	schedule sub {
 		my ($timer) = @_;
-		if(!defined $store{slots_full})
+		if(!defined $store{slots_active})
 		{
 			# DP is not running, then delay IRC reconnecting
 			#use Data::Dumper; print Dumper \$timer;
-			schedule $timer => 1;;
+			schedule $timer => 1;
 			return;
 			# this will keep irc_error_active
 		}
-		$channels{irc} = new Channel::Line(new Connection::Socket(tcp => "" => $config{irc_server}));
+		$channels{irc} = new Channel::Line(new Connection::Socket(tcp => "" => $config{irc_server} => 6667));
 		delete $store{$_} for grep { /^irc_/ } keys %store;
 		$store{irc_nick} = "";
 		schedule sub {
@@ -813,10 +816,22 @@
 			$store{status_waiting} = -1;
 		} => 1;
 		# this will clear irc_error_active
-	} => 30;
+	} => $config{irc_reconnect_delay};
 	return 0;
 }
 
+sub uniq(@)
+{
+	my @out = ();
+	my %found = ();
+	for(@_)
+	{
+		next if $found{$_}++;
+		push @out, $_;
+	}
+	return @out;
+}
+
 # IRC joining (if this is called as response to a nick name collision, $is433 is set);
 # among other stuff, it performs NickServ or Quakenet authentication. This is to be called
 # until the channel has been joined for every message that may be "interesting" (basically,
@@ -856,13 +871,39 @@
 		{
 			# we failed to get an initial nickname
 			# change ours a bit and try again
-			if(length $store{irc_nick_requested} < 9)
+
+			my @alternates = uniq ($config{irc_nick}, grep { $_ ne "" } split /\s+/, $config{irc_nick_alternates});
+			my $nextnick = undef;
+			for(0.. at alternates-2)
 			{
-				$store{irc_nick_requested} .= '_';
+				if($store{irc_nick_requested} eq $alternates[$_])
+				{
+					$nextnick = $alternates[$_+1];
+				}
 			}
+			if($store{irc_nick_requested} eq $alternates[@alternates-1]) # this will only happen once
+			{
+				$store{irc_nick_requested} = $alternates[0];
+				# but don't set nextnick, so we edit it
+			}
+			if(defined $nextnick)
+			{
+				$store{irc_nick_requested} = $nextnick;
+			}
 			else
 			{
-				substr $store{irc_nick_requested}, int(rand length $store{irc_nick_requested}), 1, chr(97 + int rand 26);
+				for(;;)
+				{
+					if(length $store{irc_nick_requested} < 9)
+					{
+						$store{irc_nick_requested} .= '_';
+					}
+					else
+					{
+						substr $store{irc_nick_requested}, int(rand length $store{irc_nick_requested}), 1, chr(97 + int rand 26);
+					}
+					last unless grep { $_ eq $store{irc_nick_requested} } @alternates;
+				}
 			}
 			out irc => 1, "NICK $store{irc_nick_requested}";
 			return; # when it fails, we'll get here again, and when it succeeds, we will continue
@@ -1148,6 +1189,7 @@
 
 	# detect IRC errors and reconnect
 	[ irc => q{ERROR .*} => \&irc_error ],
+	[ irc => q{:[^ ]* 404 .*} => \&irc_error ], # cannot send to channel
 	[ system => q{error irc} => \&irc_error ],
 
 	# IRC nick in use
@@ -1241,7 +1283,7 @@
 	[ dp => q{:name:(\d+):(.*)} => sub {
 		my ($id, $nick) = @_;
 		$nick = color_dp2irc $nick;
-		my $oldnick = $store{"playernick_$id"};
+		my $oldnick = $store{"playernick_byid_$id"};
 		out irc => 0, "PRIVMSG $config{irc_channel} :* $oldnick\017 is now known as $nick";
 		$store{"playernick_byid_$id"} = $nick;
 		return 0;

Modified: branches/nexuiz-2.0/server/readme.txt
===================================================================
--- branches/nexuiz-2.0/server/readme.txt	2009-02-20 14:02:37 UTC (rev 5911)
+++ branches/nexuiz-2.0/server/readme.txt	2009-02-20 14:23:51 UTC (rev 5912)
@@ -46,7 +46,7 @@
 rcon.pl is a perl script that implements rcon which can be used to
 remotely control your server.
 
-help.cfg is a nexuiz config file proving a simple help message system.
-It prints all the messages from a list, one after the other with an
-configureable delay between them.  Great to provide beginners with
-some hints.
+help.cfg is a Nexuiz config file providing a simple help message
+system.  It prints all the messages from a list, one after the other
+with an configureable delay between them.  Great to provide beginners
+with some hints.




More information about the nexuiz-commits mailing list