]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote branch 'refs/remotes/origin/divVerent/tag_seeker'
authorRudolf Polzer <divverent@alientrap.org>
Sun, 9 May 2010 18:01:03 +0000 (20:01 +0200)
committerRudolf Polzer <divverent@alientrap.org>
Sun, 9 May 2010 18:01:03 +0000 (20:01 +0200)
41 files changed:
balance.cfg
balance25.cfg
balanceSamual.cfg
balanceXPM.cfg
defaultXonotic.cfg
gfx/crosshairseeker.tga [new file with mode: 0644]
gfx/hud/inv_weapon13.tga
gfx/hud/inv_weaponseeker.tga [new file with mode: 0644]
models/tagrocket.md3 [new file with mode: 0644]
models/tagrocket.tga [new file with mode: 0644]
models/weapons/g_seeker.md3 [new file with mode: 0644]
models/weapons/h_seeker.dpm [new file with mode: 0644]
models/weapons/h_seeker.dpm.framegroups [new file with mode: 0644]
models/weapons/v_seeker.md3 [new file with mode: 0644]
qcsrc/client/View.qc
qcsrc/client/damage.qc
qcsrc/client/projectile.qc
qcsrc/common/constants.qh
qcsrc/server/bot/havocbot/role_onslaught.qc
qcsrc/server/t_items.qc
qcsrc/server/w_all.qc
qcsrc/server/w_seeker.qc [new file with mode: 0644]
sound/weapons/flac_fire.ogg [new file with mode: 0644]
sound/weapons/flacexp1.ogg [new file with mode: 0644]
sound/weapons/flacexp2.ogg [new file with mode: 0644]
sound/weapons/flacexp3.ogg [new file with mode: 0644]
sound/weapons/seeker_fire.ogg [new file with mode: 0644]
sound/weapons/seekerexp1.ogg [new file with mode: 0644]
sound/weapons/seekerexp2.ogg [new file with mode: 0644]
sound/weapons/seekerexp3.ogg [new file with mode: 0644]
sound/weapons/tag_fire.ogg [new file with mode: 0644]
sound/weapons/tag_impact.ogg [new file with mode: 0644]
sound/weapons/tag_rocket_fly.ogg [new file with mode: 0644]
sound/weapons/tagexp1.ogg [new file with mode: 0644]
sound/weapons/tagexp2.ogg [new file with mode: 0644]
sound/weapons/tagexp3.ogg [new file with mode: 0644]
textures/seeker.tga [new file with mode: 0644]
textures/seeker_gloss.tga [new file with mode: 0644]
textures/seeker_glow.tga [new file with mode: 0644]
textures/seeker_norm.tga [new file with mode: 0644]
textures/seeker_pants.tga [new file with mode: 0644]

index 0a4d8cf7f07cdaf245a6fe867e0f29a26b875eaf..b7750d4d7b06fcd82d95ca562776a9d5920f1cea 100644 (file)
@@ -20,6 +20,7 @@ set g_weaponreplace_hlac ""
 set g_weaponreplace_campingrifle ""
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball ""
+set g_weaponreplace_seeker ""
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
 // }}}
 
@@ -40,6 +41,7 @@ set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_balance_health_start 100
 set g_balance_armor_start 0
 set g_start_ammo_shells 45
@@ -592,3 +594,54 @@ set g_balance_fireball_secondary_speed_up 100
 set g_balance_fireball_secondary_speed_z 0
 set g_balance_fireball_secondary_spread 0
 // }}}
+// {{{ seeker
+set g_balance_seeker_flac_ammo 0.5
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+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
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.3
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index 6f36e9bc503874ab185662fa52f00fb7550b26a5..2f4ca97bcfa62f87fbcfecf71483e7963f8f6087 100644 (file)
@@ -20,6 +20,7 @@ set g_weaponreplace_hlac ""
 set g_weaponreplace_campingrifle ""
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball ""
+set g_weaponreplace_seeker ""
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
 // }}}
 
@@ -40,6 +41,7 @@ set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_balance_health_start 150
 set g_balance_armor_start 0
 set g_start_ammo_shells 40
@@ -592,3 +594,54 @@ set g_balance_fireball_secondary_speed_up 100
 set g_balance_fireball_secondary_speed_z 0
 set g_balance_fireball_secondary_spread 0
 // }}}
