X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fmachinegun.qc;h=e3d1da2fea86db9d6ad4cff51cbe881a45e5273e;hb=8c2002743bbc47e12d603d849602e3a40d21cc89;hp=03c305ca954318b6e222500966ec365dc833a26e;hpb=17308b9ad60c2f773be0de39b811a9752e3037af;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/machinegun.qc b/qcsrc/common/weapons/weapon/machinegun.qc index 03c305ca9..e3d1da2fe 100644 --- a/qcsrc/common/weapons/weapon/machinegun.qc +++ b/qcsrc/common/weapons/weapon/machinegun.qc @@ -1,7 +1,7 @@ #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'); @@ -82,33 +82,35 @@ void W_MachineGun_MuzzleFlash_Think(entity this) { setthink(this, SUB_Remove); this.nextthink = time; - this.realowner.muzzle_flash = world; + this.realowner.muzzle_flash = NULL; return; } } -void W_MachineGun_MuzzleFlash(entity actor) +void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity) { - if(actor.muzzle_flash == world) - actor.muzzle_flash = spawn(); + entity wepent = actor.(weaponentity); + + if(wepent.muzzle_flash == NULL) + wepent.muzzle_flash = spawn(); // muzzle flash for 1st person view - setmodel(actor.muzzle_flash, MDL_MACHINEGUN_MUZZLEFLASH); // precision set below - - actor.muzzle_flash.scale = 0.75; - setthink(actor.muzzle_flash, W_MachineGun_MuzzleFlash_Think); - actor.muzzle_flash.nextthink = time + 0.02; - actor.muzzle_flash.frame = 2; - actor.muzzle_flash.alpha = 0.75; - actor.muzzle_flash.angles_z = random() * 180; - actor.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - actor.muzzle_flash.owner = actor.muzzle_flash.realowner = actor; + 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 actor, .entity weaponentity) { - W_SetupShot(actor, true, 0, SND_UZI_FIRE, CH_WEAPON_A, ((actor.misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage))); + 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) { actor.punchangle_x = random() - 0.5; @@ -125,12 +127,15 @@ void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity we Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - W_MachineGun_MuzzleFlash(actor); - 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'); // 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, 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); + } if(actor.misc_bulletcounter == 1) W_DecreaseAmmo(thiswep, actor, WEP_CVAR(machinegun, first_ammo)); @@ -184,7 +189,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,11 +203,14 @@ 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(actor); - 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(actor); @@ -211,7 +219,7 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity 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,11 +230,14 @@ 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(actor); - 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) @@ -336,7 +347,7 @@ METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor)) } METHOD(MachineGun, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) { - W_Reload(actor, 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)) {