X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_crylink.qc;h=0b3118bb606cea52a6c5115e5bf437ea0a313b6e;hb=988282b03e2a96c7fbfc8df45761dbf559f864be;hp=d2284f856703f3d00ac189fbbea6866bdee4cbfa;hpb=4a6069480c3e18c35fc90ed231aff2e1f07f954d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_crylink.qc b/qcsrc/server/w_crylink.qc index d2284f856..0b3118bb6 100644 --- a/qcsrc/server/w_crylink.qc +++ b/qcsrc/server/w_crylink.qc @@ -16,7 +16,7 @@ void W_Crylink_CheckLinks(entity e) if(e == world) error("W_Crylink_CheckLinks: entity is world"); - if(e.classname != "spike") + if(e.classname != "spike" || wasfreed(e)) error(sprintf("W_Crylink_CheckLinks: entity is not a spike but a %s (freed: %d)", e.classname, wasfreed(e))); p = e; @@ -39,6 +39,7 @@ void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next) own.crylink_lastgroup = ((me == next) ? world : next); prev.queuenext = next; next.queueprev = prev; + me.classname = "spike_oktoremove"; if(me != next) W_Crylink_CheckLinks(next); } @@ -48,10 +49,20 @@ void W_Crylink_Dequeue(entity e) W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext); } +void W_Crylink_Reset(void) +{ + W_Crylink_Dequeue(self); + remove(self); +} + // force projectile to explode void W_Crylink_LinkExplode (entity e, entity e2) { float a; + + if(e == e2) + return; + a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1); if(e == e.realowner.crylink_lastgroup) @@ -62,9 +73,9 @@ void W_Crylink_LinkExplode (entity e, entity e2) else RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_primary_damage * a, autocvar_g_balance_crylink_primary_edgedamage * a, autocvar_g_balance_crylink_primary_radius, world, autocvar_g_balance_crylink_primary_force * a, e.projectiledeathtype, other); - if(e.queuenext != e2) - W_Crylink_LinkExplode(e.queuenext, e2); + W_Crylink_LinkExplode(e.queuenext, e2); + e.classname = "spike_oktoremove"; remove (e); } @@ -213,23 +224,12 @@ void W_Crylink_LinkJoinEffect_Think() remove(self); } - // NO bounce protection, as bounces are limited! void W_Crylink_Touch (void) { float finalhit; float f; - //PROJECTILE_TOUCH; - local entity savenext, saveprev, saveown; - saveown = self.realowner; - savenext = self.queuenext; - saveprev = self.queueprev; - if(WarpZone_Projectile_Touch()) - { - if(wasfreed(self)) - W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext); - return; - } + PROJECTILE_TOUCH; float a; a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1); @@ -246,6 +246,7 @@ void W_Crylink_Touch (void) if(self == self.realowner.crylink_lastgroup) self.realowner.crylink_lastgroup = world; W_Crylink_LinkExplode(self.queuenext, self); + self.classname = "spike_oktoremove"; remove (self); return; } @@ -269,17 +270,7 @@ void W_Crylink_Touch2 (void) { float finalhit; float f; - //PROJECTILE_TOUCH; - local entity savenext, saveprev, saveown; - savenext = self.queuenext; - saveprev = self.queueprev; - saveown = self.realowner; - if(WarpZone_Projectile_Touch()) - { - if(wasfreed(self)) - W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext); - return; - } + PROJECTILE_TOUCH; float a; a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1); @@ -296,6 +287,7 @@ void W_Crylink_Touch2 (void) if(self == self.realowner.crylink_lastgroup) self.realowner.crylink_lastgroup = world; W_Crylink_LinkExplode(self.queuenext, self); + self.classname = "spike_oktoremove"; remove (self); return; } @@ -323,9 +315,9 @@ void W_Crylink_Fadethink (void) void W_Crylink_Attack (void) { - local float counter, shots; - local entity proj, prevproj, firstproj; - local vector s; + float counter, shots; + entity proj, prevproj, firstproj; + vector s; vector forward, right, up; float maxdmg; @@ -347,6 +339,7 @@ void W_Crylink_Attack (void) while (counter < shots) { proj = spawn (); + proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = self; proj.classname = "spike"; proj.bot_dodge = TRUE; @@ -422,14 +415,18 @@ void W_Crylink_Attack (void) counter = counter + 1; } - self.crylink_lastgroup = proj; - W_Crylink_CheckLinks(proj); + if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0) + { + self.crylink_lastgroup = proj; + W_Crylink_CheckLinks(proj); + self.crylink_waitrelease = 1; + } } void W_Crylink_Attack2 (void) { - local float counter, shots; - local entity proj, prevproj, firstproj; + float counter, shots; + entity proj, prevproj, firstproj; float maxdmg; W_DecreaseAmmo(ammo_cells, autocvar_g_balance_crylink_secondary_ammo, autocvar_g_balance_crylink_reload_ammo); @@ -447,6 +444,7 @@ void W_Crylink_Attack2 (void) while (counter < shots) { proj = spawn (); + proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = self; proj.classname = "spike"; proj.bot_dodge = TRUE; @@ -510,7 +508,12 @@ void W_Crylink_Attack2 (void) counter = counter + 1; } - self.crylink_lastgroup = proj; + if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0) + { + self.crylink_lastgroup = proj; + W_Crylink_CheckLinks(proj); + self.crylink_waitrelease = 2; + } } void spawnfunc_weapon_crylink (void) @@ -532,31 +535,30 @@ float w_crylink(float req) { if(autocvar_g_balance_crylink_reload_ammo && self.clip_load < min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo)) // forced reload weapon_action(self.weapon, WR_RELOAD); - else if (self.BUTTON_ATCK) + + if (self.BUTTON_ATCK) { - if (!self.crylink_waitrelease) + if (self.crylink_waitrelease != 1) if (weapon_prepareattack(0, autocvar_g_balance_crylink_primary_refire)) { W_Crylink_Attack(); weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_crylink_primary_animtime, w_ready); - if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0) - self.crylink_waitrelease = 1; } } - else if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary) + + if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary) { - if (!self.crylink_waitrelease) + if (self.crylink_waitrelease != 2) if (weapon_prepareattack(1, autocvar_g_balance_crylink_secondary_refire)) { W_Crylink_Attack2(); weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_crylink_secondary_animtime, w_ready); - if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0) - self.crylink_waitrelease = 2; } } - else + + if ((self.crylink_waitrelease == 1 && !self.BUTTON_ATCK) || (self.crylink_waitrelease == 2 && !self.BUTTON_ATCK2)) { - if (self.crylink_waitrelease && (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time)) + if (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time) { // fired and released now! if(self.crylink_lastgroup) @@ -614,7 +616,7 @@ float w_crylink(float req) return TRUE; ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_primary_ammo; - ammo_amount += self.weapon_load[WEP_CRYLINK] >= autocvar_g_balance_crylink_primary_ammo; + ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_primary_ammo; return ammo_amount; } else if (req == WR_CHECKAMMO2) @@ -624,7 +626,7 @@ float w_crylink(float req) return TRUE; ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_secondary_ammo; - ammo_amount += self.weapon_load[WEP_CRYLINK] >= autocvar_g_balance_crylink_secondary_ammo; + ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_secondary_ammo; return ammo_amount; } else if (req == WR_RELOAD) @@ -632,7 +634,7 @@ float w_crylink(float req) W_Reload(min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo), autocvar_g_balance_crylink_reload_ammo, autocvar_g_balance_crylink_reload_time, "weapons/reload.wav"); } return TRUE; -}; +} #endif #ifdef CSQC float w_crylink(float req) @@ -645,13 +647,13 @@ float w_crylink(float req) { pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1); if(!w_issilent) - sound(self, CH_SHOTS_SINGLE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); + sound(self, CH_SHOTS, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM); } else { pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1); if(!w_issilent) - sound(self, CH_SHOTS_SINGLE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM); + sound(self, CH_SHOTS, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM); } } else if(req == WR_PRECACHE)