+// {{{ seeker
+set g_balance_seeker_flac_ammo 0.5
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+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
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.3
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index c4aa8d5a9f8e71342d21bb103ac5d38e245b5635..e633c74329de875a5013c4b7cbc334b6ccee1a03 100644 (file)
@@ -20,6 +20,7 @@ set g_weaponreplace_hlac 0 // I don't particularly like this weapon.
 set g_weaponreplace_campingrifle ""
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball 0 // Don't kill me div0, just for now until I figure out a good balance for it.
+set g_weaponreplace_seeker ""
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
 // }}}
 
@@ -40,6 +41,7 @@ set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_balance_health_start 100
 set g_balance_armor_start 0
 set g_start_ammo_shells 45
@@ -592,3 +594,54 @@ set g_balance_fireball_secondary_speed_up 100
 set g_balance_fireball_secondary_speed_z 0
 set g_balance_fireball_secondary_spread 0
 // }}}
+// {{{ seeker
+set g_balance_seeker_flac_ammo 0.5
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+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
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.3
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index d5c048ed1aaf636aadb5e3c5a001f04930dc7597..4d2fd05f6905a9f69c1606c8cb2c9fcef166b9c7 100644 (file)
@@ -19,6 +19,7 @@ set g_weaponreplace_hlac 0
 set g_weaponreplace_campingrifle 0
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball 0
+set g_weaponreplace_seeker 0
 set sv_q3acompat_machineshotgunswap 0
 // }}}
 
@@ -39,6 +40,7 @@ set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_balance_health_start 125
 set g_balance_armor_start 0
 set g_start_ammo_shells 0
@@ -592,3 +594,54 @@ set g_balance_fireball_secondary_speed_up 100
 set g_balance_fireball_secondary_speed_z 0
 set g_balance_fireball_secondary_spread 0
 // }}}
+// {{{ seeker
+set g_balance_seeker_flac_ammo 0.5
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+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
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.3
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index add2de9b5932fe8386fb854f2663162ddaf09980..699503aeaa8c52f6428726f816d13a50f77a3105 100644 (file)
@@ -193,6 +193,12 @@ seta crosshair_hlac_color_green 0.65       "crosshair color green component to display
 seta crosshair_hlac_color_blue 0.2     "crosshair color blue component to display when wielding the H.L.A.C."
 seta crosshair_hlac_color_alpha 1      "crosshair alpha value to display when wielding the H.L.A.C."
 seta crosshair_hlac_size 0.6   "crosshair size when wielding the H.L.A.C."
+seta crosshair_seeker ""       "crosshair to display when wielding the TAG Seeker"
+seta crosshair_seeker_color_red 1      "crosshair color red component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_green 0.35 "crosshair color green component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_blue 0.35  "crosshair color blue component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_alpha 0.9  "crosshair alpha value to display when wielding the TAG seeker"
+seta crosshair_seeker_size 0.8 "crosshair size when wielding the TAG seeker"
 seta crosshair_campingrifle "" "crosshair to display when wielding the campingrifle"
 seta crosshair_campingrifle_color_red 0.85     "crosshair color red component to display when wielding the campingrifle"
 seta crosshair_campingrifle_color_green 0.5    "crosshair color green component to display when wielding the campingrifle"
diff --git a/gfx/crosshairseeker.tga b/gfx/crosshairseeker.tga
new file mode 100644 (file)
index 0000000..7311550
Binary files /dev/null and b/gfx/crosshairseeker.tga differ
index ba59acaf143a73b01261307cc95c6051313054d3..0a8cf7ed023f1c5ae882d69cd178e6dfb158f081 100644 (file)
Binary files a/gfx/hud/inv_weapon13.tga and b/gfx/hud/inv_weapon13.tga differ
diff --git a/gfx/hud/inv_weaponseeker.tga b/gfx/hud/inv_weaponseeker.tga
new file mode 100644 (file)
index 0000000..0a8cf7e
Binary files /dev/null and b/gfx/hud/inv_weaponseeker.tga differ
diff --git a/models/tagrocket.md3 b/models/tagrocket.md3
new file mode 100644 (file)
index 0000000..8e0279e
Binary files /dev/null and b/models/tagrocket.md3 differ
diff --git a/models/tagrocket.tga b/models/tagrocket.tga
new file mode 100644 (file)
index 0000000..adf0a8c
Binary files /dev/null and b/models/tagrocket.tga differ
diff --git a/models/weapons/g_seeker.md3 b/models/weapons/g_seeker.md3
new file mode 100644 (file)
index 0000000..db25bf5
Binary files /dev/null and b/models/weapons/g_seeker.md3 differ
diff --git a/models/weapons/h_seeker.dpm b/models/weapons/h_seeker.dpm
new file mode 100644 (file)
index 0000000..dd94bbc
Binary files /dev/null and b/models/weapons/h_seeker.dpm differ
diff --git a/models/weapons/h_seeker.dpm.framegroups b/models/weapons/h_seeker.dpm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/v_seeker.md3 b/models/weapons/v_seeker.md3
new file mode 100644 (file)
index 0000000..8a21e65
Binary files /dev/null and b/models/weapons/v_seeker.md3 differ
index 2c898bbcbb5470a5ffbd5ee39cd5d62384b60f8a..0557db1160be5c4a8d0e7d4ae9339e9b72837aae 100644 (file)
@@ -291,6 +291,10 @@ float TrueAimCheck()
                        mi = '-16 -16 -16';
                        ma = '16 16 16';
                        break;
