X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fmachinegun.qc;h=81da28ddb05b3741fa0d68f180829f8b49380130;hb=65e9ceb03c81bc515d090a54f65dd620c8c6dc43;hp=e39adb4e5e79c1e5c7a57fca00add72f6a40d24a;hpb=daab9330abb8952053b47239d1322cd029b08cd1;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/machinegun.qc b/qcsrc/common/weapons/weapon/machinegun.qc index e39adb4e5..81da28ddb 100644 --- a/qcsrc/common/weapons/weapon/machinegun.qc +++ b/qcsrc/common/weapons/weapon/machinegun.qc @@ -1,12 +1,13 @@ +#include "machinegun.qh" #ifndef IMPLEMENTATION CLASS(MachineGun, Weapon) -/* ammotype */ ATTRIB(MachineGun, ammo_field, .int, ammo_nails) -/* impulse */ ATTRIB(MachineGun, impulse, int, 3) +/* ammotype */ ATTRIB(MachineGun, ammo_field, .int, ammo_nails); +/* impulse */ ATTRIB(MachineGun, impulse, int, 3); /* flags */ ATTRIB(MachineGun, spawnflags, int, WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN); /* rating */ ATTRIB(MachineGun, bot_pickupbasevalue, float, BOT_PICKUP_RATING_MID); /* color */ ATTRIB(MachineGun, wpcolor, vector, '1 1 0'); /* modelname */ ATTRIB(MachineGun, mdl, string, "uzi"); -#ifndef MENUQC +#ifdef GAMEQC /* model */ ATTRIB(MachineGun, m_model, Model, MDL_MACHINEGUN_ITEM); #endif /* crosshair */ ATTRIB(MachineGun, w_crosshair, string, "gfx/crosshairuzi"); @@ -71,8 +72,8 @@ spawnfunc(weapon_machinegun) } spawnfunc(weapon_uzi) { spawnfunc_weapon_machinegun(this); } -void W_MachineGun_MuzzleFlash_Think() -{SELFPARAM(); +void W_MachineGun_MuzzleFlash_Think(entity this) +{ this.frame += 2; this.scale *= 0.5; this.alpha -= 0.25; @@ -80,62 +81,67 @@ void W_MachineGun_MuzzleFlash_Think() if(this.alpha <= 0) { - setthink(this, SUB_Remove_self); + setthink(this, SUB_Remove); this.nextthink = time; - this.realowner.muzzle_flash = world; + this.realowner.muzzle_flash = NULL; return; } } -void W_MachineGun_MuzzleFlash() -{SELFPARAM(); - if(self.muzzle_flash == world) - self.muzzle_flash = spawn(); +void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity) +{ + entity wepent = actor.(weaponentity); + + if(wepent.muzzle_flash == NULL) + wepent.muzzle_flash = spawn(); // muzzle flash for 1st person view - setmodel(self.muzzle_flash, MDL_MACHINEGUN_MUZZLEFLASH); // precision set below - - self.muzzle_flash.scale = 0.75; - setthink(self.muzzle_flash, W_MachineGun_MuzzleFlash_Think); - self.muzzle_flash.nextthink = time + 0.02; - self.muzzle_flash.frame = 2; - self.muzzle_flash.alpha = 0.75; - self.muzzle_flash.angles_z = random() * 180; - self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - self.muzzle_flash.owner = self.muzzle_flash.realowner = self; + setmodel(wepent.muzzle_flash, MDL_MACHINEGUN_MUZZLEFLASH); // precision set below + + wepent.muzzle_flash.scale = 0.75; + setthink(wepent.muzzle_flash, W_MachineGun_MuzzleFlash_Think); + wepent.muzzle_flash.nextthink = time + 0.02; + wepent.muzzle_flash.frame = 2; + wepent.muzzle_flash.alpha = 0.75; + wepent.muzzle_flash.angles_z = random() * 180; + wepent.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; + wepent.muzzle_flash.owner = wepent.muzzle_flash.realowner = wepent; } -void W_MachineGun_Attack(Weapon thiswep, int deathtype, .entity weaponentity) -{SELFPARAM(); - W_SetupShot(self, true, 0, SND_UZI_FIRE, CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage))); +void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity weaponentity) +{ + W_SetupShot(actor, weaponentity, true, 0, SND_UZI_FIRE, CH_WEAPON_A, ((actor.misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage))); if(!autocvar_g_norecoil) { - self.punchangle_x = random() - 0.5; - self.punchangle_y = random() - 0.5; + actor.punchangle_x = random() - 0.5; + actor.punchangle_y = random() - 0.5; } int slot = weaponslot(weaponentity); // this attack_finished just enforces a cooldown at the end of a burst - ATTACK_FINISHED(self, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(); + ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor); - if(self.misc_bulletcounter == 1) - fireBullet(self, w_shotorg, w_shotdir, WEP_CVAR(machinegun, first_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, first_damage), WEP_CVAR(machinegun, first_force), deathtype, 0); + if(actor.misc_bulletcounter == 1) + fireBullet(actor, w_shotorg, w_shotdir, WEP_CVAR(machinegun, first_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, first_damage), WEP_CVAR(machinegun, first_force), deathtype, 0); else - fireBullet(self, w_shotorg, w_shotdir, WEP_CVAR(machinegun, sustained_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), deathtype, 0); + fireBullet(actor, w_shotorg, w_shotdir, WEP_CVAR(machinegun, sustained_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), deathtype, 0); Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - W_MachineGun_MuzzleFlash(); - W_AttachToShotorg(self, self.muzzle_flash, '5 0 0'); + W_MachineGun_MuzzleFlash(actor, weaponentity); + W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); // casing code if(autocvar_g_casings >= 2) - SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self); + { + makevectors(actor.v_angle); // for some reason, this is lost + SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity); + } - if(self.misc_bulletcounter == 1) - W_DecreaseAmmo(thiswep, self, WEP_CVAR(machinegun, first_ammo)); + if(actor.misc_bulletcounter == 1) + W_DecreaseAmmo(thiswep, actor, WEP_CVAR(machinegun, first_ammo)); else - W_DecreaseAmmo(thiswep, self, WEP_CVAR(machinegun, sustained_ammo)); + W_DecreaseAmmo(thiswep, actor, WEP_CVAR(machinegun, sustained_ammo)); } // weapon frames @@ -156,7 +162,7 @@ void W_MachineGun_Attack_Frame(Weapon thiswep, entity actor, .entity weaponentit return; } actor.misc_bulletcounter = actor.misc_bulletcounter + 1; - W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id, weaponentity); + W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id, actor, weaponentity); weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(machinegun, sustained_refire), W_MachineGun_Attack_Frame); } else @@ -184,7 +190,7 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity W_DecreaseAmmo(WEP_MACHINEGUN, actor, WEP_CVAR(machinegun, sustained_ammo)); - W_SetupShot(actor, true, 0, SND_UZI_FIRE, CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage)); + W_SetupShot(actor, weaponentity, true, 0, SND_UZI_FIRE, CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage)); if(!autocvar_g_norecoil) { actor.punchangle_x = random() - 0.5; @@ -198,20 +204,23 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - W_MachineGun_MuzzleFlash(); - W_AttachToShotorg(actor, actor.muzzle_flash, '5 0 0'); + W_MachineGun_MuzzleFlash(actor, weaponentity); + W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); if(autocvar_g_casings >= 2) // casing code - SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor); + { + makevectors(actor.v_angle); // for some reason, this is lost + SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity); + } int slot = weaponslot(weaponentity); - ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(); + ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor); weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(machinegun, sustained_refire), W_MachineGun_Attack_Auto); } void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentity, int fire) { - W_SetupShot(actor, true, 0, SND_UZI_FIRE, CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage)); + W_SetupShot(actor, weaponentity, true, 0, SND_UZI_FIRE, CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage)); if(!autocvar_g_norecoil) { actor.punchangle_x = random() - 0.5; @@ -222,17 +231,20 @@ void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentit Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - W_MachineGun_MuzzleFlash(); - W_AttachToShotorg(actor, actor.muzzle_flash, '5 0 0'); + W_MachineGun_MuzzleFlash(actor, weaponentity); + W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); if(autocvar_g_casings >= 2) // casing code - SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor); + { + makevectors(actor.v_angle); // for some reason, this is lost + SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, actor, weaponentity); + } actor.misc_bulletcounter = actor.misc_bulletcounter + 1; if(actor.misc_bulletcounter == 0) { int slot = weaponslot(weaponentity); - ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, burst_refire2) * W_WeaponRateFactor(); + ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(machinegun, burst_refire2) * W_WeaponRateFactor(actor); weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(machinegun, burst_animtime), w_ready); } else @@ -242,13 +254,12 @@ void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentit } -METHOD(MachineGun, wr_aim, void(entity thiswep)) +METHOD(MachineGun, wr_aim, void(entity thiswep, entity actor)) { - SELFPARAM(); - if(vdist(self.origin - self.enemy.origin, <, 3000 - bound(0, skill, 10) * 200)) - PHYS_INPUT_BUTTON_ATCK(self) = bot_aim(self, 1000000, 0, 0.001, false); + if(vdist(actor.origin - actor.enemy.origin, <, 3000 - bound(0, skill, 10) * 200)) + PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, 1000000, 0, 0.001, false); else - PHYS_INPUT_BUTTON_ATCK2(self) = bot_aim(self, 1000000, 0, 0.001, false); + PHYS_INPUT_BUTTON_ATCK2(actor) = bot_aim(actor, 1000000, 0, 0.001, false); } METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { @@ -288,7 +299,7 @@ METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponen if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0)) { actor.misc_bulletcounter = 1; - W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id, weaponentity); // sets attack_finished + W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id, actor, weaponentity); // sets attack_finished weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(machinegun, sustained_refire), W_MachineGun_Attack_Frame); } @@ -296,7 +307,7 @@ METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponen if(weapon_prepareattack(thiswep, actor, weaponentity, true, 0)) { actor.misc_bulletcounter = 1; - W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id | HITTYPE_SECONDARY, weaponentity); // sets attack_finished + W_MachineGun_Attack(WEP_MACHINEGUN, WEP_MACHINEGUN.m_id | HITTYPE_SECONDARY, actor, weaponentity); // sets attack_finished weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(machinegun, first_refire), w_ready); } } @@ -337,8 +348,7 @@ METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor)) } METHOD(MachineGun, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) { - SELFPARAM(); - W_Reload(self, min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), SND_RELOAD); + W_Reload(actor, weaponentity, min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), SND_RELOAD); } METHOD(MachineGun, wr_suicidemessage, Notification(entity thiswep)) { @@ -355,14 +365,13 @@ METHOD(MachineGun, wr_killmessage, Notification(entity thiswep)) #endif #ifdef CSQC -METHOD(MachineGun, wr_impacteffect, void(entity thiswep)) +METHOD(MachineGun, wr_impacteffect, void(entity thiswep, entity actor)) { - SELFPARAM(); vector org2; org2 = w_org + w_backoff * 2; pointparticles(EFFECT_MACHINEGUN_IMPACT, org2, w_backoff * 1000, 1); if(!w_issilent) - sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTN_NORM); + sound(actor, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTN_NORM); } #endif