[nexuiz-commits] r6191 - in branches/nexuiz-2.0: . data data/maps data/maps/basement data/models data/models/weapons data/qcsrc/client data/qcsrc/common data/qcsrc/menu data/qcsrc/menu/nexuiz data/qcsrc/server data/scripts misc/mediasource/models misc/tools server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Mar 16 05:12:13 EDT 2009


Author: div0
Date: 2009-03-16 05:12:13 -0400 (Mon, 16 Mar 2009)
New Revision: 6191

Added:
   branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm
   branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm
   branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_electro.dpm
   branches/nexuiz-2.0/data/models/weapons/h_electro.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_gl.dpm
   branches/nexuiz-2.0/data/models/weapons/h_gl.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm
   branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm
   branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm
   branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_laser.dpm
   branches/nexuiz-2.0/data/models/weapons/h_laser.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm
   branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_nex.dpm
   branches/nexuiz-2.0/data/models/weapons/h_nex.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_porto.dpm
   branches/nexuiz-2.0/data/models/weapons/h_porto.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_rl.dpm
   branches/nexuiz-2.0/data/models/weapons/h_rl.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm
   branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm
   branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm
   branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm
   branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm.animinfo
   branches/nexuiz-2.0/data/models/weapons/w_uzi.qh
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/modbutton.c
   branches/nexuiz-2.0/misc/mediasource/models/h_weapons.zip
   branches/nexuiz-2.0/misc/mediasource/models/h_weapons/
Removed:
   branches/nexuiz-2.0/data/models/weapons/g_flamethrower.md3
   branches/nexuiz-2.0/data/models/weapons/g_hlacmod.md3
   branches/nexuiz-2.0/data/models/weapons/v_flamethrower.md3
   branches/nexuiz-2.0/data/models/weapons/v_hlacmod.md3
   branches/nexuiz-2.0/data/models/weapons/w_campingrifle.zym
   branches/nexuiz-2.0/data/models/weapons/w_flamethrower.zym
   branches/nexuiz-2.0/data/models/weapons/w_hlac.zym
   branches/nexuiz-2.0/data/models/weapons/w_hlacmod.zym
   branches/nexuiz-2.0/data/models/weapons/w_hookgun.zym
   branches/nexuiz-2.0/data/models/weapons/w_minstanex.zym
   branches/nexuiz-2.0/data/models/weapons/w_porto.zym
   branches/nexuiz-2.0/data/models/weapons/w_seeker.zym
Modified:
   branches/nexuiz-2.0/.patchsets
   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/maps/basement.bsp
   branches/nexuiz-2.0/data/maps/basement.map
   branches/nexuiz-2.0/data/maps/basement/lm_0000.tga
   branches/nexuiz-2.0/data/maps/basement/lm_0001.tga
   branches/nexuiz-2.0/data/maps/basement/lm_0002.tga
   branches/nexuiz-2.0/data/maps/basement/lm_0003.tga
   branches/nexuiz-2.0/data/models/grenademodel.md3
   branches/nexuiz-2.0/data/models/weapons/v_hagar.md3
   branches/nexuiz-2.0/data/nexuiz-credits.txt
   branches/nexuiz-2.0/data/physicsHavoc.cfg
   branches/nexuiz-2.0/data/qcsrc/client/View.qc
   branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc
   branches/nexuiz-2.0/data/qcsrc/common/items.qc
   branches/nexuiz-2.0/data/qcsrc/menu/classes.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
   branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
   branches/nexuiz-2.0/data/qcsrc/server/constants.qh
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_hook.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/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
   branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
   branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_quake3.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
   branches/nexuiz-2.0/data/scripts/entities.def
   branches/nexuiz-2.0/data/weapons.cfg
   branches/nexuiz-2.0/data/weaponsHavoc.cfg
   branches/nexuiz-2.0/misc/tools/demotc.pl
   branches/nexuiz-2.0/server/server.cfg