+               case WEP_SEEKER: // projectile has a size!
+                       mi = '-2 -2 -2';
+                       ma = '2 2 2';
+                       break;
                case WEP_ELECTRO: // projectile has a size!
                        mi = '0 0 -3';
                        ma = '0 0 -3';
index 59e84690b852e95353118c3d7e390b37733f1a67..9e90bee2240161c7293450712830d826fac63b53 100644 (file)
@@ -218,6 +218,56 @@ void Ent_DamageInfo(float isNew)
                                if(!issilent)
                                        sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
                                break;
+                       case WEP_SEEKER:
+                               org2 = org + backoff * 6;
+                               if(secondary)
+                               {
+                                       pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
+                                       if(!issilent)
+                                       {
+                                               if (r<0.15)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
+                                               else if (r<0.7)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
+                                               else
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
+                                       }
+                               }
+                               else
+                               {
+                                       if(bounce)
+                                       {
+                                               pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                                               if(!issilent)
+                                               {
+                                                       if (r<0.15)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
+                                                       else if (r<0.7)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
+                                                       else
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
+                                               }
+                                       }
+                                       else if(headshot)
+                                       {
+                                               if(!issilent)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+                                       }
+                                       else
+                                       {
+                                               pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                                               if(!issilent)
+                                               {
+                                                       if (r<0.15)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
+                                                       else if (r<0.7)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
+                                                       else
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
+                                               }
+                                       }
+                               }
+                               break;
                        case WEP_HLAC:
                                org2 = org + backoff * 6;
                                pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
@@ -265,6 +315,9 @@ void DamageInfo_Precache()
        precache_sound("weapons/crylink_impact.wav");
        precache_sound("weapons/electro_impact.wav");
        precache_sound("weapons/electro_impact_combo.wav");
+       precache_sound("weapons/flacexp1.wav");
+       precache_sound("weapons/flacexp2.wav");
+       precache_sound("weapons/flacexp3.wav");
        precache_sound("weapons/grenade_impact.wav");
        precache_sound("weapons/hagexp1.wav");
        precache_sound("weapons/hagexp2.wav");
@@ -281,4 +334,11 @@ void DamageInfo_Precache()
        precache_sound("weapons/rocket_impact.wav");
        precache_sound("weapons/fireball_impact.wav");
        precache_sound("weapons/fireball_impact2.wav");
+       precache_sound("weapons/seekerexp1.wav");
+       precache_sound("weapons/seekerexp2.wav");
+       precache_sound("weapons/seekerexp3.wav");
+       precache_sound("weapons/tagexp1.wav");
+       precache_sound("weapons/tagexp2.wav");
+       precache_sound("weapons/tagexp3.wav");
+       precache_sound("weapons/tag_impact.wav");
 }
index dc5183f28b037a16deac05755acb20b54c6f8819..7072a1b59af8705fbe4dddeba768bd6c29c2958f 100644 (file)
@@ -270,6 +270,9 @@ void Ent_Projectile()
                        case PROJECTILE_HAGAR_BOUNCING: setmodel(self, "models/hagarmissile.mdl");self.traileffect = particleeffectnum("TR_GRENADE"); self.scale = 0.4; break;
                        case PROJECTILE_FIREBALL: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("fireball"); break; // particle effect is good enough
                        case PROJECTILE_FIREMINE: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("firemine"); break; // particle effect is good enough
+                       case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break;
+                       case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; self.traileffect = particleeffectnum("TR_ROCKET"); break;
+                       case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.scale = 2; self.traileffect = particleeffectnum("TR_ROCKET"); break;
                        default:
                                error("Received invalid CSQC projectile, can't work with this!");
                                break;
@@ -341,6 +344,19 @@ void Ent_Projectile()
                                self.mins = '-4 -4 -4';
                                self.maxs = '4 4 4';
                                break;
