From ce19b6995d0b5df1532dc9b333f96bd8e6c9ce1b Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Mon, 19 Aug 2019 00:22:31 -0700 Subject: [PATCH] Added basic WEAPON_SNARK functionality --- Source/shared/valve/w_snark.c | 141 +++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 3 deletions(-) diff --git a/Source/shared/valve/w_snark.c b/Source/shared/valve/w_snark.c index 5a535335..01e6b539 100644 --- a/Source/shared/valve/w_snark.c +++ b/Source/shared/valve/w_snark.c @@ -16,6 +16,14 @@ enum SNARK_THROW }; +void w_snark_pickup(void) +{ +#ifdef SSQC + player pl = (player)self; + pl.ammo_snark = bound(0, pl.ammo_snark + 1, 10); +#endif +} + void w_snark_draw(void) { #ifdef CSQC @@ -30,9 +38,124 @@ void w_snark_holster(void) { } + +#ifdef SSQC +void w_snark_deploy(void) +{ + static void snark_ai(void) + { + input_movevalues = [250,0,0]; + input_buttons = 0; + input_impulse = 0; + input_angles = self.angles; + input_timelength = frametime; + + if (self.health <= 0) { + return; + } + + if (self.weapon <= 0.0 && self.aiment == __NULL__) { + float shortest = 999999; + for (entity ef = world; (ef = find(ef, classname, "player"));) { + float len = vlen(ef.origin - self.origin); + if (len < shortest && ef.health > 0) { + self.owner = __NULL__; + self.aiment = ef; + shortest = len; + setsize(self, [-16,-16,0],[16,16,32]); + } + } + } + + if (self.aiment) { + self.angles = input_angles = vectoangles(self.aiment.origin - self.origin); + } + + if (self.aiment && self.weapon <= 0.0) { + self.weapon = 0.5f + random(); + sound(self, CHAN_VOICE, sprintf("squeek/sqk_hunt%d.wav",floor(random(1,4))), 1.0, ATTN_NORM); + input_buttons = 2; + Damage_Apply(self, world, 1, self.origin, TRUE); + + makevectors(self.angles); + traceline(self.origin, self.origin + (v_forward * 128), 0, self); + + if (trace_ent.classname == "player") { + float pit = 100 + random(0,10); + sound(self, CHAN_BODY, "squeek/sqk_deploy1.wav", 1.0, ATTN_NORM, pit); + Damage_Apply(trace_ent, self, 5, trace_endpos, FALSE); + } + + if (self.aiment.health <= 0) { + self.aiment = __NULL__; + } + } + self.weapon -= frametime; + runstandardplayerphysics(self); + } + static void snark_die(int i) { + sound(self, CHAN_VOICE, "squeek/sqk_die1.wav", 1.0, ATTN_NORM); + sound(self, CHAN_BODY, "squeek/sqk_blast1.wav", 1.0, ATTN_NORM); + self.customphysics = __NULL__; + remove(self); + } + static void snark_pain(int i) { } + entity snark = spawn(); + snark.owner = self; + setmodel(snark, "models/w_squeak.mdl"); + makevectors(self.v_angle); + setorigin(snark, self.origin + v_forward * 32); + snark.solid = SOLID_BBOX; + snark.movetype = MOVETYPE_WALK; + snark.frame = 3; /* running like crazy. */ + snark.customphysics = snark_ai; + snark.angles = self.angles; + snark.health = 30; + snark.vPain = snark_pain; + snark.takedamage = DAMAGE_YES; + snark.aiment = __NULL__; + snark.vDeath = snark_die; + snark.weapon = 3.0f; +} +#endif + void w_snark_primary(void) { + player pl = (player)self; + if (pl.w_attack_next > 0.0) { + return; + } + + /* Ammo check */ +#ifdef CSQC + if (pl.a_ammo2 <= 0) { + return; + } +#else + if (pl.ammo_snark <= 0) { + return; + } +#endif + + + /* Audio-Visual Bit */ +#ifdef CSQC + Weapons_ViewAnimation(SNARK_THROW); + pl.a_ammo2--; +#else + w_snark_deploy(); + pl.ammo_snark--; + Weapons_UpdateAmmo(pl, __NULL__, pl.ammo_snark, __NULL__); + if (pl.a_ammo2 <= 0) { + Weapons_RemoveItem(pl, WEAPON_SNARK); + } + +#endif + + pl.w_idle_next = 1.0f; + pl.w_attack_next = 0.25f; + } void w_snark_secondary(void) { @@ -51,7 +174,6 @@ void w_snark_release(void) } r = floor(random(0,3)); - switch (r) { case 0: Weapons_ViewAnimation(SNARK_IDLE); @@ -72,6 +194,12 @@ void w_snark_precache(void) precache_model("models/w_squeak.mdl"); precache_model("models/p_squeak.mdl"); precache_model("models/v_squeak.mdl"); + precache_sound("squeek/sqk_deploy1.wav"); + precache_sound("squeek/sqk_die1.wav"); + precache_sound("squeek/sqk_blast1.wav"); + precache_sound("squeek/sqk_hunt1.wav"); + precache_sound("squeek/sqk_hunt2.wav"); + precache_sound("squeek/sqk_hunt3.wav"); } string w_snark_vmodel(void) { @@ -96,6 +224,13 @@ float w_snark_aimanim(void) return self.flags & FL_CROUCHING ? ANIM_CR_AIMSQUEAK : ANIM_AIMSQUEAK; } +void w_snark_hud(void) +{ +#ifdef CSQC + HUD_DrawAmmo2(); +#endif +} + void w_snark_hudpic(int s, vector pos) { #ifdef CSQC @@ -118,9 +253,9 @@ weapon_t w_snark = w_snark_secondary, w_snark_reload, w_snark_release, - __NULL__, + w_snark_hud, w_snark_precache, - __NULL__, + w_snark_pickup, w_snark_vmodel, w_snark_wmodel, w_snark_pmodel,