Log:
r6090 | div0 | 2009-03-09 15:34:23 +0100 (Mon, 09 Mar 2009) | 2 lines
shootfromcenter: try to display the weapon model in the middle of the screen to show to the player that this mode is active (fails for minstanex and seeker, needs model fixes)
r6096 | div0 | 2009-03-10 07:39:43 +0100 (Tue, 10 Mar 2009) | 2 lines
initialize mapinfo on startup (so the gametype command becomes available)
r6097 | esteel | 2009-03-10 07:58:10 +0100 (Tue, 10 Mar 2009) | 2 lines
last checking works, so use gametype in server.cfg
add aliases sv_loadconfig and addvote
r6098 | esteel | 2009-03-10 08:04:55 +0100 (Tue, 10 Mar 2009) | 2 lines
while i'm at it, also add my alias sv_restart
r6099 | div0 | 2009-03-10 09:09:08 +0100 (Tue, 10 Mar 2009) | 2 lines
resync the weapon cfg files
r6100 | esteel | 2009-03-10 10:35:37 +0100 (Tue, 10 Mar 2009) | 2 lines
small typo in a cvar description
r6101 | div0 | 2009-03-10 16:19:37 +0100 (Tue, 10 Mar 2009) | 2 lines
fix a typo in movetypes.qc that can cause entities to leave onground state
r6102 | div0 | 2009-03-11 20:46:32 +0100 (Wed, 11 Mar 2009) | 2 lines
get rid of the v_flipped toggle
r6103 | esteel | 2009-03-11 20:59:46 +0100 (Wed, 11 Mar 2009) | 1 line
a very simple approach at switching between havoc and data
r6104 | div0 | 2009-03-11 21:45:17 +0100 (Wed, 11 Mar 2009) | 4 lines
-allweapons
+mostweapons
remove seeker from LMS
r6105 | lordhavoc | 2009-03-11 22:39:56 +0100 (Wed, 11 Mar 2009) | 3 lines
added dpm weapon support
added motorsep's fixed up w_uzi model
r6106 | lordhavoc | 2009-03-11 22:44:17 +0100 (Wed, 11 Mar 2009) | 2 lines
fix compile (don't need the weapon model qh files)
r6108 | lordhavoc | 2009-03-12 05:32:41 +0100 (Thu, 12 Mar 2009) | 3 lines
added sv_qcweaponanimation cvar which enables entirely qc-based weapon
animations if set to 1
r6109 | lordhavoc | 2009-03-12 05:34:03 +0100 (Thu, 12 Mar 2009) | 2 lines
added sv_qcweaponanimation cvar
r6110 | lordhavoc | 2009-03-12 06:21:34 +0100 (Thu, 12 Mar 2009) | 2 lines
fix bugs with camping rifle introduced by my anim changes
r6111 | lordhavoc | 2009-03-12 07:52:05 +0100 (Thu, 12 Mar 2009) | 3 lines
fixed muzzleflashes with sv_qcweaponanimation mode
implemented support for models/weapons/h_name.dpm (and .animinfo)
r6112 | lordhavoc | 2009-03-12 08:23:17 +0100 (Thu, 12 Mar 2009) | 1 line
r6113 | div0 | 2009-03-12 09:17:44 +0100 (Thu, 12 Mar 2009) | 2 lines
make qc-based weapon animation look better
r6114 | div0 | 2009-03-12 09:43:29 +0100 (Thu, 12 Mar 2009) | 2 lines
implement sv_gameplayfix_slidemoveprojectiles behaviour
r6115 | lordhavoc | 2009-03-12 10:37:45 +0100 (Thu, 12 Mar 2009) | 2 lines
fix two weapon bugs that were overriding player animations
r6116 | lordhavoc | 2009-03-12 11:47:51 +0100 (Thu, 12 Mar 2009) | 3 lines
updated Havoc config
moved weaponreplace lines into weapons configs
r6117 | div0 | 2009-03-12 12:28:07 +0100 (Thu, 12 Mar 2009) | 2 lines
better error message for cvar check
r6118 | lordhavoc | 2009-03-12 13:23:21 +0100 (Thu, 12 Mar 2009) | 2 lines
tweaked ammo limits a bit in havoc
r6119 | lordhavoc | 2009-03-12 13:24:58 +0100 (Thu, 12 Mar 2009) | 2 lines
forgot this file
r6120 | lordhavoc | 2009-03-12 13:25:17 +0100 (Thu, 12 Mar 2009) | 3 lines
fixed a bug that caused the campingrifle's reload anim to not play
fixed a bug with weapon switches/respawning in qc weapon animation
r6121 | lordhavoc | 2009-03-12 14:01:09 +0100 (Thu, 12 Mar 2009) | 2 lines
eject multiple shell casings from shotgun if ammo is more than 1
r6122 | lordhavoc | 2009-03-12 14:02:52 +0100 (Thu, 12 Mar 2009) | 3 lines
eject multiple shell casings from secondary fire of shotgun if ammo is
more than 1
r6123 | esteel | 2009-03-12 14:04:16 +0100 (Thu, 12 Mar 2009) | 1 line
swap laser modes in havoc, so primary is for jumping, similar to stock nexuiz and secondary does damage
r6124 | lordhavoc | 2009-03-12 14:07:08 +0100 (Thu, 12 Mar 2009) | 2 lines
give laser secondary a little force, but not much
r6125 | lordhavoc | 2009-03-12 14:32:43 +0100 (Thu, 12 Mar 2009) | 2 lines
make physics nearly normal
r6129 | lordhavoc | 2009-03-13 06:25:30 +0100 (Fri, 13 Mar 2009) | 2 lines
motorsep did a hand model for the camping rifle
r6130 | lordhavoc | 2009-03-13 06:28:50 +0100 (Fri, 13 Mar 2009) | 2 lines
changed idle fps to 10
r6131 | lordhavoc | 2009-03-13 11:42:23 +0100 (Fri, 13 Mar 2009) | 2 lines
minor edits to make code more similar to old versions
r6132 | lordhavoc | 2009-03-13 11:53:41 +0100 (Fri, 13 Mar 2009) | 2 lines
fix weapon position with qcweaponanimation off
r6133 | div0 | 2009-03-13 13:21:49 +0100 (Fri, 13 Mar 2009) | 2 lines
derive the shot origin automatically from the hand model; properly support shootfromcenter again
r6134 | esteel | 2009-03-13 13:24:36 +0100 (Fri, 13 Mar 2009) | 1 line
add the new .dpm models to the compat pack in case people run svn trunk
r6135 | esteel | 2009-03-13 13:28:03 +0100 (Fri, 13 Mar 2009) | 2 lines
also the radar images got changed from _mini to _radar
r6136 | div0 | 2009-03-13 13:50:50 +0100 (Fri, 13 Mar 2009) | 2 lines
abort the vote if there was just 1 choice anyway
r6137 | m0rfar | 2009-03-13 19:28:38 +0100 (Fri, 13 Mar 2009) | 1 line
campingrifle animinfo fix by motersep
r6138 | m0rfar | 2009-03-13 20:42:37 +0100 (Fri, 13 Mar 2009) | 1 line
New camping rifle animations by motorsep
r6139 | mand1nga | 2009-03-13 22:18:14 +0100 (Fri, 13 Mar 2009) | 1 line
Updated changes in bots
r6140 | mand1nga | 2009-03-13 22:20:35 +0100 (Fri, 13 Mar 2009) | 1 line
Updated bots changes again
r6141 | div0 | 2009-03-13 22:23:18 +0100 (Fri, 13 Mar 2009) | 2 lines
fight float inaccuracy in the animation system
r6142 | div0 | 2009-03-13 22:25:41 +0100 (Fri, 13 Mar 2009) | 2 lines
do the same as last commit, but don't rely on the function call happening in a non-clmovement frame
r6143 | div0 | 2009-03-14 13:55:44 +0100 (Sat, 14 Mar 2009) | 2 lines
document breakage of func_illusionary
r6144 | div0 | 2009-03-14 14:03:39 +0100 (Sat, 14 Mar 2009) | 2 lines
more robustness for weapon animation (should fix the jerkiness)
r6145 | lordhavoc | 2009-03-14 14:30:14 +0100 (Sat, 14 Mar 2009) | 2 lines
added support for models/weapons/h_name.zym models
r6146 | div0 | 2009-03-14 14:48:18 +0100 (Sat, 14 Mar 2009) | 2 lines
fix loading of the zyms
r6147 | div0 | 2009-03-14 14:59:52 +0100 (Sat, 14 Mar 2009) | 2 lines
tiny cleanup for the shot origin stuff
r6148 | motorsep | 2009-03-14 19:38:45 +0100 (Sat, 14 Mar 2009) | 1 line
Crylink hand
r6149 | motorsep | 2009-03-14 20:00:45 +0100 (Sat, 14 Mar 2009) | 1 line
Electro hand
r6150 | motorsep | 2009-03-14 20:46:51 +0100 (Sat, 14 Mar 2009) | 1 line
GL hand
r6151 | motorsep | 2009-03-14 21:00:29 +0100 (Sat, 14 Mar 2009) | 1 line
updated GL hand
r6152 | motorsep | 2009-03-14 21:59:41 +0100 (Sat, 14 Mar 2009) | 1 line
new v_hagar.md3
r6153 | div0 | 2009-03-14 22:03:58 +0100 (Sat, 14 Mar 2009) | 2 lines
display "sv_cmd gettaginfo" more accurately
r6154 | motorsep | 2009-03-14 22:17:57 +0100 (Sat, 14 Mar 2009) | 1 line
GL hand updated
r6155 | div0 | 2009-03-14 22:24:55 +0100 (Sat, 14 Mar 2009) | 2 lines
fix texture path in v_hagar
r6156 | motorsep | 2009-03-14 22:43:15 +0100 (Sat, 14 Mar 2009) | 1 line
r6157 | div0 | 2009-03-14 22:53:13 +0100 (Sat, 14 Mar 2009) | 2 lines
bugfix for basement (some texture alignment, and brush alignment)
r6158 | motorsep | 2009-03-14 22:53:36 +0100 (Sat, 14 Mar 2009) | 1 line
r6160 | motorsep | 2009-03-14 23:02:41 +0100 (Sat, 14 Mar 2009) | 1 line
HLAC hand
r6162 | motorsep | 2009-03-14 23:26:21 +0100 (Sat, 14 Mar 2009) | 1 line
Hookgun hand
r6163 | div0 | 2009-03-14 23:46:50 +0100 (Sat, 14 Mar 2009) | 2 lines
fix hook origin
r6164 | motorsep | 2009-03-14 23:55:42 +0100 (Sat, 14 Mar 2009) | 1 line
Laser hand
r6165 | motorsep | 2009-03-15 00:05:38 +0100 (Sun, 15 Mar 2009) | 1 line
r6166 | motorsep | 2009-03-15 00:21:08 +0100 (Sun, 15 Mar 2009) | 1 line
Nex hand
r6167 | motorsep | 2009-03-15 00:36:59 +0100 (Sun, 15 Mar 2009) | 1 line
Porto and RL hands
r6168 | motorsep | 2009-03-15 01:10:25 +0100 (Sun, 15 Mar 2009) | 1 line
the rest of the weapons' hands
r6169 | lordhavoc | 2009-03-15 01:33:28 +0100 (Sun, 15 Mar 2009) | 2 lines
added motorsep to Thanks list
r6171 | motorsep | 2009-03-15 02:31:51 +0100 (Sun, 15 Mar 2009) | 1 line
update animation for certain weapons to make it more unique
r6172 | motorsep | 2009-03-15 02:41:21 +0100 (Sun, 15 Mar 2009) | 1 line
Source files (blends and md5s) for h_ weapons
r6173 | div0 | 2009-03-15 11:15:05 +0100 (Sun, 15 Mar 2009) | 2 lines
improve shotgun and shootfromcenter
r6174 | div0 | 2009-03-15 11:19:49 +0100 (Sun, 15 Mar 2009) | 2 lines
fix seeker shotorg
r6175 | div0 | 2009-03-15 11:41:13 +0100 (Sun, 15 Mar 2009) | 2 lines
handle casings using the "shell" tag; make them go left instead of right (fits better); eliminate no longer used shotorg argument from W_SetupShot
r6176 | esteel | 2009-03-15 13:04:06 +0100 (Sun, 15 Mar 2009) | 2 lines
added all the new weapon models to the compatpack
r6177 | motorsep | 2009-03-15 19:45:21 +0100 (Sun, 15 Mar 2009) | 1 line
Grenademodel centered, Hagar lowered, Minstanex raised.
r6178 | div0 | 2009-03-15 19:51:23 +0100 (Sun, 15 Mar 2009) | 2 lines
fix some casings
r6179 | div0 | 2009-03-15 19:58:46 +0100 (Sun, 15 Mar 2009) | 2 lines
fix some precaches
r6180 | motorsep | 2009-03-15 19:59:31 +0100 (Sun, 15 Mar 2009) | 1 line
Shotgun moved forward a bit
r6181 | div0 | 2009-03-15 21:11:05 +0100 (Sun, 15 Mar 2009) | 2 lines
CR reload time := 2 (for the new anim)
r6183 | div0 | 2009-03-15 22:03:57 +0100 (Sun, 15 Mar 2009) | 2 lines
add warning for minstanex
r6184 | div0 | 2009-03-15 22:04:39 +0100 (Sun, 15 Mar 2009) | 2 lines
no longer need w_*.zym
r6185 | motorsep | 2009-03-15 22:14:56 +0100 (Sun, 15 Mar 2009) | 1 line
h_ weapons source files
r6186 | div0 | 2009-03-16 08:19:57 +0100 (Mon, 16 Mar 2009) | 7 lines
cleanup: remove code to load w_*.zym weapon models;
instead make the loading of the v_ model only happen if the h_ model defines the "weapon" tag.
That way, the h_ model can be both an "invisible hand" model, or an old-style "full weapon" model.
Also, note that the engine loads ZYM models properly as ZYM even if renamed to dpm, so there is no need to try all extensions.
All in all, this saves quite some file open calls and should help with dedicated server performance, especially on operating systems with slow file opening (e.g. Windows with a running on-access virus scanner).
r6187 | div0 | 2009-03-16 08:24:22 +0100 (Mon, 16 Mar 2009) | 2 lines
don't inherit dlight causing effects to the first person model
r6188 | div0 | 2009-03-16 08:28:48 +0100 (Mon, 16 Mar 2009) | 2 lines
in weapon arena, spawn powerups and health and armor again (these can still be turned off by separate cvars)
r6189 | div0 | 2009-03-16 09:09:21 +0100 (Mon, 16 Mar 2009) | 2 lines
fix typo
r6190 | div0 | 2009-03-16 09:39:44 +0100 (Mon, 16 Mar 2009) | 2 lines
remove unused (w_*.zym for the models that weren't in 2.4.2 - the 2.4.2 ones are still needed for compatibility) and broken unused (hlacmod, flamethrower) models as they wouldn't work if code were to be implemented for them (they're sourceless, and need changes to work in SVN anyway)


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/.patchsets	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-6039,6044-6088,6091-6094
+revisions_applied = 1-6039,6044-6106,6108-6125,6129-6158,6160-6160,6162-6169,6171-6181,6183-6190

Modified: branches/nexuiz-2.0/changes-since-last-release
===================================================================
--- branches/nexuiz-2.0/changes-since-last-release	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/changes-since-last-release	2009-03-16 09:12:13 UTC (rev 6191)
@@ -43,8 +43,7 @@
 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: better visual hint for unbalanced teams
-game: bots can now bunnyhop
-game: bots try to not take items near team mates
+game: bots can do bunnyhopping now
 game: carrying strength and shield has less of a performance impact now
 game: cl_gentle, clientside gib replacement for general audiences
 game: cmd maplist improved
@@ -110,7 +109,7 @@
 game: hook jitter-less (full client side drawing)
 game: hook sky-attach bug fixed
 game: hook weapon consumes cell ammo
-game: improved bot ai: teamworking, items rating and weapon combos
+game: improved bot ai: teamworking, items rating, weapon combos, swimming, basic handling of ladders, better handling of jumpads, better detection of dangers, recognition of doors
 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: 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

Modified: branches/nexuiz-2.0/data/build-compat-pack.sh
===================================================================
--- branches/nexuiz-2.0/data/build-compat-pack.sh	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/build-compat-pack.sh	2009-03-16 09:12:13 UTC (rev 6191)
@@ -4,16 +4,16 @@
 
 COMPAT_FILES="
 	effectinfo.txt
-	gfx/aggressor_mini.tga
-	gfx/aneurysm_mini.tga
-	gfx/basementctf_mini.tga
-	gfx/bleach_mini.tga
-	gfx/bloodprisonctf_mini.tga
-	gfx/bloodprison_mini.tga
-	gfx/bluesky_mini.tga
-	gfx/dieselpower_mini.tga
-	gfx/dismal_mini.tga
-	gfx/final_rage_mini.tga
+	gfx/aggressor_radar.tga
+	gfx/aneurysm_radar.tga
+	gfx/basementctf_radar.tga
+	gfx/bleach_radar.tga
+	gfx/bloodprisonctf_radar.tga
+	gfx/bloodprison_radar.tga
+	gfx/bluesky_radar.tga
+	gfx/dieselpower_radar.tga
+	gfx/dismal_radar.tga
+	gfx/final_rage_radar.tga
 	gfx/inv_weapon10.tga
 	gfx/inv_weapon11.tga
 	gfx/inv_weapon12.tga
@@ -27,10 +27,10 @@
 	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
-	gfx/runningman_mini.tga
+	gfx/reslimed_radar.tga
+	gfx/runningman_1on1remix_radar.tga
+	gfx/runningmanctf_radar.tga
+	gfx/runningman_radar.tga
 	gfx/sb_flag_blue_shielded.tga
 	gfx/sb_flag_red_shielded.tga
 	gfx/sb_kh_full.tga
@@ -39,14 +39,14 @@
 	gfx/sb_playercolor_base.tga
 	gfx/sb_playercolor_pants.tga
 	gfx/sb_playercolor_shirt.tga
-	gfx/silvercity_mini.tga
-	gfx/stormkeep_mini.tga
-	gfx/strength_mini.tga
+	gfx/silvercity_radar.tga
+	gfx/stormkeep_radar.tga
+	gfx/strength_radar.tga
 	gfx/teamradar_icon_1.tga
 	gfx/teamradar_icon_2.tga
 	gfx/teamradar_ping.tga
-	gfx/toxic_mini.tga
-	gfx/warfare_mini.tga
+	gfx/toxic_radar.tga
+	gfx/warfare_radar.tga
 	maps/eggandbacon.bsp
 	models/ctf/flags.md3
 	models/ctf/flags.md3_0.skin
@@ -168,18 +168,42 @@
 	models/weapons/g_minstanex.md3
 	models/weapons/g_porto.md3
 	models/weapons/g_seeker.md3
+	models/weapons/h_campingrifle.dpm
+	models/weapons/h_campingrifle.dpm.animinfo
+	models/weapons/h_crylink.dpm
+	models/weapons/h_crylink.dpm.animinfo
+	models/weapons/h_electro.dpm
+	models/weapons/h_electro.dpm.animinfo
+	models/weapons/h_gl.dpm
+	models/weapons/h_gl.dpm.animinfo
+	models/weapons/h_hagar.dpm
+	models/weapons/h_hagar.dpm.animinfo
+	models/weapons/h_hlac.dpm
+	models/weapons/h_hlac.dpm.animinfo
+	models/weapons/h_hookgun.dpm
+	models/weapons/h_hookgun.dpm.animinfo
+	models/weapons/h_laser.dpm
+	models/weapons/h_laser.dpm.animinfo
+	models/weapons/h_minstanex.dpm
+	models/weapons/h_minstanex.dpm.animinfo
+	models/weapons/h_nex.dpm
+	models/weapons/h_nex.dpm.animinfo
+	models/weapons/h_porto.dpm
+	models/weapons/h_porto.dpm.animinfo
+	models/weapons/h_rl.dpm
+	models/weapons/h_rl.dpm.animinfo
+	models/weapons/h_seeker.dpm
+	models/weapons/h_seeker.dpm.animinfo
+	models/weapons/h_shotgun.dpm
+	models/weapons/h_shotgun.dpm.animinfo
+	models/weapons/h_uzi.dpm
+	models/weapons/h_uzi.dpm.animinfo
 	models/weapons/v_campingrifle.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/w_campingrifle.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
 	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-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-03-16 09:12:13 UTC (rev 6191)
@@ -24,7 +24,7 @@
 seta g_configversion 0	"Configuration file version (used to upgrade settings) 0: first run, or previous start was <2.4.1  Later, it's overridden by config.cfg, version ranges are defined in config_update.cfg"
 
 // default.cfg versioning (update using update-cvarcount.sh, run that every time after adding a new cvar)
-set cvar_check_default b47ac645ad97cf25d5d95b2b8be26e15
+set cvar_check_default 536ebc4385079e467b5b49c21ff625e5
 
 // Nexuiz version (formatted for machines)
 // used to determine if a client version is compatible
@@ -242,7 +242,7 @@
 //nifreks lockonrestart feature, used in team-based game modes, if set to 1 and all players readied up no other player can then join the game anymore, useful to block spectators from joining
 set teamplay_lockonrestart 0
 
-set g_maxplayers 0	"maximum number of players allowed to play at the same time, set to 0 to all players to join the game"
+set g_maxplayers 0	"maximum number of players allowed to play at the same time, set to 0 to allow all players to join the game"
 set g_maxplayers_spectator_blocktime 5	"if the players voted for the \"nospectators\" command, this setting defines the number of seconds a observer/spectator has time to join the game before he gets kicked"
 
 //tournament mod
@@ -272,6 +272,7 @@
 
 set g_allow_oldnexbeam 0 "If enabled, clients are allowed to use old v2.3 Nexgun beam"
 seta cl_particles_oldnexbeam 0 "Uses the old v2.3 Nexgun beam instead of the new beam, only works if server allows it (g_allow_oldnexbeam 1)"
+set sv_qcweaponanimation 0
 
 // use default physics
 exec physics25.cfg
@@ -738,6 +739,8 @@
 // startmap_dm is used when running with the -listen or -dedicated commandline options
 set serverconfig server.cfg
 alias startmap_dm "set _sv_init 0; map _init/_init; exec $serverconfig; set _sv_init 1; map _init/_init"
+alias sv_loadconfig "exec $serverconfig"
+alias sv_restart "say \"Server will restart at the end of the match, you will all be reconnected automatically. $* \"; quit_and_redirect self"
 
 // aliases:
 alias +attack2 +button3
@@ -1051,6 +1054,7 @@
 alias gametype	"sv_cmd gametype $*"
 
 alias addfav "qc_cmd addtolist net_slist_favorites $*"
+alias addvote "qc_cmd addvote sv_vote_commands $*"
 
 // key hunt
 set g_keyhunt 0
@@ -1281,26 +1285,6 @@
 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!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_seeker ""
-set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
-
 seta sv_status_privacy 1	"hide IP addresses from \"status\" replies shown to clients"
 
 seta cl_teamradar 1	"show radar in teammatches when available"

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

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

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

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

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

Modified: branches/nexuiz-2.0/data/maps/basement.map
===================================================================
--- branches/nexuiz-2.0/data/maps/basement.map	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/maps/basement.map	2009-03-16 09:12:13 UTC (rev 6191)
@@ -5,19 +5,19 @@
 "meesage" "Basement by Zombie"
 // brush 0
 {
-( -128 192 8 ) ( -128 136 8 ) ( -128 136 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( -128 192 8 ) ( -128 136 8 ) ( -128 136 0 ) evil2_basefloor/flr_tmtl_drk 0 16 0 0.5 0.5 0 0 0
 ( -112 192 8 ) ( -128 192 8 ) ( -128 192 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( -112 136 8 ) ( -112 192 8 ) ( -112 192 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( -112 -320 8 ) ( -96 -320 8 ) ( -96 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( -128 136 8 ) ( -128 192 8 ) ( -112 192 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( -128 136 8 ) ( -128 192 8 ) ( -112 192 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( -112 192 0 ) ( -128 192 0 ) ( -128 136 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 }
 // brush 1
 {
 ( 128 192 0 ) ( 112 192 0 ) ( 112 136 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 112 136 8 ) ( 112 192 8 ) ( 128 192 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 112 136 8 ) ( 112 192 8 ) ( 128 192 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( 128 -320 8 ) ( 144 -320 8 ) ( 144 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 128 136 8 ) ( 128 192 8 ) ( 128 192 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 128 136 8 ) ( 128 192 8 ) ( 128 192 0 ) evil2_basefloor/flr_tmtl_drk 0 16 0 0.5 0.5 0 0 0
 ( 128 192 8 ) ( 112 192 8 ) ( 112 192 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 112 192 8 ) ( 112 136 8 ) ( 112 136 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 }
@@ -27,7 +27,7 @@
 ( -88 192 8 ) ( -112 192 8 ) ( -112 192 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 112 168 8 ) ( 112 184 8 ) ( 112 184 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( -112 176 8 ) ( -88 176 8 ) ( -88 176 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( -112 176 8 ) ( -112 192 8 ) ( -88 192 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( -112 176 8 ) ( -112 192 8 ) ( -88 192 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( -88 192 0 ) ( -112 192 0 ) ( -112 176 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 }
 // brush 3
@@ -51,7 +51,7 @@
 // brush 5
 {
 ( 640 -336 0 ) ( 640 -320 0 ) ( 584 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 584 -320 8 ) ( 640 -320 8 ) ( 640 -336 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 584 -320 8 ) ( 640 -320 8 ) ( 640 -336 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( 128 -336 8 ) ( 128 -352 8 ) ( 128 -352 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 584 -336 8 ) ( 640 -336 8 ) ( 640 -336 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 640 -336 8 ) ( 640 -320 8 ) ( 640 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
@@ -61,7 +61,7 @@
 {
 ( 640 -560 8 ) ( 584 -560 8 ) ( 584 -560 0 ) evil2_basefloor/flr_tmtl_drk -128 0 0 0.5 0.5 0 0 0
 ( 640 -576 8 ) ( 640 -560 8 ) ( 640 -560 0 ) evil2_basefloor/flr_tmtl_drk -96 0 -180 0.5 -0.5 0 0 0
-( 584 -576 8 ) ( 640 -576 8 ) ( 640 -576 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 584 -576 8 ) ( 640 -576 8 ) ( 640 -576 0 ) evil2_basefloor/flr_tmtl_drk 142 128 -90 0.5 0.5 0 0 0
 ( 128 -576 8 ) ( 128 -592 8 ) ( 128 -592 0 ) evil2_basefloor/flr_tmtl_drk -96 0 -180 0.5 -0.5 0 0 0
 ( 584 -560 8 ) ( 640 -560 8 ) ( 640 -576 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 640 -576 0 ) ( 640 -560 0 ) ( 584 -560 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
@@ -69,7 +69,7 @@
 // brush 7
 {
 ( 640 -360 0 ) ( 640 -336 0 ) ( 624 -336 0 ) evil2_basefloor/flr_tmtl_drk 96 96 -90 0.5 0.5 0 0 0
-( 624 -336 8 ) ( 640 -336 8 ) ( 640 -360 8 ) evil2_basefloor/flr_tmtl_drk 96 96 -90 0.5 0.5 0 0 0
+( 624 -336 8 ) ( 640 -336 8 ) ( 640 -360 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( 624 -336 8 ) ( 624 -360 8 ) ( 624 -360 0 ) evil2_basefloor/flr_tmtl_drk 96 0 -180 0.5 -0.5 0 0 0
 ( 616 -560 8 ) ( 632 -560 8 ) ( 632 -560 0 ) evil2_basefloor/flr_tmtl_drk -96 0 0 0.5 0.5 0 0 0
 ( 640 -360 8 ) ( 640 -336 8 ) ( 640 -336 0 ) evil2_basefloor/flr_tmtl_drk 96 0 -180 0.5 -0.5 0 0 0
@@ -475,7 +475,7 @@
 {
 ( -128 192 0 ) ( -192 320 0 ) ( -128 192 8 ) evil2_basewall/mtl_gray 128 0 0 0.5 0.5 134217728 0 0
 ( -128 192 8 ) ( 128 192 8 ) ( 128 192 0 ) evil2_basewall/mtl_gray 128 0 -180 0.5 -0.5 134217728 0 0
-( 128 192 8 ) ( -128 192 8 ) ( -128 216 8 ) evil2_basefloor/flr_tmtl_drk 127 -128 90 0.5 0.5 134217728 0 0
+( 128 192 8 ) ( -128 192 8 ) ( -128 216 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 134217728 0 0
 ( -128 216 0 ) ( -128 192 0 ) ( 128 192 0 ) evil2_basewall/mtl_gray 127 -128 90 0.5 0.5 134217728 0 0
 ( 192 320 0 ) ( 128 192 0 ) ( 192 320 8 ) evil2_basewall/mtl_gray 128 0 0 0.5 0.5 134217728 0 0
 ( -128 224 0 ) ( 128 224 0 ) ( 128 224 8 ) evil2_basewall/mtl_gray 128 0 -180 0.5 -0.5 134217728 0 0
@@ -764,12 +764,12 @@
 }
 // brush 84
 {
-( 320 256 56 ) ( 320 -312 0 ) ( 512 256 56 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
-( 320 -320 8 ) ( 320 256 64 ) ( 512 -320 8 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
-( 336 -64 64 ) ( 336 -192 64 ) ( 336 -192 -128 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
-( 296 -304 64 ) ( 488 -304 64 ) ( 488 -304 -128 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
-( 496 -200 64 ) ( 496 -72 64 ) ( 496 -72 -128 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
-( 472 240 64 ) ( 280 240 64 ) ( 280 240 -128 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 496 240 56 ) ( 336 -304 0 ) ( 496 -304 0 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 496 240 64 ) ( 496 -304 8 ) ( 336 -304 8 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 336 -304 8 ) ( 336 -304 0 ) ( 336 240 64 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 336 -304 8 ) ( 496 -304 0 ) ( 336 -304 0 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 496 240 64 ) ( 496 -304 0 ) ( 496 -304 8 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
+( 496 240 64 ) ( 336 240 55.875 ) ( 496 240 55.875 ) evil2_basefloor/flr_cemtilesmll_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 85
 {
@@ -2100,35 +2100,35 @@
 ( 496 -304 8 ) ( 336 -304 8 ) ( 336 -304 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 512 -320 8 ) ( 512 -304 8 ) ( 512 -304 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
 ( 336 -320 8 ) ( 496 -320 8 ) ( 496 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 336 -320 8 ) ( 336 -304 8 ) ( 496 -304 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 496 -304 0 ) ( 336 -304 0 ) ( 336 -320 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 336 -320 8 ) ( 336 -304 8 ) ( 496 -304 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 496 -304 0 ) ( 336 -304 0 ) ( 336 -320 0 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 232
 {
-( 496 256 56 ) ( 336 256 56 ) ( 336 240 56 ) evil2_basefloor/flr_tmtl_drk 0 128 -90 0.5 0.5 0 0 0
-( 336 240 64 ) ( 336 256 64 ) ( 496 256 64 ) evil2_basefloor/flr_tmtl_drk 0 128 -90 0.5 0.5 0 0 0
-( 336 240 64 ) ( 496 240 64 ) ( 496 240 56 ) evil2_basefloor/flr_tmtl_drk 16 128 -90 0.5 0.5 0 0 0
+( 496 256 56 ) ( 336 256 56 ) ( 336 240 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 336 240 64 ) ( 336 256 64 ) ( 496 256 64 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 336 240 64 ) ( 496 240 64 ) ( 496 240 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( 768 232 64 ) ( 768 248 64 ) ( 768 248 56 ) evil2_basefloor/flr_tmtl_drk 16 -32 -90 0.5 0.5 0 0 0
 ( 496 256 64 ) ( 336 256 64 ) ( 336 256 56 ) evil2_basefloor/flr_tmtl_drk 16 128 -90 0.5 0.5 0 0 0
 ( 320 256 64 ) ( 320 240 64 ) ( 320 240 56 ) evil2_basefloor/flr_tmtl_drk 16 -32 -90 0.5 0.5 0 0 0
 }
 // brush 233
 {
-( 488 240 64 ) ( 296 240 64 ) ( 296 240 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 512 -200 64 ) ( 512 -72 64 ) ( 512 -72 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 312 -304 64 ) ( 504 -304 64 ) ( 504 -304 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 496 -80 64 ) ( 496 -208 64 ) ( 496 -208 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 336 -320 8 ) ( 336 256 64 ) ( 528 -320 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 336 256 56 ) ( 336 -312 0 ) ( 528 256 56 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 512 240 64 ) ( 496 240 55.875 ) ( 512 240 55.875 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 512 240 64 ) ( 512 -304 0 ) ( 512 -304 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 496 -304 8 ) ( 512 -304 0 ) ( 496 -304 0 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 496 -304 8 ) ( 496 -304 0 ) ( 496 240 64 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 512 240 64 ) ( 512 -304 8 ) ( 496 -304 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 512 240 56 ) ( 496 -304 0 ) ( 512 -304 0 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 234
 {
-( 160 256 56 ) ( 160 -312 0 ) ( 352 256 56 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
-( 160 -320 8 ) ( 160 256 64 ) ( 352 -320 8 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
-( 320 -80 64 ) ( 320 -208 64 ) ( 320 -208 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 136 -304 64 ) ( 328 -304 64 ) ( 328 -304 -128 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
-( 336 -200 64 ) ( 336 -72 64 ) ( 336 -72 -128 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
-( 312 240 64 ) ( 120 240 64 ) ( 120 240 -128 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
+( 336 240 56 ) ( 320 -304 0 ) ( 336 -304 0 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 336 240 64 ) ( 336 -304 8 ) ( 320 -304 8 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 320 -304 8 ) ( 320 -304 0 ) ( 320 240 64 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 320 -304 8 ) ( 336 -304 0 ) ( 320 -304 0 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
+( 336 240 64 ) ( 336 -304 0 ) ( 336 -304 8 ) evil2_basefloor/flr_tmtl_drk -96 128 -90 0.5 0.5 0 0 0
+( 336 240 64 ) ( 320 240 55.875 ) ( 336 240 55.875 ) evil2_basefloor/flr_tmtl_drk -96 -224 -90 0.5 0.5 0 0 0
 }
 // brush 235
 {
@@ -2136,17 +2136,17 @@
 ( 496 432 64 ) ( 336 432 64 ) ( 336 432 56 ) evil2_basefloor/flr_tmtl_drk 16 128 -90 0.5 0.5 0 0 0
 ( 768 408 64 ) ( 768 424 64 ) ( 768 424 56 ) evil2_basefloor/flr_tmtl_drk 16 64 -90 0.5 0.5 0 0 0
 ( 336 416 64 ) ( 496 416 64 ) ( 496 416 56 ) evil2_basefloor/flr_tmtl_drk 16 128 -90 0.5 0.5 0 0 0
-( 336 416 64 ) ( 336 432 64 ) ( 496 432 64 ) evil2_basefloor/flr_tmtl_drk 96 128 -90 0.5 0.5 0 0 0
-( 496 432 56 ) ( 336 432 56 ) ( 336 416 56 ) evil2_basefloor/flr_tmtl_drk 96 128 -90 0.5 0.5 0 0 0
+( 336 416 64 ) ( 336 432 64 ) ( 496 432 64 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 496 432 56 ) ( 336 432 56 ) ( 336 416 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 236
 {
-( 336 432 56 ) ( 320 432 56 ) ( 320 400 56 ) evil2_basefloor/flr_tmtl_drk 0 160 -90 0.5 0.5 0 0 0
-( 320 400 64 ) ( 320 432 64 ) ( 336 432 64 ) evil2_basefloor/flr_tmtl_drk 0 160 -90 0.5 0.5 0 0 0
+( 336 432 56 ) ( 320 432 56 ) ( 320 400 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 320 400 64 ) ( 320 432 64 ) ( 336 432 64 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 ( 320 256 64 ) ( 336 256 64 ) ( 336 256 56 ) evil2_basefloor/flr_tmtl_drk 0 160 -90 0.5 0.5 0 0 0
 ( 336 384 64 ) ( 336 416 64 ) ( 336 416 56 ) evil2_basefloor/flr_tmtl_drk 0 128 -90 0.5 0.5 0 0 0
 ( 336 416 64 ) ( 320 416 64 ) ( 320 416 56 ) evil2_basefloor/flr_tmtl_drk 0 160 -90 0.5 0.5 0 0 0
-( 320 432 64 ) ( 320 400 64 ) ( 320 400 56 ) evil2_basefloor/flr_tmtl_drk 0 128 -90 0.5 0.5 0 0 0
+( 320 432 64 ) ( 320 400 64 ) ( 320 400 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 237
 {
@@ -2154,8 +2154,8 @@
 ( 768 416 64 ) ( 752 416 64 ) ( 752 416 56 ) evil2_basefloor/flr_tmtl_drk 0 0 -90 0.5 0.5 0 0 0
 ( 768 384 64 ) ( 768 416 64 ) ( 768 416 56 ) evil2_basefloor/flr_tmtl_drk 0 128 -90 0.5 0.5 0 0 0
 ( 752 256 64 ) ( 768 256 64 ) ( 768 256 56 ) evil2_basefloor/flr_tmtl_drk 0 0 -90 0.5 0.5 0 0 0
-( 752 400 64 ) ( 752 432 64 ) ( 768 432 64 ) evil2_basefloor/flr_tmtl_drk 0 0 -90 0.5 0.5 0 0 0
-( 768 432 56 ) ( 752 432 56 ) ( 752 400 56 ) evil2_basefloor/flr_tmtl_drk 0 0 -90 0.5 0.5 0 0 0
+( 752 400 64 ) ( 752 432 64 ) ( 768 432 64 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
+( 768 432 56 ) ( 752 432 56 ) ( 752 400 56 ) evil2_basefloor/flr_tmtl_drk 0 0 0 0.5 0.5 0 0 0
 }
 // brush 238
 {
@@ -6062,7 +6062,7 @@
 ( 216 576 -136 ) ( -528 576 -136 ) ( -528 -192 -136 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
 ( 1024 128 64 ) ( 1152 128 64 ) ( 1152 128 56 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
 ( 1152 256 64 ) ( 1024 256 64 ) ( 1024 256 56 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
-( -448 -192 -128 ) ( -448 320 -128 ) ( -448 -192 -136 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
+( -448 -192 -128 ) ( -448 320 -128 ) ( -448 -192 -136 ) evil6_trims/e6boltstrip 160 -208 0 0.5 0.5 0 0 0
 }
 // brush 672
 {
@@ -6098,7 +6098,7 @@
 ( 216 576 -136 ) ( -528 576 -136 ) ( -528 -192 -136 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
 ( 1024 256 64 ) ( 1152 256 64 ) ( 1024 256 56 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
 ( -256 320 -128 ) ( -448 320 -128 ) ( -448 320 -136 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
-( -448 -192 -128 ) ( -448 320 -128 ) ( -448 -192 -136 ) evil2_basewall/mtl_gray 160 -208 0 0.5 0.5 0 0 0
+( -448 -192 -128 ) ( -448 320 -128 ) ( -448 -192 -136 ) evil6_trims/e6boltstrip 160 -208 0 0.5 0.5 0 0 0
 }
 // brush 676
 {
@@ -6106,7 +6106,7 @@
 ( 1152 -144 -136 ) ( 1152 48 -136 ) ( 1152 48 -144 ) evil6_trims/e6basegrate 0 -15 -180 0.5 -0.5 0 0 0
 ( -256 -128 -136 ) ( 256 -128 -136 ) ( 256 -128 -144 ) evil6_trims/e6basegrate -128 -16 0 0.5 0.5 0 0 0
 ( -256 64 -136 ) ( -256 -128 -136 ) ( -256 -128 -144 ) evil6_trims/e6basegrate 0 -15 -180 0.5 -0.5 0 0 0
-( -248 64 -136 ) ( 264 64 -136 ) ( 264 -128 -136 ) evil2_basefloor/flr_cemtilesmll_drk 0 128 -90 0.5 0.5 0 0 0
+( -248 64 -136 ) ( 264 64 -136 ) ( 264 -128 -136 ) evil2_basefloor/flr_cemtilesmll_drk 0 128 0 0.5 0.5 0 0 0
 ( 256 -128 -144 ) ( 256 64 -144 ) ( -256 64 -144 ) evil6_trims/e6basegrate 0 0 -90 0.5 0.5 0 0 0
 }
 // brush 677

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

Deleted: branches/nexuiz-2.0/data/models/weapons/g_flamethrower.md3
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/g_hlacmod.md3
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm (from rev 6158, trunk/data/models/weapons/h_campingrifle.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm.animinfo (from rev 6158, trunk/data/models/weapons/h_campingrifle.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_campingrifle.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm (from rev 6158, trunk/data/models/weapons/h_crylink.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm.animinfo (from rev 6158, trunk/data/models/weapons/h_crylink.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_crylink.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_electro.dpm (from rev 6158, trunk/data/models/weapons/h_electro.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_electro.dpm.animinfo (from rev 6158, trunk/data/models/weapons/h_electro.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_electro.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_electro.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_gl.dpm (from rev 6158, trunk/data/models/weapons/h_gl.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_gl.dpm.animinfo (from rev 6158, trunk/data/models/weapons/h_gl.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_gl.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_gl.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm (from rev 6158, trunk/data/models/weapons/h_hagar.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm.animinfo (from rev 6158, trunk/data/models/weapons/h_hagar.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_hagar.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm (from rev 6160, trunk/data/models/weapons/h_hlac.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm.animinfo (from rev 6160, trunk/data/models/weapons/h_hlac.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_hlac.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm (from rev 6169, trunk/data/models/weapons/h_hookgun.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_hookgun.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_hookgun.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_laser.dpm (from rev 6169, trunk/data/models/weapons/h_laser.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_laser.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_laser.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_laser.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_laser.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm (from rev 6169, trunk/data/models/weapons/h_minstanex.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_minstanex.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_minstanex.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_nex.dpm (from rev 6169, trunk/data/models/weapons/h_nex.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_nex.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_nex.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_nex.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_nex.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_porto.dpm (from rev 6169, trunk/data/models/weapons/h_porto.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_porto.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_porto.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_porto.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_porto.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_rl.dpm (from rev 6169, trunk/data/models/weapons/h_rl.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_rl.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_rl.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_rl.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_rl.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm (from rev 6169, trunk/data/models/weapons/h_seeker.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_seeker.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_seeker.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm (from rev 6169, trunk/data/models/weapons/h_shotgun.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_shotgun.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_shotgun.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm (from rev 6169, trunk/data/models/weapons/h_uzi.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm.animinfo (from rev 6169, trunk/data/models/weapons/h_uzi.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/h_uzi.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 8 20 // fire
+9 5 20 // fire2
+15 200 20 // idle
+215 40 20 // reload

Deleted: branches/nexuiz-2.0/data/models/weapons/v_flamethrower.md3
===================================================================
(Binary files differ)

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

Deleted: branches/nexuiz-2.0/data/models/weapons/v_hlacmod.md3
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_campingrifle.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_flamethrower.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_hlac.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_hlacmod.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_hookgun.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_minstanex.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_porto.zym
===================================================================
(Binary files differ)

Deleted: branches/nexuiz-2.0/data/models/weapons/w_seeker.zym
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm (from rev 6106, trunk/data/models/weapons/w_uzi.dpm)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm.animinfo (from rev 6106, trunk/data/models/weapons/w_uzi.dpm.animinfo)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm.animinfo	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/w_uzi.dpm.animinfo	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,4 @@
+1 12 40 // fire1
+13 12 40 // fire2
+25 48 10 // idle
+0 1 10 // reload

Copied: branches/nexuiz-2.0/data/models/weapons/w_uzi.qh (from rev 6106, trunk/data/models/weapons/w_uzi.qh)
===================================================================
--- branches/nexuiz-2.0/data/models/weapons/w_uzi.qh	                        (rev 0)
+++ branches/nexuiz-2.0/data/models/weapons/w_uzi.qh	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,12 @@
+
+/*
+Generated header file for w_uzi
+This file contains animation definitions for use in code referencing the model, simply add this file to your progs.src before use.
+*/
+
+vector anim_w_uzi_ref1 = '0 1 20';
+vector anim_w_uzi_fire = '1 12 40';
+vector anim_w_uzi_fire2 = '13 12 40';
+vector anim_w_uzi_idle = '25 48 20';
+
+// end of animation definitions for w_uzi

Modified: branches/nexuiz-2.0/data/nexuiz-credits.txt
===================================================================
--- branches/nexuiz-2.0/data/nexuiz-credits.txt	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/nexuiz-credits.txt	2009-03-16 09:12:13 UTC (rev 6191)
@@ -93,6 +93,7 @@
 Severin "sev" Meyer - Artist
 Simon O'Callaghan - "egyptsoc" texture set
 Robert "ai" Kuroto - Various models
+Alexander "motorsep" Zubov - Weapon animation
 
 Qantourisc
 Tymo

Modified: branches/nexuiz-2.0/data/physicsHavoc.cfg
===================================================================
--- branches/nexuiz-2.0/data/physicsHavoc.cfg	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/physicsHavoc.cfg	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,12 +1,11 @@
-// these values match Quake3
-sv_maxspeed 320
-sv_maxairspeed $sv_maxspeed
-sv_accelerate 10
-sv_airaccelerate 1
-sv_friction 6
+sv_maxspeed 400
+sv_maxairspeed 220
+sv_accelerate 8
+sv_airaccelerate 5.5
+sv_friction 7
 edgefriction 1
-sv_stepheight 34 // this is for Nexuiz maps, Quake3 used 18
-set sv_jumpvelocity 270
+sv_stepheight 34
+set sv_jumpvelocity 300
 set sv_friction_on_land 0
-set sv_airaccel_sideways_friction 0
-set sv_airaccel_qw 1
+set sv_airaccel_sideways_friction 0.65
+set sv_airaccel_qw 0.95

Modified: branches/nexuiz-2.0/data/qcsrc/client/View.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -204,7 +204,6 @@
 	entity e;
 	float fov;
 	float f;
-	vector v1, v2;
 
 	dprint_load();
 	WaypointSprite_Load();
@@ -223,24 +222,18 @@
 		view_set = 1;
 	}
 
-	f = floor(cvar("v_flipped"));
-	cvar_set("v_flipped", ftos(!f));
-	v1 = cs_unproject('-100 -100 1000');
-	cvar_set("v_flipped", ftos(f));
-	v2 = cs_unproject('-100 -100 1000');
-
-	if(v1 == v2)
+	if(csqc_flags & CSQC_FLAG_COLORCODES)
 	{
-		// non-supporting engine
-		vid_width = cvar("vid_width");
-		vid_height = cvar("vid_height");
-	}
-	else
-	{
 		// supporting engine
 		vid_width = w;
 		vid_height = h;
 	}
+	else
+	{
+		// non-supporting engine
+		vid_width = cvar("vid_width");
+		vid_height = cvar("vid_height");
+	}
 
 #ifdef BLURTEST
 	if(time > blurtest_time0 && time < blurtest_time1)

Modified: branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -210,11 +210,12 @@
 	return trace_fraction;
 }
 
+#define MAX_CLIP_PLANES 32
 void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
 {
 	if(self.move_flags & FL_ONGROUND)
 	{
-		if(self.velocity_z >= 1/32)
+		if(self.move_velocity_z >= 1/32)
 			self.move_flags &~= FL_ONGROUND;
 		else if(!self.move_groundentity)
 			return;
@@ -240,23 +241,29 @@
 
 	self.move_angles = self.move_angles + self.move_avelocity * dt;
 
-	vector move;
-	move = self.move_velocity * dt;
-
-	_Movetype_PushEntity(move, TRUE);
-	if(wasfreed(self))
-		return;
-	
-	if(trace_startsolid)
+	float movetime, bump;
+	movetime = dt;
+	for(bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump)
 	{
-		_Movetype_UnstickEntity();
-		_Movetype_PushEntity(move, FALSE);
+		vector move;
+		move = self.move_velocity * movetime;
+		_Movetype_PushEntity(move, TRUE);
 		if(wasfreed(self))
 			return;
-	}
+	
+		if(trace_startsolid)
+		{
+			_Movetype_UnstickEntity();
+			_Movetype_PushEntity(move, FALSE);
+			if(wasfreed(self))
+				return;
+		}
 
-	if(trace_fraction < 1)
-	{
+		if(trace_fraction == 1)
+			break;
+
+		movetime *= 1 - min(1, trace_fraction);
+
 		if(self.move_movetype == MOVETYPE_BOUNCEMISSILE)
 		{
 			self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 2.0);
@@ -267,7 +274,11 @@
 			float d, bouncefac, bouncestop;
 
 			bouncefac = self.move_bounce_factor;     if(!bouncefac)  bouncefac = 0.5;
-			bouncestop = self.move_bounce_stopspeed; if(!bouncestop) bouncestop = 60;
+			bouncestop = self.move_bounce_stopspeed; if(!bouncestop) bouncestop = 60 / 800;
+			if(self.gravity)
+				bouncestop *= self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+			else
+				bouncestop *= getstatf(STAT_MOVEVARS_GRAVITY);
 
 			self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1 + bouncefac);
 

Modified: branches/nexuiz-2.0/data/qcsrc/common/items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/items.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/common/items.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -110,9 +110,9 @@
 	register_weapon(WEP_PORTO,            w_porto,        0,          0, 0, 0, 0,                      "porto" ,       "porto",           "Port-O-Launch");
 	register_weapon(WEP_MINSTANEX,        w_minstanex,    IT_CELLS,   7, 0, 1, BOT_PICKUP_RATING_HIGH, "minstanex",    "minstanex",       "MinstaNex");
 	register_weapon(WEP_HOOK,             w_hook,         IT_CELLS,   0, 0, 1, 0,                      "hookgun",      "hook",            "Grappling Hook");
-	register_weapon(WEP_SEEKER,           w_seeker,       IT_ROCKETS, 8, 1, 0, BOT_PICKUP_RATING_HIGH, "seeker",       "seeker",          "T.A.G. Seeker");
+	register_weapon(WEP_SEEKER,           w_seeker,       IT_ROCKETS, 8, 0, 0, BOT_PICKUP_RATING_HIGH, "seeker",       "seeker",          "T.A.G. Seeker");
 	register_weapon(WEP_HLAC,             w_hlac,         IT_CELLS,   6, 1, 0, BOT_PICKUP_RATING_MID,  "hlac",         "hlac",            "Heavy Laser Assault Cannon");
-	register_weapon(WEP_CAMPINGRIFLE,     w_campingrifle, IT_NAILS,   3, 1, 0, BOT_PICKUP_RATING_MID,  "campingrifle", "campingrifle",    "Camping Rifle");
+	register_weapon(WEP_CAMPINGRIFLE,     w_campingrifle, IT_NAILS,   3, 1, 0, BOT_PICKUP_RATING_MID,  "campingrifle", "campingrifle",    "Rifle");
 
 	register_weapons_done();
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/classes.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/menu/classes.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -23,6 +23,7 @@
 #include "nexuiz/bigbutton.c"
 #include "nexuiz/commandbutton.c"
 #include "nexuiz/bigcommandbutton.c"
+#include "nexuiz/modbutton.c"
 #include "nexuiz/dialog_teamselect.c"
 #include "nexuiz/dialog_settings.c"
 #include "nexuiz/dialog_settings_video.c"

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -162,7 +162,8 @@
 			e0.allowCut = 1;
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, e = makeNexuizButton("Start Multiplayer!", '0 0 0'));
+		me.TD(me, 1, 2, e = makeNexuizModButton());
+		me.TD(me, 1, me.columns - 2, e = makeNexuizButton("Start Multiplayer!", '0 0 0'));
 			e.onClick = MapList_LoadMap;
 			e.onClickEntity = me.mapListBox;
 			me.mapListBox.startButton = e;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -228,7 +228,7 @@
 		me.TD(me, 1, 3.8, e = makeNexuizCheckBox(0, "g_nixnex_with_laser", "with laser"));
 			setDependent(e, "g_nixnex", 1, 1);
 	me.TR(me);
-		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, "g_weaponarena", "all", "All weapons"));
+		me.TD(me, 1, 4, e = makeNexuizRadioButton(1, "g_weaponarena", "most", "Most weapons"));
 			e.cvarOffValue = "0";
 
 	me.gotoRC(me, me.rows - 1, 0);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_join.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -50,23 +50,25 @@
 		me.TD(me, 1, 1, slist.sortButton4 = makeNexuizButton(string_null, '0 0 0'));
 		me.TD(me, 1, 1, slist.sortButton5 = makeNexuizButton(string_null, '0 0 0'));
 	me.TR(me);
-		me.TD(me, me.rows - 3, me.columns, slist);
+		me.TD(me, me.rows - 4, me.columns, slist);
 
-	me.gotoRC(me, me.rows - 1, 0);
+	me.gotoRC(me, me.rows - 2, 0);
 		me.TD(me, 1, 0.6, e = makeNexuizTextLabel(0, "Address:"));
-		me.TD(me, 1, 1.5, e = makeNexuizInputBox(0, string_null));
+		me.TD(me, 1, 2.9, e = makeNexuizInputBox(0, string_null));
 			e.onEnter = ServerList_Connect_Click;
 			e.onEnterEntity = slist;
 			slist.ipAddressBox = e;
-		me.TD(me, 1, 1, e = makeNexuizButton("", '0 0 0'));
+		me.TD(me, 1, 1.5, e = makeNexuizButton("", '0 0 0'));
 			e.onClick = ServerList_Favorite_Click;
 			e.onClickEntity = slist;
 			slist.favoriteButton = e;
-		me.TD(me, 1, 1, e = makeNexuizButton("Info", '0 0 0'));
+		me.TD(me, 1, 1.5, e = makeNexuizButton("Info", '0 0 0'));
 			e.onClick = ServerList_Info_Click;
 			e.onClickEntity = slist;
 			slist.infoButton = e;
-		me.TD(me, 1, me.columns - 0.6 - 1.5 - 1 - 1, e = makeNexuizButton("Join!", '0 0 0'));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizModButton());
+		me.TD(me, 1, me.columns - 2, e = makeNexuizButton("Join!", '0 0 0'));
 			e.onClick = ServerList_Connect_Click;
 			e.onClickEntity = slist;
 			slist.connectButton = e;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_singleplayer.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -76,7 +76,8 @@
 			me.campaignBox.campaignGo(me.campaignBox, 0);
 
 	me.gotoRC(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, e = makeNexuizButton("Start Singleplayer!", '0 0 0'));
+		me.TD(me, 1, 2, e = makeNexuizModButton());
+		me.TD(me, 1, me.columns - 2 , e = makeNexuizButton("Start Singleplayer!", '0 0 0'));
 			e.onClick = CampaignList_LoadMap;
 			e.onClickEntity = me.campaignBox;
 }

Copied: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/modbutton.c (from rev 6106, trunk/data/qcsrc/menu/nexuiz/modbutton.c)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/modbutton.c	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/modbutton.c	2009-03-16 09:12:13 UTC (rev 6191)
@@ -0,0 +1,37 @@
+#ifdef INTERFACE
+CLASS(NexuizModButton) EXTENDS(NexuizButton)
+	METHOD(NexuizModButton, configureNexuizModButton, void(entity))
+ENDCLASS(NexuizModButton)
+entity makeNexuizModButton();
+void NexuizModButton_Click(entity me, entity other);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizModButton()
+{
+	entity me;
+	me = spawnNexuizModButton();
+	me.configureNexuizModButton(me);
+	return me;
+}
+
+void NexuizModButton_Click(entity me, entity other)
+{
+	if (cvar_string("menu_slist_modfilter") == "havoc")
+		cmd("gamedir data; menu_restart");
+	else
+		cmd("gamedir havoc; menu_restart");
+}
+
+void configureNexuizModButtonNexuizModButton(entity me)
+{
+	me.configureNexuizButton(me, "", '0 0 0');
+	me.onClick = NexuizModButton_Click;
+	me.onClickEntity = me;
+
+	if (cvar_string("menu_slist_modfilter") == "havoc")
+		me.text = "Switch to Nexuiz mode";
+	else
+		me.text = "Switch to Havoc mode";
+}
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -556,6 +556,7 @@
 	self.weapon = 0;
 	self.weaponmodel = "";
 	self.weaponentity = world;
+	self.exteriorweaponentity = world;
 	self.killcount = -666;
 	self.velocity = '0 0 0';
 	self.avelocity = '0 0 0';
@@ -2185,7 +2186,8 @@
 		if (self.deadflag != DEAD_NO)
 		{
 			float button_pressed, force_respawn;
-			player_anim();
+			if(frametime)
+				player_anim();
 			button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE);
 			force_respawn = (g_lms || cvar("g_forced_respawn"));
 			if (self.deadflag == DEAD_DYING)
@@ -2274,7 +2276,7 @@
 				self.crouch = TRUE;
 				self.view_ofs = PL_CROUCH_VIEW_OFS;
 				setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX);
-				player_setanim(self.anim_duck, FALSE, TRUE, TRUE);
+				setanim(self, self.anim_duck, FALSE, TRUE, TRUE);
 			}
 		}
 		else
@@ -2304,11 +2306,13 @@
 
 		GrapplingHookFrame();
 
-		W_WeaponFrame();
+		if(frametime)
+			W_WeaponFrame();
 
 		player_powerups();
 		player_regen();
-		player_anim();
+		if(frametime)
+			player_anim();
 
 		if (g_minstagib)
 			minstagib_ammocheck();

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -83,9 +83,9 @@
 	self.flags &~= FL_JUMPRELEASED;
 
 	if (self.crouch)
-		player_setanim(self.anim_duckjump, FALSE, TRUE, TRUE);
+		setanim(self, self.anim_duckjump, FALSE, TRUE, TRUE);
 	else
-		player_setanim(self.anim_jump, FALSE, TRUE, TRUE);
+		setanim(self, self.anim_jump, FALSE, TRUE, TRUE);
 
 	if(g_jump_grunt)
 		PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -65,30 +65,6 @@
 	self = oldself;
 }
 
-float animparseerror;
-vector animparseline(float animfile)
-{
-	local string line;
-	local float c;
-	local vector anim;
-	if (animfile < 0)
-		return '0 1 2';
-	line = fgets(animfile);
-	c = tokenize_sane(line);
-	if (c != 3)
-	{
-		animparseerror = TRUE;
-		return '0 1 2';
-	}
-	anim_x = stof(argv(0));
-	anim_y = stof(argv(1));
-	anim_z = stof(argv(2));
-	// don't allow completely bogus values
-	if (anim_x < 0 || anim_y < 1 || anim_z < 0.001)
-		anim = '0 1 2';
-	return anim;
-};
-
 void player_setupanimsformodel()
 {
 	local string animfilename;
@@ -155,43 +131,14 @@
 	else
 		dprint("File ", animfilename, " not found, assuming legacy .zym model animation timings\n");
 	// reset animstate now
-	player_setanim(self.anim_idle, TRUE, FALSE, TRUE);
+	setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
 };
 
-void player_setanim(vector anim, float looping, float override, float restart)
-{
-	if (!restart)
-	if (anim_x == self.animstate_startframe)
-	if (anim_y == self.animstate_numframes)
-	if (anim_z == self.animstate_framerate)
-		return;
-	self.animstate_startframe = anim_x;
-	self.animstate_numframes = anim_y;
-	self.animstate_framerate = anim_z;
-	self.animstate_starttime = time;
-	self.animstate_endtime = time + self.animstate_numframes / self.animstate_framerate;
-	self.animstate_looping = looping;
-	self.animstate_override = override;
-	self.frame = self.animstate_startframe;
-};
-
-void player_updateframe()
-{
-	if (time >= self.animstate_endtime)
-	{
-		if (self.animstate_looping)
-		{
-			self.animstate_starttime = self.animstate_endtime;
-			self.animstate_endtime = self.animstate_endtime + self.animstate_numframes / self.animstate_framerate;
-		}
-		self.animstate_override = FALSE;
-	}
-	self.frame = self.animstate_startframe + bound(0, (time - self.animstate_starttime) * self.animstate_framerate, self.animstate_numframes - 1);
-};
-
 void player_anim (void)
 {
-	player_updateframe();
+	updateanim(self);
+	if (self.weaponentity)
+		updateanim(self.weaponentity);
 
 	if (self.deadflag != DEAD_NO)
 	{
@@ -212,43 +159,46 @@
 		if (!(self.flags & FL_ONGROUND))
 		{
 			if (self.crouch)
-				player_setanim(self.anim_duckjump, FALSE, TRUE, FALSE);
+				setanim(self, self.anim_duckjump, FALSE, TRUE, FALSE);
 			else
-				player_setanim(self.anim_jump, FALSE, TRUE, FALSE);
+				setanim(self, self.anim_jump, FALSE, TRUE, FALSE);
 		}
 		else if (self.crouch)
 		{
 			if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
-				player_setanim(self.anim_duckwalk, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_duckwalk, TRUE, FALSE, FALSE);
 			else
-				player_setanim(self.anim_duckidle, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_duckidle, TRUE, FALSE, FALSE);
 		}
 		else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
 		{
 			if (self.movement_x > 0 && self.movement_y == 0)
-				player_setanim(self.anim_run, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_run, TRUE, FALSE, FALSE);
 			else if (self.movement_x < 0 && self.movement_y == 0)
-				player_setanim(self.anim_runbackwards, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_runbackwards, TRUE, FALSE, FALSE);
 			else if (self.movement_x == 0 && self.movement_y > 0)
-				player_setanim(self.anim_straferight, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_straferight, TRUE, FALSE, FALSE);
 			else if (self.movement_x == 0 && self.movement_y < 0)
-				player_setanim(self.anim_strafeleft, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_strafeleft, TRUE, FALSE, FALSE);
 			else if (self.movement_x > 0 && self.movement_y > 0)
-				player_setanim(self.anim_forwardright, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_forwardright, TRUE, FALSE, FALSE);
 			else if (self.movement_x > 0 && self.movement_y < 0)
-				player_setanim(self.anim_forwardleft, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_forwardleft, TRUE, FALSE, FALSE);
 			else if (self.movement_x < 0 && self.movement_y > 0)
-				player_setanim(self.anim_backright, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_backright, TRUE, FALSE, FALSE);
 			else if (self.movement_x < 0 && self.movement_y < 0)
-				player_setanim(self.anim_backleft, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_backleft, TRUE, FALSE, FALSE);
 			else
-				player_setanim(self.anim_run, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_run, TRUE, FALSE, FALSE);
 		}
 		else
-			player_setanim(self.anim_idle, TRUE, FALSE, FALSE);
+			setanim(self, self.anim_idle, TRUE, FALSE, FALSE);
 	}
+
+	if (self.weaponentity)
+	if (!self.weaponentity.animstate_override)
+		setanim(self.weaponentity, self.weaponentity.anim_idle, TRUE, FALSE, FALSE);
 }
-//End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
 
 void SpawnThrownWeapon (vector org, float w)
 {
@@ -371,9 +321,9 @@
 
 				if(sv_gentle < 1) {		
 					if (random() > 0.5)
-						player_setanim(self.anim_pain1, FALSE, TRUE, TRUE);
+						setanim(self, self.anim_pain1, FALSE, TRUE, TRUE);
 					else
-						player_setanim(self.anim_pain2, FALSE, TRUE, TRUE);
+						setanim(self, self.anim_pain2, FALSE, TRUE, TRUE);
 
 					if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1)
 					// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
@@ -520,12 +470,12 @@
 			self.respawn_countdown = -1; // do not count down
 		if (random() < 0.5)
 		{
-			player_setanim(self.anim_die1, FALSE, TRUE, TRUE);
+			setanim(self, self.anim_die1, FALSE, TRUE, TRUE);
 			self.dead_frame = self.anim_dead1_x;
 		}
 		else
 		{
-			player_setanim(self.anim_die2, FALSE, TRUE, TRUE);
+			setanim(self, self.anim_die2, FALSE, TRUE, TRUE);
 			self.dead_frame = self.anim_dead2_x;
 		}
 		// set damage function to corpse damage

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -307,7 +307,7 @@
 	{
 		if (self.weaponentity.state == WS_CLEAR)
 		{
-			player_setanim(self.anim_draw, FALSE, TRUE, TRUE);
+			setanim(self, self.anim_draw, FALSE, TRUE, TRUE);
 			self.weaponentity.state = WS_RAISE;
 			weapon_action(self.switchweapon, WR_SETUP);
 			// VorteX: add player model weapon select frame here
@@ -325,7 +325,7 @@
 			sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
 			self.weaponentity.state = WS_DROP;
 			// set up weapon switch think in the future, and start drop anim
-			weapon_thinkf(WFRAME_IDLE, cvar("g_balance_weaponswitchdelay"), w_clear);
+			weapon_thinkf(WFRAME_DONTCHANGE, cvar("g_balance_weaponswitchdelay"), w_clear);
 			weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);
 #ifndef INDEPENDENT_ATTACK_FINISHED
 			}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -16,10 +16,12 @@
 .float antilag_debug;
 
 // VorteX: static frame globals
+float WFRAME_DONTCHANGE = -1;
 float WFRAME_FIRE1 = 0;
 float WFRAME_FIRE2 = 1;
 float WFRAME_IDLE = 2;
 float WFRAME_RELOAD = 3;
+.float wframe;
 
 void(float fr, float t, void() func) weapon_thinkf;
 
@@ -29,25 +31,30 @@
 // this function calculates w_shotorg and w_shotdir based on the weapon model
 // offset, trueaim and antilag, and won't put w_shotorg inside a wall.
 // make sure you call makevectors first (FIXME?)
-void W_SetupShot(entity ent, vector vecs, float antilag, float recoil, string snd)
+void W_SetupShot(entity ent, float antilag, float recoil, string snd)
 {
 	float nudge = 1; // added to traceline target and subtracted from result
 	local vector trueaimpoint;
 	local float oldsolid;
+	vector vecs;
 	oldsolid = self.dphitcontentsmask;
 	self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 	traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * MAX_SHOT_DISTANCE, MOVE_NOMONSTERS, self);
 	trueaimpoint = trace_endpos;
 
+	if(ent.weaponentity.movedir_x > 0)
+	{
+		vecs = ent.weaponentity.movedir;
+		vecs_y = -vecs_y;
+	}
+	else
+		vecs = '0 0 0';
+
 	if(debug_shotorg != '0 0 0')
 		vecs = debug_shotorg;
+	
+	w_shotorg = ent.origin + ent.view_ofs + v_right * vecs_y + v_up * vecs_z;
 
-	if (cvar("g_shootfromeye"))
-		w_shotorg = ent.origin + ent.view_ofs;
-	else if (cvar("g_shootfromcenter"))
-		w_shotorg = ent.origin + ent.view_ofs + '0 0 1' * vecs_z;
-	else
-		w_shotorg = ent.origin + ent.view_ofs + v_right * vecs_y + v_up * vecs_z;
 	// now move the shotorg forward as much as requested if possible
 	traceline(w_shotorg, w_shotorg + v_forward * (vecs_x + nudge), MOVE_NORMAL, self);
 	w_shotorg = trace_endpos - v_forward * nudge;
@@ -251,21 +258,45 @@
 	return TRUE;
 }
 
+float qcweaponanimation;
+vector weapon_offset = '0 -10 0';
+vector weapon_adjust = '10 0 -15';
+.vector weapon_morph0origin;
+.vector weapon_morph0angles;
+.float  weapon_morph0time;
+.vector weapon_morph1origin;
+.vector weapon_morph1angles;
+.float  weapon_morph1time;
+.vector weapon_morph2origin;
+.vector weapon_morph2angles;
+.float  weapon_morph2time;
+.vector weapon_morph3origin;
+.vector weapon_morph3angles;
+.float  weapon_morph3time;
+.vector weapon_morph4origin;
+.vector weapon_morph4angles;
+.float  weapon_morph4time;
 .string weaponname;
+#define QCWEAPONANIMATION_ORIGIN(e) ((weapon_offset_x + e.view_ofs_x) * v_forward - (weapon_offset_y + e.view_ofs_y) * v_right + (weapon_offset_z + e.view_ofs_z) * v_up + weapon_adjust)
+
 void CL_Weaponentity_Think()
 {
 	float tb;
 	self.nextthink = time;
 	if (intermission_running)
-		self.frame = WFRAME_IDLE;
+		self.frame = self.anim_idle_x;
 	if (self.owner.weaponentity != self)
 	{
+		if (self.weaponentity)
+			remove(self.weaponentity);
 		remove(self);
 		return;
 	}
 	if (self.owner.deadflag != DEAD_NO)
 	{
 		self.model = "";
+		if (self.weaponentity)
+			self.weaponentity.model = "";
 		return;
 	}
 	if (self.cnt != self.owner.weapon || self.dmg != self.owner.modelindex || self.deadflag != self.owner.deadflag)
@@ -273,14 +304,130 @@
 		self.cnt = self.owner.weapon;
 		self.dmg = self.owner.modelindex;
 		self.deadflag = self.owner.deadflag;
+
+		string animfilename;
+		float animfile;
 		if (self.owner.weaponname != "")
-			setmodel(self, strcat("models/weapons/w_", self.owner.weaponname, ".zym")); // precision set below
+		{
+			// if there is a child entity, hide it until we're sure we use it
+			if (self.weaponentity)
+				self.weaponentity.model = "";
+			if (qcweaponanimation)
+				setmodel(self, strcat("models/weapons/v_", self.owner.weaponname, ".md3")); // precision set below
+			else
+			{
+				setmodel(self, strcat("models/weapons/h_", self.owner.weaponname, ".dpm")); // precision set below
+				animfilename = strcat("models/weapons/h_", self.owner.weaponname, ".dpm.animinfo");
+				animfile = fopen(animfilename, FILE_READ);
+				// preset some defaults that work great for renamed zym files (which don't need an animinfo)
+				self.anim_fire1  = '0 1 0.01';
+				self.anim_fire2  = '1 1 0.01';
+				self.anim_idle   = '2 1 0.01';
+				self.anim_reload = '3 1 0.01';
+				if (animfile >= 0)
+				{
+					if (!self.weaponentity)
+						self.weaponentity = spawn();
+					animparseerror = FALSE;
+					self.anim_fire1  = animparseline(animfile);
+					self.anim_fire2  = animparseline(animfile);
+					self.anim_idle   = animparseline(animfile);
+					self.anim_reload = animparseline(animfile);
+					fclose(animfile);
+					if (animparseerror)
+						print("Parse error in ", animfilename, ", some player animations are broken\n");
+				}
+
+				// if we have a "weapon" tag, let's attach the v_ model to it ("invisible hand" style model)
+				// if we don't, this is a "real" animated model
+				if(gettagindex(self, "weapon"))
+				{
+					setmodel(self.weaponentity, strcat("models/weapons/v_", self.owner.weaponname, ".md3")); // precision does not matter
+					setattachment(self.weaponentity, self, "weapon");
+				}
+			}
+		}
 		else
 			self.model = "";
+
+		if(qcweaponanimation)
+		{
+			self.angles = '0 0 0';
+			makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+			self.movedir = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+			self.movedir_x += 30;
+			self.spawnorigin = self.movedir;
+		}
+		else
+		{
+			self.origin = '0 0 0';
+			self.angles = '0 0 0';
+			self.frame = 0;
+			self.viewmodelforclient = world;
+
+			float idx;
+			idx = gettagindex(self, "shot");
+			if(idx)
+			{
+				self.movedir = gettaginfo(self, idx);
+			}
+			else
+			{
+				print("WARNING: weapon model ", self.model, " does not support the 'shot' tag\n");
+				self.movedir = '0 0 0';
+			}
+
+			idx = gettagindex(self, "shell");
+			if(idx)
+			{
+				self.spawnorigin = gettaginfo(self, idx);
+			}
+			else
+			{
+				print("WARNING: weapon model ", self.model, " does not support the 'shell' tag\n");
+				self.spawnorigin = self.movedir;
+			}
+
+			self.viewmodelforclient = self.owner;
+		}
+
+		self.view_ofs = '0 0 0';
+
+		if(self.movedir_x >= 0)
+		{
+			vector v0;
+			v0 = self.movedir;
+			self.movedir = shotorg_adjust(v0, FALSE, FALSE);
+			self.view_ofs = shotorg_adjust(v0, FALSE, TRUE) - v0;
+		}
+
+		self.spawnorigin += self.view_ofs; // offset the casings origin by the same amount
+
+		// check if an instant weapon switch occurred
+		if (qcweaponanimation)
+		{
+			if (self.state == WS_READY)
+			{
+				self.angles = '0 0 0';
+				makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+				setorigin(self, QCWEAPONANIMATION_ORIGIN(self));
+			}
+		}
+		else
+			setorigin(self, self.view_ofs);
+		// reset animstate now
+		self.wframe = WFRAME_IDLE;
+		self.weapon_morph0time = 0;
+		self.weapon_morph1time = 0;
+		self.weapon_morph2time = 0;
+		self.weapon_morph3time = 0;
+		self.weapon_morph4time = 0;
+		setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
 	}
 
 	tb = (self.effects & EF_TELEPORT_BIT);
-	self.effects = self.owner.effects | EF_LOWPRECISION;
+	self.effects = self.owner.effects & EFMASK_CHEAP;
+	self.effects &~= EF_LOWPRECISION;
 	self.effects &~= EF_FULLBRIGHT; // can mask team color, so get rid of it
 	self.effects &~= EF_TELEPORT_BIT;
 	self.effects |= tb;
@@ -291,18 +438,169 @@
 		self.alpha = 1;
 	
 	self.colormap = self.owner.colormap;
+	if (self.weaponentity)
+	{
+		self.weaponentity.effects = self.effects;
+		self.weaponentity.alpha = self.alpha;
+		self.weaponentity.colormap = self.colormap;
+	}
 
 	self.angles = '0 0 0';
 	local float f;
 	f = 0;
 	if (self.state == WS_RAISE)
+	{
 		f = (self.owner.weapon_nextthink - time) / cvar("g_balance_weaponswitchdelay");
+		self.angles_x = -90 * f * f;
+		if (qcweaponanimation)
+		{
+			makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+			setorigin(self, QCWEAPONANIMATION_ORIGIN(self));
+		}
+	}
 	else if (self.state == WS_DROP)
+	{
 		f = 1 - (self.owner.weapon_nextthink - time) / cvar("g_balance_weaponswitchdelay");
+		self.angles_x = -90 * f * f;
+		if (qcweaponanimation)
+		{
+			makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+			setorigin(self, QCWEAPONANIMATION_ORIGIN(self));
+		}
+	}
 	else if (self.state == WS_CLEAR)
+	{
 		f = 1;
-	self.angles_x = -90 * f * f;
+		self.angles_x = -90 * f * f;
+		if (qcweaponanimation)
+		{
+			makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+			setorigin(self, QCWEAPONANIMATION_ORIGIN(self));
+		}
+	}
+	else if (qcweaponanimation && time < self.owner.weapon_morph1time)
+	{
+		f = (time - self.owner.weapon_morph0time) / (self.owner.weapon_morph1time - self.owner.weapon_morph0time);
+		f = 1 - pow(1 - f, 3);
+		self.angles = self.owner.weapon_morph0angles * (1 - f) + self.owner.weapon_morph1angles * f;
+		setorigin(self, self.owner.weapon_morph0origin * (1 - f) + self.owner.weapon_morph1origin * f);
+	}
+	else if (qcweaponanimation && time < self.owner.weapon_morph2time)
+	{
+		f = (time - self.owner.weapon_morph1time) / (self.owner.weapon_morph2time - self.owner.weapon_morph1time);
+		f = 1 - pow(1 - f, 3);
+		self.angles = self.owner.weapon_morph1angles * (1 - f) + self.owner.weapon_morph2angles * f;
+		setorigin(self, self.owner.weapon_morph1origin * (1 - f) + self.owner.weapon_morph2origin * f);
+	}
+	else if (qcweaponanimation && time < self.owner.weapon_morph3time)
+	{
+		f = (time - self.owner.weapon_morph2time) / (self.owner.weapon_morph3time - self.owner.weapon_morph2time);
+		f = 1 - pow(1 - f, 3);
+		self.angles = self.owner.weapon_morph2angles * (1 - f) + self.owner.weapon_morph3angles * f;
+		setorigin(self, self.owner.weapon_morph2origin * (1 - f) + self.owner.weapon_morph3origin * f);
+	}
+	else if (qcweaponanimation && time < self.owner.weapon_morph4time)
+	{
+		f = (time - self.owner.weapon_morph3time) / (self.owner.weapon_morph4time - self.owner.weapon_morph3time);
+		f = 1 - pow(1 - f, 3);
+		self.angles = self.owner.weapon_morph3angles * (1 - f) + self.owner.weapon_morph4angles * f;
+		setorigin(self, self.owner.weapon_morph3origin * (1 - f) + self.owner.weapon_morph4origin * f);
+	}
+	else if (qcweaponanimation)
+	{
+		// begin a new idle morph
+		self.owner.weapon_morph0time   = time;
+		self.owner.weapon_morph0angles = self.angles;
+		self.owner.weapon_morph0origin = self.origin;
 
+		float r;
+		float t;
+
+		r = random();
+		if (r < 0.1)
+		{
+			// turn gun to the left to look at it
+			t = 2;
+			self.owner.weapon_morph1time   = time + t * 0.2;
+			self.owner.weapon_morph1angles = randomvec() * 3 + '-5 30 0';
+			makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+			self.owner.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph2time   = time + t * 0.6;
+			self.owner.weapon_morph2angles = randomvec() * 3 + '-5 30 0';
+			makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+			self.owner.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph3time   = time + t;
+			self.owner.weapon_morph3angles = '0 0 0';
+			makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+			self.owner.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self);
+		}
+		else if (r < 0.2)
+		{
+			// raise the gun a bit
+			t = 2;
+			self.owner.weapon_morph1time   = time + t * 0.2;
+			self.owner.weapon_morph1angles = randomvec() * 3 + '30 -10 0';
+			makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+			self.owner.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph2time   = time + t * 0.5;
+			self.owner.weapon_morph2angles = randomvec() * 3 + '30 -10 5';
+			makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+			self.owner.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph3time   = time + t;
+			self.owner.weapon_morph3angles = '0 0 0';
+			makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+			self.owner.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self);
+		}
+		else if (r < 0.3)
+		{
+			// tweak it a bit
+			t = 5;
+			self.owner.weapon_morph1time   = time + t * 0.3;
+			self.owner.weapon_morph1angles = randomvec() * 6;
+			makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+			self.owner.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph2time   = time + t * 0.7;
+			self.owner.weapon_morph2angles = randomvec() * 6;
+			makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+			self.owner.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph3time   = time + t;
+			self.owner.weapon_morph3angles = '0 0 0';
+			makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+			self.owner.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self);
+		}
+		else
+		{
+			// hold it mostly steady
+			t = random() * 6 + 4;
+			self.owner.weapon_morph1time   = time + t * 0.2;
+			self.owner.weapon_morph1angles = randomvec() * 1;
+			makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+			self.owner.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph2time   = time + t * 0.5;
+			self.owner.weapon_morph2angles = randomvec() * 1;
+			makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+			self.owner.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self);
+
+			self.owner.weapon_morph3time   = time + t * 0.7;
+			self.owner.weapon_morph3angles = randomvec() * 1;
+			makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+			self.owner.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self);
+		}
+
+		self.owner.weapon_morph4time   = time + t;
+		self.owner.weapon_morph4angles = '0 0 0';
+		makevectors(self.owner.weapon_morph4angles_x * '-1 0 0' + self.owner.weapon_morph4angles_y * '0 1 0' + self.owner.weapon_morph4angles_z * '0 0 1');
+		self.owner.weapon_morph4origin = QCWEAPONANIMATION_ORIGIN(self);
+
+	}
+
 	// create or update the lasertarget entity
 	LaserTarget_Think();
 };
@@ -360,7 +658,6 @@
 	self.weaponentity.classname = "weaponentity";
 	self.weaponentity.solid = SOLID_NOT;
 	self.weaponentity.owner = self;
-	self.weaponentity.weaponentity = self.weaponentity;
 	setmodel(self.weaponentity, ""); // precision set when changed
 	self.weaponentity.origin = '0 0 0';
 	self.weaponentity.angles = '0 0 0';
@@ -369,7 +666,6 @@
 	self.weaponentity.think = CL_Weaponentity_Think;
 	self.weaponentity.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
 	self.weaponentity.nextthink = time;
-	self.weaponentity.scale = 0.61;
 
 	self.exteriorweaponentity = spawn();
 	self.exteriorweaponentity.classname = "exteriorweaponentity";
@@ -488,6 +784,7 @@
 void weapon_setup(float windex)
 {
 	entity e;
+	qcweaponanimation = cvar("sv_qcweaponanimation");
 	e = get_weaponinfo(windex);
 	self.items &~= IT_AMMO;
 	self.items = self.items | e.items;
@@ -551,18 +848,113 @@
 
 void weapon_thinkf(float fr, float t, void() func)
 {
-	if (fr >= 0)
+	vector a;
+	vector of, or, ou;
+	float restartanim;
+
+	if(fr == WFRAME_DONTCHANGE)
 	{
-		if (self.weaponentity != world)
+		fr = self.weaponentity.wframe;
+		restartanim = FALSE;
+	}
+	else if (fr == WFRAME_IDLE)
+		restartanim = FALSE;
+	else
+		restartanim = TRUE;
+
+	of = v_forward;
+	or = v_right;
+	ou = v_up;
+
+	if (self.weaponentity)
+	{
+		self.weaponentity.wframe = fr;
+		if (qcweaponanimation)
 		{
-			if(fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2)
+			if (fr != WFRAME_IDLE)
 			{
-				BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+				self.weapon_morph0time = time;
+				self.weapon_morph0angles = self.weaponentity.angles;
+				self.weapon_morph0origin = self.weaponentity.origin;
+
+				self.weapon_morph1angles = '0 0 0';
+				self.weapon_morph1time = time + t;
+				makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+				self.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+
+				self.weapon_morph2angles = '0 0 0';
+				self.weapon_morph2time = time + t;
+				makevectors(self.weapon_morph2angles_x * '-1 0 0' + self.weapon_morph2angles_y * '0 1 0' + self.weapon_morph2angles_z * '0 0 1');
+				self.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+
+				self.weapon_morph3angles = '0 0 0';
+				self.weapon_morph3time = time + t;
+				makevectors(self.weapon_morph3angles_x * '-1 0 0' + self.weapon_morph3angles_y * '0 1 0' + self.weapon_morph3angles_z * '0 0 1');
+				self.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+
+				self.weapon_morph4angles = '0 0 0';
+				self.weapon_morph4time = time + t;
+				makevectors(self.weapon_morph4angles_x * '-1 0 0' + self.weapon_morph4angles_y * '0 1 0' + self.weapon_morph4angles_z * '0 0 1');
+				self.weapon_morph4origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+
+				if (fr == WFRAME_FIRE1)
+				{
+					self.weapon_morph1angles = '5 0 0';
+					self.weapon_morph1time = time + t * 0.1;
+					makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+					self.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+					self.weapon_morph4time = time + t + 1; // delay idle effect
+				}
+				else if (fr == WFRAME_FIRE2)
+				{
+					self.weapon_morph1angles = '10 0 0';
+					self.weapon_morph1time = time + t * 0.1;
+					makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+					self.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+					self.weapon_morph4time = time + t + 1; // delay idle effect
+				}
+				else if (fr == WFRAME_RELOAD)
+				{
+					self.weapon_morph1time = time + t * 0.05;
+					self.weapon_morph1angles = '-10 40 0';
+					makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+					self.weapon_morph1origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+
+					self.weapon_morph2time = time + t * 0.15;
+					self.weapon_morph2angles = '-10 40 5';
+					makevectors(self.weapon_morph2angles_x * '-1 0 0' + self.weapon_morph2angles_y * '0 1 0' + self.weapon_morph2angles_z * '0 0 1');
+					self.weapon_morph2origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+		
+					self.weapon_morph3time = time + t * 0.25;
+					self.weapon_morph3angles = '-10 40 0';
+					makevectors(self.weapon_morph3angles_x * '-1 0 0' + self.weapon_morph3angles_y * '0 1 0' + self.weapon_morph3angles_z * '0 0 1');
+					self.weapon_morph3origin = QCWEAPONANIMATION_ORIGIN(self.weaponentity);
+				}
 			}
-			self.weaponentity.frame = fr;
 		}
+		else
+		{
+			if (fr == WFRAME_IDLE)
+				a = self.weaponentity.anim_idle;
+			else if (fr == WFRAME_FIRE1)
+				a = self.weaponentity.anim_fire1;
+			else if (fr == WFRAME_FIRE2)
+				a = self.weaponentity.anim_fire2;
+			else if (fr == WFRAME_RELOAD)
+				a = self.weaponentity.anim_reload;
+			setanim(self.weaponentity, a, restartanim == FALSE, restartanim, restartanim);
+		}
+
+		if(restartanim)
+		{
+			BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+		}
 	}
 
+	v_forward = of;
+	v_right = or;
+	v_up = ou;
+
 	if(self.weapon_think == w_ready && func != w_ready && self.weaponentity.state == WS_RAISE)
 	{
 		backtrace("Tried to override initial weapon think function - should this really happen?");
@@ -598,14 +990,14 @@
 	self.weapon_think = func;
 	//dprint("next ", ftos(self.weapon_nextthink), "\n");
 
-	if (fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2)
+	if (restartanim)
 	if (t)
 	if (!self.crouch) // shoot anim stands up, this looks bad
 	{
 		local vector anim;
 		anim = self.anim_shoot;
 		anim_z = anim_y / t;
-		player_setanim(anim, FALSE, TRUE, TRUE);
+		setanim(self, anim, FALSE, TRUE, TRUE);
 	}
 };
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -319,18 +319,17 @@
 		else
 			sprint(self, "Usage: sv_cheats 1; restart; cmd pointparticles effectname position(0..1) velocityvector multiplier\n");
 	} else if(argv(0) == "trailparticles") {
-		if(sv_cheats && tokens == 3)
+		if(sv_cheats && tokens == 2)
 		{
 			// arguments:
 			//   effectname
-			//   shot origin vector
 			effectnum = particleeffectnum(argv(1));
-			W_SetupShot(self, stov(argv(2)), FALSE, FALSE, "");
+			W_SetupShot(self,  FALSE, FALSE, "");
 			traceline(w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, MOVE_NORMAL, self);
 			trailparticles(self, effectnum, w_shotorg, trace_endpos);
 		}
 		else
-			sprint(self, "Usage: sv_cheats 1; restart; cmd trailparticles effectname shotorigin\n");
+			sprint(self, "Usage: sv_cheats 1; restart; cmd trailparticles effectname\n");
 	} else {
 		//if(ctf_clientcommand())
 		//	return;

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,5 +1,5 @@
-string CVAR_CHECK_DEFAULT = "b47ac645ad97cf25d5d95b2b8be26e15";
-string CVAR_CHECK_WEAPONS = "32e7dc7d745187473f0040d14892e2bb";
+string CVAR_CHECK_DEFAULT = "536ebc4385079e467b5b49c21ff625e5";
+string CVAR_CHECK_WEAPONS = "6dd73b6c78519153d50f876be23bfe77";
 
 float	FALSE					= 0;
 float	TRUE					= 1;

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-03-16 09:12:13 UTC (rev 6191)
@@ -147,8 +147,14 @@
 .vector anim_backright; // player running backward and right
 .vector anim_backleft; // player running back and left
 
+// weapon animation vectors:
+.vector anim_fire1;
+.vector anim_fire2;
+.vector anim_idle;
+.vector anim_reload;
+
 void() player_setupanimsformodel;
-void player_setanim(vector anim, float looping, float override, float restart);
+void setanim(entity e, vector anim, float looping, float override, float restart);
 
 .string mdl;
 
@@ -543,3 +549,5 @@
 #define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))
 
 .float wasplayer;
+
+float servertime, serverprevtime, serverframetime;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_casings.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -12,10 +12,13 @@
 	return TRUE;
 }
 
-void SpawnCasing(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype)
+void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype)
 {
 	entity e;
+	vector org;
 
+	org = self.origin + self.view_ofs + self.weaponentity.spawnorigin_x * v_forward - self.weaponentity.spawnorigin_y * v_right + self.weaponentity.spawnorigin_z * v_up;
+
 	e = spawn();
 	e.state = casingtype;
 	e.origin = org;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -470,7 +470,7 @@
 	if(g_grappling_hook)
 		hook_shotorigin = '8 -8 -12';
 	else
-		hook_shotorigin = '21 8 -8.5';
+		hook_shotorigin = shotorg_adjust('26.2148 9.2059 -15.9772', FALSE, FALSE);
 }
 
 void SetGrappleHookBindings()

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -12,6 +12,62 @@
 	// if anything breaks, tell the mapper to fix his map! info_null is meant to remove itself immediately.
 }
 
+void setanim(entity e, vector anim, float looping, float override, float restart)
+{
+	if (!restart)
+	if (anim_x == e.animstate_startframe)
+	if (anim_y == e.animstate_numframes)
+	if (anim_z == e.animstate_framerate)
+		return;
+	e.animstate_startframe = anim_x;
+	e.animstate_numframes = anim_y;
+	e.animstate_framerate = anim_z;
+	e.animstate_starttime = servertime - 0.1 * serverframetime; // shift it a little bit into the past to prevent float inaccuracy hiccups
+	e.animstate_endtime = e.animstate_starttime + e.animstate_numframes / e.animstate_framerate;
+	e.animstate_looping = looping;
+	e.animstate_override = override;
+	e.frame = e.animstate_startframe;
+};
+
+void updateanim(entity e)
+{
+	if (time >= e.animstate_endtime)
+	{
+		if (e.animstate_looping)
+		{
+			e.animstate_starttime = e.animstate_endtime;
+			e.animstate_endtime = e.animstate_starttime + e.animstate_numframes / e.animstate_framerate;
+		}
+		e.animstate_override = FALSE;
+	}
+	e.frame = e.animstate_startframe + bound(0, (time - e.animstate_starttime) * e.animstate_framerate, e.animstate_numframes - 1);
+	//print(ftos(time), " -> ", ftos(e.frame), "\n");
+};
+
+float animparseerror;
+vector animparseline(float animfile)
+{
+	local string line;
+	local float c;
+	local vector anim;
+	if (animfile < 0)
+		return '0 1 2';
+	line = fgets(animfile);
+	c = tokenize_sane(line);
+	if (c != 3)
+	{
+		animparseerror = TRUE;
+		return '0 1 2';
+	}
+	anim_x = stof(argv(0));
+	anim_y = stof(argv(1));
+	anim_z = stof(argv(2));
+	// don't allow completely bogus values
+	if (anim_x < 0 || anim_y < 1 || anim_z < 0.001)
+		anim = '0 1 2';
+	return anim;
+};
+
 /*
 ==================
 SUB_Remove

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -133,6 +133,7 @@
 
 void GotoFirstMap()
 {
+	float n;
 	if(cvar("_sv_init"))
 	{
 		// cvar_set("_sv_init", "0");
@@ -141,10 +142,9 @@
 		// harm
 		if(cvar("g_maplist_shuffle"))
 			ShuffleMaplist();
-		tokenizebyseparator(cvar_string("g_maplist"), " ");
+		n = tokenizebyseparator(cvar_string("g_maplist"), " ");
+		cvar_set("g_maplist_index", ftos(n - 1)); // jump to map 0 in GotoNextMap
 
-		cvar_set("nextmap", argv(0));
-
 		MapInfo_Enumerate();
 		MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), 0, (g_maplist_allow_hidden ? 0 : MAPINFO_FLAG_HIDDEN), 0);
 
@@ -354,6 +354,10 @@
 	e.classname = "info_player_deathmatch"; // safeguard against player joining
 
 	self.classname = "worldspawn"; // safeguard against various stuff ;)
+
+	g_maplist_allow_hidden = cvar("g_maplist_allow_hidden");
+	MapInfo_Enumerate();
+	MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), 0, (g_maplist_allow_hidden ? 0 : MAPINFO_FLAG_HIDDEN), 0);
 }
 
 void Map_MarkAsRecent(string m);
@@ -377,10 +381,10 @@
 	if(cvar_string("cvar_check_default") != "bypass")
 	{
 		if(cvar_string("cvar_check_default") != CVAR_CHECK_DEFAULT)
-			error("Config file mismatch! Please update defaultNexuiz.cfg to match the QuakeC code!");
+			error("Config file mismatch! Please update defaultNexuiz.cfg to match the QuakeC code, and restart the engine!");
 
 		if(cvar_string("cvar_check_weapons") != CVAR_CHECK_WEAPONS)
-			error("Config file mismatch! Please update weapons.cfg and weaponsPro.cfg to match the QuakeC code!");
+			error("Config file mismatch! Please update weapons.cfg and weaponsHavoc.cfg to match the QuakeC code, and restart the engine!");
 	}
 
 	compressShortVector_init();
@@ -1239,7 +1243,11 @@
 		e.movetype = MOVETYPE_NONE;
 		e.takedamage = DAMAGE_NO;
 		if(e.weaponentity)
+		{
 			e.weaponentity.effects = EF_NODRAW;
+			if (e.weaponentity.weaponentity)
+				e.weaponentity.weaponentity.effects = EF_NODRAW;
+		}
 		if(clienttype(e) == CLIENTTYPE_REAL)
 		{
 			stuffcmd(e, "\nscr_printspeed 1000000\n");
@@ -2258,6 +2266,9 @@
 	float mapvote_voters_real;
 	string result;
 
+	if(mapvote_count_real == 1)
+		return MapVote_Finished(0);
+
 	mapvote_voters_real = mapvote_voters;
 	if(mapvote_abstain)
 		mapvote_voters_real -= mapvote_votes[mapvote_count - 1];

Modified: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -846,7 +846,7 @@
 			v = gettaginfo(e, i);
 			print("model ", e.model, " frame ", ftos(e.frame), " tag ", argv(3));
 			print(" index = ", ftos(i));
-			print(" vector = ", vtos(v), "\n");
+			print(" vector = ", ftos(v_x), " ", ftos(v_y), " ", ftos(v_z), "\n");
 			if(argc >= 6)
 			{
 				v_y = -v_y;

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -140,7 +140,7 @@
 .float bot_canruntogoal;
 void havocbot_bunnyhop(vector dir)
 {
-	local float distance;
+	local float bunnyhopdistance;
 	local vector deviation;
 
 	if(self.goalcurrent.classname == "player")
@@ -159,7 +159,7 @@
 		self.bot_timelastseengoal = 0;
 	}
 
-	distance = vlen(self.origin - self.goalcurrent.origin);
+	bunnyhopdistance = vlen(self.origin - self.goalcurrent.origin);
 
 	// Run only to visible goals
 	traceline(self.origin + self.view_ofs , self.goalcurrent.origin, TRUE, world);
@@ -180,7 +180,7 @@
 					// don't run if it is too close
 					if(self.bot_canruntogoal==0)
 					{
-						if(distance > cvar("bot_ai_bunnyhop_startdistance"))
+						if(bunnyhopdistance > cvar("bot_ai_bunnyhop_startdistance"))
 							self.bot_canruntogoal = 1;
 						else	
 							self.bot_canruntogoal = -1;
@@ -200,7 +200,7 @@
 						while (deviation_y > 180) deviation_y = deviation_y - 360;
 
 						if(fabs(deviation_y) < 15)
-						if(distance < vlen(self.origin - self.goalstack01.origin))
+						if(bunnyhopdistance < vlen(self.origin - self.goalstack01.origin))
 						if(fabs(self.goalstack01.origin_z - self.goalcurrent.origin_z) < self.maxs_z - self.mins_z)
 						{
 							traceline(self.origin + self.view_ofs , self.goalstack01.origin, TRUE, world);
@@ -214,7 +214,7 @@
 					if(checkdistance)
 					{
 						self.aistatus &~= AI_STATUS_RUNNING;
-						if(distance > cvar("bot_ai_bunnyhop_stopdistance"))
+						if(bunnyhopdistance > cvar("bot_ai_bunnyhop_stopdistance"))
 							self.BUTTON_JUMP = TRUE;
 					}
 					else
@@ -864,15 +864,15 @@
 		self.aistatus &~= AI_STATUS_ATTACKING;
 
 		local vector now,v,next;//,heading;
-		local float distance,skillblend,distanceblend,blend;
+		local float aimdistance,skillblend,distanceblend,blend;
 		next = now = self.goalcurrent.origin - (self.origin + self.view_ofs);
-		distance = vlen(now);
+		aimdistance = vlen(now);
 		//heading = self.velocity;
 		//dprint(self.goalstack01.classname,etos(self.goalstack01),"\n");
 		if(self.goalstack01 != self && self.goalstack01 != world && self.aistatus & AI_STATUS_RUNNING == 0)
 			next = self.goalstack01.origin - (self.origin + self.view_ofs);
 		skillblend=bound(0,(skill-2.5)*0.5,1); //lower skill player can't preturn
-		distanceblend=bound(0,distance/cvar("bot_ai_keyboard_distance"),1);
+		distanceblend=bound(0,aimdistance/cvar("bot_ai_keyboard_distance"),1);
 		blend = skillblend * (1-distanceblend);
 		//v = (now * (distanceblend) + next * (1-distanceblend)) * (skillblend) + now * (1-skillblend);
 		//v = now * (distanceblend) * (skillblend) + next * (1-distanceblend) * (skillblend) + now * (1-skillblend);

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -2025,3 +2025,26 @@
 			strcat("//", strconv(2, 0, 0, GetGametype()), " RECORD SET ", mmsss(dt * 10)),
 			" ", ftos(tstart), " ", ftos(dt), "\n"));
 }
+
+vector shotorg_adjust(vector vecs, float y_is_right, float visual)
+{
+	if (cvar("g_shootfromeye"))
+	{
+		if(visual)
+		{
+			vecs_y = 0;
+			vecs_z -= 2;
+		}
+		else
+		{
+			vecs_y = 0;
+			vecs_z = 0;
+		}
+	}
+	else if (cvar("g_shootfromcenter"))
+	{
+		vecs_y = 0;
+		vecs_z -= 2;
+	}
+	return vecs;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,132 +1,132 @@
-/**
-    Simulate drag
-    self.velocity = movelib_vdrag(self.velocity,0.02,0.5);
-**/
-vector movelib_dragvec(float drag, float exp)
-{
-    float lspeed,ldrag;
-
-    lspeed = vlen(self.velocity);
-    ldrag = lspeed * drag;
-    ldrag = ldrag * (drag * exp);
-    ldrag = 1 - (ldrag / lspeed);
-
-    return self.velocity * ldrag;
-}
-
-/**
-    Simulate drag
-    self.velocity = movelib_vdrag(somespeed,0.01,0.7);
-**/
-float movelib_dragflt(float fspeed,float drag,float exp)
-{
-    float ldrag;
-
-    ldrag = fspeed * drag;
-    ldrag = ldrag * ldrag * exp;
-    ldrag = 1 - (ldrag / fspeed);
-
-    return ldrag;
-}
-
-/**
-    Do a inertia simulation based on velocity.
-    Basicaly, this allows you to simulate objects loss steering with speed.
-    self.velocity = movelib_inertia_fromspeed(self.velocity,newvel,1000,0.1,0.9);
-**/
-vector movelib_inertmove_byspeed(vector vel_new, float vel_max,float newmin,float oldmax)
-{
-    float influense;
-
-    influense = vlen(self.velocity) * (1 / vel_max);
-
-    influense = bound(newmin,influense,oldmax);
-
-    return (vel_new * (1 - influense)) + (self.velocity * influense);
-}
-
-vector movelib_inertmove(vector new_vel,float new_bias)
-{
-    return new_vel * new_bias + self.velocity * (1-new_bias);
-}
-
-.float  movelib_lastupdate;
-void movelib_move(vector force,float max_velocity,float drag,float mass,float breakforce)
-{
-    float deltatime;
-    float acceleration;
-    //float mspeed;
-
-    deltatime = time - self.movelib_lastupdate;
-    if (deltatime > 0.15) deltatime = 0;
-    self.movelib_lastupdate = time;
-    if(!deltatime) return;
-
-    //mspeed = vlen(self.velocity);
-
-    if(mass)
-        acceleration = vlen(force) / mass;
-    else
-        acceleration = vlen(force);
-
-    if(self.flags & FL_ONGROUND)
-    {
-        if(breakforce)
-        {
-            breakforce = 1 - ((breakforce / mass) * deltatime);
-            self.velocity = self.velocity * breakforce;
-        }
-
-        self.velocity = self.velocity + force * (acceleration * deltatime);
-    }
-
-    self.velocity = self.velocity + '0 0 -1' * sv_gravity * deltatime;
-
-    if(drag)
-        self.velocity = movelib_dragvec(drag, 1);
-
-    if(max_velocity)
-    if(vlen(self.velocity) > max_velocity)
-        self.velocity = normalize(self.velocity) * max_velocity;
-}
-
-void movelib_move_simple(vector newdir,float velo,float turnrate)
-{
-    vector olddir;
-
-    olddir = normalize(self.velocity);
-
-    self.velocity = normalize(olddir + newdir * turnrate) * velo;
-}
-
-/*
-vector movelib_accelerate(float force)
-{
-    vector vel;
-    vel = self.velocity;
-    vel = normalize(vel) * (vlen(vel) + force);
-    self.velocity = self.velocity  + vel;
-}
-
-
-vector movelib_decelerate(float force,float mass)
-{
-    vector vel;
-    float decel;
-
-    if(mass)
-        decel = force / mass;
-    else
-        decel = force;
-
-    vel = self.velocity;
-    vel = normalize(vel) * max((vlen(vel) - decel),0);
-    self.velocity = self.velocity - vel;
-
-    if(vlen(self.velocity) < 5) self.velocity = '0 0 0';
-}
-*/
-vector movelib_velocity_transfer(entity source,entity destination)
-{
-    return '0 0 0';
-}
+/**
+    Simulate drag
+    self.velocity = movelib_vdrag(self.velocity,0.02,0.5);
+**/
+vector movelib_dragvec(float drag, float exp)
+{
+    float lspeed,ldrag;
+
+    lspeed = vlen(self.velocity);
+    ldrag = lspeed * drag;
+    ldrag = ldrag * (drag * exp);
+    ldrag = 1 - (ldrag / lspeed);
+
+    return self.velocity * ldrag;
+}
+
+/**
+    Simulate drag
+    self.velocity = movelib_vdrag(somespeed,0.01,0.7);
+**/
+float movelib_dragflt(float fspeed,float drag,float exp)
+{
+    float ldrag;
+
+    ldrag = fspeed * drag;
+    ldrag = ldrag * ldrag * exp;
+    ldrag = 1 - (ldrag / fspeed);
+
+    return ldrag;
+}
+
+/**
+    Do a inertia simulation based on velocity.
+    Basicaly, this allows you to simulate objects loss steering with speed.
+    self.velocity = movelib_inertia_fromspeed(self.velocity,newvel,1000,0.1,0.9);
+**/
+vector movelib_inertmove_byspeed(vector vel_new, float vel_max,float newmin,float oldmax)
+{
+    float influense;
+
+    influense = vlen(self.velocity) * (1 / vel_max);
+
+    influense = bound(newmin,influense,oldmax);
+
+    return (vel_new * (1 - influense)) + (self.velocity * influense);
+}
+
+vector movelib_inertmove(vector new_vel,float new_bias)
+{
+    return new_vel * new_bias + self.velocity * (1-new_bias);
+}
+
+.float  movelib_lastupdate;
+void movelib_move(vector force,float max_velocity,float drag,float mass,float breakforce)
+{
+    float deltatime;
+    float acceleration;
+    //float mspeed;
+
+    deltatime = time - self.movelib_lastupdate;
+    if (deltatime > 0.15) deltatime = 0;
+    self.movelib_lastupdate = time;
+    if(!deltatime) return;
+
+    //mspeed = vlen(self.velocity);
+
+    if(mass)
+        acceleration = vlen(force) / mass;
+    else
+        acceleration = vlen(force);
+
+    if(self.flags & FL_ONGROUND)
+    {
+        if(breakforce)
+        {
+            breakforce = 1 - ((breakforce / mass) * deltatime);
+            self.velocity = self.velocity * breakforce;
+        }
+
+        self.velocity = self.velocity + force * (acceleration * deltatime);
+    }
+
+    self.velocity = self.velocity + '0 0 -1' * sv_gravity * deltatime;
+
+    if(drag)
+        self.velocity = movelib_dragvec(drag, 1);
+
+    if(max_velocity)
+    if(vlen(self.velocity) > max_velocity)
+        self.velocity = normalize(self.velocity) * max_velocity;
+}
+
+void movelib_move_simple(vector newdir,float velo,float turnrate)
+{
+    vector olddir;
+
+    olddir = normalize(self.velocity);
+
+    self.velocity = normalize(olddir + newdir * turnrate) * velo;
+}
+
+/*
+vector movelib_accelerate(float force)
+{
+    vector vel;
+    vel = self.velocity;
+    vel = normalize(vel) * (vlen(vel) + force);
+    self.velocity = self.velocity  + vel;
+}
+
+
+vector movelib_decelerate(float force,float mass)
+{
+    vector vel;
+    float decel;
+
+    if(mass)
+        decel = force / mass;
+    else
+        decel = force;
+
+    vel = self.velocity;
+    vel = normalize(vel) * max((vlen(vel) - decel),0);
+    self.velocity = self.velocity - vel;
+
+    if(vlen(self.velocity) < 5) self.velocity = '0 0 0';
+}
+*/
+vector movelib_velocity_transfer(entity source,entity destination)
+{
+    return '0 0 0';
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/pathlib.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,480 +1,480 @@
-#define PFL_GROUNDSNAP 1
-#define PFL_NOOPTIMIZE 2
-#define PFL_SUBPATH3D  4
-
-#define PT_QUICKSTAR 1
-#define PT_QUICKBOX  2
-#define PT_ASTAR     4  // FIXME NOT IMPLEMENTED
-
-//#define PATHLIB_RDFIELDS
-#ifdef PATHLIB_RDFIELDS
-    #define path_flags lip
-
-    #define path_subpathing_size autoswitch
-    #define path_subpathing_bboxexpand welcomemessage_time
-
-    #define path_next swampslug
-    #define path_prev lasertarget
-#else
-    .entity path_next;
-    .entity path_prev;
-
-    .float path_subpathing_size;
-    .float path_subpathing_bboxexpand;
-    .float path_flags;
-#endif
-
-#define pathlib_garbagetime 120
-#define pathib_maxdivide 512
-
-.float(vector start,vector end) path_validate;
-
-float pathlib_stdproc_path_validate(vector start,vector end)
-{
-    tracebox(start, self.mins, self.maxs, end, MOVE_WORLDONLY, self);
-
-    if(vlen(trace_endpos - end) < 32)
-        return 1;
-
-    return 0;
-}
-
-vector pathlib_groundsnap(vector where)
-{
-    float lsize;
-
-    lsize = vlen(self.mins - self.maxs) * 0.25;
-
-    traceline(where + ('0 0 1' * lsize) ,where - '0 0 10240',MOVE_WORLDONLY,self);
-
-    return trace_endpos + ('0 0 1' * lsize);
-
-}
-
-entity pathlib_createpoint(entity parent,entity next,entity first,vector where)
-{
-    entity point;
-
-    point = spawn();
-    point.classname = "path_node";
-
-    if(first)
-        point.owner = first;
-    else
-    {
-        point.classname = "path_master";
-        point.owner = point;
-    }
-
-    if(parent)
-        point.path_prev = parent;
-
-    if(next)
-    {
-        point.path_next = next;
-    }
-    else
-        point.classname = "path_end";
-
-    if (point.owner.path_flags & PFL_GROUNDSNAP)
-        where = pathlib_groundsnap(where);
-
-    setorigin(point,where);
-
-
-    return point;
-}
-
-/*
-float pathlib_scoresubpath(vector start,vector point,vector end,float minstep)
-{
-    float dist_stp,dist_pte,dist_total;
-
-    dist_stp = vlen(start - point);
-    if(dist_stp < minstep)
-        return 100000000;
-
-    dist_pte = vlen(point - end);
-    dist_total = dist_stp + dist_pte;
-    return -1;
-}
-*/
-
-vector pathlib_subpath_quickbox(entity start,vector vcrash,entity end,float maxsize)
-{
-
-    float step;
-    float pathscore;
-    float pathscore_best;
-    float dist;
-    vector bestpoint,point;
-    float zmin,zmax;
-    vector box;
-
-    pathscore_best = 0;
-
-    step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
-
-    if(start.owner.path_flags & PFL_SUBPATH3D)
-    {
-        zmin = maxsize * -1;
-        zmax = maxsize;
-    }
-    else
-    {
-        zmin = 0;
-        zmax = 1;
-    }
-
-    for(box_z = zmin; box_z < zmax; box_z += step)
-    for(box_y = -maxsize; box_y < maxsize; box_y += step)
-    for(box_x = -maxsize; box_x < maxsize; box_x += step)
-    {
-
-        point = vcrash + box;
-
-        if(start.owner.path_flags & PFL_GROUNDSNAP)
-            point = pathlib_groundsnap(point);
-
-        if(self.path_validate(start.origin,point))
-        {
-            dist = vlen(start.origin - point);
-            if(dist > step)
-            {
-                pathscore = 1 / (dist + vlen(point - end.origin));
-                if(pathscore > pathscore_best)
-                {
-                    bestpoint = point;
-                    pathscore_best = pathscore;
-                }
-            }
-        }
-
-    }
-
-    if(pathscore_best != 0)
-        return bestpoint;
-
-    return start.origin;
-}
-
-vector pathlib_subpath_quickstar(entity start,entity end,float gridsize)
-{
-    vector point, best_point;
-    float  score, best_score;
-    vector dir_end;
-
-    dir_end   = normalize(end.origin - start.origin);
-    dir_end_x = dir_end_x * -1;
-
-    makevectors(dir_end);
-
-    best_score = 0;
-    score      = 0;
-
-    best_point = start.origin;
-
-    // Forward
-    point = start.origin + v_forward * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    // Forward-right
-    point = start.origin + (v_forward + v_right * 0.5) * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-
-    // Forward-left
-    point = start.origin + (v_forward - v_right * 0.5) * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-
-    // Right
-    point = start.origin + v_right * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    // Left
-    point = start.origin - v_right * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    // Back
-    point = start.origin - v_forward * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    // Back-right
-
-    point = start.origin - (v_forward + v_right * 0.5) * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    // Back-left
-    point = start.origin - (v_forward - v_right * 0.5) * gridsize;
-    point  = pathlib_groundsnap(point);
-    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
-    if(score < best_score) { best_point = point; best_score = score; }
-    //te_lightning1(world,start.origin,point);
-
-    return(best_point);
-}
-
-float pathlib_path(entity start,entity end,float pathing_method)
-{
-    vector vcrash;
-    vector subpath_point;
-    entity subpoint;
-
-    // Fail.
-    if(start.cnt > pathib_maxdivide)
-    {
-        bprint("To many segments!\n");
-        return 0;
-    }
-
-    if(self.path_validate(start.origin,end.origin))
-        return 1;
-
-    vcrash = trace_endpos;
-
-    switch(pathing_method)
-    {
-        case PT_QUICKSTAR:
-            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
-            break;
-        case PT_QUICKBOX:
-            subpath_point = pathlib_subpath_quickbox(start,vcrash,end,start.owner.path_subpathing_size);
-            break;
-        case PT_ASTAR:
-            dprint("Pathlib error: A* pathing not implemented!\n");
-            return 0;
-        default:
-            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
-            dprint("Pathlib warning: unknown pathing method, using quickstar!\n");
-            break;
-    }
-
-    if(subpath_point == start.origin)
-        return 0; // Fail.
-
-    subpoint = pathlib_createpoint(start,end,start.owner,subpath_point);
-
-    subpoint.cnt = start.cnt +1;
-    start.path_next = subpoint;
-    end.path_prev = subpoint;
-
-    if(self.path_validate(start.origin,end.origin))
-        return 1;
-
-    return pathlib_path(subpoint,end,pathing_method);
-}
-
-void pathlib_path_optimize(entity start,entity end)
-{
-    entity point,point_tmp;
-    float c;
-
-    point = start.path_next;
-
-    while(point != end)
-    {
-        ++c;
-        if(c > 5000)
-        {
-            dprint("pathlib_path_optimize runaway!\n");
-            return;
-        }
-
-        point_tmp = point;
-        point = point.path_next;
-        if(self.path_validate(point_tmp.path_prev.origin,point_tmp.path_next.origin))
-        {
-
-            point_tmp.path_next.path_prev = point_tmp.path_prev;
-            point_tmp.path_prev.path_next = point_tmp.path_next;
-            remove(point_tmp);
-        }
-    }
-}
-
-void pathlib_deletepath(entity start)
-{
-    entity e;
-
-    e = findchainentity(owner, start);
-    while(e)
-    {
-        e.think = SUB_Remove;
-        e.nextthink = time;
-        e = e.chain;
-    }
-}
-
-//#define DEBUGPATHING
-#ifdef DEBUGPATHING
-void pathlib_showpath(entity start)
-{
-    entity e;
-    e = start;
-    while(e.path_next)
-    {
-        te_lightning1(e,e.origin,e.path_next.origin);
-        e = e.path_next;
-    }
-}
-
-void path_dbg_think()
-{
-    pathlib_showpath(self);
-    self.nextthink = time + 1;
-}
-#endif
-/**
-    Pathing from 'from' to 'to'
-**/
-entity pathlib_makepath(vector from, vector to,float pathflags,float subpathing_size, float subpathing_bboxexpand,float pathing_method)
-{
-    entity e_start,e_end;
-
-    if(!self.path_validate)
-        self.path_validate = pathlib_stdproc_path_validate;
-
-
-    if(subpathing_size < 10)
-        subpathing_size = 500;
-
-    if(subpathing_bboxexpand < 1)
-        subpathing_bboxexpand = 1;
-
-    if(pathflags & PFL_GROUNDSNAP)
-    {
-        from = pathlib_groundsnap(from);
-        to = pathlib_groundsnap(to);
-    }
-
-    e_start = pathlib_createpoint(world,world,world,from);
-    e_start.path_flags = pathflags;
-
-    e_start.path_subpathing_size = subpathing_size;
-    e_start.path_subpathing_bboxexpand = subpathing_bboxexpand;
-
-    e_start.owner = e_start;
-
-    e_end = pathlib_createpoint(e_start,world,e_start,to);
-    e_start.path_next = e_end;
-    e_start.cnt = 0;
-
-    if(!pathlib_path(e_start,e_end,pathing_method))
-    {
-        bprint("Fail, Fail, Fail!\n");
-        pathlib_deletepath(e_start);
-        remove(e_start);
-
-        return world;
-    }
-
-    pathlib_path_optimize(e_start,e_end);
-
-#ifdef DEBUGPATHING
-    e_start.think = path_dbg_think;
-    e_start.nextthink = time + 1;
-#endif
-
-    return e_start;
-
-}
-
-/*
-.entity goalcurrent, goalstack01, goalstack02, goalstack03;
-.entity goalstack04, goalstack05, goalstack06, goalstack07;
-.entity goalstack08, goalstack09, goalstack10, goalstack11;
-.entity goalstack12, goalstack13, goalstack14, goalstack15;
-.entity goalstack16, goalstack17, goalstack18, goalstack19;
-.entity goalstack20, goalstack21, goalstack22, goalstack23;
-.entity goalstack24, goalstack25, goalstack26, goalstack27;
-.entity goalstack28, goalstack29, goalstack30, goalstack31;
-*/
-
-#define node_left  goalstack01
-#define node_right goalstack02
-#define node_front goalstack03
-#define node_back  goalstack04
-
-#define node_open    goalstack05
-#define node_closed  goalstack06
-#define node_blocked goalstack07
-
-
-
-float pointinbox(vector point,vector box,float ssize)
-{
-    return 0;
-}
-#ifdef DEBUGPATHING
-
-/* TESTING */
-void pathlib_test_think()
-{
-    pathlib_showpath(self.enemy);
-
-    self.nextthink = time + 0.5;
-}
-void pathlib_test_dinit()
-{
-    entity path;
-    entity end;
-
-    if(self.target == "")
-    {
-        bprint("^1 ==== ERROR: pathlib_test with no target. ====\n");
-        remove(self);
-        return;
-    }
-
-    end = find(world,targetname,self.target);
-    if(!end)
-    {
-        bprint("^1 ==== ERROR: pathlib_test with no valid target. ====\n");
-        remove(self);
-        return;
-    }
-
-    setsize(self,'-50 -50 0','50 50 50');
-    path = pathlib_makepath(self.origin,end.origin, PFL_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
-
-    if(!path)
-    {
-        bprint("^1 ==== ERROR: pathlib_test pathing fail ====\n");
-        remove(self);
-        return;
-    }
-
-    self.enemy = path;
-    self.think = pathlib_test_think;
-    self.nextthink = time + 0.5;
-
-}
-void spawnfunc_pathlib_test()
-{
-    self.think = pathlib_test_dinit;
-    self.nextthink = time + 2;
-}
-
-#endif
+#define PFL_GROUNDSNAP 1
+#define PFL_NOOPTIMIZE 2
+#define PFL_SUBPATH3D  4
+
+#define PT_QUICKSTAR 1
+#define PT_QUICKBOX  2
+#define PT_ASTAR     4  // FIXME NOT IMPLEMENTED
+
+//#define PATHLIB_RDFIELDS
+#ifdef PATHLIB_RDFIELDS
+    #define path_flags lip
+
+    #define path_subpathing_size autoswitch
+    #define path_subpathing_bboxexpand welcomemessage_time
+
+    #define path_next swampslug
+    #define path_prev lasertarget
+#else
+    .entity path_next;
+    .entity path_prev;
+
+    .float path_subpathing_size;
+    .float path_subpathing_bboxexpand;
+    .float path_flags;
+#endif
+
+#define pathlib_garbagetime 120
+#define pathib_maxdivide 512
+
+.float(vector start,vector end) path_validate;
+
+float pathlib_stdproc_path_validate(vector start,vector end)
+{
+    tracebox(start, self.mins, self.maxs, end, MOVE_WORLDONLY, self);
+
+    if(vlen(trace_endpos - end) < 32)
+        return 1;
+
+    return 0;
+}
+
+vector pathlib_groundsnap(vector where)
+{
+    float lsize;
+
+    lsize = vlen(self.mins - self.maxs) * 0.25;
+
+    traceline(where + ('0 0 1' * lsize) ,where - '0 0 10240',MOVE_WORLDONLY,self);
+
+    return trace_endpos + ('0 0 1' * lsize);
+
+}
+
+entity pathlib_createpoint(entity parent,entity next,entity first,vector where)
+{
+    entity point;
+
+    point = spawn();
+    point.classname = "path_node";
+
+    if(first)
+        point.owner = first;
+    else
+    {
+        point.classname = "path_master";
+        point.owner = point;
+    }
+
+    if(parent)
+        point.path_prev = parent;
+
+    if(next)
+    {
+        point.path_next = next;
+    }
+    else
+        point.classname = "path_end";
+
+    if (point.owner.path_flags & PFL_GROUNDSNAP)
+        where = pathlib_groundsnap(where);
+
+    setorigin(point,where);
+
+
+    return point;
+}
+
+/*
+float pathlib_scoresubpath(vector start,vector point,vector end,float minstep)
+{
+    float dist_stp,dist_pte,dist_total;
+
+    dist_stp = vlen(start - point);
+    if(dist_stp < minstep)
+        return 100000000;
+
+    dist_pte = vlen(point - end);
+    dist_total = dist_stp + dist_pte;
+    return -1;
+}
+*/
+
+vector pathlib_subpath_quickbox(entity start,vector vcrash,entity end,float maxsize)
+{
+
+    float step;
+    float pathscore;
+    float pathscore_best;
+    float dist;
+    vector bestpoint,point;
+    float zmin,zmax;
+    vector box;
+
+    pathscore_best = 0;
+
+    step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
+
+    if(start.owner.path_flags & PFL_SUBPATH3D)
+    {
+        zmin = maxsize * -1;
+        zmax = maxsize;
+    }
+    else
+    {
+        zmin = 0;
+        zmax = 1;
+    }
+
+    for(box_z = zmin; box_z < zmax; box_z += step)
+    for(box_y = -maxsize; box_y < maxsize; box_y += step)
+    for(box_x = -maxsize; box_x < maxsize; box_x += step)
+    {
+
+        point = vcrash + box;
+
+        if(start.owner.path_flags & PFL_GROUNDSNAP)
+            point = pathlib_groundsnap(point);
+
+        if(self.path_validate(start.origin,point))
+        {
+            dist = vlen(start.origin - point);
+            if(dist > step)
+            {
+                pathscore = 1 / (dist + vlen(point - end.origin));
+                if(pathscore > pathscore_best)
+                {
+                    bestpoint = point;
+                    pathscore_best = pathscore;
+                }
+            }
+        }
+
+    }
+
+    if(pathscore_best != 0)
+        return bestpoint;
+
+    return start.origin;
+}
+
+vector pathlib_subpath_quickstar(entity start,entity end,float gridsize)
+{
+    vector point, best_point;
+    float  score, best_score;
+    vector dir_end;
+
+    dir_end   = normalize(end.origin - start.origin);
+    dir_end_x = dir_end_x * -1;
+
+    makevectors(dir_end);
+
+    best_score = 0;
+    score      = 0;
+
+    best_point = start.origin;
+
+    // Forward
+    point = start.origin + v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Forward-right
+    point = start.origin + (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+
+    // Forward-left
+    point = start.origin + (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+
+    // Right
+    point = start.origin + v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Left
+    point = start.origin - v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back
+    point = start.origin - v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back-right
+
+    point = start.origin - (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    // Back-left
+    point = start.origin - (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
+
+    return(best_point);
+}
+
+float pathlib_path(entity start,entity end,float pathing_method)
+{
+    vector vcrash;
+    vector subpath_point;
+    entity subpoint;
+
+    // Fail.
+    if(start.cnt > pathib_maxdivide)
+    {
+        bprint("To many segments!\n");
+        return 0;
+    }
+
+    if(self.path_validate(start.origin,end.origin))
+        return 1;
+
+    vcrash = trace_endpos;
+
+    switch(pathing_method)
+    {
+        case PT_QUICKSTAR:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            break;
+        case PT_QUICKBOX:
+            subpath_point = pathlib_subpath_quickbox(start,vcrash,end,start.owner.path_subpathing_size);
+            break;
+        case PT_ASTAR:
+            dprint("Pathlib error: A* pathing not implemented!\n");
+            return 0;
+        default:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            dprint("Pathlib warning: unknown pathing method, using quickstar!\n");
+            break;
+    }
+
+    if(subpath_point == start.origin)
+        return 0; // Fail.
+
+    subpoint = pathlib_createpoint(start,end,start.owner,subpath_point);
+
+    subpoint.cnt = start.cnt +1;
+    start.path_next = subpoint;
+    end.path_prev = subpoint;
+
+    if(self.path_validate(start.origin,end.origin))
+        return 1;
+
+    return pathlib_path(subpoint,end,pathing_method);
+}
+
+void pathlib_path_optimize(entity start,entity end)
+{
+    entity point,point_tmp;
+    float c;
+
+    point = start.path_next;
+
+    while(point != end)
+    {
+        ++c;
+        if(c > 5000)
+        {
+            dprint("pathlib_path_optimize runaway!\n");
+            return;
+        }
+
+        point_tmp = point;
+        point = point.path_next;
+        if(self.path_validate(point_tmp.path_prev.origin,point_tmp.path_next.origin))
+        {
+
+            point_tmp.path_next.path_prev = point_tmp.path_prev;
+            point_tmp.path_prev.path_next = point_tmp.path_next;
+            remove(point_tmp);
+        }
+    }
+}
+
+void pathlib_deletepath(entity start)
+{
+    entity e;
+
+    e = findchainentity(owner, start);
+    while(e)
+    {
+        e.think = SUB_Remove;
+        e.nextthink = time;
+        e = e.chain;
+    }
+}
+
+//#define DEBUGPATHING
+#ifdef DEBUGPATHING
+void pathlib_showpath(entity start)
+{
+    entity e;
+    e = start;
+    while(e.path_next)
+    {
+        te_lightning1(e,e.origin,e.path_next.origin);
+        e = e.path_next;
+    }
+}
+
+void path_dbg_think()
+{
+    pathlib_showpath(self);
+    self.nextthink = time + 1;
+}
+#endif
+/**
+    Pathing from 'from' to 'to'
+**/
+entity pathlib_makepath(vector from, vector to,float pathflags,float subpathing_size, float subpathing_bboxexpand,float pathing_method)
+{
+    entity e_start,e_end;
+
+    if(!self.path_validate)
+        self.path_validate = pathlib_stdproc_path_validate;
+
+
+    if(subpathing_size < 10)
+        subpathing_size = 500;
+
+    if(subpathing_bboxexpand < 1)
+        subpathing_bboxexpand = 1;
+
+    if(pathflags & PFL_GROUNDSNAP)
+    {
+        from = pathlib_groundsnap(from);
+        to = pathlib_groundsnap(to);
+    }
+
+    e_start = pathlib_createpoint(world,world,world,from);
+    e_start.path_flags = pathflags;
+
+    e_start.path_subpathing_size = subpathing_size;
+    e_start.path_subpathing_bboxexpand = subpathing_bboxexpand;
+
+    e_start.owner = e_start;
+
+    e_end = pathlib_createpoint(e_start,world,e_start,to);
+    e_start.path_next = e_end;
+    e_start.cnt = 0;
+
+    if(!pathlib_path(e_start,e_end,pathing_method))
+    {
+        bprint("Fail, Fail, Fail!\n");
+        pathlib_deletepath(e_start);
+        remove(e_start);
+
+        return world;
+    }
+
+    pathlib_path_optimize(e_start,e_end);
+
+#ifdef DEBUGPATHING
+    e_start.think = path_dbg_think;
+    e_start.nextthink = time + 1;
+#endif
+
+    return e_start;
+
+}
+
+/*
+.entity goalcurrent, goalstack01, goalstack02, goalstack03;
+.entity goalstack04, goalstack05, goalstack06, goalstack07;
+.entity goalstack08, goalstack09, goalstack10, goalstack11;
+.entity goalstack12, goalstack13, goalstack14, goalstack15;
+.entity goalstack16, goalstack17, goalstack18, goalstack19;
+.entity goalstack20, goalstack21, goalstack22, goalstack23;
+.entity goalstack24, goalstack25, goalstack26, goalstack27;
+.entity goalstack28, goalstack29, goalstack30, goalstack31;
+*/
+
+#define node_left  goalstack01
+#define node_right goalstack02
+#define node_front goalstack03
+#define node_back  goalstack04
+
+#define node_open    goalstack05
+#define node_closed  goalstack06
+#define node_blocked goalstack07
+
+
+
+float pointinbox(vector point,vector box,float ssize)
+{
+    return 0;
+}
+#ifdef DEBUGPATHING
+
+/* TESTING */
+void pathlib_test_think()
+{
+    pathlib_showpath(self.enemy);
+
+    self.nextthink = time + 0.5;
+}
+void pathlib_test_dinit()
+{
+    entity path;
+    entity end;
+
+    if(self.target == "")
+    {
+        bprint("^1 ==== ERROR: pathlib_test with no target. ====\n");
+        remove(self);
+        return;
+    }
+
+    end = find(world,targetname,self.target);
+    if(!end)
+    {
+        bprint("^1 ==== ERROR: pathlib_test with no valid target. ====\n");
+        remove(self);
+        return;
+    }
+
+    setsize(self,'-50 -50 0','50 50 50');
+    path = pathlib_makepath(self.origin,end.origin, PFL_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
+
+    if(!path)
+    {
+        bprint("^1 ==== ERROR: pathlib_test pathing fail ====\n");
+        remove(self);
+        return;
+    }
+
+    self.enemy = path;
+    self.think = pathlib_test_think;
+    self.nextthink = time + 0.5;
+
+}
+void spawnfunc_pathlib_test()
+{
+    self.think = pathlib_test_dinit;
+    self.nextthink = time + 2;
+}
+
+#endif

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-03-16 09:12:13 UTC (rev 6191)
@@ -83,6 +83,7 @@
 
 cl_weaponsystem.qc
 w_common.qc
+
 w_laser.qc
 w_shotgun.qc
 w_uzi.qc

Modified: branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,448 +1,448 @@
-/**
-    Uniform pull towards a point
-**/
-vector steerlib_pull(vector point)
-{
-    return normalize(point - self.origin);
-}
-
-/**
-    Uniform push from a point
-**/
-vector steerlib_push(vector point)
-{
-    return normalize(self.origin - point);
-}
-
-/**
-    Pull toward a point, The further away, the stronger the pull.
-**/
-vector steerlib_arrive(vector point,float maximal_distance)
-{
-    float distance;
-    vector direction;
-
-    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
-    direction = normalize(point - self.origin);
-    return  direction * (distance / maximal_distance);
-}
-
-/**
-    Pull toward a point increasing the pull the closer we get
-**/
-vector steerlib_attract(vector point, float maximal_distance)
-{
-    float distance;
-    vector direction;
-
-    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
-    direction = normalize(point - self.origin);
-
-    return  direction * (1-(distance / maximal_distance));
-}
-
-vector steerlib_attract2(vector point, float min_influense,float max_distance,float max_influense)
-{
-    float distance;
-    vector direction;
-    float influense;
-
-    distance  = bound(0.00001,vlen(self.origin - point),max_distance);
-    direction = normalize(point - self.origin);
-
-    influense = 1 - (distance / max_distance);
-    influense = min_influense + (influense * (max_influense - min_influense));
-
-    return  direction * influense;
-}
-
-/*
-vector steerlib_attract2(vector point, float maximal_distance,float min_influense,float max_influense,float distance)
-{
-    //float distance;
-    vector current_direction;
-    vector target_direction;
-    float i_target,i_current;
-
-    if(!distance)
-        distance = vlen(self.origin - point);
-
-    distance = bound(0.001,distance,maximal_distance);
-
-    target_direction = normalize(point - self.origin);
-    current_direction = normalize(self.velocity);
-
-    i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
-    i_current = 1 - i_target;
-
-    // i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
-
-    string s;
-    s = ftos(i_target);
-    bprint("IT: ",s,"\n");
-    s = ftos(i_current);
-    bprint("IC  : ",s,"\n");
-
-    return  normalize((target_direction * i_target) + (current_direction * i_current));
-}
-*/
-/**
-    Move away from a point.
-**/
-vector steerlib_repell(vector point,float maximal_distance)
-{
-    float distance;
-    vector direction;
-
-    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
-    direction = normalize(self.origin - point);
-
-    return  direction * (1-(distance / maximal_distance));
-}
-
-/**
-    Try to keep at ideal_distance away from point
-**/
-vector steerlib_standoff(vector point,float ideal_distance)
-{
-    float distance;
-    vector direction;
-
-    distance = vlen(self.origin - point);
-
-
-    if(distance < ideal_distance)
-    {
-        direction = normalize(self.origin - point);
-        return direction * (distance / ideal_distance);
-    }
-
-    direction = normalize(point - self.origin);
-    return direction * (ideal_distance / distance);
-
-}
-
-/**
-    A random heading in a forward halfcicrle
-
-    use like:
-    self.target = steerlib_waner(256,32,self.target)
-
-    where range is the cicrle radius and tresh is how close we need to be to pick a new heading.
-**/
-vector steerlib_waner(float range,float tresh,vector oldpoint)
-{
-    vector wander_point;
-    wander_point = v_forward - oldpoint;
-
-    if (vlen(wander_point) > tresh)
-        return oldpoint;
-
-    range = bound(0,range,1);
-
-    wander_point = self.origin + v_forward * 128;
-    wander_point = wander_point + randomvec() * (range * 128) - randomvec() * (range * 128);
-
-    return normalize(wander_point - self.origin);
-}
-
-/**
-    Dodge a point. dont work to well.
-**/
-vector steerlib_dodge(vector point,vector dodge_dir,float min_distance)
-{
-    float distance;
-
-    distance = max(vlen(self.origin - point),min_distance);
-
-    return dodge_dir * (min_distance/distance);
-}
-
-/**
-    flocking by .flock_id
-    Group will move towards the unified direction while keeping close to eachother.
-**/
-.float flock_id;
-vector steerlib_flock(float radius, float standoff,float separation_force,float flock_force)
-{
-    entity flock_member;
-    vector push,pull;
-    float ccount;
-
-    flock_member = findradius(self.origin,radius);
-    while(flock_member)
-    {
-        if(flock_member != self)
-        if(flock_member.flock_id == self.flock_id)
-        {
-            ++ccount;
-            push = push + (steerlib_repell(flock_member.origin,standoff) * separation_force);
-            pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity,radius) * flock_force);
-        }
-        flock_member = flock_member.chain;
-    }
-    return push + (pull* (1 / ccount));
-}
-
-/**
-    All members want to be in the center, and keep away from eachother.
-    The furtehr form the center the more they want to be there.
-
-    This results in a aligned movement (?!) much like flocking.
-**/
-vector steerlib_swarm(float radius, float standoff,float separation_force,float swarm_force)
-{
-    entity swarm_member;
-    vector force,center;
-    float ccount;
-
-    swarm_member = findradius(self.origin,radius);
-
-    while(swarm_member)
-    {
-        if(swarm_member.flock_id == self.flock_id)
-        {
-            ++ccount;
-            center = center + swarm_member.origin;
-            force = force + (steerlib_repell(swarm_member.origin,standoff) * separation_force);
-        }
-        swarm_member = swarm_member.chain;
-    }
-
-    center = center * (1 / ccount);
-    force = force + (steerlib_arrive(center,radius) * swarm_force);
-
-    return force;
-}
-
-/**
-    Steer towards the direction least obstructed.
-    Run four tracelines in a forward funnel, bias each diretion negative if something is found there.
-**/
-vector steerlib_traceavoid(float pitch,float length)
-{
-    vector vup_left,vup_right,vdown_left,vdown_right;
-    float fup_left,fup_right,fdown_left,fdown_right;
-    vector upwish,downwish,leftwish,rightwish;
-    vector v_left,v_down;
-
-    v_left = v_right * -1;
-    v_down = v_up * -1;
-
-    vup_left = (v_forward + (v_left * pitch + v_up * pitch)) * length;
-    traceline(self.origin, self.origin +  vup_left,MOVE_NOMONSTERS,self);
-    fup_left = trace_fraction;
-
-    //te_lightning1(world,self.origin, trace_endpos);
-
-    vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length;
-    traceline(self.origin,self.origin + vup_right ,MOVE_NOMONSTERS,self);
-    fup_right = trace_fraction;
-
-    //te_lightning1(world,self.origin, trace_endpos);
-
-    vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length;
-    traceline(self.origin,self.origin + vdown_left,MOVE_NOMONSTERS,self);
-    fdown_left = trace_fraction;
-
-    //te_lightning1(world,self.origin, trace_endpos);
-
-    vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length;
-    traceline(self.origin,self.origin + vdown_right,MOVE_NOMONSTERS,self);
-    fdown_right = trace_fraction;
-
-    //te_lightning1(world,self.origin, trace_endpos);
-
-    upwish    = v_up    * (fup_left   + fup_right);
-    downwish  = v_down  * (fdown_left + fdown_right);
-    leftwish  = v_left  * (fup_left   + fdown_left);
-    rightwish = v_right * (fup_right  + fdown_right);
-
-    return (upwish+leftwish+downwish+rightwish) * 0.25;
-
-}
-
-
-
-//////////////////////////////////////////////
-//     Testting                             //
-// Everything below this point is a mess :D //
-//////////////////////////////////////////////
-//#define TLIBS_TETSLIBS
-#ifdef TLIBS_TETSLIBS
-void flocker_die()
-{
-	sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-
-	pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
-    self.owner.cnt += 1;
-    self.owner = world;
-
-    self.nextthink = time;
-    self.think = SUB_Remove;
-}
-
-
-void flocker_think()
-{
-    vector dodgemove,swarmmove;
-    vector reprellmove,wandermove,newmove;
-
-    self.angles_x = self.angles_x * -1;
-    makevectors(self.angles);
-    self.angles_x = self.angles_x * -1;
-
-    dodgemove   = steerlib_traceavoid(0.35,1000);
-    swarmmove   = steerlib_flock(500,75,700,500);
-    reprellmove = steerlib_repell(self.owner.enemy.origin+self.enemy.velocity,2000) * 700;
-
-    if(vlen(dodgemove) == 0)
-    {
-        self.pos1 = steerlib_waner(0.5,0.1,self.pos1);
-        wandermove  = self.pos1 * 50;
-    }
-    else
-        self.pos1 = normalize(self.velocity);
-
-    dodgemove = dodgemove * vlen(self.velocity) * 5;
-
-    newmove = swarmmove + reprellmove + wandermove + dodgemove;
-    self.velocity = movelib_inertmove_byspeed(newmove,300,0.2,0.9);
-    //self.velocity  = movelib_inertmove(dodgemove,0.65);
-
-    self.velocity = movelib_dragvec(0.01,0.6);
-
-    self.angles = vectoangles(self.velocity);
-
-    if(self.health <= 0)
-        flocker_die();
-    else
-        self.nextthink = time + 0.1;
-}
-
-
-void spawn_flocker()
-{
-    entity flocker;
-
-    flocker = spawn ();
-
-    setorigin(flocker, self.origin + '0 0 32');
-    setmodel (flocker, "models/turrets/rocket.md3");
-    setsize (flocker, '-3 -3 -3', '3 3 3');
-
-    flocker.flock_id   = self.flock_id;
-    flocker.classname  = "flocker";
-    flocker.owner      = self;
-    flocker.think      = flocker_think;
-    flocker.nextthink  = time + random() * 5;
-    flocker.solid      = SOLID_BBOX;
-    flocker.movetype   = MOVETYPE_BOUNCEMISSILE;
-    flocker.effects    = EF_LOWPRECISION;
-    flocker.velocity   = randomvec() * 300;
-    flocker.angles     = vectoangles(flocker.velocity);
-    flocker.health     = 10;
-    flocker.pos1      = normalize(flocker.velocity + randomvec() * 0.1);
-
-    self.cnt = self.cnt -1;
-
-}
-
-void flockerspawn_think()
-{
-
-
-    if(self.cnt > 0)
-        spawn_flocker();
-
-    self.nextthink = time + self.delay;
-
-}
-
-void flocker_hunter_think()
-{
-    vector dodgemove,attractmove,newmove;
-    entity e,ee;
-    float d,bd;
-
-    self.angles_x = self.angles_x * -1;
-    makevectors(self.angles);
-    self.angles_x = self.angles_x * -1;
-
-    if(self.enemy)
-    if(vlen(self.enemy.origin - self.origin) < 64)
-    {
-        ee = self.enemy;
-        ee.health = -1;
-        self.enemy = world;
-
-    }
-
-    if(!self.enemy)
-    {
-        e = findchainfloat(flock_id,self.flock_id);
-        while(e)
-        {
-            d = vlen(self.origin - e.origin);
-
-            if(e != self.owner)
-            if(e != ee)
-            if(d > bd)
-            {
-                self.enemy = e;
-                bd = d;
-            }
-            e = e.chain;
-        }
-    }
-
-    if(self.enemy)
-        attractmove = steerlib_attract(self.enemy.origin+self.enemy.velocity * 0.1,5000) * 1250;
-    else
-        attractmove = normalize(self.velocity) * 200;
-
-    dodgemove = steerlib_traceavoid(0.35,1500) * vlen(self.velocity);
-
-    newmove = dodgemove + attractmove;
-    self.velocity = movelib_inertmove_byspeed(newmove,1250,0.3,0.7);
-    self.velocity = movelib_dragvec(0.01,0.5);
-
-
-    self.angles = vectoangles(self.velocity);
-    self.nextthink = time + 0.1;
-}
-
-
-float globflockcnt;
-void spawnfunc_flockerspawn()
-{
-    precache_model ( "models/turrets/rocket.md3");
-    precache_model("models/turrets/c512.md3");
-    ++globflockcnt;
-
-    if(!self.cnt)      self.cnt = 20;
-    if(!self.delay)    self.delay = 0.25;
-    if(!self.flock_id) self.flock_id = globflockcnt;
-
-    self.think     = flockerspawn_think;
-    self.nextthink = time + 0.25;
-
-    self.enemy = spawn();
-
-    setmodel(self.enemy, "models/turrets/rocket.md3");
-    setorigin(self.enemy,self.origin + '0 0 768' + (randomvec() * 128));
-
-    self.enemy.classname = "FLock Hunter";
-    self.enemy.scale     = 3;
-    self.enemy.effects   = EF_LOWPRECISION;
-    self.enemy.movetype  = MOVETYPE_BOUNCEMISSILE;
-    self.enemy.solid     = SOLID_BBOX;
-    self.enemy.think     = flocker_hunter_think;
-    self.enemy.nextthink = time + 10;
-    self.enemy.flock_id  = self.flock_id;
-    self.enemy.owner     = self;
-}
-#endif
-
-
+/**
+    Uniform pull towards a point
+**/
+vector steerlib_pull(vector point)
+{
+    return normalize(point - self.origin);
+}
+
+/**
+    Uniform push from a point
+**/
+vector steerlib_push(vector point)
+{
+    return normalize(self.origin - point);
+}
+
+/**
+    Pull toward a point, The further away, the stronger the pull.
+**/
+vector steerlib_arrive(vector point,float maximal_distance)
+{
+    float distance;
+    vector direction;
+
+    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
+    direction = normalize(point - self.origin);
+    return  direction * (distance / maximal_distance);
+}
+
+/**
+    Pull toward a point increasing the pull the closer we get
+**/
+vector steerlib_attract(vector point, float maximal_distance)
+{
+    float distance;
+    vector direction;
+
+    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
+    direction = normalize(point - self.origin);
+
+    return  direction * (1-(distance / maximal_distance));
+}
+
+vector steerlib_attract2(vector point, float min_influense,float max_distance,float max_influense)
+{
+    float distance;
+    vector direction;
+    float influense;
+
+    distance  = bound(0.00001,vlen(self.origin - point),max_distance);
+    direction = normalize(point - self.origin);
+
+    influense = 1 - (distance / max_distance);
+    influense = min_influense + (influense * (max_influense - min_influense));
+
+    return  direction * influense;
+}
+
+/*
+vector steerlib_attract2(vector point, float maximal_distance,float min_influense,float max_influense,float distance)
+{
+    //float distance;
+    vector current_direction;
+    vector target_direction;
+    float i_target,i_current;
+
+    if(!distance)
+        distance = vlen(self.origin - point);
+
+    distance = bound(0.001,distance,maximal_distance);
+
+    target_direction = normalize(point - self.origin);
+    current_direction = normalize(self.velocity);
+
+    i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
+    i_current = 1 - i_target;
+
+    // i_target = bound(min_influense,(1-(distance / maximal_distance)),max_influense);
+
+    string s;
+    s = ftos(i_target);
+    bprint("IT: ",s,"\n");
+    s = ftos(i_current);
+    bprint("IC  : ",s,"\n");
+
+    return  normalize((target_direction * i_target) + (current_direction * i_current));
+}
+*/
+/**
+    Move away from a point.
+**/
+vector steerlib_repell(vector point,float maximal_distance)
+{
+    float distance;
+    vector direction;
+
+    distance = bound(0.001,vlen(self.origin - point),maximal_distance);
+    direction = normalize(self.origin - point);
+
+    return  direction * (1-(distance / maximal_distance));
+}
+
+/**
+    Try to keep at ideal_distance away from point
+**/
+vector steerlib_standoff(vector point,float ideal_distance)
+{
+    float distance;
+    vector direction;
+
+    distance = vlen(self.origin - point);
+
+
+    if(distance < ideal_distance)
+    {
+        direction = normalize(self.origin - point);
+        return direction * (distance / ideal_distance);
+    }
+
+    direction = normalize(point - self.origin);
+    return direction * (ideal_distance / distance);
+
+}
+
+/**
+    A random heading in a forward halfcicrle
+
+    use like:
+    self.target = steerlib_waner(256,32,self.target)
+
+    where range is the cicrle radius and tresh is how close we need to be to pick a new heading.
+**/
+vector steerlib_waner(float range,float tresh,vector oldpoint)
+{
+    vector wander_point;
+    wander_point = v_forward - oldpoint;
+
+    if (vlen(wander_point) > tresh)
+        return oldpoint;
+
+    range = bound(0,range,1);
+
+    wander_point = self.origin + v_forward * 128;
+    wander_point = wander_point + randomvec() * (range * 128) - randomvec() * (range * 128);
+
+    return normalize(wander_point - self.origin);
+}
+
+/**
+    Dodge a point. dont work to well.
+**/
+vector steerlib_dodge(vector point,vector dodge_dir,float min_distance)
+{
+    float distance;
+
+    distance = max(vlen(self.origin - point),min_distance);
+
+    return dodge_dir * (min_distance/distance);
+}
+
+/**
+    flocking by .flock_id
+    Group will move towards the unified direction while keeping close to eachother.
+**/
+.float flock_id;
+vector steerlib_flock(float radius, float standoff,float separation_force,float flock_force)
+{
+    entity flock_member;
+    vector push,pull;
+    float ccount;
+
+    flock_member = findradius(self.origin,radius);
+    while(flock_member)
+    {
+        if(flock_member != self)
+        if(flock_member.flock_id == self.flock_id)
+        {
+            ++ccount;
+            push = push + (steerlib_repell(flock_member.origin,standoff) * separation_force);
+            pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity,radius) * flock_force);
+        }
+        flock_member = flock_member.chain;
+    }
+    return push + (pull* (1 / ccount));
+}
+
+/**
+    All members want to be in the center, and keep away from eachother.
+    The furtehr form the center the more they want to be there.
+
+    This results in a aligned movement (?!) much like flocking.
+**/
+vector steerlib_swarm(float radius, float standoff,float separation_force,float swarm_force)
+{
+    entity swarm_member;
+    vector force,center;
+    float ccount;
+
+    swarm_member = findradius(self.origin,radius);
+
+    while(swarm_member)
+    {
+        if(swarm_member.flock_id == self.flock_id)
+        {
+            ++ccount;
+            center = center + swarm_member.origin;
+            force = force + (steerlib_repell(swarm_member.origin,standoff) * separation_force);
+        }
+        swarm_member = swarm_member.chain;
+    }
+
+    center = center * (1 / ccount);
+    force = force + (steerlib_arrive(center,radius) * swarm_force);
+
+    return force;
+}
+
+/**
+    Steer towards the direction least obstructed.
+    Run four tracelines in a forward funnel, bias each diretion negative if something is found there.
+**/
+vector steerlib_traceavoid(float pitch,float length)
+{
+    vector vup_left,vup_right,vdown_left,vdown_right;
+    float fup_left,fup_right,fdown_left,fdown_right;
+    vector upwish,downwish,leftwish,rightwish;
+    vector v_left,v_down;
+
+    v_left = v_right * -1;
+    v_down = v_up * -1;
+
+    vup_left = (v_forward + (v_left * pitch + v_up * pitch)) * length;
+    traceline(self.origin, self.origin +  vup_left,MOVE_NOMONSTERS,self);
+    fup_left = trace_fraction;
+
+    //te_lightning1(world,self.origin, trace_endpos);
+
+    vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length;
+    traceline(self.origin,self.origin + vup_right ,MOVE_NOMONSTERS,self);
+    fup_right = trace_fraction;
+
+    //te_lightning1(world,self.origin, trace_endpos);
+
+    vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length;
+    traceline(self.origin,self.origin + vdown_left,MOVE_NOMONSTERS,self);
+    fdown_left = trace_fraction;
+
+    //te_lightning1(world,self.origin, trace_endpos);
+
+    vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length;
+    traceline(self.origin,self.origin + vdown_right,MOVE_NOMONSTERS,self);
+    fdown_right = trace_fraction;
+
+    //te_lightning1(world,self.origin, trace_endpos);
+
+    upwish    = v_up    * (fup_left   + fup_right);
+    downwish  = v_down  * (fdown_left + fdown_right);
+    leftwish  = v_left  * (fup_left   + fdown_left);
+    rightwish = v_right * (fup_right  + fdown_right);
+
+    return (upwish+leftwish+downwish+rightwish) * 0.25;
+
+}
+
+
+
+//////////////////////////////////////////////
+//     Testting                             //
+// Everything below this point is a mess :D //
+//////////////////////////////////////////////
+//#define TLIBS_TETSLIBS
+#ifdef TLIBS_TETSLIBS
+void flocker_die()
+{
+	sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+
+	pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+
+    self.owner.cnt += 1;
+    self.owner = world;
+
+    self.nextthink = time;
+    self.think = SUB_Remove;
+}
+
+
+void flocker_think()
+{
+    vector dodgemove,swarmmove;
+    vector reprellmove,wandermove,newmove;
+
+    self.angles_x = self.angles_x * -1;
+    makevectors(self.angles);
+    self.angles_x = self.angles_x * -1;
+
+    dodgemove   = steerlib_traceavoid(0.35,1000);
+    swarmmove   = steerlib_flock(500,75,700,500);
+    reprellmove = steerlib_repell(self.owner.enemy.origin+self.enemy.velocity,2000) * 700;
+
+    if(vlen(dodgemove) == 0)
+    {
+        self.pos1 = steerlib_waner(0.5,0.1,self.pos1);
+        wandermove  = self.pos1 * 50;
+    }
+    else
+        self.pos1 = normalize(self.velocity);
+
+    dodgemove = dodgemove * vlen(self.velocity) * 5;
+
+    newmove = swarmmove + reprellmove + wandermove + dodgemove;
+    self.velocity = movelib_inertmove_byspeed(newmove,300,0.2,0.9);
+    //self.velocity  = movelib_inertmove(dodgemove,0.65);
+
+    self.velocity = movelib_dragvec(0.01,0.6);
+
+    self.angles = vectoangles(self.velocity);
+
+    if(self.health <= 0)
+        flocker_die();
+    else
+        self.nextthink = time + 0.1;
+}
+
+
+void spawn_flocker()
+{
+    entity flocker;
+
+    flocker = spawn ();
+
+    setorigin(flocker, self.origin + '0 0 32');
+    setmodel (flocker, "models/turrets/rocket.md3");
+    setsize (flocker, '-3 -3 -3', '3 3 3');
+
+    flocker.flock_id   = self.flock_id;
+    flocker.classname  = "flocker";
+    flocker.owner      = self;
+    flocker.think      = flocker_think;
+    flocker.nextthink  = time + random() * 5;
+    flocker.solid      = SOLID_BBOX;
+    flocker.movetype   = MOVETYPE_BOUNCEMISSILE;
+    flocker.effects    = EF_LOWPRECISION;
+    flocker.velocity   = randomvec() * 300;
+    flocker.angles     = vectoangles(flocker.velocity);
+    flocker.health     = 10;
+    flocker.pos1      = normalize(flocker.velocity + randomvec() * 0.1);
+
+    self.cnt = self.cnt -1;
+
+}
+
+void flockerspawn_think()
+{
+
+
+    if(self.cnt > 0)
+        spawn_flocker();
+
+    self.nextthink = time + self.delay;
+
+}
+
+void flocker_hunter_think()
+{
+    vector dodgemove,attractmove,newmove;
+    entity e,ee;
+    float d,bd;
+
+    self.angles_x = self.angles_x * -1;
+    makevectors(self.angles);
+    self.angles_x = self.angles_x * -1;
+
+    if(self.enemy)
+    if(vlen(self.enemy.origin - self.origin) < 64)
+    {
+        ee = self.enemy;
+        ee.health = -1;
+        self.enemy = world;
+
+    }
+
+    if(!self.enemy)
+    {
+        e = findchainfloat(flock_id,self.flock_id);
+        while(e)
+        {
+            d = vlen(self.origin - e.origin);
+
+            if(e != self.owner)
+            if(e != ee)
+            if(d > bd)
+            {
+                self.enemy = e;
+                bd = d;
+            }
+            e = e.chain;
+        }
+    }
+
+    if(self.enemy)
+        attractmove = steerlib_attract(self.enemy.origin+self.enemy.velocity * 0.1,5000) * 1250;
+    else
+        attractmove = normalize(self.velocity) * 200;
+
+    dodgemove = steerlib_traceavoid(0.35,1500) * vlen(self.velocity);
+
+    newmove = dodgemove + attractmove;
+    self.velocity = movelib_inertmove_byspeed(newmove,1250,0.3,0.7);
+    self.velocity = movelib_dragvec(0.01,0.5);
+
+
+    self.angles = vectoangles(self.velocity);
+    self.nextthink = time + 0.1;
+}
+
+
+float globflockcnt;
+void spawnfunc_flockerspawn()
+{
+    precache_model ( "models/turrets/rocket.md3");
+    precache_model("models/turrets/c512.md3");
+    ++globflockcnt;
+
+    if(!self.cnt)      self.cnt = 20;
+    if(!self.delay)    self.delay = 0.25;
+    if(!self.flock_id) self.flock_id = globflockcnt;
+
+    self.think     = flockerspawn_think;
+    self.nextthink = time + 0.25;
+
+    self.enemy = spawn();
+
+    setmodel(self.enemy, "models/turrets/rocket.md3");
+    setorigin(self.enemy,self.origin + '0 0 768' + (randomvec() * 128));
+
+    self.enemy.classname = "FLock Hunter";
+    self.enemy.scale     = 3;
+    self.enemy.effects   = EF_LOWPRECISION;
+    self.enemy.movetype  = MOVETYPE_BOUNCEMISSILE;
+    self.enemy.solid     = SOLID_BBOX;
+    self.enemy.think     = flocker_hunter_think;
+    self.enemy.nextthink = time + 10;
+    self.enemy.flock_id  = self.flock_id;
+    self.enemy.owner     = self;
+}
+#endif
+
+

Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -134,6 +134,9 @@
 void StartFrame (void)
 {
 	remove = remove_unsafely; // not during spawning!
+	serverprevtime = servertime;
+	servertime = time;
+	serverframetime = frametime;
 
 	dprint_load(); // load dprint status from cvar
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -473,12 +473,18 @@
 
 		weaponsInMap |= weaponid;
 
-		if(g_lms || g_weaponarena)
+		if(g_lms)
 		{
 			startitem_failed = TRUE;
 			remove(self);
 			return;
 		}
+		else if (g_weaponarena && ((weaponid & WEPBIT_ALL) || (itemid & IT_AMMO)))
+		{
+			startitem_failed = TRUE;
+			remove(self);
+			return;
+		}
 		else if (g_minstagib)
 		{
 			// don't remove dropped items and powerups

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_quake3.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_quake3.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_quake3.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -35,9 +35,9 @@
                           
 // Armor                  
 void spawnfunc_item_armor_body()     { spawnfunc_item_armor_large();   }
-void spawnfunc_item_armor_combat()   { spawnfunc_item_armor_big();  }
+void spawnfunc_item_armor_combat()   { spawnfunc_item_armor_big();     }
 void spawnfunc_item_armor_shard()    { spawnfunc_item_armor_small();   }
-void spawnfunc_item_enviro()         { spawnfunc_item_armor_medium();  }
+void spawnfunc_item_enviro()         { spawnfunc_item_invincible();    }
 //void spawnfunc_item_flight()       /* not supported */
 //void spawnfunc_item_haste()        /* not supported */
 //void spawnfunc_item_health()       /* handled in t_quake.qc */

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -22,7 +22,7 @@
 	
 	if (self.weaponentity)
 	{
-		if (self.weaponentity.frame == WFRAME_RELOAD)
+		if (self.weaponentity.wframe == WFRAME_RELOAD)
 			return;
 
 		// allow to switch away while reloading, but this will cause a new reload!
@@ -51,7 +51,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_nails -= pAmmo;
 
-	W_SetupShot (self, '41 7 -10.5', FALSE, 2, "weapons/campingrifle_fire.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/campingrifle_fire.wav");
 	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
 
 	if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
@@ -63,7 +63,7 @@
 	fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
 
 	if (cvar("g_casings") >= 2)
-		SpawnCasing (w_shotorg - v_forward * 15, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
+		SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
 	
 	self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
 }
@@ -137,7 +137,7 @@
 	{		
 		precache_model ("models/weapons/g_campingrifle.md3");
 		precache_model ("models/weapons/v_campingrifle.md3");
-		precache_model ("models/weapons/w_campingrifle.zym");
+		precache_model ("models/weapons/h_campingrifle.dpm");
 		precache_sound ("weapons/campingrifle_reload.wav");
 		precache_sound ("weapons/campingrifle_fire.wav");
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -66,7 +66,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
 
-	W_SetupShot (self, '23 8 -10', FALSE, 2, "weapons/crylink_fire.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav");
 	forward = v_forward;
 	right = v_right;
 	up = v_up;
@@ -132,7 +132,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
 
-	W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire2.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav");
 
 	shots = cvar("g_balance_crylink_secondary_shots");
 	pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
@@ -180,7 +180,7 @@
 {
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
-	W_SetupShot (self, '25 8 -8', TRUE, 0, "weapons/crylink_fire.wav");
+	W_SetupShot (self, TRUE, 0, "weapons/crylink_fire.wav");
 
 	traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self, self.ping * 0.001);
 
@@ -226,7 +226,7 @@
 	{
 		precache_model ("models/weapons/g_crylink.md3");
 		precache_model ("models/weapons/v_crylink.md3");
-		precache_model ("models/weapons/w_crylink.zym");
+		precache_model ("models/weapons/h_crylink.dpm");
 		precache_sound ("weapons/crylink_fire.wav");
 		precache_sound ("weapons/crylink_fire2.wav");
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -72,7 +72,7 @@
 {
 	local entity proj;
 
-	W_SetupShot (self, '24 8 -9.5', FALSE, 2, "weapons/electro_fire.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/electro_fire.wav");
 
 	pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -107,7 +107,7 @@
 {
 	local entity proj;
 
-	W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/electro_fire2.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/electro_fire2.wav");
 
 	pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -199,7 +199,7 @@
 	{
 		precache_model ("models/weapons/g_electro.md3");
 		precache_model ("models/weapons/v_electro.md3");
-		precache_model ("models/weapons/w_electro.zym");
+		precache_model ("models/weapons/h_electro.dpm");
 		precache_sound ("weapons/electro_bounce.wav");
 		precache_sound ("weapons/electro_fire.wav");
 		precache_sound ("weapons/electro_fire2.wav");

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -77,7 +77,7 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo");
-	W_SetupShot (self, '24 8 -10', FALSE, 4, "weapons/grenade_fire.wav");
+	W_SetupShot (self, FALSE, 4, "weapons/grenade_fire.wav");
 
 	pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -110,8 +110,8 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo");
-	W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
-	//W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
+	W_SetupShot (self, FALSE, 4, "weapons/grenade_fire.wav");
+	//W_SetupShot (self, FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
 
 	pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -191,7 +191,7 @@
 	{
 		precache_model ("models/weapons/g_gl.md3");
 		precache_model ("models/weapons/v_gl.md3");
-		precache_model ("models/weapons/w_gl.zym");
+		precache_model ("models/weapons/h_gl.dpm");
 		precache_sound ("weapons/grenade_bounce1.wav");
 		precache_sound ("weapons/grenade_bounce2.wav");
 		precache_sound ("weapons/grenade_bounce3.wav");

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -51,7 +51,7 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_primary_ammo");
-	W_SetupShot (self, '22 8 -10', FALSE, 2, "weapons/hagar_fire.wav");
+	W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav");
 
 	pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -88,8 +88,8 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_secondary_ammo");
-	W_SetupShot (self, '25 5 -8', FALSE, 2, "weapons/hagar_fire.wav");
-	//W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/hagar_fire.wav"); // TODO: move model a little to the right
+	W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav");
+	//W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav"); // TODO: move model a little to the right
 
 	pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -156,7 +156,7 @@
 	{
 		precache_model ("models/weapons/g_hagar.md3");
 		precache_model ("models/weapons/v_hagar.md3");
-		precache_model ("models/weapons/w_hagar.zym");
+		precache_model ("models/weapons/h_hagar.dpm");
 		precache_sound ("weapons/hagar_fire.wav");
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,216 +1,216 @@
-.float HLAC_bulletcounter;
-void W_HLAC_Touch (void)
-{
-	PROJECTILE_TOUCH;
-
-	self.event_damage = SUB_Null;
-
-    RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
-
-	remove (self);
-}
-
-void W_HLAC_Touch2 (void)
-{
-	PROJECTILE_TOUCH;
-
-	self.event_damage = SUB_Null;
-
-    RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
-
-	remove (self);
-}
-
-void W_HLAC_Attack (void)
-{
-	local entity missile;
-    float spread;
-
-    if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-    {
-        self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_primary_ammo");
-    }
-
-    spread = cvar("g_balance_hlac_primary_spread_min") + (cvar("g_balance_hlac_primary_spread_add") * self.HLAC_bulletcounter);
-    spread = min(spread,cvar("g_balance_hlac_primary_spread_max"));
-    if(self.crouch)
-        spread = spread * cvar("g_balance_hlac_primary_spread_crouchmod");
-
-	W_SetupShot (self, '24 8 -11', FALSE, 3, "weapons/lasergun_fire.wav");
-	pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-	if (!g_norecoil)
-	{
-		self.punchangle_x = random () - 0.5;
-		self.punchangle_y = random () - 0.5;
-	}
-
-	missile = spawn ();
-	missile.owner = self;
-	missile.classname = "hlacbolt";
-	// missile.dmg = issecondary;
-	missile.bot_dodge = TRUE;
-
-    missile.bot_dodgerating = cvar("g_balance_hlac_primary_damage");
-
-	missile.movetype = MOVETYPE_FLY;
-	missile.solid = SOLID_BBOX;
-
-	setorigin (missile, w_shotorg);
-
-    missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_primary_speed");
-
-	W_SetupProjectileVelocity(missile);
-	missile.angles = vectoangles (missile.velocity);
-
-	missile.touch = W_HLAC_Touch;
-	missile.think = SUB_Remove;
-
-    missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");
-
-	missile.flags = FL_PROJECTILE;
-	missile.projectiledeathtype = WEP_HLAC;
-
-	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
-}
-
-void W_HLAC_Attack2f (void)
-{
-	local entity missile;
-    float spread;
-
-    spread = cvar("g_balance_hlac_secondary_spread");
-
-
-    if(self.crouch)
-        spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");
-
-	W_SetupShot (self, '25 8 -8', FALSE, 3, "weapons/lasergun_fire.wav");
-	pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-
-	missile = spawn ();
-	missile.owner = self;
-	missile.classname = "hlacbolt";
-	// missile.dmg = issecondary;
-	missile.bot_dodge = TRUE;
-
-    missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");
-
-	missile.movetype = MOVETYPE_FLY;
-	missile.solid = SOLID_BBOX;
-
-	setorigin (missile, w_shotorg);
-
-    missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_secondary_speed");
-
-	W_SetupProjectileVelocity(missile);
-	missile.angles = vectoangles (missile.velocity);
-
-	missile.touch = W_HLAC_Touch2;
-	missile.think = SUB_Remove;
-
-    missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");
-
-	missile.flags = FL_PROJECTILE;
-	missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
-
-	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
-}
-
-void W_HLAC_Attack2 (void)
-{
-    float i;
-
-    if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-    {
-        self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");
-    }
-
-    for(i=cvar("g_balance_hlac_secondary_shots");i>0;--i)
-        W_HLAC_Attack2f();
-
-	if (!g_norecoil)
-	{
-		self.punchangle_x = random () - 0.5;
-		self.punchangle_y = random () - 0.5;
-	}
-
-	// ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_secondary_refire");
-}
-
-
-// weapon frames
-void HLAC_fire1_02()
-{
-	if(self.weapon != self.switchweapon) // abort immediately if switching
-	{
-		w_ready();
-		return;
-	}
-
-	if (self.BUTTON_ATCK)
-	{
-		if (!weapon_action(self.weapon, WR_CHECKAMMO1))
-		{
-			W_SwitchWeapon_Force(self, w_getbestweapon(self));
-			w_ready();
-			return;
-		}
-
-		ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire");
-		W_HLAC_Attack();
-		self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;
-        weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
-	}
-	else
-	{
-		weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);
-	}
-};
-
-void spawnfunc_weapon_hlac (void)
-{
-	weapon_defaultspawnfunc(WEP_HLAC);
-}
-
-float w_hlac(float req)
-{
-	if (req == WR_AIM)
-        self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);
-	else if (req == WR_THINK)
-	{
-		if (self.BUTTON_ATCK)
-		if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))
-		{
-			self.HLAC_bulletcounter = 0;
-			W_HLAC_Attack();
-			weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
-		}
-
-		if (self.BUTTON_ATCK2)
-		if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))
-		{
-			W_HLAC_Attack2();
-			weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);
-		}
-
-	}
-	else if (req == WR_PRECACHE)
-	{
-        precache_model ("models/weapons/g_hlac.md3");
-		precache_model ("models/weapons/v_hlac.md3");
-		precache_model ("models/weapons/w_hlac.zym");
-		precache_sound ("weapons/lasergun_fire.wav");
-
-	}
-	else if (req == WR_SETUP)
-		weapon_setup(WEP_HLAC);
-	else if (req == WR_CHECKAMMO1)
-		return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");
-	else if (req == WR_CHECKAMMO2)
-		return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");
-	else if (req == WR_SUICIDEMESSAGE)
-		w_deathtypestring = "should have used a smaller gun";
-	else if (req == WR_KILLMESSAGE)
-		w_deathtypestring = "was cut down by";
-	return TRUE;
-};
+.float HLAC_bulletcounter;
+void W_HLAC_Touch (void)
+{
+	PROJECTILE_TOUCH;
+
+	self.event_damage = SUB_Null;
+
+    RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
+
+	remove (self);
+}
+
+void W_HLAC_Touch2 (void)
+{
+	PROJECTILE_TOUCH;
+
+	self.event_damage = SUB_Null;
+
+    RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
+
+	remove (self);
+}
+
+void W_HLAC_Attack (void)
+{
+	local entity missile;
+    float spread;
+
+    if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+    {
+        self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_primary_ammo");
+    }
+
+    spread = cvar("g_balance_hlac_primary_spread_min") + (cvar("g_balance_hlac_primary_spread_add") * self.HLAC_bulletcounter);
+    spread = min(spread,cvar("g_balance_hlac_primary_spread_max"));
+    if(self.crouch)
+        spread = spread * cvar("g_balance_hlac_primary_spread_crouchmod");
+
+	W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav");
+	pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	missile = spawn ();
+	missile.owner = self;
+	missile.classname = "hlacbolt";
+	// missile.dmg = issecondary;
+	missile.bot_dodge = TRUE;
+
+    missile.bot_dodgerating = cvar("g_balance_hlac_primary_damage");
+
+	missile.movetype = MOVETYPE_FLY;
+	missile.solid = SOLID_BBOX;
+
+	setorigin (missile, w_shotorg);
+
+    missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_primary_speed");
+
+	W_SetupProjectileVelocity(missile);
+	missile.angles = vectoangles (missile.velocity);
+
+	missile.touch = W_HLAC_Touch;
+	missile.think = SUB_Remove;
+
+    missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");
+
+	missile.flags = FL_PROJECTILE;
+	missile.projectiledeathtype = WEP_HLAC;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
+}
+
+void W_HLAC_Attack2f (void)
+{
+	local entity missile;
+    float spread;
+
+    spread = cvar("g_balance_hlac_secondary_spread");
+
+
+    if(self.crouch)
+        spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");
+
+	W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav");
+	pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	missile = spawn ();
+	missile.owner = self;
+	missile.classname = "hlacbolt";
+	// missile.dmg = issecondary;
+	missile.bot_dodge = TRUE;
+
+    missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");
+
+	missile.movetype = MOVETYPE_FLY;
+	missile.solid = SOLID_BBOX;
+
+	setorigin (missile, w_shotorg);
+
+    missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_secondary_speed");
+
+	W_SetupProjectileVelocity(missile);
+	missile.angles = vectoangles (missile.velocity);
+
+	missile.touch = W_HLAC_Touch2;
+	missile.think = SUB_Remove;
+
+    missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");
+
+	missile.flags = FL_PROJECTILE;
+	missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
+}
+
+void W_HLAC_Attack2 (void)
+{
+    float i;
+
+    if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+    {
+        self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");
+    }
+
+    for(i=cvar("g_balance_hlac_secondary_shots");i>0;--i)
+        W_HLAC_Attack2f();
+
+	if (!g_norecoil)
+	{
+		self.punchangle_x = random () - 0.5;
+		self.punchangle_y = random () - 0.5;
+	}
+
+	// ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_secondary_refire");
+}
+
+
+// weapon frames
+void HLAC_fire1_02()
+{
+	if(self.weapon != self.switchweapon) // abort immediately if switching
+	{
+		w_ready();
+		return;
+	}
+
+	if (self.BUTTON_ATCK)
+	{
+		if (!weapon_action(self.weapon, WR_CHECKAMMO1))
+		{
+			W_SwitchWeapon_Force(self, w_getbestweapon(self));
+			w_ready();
+			return;
+		}
+
+		ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire");
+		W_HLAC_Attack();
+		self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;
+        weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
+	}
+	else
+	{
+		weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);
+	}
+};
+
+void spawnfunc_weapon_hlac (void)
+{
+	weapon_defaultspawnfunc(WEP_HLAC);
+}
+
+float w_hlac(float req)
+{
+	if (req == WR_AIM)
+        self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);
+	else if (req == WR_THINK)
+	{
+		if (self.BUTTON_ATCK)
+		if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))
+		{
+			self.HLAC_bulletcounter = 0;
+			W_HLAC_Attack();
+			weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
+		}
+
+		if (self.BUTTON_ATCK2)
+		if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))
+		{
+			W_HLAC_Attack2();
+			weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);
+		}
+
+	}
+	else if (req == WR_PRECACHE)
+	{
+        precache_model ("models/weapons/g_hlac.md3");
+		precache_model ("models/weapons/v_hlac.md3");
+		precache_model ("models/weapons/h_hlac.dpm");
+		precache_sound ("weapons/lasergun_fire.wav");
+
+	}
+	else if (req == WR_SETUP)
+		weapon_setup(WEP_HLAC);
+	else if (req == WR_CHECKAMMO1)
+		return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");
+	else if (req == WR_CHECKAMMO2)
+		return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = "should have used a smaller gun";
+	else if (req == WR_KILLMESSAGE)
+		w_deathtypestring = "was cut down by";
+	return TRUE;
+};

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -60,7 +60,7 @@
 
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_cells = self.ammo_cells - cvar("g_balance_hook_secondary_ammo");
-	W_SetupShot (self, '21 8 -8.5', FALSE, 4, "weapons/hookbomb_fire.wav");
+	W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav");
 
 	gren = spawn ();
 	gren.owner = self;
@@ -204,7 +204,7 @@
 	{
 		precache_model ("models/weapons/g_hookgun.md3");
 		precache_model ("models/weapons/v_hookgun.md3");
-		precache_model ("models/weapons/w_hookgun.zym");
+		precache_model ("models/weapons/h_hookgun.dpm");
 		precache_sound ("weapons/hook_impact.wav"); // done by g_hook.qc
 		precache_sound ("weapons/hook_fire.wav");
 		precache_sound ("weapons/hookbomb_fire.wav");

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_laser.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -17,7 +17,7 @@
 {
 	local entity missile;
 
-	W_SetupShot (self, '21 8 -9', FALSE, 3, "weapons/lasergun_fire.wav");
+	W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav");
 	pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
 	missile = spawn ();
@@ -110,7 +110,7 @@
 	{
 		precache_model ("models/weapons/g_laser.md3");
 		precache_model ("models/weapons/v_laser.md3");
-		precache_model ("models/weapons/w_laser.zym");
+		precache_model ("models/weapons/h_laser.dpm");
 		precache_sound ("weapons/lasergun_fire.wav");
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -5,7 +5,7 @@
 	float flying;
 	flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
 
-	W_SetupShot (self, '25 8 -4', TRUE, 5, "weapons/minstanexfire.wav");
+	W_SetupShot (self, TRUE, 5, "weapons/minstanexfire.wav");
 
 	yoda = 0;
 	damage_goodhits = 0;
@@ -161,7 +161,7 @@
 		precache_model ("models/nexflash.md3");
 		precache_model ("models/weapons/g_minstanex.md3");
 		precache_model ("models/weapons/v_minstanex.md3");
-		precache_model ("models/weapons/w_minstanex.zym");
+		precache_model ("models/weapons/h_minstanex.dpm");
 		precache_sound ("weapons/minstanexfire.wav");
 		w_laser(WR_PRECACHE);
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -15,7 +15,7 @@
 	float flying;
 	flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
 
-	W_SetupShot (self, '33 8 -9', TRUE, 5, "weapons/nexfire.wav");
+	W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav");
 
 	yoda = 0;
 	FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, cvar("g_balance_nex_damage"), cvar("g_balance_nex_force"), WEP_NEX);
@@ -56,7 +56,7 @@
 		precache_model ("models/nexflash.md3");
 		precache_model ("models/weapons/g_nex.md3");
 		precache_model ("models/weapons/v_nex.md3");
-		precache_model ("models/weapons/w_nex.zym");
+		precache_model ("models/weapons/h_nex.dpm");
 		precache_sound ("weapons/nexfire.wav");
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -156,7 +156,10 @@
 
 	if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
 		self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
-	W_SetupShot (self, '0 0 0', FALSE, 4, "porto/fire.wav");
+	W_SetupShot (self, FALSE, 4, "porto/fire.wav");
+	// always shoot from the eye
+	w_shotdir = v_forward;
+	w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
 
 	//pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -248,7 +251,7 @@
 	{
 		precache_model ("models/weapons/g_porto.md3");
 		precache_model ("models/weapons/v_porto.md3");
-		precache_model ("models/weapons/w_porto.zym");
+		precache_model ("models/weapons/h_porto.dpm");
 		precache_model ("models/portal.md3");
 		precache_sound ("porto/bounce.wav");
 		precache_sound ("porto/create.wav");

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -198,7 +198,7 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_rocketlauncher_ammo");
 
-	W_SetupShot (self, '27.0 8 -10.0', FALSE, 5, "weapons/rocket_fire.wav");
+	W_SetupShot (self, FALSE, 5, "weapons/rocket_fire.wav");
 	pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
 	missile = spawn ();
@@ -246,7 +246,7 @@
 	flash.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
 	setorigin (flash, '5 0 0');
 	setmodel (flash, "models/flash.md3"); // precision set below
-	setattachment(flash, self.weaponentity, "bone02");
+	setattachment(flash, self.weaponentity, "shot");
 	SUB_SetFade (flash, time, 0.1);
 
 	// muzzle flash for 3rd person view
@@ -431,7 +431,7 @@
 		precache_model ("models/flash.md3");
 		precache_model ("models/weapons/g_rl.md3");
 		precache_model ("models/weapons/v_rl.md3");
-		precache_model ("models/weapons/w_rl.zym");
+		precache_model ("models/weapons/h_rl.dpm");
 		precache_sound ("weapons/rocket_det.wav");
 		precache_sound ("weapons/rocket_fire.wav");
 		if (g_laserguided_missile)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,471 +1,473 @@
-//.float speed; = switchweapon
-//.float proxytime; = autoswitch
-//.float tl; = wait
-
-void Seeker_Missile_Explode ()
-{
-	self.event_damage = SUB_Null;
-	RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
-
-	remove (self);
-}
-
-void Seeker_Missile_Touch()
-{
-	PROJECTILE_TOUCH;
-
-	Seeker_Missile_Explode();
-}
-
-void Seeker_Missile_Think()
-{
-	entity e;
-	vector desireddir, olddir, newdir, eorg;
-	float turnrate;
-	float dist;
-
-	if (time > self.cnt)
-		Seeker_Missile_Explode();
-
-	if (!self.switchweapon)
-		self.switchweapon = cvar("g_balance_seeker_missile_speed");
-
-	if ((self.switchweapon < cvar("g_balance_seeker_missile_speed_max")) && cvar("g_balance_seeker_missile_speed_accel"))
-		self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_accel");
-
-	if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max"))
-		self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel");
-
-	if (self.enemy != world)
-		if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
-			self.enemy = world;
-
-	if (self.enemy != world)
-	{
-		e               = self.enemy;
-		eorg            = 0.5 * (e.absmin + e.absmax);
-		turnrate        = cvar("g_balance_seeker_missile_turnrate");		    // how fast to turn
-		desireddir      = normalize(eorg - self.origin);
-		olddir          = normalize(self.velocity);				            // get my current direction
-		dist            = vlen(eorg - self.origin);
-
-		// Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
-		if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
-		{
-			// Is it a better idea (shorter distance) to trace to the target itself?
-			if ( vlen(self.origin + olddir * self.wait) < dist)
-				traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
-			else
-				traceline(self.origin, eorg, FALSE, self);
-
-			// Setup adaptive tracelength
-			self.wait = vlen(self.origin - trace_endpos);
-			if (self.wait < cvar("g_balance_seeker_missile_smart_trace_min")) self.wait = cvar("g_balance_seeker_missile_smart_trace_min");
-			if (self.wait > cvar("g_balance_seeker_missile_smart_trace_max")) self.wait = cvar("g_balance_seeker_missile_smart_trace_max");
-
-			// Calc how important it is that we turn and add this to the desierd (enemy) dir.
-			desireddir  = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
-		}
-
-		//newdir = normalize((olddir + desireddir * turnrate) * 0.5);// take the average of the 2 directions; not the best method but simple & easy
-		newdir = normalize(olddir + desireddir * turnrate);// take the average of the 2 directions; not the best method but simple & easy
-
-		self.velocity = newdir * self.switchweapon;			                    // make me fly in the new direction at my flight speed
-	}
-
-	// Proxy
-	if (cvar("g_balance_seeker_missile_proxy"))
-	{
-		if ( dist <= cvar("g_balance_seeker_missile_proxy_maxrange"))
-		{
-			if (self.autoswitch == 0)
-			{
-				self.autoswitch = time + cvar("g_balance_seeker_missile_proxy_delay");
-			}
-			else
-			{
-				if (self.autoswitch <= time)
-				{
-					Seeker_Missile_Explode();
-					self.autoswitch = 0;
-				}
-			}
-		}
-		else
-		{
-			if (self.autoswitch != 0)
-				self.autoswitch = 0;
-		}
-	}
-	///////////////
-
-	if (self.enemy.deadflag != DEAD_NO)
-	{
-		self.enemy = world;
-		self.cnt = time + 1 + (random() * 4);
-		self.nextthink = self.cnt;
-		return;
-	}
-
-	self.angles = vectoangles(self.velocity);			// turn model in the new flight direction
-	self.nextthink = time + 0.05;
-
-	UpdateCSQCProjectile(self);
-}
-
-
-
-void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-	float d;
-	d = damage;
-
-	if (self.owner == attacker)
-		d = d * 0.25;
-
-	self.health = self.health - d;
-
-	if (self.health <= 0)
-		W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
-}
-
-void Seeker_Missile_Animate()
-{
-	self.frame = self.frame +1;
-	self.nextthink = time + 0.05;
-
-	if (self.enemy != world)
-		if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
-			self.enemy = world;
-
-	if(self.frame == 5)
-	{
-		self.think           = Seeker_Missile_Think;
-		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;
-		else
-			self.movetype    = MOVETYPE_FLYMISSILE;
-	}
-
-	UpdateCSQCProjectile(self);
-}
-
-void Seeker_Fire_Missile(vector f_org)
-{
-	local entity missile;
-
-	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
-
-	makevectors(self.v_angle);
-	W_SetupShot (self, f_org, FALSE, 2, "weapons/seeker_fire.wav");
-	pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-
-	//self.detornator         = FALSE;
-
-	missile                 = spawn();
-	missile.owner           = self;
-	missile.classname       = "seeker_missile";
-	missile.bot_dodge       = TRUE;
-	missile.bot_dodgerating = cvar("g_balance_seeker_missile_damage");
-
-	missile.think           = Seeker_Missile_Animate;
-
-	//if (!cvar("g_balance_seeker_missile_proxy"))
-	missile.touch           = Seeker_Missile_Touch;
-
-	missile.event_damage    = Seeker_Missile_Damage;
-	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");
-	missile.solid           = SOLID_BBOX;
-	missile.scale           = 2;
-	missile.takedamage          = DAMAGE_YES;
-	missile.damageforcescale    = 4;
-	missile.health              = 5;
-	missile.projectiledeathtype = WEP_SEEKER;
-
-	setorigin (missile, w_shotorg);
-	setsize (missile, '-2 -2 -2', '2 2 2');
-
-
-	missile.movetype    = MOVETYPE_FLYMISSILE;// MOVETYPE_TOSS;
-
-	missile.flags       = FL_PROJECTILE;
-
-	missile.velocity    = (w_shotdir + '0 0 0.45') * missile.switchweapon;
-	W_SetupProjectileVelocity(missile);
-
-	missile.switchweapon = vlen(missile.velocity);
-	missile.angles = vectoangles (missile.velocity);
-
-	CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
-}
-
-void Seeker_Vollycontroler_Think()
-{
-	float c;
-	entity oldself,oldenemy;
-	self.cnt = self.cnt - 1;
-
-	if ((self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO))
-	{
-		remove(self);
-		return;
-	}
-
-	self.nextthink = time + cvar("g_balance_seeker_missile_delay");
-
-	oldself = self;
-	self = self.owner;
-
-	oldenemy = self.enemy;
-	self.enemy = oldself.enemy;
-
-	c = mod(oldself.cnt, 4);
-	switch(c)
-	{
-		case 0:
-			Seeker_Fire_Missile('37.5 17 -22');
-			break;
-		case 1:
-			Seeker_Fire_Missile('37.5 9.5 -22');
-			break;
-		case 2:
-			Seeker_Fire_Missile('40 17 -29');
-			break;
-		case 3:
-		default:
-			Seeker_Fire_Missile('40 9.5 -29');
-			break;
-	}
-
-	self.enemy = oldenemy;
-	self = oldself;
-}
-
-void Seeker_Tag_Explode ()
-{
-	//if(other==self.owner)
-	//    return;
-	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE);
-
-	remove (self);
-}
-
-void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-	self.health = self.health - damage;
-	if (self.health <= 0)
-		Seeker_Tag_Explode();
-}
-
-void Seeker_Tag_Think()
-{
-	remove(self);
-	return;
-}
-
-void Seeker_Tag_Touch()
-{
-	vector dir;
-	vector org2;
-
-	dir     = normalize (self.owner.origin - self.origin);
-	org2    = findbetterlocation (self.origin, 8);
-
-	te_knightspike(org2);
-
-	self.event_damage = SUB_Null;
-	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT);
-
-	if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
-	{
-		entity e;
-		e           = spawn();
-		e.cnt       = cvar("g_balance_seeker_missile_count");
-		e.owner     = self.owner;
-		e.enemy     = other;
-		e.think     = Seeker_Vollycontroler_Think;
-		e.nextthink = time;
-
-		//sprint(self.owner, "^1Target lock ^3[^7 ",other.netname, " ^3]^1 acquired - autofire activated.\n");
-		//sprint(other,"^1You are targeted!\n");
-
-		// stuffcmd(other,"play2 weapons/zany-alarm4.ogg\n");
-		// stuffcmd(self.owner, "play2 weapons/zany-lock4.ogg\n");
-	}
-
-	remove(self);
-	return;
-}
-
-
-
-void Seeker_Fire_Tag()
-{
-	local entity missile;
-	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
-
-	W_SetupShot (self, '56 13 -15', FALSE, 2, "weapons/tag_fire.wav");
-
-	missile                 = spawn();
-	missile.owner           = self;
-	missile.classname       = "seeker_tag";
-	missile.bot_dodge       = TRUE;
-	missile.bot_dodgerating = 50;
-	missile.touch           = Seeker_Tag_Touch;
-	missile.think           = Seeker_Tag_Think;
-	missile.nextthink       = time + 15;
-	missile.movetype        = MOVETYPE_FLY;
-	missile.solid           = SOLID_BBOX;
-	missile.owner           = self;
-
-	missile.takedamage       = DAMAGE_YES;
-	missile.event_damage    = Seeker_Tag_Explode;
-	missile.health          = 5;
-
-	setorigin (missile, w_shotorg);
-
-	missile.flags       = FL_PROJECTILE;
-
-	missile.velocity    = w_shotdir  * cvar("g_balance_seeker_tag_speed");
-	missile.movetype    = MOVETYPE_BOUNCEMISSILE;
-	W_SetupProjectileVelocity(missile);
-	missile.angles = vectoangles (missile.velocity);
-
-	CSQCProjectile(missile, TRUE, PROJECTILE_TAG, FALSE); // has sound
-}
-
-
-void Seeker_Flac_Explode ()
-{
-	self.event_damage = SUB_Null;
-
-	RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
-
-	remove (self);
-}
-
-void Seeker_Flac_Touch()
-{
-	PROJECTILE_TOUCH;
-
-	Seeker_Flac_Explode();
-}
-
-void Seeker_Fire_Flac()
-{
-	local entity missile;
-	vector f_org;
-	float c;
-
-	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
-
-	c = mod(self.bulletcounter, 4);
-	switch(c)
-	{
-		case 1:
-			f_org = '37.5 17 -22';
-			break;
-		case 2:
-			f_org = '37.5 9.5 -22';
-			break;
-		case 3:
-			f_org = '40 17 -29';
-			break;
-		case 0:
-		default:
-			f_org = '40 9.5 -29';
-			break;
-	}
-	W_SetupShot (self, f_org, FALSE, 2, "weapons/flac_fire.wav");
-
-	pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-
-	missile = spawn ();
-	missile.owner = missile.realowner = self;
-	missile.classname = "missile";
-	missile.bot_dodge = TRUE;
-	missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
-	missile.touch = Seeker_Flac_Explode;
-	missile.use = Seeker_Flac_Explode;
-	missile.think = Seeker_Flac_Explode;
-	missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
-	missile.solid = SOLID_BBOX;
-	missile.scale = 0.4; // BUG: the model is too big
-	missile.projectiledeathtype = WEP_SEEKER;
-	setorigin (missile, w_shotorg);
-	missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
-
-	missile.movetype = MOVETYPE_FLY;
-	w_shotdir = w_shotdir + '0 0 0.3';
-	missile.velocity    = (w_shotdir  + randomvec() * cvar("g_balance_seeker_flac_spread")) * cvar("g_balance_seeker_flac_speed");
-
-	W_SetupProjectileVelocity(missile);
-
-	missile.angles = vectoangles (missile.velocity);
-	missile.flags = FL_PROJECTILE;
-
-	CSQCProjectile(missile, TRUE, PROJECTILE_FLAC, TRUE);
-}
-
-void spawnfunc_weapon_seeker (void)
-{
-	weapon_defaultspawnfunc(WEP_SEEKER);
-}
-
-float w_seeker(float req)
-{
-	if (req == WR_AIM)
-		self.BUTTON_ATCK = bot_aim(cvar("g_balance_seeker_tag_speed"), 0, 20, FALSE);
-
-	else if (req == WR_THINK)
-	{
-		if (self.BUTTON_ATCK)
-			if (weapon_prepareattack(0, cvar("g_balance_seeker_tag_refire")))
-			{
-				Seeker_Fire_Tag();
-				weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_seeker_tag_animtime"), w_ready);
-			}
-
-		if (self.BUTTON_ATCK2)
-			if (weapon_prepareattack(1, cvar("g_balance_seeker_flac_refire")))
-			{
-				Seeker_Fire_Flac();
-				weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_seeker_flac_animtime"), w_ready);
-			}
-
-	}
-	else if (req == WR_PRECACHE)
-	{
-		precache_model ("models/weapons/g_seeker.md3");
-		precache_model ("models/weapons/v_seeker.md3");
-		precache_model ("models/weapons/w_seeker.zym");
-		precache_sound ("weapons/tag_fire.wav");
-		precache_sound ("weapons/flac_fire.wav");
-		precache_sound ("weapons/seeker_fire.wav");
-	}
-	else if (req == WR_SETUP)
-		weapon_setup(WEP_SEEKER);
-	else if (req == WR_CHECKAMMO1)
-		return self.ammo_rockets >= cvar("g_balance_seeker_tag_ammo") + cvar("g_balance_seeker_missile_ammo");
-	else if (req == WR_CHECKAMMO2)
-		return self.ammo_rockets >= cvar("g_balance_seeker_flac_ammo");
-	else if (req == WR_SUICIDEMESSAGE)
-		w_deathtypestring = "played with tiny rockets";
-	else if (req == WR_KILLMESSAGE)
-	{
-		if(w_deathtype & HITTYPE_SECONDARY)
-			w_deathtypestring = "ran into #'s flac";
-		else
-			w_deathtypestring = "was tagged by";
-	}
-	return TRUE;
-};
-
+//.float speed; = switchweapon
+//.float proxytime; = autoswitch
+//.float tl; = wait
+
+void Seeker_Missile_Explode ()
+{
+	self.event_damage = SUB_Null;
+	RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
+
+	remove (self);
+}
+
+void Seeker_Missile_Touch()
+{
+	PROJECTILE_TOUCH;
+
+	Seeker_Missile_Explode();
+}
+
+void Seeker_Missile_Think()
+{
+	entity e;
+	vector desireddir, olddir, newdir, eorg;
+	float turnrate;
+	float dist;
+
+	if (time > self.cnt)
+		Seeker_Missile_Explode();
+
+	if (!self.switchweapon)
+		self.switchweapon = cvar("g_balance_seeker_missile_speed");
+
+	if ((self.switchweapon < cvar("g_balance_seeker_missile_speed_max")) && cvar("g_balance_seeker_missile_speed_accel"))
+		self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_accel");
+
+	if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max"))
+		self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel");
+
+	if (self.enemy != world)
+		if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+			self.enemy = world;
+
+	if (self.enemy != world)
+	{
+		e               = self.enemy;
+		eorg            = 0.5 * (e.absmin + e.absmax);
+		turnrate        = cvar("g_balance_seeker_missile_turnrate");		    // how fast to turn
+		desireddir      = normalize(eorg - self.origin);
+		olddir          = normalize(self.velocity);				            // get my current direction
+		dist            = vlen(eorg - self.origin);
+
+		// Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
+		if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
+		{
+			// Is it a better idea (shorter distance) to trace to the target itself?
+			if ( vlen(self.origin + olddir * self.wait) < dist)
+				traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
+			else
+				traceline(self.origin, eorg, FALSE, self);
+
+			// Setup adaptive tracelength
+			self.wait = vlen(self.origin - trace_endpos);
+			if (self.wait < cvar("g_balance_seeker_missile_smart_trace_min")) self.wait = cvar("g_balance_seeker_missile_smart_trace_min");
+			if (self.wait > cvar("g_balance_seeker_missile_smart_trace_max")) self.wait = cvar("g_balance_seeker_missile_smart_trace_max");
+
+			// Calc how important it is that we turn and add this to the desierd (enemy) dir.
+			desireddir  = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
+		}
+
+		//newdir = normalize((olddir + desireddir * turnrate) * 0.5);// take the average of the 2 directions; not the best method but simple & easy
+		newdir = normalize(olddir + desireddir * turnrate);// take the average of the 2 directions; not the best method but simple & easy
+
+		self.velocity = newdir * self.switchweapon;			                    // make me fly in the new direction at my flight speed
+	}
+
+	// Proxy
+	if (cvar("g_balance_seeker_missile_proxy"))
+	{
+		if ( dist <= cvar("g_balance_seeker_missile_proxy_maxrange"))
+		{
+			if (self.autoswitch == 0)
+			{
+				self.autoswitch = time + cvar("g_balance_seeker_missile_proxy_delay");
+			}
+			else
+			{
+				if (self.autoswitch <= time)
+				{
+					Seeker_Missile_Explode();
+					self.autoswitch = 0;
+				}
+			}
+		}
+		else
+		{
+			if (self.autoswitch != 0)
+				self.autoswitch = 0;
+		}
+	}
+	///////////////
+
+	if (self.enemy.deadflag != DEAD_NO)
+	{
+		self.enemy = world;
+		self.cnt = time + 1 + (random() * 4);
+		self.nextthink = self.cnt;
+		return;
+	}
+
+	self.angles = vectoangles(self.velocity);			// turn model in the new flight direction
+	self.nextthink = time + 0.05;
+
+	UpdateCSQCProjectile(self);
+}
+
+
+
+void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	float d;
+	d = damage;
+
+	if (self.owner == attacker)
+		d = d * 0.25;
+
+	self.health = self.health - d;
+
+	if (self.health <= 0)
+		W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
+}
+
+void Seeker_Missile_Animate()
+{
+	self.frame = self.frame +1;
+	self.nextthink = time + 0.05;
+
+	if (self.enemy != world)
+		if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+			self.enemy = world;
+
+	if(self.frame == 5)
+	{
+		self.think           = Seeker_Missile_Think;
+		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;
+		else
+			self.movetype    = MOVETYPE_FLYMISSILE;
+	}
+
+	UpdateCSQCProjectile(self);
+}
+
+void Seeker_Fire_Missile(vector f_diff)
+{
+	local entity missile;
+
+	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
+
+	makevectors(self.v_angle);
+	W_SetupShot (self, FALSE, 2, "weapons/seeker_fire.wav");
+	w_shotorg += f_diff;
+	pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	//self.detornator         = FALSE;
+
+	missile                 = spawn();
+	missile.owner           = self;
+	missile.classname       = "seeker_missile";
+	missile.bot_dodge       = TRUE;
+	missile.bot_dodgerating = cvar("g_balance_seeker_missile_damage");
+
+	missile.think           = Seeker_Missile_Animate;
+
+	//if (!cvar("g_balance_seeker_missile_proxy"))
+	missile.touch           = Seeker_Missile_Touch;
+
+	missile.event_damage    = Seeker_Missile_Damage;
+	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");
+	missile.solid           = SOLID_BBOX;
+	missile.scale           = 2;
+	missile.takedamage          = DAMAGE_YES;
+	missile.damageforcescale    = 4;
+	missile.health              = 5;
+	missile.projectiledeathtype = WEP_SEEKER;
+
+	setorigin (missile, w_shotorg);
+	setsize (missile, '-2 -2 -2', '2 2 2');
+
+
+	missile.movetype    = MOVETYPE_FLYMISSILE;// MOVETYPE_TOSS;
+
+	missile.flags       = FL_PROJECTILE;
+
+	missile.velocity    = (w_shotdir + '0 0 0.45') * missile.switchweapon;
+	W_SetupProjectileVelocity(missile);
+
+	missile.switchweapon = vlen(missile.velocity);
+	missile.angles = vectoangles (missile.velocity);
+
+	CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
+}
+
+void Seeker_Vollycontroler_Think()
+{
+	float c;
+	entity oldself,oldenemy;
+	self.cnt = self.cnt - 1;
+
+	if ((self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO))
+	{
+		remove(self);
+		return;
+	}
+
+	self.nextthink = time + cvar("g_balance_seeker_missile_delay");
+
+	oldself = self;
+	self = self.owner;
+
+	oldenemy = self.enemy;
+	self.enemy = oldself.enemy;
+
+	c = mod(oldself.cnt, 4);
+	switch(c)
+	{
+		case 0:
+			Seeker_Fire_Missile('-1.25 -3.75 0');
+			break;
+		case 1:
+			Seeker_Fire_Missile('+1.25 -3.75 0');
+			break;
+		case 2:
+			Seeker_Fire_Missile('-1.25 +3.75 0');
+			break;
+		case 3:
+		default:
+			Seeker_Fire_Missile('+1.25 +3.75 0');
+			break;
+	}
+
+	self.enemy = oldenemy;
+	self = oldself;
+}
+
+void Seeker_Tag_Explode ()
+{
+	//if(other==self.owner)
+	//    return;
+	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE);
+
+	remove (self);
+}
+
+void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	self.health = self.health - damage;
+	if (self.health <= 0)
+		Seeker_Tag_Explode();
+}
+
+void Seeker_Tag_Think()
+{
+	remove(self);
+	return;
+}
+
+void Seeker_Tag_Touch()
+{
+	vector dir;
+	vector org2;
+
+	dir     = normalize (self.owner.origin - self.origin);
+	org2    = findbetterlocation (self.origin, 8);
+
+	te_knightspike(org2);
+
+	self.event_damage = SUB_Null;
+	Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT);
+
+	if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
+	{
+		entity e;
+		e           = spawn();
+		e.cnt       = cvar("g_balance_seeker_missile_count");
+		e.owner     = self.owner;
+		e.enemy     = other;
+		e.think     = Seeker_Vollycontroler_Think;
+		e.nextthink = time;
+
+		//sprint(self.owner, "^1Target lock ^3[^7 ",other.netname, " ^3]^1 acquired - autofire activated.\n");
+		//sprint(other,"^1You are targeted!\n");
+
+		// stuffcmd(other,"play2 weapons/zany-alarm4.ogg\n");
+		// stuffcmd(self.owner, "play2 weapons/zany-lock4.ogg\n");
+	}
+
+	remove(self);
+	return;
+}
+
+
+
+void Seeker_Fire_Tag()
+{
+	local entity missile;
+	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
+
+	W_SetupShot (self, FALSE, 2, "weapons/tag_fire.wav");
+
+	missile                 = spawn();
+	missile.owner           = self;
+	missile.classname       = "seeker_tag";
+	missile.bot_dodge       = TRUE;
+	missile.bot_dodgerating = 50;
+	missile.touch           = Seeker_Tag_Touch;
+	missile.think           = Seeker_Tag_Think;
+	missile.nextthink       = time + 15;
+	missile.movetype        = MOVETYPE_FLY;
+	missile.solid           = SOLID_BBOX;
+	missile.owner           = self;
+
+	missile.takedamage       = DAMAGE_YES;
+	missile.event_damage    = Seeker_Tag_Explode;
+	missile.health          = 5;
+
+	setorigin (missile, w_shotorg);
+
+	missile.flags       = FL_PROJECTILE;
+
+	missile.velocity    = w_shotdir  * cvar("g_balance_seeker_tag_speed");
+	missile.movetype    = MOVETYPE_BOUNCEMISSILE;
+	W_SetupProjectileVelocity(missile);
+	missile.angles = vectoangles (missile.velocity);
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_TAG, FALSE); // has sound
+}
+
+
+void Seeker_Flac_Explode ()
+{
+	self.event_damage = SUB_Null;
+
+	RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
+
+	remove (self);
+}
+
+void Seeker_Flac_Touch()
+{
+	PROJECTILE_TOUCH;
+
+	Seeker_Flac_Explode();
+}
+
+void Seeker_Fire_Flac()
+{
+	local entity missile;
+	vector f_diff;
+	float c;
+
+	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
+
+	c = mod(self.bulletcounter, 4);
+	switch(c)
+	{
+		case 0:
+			f_diff = '-1.25 -3.75 0';
+			break;
+		case 1:
+			f_diff = '+1.25 -3.75 0';
+			break;
+		case 2:
+			f_diff = '-1.25 +3.75 0';
+			break;
+		case 3:
+		default:
+			f_diff = '+1.25 +3.75 0';
+			break;
+	}
+	W_SetupShot (self, FALSE, 2, "weapons/flac_fire.wav");
+	w_shotorg += f_diff;
+
+	pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	missile = spawn ();
+	missile.owner = missile.realowner = self;
+	missile.classname = "missile";
+	missile.bot_dodge = TRUE;
+	missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
+	missile.touch = Seeker_Flac_Explode;
+	missile.use = Seeker_Flac_Explode;
+	missile.think = Seeker_Flac_Explode;
+	missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
+	missile.solid = SOLID_BBOX;
+	missile.scale = 0.4; // BUG: the model is too big
+	missile.projectiledeathtype = WEP_SEEKER;
+	setorigin (missile, w_shotorg);
+	missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
+
+	missile.movetype = MOVETYPE_FLY;
+	w_shotdir = w_shotdir + '0 0 0.3';
+	missile.velocity    = (w_shotdir  + randomvec() * cvar("g_balance_seeker_flac_spread")) * cvar("g_balance_seeker_flac_speed");
+
+	W_SetupProjectileVelocity(missile);
+
+	missile.angles = vectoangles (missile.velocity);
+	missile.flags = FL_PROJECTILE;
+
+	CSQCProjectile(missile, TRUE, PROJECTILE_FLAC, TRUE);
+}
+
+void spawnfunc_weapon_seeker (void)
+{
+	weapon_defaultspawnfunc(WEP_SEEKER);
+}
+
+float w_seeker(float req)
+{
+	if (req == WR_AIM)
+		self.BUTTON_ATCK = bot_aim(cvar("g_balance_seeker_tag_speed"), 0, 20, FALSE);
+
+	else if (req == WR_THINK)
+	{
+		if (self.BUTTON_ATCK)
+			if (weapon_prepareattack(0, cvar("g_balance_seeker_tag_refire")))
+			{
+				Seeker_Fire_Tag();
+				weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_seeker_tag_animtime"), w_ready);
+			}
+
+		if (self.BUTTON_ATCK2)
+			if (weapon_prepareattack(1, cvar("g_balance_seeker_flac_refire")))
+			{
+				Seeker_Fire_Flac();
+				weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_seeker_flac_animtime"), w_ready);
+			}
+
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/weapons/g_seeker.md3");
+		precache_model ("models/weapons/v_seeker.md3");
+		precache_model ("models/weapons/h_seeker.dpm");
+		precache_sound ("weapons/tag_fire.wav");
+		precache_sound ("weapons/flac_fire.wav");
+		precache_sound ("weapons/seeker_fire.wav");
+	}
+	else if (req == WR_SETUP)
+		weapon_setup(WEP_SEEKER);
+	else if (req == WR_CHECKAMMO1)
+		return self.ammo_rockets >= cvar("g_balance_seeker_tag_ammo") + cvar("g_balance_seeker_missile_ammo");
+	else if (req == WR_CHECKAMMO2)
+		return self.ammo_rockets >= cvar("g_balance_seeker_flac_ammo");
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = "played with tiny rockets";
+	else if (req == WR_KILLMESSAGE)
+	{
+		if(w_deathtype & HITTYPE_SECONDARY)
+			w_deathtypestring = "ran into #'s flac";
+		else
+			w_deathtypestring = "was tagged by";
+	}
+	return TRUE;
+};
+

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -2,6 +2,7 @@
 void W_Shotgun_Attack (void)
 {
 	float	sc;
+	float	ammoamount;
 	float	bullets;
 	float	d;
 	float	f;
@@ -10,6 +11,7 @@
 	float	bulletconstant;
 	local entity flash;
 
+	ammoamount = cvar("g_balance_shotgun_primary_ammo");
 	bullets = cvar("g_balance_shotgun_primary_bullets");
 	d = cvar("g_balance_shotgun_primary_damage");
 	f = cvar("g_balance_shotgun_primary_force");
@@ -17,23 +19,24 @@
 	bulletspeed = cvar("g_balance_shotgun_primary_speed");
 	bulletconstant = cvar("g_balance_shotgun_primary_bulletconstant");
 
-	W_SetupShot (self, '28 8 -10', TRUE, 5, "weapons/shotgun_fire.wav");
+	W_SetupShot (self, TRUE, 5, "weapons/shotgun_fire.wav");
 	for (sc = 0;sc < bullets;sc = sc + 1)
 		fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-		self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_primary_ammo");
+		self.ammo_shells = self.ammo_shells - ammoamount;
 
 	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"));
 
 	// casing code
 	if (cvar("g_casings") >= 1)
-		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
+		for (sc = 0;sc < ammoamount;sc = sc + 1)
+			SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
 
 	// muzzle flash for 1st person view
 	flash = spawn();
 	setorigin(flash, '5 0 0');
 	setmodel(flash, "models/uziflash.md3"); // precision set below
-	setattachment(flash, self.weaponentity, "bone02");
+	setattachment(flash, self.weaponentity, "shot");
 	flash.owner = self;
 	flash.viewmodelforclient = self;
 	flash.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
@@ -48,6 +51,7 @@
 void W_Shotgun_Attack2 (void)
 {
 	float	sc;
+	float	ammoamount;
 	float	bullets;
 	float	d;
 	float	f;
@@ -56,6 +60,7 @@
 	float	bulletconstant;
 	local entity flash;
 
+	ammoamount = cvar("g_balance_shotgun_secondary_ammo");
 	bullets = cvar("g_balance_shotgun_secondary_bullets");
 	d = cvar("g_balance_shotgun_secondary_damage");
 	f = cvar("g_balance_shotgun_secondary_force");
@@ -63,22 +68,23 @@
 	bulletspeed = cvar("g_balance_shotgun_secondary_speed");
 	bulletconstant = cvar("g_balance_shotgun_secondary_bulletconstant");
 
-	W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav");
+	W_SetupShot (self, TRUE, 5, "weapons/shotgun_fire.wav");
 	for (sc = 0;sc < bullets;sc = sc + 1)
 		fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN | HITTYPE_SECONDARY, 0, 1, bulletconstant);
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-		self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_secondary_ammo");
+		self.ammo_shells = self.ammo_shells - ammoamount;
 
 	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"));
 
 	// casing code
 	if (cvar("g_casings") >= 1)
-		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
+		for (sc = 0;sc < ammoamount;sc = sc + 1)
+			SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1);
 
 	flash = spawn();
-	setorigin(flash, '53 5 0');
+	setorigin(flash, '5 0 0');
 	setmodel(flash, "models/uziflash.md3"); // precision set below
-	setattachment(flash, self.weaponentity, "bone01");
+	setattachment(flash, self.weaponentity, "shot");
 	flash.owner = self;
 	flash.viewmodelforclient = self;
 	flash.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
@@ -131,7 +137,7 @@
 		precache_model ("models/uziflash.md3");
 		precache_model ("models/weapons/g_shotgun.md3");
 		precache_model ("models/weapons/v_shotgun.md3");
-		precache_model ("models/weapons/w_shotgun.zym");
+		precache_model ("models/weapons/h_shotgun.dpm");
 		precache_sound ("misc/itempickup.wav");
 		precache_sound ("weapons/shotgun_fire.wav");
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc	2009-03-16 09:12:13 UTC (rev 6191)
@@ -22,7 +22,7 @@
 		else
 			self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
 	}
-	W_SetupShot (self, '23 8 -9.5', TRUE, 0, "weapons/uzi_fire.wav");
+	W_SetupShot (self, TRUE, 0, "weapons/uzi_fire.wav");
 	if (!g_norecoil)
 	{
 		self.punchangle_x = random () - 0.5;
@@ -43,7 +43,7 @@
 	flash = spawn();
 	setorigin(flash, '5 0 0');
 	setmodel(flash, "models/uziflash.md3"); // precision set below
-	setattachment(flash, self.weaponentity, "bone02");
+	setattachment(flash, self.weaponentity, "shot");
 	flash.owner = self;
 	flash.viewmodelforclient = self;
 	flash.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
@@ -68,7 +68,7 @@
 
 	// casing code
 	if (cvar("g_casings") >= 2)
-		SpawnCasing (w_shotorg - v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
+		SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
 }
 
 // weapon frames
@@ -128,7 +128,7 @@
 		precache_model ("models/uziflash.md3");
 		precache_model ("models/weapons/g_uzi.md3");
 		precache_model ("models/weapons/v_uzi.md3");
-		precache_model ("models/weapons/w_uzi.zym");
+		precache_model ("models/weapons/h_uzi.dpm");
 		precache_sound ("weapons/uzi_fire.wav");
 	}
 	else if (req == WR_SETUP)

Modified: branches/nexuiz-2.0/data/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/scripts/entities.def	2009-03-16 09:12:13 UTC (rev 6191)
@@ -657,6 +657,7 @@
 */
 
 /*QUAKED func_illusionary (0 .5 .8) ? 
+NOTE: THIS ENTITY IS BROKEN REGARDING CLIENT AND PROJECTILE PREDICTION. DO NOT USE IT. USE NONSOLID SHADERS INSTEAD.
 A non-solid brush entity. Use func_wall if you want it solid.
 The keys below actually apply to most brush entities as they are engine features; however, they are described here as they aren't overridden by game code in misc_models. Its q3map2 keys below will work on any brush entity!
 -------- KEYS --------
@@ -672,6 +673,10 @@
 lodtarget1: targetname of the first LOD model entity (can be used instead of lodmodel1 to use a brush model instead)
 lodtarget2: targetname of the second LOD model entity (can be used instead of lodmodel2 to use a brush model instead)
 targetname: when invoking it by a button etc., it changes the color to the initiator of the action (e.g. the one pressing a button). In Onslaught, this can be used to color control points for team who owns them. In other game types, this can be used as a fun feature. Works only with _shirt and _pants textures.
+originjitter: a vector describing a random offset this entity will be moved on initial spawn. This corresponds to the "origin" field. Works on any non-q3map2-only entity.
+anglesjitter: a vector in the order "pitch yaw roll" describing a random angles change on this entity on initial spawn. The value 180 180 180 makes the angles entirely random and uniformly distributed (among euler angles). This corresponds to the "angles" field. Works on any non-q3map2-only entity.
+anglejitter: a float describing a random yaw angle change on this entity on initial spawn. The value 180 makes the yaw angle entirely random (maybe good for items). This corresponds to the "angle" field. Works on any non-q3map2-only entity.
+gametypefilter: either a + sign and a comma separated list of game types or the aliases "teams" and "noteams" to ONLY show the entity in the listed game types, or a - sign and a comma separated list of game types or the aliases "teams" and "noteams" to NOT show the entity in the listed game types. The syntax is the same as in sbar_columns_set strings. Works on any non-q3map2-only entity.
 -------- Q3MAP2 KEYS --------
 _castshadows: Allows per-entity control over shadow casting. Defaults to 0 on entities, 1 on world. 0 = no shadow casting. 1 = cast shadows on world. > 1 = cast shadows on entities with _rs (or _receiveshadows) with the corresponding value, AND world. Negative values imply same, but DO NOT cast shadows on world.
 _receiveshadows: Allows per-entity control over shadow reception. Defaults to 1 on everything (world shadows). 0 = receives NO shadows. > 1 = receive shadows only from corresponding keyed entities (see above) and world. < 1 = receive shadows ONLY from corresponding keyed entities.
@@ -688,7 +693,7 @@
 The keys below actually apply to most brush entities as they are engine features; however, they are described here as they aren't overridden by game code in misc_models. Its q3map2 keys below will work on any brush entity!
 -------- KEYS --------
 movetype: way in which it moves: one of 0 = NONE, 1 = ANGLENOCLIP, 2 = ANGLECLIP, 3 = WALK, 4 = STEP, 5 = FLY, 6 = TOSS, 7 = PUSH, 8 = NOCLIP, 9 = FLYMISSILE, 10 = BOUNCE, 11 = BOUNCEMISSILE
-solid: solidity: one of 1 = TRIGGER, 2 = BBOX, 3 = SLIDEBOX, 4 = BSP, 5 = CORPSE
+solid: solidity: one of 1 = TRIGGER, 2 = BBOX, 3 = SLIDEBOX, 4 = BSP, 5 = CORPSE (default: 4, any other value causes prediction problems and should not be used until further notice)
 avelocity: vector giving its angular velocity (useful for spinning models)
 scale: scale factor of the model (range: 0.0625 to 15.9375)
 colormap: 1024 + 16 * pantscolor + shirtcolor
@@ -700,6 +705,10 @@
 lodtarget1: targetname of the first LOD model entity (can be used instead of lodmodel1 to use a brush model instead)
 lodtarget2: targetname of the second LOD model entity (can be used instead of lodmodel2 to use a brush model instead)
 targetname: when invoking it by a button etc., it changes the color to the initiator of the action (e.g. the one pressing a button). In Onslaught, this can be used to color control points for team who owns them. In other game types, this can be used as a fun feature. Works only with _shirt and _pants textures.
+originjitter: a vector describing a random offset this entity will be moved on initial spawn. This corresponds to the "origin" field. Works on any non-q3map2-only entity.
+anglesjitter: a vector in the order "pitch yaw roll" describing a random angles change on this entity on initial spawn. The value 180 180 180 makes the angles entirely random and uniformly distributed (among euler angles). This corresponds to the "angles" field. Works on any non-q3map2-only entity.
+anglejitter: a float describing a random yaw angle change on this entity on initial spawn. The value 180 makes the yaw angle entirely random (maybe good for items). This corresponds to the "angle" field. Works on any non-q3map2-only entity.
+gametypefilter: either a + sign and a comma separated list of game types or the aliases "teams" and "noteams" to ONLY show the entity in the listed game types, or a - sign and a comma separated list of game types or the aliases "teams" and "noteams" to NOT show the entity in the listed game types. The syntax is the same as in sbar_columns_set strings. Works on any non-q3map2-only entity.
 -------- Q3MAP2 KEYS --------
 _castshadows: Allows per-entity control over shadow casting. Defaults to 0 on entities, 1 on world. 0 = no shadow casting. 1 = cast shadows on world. > 1 = cast shadows on entities with _rs (or _receiveshadows) with the corresponding value, AND world. Negative values imply same, but DO NOT cast shadows on world.
 _receiveshadows: Allows per-entity control over shadow reception. Defaults to 1 on everything (world shadows). 0 = receives NO shadows. > 1 = receive shadows only from corresponding keyed entities (see above) and world. < 1 = receive shadows ONLY from corresponding keyed entities.
@@ -1182,6 +1191,7 @@
 */
 
 /*QUAKED weapon_minstanex (1 0 .5) (-30 -30 0) (30 30 32) FLOATING
+Placing this entity on a map kills your cat, voids the warranty on your toaster, and makes your map an unenjoyable campers' paradise.
 the MinstaGib Nex. Always kills with one shot.
 -------- KEYS --------
 ammo_cells: initial cells of the weapon (if unset, g_pickup_cells is used)

Modified: branches/nexuiz-2.0/data/weapons.cfg
===================================================================
--- branches/nexuiz-2.0/data/weapons.cfg	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/weapons.cfg	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,10 +1,31 @@
 // NOTE: whenever you add a cvar to this file, run update-cvarcount.sh to
 // update this checksum!
 //
-// And... don't forget to edit weaponsPro.cfg too.
+// And... don't forget to edit weaponsHavoc.cfg too.
 
-set cvar_check_weapons 32e7dc7d745187473f0040d14892e2bb
+set cvar_check_weapons 6dd73b6c78519153d50f876be23bfe77
 
+// NOTE: this only replaces weapons on the map
+// use g_start_weapon_* to also replace the on-startup weapons!
+// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
+// set the cvars to "0" to totally disable a weapon
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi ""
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_seeker ""
+set g_weaponreplace_hlac ""
+set g_weaponreplace_campingrifle ""
+
+
 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"
 set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
@@ -240,7 +261,6 @@
 set g_balance_rocketlauncher_laserguided_turnrate	0.75  //0.5
 set g_balance_rocketlauncher_laserguided_allow_steal	1
 
-// TESTING: port-o-launch
 set g_balance_porto_primary_refire 1.5
 set g_balance_porto_primary_speed 2000
 set g_balance_porto_primary_lifetime 30
@@ -248,7 +268,6 @@
 set g_balance_portal_health 200 // these get recharged whenever the portal is used
 set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 
-// TESTING: on-hand hook with bomb
 set g_balance_hook_primary_ammo 2 // hook monkeys set 0
 set g_balance_hook_primary_refire 0 // hook monkeys set 0
 set g_balance_hook_primary_animtime 0.3 // good shoot anim
@@ -356,7 +375,7 @@
 
 // NOTE: maps should not use this weapon yet
 set g_balance_campingrifle_magazinecapacity 8
-set g_balance_campingrifle_reloadtime 1.8 // this + primary animtime = 2.1 = exactly 3 shots
+set g_balance_campingrifle_reloadtime 2 // matches reload anim
 set g_balance_campingrifle_primary_damage 60
 set g_balance_campingrifle_primary_headshotaddeddamage 100
 set g_balance_campingrifle_primary_spread 0

Modified: branches/nexuiz-2.0/data/weaponsHavoc.cfg
===================================================================
--- branches/nexuiz-2.0/data/weaponsHavoc.cfg	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/data/weaponsHavoc.cfg	2009-03-16 09:12:13 UTC (rev 6191)
@@ -1,5 +1,26 @@
-set cvar_check_weapons 32e7dc7d745187473f0040d14892e2bb
+set cvar_check_weapons 6dd73b6c78519153d50f876be23bfe77
 
+// NOTE: this only replaces weapons on the map
+// use g_start_weapon_* to also replace the on-startup weapons!
+// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
+// set the cvars to "0" to totally disable a weapon
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi "campingrifle"
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex "campingrifle"
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_seeker "hagar"
+set g_weaponreplace_hlac ""
+set g_weaponreplace_campingrifle ""
+
+
 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"
 set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
@@ -15,7 +36,7 @@
 set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 set g_start_weapon_campingrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
-set g_start_ammo_shells 40
+set g_start_ammo_shells 60
 set g_start_ammo_nails 0
 set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
@@ -25,8 +46,8 @@
 set g_pickup_nails_max 200
 set g_pickup_rockets 30
 set g_pickup_rockets_max 120
-set g_pickup_cells 30
-set g_pickup_cells_max 120
+set g_pickup_cells 50
+set g_pickup_cells_max 200
 set g_pickup_armorsmall 5
 set g_pickup_armorsmall_max 200
 set g_pickup_armormedium 25
@@ -36,7 +57,7 @@
 set g_pickup_armorlarge 100
 set g_pickup_armorlarge_max 200
 set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 100
+set g_pickup_healthsmall_max 200
 set g_pickup_healthmedium 25
 set g_pickup_healthmedium_max 100
 set g_pickup_healthlarge 50
@@ -50,37 +71,37 @@
 set g_pickup_respawntime_weapon 15
 set g_pickup_respawntime_ammo 15
 
-set g_balance_laser_primary_damage 20
-set g_balance_laser_primary_edgedamage 10
+set g_balance_laser_primary_damage 5
+set g_balance_laser_primary_edgedamage 5
 set g_balance_laser_primary_force 400
 set g_balance_laser_primary_radius 70
 set g_balance_laser_primary_speed 9000
 set g_balance_laser_primary_refire 0.3
 set g_balance_laser_primary_animtime 0.3
 set g_balance_laser_primary_lifetime 30
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 20
+set g_balance_laser_secondary 1 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 35
 set g_balance_laser_secondary_edgedamage 10
-set g_balance_laser_secondary_force 400
+set g_balance_laser_secondary_force 50
 set g_balance_laser_secondary_radius 70
 set g_balance_laser_secondary_speed 9000
 set g_balance_laser_secondary_refire 0.3
 set g_balance_laser_secondary_animtime 0.3
 set g_balance_laser_secondary_lifetime 30
 
-set g_balance_shotgun_primary_bullets 4
-set g_balance_shotgun_primary_damage 6
+set g_balance_shotgun_primary_bullets 15
+set g_balance_shotgun_primary_damage 8
 set g_balance_shotgun_primary_force 0
-set g_balance_shotgun_primary_spread 0.06
-set g_balance_shotgun_primary_refire 0.3
+set g_balance_shotgun_primary_spread 0.15
+set g_balance_shotgun_primary_refire 1
 set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_ammo 3
 set g_balance_shotgun_primary_speed 12000
 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary_bullets 4
-set g_balance_shotgun_secondary_damage 6
+set g_balance_shotgun_secondary_bullets 6
+set g_balance_shotgun_secondary_damage 8
 set g_balance_shotgun_secondary_force 0
-set g_balance_shotgun_secondary_spread 0.06
+set g_balance_shotgun_secondary_spread 0.1
 set g_balance_shotgun_secondary_refire 1
 set g_balance_shotgun_secondary_animtime 0.2
 set g_balance_shotgun_secondary_ammo 1
@@ -122,29 +143,29 @@
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 10
 
-set g_balance_electro_primary_damage 50
-set g_balance_electro_primary_edgedamage 10
+set g_balance_electro_primary_damage 60
+set g_balance_electro_primary_edgedamage 40
 set g_balance_electro_primary_force 200
 set g_balance_electro_primary_radius 200
 set g_balance_electro_primary_speed 2000
 set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.5
+set g_balance_electro_primary_refire 0.8
 set g_balance_electro_primary_animtime 0.3
-set g_balance_electro_primary_ammo 2
-set g_balance_electro_secondary_damage 50
-set g_balance_electro_secondary_spread 0
-set g_balance_electro_secondary_edgedamage 10
+set g_balance_electro_primary_ammo 5
+set g_balance_electro_secondary_damage 30
+set g_balance_electro_secondary_spread 0.05
+set g_balance_electro_secondary_edgedamage 0
 set g_balance_electro_secondary_force 200
-set g_balance_electro_secondary_radius 200
-set g_balance_electro_secondary_speed 700
+set g_balance_electro_secondary_radius 50
+set g_balance_electro_secondary_speed 1200
 set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_lifetime 5
+set g_balance_electro_secondary_lifetime 1.5
 set g_balance_electro_secondary_refire 0.3
 set g_balance_electro_secondary_animtime 0.3
 set g_balance_electro_secondary_ammo 2
 set g_balance_electro_secondary_health 5
-set g_balance_electro_combo_damage 70
-set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_combo_damage 80
+set g_balance_electro_combo_edgedamage 30
 set g_balance_electro_combo_force 200
 set g_balance_electro_combo_radius 250
 set g_balance_electro_combo_speed 2000
@@ -152,18 +173,18 @@
 set g_balance_crylink_primary_damage 15
 set g_balance_crylink_primary_edgedamage 0
 set g_balance_crylink_primary_force 0
-set g_balance_crylink_primary_radius 20
+set g_balance_crylink_primary_radius 80
 set g_balance_crylink_primary_speed 7000
-set g_balance_crylink_primary_spread 0
-set g_balance_crylink_primary_shots 1
-set g_balance_crylink_primary_bounces 0
-set g_balance_crylink_primary_refire 0.1
-set g_balance_crylink_primary_animtime 0.1
-set g_balance_crylink_primary_ammo 1
+set g_balance_crylink_primary_spread 0.03
+set g_balance_crylink_primary_shots 4
+set g_balance_crylink_primary_bounces 1
+set g_balance_crylink_primary_refire 0.8
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_ammo 4
 set g_balance_crylink_primary_bouncedamagefactor 0.5
 
-set g_balance_crylink_primary_middle_lifetime 30 // range: virtually infinite
-set g_balance_crylink_primary_middle_fadetime 0
+set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
+set g_balance_crylink_primary_middle_fadetime 5
 set g_balance_crylink_primary_star_lifetime 0.1 // range: 700 full, fades to 2100
 set g_balance_crylink_primary_star_fadetime 0.2
 set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2100
@@ -172,57 +193,57 @@
 set g_balance_crylink_secondary_damage 15
 set g_balance_crylink_secondary_edgedamage 0
 set g_balance_crylink_secondary_force 100
-set g_balance_crylink_secondary_radius 20
+set g_balance_crylink_secondary_radius 80
 set g_balance_crylink_secondary_speed 7000
 set g_balance_crylink_secondary_spread 0.08
 set g_balance_crylink_secondary_shots 5
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.6
+set g_balance_crylink_secondary_bounces 1
+set g_balance_crylink_secondary_refire 0.8
 set g_balance_crylink_secondary_animtime 0.3
 set g_balance_crylink_secondary_ammo 5
 set g_balance_crylink_secondary_bouncedamagefactor 0.5
 
-set g_balance_crylink_secondary_middle_lifetime 30 // range: virtually infinite
-set g_balance_crylink_secondary_middle_fadetime 0
-set g_balance_crylink_secondary_line_lifetime 30 // range: virtually infinite
-set g_balance_crylink_secondary_line_fadetime 0
+set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_line_lifetime 2 // range: 35000 full, fades to 70000
+set g_balance_crylink_secondary_line_fadetime 2
 
 set g_balance_nex_damage 70
 set g_balance_nex_force 0
 set g_balance_nex_refire 0.7
 set g_balance_nex_animtime 0.3
-set g_balance_nex_ammo 5
+set g_balance_nex_ammo 15
 
 set g_balance_minstanex_refire 1
 set g_balance_minstanex_animtime 0.3
 set g_balance_minstanex_ammo 10
 
-set g_balance_hagar_primary_damage 40
+set g_balance_hagar_primary_damage 35
 set g_balance_hagar_primary_edgedamage 20
-set g_balance_hagar_primary_force 0
-set g_balance_hagar_primary_radius 120
-set g_balance_hagar_primary_spread 0
+set g_balance_hagar_primary_force 200
+set g_balance_hagar_primary_radius 90
+set g_balance_hagar_primary_spread 0.1
 set g_balance_hagar_primary_speed 3000
 set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.3
+set g_balance_hagar_primary_refire 0.1
 set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary_damage 40
+set g_balance_hagar_secondary_damage 35
 set g_balance_hagar_secondary_edgedamage 20
-set g_balance_hagar_secondary_force 0
-set g_balance_hagar_secondary_radius 120
-set g_balance_hagar_secondary_spread 0
-set g_balance_hagar_secondary_speed 1400
+set g_balance_hagar_secondary_force 200
+set g_balance_hagar_secondary_radius 90
+set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_speed 3000
 set g_balance_hagar_secondary_lifetime 30
-set g_balance_hagar_secondary_refire 0.3
+set g_balance_hagar_secondary_refire 0.1
 set g_balance_hagar_secondary_ammo 1
 
-set g_balance_rocketlauncher_damage 90
-set g_balance_rocketlauncher_edgedamage 45
+set g_balance_rocketlauncher_damage 120
+set g_balance_rocketlauncher_edgedamage 35
 set g_balance_rocketlauncher_force 800
 set g_balance_rocketlauncher_radius 110
-set g_balance_rocketlauncher_speed 1000
+set g_balance_rocketlauncher_speed 2000
 set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
+set g_balance_rocketlauncher_speedstart 2000
 set g_balance_rocketlauncher_lifetime 30
 set g_balance_rocketlauncher_refire 1
 set g_balance_rocketlauncher_animtime 0.3
@@ -235,26 +256,24 @@
 set g_balance_rocketlauncher_laserguided_turnrate	0.75  //0.5
 set g_balance_rocketlauncher_laserguided_allow_steal	1
 
-// TESTING: port-o-launch
 set g_balance_porto_primary_refire 1.5
 set g_balance_porto_primary_speed 2000
 set g_balance_porto_primary_lifetime 30
-set g_balance_porto_primary_ammo 25
+set g_balance_porto_primary_ammo 50
 set g_balance_portal_health 200 // these get recharged whenever the portal is used
 set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 
-// TESTING: on-hand hook with bomb
-set g_balance_hook_primary_ammo 1 // hook monkeys
-set g_balance_hook_primary_refire 0 // hook monkeys
+set g_balance_hook_primary_ammo 2 // hook monkeys set 0
+set g_balance_hook_primary_refire 0 // hook monkeys set 0
 set g_balance_hook_primary_animtime 0.3 // good shoot anim
 set g_balance_hook_primary_hooked_time_max 0 // infinite
 set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
-set g_balance_hook_primary_hooked_ammodecrease_delay 2.5 // no ammo used if nagative or 0
+set g_balance_hook_primary_hooked_ammodecrease_delay 0.5 // remove one cell every 0.5 seconds
 set g_balance_hook_secondary_damage 25 // not much
 set g_balance_hook_secondary_edgedamage 5 // not much
 set g_balance_hook_secondary_radius 500 // LOTS
 set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 25 // a whole pack
+set g_balance_hook_secondary_ammo 50 // a whole pack
 set g_balance_hook_secondary_lifetime 30 // infinite
 set g_balance_hook_secondary_speed 0 // not much throwing
 set g_balance_hook_secondary_gravity 5 // fast falling
@@ -265,35 +284,35 @@
 
 // HLAC 
 set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.25
-set g_balance_hlac_primary_spread_add 0.0045
-set g_balance_hlac_primary_spread_crouchmod 0.25
+set g_balance_hlac_primary_spread_max 0.03
+set g_balance_hlac_primary_spread_add 0.002
+set g_balance_hlac_primary_spread_crouchmod 0.5
 
-set g_balance_hlac_primary_damage 23
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 100
+set g_balance_hlac_primary_damage 12
+set g_balance_hlac_primary_edgedamage 0
+set g_balance_hlac_primary_force 50
 set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_speed 20000
 set g_balance_hlac_primary_lifetime 5
 
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.1
+set g_balance_hlac_primary_refire 0.05
+set g_balance_hlac_primary_animtime 0.05
 set g_balance_hlac_primary_ammo 1
 
-set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread 0.06
 set g_balance_hlac_secondary_spread_crouchmod 0.5
 
-set g_balance_hlac_secondary_damage 23
+set g_balance_hlac_secondary_damage 15
 set g_balance_hlac_secondary_edgedamage 10
 set g_balance_hlac_secondary_force 100
 set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_speed 20000
 set g_balance_hlac_secondary_lifetime 5
 
 set g_balance_hlac_secondary_refire 1
 set g_balance_hlac_secondary_animtime 0.3
 set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
+set g_balance_hlac_secondary_shots 5
 
 
 // TAG Seeker
@@ -350,9 +369,9 @@
 set g_balance_seeker_flac_ammo         0.5
 
 // 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 60
+set g_balance_campingrifle_magazinecapacity 5
+set g_balance_campingrifle_reloadtime 1.5
+set g_balance_campingrifle_primary_damage 50
 set g_balance_campingrifle_primary_headshotaddeddamage 100
 set g_balance_campingrifle_primary_spread 0
 set g_balance_campingrifle_primary_force 2
@@ -360,16 +379,16 @@
 set g_balance_campingrifle_primary_lifetime 5
 set g_balance_campingrifle_primary_refire 0.7
 set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
+set g_balance_campingrifle_primary_ammo 5
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
 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_spread 0.02
 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.1
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_health 5
+set g_balance_campingrifle_secondary_refire 0.2
+set g_balance_campingrifle_secondary_animtime 0.2
+set g_balance_campingrifle_secondary_ammo 5
+set g_balance_campingrifle_secondary_health 0
 set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu

Copied: branches/nexuiz-2.0/misc/mediasource/models/h_weapons (from rev 6190, trunk/misc/mediasource/models/h_weapons)

Copied: branches/nexuiz-2.0/misc/mediasource/models/h_weapons.zip (from rev 6181, trunk/misc/mediasource/models/h_weapons.zip)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/misc/tools/demotc.pl
===================================================================
--- branches/nexuiz-2.0/misc/tools/demotc.pl	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/misc/tools/demotc.pl	2009-03-16 09:12:13 UTC (rev 6191)
@@ -96,6 +96,7 @@
 		print $outfh pack("V", length($data) | DEMOMSG_CLIENT_TO_SERVER);
 		print $outfh $angles;
 		print $outfh $data;
+		next;
 	}
 	die "Invalid demo packet"
 		unless 12 == read $infh, my $angles, 12;

Modified: branches/nexuiz-2.0/server/server.cfg
===================================================================
--- branches/nexuiz-2.0/server/server.cfg	2009-03-16 08:39:44 UTC (rev 6190)
+++ branches/nexuiz-2.0/server/server.cfg	2009-03-16 09:12:13 UTC (rev 6191)
@@ -38,17 +38,11 @@
 // TEAMS for key hunt (change this to 2, 3, 4 to set a fixed keyhunt style)
 //g_keyhunt_teams_override -1  // teams for KH
 
-// GAME MODE: what type of server do you want to host? Only uncomment ONE of these.
-//g_dm 1          // deathmatch
-//g_tdm 1         // team deathmatch
-//g_ctf 1         // capture the flag
-//g_domination 1  // domination
-//g_runematch 1   // runematch
-//g_lms 1         // last man standing
-//g_arena 1       // arena
-//g_keyhunt 1     // key hunt
-//g_race 1        // Race
+// GAME MODE: what type of server do you want to host?
+// possible values: dm (deathmatch), tdm (team deathmatch), dom (domination), ctf (ctf), rune (runematch), lms (last man standing), arena (arena), kh (keyhunt), as (assault), ons (onslaught), race (race)
+//gametype dm
 
+
 // enable some mutators you'd like
 //g_cloaked 0              // set to 1 for transparent hard to see players
 //g_footsteps 0            // set to 1 to enable footsteps



More information about the nexuiz-commits mailing list