+                       case PROJECTILE_TAG:
+                               loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               self.mins = '-2 -2 -2';
+                               self.maxs = '2 2 2';
+                               break;
+                       case PROJECTILE_FLAC:
+                               self.mins = '-2 -2 -2';
+                               self.maxs = '2 2 2';
+                               break;
+                       case PROJECTILE_SEEKER:
+                               self.mins = '-4 -4 -4';
+                               self.maxs = '4 4 4';
+                               break;
                        default:
                                break;
                }
@@ -378,9 +394,11 @@ void Projectile_Precache()
        precache_model("models/laser.mdl");
        precache_model("models/plasmatrail.mdl");
        precache_model("models/rocket.md3");
+       precache_model("models/tagrocket.md3");
        precache_model("models/tracer.mdl");
        precache_sound("weapons/electro_fly.wav");
        precache_sound("weapons/rocket_fly.wav");
        precache_sound("weapons/fireball_fly.wav");
        precache_sound("weapons/fireball_fly2.wav");
+       precache_sound("weapons/tag_rocket_fly.wav");
 }
index 5daa3e51f740f00b405385cd7808ac49a7ecaa65..cdf92f0709035ad3a2dc012518ab84b06fe08db5 100644 (file)
@@ -410,6 +410,7 @@ float       ATTN_MAX                                = 3.984375;
 // this sets sounds and other properties of the projectiles in csqc
 float PROJECTILE_ELECTRO = 1;
 float PROJECTILE_ROCKET = 2;
+float PROJECTILE_TAG = 3;
 float PROJECTILE_BULLET = 4;
 float PROJECTILE_CRYLINK = 5;
 float PROJECTILE_ELECTRO_BEAM = 6;
@@ -417,6 +418,8 @@ float PROJECTILE_GRENADE = 7;
 float PROJECTILE_GRENADE_BOUNCING = 8;
 float PROJECTILE_LASER = 9;
 float PROJECTILE_HLAC = 10;
+float PROJECTILE_SEEKER = 11;
+float PROJECTILE_FLAC = 12;
 float PROJECTILE_PORTO_RED = 13;
 float PROJECTILE_PORTO_BLUE = 14;
 float PROJECTILE_HOOKBOMB = 15;
