From 14843ee5fdaebd632c554204c5f0228111694254 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 17 Jan 2023 16:12:59 -0800 Subject: [PATCH] WEAPON_GLAUNCHER: initial implementation... mostly done --- src/shared/player.qc | 8 ++ src/shared/w_glauncher.qc | 172 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 173 insertions(+), 7 deletions(-) diff --git a/src/shared/player.qc b/src/shared/player.qc index 65c7155..d3fca75 100644 --- a/src/shared/player.qc +++ b/src/shared/player.qc @@ -43,6 +43,7 @@ class player:NSClientPlayer PREDICTED_INT(mag_sbs) PREDICTED_INT(mag_dbs) PREDICTED_INT(mag_rpg) + PREDICTED_INT(mag_glauncher) /* ammo 2 */ PREDICTED_INT(m_iAmmoRockets) @@ -110,6 +111,7 @@ player::ReceiveEntity(float new, float fl) mag_sbs = readbyte(); mag_dbs = readbyte(); mag_rpg = readbyte(); + mag_glauncher = readbyte(); } if (fl & PLAYER_AMMO2) { @@ -170,6 +172,7 @@ player::PredictPreFrame(void) SAVE_STATE(mag_sbs); SAVE_STATE(mag_dbs); SAVE_STATE(mag_rpg); + SAVE_STATE(mag_glauncher); SAVE_STATE(m_iAmmoRockets); SAVE_STATE(m_iAmmoNails); @@ -204,6 +207,7 @@ player::PredictPostFrame(void) ROLL_BACK(mag_sbs); ROLL_BACK(mag_dbs); ROLL_BACK(mag_rpg); + ROLL_BACK(mag_glauncher); ROLL_BACK(m_iAmmoRockets); ROLL_BACK(m_iAmmoNails); @@ -235,6 +239,8 @@ player::EvaluateEntity(void) SendFlags |= PLAYER_AMMO1; else if (ATTR_CHANGED(mag_rpg)) SendFlags |= PLAYER_AMMO1; + else if (ATTR_CHANGED(mag_glauncher)) + SendFlags |= PLAYER_AMMO1; /* ammo 2 type updates */ if (ATTR_CHANGED(m_iAmmoRockets)) @@ -259,6 +265,7 @@ player::EvaluateEntity(void) SAVE_STATE(mag_sbs); SAVE_STATE(mag_dbs); SAVE_STATE(mag_rpg); + SAVE_STATE(mag_glauncher); SAVE_STATE(m_iAmmoRockets); SAVE_STATE(m_iAmmoNails); @@ -537,6 +544,7 @@ player::SendEntity(entity ePEnt, float flChanged) WriteByte(MSG_ENTITY, mag_sbs); WriteByte(MSG_ENTITY, mag_dbs); WriteByte(MSG_ENTITY, mag_rpg); + WriteByte(MSG_ENTITY, mag_glauncher); } if (flChanged & PLAYER_AMMO2) { diff --git a/src/shared/w_glauncher.qc b/src/shared/w_glauncher.qc index edd79f0..a4d7b25 100644 --- a/src/shared/w_glauncher.qc +++ b/src/shared/w_glauncher.qc @@ -14,20 +14,49 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +typedef enum +{ + GLAUNCHER_GIDLE, + GLAUNCHER_PIDLE, + GLAUNCHER_GFIRE, + GLAUNCHER_PFIRE, + GLAUNCHER_GRELOAD1, + GLAUNCHER_GRELOAD2, + GLAUNCHER_PRELOAD1, + GLAUNCHER_PRELOAD2, + GLAUNCHER_GDRAW, + GLAUNCHER_PDRAW, + GLAUNCHER_GHOLSTER, + GLAUNCHER_PHOLSTER +} w_glauncher_anims_t; + void w_glauncher_precache(void) { - precache_model("models/v_tfgl.mdl"); +#ifdef SERVER + Sound_Precache("weapon_handgrenade.bounce"); + Sound_Precache("weapon_mp5.gl"); precache_model("models/w_glauncher.mdl"); precache_model("models/p_glauncher.mdl"); + precache_model("models/pipebomb.mdl"); +#else + precache_model("models/v_tfgl.mdl"); +#endif } void w_glauncher_updateammo(player pl) +{ + Weapons_UpdateAmmo(pl, pl.mag_glauncher, pl.m_iAmmoRockets, __NULL__); +} + +int +w_glauncher_pickup(player pl, int new, int startammo) { #ifdef SERVER - Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); + pl.mag_glauncher = bound(0, pl.mag_glauncher + 6, 6); #endif + return (1); } string @@ -54,6 +83,135 @@ w_glauncher_draw(player pl) Weapons_ViewAnimation(pl, 0); } +float +crandom(void) +{ + return ((random() - 0.5f) * 2.0f); +} + +void +w_glauncher_shootnade(player pl) +{ + vector vecNadeVelocity; + + static void w_glauncher_shootnade_touch(void) { + Sound_Play(self, CHAN_BODY, "weapon_handgrenade.bounce"); + + if (vlen(self.velocity)) + self.avelocity = g_vec_null; + } + + static void w_glauncher_explode(void) { + float dmg = 100; + FX_Explosion(self.origin); + //Damage_Radius(self.origin, self.owner, dmg, dmg * 2.5f, TRUE, WEAPON_GLAUNCHER); + sound(self, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 2) + 3), 1, ATTN_NORM); + NSEntity::Destroy(); + } + + Weapons_MakeVectors(pl); + vecNadeVelocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10; + + NSRenderableEntity eNade = spawn(NSRenderableEntity); + eNade.SetModel("models/pipebomb.mdl"); + eNade.SetOrigin(Weapons_GetCameraPos(pl) + (v_forward * 14) + (v_up * -4) + (v_right * 2)); + eNade.SetOwner(pl); + eNade.SetMovetype(MOVETYPE_BOUNCE); + eNade.SetSolid(SOLID_BBOX); + eNade.SetGravity(1.0f); + eNade.SetVelocity(vecNadeVelocity); + eNade.SetAngularVelocity([300, 300, 300]); + eNade.SetAngles(vectoangles(eNade.GetVelocity())); + eNade.SetSkin(1); + + eNade.touch = w_glauncher_shootnade_touch; + eNade.think = w_glauncher_explode; + eNade.nextthink = time + 2.5f; + + Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.gl"); + + //eNade.traileffectnum = particleeffectnum("weapon_rpg.trail"); +} + +void +w_glauncher_reload(player pl) +{ + w_baseshotgun_reload(player::mag_glauncher, player::m_iAmmoRockets, 6); +} + +void +w_glauncher_release(player pl) +{ + int s = w_baseshotgun_release(player::mag_glauncher, player::m_iAmmoRockets, 6); + + switch (s) { + case SHOTGUN_IDLE: + Weapons_ViewAnimation(pl, GLAUNCHER_GIDLE); + pl.w_idle_next = 5.0f; + break; + case SHOTGUN_BUSY: + break; + case SHOTGUN_START_RELOAD: + Weapons_ViewAnimation(pl, GLAUNCHER_GRELOAD1); + break; + case SHOTGUN_RELOAD: + break; + case SHOTGUN_END_RELOAD: + Weapons_ViewAnimation(pl, GLAUNCHER_GRELOAD2); + break; + } +} + +void +w_glauncher_primary(player pl) +{ + int s = w_baseprojectile_fire(pl, WEAPON_GLAUNCHER, player::mag_glauncher, w_glauncher_shootnade); + + switch (s) { + case AUTO_FIRE_FAILED: + w_glauncher_release(pl); + return; + break; + case AUTO_FIRED: + case AUTO_LAST: + Weapons_ViewAnimation(pl, GLAUNCHER_GFIRE); + Weapons_ViewPunchAngle(pl, [-1,0,0]); + pl.w_attack_next = 0.6f; + break; + case AUTO_EMPTY: + Weapons_ViewAnimation(pl, GLAUNCHER_GIDLE); + pl.w_attack_next = 0.2f; + break; + } + + pl.w_idle_next = 0.6f; +} + +void +w_glauncher_postdraw(player pl) +{ +#ifdef CLIENT + vector aicon_pos; + + /* ammo counters */ + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + + /* ammo icon */ + aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic( + aicon_pos, + [24,24], + "sprites/640hud7.spr_0.tga", + [120/256,72/128], + [24/256, 24/128], + g_hud_color, + pSeatLocal->m_flAmmo2Alpha, + DRAWFLAG_ADDITIVE + ); +#endif +} + float w_glauncher_aimanim(player pl) { @@ -98,13 +256,13 @@ weapon_t w_glauncher = .slot_pos = 1, .draw = w_glauncher_draw, .holster = __NULL__, - .primary = __NULL__, + .primary = w_glauncher_primary, .secondary = __NULL__, - .reload = __NULL__, - .release = __NULL__, - .postdraw = __NULL__, + .reload = w_glauncher_reload, + .release = w_glauncher_release, + .postdraw = w_glauncher_postdraw, .precache = w_glauncher_precache, - .pickup = __NULL__, + .pickup = w_glauncher_pickup, .updateammo = w_glauncher_updateammo, .wmodel = w_glauncher_wmodel, .pmodel = w_glauncher_pmodel,