r4863 - in branches/nexuiz-2.0: . data data/gfx data/maps data/models data/models/turrets data/models/turrets/radiant data/models/weapons data/qcsrc/common data/qcsrc/menu/nexuiz data/qcsrc/server data/qcsrc/server/tturrets/include data/qcsrc/server/tturrets/system data/qcsrc/server/tturrets/units data/scripts data/textures
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Oct 24 05:45:14 EDT 2008
Author: div0
Date: 2008-10-24 05:45:12 -0400 (Fri, 24 Oct 2008)
New Revision: 4863
Added:
branches/nexuiz-2.0/data/gfx/inv_weapon12.tga
branches/nexuiz-2.0/data/gfx/inv_weapon13.tga
branches/nexuiz-2.0/data/maps/turret_test.bsp
branches/nexuiz-2.0/data/maps/turret_test.map
branches/nexuiz-2.0/data/maps/turret_test.waypoints
branches/nexuiz-2.0/data/models/tagrocket.md3
branches/nexuiz-2.0/data/models/tagrocket.tga
branches/nexuiz-2.0/data/models/turrets/r_fx1_1.tga
branches/nexuiz-2.0/data/models/turrets/r_fx1_2.tga
branches/nexuiz-2.0/data/models/turrets/r_fx1_3.tga
branches/nexuiz-2.0/data/models/turrets/r_fx1_4.tga
branches/nexuiz-2.0/data/models/turrets/r_fx1_5.tga
branches/nexuiz-2.0/data/models/turrets/radiant/walker.md3
branches/nexuiz-2.0/data/models/turrets/walker_base.tga
branches/nexuiz-2.0/data/models/turrets/walker_base_gloss.tga
branches/nexuiz-2.0/data/models/turrets/walker_base_glow.tga
branches/nexuiz-2.0/data/models/turrets/walker_base_norm.tga
branches/nexuiz-2.0/data/models/turrets/walker_body.md3
branches/nexuiz-2.0/data/models/turrets/walker_head_minigun.md3
branches/nexuiz-2.0/data/models/turrets/walker_mghead.md3
branches/nexuiz-2.0/data/models/turrets/walker_minigun.tga
branches/nexuiz-2.0/data/models/turrets/walker_props.md3
branches/nexuiz-2.0/data/models/turrets/walker_spawn.md3
branches/nexuiz-2.0/data/models/turrets/white.tga
branches/nexuiz-2.0/data/models/weapons/g_hlac.md3
branches/nexuiz-2.0/data/models/weapons/g_seeker.md3
branches/nexuiz-2.0/data/models/weapons/v_hlac.md3
branches/nexuiz-2.0/data/models/weapons/v_seeker.md3
branches/nexuiz-2.0/data/models/weapons/w_hlac.zym
branches/nexuiz-2.0/data/models/weapons/w_seeker.zym
branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh
branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_common.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_targettrigger.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc
branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc
branches/nexuiz-2.0/data/textures/hlac.tga
branches/nexuiz-2.0/data/textures/seeker.tga
branches/nexuiz-2.0/data/unit_walker.cfg
Removed:
branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets.qh
branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets_early.qh
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_damage.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_main.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_misc.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_scoreprocs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_common.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_fusionreactor.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_machinegun.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_phaser.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_targettrigger.qc
branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_tessla.qc
branches/nexuiz-2.0/data/unit_minigun.cfg
Modified:
branches/nexuiz-2.0/.patchsets
branches/nexuiz-2.0/data/build-compat-pack.sh
branches/nexuiz-2.0/data/defaultNexuiz.cfg
branches/nexuiz-2.0/data/effectinfo.txt
branches/nexuiz-2.0/data/models/turrets/c512.md3
branches/nexuiz-2.0/data/qcsrc/common/constants.qh
branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c
branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.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_triggers.qc
branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
branches/nexuiz-2.0/data/qcsrc/server/portals.qc
branches/nexuiz-2.0/data/qcsrc/server/progs.src
branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
branches/nexuiz-2.0/data/qcsrc/server/t_halflife.qc
branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
branches/nexuiz-2.0/data/qcsrc/server/target_spawn.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_hook.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_shotgun.qc
branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
branches/nexuiz-2.0/data/scripts/entities.def
branches/nexuiz-2.0/data/scripts/turrets.def
branches/nexuiz-2.0/data/scripts/turrets.shader
branches/nexuiz-2.0/data/turrets.cfg
branches/nexuiz-2.0/data/unit_hellion.cfg
branches/nexuiz-2.0/data/unit_hk.cfg
branches/nexuiz-2.0/data/unit_machinegun.cfg
branches/nexuiz-2.0/data/unit_mlrs.cfg
branches/nexuiz-2.0/data/unit_plasma.cfg
branches/nexuiz-2.0/data/unit_plasma2.cfg
branches/nexuiz-2.0/data/weapons.cfg
Log:
r4824 | div0 | 2008-10-23 08:05:13 +0200 (Thu, 23 Oct 2008) | 2 lines
fix turrets for onslaught: default them to have no team and attack nobody if not powered, make them not shoot at control point (that's the players' job!)
r4825 | div0 | 2008-10-23 08:23:23 +0200 (Thu, 23 Oct 2008) | 2 lines
reverse the logic of the turrets flag
r4826 | tzork | 2008-10-23 08:39:27 +0200 (Thu, 23 Oct 2008) | 1 line
Another round of turret updates.
r4827 | div0 | 2008-10-23 10:47:24 +0200 (Thu, 23 Oct 2008) | 2 lines
do not spawn near out-of-power nodes
r4828 | div0 | 2008-10-23 11:18:57 +0200 (Thu, 23 Oct 2008) | 2 lines
fix handling of isolated CPs
r4829 | tzork | 2008-10-23 11:38:00 +0200 (Thu, 23 Oct 2008) | 1 line
The walker is back.
r4830 | tzork | 2008-10-23 12:48:56 +0200 (Thu, 23 Oct 2008) | 1 line
HLAC and Tag Seeker weapons.
r4831 | tzork | 2008-10-23 12:53:23 +0200 (Thu, 23 Oct 2008) | 1 line
oops configs and inv icons is nice to have too.
r4832 | tzork | 2008-10-23 13:06:48 +0200 (Thu, 23 Oct 2008) | 1 line
r4833 | tzork | 2008-10-23 13:14:52 +0200 (Thu, 23 Oct 2008) | 2 lines
Oops forgot turret_unit_walker.qc
ONS - Turrets linked to unowned nodes deactivate
r4834 | tzork | 2008-10-23 13:33:00 +0200 (Thu, 23 Oct 2008) | 1 line
make walker validate its .target as a walker_checkpoint before trying to use it.
r4835 | div0 | 2008-10-23 14:03:50 +0200 (Thu, 23 Oct 2008) | 9 lines
trigger_relay_if - to help with entity factories that create a limited number of objects (to not spam the server).
A factory is now:
- a target_spawn
- a trigger_relay_if targeting the target_spawn
- a trigger_multivibrator targeting the trigger_relay_if
For later, what about making a target_spawnfactory entity that creates all these.
r4836 | tzork | 2008-10-23 14:22:48 +0200 (Thu, 23 Oct 2008) | 1 line
basic TFL_DMG_DEATH_NORESPAWN support (.damage_flags).
r4837 | div0 | 2008-10-23 14:26:25 +0200 (Thu, 23 Oct 2008) | 2 lines
add limiting to target_spawn (now can refuse to spawn more than a given count)
r4838 | div0 | 2008-10-23 14:37:46 +0200 (Thu, 23 Oct 2008) | 2 lines
seeker now honors IT_UNLIMITED_AMMO too
r4839 | div0 | 2008-10-23 14:58:59 +0200 (Thu, 23 Oct 2008) | 2 lines
fix the death messages of seeker
r4840 | div0 | 2008-10-23 15:01:13 +0200 (Thu, 23 Oct 2008) | 2 lines
HLAC: use projectiledeathtype properly
r4841 | div0 | 2008-10-23 15:11:27 +0200 (Thu, 23 Oct 2008) | 2 lines
add some missing cvars for hlac and seeker; fix newlines in constants.qh; slightly tune down seeker
r4842 | div0 | 2008-10-23 15:16:37 +0200 (Thu, 23 Oct 2008) | 2 lines
move weapon slots
r4843 | div0 | 2008-10-23 15:17:45 +0200 (Thu, 23 Oct 2008) | 2 lines
move the spawn funcs of hlac and seeker
r4844 | div0 | 2008-10-23 15:31:40 +0200 (Thu, 23 Oct 2008) | 2 lines
new compat pack
r4845 | div0 | 2008-10-23 15:35:10 +0200 (Thu, 23 Oct 2008) | 2 lines
remove some tgas from the compat pack
r4846 | tzork | 2008-10-23 15:45:43 +0200 (Thu, 23 Oct 2008) | 1 line
Walker & hlac texture updates.
r4847 | div0 | 2008-10-23 17:55:27 +0200 (Thu, 23 Oct 2008) | 2 lines
fix missing precaches
r4848 | div0 | 2008-10-24 08:17:05 +0200 (Fri, 24 Oct 2008) | 2 lines
offhand hook fixes
r4849 | div0 | 2008-10-24 08:18:18 +0200 (Fri, 24 Oct 2008) | 2 lines
fix spacing :P
r4850 | div0 | 2008-10-24 08:21:24 +0200 (Fri, 24 Oct 2008) | 2 lines
fix IT_UNLIMITED_AMMO
r4851 | div0 | 2008-10-24 08:37:10 +0200 (Fri, 24 Oct 2008) | 2 lines
unlimited ammo revisited: distinguish between superweapons and normal weapons
r4852 | div0 | 2008-10-24 09:09:33 +0200 (Fri, 24 Oct 2008) | 2 lines
explicitly set dphitcontentsmask on players
r4853 | div0 | 2008-10-24 09:35:00 +0200 (Fri, 24 Oct 2008) | 2 lines
rocket launcher now detonates in the think function, should fix problems with shortly pressed buttons
r4854 | tzork | 2008-10-24 09:46:23 +0200 (Fri, 24 Oct 2008) | 1 line
Better inactive turrets handling. cvar for enforcing target re-scan at minimum intervals (g_turrets_targetscan_mindelay). Some helpfully comments in turrets.cfg. g_turrets_aimidle_delay controls how long turrets aim where the last known enemy was before returning to "idle aim".
r4855 | div0 | 2008-10-24 09:48:04 +0200 (Fri, 24 Oct 2008) | 2 lines
change "player" checks to "iscreature" checks so one can have e.g. crates that push buttons
r4856 | tzork | 2008-10-24 09:54:17 +0200 (Fri, 24 Oct 2008) | 1 line
renamed src files. to much turrets/turret_something/tturret... ;)
r4857 | div0 | 2008-10-24 09:57:55 +0200 (Fri, 24 Oct 2008) | 2 lines
create portals below creatures, not walkers
r4858 | div0 | 2008-10-24 10:01:55 +0200 (Fri, 24 Oct 2008) | 2 lines
func_door fixes
r4859 | div0 | 2008-10-24 10:03:21 +0200 (Fri, 24 Oct 2008) | 2 lines
more door fixes
r4860 | div0 | 2008-10-24 11:06:45 +0200 (Fri, 24 Oct 2008) | 2 lines
more fixes - now we can have a companion cube :P
r4861 | div0 | 2008-10-24 11:25:09 +0200 (Fri, 24 Oct 2008) | 2 lines
add SUB_Friction (currently only used by target_spawn)
r4862 | div0 | 2008-10-24 11:28:09 +0200 (Fri, 24 Oct 2008) | 2 lines
fix SUB_Friction to only apply when onground
Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/.patchsets 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,2 +1,2 @@
master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-4822
+revisions_applied = 1-4862
Modified: branches/nexuiz-2.0/data/build-compat-pack.sh
===================================================================
--- branches/nexuiz-2.0/data/build-compat-pack.sh 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/build-compat-pack.sh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -16,6 +16,8 @@
gfx/final_rage_mini.tga
gfx/inv_weapon10.tga
gfx/inv_weapon11.tga
+ gfx/inv_weapon12.tga
+ gfx/inv_weapon13.tga
gfx/inv_weapon9.tga
gfx/reslimed_mini.tga
gfx/runningman_1on1remix_mini.tga
@@ -72,15 +74,58 @@
models/sprites/race-finish.tga
models/sprites/redbase.tga
models/sprites/waypoint.tga
+ models/tagrocket.md3
+ models/tagrocket.tga
+ models/turrets/base-gib1.md3
+ models/turrets/base-gib2.md3
+ models/turrets/base-gib3.md3
+ models/turrets/base-gib4.md3
+ models/turrets/base.md3
+ models/turrets/c512.md3
+ models/turrets/c8.md3
+ models/turrets/flac.md3
+ models/turrets/fusion_top.md3
+ models/turrets/fusreac.md3
+ models/turrets/head-gib1.md3
+ models/turrets/head-gib2.md3
+ models/turrets/head-gib3.md3
+ models/turrets/head-gib4.md3
+ models/turrets/hellion.md3
+ models/turrets/hk.md3
+ models/turrets/hunter2.md3
+ models/turrets/machinegun.md3
+ models/turrets/mlrs.md3
+ models/turrets/mlrs_rocket.md3
+ models/turrets/pd_proj.md3
+ models/turrets/phaser_beam.md3
+ models/turrets/phaser.md3
+ models/turrets/plasmad.md3
+ models/turrets/plasma.md3
+ models/turrets/reactor.md3
+ models/turrets/rocket.md3
+ models/turrets/tesla_base.md3
+ models/turrets/tesla_head.md3
+ models/turrets/tesla.md3
+ models/turrets/walker_body.md3
+ models/turrets/walker_head_minigun.md3
+ models/turrets/walker_mghead.md3
+ models/turrets/walker_props.md3
+ models/turrets/walker_spawn.md3
+ models/weapons/g_hlac.md3
models/weapons/g_hookgun.md3
models/weapons/g_minstanex.md3
models/weapons/g_porto.md3
+ models/weapons/g_seeker.md3
+ models/weapons/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_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
sound/announcer/male/airshot.ogg
sound/announcer/male/headshot.ogg
Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1112,15 +1112,15 @@
alias allready "sv_cmd allready"
-seta cl_weaponpriority "9 8 11 7 6 5 4 3 2 1 10 12" // default porto and hook as LOW priority, use the weapon key numbers otherwise
+seta cl_weaponpriority "14 13 9 8 11 7 6 5 4 3 2 1 10 12" // default porto and hook as LOW priority, use the weapon key numbers otherwise
seta cl_weaponpriority_useforcycling 0
// impulse 200, 210, 220:
-seta cl_weaponpriority0 "9 8 4" // explosives (RL Hagar Mortar)
+seta cl_weaponpriority0 "14 9 8 4" // explosives (RL Hagar Mortar)
// impulse 201, 211, 221:
-seta cl_weaponpriority1 "7 6 5 1" // energy (Nex Crylink Electro Laser)
+seta cl_weaponpriority1 "13 7 6 5 1" // energy (Nex Crylink Electro Laser)
seta cl_weaponpriority2 "7 3" // hitscan exact (Nex MG)
seta cl_weaponpriority3 "7 3 2" // hitscan all (Nex MG Shotgun)
-seta cl_weaponpriority4 "8 6 5 2" // spam (Hagar Crylink Electro Shotgun)
+seta cl_weaponpriority4 "13 8 6 5 2" // spam (Hagar Crylink Electro Shotgun)
seta cl_weaponpriority5 "1 12 10" // for moving (Laser Hook Port-O-Launch)
seta cl_weaponpriority6 ""
seta cl_weaponpriority7 ""
@@ -1144,6 +1144,8 @@
set g_weaponreplace_10 ""
set g_weaponreplace_11 ""
set g_weaponreplace_12 ""
+set g_weaponreplace_13 ""
+set g_weaponreplace_14 ""
seta sv_status_privacy 1 // hide IP addresses from "status" replies shown to clients
Modified: branches/nexuiz-2.0/data/effectinfo.txt
===================================================================
--- branches/nexuiz-2.0/data/effectinfo.txt 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/effectinfo.txt 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,2545 +1,2570 @@
-// item respawn effect
-// flare particle and light
-// used in qcsrc/server/bots.qc: //te_wizspike(start)
-// used in qcsrc/server/bots.qc: te_wizspike(org)
-// used in qcsrc/server/bots.qc: //te_wizspike(e.origin)
-// used in qcsrc/server/bots.qc: //te_wizspike(e.nearestwaypoint.wpnearestpoint)
-effect TE_WIZSPIKE
-countabsolute 1
-type static
-color 0x63F2EA 0x63f2EA
-size 20 20
-alpha 128 128 128
-lightradius 200
-lightradiusfade 200
-lightcolor 0.4 0.9 0.9
-// cloud of particles which expand rapidly and then slow to form a ball
-effect TE_WIZSPIKE
-count 100
-type static
-color 0x63F2EA 0x63f2EA
-size 2 2
-alpha 64 64 64
-airfriction 2
-liquidfriction 2
-originjitter 16 16 16
-velocityjitter 32 32 32
-
-// laser impact
-// decal
-// used in qcsrc/server/bots.qc: //te_knightspike(end)
-// used in qcsrc/server/bots.qc: te_knightspike(start)
-// used in qcsrc/server/bots.qc: te_knightspike(org)
-// used in qcsrc/server/bots.qc: te_knightspike(org)
-effect TE_KNIGHTSPIKE
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 1000
-lightcolor 4 0.2 0.2
-// flare effect
-effect TE_KNIGHTSPIKE
-countabsolute 1
-type static
-tex 39 39
-color 0xFF2010 0xFF2010
-alpha 256 256 1024
-size 24 24
-// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
-effect TE_KNIGHTSPIKE
-count 256
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 1024
-size 4 4
-//bounce 1.5
-airfriction 6
-liquidfriction 6
-//originjitter 32 32 32
-velocityjitter 256 256 256
-
-// machinegun bullet impact
-// bullet impact decal
-// used nowhere in code
-effect TE_SPIKE
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
-effect TE_SPIKE
-count 8
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
-effect TE_SPIKE
-count 1
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// bouncing sparks
-effect TE_SPIKE
-count 20
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 256
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// electro combo explosion
-// decal
-// used nowhere in code
-effect TE_SPIKEQUAD
-countabsolute 1
-type decal
-tex 59 59
-size 64 64
-alpha 256 256 0
-originjitter 34 34 34
-lightradius 400
-lightradiusfade 200
-lightcolor 2 2.5 3
-// flare effect
-effect TE_SPIKEQUAD
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 48 48
-alpha 256 256 128
-// large sparks
-effect TE_SPIKEQUAD
-count 20
-type static
-color 0x2030FF 0x80C0FF
-size 32 32
-alpha 256 256 256
-//gravity 1
-bounce 1.5
-airfriction 4
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-
-// quake effect
-// decal
-// used nowhere in code
-effect TE_SUPERSPIKE
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
-effect TE_SUPERSPIKE
-count 8
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
-effect TE_SUPERSPIKE
-count 1
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// sparks that disappear on impact
-effect TE_SUPERSPIKE
-count 30
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// quake effect
-// decal
-// used nowhere in code
-effect TE_SUPERSPIKEQUAD
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-lightradius 100
-lightradiusfade 500
-lightcolor 0.15 0.15 1.5
-// dust/smoke drifting away from the impact
-effect TE_SUPERSPIKEQUAD
-count 8
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
-effect TE_SUPERSPIKEQUAD
-count 1
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// sparks that disappear on impact
-effect TE_SUPERSPIKEQUAD
-count 30
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// shotgun pellet impact
-// decal
-// used in qcsrc/server/bots.qc: //te_gunshot(org)
-// used in qcsrc/server/bots.qc: te_gunshot(org)
-// used in qcsrc/server/bots.qc: te_gunshot(org)
-// used in qcsrc/server/bots.qc: te_gunshot(org)
-// used in qcsrc/server/bots.qc: //te_gunshot(end)
-effect TE_GUNSHOT
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
-effect TE_GUNSHOT
-count 4
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 128 128 64
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
-effect TE_GUNSHOT
-count 1
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 128 128 64
-originjitter 0 0 0
-velocityjitter 0 0 0
-// bouncing sparks
-effect TE_GUNSHOT
-count 10
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 64 64
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// crylink impact effect
-// decal
-// used nowhere in code
-effect TE_GUNSHOTQUAD
-countabsolute 1
-type decal
-tex 47 47
-size 8 8
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 100
-//lightradiusfade 300
-//lightcolor 0.5 0.5 0.5
-// purple flare effect
-effect TE_GUNSHOTQUAD
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 8 8
-alpha 256 256 512
-// purple sparks
-effect TE_GUNSHOTQUAD
-count 12
-type spark
-color 0xA040C0 0xFFFFFF
-size 1 1
-alpha 128 128 384
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 128 128 128
-
-// mortar/hagar explosion (smaller than rocket)
-// decal
-// used nowhere in code
-effect TE_EXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 350
-lightradiusfade 700
-lightcolor 4 2 0.5
-// flare effect
-effect TE_EXPLOSION
-countabsolute 1
-type static
-tex 35 37
-color 0x404040 0x404040
-size 48 48
-alpha 192 192 64
-// fire effect which expands then slows
-effect TE_EXPLOSION
-notunderwater
-count 128
-type static
-tex 48 55
-color 0x902010 0xFFD080
-size 16 16
-alpha 128 128 256
-bounce 1.5
-airfriction 4
-liquidfriction 4
-originjitter 8 8 8
-velocityjitter 256 256 256
-// underwater bubbles
-effect TE_EXPLOSION
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
-effect TE_EXPLOSION
-notunderwater
-count 32
-type spark
-color 0x903010 0xFFD030
-size 2 2
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// quake effect
-// decal
-// used nowhere in code
-effect TE_EXPLOSIONQUAD
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 350
-lightradiusfade 700
-lightcolor 4 2 8
-// smoke cloud
-effect TE_EXPLOSIONQUAD
-notunderwater
-count 32
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 12 12
-alpha 32 32 64
-velocityjitter 48 48 48
-// underwater bubbles
-effect TE_EXPLOSIONQUAD
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// sparks which go through walls
-effect TE_EXPLOSIONQUAD
-notunderwater
-count 128
-type spark
-color 0x903010 0xFFD030
-size 1 1
-alpha 0 256 512
-gravity 1
-airfriction 0.2
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// quake effect
-// decal
-// used in qcsrc/server/keyhunt.qc: te_tarexplosion(lostkey.origin)
-effect TE_TAREXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 600
-lightradiusfade 1200
-lightcolor 1.6 0.8 2
-// smoke cloud
-effect TE_TAREXPLOSION
-notunderwater
-count 32
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 12 12
-alpha 32 32 64
-velocityjitter 48 48 48
-// underwater bubbles
-effect TE_TAREXPLOSION
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// sparks which go through walls
-effect TE_TAREXPLOSION
-notunderwater
-count 128
-type spark
-color 0x903010 0xFFD030
-size 1 1
-alpha 0 256 512
-gravity 1
-airfriction 0.2
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// bloody impact effect indicating damage
-// used nowhere in code
-effect TE_BLOOD
-count 0.333
-type blood
-tex 24 32
-size 8 8
-alpha 256 256 64
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 1
-
-// sparks (quake effect)
-// used in qcsrc/server/antilag.qc: te_spark(antilag_takebackorigin(e, time - e.antilag_debug), '0 0 0', 32)
-// used in qcsrc/server/g_triggers.qc: self.mdl = "TE_SPARK"
-effect TE_SPARK
-count 1
-type spark
-tex 40 40
-color 0x8f4333 0xfff31b
-size 0.4 0.6
-alpha 64 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-velocitymultiplier 1
-
-// nex impact
-// decal
-// used in qcsrc/server/bots.qc: te_plasmaburn(org)
-effect TE_PLASMABURN
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 400
-lightcolor 1 1 1
-// flare effect
-effect TE_PLASMABURN
-countabsolute 1
-type static
-tex 37 37
-color 0x80C0FF 0x80C0FF
-size 8 8
-alpha 256 256 512
-// small sparks which form a sphere as they slow down
-effect TE_PLASMABURN
-count 256
-type spark
-color 0x2030FF 0x80C0FF
-size 1 2
-alpha 256 256 1024
-bounce 2
-airfriction 8
-liquidfriction 8
-velocityjitter 128 128 128
-
-// quake effect
-// used in qcsrc/server/bots.qc: //te_smallflash((e.absmin + e.absmax) * 0.5)
-// used in qcsrc/server/bots.qc: //te_smallflash((e.absmin + e.absmax) * 0.5)
-effect TE_SMALLFLASH
-lightradius 200
-lightradiusfade 1000
-lightcolor 2 2 2
-
-// quake effect
-// used nowhere in code
-effect TE_FLAMEJET
-count 1
-type smoke
-color 0x6f0f00 0xe3974f
-size 4 4
-alpha 64 128 384
-gravity -1
-bounce 1.1
-airfriction 1
-liquidfriction 4
-velocityjitter 128 128 128
-velocitymultiplier 1
-
-// quake effect
-// used nowhere in code
-effect TE_LAVASPLASH
-count 64
-type alphastatic
-color 0x6f0f00 0xe3974f
-size 12 12
-alpha 256 256 256
-gravity 0.05
-originoffset 0 0 32
-originjitter 128 128 32
-velocityoffset 0 0 256
-velocityjitter 128 128 0
-
-// player teleport effect
-// used nowhere in code
-effect TE_TELEPORT
-count 112
-type static
-color 0xA0A0A0 0xFFFFFF
-size 10 10
-alpha 64 128 256
-airfriction 1
-liquidfriction 4
-originoffset 0 0 28
-originjitter 16 16 28
-velocityjitter 0 0 256
-
-// nex beam
-// used in qcsrc/server/w_minstanex.qc: trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos)
-effect TE_TEI_G3
-countabsolute 1
-type beam
-tex 60 60
-color 0xFFFFFF 0xFFFFFF
-size 4 4
-alpha 128 128 256
-// experimental
-effect TE_TEI_G3
-trailspacing 2
-type static
-color 0x202020 0x404040
-size 1 1
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 8 8 8
-type smoke
-
-// smoke effect
-// used nowhere in code
-effect TE_TEI_SMOKE
-count 0.333
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 1
-
-// rocket explosion (bigger than mortar and hagar)
-// decal
-// used nowhere in code
-effect TE_TEI_BIGEXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 500
-lightradiusfade 500
-lightcolor 4 2 0.5
-// flare effect
-effect TE_TEI_BIGEXPLOSION
-countabsolute 1
-type static
-tex 35 37
-color 0x404040 0x404040
-size 72 72
-alpha 192 192 64
-// fire effect
-effect TE_TEI_BIGEXPLOSION
-notunderwater
-count 256
-type static
-tex 48 55
-color 0x902010 0xFFD080
-size 16 16
-alpha 128 128 256
-bounce 1.5
-airfriction 4
-liquidfriction 4
-originjitter 8 8 8
-velocityjitter 512 512 512
-// underwater bubbles
-effect TE_TEI_BIGEXPLOSION
-underwater
-count 64
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 144 144 144
-// bouncing sparks
-effect TE_TEI_BIGEXPLOSION
-notunderwater
-count 128
-type spark
-color 0x903010 0xFFD030
-size 2 2
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 384 384 384
-
-// electro explosion
-// decal
-// used nowhere in code
-effect TE_TEI_PLASMAHIT
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 20 20 20
-lightradius 200
-lightradiusfade 600
-lightcolor 2.4 4.8 8
-// flare effect
-effect TE_TEI_PLASMAHIT
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 32 32
-alpha 256 256 512
-// cloud of bouncing sparks
-effect TE_TEI_PLASMAHIT
-count 1
-type spark
-color 0x2030FF 0x80C0FF
-size 2 4
-alpha 256 256 1024
-//gravity 1
-bounce 1.5
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////
-// New effects in 2.4
-//////////////////////////////////////////////////
-
-
-
-// bloody impact effect indicating damage
-// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200))
-// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200))
-// used in qcsrc/server/g_violence.qc: pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10)
-effect blood
-count 0.333
-type blood
-tex 24 32
-size 8 8
-alpha 256 256 64
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 1
-
-
-
-// player teleport effect
-// used in qcsrc/server/t_teleporters.qc: pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1)
-// used in qcsrc/server/t_teleporters.qc: pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1)
-effect teleport
-count 112
-type static
-color 0xA0A0A0 0xFFFFFF
-size 10 10
-alpha 64 128 256
-airfriction 1
-liquidfriction 4
-originoffset 0 0 28
-originjitter 16 16 28
-velocityjitter 0 0 256
-
-
-
-// normal super gory blood trail (used by gibs)
-// used nowhere in code
-effect TR_BLOOD
-trailspacing 16
-type blood
-color 0xFFFFFF 0xFFFFFF
-tex 24 32
-size 8 8
-alpha 384 384 192
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 0.5
-
-
-
-// thinner blood trail (used by quake zombies)
-// used nowhere in code
-effect TR_SLIGHTBLOOD
-trailspacing 32
-type blood
-color 0xFFFFFF 0xFFFFFF
-tex 24 32
-size 8 8
-alpha 384 384 192
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 0.5
-
-
-
-// func_stardust effect, used in some maps to indicate teleporters
-// used in qcsrc/server/assault.qc: //self.effects = EF_STARDUST
-// used in qcsrc/server/g_triggers.qc: self.effects = EF_STARDUST
-// used in qcsrc/server/portals.qc: portal.effects = EF_STARDUST | EF_BLUE
-effect EF_STARDUST
-count 75
-type static
-color 0xfff368 0xfff368
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-
-// flare particle and light
-// used in qcsrc/server/t_items.qc: //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1)
-// used in qcsrc/server/t_items.qc: pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1)
-effect item_respawn
-countabsolute 1
-type static
-color 0x63F2EA 0x63f2EA
-size 32 32
-alpha 128 128 128
-// cloud of particles which expand rapidly and then slow to form a ball
-effect item_respawn
-count 64
-type spark
-tex 41 41
-color 0x63F2EA 0x63f2EA
-size 2 2
-alpha 256 256 1280
-//originjitter 24 24 24
-velocityjitter 256 256 256
-
-
-
-// used in qcsrc/server/t_jumppads.qc: pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1)
-effect jumppad_activate
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 2 2
-
-
-
-// used in qcsrc/server/w_laser.qc: pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect laser_muzzleflash
-count 1
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 0 8
-size 5 5
-alpha 64 64 128
-airfriction 12
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 3 0.1 0.1
-
-
-
-// decal
-// used in qcsrc/server/w_laser.qc: pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1)
-effect laser_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 500
-lightcolor 8 0.4 0.4
-// flare effect
-effect laser_impact
-countabsolute 1
-type static
-tex 39 39
-color 0xFF2010 0xFF2010
-alpha 256 256 1024
-size 24 24
-// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
-effect laser_impact
-count 256
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 1024
-size 4 4
-//bounce 1.5
-airfriction 6
-liquidfriction 6
-//originjitter 32 32 32
-velocityjitter 256 256 256
-effect laser_impact
-count 8
-type smoke
-tex 48 55
-color 0x800000 0xFF8020
-size 12 12
-alpha 128 256 256
-originjitter 1 1 1
-velocitymultiplier 0.01
-velocityjitter 16 16 16
-sizeincrease 6
-
-
-
-// used in qcsrc/server/w_shotgun.qc: pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"))
-// used in qcsrc/server/w_shotgun.qc: pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"))
-effect shotgun_muzzleflash
-count 3
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-sizeincrease 12
-velocitymultiplier 0.05
-effect shotgun_muzzleflash
-count 10
-type spark
-tex 40 40
-color 0xFFFDD9 0xff5a00
-size 2 2
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 444 444 444
-velocitymultiplier 1.7
-gravity 0.3
-airfriction 5
-
-
-
-// shotgun pellet impact
-// decal
-// used in qcsrc/server/w_common.qc: pointparticles(particleeffectnum("shotgun_impact"), trace_endpos, trace_plane_normal * 1000, 1)
-effect shotgun_impact
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-//lightradius 30
-//lightradiusfade 90
-//lightcolor 1 1 1
-// dust/smoke drifting away from the impact
-effect shotgun_impact
-count 5
-type smoke
-tex 0 8
-color 0xFFFFFF 0xA37443
-size 7 7
-alpha 0 64 32
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 100 100 100
-sizeincrease 12
-velocitymultiplier 0.25
-// dust/smoke staying at the impact
-effect shotgun_impact
-count 1
-type smoke
-tex 0 8
-color 0xFFFFFF 0xFFFFFF
-size 17 17
-alpha 64 64 32
-sizeincrease 4
-// sparks
-effect shotgun_impact
-notunderwater
-count 20
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.6 0.6
-alpha 256 256 768
-gravity 1
-bounce 1
-airfriction 5
-originjitter 1 1 1
-velocityjitter 400 400 400
-velocitymultiplier 0.1
-
-
-
-// used in qcsrc/server/w_uzi.qc: pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect uzi_muzzleflash
-count 2
-type static
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 1 1 1
-velocitymultiplier 0.03
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-gravity -0.1
-effect uzi_muzzleflash
-count 20
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 2 2
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-
-// decal
-// used in qcsrc/server/cl_client.qc: //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1)
-// used in qcsrc/server/w_common.qc: pointparticles(particleeffectnum("machinegun_impact"), trace_endpos, trace_plane_normal * 1000, 1)
-effect machinegun_impact
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 6 6 6
-lightradius 80
-lightradiusfade 800
-lightcolor 6 3.6 0.6
-// dust/smoke drifting away from the impact
-effect machinegun_impact
-count 5
-type smoke
-tex 0 8
-color 0xFFFFFF 0xA37443
-size 7 7
-alpha 0 64 32
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 100 100 100
-sizeincrease 12
-velocitymultiplier 0.25
-// dust/smoke staying at the impact
-effect machinegun_impact
-count 1
-type smoke
-tex 0 8
-color 0xFFFFFF 0xFFFFFF
-size 17 17
-alpha 64 64 32
-sizeincrease 4
-// sparks
-effect machinegun_impact
-notunderwater
-count 20
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.3 0.3
-alpha 256 256 768
-gravity 1
-bounce 1
-airfriction 5
-originjitter 1 1 1
-velocityjitter 400 400 400
-velocitymultiplier 0.1
-
-
-
-// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_porto.qc: //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect grenadelauncher_muzzleflash
-count 3
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-airfriction 12
-velocityjitter 20 20 20
-velocitymultiplier 0.03
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-effect grenadelauncher_muzzleflash
-count 30
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// hagar trail
-// smoke
-// used in qcsrc/server/w_hagar.qc: missile.modelflags = MF_GRENADE
-// used in qcsrc/server/w_hagar.qc: missile.modelflags = MF_GRENADE
-// used in qcsrc/server/w_porto.qc: gren.modelflags = MF_GRENADE
-effect TR_GRENADE
-trailspacing 6
-type alphastatic
-color 0x303030 0x000000
-tex 0 8
-size 1 2
-bounce 1
-sizeincrease 2
-alpha 100 200 280
-originjitter 1 1 1
-velocityjitter 1 1 1
-velocitymultiplier -0.02
-//gravity -0.11
-// fire
-effect TR_GRENADE
-notunderwater
-trailspacing 2
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 1 2
-sizeincrease -15
-alpha 100 144 988
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.0
-// bubbles
-effect TR_GRENADE
-underwater
-trailspacing 8
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-
-
-// mortar trail
-// smoke
-// used in qcsrc/server/w_grenadelauncher.qc: gren.modelflags = MF_TRACER2
-// used in qcsrc/server/w_grenadelauncher.qc: gren.modelflags = MF_TRACER2
-// used in qcsrc/server/w_hook.qc: gren.modelflags = MF_TRACER2
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-notunderwater
-trailspacing 5
-type alphastatic
-color 0x303030 0x000000
-tex 0 8
-size 3 3
-bounce 1
-sizeincrease 11
-alpha 100 200 400
-originjitter 2 2 2
-velocityjitter 3 3 3
-velocitymultiplier -0.02
-gravity -0.11
-//marker
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-type alphastatic
-color 0xFF0000 0xFF0000
-tex 62 62
-size 1 1
-sizeincrease -0.1
-trailspacing 1
-alpha 256 256 720
-// bubbles
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-
-
-// decal
-// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1)
-// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1)
-effect grenade_explode
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 250
-lightradiusfade 400
-lightcolor 8 4 1
-// fire effect which expands then slows
-effect grenade_explode
-notunderwater
-count 80
-type static
-tex 48 55
-color 0xe03f00 0x5e0000
-size 16 26
-sizeincrease 20
-alpha 128 228 356
-bounce 4.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-// fire effect which make brigt dot inside
-effect grenade_explode
-notunderwater
-count 30
-type static
-tex 48 55
-color 0xe03f00 0xffdf92
-size 6 16
-sizeincrease 40
-alpha 228 328 756
-bounce 1
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-// smoke
-effect grenade_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 20
-size 20 40
-sizeincrease 34
-alpha 500 600 556
-velocityjitter 256 256 256
-airfriction 5
-color 0x000000 0x111111
-bounce 6
-// underwater bubbles
-effect grenade_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
-effect grenade_explode
-notunderwater
-count 16
-type spark
-color 0x903010 0xFFD030
-size 2 2
-tex 40 40
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-
-
-// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect electro_muzzleflash
-count 1
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-effect electro_muzzleflash
-count 30
-type spark
-tex 31 31
-color 0xD9FDFF 0xD9FDFF
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// electro trail
-// glowing vapor trail
-// used nowhere in code
-effect TR_NEXUIZPLASMA
-trailspacing 2
-type static
-color 0x283880 0x283880
-size 3 3
-tex 62 62
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
-effect TR_NEXUIZPLASMA
-trailspacing 6
-count 3
-type snow
-tex 42 42
-color 0x629dff 0x0018ff
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-
-
-// decal
-// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1)
-effect electro_impact
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 20 20 20
-lightradius 250
-lightradiusfade 250
-lightcolor 3.125 4.375 10
-// flare effect
-effect electro_impact
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 12 32
-alpha 256 256 512
-// cloud of bouncing sparks
-effect electro_impact
-count 60
-type smoke
-tex 42 42
-color 0x629dff 0x0018ff
-size 36 36
-sizeincrease -50
-alpha 256 256 1024
-bounce 2
-gravity -0.3
-airfriction 6
-originjitter 1 1 1
-velocityjitter 512 512 512
-// inner cloud of smoke
-effect electro_impact
-count 60
-type smoke
-color 0x629dff 0x0018ff
-tex 0 8
-size 20 24
-sizeincrease 50
-alpha 200 256 512
-airfriction 30
-originjitter 20 20 20
-velocityjitter 320 320 320
-
-// decal
-// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1)
-effect electro_ballexplode
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 20 20 20
-lightradius 250
-lightradiusfade 250
-lightcolor 3.125 4.375 10
-// flare effect
-effect electro_ballexplode
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 32 32
-alpha 256 256 512
-// cloud of bouncing sparks
-effect electro_ballexplode
-count 128
-type spark
-tex 41 41
-color 0xFDFFD9 0xFDFFD9
-size 16 16
-alpha 256 256 1024
-bounce 2
-//airfriction 2
-originjitter 1 1 1
-velocityjitter 512 512 512
-// inner cloud of smoke
-effect electro_ballexplode
-count 16
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 24 24
-alpha 256 256 512
-originjitter 20 20 20
-velocityjitter 32 32 32
-
-
-
-// decal
-// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1)
-effect electro_combo
-countabsolute 1
-type decal
-tex 59 59
-size 64 64
-alpha 256 256 0
-originjitter 34 34 34
-lightradius 400
-lightradiusfade 300
-lightcolor 4 5 6
-// flare effect
-effect electro_combo
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 48 48
-alpha 128 128 64
-// large sparks
-effect electro_combo
-count 20
-type static
-color 0x2030FF 0x80C0FF
-size 32 32
-alpha 256 256 256
-bounce 2
-airfriction 6
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-effect electro_combo
-count 64
-type spark
-tex 41 41
-color 0xFDFFD9 0xFDFFD9
-size 16 16
-alpha 444 512 866
-bounce 2
-//airfriction 2
-originjitter 1 1 1
-velocityjitter 512 512 512
-// inner cloud of smoke
-effect electro_combo
-count 0.25
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 24 24
-alpha 256 256 256
-originjitter 20 20 20
-velocityjitter 32 32 32
-
-
-
-// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
-// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
-effect crylink_muzzleflash
-count 1
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 128 128 256
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-effect crylink_muzzleflash
-count 10
-type spark
-tex 40 40
-color 0xA080C0 0xA080C0
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 200 200 200
-velocitymultiplier 0.3
-airfriction 12
-
-
-
-// crylink impact effect
-// decal
-// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1)
-effect crylink_impact
-countabsolute 1
-type decal
-tex 47 47
-size 8 8
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 60
-//lightradiusfade 300
-//lightcolor 3.2 0.4 4
-// purple flare effect
-effect crylink_impact
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 8 8
-alpha 256 256 512
-// purple sparks
-effect crylink_impact
-count 20
-type spark
-tex 41 41
-color 0xA040C0 0xA040C0
-bounce 2
-size 4 4
-alpha 256 256 1024
-velocityjitter 256 256 256
-// purple splash
-effect crylink_impact
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 8 8
-alpha 256 256 512
-velocityjitter 8 8 8
-// purple splash
-effect crylink_impact
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 8 8
-alpha 256 256 1024
-velocityjitter 32 32 32
-
-
-
-// used in qcsrc/server/w_minstanex.qc: pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_nex.qc: pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect nex_muzzleflash
-count 10
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 16 16
-alpha 128 128 192
-originjitter 4 4 4
-velocityjitter 24 24 24
-velocitymultiplier 0.02
-lightradius 200
-lightradiusfade 200
-lightcolor 2 2.5 3
-effect nex_muzzleflash
-count 150
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 600 600 600
-velocitymultiplier 0.5
-airfriction 9
-
-
-
-//// nex beam
-//effect nex_beam
-//countabsolute 1
-//type beam
-//tex 60 60
-//color 0xFFFFFF 0xFFFFFF
-//size 6 6
-//alpha 128 128 192
-// nex beam: ring smoke
-// used in qcsrc/server/w_nex.qc: trailparticles(world, particleeffectnum("nex_beam"), w_shotorg, trace_endpos)
-effect nex_beam
-trailspacing 32
-color 0x1680A0 0x1680A0
-size 4 4
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
-// nex beam: drifting smoke
-effect nex_beam
-trailspacing 6
-color 0x5080A0 0x5080A0
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
-// nex beam: bright core
-effect nex_beam
-trailspacing 6
-color 0x80CDFF 0x80CDFF
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-//sparks
-effect nex_beam
-trailspacing 8
-color 0x1680A0 0x1680A0
-size 1 1
-tex 63 63
-alpha 64 128 80
-airfriction 5
-gravity -0.01
-type snow
-
-// nex impact
-// decal
-// used in qcsrc/server/w_minstanex.qc: pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1)
-// used in qcsrc/server/w_nex.qc: pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1)
-effect nex_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 250
-lightcolor 4 6 8
-// shockwave
-effect nex_impact
-countabsolute 1
-type static
-tex 34 34
-size 16 16
-alpha 100 100 300
-sizeincrease 200
-
-
-// flare effect
-effect nex_impact
-countabsolute 1
-type static
-tex 37 37
-color 0x80C0FF 0x80C0FF
-size 8 8
-alpha 256 256 256
-// small sparks which form a sphere as they slow down
-//effect nex_impact
-//count 256
-//type spark
-//color 0x2030FF 0x80C0FF
-//size 1 2
-//alpha 256 256 512
-//bounce 2
-//airfriction 8
-//liquidfriction 8
-//velocityjitter 384 384 384
-// small sparks which glow brightly but live briefly
-effect nex_impact
-count 128
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 4 4
-alpha 0 128 512
-bounce 2
-velocityjitter 600 600 600
-velocitymultiplier 0.5
-airfriction 9
-
-
-
-// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect hagar_muzzleflash
-count 4
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-effect hagar_muzzleflash
-count 30
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_bounce"), self.origin, self.velocity, 1)
-effect hagar_bounce
-count 4
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 256
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 60
-lightradiusfade 300
-lightcolor 2 1.5 0.2
-effect hagar_bounce
-count 30
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 256 256
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 600 600 600
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// decal
-// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
-// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
-effect hagar_explode
-countabsolute 1
-type decal
-tex 8 16
-size 28 38
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 250
-lightradiusfade 400
-lightcolor 8 4 1
-// fire effect which make bright dot inside
-effect hagar_explode
-notunderwater
-count 12
-type smoke
-tex 48 55
-color 0xffe955 0xff5a00
-size 16 26
-sizeincrease 5
-alpha 128 256 456
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 156 156 156
-// fire effect which expands then slows
-effect hagar_explode
-notunderwater
-count 24
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 26
-sizeincrease 15
-alpha 128 256 456
-bounce 1.5
-airfriction 12
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-
-// smoke
-effect hagar_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 20
-size 20 40
-sizeincrease 20
-alpha 500 600 556
-velocityjitter 244 244 244
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-
-// underwater bubbles
-effect hagar_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
-effect hagar_explode
-notunderwater
-count 16
-type spark
-color 0x903010 0xFFD030
-size 2 2
-tex 40 40
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-
-
-// used in qcsrc/server/w_rocketlauncher.qc: pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-effect rocketlauncher_muzzleflash
-count 20
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 1 1
-sizeincrease 20
-alpha 256 256 256
-airfriction 2
-originjitter 1.5 1.5 1.5
-velocityjitter 40 40 40
-velocitymultiplier -0.13
-//lightradius 200
-//lightradiusfade 2000
-//lightcolor 2 1.5 0.2
-effect rocketlauncher_muzzleflash
-count 30
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// rocket trail
-// smoke
-// used nowhere in code
-effect TR_ROCKET
-trailspacing 5
-type alphastatic
-color 0x303030 0x000000
-tex 0 8
-size 1 4
-bounce 1
-sizeincrease 11
-alpha 200 300 200
-lightradius 150
-lighttime 0
-lightcolor 6 3 1
-originjitter 2 2 2
-velocityjitter 3 3 3
-velocitymultiplier -0.02
-//gravity -0.11
-// fire
-effect TR_ROCKET
-notunderwater
-trailspacing 2
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 7 7
-sizeincrease -30
-alpha 100 144 588
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.5
-// bubbles
-effect TR_ROCKET
-underwater
-trailspacing 8
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-// sparks
-effect TR_ROCKET
-trailspacing 10
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 1 1
-alpha 444 512 1866
-//gravity 1
-bounce 1
-//velocityoffset 0 0 15
-airfriction 5
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier -0.31
-
-// rocket explosion (bigger than mortar and hagar)
-// decal
-// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1)
-// used in qcsrc/server/portals.qc: pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4)
-// used in qcsrc/server/w_rocketlauncher.qc: pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1)
-effect rocket_explode
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 400
-lightradiusfade 750
-lightcolor 8 4 1
-// fire effect
-effect rocket_explode
-notunderwater
-count 64
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 33 44
-sizeincrease 45
-alpha 200 256 512
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 512 512 512
-// fire effect 2
-effect rocket_explode
-notunderwater
-count 28
-type smoke
-tex 48 55
-color 0xea691b 0xeed05a
-size 33 44
-sizeincrease 55
-alpha 200 256 612
-bounce 2.5
-airfriction 19
-liquidfriction 19
-originjitter 8 8 8
-velocityjitter 912 912 912
-// smoke
-effect rocket_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 64
-size 20 40
-sizeincrease 44
-alpha 400 500 456
-velocityjitter 444 444 444
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-// underwater bubbles
-effect rocket_explode
-underwater
-count 64
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 144 144 144
-// bouncing sparks
-effect rocket_explode
-notunderwater
-count 64
-type spark
-tex 40 40
-color 0xffa800 0xffedaf
-size 1 1
-sizeincrease 2
-alpha 44 256 384
-gravity 1
-airfriction -1
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 224 224 324
-
-
-
-// used in qcsrc/server/g_hook.qc: pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1)
-effect grapple_muzzleflash
-lightradius 160
-lightradiusfade 800
-lightcolor 1 0 0
-
-
-
-// used in qcsrc/server/g_hook.qc: pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1)
-effect grapple_impact
-lightradius 160
-lightradiusfade 800
-lightcolor 1 0 0
-
-
-
-// used nowhere in code
-effect nex242_misc_laser_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0xff0000 0xff0000
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-
-
-// used nowhere in code
-effect nex242_misc_laser_beam_fast
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 640
-color 0xff0000 0xff0000
-sizeincrease 0.1
-
-// used nowhere in code
-effect nex242_misc_laser_beam_fast_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// additional laser colors (mike)
-// used nowhere in code
-effect nex242_misc_laser_green_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0x00ff00 0x00ff00
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_green_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_blue_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0x0000ff 0x0000ff
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_blue_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_yellow_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0xffff00 0xffff00
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_yellow_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_cyan_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0x00ffff 0x00ffff
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_cyan_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_magenta_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0xff00ff 0xff00ff
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_magenta_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_white_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0xffffff 0xffffff
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_white_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_black_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0x000000 0x000000
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_black_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
-effect nex242_misc_laser_orange_beam
-countabsolute 1
-type beam
-tex 60 60
-size 1 1
-alpha 256 256 64
-color 0xff6600 0xff6600
-sizeincrease 1
-
-// used nowhere in code
-effect nex242_misc_laser_orange_beam_end
-count 1
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-
-
-
-// bigger crylink impact effect
-// decal
-// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1)
-effect crylink_impactbig
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 200
-//lightradiusfade 800
-//lightcolor 3.2 0.4 4
-// purple flare effect
-effect crylink_impactbig
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 24 24
-alpha 256 256 512
-// purple sparks
-effect crylink_impactbig
-count 80
-type spark
-tex 41 41
-color 0xA040C0 0xA040C0
-bounce 2
-size 6 6
-alpha 256 256 1024
-velocityjitter 512 512 512
-// purple splash
-effect crylink_impactbig
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 512
-velocityjitter 32 32 32
-// purple splash
-effect crylink_impactbig
-count 6
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 1024
-velocityjitter 256 256 256
-
-// Zero-violence effects
-
-// impact effect indicating damage
-// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("damage_hit"), hitloc, force, bound(0, damage, 200))
-effect damage_hit
-count 1
-type static
-color 0x20FF30 0x80FFC0
-size 1 1
-alpha 256 256 256
-gravity -0.4
-bounce 1.5
-airfriction 8
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 16 16 16
-
-// effect for removing player model
-// "teleport"
-// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("damage_dissolve"), self.origin, force, 1)
-effect damage_dissolve
-count 96
-type static
-color 0x66FF66 0xFFFFFF
-size 10 10
-alpha 64 128 128
-airfriction 1
-liquidfriction 4
-originoffset 0 0 28
-originjitter 16 16 28
-velocityjitter 0 0 256
-// flare
-effect damage_dissolve
-countabsolute 1
-type static
-tex 38 38
-color 0x00FF00 0x99FF99
-size 32 32
-alpha 256 256 196
-// large sparks
-effect damage_dissolve
-count 20
-type static
-color 0x00FF00 0x99FF99
-size 16 16
-alpha 256 256 256
-//gravity 1
-bounce 1.5
-airfriction 4
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-
-// decal
-// used in qcsrc/server/g_triggers.qc: self.cnt = particleeffectnum("laser_deadly")
-effect laser_deadly
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
-effect laser_deadly
-count 0.05 // 50 per second
-type smoke
-tex 48 55
-color 0xFFFFFF 0xFFFFFF
-size 3 3
-alpha 0 64 64
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 15 15 15
-sizeincrease 2
-velocitymultiplier 20
-// sparks
-effect laser_deadly
-notunderwater
-count 0.05 // 50 per second
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.6 0.6
-alpha 256 256 768
-gravity 1
-bounce 1
-airfriction 5
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier 100
-
-
-//torch
-//fire
-// used nowhere in code
-effect torch_small
-//notunderwater
-count 16
-type smoke
-tex 48 55
-size 1 11
-alpha 200 256 512
-gravity -0.5
-color 0x8f0d00 0xff5a00
-//bounce 1
-sizeincrease -1
-originjitter 5 5 5
-velocityjitter 1 1 50
-// smoke
-effect torch_small
-type alphastatic
-count 8
-tex 0 8
-size 5 10
-sizeincrease 5
-alpha 200 256 200
-color 0x000000 0x111111
-gravity -0.3
-originjitter 3 3 3
-velocityjitter 11 11 50
-//bounce 1
-
-//fountain01
-// used nowhere in code
-effect fountain01
-count 32
-tex 0 8
-size 10 15
-alpha 0 100 100
-gravity 0.6
-bounce 1
-sizeincrease 20
-type snow
-bounce 1
-originjitter 5 5 5
-velocityjitter 81 81 150
-color 0x7cbaff 0xcfd1ff
-velocitymultiplier 2
-
-
-
-// decal
-// used in qcsrc/server/w_hook.qc: pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1)
-effect hookbomb_explode
-countabsolute 1
-type decal
-tex 8 16
-size 96 96
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 1600
-lightradiusfade 800
-lightcolor 1 4 8
-// fire effect which make brigt dot inside
-effect hookbomb_explode
-notunderwater
-count 100
-type static
-tex 48 55
-color 0x003fe0 0x92dfff
-size 12 32
-sizeincrease 80
-alpha 512 328 756
-bounce 1
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 1024 1024 1024
-// smoke
-effect hookbomb_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 160
-size 80 160
-sizeincrease 300
-alpha 500 600 556
-velocityoffset 0 0 0
-velocityjitter 256 256 256
-airfriction 0
-color 0x000000 0x111111
-bounce 6
-// underwater bubbles
-effect hookbomb_explode
-underwater
-count 60
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.0625
-originjitter 16 16 16
-velocityjitter 192 192 192
+// item respawn effect
+// flare particle and light
+// used in qcsrc/server/bots.qc: //te_wizspike(start)
+// used in qcsrc/server/bots.qc: te_wizspike(org)
+// used in qcsrc/server/bots.qc: //te_wizspike(e.origin)
+// used in qcsrc/server/bots.qc: //te_wizspike(e.nearestwaypoint.wpnearestpoint)
+effect TE_WIZSPIKE
+countabsolute 1
+type static
+color 0x63F2EA 0x63f2EA
+size 20 20
+alpha 128 128 128
+lightradius 200
+lightradiusfade 200
+lightcolor 0.4 0.9 0.9
+// cloud of particles which expand rapidly and then slow to form a ball
+effect TE_WIZSPIKE
+count 100
+type static
+color 0x63F2EA 0x63f2EA
+size 2 2
+alpha 64 64 64
+airfriction 2
+liquidfriction 2
+originjitter 16 16 16
+velocityjitter 32 32 32
+
+// laser impact
+// decal
+// used in qcsrc/server/bots.qc: //te_knightspike(end)
+// used in qcsrc/server/bots.qc: te_knightspike(start)
+// used in qcsrc/server/bots.qc: te_knightspike(org)
+// used in qcsrc/server/bots.qc: te_knightspike(org)
+effect TE_KNIGHTSPIKE
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+lightradius 200
+lightradiusfade 1000
+lightcolor 4 0.2 0.2
+// flare effect
+effect TE_KNIGHTSPIKE
+countabsolute 1
+type static
+tex 39 39
+color 0xFF2010 0xFF2010
+alpha 256 256 1024
+size 24 24
+// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+effect TE_KNIGHTSPIKE
+count 256
+type spark
+color 0x800000 0xFF8020
+alpha 256 256 1024
+size 4 4
+//bounce 1.5
+airfriction 6
+liquidfriction 6
+//originjitter 32 32 32
+velocityjitter 256 256 256
+
+// machinegun bullet impact
+// bullet impact decal
+// used nowhere in code
+effect TE_SPIKE
+countabsolute 1
+type decal
+tex 56 59
+size 5 5
+alpha 256 256 0
+originjitter 6 6 6
+// dust/smoke drifting away from the impact
+effect TE_SPIKE
+count 8
+type smoke
+tex 0 8
+color 0x101010 0x101010
+size 3 3
+sizeincrease 3
+alpha 255 255 256
+originjitter 0 0 0
+velocityjitter 8 8 8
+// dust/smoke staying at the impact
+effect TE_SPIKE
+count 1
+type smoke
+tex 0 8
+color 0x505050 0x505050
+size 4 4
+sizeincrease 4
+alpha 255 255 128
+originjitter 0 0 0
+velocityjitter 0 0 0
+// bouncing sparks
+effect TE_SPIKE
+count 20
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 0 256 256
+gravity 1
+bounce 1.5
+velocityoffset 0 0 80
+velocityjitter 64 64 64
+
+// electro combo explosion
+// decal
+// used nowhere in code
+effect TE_SPIKEQUAD
+countabsolute 1
+type decal
+tex 59 59
+size 64 64
+alpha 256 256 0
+originjitter 34 34 34
+lightradius 400
+lightradiusfade 200
+lightcolor 2 2.5 3
+// flare effect
+effect TE_SPIKEQUAD
+countabsolute 1
+type static
+tex 38 38
+color 0x80C0FF 0x80C0FF
+size 48 48
+alpha 256 256 128
+// large sparks
+effect TE_SPIKEQUAD
+count 20
+type static
+color 0x2030FF 0x80C0FF
+size 32 32
+alpha 256 256 256
+//gravity 1
+bounce 1.5
+airfriction 4
+liquidfriction 16
+//velocityoffset 0 0 120
+velocityjitter 512 512 512
+
+// quake effect
+// decal
+// used nowhere in code
+effect TE_SUPERSPIKE
+countabsolute 1
+type decal
+tex 56 59
+size 3 3
+alpha 256 256 0
+originjitter 6 6 6
+// dust/smoke drifting away from the impact
+effect TE_SUPERSPIKE
+count 8
+type smoke
+tex 0 8
+color 0x101010 0x101010
+size 3 3
+sizeincrease 3
+alpha 255 255 256
+originjitter 0 0 0
+velocityjitter 8 8 8
+// dust/smoke staying at the impact
+effect TE_SUPERSPIKE
+count 1
+type smoke
+tex 0 8
+color 0x505050 0x505050
+size 4 4
+sizeincrease 4
+alpha 255 255 128
+originjitter 0 0 0
+velocityjitter 0 0 0
+// sparks that disappear on impact
+effect TE_SUPERSPIKE
+count 30
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 0 256 768
+gravity 1
+bounce -1
+velocityoffset 0 0 80
+velocityjitter 64 64 64
+
+// quake effect
+// decal
+// used nowhere in code
+effect TE_SUPERSPIKEQUAD
+countabsolute 1
+type decal
+tex 56 59
+size 3 3
+alpha 256 256 0
+originjitter 6 6 6
+lightradius 100
+lightradiusfade 500
+lightcolor 0.15 0.15 1.5
+// dust/smoke drifting away from the impact
+effect TE_SUPERSPIKEQUAD
+count 8
+type smoke
+tex 0 8
+color 0x101010 0x101010
+size 3 3
+sizeincrease 3
+alpha 255 255 256
+originjitter 0 0 0
+velocityjitter 8 8 8
+// dust/smoke staying at the impact
+effect TE_SUPERSPIKEQUAD
+count 1
+type smoke
+tex 0 8
+color 0x505050 0x505050
+size 4 4
+sizeincrease 4
+alpha 255 255 128
+originjitter 0 0 0
+velocityjitter 0 0 0
+// sparks that disappear on impact
+effect TE_SUPERSPIKEQUAD
+count 30
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 0 256 768
+gravity 1
+bounce -1
+velocityoffset 0 0 80
+velocityjitter 64 64 64
+
+// shotgun pellet impact
+// decal
+// used in qcsrc/server/bots.qc: //te_gunshot(org)
+// used in qcsrc/server/bots.qc: te_gunshot(org)
+// used in qcsrc/server/bots.qc: te_gunshot(org)
+// used in qcsrc/server/bots.qc: te_gunshot(org)
+// used in qcsrc/server/bots.qc: //te_gunshot(end)
+effect TE_GUNSHOT
+countabsolute 1
+type decal
+tex 56 59
+size 3 3
+alpha 256 256 0
+originjitter 6 6 6
+// dust/smoke drifting away from the impact
+effect TE_GUNSHOT
+count 4
+type smoke
+tex 0 8
+color 0x101010 0x101010
+size 3 3
+sizeincrease 3
+alpha 128 128 64
+originjitter 0 0 0
+velocityjitter 8 8 8
+// dust/smoke staying at the impact
+effect TE_GUNSHOT
+count 1
+type smoke
+tex 0 8
+color 0x505050 0x505050
+size 4 4
+sizeincrease 4
+alpha 128 128 64
+originjitter 0 0 0
+velocityjitter 0 0 0
+// bouncing sparks
+effect TE_GUNSHOT
+count 10
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 0 64 64
+gravity 1
+bounce 1.5
+velocityoffset 0 0 80
+velocityjitter 64 64 64
+
+// crylink impact effect
+// decal
+// used nowhere in code
+effect TE_GUNSHOTQUAD
+countabsolute 1
+type decal
+tex 47 47
+size 8 8
+alpha 256 256 0
+originjitter 12 12 12
+//lightradius 100
+//lightradiusfade 300
+//lightcolor 0.5 0.5 0.5
+// purple flare effect
+effect TE_GUNSHOTQUAD
+countabsolute 1
+type static
+tex 39 39
+color 0x504060 0x504060
+size 8 8
+alpha 256 256 512
+// purple sparks
+effect TE_GUNSHOTQUAD
+count 12
+type spark
+color 0xA040C0 0xFFFFFF
+size 1 1
+alpha 128 128 384
+gravity 1
+bounce 1.5
+velocityoffset 0 0 80
+velocityjitter 128 128 128
+
+// mortar/hagar explosion (smaller than rocket)
+// decal
+// used nowhere in code
+effect TE_EXPLOSION
+countabsolute 1
+type decal
+tex 8 16
+size 48 48
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 350
+lightradiusfade 700
+lightcolor 4 2 0.5
+// flare effect
+effect TE_EXPLOSION
+countabsolute 1
+type static
+tex 35 37
+color 0x404040 0x404040
+size 48 48
+alpha 192 192 64
+// fire effect which expands then slows
+effect TE_EXPLOSION
+notunderwater
+count 128
+type static
+tex 48 55
+color 0x902010 0xFFD080
+size 16 16
+alpha 128 128 256
+bounce 1.5
+airfriction 4
+liquidfriction 4
+originjitter 8 8 8
+velocityjitter 256 256 256
+// underwater bubbles
+effect TE_EXPLOSION
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 96 96 96
+// bouncing sparks
+effect TE_EXPLOSION
+notunderwater
+count 32
+type spark
+color 0x903010 0xFFD030
+size 2 2
+alpha 256 256 384
+gravity 1
+airfriction 0.2
+bounce 1.5
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 256 256 256
+
+// quake effect
+// decal
+// used nowhere in code
+effect TE_EXPLOSIONQUAD
+countabsolute 1
+type decal
+tex 8 16
+size 48 48
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 350
+lightradiusfade 700
+lightcolor 4 2 8
+// smoke cloud
+effect TE_EXPLOSIONQUAD
+notunderwater
+count 32
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 12 12
+alpha 32 32 64
+velocityjitter 48 48 48
+// underwater bubbles
+effect TE_EXPLOSIONQUAD
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 96 96 96
+// sparks which go through walls
+effect TE_EXPLOSIONQUAD
+notunderwater
+count 128
+type spark
+color 0x903010 0xFFD030
+size 1 1
+alpha 0 256 512
+gravity 1
+airfriction 0.2
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 256 256 256
+
+// quake effect
+// decal
+// used in qcsrc/server/keyhunt.qc: te_tarexplosion(lostkey.origin)
+effect TE_TAREXPLOSION
+countabsolute 1
+type decal
+tex 8 16
+size 48 48
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 600
+lightradiusfade 1200
+lightcolor 1.6 0.8 2
+// smoke cloud
+effect TE_TAREXPLOSION
+notunderwater
+count 32
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 12 12
+alpha 32 32 64
+velocityjitter 48 48 48
+// underwater bubbles
+effect TE_TAREXPLOSION
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 96 96 96
+// sparks which go through walls
+effect TE_TAREXPLOSION
+notunderwater
+count 128
+type spark
+color 0x903010 0xFFD030
+size 1 1
+alpha 0 256 512
+gravity 1
+airfriction 0.2
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 256 256 256
+
+// bloody impact effect indicating damage
+// used nowhere in code
+effect TE_BLOOD
+count 0.333
+type blood
+tex 24 32
+size 8 8
+alpha 256 256 64
+bounce -1
+airfriction 1
+liquidfriction 4
+velocityjitter 64 64 64
+velocitymultiplier 1
+
+// sparks (quake effect)
+// used in qcsrc/server/antilag.qc: te_spark(antilag_takebackorigin(e, time - e.antilag_debug), '0 0 0', 32)
+// used in qcsrc/server/g_triggers.qc: self.mdl = "TE_SPARK"
+effect TE_SPARK
+count 1
+type spark
+tex 40 40
+color 0x8f4333 0xfff31b
+size 0.4 0.6
+alpha 64 256 768
+gravity 1
+bounce -1
+velocityoffset 0 0 80
+velocityjitter 64 64 64
+velocitymultiplier 1
+
+// nex impact
+// decal
+// used in qcsrc/server/bots.qc: te_plasmaburn(org)
+effect TE_PLASMABURN
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+lightradius 200
+lightradiusfade 400
+lightcolor 1 1 1
+// flare effect
+effect TE_PLASMABURN
+countabsolute 1
+type static
+tex 37 37
+color 0x80C0FF 0x80C0FF
+size 8 8
+alpha 256 256 512
+// small sparks which form a sphere as they slow down
+effect TE_PLASMABURN
+count 256
+type spark
+color 0x2030FF 0x80C0FF
+size 1 2
+alpha 256 256 1024
+bounce 2
+airfriction 8
+liquidfriction 8
+velocityjitter 128 128 128
+
+// quake effect
+// used in qcsrc/server/bots.qc: //te_smallflash((e.absmin + e.absmax) * 0.5)
+// used in qcsrc/server/bots.qc: //te_smallflash((e.absmin + e.absmax) * 0.5)
+effect TE_SMALLFLASH
+lightradius 200
+lightradiusfade 1000
+lightcolor 2 2 2
+
+// quake effect
+// used nowhere in code
+effect TE_FLAMEJET
+count 1
+type smoke
+color 0x6f0f00 0xe3974f
+size 4 4
+alpha 64 128 384
+gravity -1
+bounce 1.1
+airfriction 1
+liquidfriction 4
+velocityjitter 128 128 128
+velocitymultiplier 1
+
+// quake effect
+// used nowhere in code
+effect TE_LAVASPLASH
+count 64
+type alphastatic
+color 0x6f0f00 0xe3974f
+size 12 12
+alpha 256 256 256
+gravity 0.05
+originoffset 0 0 32
+originjitter 128 128 32
+velocityoffset 0 0 256
+velocityjitter 128 128 0
+
+// player teleport effect
+// used nowhere in code
+effect TE_TELEPORT
+count 112
+type static
+color 0xA0A0A0 0xFFFFFF
+size 10 10
+alpha 64 128 256
+airfriction 1
+liquidfriction 4
+originoffset 0 0 28
+originjitter 16 16 28
+velocityjitter 0 0 256
+
+// nex beam
+// used in qcsrc/server/w_minstanex.qc: trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos)
+effect TE_TEI_G3
+countabsolute 1
+type beam
+tex 60 60
+color 0xFFFFFF 0xFFFFFF
+size 4 4
+alpha 128 128 256
+// experimental
+effect TE_TEI_G3
+trailspacing 2
+type static
+color 0x202020 0x404040
+size 1 1
+alpha 256 256 512
+airfriction -4
+//liquidfriction -4
+velocityjitter 8 8 8
+type smoke
+
+// smoke effect
+// used nowhere in code
+effect TE_TEI_SMOKE
+count 0.333
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 1
+
+// rocket explosion (bigger than mortar and hagar)
+// decal
+// used nowhere in code
+effect TE_TEI_BIGEXPLOSION
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 500
+lightradiusfade 500
+lightcolor 4 2 0.5
+// flare effect
+effect TE_TEI_BIGEXPLOSION
+countabsolute 1
+type static
+tex 35 37
+color 0x404040 0x404040
+size 72 72
+alpha 192 192 64
+// fire effect
+effect TE_TEI_BIGEXPLOSION
+notunderwater
+count 256
+type static
+tex 48 55
+color 0x902010 0xFFD080
+size 16 16
+alpha 128 128 256
+bounce 1.5
+airfriction 4
+liquidfriction 4
+originjitter 8 8 8
+velocityjitter 512 512 512
+// underwater bubbles
+effect TE_TEI_BIGEXPLOSION
+underwater
+count 64
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 144 144 144
+// bouncing sparks
+effect TE_TEI_BIGEXPLOSION
+notunderwater
+count 128
+type spark
+color 0x903010 0xFFD030
+size 2 2
+alpha 256 256 384
+gravity 1
+airfriction 0.2
+bounce 1.5
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 384 384 384
+
+// electro explosion
+// decal
+// used nowhere in code
+effect TE_TEI_PLASMAHIT
+countabsolute 1
+type decal
+tex 59 59
+size 32 32
+alpha 256 256 0
+originjitter 20 20 20
+lightradius 200
+lightradiusfade 600
+lightcolor 2.4 4.8 8
+// flare effect
+effect TE_TEI_PLASMAHIT
+countabsolute 1
+type static
+tex 38 38
+color 0x80C0FF 0x80C0FF
+size 32 32
+alpha 256 256 512
+// cloud of bouncing sparks
+effect TE_TEI_PLASMAHIT
+count 1
+type spark
+color 0x2030FF 0x80C0FF
+size 2 4
+alpha 256 256 1024
+//gravity 1
+bounce 1.5
+//velocityoffset 0 0 120
+velocityjitter 512 512 512
+
+
+
+
+
+
+
+
+
+//////////////////////////////////////////////////
+// New effects in 2.4
+//////////////////////////////////////////////////
+
+
+
+// bloody impact effect indicating damage
+// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200))
+// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200))
+// used in qcsrc/server/g_violence.qc: pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10)
+effect blood
+count 0.333
+type blood
+tex 24 32
+size 8 8
+alpha 256 256 64
+bounce -1
+airfriction 1
+liquidfriction 4
+velocityjitter 64 64 64
+velocitymultiplier 1
+
+
+
+// player teleport effect
+// used in qcsrc/server/t_teleporters.qc: pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1)
+// used in qcsrc/server/t_teleporters.qc: pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1)
+effect teleport
+count 112
+type static
+color 0xA0A0A0 0xFFFFFF
+size 10 10
+alpha 64 128 256
+airfriction 1
+liquidfriction 4
+originoffset 0 0 28
+originjitter 16 16 28
+velocityjitter 0 0 256
+
+
+
+// normal super gory blood trail (used by gibs)
+// used nowhere in code
+effect TR_BLOOD
+trailspacing 16
+type blood
+color 0xFFFFFF 0xFFFFFF
+tex 24 32
+size 8 8
+alpha 384 384 192
+bounce -1
+airfriction 1
+liquidfriction 4
+velocityjitter 64 64 64
+velocitymultiplier 0.5
+
+
+
+// thinner blood trail (used by quake zombies)
+// used nowhere in code
+effect TR_SLIGHTBLOOD
+trailspacing 32
+type blood
+color 0xFFFFFF 0xFFFFFF
+tex 24 32
+size 8 8
+alpha 384 384 192
+bounce -1
+airfriction 1
+liquidfriction 4
+velocityjitter 64 64 64
+velocitymultiplier 0.5
+
+
+
+// func_stardust effect, used in some maps to indicate teleporters
+// used in qcsrc/server/assault.qc: //self.effects = EF_STARDUST
+// used in qcsrc/server/g_triggers.qc: self.effects = EF_STARDUST
+// used in qcsrc/server/portals.qc: portal.effects = EF_STARDUST | EF_BLUE
+effect EF_STARDUST
+count 75
+type static
+color 0xfff368 0xfff368
+size 1.0 2.0
+alpha 64 128 128
+gravity -0.1
+airfriction 0.2
+liquidfriction 0.8
+originjitter 16 16 64
+velocityjitter 32 32 0
+//lightradius 200
+//lighttime 0
+//lightcolor 0.4 0.9 0.9
+
+
+// flare particle and light
+// used in qcsrc/server/t_items.qc: //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1)
+// used in qcsrc/server/t_items.qc: pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1)
+effect item_respawn
+countabsolute 1
+type static
+color 0x63F2EA 0x63f2EA
+size 32 32
+alpha 128 128 128
+// cloud of particles which expand rapidly and then slow to form a ball
+effect item_respawn
+count 64
+type spark
+tex 41 41
+color 0x63F2EA 0x63f2EA
+size 2 2
+alpha 256 256 1280
+//originjitter 24 24 24
+velocityjitter 256 256 256
+
+
+
+// used in qcsrc/server/t_jumppads.qc: pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1)
+effect jumppad_activate
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 2 2
+
+
+
+// used in qcsrc/server/w_laser.qc: pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect laser_muzzleflash
+count 1
+type smoke
+color 0xFFFFFF 0xFFFFFF
+tex 0 8
+size 5 5
+alpha 64 64 128
+airfriction 12
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 200
+lightradiusfade 2000
+lightcolor 3 0.1 0.1
+
+
+
+// decal
+// used in qcsrc/server/w_laser.qc: pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1)
+effect laser_impact
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+lightradius 200
+lightradiusfade 500
+lightcolor 8 0.4 0.4
+// flare effect
+effect laser_impact
+countabsolute 1
+type static
+tex 39 39
+color 0xFF2010 0xFF2010
+alpha 256 256 1024
+size 24 24
+// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+effect laser_impact
+count 256
+type spark
+color 0x800000 0xFF8020
+alpha 256 256 1024
+size 4 4
+//bounce 1.5
+airfriction 6
+liquidfriction 6
+//originjitter 32 32 32
+velocityjitter 256 256 256
+effect laser_impact
+count 8
+type smoke
+tex 48 55
+color 0x800000 0xFF8020
+size 12 12
+alpha 128 256 256
+originjitter 1 1 1
+velocitymultiplier 0.01
+velocityjitter 16 16 16
+sizeincrease 6
+
+
+
+// used in qcsrc/server/w_shotgun.qc: pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"))
+// used in qcsrc/server/w_shotgun.qc: pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"))
+effect shotgun_muzzleflash
+count 3
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+sizeincrease 12
+velocitymultiplier 0.05
+effect shotgun_muzzleflash
+count 10
+type spark
+tex 40 40
+color 0xFFFDD9 0xff5a00
+size 2 2
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 444 444 444
+velocitymultiplier 1.7
+gravity 0.3
+airfriction 5
+
+
+
+// shotgun pellet impact
+// decal
+// used in qcsrc/server/w_common.qc: pointparticles(particleeffectnum("shotgun_impact"), trace_endpos, trace_plane_normal * 1000, 1)
+effect shotgun_impact
+countabsolute 1
+type decal
+tex 56 59
+size 3 3
+alpha 256 256 0
+originjitter 6 6 6
+//lightradius 30
+//lightradiusfade 90
+//lightcolor 1 1 1
+// dust/smoke drifting away from the impact
+effect shotgun_impact
+count 5
+type smoke
+tex 0 8
+color 0xFFFFFF 0xA37443
+size 7 7
+alpha 0 64 32
+originjitter 1 1 1
+airfriction 7
+liquidfriction 16
+velocityjitter 100 100 100
+sizeincrease 12
+velocitymultiplier 0.25
+// dust/smoke staying at the impact
+effect shotgun_impact
+count 1
+type smoke
+tex 0 8
+color 0xFFFFFF 0xFFFFFF
+size 17 17
+alpha 64 64 32
+sizeincrease 4
+// sparks
+effect shotgun_impact
+notunderwater
+count 20
+type spark
+tex 40 40
+color 0xFDFFD9 0xFDFFD9
+size 0.6 0.6
+alpha 256 256 768
+gravity 1
+bounce 1
+airfriction 5
+originjitter 1 1 1
+velocityjitter 400 400 400
+velocitymultiplier 0.1
+
+
+
+// used in qcsrc/server/w_uzi.qc: pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect uzi_muzzleflash
+count 2
+type static
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+velocityjitter 1 1 1
+velocitymultiplier 0.03
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+gravity -0.1
+effect uzi_muzzleflash
+count 20
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 2 2
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 12
+
+
+// decal
+// used in qcsrc/server/cl_client.qc: //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1)
+// used in qcsrc/server/w_common.qc: pointparticles(particleeffectnum("machinegun_impact"), trace_endpos, trace_plane_normal * 1000, 1)
+effect machinegun_impact
+countabsolute 1
+type decal
+tex 56 59
+size 5 5
+alpha 256 256 0
+originjitter 6 6 6
+lightradius 80
+lightradiusfade 800
+lightcolor 6 3.6 0.6
+// dust/smoke drifting away from the impact
+effect machinegun_impact
+count 5
+type smoke
+tex 0 8
+color 0xFFFFFF 0xA37443
+size 7 7
+alpha 0 64 32
+originjitter 1 1 1
+airfriction 7
+liquidfriction 16
+velocityjitter 100 100 100
+sizeincrease 12
+velocitymultiplier 0.25
+// dust/smoke staying at the impact
+effect machinegun_impact
+count 1
+type smoke
+tex 0 8
+color 0xFFFFFF 0xFFFFFF
+size 17 17
+alpha 64 64 32
+sizeincrease 4
+// sparks
+effect machinegun_impact
+notunderwater
+count 20
+type spark
+tex 40 40
+color 0xFDFFD9 0xFDFFD9
+size 0.3 0.3
+alpha 256 256 768
+gravity 1
+bounce 1
+airfriction 5
+originjitter 1 1 1
+velocityjitter 400 400 400
+velocitymultiplier 0.1
+
+
+
+// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+// used in qcsrc/server/w_porto.qc: //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect grenadelauncher_muzzleflash
+count 3
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+airfriction 12
+velocityjitter 20 20 20
+velocitymultiplier 0.03
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+effect grenadelauncher_muzzleflash
+count 30
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 12
+
+
+
+// hagar trail
+// smoke
+// used in qcsrc/server/w_hagar.qc: missile.modelflags = MF_GRENADE
+// used in qcsrc/server/w_hagar.qc: missile.modelflags = MF_GRENADE
+// used in qcsrc/server/w_porto.qc: gren.modelflags = MF_GRENADE
+effect TR_GRENADE
+trailspacing 6
+type alphastatic
+color 0x303030 0x000000
+tex 0 8
+size 1 2
+bounce 1
+sizeincrease 2
+alpha 100 200 280
+originjitter 1 1 1
+velocityjitter 1 1 1
+velocitymultiplier -0.02
+//gravity -0.11
+// fire
+effect TR_GRENADE
+notunderwater
+trailspacing 2
+type static
+color 0xffdf72 0x811200
+tex 48 55
+size 1 2
+sizeincrease -15
+alpha 100 144 988
+airfriction 8
+velocityjitter 32 32 32
+velocitymultiplier -1.0
+// bubbles
+effect TR_GRENADE
+underwater
+trailspacing 8
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
+
+
+// mortar trail
+// smoke
+// used in qcsrc/server/w_grenadelauncher.qc: gren.modelflags = MF_TRACER2
+// used in qcsrc/server/w_grenadelauncher.qc: gren.modelflags = MF_TRACER2
+// used in qcsrc/server/w_hook.qc: gren.modelflags = MF_TRACER2
+effect TR_KNIGHTSPIKE // used for MF_TRACER2
+notunderwater
+trailspacing 5
+type alphastatic
+color 0x303030 0x000000
+tex 0 8
+size 3 3
+bounce 1
+sizeincrease 11
+alpha 100 200 400
+originjitter 2 2 2
+velocityjitter 3 3 3
+velocitymultiplier -0.02
+gravity -0.11
+//marker
+effect TR_KNIGHTSPIKE // used for MF_TRACER2
+type alphastatic
+color 0xFF0000 0xFF0000
+tex 62 62
+size 1 1
+sizeincrease -0.1
+trailspacing 1
+alpha 256 256 720
+// bubbles
+effect TR_KNIGHTSPIKE // used for MF_TRACER2
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
+
+
+// decal
+// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1)
+// used in qcsrc/server/w_grenadelauncher.qc: pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1)
+effect grenade_explode
+countabsolute 1
+type decal
+tex 8 16
+size 48 48
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 250
+lightradiusfade 400
+lightcolor 8 4 1
+// fire effect which expands then slows
+effect grenade_explode
+notunderwater
+count 80
+type static
+tex 48 55
+color 0xe03f00 0x5e0000
+size 16 26
+sizeincrease 20
+alpha 128 228 356
+bounce 4.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 256 256 256
+// fire effect which make brigt dot inside
+effect grenade_explode
+notunderwater
+count 30
+type static
+tex 48 55
+color 0xe03f00 0xffdf92
+size 6 16
+sizeincrease 40
+alpha 228 328 756
+bounce 1
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 256 256 256
+// smoke
+effect grenade_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 20
+size 20 40
+sizeincrease 34
+alpha 500 600 556
+velocityjitter 256 256 256
+airfriction 5
+color 0x000000 0x111111
+bounce 6
+// underwater bubbles
+effect grenade_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 96 96 96
+// bouncing sparks
+effect grenade_explode
+notunderwater
+count 16
+type spark
+color 0x903010 0xFFD030
+size 2 2
+tex 40 40
+alpha 256 256 384
+gravity 1
+airfriction 0.2
+bounce 1.5
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 256 256 256
+
+
+
+// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect electro_muzzleflash
+count 1
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+effect electro_muzzleflash
+count 30
+type spark
+tex 31 31
+color 0xD9FDFF 0xD9FDFF
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 12
+
+
+
+// electro trail
+// glowing vapor trail
+// used nowhere in code
+effect TR_NEXUIZPLASMA
+trailspacing 2
+type static
+color 0x283880 0x283880
+size 3 3
+tex 62 62
+alpha 256 256 968
+//velocityjitter 16 16 16
+lightradius 90
+lighttime 0
+lightcolor 1.5 3 6
+velocitymultiplier -0.1
+// bright sparks
+effect TR_NEXUIZPLASMA
+trailspacing 6
+count 3
+type snow
+tex 42 42
+color 0x629dff 0x0018ff
+size 2 4
+sizeincrease -20
+alpha 444 512 1866
+bounce 1
+velocityoffset 0 0 15
+airfriction 12
+originjitter 1 1 1
+velocityjitter 50 50 50
+
+
+
+// decal
+// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1)
+effect electro_impact
+countabsolute 1
+type decal
+tex 59 59
+size 32 32
+alpha 256 256 0
+originjitter 20 20 20
+lightradius 250
+lightradiusfade 250
+lightcolor 3.125 4.375 10
+// flare effect
+effect electro_impact
+countabsolute 1
+type static
+tex 38 38
+color 0x80C0FF 0x80C0FF
+size 12 32
+alpha 256 256 512
+// cloud of bouncing sparks
+effect electro_impact
+count 60
+type smoke
+tex 42 42
+color 0x629dff 0x0018ff
+size 36 36
+sizeincrease -50
+alpha 256 256 1024
+bounce 2
+gravity -0.3
+airfriction 6
+originjitter 1 1 1
+velocityjitter 512 512 512
+// inner cloud of smoke
+effect electro_impact
+count 60
+type smoke
+color 0x629dff 0x0018ff
+tex 0 8
+size 20 24
+sizeincrease 50
+alpha 200 256 512
+airfriction 30
+originjitter 20 20 20
+velocityjitter 320 320 320
+
+// decal
+// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1)
+effect electro_ballexplode
+countabsolute 1
+type decal
+tex 59 59
+size 32 32
+alpha 256 256 0
+originjitter 20 20 20
+lightradius 250
+lightradiusfade 250
+lightcolor 3.125 4.375 10
+// flare effect
+effect electro_ballexplode
+countabsolute 1
+type static
+tex 38 38
+color 0x80C0FF 0x80C0FF
+size 32 32
+alpha 256 256 512
+// cloud of bouncing sparks
+effect electro_ballexplode
+count 128
+type spark
+tex 41 41
+color 0xFDFFD9 0xFDFFD9
+size 16 16
+alpha 256 256 1024
+bounce 2
+//airfriction 2
+originjitter 1 1 1
+velocityjitter 512 512 512
+// inner cloud of smoke
+effect electro_ballexplode
+count 16
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 24 24
+alpha 256 256 512
+originjitter 20 20 20
+velocityjitter 32 32 32
+
+
+
+// decal
+// used in qcsrc/server/w_electro.qc: pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1)
+effect electro_combo
+countabsolute 1
+type decal
+tex 59 59
+size 64 64
+alpha 256 256 0
+originjitter 34 34 34
+lightradius 400
+lightradiusfade 300
+lightcolor 4 5 6
+// flare effect
+effect electro_combo
+countabsolute 1
+type static
+tex 38 38
+color 0x80C0FF 0x80C0FF
+size 48 48
+alpha 128 128 64
+// large sparks
+effect electro_combo
+count 20
+type static
+color 0x2030FF 0x80C0FF
+size 32 32
+alpha 256 256 256
+bounce 2
+airfriction 6
+liquidfriction 16
+//velocityoffset 0 0 120
+velocityjitter 512 512 512
+effect electro_combo
+count 64
+type spark
+tex 41 41
+color 0xFDFFD9 0xFDFFD9
+size 16 16
+alpha 444 512 866
+bounce 2
+//airfriction 2
+originjitter 1 1 1
+velocityjitter 512 512 512
+// inner cloud of smoke
+effect electro_combo
+count 0.25
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 24 24
+alpha 256 256 256
+originjitter 20 20 20
+velocityjitter 32 32 32
+
+
+
+// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
+// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
+effect crylink_muzzleflash
+count 1
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 128 128 256
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+effect crylink_muzzleflash
+count 10
+type spark
+tex 40 40
+color 0xA080C0 0xA080C0
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 200 200 200
+velocitymultiplier 0.3
+airfriction 12
+
+
+
+// crylink impact effect
+// decal
+// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1)
+effect crylink_impact
+countabsolute 1
+type decal
+tex 47 47
+size 8 8
+alpha 256 256 0
+originjitter 12 12 12
+//lightradius 60
+//lightradiusfade 300
+//lightcolor 3.2 0.4 4
+// purple flare effect
+effect crylink_impact
+countabsolute 1
+type static
+tex 39 39
+color 0x504060 0x504060
+size 8 8
+alpha 256 256 512
+// purple sparks
+effect crylink_impact
+count 20
+type spark
+tex 41 41
+color 0xA040C0 0xA040C0
+bounce 2
+size 4 4
+alpha 256 256 1024
+velocityjitter 256 256 256
+// purple splash
+effect crylink_impact
+count 3
+type static
+color 0xE070FF 0xE070FF
+size 8 8
+alpha 256 256 512
+velocityjitter 8 8 8
+// purple splash
+effect crylink_impact
+count 3
+type static
+color 0xE070FF 0xE070FF
+size 8 8
+alpha 256 256 1024
+velocityjitter 32 32 32
+
+
+
+// used in qcsrc/server/w_minstanex.qc: pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+// used in qcsrc/server/w_nex.qc: pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect nex_muzzleflash
+count 10
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 16 16
+alpha 128 128 192
+originjitter 4 4 4
+velocityjitter 24 24 24
+velocitymultiplier 0.02
+lightradius 200
+lightradiusfade 200
+lightcolor 2 2.5 3
+effect nex_muzzleflash
+count 150
+type spark
+tex 41 41
+color 0xD9FDFF 0xD9FDFF
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 600 600 600
+velocitymultiplier 0.5
+airfriction 9
+
+
+
+//// nex beam
+//effect nex_beam
+//countabsolute 1
+//type beam
+//tex 60 60
+//color 0xFFFFFF 0xFFFFFF
+//size 6 6
+//alpha 128 128 192
+// nex beam: ring smoke
+// used in qcsrc/server/w_nex.qc: trailparticles(world, particleeffectnum("nex_beam"), w_shotorg, trace_endpos)
+effect nex_beam
+trailspacing 32
+color 0x1680A0 0x1680A0
+size 4 4
+tex 32 32
+alpha 64 128 64
+airfriction 5
+sizeincrease 2
+type static
+// nex beam: drifting smoke
+effect nex_beam
+trailspacing 6
+color 0x5080A0 0x5080A0
+size 1 1
+tex 0 8
+alpha 32 64 32
+airfriction 9
+sizeincrease 8
+velocityjitter 64 64 64
+type static
+// nex beam: bright core
+effect nex_beam
+trailspacing 6
+color 0x80CDFF 0x80CDFF
+size 4 4
+//tex 48 55
+alpha 256 256 1280
+type static
+//sparks
+effect nex_beam
+trailspacing 8
+color 0x1680A0 0x1680A0
+size 1 1
+tex 63 63
+alpha 64 128 80
+airfriction 5
+gravity -0.01
+type snow
+
+// nex impact
+// decal
+// used in qcsrc/server/w_minstanex.qc: pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1)
+// used in qcsrc/server/w_nex.qc: pointparticles(particleeffectnum("nex_impact"), trace_endpos - w_shotdir * 6, '0 0 0', 1)
+effect nex_impact
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+lightradius 200
+lightradiusfade 250
+lightcolor 4 6 8
+// shockwave
+effect nex_impact
+countabsolute 1
+type static
+tex 34 34
+size 16 16
+alpha 100 100 300
+sizeincrease 200
+
+
+// flare effect
+effect nex_impact
+countabsolute 1
+type static
+tex 37 37
+color 0x80C0FF 0x80C0FF
+size 8 8
+alpha 256 256 256
+// small sparks which form a sphere as they slow down
+//effect nex_impact
+//count 256
+//type spark
+//color 0x2030FF 0x80C0FF
+//size 1 2
+//alpha 256 256 512
+//bounce 2
+//airfriction 8
+//liquidfriction 8
+//velocityjitter 384 384 384
+// small sparks which glow brightly but live briefly
+effect nex_impact
+count 128
+type spark
+tex 41 41
+color 0xD9FDFF 0xD9FDFF
+size 4 4
+alpha 0 128 512
+bounce 2
+velocityjitter 600 600 600
+velocitymultiplier 0.5
+airfriction 9
+
+
+
+// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect hagar_muzzleflash
+count 4
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 512
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 200
+lightradiusfade 2000
+lightcolor 2 1.5 0.2
+effect hagar_muzzleflash
+count 30
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 12
+
+
+
+// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_bounce"), self.origin, self.velocity, 1)
+effect hagar_bounce
+count 4
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 5 5
+alpha 256 256 256
+originjitter 1.5 1.5 1.5
+velocityjitter 6 6 6
+velocitymultiplier 0.01
+lightradius 60
+lightradiusfade 300
+lightcolor 2 1.5 0.2
+effect hagar_bounce
+count 30
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 3 3
+alpha 0 256 256
+gravity 1
+bounce 1.5
+originjitter 1 1 1
+velocityjitter 600 600 600
+velocitymultiplier 0.5
+airfriction 12
+
+
+
+// decal
+// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
+// used in qcsrc/server/w_hagar.qc: pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
+effect hagar_explode
+countabsolute 1
+type decal
+tex 8 16
+size 28 38
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 250
+lightradiusfade 400
+lightcolor 8 4 1
+// fire effect which make bright dot inside
+effect hagar_explode
+notunderwater
+count 12
+type smoke
+tex 48 55
+color 0xffe955 0xff5a00
+size 16 26
+sizeincrease 5
+alpha 128 256 456
+bounce 1.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 156 156 156
+// fire effect which expands then slows
+effect hagar_explode
+notunderwater
+count 24
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 20 26
+sizeincrease 15
+alpha 128 256 456
+bounce 1.5
+airfriction 12
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 256 256 256
+
+// smoke
+effect hagar_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 20
+size 20 40
+sizeincrease 20
+alpha 500 600 556
+velocityjitter 244 244 244
+airfriction 5
+color 0x000000 0x111111
+bounce 2
+
+// underwater bubbles
+effect hagar_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 96 96 96
+// bouncing sparks
+effect hagar_explode
+notunderwater
+count 16
+type spark
+color 0x903010 0xFFD030
+size 2 2
+tex 40 40
+alpha 256 256 384
+gravity 1
+airfriction 0.2
+bounce 1.5
+liquidfriction 0.8
+velocityoffset 0 0 80
+velocityjitter 256 256 256
+
+
+
+// used in qcsrc/server/w_rocketlauncher.qc: pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+effect rocketlauncher_muzzleflash
+count 20
+type smoke
+color 0x202020 0x404040
+tex 0 8
+size 1 1
+sizeincrease 20
+alpha 256 256 256
+airfriction 2
+originjitter 1.5 1.5 1.5
+velocityjitter 40 40 40
+velocitymultiplier -0.13
+//lightradius 200
+//lightradiusfade 2000
+//lightcolor 2 1.5 0.2
+effect rocketlauncher_muzzleflash
+count 30
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 3 3
+alpha 0 128 1024
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 12
+
+
+
+// rocket trail
+// smoke
+// used nowhere in code
+effect TR_ROCKET
+trailspacing 5
+type alphastatic
+color 0x303030 0x000000
+tex 0 8
+size 1 4
+bounce 1
+sizeincrease 11
+alpha 200 300 200
+lightradius 150
+lighttime 0
+lightcolor 6 3 1
+originjitter 2 2 2
+velocityjitter 3 3 3
+velocitymultiplier -0.02
+//gravity -0.11
+// fire
+effect TR_ROCKET
+notunderwater
+trailspacing 2
+type static
+color 0xffdf72 0x811200
+tex 48 55
+size 7 7
+sizeincrease -30
+alpha 100 144 588
+airfriction 8
+velocityjitter 32 32 32
+velocitymultiplier -1.5
+// bubbles
+effect TR_ROCKET
+underwater
+trailspacing 8
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+// sparks
+effect TR_ROCKET
+trailspacing 10
+type spark
+tex 40 40
+color 0xFFFDD9 0xFFFDD9
+size 1 1
+alpha 444 512 1866
+//gravity 1
+bounce 1
+//velocityoffset 0 0 15
+airfriction 5
+originjitter 1 1 1
+velocityjitter 100 100 100
+velocitymultiplier -0.31
+
+// rocket explosion (bigger than mortar and hagar)
+// decal
+// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1)
+// used in qcsrc/server/portals.qc: pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4)
+// used in qcsrc/server/w_rocketlauncher.qc: pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1)
+effect rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 400
+lightradiusfade 750
+lightcolor 8 4 1
+// fire effect
+effect rocket_explode
+notunderwater
+count 64
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 33 44
+sizeincrease 45
+alpha 200 256 512
+bounce 1.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 512 512 512
+// fire effect 2
+effect rocket_explode
+notunderwater
+count 28
+type smoke
+tex 48 55
+color 0xea691b 0xeed05a
+size 33 44
+sizeincrease 55
+alpha 200 256 612
+bounce 2.5
+airfriction 19
+liquidfriction 19
+originjitter 8 8 8
+velocityjitter 912 912 912
+// smoke
+effect rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 64
+size 20 40
+sizeincrease 44
+alpha 400 500 456
+velocityjitter 444 444 444
+airfriction 5
+color 0x000000 0x111111
+bounce 2
+// underwater bubbles
+effect rocket_explode
+underwater
+count 64
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 144 144 144
+// bouncing sparks
+effect rocket_explode
+notunderwater
+count 64
+type spark
+tex 40 40
+color 0xffa800 0xffedaf
+size 1 1
+sizeincrease 2
+alpha 44 256 384
+gravity 1
+airfriction -1
+bounce 1.5
+liquidfriction 0.8
+velocityoffset 0 0 80
+originjitter 16 16 16
+velocityjitter 224 224 324
+
+
+
+// used in qcsrc/server/g_hook.qc: pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1)
+effect grapple_muzzleflash
+lightradius 160
+lightradiusfade 800
+lightcolor 1 0 0
+
+
+
+// used in qcsrc/server/g_hook.qc: pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1)
+effect grapple_impact
+lightradius 160
+lightradiusfade 800
+lightcolor 1 0 0
+
+
+
+// used nowhere in code
+effect nex242_misc_laser_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0xff0000 0xff0000
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+
+
+// used nowhere in code
+effect nex242_misc_laser_beam_fast
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 640
+color 0xff0000 0xff0000
+sizeincrease 0.1
+
+// used nowhere in code
+effect nex242_misc_laser_beam_fast_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// additional laser colors (mike)
+// used nowhere in code
+effect nex242_misc_laser_green_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0x00ff00 0x00ff00
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_green_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_blue_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0x0000ff 0x0000ff
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_blue_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_yellow_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0xffff00 0xffff00
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_yellow_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_cyan_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0x00ffff 0x00ffff
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_cyan_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_magenta_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0xff00ff 0xff00ff
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_magenta_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_white_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0xffffff 0xffffff
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_white_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_black_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0x000000 0x000000
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_black_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+// used nowhere in code
+effect nex242_misc_laser_orange_beam
+countabsolute 1
+type beam
+tex 60 60
+size 1 1
+alpha 256 256 64
+color 0xff6600 0xff6600
+sizeincrease 1
+
+// used nowhere in code
+effect nex242_misc_laser_orange_beam_end
+count 1
+type spark
+color 0x8f4333 0xfff31b
+size 0.4 0.4
+alpha 128 256 768
+gravity 1
+bounce -1
+velocityjitter 64 64 64
+velocitymultiplier 100
+
+
+
+
+// bigger crylink impact effect
+// decal
+// used in qcsrc/server/w_crylink.qc: pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1)
+effect crylink_impactbig
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 12 12 12
+//lightradius 200
+//lightradiusfade 800
+//lightcolor 3.2 0.4 4
+// purple flare effect
+effect crylink_impactbig
+countabsolute 1
+type static
+tex 39 39
+color 0x504060 0x504060
+size 24 24
+alpha 256 256 512
+// purple sparks
+effect crylink_impactbig
+count 80
+type spark
+tex 41 41
+color 0xA040C0 0xA040C0
+bounce 2
+size 6 6
+alpha 256 256 1024
+velocityjitter 512 512 512
+// purple splash
+effect crylink_impactbig
+count 3
+type static
+color 0xE070FF 0xE070FF
+size 16 16
+alpha 256 256 512
+velocityjitter 32 32 32
+// purple splash
+effect crylink_impactbig
+count 6
+type static
+color 0xE070FF 0xE070FF
+size 16 16
+alpha 256 256 1024
+velocityjitter 256 256 256
+
+// Zero-violence effects
+
+// impact effect indicating damage
+// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("damage_hit"), hitloc, force, bound(0, damage, 200))
+effect damage_hit
+count 1
+type static
+color 0x20FF30 0x80FFC0
+size 1 1
+alpha 256 256 256
+gravity -0.4
+bounce 1.5
+airfriction 8
+liquidfriction 16
+//velocityoffset 0 0 120
+velocityjitter 16 16 16
+
+// effect for removing player model
+// "teleport"
+// used in qcsrc/server/cl_player.qc: pointparticles(particleeffectnum("damage_dissolve"), self.origin, force, 1)
+effect damage_dissolve
+count 96
+type static
+color 0x66FF66 0xFFFFFF
+size 10 10
+alpha 64 128 128
+airfriction 1
+liquidfriction 4
+originoffset 0 0 28
+originjitter 16 16 28
+velocityjitter 0 0 256
+// flare
+effect damage_dissolve
+countabsolute 1
+type static
+tex 38 38
+color 0x00FF00 0x99FF99
+size 32 32
+alpha 256 256 196
+// large sparks
+effect damage_dissolve
+count 20
+type static
+color 0x00FF00 0x99FF99
+size 16 16
+alpha 256 256 256
+//gravity 1
+bounce 1.5
+airfriction 4
+liquidfriction 16
+//velocityoffset 0 0 120
+velocityjitter 512 512 512
+
+// decal
+// used in qcsrc/server/g_triggers.qc: self.cnt = particleeffectnum("laser_deadly")
+effect laser_deadly
+countabsolute 1
+type decal
+tex 56 59
+size 5 5
+alpha 256 256 0
+originjitter 6 6 6
+// dust/smoke drifting away from the impact
+effect laser_deadly
+count 0.05 // 50 per second
+type smoke
+tex 48 55
+color 0xFFFFFF 0xFFFFFF
+size 3 3
+alpha 0 64 64
+originjitter 1 1 1
+airfriction 7
+liquidfriction 16
+velocityjitter 15 15 15
+sizeincrease 2
+velocitymultiplier 20
+// sparks
+effect laser_deadly
+notunderwater
+count 0.05 // 50 per second
+type spark
+tex 40 40
+color 0xFDFFD9 0xFDFFD9
+size 0.6 0.6
+alpha 256 256 768
+gravity 1
+bounce 1
+airfriction 5
+originjitter 1 1 1
+velocityjitter 100 100 100
+velocitymultiplier 100
+
+
+//torch
+//fire
+// used nowhere in code
+effect torch_small
+//notunderwater
+count 16
+type smoke
+tex 48 55
+size 1 11
+alpha 200 256 512
+gravity -0.5
+color 0x8f0d00 0xff5a00
+//bounce 1
+sizeincrease -1
+originjitter 5 5 5
+velocityjitter 1 1 50
+// smoke
+effect torch_small
+type alphastatic
+count 8
+tex 0 8
+size 5 10
+sizeincrease 5
+alpha 200 256 200
+color 0x000000 0x111111
+gravity -0.3
+originjitter 3 3 3
+velocityjitter 11 11 50
+//bounce 1
+
+//fountain01
+// used nowhere in code
+effect fountain01
+count 32
+tex 0 8
+size 10 15
+alpha 0 100 100
+gravity 0.6
+bounce 1
+sizeincrease 20
+type snow
+bounce 1
+originjitter 5 5 5
+velocityjitter 81 81 150
+color 0x7cbaff 0xcfd1ff
+velocitymultiplier 2
+
+
+
+// decal
+// used in qcsrc/server/w_hook.qc: pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1)
+effect hookbomb_explode
+countabsolute 1
+type decal
+tex 8 16
+size 96 96
+alpha 256 256 0
+originjitter 40 40 40
+lightradius 1600
+lightradiusfade 800
+lightcolor 1 4 8
+// fire effect which make brigt dot inside
+effect hookbomb_explode
+notunderwater
+count 100
+type static
+tex 48 55
+color 0x003fe0 0x92dfff
+size 12 32
+sizeincrease 80
+alpha 512 328 756
+bounce 1
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 1024 1024 1024
+// smoke
+effect hookbomb_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 160
+size 80 160
+sizeincrease 300
+alpha 500 600 556
+velocityoffset 0 0 0
+velocityjitter 256 256 256
+airfriction 0
+color 0x000000 0x111111
+bounce 6
+// underwater bubbles
+effect hookbomb_explode
+underwater
+count 60
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.0625
+originjitter 16 16 16
+velocityjitter 192 192 192
+
+
+// smoke
+effect EF_MGTURRETTRAIL
+notunderwater
+trailspacing 2
+type smoke
+color 0xd0d0a0 0xfffff0
+tex 0 8
+size 6 2
+alpha 16 32 16
+// bubbles
+effect EF_MGTURRETTRAIL
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
Copied: branches/nexuiz-2.0/data/gfx/inv_weapon12.tga (from rev 4862, trunk/data/gfx/inv_weapon12.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/gfx/inv_weapon13.tga (from rev 4862, trunk/data/gfx/inv_weapon13.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/maps/turret_test.bsp (from rev 4862, trunk/data/maps/turret_test.bsp)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/maps/turret_test.map (from rev 4862, trunk/data/maps/turret_test.map)
===================================================================
--- branches/nexuiz-2.0/data/maps/turret_test.map (rev 0)
+++ branches/nexuiz-2.0/data/maps/turret_test.map 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,3095 @@
+// entity 0
+{
+"_blocksize" "1024"
+"classname" "worldspawn"
+"shot_force" "15"
+// brush 0
+{
+( 1024 1024 -32 ) ( 1024 1024 0 ) ( 2048 2048 0 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -1024 1024 -32 ) ( -1024 1024 0 ) ( 1024 1024 0 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -1024 0 0 ) ( -1024 320 0 ) ( -704 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -704 320 -32 ) ( -1024 320 -32 ) ( -1024 0 -32 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -640 2048 0 ) ( -960 2048 0 ) ( -960 2048 -32 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -1024 1024 0 ) ( -1024 1024 -32 ) ( -2048 2048 -32 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+}
+// brush 1
+{
+( -5568 1344 1792 ) ( -5568 1024 1792 ) ( -5600 1024 1792 ) dsi/cretebase4 384 0 0 0.500000 0.500000 0 0 0
+( -5568 2048 -416 ) ( -5568 2048 -96 ) ( -5600 2048 -96 ) dsi/cretebase4 384 0 0 0.500000 0.500000 0 0 0
+( -5632 416 -352 ) ( -5632 416 -32 ) ( -5632 96 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -5568 -2048 1824 ) ( -5568 -1728 1824 ) ( -5568 -1728 1504 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -5568 -2048 -32 ) ( -5568 -2048 -352 ) ( -5600 -2048 -352 ) dsi/cretebase4 384 0 0 0.500000 0.500000 0 0 0
+( -5568 -32 0 ) ( -5568 288 0 ) ( -5600 288 0 ) dsi/cretebase4 384 0 0 0.500000 0.500000 0 0 0
+}
+// brush 2
+{
+( -5568 2176 1792 ) ( -5568 2048 1792 ) ( -5568 2048 768 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1888 2112 1024 ) ( -2048 2112 1024 ) ( -2048 2112 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2048 1792 1792 ) ( 2048 1920 1792 ) ( 2048 1920 768 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -2080 2048 1024 ) ( -1920 2048 1024 ) ( -1920 2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -2048 2048 1792 ) ( -2048 2176 1792 ) ( -1888 2176 1792 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1888 2176 0 ) ( -2048 2176 0 ) ( -2048 2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 3
+{
+( 2048 2048 1792 ) ( 2048 -96 1792 ) ( 2048 -96 768 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2336 2048 1024 ) ( 2048 2048 1024 ) ( 2048 2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2112 -96 1024 ) ( 2112 2048 1024 ) ( 2112 2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2112 -2048 1024 ) ( 2400 -2048 1024 ) ( 2400 -2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2048 -96 1792 ) ( 2048 2048 1792 ) ( 2336 2048 1792 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2336 2048 0 ) ( 2048 2048 0 ) ( 2048 -96 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 4
+{
+( 1024 1024 0 ) ( 1024 1024 -32 ) ( 2048 2048 -32 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+( 2048 640 0 ) ( 2048 960 0 ) ( 2048 960 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 320 704 -32 ) ( 320 1024 -32 ) ( 0 1024 -32 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 0 1024 0 ) ( 320 1024 0 ) ( 320 704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 1024 1024 -32 ) ( 1024 1024 0 ) ( 1024 -1024 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 1024 -1024 -32 ) ( 1024 -1024 0 ) ( 2048 -2048 0 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 5
+{
+( -1024 -1024 -32 ) ( -1024 -1024 0 ) ( -2048 -2048 0 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+( 1024 -1024 -32 ) ( 1024 -1024 0 ) ( -1024 -1024 0 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( 1024 0 0 ) ( 1024 -320 0 ) ( 704 -320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 704 -320 -32 ) ( 1024 -320 -32 ) ( 1024 0 -32 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -2048 0 ) ( 960 -2048 0 ) ( 960 -2048 -32 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( 1024 -1024 0 ) ( 1024 -1024 -32 ) ( 2048 -2048 -32 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 6
+{
+( 960 -576 -32 ) ( 1024 -512 -32 ) ( 1024 -512 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( -1024 1024 -32 ) ( -960 960 -32 ) ( -1024 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 320 -1024 0 ) ( 320 -1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 0 -704 0 ) ( 320 -704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 320 -704 -32 ) ( 0 -704 -32 ) ( 0 -1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 7
+{
+( 960 -576 -32 ) ( 1024 -512 -32 ) ( 1024 -512 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( -960 960 -32 ) ( -1024 1024 -32 ) ( -1024 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 1024 -1056 0 ) ( 1024 -736 0 ) ( 1024 -736 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 0 -704 0 ) ( 320 -704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 320 -704 -32 ) ( 0 -704 -32 ) ( 0 -1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 8
+{
+( 576 960 -32 ) ( 512 1024 -32 ) ( 512 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 1024 1024 -32 ) ( 960 960 -32 ) ( 1024 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 0 -704 0 ) ( 320 -704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 320 -704 -32 ) ( 0 -704 -32 ) ( 0 -1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 384 1024 0 ) ( 64 1024 0 ) ( 64 1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+}
+// brush 9
+{
+( 576 960 -32 ) ( 512 1024 -32 ) ( 512 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 960 960 -32 ) ( 1024 1024 -32 ) ( 1024 1024 0 ) common/caulk 0 192 0 0.500000 0.500000 0 0 0
+( 1024 -1056 0 ) ( 1024 -736 0 ) ( 1024 -736 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 0 -704 0 ) ( 320 -704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 320 -704 -32 ) ( 0 -704 -32 ) ( 0 -1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 10
+{
+( -320 704 -32 ) ( 0 704 -32 ) ( 0 1024 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+( 0 1024 0 ) ( 0 704 0 ) ( -320 704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -1024 1056 0 ) ( -1024 736 0 ) ( -1024 736 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( -960 -960 -32 ) ( -1024 -1024 -32 ) ( -1024 -1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -576 -960 -32 ) ( -512 -1024 -32 ) ( -512 -1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+}
+// brush 11
+{
+( -960 576 -32 ) ( -1024 512 -32 ) ( -1024 512 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -1024 1024 -32 ) ( -960 960 -32 ) ( -1024 1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( 1024 0 0 ) ( 704 0 0 ) ( 704 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 704 320 -32 ) ( 704 0 -32 ) ( 1024 0 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+( -1024 384 0 ) ( -1024 64 0 ) ( -1024 64 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+}
+// brush 12
+{
+( 640 320 0 ) ( 640 448 0 ) ( 384 576 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 448 192 ) ( 640 320 192 ) ( 384 448 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 640 320 192 ) ( 640 320 0 ) ( 384 448 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 640 352 64 ) ( 640 480 64 ) ( 640 480 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 448 0 ) ( 640 448 192 ) ( 384 576 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 384 576 64 ) ( 384 448 64 ) ( 384 448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 13
+{
+( 384 -448 64 ) ( 384 -576 64 ) ( 384 -576 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 -320 0 ) ( 640 -320 192 ) ( 384 -448 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 640 -416 64 ) ( 640 -288 64 ) ( 640 -288 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 -448 192 ) ( 640 -448 0 ) ( 384 -576 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -320 192 ) ( 640 -448 192 ) ( 384 -576 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 640 -448 0 ) ( 640 -320 0 ) ( 384 -448 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 14
+{
+( 640 64 64 ) ( 640 -64 64 ) ( 640 -64 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 896 128 0 ) ( 896 128 192 ) ( 640 64 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 896 -128 0 ) ( 896 -128 192 ) ( 896 128 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 -128 192 ) ( 896 -128 0 ) ( 640 -64 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 640 -64 192 ) ( 640 64 192 ) ( 704 64 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 704 64 0 ) ( 640 64 0 ) ( 640 -64 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 15
+{
+( 1088 -64 0 ) ( 1152 -64 0 ) ( 1152 64 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 1152 64 192 ) ( 1152 -64 192 ) ( 1088 -64 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 896 128 192 ) ( 896 128 0 ) ( 1152 64 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 128 0 ) ( 896 128 192 ) ( 896 -128 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 -128 0 ) ( 896 -128 192 ) ( 1152 -64 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 1152 -64 64 ) ( 1152 64 64 ) ( 1152 64 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 16
+{
+( 416 -448 256 ) ( 416 -448 320 ) ( 640 -64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 320 -448 192 ) ( 320 -448 320 ) ( 416 -448 320 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 320 -448 320 ) ( 320 -448 192 ) ( 576 -64 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -64 320 ) ( 576 -64 320 ) ( 576 -64 256 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 416 -448 320 ) ( 384 -384 320 ) ( 576 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 352 -448 192 ) ( 416 -448 192 ) ( 640 -64 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 17
+{
+( 192 -576 256 ) ( 192 -576 320 ) ( 416 -448 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 192 -512 256 ) ( 192 -512 320 ) ( 192 -576 320 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 320 -448 192 ) ( 320 -448 320 ) ( 192 -512 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 320 -448 320 ) ( 320 -448 192 ) ( 416 -448 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 192 -576 320 ) ( 128 -576 320 ) ( 352 -448 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 128 -576 192 ) ( 192 -576 192 ) ( 416 -448 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 18
+{
+( 192 -576 320 ) ( 192 -512 320 ) ( 192 -512 256 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 128 -576 256 ) ( 192 -576 256 ) ( 192 -576 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 128 -512 256 ) ( 128 -576 256 ) ( 128 -576 192 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 192 -512 256 ) ( 128 -512 256 ) ( 128 -512 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 128 -576 256 ) ( 128 -512 256 ) ( 192 -512 320 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 128 -576 192 ) ( 192 -576 192 ) ( 192 -512 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 19
+{
+( 416 448 256 ) ( 192 576 256 ) ( 192 576 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 192 576 320 ) ( 192 512 320 ) ( 192 512 256 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 320 448 320 ) ( 320 448 192 ) ( 192 512 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 320 448 192 ) ( 320 448 320 ) ( 416 448 320 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 352 448 320 ) ( 128 576 320 ) ( 192 576 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 416 448 192 ) ( 192 576 192 ) ( 128 576 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 20
+{
+( 576 -64 192 ) ( 576 -32 192 ) ( 576 -64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -64 256 ) ( 640 64 256 ) ( 640 64 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 576 -64 256 ) ( 640 -64 256 ) ( 640 -64 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 640 64 256 ) ( 576 64 256 ) ( 576 64 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 640 64 320 ) ( 640 -64 320 ) ( 576 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 576 -64 192 ) ( 640 -64 192 ) ( 640 64 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 21
+{
+( 640 -304 192 ) ( 704 -304 128 ) ( 640 -448 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 704 -256 192 ) ( 704 -256 128 ) ( 704 -448 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 896 -384 0 ) ( 896 -256 0 ) ( 640 -320 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 -384 192 ) ( 896 -384 0 ) ( 640 -448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 -256 0 ) ( 896 -256 192 ) ( 640 -320 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 640 -320 64 ) ( 640 -448 64 ) ( 640 -448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 22
+{
+( 640 448 192 ) ( 704 448 128 ) ( 640 304 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 704 448 192 ) ( 704 448 128 ) ( 704 256 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 640 448 64 ) ( 640 320 64 ) ( 640 320 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 384 0 ) ( 896 384 192 ) ( 640 448 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 256 192 ) ( 896 256 0 ) ( 640 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 896 256 0 ) ( 896 384 0 ) ( 640 448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 23
+{
+( 640 64 320 ) ( 416 448 320 ) ( 416 448 256 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 320 448 320 ) ( 320 448 192 ) ( 416 448 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 320 448 192 ) ( 320 448 320 ) ( 576 64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 576 64 256 ) ( 576 64 320 ) ( 640 64 320 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 320 448 320 ) ( 384 448 320 ) ( 640 64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 640 64 192 ) ( 416 448 192 ) ( 352 448 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 24
+{
+( -512 1024 0 ) ( -512 896 0 ) ( 128 448 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( -512 896 192 ) ( -512 1024 192 ) ( 128 576 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -512 896 0 ) ( -512 896 192 ) ( 128 448 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -512 1024 192 ) ( -512 1024 0 ) ( 128 576 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 128 544 0 ) ( 128 480 0 ) ( 128 544 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( -512 1040 0 ) ( -512 1104 0 ) ( -512 1040 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 25
+{
+( -640 1120 64 ) ( -640 992 64 ) ( -640 992 0 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -640 1120 0 ) ( -640 992 0 ) ( -512 896 0 ) dsi/cretebase -128 192 0 0.500000 0.500000 0 0 0
+( -640 992 0 ) ( -640 992 64 ) ( -512 896 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -640 1120 64 ) ( -640 1120 0 ) ( -512 1024 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( -640 992 64 ) ( -640 1120 64 ) ( -512 1024 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -512 896 0 ) ( -512 832 0 ) ( -512 832 192 ) common/caulk 0 64 0 0.500000 0.500000 0 0 0
+}
+// brush 26
+{
+( -544 -1024 192 ) ( -544 -896 192 ) ( 128 -448 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -544 -1024 0 ) ( -544 -1024 192 ) ( 128 -576 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( -544 -896 192 ) ( -544 -896 0 ) ( 128 -448 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -544 -896 0 ) ( -544 -1024 0 ) ( 128 -576 0 ) dsi/cretebase 128 -64 0 0.500000 0.500000 0 0 0
+( 128 544 0 ) ( 128 480 0 ) ( 128 544 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( -544 -64 0 ) ( -544 0 0 ) ( -544 -64 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 27
+{
+( -576 576 0 ) ( -640 576 0 ) ( -640 448 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( -768 448 192 ) ( -768 576 192 ) ( -640 576 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -896 448 96 ) ( -640 448 96 ) ( -640 448 64 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -640 576 96 ) ( -896 576 96 ) ( -896 576 64 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 384 480 64 ) ( 384 608 64 ) ( 384 608 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 128 448 0 ) ( 128 512 0 ) ( 128 512 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 28
+{
+( -768 -576 192 ) ( -768 -448 192 ) ( -640 -448 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -896 -576 96 ) ( -640 -576 96 ) ( -640 -576 64 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( -640 -448 96 ) ( -896 -448 96 ) ( -896 -448 64 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -640 -448 0 ) ( -896 -448 0 ) ( -896 -576 0 ) dsi/cretebase 128 -64 0 0.500000 0.500000 0 0 0
+( 384 -544 64 ) ( 384 -416 64 ) ( 384 -416 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 128 480 0 ) ( 128 544 0 ) ( 128 544 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 29
+{
+( -576 -448 0 ) ( -576 -576 0 ) ( -576 -576 -32 ) dsi/cretebase 0 -64 0 0.500000 0.500000 0 0 0
+( 672 1024 0 ) ( -672 1024 0 ) ( -672 1024 -32 ) dsi/cretebase 0 -64 0 0.500000 0.500000 0 0 0
+( -544 192 0 ) ( -544 320 0 ) ( -544 320 -32 ) dsi/cretebase 0 -64 0 0.500000 0.500000 0 0 0
+( -608 -1024 0 ) ( 736 -1024 0 ) ( 736 -1024 -32 ) dsi/cretebase 0 -64 0 0.500000 0.500000 0 0 0
+( -640 192 0 ) ( -640 320 0 ) ( 704 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 704 320 -32 ) ( -640 320 -32 ) ( -640 192 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 30
+{
+( -544 320 0 ) ( -544 192 0 ) ( -544 320 -32 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -960 576 -32 ) ( -1024 512 -32 ) ( -1024 512 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( 1056 1024 0 ) ( 736 1024 0 ) ( 736 1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( 1024 0 0 ) ( 704 0 0 ) ( 704 320 0 ) dsi/cretebase 0 192 0 0.500000 0.500000 0 0 0
+( 704 320 -32 ) ( 704 0 -32 ) ( 1024 0 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 31
+{
+( -576 -576 0 ) ( -576 -448 0 ) ( -576 -576 -32 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -960 576 -32 ) ( -1024 512 -32 ) ( -1024 512 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -960 960 -32 ) ( -1024 1024 -32 ) ( -1024 1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( 1056 1024 0 ) ( 736 1024 0 ) ( 736 1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( 1024 0 0 ) ( 704 0 0 ) ( 704 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 704 320 -32 ) ( 704 0 -32 ) ( 1024 0 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 32
+{
+( -544 320 0 ) ( -544 192 0 ) ( -544 320 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( -384 -1024 0 ) ( -64 -1024 0 ) ( -64 -1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( -320 704 -32 ) ( 0 704 -32 ) ( 0 1024 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+( 0 1024 0 ) ( 0 704 0 ) ( -320 704 0 ) dsi/cretebase 0 -64 0 0.500000 0.500000 0 0 0
+( -576 -960 -32 ) ( -512 -1024 -32 ) ( -512 -1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+}
+// brush 33
+{
+( -576 -576 0 ) ( -576 -448 0 ) ( -576 -576 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( -384 -1024 0 ) ( -64 -1024 0 ) ( -64 -1024 -32 ) dsi/cretebase4 0 192 0 0.500000 0.500000 0 0 0
+( -320 704 -32 ) ( 0 704 -32 ) ( 0 1024 -32 ) dsi/cretebase4 -128 128 0 0.500000 0.500000 0 0 0
+( 0 1024 0 ) ( 0 704 0 ) ( -320 704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -1024 -1024 -32 ) ( -960 -960 -32 ) ( -1024 -1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+( -576 -960 -32 ) ( -512 -1024 -32 ) ( -512 -1024 0 ) common/caulk -128 192 0 0.500000 0.500000 0 0 0
+}
+// brush 34
+{
+( -544 -896 0 ) ( -544 -1024 0 ) ( -544 -1024 192 ) common/caulk 0 64 0 0.500000 0.500000 0 0 0
+( -672 -1120 0 ) ( -672 -992 0 ) ( -672 -992 64 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( -672 -992 0 ) ( -672 -1120 0 ) ( -544 -1024 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -672 -1120 64 ) ( -672 -992 64 ) ( -544 -896 192 ) dsi/cretebase4 0 64 0 0.500000 0.500000 0 0 0
+( -672 -992 64 ) ( -672 -992 0 ) ( -544 -896 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -672 -1120 0 ) ( -672 -1120 64 ) ( -544 -1024 192 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 35
+{
+( -867 -757 0 ) ( -867 -757 192 ) ( -822 -712 192 ) dsi/cretebase 272 64 0 0.500000 0.500000 0 0 0
+( -912 -776 0 ) ( -912 -776 192 ) ( -848 -776 192 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -957 -757 0 ) ( -957 -757 192 ) ( -912 -802 192 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -976 -712 32 ) ( -976 -712 224 ) ( -976 -776 224 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -957 -667 32 ) ( -957 -667 224 ) ( -1002 -712 224 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -912 -648 32 ) ( -912 -648 224 ) ( -976 -648 224 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -867 -667 32 ) ( -867 -667 224 ) ( -912 -622 224 ) dsi/cretebase 272 64 0 0.500000 0.500000 0 0 0
+( -848 -712 0 ) ( -848 -712 192 ) ( -848 -648 192 ) dsi/cretebase 272 64 0 0.500000 0.500000 0 0 0
+( -976 -776 0 ) ( -848 -776 0 ) ( -848 -648 0 ) dsi/cretebase -96 176 0 0.500000 0.500000 0 0 0
+( -864 -648 128 ) ( -864 -776 128 ) ( -992 -776 128 ) dsi/cretebase4 -288 176 0 0.500000 0.500000 0 0 0
+}
+// brush 36
+{
+( -496 -16 -32 ) ( -528 -16 -32 ) ( -528 -16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -512 16 -32 ) ( -496 16 -32 ) ( -512 16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -576 -576 0 ) ( -576 -448 0 ) ( -576 -576 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1024 320 0 ) ( -1024 0 0 ) ( -1024 0 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 37
+{
+( -528 -16 -32 ) ( -496 -16 -32 ) ( -528 -16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -544 320 0 ) ( -544 192 0 ) ( -544 320 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 1024 -1056 0 ) ( 1024 -736 0 ) ( 1024 -736 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 1024 -512 -32 ) ( 960 -576 -32 ) ( 1024 -512 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -512 -1024 -32 ) ( -768 -768 -32 ) ( -512 -1024 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( 320 -1024 0 ) ( 320 -1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 38
+{
+( -496 -16 -32 ) ( -528 -16 -32 ) ( -528 -16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -512 16 -32 ) ( -496 16 -32 ) ( -512 16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -544 320 0 ) ( -544 192 0 ) ( -544 320 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 1024 -1056 0 ) ( 1024 -736 0 ) ( 1024 -736 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 39
+{
+( -496 16 -32 ) ( -512 16 -32 ) ( -512 16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -576 -576 0 ) ( -576 -448 0 ) ( -576 -576 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1024 512 -32 ) ( -960 576 -32 ) ( -1024 512 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1024 320 0 ) ( -1024 0 0 ) ( -1024 0 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 40
+{
+( -496 16 -32 ) ( -512 16 -32 ) ( -512 16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+( -544 320 0 ) ( -544 192 0 ) ( -544 320 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 1024 -1056 0 ) ( 1024 -736 0 ) ( 1024 -736 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 512 1024 -32 ) ( 576 960 -32 ) ( 512 1024 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 384 1024 0 ) ( 64 1024 0 ) ( 64 1024 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1024 512 -32 ) ( -960 576 -32 ) ( -1024 512 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 41
+{
+( 512 64 192 ) ( 528 80 192 ) ( 512 64 208 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 528 -80 192 ) ( 512 -64 192 ) ( 528 -80 208 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 512 -160 208 ) ( 512 -160 192 ) ( 512 160 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 512 160 208 ) ( 512 160 192 ) ( 576 64 192 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 576 -64 208 ) ( 576 64 208 ) ( 576 64 80 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 512 -160 192 ) ( 512 -160 208 ) ( 576 -64 208 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 560 -64 208 ) ( 560 64 208 ) ( 576 64 208 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 576 64 192 ) ( 560 64 192 ) ( 560 -64 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 42
+{
+( 640 64 176 ) ( 416 448 176 ) ( 640 64 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 384 192 176 ) ( 640 64 176 ) ( 640 320 176 ) dsi/cretebase4 64 64 0 0.500000 0.500000 0 0 0
+( 640 64 192 ) ( 384 192 192 ) ( 384 448 192 ) dsi/cretebase4 64 64 0 0.500000 0.500000 0 0 0
+( 640 64 176 ) ( 640 64 192 ) ( 640 320 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 384 448 192 ) ( 384 448 176 ) ( 640 320 176 ) dsi/cretebase4 -128 -32 0 0.500000 0.500000 0 0 0
+}
+// brush 43
+{
+( 704 304 112 ) ( 704 272 112 ) ( 704 304 128 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 640 320 192 ) ( 640 304 192 ) ( 640 304 176 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 704 304 112 ) ( 704 304 128 ) ( 640 320 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 704 80 128 ) ( 704 80 112 ) ( 640 64 176 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 704 304 128 ) ( 704 80 128 ) ( 640 64 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 704 80 112 ) ( 704 304 112 ) ( 640 320 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 44
+{
+( 704 272 112 ) ( 704 304 112 ) ( 704 304 128 ) common/caulk -128 -64 0 0.500000 0.500000 0 0 0
+( 896 256 112 ) ( 896 256 128 ) ( 640 320 128 ) dsi/cretebase -128 -64 0 0.500000 0.500000 0 0 0
+( 896 256 128 ) ( 896 256 112 ) ( 896 128 112 ) dsi/cretebase -128 -64 0 0.500000 0.500000 0 0 0
+( 896 128 128 ) ( 896 128 112 ) ( 640 64 112 ) dsi/cretebase -128 -64 0 0.500000 0.500000 0 0 0
+( 640 304 128 ) ( 640 320 128 ) ( 656 320 128 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 656 320 112 ) ( 640 320 112 ) ( 640 304 112 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 45
+{
+( 640 -320 176 ) ( 384 -448 176 ) ( 384 -448 192 ) dsi/cretebase4 -128 -32 0 0.500000 0.500000 0 0 0
+( 640 -320 192 ) ( 640 -64 192 ) ( 640 -64 176 ) dsi/cretebase 64 64 0 0.500000 0.500000 0 0 0
+( 384 -448 192 ) ( 384 -192 192 ) ( 640 -64 192 ) dsi/cretebase4 64 -128 0 0.500000 0.500000 0 0 0
+( 640 -320 176 ) ( 640 -64 176 ) ( 384 -192 176 ) dsi/cretebase4 64 -128 0 0.500000 0.500000 0 0 0
+( 640 -64 192 ) ( 416 -448 176 ) ( 640 -64 176 ) dsi/cretebase 64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 46
+{
+( 640 -320 176 ) ( 704 -304 112 ) ( 704 -80 112 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 640 -64 192 ) ( 704 -80 128 ) ( 704 -304 128 ) dsi/cretebase4 -64 -192 0 0.500000 0.500000 0 0 0
+( 640 -64 176 ) ( 704 -80 112 ) ( 704 -80 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 -320 192 ) ( 704 -304 128 ) ( 704 -304 112 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 -304 176 ) ( 640 -304 192 ) ( 640 -320 192 ) dsi/cretebase 64 64 0 0.500000 0.500000 0 0 0
+( 704 -304 128 ) ( 704 -272 112 ) ( 704 -304 112 ) common/caulk 64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 47
+{
+( 640 -304 112 ) ( 640 -320 112 ) ( 656 -320 112 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 656 -320 128 ) ( 640 -320 128 ) ( 640 -304 128 ) dsi/cretebase4 -64 -192 0 0.500000 0.500000 0 0 0
+( 640 -64 112 ) ( 896 -128 112 ) ( 896 -128 128 ) dsi/cretebase -128 -64 0 0.500000 0.500000 0 0 0
+( 896 -128 112 ) ( 896 -256 112 ) ( 896 -256 128 ) dsi/cretebase 64 -64 0 0.500000 0.500000 0 0 0
+( 640 -320 128 ) ( 896 -256 128 ) ( 896 -256 112 ) dsi/cretebase -128 -64 0 0.500000 0.500000 0 0 0
+( 704 -304 128 ) ( 704 -304 112 ) ( 704 -272 112 ) common/caulk 64 -64 0 0.500000 0.500000 0 0 0
+}
+// brush 48
+{
+( 816 464 0 ) ( 816 416 0 ) ( 816 464 128 ) common/caulk -64 0 0 0.500000 0.500000 0 0 0
+( 864 384 0 ) ( 816 384 0 ) ( 816 384 128 ) common/caulk -64 0 0 0.500000 0.500000 0 0 0
+( 832 432 128 ) ( 896 432 128 ) ( 832 256 128 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 704 448 128 ) ( 704 448 192 ) ( 704 256 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 896 384 0 ) ( 896 384 192 ) ( 640 448 192 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 256 0 ) ( 896 384 0 ) ( 640 448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 49
+{
+( 832 448 0 ) ( 816 448 0 ) ( 816 384 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 816 512 128 ) ( 832 512 128 ) ( 832 384 128 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 816 384 128 ) ( 832 384 128 ) ( 832 384 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 384 128 ) ( 832 448 128 ) ( 832 448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 816 528 128 ) ( 816 528 0 ) ( 832 512 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 816 528 0 ) ( 816 528 128 ) ( 816 384 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 50
+{
+( 832 384 0 ) ( 848 368 0 ) ( 832 384 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 816 384 0 ) ( 864 384 0 ) ( 816 384 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 432 128 ) ( 896 432 128 ) ( 832 256 128 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 704 448 128 ) ( 704 448 192 ) ( 704 256 192 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 896 288 64 ) ( 896 416 64 ) ( 896 416 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 896 256 192 ) ( 896 256 0 ) ( 640 320 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 896 256 0 ) ( 896 384 0 ) ( 640 448 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 51
+{
+( 640 -448 0 ) ( 896 -384 0 ) ( 896 -256 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -448 192 ) ( 896 -384 192 ) ( 896 -384 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 704 -256 192 ) ( 704 -448 192 ) ( 704 -448 128 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 832 -256 128 ) ( 896 -432 128 ) ( 832 -432 128 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( 816 -384 128 ) ( 816 -384 0 ) ( 864 -384 0 ) common/caulk 192 0 0 0.500000 0.500000 0 0 0
+( 816 -464 128 ) ( 816 -416 0 ) ( 816 -464 0 ) common/caulk -64 0 0 0.500000 0.500000 0 0 0
+}
+// brush 52
+{
+( 816 -384 128 ) ( 816 -528 128 ) ( 816 -528 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 -512 0 ) ( 816 -528 0 ) ( 816 -528 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 -448 0 ) ( 832 -448 128 ) ( 832 -384 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 -384 0 ) ( 832 -384 128 ) ( 816 -384 128 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 832 -384 128 ) ( 832 -512 128 ) ( 816 -512 128 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( 816 -384 0 ) ( 816 -448 0 ) ( 832 -448 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 53
+{
+( 640 -448 0 ) ( 896 -384 0 ) ( 896 -256 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 640 -320 0 ) ( 896 -256 0 ) ( 896 -256 192 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 896 -416 0 ) ( 896 -416 64 ) ( 896 -288 64 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 704 -256 192 ) ( 704 -448 192 ) ( 704 -448 128 ) common/caulk -128 64 0 0.500000 0.500000 0 0 0
+( 832 -256 128 ) ( 896 -432 128 ) ( 832 -432 128 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( 816 -384 128 ) ( 864 -384 0 ) ( 816 -384 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 832 -384 128 ) ( 848 -368 0 ) ( 832 -384 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 54
+{
+( 640 64 320 ) ( 640 -320 320 ) ( 640 -320 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 656 64 320 ) ( 640 64 320 ) ( 640 64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 768 -320 320 ) ( 768 64 320 ) ( 768 64 304 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 624 -64 320 ) ( 640 -64 320 ) ( 640 -64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 640 -320 320 ) ( 640 64 320 ) ( 656 64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 656 64 304 ) ( 640 64 304 ) ( 640 -320 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 55
+{
+( 416 448 320 ) ( 416 448 448 ) ( 752 64 448 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 432 448 320 ) ( 432 448 448 ) ( 416 448 448 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 432 448 448 ) ( 432 448 320 ) ( 768 64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 752 64 512 ) ( 768 64 512 ) ( 768 64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 768 64 512 ) ( 752 64 512 ) ( 416 448 448 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 432 448 320 ) ( 416 448 320 ) ( 752 64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 56
+{
+( 752 64 448 ) ( 752 -64 448 ) ( 752 -64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 768 64 448 ) ( 752 64 448 ) ( 752 64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 768 -64 512 ) ( 768 64 512 ) ( 768 64 384 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 752 -64 448 ) ( 768 -64 448 ) ( 768 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 752 -64 512 ) ( 752 64 512 ) ( 768 64 512 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 768 64 320 ) ( 752 64 320 ) ( 752 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 57
+{
+( 416 -448 320 ) ( 432 -448 320 ) ( 768 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 752 -64 512 ) ( 768 -64 512 ) ( 432 -448 448 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 432 -448 448 ) ( 432 -448 320 ) ( 416 -448 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 432 -448 320 ) ( 432 -448 448 ) ( 768 -64 448 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 768 -64 512 ) ( 752 -64 512 ) ( 752 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 416 -448 448 ) ( 416 -448 320 ) ( 752 -64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 58
+{
+( 432 448 304 ) ( 768 64 304 ) ( 432 448 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 544 448 304 ) ( 416 448 304 ) ( 640 64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 416 448 320 ) ( 544 448 320 ) ( 768 64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 624 64 320 ) ( 640 64 320 ) ( 640 64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 432 448 320 ) ( 416 448 320 ) ( 416 448 304 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 416 448 304 ) ( 416 448 320 ) ( 640 64 320 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 59
+{
+( 768 -64 304 ) ( 432 -448 304 ) ( 768 -64 320 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 416 -448 320 ) ( 416 -448 304 ) ( 640 -64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 656 -64 320 ) ( 640 -64 320 ) ( 640 -64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 400 -448 320 ) ( 416 -448 320 ) ( 416 -448 304 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 544 -448 320 ) ( 416 -448 320 ) ( 640 -64 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 416 -448 304 ) ( 544 -448 304 ) ( 768 -64 304 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 60
+{
+( 192 512 192 ) ( 192 576 192 ) ( 128 576 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 128 512 256 ) ( 128 576 256 ) ( 192 576 320 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 128 512 192 ) ( 128 512 256 ) ( 192 512 256 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 128 576 256 ) ( 128 512 256 ) ( 128 512 192 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 192 576 192 ) ( 192 576 256 ) ( 128 576 256 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 192 512 256 ) ( 192 512 320 ) ( 192 576 320 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+}
+// brush 61
+{
+( 1296 384 0 ) ( 1296 528 0 ) ( 1280 528 0 ) dsi/cretebase -32 96 0 0.500000 0.500000 0 0 0
+( 1280 528 128 ) ( 1296 528 128 ) ( 1296 384 128 ) dsi/cretebase4 -224 32 0 0.500000 0.500000 0 0 0
+( 1280 512 0 ) ( 1280 512 128 ) ( 1280 384 128 ) dsi/cretebase 32 64 0 0.500000 0.500000 0 0 0
+( 1280 384 128 ) ( 1296 384 128 ) ( 1296 384 0 ) dsi/cretebase -224 64 0 0.500000 0.500000 0 0 0
+( 1296 384 128 ) ( 1296 528 128 ) ( 1296 528 0 ) dsi/cretebase 32 64 0 0.500000 0.500000 0 0 0
+( 1280 512 128 ) ( 1280 512 0 ) ( 1296 528 0 ) dsi/cretebase -160 64 0 0.500000 0.500000 0 0 0
+}
+// brush 62
+{
+( 960 528 0 ) ( 816 528 0 ) ( 816 512 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 816 512 128 ) ( 816 528 128 ) ( 960 528 128 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 832 512 0 ) ( 832 512 128 ) ( 960 512 128 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 960 528 128 ) ( 816 528 128 ) ( 816 528 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 832 512 128 ) ( 832 512 0 ) ( 816 528 0 ) dsi/cretebase -128 64 0 0.500000 0.500000 0 0 0
+( 1296 528 128 ) ( 1296 528 0 ) ( 1280 512 0 ) dsi/cretebase -160 64 0 0.500000 0.500000 0 0 0
+}
+// brush 63
+{
+( 1296 -528 0 ) ( 1280 -512 0 ) ( 1280 -512 128 ) dsi/cretebase 96 64 0 0.500000 0.500000 0 0 0
+( 1296 -528 0 ) ( 1296 -528 128 ) ( 1296 -384 128 ) dsi/cretebase 32 64 0 0.500000 0.500000 0 0 0
+( 1296 -384 0 ) ( 1296 -384 128 ) ( 1280 -384 128 ) dsi/cretebase 32 64 0 0.500000 0.500000 0 0 0
+( 1280 -384 128 ) ( 1280 -512 128 ) ( 1280 -512 0 ) dsi/cretebase 32 64 0 0.500000 0.500000 0 0 0
+( 1296 -384 128 ) ( 1296 -528 128 ) ( 1280 -528 128 ) dsi/cretebase4 32 32 0 0.500000 0.500000 0 0 0
+( 1280 -528 0 ) ( 1296 -528 0 ) ( 1296 -384 0 ) dsi/cretebase 224 96 0 0.500000 0.500000 0 0 0
+}
+// brush 64
+{
+( 1280 -512 0 ) ( 1296 -528 0 ) ( 1296 -528 128 ) dsi/cretebase 96 64 0 0.500000 0.500000 0 0 0
+( 816 -528 0 ) ( 832 -512 0 ) ( 832 -512 128 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 816 -528 0 ) ( 816 -528 128 ) ( 960 -528 128 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 960 -512 128 ) ( 832 -512 128 ) ( 832 -512 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( 960 -528 128 ) ( 816 -528 128 ) ( 816 -512 128 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( 816 -512 0 ) ( 816 -528 0 ) ( 960 -528 0 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 65
+{
+( 304 608 336 ) ( 304 480 336 ) ( 176 480 336 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 176 480 320 ) ( 304 480 320 ) ( 304 608 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 304 544 320 ) ( 304 544 336 ) ( 304 608 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 285 589 320 ) ( 285 589 336 ) ( 240 634 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 240 608 320 ) ( 240 608 336 ) ( 176 608 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 195 589 320 ) ( 195 589 336 ) ( 150 544 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 176 544 320 ) ( 176 544 336 ) ( 176 480 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 195 499 320 ) ( 195 499 336 ) ( 240 454 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 240 480 320 ) ( 240 480 336 ) ( 304 480 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 285 499 320 ) ( 285 499 336 ) ( 330 544 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+}
+// brush 66
+{
+( 285 -589 320 ) ( 285 -589 336 ) ( 330 -544 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 240 -608 320 ) ( 240 -608 336 ) ( 304 -608 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 195 -589 320 ) ( 195 -589 336 ) ( 240 -634 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 176 -544 320 ) ( 176 -544 336 ) ( 176 -608 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 195 -499 320 ) ( 195 -499 336 ) ( 150 -544 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 240 -480 320 ) ( 240 -480 336 ) ( 176 -480 336 ) dsi/cretebase 128 96 0 0.500000 0.500000 0 0 0
+( 285 -499 320 ) ( 285 -499 336 ) ( 240 -454 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 304 -544 320 ) ( 304 -544 336 ) ( 304 -480 336 ) dsi/cretebase 0 96 0 0.500000 0.500000 0 0 0
+( 176 -608 320 ) ( 304 -608 320 ) ( 304 -480 320 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 304 -480 336 ) ( 304 -608 336 ) ( 176 -608 336 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 67
+{
+( 224 -448 176 ) ( 192 -448 176 ) ( 224 -448 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 80 -480 176 ) ( 128 -448 176 ) ( 80 -480 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 208 -384 192 ) ( 208 -512 192 ) ( 80 -512 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 -512 176 ) ( 208 -512 176 ) ( 208 -384 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 208 -448 176 ) ( 208 -448 192 ) ( 208 -384 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+( 189 -403 176 ) ( 189 -403 192 ) ( 144 -358 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+}
+// brush 68
+{
+( 224 -448 176 ) ( 192 -448 176 ) ( 224 -448 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 128 -448 176 ) ( 80 -480 176 ) ( 80 -480 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 208 -384 192 ) ( 208 -512 192 ) ( 80 -512 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 -512 176 ) ( 208 -512 176 ) ( 208 -384 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 189 -403 176 ) ( 189 -403 192 ) ( 144 -358 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+( 144 -384 176 ) ( 144 -384 192 ) ( 80 -384 192 ) dsi/cretebase 64 -192 0 0.500000 0.500000 0 0 0
+( 99 -403 176 ) ( 99 -403 192 ) ( 54 -448 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+( 80 -448 176 ) ( 80 -448 192 ) ( 80 -512 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+}
+// brush 69
+{
+( 192 -448 176 ) ( 224 -448 176 ) ( 224 -448 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 128 -448 176 ) ( 80 -480 176 ) ( 80 -480 192 ) common/caulk 64 128 0 0.500000 0.500000 0 0 0
+( 208 -384 192 ) ( 208 -512 192 ) ( 80 -512 192 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 -512 176 ) ( 208 -512 176 ) ( 208 -384 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 -448 176 ) ( 80 -448 192 ) ( 80 -512 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+( 99 -493 176 ) ( 99 -493 192 ) ( 144 -538 192 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+}
+// brush 70
+{
+( 144 358 192 ) ( 189 403 192 ) ( 189 403 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 208 384 192 ) ( 208 448 192 ) ( 208 448 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 208 384 176 ) ( 208 512 176 ) ( 80 512 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 512 192 ) ( 208 512 192 ) ( 208 384 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 80 480 192 ) ( 128 448 176 ) ( 80 480 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+( 224 448 192 ) ( 192 448 176 ) ( 224 448 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+}
+// brush 71
+{
+( 80 512 192 ) ( 80 448 192 ) ( 80 448 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 54 448 192 ) ( 99 403 192 ) ( 99 403 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 80 384 192 ) ( 144 384 192 ) ( 144 384 176 ) dsi/cretebase -192 -192 0 0.500000 0.500000 0 0 0
+( 144 358 192 ) ( 189 403 192 ) ( 189 403 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 208 384 176 ) ( 208 512 176 ) ( 80 512 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 512 192 ) ( 208 512 192 ) ( 208 384 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 80 480 192 ) ( 80 480 176 ) ( 128 448 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+( 224 448 192 ) ( 192 448 176 ) ( 224 448 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+}
+// brush 72
+{
+( 144 538 192 ) ( 99 493 192 ) ( 99 493 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 80 512 192 ) ( 80 448 192 ) ( 80 448 176 ) dsi/cretebase -128 -192 0 0.500000 0.500000 0 0 0
+( 208 384 176 ) ( 208 512 176 ) ( 80 512 176 ) dsi/cretebase4 -64 64 0 0.500000 0.500000 0 0 0
+( 80 512 192 ) ( 208 512 192 ) ( 208 384 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( 80 480 192 ) ( 80 480 176 ) ( 128 448 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+( 224 448 192 ) ( 224 448 176 ) ( 192 448 176 ) common/caulk -192 128 0 0.500000 0.500000 0 0 0
+}
+// brush 73
+{
+( -1024 1024 -32 ) ( -1024 1024 0 ) ( -2048 2048 0 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+( -1024 -1024 -32 ) ( -1024 -1024 0 ) ( -1024 1024 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( 0 -1024 0 ) ( -320 -1024 0 ) ( -320 -704 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -320 -704 -32 ) ( -320 -1024 -32 ) ( 0 -1024 -32 ) dsi/cretebase 128 64 0 0.500000 0.500000 0 0 0
+( -2048 -640 0 ) ( -2048 -960 0 ) ( -2048 -960 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -1024 -1024 0 ) ( -1024 -1024 -32 ) ( -2048 -2048 -32 ) dsi/cretebase -128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 74
+{
+( -5088 2048 -32 ) ( -5568 2048 -32 ) ( -5568 1280 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 1280 0 ) ( -5568 2048 0 ) ( -5088 2048 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -4768 -2048 0 ) ( -4288 -2048 0 ) ( -4288 -2048 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -2048 1248 0 ) ( -2048 2016 0 ) ( -2048 2016 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5088 2048 0 ) ( -5568 2048 0 ) ( -5568 2048 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 2048 0 ) ( -5568 1280 0 ) ( -5568 1280 -32 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 75
+{
+( -5440 -592 128 ) ( -5376 -592 64 ) ( -5440 -624 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5568 -496 64 ) ( -5568 -592 64 ) ( -5568 -592 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -5376 -624 64 ) ( -5376 -528 64 ) ( -5376 -528 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -5952 -624 64 ) ( -4800 -624 64 ) ( -4800 -624 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 -592 128 ) ( -5568 -496 128 ) ( -4416 -496 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 -496 0 ) ( -5568 -496 0 ) ( -5568 -592 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -4544 -464 64 ) ( -5696 -464 64 ) ( -5696 -464 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+}
+// brush 76
+{
+( -5440 -336 128 ) ( -5376 -336 64 ) ( -5440 -368 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5568 -240 64 ) ( -5568 -336 64 ) ( -5568 -336 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -4416 -336 64 ) ( -5568 -336 64 ) ( -5568 -336 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 -368 64 ) ( -5376 -272 64 ) ( -5376 -272 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -5952 -368 64 ) ( -4800 -368 64 ) ( -4800 -368 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 -336 128 ) ( -5568 -240 128 ) ( -4416 -240 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 -240 0 ) ( -5568 -240 0 ) ( -5568 -336 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 77
+{
+( -5440 -208 128 ) ( -5376 -208 64 ) ( -5440 -240 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5568 -112 64 ) ( -5568 -208 64 ) ( -5568 -208 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -4544 -208 64 ) ( -5696 -208 64 ) ( -5696 -208 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 -240 64 ) ( -5376 -144 64 ) ( -5376 -144 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -5824 -240 64 ) ( -4672 -240 64 ) ( -4672 -240 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 -208 128 ) ( -5568 -112 128 ) ( -4416 -112 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 -112 0 ) ( -5568 -112 0 ) ( -5568 -208 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 78
+{
+( -5440 -80 128 ) ( -5376 -80 64 ) ( -5440 -112 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 16 0 ) ( -5568 16 0 ) ( -5568 -80 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 -80 128 ) ( -5568 16 128 ) ( -4416 16 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5952 -112 64 ) ( -4800 -112 64 ) ( -4800 -112 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 -112 64 ) ( -5376 -16 64 ) ( -5376 -16 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -4416 -80 64 ) ( -5568 -80 64 ) ( -5568 -80 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 16 64 ) ( -5568 -80 64 ) ( -5568 -80 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 79
+{
+( -5440 48 128 ) ( -5376 48 64 ) ( -5440 16 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 144 0 ) ( -5568 144 0 ) ( -5568 48 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 48 128 ) ( -5568 144 128 ) ( -4416 144 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5824 16 64 ) ( -4672 16 64 ) ( -4672 16 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 16 64 ) ( -5376 112 64 ) ( -5376 112 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -4544 48 64 ) ( -5696 48 64 ) ( -5696 48 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 144 64 ) ( -5568 48 64 ) ( -5568 48 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 80
+{
+( -5440 176 128 ) ( -5376 176 64 ) ( -5440 144 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5568 272 64 ) ( -5568 176 64 ) ( -5568 176 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -4416 176 64 ) ( -5568 176 64 ) ( -5568 176 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 144 64 ) ( -5376 240 64 ) ( -5376 240 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -5952 144 64 ) ( -4800 144 64 ) ( -4800 144 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 176 128 ) ( -5568 272 128 ) ( -4416 272 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 272 0 ) ( -5568 272 0 ) ( -5568 176 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 81
+{
+( -5440 304 128 ) ( -5376 304 64 ) ( -5440 272 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 400 0 ) ( -5568 400 0 ) ( -5568 304 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 304 128 ) ( -5568 400 128 ) ( -4416 400 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5824 272 64 ) ( -4672 272 64 ) ( -4672 272 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 272 64 ) ( -5376 368 64 ) ( -5376 368 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -4544 304 64 ) ( -5696 304 64 ) ( -5696 304 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5568 400 64 ) ( -5568 304 64 ) ( -5568 304 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+}
+// brush 82
+{
+( -4416 528 0 ) ( -5568 528 0 ) ( -5568 432 0 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -5568 432 128 ) ( -5568 528 128 ) ( -4416 528 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -5952 400 64 ) ( -4800 400 64 ) ( -4800 400 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+( -5376 400 64 ) ( -5376 496 64 ) ( -5376 496 0 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -5568 528 64 ) ( -5568 432 64 ) ( -5568 432 0 ) dsi/cretebase -64 64 0 0.500000 0.500000 0 0 0
+( -5440 432 128 ) ( -5376 432 64 ) ( -5440 400 128 ) dsi/cretebase4 384 -64 0 0.500000 0.500000 0 0 0
+( -4416 560 64 ) ( -5568 560 64 ) ( -5568 560 0 ) dsi/cretebase 0 64 0 0.500000 0.500000 0 0 0
+}
+// brush 83
+{
+( -3384 912 0 ) ( -3368 928 0 ) ( -3384 912 48 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3384 656 0 ) ( -3400 672 0 ) ( -3384 656 48 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3240 976 0 ) ( -3448 976 0 ) ( -3448 752 0 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3448 752 32 ) ( -3448 976 32 ) ( -3240 976 32 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3448 592 48 ) ( -3240 592 48 ) ( -3240 592 0 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3064 752 48 ) ( -3064 976 48 ) ( -3064 976 0 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3240 976 48 ) ( -3448 976 48 ) ( -3448 976 0 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3448 976 48 ) ( -3448 752 48 ) ( -3448 752 0 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3192 976 0 ) ( -3128 912 0 ) ( -3192 976 48 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3128 656 0 ) ( -3192 592 0 ) ( -3128 656 48 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 84
+{
+( -3096 848 96 ) ( -3080 848 96 ) ( -3096 720 96 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3064 848 32 ) ( -3096 848 32 ) ( -3096 720 32 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 736 32 ) ( -3096 736 64 ) ( -3064 720 64 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3064 720 64 ) ( -3064 848 64 ) ( -3064 848 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3096 832 64 ) ( -3096 832 32 ) ( -3064 848 32 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3096 736 576 ) ( -3096 736 544 ) ( -3096 832 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 85
+{
+( -3064 848 160 ) ( -3096 848 160 ) ( -3096 720 160 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 720 576 ) ( -3096 848 576 ) ( -3064 848 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3096 736 32 ) ( -3096 736 64 ) ( -3064 720 64 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3064 720 64 ) ( -3064 848 64 ) ( -3064 848 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3096 832 64 ) ( -3096 832 32 ) ( -3064 848 32 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3096 736 576 ) ( -3096 736 544 ) ( -3096 832 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 86
+{
+( -3080 736 96 ) ( -3064 736 96 ) ( -3080 592 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3080 704 32 ) ( -3096 736 32 ) ( -3208 624 32 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3064 720 64 ) ( -3064 720 32 ) ( -3192 592 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 720 32 ) ( -3064 720 64 ) ( -3096 736 64 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3096 736 32 ) ( -3096 736 64 ) ( -3208 624 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 624 544 ) ( -3208 624 576 ) ( -3192 592 576 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 87
+{
+( -3064 736 96 ) ( -3080 736 96 ) ( -3080 592 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3080 736 160 ) ( -3064 736 160 ) ( -3080 592 160 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3064 720 64 ) ( -3064 720 32 ) ( -3192 592 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 720 32 ) ( -3064 720 64 ) ( -3096 736 64 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3096 736 32 ) ( -3096 736 64 ) ( -3208 624 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 624 544 ) ( -3208 624 576 ) ( -3192 592 576 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 88
+{
+( -3080 976 96 ) ( -3064 976 96 ) ( -3080 832 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 832 32 ) ( -3080 864 32 ) ( -3192 976 32 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 832 64 ) ( -3096 832 32 ) ( -3208 944 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 848 64 ) ( -3064 848 32 ) ( -3096 832 32 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3064 848 32 ) ( -3064 848 64 ) ( -3192 976 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 944 576 ) ( -3208 944 544 ) ( -3192 976 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 89
+{
+( -3064 976 96 ) ( -3080 976 96 ) ( -3080 832 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3080 976 160 ) ( -3064 976 160 ) ( -3080 832 160 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 832 64 ) ( -3096 832 32 ) ( -3208 944 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 848 64 ) ( -3064 848 32 ) ( -3096 832 32 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3064 848 32 ) ( -3064 848 64 ) ( -3192 976 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 944 576 ) ( -3208 944 544 ) ( -3192 976 544 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 90
+{
+( -3064 736 160 ) ( -3080 736 160 ) ( -3080 592 160 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 736 576 ) ( -3080 704 576 ) ( -3192 592 576 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3064 720 64 ) ( -3064 720 32 ) ( -3192 592 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 720 32 ) ( -3064 720 64 ) ( -3096 736 64 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3096 736 32 ) ( -3096 736 64 ) ( -3208 624 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 624 544 ) ( -3208 624 576 ) ( -3192 592 576 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 91
+{
+( -3064 976 160 ) ( -3080 976 160 ) ( -3080 832 160 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3080 864 576 ) ( -3096 832 576 ) ( -3208 944 576 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3096 832 64 ) ( -3096 832 32 ) ( -3208 944 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3064 848 64 ) ( -3064 848 32 ) ( -3096 832 32 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3064 848 32 ) ( -3064 848 64 ) ( -3192 976 64 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 944 576 ) ( -3208 944 544 ) ( -3192 976 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 92
+{
+( -3224 976 96 ) ( -3192 976 96 ) ( -3224 944 96 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3192 976 32 ) ( -3320 976 32 ) ( -3320 944 32 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3304 944 32 ) ( -3304 944 64 ) ( -3208 944 64 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3208 944 544 ) ( -3208 944 576 ) ( -3192 976 576 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3192 976 576 ) ( -3320 976 576 ) ( -3320 976 544 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3304 944 64 ) ( -3304 944 32 ) ( -3320 976 32 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 93
+{
+( -3224 624 96 ) ( -3192 624 96 ) ( -3224 592 96 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3192 624 32 ) ( -3320 624 32 ) ( -3320 592 32 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3320 592 64 ) ( -3192 592 64 ) ( -3192 592 32 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3208 624 576 ) ( -3208 624 544 ) ( -3192 592 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 624 32 ) ( -3208 624 64 ) ( -3304 624 64 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3304 624 32 ) ( -3304 624 64 ) ( -3320 592 64 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 94
+{
+( -3224 976 160 ) ( -3240 976 160 ) ( -3240 944 160 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3208 944 576 ) ( -3320 944 576 ) ( -3320 976 576 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3304 944 160 ) ( -3320 944 576 ) ( -3208 944 576 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3208 944 544 ) ( -3208 944 576 ) ( -3192 976 576 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3192 976 576 ) ( -3320 976 576 ) ( -3320 976 544 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3320 976 576 ) ( -3320 944 576 ) ( -3304 944 160 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 95
+{
+( -3224 624 160 ) ( -3240 624 160 ) ( -3240 592 160 ) dsi/cretebase 112 -224 0 0.500000 0.500000 0 0 0
+( -3320 592 576 ) ( -3320 624 576 ) ( -3208 624 576 ) dsi/cretebase3 112 -224 0 0.500000 0.500000 0 0 0
+( -3320 592 64 ) ( -3192 592 64 ) ( -3192 592 32 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3208 624 576 ) ( -3208 624 544 ) ( -3192 592 544 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -3208 624 576 ) ( -3320 624 576 ) ( -3304 624 160 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3304 624 160 ) ( -3320 624 576 ) ( -3320 592 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 96
+{
+( -3288 976 96 ) ( -3304 944 96 ) ( -3288 976 160 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3304 944 64 ) ( -3304 944 32 ) ( -3320 976 32 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3192 976 576 ) ( -3320 976 576 ) ( -3320 976 544 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3240 976 160 ) ( -3224 976 160 ) ( -3240 944 160 ) dsi/cretebase 112 -96 0 0.500000 0.500000 0 0 0
+( -3192 976 96 ) ( -3224 976 96 ) ( -3224 944 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 97
+{
+( -3304 624 96 ) ( -3288 592 96 ) ( -3304 624 160 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3192 624 96 ) ( -3224 624 96 ) ( -3224 592 96 ) common/caulk 112 -224 0 0.500000 0.500000 0 0 0
+( -3240 624 160 ) ( -3224 624 160 ) ( -3240 592 160 ) dsi/cretebase 112 -96 0 0.500000 0.500000 0 0 0
+( -3320 592 64 ) ( -3192 592 64 ) ( -3192 592 32 ) dsi/cretebase3 112 0 0 0.500000 0.500000 0 0 0
+( -3304 624 32 ) ( -3304 624 64 ) ( -3320 592 64 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 98
+{
+( -3320 768 576 ) ( -3320 800 576 ) ( -3320 768 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3128 656 576 ) ( -3192 592 576 ) ( -3128 656 624 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3192 976 576 ) ( -3128 912 576 ) ( -3192 976 624 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3240 976 624 ) ( -3448 976 624 ) ( -3448 976 576 ) dsi/cretebase 112 128 0 0.500000 0.500000 0 0 0
+( -3064 752 624 ) ( -3064 976 624 ) ( -3064 976 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3448 592 624 ) ( -3240 592 624 ) ( -3240 592 576 ) dsi/cretebase 112 128 0 0.500000 0.500000 0 0 0
+( -3448 752 592 ) ( -3448 976 592 ) ( -3240 976 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3240 976 576 ) ( -3448 976 576 ) ( -3448 752 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 99
+{
+( -3288 528 576 ) ( -3160 528 576 ) ( -3192 592 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3160 528 592 ) ( -3288 528 592 ) ( -3320 592 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3288 528 592 ) ( -3160 528 592 ) ( -3160 528 576 ) dsi/cretebase 112 128 0 0.500000 0.500000 0 0 0
+( -3160 528 576 ) ( -3160 528 592 ) ( -3192 592 592 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3192 592 592 ) ( -3320 592 592 ) ( -3320 592 576 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3288 528 592 ) ( -3288 528 576 ) ( -3320 592 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+}
+// brush 100
+{
+( -3064 848 592 ) ( -3064 720 592 ) ( -3064 720 576 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3000 880 576 ) ( -3000 880 592 ) ( -3064 848 592 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3000 880 592 ) ( -3000 880 576 ) ( -3000 688 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3000 688 592 ) ( -3000 688 576 ) ( -3064 720 576 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3064 720 592 ) ( -3064 848 592 ) ( -3000 848 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3000 848 576 ) ( -3064 848 576 ) ( -3064 720 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 101
+{
+( -3288 1040 576 ) ( -3288 1040 592 ) ( -3320 976 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3160 1040 592 ) ( -3288 1040 592 ) ( -3288 1040 576 ) dsi/cretebase 112 128 0 0.500000 0.500000 0 0 0
+( -3160 1040 592 ) ( -3160 1040 576 ) ( -3192 976 576 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3320 976 592 ) ( -3192 976 592 ) ( -3192 976 576 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3288 1040 592 ) ( -3160 1040 592 ) ( -3192 976 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3160 1040 576 ) ( -3288 1040 576 ) ( -3320 976 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 102
+{
+( -3064 848 576 ) ( -3032 912 576 ) ( -3160 1040 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3032 912 592 ) ( -3064 848 592 ) ( -3192 976 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3064 848 592 ) ( -3064 848 576 ) ( -3192 976 576 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3000 880 592 ) ( -3000 880 576 ) ( -3064 848 576 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3000 880 576 ) ( -3000 880 592 ) ( -3160 1040 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3192 976 592 ) ( -3192 976 576 ) ( -3160 1040 576 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+}
+// brush 103
+{
+( -3192 592 576 ) ( -3192 592 592 ) ( -3160 528 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3064 720 576 ) ( -3064 720 592 ) ( -3192 592 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3000 688 576 ) ( -3000 688 592 ) ( -3064 720 592 ) dsi/cretebase 112 128 0 0.500000 0.500000 0 0 0
+( -3000 688 592 ) ( -3000 688 576 ) ( -3160 528 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 0 0 0
+( -3064 720 592 ) ( -3032 656 592 ) ( -3160 528 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3032 656 576 ) ( -3064 720 576 ) ( -3192 592 576 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 104
+{
+( -3144 1024 768 ) ( -3144 960 768 ) ( -3208 960 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3208 960 592 ) ( -3144 960 592 ) ( -3144 1024 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3144 992 592 ) ( -3144 992 784 ) ( -3144 1024 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3153 1015 592 ) ( -3153 1015 784 ) ( -3176 1038 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3176 1024 592 ) ( -3176 1024 784 ) ( -3208 1024 784 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3199 1015 576 ) ( -3199 1015 768 ) ( -3222 992 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3208 992 576 ) ( -3208 992 768 ) ( -3208 960 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3199 969 576 ) ( -3199 969 768 ) ( -3176 946 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3176 960 576 ) ( -3176 960 768 ) ( -3144 960 768 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3153 969 592 ) ( -3153 969 784 ) ( -3130 992 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+}
+// brush 105
+{
+( -3025 761 592 ) ( -3025 761 784 ) ( -3002 784 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3048 752 576 ) ( -3048 752 768 ) ( -3016 752 768 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3071 761 576 ) ( -3071 761 768 ) ( -3048 738 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3080 784 576 ) ( -3080 784 768 ) ( -3080 752 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3071 807 576 ) ( -3071 807 768 ) ( -3094 784 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3048 816 576 ) ( -3048 816 768 ) ( -3080 816 768 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3025 807 592 ) ( -3025 807 784 ) ( -3048 830 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3016 784 592 ) ( -3016 784 784 ) ( -3016 816 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3080 752 592 ) ( -3016 752 592 ) ( -3016 816 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3016 816 768 ) ( -3016 752 768 ) ( -3080 752 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 106
+{
+( -3144 608 768 ) ( -3144 544 768 ) ( -3208 544 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3208 544 592 ) ( -3144 544 592 ) ( -3144 608 592 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3144 576 592 ) ( -3144 576 784 ) ( -3144 608 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3153 599 592 ) ( -3153 599 784 ) ( -3176 622 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3176 608 592 ) ( -3176 608 784 ) ( -3208 608 784 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3199 599 576 ) ( -3199 599 768 ) ( -3222 576 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3208 576 576 ) ( -3208 576 768 ) ( -3208 544 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3199 553 576 ) ( -3199 553 768 ) ( -3176 530 768 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -3176 544 576 ) ( -3176 544 768 ) ( -3144 544 768 ) dsi/cretebase4 208 0 0 0.500000 0.500000 0 0 0
+( -3153 553 592 ) ( -3153 553 784 ) ( -3130 576 784 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+}
+// brush 107
+{
+( -3000 848 768 ) ( -3064 848 768 ) ( -3064 720 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3064 720 784 ) ( -3064 848 784 ) ( -3000 848 784 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3000 688 784 ) ( -3000 688 768 ) ( -3064 720 768 ) dsi/cretebase4 208 384 0 0.500000 0.500000 0 0 0
+( -3000 880 784 ) ( -3000 880 768 ) ( -3000 688 768 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3000 880 768 ) ( -3000 880 784 ) ( -3064 848 784 ) dsi/cretebase4 208 384 0 0.500000 0.500000 0 0 0
+( -3064 848 784 ) ( -3064 720 784 ) ( -3064 720 768 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 108
+{
+( -3192 976 784 ) ( -3192 976 768 ) ( -3160 1040 768 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3000 880 768 ) ( -3000 880 784 ) ( -3160 1040 784 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3000 880 784 ) ( -3000 880 768 ) ( -3064 848 768 ) dsi/cretebase4 208 384 0 0.500000 0.500000 0 0 0
+( -3064 848 784 ) ( -3064 848 768 ) ( -3192 976 768 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3032 912 784 ) ( -3064 848 784 ) ( -3192 976 784 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3064 848 768 ) ( -3032 912 768 ) ( -3160 1040 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+}
+// brush 109
+{
+( -3032 656 768 ) ( -3064 720 768 ) ( -3192 592 768 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3064 720 784 ) ( -3032 656 784 ) ( -3160 528 784 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 0 0 0
+( -3000 688 784 ) ( -3000 688 768 ) ( -3160 528 768 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3000 688 768 ) ( -3000 688 784 ) ( -3064 720 784 ) dsi/cretebase 112 0 0 0.500000 0.500000 0 0 0
+( -3064 720 768 ) ( -3064 720 784 ) ( -3192 592 784 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -3192 592 768 ) ( -3192 592 784 ) ( -3160 528 784 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 110
+{
+( -3328 832 472 ) ( -3328 736 472 ) ( -3328 736 456 ) dsi/cretebase4 320 272 0 0.500000 0.500000 134217728 0 0
+( -3320 832 472 ) ( -3328 832 472 ) ( -3328 832 456 ) dsi/cretebase4 208 272 0 0.500000 0.500000 134217728 0 0
+( -3320 736 464 ) ( -3320 832 464 ) ( -3320 832 448 ) dsi/cretebase4 320 272 0 0.500000 0.500000 134217728 0 0
+( -3328 736 472 ) ( -3320 736 472 ) ( -3320 736 456 ) dsi/cretebase4 208 272 0 0.500000 0.500000 134217728 0 0
+( -3328 744 512 ) ( -3328 840 512 ) ( -3320 840 512 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3320 832 504 ) ( -3328 832 504 ) ( -3328 736 504 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+}
+// brush 111
+{
+( -3320 832 440 ) ( -3328 832 440 ) ( -3328 736 440 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 744 448 ) ( -3328 840 448 ) ( -3320 840 448 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 736 408 ) ( -3320 736 408 ) ( -3320 736 392 ) dsi/cretebase4 208 144 0 0.500000 0.500000 134217728 0 0
+( -3320 736 400 ) ( -3320 832 400 ) ( -3320 832 384 ) dsi/cretebase4 320 144 0 0.500000 0.500000 134217728 0 0
+( -3320 832 408 ) ( -3328 832 408 ) ( -3328 832 392 ) dsi/cretebase4 208 144 0 0.500000 0.500000 134217728 0 0
+( -3328 832 408 ) ( -3328 736 408 ) ( -3328 736 392 ) dsi/cretebase4 320 144 0 0.500000 0.500000 134217728 0 0
+}
+// brush 112
+{
+( -3328 832 344 ) ( -3328 736 344 ) ( -3328 736 328 ) dsi/cretebase4 320 16 0 0.500000 0.500000 134217728 0 0
+( -3320 832 344 ) ( -3328 832 344 ) ( -3328 832 328 ) dsi/cretebase4 208 16 0 0.500000 0.500000 134217728 0 0
+( -3320 736 336 ) ( -3320 832 336 ) ( -3320 832 320 ) dsi/cretebase4 320 16 0 0.500000 0.500000 134217728 0 0
+( -3328 736 344 ) ( -3320 736 344 ) ( -3320 736 328 ) dsi/cretebase4 208 16 0 0.500000 0.500000 134217728 0 0
+( -3328 744 384 ) ( -3328 840 384 ) ( -3320 840 384 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3320 832 376 ) ( -3328 832 376 ) ( -3328 736 376 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+}
+// brush 113
+{
+( -3320 832 312 ) ( -3328 832 312 ) ( -3328 736 312 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 744 320 ) ( -3328 840 320 ) ( -3320 840 320 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 736 280 ) ( -3320 736 280 ) ( -3320 736 264 ) dsi/cretebase4 208 -112 0 0.500000 0.500000 134217728 0 0
+( -3320 736 272 ) ( -3320 832 272 ) ( -3320 832 256 ) dsi/cretebase4 320 -112 0 0.500000 0.500000 134217728 0 0
+( -3320 832 280 ) ( -3328 832 280 ) ( -3328 832 264 ) dsi/cretebase4 208 -112 0 0.500000 0.500000 134217728 0 0
+( -3328 832 280 ) ( -3328 736 280 ) ( -3328 736 264 ) dsi/cretebase4 320 -112 0 0.500000 0.500000 134217728 0 0
+}
+// brush 114
+{
+( -3328 832 216 ) ( -3328 736 216 ) ( -3328 736 200 ) dsi/cretebase4 320 -240 0 0.500000 0.500000 134217728 0 0
+( -3320 832 216 ) ( -3328 832 216 ) ( -3328 832 200 ) dsi/cretebase4 208 -240 0 0.500000 0.500000 134217728 0 0
+( -3320 736 208 ) ( -3320 832 208 ) ( -3320 832 192 ) dsi/cretebase4 320 -240 0 0.500000 0.500000 134217728 0 0
+( -3328 736 216 ) ( -3320 736 216 ) ( -3320 736 200 ) dsi/cretebase4 208 -240 0 0.500000 0.500000 134217728 0 0
+( -3328 744 256 ) ( -3328 840 256 ) ( -3320 840 256 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3320 832 248 ) ( -3328 832 248 ) ( -3328 736 248 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+}
+// brush 115
+{
+( -3320 832 184 ) ( -3328 832 184 ) ( -3328 736 184 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 744 192 ) ( -3328 840 192 ) ( -3320 840 192 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 736 152 ) ( -3320 736 152 ) ( -3320 736 136 ) dsi/cretebase4 208 -368 0 0.500000 0.500000 134217728 0 0
+( -3320 736 144 ) ( -3320 832 144 ) ( -3320 832 128 ) dsi/cretebase4 320 -368 0 0.500000 0.500000 134217728 0 0
+( -3320 832 152 ) ( -3328 832 152 ) ( -3328 832 136 ) dsi/cretebase4 208 -368 0 0.500000 0.500000 134217728 0 0
+( -3328 832 152 ) ( -3328 736 152 ) ( -3328 736 136 ) dsi/cretebase4 320 -368 0 0.500000 0.500000 134217728 0 0
+}
+// brush 116
+{
+( -3328 832 88 ) ( -3328 736 88 ) ( -3328 736 72 ) dsi/cretebase4 320 -496 0 0.500000 0.500000 134217728 0 0
+( -3320 832 88 ) ( -3328 832 88 ) ( -3328 832 72 ) dsi/cretebase4 208 -496 0 0.500000 0.500000 134217728 0 0
+( -3320 736 80 ) ( -3320 832 80 ) ( -3320 832 64 ) dsi/cretebase4 320 -496 0 0.500000 0.500000 134217728 0 0
+( -3328 736 88 ) ( -3320 736 88 ) ( -3320 736 72 ) dsi/cretebase4 208 -496 0 0.500000 0.500000 134217728 0 0
+( -3328 744 128 ) ( -3328 840 128 ) ( -3320 840 128 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3320 832 120 ) ( -3328 832 120 ) ( -3328 736 120 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+}
+// brush 117
+{
+( -3320 832 56 ) ( -3328 832 56 ) ( -3328 736 56 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 744 64 ) ( -3328 840 64 ) ( -3320 840 64 ) dsi/cretebase4 208 -224 0 0.500000 0.500000 134217728 0 0
+( -3328 736 24 ) ( -3320 736 24 ) ( -3320 736 8 ) dsi/cretebase4 208 -112 0 0.500000 0.500000 134217728 0 0
+( -3320 736 16 ) ( -3320 832 16 ) ( -3320 832 0 ) dsi/cretebase4 320 -112 0 0.500000 0.500000 134217728 0 0
+( -3320 832 24 ) ( -3328 832 24 ) ( -3328 832 8 ) dsi/cretebase4 208 -112 0 0.500000 0.500000 134217728 0 0
+( -3328 832 24 ) ( -3328 736 24 ) ( -3328 736 8 ) dsi/cretebase4 320 -112 0 0.500000 0.500000 134217728 0 0
+}
+// brush 118
+{
+( -3320 720 32 ) ( -3328 736 32 ) ( -3320 720 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 134217728 0 0
+( -3328 736 576 ) ( -3320 736 592 ) ( -3328 720 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 134217728 0 0
+( -3320 736 32 ) ( -3336 736 32 ) ( -3336 720 32 ) dsi/cretebase4 208 -80 0 0.500000 0.500000 134217728 0 0
+( -3320 720 96 ) ( -3320 736 96 ) ( -3320 736 80 ) dsi/cretebase4 320 144 0 0.500000 0.500000 134217728 0 0
+( -3320 736 592 ) ( -3336 736 592 ) ( -3336 736 576 ) dsi/cretebase4 208 144 0 0.500000 0.500000 134217728 0 0
+}
+// brush 119
+{
+( -3328 832 32 ) ( -3320 848 32 ) ( -3328 832 592 ) dsi/cretebase 224 128 0 0.500000 0.500000 134217728 0 0
+( -3328 848 576 ) ( -3320 848 592 ) ( -3328 832 576 ) dsi/cretebase 224 128 0 0.500000 0.500000 134217728 0 0
+( -3320 832 96 ) ( -3320 848 96 ) ( -3320 848 80 ) dsi/cretebase4 320 144 0 0.500000 0.500000 134217728 0 0
+( -3336 832 592 ) ( -3320 832 592 ) ( -3320 832 576 ) dsi/cretebase4 208 144 0 0.500000 0.500000 134217728 0 0
+( -3320 848 32 ) ( -3336 848 32 ) ( -3336 832 32 ) dsi/cretebase4 208 -80 0 0.500000 0.500000 134217728 0 0
+}
+// brush 120
+{
+( -3710 -1164 0 ) ( -3702 -1143 0 ) ( -3710 -1164 48 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3606 -1398 0 ) ( -3627 -1390 0 ) ( -3606 -1398 48 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -3605 -1047 0 ) ( -3795 -1132 0 ) ( -3704 -1336 0 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3704 -1336 32 ) ( -3795 -1132 32 ) ( -3605 -1047 32 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3639 -1483 48 ) ( -3449 -1398 48 ) ( -3449 -1398 0 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3353 -1180 48 ) ( -3444 -976 48 ) ( -3444 -976 0 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3605 -1047 48 ) ( -3795 -1132 48 ) ( -3795 -1132 0 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3795 -1132 48 ) ( -3704 -1336 48 ) ( -3704 -1336 0 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3561 -1028 0 ) ( -3476 -1060 0 ) ( -3561 -1028 48 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -3372 -1294 0 ) ( -3405 -1378 0 ) ( -3372 -1294 48 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 121
+{
+( -3421 -1105 96 ) ( -3406 -1099 96 ) ( -3369 -1222 96 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3392 -1092 32 ) ( -3421 -1105 32 ) ( -3369 -1222 32 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3376 -1208 32 ) ( -3376 -1208 64 ) ( -3340 -1209 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 64 ) ( -3392 -1092 64 ) ( -3392 -1092 32 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3415 -1120 64 ) ( -3415 -1120 32 ) ( -3392 -1092 32 ) dsi/cretebase3 336 0 0 0.500000 0.500000 0 0 0
+( -3376 -1208 576 ) ( -3376 -1208 544 ) ( -3415 -1120 544 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 122
+{
+( -3392 -1092 160 ) ( -3421 -1105 160 ) ( -3369 -1222 160 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3369 -1222 576 ) ( -3421 -1105 576 ) ( -3392 -1092 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3376 -1208 32 ) ( -3376 -1208 64 ) ( -3340 -1209 64 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 64 ) ( -3392 -1092 64 ) ( -3392 -1092 32 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3415 -1120 64 ) ( -3415 -1120 32 ) ( -3392 -1092 32 ) dsi/cretebase4 432 0 0 0.500000 0.500000 0 0 0
+( -3376 -1208 576 ) ( -3376 -1208 544 ) ( -3415 -1120 544 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 123
+{
+( -3361 -1201 96 ) ( -3346 -1195 96 ) ( -3302 -1333 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3348 -1231 32 ) ( -3376 -1208 32 ) ( -3432 -1356 32 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 64 ) ( -3340 -1209 32 ) ( -3405 -1378 32 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 32 ) ( -3340 -1209 64 ) ( -3376 -1208 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3376 -1208 32 ) ( -3376 -1208 64 ) ( -3432 -1356 64 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 544 ) ( -3432 -1356 576 ) ( -3405 -1378 576 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+}
+// brush 124
+{
+( -3346 -1195 96 ) ( -3361 -1201 96 ) ( -3302 -1333 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3361 -1201 160 ) ( -3346 -1195 160 ) ( -3302 -1333 160 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 64 ) ( -3340 -1209 32 ) ( -3405 -1378 32 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 32 ) ( -3340 -1209 64 ) ( -3376 -1208 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3376 -1208 32 ) ( -3376 -1208 64 ) ( -3432 -1356 64 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 544 ) ( -3432 -1356 576 ) ( -3405 -1378 576 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+}
+// brush 125
+{
+( -3459 -982 96 ) ( -3444 -976 96 ) ( -3400 -1114 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3415 -1120 32 ) ( -3413 -1084 32 ) ( -3561 -1028 32 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3415 -1120 64 ) ( -3415 -1120 32 ) ( -3562 -1063 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 64 ) ( -3392 -1092 32 ) ( -3415 -1120 32 ) dsi/cretebase 336 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 32 ) ( -3392 -1092 64 ) ( -3561 -1028 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3562 -1063 576 ) ( -3562 -1063 544 ) ( -3561 -1028 544 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 126
+{
+( -3444 -976 96 ) ( -3459 -982 96 ) ( -3400 -1114 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3459 -982 160 ) ( -3444 -976 160 ) ( -3400 -1114 160 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3415 -1120 64 ) ( -3415 -1120 32 ) ( -3562 -1063 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 64 ) ( -3392 -1092 32 ) ( -3415 -1120 32 ) dsi/cretebase 336 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 32 ) ( -3392 -1092 64 ) ( -3561 -1028 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3562 -1063 576 ) ( -3562 -1063 544 ) ( -3561 -1028 544 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 127
+{
+( -3346 -1195 160 ) ( -3361 -1201 160 ) ( -3302 -1333 160 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3376 -1208 576 ) ( -3348 -1231 576 ) ( -3405 -1378 576 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 64 ) ( -3340 -1209 32 ) ( -3405 -1378 32 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 32 ) ( -3340 -1209 64 ) ( -3376 -1208 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3376 -1208 32 ) ( -3376 -1208 64 ) ( -3432 -1356 64 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 544 ) ( -3432 -1356 576 ) ( -3405 -1378 576 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+}
+// brush 128
+{
+( -3444 -976 160 ) ( -3459 -982 160 ) ( -3400 -1114 160 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3413 -1084 576 ) ( -3415 -1120 576 ) ( -3562 -1063 576 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3415 -1120 64 ) ( -3415 -1120 32 ) ( -3562 -1063 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 64 ) ( -3392 -1092 32 ) ( -3415 -1120 32 ) dsi/cretebase 336 0 0 0.500000 0.500000 0 0 0
+( -3392 -1092 32 ) ( -3392 -1092 64 ) ( -3561 -1028 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3562 -1063 576 ) ( -3562 -1063 544 ) ( -3561 -1028 544 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 129
+{
+( -3590 -1041 96 ) ( -3561 -1028 96 ) ( -3577 -1070 96 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3561 -1028 32 ) ( -3678 -1080 32 ) ( -3665 -1109 32 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3650 -1102 32 ) ( -3650 -1102 64 ) ( -3562 -1063 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3562 -1063 544 ) ( -3562 -1063 576 ) ( -3561 -1028 576 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3561 -1028 576 ) ( -3678 -1080 576 ) ( -3678 -1080 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3650 -1102 64 ) ( -3650 -1102 32 ) ( -3678 -1080 32 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+}
+// brush 130
+{
+( -3447 -1362 96 ) ( -3418 -1349 96 ) ( -3434 -1391 96 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3418 -1349 32 ) ( -3535 -1401 32 ) ( -3522 -1430 32 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3522 -1430 64 ) ( -3405 -1378 64 ) ( -3405 -1378 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 576 ) ( -3432 -1356 544 ) ( -3405 -1378 544 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 32 ) ( -3432 -1356 64 ) ( -3520 -1395 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3520 -1395 32 ) ( -3520 -1395 64 ) ( -3522 -1430 64 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 131
+{
+( -3590 -1041 160 ) ( -3605 -1047 160 ) ( -3592 -1076 160 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3562 -1063 576 ) ( -3665 -1109 576 ) ( -3678 -1080 576 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3650 -1102 160 ) ( -3665 -1109 576 ) ( -3562 -1063 576 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3562 -1063 544 ) ( -3562 -1063 576 ) ( -3561 -1028 576 ) dsi/cretebase3 128 0 0 0.500000 0.500000 0 0 0
+( -3561 -1028 576 ) ( -3678 -1080 576 ) ( -3678 -1080 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3678 -1080 576 ) ( -3665 -1109 576 ) ( -3650 -1102 160 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 132
+{
+( -3447 -1362 160 ) ( -3462 -1369 160 ) ( -3449 -1398 160 ) dsi/cretebase 176 -128 0 0.500000 0.500000 0 0 0
+( -3522 -1430 576 ) ( -3535 -1401 576 ) ( -3432 -1356 576 ) dsi/cretebase3 176 -128 0 0.500000 0.500000 0 0 0
+( -3522 -1430 64 ) ( -3405 -1378 64 ) ( -3405 -1378 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 576 ) ( -3432 -1356 544 ) ( -3405 -1378 544 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -3432 -1356 576 ) ( -3535 -1401 576 ) ( -3520 -1395 160 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3520 -1395 160 ) ( -3535 -1401 576 ) ( -3522 -1430 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 133
+{
+( -3649 -1067 96 ) ( -3650 -1102 96 ) ( -3649 -1067 160 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3650 -1102 64 ) ( -3650 -1102 32 ) ( -3678 -1080 32 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -3561 -1028 576 ) ( -3678 -1080 576 ) ( -3678 -1080 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3605 -1047 160 ) ( -3590 -1041 160 ) ( -3592 -1076 160 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3561 -1028 96 ) ( -3590 -1041 96 ) ( -3577 -1070 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 134
+{
+( -3520 -1395 96 ) ( -3492 -1417 96 ) ( -3520 -1395 160 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -3418 -1349 96 ) ( -3447 -1362 96 ) ( -3434 -1391 96 ) common/caulk 176 -128 0 0.500000 0.500000 0 0 0
+( -3462 -1369 160 ) ( -3447 -1362 160 ) ( -3449 -1398 160 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3522 -1430 64 ) ( -3405 -1378 64 ) ( -3405 -1378 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -3520 -1395 32 ) ( -3520 -1395 64 ) ( -3522 -1430 64 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+}
+// brush 135
+{
+( -3593 -1270 576 ) ( -3606 -1240 576 ) ( -3593 -1270 592 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3372 -1294 576 ) ( -3405 -1378 576 ) ( -3372 -1294 624 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3561 -1028 576 ) ( -3476 -1060 576 ) ( -3561 -1028 624 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -3605 -1047 624 ) ( -3795 -1132 624 ) ( -3795 -1132 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -3353 -1180 624 ) ( -3444 -976 624 ) ( -3444 -976 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3639 -1483 624 ) ( -3449 -1398 624 ) ( -3449 -1398 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -3704 -1336 592 ) ( -3795 -1132 592 ) ( -3605 -1047 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3605 -1047 576 ) ( -3795 -1132 576 ) ( -3704 -1336 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 136
+{
+( -3466 -1476 576 ) ( -3349 -1424 576 ) ( -3405 -1378 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3349 -1424 592 ) ( -3466 -1476 592 ) ( -3522 -1430 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3466 -1476 592 ) ( -3349 -1424 592 ) ( -3349 -1424 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -3349 -1424 576 ) ( -3349 -1424 592 ) ( -3405 -1378 592 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3405 -1378 592 ) ( -3522 -1430 592 ) ( -3522 -1430 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3466 -1476 592 ) ( -3466 -1476 576 ) ( -3522 -1430 576 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+}
+// brush 137
+{
+( -3392 -1092 592 ) ( -3340 -1209 592 ) ( -3340 -1209 576 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 576 ) ( -3346 -1037 592 ) ( -3392 -1092 592 ) dsi/cretebase4 432 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 592 ) ( -3346 -1037 576 ) ( -3268 -1213 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3268 -1213 592 ) ( -3268 -1213 576 ) ( -3340 -1209 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 592 ) ( -3392 -1092 592 ) ( -3333 -1066 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3333 -1066 576 ) ( -3392 -1092 576 ) ( -3340 -1209 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 138
+{
+( -3675 -1008 576 ) ( -3675 -1008 592 ) ( -3678 -1080 592 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3558 -956 592 ) ( -3675 -1008 592 ) ( -3675 -1008 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -3558 -956 592 ) ( -3558 -956 576 ) ( -3561 -1028 576 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3678 -1080 592 ) ( -3561 -1028 592 ) ( -3561 -1028 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3675 -1008 592 ) ( -3558 -956 592 ) ( -3561 -1028 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3558 -956 576 ) ( -3675 -1008 576 ) ( -3678 -1080 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 139
+{
+( -3392 -1092 576 ) ( -3389 -1021 576 ) ( -3558 -956 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3389 -1021 592 ) ( -3392 -1092 592 ) ( -3561 -1028 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3392 -1092 592 ) ( -3392 -1092 576 ) ( -3561 -1028 576 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 592 ) ( -3346 -1037 576 ) ( -3392 -1092 576 ) dsi/cretebase4 432 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 576 ) ( -3346 -1037 592 ) ( -3558 -956 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -3561 -1028 592 ) ( -3561 -1028 576 ) ( -3558 -956 576 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 140
+{
+( -3405 -1378 576 ) ( -3405 -1378 592 ) ( -3349 -1424 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 576 ) ( -3340 -1209 592 ) ( -3405 -1378 592 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3268 -1213 576 ) ( -3268 -1213 592 ) ( -3340 -1209 592 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -3268 -1213 592 ) ( -3268 -1213 576 ) ( -3349 -1424 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 592 ) ( -3285 -1255 592 ) ( -3349 -1424 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3285 -1255 576 ) ( -3340 -1209 576 ) ( -3405 -1378 576 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 141
+{
+( -3537 -964 768 ) ( -3511 -1023 768 ) ( -3569 -1049 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3569 -1049 592 ) ( -3511 -1023 592 ) ( -3537 -964 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3524 -993 592 ) ( -3524 -993 784 ) ( -3537 -964 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3541 -976 592 ) ( -3541 -976 784 ) ( -3571 -964 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3566 -977 592 ) ( -3566 -977 784 ) ( -3595 -990 784 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3583 -995 576 ) ( -3583 -995 768 ) ( -3595 -1025 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3582 -1019 576 ) ( -3582 -1019 768 ) ( -3569 -1049 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3564 -1037 576 ) ( -3564 -1037 768 ) ( -3534 -1048 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3540 -1036 576 ) ( -3540 -1036 768 ) ( -3511 -1023 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3522 -1018 592 ) ( -3522 -1018 784 ) ( -3511 -988 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 142
+{
+( -3321 -1156 592 ) ( -3321 -1156 784 ) ( -3309 -1126 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3338 -1174 576 ) ( -3338 -1174 768 ) ( -3309 -1161 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3363 -1175 576 ) ( -3363 -1175 768 ) ( -3333 -1186 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3380 -1157 576 ) ( -3380 -1157 768 ) ( -3367 -1187 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3382 -1133 576 ) ( -3382 -1133 768 ) ( -3393 -1163 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3364 -1115 576 ) ( -3364 -1115 768 ) ( -3393 -1128 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3340 -1114 592 ) ( -3340 -1114 784 ) ( -3370 -1102 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3322 -1131 592 ) ( -3322 -1131 784 ) ( -3335 -1102 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3367 -1187 592 ) ( -3309 -1161 592 ) ( -3335 -1102 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3335 -1102 768 ) ( -3309 -1161 768 ) ( -3367 -1187 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 143
+{
+( -3367 -1344 768 ) ( -3341 -1403 768 ) ( -3400 -1429 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3400 -1429 592 ) ( -3341 -1403 592 ) ( -3367 -1344 592 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3354 -1373 592 ) ( -3354 -1373 784 ) ( -3367 -1344 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3372 -1356 592 ) ( -3372 -1356 784 ) ( -3402 -1344 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3397 -1357 592 ) ( -3397 -1357 784 ) ( -3426 -1370 784 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3414 -1375 576 ) ( -3414 -1375 768 ) ( -3426 -1405 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3413 -1400 576 ) ( -3413 -1400 768 ) ( -3400 -1429 768 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+( -3395 -1417 576 ) ( -3395 -1417 768 ) ( -3365 -1429 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -3371 -1416 576 ) ( -3371 -1416 768 ) ( -3341 -1403 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -3353 -1398 592 ) ( -3353 -1398 784 ) ( -3342 -1368 784 ) dsi/cretebase4 224 0 0 0.500000 0.500000 0 0 0
+}
+// brush 144
+{
+( -3333 -1066 768 ) ( -3392 -1092 768 ) ( -3340 -1209 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 784 ) ( -3392 -1092 784 ) ( -3333 -1066 784 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3268 -1213 784 ) ( -3268 -1213 768 ) ( -3340 -1209 768 ) dsi/cretebase4 272 384 0 0.500000 0.500000 0 0 0
+( -3346 -1037 784 ) ( -3346 -1037 768 ) ( -3268 -1213 768 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 768 ) ( -3346 -1037 784 ) ( -3392 -1092 784 ) dsi/cretebase4 432 384 0 0.500000 0.500000 0 0 0
+( -3392 -1092 784 ) ( -3340 -1209 784 ) ( -3340 -1209 768 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 145
+{
+( -3561 -1028 784 ) ( -3561 -1028 768 ) ( -3558 -956 768 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 768 ) ( -3346 -1037 784 ) ( -3558 -956 784 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -3346 -1037 784 ) ( -3346 -1037 768 ) ( -3392 -1092 768 ) dsi/cretebase4 432 384 0 0.500000 0.500000 0 0 0
+( -3392 -1092 784 ) ( -3392 -1092 768 ) ( -3561 -1028 768 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -3389 -1021 784 ) ( -3392 -1092 784 ) ( -3561 -1028 784 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3392 -1092 768 ) ( -3389 -1021 768 ) ( -3558 -956 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 146
+{
+( -3285 -1255 768 ) ( -3340 -1209 768 ) ( -3405 -1378 768 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3340 -1209 784 ) ( -3285 -1255 784 ) ( -3349 -1424 784 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 0 0 0
+( -3268 -1213 784 ) ( -3268 -1213 768 ) ( -3349 -1424 768 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3268 -1213 768 ) ( -3268 -1213 784 ) ( -3340 -1209 784 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -3340 -1209 768 ) ( -3340 -1209 784 ) ( -3405 -1378 784 ) dsi/cretebase 128 0 0 0.500000 0.500000 0 0 0
+( -3405 -1378 768 ) ( -3405 -1378 784 ) ( -3349 -1424 784 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+}
+// brush 147
+{
+( -3627 -1214 472 ) ( -3587 -1302 472 ) ( -3587 -1302 456 ) dsi/cretebase4 224 272 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 472 ) ( -3627 -1214 472 ) ( -3627 -1214 456 ) dsi/cretebase4 272 272 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 464 ) ( -3619 -1211 464 ) ( -3619 -1211 448 ) dsi/cretebase4 224 272 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 472 ) ( -3580 -1299 472 ) ( -3580 -1299 456 ) dsi/cretebase4 272 272 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 512 ) ( -3630 -1207 512 ) ( -3622 -1204 512 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 504 ) ( -3627 -1214 504 ) ( -3587 -1302 504 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 148
+{
+( -3619 -1211 440 ) ( -3627 -1214 440 ) ( -3587 -1302 440 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 448 ) ( -3630 -1207 448 ) ( -3622 -1204 448 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 408 ) ( -3580 -1299 408 ) ( -3580 -1299 392 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 400 ) ( -3619 -1211 400 ) ( -3619 -1211 384 ) dsi/cretebase4 224 144 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 408 ) ( -3627 -1214 408 ) ( -3627 -1214 392 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 408 ) ( -3587 -1302 408 ) ( -3587 -1302 392 ) dsi/cretebase4 224 144 0 0.500000 0.500000 134217728 0 0
+}
+// brush 149
+{
+( -3627 -1214 344 ) ( -3587 -1302 344 ) ( -3587 -1302 328 ) dsi/cretebase4 224 16 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 344 ) ( -3627 -1214 344 ) ( -3627 -1214 328 ) dsi/cretebase4 272 16 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 336 ) ( -3619 -1211 336 ) ( -3619 -1211 320 ) dsi/cretebase4 224 16 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 344 ) ( -3580 -1299 344 ) ( -3580 -1299 328 ) dsi/cretebase4 272 16 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 384 ) ( -3630 -1207 384 ) ( -3622 -1204 384 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 376 ) ( -3627 -1214 376 ) ( -3587 -1302 376 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 150
+{
+( -3619 -1211 312 ) ( -3627 -1214 312 ) ( -3587 -1302 312 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 320 ) ( -3630 -1207 320 ) ( -3622 -1204 320 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 280 ) ( -3580 -1299 280 ) ( -3580 -1299 264 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 272 ) ( -3619 -1211 272 ) ( -3619 -1211 256 ) dsi/cretebase4 224 -112 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 280 ) ( -3627 -1214 280 ) ( -3627 -1214 264 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 280 ) ( -3587 -1302 280 ) ( -3587 -1302 264 ) dsi/cretebase4 224 -112 0 0.500000 0.500000 134217728 0 0
+}
+// brush 151
+{
+( -3627 -1214 216 ) ( -3587 -1302 216 ) ( -3587 -1302 200 ) dsi/cretebase4 224 -240 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 216 ) ( -3627 -1214 216 ) ( -3627 -1214 200 ) dsi/cretebase4 272 -240 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 208 ) ( -3619 -1211 208 ) ( -3619 -1211 192 ) dsi/cretebase4 224 -240 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 216 ) ( -3580 -1299 216 ) ( -3580 -1299 200 ) dsi/cretebase4 272 -240 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 256 ) ( -3630 -1207 256 ) ( -3622 -1204 256 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 248 ) ( -3627 -1214 248 ) ( -3587 -1302 248 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 152
+{
+( -3619 -1211 184 ) ( -3627 -1214 184 ) ( -3587 -1302 184 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 192 ) ( -3630 -1207 192 ) ( -3622 -1204 192 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 152 ) ( -3580 -1299 152 ) ( -3580 -1299 136 ) dsi/cretebase4 272 -368 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 144 ) ( -3619 -1211 144 ) ( -3619 -1211 128 ) dsi/cretebase4 224 -368 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 152 ) ( -3627 -1214 152 ) ( -3627 -1214 136 ) dsi/cretebase4 272 -368 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 152 ) ( -3587 -1302 152 ) ( -3587 -1302 136 ) dsi/cretebase4 224 -368 0 0.500000 0.500000 134217728 0 0
+}
+// brush 153
+{
+( -3627 -1214 88 ) ( -3587 -1302 88 ) ( -3587 -1302 72 ) dsi/cretebase4 224 -496 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 88 ) ( -3627 -1214 88 ) ( -3627 -1214 72 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 80 ) ( -3619 -1211 80 ) ( -3619 -1211 64 ) dsi/cretebase4 224 -496 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 88 ) ( -3580 -1299 88 ) ( -3580 -1299 72 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 128 ) ( -3630 -1207 128 ) ( -3622 -1204 128 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 120 ) ( -3627 -1214 120 ) ( -3587 -1302 120 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 154
+{
+( -3619 -1211 56 ) ( -3627 -1214 56 ) ( -3587 -1302 56 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3591 -1295 64 ) ( -3630 -1207 64 ) ( -3622 -1204 64 ) dsi/cretebase4 272 -128 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 24 ) ( -3580 -1299 24 ) ( -3580 -1299 8 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 16 ) ( -3619 -1211 16 ) ( -3619 -1211 0 ) dsi/cretebase4 224 -112 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 24 ) ( -3627 -1214 24 ) ( -3627 -1214 8 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 24 ) ( -3587 -1302 24 ) ( -3587 -1302 8 ) dsi/cretebase4 224 -112 0 0.500000 0.500000 134217728 0 0
+}
+// brush 155
+{
+( -3574 -1314 32 ) ( -3587 -1302 32 ) ( -3574 -1314 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 134217728 0 0
+( -3587 -1302 576 ) ( -3580 -1299 592 ) ( -3581 -1317 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 32 ) ( -3595 -1305 32 ) ( -3588 -1320 32 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+( -3574 -1314 96 ) ( -3580 -1299 96 ) ( -3580 -1299 80 ) dsi/cretebase4 224 144 0 0.500000 0.500000 134217728 0 0
+( -3580 -1299 592 ) ( -3595 -1305 592 ) ( -3595 -1305 576 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+}
+// brush 156
+{
+( -3627 -1214 32 ) ( -3626 -1197 32 ) ( -3627 -1214 592 ) dsi/cretebase 128 128 0 0.500000 0.500000 134217728 0 0
+( -3633 -1200 576 ) ( -3626 -1197 592 ) ( -3627 -1214 576 ) dsi/cretebase 128 128 0 0.500000 0.500000 134217728 0 0
+( -3619 -1211 96 ) ( -3626 -1197 96 ) ( -3626 -1197 80 ) dsi/cretebase4 224 144 0 0.500000 0.500000 134217728 0 0
+( -3634 -1218 592 ) ( -3619 -1211 592 ) ( -3619 -1211 576 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -3626 -1197 32 ) ( -3640 -1203 32 ) ( -3634 -1218 32 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+}
+// brush 157
+{
+( -1959 734 0 ) ( -2048 714 0 ) ( -1959 734 48 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1845 1039 0 ) ( -1824 951 0 ) ( -1845 1039 48 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -2062 1175 48 ) ( -2180 986 48 ) ( -2180 986 0 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1885 1065 48 ) ( -2062 1175 48 ) ( -2062 1175 0 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -1854 782 48 ) ( -1736 971 48 ) ( -1736 971 0 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -2265 850 48 ) ( -2089 740 48 ) ( -2089 740 0 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -2180 986 32 ) ( -2062 1175 32 ) ( -1885 1065 32 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1885 1065 0 ) ( -2062 1175 0 ) ( -2180 986 0 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+( -2176 870 0 ) ( -2182 892 0 ) ( -2176 870 48 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -2041 1087 0 ) ( -2019 1092 0 ) ( -2041 1087 48 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+}
+// brush 158
+{
+( -1890 785 576 ) ( -1890 785 544 ) ( -1839 867 544 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1839 867 64 ) ( -1839 867 32 ) ( -1803 863 32 ) dsi/cretebase3 224 0 0 0.500000 0.500000 0 0 0
+( -1871 755 64 ) ( -1803 863 64 ) ( -1803 863 32 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1890 785 32 ) ( -1890 785 64 ) ( -1871 755 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1803 863 32 ) ( -1830 880 32 ) ( -1898 772 32 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1830 880 96 ) ( -1817 871 96 ) ( -1898 772 96 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 159
+{
+( -1890 785 576 ) ( -1890 785 544 ) ( -1839 867 544 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1839 867 64 ) ( -1839 867 32 ) ( -1803 863 32 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -1871 755 64 ) ( -1803 863 64 ) ( -1803 863 32 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1890 785 32 ) ( -1890 785 64 ) ( -1871 755 64 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1898 772 576 ) ( -1830 880 576 ) ( -1803 863 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1803 863 160 ) ( -1830 880 160 ) ( -1898 772 160 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 160
+{
+( -2044 749 544 ) ( -2044 749 576 ) ( -2048 714 576 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1890 785 32 ) ( -1890 785 64 ) ( -2044 749 64 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1871 755 32 ) ( -1871 755 64 ) ( -1890 785 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -1871 755 64 ) ( -1871 755 32 ) ( -2048 714 32 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1894 749 32 ) ( -1890 785 32 ) ( -2044 749 32 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1876 777 96 ) ( -1863 768 96 ) ( -1953 654 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 161
+{
+( -2044 749 544 ) ( -2044 749 576 ) ( -2048 714 576 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -1890 785 32 ) ( -1890 785 64 ) ( -2044 749 64 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1871 755 32 ) ( -1871 755 64 ) ( -1890 785 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -1871 755 64 ) ( -1871 755 32 ) ( -2048 714 32 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1876 777 160 ) ( -1863 768 160 ) ( -1953 654 160 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+( -1863 768 96 ) ( -1876 777 96 ) ( -1953 654 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 162
+{
+( -1874 1021 576 ) ( -1874 1021 544 ) ( -1845 1039 544 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1803 863 32 ) ( -1803 863 64 ) ( -1845 1039 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1803 863 64 ) ( -1803 863 32 ) ( -1839 867 32 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -1839 867 64 ) ( -1839 867 32 ) ( -1874 1021 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1839 867 32 ) ( -1808 885 32 ) ( -1845 1039 32 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1749 980 96 ) ( -1736 971 96 ) ( -1826 858 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 163
+{
+( -1874 1021 576 ) ( -1874 1021 544 ) ( -1845 1039 544 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1803 863 32 ) ( -1803 863 64 ) ( -1845 1039 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1803 863 64 ) ( -1803 863 32 ) ( -1839 867 32 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -1839 867 64 ) ( -1839 867 32 ) ( -1874 1021 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1749 980 160 ) ( -1736 971 160 ) ( -1826 858 160 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+( -1736 971 96 ) ( -1749 980 96 ) ( -1826 858 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 164
+{
+( -2044 749 544 ) ( -2044 749 576 ) ( -2048 714 576 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1890 785 32 ) ( -1890 785 64 ) ( -2044 749 64 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1871 755 32 ) ( -1871 755 64 ) ( -1890 785 64 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -1871 755 64 ) ( -1871 755 32 ) ( -2048 714 32 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1890 785 576 ) ( -1894 749 576 ) ( -2048 714 576 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1863 768 160 ) ( -1876 777 160 ) ( -1953 654 160 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 165
+{
+( -1874 1021 576 ) ( -1874 1021 544 ) ( -1845 1039 544 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1803 863 32 ) ( -1803 863 64 ) ( -1845 1039 64 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1803 863 64 ) ( -1803 863 32 ) ( -1839 867 32 ) dsi/cretebase 224 0 0 0.500000 0.500000 0 0 0
+( -1839 867 64 ) ( -1839 867 32 ) ( -1874 1021 32 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -1808 885 576 ) ( -1839 867 576 ) ( -1874 1021 576 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1736 971 160 ) ( -1749 980 160 ) ( -1826 858 160 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 166
+{
+( -1956 1072 64 ) ( -1956 1072 32 ) ( -1953 1107 32 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -1845 1039 576 ) ( -1953 1107 576 ) ( -1953 1107 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1874 1021 544 ) ( -1874 1021 576 ) ( -1845 1039 576 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1956 1072 32 ) ( -1956 1072 64 ) ( -1874 1021 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1845 1039 32 ) ( -1953 1107 32 ) ( -1970 1080 32 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1872 1056 96 ) ( -1845 1039 96 ) ( -1888 1029 96 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 167
+{
+( -2126 800 32 ) ( -2126 800 64 ) ( -2156 782 64 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -2044 749 32 ) ( -2044 749 64 ) ( -2126 800 64 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -2044 749 576 ) ( -2044 749 544 ) ( -2048 714 544 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -2156 782 64 ) ( -2048 714 64 ) ( -2048 714 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -2031 741 32 ) ( -2139 809 32 ) ( -2156 782 32 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -2058 758 96 ) ( -2031 741 96 ) ( -2075 731 96 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 168
+{
+( -1953 1107 576 ) ( -1970 1080 576 ) ( -1956 1072 160 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -1845 1039 576 ) ( -1953 1107 576 ) ( -1953 1107 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1874 1021 544 ) ( -1874 1021 576 ) ( -1845 1039 576 ) dsi/cretebase3 16 0 0 0.500000 0.500000 0 0 0
+( -1956 1072 160 ) ( -1970 1080 576 ) ( -1874 1021 576 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1874 1021 576 ) ( -1970 1080 576 ) ( -1953 1107 576 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -1872 1056 160 ) ( -1885 1065 160 ) ( -1902 1038 160 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 169
+{
+( -2126 800 160 ) ( -2139 809 576 ) ( -2156 782 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -2044 749 576 ) ( -2139 809 576 ) ( -2126 800 160 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -2044 749 576 ) ( -2044 749 544 ) ( -2048 714 544 ) dsi/cretebase3 480 0 0 0.500000 0.500000 0 0 0
+( -2156 782 64 ) ( -2048 714 64 ) ( -2048 714 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -2156 782 576 ) ( -2139 809 576 ) ( -2044 749 576 ) dsi/cretebase3 176 -16 0 0.500000 0.500000 0 0 0
+( -2058 758 160 ) ( -2072 767 160 ) ( -2089 740 160 ) dsi/cretebase 176 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 170
+{
+( -1845 1039 96 ) ( -1872 1056 96 ) ( -1888 1029 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+( -1885 1065 160 ) ( -1872 1056 160 ) ( -1902 1038 160 ) dsi/cretebase 176 112 0 0.500000 0.500000 0 0 0
+( -1845 1039 576 ) ( -1953 1107 576 ) ( -1953 1107 544 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -1956 1072 64 ) ( -1956 1072 32 ) ( -1953 1107 32 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -1926 1090 96 ) ( -1956 1072 96 ) ( -1926 1090 160 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+}
+// brush 171
+{
+( -2126 800 32 ) ( -2126 800 64 ) ( -2156 782 64 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -2156 782 64 ) ( -2048 714 64 ) ( -2048 714 32 ) dsi/cretebase3 176 0 0 0.500000 0.500000 0 0 0
+( -2072 767 160 ) ( -2058 758 160 ) ( -2089 740 160 ) dsi/cretebase 176 112 0 0.500000 0.500000 0 0 0
+( -2031 741 96 ) ( -2058 758 96 ) ( -2075 731 96 ) common/caulk 176 -16 0 0.500000 0.500000 0 0 0
+( -2126 800 96 ) ( -2128 765 96 ) ( -2126 800 160 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+}
+// brush 172
+{
+( -1885 1065 576 ) ( -2062 1175 576 ) ( -2180 986 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -2180 986 592 ) ( -2062 1175 592 ) ( -1885 1065 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -2265 850 624 ) ( -2089 740 624 ) ( -2089 740 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -1854 782 624 ) ( -1736 971 624 ) ( -1736 971 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -1885 1065 624 ) ( -2062 1175 624 ) ( -2062 1175 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -1845 1039 576 ) ( -1824 951 576 ) ( -1845 1039 624 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -1959 734 576 ) ( -2048 714 576 ) ( -1959 734 624 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -2063 931 576 ) ( -2046 958 576 ) ( -2063 931 592 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+}
+// brush 173
+{
+( -2163 710 592 ) ( -2163 710 576 ) ( -2156 782 576 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -2048 714 592 ) ( -2156 782 592 ) ( -2156 782 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -2054 642 576 ) ( -2054 642 592 ) ( -2048 714 592 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -2163 710 592 ) ( -2054 642 592 ) ( -2054 642 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -2054 642 592 ) ( -2163 710 592 ) ( -2156 782 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -2163 710 576 ) ( -2054 642 576 ) ( -2048 714 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 174
+{
+( -1749 829 576 ) ( -1803 863 576 ) ( -1871 755 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1871 755 592 ) ( -1803 863 592 ) ( -1749 829 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1834 693 592 ) ( -1834 693 576 ) ( -1871 755 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1732 856 592 ) ( -1732 856 576 ) ( -1834 693 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -1732 856 576 ) ( -1732 856 592 ) ( -1803 863 592 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -1803 863 592 ) ( -1871 755 592 ) ( -1871 755 576 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+}
+// brush 175
+{
+( -1783 1077 576 ) ( -1892 1145 576 ) ( -1953 1107 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1892 1145 592 ) ( -1783 1077 592 ) ( -1845 1039 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1953 1107 592 ) ( -1845 1039 592 ) ( -1845 1039 576 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1783 1077 592 ) ( -1783 1077 576 ) ( -1845 1039 576 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1783 1077 592 ) ( -1892 1145 592 ) ( -1892 1145 576 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -1892 1145 576 ) ( -1892 1145 592 ) ( -1953 1107 592 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+}
+// brush 176
+{
+( -1845 1039 592 ) ( -1845 1039 576 ) ( -1783 1077 576 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1732 856 576 ) ( -1732 856 592 ) ( -1783 1077 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+( -1732 856 592 ) ( -1732 856 576 ) ( -1803 863 576 ) dsi/cretebase4 320 0 0 0.500000 0.500000 0 0 0
+( -1803 863 592 ) ( -1803 863 576 ) ( -1845 1039 576 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -1743 901 592 ) ( -1803 863 592 ) ( -1845 1039 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1803 863 576 ) ( -1743 901 576 ) ( -1783 1077 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 177
+{
+( -1878 684 576 ) ( -1871 755 576 ) ( -2048 714 576 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1871 755 592 ) ( -1878 684 592 ) ( -2054 642 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1834 693 592 ) ( -1834 693 576 ) ( -2054 642 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -1834 693 576 ) ( -1834 693 592 ) ( -1871 755 592 ) dsi/cretebase 176 128 0 0.500000 0.500000 0 0 0
+( -1871 755 576 ) ( -1871 755 592 ) ( -2048 714 592 ) dsi/cretebase 16 128 0 0.500000 0.500000 0 0 0
+( -2048 714 576 ) ( -2048 714 592 ) ( -2054 642 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 0 0 0
+}
+// brush 178
+{
+( -1814 1013 592 ) ( -1814 1013 784 ) ( -1783 1020 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1839 1017 576 ) ( -1839 1017 768 ) ( -1812 1001 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1854 1037 576 ) ( -1854 1037 768 ) ( -1846 1006 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -1849 1062 576 ) ( -1849 1062 768 ) ( -1866 1034 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1830 1076 576 ) ( -1830 1076 768 ) ( -1861 1069 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1805 1072 592 ) ( -1805 1072 784 ) ( -1832 1089 784 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1790 1052 592 ) ( -1790 1052 784 ) ( -1797 1083 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -1795 1028 592 ) ( -1795 1028 784 ) ( -1778 1055 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1866 1034 592 ) ( -1812 1001 592 ) ( -1778 1055 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1778 1055 768 ) ( -1812 1001 768 ) ( -1866 1034 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 179
+{
+( -1780 811 768 ) ( -1814 756 768 ) ( -1868 790 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1868 790 592 ) ( -1814 756 592 ) ( -1780 811 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1796 784 592 ) ( -1796 784 784 ) ( -1780 811 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1792 808 592 ) ( -1792 808 784 ) ( -1799 840 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -1807 827 576 ) ( -1807 827 768 ) ( -1834 844 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1832 832 576 ) ( -1832 832 768 ) ( -1863 825 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1850 817 576 ) ( -1850 817 768 ) ( -1868 790 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -1856 793 576 ) ( -1856 793 768 ) ( -1848 762 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -1841 773 576 ) ( -1841 773 768 ) ( -1814 756 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -1816 769 592 ) ( -1816 769 784 ) ( -1785 776 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+}
+// brush 180
+{
+( -2035 660 592 ) ( -2035 660 784 ) ( -2004 668 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -2060 665 576 ) ( -2060 665 768 ) ( -2032 647 768 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -2074 684 576 ) ( -2074 684 768 ) ( -2067 653 768 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -2070 709 576 ) ( -2070 709 768 ) ( -2087 682 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -2050 723 576 ) ( -2050 723 768 ) ( -2082 717 768 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -2026 719 592 ) ( -2026 719 784 ) ( -2053 736 784 ) dsi/cretebase4 272 0 0 0.500000 0.500000 0 0 0
+( -2011 699 592 ) ( -2011 699 784 ) ( -2018 731 784 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -2015 675 592 ) ( -2015 675 784 ) ( -1998 702 784 ) dsi/cretebase4 112 0 0 0.500000 0.500000 0 0 0
+( -2087 682 592 ) ( -2032 647 592 ) ( -1998 702 592 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1998 702 768 ) ( -2032 647 768 ) ( -2087 682 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 181
+{
+( -1803 863 784 ) ( -1871 755 784 ) ( -1871 755 768 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1732 856 768 ) ( -1732 856 784 ) ( -1803 863 784 ) dsi/cretebase4 320 384 0 0.500000 0.500000 0 0 0
+( -1732 856 784 ) ( -1732 856 768 ) ( -1834 693 768 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1834 693 784 ) ( -1834 693 768 ) ( -1871 755 768 ) dsi/cretebase4 272 384 0 0.500000 0.500000 0 0 0
+( -1871 755 784 ) ( -1803 863 784 ) ( -1749 829 784 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1749 829 768 ) ( -1803 863 768 ) ( -1871 755 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 182
+{
+( -1803 863 768 ) ( -1743 901 768 ) ( -1783 1077 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1743 901 784 ) ( -1803 863 784 ) ( -1845 1039 784 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1803 863 784 ) ( -1803 863 768 ) ( -1845 1039 768 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -1732 856 784 ) ( -1732 856 768 ) ( -1803 863 768 ) dsi/cretebase4 320 384 0 0.500000 0.500000 0 0 0
+( -1732 856 768 ) ( -1732 856 784 ) ( -1783 1077 784 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -1845 1039 784 ) ( -1845 1039 768 ) ( -1783 1077 768 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+}
+// brush 183
+{
+( -2048 714 768 ) ( -2048 714 784 ) ( -2054 642 784 ) dsi/cretebase 480 0 0 0.500000 0.500000 0 0 0
+( -1871 755 768 ) ( -1871 755 784 ) ( -2048 714 784 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1834 693 768 ) ( -1834 693 784 ) ( -1871 755 784 ) dsi/cretebase 176 0 0 0.500000 0.500000 0 0 0
+( -1834 693 784 ) ( -1834 693 768 ) ( -2054 642 768 ) dsi/cretebase 16 0 0 0.500000 0.500000 0 0 0
+( -1871 755 784 ) ( -1878 684 784 ) ( -2054 642 784 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+( -1878 684 768 ) ( -1871 755 768 ) ( -2048 714 768 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 0 0 0
+}
+// brush 184
+{
+( -2029 985 504 ) ( -2036 990 504 ) ( -2086 908 504 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2083 915 512 ) ( -2032 996 512 ) ( -2025 991 512 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2086 908 472 ) ( -2080 904 472 ) ( -2080 904 456 ) dsi/cretebase4 272 272 0 0.500000 0.500000 134217728 0 0
+( -2080 904 464 ) ( -2029 985 464 ) ( -2029 985 448 ) dsi/cretebase4 112 272 0 0.500000 0.500000 134217728 0 0
+( -2029 985 472 ) ( -2036 990 472 ) ( -2036 990 456 ) dsi/cretebase4 272 272 0 0.500000 0.500000 134217728 0 0
+( -2036 990 472 ) ( -2086 908 472 ) ( -2086 908 456 ) dsi/cretebase4 112 272 0 0.500000 0.500000 134217728 0 0
+}
+// brush 185
+{
+( -2036 990 408 ) ( -2086 908 408 ) ( -2086 908 392 ) dsi/cretebase4 112 144 0 0.500000 0.500000 134217728 0 0
+( -2029 985 408 ) ( -2036 990 408 ) ( -2036 990 392 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -2080 904 400 ) ( -2029 985 400 ) ( -2029 985 384 ) dsi/cretebase4 112 144 0 0.500000 0.500000 134217728 0 0
+( -2086 908 408 ) ( -2080 904 408 ) ( -2080 904 392 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -2083 915 448 ) ( -2032 996 448 ) ( -2025 991 448 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2029 985 440 ) ( -2036 990 440 ) ( -2086 908 440 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 186
+{
+( -2029 985 376 ) ( -2036 990 376 ) ( -2086 908 376 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2083 915 384 ) ( -2032 996 384 ) ( -2025 991 384 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2086 908 344 ) ( -2080 904 344 ) ( -2080 904 328 ) dsi/cretebase4 272 16 0 0.500000 0.500000 134217728 0 0
+( -2080 904 336 ) ( -2029 985 336 ) ( -2029 985 320 ) dsi/cretebase4 112 16 0 0.500000 0.500000 134217728 0 0
+( -2029 985 344 ) ( -2036 990 344 ) ( -2036 990 328 ) dsi/cretebase4 272 16 0 0.500000 0.500000 134217728 0 0
+( -2036 990 344 ) ( -2086 908 344 ) ( -2086 908 328 ) dsi/cretebase4 112 16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 187
+{
+( -2036 990 280 ) ( -2086 908 280 ) ( -2086 908 264 ) dsi/cretebase4 112 -112 0 0.500000 0.500000 134217728 0 0
+( -2029 985 280 ) ( -2036 990 280 ) ( -2036 990 264 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -2080 904 272 ) ( -2029 985 272 ) ( -2029 985 256 ) dsi/cretebase4 112 -112 0 0.500000 0.500000 134217728 0 0
+( -2086 908 280 ) ( -2080 904 280 ) ( -2080 904 264 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -2083 915 320 ) ( -2032 996 320 ) ( -2025 991 320 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2029 985 312 ) ( -2036 990 312 ) ( -2086 908 312 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 188
+{
+( -2029 985 248 ) ( -2036 990 248 ) ( -2086 908 248 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2083 915 256 ) ( -2032 996 256 ) ( -2025 991 256 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2086 908 216 ) ( -2080 904 216 ) ( -2080 904 200 ) dsi/cretebase4 272 -240 0 0.500000 0.500000 134217728 0 0
+( -2080 904 208 ) ( -2029 985 208 ) ( -2029 985 192 ) dsi/cretebase4 112 -240 0 0.500000 0.500000 134217728 0 0
+( -2029 985 216 ) ( -2036 990 216 ) ( -2036 990 200 ) dsi/cretebase4 272 -240 0 0.500000 0.500000 134217728 0 0
+( -2036 990 216 ) ( -2086 908 216 ) ( -2086 908 200 ) dsi/cretebase4 112 -240 0 0.500000 0.500000 134217728 0 0
+}
+// brush 189
+{
+( -2036 990 152 ) ( -2086 908 152 ) ( -2086 908 136 ) dsi/cretebase4 112 -368 0 0.500000 0.500000 134217728 0 0
+( -2029 985 152 ) ( -2036 990 152 ) ( -2036 990 136 ) dsi/cretebase4 272 -368 0 0.500000 0.500000 134217728 0 0
+( -2080 904 144 ) ( -2029 985 144 ) ( -2029 985 128 ) dsi/cretebase4 112 -368 0 0.500000 0.500000 134217728 0 0
+( -2086 908 152 ) ( -2080 904 152 ) ( -2080 904 136 ) dsi/cretebase4 272 -368 0 0.500000 0.500000 134217728 0 0
+( -2083 915 192 ) ( -2032 996 192 ) ( -2025 991 192 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2029 985 184 ) ( -2036 990 184 ) ( -2086 908 184 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 190
+{
+( -2029 985 120 ) ( -2036 990 120 ) ( -2086 908 120 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2083 915 128 ) ( -2032 996 128 ) ( -2025 991 128 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2086 908 88 ) ( -2080 904 88 ) ( -2080 904 72 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+( -2080 904 80 ) ( -2029 985 80 ) ( -2029 985 64 ) dsi/cretebase4 112 -496 0 0.500000 0.500000 134217728 0 0
+( -2029 985 88 ) ( -2036 990 88 ) ( -2036 990 72 ) dsi/cretebase4 272 -496 0 0.500000 0.500000 134217728 0 0
+( -2036 990 88 ) ( -2086 908 88 ) ( -2086 908 72 ) dsi/cretebase4 112 -496 0 0.500000 0.500000 134217728 0 0
+}
+// brush 191
+{
+( -2036 990 24 ) ( -2086 908 24 ) ( -2086 908 8 ) dsi/cretebase4 112 -112 0 0.500000 0.500000 134217728 0 0
+( -2029 985 24 ) ( -2036 990 24 ) ( -2036 990 8 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -2080 904 16 ) ( -2029 985 16 ) ( -2029 985 0 ) dsi/cretebase4 112 -112 0 0.500000 0.500000 134217728 0 0
+( -2086 908 24 ) ( -2080 904 24 ) ( -2080 904 8 ) dsi/cretebase4 272 -112 0 0.500000 0.500000 134217728 0 0
+( -2083 915 64 ) ( -2032 996 64 ) ( -2025 991 64 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+( -2029 985 56 ) ( -2036 990 56 ) ( -2086 908 56 ) dsi/cretebase4 272 -16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 192
+{
+( -2080 904 592 ) ( -2093 913 592 ) ( -2093 913 576 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -2089 890 96 ) ( -2080 904 96 ) ( -2080 904 80 ) dsi/cretebase4 112 144 0 0.500000 0.500000 134217728 0 0
+( -2080 904 32 ) ( -2093 913 32 ) ( -2102 898 32 ) dsi/cretebase4 272 -384 0 0.500000 0.500000 134217728 0 0
+( -2086 908 576 ) ( -2080 904 592 ) ( -2095 894 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 134217728 0 0
+( -2089 890 32 ) ( -2086 908 32 ) ( -2089 890 592 ) dsi/cretebase 480 128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 193
+{
+( -2021 999 32 ) ( -2034 1007 32 ) ( -2043 994 32 ) dsi/cretebase4 272 -384 0 0.500000 0.500000 134217728 0 0
+( -2043 994 592 ) ( -2029 985 592 ) ( -2029 985 576 ) dsi/cretebase4 272 144 0 0.500000 0.500000 134217728 0 0
+( -2029 985 96 ) ( -2021 999 96 ) ( -2021 999 80 ) dsi/cretebase4 112 144 0 0.500000 0.500000 134217728 0 0
+( -2027 1003 576 ) ( -2021 999 592 ) ( -2036 990 576 ) dsi/cretebase 16 128 0 0.500000 0.500000 134217728 0 0
+( -2036 990 32 ) ( -2021 999 32 ) ( -2036 990 592 ) dsi/cretebase 16 128 0 0.500000 0.500000 134217728 0 0
+}
+// brush 194
+{
+( -448 -1024 1152 ) ( -448 -1216 1152 ) ( -640 -1216 1152 ) dsi/cretebase4 64 -64 0 0.500000 0.500000 0 0 0
+( -640 -1216 0 ) ( -448 -1216 0 ) ( -448 -1024 0 ) dsi/cretebase4 64 -64 0 0.500000 0.500000 0 0 0
+( -448 -1120 0 ) ( -448 -1120 192 ) ( -448 -1024 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -476 -1052 0 ) ( -476 -1052 192 ) ( -544 -984 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -544 -1024 0 ) ( -544 -1024 192 ) ( -640 -1024 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -612 -1052 0 ) ( -612 -1052 192 ) ( -680 -1120 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -640 -1120 0 ) ( -640 -1120 192 ) ( -640 -1216 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -612 -1188 0 ) ( -612 -1188 192 ) ( -544 -1256 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -544 -1216 0 ) ( -544 -1216 192 ) ( -448 -1216 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+( -476 -1188 0 ) ( -476 -1188 192 ) ( -408 -1120 192 ) dsi/cretebase4 64 0 0 0.500000 0.500000 0 0 0
+}
+// brush 195
+{
+( -444 1052 0 ) ( -444 1052 192 ) ( -376 1120 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -512 1024 0 ) ( -512 1024 192 ) ( -416 1024 192 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -580 1052 0 ) ( -580 1052 192 ) ( -512 984 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -608 1120 0 ) ( -608 1120 192 ) ( -608 1024 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -580 1188 0 ) ( -580 1188 192 ) ( -648 1120 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -512 1216 0 ) ( -512 1216 192 ) ( -608 1216 192 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -444 1188 0 ) ( -444 1188 192 ) ( -512 1256 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -416 1120 0 ) ( -416 1120 192 ) ( -416 1216 192 ) dsi/cretebase4 192 0 0 0.500000 0.500000 0 0 0
+( -608 1024 0 ) ( -416 1024 0 ) ( -416 1216 0 ) dsi/cretebase4 0 -192 0 0.500000 0.500000 0 0 0
+( -416 1216 1152 ) ( -416 1024 1152 ) ( -608 1024 1152 ) dsi/cretebase4 0 -192 0 0.500000 0.500000 0 0 0
+}
+// brush 196
+{
+( -576 1216 0 ) ( -560 1200 0 ) ( -576 1216 1152 ) dsi/cretebase -32 -128 0 0.500000 0.500000 0 0 0
+( -592 1168 0 ) ( -608 1184 0 ) ( -592 1168 1152 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -912 1504 0 ) ( -944 1472 0 ) ( -592 1168 0 ) dsi/cretebase4 -32 -128 0 0.500000 0.500000 0 0 0
+( -944 1472 1152 ) ( -912 1504 1152 ) ( -560 1200 1152 ) dsi/cretebase4 -32 -128 0 0.500000 0.500000 0 0 0
+( -592 1168 0 ) ( -592 1168 1152 ) ( -560 1200 1152 ) dsi/cretebase4 128 0 0 0.500000 0.500000 0 0 0
+( -944 1472 1152 ) ( -944 1472 0 ) ( -912 1504 0 ) dsi/cretebase4 128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 197
+{
+( -864 1664 1152 ) ( -864 1472 1152 ) ( -1056 1472 1152 ) dsi/cretebase4 -128 192 0 0.500000 0.500000 0 0 0
+( -1056 1472 0 ) ( -864 1472 0 ) ( -864 1664 0 ) dsi/cretebase4 -128 192 0 0.500000 0.500000 0 0 0
+( -864 1568 0 ) ( -864 1568 192 ) ( -864 1664 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+( -892 1636 0 ) ( -892 1636 192 ) ( -960 1704 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+( -960 1664 0 ) ( -960 1664 192 ) ( -1056 1664 192 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -1028 1636 0 ) ( -1028 1636 192 ) ( -1096 1568 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+( -1056 1568 0 ) ( -1056 1568 192 ) ( -1056 1472 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+( -1028 1500 0 ) ( -1028 1500 192 ) ( -960 1432 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+( -960 1472 0 ) ( -960 1472 192 ) ( -864 1472 192 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -892 1500 0 ) ( -892 1500 192 ) ( -824 1568 192 ) dsi/cretebase4 -192 0 0 0.500000 0.500000 0 0 0
+}
+// brush 198
+{
+( -624 1984 1152 ) ( -624 1984 0 ) ( -592 1952 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -928 1632 0 ) ( -928 1632 1152 ) ( -896 1600 1152 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -624 1984 1152 ) ( -592 1952 1152 ) ( -896 1600 1152 ) dsi/cretebase4 -288 256 0 0.500000 0.500000 0 0 0
+( -592 1952 0 ) ( -624 1984 0 ) ( -928 1632 0 ) dsi/cretebase4 -288 256 0 0.500000 0.500000 0 0 0
+( -928 1632 0 ) ( -912 1648 0 ) ( -928 1632 1152 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+( -880 1616 0 ) ( -896 1600 0 ) ( -880 1616 1152 ) dsi/cretebase -160 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 199
+{
+( -596 1932 0 ) ( -596 1932 192 ) ( -528 1864 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -624 2000 0 ) ( -624 2000 192 ) ( -624 1904 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -596 2068 0 ) ( -596 2068 192 ) ( -664 2000 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -528 2096 0 ) ( -528 2096 192 ) ( -624 2096 192 ) dsi/cretebase4 128 0 0 0.500000 0.500000 0 0 0
+( -460 2068 0 ) ( -460 2068 192 ) ( -528 2136 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -432 2000 0 ) ( -432 2000 192 ) ( -432 2096 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -460 1932 0 ) ( -460 1932 192 ) ( -392 2000 192 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -528 1904 0 ) ( -528 1904 192 ) ( -432 1904 192 ) dsi/cretebase4 128 0 0 0.500000 0.500000 0 0 0
+( -624 2096 0 ) ( -624 1904 0 ) ( -432 1904 0 ) dsi/cretebase4 128 64 0 0.500000 0.500000 0 0 0
+( -432 1904 1152 ) ( -624 1904 1152 ) ( -624 2096 1152 ) dsi/cretebase4 128 64 0 0.500000 0.500000 0 0 0
+}
+// brush 200
+{
+( -288 864 0 ) ( -288 896 0 ) ( -288 864 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( 32 704 0 ) ( -32 704 0 ) ( 32 704 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( 0 832 0 ) ( 0 720 0 ) ( 0 832 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( -352 912 192 ) ( -320 912 192 ) ( -352 912 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( 16 1120 0 ) ( 0 1120 0 ) ( 16 576 0 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( -448 1120 1152 ) ( 192 672 1152 ) ( 128 576 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( 128 576 1152 ) ( 128 576 0 ) ( -512 1024 0 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+( 384 576 0 ) ( 384 576 1152 ) ( -448 1120 1152 ) dsi/cretebase 384 0 0 0.500000 0.500000 0 0 0
+}
+// brush 201
+{
+( -928 -1504 0 ) ( -960 -1472 0 ) ( -960 -1472 1152 ) dsi/cretebase4 -448 0 0 0.500000 0.500000 0 0 0
+( -576 -1200 1152 ) ( -608 -1168 1152 ) ( -608 -1168 0 ) dsi/cretebase4 -448 0 0 0.500000 0.500000 0 0 0
+( -576 -1200 1152 ) ( -928 -1504 1152 ) ( -960 -1472 1152 ) dsi/cretebase4 0 448 0 0.500000 0.500000 0 0 0
+( -608 -1168 0 ) ( -960 -1472 0 ) ( -928 -1504 0 ) dsi/cretebase4 0 448 0 0.500000 0.500000 0 0 0
+( -608 -1168 1152 ) ( -624 -1184 0 ) ( -608 -1168 0 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -592 -1216 1152 ) ( -576 -1200 0 ) ( -592 -1216 0 ) dsi/cretebase -96 -128 0 0.500000 0.500000 0 0 0
+}
+// brush 202
+{
+( -840 -1568 192 ) ( -908 -1500 192 ) ( -908 -1500 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -880 -1472 192 ) ( -976 -1472 192 ) ( -976 -1472 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -976 -1432 192 ) ( -1044 -1500 192 ) ( -1044 -1500 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -1072 -1472 192 ) ( -1072 -1568 192 ) ( -1072 -1568 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -1112 -1568 192 ) ( -1044 -1636 192 ) ( -1044 -1636 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -1072 -1664 192 ) ( -976 -1664 192 ) ( -976 -1664 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -976 -1704 192 ) ( -908 -1636 192 ) ( -908 -1636 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -880 -1664 192 ) ( -880 -1568 192 ) ( -880 -1568 0 ) dsi/cretebase4 -256 0 0 0.500000 0.500000 0 0 0
+( -880 -1664 0 ) ( -880 -1472 0 ) ( -1072 -1472 0 ) dsi/cretebase4 -96 256 0 0.500000 0.500000 0 0 0
+( -1072 -1472 1152 ) ( -880 -1472 1152 ) ( -880 -1664 1152 ) dsi/cretebase4 -96 256 0 0.500000 0.500000 0 0 0
+}
+// brush 203
+{
+( -896 -1616 1152 ) ( -912 -1600 0 ) ( -896 -1616 0 ) dsi/cretebase -224 -128 0 0.500000 0.500000 0 0 0
+( -944 -1632 1152 ) ( -928 -1648 0 ) ( -944 -1632 0 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -944 -1632 0 ) ( -640 -1984 0 ) ( -608 -1952 0 ) dsi/cretebase4 -256 320 0 0.500000 0.500000 0 0 0
+( -912 -1600 1152 ) ( -608 -1952 1152 ) ( -640 -1984 1152 ) dsi/cretebase4 -256 320 0 0.500000 0.500000 0 0 0
+( -912 -1600 1152 ) ( -944 -1632 1152 ) ( -944 -1632 0 ) dsi/cretebase4 -320 0 0 0.500000 0.500000 0 0 0
+( -608 -1952 0 ) ( -640 -1984 0 ) ( -640 -1984 1152 ) dsi/cretebase4 -320 0 0 0.500000 0.500000 0 0 0
+}
+// brush 204
+{
+( -640 -2096 1152 ) ( -640 -1904 1152 ) ( -448 -1904 1152 ) dsi/cretebase4 160 128 0 0.500000 0.500000 0 0 0
+( -448 -1904 0 ) ( -640 -1904 0 ) ( -640 -2096 0 ) dsi/cretebase4 160 128 0 0.500000 0.500000 0 0 0
+( -448 -1904 192 ) ( -544 -1904 192 ) ( -544 -1904 0 ) dsi/cretebase4 160 0 0 0.500000 0.500000 0 0 0
+( -408 -2000 192 ) ( -476 -1932 192 ) ( -476 -1932 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -448 -2096 192 ) ( -448 -2000 192 ) ( -448 -2000 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -544 -2136 192 ) ( -476 -2068 192 ) ( -476 -2068 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -640 -2096 192 ) ( -544 -2096 192 ) ( -544 -2096 0 ) dsi/cretebase4 160 0 0 0.500000 0.500000 0 0 0
+( -680 -2000 192 ) ( -612 -2068 192 ) ( -612 -2068 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -640 -1904 192 ) ( -640 -2000 192 ) ( -640 -2000 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+( -544 -1864 192 ) ( -612 -1932 192 ) ( -612 -1932 0 ) dsi/cretebase4 -128 0 0 0.500000 0.500000 0 0 0
+}
+// brush 205
+{
+( -464 -1120 1152 ) ( 368 -576 1152 ) ( 368 -576 0 ) dsi/cretebase -96 0 0 0.500000 0.500000 0 0 0
+( -528 -1024 0 ) ( 112 -576 0 ) ( 112 -576 1152 ) dsi/cretebase -96 0 0 0.500000 0.500000 0 0 0
+( 112 -576 1152 ) ( 176 -672 1152 ) ( -464 -1120 1152 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( 0 -576 0 ) ( -16 -1120 0 ) ( 0 -1120 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -368 -912 1152 ) ( -336 -912 192 ) ( -368 -912 192 ) dsi/cretebase -96 0 0 0.500000 0.500000 0 0 0
+( -16 -832 1152 ) ( -16 -720 0 ) ( -16 -832 0 ) dsi/cretebase -192 0 0 0.500000 0.500000 0 0 0
+( 16 -704 1152 ) ( -48 -704 0 ) ( 16 -704 0 ) dsi/cretebase -96 0 0 0.500000 0.500000 0 0 0
+( -304 -864 1152 ) ( -304 -896 0 ) ( -304 -864 0 ) dsi/cretebase -192 0 0 0.500000 0.500000 0 0 0
+}
+// brush 206
+{
+( -192 -1608 0 ) ( -192 -448 0 ) ( 64 -448 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 64 -448 -32 ) ( -192 -448 -32 ) ( -192 -1608 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -1024 320 0 ) ( -1024 0 0 ) ( -1024 0 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -512 -1024 -32 ) ( -768 -768 -32 ) ( -512 -1024 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -576 -576 0 ) ( -576 -448 0 ) ( -576 -576 -32 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -528 -16 -32 ) ( -496 -16 -32 ) ( -528 -16 0 ) common/caulk 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 207
+{
+( 2016 -2048 0 ) ( -2016 -2048 0 ) ( -2016 -2112 0 ) dsi/cretebase4 0 64 0 0.500000 0.500000 0 0 0
+( -2016 -2112 1792 ) ( -2016 -2048 1792 ) ( 2016 -2048 1792 ) dsi/cretebase4 0 64 0 0.500000 0.500000 0 0 0
+( -1984 -2112 1024 ) ( 2048 -2112 1024 ) ( 2048 -2112 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( 2048 -2112 1792 ) ( 2048 -2048 1792 ) ( 2048 -2048 768 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+( -1472 -2048 1024 ) ( -5504 -2048 1024 ) ( -5504 -2048 0 ) dsi/cretebase4 0 0 0 0.500000 0.500000 0 0 0
+( -5568 -2048 1792 ) ( -5568 -2112 1792 ) ( -5568 -2112 768 ) dsi/cretebase4 -64 0 0 0.500000 0.500000 0 0 0
+}
+// brush 208
+{
+( -859 675 0 ) ( -859 675 192 ) ( -814 720 192 ) dsi/cretebase -32 64 0 0.500000 0.500000 0 0 0
+( -904 656 0 ) ( -904 656 192 ) ( -840 656 192 ) dsi/cretebase -112 64 0 0.500000 0.500000 0 0 0
+( -949 675 0 ) ( -949 675 192 ) ( -904 630 192 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -968 720 32 ) ( -968 720 224 ) ( -968 656 224 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -949 765 0 ) ( -949 765 192 ) ( -994 720 192 ) dsi/cretebase -64 0 0 0.500000 0.500000 0 0 0
+( -904 784 0 ) ( -904 784 192 ) ( -968 784 192 ) dsi/cretebase -112 64 0 0.500000 0.500000 0 0 0
+( -859 765 0 ) ( -859 765 192 ) ( -904 810 192 ) dsi/cretebase -32 64 0 0.500000 0.500000 0 0 0
+( -840 720 0 ) ( -840 720 192 ) ( -840 784 192 ) dsi/cretebase -32 64 0 0.500000 0.500000 0 0 0
+( -968 656 0 ) ( -840 656 0 ) ( -840 784 0 ) dsi/cretebase -112 224 0 0.500000 0.500000 0 0 0
+( -856 784 128 ) ( -856 656 128 ) ( -984 656 128 ) dsi/cretebase4 -304 224 0 0.500000 0.500000 0 0 0
+}
+// brush 209
+{
+( -2048 2048 1792 ) ( -2144 2048 1792 ) ( -2144 -2048 1792 ) sav-graysky1/sav-graysky2_skybox 256 0 0 0.500000 0.500000 0 0 0
+( -2176 -2048 1856 ) ( -2176 2048 1856 ) ( -2080 2048 1856 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
+( -2144 -2080 1088 ) ( -2048 -2080 1088 ) ( -2048 -2080 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
+( 1920 -2048 928 ) ( 1920 2048 928 ) ( 1920 2048 864 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
+( -2048 2048 1088 ) ( -2144 2048 1088 ) ( -2144 2048 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
+( -5696 2016 1088 ) ( -5696 -2080 1088 ) ( -5696 -2080 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
+}
+}
+// entity 1
+{
+"classname" "weapon_crylink"
+"origin" "-104 248 32"
+}
+// entity 2
+{
+"classname" "weapon_electro"
+"origin" "-304 176 32"
+}
+// entity 3
+{
+"classname" "weapon_grenadelauncher"
+"origin" "-192 128 32"
+}
+// entity 4
+{
+"classname" "weapon_hagar"
+"origin" "-384 256 32"
+}
+// entity 5
+{
+"classname" "weapon_machinegun"
+"origin" "-176 416 32"
+}
+// entity 6
+{
+"origin" "-320 -192 32"
+"classname" "weapon_electro"
+}
+// entity 7
+{
+"origin" "-384 -256 32"
+"classname" "weapon_hagar"
+}
+// entity 8
+{
+"angle" "360"
+"origin" "-5056 -928 32"
+"classname" "info_player_deathmatch"
+}
+// entity 9
+{
+"classname" "info_player_deathmatch"
+"origin" "-4704 976 32"
+"angle" "360"
+}
+// entity 10
+{
+"angle" "360"
+"origin" "-4144 -80 32"
+"classname" "info_player_deathmatch"
+}
+// entity 11
+{
+"angle" "360"
+"origin" "-3536 784 32"
+"classname" "info_player_deathmatch"
+}
+// entity 12
+{
+"classname" "info_player_deathmatch"
+"origin" "-2656 -992 32"
+"angle" "360"
+}
+// entity 13
+{
+"angle" "360"
+"origin" "-2240 1040 32"
+"classname" "info_player_deathmatch"
+}
+// entity 14
+{
+"classname" "item_armor25"
+"origin" "1024 192 16"
+}
+// entity 15
+{
+"origin" "1024 -192 16"
+"classname" "item_armor25"
+}
+// entity 16
+{
+"origin" "-192 -128 32"
+"classname" "weapon_crylink"
+}
+// entity 17
+{
+"origin" "-112 -272 32"
+"classname" "weapon_grenadelauncher"
+}
+// entity 18
+{
+"origin" "-144 -416 32"
+"classname" "weapon_machinegun"
+}
+// entity 19
+{
+"classname" "info_player_deathmatch"
+"origin" "-3824 -1328 32"
+"angle" "360"
+}
+// entity 20
+{
+"origin" "1152 192 16"
+"classname" "item_armor25"
+}
+// entity 21
+{
+"classname" "item_armor25"
+"origin" "1024 320 16"
+}
+// entity 22
+{
+"origin" "1152 320 16"
+"classname" "item_armor25"
+}
+// entity 23
+{
+"origin" "1024 -320 16"
+"classname" "item_armor25"
+}
+// entity 24
+{
+"classname" "item_armor25"
+"origin" "1152 -320 16"
+}
+// entity 25
+{
+"classname" "item_armor25"
+"origin" "1152 -192 16"
+}
+// entity 26
+{
+"classname" "func_group"
+// brush 0
+{
+( -4384 832 64 ) ( -4384 1152 64 ) ( -4384 1152 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 134217728 0 0
+( -4448 832 64 ) ( -4384 832 64 ) ( -4384 832 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 134217728 0 0
+( -4448 1152 64 ) ( -4448 832 64 ) ( -4448 832 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 134217728 0 0
+( -4384 1152 64 ) ( -4448 1152 64 ) ( -4448 1152 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 134217728 0 0
+( -4384 1152 64 ) ( -4384 832 64 ) ( -4448 832 64 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4448 832 0 ) ( -4384 832 0 ) ( -4384 1152 0 ) dsi/cretebase -352 160 0 0.500000 0.500000 134217728 0 0
+}
+// brush 1
+{
+( -4464 1264 0 ) ( -4448 1280 0 ) ( -4464 1264 48 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4448 704 0 ) ( -4464 720 0 ) ( -4448 704 48 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4512 832 0 ) ( -4448 832 0 ) ( -4448 1152 0 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4448 1152 48 ) ( -4448 832 48 ) ( -4512 832 48 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4512 1152 48 ) ( -4512 832 48 ) ( -4512 832 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4448 832 48 ) ( -4448 1152 48 ) ( -4448 1152 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 2
+{
+( -4464 1264 0 ) ( -4448 1280 0 ) ( -4464 1264 32 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4448 704 0 ) ( -4464 720 0 ) ( -4448 704 32 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4512 832 48 ) ( -4512 1152 48 ) ( -4512 1152 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4576 1152 48 ) ( -4576 832 48 ) ( -4576 832 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4512 1152 32 ) ( -4512 832 32 ) ( -4576 832 32 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4576 832 0 ) ( -4512 832 0 ) ( -4512 1152 0 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+}
+// brush 3
+{
+( -4464 1264 0 ) ( -4448 1280 0 ) ( -4464 1264 16 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4448 704 0 ) ( -4464 720 0 ) ( -4448 704 16 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4640 832 0 ) ( -4576 832 0 ) ( -4576 1152 0 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4608 1152 16 ) ( -4608 832 16 ) ( -4672 832 16 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4640 1152 48 ) ( -4640 832 48 ) ( -4640 832 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4576 832 48 ) ( -4576 1152 48 ) ( -4576 1152 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 4
+{
+( -4496 1088 64 ) ( -4480 1088 64 ) ( -4496 1152 64 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4384 1088 64 ) ( -4448 1152 64 ) ( -4384 1152 128 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4448 1152 64 ) ( -4448 1152 0 ) ( -4384 1152 64 ) dsi/cretebase -288 64 0 0.500000 0.500000 134217728 0 0
+( -4384 1088 0 ) ( -4384 1088 64 ) ( -4384 1152 128 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 5
+{
+( -4496 832 64 ) ( -4480 832 64 ) ( -4496 896 64 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4448 832 64 ) ( -4384 896 64 ) ( -4384 832 128 ) dsi/cretebase -288 224 0 0.500000 0.500000 134217728 0 0
+( -4448 832 0 ) ( -4448 832 64 ) ( -4384 832 128 ) dsi/cretebase -288 64 0 0.500000 0.500000 134217728 0 0
+( -4384 896 64 ) ( -4384 896 0 ) ( -4384 832 64 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 6
+{
+( -4352 992 240 ) ( -4320 992 240 ) ( -4320 1152 240 ) common/caulk -96 32 0 0.500000 0.500000 0 0 0
+( -4320 992 240 ) ( -4384 992 240 ) ( -4448 992 384 ) common/caulk -96 128 0 0.500000 0.500000 0 0 0
+( -4448 1120 384 ) ( -4256 1120 384 ) ( -4256 832 384 ) dsi/cretebase -96 288 0 0.500000 0.500000 0 0 0
+( -4384 1152 192 ) ( -4320 1152 192 ) ( -4256 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4384 832 192 ) ( -4384 1152 192 ) ( -4448 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4320 1152 192 ) ( -4320 832 192 ) ( -4256 832 384 ) dsi/cretebase4 -160 0 0 0.500000 0.500000 0 0 0
+}
+// brush 7
+{
+( -4352 832 240 ) ( -4320 832 240 ) ( -4320 992 240 ) common/caulk -96 32 0 0.500000 0.500000 0 0 0
+( -4384 992 240 ) ( -4320 992 240 ) ( -4256 992 384 ) common/caulk -96 128 0 0.500000 0.500000 0 0 0
+( -4448 1120 384 ) ( -4256 1120 384 ) ( -4256 832 384 ) dsi/cretebase -96 288 0 0.500000 0.500000 0 0 0
+( -4384 832 192 ) ( -4384 1152 192 ) ( -4448 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4320 832 192 ) ( -4384 832 192 ) ( -4448 832 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4320 1152 192 ) ( -4320 832 192 ) ( -4256 832 384 ) dsi/cretebase4 -160 0 0 0.500000 0.500000 0 0 0
+}
+// brush 8
+{
+( -4320 992 240 ) ( -4352 992 240 ) ( -4320 1152 240 ) common/caulk -96 32 0 0.500000 0.500000 134217728 0 0
+( -4384 992 240 ) ( -4320 992 240 ) ( -4320 1152 192 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4384 1152 192 ) ( -4320 1152 192 ) ( -4256 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4384 832 192 ) ( -4384 1152 192 ) ( -4448 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4320 1152 192 ) ( -4320 832 192 ) ( -4256 832 384 ) dsi/cretebase4 -160 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 9
+{
+( -4320 832 240 ) ( -4352 832 240 ) ( -4320 992 240 ) common/caulk -96 32 0 0.500000 0.500000 134217728 0 0
+( -4320 992 240 ) ( -4384 992 240 ) ( -4384 832 192 ) dsi/cretebase4 -352 160 0 0.500000 0.500000 134217728 0 0
+( -4384 832 192 ) ( -4384 1152 192 ) ( -4448 1152 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4320 832 192 ) ( -4384 832 192 ) ( -4448 832 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4320 1152 192 ) ( -4320 832 192 ) ( -4256 832 384 ) dsi/cretebase4 -160 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 10
+{
+( -4320 1344 0 ) ( -4256 1280 0 ) ( -4320 1344 384 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4448 1280 0 ) ( -4384 1344 0 ) ( -4448 1280 384 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4384 1152 0 ) ( -4320 1152 0 ) ( -4320 1216 0 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4352 1216 384 ) ( -4352 1152 384 ) ( -4416 1152 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4320 1344 128 ) ( -4384 1344 128 ) ( -4384 1344 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -4448 1216 128 ) ( -4448 1152 128 ) ( -4448 1152 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4384 1152 128 ) ( -4320 1152 128 ) ( -4320 1152 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 0 0 0
+( -4256 1152 128 ) ( -4256 1216 128 ) ( -4256 1216 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+}
+// brush 11
+{
+( -4384 640 416 ) ( -4384 640 432 ) ( -4384 1344 432 ) common/caulk -160 0 0 0.500000 0.500000 0 0 0
+( -4256 704 448 ) ( -4256 672 416 ) ( -4448 704 448 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4256 1344 384 ) ( -4256 1312 416 ) ( -4448 1344 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4448 1280 384 ) ( -4384 1344 384 ) ( -4448 1280 448 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4384 640 384 ) ( -4448 704 384 ) ( -4384 640 448 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4256 640 384 ) ( -4256 1344 384 ) ( -4448 1344 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4384 1344 448 ) ( -4384 640 448 ) ( -4448 640 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+}
+// brush 12
+{
+( -4320 640 400 ) ( -4320 640 432 ) ( -4320 1344 432 ) common/caulk -160 0 0 0.500000 0.500000 0 0 0
+( -4384 640 432 ) ( -4384 640 416 ) ( -4384 1344 432 ) common/caulk -160 0 0 0.500000 0.500000 0 0 0
+( -4256 704 448 ) ( -4256 672 416 ) ( -4448 704 448 ) dsi/cretebase4 -96 160 0 0.500000 0.500000 0 0 0
+( -4256 1344 384 ) ( -4256 1312 416 ) ( -4448 1344 384 ) dsi/cretebase4 -96 160 0 0.500000 0.500000 0 0 0
+( -4256 640 384 ) ( -4256 1344 384 ) ( -4448 1344 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4320 1344 448 ) ( -4320 640 448 ) ( -4384 640 448 ) dsi/cretebase4 -96 160 0 0.500000 0.500000 0 0 0
+}
+// brush 13
+{
+( -4320 640 432 ) ( -4320 640 400 ) ( -4320 1344 432 ) common/caulk -160 0 0 0.500000 0.500000 0 0 0
+( -4256 704 448 ) ( -4256 672 416 ) ( -4448 704 448 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4256 1344 384 ) ( -4256 1312 416 ) ( -4448 1344 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4320 1344 384 ) ( -4256 1280 384 ) ( -4320 1344 448 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4256 704 384 ) ( -4320 640 384 ) ( -4256 704 448 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4256 640 384 ) ( -4256 1344 384 ) ( -4448 1344 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4320 640 448 ) ( -4320 1344 448 ) ( -4256 1344 384 ) dsi/cretebase 0 0 0 0.500000 0.500000 0 0 0
+}
+// brush 14
+{
+( -4384 640 0 ) ( -4448 704 0 ) ( -4384 640 384 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4256 704 0 ) ( -4320 640 0 ) ( -4256 704 384 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4256 768 128 ) ( -4256 832 128 ) ( -4256 832 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4384 640 128 ) ( -4320 640 128 ) ( -4320 640 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -4448 832 128 ) ( -4448 768 128 ) ( -4448 768 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4320 832 128 ) ( -4384 832 128 ) ( -4384 832 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 0 0 0
+( -4352 832 384 ) ( -4352 768 384 ) ( -4416 768 384 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+( -4384 768 0 ) ( -4320 768 0 ) ( -4320 832 0 ) dsi/cretebase -352 160 0 0.500000 0.500000 0 0 0
+}
+// brush 15
+{
+( -4192 832 0 ) ( -4192 1152 0 ) ( -4384 1152 0 ) dsi/cretebase -96 288 0 0.500000 0.500000 0 0 0
+( -4320 1120 128 ) ( -4320 832 128 ) ( -4448 832 128 ) dsi/cretebase3 -352 160 0 0.500000 0.500000 0 0 0
+( -4320 1152 128 ) ( -4384 1152 128 ) ( -4416 1152 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4384 832 0 ) ( -4384 1152 0 ) ( -4384 1152 128 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4384 832 128 ) ( -4320 832 128 ) ( -4288 832 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -4192 1152 0 ) ( -4192 832 0 ) ( -4320 832 128 ) dsi/cretebase3 -352 160 0 0.500000 0.500000 0 0 0
+}
+}
+// entity 27
+{
+"classname" "func_group"
+// brush 0
+{
+( -4736 -1088 64 ) ( -4736 -768 64 ) ( -4736 -768 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 134217728 0 0
+( -4800 -1088 64 ) ( -4736 -1088 64 ) ( -4736 -1088 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 134217728 0 0
+( -4800 -768 64 ) ( -4800 -1088 64 ) ( -4800 -1088 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 134217728 0 0
+( -4736 -768 64 ) ( -4800 -768 64 ) ( -4800 -768 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 134217728 0 0
+( -4736 -768 64 ) ( -4736 -1088 64 ) ( -4800 -1088 64 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4800 -1088 0 ) ( -4736 -1088 0 ) ( -4736 -768 0 ) dsi/cretebase -160 -96 0 0.500000 0.500000 134217728 0 0
+}
+// brush 1
+{
+( -4816 -656 0 ) ( -4800 -640 0 ) ( -4816 -656 48 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4800 -1216 0 ) ( -4816 -1200 0 ) ( -4800 -1216 48 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4864 -1088 0 ) ( -4800 -1088 0 ) ( -4800 -768 0 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4800 -768 48 ) ( -4800 -1088 48 ) ( -4864 -1088 48 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4864 -768 48 ) ( -4864 -1088 48 ) ( -4864 -1088 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4800 -1088 48 ) ( -4800 -768 48 ) ( -4800 -768 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 2
+{
+( -4816 -656 0 ) ( -4800 -640 0 ) ( -4816 -656 32 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4800 -1216 0 ) ( -4816 -1200 0 ) ( -4800 -1216 32 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4864 -1088 48 ) ( -4864 -768 48 ) ( -4864 -768 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4928 -768 48 ) ( -4928 -1088 48 ) ( -4928 -1088 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4864 -768 32 ) ( -4864 -1088 32 ) ( -4928 -1088 32 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4928 -1088 0 ) ( -4864 -1088 0 ) ( -4864 -768 0 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+}
+// brush 3
+{
+( -4816 -656 0 ) ( -4800 -640 0 ) ( -4816 -656 16 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4800 -1216 0 ) ( -4816 -1200 0 ) ( -4800 -1216 16 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4992 -1088 0 ) ( -4928 -1088 0 ) ( -4928 -768 0 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4960 -768 16 ) ( -4960 -1088 16 ) ( -5024 -1088 16 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4992 -768 48 ) ( -4992 -1088 48 ) ( -4992 -1088 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4928 -1088 48 ) ( -4928 -768 48 ) ( -4928 -768 0 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 4
+{
+( -4848 -832 64 ) ( -4832 -832 64 ) ( -4848 -768 64 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4736 -832 64 ) ( -4800 -768 64 ) ( -4736 -768 128 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4800 -768 64 ) ( -4800 -768 0 ) ( -4736 -768 64 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4736 -832 0 ) ( -4736 -832 64 ) ( -4736 -768 128 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 5
+{
+( -4848 -1088 64 ) ( -4832 -1088 64 ) ( -4848 -1024 64 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4800 -1088 64 ) ( -4736 -1024 64 ) ( -4736 -1088 128 ) dsi/cretebase -96 -32 0 0.500000 0.500000 134217728 0 0
+( -4800 -1088 0 ) ( -4800 -1088 64 ) ( -4736 -1088 128 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -4736 -1024 64 ) ( -4736 -1024 0 ) ( -4736 -1088 64 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 6
+{
+( -4704 -928 240 ) ( -4672 -928 240 ) ( -4672 -768 240 ) common/caulk -160 -224 0 0.500000 0.500000 0 0 0
+( -4672 -928 240 ) ( -4736 -928 240 ) ( -4800 -928 384 ) common/caulk -160 128 0 0.500000 0.500000 0 0 0
+( -4800 -800 384 ) ( -4608 -800 384 ) ( -4608 -1088 384 ) dsi/cretebase -416 -480 0 0.500000 0.500000 0 0 0
+( -4736 -768 192 ) ( -4672 -768 192 ) ( -4608 -768 384 ) dsi/cretebase -416 64 0 0.500000 0.500000 0 0 0
+( -4736 -1088 192 ) ( -4736 -768 192 ) ( -4800 -768 384 ) dsi/cretebase 160 64 0 0.500000 0.500000 0 0 0
+( -4672 -768 192 ) ( -4672 -1088 192 ) ( -4608 -1088 384 ) dsi/cretebase4 96 0 0 0.500000 0.500000 0 0 0
+}
+// brush 7
+{
+( -4704 -1088 240 ) ( -4672 -1088 240 ) ( -4672 -928 240 ) common/caulk -160 -224 0 0.500000 0.500000 0 0 0
+( -4736 -928 240 ) ( -4672 -928 240 ) ( -4608 -928 384 ) common/caulk -160 128 0 0.500000 0.500000 0 0 0
+( -4800 -800 384 ) ( -4608 -800 384 ) ( -4608 -1088 384 ) dsi/cretebase -416 -480 0 0.500000 0.500000 0 0 0
+( -4736 -1088 192 ) ( -4736 -768 192 ) ( -4800 -768 384 ) dsi/cretebase 160 64 0 0.500000 0.500000 0 0 0
+( -4672 -1088 192 ) ( -4736 -1088 192 ) ( -4800 -1088 384 ) dsi/cretebase -416 64 0 0.500000 0.500000 0 0 0
+( -4672 -768 192 ) ( -4672 -1088 192 ) ( -4608 -1088 384 ) dsi/cretebase4 96 0 0 0.500000 0.500000 0 0 0
+}
+// brush 8
+{
+( -4672 -928 240 ) ( -4704 -928 240 ) ( -4672 -768 240 ) common/caulk -160 -224 0 0.500000 0.500000 134217728 0 0
+( -4736 -928 240 ) ( -4672 -928 240 ) ( -4672 -768 192 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4736 -768 192 ) ( -4672 -768 192 ) ( -4608 -768 384 ) dsi/cretebase -416 64 0 0.500000 0.500000 134217728 0 0
+( -4736 -1088 192 ) ( -4736 -768 192 ) ( -4800 -768 384 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4672 -768 192 ) ( -4672 -1088 192 ) ( -4608 -1088 384 ) dsi/cretebase4 96 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 9
+{
+( -4672 -1088 240 ) ( -4704 -1088 240 ) ( -4672 -928 240 ) common/caulk -160 -224 0 0.500000 0.500000 134217728 0 0
+( -4672 -928 240 ) ( -4736 -928 240 ) ( -4736 -1088 192 ) dsi/cretebase4 -160 -96 0 0.500000 0.500000 134217728 0 0
+( -4736 -1088 192 ) ( -4736 -768 192 ) ( -4800 -768 384 ) dsi/cretebase 160 64 0 0.500000 0.500000 134217728 0 0
+( -4672 -1088 192 ) ( -4736 -1088 192 ) ( -4800 -1088 384 ) dsi/cretebase -416 64 0 0.500000 0.500000 134217728 0 0
+( -4672 -768 192 ) ( -4672 -1088 192 ) ( -4608 -1088 384 ) dsi/cretebase4 96 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 10
+{
+( -4672 -576 0 ) ( -4608 -640 0 ) ( -4672 -576 384 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4800 -640 0 ) ( -4736 -576 0 ) ( -4800 -640 384 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4736 -768 0 ) ( -4672 -768 0 ) ( -4672 -704 0 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4704 -704 384 ) ( -4704 -768 384 ) ( -4768 -768 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4672 -576 128 ) ( -4736 -576 128 ) ( -4736 -576 0 ) dsi/cretebase4 -32 0 0 0.500000 0.500000 0 0 0
+( -4800 -704 128 ) ( -4800 -768 128 ) ( -4800 -768 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4736 -768 128 ) ( -4672 -768 128 ) ( -4672 -768 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4608 -768 128 ) ( -4608 -704 128 ) ( -4608 -704 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+}
+// brush 11
+{
+( -4736 -1280 416 ) ( -4736 -1280 432 ) ( -4736 -576 432 ) common/caulk 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1216 448 ) ( -4608 -1248 416 ) ( -4800 -1216 448 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4608 -576 384 ) ( -4608 -608 416 ) ( -4800 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4800 -640 384 ) ( -4736 -576 384 ) ( -4800 -640 448 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4736 -1280 384 ) ( -4800 -1216 384 ) ( -4736 -1280 448 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1280 384 ) ( -4608 -576 384 ) ( -4800 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4736 -576 448 ) ( -4736 -1280 448 ) ( -4800 -1280 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+}
+// brush 12
+{
+( -4672 -1280 400 ) ( -4672 -1280 432 ) ( -4672 -576 432 ) common/caulk 96 0 0 0.500000 0.500000 0 0 0
+( -4736 -1280 432 ) ( -4736 -1280 416 ) ( -4736 -576 432 ) common/caulk 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1216 448 ) ( -4608 -1248 416 ) ( -4800 -1216 448 ) dsi/cretebase4 -32 -96 0 0.500000 0.500000 0 0 0
+( -4608 -576 384 ) ( -4608 -608 416 ) ( -4800 -576 384 ) dsi/cretebase4 -32 -96 0 0.500000 0.500000 0 0 0
+( -4608 -1280 384 ) ( -4608 -576 384 ) ( -4800 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4672 -576 448 ) ( -4672 -1280 448 ) ( -4736 -1280 448 ) dsi/cretebase4 -32 -96 0 0.500000 0.500000 0 0 0
+}
+// brush 13
+{
+( -4672 -1280 432 ) ( -4672 -1280 400 ) ( -4672 -576 432 ) common/caulk 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1216 448 ) ( -4608 -1248 416 ) ( -4800 -1216 448 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4608 -576 384 ) ( -4608 -608 416 ) ( -4800 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4672 -576 384 ) ( -4608 -640 384 ) ( -4672 -576 448 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1216 384 ) ( -4672 -1280 384 ) ( -4608 -1216 448 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1280 384 ) ( -4608 -576 384 ) ( -4800 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4672 -1280 448 ) ( -4672 -576 448 ) ( -4608 -576 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+}
+// brush 14
+{
+( -4736 -1280 0 ) ( -4800 -1216 0 ) ( -4736 -1280 384 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1216 0 ) ( -4672 -1280 0 ) ( -4608 -1216 384 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4608 -1152 128 ) ( -4608 -1088 128 ) ( -4608 -1088 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4736 -1280 128 ) ( -4672 -1280 128 ) ( -4672 -1280 0 ) dsi/cretebase4 -32 0 0 0.500000 0.500000 0 0 0
+( -4800 -1088 128 ) ( -4800 -1152 128 ) ( -4800 -1152 0 ) dsi/cretebase 96 0 0 0.500000 0.500000 0 0 0
+( -4672 -1088 128 ) ( -4736 -1088 128 ) ( -4736 -1088 0 ) dsi/cretebase -160 0 0 0.500000 0.500000 0 0 0
+( -4704 -1088 384 ) ( -4704 -1152 384 ) ( -4768 -1152 384 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+( -4736 -1152 0 ) ( -4672 -1152 0 ) ( -4672 -1088 0 ) dsi/cretebase -160 -96 0 0.500000 0.500000 0 0 0
+}
+// brush 15
+{
+( -4544 -1088 0 ) ( -4544 -768 0 ) ( -4736 -768 0 ) dsi/cretebase -416 -480 0 0.500000 0.500000 0 0 0
+( -4672 -800 128 ) ( -4672 -1088 128 ) ( -4800 -1088 128 ) dsi/cretebase3 -160 -96 0 0.500000 0.500000 0 0 0
+( -4672 -768 128 ) ( -4736 -768 128 ) ( -4768 -768 0 ) dsi/cretebase -416 64 0 0.500000 0.500000 0 0 0
+( -4736 -1088 0 ) ( -4736 -768 0 ) ( -4736 -768 128 ) dsi/cretebase 160 64 0 0.500000 0.500000 0 0 0
+( -4736 -1088 128 ) ( -4672 -1088 128 ) ( -4640 -1088 0 ) dsi/cretebase -416 64 0 0.500000 0.500000 0 0 0
+( -4544 -768 0 ) ( -4544 -1088 0 ) ( -4672 -1088 128 ) dsi/cretebase3 -160 -96 0 0.500000 0.500000 0 0 0
+}
+}
+// entity 28
+{
+"classname" "func_group"
+// brush 0
+{
+( -3712 -124 96 ) ( -3712 -32 64 ) ( -3648 -64 96 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -64 96 ) ( -3712 -32 64 ) ( -3712 -32 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3616 -160 0 ) ( -3872 -64 0 ) ( -3872 -64 340 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -32 0 ) ( -3712 -32 64 ) ( -3712 -124 96 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -384 0 ) ( -3648 -384 384 ) ( -3648 192 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 192 0 ) ( -3712 192 0 ) ( -3712 -320 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 1
+{
+( -3712 -124 173 ) ( -3648 -148 143 ) ( -3648 -256 183 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -148 0 ) ( -3648 -148 143 ) ( -3712 -124 173 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3680 -256 0 ) ( -3744 -256 0 ) ( -3744 -256 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -124 0 ) ( -3712 -124 173 ) ( -3712 -256 183 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -256 183 ) ( -3648 -148 143 ) ( -3648 -148 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 192 0 ) ( -3712 192 0 ) ( -3712 -320 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 2
+{
+( -3621 352 0 ) ( -3621 288 0 ) ( -3515 352 0 ) common/caulk 0 0 0 0.500000 0.500000 134217728 0 0
+( -3515 -210 37 ) ( -3577 -184 -4 ) ( -3591 -320 37 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3558 -180 165 ) ( -3614 -156 135 ) ( -3569 -188 2 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3614 -156 135 ) ( -3558 -180 165 ) ( -3564 -288 178 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3619 -288 143 ) ( -3565 -288 177 ) ( -3537 -320 71 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3577 -184 -4 ) ( -3614 -156 135 ) ( -3621 -286 150 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3558 -180 165 ) ( -3515 -210 37 ) ( -3529 -322 70 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 3
+{
+( -3360 44 0 ) ( -3456 44 0 ) ( -3360 -256 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3496 128 -51 ) ( -3465 -64 -43 ) ( -3511 128 11 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3620 -224 -50 ) ( -3309 416 28 ) ( -3635 -224 12 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3162 -256 97 ) ( -3146 -256 35 ) ( -3519 -256 -58 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3170 -384 128 ) ( -3542 -384 35 ) ( -3542 192 35 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3527 -320 -27 ) ( -3527 192 -27 ) ( -3542 192 35 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 4
+{
+( -3520 -77 0 ) ( -3648 -77 0 ) ( -3520 -282 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3680 -128 0 ) ( -3904 -288 96 ) ( -3904 -256 96 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3918 -256 -40 ) ( -3925 -224 23 ) ( -3903 -256 122 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3529 -136 68 ) ( -3864 -309 141 ) ( -4140 105 -148 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -96 -32 ) ( -3936 -224 -32 ) ( -3904 -288 96 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3936 -224 -32 ) ( -3648 -96 -32 ) ( -3776 -128 32 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 5
+{
+( -3902 -64 0 ) ( -3902 -160 0 ) ( -3595 -64 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4092 -389 -42 ) ( -3676 -367 -52 ) ( -4091 -376 21 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3687 -397 -45 ) ( -3581 -666 10 ) ( -3580 -653 72 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3775 -174 -124 ) ( -3774 -161 -61 ) ( -3902 -528 -48 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3835 -147 -96 ) ( -3962 -500 -20 ) ( -3479 -668 9 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3448 -665 73 ) ( -4022 -466 39 ) ( -3895 -112 -37 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4023 -480 -24 ) ( -4022 -466 39 ) ( -3478 -655 71 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 6
+{
+( -4448 -64 0 ) ( -4448 -192 0 ) ( -4248 -64 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4192 -467 36 ) ( -4320 -339 49 ) ( -4192 -460 -28 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4352 -530 29 ) ( -4160 -308 53 ) ( -4352 -524 -34 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4448 -499 33 ) ( -4448 -489 -63 ) ( -4448 -107 -23 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3936 -117 73 ) ( -3936 -499 33 ) ( -4448 -499 33 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3872 -499 33 ) ( -3872 -492 -31 ) ( -4448 -492 -31 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 7
+{
+( -4096 -320 224 ) ( -3968 -320 352 ) ( -3968 -384 352 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4128 -320 416 ) ( -3936 -320 192 ) ( -4128 -384 416 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3776 -288 0 ) ( -3776 -352 0 ) ( -3776 -288 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4224 -320 384 ) ( -4224 -416 384 ) ( -4224 -416 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -320 0 ) ( -3712 -320 384 ) ( -4224 -320 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4256 -384 384 ) ( -3648 -384 384 ) ( -3648 -384 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3616 -320 0 ) ( -4224 -320 0 ) ( -4224 -416 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 8
+{
+( -3644 352 0 ) ( -3644 288 0 ) ( -3423 352 0 ) common/caulk 0 0 0 0.500000 0.500000 134217728 0 0
+( -3473 -320 137 ) ( -3354 -320 -262 ) ( -3354 -384 -262 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3441 -320 134 ) ( -3198 -320 301 ) ( -3198 -384 301 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3655 -320 -69 ) ( -3273 -320 -109 ) ( -3220 -320 400 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3216 -384 432 ) ( -3280 -384 -173 ) ( -3662 -384 -133 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 9
+{
+( -4224 240 0 ) ( -4224 192 0 ) ( -4016 240 0 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4288 189 55 ) ( -4176 211 132 ) ( -4288 127 73 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4224 273 348 ) ( -4224 242 356 ) ( -4224 136 -13 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4000 149 -83 ) ( -4000 202 102 ) ( -4224 220 163 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4016 224 295 ) ( -4016 255 286 ) ( -4016 149 -83 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4000 141 119 ) ( -4000 88 -65 ) ( -4224 105 -4 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+( -4000 202 102 ) ( -4000 141 119 ) ( -4224 158 181 ) dsi/cretebase4 0 -32 0 0.500000 0.500000 134217728 0 0
+}
+// brush 10
+{
+( -3808 -336 336 ) ( -3600 -336 256 ) ( -3808 -400 336 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3776 -368 0 ) ( -3776 -304 0 ) ( -3776 -304 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -336 0 ) ( -3712 -336 384 ) ( -4224 -336 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -320 384 ) ( -3712 -320 0 ) ( -3648 -384 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -4256 -384 384 ) ( -3648 -384 384 ) ( -3648 -384 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3616 -320 0 ) ( -4224 -320 0 ) ( -4224 -416 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 11
+{
+( -3808 -272 336 ) ( -3600 -272 256 ) ( -3808 -400 336 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 -336 384 ) ( -3712 -272 96 ) ( -3648 -336 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 192 0 ) ( -3712 192 0 ) ( -3712 -320 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -384 384 ) ( -3648 -384 0 ) ( -3712 -320 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3648 -384 0 ) ( -3648 -384 384 ) ( -3648 192 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3712 192 384 ) ( -3712 -320 384 ) ( -3712 -320 0 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3744 -256 0 ) ( -3680 -256 0 ) ( -3744 -256 384 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+}
+// brush 12
+{
+( -3733 64 0 ) ( -3733 48 0 ) ( -3568 64 0 ) common/caulk 0 0 0 0.500000 0.500000 134217728 0 0
+( -3733 162 146 ) ( -3632 112 119 ) ( -3568 -112 58 ) dsi/cretebase2 0 0 0 0.500000 0.500000 134217728 0 0
+( -3632 112 -48 ) ( -3632 112 119 ) ( -3733 162 146 ) dsi/cretebase2 0 -96 0 0.500000 0.500000 134217728 0 0
+( -3568 -112 58 ) ( -3632 112 119 ) ( -3632 112 -48 ) dsi/cretebase2 0 -96 0 0.500000 0.500000 134217728 0 0
+( -3664 -112 304 ) ( -3600 -112 304 ) ( -3600 -112 -80 ) dsi/cretebase2 0 -96 0 0.500000 0.500000 134217728 0 0
+( -3733 162 -40 ) ( -3733 162 146 ) ( -3664 -112 29 ) dsi/cretebase2 0 -96 0 0.500000 0.500000 134217728 0 0
+}
+}
+// entity 29
+{
+"classname" "weapon_grenadelauncher"
+"origin" "-4432 992 96"
+}
+// entity 30
+{
+"classname" "item_rockets"
+"origin" "-4432 880 96"
+"angle" "135"
+}
+// entity 31
+{
+"angle" "225"
+"origin" "-4432 1104 96"
+"classname" "item_rockets"
+}
+// entity 32
+{
+"classname" "weapon_electro"
+"origin" "-4784 -928 96"
+}
+// entity 33
+{
+"classname" "item_cells"
+"origin" "-4784 -832 96"
+}
+// entity 34
+{
+"origin" "-4784 -1024 96"
+"classname" "item_cells"
+}
+// entity 35
+{
+"classname" "item_armor1"
+"origin" "-4040 -256 16"
+}
+// entity 36
+{
+"origin" "-3776 128 16"
+"classname" "item_armor1"
+}
+// entity 37
+{
+"classname" "item_armor1"
+"origin" "-3776 -64 16"
+}
+// entity 38
+{
+"origin" "-4160 -256 16"
+"classname" "item_armor1"
+}
+// entity 39
+{
+"classname" "item_health1"
+"origin" "-3968 -256 16"
+}
+// entity 40
+{
+"origin" "-4096 -256 16"
+"classname" "item_health1"
+}
+// entity 41
+{
+"classname" "item_health1"
+"origin" "-3776 64 16"
+}
+// entity 42
+{
+"origin" "-3776 0 16"
+"classname" "item_health1"
+}
+// entity 43
+{
+"classname" "weapon_rocketlauncher"
+"origin" "-3968 -64 16"
+}
+// entity 44
+{
+"classname" "weapon_nex"
+"origin" "-3256 784 608"
+}
+// entity 45
+{
+"classname" "item_cells"
+"origin" "-3256 848 608"
+}
+// entity 46
+{
+"origin" "-3256 720 608"
+"classname" "item_cells"
+}
+// entity 47
+{
+"classname" "func_ladder"
+// brush 0
+{
+( -3336 848 576 ) ( -3336 832 576 ) ( -3336 832 32 ) common/trigger 32 0 0 0.500000 0.500000 134217728 0 0
+( -3328 832 576 ) ( -3336 832 576 ) ( -3336 832 32 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -3328 832 576 ) ( -3328 848 576 ) ( -3328 848 32 ) common/trigger 32 0 0 0.500000 0.500000 134217728 0 0
+( -3336 736 592 ) ( -3328 736 592 ) ( -3328 736 48 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -3336 824 592 ) ( -3336 840 592 ) ( -3328 840 592 ) common/trigger 48 -32 0 0.500000 0.500000 134217728 0 0
+( -3328 848 32 ) ( -3336 848 32 ) ( -3336 832 32 ) common/trigger 48 -32 0 0.500000 0.500000 134217728 0 0
+}
+}
+// entity 48
+{
+"classname" "func_ladder"
+// brush 0
+{
+( -3640 -1203 576 ) ( -3634 -1218 576 ) ( -3634 -1218 32 ) common/trigger 0 0 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 576 ) ( -3634 -1218 576 ) ( -3634 -1218 32 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -3627 -1214 576 ) ( -3633 -1200 576 ) ( -3633 -1200 32 ) common/trigger 0 0 0 0.500000 0.500000 134217728 0 0
+( -3595 -1305 592 ) ( -3587 -1302 592 ) ( -3587 -1302 48 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -3631 -1225 592 ) ( -3637 -1210 592 ) ( -3630 -1207 592 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -3633 -1200 32 ) ( -3640 -1203 32 ) ( -3634 -1218 32 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+}
+}
+// entity 49
+{
+"classname" "weapon_hagar"
+"origin" "-1992 918 608"
+}
+// entity 50
+{
+"classname" "item_rockets"
+"origin" "-2042 879 608"
+}
+// entity 51
+{
+"origin" "-1941 958 608"
+"classname" "item_rockets"
+}
+// entity 52
+{
+"classname" "func_ladder"
+// brush 0
+{
+( -2027 1003 32 ) ( -2034 1007 32 ) ( -2043 994 32 ) common/trigger 48 -16 0 0.500000 0.500000 134217728 0 0
+( -2047 987 592 ) ( -2038 1001 592 ) ( -2032 996 592 ) common/trigger 48 -16 0 0.500000 0.500000 134217728 0 0
+( -2093 913 592 ) ( -2086 908 592 ) ( -2086 908 48 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -2036 990 576 ) ( -2027 1003 576 ) ( -2027 1003 32 ) common/trigger 16 0 0 0.500000 0.500000 134217728 0 0
+( -2036 990 576 ) ( -2043 994 576 ) ( -2043 994 32 ) common/trigger 48 0 0 0.500000 0.500000 134217728 0 0
+( -2034 1007 576 ) ( -2043 994 576 ) ( -2043 994 32 ) common/trigger 16 0 0 0.500000 0.500000 134217728 0 0
+}
+}
+// entity 53
+{
+"classname" "weapon_machinegun"
+"origin" "-3528 -1344 608"
+}
+// entity 54
+{
+"origin" "-3536 -1304 608"
+"classname" "item_bullets"
+}
+// entity 55
+{
+"classname" "item_health25"
+"origin" "-3544 -1136 48"
+}
+// entity 56
+{
+"origin" "-3464 -1248 48"
+"classname" "item_health25"
+}
+// entity 57
+{
+"classname" "item_health25"
+"origin" "-3200 704 48"
+}
+// entity 58
+{
+"origin" "-3184 840 48"
+"classname" "item_health25"
+}
+// entity 59
+{
+"classname" "item_health25"
+"origin" "-1968 952 48"
+}
+// entity 60
+{
+"origin" "-2016 824 48"
+"classname" "item_health25"
+}
+// entity 61
+{
+"classname" "func_group"
+// brush 0
+{
+( -2319 -568 0 ) ( -2140 -833 0 ) ( -2246 -905 128 ) dsi/cretebase3 -288 144 0 0.500000 0.500000 0 0 0
+( -2300 -941 128 ) ( -2246 -905 128 ) ( -2220 -887 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -2300 -941 0 ) ( -2478 -676 0 ) ( -2478 -676 128 ) dsi/cretebase -16 64 0 0.500000 0.500000 0 0 0
+( -2425 -640 128 ) ( -2478 -676 128 ) ( -2505 -694 0 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -2407 -666 128 ) ( -2246 -905 128 ) ( -2352 -977 128 ) dsi/cretebase3 -288 144 0 0.500000 0.500000 0 0 0
+( -2140 -833 0 ) ( -2319 -568 0 ) ( -2478 -676 0 ) dsi/cretebase -32 272 0 0.500000 0.500000 0 0 0
+}
+// brush 1
+{
+( -2264 -994 0 ) ( -2210 -958 0 ) ( -2246 -905 0 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2273 -923 384 ) ( -2237 -977 384 ) ( -2291 -1012 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2246 -905 128 ) ( -2300 -941 128 ) ( -2300 -941 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 0 0 0
+( -2352 -977 128 ) ( -2317 -1029 128 ) ( -2317 -1029 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2192 -1100 128 ) ( -2139 -1064 128 ) ( -2139 -1064 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -2157 -923 128 ) ( -2193 -870 128 ) ( -2193 -870 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2122 -976 0 ) ( -2139 -1064 0 ) ( -2122 -976 384 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2192 -1100 0 ) ( -2281 -1083 0 ) ( -2192 -1100 384 ) dsi/cretebase -208 0 0 0.500000 0.500000 0 0 0
+}
+// brush 2
+{
+( -2139 -1064 448 ) ( -2533 -481 448 ) ( -2480 -445 384 ) dsi/cretebase -448 496 0 0.500000 0.500000 0 0 0
+( -2086 -1028 384 ) ( -2480 -445 384 ) ( -2639 -552 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2122 -976 384 ) ( -2139 -1064 384 ) ( -2122 -976 448 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2533 -481 384 ) ( -2444 -498 384 ) ( -2533 -481 448 ) dsi/cretebase -208 0 0 0.500000 0.500000 0 0 0
+( -2480 -445 384 ) ( -2462 -472 416 ) ( -2639 -552 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2122 -976 448 ) ( -2104 -1002 416 ) ( -2281 -1083 448 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2139 -1064 432 ) ( -2139 -1064 400 ) ( -2533 -481 432 ) common/caulk -80 0 0 0.500000 0.500000 0 0 0
+}
+// brush 3
+{
+( -2533 -481 448 ) ( -2139 -1064 448 ) ( -2192 -1100 448 ) dsi/cretebase4 -32 144 0 0.500000 0.500000 0 0 0
+( -2086 -1028 384 ) ( -2480 -445 384 ) ( -2639 -552 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2480 -445 384 ) ( -2462 -472 416 ) ( -2639 -552 384 ) dsi/cretebase4 -32 144 0 0.500000 0.500000 0 0 0
+( -2122 -976 448 ) ( -2104 -1002 416 ) ( -2281 -1083 448 ) dsi/cretebase4 -32 144 0 0.500000 0.500000 0 0 0
+( -2192 -1100 432 ) ( -2192 -1100 416 ) ( -2586 -516 432 ) common/caulk -80 0 0 0.500000 0.500000 0 0 0
+( -2139 -1064 400 ) ( -2139 -1064 432 ) ( -2533 -481 432 ) common/caulk -80 0 0 0.500000 0.500000 0 0 0
+}
+// brush 4
+{
+( -2586 -516 448 ) ( -2192 -1100 448 ) ( -2245 -1135 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2086 -1028 384 ) ( -2480 -445 384 ) ( -2639 -552 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2192 -1100 384 ) ( -2281 -1083 384 ) ( -2192 -1100 448 ) dsi/cretebase -208 0 0 0.500000 0.500000 0 0 0
+( -2603 -606 384 ) ( -2586 -516 384 ) ( -2603 -606 448 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2480 -445 384 ) ( -2462 -472 416 ) ( -2639 -552 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2122 -976 448 ) ( -2104 -1002 416 ) ( -2281 -1083 448 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2192 -1100 416 ) ( -2192 -1100 432 ) ( -2586 -516 432 ) common/caulk -80 0 0 0.500000 0.500000 0 0 0
+}
+// brush 5
+{
+( -2372 -605 128 ) ( -2408 -551 128 ) ( -2408 -551 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2478 -676 128 ) ( -2425 -640 128 ) ( -2425 -640 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 0 0 0
+( -2567 -658 128 ) ( -2531 -712 128 ) ( -2531 -712 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2533 -481 128 ) ( -2586 -516 128 ) ( -2586 -516 0 ) dsi/cretebase4 -96 0 0 0.500000 0.500000 0 0 0
+( -2488 -604 384 ) ( -2451 -658 384 ) ( -2505 -694 384 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2478 -676 0 ) ( -2425 -640 0 ) ( -2461 -587 0 ) dsi/cretebase -288 144 0 0.500000 0.500000 0 0 0
+( -2603 -606 0 ) ( -2586 -516 0 ) ( -2603 -606 384 ) dsi/cretebase -80 0 0 0.500000 0.500000 0 0 0
+( -2533 -481 0 ) ( -2444 -498 0 ) ( -2533 -481 384 ) dsi/cretebase -208 0 0 0.500000 0.500000 0 0 0
+}
+// brush 6
+{
+( -2425 -640 192 ) ( -2246 -905 192 ) ( -2193 -870 384 ) dsi/cretebase4 -80 0 0 0.500000 0.500000 134217728 0 0
+( -2246 -905 192 ) ( -2300 -941 192 ) ( -2352 -977 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -2300 -941 192 ) ( -2478 -676 192 ) ( -2531 -712 384 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2336 -772 240 ) ( -2389 -809 240 ) ( -2300 -941 192 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2246 -905 240 ) ( -2273 -923 240 ) ( -2336 -772 240 ) common/caulk -32 16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 7
+{
+( -2425 -640 192 ) ( -2246 -905 192 ) ( -2193 -870 384 ) dsi/cretebase4 -80 0 0 0.500000 0.500000 134217728 0 0
+( -2300 -941 192 ) ( -2478 -676 192 ) ( -2531 -712 384 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2478 -676 192 ) ( -2425 -640 192 ) ( -2372 -605 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 134217728 0 0
+( -2389 -809 240 ) ( -2336 -772 240 ) ( -2425 -640 192 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2336 -772 240 ) ( -2362 -790 240 ) ( -2425 -640 240 ) common/caulk -32 16 0 0.500000 0.500000 134217728 0 0
+}
+// brush 8
+{
+( -2425 -640 192 ) ( -2246 -905 192 ) ( -2193 -870 384 ) dsi/cretebase4 -80 0 0 0.500000 0.500000 0 0 0
+( -2246 -905 192 ) ( -2300 -941 192 ) ( -2352 -977 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -2300 -941 192 ) ( -2478 -676 192 ) ( -2531 -712 384 ) dsi/cretebase -16 64 0 0.500000 0.500000 0 0 0
+( -2513 -738 384 ) ( -2354 -631 384 ) ( -2193 -870 384 ) dsi/cretebase -32 272 0 0.500000 0.500000 0 0 0
+( -2389 -809 240 ) ( -2336 -772 240 ) ( -2283 -737 384 ) common/caulk -96 128 0 0.500000 0.500000 0 0 0
+( -2273 -923 240 ) ( -2246 -905 240 ) ( -2336 -772 240 ) common/caulk -32 16 0 0.500000 0.500000 0 0 0
+}
+// brush 9
+{
+( -2425 -640 192 ) ( -2246 -905 192 ) ( -2193 -870 384 ) dsi/cretebase4 -80 0 0 0.500000 0.500000 0 0 0
+( -2300 -941 192 ) ( -2478 -676 192 ) ( -2531 -712 384 ) dsi/cretebase -16 64 0 0.500000 0.500000 0 0 0
+( -2478 -676 192 ) ( -2425 -640 192 ) ( -2372 -605 384 ) dsi/cretebase -96 64 0 0.500000 0.500000 0 0 0
+( -2513 -738 384 ) ( -2354 -631 384 ) ( -2193 -870 384 ) dsi/cretebase -32 272 0 0.500000 0.500000 0 0 0
+( -2336 -772 240 ) ( -2389 -809 240 ) ( -2442 -844 384 ) common/caulk -96 128 0 0.500000 0.500000 0 0 0
+( -2362 -790 240 ) ( -2336 -772 240 ) ( -2425 -640 240 ) common/caulk -32 16 0 0.500000 0.500000 0 0 0
+}
+// brush 10
+{
+( -2335 -888 64 ) ( -2335 -888 0 ) ( -2300 -941 64 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2352 -977 0 ) ( -2352 -977 64 ) ( -2300 -941 128 ) dsi/cretebase -288 64 0 0.500000 0.500000 134217728 0 0
+( -2352 -977 64 ) ( -2335 -888 64 ) ( -2300 -941 128 ) dsi/cretebase -160 -240 0 0.500000 0.500000 134217728 0 0
+( -2393 -1003 64 ) ( -2379 -994 64 ) ( -2428 -951 64 ) dsi/cretebase -224 208 0 0.500000 0.500000 134217728 0 0
+}
+// brush 11
+{
+( -2443 -729 0 ) ( -2443 -729 64 ) ( -2478 -676 128 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2531 -712 64 ) ( -2531 -712 0 ) ( -2478 -676 64 ) dsi/cretebase -288 64 0 0.500000 0.500000 134217728 0 0
+( -2443 -729 64 ) ( -2531 -712 64 ) ( -2478 -676 128 ) dsi/cretebase -288 -240 0 0.500000 0.500000 134217728 0 0
+( -2535 -792 64 ) ( -2522 -782 64 ) ( -2571 -738 64 ) dsi/cretebase -224 208 0 0.500000 0.500000 134217728 0 0
+}
+// brush 12
+{
+( -2458 -1048 48 ) ( -2637 -783 48 ) ( -2637 -783 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2690 -819 48 ) ( -2512 -1085 48 ) ( -2512 -1085 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2664 -801 16 ) ( -2485 -1066 16 ) ( -2538 -1102 16 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2512 -1085 0 ) ( -2458 -1048 0 ) ( -2637 -783 0 ) dsi/cretebase -224 208 0 0.500000 0.500000 134217728 0 0
+( -2281 -1083 0 ) ( -2303 -1078 0 ) ( -2281 -1083 16 ) dsi/cretebase -144 64 0 0.500000 0.500000 134217728 0 0
+( -2607 -628 0 ) ( -2603 -606 0 ) ( -2607 -628 16 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 13
+{
+( -2458 -1048 0 ) ( -2406 -1013 0 ) ( -2584 -748 0 ) dsi/cretebase -224 208 0 0.500000 0.500000 134217728 0 0
+( -2584 -748 32 ) ( -2406 -1013 32 ) ( -2458 -1048 32 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2637 -783 48 ) ( -2458 -1048 48 ) ( -2458 -1048 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2406 -1013 48 ) ( -2584 -748 48 ) ( -2584 -748 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2281 -1083 0 ) ( -2303 -1078 0 ) ( -2281 -1083 32 ) dsi/cretebase -144 64 0 0.500000 0.500000 134217728 0 0
+( -2607 -628 0 ) ( -2603 -606 0 ) ( -2607 -628 32 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 14
+{
+( -2352 -977 48 ) ( -2531 -712 48 ) ( -2531 -712 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2584 -748 48 ) ( -2406 -1013 48 ) ( -2406 -1013 0 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+( -2531 -712 48 ) ( -2352 -977 48 ) ( -2406 -1013 48 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2406 -1013 0 ) ( -2352 -977 0 ) ( -2531 -712 0 ) dsi/cretebase -224 208 0 0.500000 0.500000 134217728 0 0
+( -2281 -1083 0 ) ( -2303 -1078 0 ) ( -2281 -1083 48 ) dsi/cretebase -144 64 0 0.500000 0.500000 134217728 0 0
+( -2607 -628 0 ) ( -2603 -606 0 ) ( -2607 -628 48 ) dsi/cretebase -16 64 0 0.500000 0.500000 134217728 0 0
+}
+// brush 15
+{
+( -2352 -977 0 ) ( -2300 -941 0 ) ( -2478 -676 0 ) dsi/cretebase -288 144 0 0.500000 0.500000 134217728 0 0
+( -2478 -676 64 ) ( -2300 -941 64 ) ( -2352 -977 64 ) dsi/cretebase4 -288 144 0 0.500000 0.500000 134217728 0 0
+( -2478 -676 64 ) ( -2531 -712 64 ) ( -2531 -712 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 134217728 0 0
+( -2531 -712 64 ) ( -2352 -977 64 ) ( -2352 -977 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 134217728 0 0
+( -2352 -977 64 ) ( -2300 -941 64 ) ( -2300 -941 0 ) dsi/cretebase -352 0 0 0.500000 0.500000 134217728 0 0
+( -2300 -941 64 ) ( -2478 -676 64 ) ( -2478 -676 0 ) dsi/cretebase -80 0 0 0.500000 0.500000 134217728 0 0
+}
+}
+// entity 62
+{
+"classname" "weapon_crylink"
+"origin" "-2509 -814 80"
+}
+// entity 63
+{
+"classname" "item_cells"
+"origin" "-2413 -944 80"
+}
+// entity 64
+{
+"origin" "-2449 -859 80"
+"classname" "item_cells"
+}
+// entity 65
+{
+"classname" "item_armor25"
+"origin" "-1920 832 48"
+}
+// entity 66
+{
+"origin" "-3136 768 48"
+"classname" "item_armor25"
+}
+// entity 67
+{
+"origin" "-3424 -1152 48"
+"classname" "item_armor25"
+}
+// entity 68
+{
+"classname" "item_strength"
+"origin" "-560 0 32"
+}
+// entity 69
+{
+"classname" "info_player_deathmatch"
+"origin" "-5504 352 32"
+"angle" "360"
+}
+// entity 70
+{
+"angle" "360"
+"origin" "-5504 -416 32"
+"classname" "info_player_deathmatch"
+}
+// entity 71
+{
+"classname" "info_player_deathmatch"
+"origin" "-5504 -160 32"
+"angle" "360"
+}
+// entity 72
+{
+"angle" "360"
+"origin" "-5504 96 32"
+"classname" "info_player_deathmatch"
+}
+// entity 73
+{
+"classname" "weapon_crylink"
+"origin" "-5504 224 32"
+}
+// entity 74
+{
+"classname" "weapon_machinegun"
+"origin" "-5504 -32 32"
+}
+// entity 75
+{
+"classname" "weapon_hagar"
+"origin" "-5504 -288 32"
+}
+// entity 76
+{
+"target" "t3"
+"classname" "turret_targettrigger"
+// brush 0
+{
+( -3128 880 592 ) ( -3248 880 592 ) ( -3248 672 592 ) common/trigger 0 32 0 0.500000 0.500000 0 7 0
+( -3248 672 672 ) ( -3248 880 672 ) ( -3128 880 672 ) common/trigger 0 32 0 0.500000 0.500000 0 7 0
+( -3248 672 624 ) ( -3128 672 624 ) ( -3128 672 592 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
+( -3128 672 624 ) ( -3128 880 624 ) ( -3128 880 592 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+( -3128 880 624 ) ( -3248 880 624 ) ( -3248 880 592 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
+( -3248 880 624 ) ( -3248 672 624 ) ( -3248 672 592 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+}
+}
+// entity 77
+{
+"target" "t3"
+"classname" "turret_targettrigger"
+// brush 0
+{
+( -1976 1024 624 ) ( -2086 848 624 ) ( -2086 848 592 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+( -1874 960 624 ) ( -1976 1024 624 ) ( -1976 1024 592 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+( -1984 784 624 ) ( -1874 960 624 ) ( -1874 960 592 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+( -2086 848 624 ) ( -1984 784 624 ) ( -1984 784 592 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+( -2086 848 672 ) ( -1976 1024 672 ) ( -1874 960 672 ) common/trigger -48 32 0 0.500000 0.500000 0 7 0
+( -1874 960 592 ) ( -1976 1024 592 ) ( -2086 848 592 ) common/trigger -48 32 0 0.500000 0.500000 0 7 0
+}
+}
+// entity 78
+{
+"target" "t3"
+"classname" "turret_targettrigger"
+// brush 0
+{
+( -3554 -1117 624 ) ( -3497 -1317 624 ) ( -3497 -1317 592 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
+( -3439 -1083 624 ) ( -3554 -1117 624 ) ( -3554 -1117 592 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
+( -3382 -1283 624 ) ( -3439 -1083 624 ) ( -3439 -1083 592 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
+( -3497 -1317 624 ) ( -3382 -1283 624 ) ( -3382 -1283 592 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
+( -3497 -1317 672 ) ( -3554 -1117 672 ) ( -3439 -1083 672 ) common/trigger -16 -16 0 0.500000 0.500000 0 7 0
+( -3439 -1083 592 ) ( -3554 -1117 592 ) ( -3497 -1317 592 ) common/trigger -16 -16 0 0.500000 0.500000 0 7 0
+}
+}
+// entity 79
+{
+"classname" "turret_targettrigger"
+"target" "t3"
+// brush 0
+{
+( -4480 1168 136 ) ( -4480 1040 136 ) ( -4480 1040 72 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+( -4416 1160 136 ) ( -4504 1160 136 ) ( -4504 1160 72 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+( -4400 1032 136 ) ( -4400 1160 136 ) ( -4400 1160 72 ) common/trigger -32 0 0 0.500000 0.500000 0 7 0
+( -4496 832 136 ) ( -4408 832 136 ) ( -4408 832 72 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+( -4496 1040 136 ) ( -4496 1168 136 ) ( -4408 1168 136 ) common/trigger -48 32 0 0.500000 0.500000 0 7 0
+( -4408 1168 72 ) ( -4496 1168 72 ) ( -4496 1040 72 ) common/trigger -48 32 0 0.500000 0.500000 0 7 0
+}
+}
+// entity 80
+{
+"origin" "-5376 1792 32"
+"classname" "info_player_team1"
+}
+// entity 81
+{
+"origin" "-5344 -1824 32"
+"classname" "info_player_team2"
+}
+// entity 82
+{
+"target" "t3"
+"classname" "turret_targettrigger"
+// brush 0
+{
+( -2944 632 0 ) ( -3032 632 0 ) ( -3032 504 0 ) common/trigger 48 48 0 0.500000 0.500000 0 7 0
+( -3040 504 136 ) ( -3040 632 136 ) ( -2952 632 136 ) common/trigger 48 48 0 0.500000 0.500000 0 7 0
+( -2976 -616 136 ) ( -2888 -616 136 ) ( -2888 -616 72 ) common/trigger 48 0 0 0.500000 0.500000 0 7 0
+( -2736 520 136 ) ( -2736 648 136 ) ( -2736 648 72 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+( -2960 624 136 ) ( -3048 624 136 ) ( -3048 624 72 ) common/trigger 48 0 0 0.500000 0.500000 0 7 0
+( -3024 632 136 ) ( -3024 504 136 ) ( -3024 504 72 ) common/trigger -48 0 0 0.500000 0.500000 0 7 0
+}
+}
+// entity 83
+{
+"target" "t9"
+"targetname" "t8"
+"origin" "-560 560 32"
+"classname" "walker_checkpoint"
+}
+// entity 84
+{
+"target" "t10"
+"targetname" "t9"
+"classname" "walker_checkpoint"
+"origin" "-1152 1152 32"
+}
+// entity 85
+{
+"targetname" "t13"
+"target" "t7"
+"origin" "-1152 -1152 32"
+"classname" "walker_checkpoint"
+}
+// entity 86
+{
+"target" "t14"
+"targetname" "t7"
+"origin" "-560 -560 32"
+"classname" "walker_checkpoint"
+}
+// entity 87
+{
+"targetname" "t14"
+"target" "t8"
+"classname" "walker_checkpoint"
+"origin" "-384 0 32"
+}
+// entity 88
+{
+"target" "t11"
+"targetname" "t10"
+"origin" "-1152 512 32"
+"classname" "walker_checkpoint"
+}
+// entity 89
+{
+"target" "t12"
+"targetname" "t11"
+"classname" "walker_checkpoint"
+"origin" "-768 0 32"
+}
+// entity 90
+{
+"target" "t13"
+"targetname" "t12"
+"origin" "-1152 -512 32"
+"classname" "walker_checkpoint"
+}
+// entity 91
+{
+"angle" "180"
+"classname" "turret_walker"
+"origin" "-1120 0 8"
+}
Copied: branches/nexuiz-2.0/data/maps/turret_test.waypoints (from rev 4862, trunk/data/maps/turret_test.waypoints)
===================================================================
--- branches/nexuiz-2.0/data/maps/turret_test.waypoints (rev 0)
+++ branches/nexuiz-2.0/data/maps/turret_test.waypoints 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,312 @@
+'-2306.0 1302.9 24.1'
+'-2306.0 1302.9 24.1'
+0
+'-2580.1 1340.2 24.1'
+'-2580.1 1340.2 24.1'
+0
+'-2834.4 1375.1 24.1'
+'-2834.4 1375.1 24.1'
+0
+'-3111.8 1413.1 24.1'
+'-3111.8 1413.1 24.1'
+0
+'-3409.1 1453.8 24.1'
+'-3409.1 1453.8 24.1'
+0
+'-3660.1 1488.2 24.1'
+'-3660.1 1488.2 24.1'
+0
+'-4177.1 -481.0 24.1'
+'-4177.1 -481.0 24.1'
+0
+'-3970.3 -571.0 24.1'
+'-3970.3 -571.0 24.1'
+0
+'-3779.8 -651.6 24.1'
+'-3779.8 -651.6 24.1'
+0
+'-3581.2 -695.1 24.1'
+'-3581.2 -695.1 24.1'
+0
+'-3374.4 -698.5 24.1'
+'-3374.4 -698.5 24.1'
+0
+'-3174.5 -734.2 24.1'
+'-3174.5 -734.2 24.1'
+0
+'-3024.0 -277.1 24.1'
+'-3024.0 -277.1 24.1'
+0
+'-2795.9 -247.8 24.1'
+'-2795.9 -247.8 24.1'
+0
+'-2580.0 -229.0 24.1'
+'-2580.0 -229.0 24.1'
+0
+'-2393.7 -186.6 56.1'
+'-2393.7 -186.6 56.1'
+0
+'-2180.7 553.3 24.1'
+'-2180.7 553.3 24.1'
+0
+'-1968.9 530.2 24.1'
+'-1968.9 530.2 24.1'
+0
+'-1770.3 472.6 24.1'
+'-1770.3 472.6 24.1'
+0
+'-1539.6 360.4 24.1'
+'-1539.6 360.4 24.1'
+0
+'-1349.9 218.9 24.1'
+'-1349.9 218.9 24.1'
+0
+'-1210.0 118.7 24.1'
+'-1210.0 118.7 24.1'
+0
+'-1039.7 -15.8 24.1'
+'-1039.7 -15.8 24.1'
+0
+'-1164.0 -111.8 24.1'
+'-1164.0 -111.8 24.1'
+0
+'-1373.4 -263.2 24.1'
+'-1373.4 -263.2 24.1'
+0
+'-1578.1 -412.5 24.1'
+'-1578.1 -412.5 24.1'
+0
+'-1846.5 -549.9 24.1'
+'-1846.5 -549.9 24.1'
+0
+'-2088.1 -614.0 24.1'
+'-2088.1 -614.0 24.1'
+0
+'-2344.3 -611.0 24.1'
+'-2344.3 -611.0 24.1'
+0
+'-2568.6 -594.2 24.1'
+'-2568.6 -594.2 24.1'
+0
+'-3105.1 217.7 24.1'
+'-3105.1 217.7 24.1'
+0
+'-2899.6 271.7 24.1'
+'-2899.6 271.7 24.1'
+0
+'-2672.5 286.2 24.1'
+'-2672.5 286.2 24.1'
+0
+'-2307.7 124.4 56.1'
+'-2307.7 124.4 56.1'
+0
+'-2284.3 324.8 24.1'
+'-2284.3 324.8 24.1'
+0
+'-2310.3 571.7 24.1'
+'-2310.3 571.7 24.1'
+0
+'-2275.3 907.5 24.1'
+'-2275.3 907.5 24.1'
+0
+'-1980.1 975.3 56.1'
+'-1980.1 975.3 56.1'
+0
+'-2070.2 994.0 24.1'
+'-2070.2 994.0 24.1'
+0
+'-2195.7 1187.4 24.1'
+'-2195.7 1187.4 24.1'
+0
+'-2224.5 1432.7 24.1'
+'-2224.5 1432.7 24.1'
+0
+'-1926.1 1636.5 24.1'
+'-1926.1 1636.5 24.1'
+0
+'-1555.7 1589.8 24.1'
+'-1555.7 1589.8 24.1'
+0
+'-1255.8 1373.8 24.1'
+'-1255.8 1373.8 24.1'
+0
+'-1078.4 937.8 24.1'
+'-1078.4 937.8 24.1'
+0
+'-987.7 506.8 24.1'
+'-987.7 506.8 24.1'
+0
+'-628.6 62.2 24.1'
+'-628.6 62.2 24.1'
+0
+'768.4 166.1 24.1'
+'768.4 166.1 24.1'
+0
+'474.8 120.8 24.1'
+'474.8 120.8 24.1'
+0
+'812.2 -212.0 24.1'
+'812.2 -212.0 24.1'
+0
+'573.5 -118.7 24.1'
+'573.5 -118.7 24.1'
+0
+'316.1 -13.6 24.1'
+'316.1 -13.6 24.1'
+0
+' 36.1 -9.3 24.1'
+' 36.1 -9.3 24.1'
+0
+'-240.0 -26.3 24.1'
+'-240.0 -26.3 24.1'
+0
+'-523.1 -110.5 24.1'
+'-523.1 -110.5 24.1'
+0
+'-742.7 -273.1 24.1'
+'-742.7 -273.1 24.1'
+0
+'-968.3 -473.4 24.1'
+'-968.3 -473.4 24.1'
+0
+'-1161.5 -695.6 24.1'
+'-1161.5 -695.6 24.1'
+0
+'-1338.0 -966.5 24.1'
+'-1338.0 -966.5 24.1'
+0
+'-1512.9 -1176.4 24.1'
+'-1512.9 -1176.4 24.1'
+0
+'-1759.7 -1379.7 24.1'
+'-1759.7 -1379.7 24.1'
+0
+'-2003.0 -1511.2 24.1'
+'-2003.0 -1511.2 24.1'
+0
+'-2272.0 -1575.4 24.1'
+'-2272.0 -1575.4 24.1'
+0
+'-2571.5 -1568.2 24.1'
+'-2571.5 -1568.2 24.1'
+0
+'-2777.6 -1466.8 24.1'
+'-2777.6 -1466.8 24.1'
+0
+'-4569.4 -430.1 24.1'
+'-4569.4 -430.1 24.1'
+0
+'-4399.4 -668.1 24.1'
+'-4399.4 -668.1 24.1'
+0
+'-4158.2 -881.3 24.1'
+'-4158.2 -881.3 24.1'
+0
+'-4003.3 -1154.8 24.1'
+'-4003.3 -1154.8 24.1'
+0
+'-5055.9 -1433.3 24.1'
+'-5055.9 -1433.3 24.1'
+0
+'-4787.4 -1663.1 24.1'
+'-4787.4 -1663.1 24.1'
+0
+'-4392.7 -1726.1 24.1'
+'-4392.7 -1726.1 24.1'
+0
+'-3998.2 -1629.2 24.1'
+'-3998.2 -1629.2 24.1'
+0
+'-3616.5 -1544.0 24.1'
+'-3616.5 -1544.0 24.1'
+0
+'-3228.7 -1395.6 24.1'
+'-3228.7 -1395.6 24.1'
+0
+'-2834.2 -1290.1 24.1'
+'-2834.2 -1290.1 24.1'
+0
+'-2659.6 -1081.2 56.1'
+'-2659.6 -1081.2 56.1'
+0
+'-3019.8 -987.4 24.1'
+'-3019.8 -987.4 24.1'
+0
+'-3079.7 -675.6 24.1'
+'-3079.7 -675.6 24.1'
+0
+'-3084.9 -285.7 24.1'
+'-3084.9 -285.7 24.1'
+0
+'-3135.4 56.7 24.1'
+'-3135.4 56.7 24.1'
+0
+'-3227.9 381.6 24.1'
+'-3227.9 381.6 24.1'
+0
+'-3291.1 781.1 616.1'
+'-3291.1 781.1 616.1'
+0
+'-3336.3 797.5 536.1'
+'-3336.3 797.5 536.1'
+0
+'-3344.0 783.7 56.1'
+'-3344.0 783.7 56.1'
+0
+'-3393.8 646.2 56.1'
+'-3393.8 646.2 56.1'
+0
+'-4994.7 1111.8 24.1'
+'-4994.7 1111.8 24.1'
+0
+'-4940.6 1412.3 24.1'
+'-4940.6 1412.3 24.1'
+0
+'-4551.3 1722.5 24.1'
+'-4551.3 1722.5 24.1'
+0
+'-4210.6 1784.9 24.1'
+'-4210.6 1784.9 24.1'
+0
+'-3799.3 1502.1 24.1'
+'-3799.3 1502.1 24.1'
+0
+'-3742.5 1170.5 24.1'
+'-3742.5 1170.5 24.1'
+0
+'-3683.9 735.4 24.1'
+'-3683.9 735.4 24.1'
+0
+'-3862.0 420.7 24.1'
+'-3862.0 420.7 24.1'
+0
+'-3932.6 262.5 24.1'
+'-3932.6 262.5 24.1'
+0
+'-4321.6 -168.5 24.1'
+'-4321.6 -168.5 24.1'
+0
+'-5012.6 -43.3 24.1'
+'-5012.6 -43.3 24.1'
+0
+'-5169.1 -880.8 24.1'
+'-5169.1 -880.8 24.1'
+0
+'-5168.3 -526.4 24.1'
+'-5168.3 -526.4 24.1'
+0
+'-4945.5 -345.7 24.1'
+'-4945.5 -345.7 24.1'
+0
+'-4637.0 -59.4 24.1'
+'-4637.0 -59.4 24.1'
+0
+'-4654.1 287.8 24.1'
+'-4654.1 287.8 24.1'
+0
+'-4805.7 489.3 24.1'
+'-4805.7 489.3 24.1'
+0
+'-5076.2 499.6 24.1'
+'-5076.2 499.6 24.1'
+0
Copied: branches/nexuiz-2.0/data/models/tagrocket.md3 (from rev 4862, trunk/data/models/tagrocket.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/tagrocket.tga (from rev 4862, trunk/data/models/tagrocket.tga)
===================================================================
(Binary files differ)
Modified: branches/nexuiz-2.0/data/models/turrets/c512.md3
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/r_fx1_1.tga (from rev 4862, trunk/data/models/turrets/r_fx1_1.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/r_fx1_2.tga (from rev 4862, trunk/data/models/turrets/r_fx1_2.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/r_fx1_3.tga (from rev 4862, trunk/data/models/turrets/r_fx1_3.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/r_fx1_4.tga (from rev 4862, trunk/data/models/turrets/r_fx1_4.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/r_fx1_5.tga (from rev 4862, trunk/data/models/turrets/r_fx1_5.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/radiant/walker.md3 (from rev 4862, trunk/data/models/turrets/radiant/walker.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_base.tga (from rev 4862, trunk/data/models/turrets/walker_base.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_base_gloss.tga (from rev 4862, trunk/data/models/turrets/walker_base_gloss.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_base_glow.tga (from rev 4862, trunk/data/models/turrets/walker_base_glow.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_base_norm.tga (from rev 4862, trunk/data/models/turrets/walker_base_norm.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_body.md3 (from rev 4862, trunk/data/models/turrets/walker_body.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_head_minigun.md3 (from rev 4862, trunk/data/models/turrets/walker_head_minigun.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_mghead.md3 (from rev 4862, trunk/data/models/turrets/walker_mghead.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_minigun.tga (from rev 4862, trunk/data/models/turrets/walker_minigun.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_props.md3 (from rev 4862, trunk/data/models/turrets/walker_props.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/walker_spawn.md3 (from rev 4862, trunk/data/models/turrets/walker_spawn.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/turrets/white.tga (from rev 4862, trunk/data/models/turrets/white.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/g_hlac.md3 (from rev 4862, trunk/data/models/weapons/g_hlac.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/g_seeker.md3 (from rev 4862, trunk/data/models/weapons/g_seeker.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/v_hlac.md3 (from rev 4862, trunk/data/models/weapons/v_hlac.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/v_seeker.md3 (from rev 4862, trunk/data/models/weapons/v_seeker.md3)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/w_hlac.zym (from rev 4862, trunk/data/models/weapons/w_hlac.zym)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/models/weapons/w_seeker.zym (from rev 4862, trunk/data/models/weapons/w_seeker.zym)
===================================================================
(Binary files differ)
Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -314,11 +314,17 @@
float WEP_PORTO = 10; float WEPBIT_PORTO = 512;
float WEP_MINSTANEX = 11; float WEPBIT_MINSTANEX = 1024;
float WEP_HOOK = 12; float WEPBIT_HOOK = 2048;
-float WEP_LAST = 12; float WEPBIT_ALL = 4095;
-float WEP_COUNT = 13;
+float WEP_HLAC = 13; float WEPBIT_HLAC = 4096;
+float WEP_SEEKER = 14; float WEPBIT_SEEKER = 8192;
+float WEP_LAST = 14; float WEPBIT_ALL = 16383;
+float WEP_COUNT = 15;
-float IT_UNLIMITED_AMMO = 1;
+float IT_UNLIMITED_WEAPON_AMMO = 1;
// when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
+float IT_UNLIMITED_SUPERWEAPONS = 2;
+// when this bit is set, using a superweapon does not throw it away. Checkpoints can give this powerup.
+float IT_UNLIMITED_AMMO = 3;
+// both of these combined
float IT_SHELLS = 256;
float IT_NAILS = 512;
float IT_ROCKETS = 1024;
Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/weaponslist.c 2008-10-24 09:45:12 UTC (rev 4863)
@@ -93,6 +93,8 @@
case WEP_PORTO: return "Port-O-Launch";
case WEP_MINSTANEX: return "MinstaNex";
case WEP_HOOK: return "Grappling Hook";
+ case WEP_HLAC: return "Heavy Laser Assault Cannon";
+ case WEP_SEEKER: return "T.A.G. Seeker";
default: return "(fix qcsrc/menu/nexuiz/weaponslist.c)";
}
}
Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -439,6 +439,7 @@
self.spectatortime = time;
self.classname = "observer";
+ self.iscreature = FALSE;
self.health = -666;
self.takedamage = DAMAGE_NO;
self.solid = SOLID_NOT;
@@ -629,6 +630,7 @@
self.iscreature = TRUE;
self.movetype = MOVETYPE_WALK;
self.solid = SOLID_SLIDEBOX;
+ self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
if(independent_players)
MAKE_INDEPENDENT_PLAYER(self);
self.flags = FL_CLIENT;
Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -314,7 +314,7 @@
{
case 99:
self.weapons |= WEPBIT_ALL;
- self.items |= IT_UNLIMITED_AMMO;
+ self.items |= IT_UNLIMITED_WEAPON_AMMO;
self.ammo_shells = g_pickup_shells_max;
self.ammo_nails = g_pickup_nails_max;
self.ammo_rockets = g_pickup_rockets_max;
Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -120,7 +120,7 @@
}
float w_getbestweapon(entity e)
-{
+{
return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, 0);
};
@@ -389,7 +389,7 @@
if(nixnex_nextchange != self.nixnex_lastchange_id) // this shall only be called once per round!
{
self.nixnex_lastchange_id = nixnex_nextchange;
- if (self.items & IT_UNLIMITED_AMMO)
+ if (self.items & IT_UNLIMITED_WEAPON_AMMO)
{
self.ammo_shells = cvar("g_pickup_shells_max");
self.ammo_nails = cvar("g_pickup_nails_max");
@@ -416,7 +416,7 @@
centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nixnex_nextweapon), "\n"));
}
- if(!(self.items & IT_UNLIMITED_AMMO) && time > self.nixnex_nextincr)
+ if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nixnex_nextincr)
{
self.ammo_shells = self.ammo_shells + cvar("g_balance_nixnex_ammoincr_shells");
self.ammo_nails = self.ammo_nails + cvar("g_balance_nixnex_ammoincr_nails");
@@ -452,5 +452,8 @@
register_weapon(WEP_PORTO, w_porto, IT_SUPERWEAPON, 0, 0, 0, "porto" , "porto", "Port-O-Launch");
register_weapon(WEP_MINSTANEX, w_minstanex, IT_CELLS, 7, 0, 10000, "minstanex", "minstanex", "MinstaNex");
register_weapon(WEP_HOOK, w_hook, IT_CELLS, 0, 0, 0, "hookgun", "hook", "Grappling Hook");
+ register_weapon(WEP_SEEKER, w_seeker, IT_ROCKETS, 8, 0, 0, "seeker", "seeker", "T.A.G. Seeker");
+ register_weapon(WEP_HLAC, w_hlac, IT_CELLS, 6, 0, 0, "hlac", "hlac", "Heavy Laser Assault Cannon");
+
register_weapons_done();
}
Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -389,11 +389,18 @@
{
if (andammo)
{
- oldself = self;
- self = cl;
- f = weapon_action(wpn, WR_CHECKAMMO1);
- f = f + weapon_action(wpn, WR_CHECKAMMO2);
- self = oldself;
+ if(cl.items & IT_UNLIMITED_WEAPON_AMMO)
+ {
+ f = 1;
+ }
+ else
+ {
+ oldself = self;
+ self = cl;
+ f = weapon_action(wpn, WR_CHECKAMMO1);
+ f = f + weapon_action(wpn, WR_CHECKAMMO2);
+ self = oldself;
+ }
if (!f)
{
if (complain)
@@ -459,6 +466,7 @@
return FALSE;
}
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
{
W_SwitchWeapon_Force(self, w_getbestweapon(self));
Modified: branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_hook.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -222,7 +222,7 @@
dv = ((self.owner.velocity - v0) * dir) * dir;
if(cvar("g_grappling_hook_tarzan") >= 2)
{
- if(self.aiment.movetype == MOVETYPE_WALK || self.aiment.movetype == MOVETYPE_TOSS)
+ if(self.aiment.movetype == MOVETYPE_WALK)
{
self.owner.velocity = self.owner.velocity - dv * 0.5;
self.aiment.velocity = self.aiment.velocity - dv * 0.5;
@@ -380,7 +380,7 @@
void GrapplingHookFrame()
{
- if(g_grappling_hook && timeoutStatus != 2)
+ if(g_grappling_hook && timeoutStatus != 2 && self.weapon != WEP_HOOK)
{
// offhand hook controls
if(self.BUTTON_HOOK)
@@ -393,11 +393,8 @@
}
else
{
- if(self.hook)
- {
- self.hook_state |= HOOK_REMOVING;
- self.hook_state (-) HOOK_WAITING_FOR_RELEASE;
- }
+ self.hook_state |= HOOK_REMOVING;
+ self.hook_state (-) HOOK_WAITING_FOR_RELEASE;
}
self.hook_state (-) HOOK_RELEASING;
Modified: branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_subs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -26,6 +26,21 @@
/*
==================
+SUB_Friction
+
+Applies some friction to self
+==================
+*/
+.float friction;
+void SUB_Friction (void)
+{
+ self.nextthink = time;
+ if(self.flags & FL_ONGROUND)
+ self.velocity = self.velocity * (1 - frametime * self.friction);
+}
+
+/*
+==================
SUB_VanishOrRemove
Makes client invisible or removes non-client
Modified: branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_triggers.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -54,9 +54,12 @@
//
if (activator.classname == "player" && self.message != "")
{
- centerprint (activator, self.message);
- if (!self.noise)
- play2(activator, "misc/talk.wav");
+ if(clienttype(activator) == CLIENTTYPE_REAL)
+ {
+ centerprint (activator, self.message);
+ if (!self.noise)
+ play2(activator, "misc/talk.wav");
+ }
}
//
@@ -174,7 +177,7 @@
{
if not(self.spawnflags & 2)
{
- if (other.classname != "player")
+ if not(other.iscreature)
return;
if(self.team)
@@ -762,7 +765,7 @@
if(self.enemy.target != "") // DETECTOR laser
{
traceline(self.origin, o, MOVE_NORMAL, self);
- if(trace_ent.classname == "player")
+ if(trace_ent.iscreature)
{
self.pusher = trace_ent;
if(!self.count)
@@ -915,11 +918,12 @@
float str;
// FIXME: Better checking for what to push and not.
- if (other.classname != "player")
+ if not(other.iscreature)
if (other.classname != "corpse")
if (other.classname != "body")
if (other.classname != "gib")
if (other.classname != "missile")
+ if (other.classname != "rocket")
if (other.classname != "casing")
if (other.classname != "grenade")
if (other.classname != "plasma")
@@ -928,7 +932,7 @@
if (other.classname != "droppedweapon")
return;
- if (other.deadflag && other.classname == "player")
+ if (other.deadflag && other.iscreature)
return;
EXACTTRIGGER_TOUCH;
@@ -962,11 +966,12 @@
float pushdeltatime;
// FIXME: Better checking for what to push and not.
- if (other.classname != "player")
+ if not(other.iscreature)
if (other.classname != "corpse")
if (other.classname != "body")
if (other.classname != "gib")
if (other.classname != "missile")
+ if (other.classname != "rocket")
if (other.classname != "casing")
if (other.classname != "grenade")
if (other.classname != "plasma")
@@ -975,7 +980,7 @@
if (other.classname != "droppedweapon")
return;
- if (other.deadflag && other.classname == "player")
+ if (other.deadflag && other.iscreature)
return;
EXACTTRIGGER_TOUCH;
@@ -998,11 +1003,12 @@
float str;
// FIXME: Better checking for what to push and not.
- if (other.classname != "player")
+ if not(other.iscreature)
if (other.classname != "corpse")
if (other.classname != "body")
if (other.classname != "gib")
if (other.classname != "missile")
+ if (other.classname != "rocket")
if (other.classname != "casing")
if (other.classname != "grenade")
if (other.classname != "plasma")
@@ -1011,7 +1017,7 @@
if (other.classname != "droppedweapon")
return;
- if (other.deadflag && other.classname == "player")
+ if (other.deadflag && other.iscreature)
return;
EXACTTRIGGER_TOUCH;
@@ -1101,6 +1107,7 @@
void monoflop_use()
{
self.nextthink = time + self.wait;
+ self.enemy = activator;
if(self.state)
return;
self.state = 1;
@@ -1112,12 +1119,14 @@
return;
self.nextthink = time + self.wait;
self.state = 1;
+ self.enemy = activator;
SUB_UseTargets();
}
void monoflop_think()
{
self.state = 0;
+ activator = self.enemy;
SUB_UseTargets();
}
@@ -1142,6 +1151,7 @@
newstate = (time < cyclestart + self.wait);
+ activator = self;
if(self.state != newstate)
SUB_UseTargets();
self.state = newstate;
Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -751,7 +751,7 @@
start_weapons = WEPBIT_ROCKET_LAUNCHER;
weapon_action(WEP_ROCKET_LAUNCHER, WR_PRECACHE);
start_ammo_rockets = 999;
- start_items |= IT_UNLIMITED_AMMO;
+ start_items |= IT_UNLIMITED_WEAPON_AMMO;
}
else if(g_nixnex)
{
@@ -787,7 +787,7 @@
start_ammo_nails = cvar("g_pickup_nails_max");
start_ammo_rockets = cvar("g_pickup_rockets_max");
start_ammo_cells = cvar("g_pickup_cells_max");
- start_items |= IT_UNLIMITED_AMMO;
+ start_items |= IT_UNLIMITED_WEAPON_AMMO;
}
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
@@ -1292,6 +1292,12 @@
objerror_builtin(s);
}
+void remove_unsafely(entity e)
+{
+ e.classname = "";
+ remove_builtin(e);
+}
+
void remove_safely(entity e)
{
make_safe_for_remove(e);
Modified: branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/mode_onslaught.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -602,6 +602,7 @@
self.isshielded = TRUE;
// spawn shield model which indicates whether this can be damaged
self.enemy = e = spawn();
+ e.classname = "onslaught_generator_shield";
e.solid = SOLID_NOT;
e.movetype = MOVETYPE_NONE;
e.effects = EF_ADDITIVE;
@@ -633,6 +634,7 @@
self.nextthink = time + 0.2;
}
+.float waslinked;
void onslaught_controlpoint_icon_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
entity oself;
@@ -679,16 +681,19 @@
// Use targets now (somebody make sure this is in the right place..)
oself = self;
self = self.owner;
- activator = self.owner;
+ activator = self;
SUB_UseTargets ();
self = oself;
+ self.owner.waslinked = self.owner.islinked;
+
remove(self);
}
};
void onslaught_controlpoint_icon_think()
{
+ entity oself;
self.nextthink = time + 0.1;
if (time > self.pain_finished + 1)
{
@@ -699,14 +704,41 @@
self.alpha = self.health / self.max_health;
// colormod flash when shot
self.colormod = '1 1 1' * (2 - bound(0, (self.pain_finished - time) / 10, 1));
+
+ if(self.owner.islinked != self.owner.waslinked)
+ {
+ // unteam the spawnpoint if needed
+ float t;
+ t = self.owner.team;
+ if(!self.owner.islinked)
+ self.owner.team = 0;
+
+ oself = self;
+ self = self.owner;
+ activator = self;
+ SUB_UseTargets ();
+ self = oself;
+
+ self.owner.team = t;
+
+ self.owner.waslinked = self.owner.islinked;
+ }
};
void onslaught_controlpoint_icon_buildthink()
{
local entity oself;
+ float a;
self.nextthink = time + 0.1;
+
+ // only do this if there is power
+ a = onslaught_controlpoint_can_be_linked(self.owner, self.owner.team);
+ if(!a)
+ return;
+
self.health = self.health + self.count;
+
if (self.health >= self.max_health)
{
self.health = self.max_health;
@@ -742,6 +774,7 @@
// so start building the captured point icon (which only captures this
// point if it successfully builds without being destroyed first)
self.goalentity = e = spawn();
+ e.classname = "onslaught_controlpoint_icon";
e.owner = self;
e.max_health = cvar("g_onslaught_cp_health");
e.health = e.max_health * 0.1;
@@ -803,6 +836,7 @@
self.isshielded = TRUE;
// spawn shield model which indicates whether this can be damaged
self.enemy = e = spawn();
+ e.classname = "onslaught_controlpoint_shield";
e.solid = SOLID_NOT;
e.movetype = MOVETYPE_NONE;
e.effects = EF_ADDITIVE;
Modified: branches/nexuiz-2.0/data/qcsrc/server/portals.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/portals.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/portals.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -239,6 +239,9 @@
return; // only handle TouchAreaGrid ones (only these can teleport)
// for some unknown reason, this also gets collisions from SV_Impact sometimes
+ if(other.classname == "grapplinghook")
+ return;
+
if(other.classname == "porto")
{
if(other.portal_id == self.portal_id)
@@ -261,12 +264,15 @@
fixedmakevectors(self.angles);
if((other.origin - self.origin) * v_forward < 0)
return;
+
+ /*
if(other.mins_x < PL_MIN_x || other.mins_y < PL_MIN_y || other.mins_z < PL_MIN_z
|| other.maxs_x > PL_MAX_x || other.maxs_y > PL_MAX_y || other.maxs_z > PL_MAX_z)
{
// can't teleport this
return;
}
+ */
if(Portal_TeleportPlayer(self, other))
if(other.classname == "porto")
Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src 2008-10-24 09:45:12 UTC (rev 4863)
@@ -10,7 +10,7 @@
../common/util.qh
//// tZork Turrets ////
-tturrets/include/turret_tturrets_early.qh
+tturrets/include/turrets_early.qh
campaign.qh
../common/campaign_common.qh
@@ -84,6 +84,8 @@
w_rocketlauncher.qc
w_porto.qc
w_hook.qc
+w_hlac.qc
+w_seeker.qc
t_items.qc
cl_weapons.qc
@@ -134,7 +136,7 @@
//// tZork Turrets ////
-tturrets/include/turret_tturrets.qh
+tturrets/include/turrets.qh
scores.qc
Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -133,7 +133,7 @@
entity SelectSpawnPoint (float anypoint);
void StartFrame (void)
{
- remove = remove_builtin; // not during spawning!
+ remove = remove_unsafely; // not during spawning!
dprint_load(); // load dprint status from cvar
Modified: branches/nexuiz-2.0/data/qcsrc/server/t_halflife.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_halflife.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_halflife.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -37,7 +37,7 @@
void func_ladder_touch()
{
- if (other.classname != "player")
+ if not(other.iscreature)
return;
EXACTTRIGGER_TOUCH;
Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -505,7 +505,7 @@
if (cvar("g_fullbrightitems"))
self.effects = self.effects | EF_FULLBRIGHT;
-
+
if(self.team)
{
self.effects = self.effects | EF_NODRAW; // marker for item team search
@@ -946,12 +946,12 @@
float target_item_func_itembitset(float a, float b)
{
- return (a - (a & (IT_UNLIMITED_AMMO | IT_STRENGTH | IT_INVINCIBLE))) | b;
+ return (a - (a & (IT_UNLIMITED_WEAPON_AMMO | IT_STRENGTH | IT_INVINCIBLE))) | b;
}
float target_item_func_itemand(float a, float b)
{
- return (a - (a & (IT_UNLIMITED_AMMO | IT_STRENGTH | IT_INVINCIBLE))) | (a & b);
+ return (a - (a & (IT_UNLIMITED_WEAPON_AMMO | IT_STRENGTH | IT_INVINCIBLE))) | (a & b);
}
float target_item_func_or(float a, float b)
@@ -1091,7 +1091,7 @@
activator.strength_finished = 0;
if not(activator.items & IT_INVINCIBLE)
activator.invincible_finished = 0;
-
+
if(activator.health > h0)
activator.pauserothealth_finished = max(activator.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
else if(activator.health < h0)
@@ -1118,7 +1118,7 @@
self.strength_finished = cvar("g_balance_powerup_strength_time");
if(!self.invincible_finished)
self.invincible_finished = cvar("g_balance_powerup_invincible_time");
-
+
precache_sound("misc/itempickup.wav");
precache_sound("misc/itempickup.wav");
precache_sound("misc/itempickup.wav");
@@ -1131,9 +1131,11 @@
n = tokenize_sane(self.netname);
for(i = 0; i < n; ++i)
{
- if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO;
- if(argv(i) == "strength") self.items |= IT_STRENGTH;
- if(argv(i) == "invincible") self.items |= IT_INVINCIBLE;
+ if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO;
+ if(argv(i) == "unlimited_weapon_ammo") self.items |= IT_UNLIMITED_WEAPON_AMMO;
+ if(argv(i) == "unlimited_superweapons") self.items |= IT_UNLIMITED_SUPERWEAPONS;
+ if(argv(i) == "strength") self.items |= IT_STRENGTH;
+ if(argv(i) == "invincible") self.items |= IT_INVINCIBLE;
for(j = WEP_FIRST; j <= WEP_LAST; ++j)
{
e = get_weaponinfo(j);
Modified: branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_jumppads.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -104,11 +104,12 @@
void trigger_push_touch()
{
// FIXME: add a .float for whether an entity should be tossed by jumppads
- if (other.classname != "player")
+ if (!other.iscreature)
if (other.classname != "corpse")
if (other.classname != "body")
if (other.classname != "gib")
if (other.classname != "missile")
+ if (other.classname != "rocket")
if (other.classname != "casing")
if (other.classname != "grenade")
if (other.classname != "plasma")
@@ -117,7 +118,7 @@
if (other.classname != "droppedweapon")
return;
- if (other.deadflag && other.classname == "player")
+ if (other.deadflag && other.iscreature)
return;
EXACTTRIGGER_TOUCH;
@@ -151,12 +152,12 @@
other.(jumppadsused[mod(other.jumppadcount, NUM_JUMPPADSUSED)]) = self;
other.jumppadcount = other.jumppadcount + 1;
}
+
+ if(self.message)
+ centerprint(other, self.message);
}
else
other.jumppadcount = TRUE;
-
- if(self.message)
- centerprint(other, self.message);
}
if(self.enemy.target)
Modified: branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_plats.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -77,7 +77,7 @@
void plat_center_touch()
{
- if (other.classname != "player")
+ if not(other.iscreature)
return;
if (other.health <= 0)
@@ -92,7 +92,7 @@
void plat_outside_touch()
{
- if (other.classname != "player")
+ if not(other.iscreature)
return;
if (other.health <= 0)
@@ -505,7 +505,7 @@
// }
if (!other)
return;
- if (other.classname != "player")
+ if not(other.iscreature)
return;
if(other.velocity * self.movedir < 0)
return;
@@ -771,6 +771,7 @@
void door_trigger_touch()
{
if (other.health < 1)
+ if not(other.iscreature && other.deadflag == DEAD_NO)
return;
if (time < self.attack_finished_single)
@@ -809,7 +810,7 @@
*/
void door_touch()
{
- if (other.classname != "player")
+ if(other.classname != "player")
return;
if (self.owner.attack_finished_single > time)
return;
@@ -1207,7 +1208,7 @@
*/
void secret_touch()
{
- if (activator.classname != "player")
+ if not(other.iscreature)
return;
if (self.attack_finished_single > time)
return;
Modified: branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/target_spawn.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -9,7 +9,19 @@
.void() target_spawn_spawnfunc;
float target_spawn_spawnfunc_field;
.entity target_spawn_activator;
+.float target_spawn_id;
+float target_spawn_count;
+void target_spawn_helper_setmodel()
+{
+ setmodel(self, self.model);
+}
+
+void target_spawn_helper_setsize()
+{
+ setsize(self, self.mins, self.maxs);
+}
+
void target_spawn_useon(entity e)
{
float i, n, valuefieldpos;
@@ -20,6 +32,7 @@
entity oldactivator;
n = tokenize_sane(self.message);
+ self.target_spawn_activator = activator;
for(i = 0; i < n-1; i += 2)
{
@@ -169,13 +182,15 @@
}
if(key == "$")
{
+ if(substring(value, 0, 1) == "_")
+ value = strcat("target_spawn_helper", value);
putentityfieldstring(target_spawn_spawnfunc_field, e, value);
oldself = self;
oldactivator = activator;
self = e;
- activator = self.target_spawn_activator;
+ activator = oldself.target_spawn_activator;
self.target_spawn_spawnfunc();
@@ -191,6 +206,25 @@
}
}
+float target_spawn_cancreate()
+{
+ float c;
+ entity e;
+
+ c = self.count;
+ if(c == 0) // no limit?
+ return 1;
+
+ ++c; // increase count to not include MYSELF
+ for(e = world; (e = findfloat(e, target_spawn_id, self.target_spawn_id)); --c)
+ ;
+
+ // if c now is 0, we have AT LEAST the given count (maybe more), so don't spawn any more
+ if(c == 0)
+ return 0;
+ return 1;
+}
+
void target_spawn_use()
{
entity e;
@@ -198,8 +232,11 @@
if(self.target == "")
{
// spawn new entity
+ if(!target_spawn_cancreate())
+ return;
e = spawn();
target_spawn_useon(e);
+ e.target_spawn_id = self.target_spawn_id;
}
else
{
@@ -216,7 +253,7 @@
target_spawn_use();
}
-void spawnfunc_target_spawn()
+void initialize_field_db()
{
if(!target_spawn_initialized)
{
@@ -242,7 +279,56 @@
target_spawn_initialized = 1;
}
+}
+
+void spawnfunc_target_spawn()
+{
+ initialize_field_db();
self.use = target_spawn_use;
self.message = strzone(strreplace("'", "\"", self.message));
+ self.target_spawn_id = ++target_spawn_count;
InitializeEntity(self, target_spawn_spawnfirst, INITPRIO_LAST);
}
+
+
+void trigger_relay_if_use()
+{
+ float n;
+ var .string fld;
+ entity e;
+ n = self.count;
+
+ // TODO make this generic AND faster than nextent()ing through all, if somehow possible
+ if(self.netname == "targetname")
+ fld = targetname;
+ else if(self.netname == "netname")
+ fld = netname;
+ else if(self.netname == "target")
+ fld = target;
+ else if(self.netname == "classname")
+ fld = classname;
+ else
+ {
+ objerror("invalid field specified for trigger_relay_if");
+ return;
+ }
+
+ for(e = world; (e = find(e, fld, self.message)) && (n > 0); --n)
+ ;
+
+ if(self.spawnflags & 1) // MORE THAN count valid targets
+ {
+ if(n)
+ SUB_UseTargets();
+ }
+ else // AT MOST count valid targets
+ {
+ if(!n)
+ SUB_UseTargets();
+ }
+}
+
+void spawnfunc_trigger_relay_if()
+{
+ self.use = trigger_relay_if_use;
+};
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets.qh 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets.qh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,31 +0,0 @@
-#ifdef TTURRETS_ENABLED
-
-// Include section.
-#include "../system/turret_system_misc.qc" /// Assorted junk & jewls
-#include "../system/turret_system_main.qc" /// And routines
-#include "../system/turret_system_aimprocs.qc" /// Aiming realted stuff
-#include "../system/turret_system_scoreprocs.qc" /// Target calssification
-#include "../system/turret_system_damage.qc" /// Outch, they are hurting me! what should i do?
-
-#include "../units/turret_unit_common.qc" /// Some "make life easyer" funcs.
-
-// Non combat units
-#include "../units/turret_unit_fusionreactor.qc" /// Supply unites that need it with power
-// #include "../units/turret_unit_targetcomputer.qc" /// Optimized target selection for multiple units
-#include "../units/turret_unit_targettrigger.qc" /// Hit me!
-
-// Combat units
-#include "../units/turret_unit_plasma.qc" /// Basic energy cannon
-#include "../units/turret_unit_mlrs.qc" /// Basic multibay RL
-#include "../units/turret_unit_hellion.qc" /// Seeking missiles MLRS
-#include "../units/turret_unit_flac.qc" /// anti missile turret
-#include "../units/turret_unit_phaser.qc" /// ZzzapT
-//#include "../units/turret_unit_gauss.qc" /// Railgun
-#include "../units/turret_unit_hk.qc" /// Hunter killers
-#include "../units/turret_unit_machinegun.qc" /// whacka
-//#include "../units/turret_unit_minigun.qc" /// whacka whacka
-#include "../units/turret_unit_tessla.qc" /// Chain lightning capabale turret
-//#include "../units/turret_unit_walker.qc"
-//#include "../units/turret_unit_howitzer.qc"
-
-#endif // TTURRETS_ENABLED
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets_early.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets_early.qh 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turret_tturrets_early.qh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,466 +0,0 @@
-// Comment out below to skip turrets
-#define TTURRETS_ENABLED
-
-#ifdef TTURRETS_ENABLED
-
-#message "with tZork turrets rc2"
-
-vector real_origin(entity ent);
-
-/// target selection flags
-.float target_select_flags;
-.float target_validate_flags;
-/// Dont select a target on its own.
-#define TFL_TARGETSELECT_NO 1024
-/// Need line of sight
-#define TFL_TARGETSELECT_LOS 2
-/// Players are valid targets
-#define TFL_TARGETSELECT_PLAYERS 4
-/// Missiles are valid targets
-#define TFL_TARGETSELECT_MISSILES 8
-/// Responds to turret_trigger_target events
-#define TFL_TARGETSELECT_TRIGGERTARGET 16
-/// Angular limitations of turret head limits target selection
-#define TFL_TARGETSELECT_ANGLELIMITS 32
-/// Range limits apply in targetselection
-#define TFL_TARGETSELECT_RANGELIMTS 64
-/// DOnt select targets with a .team matching its own
-#define TFL_TARGETSELECT_TEAMCHECK 4096
-/// Cant select targets on its own. needs to be triggerd or slaved.
-#define TFL_TARGETSELECT_NOBUILTIN 256
-/// TFL_TARGETSELECT_TEAMCHECK is inverted (selects only mebers of own .team)
-#define TFL_TARGETSELECT_OWNTEAM 2048
-
-/// aim flags
-.float aim_flags;
-/// Dont aim.
-#define TFL_AIM_NO 512
-/// Go for ground, not direct hit
-#define TFL_AIM_GROUND 2
-/// Go for ground, not direct hit if target is on ground too
-#define TFL_AIM_GROUND2 1024
-/// Use balistic aim (not implemented)
-#define TFL_AIM_BALISTIC 4
-/// Try to predict target movement
-#define TFL_AIM_LEAD 8
-/// Compensate for shot traveltime when lead
-#define TFL_AIM_SHOTTIMECOMPENSATE 16
-/// Aim slightly in front of target
-#define TFL_AIM_INFRONT 32
-/// Aim slightly behind target
-#define TFL_AIM_BEHIND 64
-/// blend real and predicted z positions. (fake bounce prediction)
-#define TFL_AIM_ZEASE 128
-/// Just poitn at target's current location
-#define TFL_AIM_SIMPLE 256
-
-/// track (turn and pitch head) flags
-.float track_flags;
-/// Dont move head
-#define TFL_TRACK_NO 2
-/// Pitch the head
-#define TFL_TRACK_PITCH 4
-/// Rotate the head
-#define TFL_TRACK_ROT 8
-
-/// How tracking is preformed
-.float track_type;
-/// Hard angle increments. Ugly for fast turning, best accuracy.
-#define TFL_TRACKTYPE_STEPMOTOR 1
-/// Smoth absolute movement. Looks ok, fair accuracy.
-#define TFL_TRACKTYPE_FLUIDPRECISE 2
-/// Simulated inertia. "Wobbly mode" Looks kool, can mean terrible accuracy depending on how the feilds below are set
-#define TFL_TRACKTYPE_FLUIDINERTIA 3
-/// TFL_TRACKTYPE_FLUIDINERTIA: pitch multiplier
-.float track_accel_pitch;
-/// TFL_TRACKTYPE_FLUIDINERTIA: rotation multiplier
-.float track_accel_rot;
-/// TFL_TRACKTYPE_FLUIDINERTIA: Blendrate with old rotation (inertia simulation) 1 = only old, 0 = only new
-.float track_blendrate;
-
-/// How prefire check is preformed
-.float firecheck_flags;
-/// Dont do any chekcs
-#define TFL_FIRECHECK_NO 8192
-/// Dont kill the world
-#define TFL_FIRECHECK_WORLD 2
-/// Dont kill the dead
-#define TFL_FIRECHECK_DEAD 4
-/// Range limits apply
-#define TFL_FIRECHECK_DISTANCES 8
-/// Line Of Sight needs to be clear
-#define TFL_FIRECHECK_LOS 16
-/// Consider distance inpactpoint<->aimspot
-#define TFL_FIRECHECK_AIMDIST 32
-/// Consider enemy origin<->impactpoint
-#define TFL_FIRECHECK_REALDIST 64
-/// Consider angular diff head<->aimspot
-#define TFL_FIRECHECK_ANGLEDIST 128
-/// (re)consider target.team<->self.team
-#define TFL_FIRECHECK_TEAMCECK 256
-/// Try to avoid friendly fire
-#define TFL_FIRECHECK_AFF 512
-/// Own .ammo needs to be >= then own .shot_dmg
-#define TFL_FIRECHECK_OWM_AMMO 1024
-/// Others ammo need to be < others .ammo_max
-#define TFL_FIRECHECK_OTHER_AMMO 2048
-/// Check own .attack_finished_single vs time
-#define TFL_FIRECHECK_REFIRE 4096
-
-/// How shooting is done
-.float shoot_flags;
-/// Dont shoot
-#define TFL_SHOOT_NO 64
-/// Fire in vollys (partial implementation through .shot_volly)
-#define TFL_SHOOT_VOLLY 2
-/// Always do a full volly, even if target is lost or dead. (not implemented)
-#define TFL_SHOOT_VOLLYALWAYS 4
-/// Loop though all valid tarters, and hit them.
-#define TFL_SHOOT_HITALLVALID 8
-/// Fiering makes unit loose target (after volly is done, if in volly mode)
-#define TFL_SHOOT_CLEARTARGET 16
-///Custom shooting;
-#define TFL_SHOOT_CUSTOM 32
-
-/// Information aboute the units capabilities
-.float turrcaps_flags;
-/// No kown capabilities
-#define TFL_TURRCAPS_NONE 0
-/// Capable of sniping
-#define TFL_TURRCAPS_SNIPER 2
-/// Capable of splasdamage
-#define TFL_TURRCAPS_RADIUSDMG 4
-/// Has one or more cannons with zero shot traveltime
-#define TFL_TURRCAPS_HITSCAN 8
-/// More then one (type of) gun
-#define TFL_TURRCAPS_MULTIGUN 16
-/// Carries at least one guided weapon
-#define TFL_TURRCAPS_GUIDED 32
-/// At least one gun fiers slow projectiles
-#define TFL_TURRCAPS_SLOWPROJ 64
-/// At least one gun fiers medium speed projectiles
-#define TFL_TURRCAPS_MEDPROJ 128
-/// At least one gun fiers fast projectiles
-#define TFL_TURRCAPS_FASTPROJ 256
-/// At least one gun capable of damaging players
-#define TFL_TURRCAPS_PLAYERKILL 512
-/// At least one gun that can shoot town missiles
-#define TFL_TURRCAPS_MISSILEKILL 1024
-/// Has support capabilities. powerplants and sutch.
-#define TFL_TURRCAPS_SUPPORT 2048
-/// Proveides at least one type of ammmo
-#define TFL_TURRCAPS_AMMOSOURCE 4096
-/// Can recive targets from external sources
-#define TFL_TURRCAPS_RECIVETARGETS 8192
-/// Capable of self-transport
-#define TFL_TURRCAPS_MOVE 16384
-/// Will roam arround even if not chasing anyting
-#define TFL_TURRCAPS_ROAM 32768
-#define TFL_TURRCAPS_LINKED 65536
-
-/// Ammo types needed and/or provided
-.float ammo_flags;
-/// Has and needs no ammo
-#define TFL_AMMO_NONE 64
-/// Uses power
-#define TFL_AMMO_ENERGY 2
-/// Uses bullets
-#define TFL_AMMO_BULLETS 4
-/// Uses explosives
-#define TFL_AMMO_ROCKETS 8
-/// Regenerates ammo on its own
-#define TFL_AMMO_RECHARGE 16
-/// Can recive ammo from others
-#define TFL_AMMO_RECIVE 32
-
-/// How incomming damage is handeld
-.float damage_flags;
-/// Cant be hurt
-#define TFL_DMG_NO 256
-/// Can be damaged
-#define TFL_DMG_YES 2
-/// Can be damaged by teammates
-#define TFL_DMG_TAKEFROMTEAM 4
-/// Traget attackers
-#define TFL_DMG_RETALIATE 8
-/// Target attackers, even is on own team
-#define TFL_DMG_RETALIATEONTEAM 16
-/// Loses target when damaged
-#define TFL_DMG_TARGETLOSS 32
-/// Reciving damage trows off aim
-#define TFL_DMG_AIMSHAKE 64
-/// Reciving damage slaps the head arround
-#define TFL_DMG_HEADSHAKE 128
-
-// Spawnflags
-/// Spawn in teambased modes
-#define TFL_SPAWN_TEAM 2
-/// Spawn in FFA modes
-#define TFL_SPAWN_FFA 4
-/// Respawn after death
-#define TFL_SPAWN_RESPAWN 8
-
-/*
-* Fields commnly used by turrets
-*/
-/// Turrets internal ai speed
-.float ticrate;
-/// Where to point the head when no target
-.vector idle_aim;
-/// Top part of turret
-.entity tur_head;
-/// Start/respawn health
-.float tur_health;
-/// Defend this entity (or ratehr this entitys position)
-.entity tur_defend;
-/// on/off toggle.
-.float tur_active;
-/// Aim from this point,
-.vector tur_aimorg;
-/// and shoot from here. (could be non constant, think MLRS)
-.vector tur_shotorg;
-/// Aim at this spot
-.vector tur_aimpos;
-/// Predicted time the round will impact
-.float tur_impacttime;
-/// Predicted place the round will impact
-.vector tur_impactpoint;
-/// What entity the aimtrace hit, if any.
-.entity tur_impactent;
-/// Distance to enemy
-.float tur_dist_enemy;
-/// Distance impact<->aim
-.float tur_dist_toaimpos;
-/// Decresment counter form .shot_volly to 0.
-.float volly_counter;
-
-/*
-* Projectile/missile. its up to the individual turret implementation to
-** deal the damage, blow upp the missile or whatever.
-*/
-/// Track then refireing is possible
-//.float attack_finished; = attack_finished_single
-/// Shoot this often
-.float shot_refire;
-/// Shots travel this fast, when appliable
-.float shot_speed;
-/// Inaccuracy
-.float shot_spread;
-/// Estimated (core) damage of projectiles. also reduce on ammo with this amount when fiering
-.float shot_dmg;
-/// If radius dmg, this is how big that radius is.
-.float shot_radius;
-/// Max force exserted by round impact
-.float shot_force;
-/// < 1 = shoot # times at target (if possible)
-.float shot_volly;
-/// Refire after a compleated or borken volly.
-.float shot_volly_refire;
-
-/// Consider targets within this range
-.float target_range;
-/// Dont consider targets closer then
-.float target_range_min;
-/// Engage fire routine on targets within
-.float target_range_fire;
-/// Targets closer to this are prefered
-.float target_range_optimal;
-
-/*
-* The standard targetselection tries to select a target based on
-* range, angle offset, target type, "is old target"
-* Thise biases will allow score scaling to (dis)favor diffrent targets
-*/
-/// (dis)Favor best range this mutch
-.float target_select_rangebias;
-/// (dis)Favor targeting my old enemy this mutch
-.float target_select_samebias;
-/// (dis)Favor targeting the enemy closest to my guns current angle this mutch
-.float target_select_anglebias;
-/// (dis)Favor Missiles? (-1 to diable targeting compleatly)
-.float target_select_missilebias;
-/// (dis)Favot living players (-1 to diable targeting compleatly)
-.float target_select_playerbias;
-
-/*
-* Aim refers to real aiming, not gun pos (thats done by track)
-*/
-/// Maximum offset between impact and aim spot to fire
-.float aim_firetolerance_dist;
-/// Maximum angular offset between head and aimspot to fire
-//.float aim_firetolerance_angle;
-/// How fast can i rotate/pitch (per second in stepmotor mode, base force in smooth modes)
-.float aim_speed;
-/// cant aim higher/lower then this
-.float aim_maxpitch;
-/// I cant rotate more then this
-.float aim_maxrot;
-
-// Ammo/power. keeping dmg and ammo on a one to one ratio is preferable (for rating)
-/// Staring & current ammo
-.float ammo;
-/// Regenerate this mutch ammo (per second)
-.float ammo_recharge;
-/// Max amount of ammo i can hold
-.float ammo_max;
-
-
-// Uncomment below to enable various debug output.
-//#define TURRET_DEBUG
-//#define TURRET_DEBUG_TARGETVALIDATE
-//#define TURRET_DEBUG_TARGETSELECT
-
-#ifdef TURRET_DEBUG
-.float tur_dbg_dmg_t_h; // Total dmg that hit something (can be more then tur_dbg_dmg_t_f since it should count radius dmg.
-.float tur_dbg_dmg_t_f; // Total damage spent
-.float tur_dbg_start; // When did i go online?
-.float tur_dbg_tmr1; // timer for random use
-.float tur_dbg_tmr2; // timer for random use
-.float tur_dbg_tmr3; // timer for random use
-.vector tur_dbg_rvec; // Random vector, mainly for coloruing stuff'
-#endif
-
-// System main's
-/// Main AI loop
-void turret_think();
-/// Prefire checks and sutch
-void turret_fire();
-
-// Callbacks
-/// implements the actual fiering
-.void() turret_firefunc;
-/// prefire checks go here. return 1 to go bang, 0 not to.
-.float() turret_firecheckfunc;
-// Execure BEFORE main ai loop. return 0 to cancel any following proccessing.
-//.float() turret_prethink;
-/// Execure AFTER main AI loop UNLESS turret_prethink returnd 0
-.void() turret_postthink;
-
-/// Add a target
-.float(entity e_target,entity e_sender) turret_addtarget;
-
-//.float call_diehook;
-//.float call_respwnhook;
-.void() turret_diehook;
-.void() turret_respawnhook;
-
-/*
-#define TEH_THINK 2
-#define TEH_DAMAGE 4
-#define TEH_DIE 8
-#define TEH_RESPAWN 16
-#define TEH_TRACK 32
-#define TEH_AIM 64
-#define TEH_SELECT 128
-.float(float event_id) turret_eventhook;
-*/
-
-/*
-* Some turrets need other aimsystems then other.
-* This should return the place to aim at, not acctualy turn or
-* pitch anyting.
-*
-* use turret_stdproc_aim* or Make your own.
-* Make sure you update tur_enemy_dist and tur_enemy_adist
-* with the apropriate info, if you do.
-
-removed.
-*/
-/// function used to aim, usualy turret_stdproc_aim_generic
-//.vector() turret_aim;
-
-/*
-* This is where the acctual turret turning should take place
-* Use turret_stdproc_track or make your own.
-wkacked to save mem.
-*/
-// Function used to turn and pitch the .tur_head usualy turret_stdproc_track
-//.void() turret_track;
-
-/*
-* Target selection, preferably but not nessesarely
-* return a normalized result.
-*/
-/// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic
-.float(entity e_turret, entity e_target) turret_score_target;
-
-/*
-* Damage, death and respawn.
-*/
-//void turret_gibs_precash();
-// generalized so save mem (on fields)
-// Function to handle incomming damage. usualy turret_stdproc_damage
-//.void(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce) turret_damagefunc;
-// Function to handle the event of death. usualy turret_stdproc_die
-//.void() turret_diefunc;
-// Function that handles rebirth. usualy turret_stdproc_respawn
-//.void() turret_spawnfunc;
-
-/*
-* Stuff to plug into requierd but unused callbacks.
-*/
-/// Always return 1
-float turret_stdproc_true();
-/// Always return 0
-float turret_stdproc_false();
-/// Always return nothing at all
-void turret_stdproc_nothing();
-
-/*
-* Target selection
-*/
-/// "closeer is beter" selection
-float turret_stdproc_targetscore_close(entity e_turret, entity e_target);
-/// "further is beter" selection
-float turret_stdproc_targetscore_far(entity e_turret, entity e_target);
-/// only target_range_optimal
-float turret_stdproc_targetscore_optimal(entity e_turret, entity e_target);
-/// defendpos
-float turret_stdproc_targetscore_defend(entity e_turret, entity e_target);
-/// Generic fairly smart bias-aware target selection.
-float turret_stdproc_targetscore_generic(entity e_turret, entity e_target);
-/// Experimental supportunits targetselector
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target);
-
-/*
-* Aim functions
-*/
-/// Generic aimer guided by self.aim_flags
-vector turret_stdproc_aim_generic()
-// Straight line, current location
-//vector turret_stdproc_aim_simple()
-
-/*
-* Turret turning & pitch
-*/
-/// Tries to line up the turret head with the aimpos
-void turret_stdproc_track();
-
-/// Generic damage handeling. blows up the turret when health <= 0
-void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce);
-/// Spawns a explotion, does some damage & trows bits arround.
-void turret_stdproc_die();
-/// reassembles the turret.
-void turret_stdproc_respawn();
-
-/// Evaluate target validity
-float turret_validate_target(entity e_turret,entity e_target,float validate_flags);
-/// Turret Head Angle Diff Vector. updated by a sucsessfull call to turret_validate_target
-vector tvt_thadv;
-/// Turret Angle Diff Vector. updated by a sucsessfull call to turret_validate_target
-vector tvt_tadv;
-/// Turret Head Angle Diff Float. updated by a sucsessfull call to turret_validate_target
-float tvt_thadf;
-/// Turret Angle Diff Float. updated by a sucsessfull call to turret_validate_target
-float tvt_tadf;
-/// Distance. updated by a sucsessfull call to turret_validate_target
-float tvt_dist;
-
-/// updates aim org, shot org, shot dir and enemy org for selected turret
-void turret_do_updates(entity e_turret);
-.vector tur_aimorg_updated;
-.vector tur_shotorg_updated;
-.vector tur_shotdir_updated;
-
-void turrets_precash();
-#endif // TTURRETS_ENABLED
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh (from rev 4862, trunk/data/qcsrc/server/tturrets/include/turrets.qh)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets.qh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,28 @@
+#ifdef TTURRETS_ENABLED
+
+// Include section.
+#include "../system/system_misc.qc" /// Assorted junk & jewls
+#include "../system/system_main.qc" /// And routines
+#include "../system/system_aimprocs.qc" /// Aiming realted stuff
+#include "../system/system_scoreprocs.qc" /// Target calssification
+#include "../system/system_damage.qc" /// Outch, they are hurting me! what should i do?
+
+#include "../units/unit_common.qc" /// Some "make life easyer" funcs.
+
+// Non combat units
+#include "../units/unit_fusionreactor.qc" /// Supply unites that need it with power
+#include "../units/unit_targettrigger.qc" /// Hit me!
+
+// Combat units
+#include "../units/unit_plasma.qc" /// Basic energy cannon
+#include "../units/unit_mlrs.qc" /// Basic multibay RL
+#include "../units/unit_hellion.qc" /// Seeking missiles MLRS
+#include "../units/unit_flac.qc" /// anti missile turret
+#include "../units/unit_phaser.qc" /// ZzzapT
+#include "../units/unit_hk.qc" /// Hunter killers
+#include "../units/unit_machinegun.qc" /// whacka
+#include "../units/unit_tessla.qc" /// Chain lightning capabale turret
+#include "../units/unit_walker.qc"
+
+
+#endif // TTURRETS_ENABLED
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh (from rev 4862, trunk/data/qcsrc/server/tturrets/include/turrets_early.qh)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,472 @@
+// Comment out below to skip turrets
+#define TTURRETS_ENABLED
+
+#ifdef TTURRETS_ENABLED
+
+#message "with tZork turrets rc2"
+
+vector real_origin(entity ent);
+
+/// target selection flags
+.float target_select_flags;
+.float target_validate_flags;
+/// Dont select a target on its own.
+#define TFL_TARGETSELECT_NO 1024
+/// Need line of sight
+#define TFL_TARGETSELECT_LOS 2
+/// Players are valid targets
+#define TFL_TARGETSELECT_PLAYERS 4
+/// Missiles are valid targets
+#define TFL_TARGETSELECT_MISSILES 8
+/// Responds to turret_trigger_target events
+#define TFL_TARGETSELECT_TRIGGERTARGET 16
+/// Angular limitations of turret head limits target selection
+#define TFL_TARGETSELECT_ANGLELIMITS 32
+/// Range limits apply in targetselection
+#define TFL_TARGETSELECT_RANGELIMTS 64
+/// DOnt select targets with a .team matching its own
+#define TFL_TARGETSELECT_TEAMCHECK 4096
+/// Cant select targets on its own. needs to be triggerd or slaved.
+#define TFL_TARGETSELECT_NOBUILTIN 256
+/// TFL_TARGETSELECT_TEAMCHECK is inverted (selects only mebers of own .team)
+#define TFL_TARGETSELECT_OWNTEAM 2048
+/// Turrets aren't valid targets
+#define TFL_TARGETSELECT_NOTURRETS 128
+
+/// aim flags
+.float aim_flags;
+/// Dont aim.
+#define TFL_AIM_NO 1
+/// Go for ground, not direct hit
+#define TFL_AIM_GROUND 2
+/// Go for ground, not direct hit if target is on ground too
+#define TFL_AIM_GROUND2 4
+/// Use balistic aim (not implemented)
+#define TFL_AIM_BALISTIC 8
+/// Try to predict target movement (does not account for gravity)
+#define TFL_AIM_LEAD 16
+/// Compensate for shot traveltime when lead
+#define TFL_AIM_SHOTTIMECOMPENSATE 32
+/// Aim slightly in front of target
+#define TFL_AIM_INFRONT 64
+/// Aim slightly behind target
+#define TFL_AIM_BEHIND 128
+/// blend real and predicted z positions. (fake bounce prediction)
+#define TFL_AIM_ZEASE 256
+/// Try to do real prediction of targets z pos at impact.
+//#define TFL_AIM_ZPREDICT 256
+/// Just poitn at target's current location
+#define TFL_AIM_SIMPLE 512
+
+/// track (turn and pitch head) flags
+.float track_flags;
+/// Dont move head
+#define TFL_TRACK_NO 2
+/// Pitch the head
+#define TFL_TRACK_PITCH 4
+/// Rotate the head
+#define TFL_TRACK_ROT 8
+
+/// How tracking is preformed
+.float track_type;
+/// Hard angle increments. Ugly for fast turning, best accuracy.
+#define TFL_TRACKTYPE_STEPMOTOR 1
+/// Smoth absolute movement. Looks ok, fair accuracy.
+#define TFL_TRACKTYPE_FLUIDPRECISE 2
+/// Simulated inertia. "Wobbly mode" Looks kool, can mean terrible accuracy depending on how the feilds below are set
+#define TFL_TRACKTYPE_FLUIDINERTIA 3
+/// TFL_TRACKTYPE_FLUIDINERTIA: pitch multiplier
+.float track_accel_pitch;
+/// TFL_TRACKTYPE_FLUIDINERTIA: rotation multiplier
+.float track_accel_rot;
+/// TFL_TRACKTYPE_FLUIDINERTIA: Blendrate with old rotation (inertia simulation) 1 = only old, 0 = only new
+.float track_blendrate;
+
+/// How prefire check is preformed
+.float firecheck_flags;
+/// Dont do any chekcs
+#define TFL_FIRECHECK_NO 8192
+/// Dont kill the world
+#define TFL_FIRECHECK_WORLD 2
+/// Dont kill the dead
+#define TFL_FIRECHECK_DEAD 4
+/// Range limits apply
+#define TFL_FIRECHECK_DISTANCES 8
+/// Line Of Sight needs to be clear
+#define TFL_FIRECHECK_LOS 16
+/// Consider distance inpactpoint<->aimspot
+#define TFL_FIRECHECK_AIMDIST 32
+/// Consider enemy origin<->impactpoint
+#define TFL_FIRECHECK_REALDIST 64
+/// Consider angular diff head<->aimspot
+#define TFL_FIRECHECK_ANGLEDIST 128
+/// (re)consider target.team<->self.team
+#define TFL_FIRECHECK_TEAMCECK 256
+/// Try to avoid friendly fire
+#define TFL_FIRECHECK_AFF 512
+/// Own .ammo needs to be >= then own .shot_dmg
+#define TFL_FIRECHECK_OWM_AMMO 1024
+/// Others ammo need to be < others .ammo_max
+#define TFL_FIRECHECK_OTHER_AMMO 2048
+/// Check own .attack_finished_single vs time
+#define TFL_FIRECHECK_REFIRE 4096
+
+/// How shooting is done
+.float shoot_flags;
+/// Dont shoot
+#define TFL_SHOOT_NO 64
+/// Fire in vollys (partial implementation through .shot_volly)
+#define TFL_SHOOT_VOLLY 2
+/// Always do a full volly, even if target is lost or dead. (not implemented)
+#define TFL_SHOOT_VOLLYALWAYS 4
+/// Loop though all valid tarters, and hit them.
+#define TFL_SHOOT_HITALLVALID 8
+/// Fiering makes unit loose target (after volly is done, if in volly mode)
+#define TFL_SHOOT_CLEARTARGET 16
+///Custom shooting;
+#define TFL_SHOOT_CUSTOM 32
+
+/// Information aboute the units capabilities
+.float turrcaps_flags;
+/// No kown capabilities
+#define TFL_TURRCAPS_NONE 0
+/// Capable of sniping
+#define TFL_TURRCAPS_SNIPER 2
+/// Capable of splasdamage
+#define TFL_TURRCAPS_RADIUSDMG 4
+/// Has one or more cannons with zero shot traveltime
+#define TFL_TURRCAPS_HITSCAN 8
+/// More then one (type of) gun
+#define TFL_TURRCAPS_MULTIGUN 16
+/// Carries at least one guided weapon
+#define TFL_TURRCAPS_GUIDED 32
+/// At least one gun fiers slow projectiles
+#define TFL_TURRCAPS_SLOWPROJ 64
+/// At least one gun fiers medium speed projectiles
+#define TFL_TURRCAPS_MEDPROJ 128
+/// At least one gun fiers fast projectiles
+#define TFL_TURRCAPS_FASTPROJ 256
+/// At least one gun capable of damaging players
+#define TFL_TURRCAPS_PLAYERKILL 512
+/// At least one gun that can shoot town missiles
+#define TFL_TURRCAPS_MISSILEKILL 1024
+/// Has support capabilities. powerplants and sutch.
+#define TFL_TURRCAPS_SUPPORT 2048
+/// Proveides at least one type of ammmo
+#define TFL_TURRCAPS_AMMOSOURCE 4096
+/// Can recive targets from external sources
+#define TFL_TURRCAPS_RECIVETARGETS 8192
+/// Capable of self-transport
+#define TFL_TURRCAPS_MOVE 16384
+/// Will roam arround even if not chasing anyting
+#define TFL_TURRCAPS_ROAM 32768
+#define TFL_TURRCAPS_LINKED 65536
+
+/// Ammo types needed and/or provided
+.float ammo_flags;
+/// Has and needs no ammo
+#define TFL_AMMO_NONE 64
+/// Uses power
+#define TFL_AMMO_ENERGY 2
+/// Uses bullets
+#define TFL_AMMO_BULLETS 4
+/// Uses explosives
+#define TFL_AMMO_ROCKETS 8
+/// Regenerates ammo on its own
+#define TFL_AMMO_RECHARGE 16
+/// Can recive ammo from others
+#define TFL_AMMO_RECIVE 32
+
+/// How incomming damage is handeld
+.float damage_flags;
+/// Cant be hurt
+#define TFL_DMG_NO 256
+/// Can be damaged
+#define TFL_DMG_YES 2
+/// Can be damaged by teammates
+#define TFL_DMG_TAKEFROMTEAM 4
+/// Traget attackers
+#define TFL_DMG_RETALIATE 8
+/// Target attackers, even is on own team
+#define TFL_DMG_RETALIATEONTEAM 16
+/// Loses target when damaged
+#define TFL_DMG_TARGETLOSS 32
+/// Reciving damage trows off aim
+#define TFL_DMG_AIMSHAKE 64
+/// Reciving damage slaps the head arround
+#define TFL_DMG_HEADSHAKE 128
+/// Die and stay dead.
+#define TFL_DMG_DEATH_NORESPAWN 256
+
+// Spawnflags
+/// Spawn in teambased modes
+#define TFL_SPAWN_TEAM 2
+/// Spawn in FFA modes
+#define TFL_SPAWN_FFA 4
+/// Respawn after death
+#define TFL_SPAWN_RESPAWN 8
+
+/*
+* Fields commnly used by turrets
+*/
+/// Turrets internal ai speed
+.float ticrate;
+/// Where to point the head when no target
+.vector idle_aim;
+/// Top part of turret
+.entity tur_head;
+/// Start/respawn health
+.float tur_health;
+/// Defend this entity (or ratehr this entitys position)
+.entity tur_defend;
+/// on/off toggle.
+.float tur_active;
+/// Aim from this point,
+.vector tur_aimorg;
+/// and shoot from here. (could be non constant, think MLRS)
+.vector tur_shotorg;
+/// Aim at this spot
+.vector tur_aimpos;
+/// Predicted time the round will impact
+.float tur_impacttime;
+/// Predicted place the round will impact
+.vector tur_impactpoint;
+/// What entity the aimtrace hit, if any.
+.entity tur_impactent;
+/// Distance to enemy
+.float tur_dist_enemy;
+/// Distance impact<->aim
+.float tur_dist_toaimpos;
+/// Decresment counter form .shot_volly to 0.
+.float volly_counter;
+
+/*
+* Projectile/missile. its up to the individual turret implementation to
+** deal the damage, blow upp the missile or whatever.
+*/
+/// Track then refireing is possible
+//.float attack_finished; = attack_finished_single
+/// Shoot this often
+.float shot_refire;
+/// Shots travel this fast, when appliable
+.float shot_speed;
+/// Inaccuracy
+.float shot_spread;
+/// Estimated (core) damage of projectiles. also reduce on ammo with this amount when fiering
+.float shot_dmg;
+/// If radius dmg, this is how big that radius is.
+.float shot_radius;
+/// Max force exserted by round impact
+.float shot_force;
+/// < 1 = shoot # times at target (if possible)
+.float shot_volly;
+/// Refire after a compleated or borken volly.
+.float shot_volly_refire;
+
+/// Consider targets within this range
+.float target_range;
+/// Dont consider targets closer then
+.float target_range_min;
+/// Engage fire routine on targets within
+.float target_range_fire;
+/// Targets closer to this are prefered
+.float target_range_optimal;
+
+/*
+* The standard targetselection tries to select a target based on
+* range, angle offset, target type, "is old target"
+* Thise biases will allow score scaling to (dis)favor diffrent targets
+*/
+/// (dis)Favor best range this mutch
+.float target_select_rangebias;
+/// (dis)Favor targeting my old enemy this mutch
+.float target_select_samebias;
+/// (dis)Favor targeting the enemy closest to my guns current angle this mutch
+.float target_select_anglebias;
+/// (dis)Favor Missiles? (-1 to diable targeting compleatly)
+.float target_select_missilebias;
+/// (dis)Favot living players (-1 to diable targeting compleatly)
+.float target_select_playerbias;
+
+/*
+* Aim refers to real aiming, not gun pos (thats done by track)
+*/
+/// Maximum offset between impact and aim spot to fire
+.float aim_firetolerance_dist;
+/// Maximum angular offset between head and aimspot to fire
+//.float aim_firetolerance_angle;
+/// How fast can i rotate/pitch (per second in stepmotor mode, base force in smooth modes)
+.float aim_speed;
+/// cant aim higher/lower then this
+.float aim_maxpitch;
+/// I cant rotate more then this
+.float aim_maxrot;
+
+// Ammo/power. keeping dmg and ammo on a one to one ratio is preferable (for rating)
+/// Staring & current ammo
+.float ammo;
+/// Regenerate this mutch ammo (per second)
+.float ammo_recharge;
+/// Max amount of ammo i can hold
+.float ammo_max;
+
+
+// Uncomment below to enable various debug output.
+//#define TURRET_DEBUG
+//#define TURRET_DEBUG_TARGETVALIDATE
+//#define TURRET_DEBUG_TARGETSELECT
+
+#ifdef TURRET_DEBUG
+.float tur_dbg_dmg_t_h; // Total dmg that hit something (can be more then tur_dbg_dmg_t_f since it should count radius dmg.
+.float tur_dbg_dmg_t_f; // Total damage spent
+.float tur_dbg_start; // When did i go online?
+.float tur_dbg_tmr1; // timer for random use
+.float tur_dbg_tmr2; // timer for random use
+.float tur_dbg_tmr3; // timer for random use
+.vector tur_dbg_rvec; // Random vector, mainly for coloruing stuff'
+#endif
+
+// System main's
+/// Main AI loop
+void turret_think();
+/// Prefire checks and sutch
+void turret_fire();
+
+// Callbacks
+/// implements the actual fiering
+.void() turret_firefunc;
+/// prefire checks go here. return 1 to go bang, 0 not to.
+.float() turret_firecheckfunc;
+// Execure BEFORE main ai loop. return 0 to cancel any following proccessing.
+//.float() turret_prethink;
+/// Execure AFTER main AI loop UNLESS turret_prethink returnd 0
+.void() turret_postthink;
+
+/// Add a target
+.float(entity e_target,entity e_sender) turret_addtarget;
+
+//.float call_diehook;
+//.float call_respwnhook;
+.void() turret_diehook;
+.void() turret_respawnhook;
+
+/*
+#define TEH_THINK 2
+#define TEH_DAMAGE 4
+#define TEH_DIE 8
+#define TEH_RESPAWN 16
+#define TEH_TRACK 32
+#define TEH_AIM 64
+#define TEH_SELECT 128
+.float(float event_id) turret_eventhook;
+*/
+
+/*
+* Some turrets need other aimsystems then other.
+* This should return the place to aim at, not acctualy turn or
+* pitch anyting.
+*
+* use turret_stdproc_aim* or Make your own.
+* Make sure you update tur_enemy_dist and tur_enemy_adist
+* with the apropriate info, if you do.
+
+removed.
+*/
+/// function used to aim, usualy turret_stdproc_aim_generic
+//.vector() turret_aim;
+
+/*
+* This is where the acctual turret turning should take place
+* Use turret_stdproc_track or make your own.
+wkacked to save mem.
+*/
+// Function used to turn and pitch the .tur_head usualy turret_stdproc_track
+//.void() turret_track;
+
+/*
+* Target selection, preferably but not nessesarely
+* return a normalized result.
+*/
+/// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic
+.float(entity e_turret, entity e_target) turret_score_target;
+
+/*
+* Damage, death and respawn.
+*/
+//void turret_gibs_precash();
+// generalized so save mem (on fields)
+// Function to handle incomming damage. usualy turret_stdproc_damage
+//.void(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce) turret_damagefunc;
+// Function to handle the event of death. usualy turret_stdproc_die
+//.void() turret_diefunc;
+// Function that handles rebirth. usualy turret_stdproc_respawn
+//.void() turret_spawnfunc;
+
+/*
+* Stuff to plug into requierd but unused callbacks.
+*/
+/// Always return 1
+float turret_stdproc_true();
+/// Always return 0
+float turret_stdproc_false();
+/// Always return nothing at all
+void turret_stdproc_nothing();
+
+/*
+* Target selection
+*/
+/// "closeer is beter" selection
+float turret_stdproc_targetscore_close(entity e_turret, entity e_target);
+/// "further is beter" selection
+float turret_stdproc_targetscore_far(entity e_turret, entity e_target);
+/// only target_range_optimal
+float turret_stdproc_targetscore_optimal(entity e_turret, entity e_target);
+/// defendpos
+float turret_stdproc_targetscore_defend(entity e_turret, entity e_target);
+/// Generic fairly smart bias-aware target selection.
+float turret_stdproc_targetscore_generic(entity e_turret, entity e_target);
+/// Experimental supportunits targetselector
+float turret_stdproc_targetscore_support(entity e_turret,entity e_target);
+
+/*
+* Aim functions
+*/
+/// Generic aimer guided by self.aim_flags
+vector turret_stdproc_aim_generic()
+// Straight line, current location
+//vector turret_stdproc_aim_simple()
+
+/*
+* Turret turning & pitch
+*/
+/// Tries to line up the turret head with the aimpos
+void turret_stdproc_track();
+
+/// Generic damage handeling. blows up the turret when health <= 0
+void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce);
+/// Spawns a explotion, does some damage & trows bits arround.
+void turret_stdproc_die();
+/// reassembles the turret.
+void turret_stdproc_respawn();
+
+/// Evaluate target validity
+float turret_validate_target(entity e_turret,entity e_target,float validate_flags);
+/// Turret Head Angle Diff Vector. updated by a sucsessfull call to turret_validate_target
+vector tvt_thadv;
+/// Turret Angle Diff Vector. updated by a sucsessfull call to turret_validate_target
+vector tvt_tadv;
+/// Turret Head Angle Diff Float. updated by a sucsessfull call to turret_validate_target
+float tvt_thadf;
+/// Turret Angle Diff Float. updated by a sucsessfull call to turret_validate_target
+float tvt_tadf;
+/// Distance. updated by a sucsessfull call to turret_validate_target
+float tvt_dist;
+
+/// updates aim org, shot org, shot dir and enemy org for selected turret
+void turret_do_updates(entity e_turret);
+.vector tur_aimorg_updated;
+.vector tur_shotorg_updated;
+.vector tur_shotdir_updated;
+
+void turrets_precash();
+#endif // TTURRETS_ENABLED
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/system/system_aimprocs.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_aimprocs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,140 @@
+/*
+* Straight line, Dead-on (no prediction)
+* Usefull for "stupid turrets" or ones
+* that launch guided weapons and just need to apeer to
+* somewhat face (and/or track) the target.
+
+supports:
+TFL_AIM_NO
+*/
+/*
+vector turret_stdproc_aim_simple()
+{
+ float s_bu; // Solidity backup (for ground shooters)
+ vector aim_pos;
+
+ if (self.aim_flags & TFL_AIM_NO) return self.idle_aim;
+
+ aim_pos = self.enemy.origin;
+
+ // Target ground?
+ if (self.aim_flags & TFL_AIM_GROUND)
+ {
+ s_bu = self.enemy.solid;
+ self.enemy.solid = SOLID_NOT;
+ traceline(self.enemy.origin + '0 0 128',self.enemy.origin + '0 0 -99999',1,self.enemy);
+ self.enemy.solid = s_bu;
+ aim_pos = trace_endpos;
+ }
+
+ // This is where its at.
+ return aim_pos;
+}
+*/
+
+/*
+* Generic aim
+
+supports:
+TFL_AIM_NO
+TFL_AIM_GROUND
+TFL_AIM_LEAD
+TFL_AIM_SHOTTIMECOMPENSATE
+TFL_AIM_INFRONT
+TFL_AIM_BEHIND
+TFL_AIM_ZEASE
+
+not supported:
+TFL_AIM_BALISTIC
+*/
+
+
+vector turret_stdproc_aim_generic()
+{
+ vector pre_pos;
+ // entity mover;
+
+ if (self.aim_flags == TFL_AIM_NO)
+ return self.idle_aim;
+
+ // Baseline
+ pre_pos = real_origin(self.enemy);
+
+ if(self.aim_flags & TFL_AIM_SIMPLE)
+ return pre_pos;
+
+ // Lead?
+ //pre_pos = pre_pos + bot_shotlead(self.enemy.origin, self.enemy.velocity, self.shot_speed, 0.01); //self.enemy.velocity; * (self.tur_dist_enemy / self.shot_speed);
+ if (self.aim_flags & TFL_AIM_LEAD)
+ if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE) // Need to conpensate for shot traveltime
+ {
+ pre_pos = pre_pos + self.enemy.velocity * (self.tur_dist_enemy / self.shot_speed);
+
+ // FIXME slow projectiles misspredict (well all do, bit the slow ons miss :P)
+ }
+ else if (self.turrcaps_flags & TFL_TURRCAPS_HITSCAN) // Hitscan gun, conpensate for frametime and posibly refire offset.
+ pre_pos = pre_pos + self.enemy.velocity * (frametime + min(max(self.attack_finished_single - time,0),self.ticrate*2));
+ else // No lead
+ pre_pos += self.enemy.velocity;
+
+
+ // Smooth out predict-Z?
+ /*
+ if (self.aim_flags & TFL_AIM_ZEASE)
+ {
+ vector v;
+ v = real_origin(self.enemy);
+ pre_pos_z = (pre_pos_z + v_z) * 0.5;
+ }
+ */
+
+ /*
+ if (self.aim_flags & TFL_AIM_INFRONT) // Aim a bit in front of the target
+ pre_pos -= normalize(self.tur_aimorg_updated - pre_pos) * 32;
+
+ if (self.aim_flags & TFL_AIM_BEHIND) // Aim a bit behind the target
+ pre_pos += normalize(self.tur_aimorg_updated - pre_pos) * 32;
+
+ */
+ // This turret should hit the ground neer a target rather the do a direct hit
+
+ if ( (self.aim_flags & TFL_AIM_GROUND) ||
+ ((self.aim_flags & TFL_AIM_GROUND2) && (self.enemy.flags & FL_ONGROUND)) )
+ {
+ traceline(pre_pos + '0 0 8',pre_pos - '0 0 10000',1,self.enemy);
+ pre_pos = trace_endpos;
+ }
+
+
+
+
+
+
+
+ return pre_pos;
+}
+
+
+/*
+* Aim where it is
+supports:
+TFL_AIM_NO
+*/
+/*
+vector turret_stdproc_aim_rail()
+{
+ vector pre_pos;
+
+ if (self.aim_flags & TFL_AIM_NO)
+ return self.idle_aim;
+
+ pre_pos = real_origin(self.enemy);
+
+ self.tur_dist_toaimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);
+
+ self.tur_impacttime = time;
+
+ return pre_pos;
+
+}
+*/
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/system/system_damage.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,319 @@
+/*
+* Trow a turret gib
+*/
+void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+{
+ self.velocity += vforce;
+}
+
+void turret_trowgib(
+ vector v_from, vector v_to, vector v_colormod,
+ string smodel,
+ float f_lifetime, float f_fadetime, float b_burn)
+{
+ local entity gib;
+ local entity burn;
+
+ gib = spawn();
+
+ gib.classname = "turret_gib";
+ setmodel(gib,smodel);
+ setorigin(gib,v_from);
+ SUB_SetFade(gib,time + f_lifetime,2);
+
+ gib.solid = SOLID_BBOX;
+
+ gib.movetype = MOVETYPE_BOUNCE;
+ gib.takedamage = DAMAGE_YES;
+ gib.event_damage = turret_gib_damage;
+ gib.health = -1;
+ gib.effects = EF_LOWPRECISION;
+ gib.flags = FL_NOTARGET;
+ gib.colormod = v_colormod;
+ gib.velocity = v_to;
+
+ if (b_burn)
+ {
+ burn = spawn();
+ burn.effects = EF_LOWPRECISION|EF_FLAME;
+ setattachment(burn,gib,"");
+ setorigin(burn,(gib.mins + gib.maxs) * 0.5);
+ SUB_SetFade(burn,time + (f_lifetime * 0.5) ,2);
+ }
+}
+
+void turret_gib_boom()
+{
+ entity gib;
+ float i;
+ string s;
+
+ for (i = 1; i < 5; i = i +1)
+ {
+ gib = spawn();
+ gib.classname = "turret_gib";
+
+ s = strcat("models/turrets/head-gib",ftos(i));
+ s = strcat(s,".md3");
+ // bprint("s:",s,"\n");
+ setmodel(gib,s);
+
+ setorigin(gib,self.origin);
+
+ SUB_SetFade(gib,time + 5,2);
+
+ gib.solid = SOLID_BBOX;
+
+ gib.movetype = MOVETYPE_BOUNCE;
+ gib.gravity = 0.5;
+ gib.damageforcescale = 2;
+ gib.takedamage = DAMAGE_YES;
+ gib.event_damage = turret_gib_damage;
+ gib.health = -1;
+ gib.effects = EF_LOWPRECISION;
+ gib.flags = FL_NOTARGET;
+ gib.velocity = self.velocity + (randomvec() * 700);
+ gib.avelocity = randomvec() * 64;
+ }
+
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 78);
+ WriteCoord (MSG_BROADCAST, self.origin_x);
+ WriteCoord (MSG_BROADCAST, self.origin_y);
+ WriteCoord (MSG_BROADCAST, self.origin_z);
+
+ remove(self);
+}
+
+void turret_trowgib2(
+ vector v_from, vector v_to, vector v_colormod,
+ entity e_mimic, float boomtime)
+{
+ entity gib;
+
+ gib = spawn();
+
+ gib.classname = "turret_gib";
+ setmodel(gib,e_mimic.model);
+ setorigin(gib,v_from);
+
+ gib.solid = SOLID_BBOX;
+
+ gib.movetype = MOVETYPE_BOUNCE;
+ gib.gravity = 0.75;
+ gib.damageforcescale = 2;
+ gib.takedamage = DAMAGE_YES;
+ gib.event_damage = turret_gib_damage;
+ gib.health = -1;
+ gib.effects = EF_LOWPRECISION;
+ gib.flags = FL_NOTARGET;
+ gib.colormod = v_colormod;
+ gib.velocity = v_to;
+ gib.avelocity = randomvec() * 32;
+ gib.think = turret_gib_boom;
+ gib.nextthink = boomtime;
+ gib.effects = EF_FLAME;
+
+
+}
+/*
+* Spawn a boom, trow fake bits arround
+* and hide the real ones.
+*/
+void turret_stdproc_die()
+{
+ vector org2;
+ vector t_dir;
+
+ // self.tur_active = 0;
+
+ self.deadflag = DEAD_DEAD;
+ self.tur_head.deadflag = self.deadflag;
+
+ sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+ org2 = self.origin + '0 0 40';
+
+// Explotion grafix
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 78);
+ WriteCoord (MSG_BROADCAST, org2_x);
+ WriteCoord (MSG_BROADCAST, org2_y);
+ WriteCoord (MSG_BROADCAST, org2_z);
+
+// Unsolidify and hide real parts
+ self.solid = SOLID_NOT;
+ self.tur_head.solid = self.solid;
+
+ self.alpha = -1;
+ self.tur_head.alpha = -1;
+
+ self.takedamage = DAMAGE_NO;
+ self.tur_head.takedamage = self.takedamage;
+
+ self.effects = 0;
+ self.tur_head.effects = self.effects;
+
+ self.health = 0;
+
+
+// Trow fake parts arround
+
+ // base
+ makevectors(self.angles);
+ if (random() > 0.5)
+ {
+ turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib2.md3",min(self.respawntime,20),1,1);
+ t_dir = (v_up * 700) + (randomvec() * 300);
+ turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib3.md3",min(self.respawntime,10),1,1);
+ t_dir = (v_up * 700) + (randomvec() * 300);
+ turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib4.md3",min(self.respawntime,10),1,1);
+ }
+ else
+ {
+ turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib1.md3",min(self.respawntime,20),1,1);
+ }
+
+ // Blow the top part up into the air
+ turret_trowgib2( self.origin + (v_up * 50),
+ v_up * 150 + randomvec() * 50,
+ '0.2 0.2 0.2',
+ self.tur_head,time + 0.5 + (random() * 0.5));
+
+
+// Go boom
+ RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,0,world);
+
+ if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
+ {
+ if (self.turret_diehook)
+ self.turret_diehook();
+
+ remove(self.tur_head);
+ remove(self);
+ }
+ else
+ {
+ // Setup respawn
+ self.nextthink = time + self.respawntime;
+ //self.think = self.turret_spawnfunc;
+ self.think = turret_stdproc_respawn;
+ if (self.turret_diehook)
+ self.turret_diehook();
+ }
+
+}
+
+void turret_stdproc_respawn()
+{
+ // self.tur_active = 1;
+
+ // Make sure all parts belong to the same team since
+ // this function doubles as "teamchange" function.
+ self.tur_head.team = self.team;
+ if (self.team == COLOR_TEAM1)
+ self.colormod = '1.4 0.8 0.8';
+ else if (self.team == COLOR_TEAM2)
+ self.colormod = '0.8 0.8 1.4';
+ else
+ self.colormod = '0 0 0'; // reset
+
+ self.deadflag = DEAD_NO;
+ self.tur_head.deadflag = self.deadflag;
+ self.effects = self.tur_head.effects = 0;
+
+ self.solid = SOLID_BBOX;
+ self.tur_head.solid = self.solid;
+
+ self.alpha = 1;
+ self.tur_head.alpha = self.alpha;
+
+ self.takedamage = DAMAGE_YES;
+ self.tur_head.takedamage = self.takedamage;
+
+ self.avelocity = '0 0 0';
+ self.tur_head.avelocity = self.avelocity;
+ self.tur_head.angles = self.idle_aim;
+
+ self.health = self.tur_health;
+
+ self.enemy = world;
+ self.volly_counter = self.shot_volly;
+ self.ammo = self.ammo_max;
+
+ self.nextthink = time + self.ticrate;
+ self.think = turret_think;
+
+ if (self.turret_respawnhook)
+ self.turret_respawnhook();
+
+}
+
+/*
+* Standard damage proc.
+*/
+void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+{
+ entity baseent,oldself;
+ // entity player;
+
+ if (self.health <= 0) return;
+
+ // Damage func is shared on all parts as standard, we need to know what the master entity of this turret is.
+ // if ((self.classname == "turret_head")||(self.classname == "turret_gun")||(self.classname == "turret_badge"))
+ if (self.owner)
+ baseent = self.owner;
+ else
+ baseent = self;
+
+ if (teamplay != 0)
+ {
+ if (self.team == attacker.team)
+ {
+ sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
+ return;
+ }
+ else
+ {
+ /*
+ // This will get enoying fast...
+ FOR_EACH_PLAYER(player)
+ if(player.team == self.team)
+ sprint(player, "The enemy is attacking your base!");
+
+ */
+ }
+
+ }
+
+ baseent.health = baseent.health - damage;
+
+ // thorw head slightly off aim when hit?
+ if ((self.classname == "turret_head") || (self.classname == "turret_gun"))
+ if (self.damage_flags & TFL_DMG_HEADSHAKE)
+ {
+ // makevectors(baseent.tur_head.v_angle);
+ baseent.tur_head.angles = baseent.tur_head.angles + randomvec() * damage;
+ }
+
+ if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
+ {
+ self.velocity = self.velocity + vforce;
+ }
+
+
+ // Start burning when we have 10% or less health left
+ if (self.health < (self.tur_health * 0.1))
+ self.effects = EF_FLAME;
+
+ if (self.health <= 0)
+ {
+ oldself = self;
+ self = baseent;
+ turret_stdproc_die();
+ self = oldself;
+
+ //baseent.turret_diefunc();
+ }
+}
+
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/system/system_main.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,1104 @@
+#define cvar_base "g_turrets_unit_"
+
+//.float tur_lastscore;
+.string cvar_basename;
+
+string cvar_gets(string s_base,string s_add)
+{
+ return strcat(s_base,s_add);
+}
+
+.float turret_scale_damage;
+.float turret_scale_range;
+.float turret_scale_refire;
+.float turret_scale_ammo;
+.float turret_scale_aim;
+.float turret_scale_health;
+.float turret_scale_respawn;
+
+void load_unit_settings(entity ent,string unitname,float is_reload)
+{
+
+ string sbase;
+
+ if (ent == world)
+ return;
+
+ if (!ent.turret_scale_damage) ent.turret_scale_damage = 1;
+ if (!ent.turret_scale_range) ent.turret_scale_range = 1;
+ if (!ent.turret_scale_refire) ent.turret_scale_refire = 1;
+ if (!ent.turret_scale_ammo) ent.turret_scale_ammo = 1;
+ if (!ent.turret_scale_aim) ent.turret_scale_aim = 1;
+ if (!ent.turret_scale_health) ent.turret_scale_health = 1;
+ if (!ent.turret_scale_respawn) ent.turret_scale_respawn = 1;
+
+ sbase = strcat(cvar_base,unitname);
+ if (is_reload)
+ {
+ ent.enemy = world;
+ ent.tur_head.avelocity = '0 0 0';
+ ent.tur_head.angles = ent.angles;
+ }
+ ent.health = cvar(cvar_gets(sbase,"_health")) * ent.turret_scale_health;
+ ent.respawntime = cvar(cvar_gets(sbase,"_respawntime")) * ent.turret_scale_respawn;
+
+ ent.shot_dmg = cvar(cvar_gets(sbase,"_shot_dmg")) * ent.turret_scale_damage;
+ ent.shot_refire = cvar(cvar_gets(sbase,"_shot_refire")) * ent.turret_scale_refire;
+ ent.shot_radius = cvar(cvar_gets(sbase,"_shot_radius")) * ent.turret_scale_damage;
+ ent.shot_speed = cvar(cvar_gets(sbase,"_shot_speed"));
+ ent.shot_spread = cvar(cvar_gets(sbase,"_shot_spread"));
+ ent.shot_force = cvar(cvar_gets(sbase,"_shot_force")) * ent.turret_scale_damage;
+ ent.shot_volly = cvar(cvar_gets(sbase,"_shot_volly"));
+ ent.shot_volly_refire = cvar(cvar_gets(sbase,"_shot_volly_refire")) * ent.turret_scale_refire;
+
+ ent.target_range = cvar(cvar_gets(sbase,"_target_range")) * ent.turret_scale_range;
+ ent.target_range_min = cvar(cvar_gets(sbase,"_target_range_min")) * ent.turret_scale_range;
+ ent.target_range_fire = cvar(cvar_gets(sbase,"_target_range_fire")) * ent.turret_scale_range;
+ ent.target_range_optimal = cvar(cvar_gets(sbase,"_target_range_optimal")) * ent.turret_scale_range;
+
+ ent.target_select_rangebias = cvar(cvar_gets(sbase,"_target_select_rangebias"));
+ ent.target_select_samebias = cvar(cvar_gets(sbase,"_target_select_samebias"));
+ ent.target_select_anglebias = cvar(cvar_gets(sbase,"_target_select_anglebias"));
+ ent.target_select_playerbias = cvar(cvar_gets(sbase,"_target_select_playerbias"));
+
+ ent.ammo_max = cvar(cvar_gets(sbase,"_ammo_max")) * ent.turret_scale_ammo;
+ //ent.ammo = cvar(cvar_gets(sbase,"_ammo"));
+ ent.ammo_recharge = cvar(cvar_gets(sbase,"_ammo_recharge")) * ent.turret_scale_ammo;
+
+ ent.aim_firetolerance_dist = cvar(cvar_gets(sbase,"_aim_firetolerance_dist"));
+// ent.aim_firetolerance_angle = cvar(cvar_gets(sbase,"_aim_firetolerance_angle"));
+ ent.aim_speed = cvar(cvar_gets(sbase,"_aim_speed")) * ent.turret_scale_aim;
+ ent.aim_maxrot = cvar(cvar_gets(sbase,"_aim_maxrot"));
+ ent.aim_maxpitch = cvar(cvar_gets(sbase,"_aim_maxpitch"));
+
+ ent.track_type = cvar(cvar_gets(sbase,"_track_type"));
+ ent.track_accel_pitch = cvar(cvar_gets(sbase,"_track_accel_pitch"));
+ ent.track_accel_rot = cvar(cvar_gets(sbase,"_track_accel_rot"));
+ ent.track_blendrate = cvar(cvar_gets(sbase,"_track_blendrate"));
+}
+
+float turret_stdproc_true()
+{
+ return 1;
+}
+
+float turret_stdproc_false()
+{
+ return 0;
+}
+
+void turret_stdproc_nothing()
+{
+ return;
+}
+
+/**
+** updates enemy distances, preicted impact point/time
+** & aim<->predict impact distance.
+** Also translates shoot & aimorgs by current rotation.
+**/
+void turret_do_updates(entity e_turret)
+{
+ if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
+ {
+ e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
+ e_turret.angles_x = e_turret.angles_x * -1;
+ makevectors(e_turret.tur_head.angles + e_turret.angles);
+ e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
+ e_turret.angles_x = e_turret.angles_x * -1;
+ }
+ else
+ {
+ e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
+ makevectors(e_turret.tur_head.angles);
+ e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
+ }
+ // v_right = (v_right * -1);
+ e_turret.tur_shotorg_updated = e_turret.origin + v_forward * e_turret.tur_shotorg_x + v_right * e_turret.tur_shotorg_y + v_up * e_turret.tur_shotorg_z;
+
+ e_turret.tur_shotdir_updated = normalize((e_turret.tur_shotorg_updated + v_forward) - e_turret.tur_shotorg_updated);
+ e_turret.tur_aimorg_updated = e_turret.origin + v_forward * e_turret.tur_aimorg_x + v_right * e_turret.tur_aimorg_y + v_up * e_turret.tur_aimorg_z;
+
+
+ e_turret.tur_dist_enemy = vlen(e_turret.tur_aimorg_updated - real_origin(e_turret.enemy));
+
+ traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated+(e_turret.tur_shotdir_updated * e_turret.tur_dist_enemy),MOVE_NORMAL,e_turret);
+
+ e_turret.tur_impactpoint = trace_endpos;
+ e_turret.tur_impactent = trace_ent;
+ //e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
+ e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
+ e_turret.tur_dist_toaimpos = vlen(trace_endpos - e_turret.tur_aimpos);
+}
+
+/**
+** Handles head rotation according to
+** the units .track_type and .track_flags
+**/
+void turret_stdproc_track()
+{
+ vector wish_angle; // This is where we'd need to be
+
+ vector real_angle; // This is where we can go
+ float f_tmp;
+
+
+ if (self.track_flags == TFL_TRACK_NO)
+ return;
+
+ if(!self.tur_active)
+ {
+ wish_angle = self.idle_aim - ('1 0 0' * self.aim_maxpitch);
+ }
+ else if (self.enemy == world)
+ {
+ if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
+ wish_angle = self.idle_aim + self.angles;
+ else
+ if(cvar("g_turrets_aimidle_delay") > (time - self.lip))
+ wish_angle = self.idle_aim;
+ else
+ wish_angle = self.tur_head.angles;
+
+ }
+ else
+ {
+ // Find the direction
+ if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
+ wish_angle = normalize(self.tur_aimpos - self.origin);
+ else
+ wish_angle = normalize(self.tur_aimpos - self.tur_head.origin);
+
+ wish_angle = vectoangles(wish_angle); // And make a angle
+ }
+
+ // Find the diffrence between where we currently aim and where we want to aim
+ if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
+ real_angle = wish_angle - (self.angles + self.tur_head.angles);
+ else
+ {
+ //if(vlen(wish_angle - self.tur_head.angles) > vlen(self.tur_head.angles - wish_angle))
+ real_angle = wish_angle - self.tur_head.angles;
+ //else
+ // real_angle = self.tur_head.angles - wish_angle;
+ }
+
+ /*
+ if(real_angle_y > 180)
+ bprint("^3");
+ if(real_angle_y < -180)
+ bprint("^1");
+ string s;
+ s = vtos(real_angle);
+ bprint("RA1: ",s);
+ */
+
+
+ if (real_angle_x < 0) real_angle_x += 360;
+ if (real_angle_x > 180) real_angle_x -= 360;
+
+ if (real_angle_y < 0) real_angle_y += 360;
+ if (real_angle_y >= 180) real_angle_y -= 360;
+
+ //s = vtos(real_angle);
+ //bprint(" RA2: ",s,"\n");
+
+ // Limit pitch
+
+ if (self.track_flags & TFL_TRACK_PITCH)
+ real_angle_x = bound(self.aim_maxpitch * -1,real_angle_x,self.aim_maxpitch);
+
+ // Limit rot
+ if (self.track_flags & TFL_TRACK_ROT)
+ real_angle_y = bound(self.aim_maxrot * -1,real_angle_y,self.aim_maxrot);
+
+
+ if (self.track_type == TFL_TRACKTYPE_STEPMOTOR)
+ {
+ f_tmp = self.aim_speed * self.ticrate; // dgr/sec -> dgr/tic
+
+ // Limit turning speed
+ real_angle_x = bound((-1 * f_tmp),real_angle_x, f_tmp);
+ real_angle_y = bound((-1 * f_tmp),real_angle_y, f_tmp);
+
+ // Limit pich and rot.
+ if (self.track_flags & TFL_TRACK_PITCH)
+ self.tur_head.angles_x = bound((-1 * self.aim_maxpitch),self.tur_head.angles_x + real_angle_x,self.aim_maxpitch);
+
+ if (self.track_flags & TFL_TRACK_ROT)
+ self.tur_head.angles_y = bound((-1 * self.aim_maxrot),self.tur_head.angles_y + real_angle_y,self.aim_maxrot);
+
+ return;
+ }
+
+ if (self.track_type == TFL_TRACKTYPE_FLUIDPRECISE)
+ {
+ if (self.track_flags & TFL_TRACK_PITCH)
+ self.tur_head.avelocity_x = real_angle_x;
+
+ if (self.track_flags & TFL_TRACK_ROT)
+ self.tur_head.avelocity_y = real_angle_y;
+ }
+ else if (self.track_type == TFL_TRACKTYPE_FLUIDINERTIA)
+ {
+ f_tmp = self.aim_speed * self.ticrate;
+
+ real_angle_y = bound(self.aim_speed * -1,real_angle_y * self.track_accel_rot * f_tmp,self.aim_speed);
+ real_angle_x = bound(self.aim_speed * -1,real_angle_x * self.track_accel_pitch * f_tmp,self.aim_speed);
+ real_angle = (self.tur_head.avelocity * self.track_blendrate) + (real_angle * (1 - self.track_blendrate));
+
+ if (self.track_flags & TFL_TRACK_PITCH) self.tur_head.avelocity_x = real_angle_x;
+ if (self.track_flags & TFL_TRACK_ROT) self.tur_head.avelocity_y = real_angle_y;
+ self.tur_head.avelocity_z = real_angle_z;
+ }
+
+ // Limit pitch
+ /*
+ if (self.track_flags & TFL_TRACK_PITCH)
+ {
+ if (self.tur_head.angles_x > self.aim_maxpitch)
+ {
+ self.tur_head.angles_x = self.aim_maxpitch;
+ self.tur_head.avelocity_x = 0;
+ }
+ else if (self.tur_head.angles_x < (self.aim_maxpitch * -1))
+ {
+ self.tur_head.angles_x = (self.aim_maxpitch * -1);
+ self.tur_head.avelocity_x = 0;
+ }
+ }
+
+ // Limit rot
+ if (self.track_flags & TFL_TRACK_ROT)
+ {
+ if (self.tur_head.angles_y > self.aim_maxrot)
+ {
+ self.tur_head.angles_y = self.aim_maxrot;
+ self.tur_head.avelocity_y = 0;
+ }
+ else if (self.tur_head.angles_y < (self.aim_maxrot * -1))
+ {
+ self.tur_head.angles_y = (self.aim_maxrot * -1);
+ self.tur_head.avelocity_y = 0;
+ }
+ }
+ */
+
+
+}
+
+/*
+ + = implemented
+ - = not implemented
+
+ + TFL_FIRECHECK_NO
+ + TFL_FIRECHECK_WORLD
+ + TFL_FIRECHECK_DEAD
+ + TFL_FIRECHECK_DISTANCES
+ - TFL_FIRECHECK_LOS
+ + TFL_FIRECHECK_AIMDIST
+ + TFL_FIRECHECK_REALDIST
+ - TFL_FIRECHECK_ANGLEDIST
+ - TFL_FIRECHECK_TEAMCECK
+ + TFL_FIRECHECK_AFF
+ + TFL_FIRECHECK_OWM_AMMO
+ + TFL_FIRECHECK_OTHER_AMMO
+ + TFL_FIRECHECK_REFIRE
+*/
+
+/**
+** Preforms pre-fire checks based on the uints firecheck_flags
+**/
+float turret_stdproc_firecheck()
+{
+ // This one just dont care =)
+ if (self.firecheck_flags & TFL_FIRECHECK_NO) return 1;
+
+ // Ready?
+ if (self.firecheck_flags & TFL_FIRECHECK_REFIRE)
+ if (self.attack_finished_single >= time) return 0;
+
+ //
+ if (self.firecheck_flags & TFL_FIRECHECK_DEAD)
+ if (self.enemy.deadflag != DEAD_NO) return 0;
+
+ // Plz stop killing the world!
+ if (self.firecheck_flags & TFL_FIRECHECK_WORLD)
+ if (self.enemy == world) return 0;
+
+ // Own ammo?
+ if (self.firecheck_flags & TFL_FIRECHECK_OWM_AMMO)
+ if (self.ammo < self.shot_dmg) return 0;
+
+ // Other's ammo? (carefull using this...)
+ if (self.firecheck_flags & TFL_FIRECHECK_OTHER_AMMO)
+ if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
+
+ if (self.firecheck_flags & TFL_FIRECHECK_DISTANCES)
+ {
+ // Not close enougth?
+ if (self.tur_dist_enemy > self.target_range_fire) return 0;
+
+ // To close?
+ if (self.tur_dist_enemy < self.target_range_min) return 0;
+ }
+
+ // Try to avoid FF?
+ if (self.firecheck_flags & TFL_FIRECHECK_AFF)
+ if (self.tur_impactent.team == self.team) return 0;
+
+ // aim<->predicted impact
+ if (self.firecheck_flags & TFL_FIRECHECK_AIMDIST)
+ if (self.tur_dist_toaimpos > self.aim_firetolerance_dist) return 0;
+
+ // Volly status
+ if (self.shot_volly > 1)
+ {
+ if (self.volly_counter == self.shot_volly)
+ if (self.ammo < (self.shot_dmg * self.shot_volly))
+ return 0;
+ }
+
+ //if(self.tur_enemy_adist >= self.aim_firetolerance) return 0;
+
+
+ return 1;
+}
+
+/*
+ + TFL_TARGETSELECT_NO
+ + TFL_TARGETSELECT_LOS
+ + TFL_TARGETSELECT_PLAYERS
+ + TFL_TARGETSELECT_MISSILES
+ - TFL_TARGETSELECT_TRIGGERTARGET
+ + TFL_TARGETSELECT_ANGLELIMITS
+ + TFL_TARGETSELECT_RANGELIMTS
+ + TFL_TARGETSELECT_TEAMCHECK
+ - TFL_TARGETSELECT_NOBUILTIN
+ + TFL_TARGETSELECT_OWNTEAM
+*/
+
+/**
+** Evaluate a entity for target valitity based on validate_flags
+**/
+float turret_validate_target(entity e_turret,entity e_target,float validate_flags)
+{
+ vector v_tmp;
+
+ //if(!validate_flags & TFL_TARGETSELECT_NOBUILTIN)
+ // return -0.5;
+
+ if (!e_target)// == world)
+ return -1;
+
+ if (e_target.classname == "grapplinghook")
+ return - 1.5;
+
+ if(g_onslaught)
+ if (substring(e_target.classname, 0, 10) == "onslaught_") // don't attack onslaught targets, that's the player's job!
+ return - 1.75;
+
+ if (validate_flags & TFL_TARGETSELECT_NO)
+ return -2;
+
+ // If only this was used more..
+ if (e_target.flags & FL_NOTARGET)
+ return -3;
+
+ // Cant touch this
+ if ((e_target.takedamage == DAMAGE_NO) || (e_target.health < 0))
+ return -4;
+
+ // player
+ if (e_target.flags & FL_CLIENT)
+ {
+ if (!(validate_flags & TFL_TARGETSELECT_PLAYERS))
+ return -5;
+
+ if (e_target.deadflag != DEAD_NO)
+ return -6;
+ }
+
+ // enemy turrets
+ if (e_target.turret_firefunc || e_target.owner.tur_head == e_target)
+ {
+ if (validate_flags & TFL_TARGETSELECT_NOTURRETS)
+ return -5.5;
+ }
+
+ // Missile
+ if (e_target.flags & FL_PROJECTILE)
+ {
+ if (!(validate_flags & TFL_TARGETSELECT_MISSILES))
+ return -7;
+ }
+
+ // Team check
+ if (validate_flags & TFL_TARGETSELECT_TEAMCHECK)
+ {
+ if (validate_flags & TFL_TARGETSELECT_OWNTEAM)
+ {
+ if (e_target.team != e_turret.team)
+ return -8;
+
+ if (e_turret.team != e_target.owner.team)
+ return -8.5;
+ }
+ else
+ {
+ if (e_target.team == e_turret.team)
+ return -9;
+
+ if (e_turret.team == e_target.owner.team)
+ return -9.5;
+ }
+ }
+
+ // Line of sight?
+ if (validate_flags & TFL_TARGETSELECT_LOS)
+ {
+ v_tmp = real_origin(e_target) + ((e_target.mins + e_target.maxs) * 0.5);
+ //v_tmp = e_target.origin;
+ traceline(e_turret.origin,v_tmp,0,e_turret);
+
+ if (e_turret.aim_firetolerance_dist < vlen(v_tmp - trace_endpos))
+ return -10;
+ }
+
+ // Can we even aim this thing? (anglecheck)
+ tvt_thadv = angleofs(e_turret.tur_head,e_target);
+ tvt_tadv = angleofs(e_turret,e_target);
+ tvt_thadf = vlen(tvt_thadv);
+ tvt_tadf = vlen(tvt_tadv);
+
+ if (validate_flags & TFL_TARGETSELECT_ANGLELIMITS)
+ {
+ if (fabs(tvt_tadv_x) > e_turret.aim_maxpitch)
+ return -11;
+
+ if (fabs(tvt_tadv_y) > e_turret.aim_maxrot)
+ return -12;
+ }
+
+ // Range limits?
+ tvt_dist = vlen(e_turret.origin - real_origin(e_target));
+ if (validate_flags & TFL_TARGETSELECT_RANGELIMTS)
+ {
+ if (tvt_dist < e_turret.target_range_min)
+ return -13;
+
+ if (tvt_dist > e_turret.target_range)
+ return -14;
+ }
+
+#ifdef TURRET_DEBUG_TARGETSELECT
+ bprint("Target:",e_target.netname," is a valid target for ",e_turret.netname,"\n");
+#endif
+
+ return 1;
+}
+
+entity turret_select_target()
+{
+ entity e; // target looper entity
+ entity e_enemy; // currently best scoreing enemy
+
+ float score; // current target (e) score
+ float m_score; // current best target (e_enemy) score
+ float f;
+ // string s;
+ e = findradius(self.origin,self.target_range);
+
+ // Nothing to aim at.
+ if (!e) return world;
+
+ m_score = 0;
+
+ while (e)
+ {
+ f = turret_validate_target(self,e,self.target_select_flags);
+ //s = ftos(f);
+ //bprint(e.netname, " = ",s,"\n");
+ if (f > 0)
+ {
+
+ score = self.turret_score_target(self,e);
+
+ if ((score > m_score) && (score > 0))
+ {
+ e_enemy = e;
+ m_score = score;
+ }
+ }
+
+ e = e.chain;
+ }
+
+// self.tur_lastscore = m_score;
+
+ //if (self.enemy != e_enemy)
+ //self.volly_counter = 0;
+
+ return e_enemy;
+}
+
+void turret_think()
+{
+ entity e;
+
+ self.nextthink = (time + self.ticrate);
+
+ // ONS uses somewhat backwards linking.
+ if (teamplay)
+ {
+ if (g_onslaught)
+ {
+
+ }
+ else
+ {
+ if (self.target)
+ {
+ e = find(world,targetname,self.target);
+ if (e != world)
+ self.team = e.team;
+ }
+ }
+
+ if (self.team != self.tur_head.team)
+ turret_stdproc_respawn();
+ }
+
+
+ if (cvar("g_turrets_reloadcvars") == 1)
+ {
+ e = nextent(world);
+ while (e)
+ {
+ if (e.tur_head != world)
+ {
+
+ load_unit_settings(e,e.cvar_basename,1);
+ e.turret_postthink();
+ }
+
+ e = nextent(e);
+ }
+
+ cvar_set("g_turrets_reloadcvars","0");
+ }
+
+#ifdef TURRET_DEBUG
+ if (self.tur_dbg_tmr1 < time)
+ {
+ if (self.enemy) paint_target (self.enemy,128,self.tur_dbg_rvec,0.9);
+ paint_target(self,256,self.tur_dbg_rvec,0.9);
+ self.tur_dbg_tmr1 = time + 1;
+ }
+#endif
+
+ //Do custom prethink, and bail if it fails.
+ //if (!self.turret_prethink()) return;
+
+ // Handle ammo
+ if (self.ammo < self.ammo_max)
+ self.ammo = min(self.ammo + self.ammo_recharge,self.ammo_max);
+
+
+ // Inactive turrets needs to run the think loop too
+ // So they can handle animation and wake up if need be.
+ if(!self.tur_active)
+ {
+ turret_stdproc_track();
+ return;
+ }
+
+ //This is just wrong :|
+ if(self.deadflag != DEAD_NO)
+ {
+ dprint("Warning:dead turret running the think function!\n");
+ //self.enemy = world;
+ //turret_stdproc_track();
+ return;
+ }
+
+ // This is typicaly used for zaping every target in range
+ // turret_fusionreactor uses this to recharge friendlys.
+ if (self.shoot_flags & TFL_SHOOT_HITALLVALID)
+ {
+
+ // Do a self.turret_fire for every valid target.
+ e = findradius(self.origin,self.target_range);
+
+ while (e)
+ {
+ if (turret_validate_target(self,e,self.target_validate_flags))
+ {
+ self.enemy = e;
+
+ turret_do_updates(self);
+
+ if ( self.turret_firecheckfunc() ) turret_fire();
+ }
+
+ e = e.chain;
+ }
+ self.enemy = world;
+
+ }
+ else
+ {
+ // Check if we have a vailid enemy, and try to find one if we dont.
+ if ((turret_validate_target(self,self.enemy,self.target_validate_flags) <= 0) || (self.cnt < time))
+ {
+ self.enemy = turret_select_target();
+ self.cnt = time + cvar("g_turrets_targetscan_mindelay");
+ }
+
+
+ // No target, just go to idle, do any custom stuff and bail.
+ if (self.enemy == world)
+ {
+ // Turn & pitch
+ if (!self.track_flags & TFL_TRACK_NO)
+ turret_stdproc_track();
+
+ // do any per-turret stuff
+ self.turret_postthink();
+
+ // And bail.
+ return;
+ }
+ else
+ self.lip = time; // Keep track of the last time we had a target.
+
+ turret_do_updates(self);
+
+ // Predict or whatnot
+ if not((self.aim_flags & TFL_AIM_NO))
+ self.tur_aimpos = turret_stdproc_aim_generic();
+
+ // Fire?
+ if (self.turret_firecheckfunc() != 0)
+ turret_fire();
+
+ turret_do_updates(self);
+
+ // Turn & pitch
+ if (!self.track_flags & TFL_TRACK_NO)
+ turret_stdproc_track();
+
+ turret_do_updates(self);
+
+ // Fire?
+ if (self.turret_firecheckfunc() != 0)
+ turret_fire();
+ }
+
+ // do any per-turret stuff
+ self.turret_postthink();
+}
+
+void turret_fire()
+{
+ if (cvar("g_turrets_nofire") != 0) return;
+ if ((!self.tur_active) || (self.deadflag != DEAD_NO)) return;
+
+ self.turret_firefunc();
+
+ self.attack_finished_single = time + self.shot_refire;
+ self.ammo = self.ammo - self.shot_dmg;
+ self.volly_counter = self.volly_counter - 1;
+
+
+ if (self.volly_counter <= 0)
+ {
+ self.volly_counter = self.shot_volly;
+ if (self.shoot_flags & TFL_SHOOT_CLEARTARGET) self.enemy = world;
+
+ if (self.shot_volly > 1)
+ self.attack_finished_single = time + self.shot_volly_refire;
+ }
+
+
+#ifdef TURRET_DEBUG
+ if (self.enemy) paint_target3(self.tur_aimpos ,64,self.tur_dbg_rvec,self.tur_impacttime+0.25);
+#endif
+}
+
+void turret_stdproc_fire()
+{
+ dprint("^1Bang, ^3your dead^7 ",self.enemy.netname,"! ^1(turret with no real firefunc)\n");
+}
+
+void turret_stdproc_use()
+{
+ // bprint("Used:",self.netname, " By ",other.netname,"\n");
+
+ // ONS Uses _use to communicate.
+ if (g_onslaught)
+ {
+ entity e;
+
+ if (self.targetname)
+ {
+ e = find(world,target,self.targetname);
+ if (e != world)
+ self.team = e.team;
+ }
+
+ if (self.team != self.tur_head.team)
+ turret_stdproc_respawn();
+
+ if(self.team == 0)
+ self.tur_active = 0;
+ else
+ self.tur_active = 1;
+
+ }
+ else
+ {
+ if (self.tur_active)
+ self.tur_active = 0;
+ else
+ self.tur_active = 1;
+ }
+
+}
+
+/*
+* Standard turret initialization. use this!
+* (unless you have a very good reason not to.)
+* Any special stuff like multiple cannon models should be done
+* after this is proc called.
+* if the return value is 0, the turret should be removed.
+*/
+float turret_stdproc_init (string cvar_base_name)
+{
+ entity e;
+
+ // Are turrets allowed atm?
+ if (cvar("g_turrets") == 0) return 0;
+
+ // Better more then once then never.
+ // turret_gibs_precash();
+
+ if (self.spawnflags & 2)
+ {
+ entity tb;
+ precache_model("models/turrets/terrainbase.md3");
+ tb = spawn();
+ setmodel(tb,"models/turrets/terrainbase.md3");
+ setorigin(tb,self.origin);
+ tb.solid = SOLID_BBOX;
+ makestatic(tb);
+ }
+
+ self.cvar_basename = cvar_base_name;
+ load_unit_settings(self,self.cvar_basename,0);
+
+ // Group all turrets into the same team if in non teamplaymode, so they dont try to kill eachother.
+ if (cvar("g_assult") != 0)
+ {
+ if (!self.team)
+ self.team = 14; // Assume turrets are on the defending side if not explicitly set otehrwize
+ }
+ else if (!teamplay)
+ self.team = MAX_SHOT_DISTANCE;
+ else if(g_onslaught && self.targetname)
+ {
+ e = find(world,target,self.targetname);
+ if(e != world)
+ self.team = e.team;
+ }
+ else if(!self.team)
+ self.team = MAX_SHOT_DISTANCE;
+
+
+ /*
+ * Try to guess some reasonaly defaults
+ * for missing params and do sanety checks
+ * thise checks could produce some "interesting" results
+ * if it hits a glitch in my logic :P so try to set as mutch
+ * as possible beforehand.
+ */
+ if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
+ {
+ // Support units generaly dont need to have a high speed ai-loop
+ if (!self.ticrate) self.ticrate = 0.25; // Speed of this turrets AI loop
+ }
+ else
+ {
+ if (!self.ticrate) self.ticrate = 0.1; // Speed of this turrets AI loop
+ }
+
+ self.ticrate = bound(0.01,self.ticrate,60); // keep it sane plz
+
+// General stuff
+ if (self.netname == "") self.netname = "turret";
+
+ if (!self.respawntime) self.respawntime = 60;
+ self.respawntime = max(-1,self.respawntime);
+
+ if (!self.health) self.health = 1000;
+ self.tur_health = max(1,self.health);
+
+ if (!self.turrcaps_flags) self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
+
+ if (!self.damage_flags) self.damage_flags = TFL_DMG_YES | TFL_DMG_RETALIATE | TFL_DMG_AIMSHAKE;
+
+// Shot stuff.
+ if (!self.shot_refire) self.shot_refire = 1;
+ self.shot_refire = bound(0.01,self.shot_refire,9999);
+
+ if (!self.shot_dmg) self.shot_dmg = self.shot_refire * 50;
+ self.shot_dmg = max(1,self.shot_dmg);
+
+ if (!self.shot_radius) self.shot_radius = self.shot_dmg * 0.5;
+ self.shot_radius = max(1,self.shot_radius);
+
+ if (!self.shot_speed) self.shot_speed = 2500;
+ self.shot_speed = max(1,self.shot_speed);
+
+ if (!self.shot_spread) self.shot_spread = 0.0125;
+ self.shot_spread = bound(0.0001,self.shot_spread,500);
+
+ if (!self.shot_force) self.shot_force = self.shot_dmg * 0.5 + self.shot_radius * 0.5;
+ self.shot_force = bound(0.001,self.shot_force,MAX_SHOT_DISTANCE * 0.5);
+
+ if (!self.shot_volly) self.shot_volly = 1;
+ self.shot_volly = bound(1,self.shot_volly,floor(self.ammo_max / self.shot_dmg));
+
+ if (!self.shot_volly_refire) self.shot_volly_refire = self.shot_refire * self.shot_volly;
+ self.shot_volly_refire = bound(self.shot_refire,self.shot_volly_refire,60);
+
+ if (!self.firecheck_flags)
+ self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES |
+ TFL_FIRECHECK_LOS | TFL_FIRECHECK_AIMDIST | TFL_FIRECHECK_TEAMCECK |
+ TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_WORLD;
+
+// Range stuff.
+ if (!self.target_range) self.target_range = self.shot_speed * 0.5;
+ self.target_range = bound(0,self.target_range,MAX_SHOT_DISTANCE);
+
+ if (!self.target_range_min) self.target_range_min = self.shot_radius * 2;
+ self.target_range_min = bound(0,self.target_range_min,MAX_SHOT_DISTANCE);
+
+ if (!self.target_range_fire) self.target_range_fire = self.target_range * 0.8;
+ self.target_range_fire = bound(0,self.target_range_fire,MAX_SHOT_DISTANCE);
+
+ if (!self.target_range_optimal) self.target_range_optimal = self.target_range_fire * 0.5;
+ self.target_range_optimal = bound(0,self.target_range_optimal,MAX_SHOT_DISTANCE);
+
+
+// Aim stuff.
+ if (!self.aim_maxrot) self.aim_maxrot = 45;
+ self.aim_maxrot = bound(0,self.aim_maxrot,361);
+
+ if (!self.aim_maxpitch) self.aim_maxpitch = 20;
+ self.aim_maxpitch = bound(0,self.aim_maxpitch,90);
+
+ if (!self.aim_speed) self.aim_speed = 36;
+ self.aim_speed = bound(0.1,self.aim_speed, 1000);
+
+ if (!self.aim_firetolerance_dist) self.aim_firetolerance_dist = 5 + (self.shot_radius * 2);
+ self.aim_firetolerance_dist = bound(0.1,self.aim_firetolerance_dist,MAX_SHOT_DISTANCE);
+
+// if (!self.aim_firetolerance_angle) self.aim_firetolerance_angle = 10;
+// self.aim_firetolerance_angle = bound(0.1,self.aim_firetolerance_angle,360);
+
+ if (!self.aim_flags) self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE;
+
+ // Sill the most tested (and aim-effective)
+ if (!self.track_type) self.track_type = TFL_TRACKTYPE_STEPMOTOR;
+
+ if (self.track_type != TFL_TRACKTYPE_STEPMOTOR)
+ {
+ // Fluid / Ineria mode. Looks mutch nicer, bit experimental &
+ // Can inmapt aim preformance alot.
+ // needs a bit diffrent aimspeed
+ if (!self.aim_speed) self.aim_speed = 180;
+ self.aim_speed = bound(0.1,self.aim_speed, 1000);
+
+ if (!self.track_accel_pitch) self.track_accel_pitch = 0.75;
+ if (!self.track_accel_rot) self.track_accel_rot = 0.75;
+ if (!self.track_blendrate) self.track_blendrate = 0.35;
+ }
+
+ if (!self.track_flags) self.track_flags = TFL_TRACK_PITCH | TFL_TRACK_ROT;
+
+
+// Target selection stuff.
+ if (!self.target_select_rangebias) self.target_select_rangebias = 1;
+ self.target_select_rangebias = bound(-10,self.target_select_rangebias,10);
+
+ if (!self.target_select_samebias) self.target_select_samebias = 1;
+ self.target_select_samebias = bound(-10,self.target_select_samebias,10);
+
+ if (!self.target_select_anglebias) self.target_select_anglebias = 1;
+ self.target_select_anglebias = bound(-10,self.target_select_anglebias,10);
+
+ if (!self.target_select_missilebias) self.target_select_missilebias = -10;
+ self.target_select_missilebias = bound(-10,self.target_select_missilebias,10);
+ self.target_select_playerbias = bound(-10,self.target_select_playerbias,10);
+
+ if (!self.target_select_flags)
+ if (self.turrcaps_flags & TFL_TURRCAPS_MISSILEKILL)
+ self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_MISSILES |
+ TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_ANGLELIMITS;
+ else
+ self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS |
+ TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_ANGLELIMITS;
+
+ //if(!self.target_validate_flags)
+ self.target_validate_flags = self.target_select_flags;
+
+
+// Ammo stuff
+ if (!self.ammo_max) self.ammo_max = self.shot_dmg * 10;
+ self.ammo_max = max(self.shot_dmg,self.ammo_max);
+
+ if (!self.ammo) self.ammo = self.shot_dmg * 5;
+ self.ammo = bound(0,self.ammo,self.ammo_max);
+
+ if (!self.ammo_recharge) self.ammo_recharge = self.shot_dmg / 2;
+ self.ammo_recharge = max(0,self.ammo_recharge);
+
+ // Convert the recharge from X per sec to X per ticrate
+ self.ammo_recharge = self.ammo_recharge * self.ticrate;
+
+ if (!self.ammo_flags) self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
+
+// Offsets & origins
+ if (!self.tur_aimorg) self.tur_aimorg = '0 0 50';
+ if (!self.tur_shotorg) self.tur_shotorg = '50 0 50';
+
+// End of default & sanety checks, start building the turret.
+
+// Spawn extra bits
+ self.tur_head = spawn();
+
+ self.tur_head.netname = self.tur_head.classname = "turret_head";
+ self.tur_head.team = self.team;
+
+ // Defend mode?
+ if (self.target != "")
+ {
+ self.tur_defend = find(world, targetname, self.target);
+ if (self.tur_defend == world)
+ {
+ self.target = "";
+ dprint("Turret has invalid defendpoint!\n");
+ }
+ }
+
+// Claim ownership
+ self.tur_head.owner = self;
+
+// Put pices in place
+
+ if (!(self.turrcaps_flags & TFL_TURRCAPS_LINKED))
+ setorigin(self.tur_head,self.origin);
+
+ // In target defense mode, aim on the spot to defens when idle.
+ if (self.tur_defend)
+ self.idle_aim = self.tur_head.angles + angleofs(self.tur_head,self.tur_defend);
+ else
+ self.idle_aim = self.angles;
+
+ if (!(self.turrcaps_flags & TFL_TURRCAPS_LINKED))
+ self.tur_head.angles = self.idle_aim;
+
+ if (!self.health) self.health = 150;
+ self.tur_health = self.health;
+
+ //Solid bbox for preformance reasons
+ self.solid = SOLID_BBOX;
+ self.tur_head.solid = SOLID_BBOX;
+
+ self.takedamage = DAMAGE_AIM;
+ self.tur_head.takedamage = DAMAGE_AIM;
+
+ self.movetype = MOVETYPE_NOCLIP;
+ self.tur_head.movetype = MOVETYPE_NOCLIP;
+
+ // Team colouring?track
+ if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
+ if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
+
+ // Attach stdprocs. override when and what needed
+ if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
+ {
+ //self.turret_prethink = turret_stdproc_true;
+ self.turret_score_target = turret_stdproc_targetscore_support;
+ //self.turret_aim = turret_stdproc_aim_generic;
+ //self.turret_track = turret_stdproc_track;
+ self.turret_firecheckfunc = turret_stdproc_firecheck;
+ self.turret_firefunc = turret_stdproc_fire;
+ self.turret_postthink = turret_stdproc_nothing;
+
+ //self.turret_damagefunc = turret_stdproc_damage;
+ self.event_damage = turret_stdproc_damage;
+ self.tur_head.event_damage = turret_stdproc_damage;
+
+ //self.turret_diefunc = turret_stdproc_die;
+ //self.turret_spawnfunc = turret_stdproc_respawn;
+
+ }
+ else
+ {
+
+ //self.turret_prethink = turret_stdproc_true;
+ self.turret_score_target = turret_stdproc_targetscore_generic;
+
+ //if (self.aim_flags & TFL_AIM_SIMPLE)
+ // self.turret_aim = turret_stdproc_aim_simple;
+ //else
+ // self.turret_aim = turret_stdproc_aim_generic;
+
+ //self.turret_track = turret_stdproc_track;
+ self.turret_firecheckfunc = turret_stdproc_firecheck;
+ self.turret_firefunc = turret_stdproc_fire;
+ self.turret_postthink = turret_stdproc_nothing;
+
+ //self.turret_damagefunc = turret_stdproc_damage;
+ self.event_damage = turret_stdproc_damage;
+ self.tur_head.event_damage = turret_stdproc_damage;
+
+ //self.turret_diefunc = turret_stdproc_die;
+ //self.turret_spawnfunc = turret_stdproc_respawn;
+ self.turret_addtarget = turret_stdproc_false;
+ }
+
+ self.use = turret_stdproc_use;
+ self.bot_attack = TRUE;
+
+ // Initiate the main AI loop
+ self.think = turret_think;
+ self.nextthink = time + self.ticrate;
+
+ self.tur_head.team = self.team;
+ self.view_ofs = '0 0 0';
+
+#ifdef TURRET_DEBUG
+ self.tur_dbg_start = self.nextthink;
+ while (vlen(self.tur_dbg_rvec) < 2)
+ self.tur_dbg_rvec = randomvec() * 4;
+
+ self.tur_dbg_rvec_x = fabs(self.tur_dbg_rvec_x);
+ self.tur_dbg_rvec_y = fabs(self.tur_dbg_rvec_y);
+ self.tur_dbg_rvec_z = fabs(self.tur_dbg_rvec_z);
+#endif
+
+ // Its all good.
+ self.classname = "turret_main";
+
+ self.tur_active = 1;
+
+ if (g_onslaught)
+ self.use();
+
+ return 1;
+}
+
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/system/system_misc.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,123 @@
+//--// Some support routines //--//
+
+// Get real origin
+vector real_origin(entity ent)
+{
+ entity e;
+ vector v;
+
+ e = ent.tag_entity;
+ while(e)
+ {
+ // v = v + e.origin;
+ v = v + ((e.absmin + e.absmax) * 0.5);
+ e = e.tag_entity;
+ }
+ //v = v + ent.origin;
+ v = v + ((ent.absmin + ent.absmax) * 0.5);
+ return v;
+
+}
+
+// Plug this into wherever precashing is done.
+void g_turrets_common_precash()
+{
+ precache_model ("models/turrets/c512.md3");
+}
+
+/*
+* Paint a v_color colord circle on target onwho
+* that fades away over f_time
+*/
+void paint_target(entity onwho, float f_size, vector v_color, float f_time)
+{
+ entity e;
+
+ e = spawn();
+ setmodel(e, "models/turrets/c512.md3"); // precision set above
+ e.scale = (f_size/512);
+ //setsize(e, '0 0 0', '0 0 0');
+ //setattachment(e,onwho,"");
+ setorigin(e,onwho.origin + '0 0 1');
+ e.alpha = 0.15;
+ e.movetype = MOVETYPE_FLY;
+
+ e.velocity = (v_color * 32); // + '0 0 1' * 64;
+
+ e.colormod = v_color;
+ SUB_SetFade(e,time,f_time);
+}
+
+void paint_target2(entity onwho, float f_size, vector v_color, float f_time)
+{
+ entity e;
+
+ e = spawn();
+ setmodel(e, "models/turrets/c512.md3"); // precision set above
+ e.scale = (f_size/512);
+ setsize(e, '0 0 0', '0 0 0');
+
+ setorigin(e,onwho.origin + '0 0 1');
+ e.alpha = 0.15;
+ e.movetype = MOVETYPE_FLY;
+
+ e.velocity = (v_color * 32); // + '0 0 1' * 64;
+ e.avelocity_x = -128;
+
+ e.colormod = v_color;
+ SUB_SetFade(e,time,f_time);
+}
+
+void paint_target3(vector where, float f_size, vector v_color, float f_time)
+{
+ entity e;
+ e = spawn();
+ setmodel(e, "models/turrets/c512.md3"); // precision set above
+ e.scale = (f_size/512);
+ setsize(e, '0 0 0', '0 0 0');
+ setorigin(e,where+ '0 0 1');
+ e.movetype = MOVETYPE_NONE;
+ e.velocity = '0 0 0';
+ e.colormod = v_color;
+ SUB_SetFade(e,time,f_time);
+}
+
+/*
+* Return the angle between two enteties
+*/
+vector angleofs(entity from, entity to)
+{
+ vector v_res;
+
+ // makevectors(from.angles);
+ v_res = normalize(to.origin - from.origin);
+ v_res = vectoangles(v_res);
+ v_res = v_res - from.angles;
+
+ if (v_res_x < 0) v_res_x += 360;
+ if (v_res_x > 180) v_res_x -= 360;
+
+ if (v_res_y < 0) v_res_y += 360;
+ if (v_res_y > 180) v_res_y -= 360;
+
+ return v_res;
+}
+
+vector angleofs2(entity from, vector to)
+{
+ vector v_res;
+
+ // makevectors(from.angles);
+ v_res = normalize(to - from.origin);
+ v_res = vectoangles(v_res);
+ v_res = v_res - from.angles;
+
+ if (v_res_x < 0) v_res_x += 360;
+ if (v_res_x > 180) v_res_x -= 360;
+
+ if (v_res_y < 0) v_res_y += 360;
+ if (v_res_y > 180) v_res_y -= 360;
+
+ return v_res;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/system/system_scoreprocs.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_scoreprocs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,164 @@
+/*
+.float target_select_flags; /// target selection flags
+float TFL_TARGETSELECT_NO = 1; /// Dont select a target on its own.
+float TFL_TARGETSELECT_LOS = 2; /// Need line of sight
+float TFL_TARGETSELECT_PLAYERS = 4; /// Players are valid targets
+float TFL_TARGETSELECT_MISSILES = 8; /// Missiles are valid targets
+float TFL_TARGETSELECT_TRIGGERTARGET = 16; /// Responds to turret_trigger_target events
+float TFL_TARGETSELECT_ANGLELIMITS = 32; /// Angular limitations of turret head limits target selection
+float TFL_TARGETSELECT_RANGELIMTS = 64; /// Range limits apply in targetselection
+float TFL_TARGETSELECT_TEAMCHECK = 128; /// Consider team own <-> targets team
+float TFL_TARGETSELECT_NOBUILTIN = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
+float TFL_TARGETSELECT_OWNTEAM = 512;
+*/
+
+float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
+{
+ float score; // Total score
+ float s_score,d_score;
+
+ if (e_turret.enemy == e_target) s_score = 1;
+
+ d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+
+ score = (d_score * e_turret.target_select_rangebias) +
+ (s_score * e_turret.target_select_samebias);
+
+ return score;
+}
+
+/*
+* Generic bias aware score system.
+*/
+float turret_stdproc_targetscore_generic(entity e_turret,entity e_target)
+{
+ //vector v_tmp;
+ float d_dist; // Defendmode Distance
+
+ float score; // Total score
+ float d_score; // Distance score
+ //float da_score; // Distance from aimpoint score
+ float a_score; // Angular score
+ float s_score; // samescore (same target as last time)
+ float m_score; // missile score
+ float p_score; // player score
+
+ float ikr; // ideal kill range
+
+ if(!e_target) return 0;
+
+ if (e_target == e_turret.enemy) s_score = 1;
+
+ if (e_turret.tur_defend)
+ {
+ d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
+ ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
+ d_score = 1 - d_dist / e_turret.target_range;
+ }
+ else
+ {
+ // Make a normlized value base on the targets distance from our optimal killzone
+ ikr = e_turret.target_range_optimal;
+ d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
+ }
+
+ /*
+ // Determine the maximum time it could take this turrent to aim at someting.
+ max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
+
+ // Find out how long it would take to aim at this taget.
+ aim_delay = (thadf+0.01) / e_turret.aim_speed;
+
+ // Turn this info into a normalized value.
+ aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
+ a_score = 1 - aim_delay;
+ */
+
+ //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
+ a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
+
+ if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
+ m_score = 1;
+
+ if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
+ p_score = 1;
+
+ d_score = max(d_score,0);
+ s_score = max(s_score,0);
+ a_score = max(a_score,0);
+ m_score = max(m_score,0);
+ p_score = max(p_score,0);
+
+ score = (d_score * e_turret.target_select_rangebias) +
+ (s_score * e_turret.target_select_samebias) +
+ (a_score * e_turret.target_select_anglebias) +
+ (m_score * e_turret.target_select_missilebias) +
+ (p_score * e_turret.target_select_playerbias);
+
+ if(e_turret.target_range_fire < vlen(e_turret.tur_shotorg_updated - real_origin(e_target)))
+ score *= 0.1;
+
+#ifdef TURRET_DEBUG
+ string sd,sv,sa,sm,sp,ss;
+ string sdt,svt,sat,smt,spt;
+
+ sd = ftos(d_score);
+ d_score *= e_turret.target_select_rangebias;
+ sdt = ftos(d_score);
+
+ //sv = ftos(v_score);
+ //v_score *= e_turret.target_select_samebias;
+ //svt = ftos(v_score);
+
+ sa = ftos(a_score);
+ a_score *= e_turret.target_select_anglebias;
+ sat = ftos(a_score);
+
+ sm = ftos(m_score);
+ m_score *= e_turret.target_select_missilebias;
+ smt = ftos(m_score);
+
+ sp = ftos(p_score);
+ p_score *= e_turret.target_select_playerbias;
+ spt = ftos(p_score);
+
+
+ ss = ftos(score);
+ bprint("^3Target scores^7 \[ ",e_turret.netname, " \] ^3for^7 \[ ", e_target.netname," \]\n");
+ bprint("^5Range:\[ ",sd, " \]^2+bias:\[ ",sdt," \]\n");
+ //bprint("^5Volly:\[ ",sv, " \]^2+bias:\[ ",svt," \]\n");
+ bprint("^5Angle:\[ ",sa, " \]^2+bias:\[ ",sat," \]\n");
+ bprint("^5Missile:\[ ",sm," \]^2+bias:\[ ",smt," \]\n");
+ bprint("^5Player:\[ ",sp, " \]^2+bias:\[ ",spt," \]\n");
+ bprint("^3Total (w/bias):\[^1",ss,"\]\n");
+
+#endif
+
+ return score;
+}
+
+float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
+{
+ return 1 - (tvt_dist / e_turret.target_range);
+}
+
+float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
+{
+ return tvt_dist / e_turret.target_range;
+}
+
+float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
+{
+ return min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+}
+
+float turret_stdproc_score_angular(entity e_turret,entity e_target)
+{
+ return 1 - (tvt_thadf / e_turret.aim_maxrot);
+}
+
+float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
+{
+ return 0;
+ //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
+}
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_aimprocs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,120 +0,0 @@
-/*
-* Straight line, Dead-on (no prediction)
-* Usefull for "stupid turrets" or ones
-* that launch guided weapons and just need to apeer to
-* somewhat face (and/or track) the target.
-
-supports:
-TFL_AIM_NO
-*/
-vector turret_stdproc_aim_simple()
-{
- float s_bu; // Solidity backup (for ground shooters)
- vector aim_pos;
-
- if (self.aim_flags & TFL_AIM_NO) return self.idle_aim;
-
- aim_pos = self.enemy.origin;
-
- // Target ground?
- if (self.aim_flags & TFL_AIM_GROUND)
- {
- s_bu = self.enemy.solid;
- self.enemy.solid = SOLID_NOT;
- traceline(self.enemy.origin + '0 0 128',self.enemy.origin + '0 0 -99999',1,self.enemy);
- self.enemy.solid = s_bu;
- aim_pos = trace_endpos;
- }
-
- // This is where its at.
- return aim_pos;
-}
-
-/*
-* Generic aim
-
-supports:
-TFL_AIM_NO
-TFL_AIM_GROUND
-TFL_AIM_LEAD
-TFL_AIM_SHOTTIMECOMPENSATE
-TFL_AIM_INFRONT
-TFL_AIM_BEHIND
-TFL_AIM_ZEASE
-
-not supported:
-TFL_AIM_BALISTIC
-*/
-vector turret_stdproc_aim_generic()
-{
- vector pre_pos;
-
- if (self.aim_flags == TFL_AIM_NO)
- return self.idle_aim;
-
- // Baseline
- pre_pos = real_origin(self.enemy);
-
- // Lead?
- if (self.aim_flags & TFL_AIM_LEAD)
- if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE) // Need to conpensate for shot traveltime
- pre_pos += self.enemy.velocity * (self.tur_dist_enemy / self.shot_speed);
- else if (self.turrcaps_flags & TFL_TURRCAPS_HITSCAN) // Hitscan gun, conpensate for frametime and posibly refire offset.
- pre_pos += self.enemy.velocity * (frametime + min(max(self.attack_finished_single - time,0),self.ticrate*2));
- else // No lead
- pre_pos += self.enemy.velocity;
-
- // Smooth out predict-Z?
- if (self.aim_flags & TFL_AIM_ZEASE)
- {
- vector v;
- v = real_origin(self.enemy);
- //pre_pos_z = (pre_pos_z * 0.5) + (v_z * 0.5);
- pre_pos_z = (pre_pos_z + v_z) * 0.5;
- }
-
- if (self.aim_flags & TFL_AIM_INFRONT) // Aim a bit in front of the target
- pre_pos -= normalize(self.tur_aimorg_updated - pre_pos) * 32;
-
- if (self.aim_flags & TFL_AIM_BEHIND) // Aim a bit behind the target
- pre_pos += normalize(self.tur_aimorg_updated - pre_pos) * 32;
-
-
- // This turret should hit the ground neer a target rather the do a direct hit
- if ( (self.aim_flags & TFL_AIM_GROUND) ||
- ((self.aim_flags & TFL_AIM_GROUND2) && (self.enemy.flags & FL_ONGROUND)) )
- {
- traceline(pre_pos + '0 0 512',pre_pos - '0 0 2048',1,self.enemy);
- pre_pos = trace_endpos;
- }
-
- // self.tur_impacttime = vlen(pre_pos - self.origin) / self.shot_speed;
-
- return pre_pos;
-}
-
-
-/*
-* Aim where it is
-supports:
-TFL_AIM_NO
-*/
-vector turret_stdproc_aim_rail()
-{
- vector pre_pos;
-
- if (self.aim_flags & TFL_AIM_NO)
- return self.idle_aim;
-
- pre_pos = real_origin(self.enemy);
-
- self.tur_dist_toaimpos = vlen(self.enemy.origin - self.tur_aimorg_updated);
-
- self.tur_impacttime = time;
-
- return pre_pos;
-
-}
-
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_damage.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_damage.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,304 +0,0 @@
-/*
-* Trow a turret gib
-*/
-void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
-{
- self.velocity += vforce;
-}
-
-void turret_trowgib(
- vector v_from, vector v_to, vector v_colormod,
- string smodel,
- float f_lifetime, float f_fadetime, float b_burn)
-{
- local entity gib;
- local entity burn;
-
- gib = spawn();
-
- gib.classname = "turret_gib";
- setmodel(gib,smodel);
- setorigin(gib,v_from);
- SUB_SetFade(gib,time + f_lifetime,2);
-
- gib.solid = SOLID_BBOX;
-
- gib.movetype = MOVETYPE_BOUNCE;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.colormod = v_colormod;
- gib.velocity = v_to;
-
- if (b_burn)
- {
- burn = spawn();
- burn.effects = EF_LOWPRECISION|EF_FLAME;
- setattachment(burn,gib,"");
- setorigin(burn,(gib.mins + gib.maxs) * 0.5);
- SUB_SetFade(burn,time + (f_lifetime * 0.5) ,2);
- }
-}
-
-void turret_gib_boom()
-{
- entity gib;
- float i;
- string s;
-
- for (i = 1; i < 5; i = i +1)
- {
- gib = spawn();
- gib.classname = "turret_gib";
-
- s = strcat("models/turrets/head-gib",ftos(i));
- s = strcat(s,".md3");
- // bprint("s:",s,"\n");
- setmodel(gib,s);
-
- setorigin(gib,self.origin);
-
- SUB_SetFade(gib,time + 5,2);
-
- gib.solid = SOLID_BBOX;
-
- gib.movetype = MOVETYPE_BOUNCE;
- gib.gravity = 0.5;
- gib.damageforcescale = 2;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.velocity = self.velocity + (randomvec() * 700);
- gib.avelocity = randomvec() * 64;
- }
-
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
-
- remove(self);
-}
-
-void turret_trowgib2(
- vector v_from, vector v_to, vector v_colormod,
- entity e_mimic, float boomtime)
-{
- entity gib;
-
- gib = spawn();
-
- gib.classname = "turret_gib";
- setmodel(gib,e_mimic.model);
- setorigin(gib,v_from);
-
- gib.solid = SOLID_BBOX;
-
- gib.movetype = MOVETYPE_BOUNCE;
- gib.gravity = 0.75;
- gib.damageforcescale = 2;
- gib.takedamage = DAMAGE_YES;
- gib.event_damage = turret_gib_damage;
- gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.colormod = v_colormod;
- gib.velocity = v_to;
- gib.avelocity = randomvec() * 32;
- gib.think = turret_gib_boom;
- gib.nextthink = boomtime;
- gib.effects = EF_FLAME;
-
-
-}
-/*
-* Spawn a boom, trow fake bits arround
-* and hide the real ones.
-*/
-void turret_stdproc_die()
-{
- vector org2;
- vector t_dir;
-
- // self.tur_active = 0;
-
- self.deadflag = DEAD_DEAD;
- self.tur_head.deadflag = self.deadflag;
-
- sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", 1, ATTN_NORM);
- org2 = self.origin + '0 0 40';
-
-// Explotion grafix
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
-// Unsolidify and hide real parts
- self.solid = SOLID_NOT;
- self.tur_head.solid = self.solid;
-
- self.alpha = -1;
- self.tur_head.alpha = -1;
-
- self.takedamage = DAMAGE_NO;
- self.tur_head.takedamage = self.takedamage;
-
- self.effects = 0;
- self.tur_head.effects = self.effects;
-
- self.health = 0;
-
-
-// Trow fake parts arround
-
- // base
- makevectors(self.angles);
- if (random() > 0.5)
- {
- turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib2.md3",min(self.respawntime,20),1,1);
- t_dir = (v_up * 700) + (randomvec() * 300);
- turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib3.md3",min(self.respawntime,10),1,1);
- t_dir = (v_up * 700) + (randomvec() * 300);
- turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib4.md3",min(self.respawntime,10),1,1);
- }
- else
- {
- turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib1.md3",min(self.respawntime,20),1,1);
- }
-
- // Blow the top part up into the air
- turret_trowgib2( self.origin + (v_up * 50),
- v_up * 150 + randomvec() * 50,
- '0.2 0.2 0.2',
- self.tur_head,time + 0.5 + (random() * 0.5));
-
-
-// Go boom
- RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,0,world);
-
-// Setup respawn
- self.nextthink = time + self.respawntime;
- //self.think = self.turret_spawnfunc;
- self.think = turret_stdproc_respawn;
-
- if (self.turret_diehook)
- self.turret_diehook();
-}
-
-void turret_stdproc_respawn()
-{
- // self.tur_active = 1;
-
- // Make sure all parts belong to the same team since
- // this function doubles as "teamchange" function.
- self.tur_head.team = self.team;
- if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
- if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-
- self.deadflag = DEAD_NO;
- self.tur_head.deadflag = self.deadflag;
- self.effects = self.tur_head.effects = 0;
-
- self.solid = SOLID_BBOX;
- self.tur_head.solid = self.solid;
-
- self.alpha = 1;
- self.tur_head.alpha = self.alpha;
-
- self.takedamage = DAMAGE_YES;
- self.tur_head.takedamage = self.takedamage;
-
- self.avelocity = '0 0 0';
- self.tur_head.avelocity = self.avelocity;
- self.tur_head.angles = self.idle_aim;
-
- self.health = self.tur_health;
-
- self.enemy = world;
- self.volly_counter = self.shot_volly;
- self.ammo = self.ammo_max;
-
- self.nextthink = time + self.ticrate;
- self.think = turret_think;
-
- if (self.turret_respawnhook)
- self.turret_respawnhook();
-
-}
-
-/*
-* Standard damage proc.
-*/
-void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
-{
- entity baseent,oldself;
- // entity player;
-
- if (self.health <= 0) return;
-
- // Damage func is shared on all parts as standard, we need to know what the master entity of this turret is.
- // if ((self.classname == "turret_head")||(self.classname == "turret_gun")||(self.classname == "turret_badge"))
- if (self.owner)
- baseent = self.owner;
- else
- baseent = self;
-
- if (teamplay != 0)
- {
- if (self.team == attacker.team)
- {
- sprint(attacker,"Turret: Im on your team!\n");
- return;
- }
- else
- {
- /*
- // This will get enoying fast...
- FOR_EACH_PLAYER(player)
- if(player.team == self.team)
- sprint(player, "The enemy is attacking your base!");
-
- */
- }
-
- }
-
- baseent.health = baseent.health - damage;
-
- // thorw head slightly off aim when hit?
- if ((self.classname == "turret_head") || (self.classname == "turret_gun"))
- if (self.damage_flags & TFL_DMG_HEADSHAKE)
- {
- // makevectors(baseent.tur_head.v_angle);
- baseent.tur_head.angles = baseent.tur_head.angles + randomvec() * damage;
- }
-
- if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
- {
- self.velocity = self.velocity + vforce;
- }
-
-
- // Start burning when we have 10% or less health left
- if (self.health < (self.tur_health * 0.1))
- self.effects = EF_FLAME;
-
- if (self.health <= 0)
- {
- oldself = self;
- self = baseent;
- turret_stdproc_die();
- self = oldself;
-
- //baseent.turret_diefunc();
- }
-}
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_main.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_main.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,1041 +0,0 @@
-#define cvar_base "g_turrets_unit_"
-
-//.float tur_lastscore;
-.string cvar_basename;
-
-string cvar_gets(string s_base,string s_add)
-{
- return strcat(s_base,s_add);
-}
-
-.float turret_scale_damage;
-.float turret_scale_range;
-.float turret_scale_refire;
-.float turret_scale_ammo;
-.float turret_scale_aim;
-.float turret_scale_health;
-.float turret_scale_respawn;
-
-void load_unit_settings(entity ent,string unitname,float is_reload)
-{
-
- string sbase;
-
- if (ent == world)
- return;
-
- if (!ent.turret_scale_damage) ent.turret_scale_damage = 1;
- if (!ent.turret_scale_range) ent.turret_scale_range = 1;
- if (!ent.turret_scale_refire) ent.turret_scale_refire = 1;
- if (!ent.turret_scale_ammo) ent.turret_scale_ammo = 1;
- if (!ent.turret_scale_aim) ent.turret_scale_aim = 1;
- if (!ent.turret_scale_health) ent.turret_scale_health = 1;
- if (!ent.turret_scale_respawn) ent.turret_scale_respawn = 1;
-
- sbase = strcat(cvar_base,unitname);
- if (is_reload)
- {
- ent.enemy = world;
- ent.tur_head.avelocity = '0 0 0';
- ent.tur_head.angles = ent.angles;
- }
- ent.health = cvar(cvar_gets(sbase,"_health")) * ent.turret_scale_health;
- ent.respawntime = cvar(cvar_gets(sbase,"_respawntime")) * ent.turret_scale_respawn;
-
- ent.shot_dmg = cvar(cvar_gets(sbase,"_shot_dmg")) * ent.turret_scale_damage;
- ent.shot_refire = cvar(cvar_gets(sbase,"_shot_refire")) * ent.turret_scale_refire;
- ent.shot_radius = cvar(cvar_gets(sbase,"_shot_radius")) * ent.turret_scale_damage;
- ent.shot_speed = cvar(cvar_gets(sbase,"_shot_speed"));
- ent.shot_spread = cvar(cvar_gets(sbase,"_shot_spread"));
- ent.shot_force = cvar(cvar_gets(sbase,"_shot_force")) * ent.turret_scale_damage;
- ent.shot_volly = cvar(cvar_gets(sbase,"_shot_volly"));
- ent.shot_volly_refire = cvar(cvar_gets(sbase,"_shot_volly_refire")) * ent.turret_scale_refire;
-
- ent.target_range = cvar(cvar_gets(sbase,"_target_range")) * ent.turret_scale_range;
- ent.target_range_min = cvar(cvar_gets(sbase,"_target_range_min")) * ent.turret_scale_range;
- ent.target_range_fire = cvar(cvar_gets(sbase,"_target_range_fire")) * ent.turret_scale_range;
- ent.target_range_optimal = cvar(cvar_gets(sbase,"_target_range_optimal")) * ent.turret_scale_range;
-
- ent.target_select_rangebias = cvar(cvar_gets(sbase,"_target_select_rangebias"));
- ent.target_select_samebias = cvar(cvar_gets(sbase,"_target_select_samebias"));
- ent.target_select_anglebias = cvar(cvar_gets(sbase,"_target_select_anglebias"));
- ent.target_select_playerbias = cvar(cvar_gets(sbase,"_target_select_playerbias"));
-
- ent.ammo_max = cvar(cvar_gets(sbase,"_ammo_max")) * ent.turret_scale_ammo;
- //ent.ammo = cvar(cvar_gets(sbase,"_ammo"));
- ent.ammo_recharge = cvar(cvar_gets(sbase,"_ammo_recharge")) * ent.turret_scale_ammo;
-
- ent.aim_firetolerance_dist = cvar(cvar_gets(sbase,"_aim_firetolerance_dist"));
-// ent.aim_firetolerance_angle = cvar(cvar_gets(sbase,"_aim_firetolerance_angle"));
- ent.aim_speed = cvar(cvar_gets(sbase,"_aim_speed")) * ent.turret_scale_aim;
- ent.aim_maxrot = cvar(cvar_gets(sbase,"_aim_maxrot"));
- ent.aim_maxpitch = cvar(cvar_gets(sbase,"_aim_maxpitch"));
-
- ent.track_type = cvar(cvar_gets(sbase,"_track_type"));
- ent.track_accel_pitch = cvar(cvar_gets(sbase,"_track_accel_pitch"));
- ent.track_accel_rot = cvar(cvar_gets(sbase,"_track_accel_rot"));
- ent.track_blendrate = cvar(cvar_gets(sbase,"_track_blendrate"));
-}
-
-float turret_stdproc_true()
-{
- return 1;
-}
-
-float turret_stdproc_false()
-{
- return 0;
-}
-
-void turret_stdproc_nothing()
-{
- return;
-}
-
-/**
-** updates enemy distances, preicted impact point/time
-** & aim<->predict impact distance.
-** Also translates shoot & aimorgs by current rotation.
-**/
-void turret_do_updates(entity e_turret)
-{
- //vector trueaimpoint;
-
- if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
- {
- e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
- e_turret.angles_x = e_turret.angles_x * -1;
- makevectors(e_turret.tur_head.angles + e_turret.angles);
- e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
- e_turret.angles_x = e_turret.angles_x * -1;
- }
- else
- {
- e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
- makevectors(e_turret.tur_head.angles);
- e_turret.tur_head.angles_x = e_turret.tur_head.angles_x * -1;
- }
-
- //traceline_hitcorpse(e_turret, e_turret.origin, e_turret.origin + v_forward * MAX_SHOT_DISTANCE, MOVE_NOMONSTERS, e_turret);
- //trueaimpoint = trace_endpos;
-
- e_turret.tur_shotorg_updated = e_turret.origin + v_forward * e_turret.tur_shotorg_x + v_right * e_turret.tur_shotorg_y + v_up * e_turret.tur_shotorg_z;
- //e_turret.tur_shotdir_updated = normalize(trueaimpoint - e_turret.tur_shotorg_updated);
- e_turret.tur_shotdir_updated = normalize((e_turret.tur_shotorg_updated + v_forward * 512) - e_turret.tur_shotorg_updated);
- e_turret.tur_aimorg_updated = e_turret.origin + v_forward * e_turret.tur_aimorg_x + v_right * e_turret.tur_aimorg_y + v_up * e_turret.tur_aimorg_z;
- //e_turret.tur_aimorg_updated = e_turret.tur_shotorg_updated;
-
- e_turret.tur_dist_enemy = vlen(e_turret.tur_aimorg_updated - real_origin(e_turret.enemy));
- //e_turret.tur_dist_enemy = vlen(e_turret.tur_aimpos - e_turret.tur_shotorg_updated);
-
- traceline(e_turret.tur_aimorg_updated,e_turret.tur_aimorg_updated+(e_turret.tur_shotdir_updated * e_turret.tur_dist_enemy),TRUE,e_turret);
-
- e_turret.tur_impactpoint = trace_endpos;
- e_turret.tur_impactent = trace_ent;
- e_turret.tur_impacttime = e_turret.tur_dist_enemy / e_turret.shot_speed;
- e_turret.tur_dist_toaimpos = vlen(trace_endpos - e_turret.tur_aimpos);
-}
-
-/**
-** Handles head rotation according to
-** the units .track_type and .track_flags
-**/
-void turret_stdproc_track()
-{
- vector wish_angle; // This is where we'd need to be
-
- vector real_angle; // This is where we can go
- float f_tmp;
-
-
- if (self.track_flags == TFL_TRACK_NO)
- return;
-
- if (self.enemy == world)
- {
- if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
- wish_angle = self.idle_aim + self.angles;
- else
- wish_angle = self.idle_aim;
- }
- else
- {
- // Find the direction
- if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
- wish_angle = normalize(self.tur_aimpos - self.origin);
- else
- wish_angle = normalize(self.tur_aimpos - self.tur_head.origin);
-
- wish_angle = vectoangles(wish_angle); // And make a angle
- }
-
- // Find the diffrence between where we currently aim and where we want to aim
- if (self.turrcaps_flags & TFL_TURRCAPS_LINKED)
- real_angle = wish_angle - (self.angles + self.tur_head.angles);
- else
- {
- //if(vlen(wish_angle - self.tur_head.angles) > vlen(self.tur_head.angles - wish_angle))
- real_angle = wish_angle - self.tur_head.angles;
- //else
- // real_angle = self.tur_head.angles - wish_angle;
- }
-
- // Constrain it within +/- 360
- if (real_angle_x <= 0) real_angle_x += 360;
- if (real_angle_x >= 180) real_angle_x -= 360;
-
- //if (real_angle_y <= 0) real_angle_y += 360;
- if (real_angle_y >= 180) real_angle_y -= 360;
-
-
- if (self.track_type == TFL_TRACKTYPE_STEPMOTOR)
- {
- f_tmp = self.aim_speed * self.ticrate; // dgr/sec -> dgr/tic
-
- // Limit turning speed
- real_angle_x = bound((-1 * f_tmp),real_angle_x, f_tmp);
- real_angle_y = bound((-1 * f_tmp),real_angle_y, f_tmp);
-
- // Limit pich and rot.
- if (self.track_flags & TFL_TRACK_PITCH)
- self.tur_head.angles_x = bound((-1 * self.aim_maxpitch),self.tur_head.angles_x + real_angle_x,self.aim_maxpitch);
-
- if (self.track_flags & TFL_TRACK_ROT)
- self.tur_head.angles_y = bound((-1 * self.aim_maxrot),self.tur_head.angles_y + real_angle_y,self.aim_maxrot);
-
- return;
- }
-
- if (self.track_type == TFL_TRACKTYPE_FLUIDPRECISE)
- {
- if (self.track_flags & TFL_TRACK_PITCH)
- self.tur_head.avelocity_x = real_angle_x;
-
- if (self.track_flags & TFL_TRACK_ROT)
- self.tur_head.avelocity_y = real_angle_y;
- }
- else if (self.track_type == TFL_TRACKTYPE_FLUIDINERTIA)
- {
- f_tmp = self.aim_speed * self.ticrate;
-
- real_angle_y = bound(self.aim_speed * -1,real_angle_y * self.track_accel_rot * f_tmp,self.aim_speed);
- real_angle_x = bound(self.aim_speed * -1,real_angle_x * self.track_accel_pitch * f_tmp,self.aim_speed);
- real_angle = (self.tur_head.avelocity * self.track_blendrate) + (real_angle * (1 - self.track_blendrate));
-
- if (self.track_flags & TFL_TRACK_PITCH) self.tur_head.avelocity_x = real_angle_x;
- if (self.track_flags & TFL_TRACK_ROT) self.tur_head.avelocity_y = real_angle_y;
- self.tur_head.avelocity_z = real_angle_z;
- }
-
- // Limit pitch
- if (self.track_flags & TFL_TRACK_PITCH)
- {
- if (self.tur_head.angles_x > self.aim_maxpitch)
- {
- self.tur_head.angles_x = self.aim_maxpitch;
- self.tur_head.avelocity_x = 0;
- }
- else if (self.tur_head.angles_x < (self.aim_maxpitch * -1))
- {
- self.tur_head.angles_x = (self.aim_maxpitch * -1);
- self.tur_head.avelocity_x = 0;
- }
- }
-
- // Limit rot
- if (self.track_flags & TFL_TRACK_ROT)
- {
- if (self.tur_head.angles_y > self.aim_maxrot)
- {
- self.tur_head.angles_y = self.aim_maxrot;
- self.tur_head.avelocity_y = 0;
- }
- else if (self.tur_head.angles_y < (self.aim_maxrot * -1))
- {
- self.tur_head.angles_y = (self.aim_maxrot * -1);
- self.tur_head.avelocity_y = 0;
- }
- }
-
-
-}
-
-/*
- + = implemented
- - = not implemented
-
- + TFL_FIRECHECK_NO
- + TFL_FIRECHECK_WORLD
- + TFL_FIRECHECK_DEAD
- + TFL_FIRECHECK_DISTANCES
- - TFL_FIRECHECK_LOS
- + TFL_FIRECHECK_AIMDIST
- + TFL_FIRECHECK_REALDIST
- - TFL_FIRECHECK_ANGLEDIST
- - TFL_FIRECHECK_TEAMCECK
- + TFL_FIRECHECK_AFF
- + TFL_FIRECHECK_OWM_AMMO
- + TFL_FIRECHECK_OTHER_AMMO
- + TFL_FIRECHECK_REFIRE
-*/
-
-/**
-** Preforms pre-fire checks based on the uints firecheck_flags
-**/
-float turret_stdproc_firecheck()
-{
- // This one just dont care =)
- if (self.firecheck_flags & TFL_FIRECHECK_NO) return 1;
-
- // Ready?
- if (self.firecheck_flags & TFL_FIRECHECK_REFIRE)
- if (self.attack_finished_single >= time) return 0;
-
- //
- if (self.firecheck_flags & TFL_FIRECHECK_DEAD)
- if (self.enemy.deadflag != DEAD_NO) return 0;
-
- // Plz stop killing the world!
- if (self.firecheck_flags & TFL_FIRECHECK_WORLD)
- if (self.enemy == world) return 0;
-
- // Own ammo?
- if (self.firecheck_flags & TFL_FIRECHECK_OWM_AMMO)
- if (self.ammo < self.shot_dmg) return 0;
-
- // Other's ammo? (carefull using this...)
- if (self.firecheck_flags & TFL_FIRECHECK_OTHER_AMMO)
- if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
-
- if (self.firecheck_flags & TFL_FIRECHECK_DISTANCES)
- {
- // Not close enougth?
- if (self.tur_dist_enemy > self.target_range_fire) return 0;
-
- // To close?
- if (self.tur_dist_enemy < self.target_range_min) return 0;
- }
-
- // Try to avoid FF?
- if (self.firecheck_flags & TFL_FIRECHECK_AFF)
- if (self.tur_impactent.team == self.team) return 0;
-
- // aim<->predicted impact
- if (self.firecheck_flags & TFL_FIRECHECK_AIMDIST)
- if (self.tur_dist_toaimpos > self.aim_firetolerance_dist) return 0;
-
- // Volly status
- if (self.shot_volly > 1)
- {
- if (self.volly_counter == self.shot_volly)
- if (self.ammo < (self.shot_dmg * self.shot_volly))
- return 0;
- }
-
- //if(self.tur_enemy_adist >= self.aim_firetolerance) return 0;
-
-
- return 1;
-}
-
-/*
- + TFL_TARGETSELECT_NO
- + TFL_TARGETSELECT_LOS
- + TFL_TARGETSELECT_PLAYERS
- + TFL_TARGETSELECT_MISSILES
- - TFL_TARGETSELECT_TRIGGERTARGET
- + TFL_TARGETSELECT_ANGLELIMITS
- + TFL_TARGETSELECT_RANGELIMTS
- + TFL_TARGETSELECT_TEAMCHECK
- - TFL_TARGETSELECT_NOBUILTIN
- + TFL_TARGETSELECT_OWNTEAM
-*/
-
-/**
-** Evaluate a entity for target valitity based on validate_flags
-**/
-float turret_validate_target(entity e_turret,entity e_target,float validate_flags)
-{
- vector v_tmp;
-
- //if(!validate_flags & TFL_TARGETSELECT_NOBUILTIN)
- // return -0.5;
-
- if (!e_target)// == world)
- return -1;
-
- if (e_target.classname == "grapplinghook")
- return - 1.5;
-
- if (validate_flags & TFL_TARGETSELECT_NO)
- return -2;
-
- // If only this was used more..
- if (e_target.flags & FL_NOTARGET)
- return -3;
-
- // Cant touch this
- if ((e_target.takedamage == DAMAGE_NO) || (e_target.health < 0))
- return -4;
-
- // player
- if (e_target.flags & FL_CLIENT)
- {
- if (!(validate_flags & TFL_TARGETSELECT_PLAYERS))
- return -5;
-
- if (e_target.deadflag != DEAD_NO)
- return -6;
- }
-
- // Missile
- if (e_target.flags & FL_PROJECTILE)
- {
- if (!(validate_flags & TFL_TARGETSELECT_MISSILES))
- return -7;
- }
-
- // Team check
- if (validate_flags & TFL_TARGETSELECT_TEAMCHECK)
- {
- if (validate_flags & TFL_TARGETSELECT_OWNTEAM)
- {
- if (e_target.team != e_turret.team)
- return -8;
-
- if (e_turret.team != e_target.owner.team)
- return -8.5;
- }
- else
- {
- if (e_target.team == e_turret.team)
- return -9;
-
- if (e_turret.team == e_target.owner.team)
- return -9.5;
- }
- }
-
- // Line of sight?
- if (validate_flags & TFL_TARGETSELECT_LOS)
- {
- v_tmp = real_origin(e_target) + ((e_target.mins + e_target.maxs) * 0.5);
- //v_tmp = e_target.origin;
- traceline(e_turret.origin,v_tmp,0,e_turret);
-
- if (e_turret.aim_firetolerance_dist < vlen(v_tmp - trace_endpos))
- return -10;
- }
-
- // Can we even aim this thing? (anglecheck)
- tvt_thadv = angleofs(e_turret.tur_head,e_target);
- tvt_tadv = angleofs(e_turret,e_target);
- tvt_thadf = vlen(tvt_thadv);
- tvt_tadf = vlen(tvt_tadv);
-
- if (validate_flags & TFL_TARGETSELECT_ANGLELIMITS)
- {
- if (fabs(tvt_tadv_x) > e_turret.aim_maxpitch)
- return -11;
-
- if (fabs(tvt_tadv_y) > e_turret.aim_maxrot)
- return -12;
- }
-
- // Range limits?
- tvt_dist = vlen(e_turret.origin - real_origin(e_target));
- if (validate_flags & TFL_TARGETSELECT_RANGELIMTS)
- {
- if (tvt_dist < e_turret.target_range_min)
- return -13;
-
- if (tvt_dist > e_turret.target_range)
- return -14;
- }
-
-#ifdef TURRET_DEBUG_TARGETSELECT
- bprint("Target:",e_target.netname," is a valid target for ",e_turret.netname,"\n");
-#endif
-
- return 1;
-}
-
-entity turret_select_target()
-{
- entity e; // target looper entity
- entity e_enemy; // currently best scoreing enemy
-
- float score; // current target (e) score
- float m_score; // current best target (e_enemy) score
- float f;
- // string s;
- e = findradius(self.origin,self.target_range);
-
- // Nothing to aim at.
- if (!e) return world;
-
- m_score = 0;
-
- while (e)
- {
- f = turret_validate_target(self,e,self.target_select_flags);
- //s = ftos(f);
- //bprint(e.netname, " = ",s,"\n");
- if (f > 0)
- {
-
- score = self.turret_score_target(self,e);
-
- if ((score > m_score) && (score > 0))
- {
- e_enemy = e;
- m_score = score;
- }
- }
-
- e = e.chain;
- }
-
-// self.tur_lastscore = m_score;
-
- //if (self.enemy != e_enemy)
- //self.volly_counter = 0;
-
- return e_enemy;
-}
-
-void turret_think()
-{
- entity e;
-
- self.nextthink = (time + self.ticrate);
-
- // ONS uses somewhat backwards linking.
- if(teamplay)
- {
- if(g_onslaught)
- {
-
- /*
- // see turret_stdproc_use()
- if(self.targetname)
- {
- e = find(world,target,self.targetname);
- if(e != world)
- self.team = e.team;
- }*/
- }
- else
- {
- if(self.target)
- {
- e = find(world,targetname,self.target);
- if(e != world)
- self.team = e.team;
- }
- }
-
- if(self.team != self.tur_head.team)
- turret_stdproc_respawn();
- }
-
-
- if (cvar("g_turrets_reloadcvars") == 1)
- {
- e = nextent(world);
- while (e)
- {
- if (e.tur_head != world)
- {
-
- load_unit_settings(e,e.cvar_basename,1);
- e.turret_postthink();
- }
-
- e = nextent(e);
- }
-
- cvar_set("g_turrets_reloadcvars","0");
- }
-
-#ifdef TURRET_DEBUG
- if (self.tur_dbg_tmr1 < time)
- {
- if (self.enemy) paint_target (self.enemy,128,self.tur_dbg_rvec,0.9);
- paint_target(self,256,self.tur_dbg_rvec,0.9);
- self.tur_dbg_tmr1 = time + 1;
- }
-#endif
-
- //Do custom prethink, and bail if it fails.
- //if (!self.turret_prethink()) return;
-
- // Handle ammo
- if (self.ammo < self.ammo_max)
- self.ammo = min(self.ammo + self.ammo_recharge,self.ammo_max);
-
-
- if ((!self.tur_active) || (self.deadflag != DEAD_NO))
- {
- dprint("Warning: Inactive or dead turret running the think function!\n");
- self.enemy = world;
- //self.turret_track();
- turret_stdproc_track();
- return;
- }
-
- if (self.shoot_flags & TFL_SHOOT_HITALLVALID)
- {
-
- // Do a self.turret_fire for every valid target.
- e = findradius(self.origin,self.target_range);
-
- while (e)
- {
- if (turret_validate_target(self,e,self.target_validate_flags))
- {
- self.enemy = e;
-
- turret_do_updates(self);
-
- if ( self.turret_firecheckfunc() ) turret_fire();
- }
-
- e = e.chain;
- }
- self.enemy = world;
-
- }
- else
- {
- // Check if we have a vailid enemy, and get one if we dont.
- // turret_do_updates(self);
- if ((turret_validate_target(self,self.enemy,self.target_validate_flags) <= 0) || (self.cnt < time))
- {
- self.enemy = turret_select_target();
- self.cnt = time + self.ticrate * 3;
- }
-
-
- // No target, just go to idle, do any custom stuff and bail.
- if (self.enemy == world)
- {
- // Turn & pitch
- if (!self.track_flags & TFL_TRACK_NO)
- turret_stdproc_track();
-
- // do any per-turret stuff
- self.turret_postthink();
-
- // And bail.
- return;
- }
- // te_lightning1(world,self.origin,self.enemy.origin);
- // Update
- turret_do_updates(self);
-
- // Predict or whatnot
- if (!self.aim_flags & TFL_AIM_NO)
- self.tur_aimpos = turret_stdproc_aim_generic();
- //self.tur_aimpos = self.turret_aim();
-
- // Turn & pitch
- if (!self.track_flags & TFL_TRACK_NO)
- turret_stdproc_track();
- //self.turret_track();
-
- // Update
- turret_do_updates(self);
-
- // Fire?
- if (self.turret_firecheckfunc() != 0)
- turret_fire();
- }
-
- // do any per-turret stuff
- self.turret_postthink();
-}
-
-void turret_fire()
-{
- if (cvar("g_turrets_nofire") != 0) return;
- if ((!self.tur_active) || (self.deadflag != DEAD_NO)) return;
-
- self.turret_firefunc();
-
- self.attack_finished_single = time + self.shot_refire;
- self.ammo = self.ammo - self.shot_dmg;
- self.volly_counter = self.volly_counter - 1;
-
-
- if (self.volly_counter <= 0)
- {
- self.volly_counter = self.shot_volly;
- if (self.shoot_flags & TFL_SHOOT_CLEARTARGET) self.enemy = world;
-
- if (self.shot_volly > 1)
- self.attack_finished_single = time + self.shot_volly_refire;
- }
-
-
-#ifdef TURRET_DEBUG
- if (self.enemy) paint_target3(self.tur_aimpos ,64,self.tur_dbg_rvec,self.tur_impacttime+0.25);
-#endif
-}
-
-void turret_stdproc_fire()
-{
- dprint("^1Bang, ^3your dead^7 ",self.enemy.netname,"! ^1(turret with no real firefunc)\n");
-}
-
-void turret_stdproc_use()
-{
- // bprint("Used:",self.netname, " By ",other.netname,"\n");
-
- if(g_onslaught)
- {
- entity e;
-
- if(self.targetname)
- {
- e = find(world,target,self.targetname);
- if(e != world)
- self.team = e.team;
- }
-
- if(self.team != self.tur_head.team)
- turret_stdproc_respawn();
- }
- else
- {
- if (self.tur_active)
- self.tur_active = 0;
- else
- self.tur_active = 1;
- }
-
-}
-
-/*
-* Standard turret initialization. use this!
-* (unless you have a very good reason not to.)
-* Any special stuff like multiple cannon models should be done
-* after this is proc called.
-* if the return value is 0, the turret should be removed.
-*/
-float turret_stdproc_init (string cvar_base_name)
-{
- // Are turrets allowed atm?
- if (cvar("g_turrets") == 0) return 0;
-
- // Better more then once then never.
- // turret_gibs_precash();
-
- if (self.spawnflags & 2)
- {
- entity tb;
- precache_model("models/turrets/terrainbase.md3");
- tb = spawn();
- setmodel(tb,"models/turrets/terrainbase.md3");
- setorigin(tb,self.origin);
- tb.solid = SOLID_BBOX;
- makestatic(tb);
- }
-
- self.cvar_basename = cvar_base_name;
- load_unit_settings(self,self.cvar_basename,0);
-
- // Group all turrets into the same team if in non teamplaymode, so they dont try to kill eachother.
- if (cvar("g_assult") != 0)
- {
- if (!self.team)
- self.team = 14; // Assume turrets are on the defending side if not explicitly set otehrwize
- }
- else
- if ((!teamplay) || (!self.team))
- self.team = MAX_SHOT_DISTANCE;
-
-
- /*
- * Try to guess some reasonaly defaults
- * for missing params and do sanety checks
- * thise checks could produce some "interesting" results
- * if it hits a glitch in my logic :P so try to set as mutch
- * as possible beforehand.
- */
- if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
- {
- // Support units generaly dont need to have a high speed ai-loop
- if (!self.ticrate) self.ticrate = 0.25; // Speed of this turrets AI loop
- }
- else
- {
- if (!self.ticrate) self.ticrate = 0.1; // Speed of this turrets AI loop
- }
-
- self.ticrate = bound(0.01,self.ticrate,60); // keep it sane plz
-
-// General stuff
- if (self.netname == "") self.netname = "turret";
-
- if (!self.respawntime) self.respawntime = 60;
- self.respawntime = max(-1,self.respawntime);
-
- if (!self.health) self.health = 1000;
- self.tur_health = max(1,self.health);
-
- if (!self.turrcaps_flags) self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
-
- if (!self.damage_flags) self.damage_flags = TFL_DMG_YES | TFL_DMG_RETALIATE | TFL_DMG_AIMSHAKE;
-
-// Shot stuff.
- if (!self.shot_refire) self.shot_refire = 1;
- self.shot_refire = bound(0.01,self.shot_refire,9999);
-
- if (!self.shot_dmg) self.shot_dmg = self.shot_refire * 50;
- self.shot_dmg = max(1,self.shot_dmg);
-
- if (!self.shot_radius) self.shot_radius = self.shot_dmg * 0.5;
- self.shot_radius = max(1,self.shot_radius);
-
- if (!self.shot_speed) self.shot_speed = 2500;
- self.shot_speed = max(1,self.shot_speed);
-
- if (!self.shot_spread) self.shot_spread = 0.0125;
- self.shot_spread = bound(0.0001,self.shot_spread,500);
-
- if (!self.shot_force) self.shot_force = self.shot_dmg * 0.5 + self.shot_radius * 0.5;
- self.shot_force = bound(0.001,self.shot_force,MAX_SHOT_DISTANCE * 0.5);
-
- if (!self.shot_volly) self.shot_volly = 1;
- self.shot_volly = bound(1,self.shot_volly,floor(self.ammo_max / self.shot_dmg));
-
- if (!self.shot_volly_refire) self.shot_volly_refire = self.shot_refire * self.shot_volly;
- self.shot_volly_refire = bound(self.shot_refire,self.shot_volly_refire,60);
-
- if (!self.firecheck_flags)
- self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES |
- TFL_FIRECHECK_LOS | TFL_FIRECHECK_AIMDIST | TFL_FIRECHECK_TEAMCECK |
- TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_WORLD;
-
-// Range stuff.
- if (!self.target_range) self.target_range = self.shot_speed * 0.5;
- self.target_range = bound(0,self.target_range,MAX_SHOT_DISTANCE);
-
- if (!self.target_range_min) self.target_range_min = self.shot_radius * 2;
- self.target_range_min = bound(0,self.target_range_min,MAX_SHOT_DISTANCE);
-
- if (!self.target_range_fire) self.target_range_fire = self.target_range * 0.8;
- self.target_range_fire = bound(0,self.target_range_fire,MAX_SHOT_DISTANCE);
-
- if (!self.target_range_optimal) self.target_range_optimal = self.target_range_fire * 0.5;
- self.target_range_optimal = bound(0,self.target_range_optimal,MAX_SHOT_DISTANCE);
-
-
-// Aim stuff.
- if (!self.aim_maxrot) self.aim_maxrot = 45;
- self.aim_maxrot = bound(0,self.aim_maxrot,361);
-
- if (!self.aim_maxpitch) self.aim_maxpitch = 20;
- self.aim_maxpitch = bound(0,self.aim_maxpitch,90);
-
- if (!self.aim_speed) self.aim_speed = 36;
- self.aim_speed = bound(0.1,self.aim_speed, 1000);
-
- if (!self.aim_firetolerance_dist) self.aim_firetolerance_dist = 5 + (self.shot_radius * 2);
- self.aim_firetolerance_dist = bound(0.1,self.aim_firetolerance_dist,MAX_SHOT_DISTANCE);
-
-// if (!self.aim_firetolerance_angle) self.aim_firetolerance_angle = 10;
-// self.aim_firetolerance_angle = bound(0.1,self.aim_firetolerance_angle,360);
-
- if (!self.aim_flags) self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE;
-
- // Sill the most tested (and aim-effective)
- if (!self.track_type) self.track_type = TFL_TRACKTYPE_STEPMOTOR;
-
- if (self.track_type != TFL_TRACKTYPE_STEPMOTOR)
- {
- // Fluid / Ineria mode. Looks mutch nicer, bit experimental &
- // Can inmapt aim preformance alot.
- // needs a bit diffrent aimspeed
- if (!self.aim_speed) self.aim_speed = 180;
- self.aim_speed = bound(0.1,self.aim_speed, 1000);
-
- if (!self.track_accel_pitch) self.track_accel_pitch = 0.75;
- if (!self.track_accel_rot) self.track_accel_rot = 0.75;
- if (!self.track_blendrate) self.track_blendrate = 0.35;
- }
-
- if (!self.track_flags) self.track_flags = TFL_TRACK_PITCH | TFL_TRACK_ROT;
-
-
-// Target selection stuff.
- if (!self.target_select_rangebias) self.target_select_rangebias = 1;
- self.target_select_rangebias = bound(-10,self.target_select_rangebias,10);
-
- if (!self.target_select_samebias) self.target_select_samebias = 1;
- self.target_select_samebias = bound(-10,self.target_select_samebias,10);
-
- if (!self.target_select_anglebias) self.target_select_anglebias = 1;
- self.target_select_anglebias = bound(-10,self.target_select_anglebias,10);
-
- if (!self.target_select_missilebias) self.target_select_missilebias = -10;
- self.target_select_missilebias = bound(-10,self.target_select_missilebias,10);
- self.target_select_playerbias = bound(-10,self.target_select_playerbias,10);
-
- if (!self.target_select_flags)
- if (self.turrcaps_flags & TFL_TURRCAPS_MISSILEKILL)
- self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_MISSILES |
- TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_ANGLELIMITS;
- else
- self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS |
- TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_ANGLELIMITS;
-
- //if(!self.target_validate_flags)
- self.target_validate_flags = self.target_select_flags;
-
-
-// Ammo stuff
- if (!self.ammo_max) self.ammo_max = self.shot_dmg * 10;
- self.ammo_max = max(self.shot_dmg,self.ammo_max);
-
- if (!self.ammo) self.ammo = self.shot_dmg * 5;
- self.ammo = bound(0,self.ammo,self.ammo_max);
-
- if (!self.ammo_recharge) self.ammo_recharge = self.shot_dmg / 2;
- self.ammo_recharge = max(0,self.ammo_recharge);
-
- // Convert the recharge from X per sec to X per ticrate
- self.ammo_recharge = self.ammo_recharge * self.ticrate;
-
- if (!self.ammo_flags) self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
-
-// Offsets & origins
- if (!self.tur_aimorg) self.tur_aimorg = '0 0 50';
- if (!self.tur_shotorg) self.tur_shotorg = '50 0 50';
-
-// End of default & sanety checks, start building the turret.
-
-// Spawn extra bits
- self.tur_head = spawn();
-
- self.tur_head.netname = self.tur_head.classname = "turret_head";
- self.tur_head.team = self.team;
-
- // Defend mode?
- if (self.target != "")
- {
- self.tur_defend = find(world, targetname, self.target);
- if (self.tur_defend == world)
- {
- self.target = "";
- dprint("Turret has invalid defendpoint!\n");
- }
- }
-
-// Claim ownership
- self.tur_head.owner = self;
-
-// Put pices in place
-
- if (!(self.turrcaps_flags & TFL_TURRCAPS_LINKED))
- setorigin(self.tur_head,self.origin);
-
- // In target defense mode, aim on the spot to defens when idle.
- if (self.tur_defend)
- self.idle_aim = self.tur_head.angles + angleofs(self.tur_head,self.tur_defend);
- else
- self.idle_aim = self.angles;
-
- if (!(self.turrcaps_flags & TFL_TURRCAPS_LINKED))
- self.tur_head.angles = self.idle_aim;
-
- if (!self.health) self.health = 150;
- self.tur_health = self.health;
-
- //Solid bbox for preformance reasons
- self.solid = SOLID_BBOX;
- self.tur_head.solid = SOLID_BBOX;
-
- self.takedamage = DAMAGE_AIM;
- self.tur_head.takedamage = DAMAGE_AIM;
-
- self.movetype = MOVETYPE_NOCLIP;
- self.tur_head.movetype = MOVETYPE_NOCLIP;
-
- // Team colouring?track
- if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
- if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-
- // Attach stdprocs. override when and what needed
- if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
- {
- //self.turret_prethink = turret_stdproc_true;
- self.turret_score_target = turret_stdproc_targetscore_support;
- //self.turret_aim = turret_stdproc_aim_generic;
- //self.turret_track = turret_stdproc_track;
- self.turret_firecheckfunc = turret_stdproc_firecheck;
- self.turret_firefunc = turret_stdproc_fire;
- self.turret_postthink = turret_stdproc_nothing;
-
- //self.turret_damagefunc = turret_stdproc_damage;
- self.event_damage = turret_stdproc_damage;
- self.tur_head.event_damage = turret_stdproc_damage;
-
- //self.turret_diefunc = turret_stdproc_die;
- //self.turret_spawnfunc = turret_stdproc_respawn;
-
- }
- else
- {
-
- //self.turret_prethink = turret_stdproc_true;
- self.turret_score_target = turret_stdproc_targetscore_generic;
-
- //if (self.aim_flags & TFL_AIM_SIMPLE)
- // self.turret_aim = turret_stdproc_aim_simple;
- //else
- // self.turret_aim = turret_stdproc_aim_generic;
-
- //self.turret_track = turret_stdproc_track;
- self.turret_firecheckfunc = turret_stdproc_firecheck;
- self.turret_firefunc = turret_stdproc_fire;
- self.turret_postthink = turret_stdproc_nothing;
-
- //self.turret_damagefunc = turret_stdproc_damage;
- self.event_damage = turret_stdproc_damage;
- self.tur_head.event_damage = turret_stdproc_damage;
-
- //self.turret_diefunc = turret_stdproc_die;
- //self.turret_spawnfunc = turret_stdproc_respawn;
- self.turret_addtarget = turret_stdproc_false;
- }
-
- self.use = turret_stdproc_use;
-
- // Initiate the main AI loop
- self.think = turret_think;
- self.nextthink = time + self.ticrate;
-
- self.tur_head.team = self.team;
- self.view_ofs = '0 0 0';
-
-#ifdef TURRET_DEBUG
- self.tur_dbg_start = self.nextthink;
- while (vlen(self.tur_dbg_rvec) < 2)
- self.tur_dbg_rvec = randomvec() * 4;
-
- self.tur_dbg_rvec_x = fabs(self.tur_dbg_rvec_x);
- self.tur_dbg_rvec_y = fabs(self.tur_dbg_rvec_y);
- self.tur_dbg_rvec_z = fabs(self.tur_dbg_rvec_z);
-#endif
-
- // Its all good.
- self.classname = "turret_main";
-
- self.tur_active = 1;
-
- return 1;
-}
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_misc.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_misc.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_misc.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,123 +0,0 @@
-//--// Some support routines //--//
-
-// Get real origin
-vector real_origin(entity ent)
-{
- entity e;
- vector v;
-
- e = ent.tag_entity;
- while(e)
- {
- // v = v + e.origin;
- v = v + ((e.absmin + e.absmax) * 0.5);
- e = e.tag_entity;
- }
- //v = v + ent.origin;
- v = v + ((ent.absmin + ent.absmax) * 0.5);
- return v;
-
-}
-
-// Plug this into wherever precashing is done.
-void g_turrets_common_precash()
-{
- precache_model ("models/turrets/c512.md3");
-}
-
-/*
-* Paint a v_color colord circle on target onwho
-* that fades away over f_time
-*/
-void paint_target(entity onwho, float f_size, vector v_color, float f_time)
-{
- entity e;
-
- e = spawn();
- setmodel(e, "models/turrets/c512.md3"); // precision set above
- e.scale = (f_size/512);
- setsize(e, '0 0 0', '0 0 0');
- //setattachment(e,onwho,"");
- setorigin(e,onwho.origin + '0 0 1');
- e.alpha = 0.15;
- e.movetype = MOVETYPE_FLY;
-
- e.velocity = (v_color * 32); // + '0 0 1' * 64;
-
- e.colormod = v_color;
- SUB_SetFade(e,time,f_time);
-}
-
-void paint_target2(entity onwho, float f_size, vector v_color, float f_time)
-{
- entity e;
-
- e = spawn();
- setmodel(e, "models/turrets/c512.md3"); // precision set above
- e.scale = (f_size/512);
- setsize(e, '0 0 0', '0 0 0');
-
- setorigin(e,onwho.origin + '0 0 1');
- e.alpha = 0.15;
- e.movetype = MOVETYPE_FLY;
-
- e.velocity = (v_color * 32); // + '0 0 1' * 64;
- e.avelocity_x = -128;
-
- e.colormod = v_color;
- SUB_SetFade(e,time,f_time);
-}
-
-void paint_target3(vector where, float f_size, vector v_color, float f_time)
-{
- entity e;
- e = spawn();
- setmodel(e, "models/turrets/c512.md3"); // precision set above
- e.scale = (f_size/512);
- setsize(e, '0 0 0', '0 0 0');
- setorigin(e,where+ '0 0 1');
- e.movetype = MOVETYPE_NONE;
- e.velocity = '0 0 0';
- e.colormod = v_color;
- SUB_SetFade(e,time,f_time);
-}
-
-/*
-* Return the angle between two enteties
-*/
-vector angleofs(entity from, entity to)
-{
- vector v_res;
-
- // makevectors(from.angles);
- v_res = normalize(to.origin - from.origin);
- v_res = vectoangles(v_res);
- v_res = v_res - from.angles;
-
- if (v_res_x < 0) v_res_x += 360;
- if (v_res_x > 180) v_res_x -= 360;
-
- if (v_res_y < 0) v_res_y += 360;
- if (v_res_y > 180) v_res_y -= 360;
-
- return v_res;
-}
-
-vector angleofs2(entity from, vector to)
-{
- vector v_res;
-
- // makevectors(from.angles);
- v_res = normalize(to - from.origin);
- v_res = vectoangles(v_res);
- v_res = v_res - from.angles;
-
- if (v_res_x < 0) v_res_x += 360;
- if (v_res_x > 180) v_res_x -= 360;
-
- if (v_res_y < 0) v_res_y += 360;
- if (v_res_y > 180) v_res_y -= 360;
-
- return v_res;
-}
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_scoreprocs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_scoreprocs.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/turret_system_scoreprocs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,164 +0,0 @@
-/*
-.float target_select_flags; /// target selection flags
-float TFL_TARGETSELECT_NO = 1; /// Dont select a target on its own.
-float TFL_TARGETSELECT_LOS = 2; /// Need line of sight
-float TFL_TARGETSELECT_PLAYERS = 4; /// Players are valid targets
-float TFL_TARGETSELECT_MISSILES = 8; /// Missiles are valid targets
-float TFL_TARGETSELECT_TRIGGERTARGET = 16; /// Responds to turret_trigger_target events
-float TFL_TARGETSELECT_ANGLELIMITS = 32; /// Angular limitations of turret head limits target selection
-float TFL_TARGETSELECT_RANGELIMTS = 64; /// Range limits apply in targetselection
-float TFL_TARGETSELECT_TEAMCHECK = 128; /// Consider team own <-> targets team
-float TFL_TARGETSELECT_NOBUILTIN = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
-float TFL_TARGETSELECT_OWNTEAM = 512;
-*/
-
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
-{
- float score; // Total score
- float s_score,d_score;
-
- if (e_turret.enemy == e_target) s_score = 1;
-
- d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
-
- score = (d_score * e_turret.target_select_rangebias) +
- (s_score * e_turret.target_select_samebias);
-
- return score;
-}
-
-/*
-* Generic bias aware score system.
-*/
-float turret_stdproc_targetscore_generic(entity e_turret,entity e_target)
-{
- //vector v_tmp;
- float d_dist; // Defendmode Distance
-
- float score; // Total score
- float d_score; // Distance score
- //float da_score; // Distance from aimpoint score
- float a_score; // Angular score
- float s_score; // samescore (same target as last time)
- float m_score; // missile score
- float p_score; // player score
-
- float ikr; // ideal kill range
-
- if(!e_target) return 0;
-
- if (e_target == e_turret.enemy) s_score = 1;
-
- if (e_turret.tur_defend)
- {
- d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
- ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
- d_score = 1 - d_dist / e_turret.target_range;
- }
- else
- {
- // Make a normlized value base on the targets distance from our optimal killzone
- ikr = e_turret.target_range_optimal;
- d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
- }
-
- /*
- // Determine the maximum time it could take this turrent to aim at someting.
- max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
-
- // Find out how long it would take to aim at this taget.
- aim_delay = (thadf+0.01) / e_turret.aim_speed;
-
- // Turn this info into a normalized value.
- aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
- a_score = 1 - aim_delay;
- */
-
- //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
- a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
-
- if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
- m_score = 1;
-
- if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
- p_score = 1;
-
- d_score = max(d_score,0);
- s_score = max(s_score,0);
- a_score = max(a_score,0);
- m_score = max(m_score,0);
- p_score = max(p_score,0);
-
- score = (d_score * e_turret.target_select_rangebias) +
- (s_score * e_turret.target_select_samebias) +
- (a_score * e_turret.target_select_anglebias) +
- (m_score * e_turret.target_select_missilebias) +
- (p_score * e_turret.target_select_playerbias);
-
- if(e_turret.target_range_fire < vlen(e_turret.tur_shotorg_updated - real_origin(e_target)))
- score *= 0.1;
-
-#ifdef TURRET_DEBUG
- string sd,sv,sa,sm,sp,ss;
- string sdt,svt,sat,smt,spt;
-
- sd = ftos(d_score);
- d_score *= e_turret.target_select_rangebias;
- sdt = ftos(d_score);
-
- //sv = ftos(v_score);
- //v_score *= e_turret.target_select_samebias;
- //svt = ftos(v_score);
-
- sa = ftos(a_score);
- a_score *= e_turret.target_select_anglebias;
- sat = ftos(a_score);
-
- sm = ftos(m_score);
- m_score *= e_turret.target_select_missilebias;
- smt = ftos(m_score);
-
- sp = ftos(p_score);
- p_score *= e_turret.target_select_playerbias;
- spt = ftos(p_score);
-
-
- ss = ftos(score);
- bprint("^3Target scores^7 \[ ",e_turret.netname, " \] ^3for^7 \[ ", e_target.netname," \]\n");
- bprint("^5Range:\[ ",sd, " \]^2+bias:\[ ",sdt," \]\n");
- //bprint("^5Volly:\[ ",sv, " \]^2+bias:\[ ",svt," \]\n");
- bprint("^5Angle:\[ ",sa, " \]^2+bias:\[ ",sat," \]\n");
- bprint("^5Missile:\[ ",sm," \]^2+bias:\[ ",smt," \]\n");
- bprint("^5Player:\[ ",sp, " \]^2+bias:\[ ",spt," \]\n");
- bprint("^3Total (w/bias):\[^1",ss,"\]\n");
-
-#endif
-
- return score;
-}
-
-float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
-{
- return 1 - (tvt_dist / e_turret.target_range);
-}
-
-float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
-{
- return tvt_dist / e_turret.target_range;
-}
-
-float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
-{
- return min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
-}
-
-float turret_stdproc_score_angular(entity e_turret,entity e_target)
-{
- return 1 - (tvt_thadf / e_turret.aim_maxrot);
-}
-
-float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
-{
- return 0;
- //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
-}
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_common.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_common.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_common.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,148 +0,0 @@
-float turret_tag_setup(float linked)
-{
- vector v;
- float f;
-
- // Laters dooz
- if (linked)
- return 0;
-
- f = gettagindex(self,"tag_head");
- v = gettaginfo(self,f);
- v = v + self.origin;
- setorigin(self.tur_head,v);
-
- f = gettagindex(self.tur_head,"tag_fire");
- v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
- v_y *= -1;
- self.tur_shotorg = v;
-
- f = gettagindex(self.tur_head,"tag_aim");
- v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
- self.tur_aimorg = v;
-
- return 1;
-}
-
-float turret_tag_fire_update()
-{
- vector v;
- float f;
-
- f = gettagindex(self.tur_head,"tag_fire");
- v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
- v_y *= -1;
- self.tur_shotorg = v;
-
- f = gettagindex(self.tur_head,"tag_aim");
- v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
- self.tur_aimorg = v;
-
- return 1;
-}
-
-void FireImoBeam (vector start,vector end,vector smin,vector smax,
- float bforce,float f_dmg,float f_velfactor, float deathtype)
-
-{
- local vector hitloc, force, endpoint, dir;
- local entity ent;
-
- dir = normalize(end - start);
- force = dir * bforce;
-
- // go a little bit into the wall because we need to hit this wall later
- end = end + dir;
-
- // trace multiple times until we hit a wall, each obstacle will be made unsolid.
- // note down which entities were hit so we can damage them later
- while (1)
- {
- tracebox(start, smin, smax, end, FALSE, self);
-
- // if it is world we can't hurt it so stop now
- if (trace_ent == world || trace_fraction == 1)
- break;
-
- if (trace_ent.solid == SOLID_BSP)
- break;
-
- // make the entity non-solid so we can hit the next one
- trace_ent.railgunhit = TRUE;
- trace_ent.railgunhitloc = end;
- trace_ent.railgunhitsolidbackup = trace_ent.solid;
-
- // stop if this is a wall
-
-
- // make the entity non-solid
- trace_ent.solid = SOLID_NOT;
- }
-
- endpoint = trace_endpos;
-
- // find all the entities the railgun hit and restore their solid state
- ent = findfloat(world, railgunhit, TRUE);
- while (ent)
- {
- // restore their solid type
- ent.solid = ent.railgunhitsolidbackup;
- ent = findfloat(ent, railgunhit, TRUE);
- }
-
- // find all the entities the railgun hit and hurt them
- ent = findfloat(world, railgunhit, TRUE);
- while (ent)
- {
- // get the details we need to call the damage function
- hitloc = ent.railgunhitloc;
- ent.railgunhitloc = '0 0 0';
- ent.railgunhitsolidbackup = SOLID_NOT;
- ent.railgunhit = FALSE;
-
- // apply the damage
- if (ent.takedamage)
- {
- Damage (ent, self, self, f_dmg, deathtype, hitloc, force);
- ent.velocity = ent.velocity * f_velfactor;
- //ent.alpha = 0.25 + random() * 0.75;
- }
-
- // advance to the next entity
- ent = findfloat(ent, railgunhit, TRUE);
- }
- trace_endpos = endpoint;
-}
-
-void turrets_precash()
-{
- precache_sound ("turrets/phaser.ogg");
-
- precache_model ("models/turrets/base-gib1.md3");
- precache_model ("models/turrets/base-gib2.md3");
- precache_model ("models/turrets/base-gib3.md3");
- precache_model ("models/turrets/base-gib4.md3");
-
- precache_model ("models/turrets/head-gib1.md3");
- precache_model ("models/turrets/head-gib2.md3");
- precache_model ("models/turrets/head-gib3.md3");
- precache_model ("models/turrets/head-gib4.md3");
-
- precache_model ("models/turrets/base.md3");
- precache_model ("models/turrets/flac.md3");
- precache_model ("models/turrets/pd_proj.md3");
- precache_model ("models/turrets/reactor.md3");
- precache_model ("models/turrets/mlrs_rocket.md3");
- precache_model ("models/turrets/hellion.md3");
- precache_model ("models/turrets/hunter2.md3");
- precache_model ("models/turrets/hk.md3");
- precache_model ("models/turrets/machinegun.md3");
- precache_model ("models/turrets/rocket.md3");
- precache_model ("models/turrets/mlrs.md3");
- precache_model ("models/turrets/phaser.md3");
- precache_model ("models/turrets/phaser_beam.md3");
- precache_model ("models/turrets/plasmad.md3");
- precache_model ("models/turrets/plasma.md3");
- precache_model ("models/turrets/tesla_head.md3");
- precache_model ("models/turrets/tesla_base.md3");
-}
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_flac.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_flac.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,103 +0,0 @@
-void spawnfunc_turret_flac();
-void turret_flac_dinit();
-void turret_flac_attack();
-void turret_flac_projectile_explode();
-
-void turret_flac_attack()
-{
- local entity proj;
-
- turret_tag_fire_update();
-
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
- proj = spawn ();
- setorigin(proj, self.tur_shotorg_updated);
- setmodel(proj, "models/turrets/pd_proj.md3");
- setsize(proj, '0 0 0', '0 0 0');
- proj.classname = "turret_fire";
- proj.owner = self;
- proj.bot_dodge = TRUE;
- proj.bot_dodgerating = self.shot_dmg;
- proj.solid = SOLID_NOT;
- proj.movetype = MOVETYPE_FLYMISSILE;
- proj.flags = FL_PROJECTILE;
- proj.effects = EF_LOWPRECISION;
- proj.takedamage = DAMAGE_YES;
- proj.health = 10;
- proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
- proj.angles = vectoangles(proj.velocity);
- proj.touch = turret_flac_projectile_explode;
- proj.think = turret_flac_projectile_explode;
- proj.nextthink = time + (vlen(self.tur_aimpos - self.tur_shotorg_updated) / self.shot_speed) + (random() * self.shot_spread);
-
- self.tur_head.frame = self.tur_head.frame + 1;
- if (self.tur_head.frame >= 4) self.tur_head.frame = 0;
-
-}
-
-void turret_flac_projectile_explode()
-{
- float ftmp;
-
- te_explosion (self.origin);
-
- ftmp = crandom();
- if (ftmp<-0.7)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
- else if (ftmp<0.4)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
- else if (ftmp<1)
- sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
-
-
- self.event_damage = SUB_Null;
-
- ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-
-#ifdef TURRET_DEBUG
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
- self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
-#endif
-
- remove (self);
-}
-
-
-void turret_flac_dinit()
-{
- if (self.netname == "") self.netname = "FLAC Cannon";
-
-
- self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_FASTPROJ | TFL_TURRCAPS_MISSILEKILL;
- self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
-
- if (turret_stdproc_init("flac_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/flac.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_flac_attack;
-
-}
-/*QUAKED turret_flac (0 .5 .8) ?
-*/
-
-void spawnfunc_turret_flac()
-{
- //precache_model ("models/turrets/base.md3");
- //precache_model ("models/turrets/flac.md3");
- //precache_model("models/turrets/pd_proj.md3");
-
- self.think = turret_flac_dinit;
- self.nextthink = time + 0.5;
-}
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_fusionreactor.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_fusionreactor.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_fusionreactor.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,81 +0,0 @@
-void spawnfunc_turret_fusionreactor();
-void turret_fusionreactor_dinit();
-void turret_fusionreactor_fire();
-
-float turret_fusionreactor_firecheck()
-{
- if (self.enemy == world) return 0;
-
- if (!self.enemy.ammo_flags & TFL_AMMO_RECIVE) return 0;
- if (!self.enemy.ammo_flags & TFL_AMMO_ENERGY) return 0;
-
- if (self.ammo < self.shot_dmg) return 0;
- if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
- if (self.tur_dist_enemy > self.target_range_fire) return 0;
- if (self.tur_dist_enemy < self.target_range_min) return 0;
-
- return 1;
-}
-
-
-void turret_fusionreactor_fire()
-{
- self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
- //te_lightning1(world,self.origin,self.enemy.origin);
-}
-
-void turret_fusionreactor_postthink()
-{
-}
-
-
-void turret_fusionreactor_dinit()
-{
- if (self.netname == "") self.netname = "Fusionreactor";
-
- self.turrcaps_flags =TFL_TURRCAPS_SUPPORT | TFL_TURRCAPS_AMMOSOURCE;
-
- self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
-
- self.target_select_flags = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMTS;
-
- self.firecheck_flags = TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_OTHER_AMMO | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_WORLD;
-
- self.shoot_flags = TFL_SHOOT_HITALLVALID;
-
- self.aim_flags = TFL_AIM_NO;
-
- self.track_flags = TFL_TRACK_NO;
-
- if (turret_stdproc_init("fusreac_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/reactor.md3");
-
- //if(!turret_tag_setup(0))
- // dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- self.tur_head.scale = 0.75;
- setorigin(self.tur_head,self.origin + '0 0 25');
- self.tur_head.avelocity = '0 50 0';
-
- self.turret_firecheckfunc = turret_fusionreactor_firecheck;
- self.turret_firefunc = turret_fusionreactor_fire;
-
- self.turret_postthink = turret_fusionreactor_postthink;
-}
-
-/*QUAKED turret_fusionreactor (0 .5 .8) ?
-*/
-void spawnfunc_turret_fusionreactor()
-{
- //precache_model ("models/turrets/reactor.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_fusionreactor_dinit;
- self.nextthink = time + 0.5;
-}
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,221 +0,0 @@
-.float shot_speed_max;
-.float shot_speed_gain;
-
-void spawnfunc_turret_hellion();
-void turret_hellion_dinit();
-void turret_hellion_attack();
-void turret_hellion_missile_explode();
-void turret_hellion_missile_think();
-void turret_hellion_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
-
-void turret_hellion_postthink()
-{
- if (cvar("g_turrets_reloadcvars"))
- {
- if (!self.shot_speed_max) self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
- if (!self.shot_speed_gain) self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
- }
-
- if (self.tur_head.frame != 0)
- self.tur_head.frame = self.tur_head.frame + 1;
-
- if (self.tur_head.frame > 7)
- self.tur_head.frame = 0;
-}
-
-void turret_hellion_attack()
-{
- local entity missile;
-
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
-
- missile = spawn ();
- setorigin(missile, self.tur_shotorg_updated);
- sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
- setmodel (missile, "models/turrets/mlrs_rocket.md3"); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
-
- missile.classname = "hellion_missile";
- missile.owner = self;
- missile.bot_dodge = TRUE;
- missile.bot_dodgerating = self.shot_dmg;
- missile.takedamage = DAMAGE_YES;
- missile.damageforcescale = 2;
- missile.health = 50;
- missile.enemy = self.enemy;
- missile.think = turret_hellion_missile_think;
- missile.nextthink = time + 0.2;
- missile.solid = SOLID_BBOX;
- missile.movetype = MOVETYPE_FLYMISSILE;
- missile.effects = EF_LOWPRECISION;
- missile.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed; // + ('0 0 1' * self.shot_speed * 0.15);
- missile.angles = vectoangles(missile.velocity);
- missile.touch = turret_hellion_missile_explode;
- missile.flags = FL_PROJECTILE;
- missile.solid = SOLID_BBOX;
- missile.tur_health = time + 9;
- missile.tur_aimpos = randomvec() * 128;
- te_explosion (missile.origin);
-
- // switch tubes
- self.tur_shotorg_y = self.tur_shotorg_y * -1;
-
- if (self.tur_head.frame == 0)
- self.tur_head.frame = self.tur_head.frame + 1;
-
-}
-
-void turret_hellion_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
-{
- self.health = self.health - damage;
- self.velocity = self.velocity + vforce;
- if (self.health <= 0) turret_hellion_missile_explode();
-}
-
-void turret_hellion_missile_think()
-{
- vector olddir,newdir;
- vector pre_pos;
- float itime;
-
- self.nextthink = time + 0.1;
-
- // Enemy in range?
- if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.25)
- turret_hellion_missile_explode();
-
- olddir = normalize(self.velocity);
-
- if (self.tur_health < time) turret_hellion_missile_explode();
-
- // Enemy dead? just keep on the current heading then.
- if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
- {
-
- // Make sure we dont return to tracking a respawned player
- self.enemy = world;
-
- // Accelerate
- self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
- // Turn model
- self.angles = vectoangles(self.velocity);
-
- //if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 10) )
- // turret_hellion_missile_explode();
-
- // return;
- }
-
- olddir = normalize(self.velocity);
-
- if (self.enemy)
- {
- // Predict enemy position
- itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
- pre_pos = self.enemy.origin + self.enemy.velocity * itime;
- }
- else
- {
- pre_pos = self.origin + olddir * 1024;
- }
-
- pre_pos = (pre_pos + self.enemy.origin) * 0.5;
-
- //pre_pos += randomvec() * 128; //self.tur_aimpos * (sin(32) * time) ;
-
-
- // Find out the direction to that place
- newdir = normalize(pre_pos - self.origin);
-
- // Turn
- newdir = normalize(olddir + newdir * 0.5);
-
- // Accelerate
- self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
-
- // Turn model
- self.angles = vectoangles(self.velocity);
-
- if (time+itime < time+0.1)
- {
- self.think = turret_hellion_missile_explode;
- self.nextthink = time + itime;
- }
-}
-
-void turret_hellion_missile_explode()
-{
- vector org2;
- float d;
-
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
- org2 = findbetterlocation (self.origin, 16);
-
- // LordHavoc: TE_TEI_BIGEXPLOSION
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
- self.event_damage = SUB_Null;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-
-#ifdef TURRET_DEBUG
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
- self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
-#endif
-
- // Target dead, get another is still targeting the same.
- if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
- self.owner.enemy = world;
-
- remove (self);
-}
-
-void turret_hellion_dinit()
-{
- if (self.netname == "") self.netname = "Hellion Missile Turret";
-
- if (!self.shot_speed_max) self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
- if (!self.shot_speed_gain) self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
-
- self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_FASTPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
- self.aim_flags = TFL_AIM_SIMPLE;
- self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK ;
- self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF | TFL_FIRECHECK_OWM_AMMO;
- self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
-
- if (turret_stdproc_init("hellion_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/hellion.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_hellion_attack;
-
- // Custom animations and sutch
- self.turret_postthink = turret_hellion_postthink;
-}
-
-/*QUAKED turret_hellion (0 .5 .8) ?
-*/
-void spawnfunc_turret_hellion()
-{
- //precache_model ( "models/turrets/mlrs_rocket.md3");
- //precache_model ("models/turrets/hellion.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_hellion_dinit;
- self.nextthink = time + 0.5;
-}
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hk.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_hk.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,471 +0,0 @@
-//#define TURRET_DEBUG_HK
-
-#ifdef TURRET_DEBUG_HK
-.float atime;
-#endif
-
-void spawnfunc_turret_hk();
-void turret_hk_dinit();
-void turret_hk_attack();
-void turret_hk_missile_explode();
-void turret_hk_missile_think();
-void turret_hk_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
-float turret_hk_addtarget(entity e_target,entity e_sender);
-//void turret_hk_missile_touch();
-
-float hk_maxspeed;
-float hk_minspeed;
-float hk_accel;
-float hk_accel2;
-float hk_decel;
-
-float turret_hk_addtarget(entity e_target,entity e_sender)
-{
- if (e_target)
- {
- if (turret_validate_target(self,e_target,self.target_validate_flags) > 0)
- {
- self.enemy = e_target;
- return 1;
- }
- }
-
- return 0;
-}
-
-float hk_is_valid_target(entity e_target)
-{
- if (e_target == world)
- return 0;
-
- // If only this was used more..
- if (e_target.flags & FL_NOTARGET)
- return 0;
-
- // Cant touch this
- if ((e_target.takedamage == DAMAGE_NO) || (e_target.health < 0))
- return 0;
-
- // player
- if (e_target.flags & FL_CLIENT)
- {
- if (self.owner.target_select_playerbias < 0)
- return 0;
-
- if (e_target.deadflag != DEAD_NO)
- return 0;
- }
-
- // Missile
- if ((e_target.flags & FL_PROJECTILE) && (self.owner.target_select_missilebias < 0))
- return 0;
-
- // Team check
- if ((e_target.team == self.owner.team) || (self.owner.team == e_target.owner.team))
- return 0;
-
- return 1;
-}
-
-void turret_hk_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
- if (attacker.team == self.team)
- damage *= 0.5;
-
- self.velocity += force;
-
- self.health -= damage;
-
- if (self.health <= 0)
- turret_hk_missile_explode();
-}
-
-void turret_hk_attack()
-{
- local entity missile;
- //local entity flash2;
-
- sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
-
- missile = spawn ();
- missile.solid = SOLID_BBOX;
- setmodel (missile, "models/turrets/hunter2.md3"); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
- sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
- setorigin(missile, self.tur_shotorg_updated);
-
- missile.scale = 1;
- missile.classname = "hk_missile";
- missile.owner = self;
- missile.bot_dodge = TRUE;
- missile.bot_dodgerating = self.shot_dmg;
- missile.takedamage = DAMAGE_YES;
- missile.damageforcescale = 2;
- missile.health = 35;
- missile.think = turret_hk_missile_think;
- missile.event_damage = turret_hk_missile_damage;
- missile.nextthink = time + 0.25;
- missile.movetype = MOVETYPE_BOUNCEMISSILE;
- missile.effects = EF_LOWPRECISION;
- missile.velocity = self.tur_shotdir_updated * (self.shot_speed * 0.75);
- missile.angles = vectoangles(missile.velocity);
- missile.touch = turret_hk_missile_explode; //turret_hk_missile_touch;
- missile.flags = FL_PROJECTILE;
- missile.enemy = self.enemy;
- missile.team = self.team;
- missile.cnt = time + 30;
- missile.ticrate = max(cvar("sys_ticrate"),0.05);
-
- te_explosion (missile.origin);
-
- if (self.tur_head.frame == 0)
- self.tur_head.frame = self.tur_head.frame + 1;
-
-}
-
-/*
-void turret_hk_missile_touch()
-{
- if(other == self.enemy)
- turret_hk_missile_explode();
- else
- {
- if(self.cnt < time)
- {
- self.cnt = time + 0.25;
- self.health = self.health - 5;
- if(self.health <= 0)
- turret_hk_missile_explode();
-
- }
- }
-}
-*/
-
-void turret_hk_missile_think()
-{
- vector vu, vd, vf, vl, vr, ve; // Vector (direction)
- float fu, fd, ff, fl, fr, fe; // Fraction to solid
- vector olddir,wishdir,newdir; // Final direction
- float lt_for; // Length of Trace FORwrad
- float lt_seek; // Length of Trace SEEK (left, right, up down)
- float pt_seek; // Pitch of Trace SEEK (How mutch to angele left, right up, down trace towards v_forward)
- vector pre_pos;
- float myspeed;
- entity e;
- float ad;
-
- self.nextthink = time + self.ticrate;
-
- //if (self.cnt < time)
- // turret_hk_missile_explode();
-
- if (self.enemy.deadflag != DEAD_NO)
- self.enemy = world;
-
- // Pick the closest valid target.
- if (!self.enemy)
- {
- e = findradius(self.origin, 5000);
- while (e)
- {
- if (hk_is_valid_target(e))
- {
- if (!self.enemy)
- self.enemy = e;
- else
- if (vlen(self.origin - e.origin) < vlen(self.origin - self.enemy.origin))
- self.enemy = e;
- }
- e = e.chain;
- }
- }
-
- self.angles = vectoangles(self.velocity);
- self.angles_x = self.angles_x * -1;
- makevectors(self.angles);
- self.angles_x = self.angles_x * -1;
-
- if (self.enemy)
- {
- // Close enougth to do decent damage?
- if ( vlen(self.origin - self.enemy.origin) <= (self.owner.shot_radius * 0.25) )
- {
- turret_hk_missile_explode();
- return;
- }
-
- // Get data on enemy position
- pre_pos = self.enemy.origin +
- self.enemy.velocity *
- min((vlen(self.enemy.origin - self.origin) / vlen(self.velocity)),0.5);
-
- traceline(self.origin, pre_pos,TRUE,self.enemy);
- ve = normalize(pre_pos - self.origin);
- fe = trace_fraction;
-
- }
- else
- {
- fe = 0;
- }
-
- if ((fe != 1) || (self.enemy == world))
- {
- myspeed = vlen(self.velocity);
-
- lt_for = myspeed * 2;
- lt_seek = myspeed * 1.5;
-
- // Trace forward
- traceline(self.origin, self.origin + v_forward * lt_for,FALSE,self);
- vf = trace_endpos;
- ff = trace_fraction;
-
- // Find angular offset
- ad = vlen(vectoangles(normalize(self.enemy.origin - self.origin)) - self.angles);
-
- //Calculate new speed
-
- // To close to something, Slow down!
- if ( ((ff < 0.7) || (ad > 5)) && (myspeed > hk_minspeed) )
- myspeed = max(myspeed * hk_decel,hk_minspeed);
-
- // Failry clear, accelerate.
- if ( (ff > 0.7) && (myspeed < hk_maxspeed) )
- myspeed = min(myspeed * hk_accel,hk_maxspeed);
-
- // Setup trace pitch
- pt_seek = 1 - ff;
- pt_seek = bound(0.125,pt_seek,0.8);
- if (ff < 0.5) pt_seek = 1;
-
- // Trace left
- traceline(self.origin, self.origin + (-1 * (v_right * pt_seek) + (v_forward * ff)) * lt_seek,FALSE,self);
- vl = trace_endpos;
- fl = trace_fraction;
-
- // Trace right
- traceline(self.origin, self.origin + ((v_right * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
- vr = trace_endpos;
- fr = trace_fraction;
-
- // Trace up
- traceline(self.origin, self.origin + ((v_up * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
- vu = trace_endpos;
- fu = trace_fraction;
-
- // Trace down
- traceline(self.origin, self.origin + (-1 * (v_up * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
- vd = trace_endpos;
- fd = trace_fraction;
-
- vl = normalize(vl - self.origin);
- vr = normalize(vr - self.origin);
- vu = normalize(vu - self.origin);
- vd = normalize(vd - self.origin);
-
- // Panic tresh passed, find a single direction and turn as hard as we can
- if (pt_seek == 1)
- {
- wishdir = v_right;
- if (fl > fr) wishdir = -1 * v_right;
- if (fu > fl) wishdir = v_up;
- if (fd > fu) wishdir = -1 * v_up;
- }
- else
- {
- // Normalize our trace vectors to make a smooth path
- wishdir = normalize( (vl * fl) + (vr * fr) + (vu * fu) + (vd * fd) );
- }
-
- if (self.enemy)
- {
- if (fe < 0.1) fe = 0.1; // Make sure we always try to move sligtly towards our target
- wishdir = (wishdir * (1 - fe)) + (ve * fe);
- }
- }
- else
- {
- // Got a clear path to target, speed up fast (if not at full speed) and go straight for it.
- myspeed = vlen(self.velocity);
- if (myspeed < hk_maxspeed)
- myspeed = min(myspeed * hk_accel2,hk_maxspeed);
-
- wishdir = ve;
- //wishdir = normalize(self.enemy.origin - (self.enemy.origin + self.enemy.velocity));
- }
-
- if ((myspeed > hk_minspeed) && (self.cnt > time))
- myspeed = min(myspeed * hk_accel2,hk_maxspeed);
-
- // Ranoutagazfish?
- if (self.cnt < time)
- {
- self.cnt = time + 0.25;
- self.nextthink = 0;
- self.movetype = MOVETYPE_BOUNCE;
- sound (self, CHAN_VOICE, "", 0.4, ATTN_NORM);
- return;
- }
-
- // Calculate new heading
- olddir = normalize(self.velocity);
-
- newdir = normalize(olddir + wishdir * cvar("g_turrets_unit_hk_std_shot_speed_turnrate"));
-
- //fu = (1 / hk_maxspeed) * myspeed;
- //fd = fu - (0.75 - 0.25);
- //newdir = normalize(olddir + wishdir * fd);
-
- // Set heading & speed
- self.velocity = newdir * myspeed;
-
- // Align model with new heading
- self.angles = vectoangles(self.velocity);
-
-
-#ifdef TURRET_DEBUG_HK
- //if(self.atime < time) {
- if (fe <= 0.99)
- {
- te_lightning2(world,self.origin, self.origin + vr * lt_seek);
- te_lightning2(world,self.origin, self.origin + vl * lt_seek);
- te_lightning2(world,self.origin, self.origin + vu * lt_seek);
- te_lightning2(world,self.origin, self.origin + vd * lt_seek);
- te_lightning2(world,self.origin, vf);
- }
- else
- {
- te_lightning2(world,self.origin, self.enemy.origin);
- }
- bprint("Speed: ", ftos(rint(myspeed)), "\n");
- bprint("Trace to solid: ", ftos(rint(ff * 100)), "%\n");
- bprint("Trace to target:", ftos(rint(fe * 100)), "%\n");
- self.atime = time + 0.2;
- //}
-#endif
-}
-
-void turret_hk_missile_explode()
-{
- vector org2;
- float d;
-
- if ((other == self.owner)||(other == self.owner.tur_head))
- return;
-
- //vector org2;
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
- org2 = findbetterlocation (self.origin, 16);
-
- // LordHavoc: TE_TEI_BIGEXPLOSION
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 78);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
-
- self.event_damage = SUB_Null;
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-
-#ifdef TURRET_DEBUG
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
- self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
-#endif
-
- // Target dead, get another is still targeting the same.
- if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
- self.owner.enemy = world;
-
- remove (self);
-}
-
-void turret_hk_postthink()
-{
- if (cvar("g_turrets_reloadcvars"))
- {
- hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
- hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
- hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
- hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
- hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
- }
-
- if (self.tur_head.frame != 0)
- self.tur_head.frame = self.tur_head.frame + 1;
-
- if (self.tur_head.frame > 5)
- self.tur_head.frame = 0;
-
-}
-
-void turret_hk_dinit()
-{
- if (self.netname == "") self.netname = "Hunter-killer turret";
-
- hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
- hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
- hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
- hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
- hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
-
- self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_RECIVETARGETS;
-
- self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
-
- self.aim_flags = TFL_AIM_SIMPLE;
-
- self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
-
- self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF;
-
- self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
-
- self.shoot_flags = TFL_SHOOT_CLEARTARGET;
-
- if (turret_stdproc_init("hk_std") == 0)
- {
- remove(self);
- return;
- }
-
- self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TEAMCHECK;
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/hk.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_hk_attack;
-
- // re-color badge & handle recoil effect
- self.turret_postthink = turret_hk_postthink;
-
- // What to do when reciveing foreign target data
- self.turret_addtarget = turret_hk_addtarget;
-}
-
-/*
-* Turret that fires Hunter-killer missiles.
-* Missiles seek their target and try to avoid obstacles. If target dies early, they
-* pick a new one on their own.
-*/
-
-/*QUAKED turret_hk (0 .5 .8) ?
-hunter-killer missiles.
-*/
-
-void spawnfunc_turret_hk()
-{
- //precache_model ( "models/turrets/hunter2.md3");
- //precache_model ("models/turrets/base.md3");
- //precache_model ("models/turrets/hk.md3");
-
- self.think = turret_hk_dinit;
- self.nextthink = time + 0.5;
-}
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_machinegun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_machinegun.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_machinegun.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,71 +0,0 @@
-void spawnfunc_turret_machinegun();
-void turret_machinegun_std_init();
-void turret_machinegun_attack();
-
-//.float bulletcounter;
-void turret_machinegun_attack()
-{
-
- entity flash;
- sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
- fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
-
- te_smallflash(self.tur_shotorg_updated);
- trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
-
- // muzzle flash for 3rd person view
- flash = spawn();
- //setorigin(flash, '43 1 8');
- setmodel(flash, "models/uziflash.md3"); // precision set below
- setattachment(flash, self.tur_head, "tag_fire");
- flash.think = W_Uzi_Flash_Go;
- flash.nextthink = time + 0.02;
- flash.frame = 2;
- flash.angles_z = flash.v_angle_z + random() * 180;
- flash.alpha = 1;
- flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-}
-
-
-void turret_machinegun_std_init()
-{
- if (self.netname == "") self.netname = "Machinegun Turret";
-
- self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
- self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
-
- if (turret_stdproc_init("machinegun_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/machinegun.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_machinegun_attack;
-
-}
-
-
-
-/*
-* machinegun turret. does what you'd expect
-*/
-
-/*QUAKED turret_machinegun (0 .5 .8) ?
-*/
-void spawnfunc_turret_machinegun()
-{
- //precache_model ("models/turrets/machinegun.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_machinegun_std_init;
- self.nextthink = time + 0.5;
-}
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,117 +0,0 @@
-void spawnfunc_turret_mlrs();
-void turret_mlrs_dinit();
-void turret_mlrs_attack();
-void turret_mlrs_projectile_explode();
-
-void turret_mlrs_postthink()
-{
-
- if ((self.tur_head.frame >= 6) && (self.attack_finished_single <= time))
- self.tur_head.frame = 0;
-}
-
-void turret_mlrs_attack()
-{
- entity missile;
-
- turret_tag_fire_update();
-
- sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
-
- missile = spawn ();
- setmodel (missile, "models/turrets/rocket.md3"); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
- sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
- setorigin(missile, self.tur_shotorg_updated);
- missile.classname = "mlrs_missile";
- missile.owner = self;
- missile.bot_dodge = TRUE;
- missile.bot_dodgerating = self.shot_dmg;
- missile.takedamage = DAMAGE_YES;
- missile.damageforcescale = 4;
- missile.health = 30;
- missile.think = turret_mlrs_projectile_explode;
- missile.nextthink = time + max(self.tur_impacttime,(self.shot_radius * 2) / self.shot_speed);
- missile.solid = SOLID_BBOX;
- missile.movetype = MOVETYPE_FLYMISSILE;
- missile.effects = EF_LOWPRECISION;
- missile.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
- missile.angles = vectoangles(missile.velocity);
- missile.touch = turret_mlrs_projectile_explode;
- missile.flags = FL_PROJECTILE;
- missile.solid = SOLID_BBOX;
- missile.enemy = self.enemy;
-
- te_explosion (missile.origin);
-
- self.tur_head.frame = 7 - self.volly_counter;
-}
-
-void turret_mlrs_projectile_explode()
-{
- vector org2;
-
- //vector org2;
- sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
- org2 = findbetterlocation (self.origin, 16);
- pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-
- self.event_damage = SUB_Null;
-
-#ifdef TURRET_DEBUG
- float d;
-
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
- self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
-#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-#endif
-
- // Target dead, get another is still targeting the same.
- if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
- self.owner.enemy = world;
-
- remove (self);
-}
-
-void turret_mlrs_dinit()
-{
- if (self.netname == "") self.netname = "MLRS turret";
-
- self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
- self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
-
- if (turret_stdproc_init("mlrs_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/mlrs.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_mlrs_attack;
- self.turret_postthink = turret_mlrs_postthink;
-
-}
-
-/*QUAKED turret_mlrs (0 .5 .8) ?
-*/
-
-void spawnfunc_turret_mlrs()
-{
- //precache_model ( "models/turrets/rocket.md3");
- //precache_model ("models/turrets/mlrs.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_mlrs_dinit;
- self.nextthink = time + 0.5;
-}
-
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_phaser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_phaser.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_phaser.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,148 +0,0 @@
-void spawnfunc_turret_phaser();
-void turret_phaser_dinit();
-void turret_phaser_attack();
-
-.float fireflag;
-
-float turret_phaser_firecheck()
-{
- if (self.fireflag != 0) return 0;
- return turret_stdproc_firecheck();
-}
-
-void turret_phaser_postthink()
-{
- if (self.tur_head.frame == 0)
- return;
-
- if (self.fireflag == 1)
- {
- if (self.tur_head.frame == 10)
- self.tur_head.frame = 1;
- else
- self.tur_head.frame = self.tur_head.frame +1;
- }
- else if (self.fireflag == 2 )
- {
- self.tur_head.frame = self.tur_head.frame +1;
- if (self.tur_head.frame == 15)
- {
- self.tur_head.frame = 0;
- self.fireflag = 0;
- }
- }
-}
-
-void beam_think()
-{
- if ((time > self.cnt)||(self.owner.deadflag != DEAD_NO))
- {
- self.owner.attack_finished_single = time + self.owner.shot_refire;
- self.owner.fireflag = 2;
- self.owner.tur_head.frame = 10;
- sound (self, CHAN_PROJECTILE, "", 1, ATTN_NORM);
- remove(self);
- return;
- }
-
- turret_do_updates(self.owner);
-
- if (time - self.shot_spread > 0)
- {
- self.shot_spread = time + 2;
- sound (self, CHAN_VOICE, "turrets/phaser.ogg", 1, ATTN_NORM);
- }
-
-
- self.nextthink = time + self.ticrate;
-
- self.owner.attack_finished_single = time + frametime;
- entity oldself;
- oldself = self;
- self = self.owner;
- FireImoBeam ( self.tur_shotorg_updated,
- self.tur_shotorg_updated + self.tur_shotdir_updated * self.target_range_fire,
- '-1 -1 -1' * self.shot_radius,
- '1 1 1' * self.shot_radius,
- self.shot_force,
- oldself.shot_dmg,
- 0.75,
- DEATH_TURRET);
- self = oldself;
- self.scale = vlen(self.owner.tur_shotorg_updated - trace_endpos) / 256;
-
-}
-
-void turret_phaser_attack()
-{
- entity beam;
-
- beam = spawn();
- beam.ticrate = 0.1; //cvar("sys_ticrate");
- setmodel(beam,"models/turrets/phaser_beam.md3");
- beam.effects = EF_LOWPRECISION;
- beam.solid = SOLID_NOT;
- beam.think = beam_think;
- beam.cnt = time + self.shot_speed;
- beam.shot_spread = time + 2;
- beam.nextthink = time;
- beam.owner = self;
- beam.shot_dmg = self.shot_dmg / (self.shot_speed / beam.ticrate);
- beam.scale = self.target_range_fire / 256;
- beam.movetype = MOVETYPE_NONE;
- beam.enemy = self.enemy;
- beam.bot_dodge = TRUE;
- beam.bot_dodgerating = beam.shot_dmg;
- sound (beam, CHAN_PROJECTILE, "turrets/phaser.ogg", 1, ATTN_NORM);
- self.fireflag = 1;
-
- beam.attack_finished_single = self.attack_finished_single;
- self.attack_finished_single = time; // + cvar("sys_ticrate");
-
- setattachment(beam,self.tur_head,"tag_fire");
-
- soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
-
- if (self.tur_head.frame == 0)
- self.tur_head.frame = 1;
-}
-
-void turret_phaser_dinit()
-{
- if (self.netname == "") self.netname = "Phaser Cannon";
-
- self.turrcaps_flags = TFL_TURRCAPS_SNIPER|TFL_TURRCAPS_HITSCAN|TFL_TURRCAPS_PLAYERKILL;
- self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
- self.aim_flags = TFL_AIM_ZEASE | TFL_AIM_LEAD;
-
- if (turret_stdproc_init("phaser_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/phaser.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- self.turret_firecheckfunc = turret_phaser_firecheck;
- self.turret_firefunc = turret_phaser_attack;
- self.turret_postthink = turret_phaser_postthink;
-
-}
-
-/*QUAKED turret_phaser(0 .5 .8) ?
-*/
-void spawnfunc_turret_phaser()
-{
- //precache_sound ("turrets/phaser.ogg");
- //precache_model ("models/turrets/phaser.md3");
- //precache_model ("models/turrets/phaser_beam.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_phaser_dinit;
- self.nextthink = time + 0.5;
-}
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,183 +0,0 @@
-void spawnfunc_turret_plasma();
-void spawnfunc_turret_plasma_dual();
-
-void turret_plasma_std_init();
-void turret_plasma_dual_init();
-
-void turret_plasma_attack();
-void turret_plasma_projectile_explode();
-
-void turret_plasma_postthink()
-{
- if (self.tur_head.frame != 0)
- self.tur_head.frame = self.tur_head.frame + 1;
-
- if (self.classname == "turret_plasma_dual")
- {
- if (self.tur_head.frame >= 6)
- self.tur_head.frame = 0;
- }
- else
- {
- if (self.tur_head.frame >= 5)
- self.tur_head.frame = 0;
- }
-}
-
-void turret_plasma_attack()
-{
- entity proj;
-
- turret_tag_fire_update();
-
- sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
- proj = spawn ();
- setorigin(proj, self.tur_shotorg_updated);
- setsize(proj, '0 0 0', '0 0 0');
- setmodel(proj, "models/elaser.mdl"); // precision set above
- proj.classname = "plasmabomb";
- proj.owner = self;
- proj.bot_dodge = TRUE;
- proj.bot_dodgerating = self.shot_dmg;
- proj.think = turret_plasma_projectile_explode;
- proj.nextthink = time + 9;
- proj.solid = SOLID_BBOX;
- proj.movetype = MOVETYPE_FLYMISSILE;
- proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
- proj.angles = vectoangles(proj.velocity);
- proj.touch = turret_plasma_projectile_explode;
- proj.flags = FL_PROJECTILE;
- proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
- proj.enemy = self.enemy;
- proj.flags = FL_PROJECTILE | FL_NOTARGET;
-
- if (self.tur_head.frame == 0)
- self.tur_head.frame = 1;
-
- // trailparticles(proj,particleeffectnum("TR_REDPLASMA"),proj.origin,proj.origin + proj.velocity);
-
- // Snapback the head
- // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
-
- //if(self.classname == "turret_plasma_dual")
- // self.tur_shotorg_y = self.tur_shotorg_y * -1;
-
-}
-
-void turret_plasma_projectile_explode()
-{
- vector org2;
-
- org2 = findbetterlocation (self.origin, 8);
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, 79);
- WriteCoord (MSG_BROADCAST, org2_x);
- WriteCoord (MSG_BROADCAST, org2_y);
- WriteCoord (MSG_BROADCAST, org2_z);
- WriteCoord (MSG_BROADCAST, 0); // SeienAbunae: groan... Useless clutter
- WriteCoord (MSG_BROADCAST, 0);
- WriteCoord (MSG_BROADCAST, 0);
- WriteByte (MSG_BROADCAST, 155);
-
- self.event_damage = SUB_Null;
-
-
-#ifdef TURRET_DEBUG
- float d;
-
- d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
- self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
- self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
-#else
- RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-#endif
- sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", 1, ATTN_NORM);
-
- remove (self);
-}
-
-void turret_plasma_std_init()
-{
- if (self.netname == "") self.netname = "Plasma Cannon";
-
- self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
-
- if (turret_stdproc_init("plasma_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/plasma.md3");
-
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // Our fire routine
- self.turret_firefunc = turret_plasma_attack;
-
- // re-color badge & handle recoil effect
- self.turret_postthink = turret_plasma_postthink;
-}
-
-
-void turret_plasma_dual_init()
-{
- if (self.netname == "") self.netname = "Dual Plasma Cannon";
-
- self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
-
- if (turret_stdproc_init("plasma_dual") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/base.md3");
- setmodel(self.tur_head,"models/turrets/plasmad.md3");
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- // select aim
- self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE;
-
- // Our fire routine
- self.turret_firefunc = turret_plasma_attack;
-
- // re-color badge & handle recoil effect
- self.turret_postthink = turret_plasma_postthink;
-}
-
-
-/*
-* Basic moderate (std) or fast (dual) fireing, short-mid range energy cannon.
-* Not too mutch of a therat on its own, but can be rather dangerous in groups.
-* Regenerates ammo slowly, support with a fusionreactor(s) to do some real damage.
-*/
-
-/*QUAKED turret_plasma (0 .5 .8) ?
-*/
-void spawnfunc_turret_plasma()
-{
- //precache_model ("models/turrets/plasma.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_plasma_std_init;
- self.nextthink = time + 0.5;
-}
-
-/*QUAKED turret_plasma_dual (0 .5 .8) ?
-*/
-void spawnfunc_turret_plasma_dual()
-{
- //precache_model ("models/turrets/plasmad.md3");
- //precache_model ("models/turrets/base.md3");
-
- self.think = turret_plasma_dual_init;
- self.nextthink = time + 0.5;
-}
-
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_targettrigger.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_targettrigger.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_targettrigger.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,41 +0,0 @@
-void spawnfunc_turret_targettrigger();
-void turret_targettrigger_touch();
-
-void turret_targettrigger_touch()
-{
- entity e;
- if (self.cnt > time) return;
- entity oldself;
- oldself = self;
-
- e = find(world, targetname, self.target);
- while (e)
- {
- if (e.turrcaps_flags & TFL_TURRCAPS_RECIVETARGETS)
- {
- self = e;
- e.turret_addtarget(other,oldself);
- }
-
- e = find(e, targetname, oldself.target);
- }
-
- oldself.cnt = time + 0.5;
-
- self = oldself;
-}
-
-/*QUAKED turret_targettrigger (.5 .5 .5) ?
-*/
-void spawnfunc_turret_targettrigger()
-{
- if (!cvar("g_turrets"))
- {
- remove(self);
- return;
- }
-
- InitTrigger ();
-
- self.touch = turret_targettrigger_touch;
-}
Deleted: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_tessla.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_tessla.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/turret_unit_tessla.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,147 +0,0 @@
-void spawnfunc_turret_tesla();
-void turret_tesla_dinit();
-void turret_tesla_fire();
-
-.float toasted;
-entity toast(entity from, float range, float damage)
-{
- entity e;
- entity etarget;
- float d,dd;
-
- dd = range + 1;
-
- e = findradius(from.origin,range);
- while (e)
- {
- if ((e.toasted != 1) && (e != from))
- if (turret_validate_target(self,e,self.target_validate_flags) > 0)
- {
-
- traceline(from.origin,e.origin,0,from);
- if (trace_fraction > 0.9)
- {
- d = vlen(e.origin - from.origin);
- if (d < dd)
- {
- dd = d;
- etarget = e;
- }
- }
- }
- e = e.chain;
- }
-
- if (etarget)
- {
- te_smallflash(etarget.origin);
- te_lightning1(world,from.origin,etarget.origin);
- Damage(etarget,self,self,damage,DEATH_TURRET,etarget.origin,'0 0 0');
- etarget.toasted = 1;
- }
-
- return etarget;
-}
-
-void turret_tesla_fire()
-{
- entity e,t;
- float d,r,i;
-
- if (cvar("g_turrets_nofire") != 0)
- return;
-
- if (self.attack_finished_single > time) return;
-
- d = self.shot_dmg;
- r = self.target_range;
- e = spawn();
- setorigin(e,self.origin + self.tur_shotorg);
-
-
- self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
- TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
-
- t = toast(e,r,d);
- remove(e);
-
- if (t == world) return;
-
- self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
- TFL_TARGETSELECT_TEAMCHECK;
-
- self.attack_finished_single = time + self.shot_refire;
- self.ammo = self.ammo - self.shot_dmg;
- for (i = 0;i < 10;i = i + 1)
- {
- d *= 0.5;
- r *= 0.75;
- t = toast(t,r,d);
- if (t == world) break;
- }
-
- e = findchainfloat(toasted, 1);
- while (e)
- {
- e.toasted = 0;
- e = e.chain;
- }
-}
-
-void turret_tesla_postthink()
-{
- turret_tesla_fire();
-
- self.tur_head.frame = self.tur_head.frame + 1;
-
- if (self.tur_head.frame >= 11)
- self.tur_head.frame = 0;
-
- if (self.tur_head.avelocity == '0 0 0')
- self.tur_head.avelocity = '0 35 0';
-}
-
-
-void turret_tesla_dinit()
-{
- if (self.netname == "") self.netname = "Tesla Coil";
-
- self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
- self.target_select_flags = TFL_TARGETSELECT_NO;
- self.firecheck_flags = TFL_FIRECHECK_REFIRE;
- self.shoot_flags = TFL_SHOOT_CUSTOM;
- self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
- self.aim_flags = TFL_AIM_NO;
- self.track_flags = TFL_TRACK_NO;
-
- if (turret_stdproc_init("tesla_std") == 0)
- {
- remove(self);
- return;
- }
-
- setmodel(self,"models/turrets/tesla_base.md3");
- setmodel(self.tur_head,"models/turrets/tesla_head.md3");
-
- self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
- TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
-
- if (!turret_tag_setup(0))
- dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
- self.turret_firefunc = turret_stdproc_nothing;
- self.turret_postthink = turret_tesla_postthink;
-}
-
-/*QUAKED turret_tesla (0 .5 .8) ?
-*/
-void spawnfunc_turret_tesla()
-{
- //precache_model ("models/turrets/tesla_head.md3");
- //precache_model ("models/turrets/tesla_base.md3");
-
-
- self.think = turret_tesla_dinit;
- self.nextthink = time + 0.5;
-}
-
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_checkpoint.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_checkpoint.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,41 @@
+void checkpoint_think()
+{
+ if(self.goalcurrent != world)
+ te_lightning1(self,self.origin,self.goalcurrent.origin);
+
+
+ self.nextthink = time + 0.5;
+}
+
+void turret_checkpoint_dinit()
+{
+ entity e;
+
+
+ if(self.target != "")
+ {
+ e = find(world,targetname,self.target);
+ if(!e)
+ {
+ bprint("turret_checkpoint without valid target! (",vtos(self.origin),")\n");
+ remove(self);
+ return;
+ }
+
+ // TODO:: ADD WORLD-INTERACTIVE PATH SUBDEVISION IF PATH NOT CLEAR
+ self.goalcurrent = e;
+ }
+
+}
+
+/**
+.wait
+**/
+void spawnfunc_turret_checkpoint()
+{
+ if(!self.wait)
+ self.wait = 5;
+
+ self.think = turret_checkpoint_dinit;
+ self.nextthink = time + 0.25;
+}
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_common.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_common.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_common.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_common.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,150 @@
+float turret_tag_setup(float linked)
+{
+ vector v;
+ float f;
+
+ // Laters dooz
+ if (linked)
+ return 0;
+
+ f = gettagindex(self,"tag_head");
+ v = gettaginfo(self,f);
+ v = v + self.origin;
+ setorigin(self.tur_head,v);
+
+ f = gettagindex(self.tur_head,"tag_fire");
+ v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
+ v_y *= -1;
+ self.tur_shotorg = v;
+
+ f = gettagindex(self.tur_head,"tag_aim");
+ v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
+ self.tur_aimorg = v;
+
+ return 1;
+}
+
+float turret_tag_fire_update()
+{
+ vector v;
+ float f;
+
+ f = gettagindex(self.tur_head,"tag_fire");
+ v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
+ v_y *= -1;
+ self.tur_shotorg = v;
+
+ f = gettagindex(self.tur_head,"tag_aim");
+ v = gettaginfo(self.tur_head,f) + (self.tur_head.origin - self.origin);
+ self.tur_aimorg = v;
+
+ return 1;
+}
+
+void FireImoBeam (vector start,vector end,vector smin,vector smax,
+ float bforce,float f_dmg,float f_velfactor, float deathtype)
+
+{
+ local vector hitloc, force, endpoint, dir;
+ local entity ent;
+
+ dir = normalize(end - start);
+ force = dir * bforce;
+
+ // go a little bit into the wall because we need to hit this wall later
+ end = end + dir;
+
+ // trace multiple times until we hit a wall, each obstacle will be made unsolid.
+ // note down which entities were hit so we can damage them later
+ while (1)
+ {
+ tracebox(start, smin, smax, end, FALSE, self);
+
+ // if it is world we can't hurt it so stop now
+ if (trace_ent == world || trace_fraction == 1)
+ break;
+
+ if (trace_ent.solid == SOLID_BSP)
+ break;
+
+ // make the entity non-solid so we can hit the next one
+ trace_ent.railgunhit = TRUE;
+ trace_ent.railgunhitloc = end;
+ trace_ent.railgunhitsolidbackup = trace_ent.solid;
+
+ // stop if this is a wall
+
+
+ // make the entity non-solid
+ trace_ent.solid = SOLID_NOT;
+ }
+
+ endpoint = trace_endpos;
+
+ // find all the entities the railgun hit and restore their solid state
+ ent = findfloat(world, railgunhit, TRUE);
+ while (ent)
+ {
+ // restore their solid type
+ ent.solid = ent.railgunhitsolidbackup;
+ ent = findfloat(ent, railgunhit, TRUE);
+ }
+
+ // find all the entities the railgun hit and hurt them
+ ent = findfloat(world, railgunhit, TRUE);
+ while (ent)
+ {
+ // get the details we need to call the damage function
+ hitloc = ent.railgunhitloc;
+ ent.railgunhitloc = '0 0 0';
+ ent.railgunhitsolidbackup = SOLID_NOT;
+ ent.railgunhit = FALSE;
+
+ // apply the damage
+ if (ent.takedamage)
+ {
+ Damage (ent, self, self, f_dmg, deathtype, hitloc, force);
+ ent.velocity = ent.velocity * f_velfactor;
+ //ent.alpha = 0.25 + random() * 0.75;
+ }
+
+ // advance to the next entity
+ ent = findfloat(ent, railgunhit, TRUE);
+ }
+ trace_endpos = endpoint;
+}
+
+void turrets_precash()
+{
+ precache_model ("models/turrets/c512.md3");
+
+ precache_sound ("turrets/phaser.ogg");
+
+ precache_model ("models/turrets/base-gib1.md3");
+ precache_model ("models/turrets/base-gib2.md3");
+ precache_model ("models/turrets/base-gib3.md3");
+ precache_model ("models/turrets/base-gib4.md3");
+
+ precache_model ("models/turrets/head-gib1.md3");
+ precache_model ("models/turrets/head-gib2.md3");
+ precache_model ("models/turrets/head-gib3.md3");
+ precache_model ("models/turrets/head-gib4.md3");
+
+ precache_model ("models/turrets/base.md3");
+ precache_model ("models/turrets/flac.md3");
+ precache_model ("models/turrets/pd_proj.md3");
+ precache_model ("models/turrets/reactor.md3");
+ precache_model ("models/turrets/mlrs_rocket.md3");
+ precache_model ("models/turrets/hellion.md3");
+ precache_model ("models/turrets/hunter2.md3");
+ precache_model ("models/turrets/hk.md3");
+ precache_model ("models/turrets/machinegun.md3");
+ precache_model ("models/turrets/rocket.md3");
+ precache_model ("models/turrets/mlrs.md3");
+ precache_model ("models/turrets/phaser.md3");
+ precache_model ("models/turrets/phaser_beam.md3");
+ precache_model ("models/turrets/plasmad.md3");
+ precache_model ("models/turrets/plasma.md3");
+ precache_model ("models/turrets/tesla_head.md3");
+ precache_model ("models/turrets/tesla_base.md3");
+}
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_flac.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,106 @@
+void spawnfunc_turret_flac();
+void turret_flac_dinit();
+void turret_flac_attack();
+void turret_flac_projectile_explode();
+
+void turret_flac_attack()
+{
+ local entity proj;
+
+ turret_tag_fire_update();
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+ proj = spawn ();
+ setorigin(proj, self.tur_shotorg_updated);
+ setmodel(proj, "models/turrets/pd_proj.md3");
+ setsize(proj, '0 0 0', '0 0 0');
+ proj.classname = "turret_fire";
+ proj.owner = self;
+ proj.bot_dodge = TRUE;
+ proj.bot_dodgerating = self.shot_dmg;
+ proj.solid = SOLID_NOT;
+ proj.movetype = MOVETYPE_FLYMISSILE;
+ proj.flags = FL_PROJECTILE;
+ proj.effects = EF_LOWPRECISION;
+ proj.takedamage = DAMAGE_YES;
+ proj.health = 10;
+ proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+ proj.angles = vectoangles(proj.velocity);
+ proj.touch = turret_flac_projectile_explode;
+ proj.think = turret_flac_projectile_explode;
+ proj.nextthink = time + (vlen(self.tur_aimpos - self.tur_shotorg_updated) / self.shot_speed) + (random() * self.shot_spread);
+
+ self.tur_head.frame = self.tur_head.frame + 1;
+ if (self.tur_head.frame >= 4) self.tur_head.frame = 0;
+
+}
+
+void turret_flac_projectile_explode()
+{
+ float ftmp;
+
+ te_explosion (self.origin);
+
+ ftmp = crandom();
+ if (ftmp<-0.7)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+ else if (ftmp<0.4)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+ else if (ftmp<1)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+
+
+ self.event_damage = SUB_Null;
+
+
+#ifdef TURRET_DEBUG
+
+ ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
+ self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#else
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+#endif
+
+ remove (self);
+}
+
+
+void turret_flac_dinit()
+{
+ if (self.netname == "") self.netname = "FLAC Cannon";
+
+
+ self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_FASTPROJ | TFL_TURRCAPS_MISSILEKILL;
+ self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
+
+ if (turret_stdproc_init("flac_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/flac.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_flac_attack;
+
+}
+/*QUAKED turret_flac (0 .5 .8) ?
+*/
+
+void spawnfunc_turret_flac()
+{
+ //precache_model ("models/turrets/base.md3");
+ //precache_model ("models/turrets/flac.md3");
+ //precache_model("models/turrets/pd_proj.md3");
+
+ self.think = turret_flac_dinit;
+ self.nextthink = time + 0.5;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,81 @@
+void spawnfunc_turret_fusionreactor();
+void turret_fusionreactor_dinit();
+void turret_fusionreactor_fire();
+
+float turret_fusionreactor_firecheck()
+{
+ if (self.enemy == world) return 0;
+
+ if (!self.enemy.ammo_flags & TFL_AMMO_RECIVE) return 0;
+ if (!self.enemy.ammo_flags & TFL_AMMO_ENERGY) return 0;
+
+ if (self.ammo < self.shot_dmg) return 0;
+ if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
+ if (self.tur_dist_enemy > self.target_range_fire) return 0;
+ if (self.tur_dist_enemy < self.target_range_min) return 0;
+
+ return 1;
+}
+
+
+void turret_fusionreactor_fire()
+{
+ self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
+ //te_lightning1(world,self.origin,self.enemy.origin);
+}
+
+void turret_fusionreactor_postthink()
+{
+}
+
+
+void turret_fusionreactor_dinit()
+{
+ if (self.netname == "") self.netname = "Fusionreactor";
+
+ self.turrcaps_flags =TFL_TURRCAPS_SUPPORT | TFL_TURRCAPS_AMMOSOURCE;
+
+ self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
+
+ self.target_select_flags = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMTS;
+
+ self.firecheck_flags = TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_OTHER_AMMO | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_WORLD;
+
+ self.shoot_flags = TFL_SHOOT_HITALLVALID;
+
+ self.aim_flags = TFL_AIM_NO;
+
+ self.track_flags = TFL_TRACK_NO;
+
+ if (turret_stdproc_init("fusreac_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/reactor.md3");
+
+ //if(!turret_tag_setup(0))
+ // dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ self.tur_head.scale = 0.75;
+ setorigin(self.tur_head,self.origin + '0 0 25');
+ self.tur_head.avelocity = '0 50 0';
+
+ self.turret_firecheckfunc = turret_fusionreactor_firecheck;
+ self.turret_firefunc = turret_fusionreactor_fire;
+
+ self.turret_postthink = turret_fusionreactor_postthink;
+}
+
+/*QUAKED turret_fusionreactor (0 .5 .8) ?
+*/
+void spawnfunc_turret_fusionreactor()
+{
+ //precache_model ("models/turrets/reactor.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_fusionreactor_dinit;
+ self.nextthink = time + 0.5;
+}
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_hellion.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,221 @@
+.float shot_speed_max;
+.float shot_speed_gain;
+
+void spawnfunc_turret_hellion();
+void turret_hellion_dinit();
+void turret_hellion_attack();
+void turret_hellion_missile_explode();
+void turret_hellion_missile_think();
+void turret_hellion_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+
+void turret_hellion_postthink()
+{
+ if (cvar("g_turrets_reloadcvars"))
+ {
+ if (!self.shot_speed_max) self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
+ if (!self.shot_speed_gain) self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
+ }
+
+ if (self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame > 7)
+ self.tur_head.frame = 0;
+}
+
+void turret_hellion_attack()
+{
+ local entity missile;
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+
+ missile = spawn ();
+ setorigin(missile, self.tur_shotorg_updated);
+ sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+ setmodel (missile, "models/turrets/mlrs_rocket.md3"); // precision set below
+ setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+
+ missile.classname = "hellion_missile";
+ missile.owner = self;
+ missile.bot_dodge = TRUE;
+ missile.bot_dodgerating = self.shot_dmg;
+ missile.takedamage = DAMAGE_YES;
+ missile.damageforcescale = 2;
+ missile.health = 50;
+ missile.enemy = self.enemy;
+ missile.think = turret_hellion_missile_think;
+ missile.nextthink = time + 0.2;
+ missile.solid = SOLID_BBOX;
+ missile.movetype = MOVETYPE_FLYMISSILE;
+ missile.effects = EF_LOWPRECISION;
+ missile.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed; // + ('0 0 1' * self.shot_speed * 0.15);
+ missile.angles = vectoangles(missile.velocity);
+ missile.touch = turret_hellion_missile_explode;
+ missile.flags = FL_PROJECTILE;
+ missile.solid = SOLID_BBOX;
+ missile.tur_health = time + 9;
+ missile.tur_aimpos = randomvec() * 128;
+ te_explosion (missile.origin);
+
+ // switch tubes
+ self.tur_shotorg_y = self.tur_shotorg_y * -1;
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+}
+
+void turret_hellion_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+{
+ self.health = self.health - damage;
+ self.velocity = self.velocity + vforce;
+ if (self.health <= 0) turret_hellion_missile_explode();
+}
+
+void turret_hellion_missile_think()
+{
+ vector olddir,newdir;
+ vector pre_pos;
+ float itime;
+
+ self.nextthink = time + 0.1;
+
+ // Enemy in range?
+ if (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 0.25)
+ turret_hellion_missile_explode();
+
+ olddir = normalize(self.velocity);
+
+ if (self.tur_health < time) turret_hellion_missile_explode();
+
+ // Enemy dead? just keep on the current heading then.
+ if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
+ {
+
+ // Make sure we dont return to tracking a respawned player
+ self.enemy = world;
+
+ // Accelerate
+ self.velocity = olddir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
+
+ // Turn model
+ self.angles = vectoangles(self.velocity);
+
+ //if ( (vlen(self.origin - self.owner.origin)) > (self.owner.shot_radius * 10) )
+ // turret_hellion_missile_explode();
+
+ // return;
+ }
+
+ olddir = normalize(self.velocity);
+
+ if (self.enemy)
+ {
+ // Predict enemy position
+ itime = vlen(self.enemy.origin - self.origin) / vlen(self.velocity);
+ pre_pos = self.enemy.origin + self.enemy.velocity * itime;
+ }
+ else
+ {
+ pre_pos = self.origin + olddir * 1024;
+ }
+
+ pre_pos = (pre_pos + self.enemy.origin) * 0.5;
+
+ //pre_pos += randomvec() * 128; //self.tur_aimpos * (sin(32) * time) ;
+
+
+ // Find out the direction to that place
+ newdir = normalize(pre_pos - self.origin);
+
+ // Turn
+ newdir = normalize(olddir + newdir * 0.5);
+
+ // Accelerate
+ self.velocity = newdir * min(vlen(self.velocity) * self.owner.shot_speed_gain,self.owner.shot_speed_max);
+
+ // Turn model
+ self.angles = vectoangles(self.velocity);
+
+ if (time+itime < time+0.1)
+ {
+ self.think = turret_hellion_missile_explode;
+ self.nextthink = time + itime;
+ }
+}
+
+void turret_hellion_missile_explode()
+{
+ vector org2;
+ float d;
+
+ sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+ org2 = findbetterlocation (self.origin, 16);
+
+ // LordHavoc: TE_TEI_BIGEXPLOSION
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 78);
+ WriteCoord (MSG_BROADCAST, org2_x);
+ WriteCoord (MSG_BROADCAST, org2_y);
+ WriteCoord (MSG_BROADCAST, org2_z);
+
+ self.event_damage = SUB_Null;
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+
+#ifdef TURRET_DEBUG
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
+ self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#endif
+
+ // Target dead, get another is still targeting the same.
+ if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
+ self.owner.enemy = world;
+
+ remove (self);
+}
+
+void turret_hellion_dinit()
+{
+ if (self.netname == "") self.netname = "Hellion Missile Turret";
+
+ if (!self.shot_speed_max) self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
+ if (!self.shot_speed_gain) self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
+
+ self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_FASTPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
+ self.aim_flags = TFL_AIM_SIMPLE;
+ self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK ;
+ self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF | TFL_FIRECHECK_OWM_AMMO;
+ self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
+
+ if (turret_stdproc_init("hellion_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/hellion.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_hellion_attack;
+
+ // Custom animations and sutch
+ self.turret_postthink = turret_hellion_postthink;
+}
+
+/*QUAKED turret_hellion (0 .5 .8) ?
+*/
+void spawnfunc_turret_hellion()
+{
+ //precache_model ( "models/turrets/mlrs_rocket.md3");
+ //precache_model ("models/turrets/hellion.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_hellion_dinit;
+ self.nextthink = time + 0.5;
+}
+
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_hk.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,470 @@
+//#define TURRET_DEBUG_HK
+
+#ifdef TURRET_DEBUG_HK
+.float atime;
+#endif
+
+void spawnfunc_turret_hk();
+void turret_hk_dinit();
+void turret_hk_attack();
+void turret_hk_missile_explode();
+void turret_hk_missile_think();
+void turret_hk_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+float turret_hk_addtarget(entity e_target,entity e_sender);
+//void turret_hk_missile_touch();
+
+float hk_maxspeed;
+float hk_minspeed;
+float hk_accel;
+float hk_accel2;
+float hk_decel;
+
+float turret_hk_addtarget(entity e_target,entity e_sender)
+{
+ if (e_target)
+ {
+ if (turret_validate_target(self,e_target,self.target_validate_flags) > 0)
+ {
+ self.enemy = e_target;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+float hk_is_valid_target(entity e_target)
+{
+ if (e_target == world)
+ return 0;
+
+ // If only this was used more..
+ if (e_target.flags & FL_NOTARGET)
+ return 0;
+
+ // Cant touch this
+ if ((e_target.takedamage == DAMAGE_NO) || (e_target.health < 0))
+ return 0;
+
+ // player
+ if (e_target.flags & FL_CLIENT)
+ {
+ if (self.owner.target_select_playerbias < 0)
+ return 0;
+
+ if (e_target.deadflag != DEAD_NO)
+ return 0;
+ }
+
+ // Missile
+ if ((e_target.flags & FL_PROJECTILE) && (self.owner.target_select_missilebias < 0))
+ return 0;
+
+ // Team check
+ if ((e_target.team == self.owner.team) || (self.owner.team == e_target.owner.team))
+ return 0;
+
+ return 1;
+}
+
+void turret_hk_missile_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+ if (attacker.team == self.team)
+ damage *= 0.5;
+
+ self.velocity += force;
+
+ self.health -= damage;
+
+ if (self.health <= 0)
+ turret_hk_missile_explode();
+}
+
+void turret_hk_attack()
+{
+ local entity missile;
+ //local entity flash2;
+
+ sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
+
+ missile = spawn ();
+ missile.solid = SOLID_BBOX;
+ setmodel (missile, "models/turrets/hunter2.md3"); // precision set below
+ setsize (missile, missile.mins,missile.maxs); // give it some size so it can be shot
+ sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+ setorigin(missile, self.tur_shotorg_updated);
+
+ missile.scale = 1;
+ missile.classname = "hk_missile";
+ missile.owner = self;
+ missile.bot_dodge = TRUE;
+ missile.bot_dodgerating = self.shot_dmg;
+ missile.takedamage = DAMAGE_YES;
+ missile.damageforcescale = 4;
+ missile.health = 10;
+ missile.think = turret_hk_missile_think;
+ missile.event_damage = turret_hk_missile_damage;
+ missile.nextthink = time + 0.25;
+ missile.movetype = MOVETYPE_BOUNCEMISSILE;
+ missile.effects = EF_LOWPRECISION;
+ missile.velocity = self.tur_shotdir_updated * (self.shot_speed * 0.75);
+ missile.angles = vectoangles(missile.velocity);
+ missile.touch = turret_hk_missile_explode; //turret_hk_missile_touch;
+ missile.flags = FL_PROJECTILE;
+ missile.enemy = self.enemy;
+ missile.team = self.team;
+ missile.cnt = time + 30;
+ missile.ticrate = max(cvar("sys_ticrate"),0.05);
+
+ te_explosion (missile.origin);
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+}
+
+/*
+void turret_hk_missile_touch()
+{
+ if(other == self.enemy)
+ turret_hk_missile_explode();
+ else
+ {
+ if(self.cnt < time)
+ {
+ self.cnt = time + 0.25;
+ self.health = self.health - 5;
+ if(self.health <= 0)
+ turret_hk_missile_explode();
+
+ }
+ }
+}
+*/
+
+void turret_hk_missile_think()
+{
+ vector vu, vd, vf, vl, vr, ve; // Vector (direction)
+ float fu, fd, ff, fl, fr, fe; // Fraction to solid
+ vector olddir,wishdir,newdir; // Final direction
+ float lt_for; // Length of Trace FORwrad
+ float lt_seek; // Length of Trace SEEK (left, right, up down)
+ float pt_seek; // Pitch of Trace SEEK (How mutch to angele left, right up, down trace towards v_forward)
+ vector pre_pos;
+ float myspeed;
+ entity e;
+ float ad,edist;
+
+ self.nextthink = time + self.ticrate;
+
+ //if (self.cnt < time)
+ // turret_hk_missile_explode();
+
+ if (self.enemy.deadflag != DEAD_NO)
+ self.enemy = world;
+
+ // Pick the closest valid target.
+ if (!self.enemy)
+ {
+ e = findradius(self.origin, 5000);
+ while (e)
+ {
+ if (hk_is_valid_target(e))
+ {
+ if (!self.enemy)
+ self.enemy = e;
+ else
+ if (vlen(self.origin - e.origin) < vlen(self.origin - self.enemy.origin))
+ self.enemy = e;
+ }
+ e = e.chain;
+ }
+ }
+
+ self.angles = vectoangles(self.velocity);
+ self.angles_x = self.angles_x * -1;
+ makevectors(self.angles);
+ self.angles_x = self.angles_x * -1;
+
+ if (self.enemy)
+ {
+ edist = vlen(self.origin - self.enemy.origin);
+ // Close enougth to do decent damage?
+ if ( edist <= (self.owner.shot_radius * 0.25) )
+ {
+ turret_hk_missile_explode();
+ return;
+ }
+
+ // Get data on enemy position
+ pre_pos = self.enemy.origin +
+ self.enemy.velocity *
+ min((vlen(self.enemy.origin - self.origin) / vlen(self.velocity)),0.5);
+
+ traceline(self.origin, pre_pos,TRUE,self.enemy);
+ ve = normalize(pre_pos - self.origin);
+ fe = trace_fraction;
+
+ }
+ else
+ {
+ fe = 0;
+ }
+
+ if ((fe != 1) || (self.enemy == world) || (edist > 1000))
+ {
+ myspeed = vlen(self.velocity);
+
+ lt_for = myspeed * 3;
+ lt_seek = myspeed * 2.95;
+
+ // Trace forward
+ traceline(self.origin, self.origin + v_forward * lt_for,FALSE,self);
+ vf = trace_endpos;
+ ff = trace_fraction;
+
+ // Find angular offset
+ ad = vlen(vectoangles(normalize(self.enemy.origin - self.origin)) - self.angles);
+
+ // To close to something, Slow down!
+ if ( ((ff < 0.7) || (ad > 4)) && (myspeed > hk_minspeed) )
+ myspeed = max(myspeed * hk_decel,hk_minspeed);
+
+ // Failry clear, accelerate.
+ if ( (ff > 0.7) && (myspeed < hk_maxspeed) )
+ myspeed = min(myspeed * hk_accel,hk_maxspeed);
+
+ // Setup trace pitch
+ pt_seek = 1 - ff;
+ pt_seek = bound(0.15,pt_seek,0.8);
+ if (ff < 0.5) pt_seek = 1;
+
+ // Trace left
+ traceline(self.origin, self.origin + (-1 * (v_right * pt_seek) + (v_forward * ff)) * lt_seek,FALSE,self);
+ vl = trace_endpos;
+ fl = trace_fraction;
+
+ // Trace right
+ traceline(self.origin, self.origin + ((v_right * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
+ vr = trace_endpos;
+ fr = trace_fraction;
+
+ // Trace up
+ traceline(self.origin, self.origin + ((v_up * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
+ vu = trace_endpos;
+ fu = trace_fraction;
+
+ // Trace down
+ traceline(self.origin, self.origin + (-1 * (v_up * pt_seek) + (v_forward * ff)) * lt_seek ,FALSE,self);
+ vd = trace_endpos;
+ fd = trace_fraction;
+
+ vl = normalize(vl - self.origin);
+ vr = normalize(vr - self.origin);
+ vu = normalize(vu - self.origin);
+ vd = normalize(vd - self.origin);
+
+ // Panic tresh passed, find a single direction and turn as hard as we can
+ if (pt_seek == 1)
+ {
+ wishdir = v_right;
+ if (fl > fr) wishdir = -1 * v_right;
+ if (fu > fl) wishdir = v_up;
+ if (fd > fu) wishdir = -1 * v_up;
+ }
+ else
+ {
+ // Normalize our trace vectors to make a smooth path
+ wishdir = normalize( (vl * fl) + (vr * fr) + (vu * fu) + (vd * fd) );
+ }
+
+ if (self.enemy)
+ {
+ if (fe < 0.1) fe = 0.1; // Make sure we always try to move sligtly towards our target
+ wishdir = (wishdir * (1 - fe)) + (ve * fe);
+ }
+ }
+ else
+ {
+ // Got a clear path to target, speed up fast (if not at full speed) and go straight for it.
+ myspeed = vlen(self.velocity);
+ if (myspeed < hk_maxspeed)
+ myspeed = min(myspeed * hk_accel2,hk_maxspeed);
+
+ wishdir = ve;
+ //wishdir = normalize(self.enemy.origin - (self.enemy.origin + self.enemy.velocity));
+ }
+
+ if ((myspeed > hk_minspeed) && (self.cnt > time))
+ myspeed = min(myspeed * hk_accel2,hk_maxspeed);
+
+ // Ranoutagazfish?
+ if (self.cnt < time)
+ {
+ self.cnt = time + 0.25;
+ self.nextthink = 0;
+ self.movetype = MOVETYPE_BOUNCE;
+ sound (self, CHAN_VOICE, "", 0.4, ATTN_NORM);
+ return;
+ }
+
+ // Calculate new heading
+ olddir = normalize(self.velocity);
+
+ newdir = normalize(olddir + wishdir * cvar("g_turrets_unit_hk_std_shot_speed_turnrate"));
+
+ //fu = (1 / hk_maxspeed) * myspeed;
+ //fd = fu - (0.75 - 0.25);
+ //newdir = normalize(olddir + wishdir * fd);
+
+ // Set heading & speed
+ self.velocity = newdir * myspeed;
+
+ // Align model with new heading
+ self.angles = vectoangles(self.velocity);
+
+
+#ifdef TURRET_DEBUG_HK
+ //if(self.atime < time) {
+ if ((fe <= 0.99)||(edist > 1000))
+ {
+ te_lightning2(world,self.origin, self.origin + vr * lt_seek);
+ te_lightning2(world,self.origin, self.origin + vl * lt_seek);
+ te_lightning2(world,self.origin, self.origin + vu * lt_seek);
+ te_lightning2(world,self.origin, self.origin + vd * lt_seek);
+ te_lightning2(world,self.origin, vf);
+ }
+ else
+ {
+ te_lightning2(world,self.origin, self.enemy.origin);
+ }
+ bprint("Speed: ", ftos(rint(myspeed)), "\n");
+ bprint("Trace to solid: ", ftos(rint(ff * 100)), "%\n");
+ bprint("Trace to target:", ftos(rint(fe * 100)), "%\n");
+ self.atime = time + 0.2;
+ //}
+#endif
+}
+
+void turret_hk_missile_explode()
+{
+ vector org2;
+ float d;
+
+ if ((other == self.owner)||(other == self.owner.tur_head))
+ return;
+
+ //vector org2;
+ sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+ org2 = findbetterlocation (self.origin, 16);
+
+ // LordHavoc: TE_TEI_BIGEXPLOSION
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 78);
+ WriteCoord (MSG_BROADCAST, org2_x);
+ WriteCoord (MSG_BROADCAST, org2_y);
+ WriteCoord (MSG_BROADCAST, org2_z);
+
+ self.event_damage = SUB_Null;
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+
+#ifdef TURRET_DEBUG
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
+ self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#endif
+
+ // Target dead, get another is still targeting the same.
+ if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
+ self.owner.enemy = world;
+
+ remove (self);
+}
+
+void turret_hk_postthink()
+{
+ if (cvar("g_turrets_reloadcvars"))
+ {
+ hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
+ hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
+ hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
+ hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
+ hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
+ }
+
+ if (self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame > 5)
+ self.tur_head.frame = 0;
+
+}
+
+void turret_hk_dinit()
+{
+ if (self.netname == "") self.netname = "Hunter-killer turret";
+
+ hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
+ hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
+ hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
+ hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
+ hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
+
+ self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_RECIVETARGETS;
+
+ self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
+
+ self.aim_flags = TFL_AIM_SIMPLE;
+
+ self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+
+ self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF;
+
+ self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TRIGGERTARGET | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+
+ self.shoot_flags = TFL_SHOOT_CLEARTARGET;
+
+ if (turret_stdproc_init("hk_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TEAMCHECK;
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/hk.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_hk_attack;
+
+ // re-color badge & handle recoil effect
+ self.turret_postthink = turret_hk_postthink;
+
+ // What to do when reciveing foreign target data
+ self.turret_addtarget = turret_hk_addtarget;
+}
+
+/*
+* Turret that fires Hunter-killer missiles.
+* Missiles seek their target and try to avoid obstacles. If target dies early, they
+* pick a new one on their own.
+*/
+
+/*QUAKED turret_hk (0 .5 .8) ?
+hunter-killer missiles.
+*/
+
+void spawnfunc_turret_hk()
+{
+ //precache_model ( "models/turrets/hunter2.md3");
+ //precache_model ("models/turrets/base.md3");
+ //precache_model ("models/turrets/hk.md3");
+
+ self.think = turret_hk_dinit;
+ self.nextthink = time + 0.5;
+}
+
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_machinegun.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,71 @@
+void spawnfunc_turret_machinegun();
+void turret_machinegun_std_init();
+void turret_machinegun_attack();
+
+//.float bulletcounter;
+void turret_machinegun_attack()
+{
+
+ entity flash;
+ sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
+ fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
+
+ te_smallflash(self.tur_shotorg_updated);
+ trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
+
+ // muzzle flash for 3rd person view
+ flash = spawn();
+ //setorigin(flash, '43 1 8');
+ setmodel(flash, "models/uziflash.md3"); // precision set below
+ setattachment(flash, self.tur_head, "tag_fire");
+ flash.think = W_Uzi_Flash_Go;
+ flash.nextthink = time + 0.02;
+ flash.frame = 2;
+ flash.angles_z = flash.v_angle_z + random() * 180;
+ flash.alpha = 1;
+ flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+}
+
+
+void turret_machinegun_std_init()
+{
+ if (self.netname == "") self.netname = "Machinegun Turret";
+
+ self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+ self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+
+ if (turret_stdproc_init("machinegun_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/machinegun.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_machinegun_attack;
+
+}
+
+
+
+/*
+* machinegun turret. does what you'd expect
+*/
+
+/*QUAKED turret_machinegun (0 .5 .8) ?
+*/
+void spawnfunc_turret_machinegun()
+{
+ //precache_model ("models/turrets/machinegun.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_machinegun_std_init;
+ self.nextthink = time + 0.5;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_mlrs.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,121 @@
+void spawnfunc_turret_mlrs();
+void turret_mlrs_dinit();
+void turret_mlrs_attack();
+void turret_mlrs_projectile_explode();
+
+void turret_mlrs_postthink()
+{
+
+ // 0 = full, 6 = empty
+
+ self.tur_head.frame = rint(6 - (self.ammo / self.shot_dmg));
+
+ //if ((self.tur_head.frame >= 6) && (self.attack_finished_single <= time))
+ // self.tur_head.frame = 0;
+}
+
+void turret_mlrs_attack()
+{
+ entity missile;
+
+ turret_tag_fire_update();
+
+ sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);
+
+ missile = spawn ();
+ setmodel (missile, "models/turrets/rocket.md3"); // precision set below
+ setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+ sound (missile, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+ setorigin(missile, self.tur_shotorg_updated);
+ missile.classname = "mlrs_missile";
+ missile.owner = self;
+ missile.bot_dodge = TRUE;
+ missile.bot_dodgerating = self.shot_dmg;
+ missile.takedamage = DAMAGE_YES;
+ missile.damageforcescale = 4;
+ missile.health = 30;
+ missile.think = turret_mlrs_projectile_explode;
+ missile.nextthink = time + max(self.tur_impacttime,(self.shot_radius * 2) / self.shot_speed);
+ missile.solid = SOLID_BBOX;
+ missile.movetype = MOVETYPE_FLYMISSILE;
+ missile.effects = EF_LOWPRECISION;
+ missile.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+ missile.angles = vectoangles(missile.velocity);
+ missile.touch = turret_mlrs_projectile_explode;
+ missile.flags = FL_PROJECTILE;
+ missile.solid = SOLID_BBOX;
+ missile.enemy = self.enemy;
+
+ te_explosion (missile.origin);
+
+ //self.tur_head.frame = 7 - self.volly_counter;
+}
+
+void turret_mlrs_projectile_explode()
+{
+ vector org2;
+
+ //vector org2;
+ sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+ org2 = findbetterlocation (self.origin, 16);
+ pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
+
+ self.event_damage = SUB_Null;
+
+#ifdef TURRET_DEBUG
+ float d;
+
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
+ self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#else
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+#endif
+
+ // Target dead, get another is still targeting the same.
+ if ((self.enemy.deadflag != DEAD_NO) && (self.enemy == self.owner.enemy))
+ self.owner.enemy = world;
+
+ remove (self);
+}
+
+void turret_mlrs_dinit()
+{
+ if (self.netname == "") self.netname = "MLRS turret";
+
+ self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
+ self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;
+
+ if (turret_stdproc_init("mlrs_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/mlrs.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_mlrs_attack;
+ self.turret_postthink = turret_mlrs_postthink;
+
+}
+
+/*QUAKED turret_mlrs (0 .5 .8) ?
+*/
+
+void spawnfunc_turret_mlrs()
+{
+ //precache_model ( "models/turrets/rocket.md3");
+ //precache_model ("models/turrets/mlrs.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_mlrs_dinit;
+ self.nextthink = time + 0.5;
+}
+
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_phaser.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,148 @@
+void spawnfunc_turret_phaser();
+void turret_phaser_dinit();
+void turret_phaser_attack();
+
+.float fireflag;
+
+float turret_phaser_firecheck()
+{
+ if (self.fireflag != 0) return 0;
+ return turret_stdproc_firecheck();
+}
+
+void turret_phaser_postthink()
+{
+ if (self.tur_head.frame == 0)
+ return;
+
+ if (self.fireflag == 1)
+ {
+ if (self.tur_head.frame == 10)
+ self.tur_head.frame = 1;
+ else
+ self.tur_head.frame = self.tur_head.frame +1;
+ }
+ else if (self.fireflag == 2 )
+ {
+ self.tur_head.frame = self.tur_head.frame +1;
+ if (self.tur_head.frame == 15)
+ {
+ self.tur_head.frame = 0;
+ self.fireflag = 0;
+ }
+ }
+}
+
+void beam_think()
+{
+ if ((time > self.cnt)||(self.owner.deadflag != DEAD_NO))
+ {
+ self.owner.attack_finished_single = time + self.owner.shot_refire;
+ self.owner.fireflag = 2;
+ self.owner.tur_head.frame = 10;
+ sound (self, CHAN_PROJECTILE, "", 1, ATTN_NORM);
+ remove(self);
+ return;
+ }
+
+ turret_do_updates(self.owner);
+
+ if (time - self.shot_spread > 0)
+ {
+ self.shot_spread = time + 2;
+ sound (self, CHAN_VOICE, "turrets/phaser.ogg", 1, ATTN_NORM);
+ }
+
+
+ self.nextthink = time + self.ticrate;
+
+ self.owner.attack_finished_single = time + frametime;
+ entity oldself;
+ oldself = self;
+ self = self.owner;
+ FireImoBeam ( self.tur_shotorg_updated,
+ self.tur_shotorg_updated + self.tur_shotdir_updated * self.target_range_fire,
+ '-1 -1 -1' * self.shot_radius,
+ '1 1 1' * self.shot_radius,
+ self.shot_force,
+ oldself.shot_dmg,
+ 0.75,
+ DEATH_TURRET);
+ self = oldself;
+ self.scale = vlen(self.owner.tur_shotorg_updated - trace_endpos) / 256;
+
+}
+
+void turret_phaser_attack()
+{
+ entity beam;
+
+ beam = spawn();
+ beam.ticrate = 0.1; //cvar("sys_ticrate");
+ setmodel(beam,"models/turrets/phaser_beam.md3");
+ beam.effects = EF_LOWPRECISION;
+ beam.solid = SOLID_NOT;
+ beam.think = beam_think;
+ beam.cnt = time + self.shot_speed;
+ beam.shot_spread = time + 2;
+ beam.nextthink = time;
+ beam.owner = self;
+ beam.shot_dmg = self.shot_dmg / (self.shot_speed / beam.ticrate);
+ beam.scale = self.target_range_fire / 256;
+ beam.movetype = MOVETYPE_NONE;
+ beam.enemy = self.enemy;
+ beam.bot_dodge = TRUE;
+ beam.bot_dodgerating = beam.shot_dmg;
+ sound (beam, CHAN_PROJECTILE, "turrets/phaser.ogg", 1, ATTN_NORM);
+ self.fireflag = 1;
+
+ beam.attack_finished_single = self.attack_finished_single;
+ self.attack_finished_single = time; // + cvar("sys_ticrate");
+
+ setattachment(beam,self.tur_head,"tag_fire");
+
+ soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = 1;
+}
+
+void turret_phaser_dinit()
+{
+ if (self.netname == "") self.netname = "Phaser Cannon";
+
+ self.turrcaps_flags = TFL_TURRCAPS_SNIPER|TFL_TURRCAPS_HITSCAN|TFL_TURRCAPS_PLAYERKILL;
+ self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+ self.aim_flags = TFL_AIM_ZEASE | TFL_AIM_LEAD;
+
+ if (turret_stdproc_init("phaser_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/phaser.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ self.turret_firecheckfunc = turret_phaser_firecheck;
+ self.turret_firefunc = turret_phaser_attack;
+ self.turret_postthink = turret_phaser_postthink;
+
+}
+
+/*QUAKED turret_phaser(0 .5 .8) ?
+*/
+void spawnfunc_turret_phaser()
+{
+ //precache_sound ("turrets/phaser.ogg");
+ //precache_model ("models/turrets/phaser.md3");
+ //precache_model ("models/turrets/phaser_beam.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_phaser_dinit;
+ self.nextthink = time + 0.5;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_plasma.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,218 @@
+void spawnfunc_turret_plasma();
+void spawnfunc_turret_plasma_dual();
+
+void turret_plasma_std_init();
+void turret_plasma_dual_init();
+
+void turret_plasma_attack();
+void turret_plasma_projectile_explode();
+
+void turret_plasma_postthink()
+{
+ if (self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame >= 5)
+ self.tur_head.frame = 0;
+
+}
+
+void turret_plasma_dualpostthink()
+{
+ if (self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame >= 6)
+ self.tur_head.frame = 0;
+}
+
+void turret_plasma_attack()
+{
+ entity proj;
+
+ turret_tag_fire_update();
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+ proj = spawn ();
+ setorigin(proj, self.tur_shotorg_updated);
+ setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
+ setmodel(proj, "models/elaser.mdl"); // precision set above
+ proj.classname = "plasmabomb";
+ proj.owner = self;
+ proj.bot_dodge = FALSE;
+ //proj.bot_dodgerating = self.shot_dmg;
+ proj.think = turret_plasma_projectile_explode;
+ proj.nextthink = time + 9;
+ proj.solid = SOLID_BBOX;
+ proj.movetype = MOVETYPE_FLYMISSILE;
+ proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+ proj.angles = vectoangles(proj.velocity);
+ proj.touch = turret_plasma_projectile_explode;
+ proj.flags = FL_PROJECTILE;
+ proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
+ proj.enemy = self.enemy;
+ proj.flags = FL_PROJECTILE | FL_NOTARGET;
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = 1;
+
+ // Snapback the head
+ // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
+
+}
+
+void turret_plasma_dual_attack()
+{
+ entity proj;
+
+ if (self.tur_head.frame > 2)
+ self.tur_head.frame = 1;
+
+ turret_tag_fire_update();
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+ proj = spawn ();
+ setorigin(proj, self.tur_shotorg_updated);
+ setsize(proj, '0 0 0', '0 0 0');
+ setmodel(proj, "models/elaser.mdl"); // precision set above
+ proj.classname = "plasmabomb";
+ proj.owner = self;
+ proj.bot_dodge = TRUE;
+ proj.bot_dodgerating = self.shot_dmg;
+ proj.think = turret_plasma_projectile_explode;
+ proj.nextthink = time + 9;
+ proj.solid = SOLID_BBOX;
+ proj.movetype = MOVETYPE_FLYMISSILE;
+ proj.velocity = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+ proj.angles = vectoangles(proj.velocity);
+ proj.touch = turret_plasma_projectile_explode;
+ proj.flags = FL_PROJECTILE;
+ proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
+ proj.enemy = self.enemy;
+ proj.flags = FL_PROJECTILE | FL_NOTARGET;
+
+ if (self.tur_head.frame == 0)
+ self.tur_head.frame = 1;
+
+ // Snapback the head
+ // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);
+
+}
+
+void turret_plasma_projectile_explode()
+{
+ vector org2;
+
+ org2 = findbetterlocation (self.origin, 8);
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 79);
+ WriteCoord (MSG_BROADCAST, org2_x);
+ WriteCoord (MSG_BROADCAST, org2_y);
+ WriteCoord (MSG_BROADCAST, org2_z);
+ WriteCoord (MSG_BROADCAST, 0); // SeienAbunae: groan... Useless clutter
+ WriteCoord (MSG_BROADCAST, 0);
+ WriteCoord (MSG_BROADCAST, 0);
+ WriteByte (MSG_BROADCAST, 155);
+
+ self.event_damage = SUB_Null;
+
+
+#ifdef TURRET_DEBUG
+ float d;
+
+ d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+ self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
+ self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
+#else
+ RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+#endif
+ sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", 1, ATTN_NORM);
+
+ remove (self);
+}
+
+void turret_plasma_std_init()
+{
+ if (self.netname == "") self.netname = "Plasma Cannon";
+
+ self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
+
+ if (turret_stdproc_init("plasma_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/plasma.md3");
+
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // Our fire routine
+ self.turret_firefunc = turret_plasma_dual_attack;
+
+ // re-color badge & handle recoil effect
+ self.turret_postthink = turret_plasma_dualpostthink;
+}
+
+
+void turret_plasma_dual_init()
+{
+ if (self.netname == "") self.netname = "Dual Plasma Cannon";
+
+ self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+
+ if (turret_stdproc_init("plasma_dual") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/base.md3");
+ setmodel(self.tur_head,"models/turrets/plasmad.md3");
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ // select aim
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;
+
+ // Our fire routine
+ self.turret_firefunc = turret_plasma_attack;
+
+ // re-color badge & handle recoil effect
+ self.turret_postthink = turret_plasma_postthink;
+}
+
+
+/*
+* Basic moderate (std) or fast (dual) fireing, short-mid range energy cannon.
+* Not too mutch of a therat on its own, but can be rather dangerous in groups.
+* Regenerates ammo slowly, support with a fusionreactor(s) to do some real damage.
+*/
+
+/*QUAKED turret_plasma (0 .5 .8) ?
+*/
+void spawnfunc_turret_plasma()
+{
+ //precache_model ("models/turrets/plasma.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_plasma_std_init;
+ self.nextthink = time + 0.5;
+}
+
+/*QUAKED turret_plasma_dual (0 .5 .8) ?
+*/
+void spawnfunc_turret_plasma_dual()
+{
+ //precache_model ("models/turrets/plasmad.md3");
+ //precache_model ("models/turrets/base.md3");
+
+ self.think = turret_plasma_dual_init;
+ self.nextthink = time + 0.5;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_targettrigger.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_targettrigger.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_targettrigger.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_targettrigger.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,41 @@
+void spawnfunc_turret_targettrigger();
+void turret_targettrigger_touch();
+
+void turret_targettrigger_touch()
+{
+ entity e;
+ if (self.cnt > time) return;
+ entity oldself;
+ oldself = self;
+
+ e = find(world, targetname, self.target);
+ while (e)
+ {
+ if (e.turrcaps_flags & TFL_TURRCAPS_RECIVETARGETS)
+ {
+ self = e;
+ e.turret_addtarget(other,oldself);
+ }
+
+ e = find(e, targetname, oldself.target);
+ }
+
+ oldself.cnt = time + 0.5;
+
+ self = oldself;
+}
+
+/*QUAKED turret_targettrigger (.5 .5 .5) ?
+*/
+void spawnfunc_turret_targettrigger()
+{
+ if (!cvar("g_turrets"))
+ {
+ remove(self);
+ return;
+ }
+
+ InitTrigger ();
+
+ self.touch = turret_targettrigger_touch;
+}
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_tessla.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,147 @@
+void spawnfunc_turret_tesla();
+void turret_tesla_dinit();
+void turret_tesla_fire();
+
+.float toasted;
+entity toast(entity from, float range, float damage)
+{
+ entity e;
+ entity etarget;
+ float d,dd;
+
+ dd = range + 1;
+
+ e = findradius(from.origin,range);
+ while (e)
+ {
+ if ((e.toasted != 1) && (e != from))
+ if (turret_validate_target(self,e,self.target_validate_flags) > 0)
+ {
+
+ traceline(from.origin,e.origin,0,from);
+ if (trace_fraction > 0.9)
+ {
+ d = vlen(e.origin - from.origin);
+ if (d < dd)
+ {
+ dd = d;
+ etarget = e;
+ }
+ }
+ }
+ e = e.chain;
+ }
+
+ if (etarget)
+ {
+ te_smallflash(etarget.origin);
+ te_lightning1(world,from.origin,etarget.origin);
+ Damage(etarget,self,self,damage,DEATH_TURRET,etarget.origin,'0 0 0');
+ etarget.toasted = 1;
+ }
+
+ return etarget;
+}
+
+void turret_tesla_fire()
+{
+ entity e,t;
+ float d,r,i;
+
+ if (cvar("g_turrets_nofire") != 0)
+ return;
+
+ if (self.attack_finished_single > time) return;
+
+ d = self.shot_dmg;
+ r = self.target_range;
+ e = spawn();
+ setorigin(e,self.origin + self.tur_shotorg);
+
+
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
+ TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+
+ t = toast(e,r,d);
+ remove(e);
+
+ if (t == world) return;
+
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
+ TFL_TARGETSELECT_TEAMCHECK;
+
+ self.attack_finished_single = time + self.shot_refire;
+ self.ammo = self.ammo - self.shot_dmg;
+ for (i = 0;i < 10;i = i + 1)
+ {
+ d *= 0.5;
+ r *= 0.75;
+ t = toast(t,r,d);
+ if (t == world) break;
+ }
+
+ e = findchainfloat(toasted, 1);
+ while (e)
+ {
+ e.toasted = 0;
+ e = e.chain;
+ }
+}
+
+void turret_tesla_postthink()
+{
+ turret_tesla_fire();
+
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ if (self.tur_head.frame >= 11)
+ self.tur_head.frame = 0;
+
+ if (self.tur_head.avelocity == '0 0 0')
+ self.tur_head.avelocity = '0 35 0';
+}
+
+
+void turret_tesla_dinit()
+{
+ if (self.netname == "") self.netname = "Tesla Coil";
+
+ self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
+ self.target_select_flags = TFL_TARGETSELECT_NO;
+ self.firecheck_flags = TFL_FIRECHECK_REFIRE;
+ self.shoot_flags = TFL_SHOOT_CUSTOM;
+ self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+ self.aim_flags = TFL_AIM_NO;
+ self.track_flags = TFL_TRACK_NO;
+
+ if (turret_stdproc_init("tesla_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+
+ setmodel(self,"models/turrets/tesla_base.md3");
+ setmodel(self.tur_head,"models/turrets/tesla_head.md3");
+
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
+ TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+
+ if (!turret_tag_setup(0))
+ dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+ self.turret_firefunc = turret_stdproc_nothing;
+ self.turret_postthink = turret_tesla_postthink;
+}
+
+/*QUAKED turret_tesla (0 .5 .8) ?
+*/
+void spawnfunc_turret_tesla()
+{
+ //precache_model ("models/turrets/tesla_head.md3");
+ //precache_model ("models/turrets/tesla_base.md3");
+
+
+ self.think = turret_tesla_dinit;
+ self.nextthink = time + 0.5;
+}
+
Copied: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc (from rev 4862, trunk/data/qcsrc/server/tturrets/units/unit_walker.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,798 @@
+#define ANIM_NO 0
+#define ANIM_WALK 1
+#define ANIM_RUN 1.1
+#define ANIM_STRAFE_L 2
+#define ANIM_STRAFE_R 3
+#define ANIM_TURN 2
+#define ANIM_JUMP 4
+#define ANIM_LAND 5
+#define ANIM_PAIN 6
+#define ANIM_MEELE 7
+.float animflag;
+
+.entity wkr_props;
+.entity wkr_spawn;
+
+#define WALKER_MIN '-70 -70 5'
+#define WALKER_MAX '70 70 70'
+
+/*
+.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;
+*/
+
+float walker_firecheck()
+{
+ if (!turret_stdproc_firecheck()) return 0;
+ //if(self.tur_cannon.frame != 0) return 0;
+
+ //if(self.walking == 1) self.walking = 2;
+ //if(self.walking != 0)
+ // return 0;
+
+ return 1;
+}
+
+void walker_meele_dmg()
+{
+ vector where;
+ entity e;
+
+ makevectors(self.angles);
+ where = self.origin + v_forward * 128;
+
+ e = findradius(where,80);
+ while(e)
+ {
+ if(turret_validate_target(self,e,self.target_validate_flags))
+ if(e != self)
+ Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg "),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );
+
+ e = e.chain;
+ }
+}
+
+void walker_animate()
+{
+
+ if(self.tur_head.frame != 0)
+ self.tur_head.frame = self.tur_head.frame +1;
+
+ if(self.tur_head.frame > 12)
+ self.tur_head.frame = 0;
+
+
+ switch(self.animflag)
+ {
+ case ANIM_NO:
+ //if(self.frame != 0)
+ // self.frame = 0;
+ break;
+
+ case ANIM_WALK:
+ self.frame = self.frame + 1;
+ if(self.frame > 25)
+ self.frame = 5;
+ break;
+
+ case ANIM_RUN:
+ self.frame = self.frame + 2;
+ if(self.frame > 25)
+ self.frame = 5;
+ break;
+
+ case ANIM_STRAFE_L:
+ if(self.frame < 35) self.frame = 35;
+ self.frame = self.frame + 1;
+ if(self.frame > 55) self.frame = 35;
+ break;
+
+ case ANIM_STRAFE_R:
+ if(self.frame < 65) self.frame = 65;
+ self.frame = self.frame + 1;
+ if(self.frame > 85) self.frame = 65;
+ break;
+
+ case ANIM_JUMP:
+ if(self.frame < 95) self.frame = 95;
+ if(self.frame > 100)
+ self.frame = self.frame + 1;
+
+ break;
+
+ case ANIM_LAND:
+ if(self.frame < 100) self.frame = 100;
+ self.frame = self.frame + 1;
+ if(self.frame > 107)
+ self.animflag = ANIM_NO;
+ break;
+
+ case ANIM_PAIN:
+ if(self.frame < 90) self.frame = 90;
+ self.frame = self.frame + 1;
+ if(self.frame > 95)
+ self.animflag = ANIM_NO;
+ break;
+
+ case ANIM_MEELE:
+ if(self.frame < 123) self.frame = 123;
+ self.frame = self.frame + 1;
+
+ if(self.frame == 133)
+ walker_meele_dmg();
+
+ if(self.frame > 140)
+ self.animflag = ANIM_NO;
+
+ }
+}
+
+
+
+
+
+void walker_rocket_explode()
+{
+ vector org2;
+
+ sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+ org2 = findbetterlocation (self.origin, 16);
+
+ WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte (MSG_BROADCAST, 78);
+ WriteCoord (MSG_BROADCAST, org2_x);
+ WriteCoord (MSG_BROADCAST, org2_y);
+ WriteCoord (MSG_BROADCAST, org2_z);
+
+ self.event_damage = SUB_Null;
+
+ RadiusDamage (self, self.owner, cvar("g_turrets_unit_walker_std_rocket_dmg"), 0, cvar("g_turrets_unit_walker_std_rocket_radius"), world, cvar("g_turrets_unit_walker_std_rocket_force"), DEATH_TURRET, world);
+
+ remove (self);
+}
+
+void walker_rocket_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+{
+ self.health = self.health - damage;
+ self.velocity = self.velocity + vforce;
+ if (self.health <= 0) walker_rocket_explode();
+}
+
+
+/*
+g_turrets_unit_walker_std_rocket_refire
+g_turrets_unit_walker_std_rocket_dmg
+g_turrets_unit_walker_std_rocket_radius
+g_turrets_unit_walker_std_rocket_force
+g_turrets_unit_walker_std_rocket_tunrate
+g_turrets_unit_walker_std_rocket_speed
+g_turrets_unit_walker_std_rocket_speed_add
+*/
+
+void walker_rocket_loop();
+void walker_rocket_think()
+{
+ vector olddir,newdir;
+ float edist;
+ float itime;
+ float m_speed;
+
+ self.nextthink = time + 0.1;
+
+ olddir = normalize(self.velocity);
+ edist = vlen(self.enemy.origin - self.origin);
+
+ // Simulate crudely guidance
+ if(self.cnt < time)
+ {
+ if(edist < 1000)
+ self.tur_shotorg = randomvec() * min(edist,64);
+ else
+ self.tur_shotorg = randomvec() * min(edist,256);
+ self.cnt = time + 0.5;
+ }
+ if(edist < 256)
+ self.tur_shotorg = '0 0 0';
+
+
+ if (self.tur_health < time)
+ {
+ self.think = walker_rocket_explode;
+ self.nextthink = time;
+ return;
+ }
+
+ if((random() < 0.01) && (self.shot_dmg != 1337))
+ {
+ walker_rocket_loop();
+ return;
+ }
+
+ olddir = normalize(self.velocity);
+
+ // Accelerate
+ m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
+
+ // Enemy dead? just keep on the current heading then.
+ if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
+ {
+
+ // Make sure we dont return to tracking a respawned player
+ self.enemy = world;
+
+ // Turn model
+ self.angles = vectoangles(self.velocity);
+ }
+
+ if (self.enemy)
+ {
+ // Predict enemy position
+ itime = max(edist / m_speed,1);
+ newdir = normalize((self.enemy.origin + self.tur_shotorg) - self.origin);
+ }
+ else
+ {
+ //pre_pos = self.origin + olddir;
+ newdir = olddir;
+ }
+
+ // Turn
+ newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
+
+ self.velocity = newdir * m_speed;
+
+ // Turn model
+ self.angles = vectoangles(self.velocity);
+
+ if (time+itime < time+0.1)
+ {
+ self.think = turret_hellion_missile_explode;
+ self.nextthink = time + itime;
+ }
+}
+
+void walker_rocket_loop3()
+{
+ self.nextthink = time + 0.1;
+ if(vlen(self.origin - self.tur_shotorg) < 128 )
+ {
+ self.think = walker_rocket_think;
+ return;
+ }
+
+ vector newdir;
+ vector olddir;
+ float m_speed;
+
+ m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
+
+ olddir = normalize(self.velocity);
+
+
+ newdir = normalize(self.tur_shotorg - self.origin);
+
+ newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
+
+
+ self.velocity = newdir * m_speed;
+ self.angles = vectoangles(self.velocity);
+}
+
+void walker_rocket_loop2()
+{
+ self.nextthink = time + 0;
+
+ if(vlen(self.origin - self.tur_shotorg) < 128 )
+ {
+ self.tur_shotorg = self.origin - '0 0 200';
+ self.think = walker_rocket_loop3;
+ return;
+ }
+
+ vector newdir;
+ vector olddir;
+ float m_speed;
+
+ m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
+
+ olddir = normalize(self.velocity);
+
+ newdir = normalize(self.tur_shotorg - self.origin);
+
+ newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
+
+ self.velocity = newdir * m_speed;
+
+ self.angles = vectoangles(self.velocity);
+
+}
+
+void walker_rocket_loop()
+{
+
+ self.nextthink= time + 0;
+
+ self.tur_shotorg = self.origin + '0 0 400';
+
+ self.think = walker_rocket_loop2;
+
+ self.shot_dmg = 1337;
+}
+
+
+
+void walker_fire_rocket(vector org)
+{
+
+ entity rocket;
+
+
+ //self.angles_x *= -1;
+ makevectors(self.angles);
+ //self.angles_x *= -1;
+
+ rocket = spawn ();
+ setorigin(rocket, org);
+
+ sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
+ sound (rocket, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
+ setmodel (rocket, "models/turrets/rocket.md3"); // precision set below
+ setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
+
+ rocket.classname = "walker_rocket";
+ rocket.owner = self;
+ rocket.bot_dodge = TRUE;
+ rocket.bot_dodgerating = 50;
+ rocket.takedamage = DAMAGE_YES;
+
+ rocket.damageforcescale = 2;
+ rocket.health = 10;
+ rocket.tur_shotorg = randomvec() * 512;
+ rocket.cnt = time + 1;
+ rocket.enemy = self.enemy;
+
+ if(random() < 0.01)
+ rocket.think = walker_rocket_loop;
+ else
+ rocket.think = walker_rocket_think;
+
+ rocket.nextthink = time + 0.2;
+ rocket.solid = SOLID_BBOX;
+ rocket.movetype = MOVETYPE_FLYMISSILE;
+ rocket.effects = EF_LOWPRECISION;
+ rocket.velocity = ((v_forward + v_up * 0.5) +(randomvec() * 0.15))* cvar("g_turrets_unit_walker_std_rocket_speed");
+ rocket.angles = vectoangles(rocket.velocity);
+ rocket.touch = walker_rocket_explode;
+ rocket.flags = FL_PROJECTILE;
+ rocket.solid = SOLID_BBOX;
+ rocket.tur_health = time + 9;
+
+ te_explosion (rocket.origin);
+
+}
+
+#define s_turn 10
+#define s_walk 100
+#define s_run 300
+#define s_accel1 8
+#define s_accel2 16
+#define s_decel 8
+
+void rv_think()
+{
+ float f;
+ vector org;
+
+ self.cnt = self.cnt -1;
+ if(self.cnt < 0)
+ {
+ remove(self);
+ return;
+ }
+
+ if(self.cnt> 1)
+ f = gettagindex(self.owner,"tag_rocket01");
+ else
+ f = gettagindex(self.owner,"tag_rocket02");
+
+ org = self.owner.origin + gettaginfo(self.owner,f);
+
+
+ self.nextthink = time + 0.2;
+
+ self = self.owner;
+ walker_fire_rocket(org);
+}
+
+void walker_postthink()
+{
+ vector wish_angle;
+ vector real_angle;
+ float turn_limit;
+
+
+
+ if(self.flags & FL_ONGROUND)
+ {
+ self.animflag = ANIM_NO;
+ }
+
+ if(self.enemy)
+ {
+ if(self.tur_head.attack_finished_single < time)
+ {
+ entity rv;
+ rv = spawn();
+ rv.think = rv_think;
+ rv.nextthink = time;
+ rv.cnt = 4;
+ rv.owner = self;
+
+ self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
+ }
+
+ }
+
+ if(self.goalcurrent)
+ {
+ //if(self.enemy && (self.tur_dist_enemy < self.target_range_fire))
+ // self.animflag = ANIM_TURN;
+ //else
+ //{
+ if(vlen(self.origin - self.goalcurrent.origin) < 64)
+ if(self.goalcurrent.goalcurrent == world)
+ self.goalcurrent = world; // Path endpoint reached, go roaming.
+ else
+ self.goalcurrent = self.goalcurrent.goalcurrent;
+
+ self.animflag = ANIM_WALK;
+ //}
+
+
+ }
+ else // Roaming mode
+ {
+
+ if(self.enemy)
+ {
+ wish_angle = angleofs(self,self.enemy); //normalize(self.origin-self.enemy.origin);
+
+ if(self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
+ {
+
+ if(fabs(wish_angle_y) < 15)
+ self.animflag = ANIM_MEELE;
+ }
+ else
+ {
+ if(fabs(wish_angle_y) < 15)
+ self.animflag = ANIM_RUN;
+ else if(fabs(wish_angle_y) < 30)
+ self.animflag = ANIM_WALK;
+ else
+ self.animflag = ANIM_TURN;
+ }
+
+ }
+ else
+ self.animflag = ANIM_NO;
+ }
+
+
+ float s_speed;
+
+ s_speed = vlen(self.velocity);
+
+ // Turn on the spot
+ if (self.animflag == ANIM_TURN) {
+ if(self.enemy)
+ wish_angle = normalize(self.enemy.origin - self.origin);
+ else
+ wish_angle = normalize(self.goalcurrent.origin - self.origin); wish_angle = vectoangles(wish_angle); // And make a angle
+
+ real_angle = wish_angle - self.angles;
+
+ if (real_angle_x < 0) real_angle_x += 360;
+ if (real_angle_x > 180) real_angle_x -= 360;
+
+ if (real_angle_y < 0) real_angle_y += 360;
+ if (real_angle_y > 180) real_angle_y -= 360;
+
+ turn_limit = cvar("g_turrets_unit_walker_turn_turnrate");
+ // Convert from dgr/sec to dgr/tic
+ turn_limit = turn_limit / (1 / self.ticrate);
+
+ //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
+ real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
+
+ self.angles_y = self.angles_y + real_angle_y;
+
+ if(self.enemy)
+ v_forward = normalize(self.enemy.origin - self.origin);
+ else
+ v_forward = normalize(self.goalcurrent.origin - self.origin);
+
+ makevectors(self.angles);
+
+ if(s_speed > s_turn)
+ self.velocity = (v_forward * max((s_speed - s_decel),s_turn));
+ if(s_speed < s_turn)
+ self.velocity = (v_forward * min((s_speed + s_accel1),s_turn));
+ }
+ else if (self.animflag == ANIM_WALK) // Gg walking
+ {
+ if(self.goalcurrent)
+ wish_angle = normalize(self.goalcurrent.origin - self.origin);
+ else
+ if(self.enemy)
+ wish_angle = normalize(self.enemy.origin - self.origin);
+ else
+ wish_angle = self.angles;
+
+
+ wish_angle = vectoangles(wish_angle); // And make a angle
+ real_angle = wish_angle - self.angles;
+
+ if (real_angle_x < 0) real_angle_x += 360;
+ if (real_angle_x > 180) real_angle_x -= 360;
+
+ if (real_angle_y < 0) real_angle_y += 360;
+ if (real_angle_y > 180) real_angle_y -= 360;
+
+ turn_limit = cvar("g_turrets_unit_walker_walk_turnrate");
+ // Convert from dgr/sec to dgr/tic
+ turn_limit = turn_limit / (1 / self.ticrate);
+
+ //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
+ real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
+
+ self.angles_y = self.angles_y + real_angle_y;
+
+ if(self.goalcurrent)
+ v_forward = normalize(self.goalcurrent.origin - self.origin);
+ else
+ if(self.enemy)
+ v_forward = normalize(self.enemy.origin - self.origin);
+
+ makevectors(self.angles);
+ //self.velocity = v_forward * s_walk;
+
+ //if(self.flags & FL_ONGROUND)
+ {
+ if(s_speed > s_walk)
+ self.velocity = (v_forward * max((s_speed - s_decel),s_walk));
+ if(s_speed <= s_walk)
+ self.velocity = (v_forward * min((s_speed + s_accel1),s_walk));
+ }
+
+
+ }
+ else if (self.animflag == ANIM_RUN) // Move fast, turn slow
+ {
+ if(self.goalcurrent)
+ wish_angle = normalize(self.goalcurrent.origin - self.origin);
+ else
+ if(self.enemy)
+ wish_angle = normalize(self.enemy.origin - self.origin);
+ else
+ wish_angle = self.angles;
+
+ wish_angle = vectoangles(wish_angle); // And make a angle
+ real_angle = wish_angle - self.angles;
+
+ if (real_angle_x < 0) real_angle_x += 360;
+ if (real_angle_x > 180) real_angle_x -= 360;
+
+ if (real_angle_y < 0) real_angle_y += 360;
+ if (real_angle_y > 180) real_angle_y -= 360;
+
+ turn_limit = cvar("g_turrets_unit_walker_run_turnrate");
+ // Convert from dgr/sec to dgr/tic
+ turn_limit = turn_limit / (1 / self.ticrate);
+
+ //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
+ real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
+
+ self.angles_y = self.angles_y + real_angle_y;
+
+
+ if(self.enemy)
+ v_forward = normalize(self.enemy.origin - self.origin);
+ else
+ v_forward = normalize(self.goalcurrent.origin - self.origin);
+
+ makevectors(self.angles);
+
+ if(self.flags & FL_ONGROUND)
+ {
+ if(s_speed > s_run)
+ self.velocity = (v_forward * max((s_speed - s_decel),s_run));
+ if(s_speed <= s_run)
+ self.velocity = (v_forward * min((s_speed + s_accel2),s_run));
+ }
+ } else {
+
+ if(self.flags & FL_ONGROUND)
+ {
+ makevectors(self.angles);
+ if(s_speed > 0)
+ self.velocity = min(s_speed - s_decel,0) * v_forward;
+ }
+ }
+
+
+
+ walker_animate();
+
+
+}
+
+void walker_attack()
+{
+ entity flash;
+
+ //turret_do_updates(self);
+
+ self.tur_head.frame = self.tur_head.frame + 1;
+
+ sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
+
+
+ fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
+
+ te_smallflash(self.tur_shotorg_updated);
+
+ if(!(self.uzi_bulletcounter & 3))
+ {
+
+ trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
+ // te_lightning1(self,self.tur_shotorg_updated,trace_endpos);
+ flash = spawn();
+ setmodel(flash, "models/uziflash.md3"); // precision set below
+ setattachment(flash, self.tur_head, "tag_fire");
+ flash.scale = 3;
+ flash.think = W_Uzi_Flash_Go;
+ flash.nextthink = time + 0.02;
+ flash.frame = 2;
+ flash.angles_z = flash.v_angle_z + random() * 180;
+ flash.alpha = 1;
+ flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+ }
+
+ self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
+}
+
+void walker_respawnhook()
+{
+ vector vtmp;
+ self.origin = self.wkr_spawn.origin;
+ self.wkr_props.solid = SOLID_BBOX;
+ self.wkr_props.alpha = 1;
+
+ self.angles = self.wkr_spawn.angles;
+ vtmp = self.origin;
+ vtmp_z +=self.wkr_spawn.origin_z + self.wkr_spawn.maxs_z;
+ setorigin(self,vtmp);
+
+}
+void walker_diehook()
+{
+ self.wkr_props.solid = SOLID_NOT;
+ self.wkr_props.alpha = -1;
+}
+
+//.string target_start;
+void turret_walker_dinit()
+{
+ entity e;
+
+ if (self.netname == "") self.netname = "Walker Turret";
+
+ if(self.target != "")
+ {
+ e = find(world,targetname,self.target);
+ if(!e)
+ {
+ bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
+ self.target = "";
+
+ //remove(self);
+ //return;
+ }
+
+ if(e.classname != "walker_checkpoint")
+ dprint("Warning: not a walker path\n");
+ else
+ self.goalcurrent = e;
+ }
+
+
+
+
+ self.wkr_props = spawn();
+ self.wkr_spawn = spawn();
+
+ self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
+ self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
+ self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
+
+ self.turret_respawnhook = walker_respawnhook;
+ self.turret_diehook = walker_diehook;
+
+ self.ticrate = 0.05;
+ if (turret_stdproc_init("walker_std") == 0)
+ {
+ remove(self);
+ return;
+ }
+ // self.scale = 1.5;
+ //setsize(self,'38 38 55','-38 -38 1');
+
+ self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
+ self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
+
+ //self.flags = FL_CLIENT;
+ self.iscreature = TRUE;
+ self.movetype = MOVETYPE_WALK;
+ self.solid = SOLID_BBOX;// SOLID_SLIDEBOX;
+ self.takedamage = DAMAGE_AIM;
+
+ setmodel(self.wkr_props,"models/turrets/walker_props.md3");
+ setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
+ setorigin(self.wkr_spawn,self.origin);
+
+ self.wkr_spawn.angles = self.angles;
+ self.wkr_spawn.solid = SOLID_NOT;
+
+ traceline(self.wkr_spawn.origin + '0 0 10', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
+ setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
+
+ setmodel(self,"models/turrets/walker_body.md3");
+ setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");
+
+ setattachment(self.tur_head,self,"tag_head");
+ setattachment(self.wkr_props,self,"tag_head");
+
+ vector v;
+ float f;
+ f = gettagindex(self.tur_head,"tag_fire");
+ v = gettaginfo(self.tur_head,f);
+ v_y = v_y * -1;
+
+ setsize(self,WALKER_MIN,WALKER_MAX);
+ //setsize(self,'-70 -70 0','70 70 55');
+
+ self.tur_shotorg = v;
+ self.tur_aimorg = v;
+
+ self.idle_aim = '0 0 0';
+
+// self.v_home = self.origin;
+
+ self.turret_firecheckfunc = walker_firecheck;
+
+ // Our fire routine
+ self.turret_firefunc = walker_attack;
+
+ self.turret_postthink = walker_postthink;
+
+}
+
+
+void spawnfunc_turret_walker()
+{
+ precache_model ("models/turrets/walker_head_minigun.md3");
+ precache_model ("models/turrets/walker_body.md3");
+ precache_model ("models/turrets/walker_props.md3");
+ precache_model ("models/turrets/walker_spawn.md3");
+ precache_model ( "models/turrets/rocket.md3");
+
+ self.think = turret_walker_dinit;
+ self.nextthink = time + 0.5;
+}
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_crylink.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -69,7 +69,7 @@
local entity proj;
local vector s;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
@@ -134,7 +134,7 @@
local float counter, shots;
local entity proj;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
@@ -184,7 +184,7 @@
// experimental lightning gun
void W_Crylink_Attack3 (void)
{
- if not(self.items & IT_UNLIMITED_AMMO)
+ 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");
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_electro.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -108,7 +108,7 @@
proj.projectiledeathtype = WEP_ELECTRO;
setorigin(proj, w_shotorg);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_primary_ammo");
proj.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
proj.movetype = MOVETYPE_FLY;
@@ -144,7 +144,7 @@
proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY;
setorigin(proj, w_shotorg);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_secondary_ammo");
proj.effects = EF_LOWPRECISION;
//proj.glow_size = 50;
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_grenadelauncher.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -91,7 +91,7 @@
{
local entity gren;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_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
@@ -128,7 +128,7 @@
{
local entity gren;
- if not(self.items & IT_UNLIMITED_AMMO)
+ 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
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hagar.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -81,7 +81,7 @@
{
local entity missile;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_primary_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
@@ -122,7 +122,7 @@
{
local entity missile;
- if not(self.items & IT_UNLIMITED_AMMO)
+ 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
Copied: branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc (from rev 4862, trunk/data/qcsrc/server/w_hlac.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hlac.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,257 @@
+.float HLAC_bulletcounter;
+void W_HLAC_Touch (void)
+{
+ vector dir;
+ vector org2;
+ vector normal;
+
+ if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ {
+ remove(self);
+ return;
+ }
+
+ if (other == self.owner)
+ return;
+
+ normal = trace_plane_normal;
+ dir = normalize (self.owner.origin - self.origin);
+ org2 = findbetterlocation (self.origin, 8);
+
+ pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);
+
+ self.event_damage = SUB_Null;
+
+ RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
+ sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+
+ remove (self);
+}
+
+void W_HLAC_Touch2 (void)
+{
+ vector dir;
+ vector org2;
+ vector normal;
+
+ if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ {
+ remove(self);
+ return;
+ }
+
+ if (other == self.owner)
+ return;
+
+ normal = trace_plane_normal;
+ dir = normalize (self.owner.origin - self.origin);
+ org2 = findbetterlocation (self.origin, 8);
+
+ pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);
+
+ //self.event_damage = SUB_Null;
+
+ RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
+ sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+
+ remove (self);
+}
+
+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, '25 8 -8', 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;
+
+ setmodel (missile, "models/laser.mdl"); // precision set below
+ setsize (missile, '0 0 0', '0 0 0');
+ 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.effects = EF_LOWPRECISION;
+ missile.flags = FL_PROJECTILE;
+ missile.projectiledeathtype = WEP_HLAC;
+}
+
+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;
+
+ setmodel (missile, "models/laser.mdl"); // precision set below
+ setsize (missile, '0 0 0', '0 0 0');
+ 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.effects = EF_LOWPRECISION;
+ missile.flags = FL_PROJECTILE;
+ missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
+}
+
+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=0;i<6;++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_sound ("weapons/laserimpact.wav");
+ precache_sound ("weapons/lasergun_fire.wav");
+
+ precache_model ("models/weapons/g_hlac.md3");
+ precache_model ("models/weapons/v_hlac.md3");
+ precache_model ("models/weapons/w_hlac.zym");
+ precache_sound ("weapons/lasergun_fire.wav");
+
+ }
+ 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 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_hook.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -26,7 +26,7 @@
{
local entity gren;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_hook_secondary_ammo");
W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/hookbomb_fire.wav");
@@ -81,7 +81,7 @@
if not(self.hook_state & HOOK_WAITING_FOR_RELEASE)
if (weapon_prepareattack(0, cvar("g_balance_hook_primary_refire")))
{
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_cells = self.ammo_cells - cvar("g_balance_hook_primary_ammo");
self.hook_state |= HOOK_FIRING;
weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hook_primary_animtime"), w_ready);
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_minstanex.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -45,7 +45,7 @@
// play a sound
soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
if (g_minstagib)
self.ammo_cells = self.ammo_cells - 1;
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_nex.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -21,7 +21,7 @@
// play a sound
soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo");
}
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_porto.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -76,9 +76,9 @@
return; // handled by the portal
norm = trace_plane_normal;
- if(trace_ent.movetype == MOVETYPE_WALK)
+ if(trace_ent.iscreature)
{
- traceline(trace_ent.origin, trace_ent.origin + '0 0 2' * PL_MIN_z, MOVE_NORMAL, self);
+ traceline(trace_ent.origin, trace_ent.origin + '0 0 2' * PL_MIN_z, MOVE_WORLDONLY, self);
if(trace_fraction >= 1)
return;
if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
@@ -152,7 +152,7 @@
{
local entity gren;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
W_SetupShot (self, '0 0 0', FALSE, 4, "porto/fire.ogg");
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,5 +1,4 @@
-
-.float rl_sound;
+.float rl_release;
.float rl_detonate_later;
void W_Rocket_Explode (void)
@@ -135,13 +134,6 @@
{
if(g_laserguided_missile)
{
- if(!self.owner.BUTTON_ATCK)
- self.ltime = -1; // indicate that the player has let go of the button
-
-
- if(self.owner.deadflag == DEAD_NO)
- if (self.owner.BUTTON_ATCK && self.ltime < 0) // if the player let go of the button and then pushed it again
- self.rl_detonate_later = TRUE;
if(self.rl_detonate_later)
W_Rocket_RemoteExplode();
@@ -180,8 +172,6 @@
}
else
{
- if (self.owner.BUTTON_ATCK2)
- self.rl_detonate_later = TRUE;
if(self.rl_detonate_later)
W_Rocket_RemoteExplode();
}
@@ -217,7 +207,7 @@
local entity missile;
local entity flash, flash2;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_rockets = self.ammo_rockets - cvar("g_balance_rocketlauncher_ammo");
W_SetupShot (self, '25 3 -4', FALSE, 5, "weapons/rocket_fire.wav");
@@ -231,7 +221,7 @@
missile.spawnshieldtime = time + cvar("g_balance_rocketlauncher_detonatedelay");
else
missile.spawnshieldtime = -1;
- missile.classname = "missile";
+ missile.classname = "rocket";
missile.bot_dodge = TRUE;
missile.bot_dodgerating = cvar("g_balance_rocketlauncher_primary_damage") * 2; // * 2 because it can be detonated inflight which makes it even more dangerous
@@ -292,6 +282,8 @@
float w_rlauncher(float req)
{
+ entity rock;
+ float rockfound;
if (req == WR_AIM)
{
// aim and decide to fire if appropriate
@@ -310,12 +302,12 @@
teamdamage = 0;
enemydamage = 0;
targetlist = findchainfloat(bot_attack, TRUE);
- missile = find(world, classname, "missile");
+ missile = find(world, classname, "rocket");
while (missile)
{
if (missile.owner != self)
{
- missile = find(missile, classname, "missile");
+ missile = find(missile, classname, "rocket");
continue;
}
targ = targetlist;
@@ -332,7 +324,7 @@
enemydamage = enemydamage + d;
targ = targ.chain;
}
- missile = find(missile, classname, "missile");
+ missile = find(missile, classname, "rocket");
}
local float desirabledamage;
desirabledamage = enemydamage;
@@ -341,12 +333,12 @@
if (self.team && teamplay == 2)
desirabledamage = desirabledamage - teamdamage;
- missile = find(world, classname, "missile");
+ missile = find(world, classname, "rocket");
while (missile)
{
if (missile.owner != self)
{
- missile = find(missile, classname, "missile");
+ missile = find(missile, classname, "rocket");
continue;
}
makevectors(missile.v_angle);
@@ -374,7 +366,7 @@
// dprint(ftos(random()/distance*300),">");dprint(ftos(frametime*bound(0,(10-skill)*0.2,1)),"\n");
}
- missile = find(missile, classname, "missile");
+ missile = find(missile, classname, "rocket");
}
// if we would be doing at X percent of the core damage, detonate it
// but don't fire a new shot at the same time!
@@ -389,28 +381,62 @@
}
else if (req == WR_THINK)
{
- if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_rocketlauncher_refire")))
+ if(g_laserguided_missile)
{
- W_Rocket_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_rocketlauncher_animtime"), w_ready);
+ if (self.BUTTON_ATCK && self.rl_release)
+ {
+ rockfound = 0;
+ for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self)
+ {
+ rock.rl_detonate_later = TRUE;
+ rockfound = 1;
+ }
+ if(rockfound)
+ sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
+ else
+ {
+ if (weapon_prepareattack(0, cvar("g_balance_rocketlauncher_refire")))
+ {
+ W_Rocket_Attack();
+ weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_rocketlauncher_animtime"), w_ready);
+ }
+ }
+ self.rl_release = 0;
+ }
+ if (!self.BUTTON_ATCK)
+ self.rl_release = 1;
+ if (self.BUTTON_ATCK2)
+ if(self.exteriorweaponentity.attack_finished_single < time)
+ {
+ self.exteriorweaponentity.attack_finished_single = time + 0.4;
+ self.laser_on = !self.laser_on;
+ // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
+ sound (self, CHAN_WEAPON2, "weapons/tink1.wav", VOL_BASE, ATTN_NORM);
+ }
}
- if (self.BUTTON_ATCK2)
- if(time > self.rl_sound)
+ else
{
- self.rl_sound = time + 1;
- // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
- sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
+ if (self.BUTTON_ATCK)
+ if (weapon_prepareattack(0, cvar("g_balance_rocketlauncher_refire")))
+ {
+ W_Rocket_Attack();
+ weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_rocketlauncher_animtime"), w_ready);
+ }
+ if (self.BUTTON_ATCK2 && self.rl_release)
+ {
+ rockfound = 0;
+ for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self)
+ {
+ rock.rl_detonate_later = TRUE;
+ rockfound = 1;
+ }
+ if(rockfound)
+ sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", 0.5 * VOL_BASE, ATTN_NORM);
+ self.rl_release = 0;
+ }
+ if (!self.BUTTON_ATCK2)
+ self.rl_release = 1;
}
- if (self.BUTTON_ATCK2)
- if(g_laserguided_missile)
- if(self.exteriorweaponentity.attack_finished_single < time)
- {
- self.exteriorweaponentity.attack_finished_single = time + 0.4;
- self.laser_on = !self.laser_on;
- // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
- sound (self, CHAN_WEAPON2, "weapons/tink1.wav", VOL_BASE, ATTN_NORM);
- }
}
else if (req == WR_PRECACHE)
{
@@ -427,7 +453,10 @@
precache_model ("models/laser_dot.mdl"); // rocket launcher
}
else if (req == WR_SETUP)
+ {
weapon_setup(WEP_ROCKET_LAUNCHER);
+ self.rl_release = 1;
+ }
else if (req == WR_CHECKAMMO1)
{
// don't switch while guiding a missile
Copied: branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc (from rev 4862, trunk/data/qcsrc/server/w_seeker.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_seeker.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,516 @@
+//.float speed; = switchweapon
+//.float proxytime; = autoswitch
+//.float tl; = wait
+
+void Seeker_Missile_Explode ()
+{
+ vector org2;
+ float b;
+ org2 = findbetterlocation (self.origin, 12);
+ te_explosion (org2);
+
+ b = crandom();
+ if (b<-0.7)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", 1, ATTN_NORM);
+ else if (b<0.4)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", 1, ATTN_NORM);
+ else if (b<1)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", 1, ATTN_NORM);
+
+ self.event_damage = SUB_Null;
+ RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
+
+ remove (self);
+}
+
+void Seeker_Missile_Touch()
+{
+ if (other == self.owner)
+ return;
+
+ Seeker_Missile_Explode();
+}
+
+void Seeker_Missile_Think()
+{
+ entity e;
+ vector desireddir, olddir, newdir;
+ 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)
+ {
+ e = self.enemy;
+ turnrate = cvar("g_balance_seeker_missile_turnrate"); // how fast to turn
+ desireddir = normalize(e.origin - self.origin);
+ olddir = normalize(self.velocity); // get my current direction
+ dist = vlen(e.origin - 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, self.enemy.origin, 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;
+
+}
+
+
+
+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)
+ Seeker_Missile_Explode();
+}
+
+#define EF_ROCKET 16777216
+void Seeker_Missile_Animate()
+{
+ self.frame = self.frame +1;
+ self.nextthink = time + 0.05;
+
+ if(self.frame == 5)
+ { self.think = Seeker_Missile_Think;
+ self.nextthink = time + cvar("g_balance_seeker_missile_activate_delay");
+ self.effects = EF_LOWPRECISION | EF_NOSHADOW | EF_ROCKET;
+
+ if (cvar("g_balance_seeker_guided_proxy"))
+ self.movetype = MOVETYPE_BOUNCEMISSILE;
+ else
+ self.movetype = MOVETYPE_FLYMISSILE;
+
+ }
+}
+
+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/hagar_fire.wav");
+ pointparticles(particleeffectnum("hagar_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.effects = EF_LOWPRECISION | EF_NOSHADOW;// | EF_ROCKET;
+ 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);
+ setmodel (missile, "models/tagrocket.md3");
+ setsize (missile, '0 0 0', '0 0 0');
+
+
+ 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);
+
+}
+
+void Seeker_Vollycontroler_Think()
+{
+ entity oldself,oldenemy;
+ self.cnt = self.cnt - 1;
+ if ((self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1))
+ {
+ remove(self);
+ return;
+
+ }
+
+ self.nextthink = time + cvar("g_balance_seeker_missile_delay");
+
+ oldself = self;
+ self = self.owner;
+
+ oldenemy = self.enemy;
+ self.enemy = oldself.enemy;
+
+ switch(oldself.cnt)
+ {
+ 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:
+ Seeker_Fire_Missile('40 09.5 -29');
+ break;
+ }
+
+
+
+ self.enemy = oldenemy;
+ self = oldself;
+}
+
+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)
+ self.think ();
+}
+
+void Seeker_Tag_Explode ()
+{
+ vector org2;
+ float b;
+
+ //if(other==self.owner)
+ // return;
+
+ org2 = findbetterlocation (self.origin, 12);
+ te_explosion (org2);
+
+ b = crandom();
+ if (b<-0.7)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp1.ogg", 1, ATTN_NORM);
+ else if (b<0.4)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp2.ogg", 1, ATTN_NORM);
+ else if (b<1)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp3.ogg", 1, ATTN_NORM);
+
+ remove (self);
+}
+
+void Seeker_Tag_Think()
+{
+ remove(self);
+ return;
+}
+
+void Seeker_Tag_Touch()
+{
+ vector dir;
+ vector org2;
+
+ if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ {
+ remove(self);
+ return;
+ }
+
+ if (other == self.owner)
+ return;
+
+ dir = normalize (self.owner.origin - self.origin);
+ org2 = findbetterlocation (self.origin, 8);
+
+ te_knightspike(org2);
+
+ self.event_damage = SUB_Null;
+ sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", 1, ATTN_NORM);
+
+ if (other.classname == "player")
+ {
+
+ 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/hagar_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;
+
+ setmodel (missile, "models/laser.mdl");
+ setorigin (missile, w_shotorg);
+
+ missile.effects = EF_BRIGHTFIELD | EF_FULLBRIGHT | EF_NOSHADOW | EF_LOWPRECISION;
+ 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);
+}
+
+
+void Seeker_Flac_Explode ()
+{
+ vector org2;
+ float b;
+ org2 = findbetterlocation (self.origin, 12);
+ te_explosion (org2);
+
+ b = crandom();
+ if (b<-0.7)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp1.ogg", 1, ATTN_NORM);
+ else if (b<0.4)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp2.ogg", 1, ATTN_NORM);
+ else if (b<1)
+ sound (self, CHAN_PROJECTILE, "weapons/hagexp3.ogg", 1, ATTN_NORM);
+
+ self.event_damage = SUB_Null;
+
+ RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
+
+ remove (self);
+}
+
+void Seeker_Flac_Touch()
+{
+ if (other == self.owner)
+ return;
+
+ Seeker_Flac_Explode();
+}
+
+void Seeker_Fire_Flac()
+{
+ local entity missile;
+ vector f_org;
+
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
+
+ switch(floor(random() * 3))
+ {
+ case 0:
+ f_org = '37.5 17 -22';
+ break;
+ case 1:
+ f_org = '37.5 9.5 -22';
+ break;
+ case 2:
+ f_org = '40 17 -29';
+ break;
+ case 3:
+ f_org = '40 9.5 -29';
+ break;
+ }
+ W_SetupShot (self, f_org, FALSE, 2, "weapons/hagar_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);
+ setmodel (missile, "models/hagarmissile.mdl"); // precision set below
+ setsize (missile, '0 0 0', '0 0 0');
+ missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
+
+ missile.effects = EF_LOWPRECISION;
+ missile.modelflags = MF_GRENADE;
+
+ 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;
+}
+
+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_FIRE1, cvar("g_balance_seeker_flac_animtime"), w_ready);
+ }
+
+ }
+ else if (req == WR_PRECACHE)
+ {
+ precache_model ("models/tagrocket.md3");
+ precache_model ("models/weapons/g_seeker.md3");
+ precache_model ("models/weapons/v_seeker.md3");
+ precache_model ("models/weapons/w_seeker.zym");
+ precache_sound ("weapons/hagar_fire.wav");
+ precache_sound ("weapons/hagexp1.wav");
+ precache_sound ("weapons/hagexp2.wav");
+ precache_sound ("weapons/hagexp3.wav");
+ precache_sound ("weapons/laserimpact.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");
+ else if (req == WR_CHECKAMMO2)
+ return self.ammo_rockets >= cvar("g_balance_seeker_secondary_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 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_shotgun.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -16,7 +16,7 @@
W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav");
for (sc = 0;sc < bullets;sc = sc + 1)
fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN, sc < 3);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_primary_ammo");
pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"));
@@ -59,7 +59,7 @@
W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav");
for (sc = 0;sc < bullets;sc = sc + 1)
fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN | HITTYPE_SECONDARY, sc < 3);
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_secondary_ammo");
pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"));
Modified: branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_uzi.qc 2008-10-24 09:45:12 UTC (rev 4863)
@@ -15,7 +15,7 @@
{
local entity flash, flash2;
- if not(self.items & IT_UNLIMITED_AMMO)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
if (self.uzi_bulletcounter == 1)
self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
Modified: branches/nexuiz-2.0/data/scripts/entities.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/entities.def 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/scripts/entities.def 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1065,7 +1065,7 @@
You may want to target this by a race checkpoint, a teleporter, or a trigger_multiple with ALLENTS set (so it removes weapons thrown through the field to avoid getting a weapon through it).
-------- KEYS --------
targetname: used to trigger this
-netname: space separated list of items (either weapon short names (like in g_start_weapon_* cvars), or item short names "unlimited_ammo", "invincible" and "strength"
+netname: space separated list of items (either weapon short names (like in g_start_weapon_* cvars), or item short names "unlimited_ammo", "unlimited_weapon_ammo", "unlimited_superweapons", "invincible" and "strength"
message: message to print
ammo_shells: amount of shells
ammo_nails: amount of bullets
@@ -1086,6 +1086,7 @@
The entity field list is a single string of the form:
'field' 'value' 'field' 'value' ... 'classname' 'item_bullets' ... 'field' 'value'
The special "field" name $ calls a void(void) function, for example a spawn function.
+Special function names available are _setmodel and _setsize.
Field values can use various variable replacements:
$E
$E.field
@@ -1112,6 +1113,7 @@
targetname: used to trigger this
message: entity field list
target: when set, target_spawn edits entities, instead of creating new ones
+count: make sure no more than count entities have been created by this (refuse to spawn new ones if exceeded)
-------- SPAWNFLAGS --------
ONLOAD: create a first entity on map load
*/
@@ -1132,3 +1134,15 @@
DISABLED: do not allow damaging this until it is first activated
INDICATE: indicate amount of damage already taken by coloring
*/
+
+/*QUAKED trigger_relay_if (0 1 0) (-8 -8 -8) (8 8 8) MORETHAN
+Relays the trigger event if there are at most count entities of the given type.
+-------- KEYS --------
+target: The entity/entities to relay the trigger events to
+targetname: The name other entities can use to target this entity
+netname: The name of the field to check (can currently only be targetname, netname, target or classname)
+message: The value of the field to check
+count: The count of entities that must be found
+-------- SPAWNFLAGS --------
+MORETHAN: trigger if there are more than the given count, not at least
+*/
Modified: branches/nexuiz-2.0/data/scripts/turrets.def
===================================================================
--- branches/nexuiz-2.0/data/scripts/turrets.def 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/scripts/turrets.def 2008-10-24 09:45:12 UTC (rev 4863)
@@ -192,3 +192,36 @@
/*QUAKED turret_targettrigger (.5 .5 .5) ?
Used to feed turrets capable of it with remote target info. currently only turret_hk supports this.
*/
+
+
+/*QUAKED walker_checkpoint (1 0 1) (-16 -16 -16) (16 16 16)
+-----------KEYS------------
+target: .targetname of next wapoint in chain.
+
+-----------SPAWNFLAGS-----------
+
+---------NOTES----------
+If a loop is of targets are formed, any walker entering this loop will patrol it indefinitly.
+If the checkpoint chain in not looped, teh walker will go "Roaming" when teh last point is reached.
+*/
+
+/*QUAKED turret_walker (1 0 0) (-32 -32 0) (32 32 50)
+-----------KEYS------------
+turret_scale_damage: 2 = double damage, 0.5 = half
+turret_scale_range: 2 = double range, 0.5 = half
+turret_scale_refire: 2 = doubble refire (SLOWER!), 0.5 = half (FASTER!)
+turret_scale_ammo: 2 = doubble ammo carry & regen, 0.5 = half ammo carry & regen
+turret_scale_aim: 2 = aim twice as fast, 0,5 = aim at half speed
+turret_scale_health: 2 = double health, 0.5 = half
+
+target : Enter this walker_checkpoint chain
+
+team : 5=red, 14=blue
+-----------SPAWNFLAGS-----------
+---------NOTES----------
+
+A nasty mechanical ceature that will engage longrange target with missiles, midrange with its miniguna and meele things up close and personal.
+
+-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
+model="models/turrets/radiant/walker.md3"
+*/
Modified: branches/nexuiz-2.0/data/scripts/turrets.shader
===================================================================
--- branches/nexuiz-2.0/data/scripts/turrets.shader 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/scripts/turrets.shader 2008-10-24 09:45:12 UTC (rev 4863)
@@ -39,3 +39,19 @@
}
}
+models/turrets/r_fx1
+{
+ surfaceparm nomarks
+ surfaceparm trans
+ surfaceparm pointlight
+ surfaceparm nolightmap
+ nopicmip
+ qer_editorimage models/turrets/r_fx1_1
+
+ {
+ animmap 10 models/turrets/r_fx1_3 models/turrets/r_fx1_4 models/turrets/r_fx1_5 models/turrets/r_fx1_4 models/turrets/r_fx1_3 models/turrets/r_fx1_2 models/turrets/r_fx1_1 models/turrets/r_fx1_2
+ }
+
+}
+
+
Copied: branches/nexuiz-2.0/data/textures/hlac.tga (from rev 4862, trunk/data/textures/hlac.tga)
===================================================================
(Binary files differ)
Copied: branches/nexuiz-2.0/data/textures/seeker.tga (from rev 4862, trunk/data/textures/seeker.tga)
===================================================================
(Binary files differ)
Modified: branches/nexuiz-2.0/data/turrets.cfg
===================================================================
--- branches/nexuiz-2.0/data/turrets.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/turrets.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -2,19 +2,51 @@
set g_turrets_reloadcvars 0
set g_turrets_nofire 0
+// Target scanning and validation can be resource intensive
+// Dont let turrets look for new targets more frequently then this
+set g_turrets_targetscan_mindelay 0.5
+
+// Turrets with no target returns to their idle aim after this much time.
+set g_turrets_aimidle_delay 5
+
+// --- Units ---
+
+// Machinegun on a stick.
+exec unit_machinegun.cfg
+
+// Hunter killer rocket turret. "smart rockets"
exec unit_hk.cfg
+
+// Fires a pair of accelerating, simple homing rockets.
+exec unit_hellion.cfg
+
+// Fire lots of dumbfire rockets
+exec unit_mlrs.cfg
+
+// Kills killable enemy missiles.
+exec unit_flac.cfg
+
+// Support unit. Recharges friendly energy based turrets in range
+exec unit_fusreac.cfg
+
+// "Electro" turret.
exec unit_plasma.cfg
+
+// The the all new "Electro" turret, same ting with two barrels.
exec unit_plasma2.cfg
-exec unit_fusreac.cfg
-exec unit_mlrs.cfg
-exec unit_hellion.cfg
-exec unit_flac.cfg
-exec unit_minigun.cfg
+
+// AAAaaaarg! Bzzaat! yber turret. chain lightning missile and player killing.
exec unit_tesla.cfg
-exec unit_machinegun.cfg
+
+// Fires a constant beam that slows down and slowly damages its target.
exec unit_phaser.cfg
-// not exec'd: gauss, walker
+// The bastred son of a turret and a quake monster.
+// A walking minigun with longrage missiles and closerange meele attack.
+exec unit_walker.cfg
+// not exec'd: gauss
+
+
set g_turrets_reloadcvars 1 // reload when this cfg has been exec'd
alias g_turrets_reload "set g_turrets_reloadcvars 1"
Modified: branches/nexuiz-2.0/data/unit_hellion.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_hellion.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_hellion.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -6,37 +6,37 @@
set g_turrets_unit_hellion_std_shot_radius 100
set g_turrets_unit_hellion_std_shot_speed 750
-set g_turrets_unit_hellion_std_shot_speed_max 2500
-set g_turrets_unit_hellion_std_shot_speed_gain 1.05
+set g_turrets_unit_hellion_std_shot_speed_max 5000
+set g_turrets_unit_hellion_std_shot_speed_gain 1.025
set g_turrets_unit_hellion_std_shot_spread 0.08
set g_turrets_unit_hellion_std_shot_force 250
set g_turrets_unit_hellion_std_shot_volly 2
set g_turrets_unit_hellion_std_shot_volly_refire 4
-set g_turrets_unit_hellion_std_target_range 5120
-set g_turrets_unit_hellion_std_target_range_min 256
-set g_turrets_unit_hellion_std_target_range_fire 4096
-set g_turrets_unit_hellion_std_target_range_optimal 3072
+set g_turrets_unit_hellion_std_target_range 6000
+set g_turrets_unit_hellion_std_target_range_min 150
+set g_turrets_unit_hellion_std_target_range_fire 5000
+set g_turrets_unit_hellion_std_target_range_optimal 4500
set g_turrets_unit_hellion_std_target_select_rangebias 0.7
-set g_turrets_unit_hellion_std_target_select_samebias 0.15
-set g_turrets_unit_hellion_std_target_select_anglebias 0.15
+set g_turrets_unit_hellion_std_target_select_samebias 0.01
+set g_turrets_unit_hellion_std_target_select_anglebias 0.01
set g_turrets_unit_hellion_std_target_select_playerbias 1
set g_turrets_unit_hellion_std_target_select_missilebias 0
-set g_turrets_unit_hellion_std_ammo_max 700
-set g_turrets_unit_hellion_std_ammo 300
+set g_turrets_unit_hellion_std_ammo_max 200
+set g_turrets_unit_hellion_std_ammo 100
set g_turrets_unit_hellion_std_ammo_recharge 50
set g_turrets_unit_hellion_std_aim_firetolerance_dist 200
set g_turrets_unit_hellion_std_aim_firetolerance_angle 25
-set g_turrets_unit_hellion_std_aim_speed 96
+set g_turrets_unit_hellion_std_aim_speed 100
set g_turrets_unit_hellion_std_aim_maxrot 360
-set g_turrets_unit_hellion_std_aim_maxpitch 15
+set g_turrets_unit_hellion_std_aim_maxpitch 20
set g_turrets_unit_hellion_std_track_type 3
set g_turrets_unit_hellion_std_track_accel_pitch 0.25
-set g_turrets_unit_hellion_std_track_accel_rot 0.25
+set g_turrets_unit_hellion_std_track_accel_rot 0.5
set g_turrets_unit_hellion_std_track_blendrate 0.75
Modified: branches/nexuiz-2.0/data/unit_hk.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_hk.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_hk.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -6,25 +6,25 @@
set g_turrets_unit_hk_std_shot_radius 200
set g_turrets_unit_hk_std_shot_speed 500
-set g_turrets_unit_hk_std_shot_speed_max 850
-set g_turrets_unit_hk_std_shot_speed_accel 1.05
-set g_turrets_unit_hk_std_shot_speed_accel2 1.1
+set g_turrets_unit_hk_std_shot_speed_max 1000
+set g_turrets_unit_hk_std_shot_speed_accel 1.025
+set g_turrets_unit_hk_std_shot_speed_accel2 1.05
set g_turrets_unit_hk_std_shot_speed_decel 0.9
-set g_turrets_unit_hk_std_shot_speed_turnrate 0.2
+set g_turrets_unit_hk_std_shot_speed_turnrate 0.25
set g_turrets_unit_hk_std_shot_spread 0
-set g_turrets_unit_hk_std_shot_force 800
-set g_turrets_unit_hk_std_shot_volly 1
-set g_turrets_unit_hk_std_shot_volly_refire 5
+set g_turrets_unit_hk_std_shot_force 600
+set g_turrets_unit_hk_std_shot_volly 0
+set g_turrets_unit_hk_std_shot_volly_refire 0
-set g_turrets_unit_hk_std_target_range 5120
-set g_turrets_unit_hk_std_target_range_min 256
-set g_turrets_unit_hk_std_target_range_fire 4096
-set g_turrets_unit_hk_std_target_range_optimal 4096
+set g_turrets_unit_hk_std_target_range 6000
+set g_turrets_unit_hk_std_target_range_min 220
+set g_turrets_unit_hk_std_target_range_fire 5000
+set g_turrets_unit_hk_std_target_range_optimal 5000
set g_turrets_unit_hk_std_target_select_rangebias 0.5
-set g_turrets_unit_hk_std_target_select_samebias 0
-set g_turrets_unit_hk_std_target_select_anglebias 0.5
+set g_turrets_unit_hk_std_target_select_samebias 0.01
+set g_turrets_unit_hk_std_target_select_anglebias 0.1
set g_turrets_unit_hk_std_target_select_playerbias 1
set g_turrets_unit_hk_std_target_select_missilebias 0
@@ -34,12 +34,12 @@
set g_turrets_unit_hk_std_aim_firetolerance_dist 250
set g_turrets_unit_hk_std_aim_firetolerance_angle 25
-set g_turrets_unit_hk_std_aim_speed 50
+set g_turrets_unit_hk_std_aim_speed 100
set g_turrets_unit_hk_std_aim_maxrot 360
-set g_turrets_unit_hk_std_aim_maxpitch 10
+set g_turrets_unit_hk_std_aim_maxpitch 20
-set g_turrets_unit_hk_std_track_type 2
-set g_turrets_unit_hk_std_track_accel_pitch 0.45
-set g_turrets_unit_hk_std_track_accel_rot 0.6
-set g_turrets_unit_hk_std_track_blendrate 0.5
+set g_turrets_unit_hk_std_track_type 3
+set g_turrets_unit_hk_std_track_accel_pitch 0.25
+set g_turrets_unit_hk_std_track_accel_rot 0.5
+set g_turrets_unit_hk_std_track_blendrate 0.25
Modified: branches/nexuiz-2.0/data/unit_machinegun.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_machinegun.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_machinegun.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,19 +1,19 @@
set g_turrets_unit_machinegun_std_health 256
set g_turrets_unit_machinegun_std_respawntime 60
-set g_turrets_unit_machinegun_std_shot_dmg 20
-set g_turrets_unit_machinegun_std_shot_refire 0.15
-set g_turrets_unit_machinegun_std_shot_spread 0.015
-set g_turrets_unit_machinegun_std_shot_force 45
+set g_turrets_unit_machinegun_std_shot_dmg 12
+set g_turrets_unit_machinegun_std_shot_refire 0.1
+set g_turrets_unit_machinegun_std_shot_spread 0.025
+set g_turrets_unit_machinegun_std_shot_force 15
set g_turrets_unit_machinegun_std_shot_radius 0
set g_turrets_unit_machinegun_std_shot_speed 0
set g_turrets_unit_machinegun_std_shot_volly 5
-set g_turrets_unit_machinegun_std_shot_volly_refire 0.45
+set g_turrets_unit_machinegun_std_shot_volly_refire 1.5
-set g_turrets_unit_machinegun_std_target_range 4000
+set g_turrets_unit_machinegun_std_target_range 4500
set g_turrets_unit_machinegun_std_target_range_min 2
-set g_turrets_unit_machinegun_std_target_range_fire 3000
-set g_turrets_unit_machinegun_std_target_range_optimal 1500
+set g_turrets_unit_machinegun_std_target_range_fire 4000
+set g_turrets_unit_machinegun_std_target_range_optimal 2500
set g_turrets_unit_machinegun_std_target_select_rangebias 0.25
set g_turrets_unit_machinegun_std_target_select_samebias 0.25
@@ -34,6 +34,6 @@
set g_turrets_unit_machinegun_std_track_type 3
set g_turrets_unit_machinegun_std_track_accel_pitch 0.25
set g_turrets_unit_machinegun_std_track_accel_rot 0.75
-set g_turrets_unit_machinegun_std_track_blendrate 0.25
+set g_turrets_unit_machinegun_std_track_blendrate 0.2
Deleted: branches/nexuiz-2.0/data/unit_minigun.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_minigun.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_minigun.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,41 +0,0 @@
-set g_turrets_unit_minigun_std_health 256
-set g_turrets_unit_minigun_std_respawntime 60
-
-set g_turrets_unit_minigun_std_spin_up_time 2.5
-
-set g_turrets_unit_minigun_std_shot_dmg 10
-set g_turrets_unit_minigun_std_shot_refire 0.05
-set g_turrets_unit_minigun_std_shot_spread 0.032
-set g_turrets_unit_minigun_std_shot_force 64
-set g_turrets_unit_minigun_std_shot_radius 0
-set g_turrets_unit_minigun_std_shot_speed 0
-set g_turrets_unit_minigun_std_shot_volly 10
-set g_turrets_unit_minigun_std_shot_volly_refire 0.5
-
-set g_turrets_unit_minigun_std_target_range 4000
-set g_turrets_unit_minigun_std_target_range_min 2
-set g_turrets_unit_minigun_std_target_range_fire 3000
-set g_turrets_unit_minigun_std_target_range_optimal 512
-
-set g_turrets_unit_minigun_std_target_select_rangebias 0.25
-set g_turrets_unit_minigun_std_target_select_samebias 0.25
-set g_turrets_unit_minigun_std_target_select_anglebias 0.5
-set g_turrets_unit_minigun_std_target_select_playerbias 1
-set g_turrets_unit_minigun_std_target_select_missilebias 0
-
-set g_turrets_unit_minigun_std_ammo_max 4000
-set g_turrets_unit_minigun_std_ammo 500
-set g_turrets_unit_minigun_std_ammo_recharge 100
-
-set g_turrets_unit_minigun_std_aim_firetolerance_dist 128
-set g_turrets_unit_minigun_std_aim_firetolerance_angle 16
-set g_turrets_unit_minigun_std_aim_speed 32
-set g_turrets_unit_minigun_std_aim_maxrot 400
-set g_turrets_unit_minigun_std_aim_maxpitch 25
-
-set g_turrets_unit_minigun_std_track_type 1
-set g_turrets_unit_minigun_std_track_accel_pitch 0.25
-set g_turrets_unit_minigun_std_track_accel_rot 0.75
-set g_turrets_unit_minigun_std_track_blendrate 0.25
-
-
Modified: branches/nexuiz-2.0/data/unit_mlrs.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_mlrs.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_mlrs.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,15 +1,16 @@
-set g_turrets_unit_mlrs_std_health 350
+set g_turrets_unit_mlrs_std_health 500
set g_turrets_unit_mlrs_std_respawntime 60
set g_turrets_unit_mlrs_std_shot_dmg 50
-set g_turrets_unit_mlrs_std_shot_refire 0.2
-set g_turrets_unit_mlrs_std_shot_radius 250
+set g_turrets_unit_mlrs_std_shot_refire 0.1
+set g_turrets_unit_mlrs_std_shot_radius 180
set g_turrets_unit_mlrs_std_shot_speed 2000
set g_turrets_unit_mlrs_std_shot_spread 0.05
-set g_turrets_unit_mlrs_std_shot_force 150
-set g_turrets_unit_mlrs_std_shot_volly 6
-set g_turrets_unit_mlrs_std_shot_volly_refire 5
+set g_turrets_unit_mlrs_std_shot_force 50
+set g_turrets_unit_mlrs_std_shot_volly 3
+set g_turrets_unit_mlrs_std_shot_volly_refire 1.5
+
set g_turrets_unit_mlrs_std_target_range 4000
set g_turrets_unit_mlrs_std_target_range_min 500
set g_turrets_unit_mlrs_std_target_range_fire 3000
@@ -21,17 +22,17 @@
set g_turrets_unit_mlrs_std_target_select_playerbias 1
set g_turrets_unit_mlrs_std_target_select_missilebias 0
-set g_turrets_unit_mlrs_std_ammo_max 350
-set g_turrets_unit_mlrs_std_ammo 310
-set g_turrets_unit_mlrs_std_ammo_recharge 60
+set g_turrets_unit_mlrs_std_ammo_max 300
+set g_turrets_unit_mlrs_std_ammo 300
+set g_turrets_unit_mlrs_std_ammo_recharge 50
-set g_turrets_unit_mlrs_std_aim_firetolerance_dist 200
+set g_turrets_unit_mlrs_std_aim_firetolerance_dist 300
set g_turrets_unit_mlrs_std_aim_firetolerance_angle 15
-set g_turrets_unit_mlrs_std_aim_speed 100
+set g_turrets_unit_mlrs_std_aim_speed 180
set g_turrets_unit_mlrs_std_aim_maxrot 360
set g_turrets_unit_mlrs_std_aim_maxpitch 15
set g_turrets_unit_mlrs_std_track_type 3
set g_turrets_unit_mlrs_std_track_accel_pitch 0.25
-set g_turrets_unit_mlrs_std_track_accel_rot 0.75
+set g_turrets_unit_mlrs_std_track_accel_rot 0.5
set g_turrets_unit_mlrs_std_track_blendrate 0.25
\ No newline at end of file
Modified: branches/nexuiz-2.0/data/unit_plasma.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_plasma.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_plasma.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -2,59 +2,59 @@
set g_turrets_unit_plasma_std_respawntime 60
// Do this mutch damage
-set g_turrets_unit_plasma_std_shot_dmg 60
+set g_turrets_unit_plasma_std_shot_dmg 80
//This often
-set g_turrets_unit_plasma_std_shot_refire 0.7
+set g_turrets_unit_plasma_std_shot_refire 0.6
//Over this mutch area
set g_turrets_unit_plasma_std_shot_radius 150
//Traveling at this speed
-set g_turrets_unit_plasma_std_shot_speed 6000
+set g_turrets_unit_plasma_std_shot_speed 2000
//With a random direction of
-set g_turrets_unit_plasma_std_shot_spread 0.0125
+set g_turrets_unit_plasma_std_shot_spread 0.0001
//Pushing things this hard
set g_turrets_unit_plasma_std_shot_force 100
//Each volly is this many shots
-set g_turrets_unit_plasma_std_shot_volly 1
+set g_turrets_unit_plasma_std_shot_volly 0
// Refire upon compleated volly
-set g_turrets_unit_plasma_std_shot_volly_refire 0.7
+set g_turrets_unit_plasma_std_shot_volly_refire 0
// Scan for targets within this range
-set g_turrets_unit_plasma_std_target_range 4000
+set g_turrets_unit_plasma_std_target_range 3500
// But no close then this
-set g_turrets_unit_plasma_std_target_range_min 240
+set g_turrets_unit_plasma_std_target_range_min 200
// If thise or closer, fire
-set g_turrets_unit_plasma_std_target_range_fire 3800
+set g_turrets_unit_plasma_std_target_range_fire 3000
// If we have a choise, prefer the ones closer to this distance
-set g_turrets_unit_plasma_std_target_range_optimal 2000
+set g_turrets_unit_plasma_std_target_range_optimal 1500
// Targetselect is made for each turret based on range, angle (turrets needs to turn to aim at), if its a player / missile
// scale range score this mucth
-set g_turrets_unit_plasma_std_target_select_rangebias 0.25
+set g_turrets_unit_plasma_std_target_select_rangebias 0.5
// scale 'same' score this mutch (stick with same target)
-set g_turrets_unit_plasma_std_target_select_samebias 0.25
+set g_turrets_unit_plasma_std_target_select_samebias 0.01
// and so on
-set g_turrets_unit_plasma_std_target_select_anglebias 0.5
+set g_turrets_unit_plasma_std_target_select_anglebias 0.25
set g_turrets_unit_plasma_std_target_select_playerbias 1
set g_turrets_unit_plasma_std_target_select_missilebias 0
// Can catty this mutch ammo. one dmg = one ammo
-set g_turrets_unit_plasma_std_ammo_max 600
+set g_turrets_unit_plasma_std_ammo_max 800
// Start with this mutch ammo
-set g_turrets_unit_plasma_std_ammo 300
+set g_turrets_unit_plasma_std_ammo 400
// Regain ammo this fast (per sec)
-set g_turrets_unit_plasma_std_ammo_recharge 30
+set g_turrets_unit_plasma_std_ammo_recharge 40
// If predicted emeypos is this or closer to predicted impact, fire is ok
-set g_turrets_unit_plasma_std_aim_firetolerance_dist 256
+set g_turrets_unit_plasma_std_aim_firetolerance_dist 200
// If angle ofset to predicted emeypos is this or less, fire is ok
-set g_turrets_unit_plasma_std_aim_firetolerance_angle 10
+set g_turrets_unit_plasma_std_aim_firetolerance_angle 5
// Aim how fast (for g_turrets_unit_plasma_std_track_type=1 this is dgr/sec, for 2 & 3 its the maximum force added each sec)
-set g_turrets_unit_plasma_std_aim_speed 250
+set g_turrets_unit_plasma_std_aim_speed 180
// Max rottation of head
set g_turrets_unit_plasma_std_aim_maxrot 360
// Max tilt of head
-set g_turrets_unit_plasma_std_aim_maxpitch 25
+set g_turrets_unit_plasma_std_aim_maxpitch 30
// How the head turns.
// 1 = hard steps, good for aiming preformace, bad for visuals.
@@ -62,7 +62,7 @@
// 3 = smmoth with simulated inertia
set g_turrets_unit_plasma_std_track_type 3
// Following controls how _track_type = 3 works.
-set g_turrets_unit_plasma_std_track_accel_pitch 0.4
-set g_turrets_unit_plasma_std_track_accel_rot 0.4
-set g_turrets_unit_plasma_std_track_blendrate 0.35
+set g_turrets_unit_plasma_std_track_accel_pitch 0.25
+set g_turrets_unit_plasma_std_track_accel_rot 0.5
+set g_turrets_unit_plasma_std_track_blendrate 0.25
Modified: branches/nexuiz-2.0/data/unit_plasma2.cfg
===================================================================
--- branches/nexuiz-2.0/data/unit_plasma2.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/unit_plasma2.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,20 +1,20 @@
set g_turrets_unit_plasma_dual_health 500
set g_turrets_unit_plasma_dual_respawntime 60
-set g_turrets_unit_plasma_dual_shot_dmg 50
-set g_turrets_unit_plasma_dual_shot_refire 0.3
-set g_turrets_unit_plasma_dual_shot_radius 100
-set g_turrets_unit_plasma_dual_shot_speed 5000
+set g_turrets_unit_plasma_dual_shot_dmg 80
+set g_turrets_unit_plasma_dual_shot_refire 0.1
+set g_turrets_unit_plasma_dual_shot_radius 150
+set g_turrets_unit_plasma_dual_shot_speed 2000
set g_turrets_unit_plasma_dual_shot_spread 0.015
set g_turrets_unit_plasma_dual_shot_force 100
-set g_turrets_unit_plasma_dual_shot_volly 0
+set g_turrets_unit_plasma_dual_shot_volly 2
set g_turrets_unit_plasma_dual_shot_volly_refire 0.5
-set g_turrets_unit_plasma_dual_target_range 4000
+set g_turrets_unit_plasma_dual_target_range 3000
set g_turrets_unit_plasma_dual_target_range_min 100
-set g_turrets_unit_plasma_dual_target_range_fire 3000
-set g_turrets_unit_plasma_dual_target_range_optimal 1600
+set g_turrets_unit_plasma_dual_target_range_fire 2500
+set g_turrets_unit_plasma_dual_target_range_optimal 2000
set g_turrets_unit_plasma_dual_target_select_rangebias 0.25
set g_turrets_unit_plasma_dual_target_select_samebias 0.25
@@ -22,19 +22,19 @@
set g_turrets_unit_plasma_dual_target_select_playerbias 1
set g_turrets_unit_plasma_dual_target_select_missilebias 0
-set g_turrets_unit_plasma_dual_ammo_max 500
-set g_turrets_unit_plasma_dual_ammo 250
-set g_turrets_unit_plasma_dual_ammo_recharge 50
+set g_turrets_unit_plasma_dual_ammo_max 800
+set g_turrets_unit_plasma_dual_ammo 500
+set g_turrets_unit_plasma_dual_ammo_recharge 40
-set g_turrets_unit_plasma_dual_aim_firetolerance_dist 150
+set g_turrets_unit_plasma_dual_aim_firetolerance_dist 250
set g_turrets_unit_plasma_dual_aim_firetolerance_angle 16
-set g_turrets_unit_plasma_dual_aim_speed 50
+set g_turrets_unit_plasma_dual_aim_speed 100
set g_turrets_unit_plasma_dual_aim_maxrot 360
-set g_turrets_unit_plasma_dual_aim_maxpitch 15
+set g_turrets_unit_plasma_dual_aim_maxpitch 30
set g_turrets_unit_plasma_dual_track_type 3
set g_turrets_unit_plasma_dual_track_accel_pitch 0.25
-set g_turrets_unit_plasma_dual_track_accel_rot 0.75
-set g_turrets_unit_plasma_dual_track_blendrate 0.5
+set g_turrets_unit_plasma_dual_track_accel_rot 0.5
+set g_turrets_unit_plasma_dual_track_blendrate 0.25
Copied: branches/nexuiz-2.0/data/unit_walker.cfg (from rev 4862, trunk/data/unit_walker.cfg)
===================================================================
--- branches/nexuiz-2.0/data/unit_walker.cfg (rev 0)
+++ branches/nexuiz-2.0/data/unit_walker.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -0,0 +1,57 @@
+set g_turrets_unit_walker_std_health 500
+set g_turrets_unit_walker_std_respawntime 60
+
+// dgr / sec
+set g_turrets_unit_walker_turn_turnrate 90
+set g_turrets_unit_walker_walk_turnrate 45
+set g_turrets_unit_walker_run_turnrate 22.5
+
+// Main machineguns prop's
+set g_turrets_unit_walker_std_shot_dmg 15
+set g_turrets_unit_walker_std_shot_refire 0.1
+set g_turrets_unit_walker_std_shot_spread 0.05
+set g_turrets_unit_walker_std_shot_force 5
+set g_turrets_unit_walker_std_shot_radius 0
+set g_turrets_unit_walker_std_shot_speed 0
+
+set g_turrets_unit_walker_std_shot_volly 0
+set g_turrets_unit_walker_std_shot_volly_refire 0
+
+// Note this is the effective range for rocket engagement
+set g_turrets_unit_walker_std_target_range 10000
+
+set g_turrets_unit_walker_std_target_range_fire 1500
+set g_turrets_unit_walker_std_target_range_optimal 500
+set g_turrets_unit_walker_std_target_range_min 64
+
+set g_turrets_unit_walker_std_target_select_rangebias 0.25
+set g_turrets_unit_walker_std_target_select_samebias 0.25
+set g_turrets_unit_walker_std_target_select_anglebias 0.5
+set g_turrets_unit_walker_std_target_select_playerbias 1
+set g_turrets_unit_walker_std_target_select_missilebias 0
+
+set g_turrets_unit_walker_std_ammo_max 4000
+set g_turrets_unit_walker_std_ammo 500
+set g_turrets_unit_walker_std_ammo_recharge 100
+
+set g_turrets_unit_walker_std_aim_firetolerance_dist 64
+set g_turrets_unit_walker_std_aim_firetolerance_angle 16
+set g_turrets_unit_walker_std_aim_speed 90
+set g_turrets_unit_walker_std_aim_maxrot 360
+set g_turrets_unit_walker_std_aim_maxpitch 15
+
+set g_turrets_unit_walker_std_track_type 1
+
+// "Swively" homing rockets that sometimes loop
+set g_turrets_unit_walker_std_rocket_refire 10
+set g_turrets_unit_walker_std_rocket_dmg 50
+set g_turrets_unit_walker_std_rocket_radius 150
+set g_turrets_unit_walker_std_rocket_force 150
+set g_turrets_unit_walker_std_rocket_tunrate 0.5
+set g_turrets_unit_walker_std_rocket_speed 650
+set g_turrets_unit_walker_std_rocket_speed_add 2
+
+// Meele attack. Only happens when theres a target directly in front
+set g_turrets_unit_walker_std_meele_range 160
+set g_turrets_unit_walker_std_meele_dmg 200
+set g_turrets_unit_walker_std_meele_force 1000
\ No newline at end of file
Modified: branches/nexuiz-2.0/data/weapons.cfg
===================================================================
--- branches/nexuiz-2.0/data/weapons.cfg 2008-10-24 09:28:09 UTC (rev 4862)
+++ branches/nexuiz-2.0/data/weapons.cfg 2008-10-24 09:45:12 UTC (rev 4863)
@@ -1,243 +1,332 @@
-set g_start_weapon_laser 1
-set g_start_weapon_shotgun 1
-set g_start_weapon_uzi 0
-set g_start_weapon_grenadelauncher 0
-set g_start_weapon_electro 0
-set g_start_weapon_crylink 0
-set g_start_weapon_nex 0
-set g_start_weapon_hagar 0
-set g_start_weapon_rocketlauncher 0
-set g_start_weapon_minstanex 0
-set g_start_weapon_porto 0
-set g_start_weapon_hook 0
-set g_start_ammo_shells 50
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_pickup_shells 15
-set g_pickup_shells_max 999
-set g_pickup_nails 120
-set g_pickup_nails_max 999
-set g_pickup_rockets 15
-set g_pickup_rockets_max 999
-set g_pickup_cells 25
-set g_pickup_cells_max 999
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 999
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 999
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 999
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 999
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 999
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 999
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 999
-set g_pickup_respawntime_short 15
-set g_pickup_respawntime_medium 20
-set g_pickup_respawntime_long 30
-set g_pickup_respawntime_powerup 120
-
-set g_balance_laser_primary_damage 35
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 400
-set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 9000
-set g_balance_laser_primary_refire 0.7
-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 35
-set g_balance_laser_secondary_edgedamage 10
-set g_balance_laser_secondary_force 400
-set g_balance_laser_secondary_radius 70
-set g_balance_laser_secondary_speed 9000
-set g_balance_laser_secondary_refire 0.7
-set g_balance_laser_secondary_animtime 0.3
-set g_balance_laser_secondary_lifetime 30
-
-set g_balance_shotgun_primary_bullets 5
-set g_balance_shotgun_primary_damage 12
-set g_balance_shotgun_primary_force 60
-set g_balance_shotgun_primary_spread 0.08
-set g_balance_shotgun_primary_refire 0.5
-set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_secondary_bullets 5
-set g_balance_shotgun_secondary_damage 12
-set g_balance_shotgun_secondary_force 60
-set g_balance_shotgun_secondary_spread 0.12
-set g_balance_shotgun_secondary_refire 1.35
-set g_balance_shotgun_secondary_animtime 0.2
-set g_balance_shotgun_secondary_ammo 1
-
-set g_balance_uzi_first_damage 30
-set g_balance_uzi_first_force 50
-set g_balance_uzi_first_spread 0.01
-set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 16
-set g_balance_uzi_sustained_force 27
-set g_balance_uzi_sustained_spread 0.05
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_grenadelauncher_primary_damage 65
-set g_balance_grenadelauncher_primary_edgedamage 35
-set g_balance_grenadelauncher_primary_force 400
-set g_balance_grenadelauncher_primary_radius 140
-set g_balance_grenadelauncher_primary_speed 2000
-set g_balance_grenadelauncher_primary_speed_up 200
-set g_balance_grenadelauncher_primary_lifetime 30
-set g_balance_grenadelauncher_primary_refire 0.7
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_secondary_damage 65
-set g_balance_grenadelauncher_secondary_edgedamage 35
-set g_balance_grenadelauncher_secondary_force 400
-set g_balance_grenadelauncher_secondary_radius 140
-set g_balance_grenadelauncher_secondary_speed 1400
-set g_balance_grenadelauncher_secondary_speed_up 200
-set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_refire 0.6
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 10
-
-set g_balance_electro_primary_damage 80
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 200
-set g_balance_electro_primary_radius 150
-set g_balance_electro_primary_speed 2000
-set g_balance_electro_primary_lifetime 30
-set g_balance_electro_primary_refire 0.6
-set g_balance_electro_primary_animtime 0.3
-set g_balance_electro_primary_ammo 2
-set g_balance_electro_secondary_damage 60
-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 150
-set g_balance_electro_secondary_speed 900
-set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_lifetime 5
-set g_balance_electro_secondary_refire 0.3
-set g_balance_electro_secondary_animtime 0.3
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 5
-set g_balance_electro_combo_damage 70
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 200
-set g_balance_electro_combo_radius 250
-
-set g_balance_crylink_primary_damage 20
-set g_balance_crylink_primary_edgedamage 0
-set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 7000
-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.4
-set g_balance_crylink_primary_animtime 0.3
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.5
-
-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
-set g_balance_crylink_primary_other_fadetime 0.2
-
-set g_balance_crylink_secondary_damage 20
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -55
-set g_balance_crylink_secondary_radius 3
-set g_balance_crylink_secondary_speed 7000
-set g_balance_crylink_secondary_spread 0.08
-set g_balance_crylink_secondary_shots 7
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.5
-set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 2
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-
-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 140
-set g_balance_nex_force 600
-set g_balance_nex_refire 1.5
-set g_balance_nex_animtime 0.3
-set g_balance_nex_ammo 5
-
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-
-set g_balance_hagar_primary_damage 40
-set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 100
-set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.010
-set g_balance_hagar_primary_speed 3000
-set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.15
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary_damage 40
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 100
-set g_balance_hagar_secondary_radius 70
-set g_balance_hagar_secondary_spread 0.015
-set g_balance_hagar_secondary_speed 1400
-set g_balance_hagar_secondary_lifetime 30
-set g_balance_hagar_secondary_refire 0.15
-set g_balance_hagar_secondary_ammo 1
-
-set g_balance_rocketlauncher_damage 130
-set g_balance_rocketlauncher_edgedamage 50
-set g_balance_rocketlauncher_force 600
-set g_balance_rocketlauncher_radius 170
-set g_balance_rocketlauncher_speed 850
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 850
-set g_balance_rocketlauncher_lifetime 30
-set g_balance_rocketlauncher_refire 1
-set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 30
-set g_balance_rocketlauncher_detonatedelay 0.2 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_laserguided_speed 1000 //650
-set g_balance_rocketlauncher_laserguided_speedaccel 0
-set g_balance_rocketlauncher_laserguided_speedstart 1000
-set g_balance_rocketlauncher_laserguided_turnrate 0.75 //0.5
-set g_balance_rocketlauncher_laserguided_allow_steal 1
-
-// TESTING: port-o-launch
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_speed 2000
-set g_balance_porto_primary_lifetime 30
-set g_balance_porto_primary_ammo 25
-set g_balance_portal_health 200 // these get recharged whenever the portal is used
-set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
-
-// TESTING: on-hand hook with bomb
-set g_balance_hook_primary_ammo 0 // hook monkeys
-set g_balance_hook_primary_refire 0 // hook monkeys
-set g_balance_hook_primary_animtime 0.3 // good shoot anim
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 800 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 25 // a whole pack
-set g_balance_hook_secondary_lifetime 30 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.3 // good shoot anim
+set g_start_weapon_laser 1
+set g_start_weapon_shotgun 1
+set g_start_weapon_uzi 0
+set g_start_weapon_grenadelauncher 0
+set g_start_weapon_electro 0
+set g_start_weapon_crylink 0
+set g_start_weapon_nex 0
+set g_start_weapon_hagar 0
+set g_start_weapon_rocketlauncher 0
+set g_start_weapon_minstanex 0
+set g_start_weapon_porto 0
+set g_start_weapon_hook 0
+set g_start_weapon_hlac 0
+set g_start_weapon_seeker 0
+set g_start_ammo_shells 50
+set g_start_ammo_nails 0
+set g_start_ammo_rockets 0
+set g_start_ammo_cells 0
+set g_pickup_shells 15
+set g_pickup_shells_max 999
+set g_pickup_nails 120
+set g_pickup_nails_max 999
+set g_pickup_rockets 15
+set g_pickup_rockets_max 999
+set g_pickup_cells 25
+set g_pickup_cells_max 999
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 999
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 999
+set g_pickup_armorlarge 100
+set g_pickup_armorlarge_max 999
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 999
+set g_pickup_healthmedium 25
+set g_pickup_healthmedium_max 999
+set g_pickup_healthlarge 50
+set g_pickup_healthlarge_max 999
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 999
+set g_pickup_respawntime_short 15
+set g_pickup_respawntime_medium 20
+set g_pickup_respawntime_long 30
+set g_pickup_respawntime_powerup 120
+
+set g_balance_laser_primary_damage 35
+set g_balance_laser_primary_edgedamage 10
+set g_balance_laser_primary_force 400
+set g_balance_laser_primary_radius 70
+set g_balance_laser_primary_speed 9000
+set g_balance_laser_primary_refire 0.7
+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 35
+set g_balance_laser_secondary_edgedamage 10
+set g_balance_laser_secondary_force 400
+set g_balance_laser_secondary_radius 70
+set g_balance_laser_secondary_speed 9000
+set g_balance_laser_secondary_refire 0.7
+set g_balance_laser_secondary_animtime 0.3
+set g_balance_laser_secondary_lifetime 30
+
+set g_balance_shotgun_primary_bullets 5
+set g_balance_shotgun_primary_damage 12
+set g_balance_shotgun_primary_force 60
+set g_balance_shotgun_primary_spread 0.08
+set g_balance_shotgun_primary_refire 0.5
+set g_balance_shotgun_primary_animtime 0.2
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_secondary_bullets 5
+set g_balance_shotgun_secondary_damage 12
+set g_balance_shotgun_secondary_force 60
+set g_balance_shotgun_secondary_spread 0.12
+set g_balance_shotgun_secondary_refire 1.35
+set g_balance_shotgun_secondary_animtime 0.2
+set g_balance_shotgun_secondary_ammo 1
+
+set g_balance_uzi_first_damage 30
+set g_balance_uzi_first_force 50
+set g_balance_uzi_first_spread 0.01
+set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_ammo 1
+set g_balance_uzi_sustained_damage 16
+set g_balance_uzi_sustained_force 27
+set g_balance_uzi_sustained_spread 0.05
+set g_balance_uzi_sustained_refire 0.1
+set g_balance_uzi_sustained_ammo 1
+
+set g_balance_grenadelauncher_primary_damage 65
+set g_balance_grenadelauncher_primary_edgedamage 35
+set g_balance_grenadelauncher_primary_force 400
+set g_balance_grenadelauncher_primary_radius 140
+set g_balance_grenadelauncher_primary_speed 2000
+set g_balance_grenadelauncher_primary_speed_up 200
+set g_balance_grenadelauncher_primary_lifetime 30
+set g_balance_grenadelauncher_primary_refire 0.7
+set g_balance_grenadelauncher_primary_animtime 0.3
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_secondary_damage 65
+set g_balance_grenadelauncher_secondary_edgedamage 35
+set g_balance_grenadelauncher_secondary_force 400
+set g_balance_grenadelauncher_secondary_radius 140
+set g_balance_grenadelauncher_secondary_speed 1400
+set g_balance_grenadelauncher_secondary_speed_up 200
+set g_balance_grenadelauncher_secondary_lifetime 2.5
+set g_balance_grenadelauncher_secondary_refire 0.6
+set g_balance_grenadelauncher_secondary_animtime 0.3
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_secondary_health 10
+
+set g_balance_electro_primary_damage 80
+set g_balance_electro_primary_edgedamage 0
+set g_balance_electro_primary_force 200
+set g_balance_electro_primary_radius 150
+set g_balance_electro_primary_speed 2000
+set g_balance_electro_primary_lifetime 30
+set g_balance_electro_primary_refire 0.6
+set g_balance_electro_primary_animtime 0.3
+set g_balance_electro_primary_ammo 2
+set g_balance_electro_secondary_damage 60
+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 150
+set g_balance_electro_secondary_speed 900
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_lifetime 5
+set g_balance_electro_secondary_refire 0.3
+set g_balance_electro_secondary_animtime 0.3
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_health 5
+set g_balance_electro_combo_damage 70
+set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_combo_force 200
+set g_balance_electro_combo_radius 250
+
+set g_balance_crylink_primary_damage 20
+set g_balance_crylink_primary_edgedamage 0
+set g_balance_crylink_primary_force -55
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_speed 7000
+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.4
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_ammo 2
+set g_balance_crylink_primary_bouncedamagefactor 0.5
+
+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
+set g_balance_crylink_primary_other_fadetime 0.2
+
+set g_balance_crylink_secondary_damage 20
+set g_balance_crylink_secondary_edgedamage 0
+set g_balance_crylink_secondary_force -55
+set g_balance_crylink_secondary_radius 3
+set g_balance_crylink_secondary_speed 7000
+set g_balance_crylink_secondary_spread 0.08
+set g_balance_crylink_secondary_shots 7
+set g_balance_crylink_secondary_bounces 0
+set g_balance_crylink_secondary_refire 0.5
+set g_balance_crylink_secondary_animtime 0.3
+set g_balance_crylink_secondary_ammo 2
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
+
+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 140
+set g_balance_nex_force 600
+set g_balance_nex_refire 1.5
+set g_balance_nex_animtime 0.3
+set g_balance_nex_ammo 5
+
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 0.3
+set g_balance_minstanex_ammo 10
+
+set g_balance_hagar_primary_damage 40
+set g_balance_hagar_primary_edgedamage 15
+set g_balance_hagar_primary_force 100
+set g_balance_hagar_primary_radius 70
+set g_balance_hagar_primary_spread 0.010
+set g_balance_hagar_primary_speed 3000
+set g_balance_hagar_primary_lifetime 30
+set g_balance_hagar_primary_refire 0.15
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_secondary_damage 40
+set g_balance_hagar_secondary_edgedamage 15
+set g_balance_hagar_secondary_force 100
+set g_balance_hagar_secondary_radius 70
+set g_balance_hagar_secondary_spread 0.015
+set g_balance_hagar_secondary_speed 1400
+set g_balance_hagar_secondary_lifetime 30
+set g_balance_hagar_secondary_refire 0.15
+set g_balance_hagar_secondary_ammo 1
+
+set g_balance_rocketlauncher_damage 130
+set g_balance_rocketlauncher_edgedamage 50
+set g_balance_rocketlauncher_force 600
+set g_balance_rocketlauncher_radius 170
+set g_balance_rocketlauncher_speed 850
+set g_balance_rocketlauncher_speedaccel 0
+set g_balance_rocketlauncher_speedstart 850
+set g_balance_rocketlauncher_lifetime 30
+set g_balance_rocketlauncher_refire 1
+set g_balance_rocketlauncher_animtime 0.3
+set g_balance_rocketlauncher_ammo 3
+set g_balance_rocketlauncher_health 30
+set g_balance_rocketlauncher_detonatedelay 0.2 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_laserguided_speed 1000 //650
+set g_balance_rocketlauncher_laserguided_speedaccel 0
+set g_balance_rocketlauncher_laserguided_speedstart 1000
+set g_balance_rocketlauncher_laserguided_turnrate 0.75 //0.5
+set g_balance_rocketlauncher_laserguided_allow_steal 1
+
+// TESTING: port-o-launch
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_speed 2000
+set g_balance_porto_primary_lifetime 30
+set g_balance_porto_primary_ammo 25
+set g_balance_portal_health 200 // these get recharged whenever the portal is used
+set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
+
+// TESTING: on-hand hook with bomb
+set g_balance_hook_primary_ammo 0 // hook monkeys
+set g_balance_hook_primary_refire 0 // hook monkeys
+set g_balance_hook_primary_animtime 0.3 // good shoot anim
+set g_balance_hook_secondary_damage 25 // not much
+set g_balance_hook_secondary_edgedamage 5 // not much
+set g_balance_hook_secondary_radius 800 // LOTS
+set g_balance_hook_secondary_force -2000 // LOTS
+set g_balance_hook_secondary_ammo 25 // a whole pack
+set g_balance_hook_secondary_lifetime 30 // infinite
+set g_balance_hook_secondary_speed 0 // not much throwing
+set g_balance_hook_secondary_gravity 5 // fast falling
+set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
+set g_balance_hook_secondary_animtime 0.3 // good shoot anim
+
+// HLAC
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_primary_spread_max 0.25
+set g_balance_hlac_primary_spread_add 0.0045
+set g_balance_hlac_primary_spread_crouchmod 0.25
+
+set g_balance_hlac_primary_damage 30
+set g_balance_hlac_primary_edgedamage 10
+set g_balance_hlac_primary_force 100
+set g_balance_hlac_primary_radius 70
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_lifetime 5
+
+set g_balance_hlac_primary_refire 0.1
+set g_balance_hlac_primary_animtime 0.1
+set g_balance_hlac_primary_ammo 1
+
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+
+set g_balance_hlac_secondary_damage 30
+set g_balance_hlac_secondary_edgedamage 10
+set g_balance_hlac_secondary_force 150
+set g_balance_hlac_secondary_radius 100
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_lifetime 5
+
+set g_balance_hlac_secondary_refire 1
+set g_balance_hlac_secondary_animtime 0.3
+set g_balance_hlac_secondary_ammo 10
+
+
+// TAG Seeker
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.1
+set g_balance_seeker_tag_refire 0.7
+
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_activate_delay 0.1
+
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_decel 0.9
+
+set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_turnrate 0.65
+
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_force 250
+
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_refire 0.5
+set g_balance_seeker_missile_animtime 0.25
+set g_balance_seeker_missile_ammo 2
+
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_proxy_delay 0.2
+
+// World avoidance
+set g_balance_seeker_missile_smart 1
+set g_balance_seeker_missile_smart_mindist 800
+set g_balance_seeker_missile_smart_trace_max 2500
+set g_balance_seeker_missile_smart_trace_min 1000
+// End new seeker
+
+
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_spread 0.25
+
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_force 50
+
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_ammo 0.5
+
+
More information about the nexuiz-commits
mailing list