index 9e905a7d889c45a3205b7c5f01e5dd16491bcd2d..3268daefa5a5ae601056dc02a1b6d6142ee3662f 100644 (file)
@@ -38,7 +38,7 @@ void havocbot_goalrating_ons_offenseitems(float ratingscale, vector org, float s
        for(i = WEP_FIRST; i < WEP_LAST ; ++i)
        {
                // Find weapon
-               if((get_weaponinfo(i)).weapons & self.weapons)
+               if(power2of(i-1) & self.weapons)
                if(++c>=4)
                        break;
        }
index d9c3240603852704483caeea7b341d8195221120..02ad99fc991c9917f14484e118a154ed16f4037b 100644 (file)
@@ -1487,12 +1487,6 @@ void spawnfunc_item_jetpack(void)
        StartItem ("models/items/g_jetpack.md3", "misc/itempickup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Jet pack", IT_JETPACK, 0, FL_POWERUP, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
 }
 
-// we no longer have the seeker
-void spawnfunc_weapon_seeker()
-{
-       spawnfunc_weapon_fireball();
-}
-
 
 #define OP_SET 0
 #define OP_MIN 1
index fdb02cf6bff7e3815c781741a68a2d0343c1e038..9a9b3830244602e00861704efe6716a2229f6304 100644 (file)
@@ -14,3 +14,4 @@
 #include "w_tuba.qc"
 #include "w_campingrifle.qc"
 #include "w_fireball.qc"
+#include "w_seeker.qc"
diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc
new file mode 100644 (file)
index 0000000..c50e13c
--- /dev/null
@@ -0,0 +1,478 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 9, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "seeker", "seeker", "T.A.G. Seeker");
+#else
+//.float speed; = switchweapon
+//.float proxytime; = autoswitch
+//.float tl; = wait
+
+void Seeker_Missile_Explode ()
+{
+       self.event_damage = SUB_Null;
+       RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
+
+       remove (self);
+}
+
+void Seeker_Missile_Touch()
+{
+       PROJECTILE_TOUCH;
+
+       Seeker_Missile_Explode();
+}
+
+void Seeker_Missile_Think()
+{
+       entity e;
+       vector desireddir, olddir, newdir, eorg;
+       float turnrate;
+       float dist;
+
+       if (time > self.cnt)
+               Seeker_Missile_Explode();
+
+       if (!self.switchweapon)
+               self.switchweapon = cvar("g_balance_seeker_missile_speed");
+
+       if ((self.switchweapon < cvar("g_balance_seeker_missile_speed_max")) && cvar("g_balance_seeker_missile_speed_accel"))
+               self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_accel");
+
+       if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max"))
+               self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel");
+
+       if (self.enemy != world)
+               if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+                       self.enemy = world;
+
+       if (self.enemy != world)
+       {
+               e               = self.enemy;
+               eorg            = 0.5 * (e.absmin + e.absmax);
+               turnrate        = cvar("g_balance_seeker_missile_turnrate");                // how fast to turn
+               desireddir      = normalize(eorg - self.origin);
+               olddir          = normalize(self.velocity);                                         // get my current direction
+               dist            = vlen(eorg - self.origin);
+
+               // Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
+               if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
+               {
+                       // Is it a better idea (shorter distance) to trace to the target itself?
+                       if ( vlen(self.origin + olddir * self.wait) < dist)
+                               traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
+                       else
+                               traceline(self.origin, eorg, FALSE, self);
+
+                       // Setup adaptive tracelength
+                       self.wait = vlen(self.origin - trace_endpos);
+                       if (self.wait < cvar("g_balance_seeker_missile_smart_trace_min")) self.wait = cvar("g_balance_seeker_missile_smart_trace_min");
+                       if (self.wait > cvar("g_balance_seeker_missile_smart_trace_max")) self.wait = cvar("g_balance_seeker_missile_smart_trace_max");
+
+                       // Calc how important it is that we turn and add this to the desierd (enemy) dir.
+                       desireddir  = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
+               }
+
+               //newdir = normalize((olddir + desireddir * turnrate) * 0.5);// take the average of the 2 directions; not the best method but simple & easy
+               newdir = normalize(olddir + desireddir * turnrate);// take the average of the 2 directions; not the best method but simple & easy
+
+               self.velocity = newdir * self.switchweapon;                                         // make me fly in the new direction at my flight speed
+       }
+
+       // Proxy
+       if (cvar("g_balance_seeker_missile_proxy"))
+       {
+               if ( dist <= cvar("g_balance_seeker_missile_proxy_maxrange"))
+               {
+                       if (self.autoswitch == 0)
+                       {
+                               self.autoswitch = time + cvar("g_balance_seeker_missile_proxy_delay");
+                       }
+                       else
+                       {
+                               if (self.autoswitch <= time)
+                               {
+                                       Seeker_Missile_Explode();
+                                       self.autoswitch = 0;
+                               }
+                       }
+               }
+               else
+               {
+                       if (self.autoswitch != 0)
+                               self.autoswitch = 0;
+               }
+       }
+       ///////////////
+
+       if (self.enemy.deadflag != DEAD_NO)
+       {
+               self.enemy = world;
+               self.cnt = time + 1 + (random() * 4);
+               self.nextthink = self.cnt;
+               return;
+       }
+
+       self.angles = vectoangles(self.velocity);                       // turn model in the new flight direction
+       self.nextthink = time + 0.05;
+
+       UpdateCSQCProjectile(self);
+}
+
+
+
+void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       float d;
+       d = damage;
+
+       if (self.health <= 0)
+               return;
+
+       if (self.owner == attacker)
+               d = d * 0.25;
+
+       self.health = self.health - d;
+
+       if (self.health <= 0)
+               W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
+}
+
+void Seeker_Missile_Animate()
+{
+       self.frame = self.frame +1;
+       self.nextthink = time + 0.05;
+
+       if (self.enemy != world)
+               if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+                       self.enemy = world;
+
+       if(self.frame == 5)
+       {
+               self.think           = Seeker_Missile_Think;
+               self.nextthink       = time;// + cvar("g_balance_seeker_missile_activate_delay"); // cant dealy with csqc projectiles
+
+               if (cvar("g_balance_seeker_guided_proxy"))
+                       self.movetype    = MOVETYPE_BOUNCEMISSILE;
+               else
+                       self.movetype    = MOVETYPE_FLYMISSILE;
+       }
+
+       UpdateCSQCProjectile(self);
+}
+
+void Seeker_Fire_Missile(vector f_diff)
+{
+       local entity missile;
+
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
+
+       makevectors(self.v_angle);
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", cvar("g_balance_seeker_missile_damage"));
+       w_shotorg += f_diff;
+       pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+       //self.detornator         = FALSE;
+
+       missile                 = spawn();
+       missile.owner           = self;
+       missile.classname       = "seeker_missile";
+       missile.bot_dodge       = TRUE;
+       missile.bot_dodgerating = cvar("g_balance_seeker_missile_damage");
+
+       missile.think           = Seeker_Missile_Animate;
+
+       //if (!cvar("g_balance_seeker_missile_proxy"))
+       missile.touch           = Seeker_Missile_Touch;
+
+       missile.event_damage    = Seeker_Missile_Damage;
+       missile.nextthink       = time;// + 0.2;// + cvar("g_balance_seeker_missile_activate_delay");
+       missile.cnt             = time + cvar("g_balance_seeker_missile_lifetime");
+       missile.enemy           = self.enemy;
+       missile.solid           = SOLID_BBOX;
+       missile.scale           = 2;
+       missile.takedamage          = DAMAGE_YES;
+       missile.health          = cvar("g_balance_seeker_missile_health");
+       missile.damageforcescale = cvar("g_balance_seeker_missile_damageforcescale");
+       missile.projectiledeathtype = WEP_SEEKER;
+
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-4 -4 -4', '4 4 4');
+
+
+       missile.movetype    = MOVETYPE_FLYMISSILE;// MOVETYPE_TOSS;
+
+       missile.flags       = FL_PROJECTILE;
+
+       W_SETUPPROJECTILEVELOCITY_UP(missile, g_balance_seeker_missile);
+
+       missile.switchweapon = vlen(missile.velocity);
+       missile.angles = vectoangles (missile.velocity);
+
+       CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
+}
+
+void Seeker_Vollycontroler_Think()
+{
+       float c;
+       entity oldself,oldenemy;
+       self.cnt = self.cnt - 1;
+
+       if ((self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO))
+       {
+               remove(self);
+               return;
+       }
+
+       self.nextthink = time + cvar("g_balance_seeker_missile_delay");
+
+       oldself = self;
+       self = self.owner;
+
+       oldenemy = self.enemy;
+       self.enemy = oldself.enemy;
+
+       c = mod(oldself.cnt, 4);
+       switch(c)
+       {
+               case 0:
+                       Seeker_Fire_Missile('-1.25 -3.75 0');
+                       break;
+               case 1:
+                       Seeker_Fire_Missile('+1.25 -3.75 0');
+                       break;
+               case 2:
+                       Seeker_Fire_Missile('-1.25 +3.75 0');
+                       break;
+               case 3:
+               default:
+                       Seeker_Fire_Missile('+1.25 +3.75 0');
+                       break;
+       }
+
+       self.enemy = oldenemy;
+       self = oldself;
+}
+
+void Seeker_Tag_Explode ()
+{
+       //if(other==self.owner)
+       //    return;
+       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self);
+
+       remove (self);
+}
+
+void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       if (self.health <= 0)
+               return;
+       self.health = self.health - damage;
+       if (self.health <= 0)
+               Seeker_Tag_Explode();
+}
+
+void Seeker_Tag_Think()
+{
+       remove(self);
+       return;
+}
+
+void Seeker_Tag_Touch()
+{
+       vector dir;
+       vector org2;
+
+       dir     = normalize (self.owner.origin - self.origin);
+       org2    = findbetterlocation (self.origin, 8);
+
+       te_knightspike(org2);
+
+       self.event_damage = SUB_Null;
+       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT, self);
+
+       if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
+       {
+               entity e;
+               e           = spawn();
+               e.cnt       = cvar("g_balance_seeker_missile_count");
+               e.owner     = self.owner;
+               e.enemy     = other;
+               e.think     = Seeker_Vollycontroler_Think;
+               e.nextthink = time;
+
+               //sprint(self.owner, "^1Target lock ^3[^7 ",other.netname, " ^3]^1 acquired - autofire activated.\n");
+               //sprint(other,"^1You are targeted!\n");
+
+               // stuffcmd(other,"play2 weapons/zany-alarm4.ogg\n");
+               // stuffcmd(self.owner, "play2 weapons/zany-lock4.ogg\n");
+       }
+
+       remove(self);
+       return;
+}
+
+
+
+void Seeker_Fire_Tag()
+{
+       local entity missile;
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
+
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", 0);
+
+       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 + cvar("g_balance_seeker_tag_lifetime");
+       missile.movetype        = MOVETYPE_FLY;
+       missile.solid           = SOLID_BBOX;
+       missile.owner           = self;
+
+       missile.takedamage       = DAMAGE_YES;
+       missile.event_damage    = Seeker_Tag_Explode;
+       missile.health          = cvar("g_balance_seeker_tag_health");
+       missile.damageforcescale = cvar("g_balance_seeker_tag_damageforcescale");
+
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-2 -2 -2', '2 2 2');
+
+       missile.flags       = FL_PROJECTILE;
+
+       missile.movetype    = MOVETYPE_FLY;
+       W_SETUPPROJECTILEVELOCITY(missile, g_balance_seeker_tag);
+       missile.angles = vectoangles (missile.velocity);
+
+       CSQCProjectile(missile, TRUE, PROJECTILE_TAG, FALSE); // has sound
+}
+
+
+void Seeker_Flac_Explode ()
+{
+       self.event_damage = SUB_Null;
+
+       RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
+
+       remove (self);
+}
+
+void Seeker_Flac_Touch()
+{
+       PROJECTILE_TOUCH;
+
+       Seeker_Flac_Explode();
+}
+
+void Seeker_Fire_Flac()
+{
+       local entity missile;
+       vector f_diff;
+       float c;
+
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
+
+       c = mod(self.bulletcounter, 4);
+       switch(c)
+       {
+               case 0:
+                       f_diff = '-1.25 -3.75 0';
+                       break;
+               case 1:
+                       f_diff = '+1.25 -3.75 0';
+                       break;
+               case 2:
+                       f_diff = '-1.25 +3.75 0';
+                       break;
+               case 3:
+               default:
+                       f_diff = '+1.25 +3.75 0';
+                       break;
+       }
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", cvar("g_balance_seeker_flac_damage"));
+       w_shotorg += f_diff;
+
+       pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+       missile = spawn ();
+       missile.owner = missile.realowner = self;
+       missile.classname = "missile";
+       missile.bot_dodge = TRUE;
+       missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
+       missile.touch = Seeker_Flac_Explode;
+       missile.use = Seeker_Flac_Explode;
+       missile.think = Seeker_Flac_Explode;
+       missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
+       missile.solid = SOLID_BBOX;
+       missile.scale = 0.4; // BUG: the model is too big
+       missile.projectiledeathtype = WEP_SEEKER;
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-2 -2 -2', '2 2 2');
+       missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
+
+       missile.movetype = MOVETYPE_FLY;
+       W_SETUPPROJECTILEVELOCITY_UP(missile, g_balance_seeker_flac);
+
+       missile.angles = vectoangles (missile.velocity);
+       missile.flags = FL_PROJECTILE;
+
+       CSQCProjectile(missile, TRUE, PROJECTILE_FLAC, TRUE);
+}
+
+void spawnfunc_weapon_seeker (void)
+{
+       weapon_defaultspawnfunc(WEP_SEEKER);
+}
+
+float w_seeker(float req)
+{
+       if (req == WR_AIM)
+               self.BUTTON_ATCK = bot_aim(cvar("g_balance_seeker_tag_speed"), 0, 20, FALSE);
+
+       else if (req == WR_THINK)
+       {
+               if (self.BUTTON_ATCK)
+                       if (weapon_prepareattack(0, cvar("g_balance_seeker_tag_refire")))
+                       {
+                               Seeker_Fire_Tag();
+                               weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_seeker_tag_animtime"), w_ready);
+                       }
+
+               if (self.BUTTON_ATCK2)
+                       if (weapon_prepareattack(1, cvar("g_balance_seeker_flac_refire")))
+                       {
+                               Seeker_Fire_Flac();
+                               weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_seeker_flac_animtime"), w_ready);
+                       }
+
+       }
+       else if (req == WR_PRECACHE)
+       {
+               precache_model ("models/weapons/g_seeker.md3");
+               precache_model ("models/weapons/v_seeker.md3");
+               precache_model ("models/weapons/h_seeker.dpm");
+               precache_sound ("weapons/tag_fire.wav");
+               precache_sound ("weapons/flac_fire.wav");
+               precache_sound ("weapons/seeker_fire.wav");
+       }
+       else if (req == WR_SETUP)
+               weapon_setup(WEP_SEEKER);
+       else if (req == WR_CHECKAMMO1)
+               return self.ammo_rockets >= cvar("g_balance_seeker_tag_ammo") + cvar("g_balance_seeker_missile_ammo");
+       else if (req == WR_CHECKAMMO2)
+               return self.ammo_rockets >= cvar("g_balance_seeker_flac_ammo");
+       else if (req == WR_SUICIDEMESSAGE)
+               w_deathtypestring = "played with tiny rockets";
+       else if (req == WR_KILLMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       w_deathtypestring = "ran into #'s flac";
+               else
+                       w_deathtypestring = "was tagged by";
+       }
+       return TRUE;
+};
+#endif
diff --git a/sound/weapons/flac_fire.ogg b/sound/weapons/flac_fire.ogg
new file mode 100644 (file)
index 0000000..2904078
Binary files /dev/null and b/sound/weapons/flac_fire.ogg differ
diff --git a/sound/weapons/flacexp1.ogg b/sound/weapons/flacexp1.ogg
new file mode 100644 (file)
index 0000000..d5f6180
Binary files /dev/null and b/sound/weapons/flacexp1.ogg differ
diff --git a/sound/weapons/flacexp2.ogg b/sound/weapons/flacexp2.ogg
new file mode 100644 (file)
index 0000000..94ff7ab
Binary files /dev/null and b/sound/weapons/flacexp2.ogg differ
diff --git a/sound/weapons/flacexp3.ogg b/sound/weapons/flacexp3.ogg
new file mode 100644 (file)
index 0000000..51e9e8c
Binary files /dev/null and b/sound/weapons/flacexp3.ogg differ
diff --git a/sound/weapons/seeker_fire.ogg b/sound/weapons/seeker_fire.ogg
new file mode 100644 (file)
index 0000000..17da90c
Binary files /dev/null and b/sound/weapons/seeker_fire.ogg differ
diff --git a/sound/weapons/seekerexp1.ogg b/sound/weapons/seekerexp1.ogg
new file mode 100644 (file)
index 0000000..d5f6180
Binary files /dev/null and b/sound/weapons/seekerexp1.ogg differ
diff --git a/sound/weapons/seekerexp2.ogg b/sound/weapons/seekerexp2.ogg
new file mode 100644 (file)
index 0000000..94ff7ab
Binary files /dev/null and b/sound/weapons/seekerexp2.ogg differ
diff --git a/sound/weapons/seekerexp3.ogg b/sound/weapons/seekerexp3.ogg
new file mode 100644 (file)
index 0000000..51e9e8c
Binary files /dev/null and b/sound/weapons/seekerexp3.ogg differ
diff --git a/sound/weapons/tag_fire.ogg b/sound/weapons/tag_fire.ogg
new file mode 100644 (file)
index 0000000..2904078
Binary files /dev/null and b/sound/weapons/tag_fire.ogg differ
diff --git a/sound/weapons/tag_impact.ogg b/sound/weapons/tag_impact.ogg
new file mode 100644 (file)
index 0000000..8ea4310
Binary files /dev/null and b/sound/weapons/tag_impact.ogg differ
diff --git a/sound/weapons/tag_rocket_fly.ogg b/sound/weapons/tag_rocket_fly.ogg
new file mode 100644 (file)
index 0000000..780fd5a
Binary files /dev/null and b/sound/weapons/tag_rocket_fly.ogg differ
diff --git a/sound/weapons/tagexp1.ogg b/sound/weapons/tagexp1.ogg
new file mode 100644 (file)
index 0000000..6c61fcf
Binary files /dev/null and b/sound/weapons/tagexp1.ogg differ
diff --git a/sound/weapons/tagexp2.ogg b/sound/weapons/tagexp2.ogg
new file mode 100644 (file)
index 0000000..1386185
Binary files /dev/null and b/sound/weapons/tagexp2.ogg differ
diff --git a/sound/weapons/tagexp3.ogg b/sound/weapons/tagexp3.ogg
new file mode 100644 (file)
index 0000000..55b5f4a
Binary files /dev/null and b/sound/weapons/tagexp3.ogg differ
diff --git a/textures/seeker.tga b/textures/seeker.tga
new file mode 100644 (file)
index 0000000..e275817
Binary files /dev/null and b/textures/seeker.tga differ
diff --git a/textures/seeker_gloss.tga b/textures/seeker_gloss.tga
new file mode 100644 (file)
index 0000000..38069b4
Binary files /dev/null and b/textures/seeker_gloss.tga differ
diff --git a/textures/seeker_glow.tga b/textures/seeker_glow.tga
new file mode 100644 (file)
index 0000000..84acdbc
Binary files /dev/null and b/textures/seeker_glow.tga differ
diff --git a/textures/seeker_norm.tga b/textures/seeker_norm.tga
new file mode 100644 (file)
index 0000000..3f799c9
Binary files /dev/null and b/textures/seeker_norm.tga differ
diff --git a/textures/seeker_pants.tga b/textures/seeker_pants.tga
new file mode 100644 (file)
index 0000000..471fe0c
Binary files /dev/null and b/textures/seeker_pants.tga differ