From: Rudolf Polzer Date: Sat, 8 May 2010 18:43:45 +0000 (+0200) Subject: Merge commit 'origin/master' into divVerent/tag_seeker X-Git-Tag: xonotic-v0.1.0preview~638^2~3^2~2 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=58b26c0a303456441dbb82e608213d2f86d695d8;hp=70c8c5954262fc62dee11d9f5f463b9996f544d7 Merge commit 'origin/master' into divVerent/tag_seeker --- diff --git a/balance.cfg b/balance.cfg index 0a4d8cf7f0..dc4b65459d 100644 --- a/balance.cfg +++ b/balance.cfg @@ -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,51 @@ 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_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_up 300 +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 diff --git a/balance25.cfg b/balance25.cfg index 6f36e9bc50..e552c827a5 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -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,51 @@ 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_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_up 300 +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 diff --git a/balanceSamual.cfg b/balanceSamual.cfg index c4aa8d5a9f..c6d194d855 100644 --- a/balanceSamual.cfg +++ b/balanceSamual.cfg @@ -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,51 @@ 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_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_up 300 +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 diff --git a/balanceXPM.cfg b/balanceXPM.cfg index d5c048ed1a..79bb6151e8 100644 --- a/balanceXPM.cfg +++ b/balanceXPM.cfg @@ -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,51 @@ 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_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_up 300 +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 diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index add2de9b59..699503aeaa 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -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 index 0000000000..7311550fc6 Binary files /dev/null and b/gfx/crosshairseeker.tga differ diff --git a/gfx/hud/inv_weapon13.tga b/gfx/hud/inv_weapon13.tga index ba59acaf14..0a8cf7ed02 100644 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 index 0000000000..0a8cf7ed02 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 index 0000000000..8e0279ec7b Binary files /dev/null and b/models/tagrocket.md3 differ diff --git a/models/tagrocket.tga b/models/tagrocket.tga new file mode 100644 index 0000000000..adf0a8c02d 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 index 0000000000..db25bf5454 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 index 0000000000..dd94bbc467 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 index 0000000000..0a59625b6a --- /dev/null +++ b/models/weapons/h_seeker.dpm.framegroups @@ -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 index 0000000000..8a21e6569b Binary files /dev/null and b/models/weapons/v_seeker.md3 differ diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index afa884df1e..0802adef87 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -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'; diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index 59e84690b8..9e90bee224 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -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"); } diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc index dc5183f28b..7072a1b59a 100644 --- a/qcsrc/client/projectile.qc +++ b/qcsrc/client/projectile.qc @@ -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"); } diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 5daa3e51f7..cdf92f0709 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -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; diff --git a/qcsrc/server/bot/havocbot/role_onslaught.qc b/qcsrc/server/bot/havocbot/role_onslaught.qc index 9e905a7d88..3268daefa5 100644 --- a/qcsrc/server/bot/havocbot/role_onslaught.qc +++ b/qcsrc/server/bot/havocbot/role_onslaught.qc @@ -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; } diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index d9c3240603..02ad99fc99 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -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 diff --git a/qcsrc/server/w_all.qc b/qcsrc/server/w_all.qc index fdb02cf6bf..9a9b383024 100644 --- a/qcsrc/server/w_all.qc +++ b/qcsrc/server/w_all.qc @@ -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 index 0000000000..c50e13c773 --- /dev/null +++ b/qcsrc/server/w_seeker.qc @@ -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 index 0000000000..2904078c31 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 index 0000000000..d5f6180e9c 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 index 0000000000..94ff7ab910 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 index 0000000000..51e9e8c17e 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 index 0000000000..17da90cb0a 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 index 0000000000..d5f6180e9c 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 index 0000000000..94ff7ab910 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 index 0000000000..51e9e8c17e 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 index 0000000000..2904078c31 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 index 0000000000..8ea43106df 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 index 0000000000..780fd5aa5c 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 index 0000000000..6c61fcf962 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 index 0000000000..13861854bb 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 index 0000000000..55b5f4a302 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 index 0000000000..e275817b59 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 index 0000000000..38069b4118 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 index 0000000000..84acdbc3eb 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 index 0000000000..3f799c9bab 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 index 0000000000..471fe0c043 Binary files /dev/null and b/textures/seeker_pants.tga differ