X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fcrylink.qc;h=2710768668bdf525eab03fede68542cb530b061f;hp=e4d66ebe603a7598f2ef3151a750537e8b5fef57;hb=9e8ea75b9aacffc5cfa18c8852c4dd9ffdbd3192;hpb=fde04a29ed6f249c904737ae21ff44f400f1f453 diff --git a/qcsrc/common/weapons/weapon/crylink.qc b/qcsrc/common/weapons/weapon/crylink.qc index e4d66ebe60..2710768668 100644 --- a/qcsrc/common/weapons/weapon/crylink.qc +++ b/qcsrc/common/weapons/weapon/crylink.qc @@ -1,76 +1,6 @@ #include "crylink.qh" -#ifndef IMPLEMENTATION -CLASS(Crylink, Weapon) -/* ammotype */ ATTRIB(Crylink, ammo_field, .int, ammo_cells); -/* impulse */ ATTRIB(Crylink, impulse, int, 6); -/* flags */ ATTRIB(Crylink, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH); -/* rating */ ATTRIB(Crylink, bot_pickupbasevalue, float, BOT_PICKUP_RATING_MID); -/* color */ ATTRIB(Crylink, wpcolor, vector, '1 0.5 1'); -/* modelname */ ATTRIB(Crylink, mdl, string, "crylink"); -#ifdef GAMEQC -/* model */ ATTRIB(Crylink, m_model, Model, MDL_CRYLINK_ITEM); -#endif -/* crosshair */ ATTRIB(Crylink, w_crosshair, string, "gfx/crosshaircrylink"); -/* crosshair */ ATTRIB(Crylink, w_crosshair_size, float, 0.5); -/* wepimg */ ATTRIB(Crylink, model2, string, "weaponcrylink"); -/* refname */ ATTRIB(Crylink, netname, string, "crylink"); -/* wepname */ ATTRIB(Crylink, m_name, string, _("Crylink")); - -#define X(BEGIN, P, END, class, prefix) \ - BEGIN(class) \ - P(class, prefix, ammo, float, BOTH) \ - P(class, prefix, animtime, float, BOTH) \ - P(class, prefix, bouncedamagefactor, float, BOTH) \ - P(class, prefix, bounces, float, BOTH) \ - P(class, prefix, damage, float, BOTH) \ - P(class, prefix, edgedamage, float, BOTH) \ - P(class, prefix, force, float, BOTH) \ - P(class, prefix, joindelay, float, BOTH) \ - P(class, prefix, joinexplode, float, BOTH) \ - P(class, prefix, joinexplode_damage, float, BOTH) \ - P(class, prefix, joinexplode_edgedamage, float, BOTH) \ - P(class, prefix, joinexplode_force, float, BOTH) \ - P(class, prefix, joinexplode_radius, float, BOTH) \ - P(class, prefix, joinspread, float, BOTH) \ - P(class, prefix, linkexplode, float, BOTH) \ - P(class, prefix, middle_fadetime, float, BOTH) \ - P(class, prefix, middle_lifetime, float, BOTH) \ - P(class, prefix, other_fadetime, float, BOTH) \ - P(class, prefix, other_lifetime, float, BOTH) \ - P(class, prefix, radius, float, BOTH) \ - P(class, prefix, refire, float, BOTH) \ - P(class, prefix, reload_ammo, float, NONE) \ - P(class, prefix, reload_time, float, NONE) \ - P(class, prefix, secondary, float, NONE) \ - P(class, prefix, shots, float, BOTH) \ - P(class, prefix, speed, float, BOTH) \ - P(class, prefix, spreadtype, float, SEC) \ - P(class, prefix, spread, float, BOTH) \ - P(class, prefix, switchdelay_drop, float, NONE) \ - P(class, prefix, switchdelay_raise, float, NONE) \ - P(class, prefix, weaponreplace, string, NONE) \ - P(class, prefix, weaponstartoverride, float, NONE) \ - P(class, prefix, weaponstart, float, NONE) \ - P(class, prefix, weaponthrowable, float, NONE) \ - END() - W_PROPS(X, Crylink, crylink) -#undef X - -ENDCLASS(Crylink) -REGISTER_WEAPON(CRYLINK, crylink, NEW(Crylink)); - -#ifdef SVQC -.float gravity; -.float crylink_waitrelease; -.entity crylink_lastgroup; -.entity queuenext; -.entity queueprev; -#endif -#endif -#ifdef IMPLEMENTATION #ifdef SVQC -spawnfunc(weapon_crylink) { weapon_defaultspawnfunc(this, WEP_CRYLINK); } void W_Crylink_CheckLinks(entity e) { @@ -110,7 +40,7 @@ void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next) void W_Crylink_Dequeue(entity e) { - W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext); + W_Crylink_Dequeue_Raw(e.crylink_owner, e.queueprev, e, e.queuenext); } void W_Crylink_Reset(entity this) @@ -130,13 +60,13 @@ void W_Crylink_LinkExplode(entity e, entity e2, entity directhitentity) a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1); .entity weaponentity = e.weaponentity_fld; - if(e == e.realowner.(weaponentity).crylink_lastgroup) - e.realowner.(weaponentity).crylink_lastgroup = NULL; + if(e == e.crylink_owner.(weaponentity).crylink_lastgroup) + e.crylink_owner.(weaponentity).crylink_lastgroup = NULL; float isprimary = !(e.projectiledeathtype & HITTYPE_SECONDARY); RadiusDamage(e, e.realowner, WEP_CVAR_BOTH(crylink, isprimary, damage) * a, WEP_CVAR_BOTH(crylink, isprimary, edgedamage) * a, WEP_CVAR_BOTH(crylink, isprimary, radius), - NULL, NULL, WEP_CVAR_BOTH(crylink, isprimary, force) * a, e.projectiledeathtype, directhitentity); + NULL, NULL, WEP_CVAR_BOTH(crylink, isprimary, force) * a, e.projectiledeathtype, e.weaponentity_fld, directhitentity); W_Crylink_LinkExplode(e.queuenext, e2, directhitentity); @@ -179,9 +109,9 @@ vector W_Crylink_LinkJoin(entity e, float jspeed) return avg_origin; // nothing to do // yes, mathematically we can do this in ONE step, but beware of 32bit floats... - avg_dist = pow(vlen(e.origin - avg_origin), 2); + avg_dist = (vlen(e.origin - avg_origin) ** 2); for(p = e; (p = p.queuenext) != e; ) - avg_dist += pow(vlen(WarpZone_RefSys_TransformOrigin(p, e, p.origin) - avg_origin), 2); + avg_dist += (vlen(WarpZone_RefSys_TransformOrigin(p, e, p.origin) - avg_origin) ** 2); avg_dist *= (1.0 / n); avg_dist = sqrt(avg_dist); @@ -266,6 +196,7 @@ void W_Crylink_LinkJoinEffect_Think(entity this) NULL, WEP_CVAR_BOTH(crylink, isprimary, joinexplode_force) * n, e.projectiledeathtype, + e.weaponentity_fld, NULL ); Send_Effect(EFFECT_CRYLINK_JOINEXPLODE, this.origin, '0 0 0', n); @@ -316,13 +247,14 @@ void W_Crylink_Touch(entity this, entity toucher) if(a) f *= a; - float totaldamage = RadiusDamage(this, this.realowner, WEP_CVAR_BOTH(crylink, isprimary, damage) * f, WEP_CVAR_BOTH(crylink, isprimary, edgedamage) * f, WEP_CVAR_BOTH(crylink, isprimary, radius), NULL, NULL, WEP_CVAR_BOTH(crylink, isprimary, force) * f, this.projectiledeathtype, toucher); + float totaldamage = RadiusDamage(this, this.realowner, WEP_CVAR_BOTH(crylink, isprimary, damage) * f, WEP_CVAR_BOTH(crylink, isprimary, edgedamage) * f, WEP_CVAR_BOTH(crylink, isprimary, radius), + NULL, NULL, WEP_CVAR_BOTH(crylink, isprimary, force) * f, this.projectiledeathtype, this.weaponentity_fld, toucher); if(totaldamage && ((WEP_CVAR_BOTH(crylink, isprimary, linkexplode) == 2) || ((WEP_CVAR_BOTH(crylink, isprimary, linkexplode) == 1) && !W_Crylink_Touch_WouldHitFriendly(this, WEP_CVAR_BOTH(crylink, isprimary, radius))))) { .entity weaponentity = this.weaponentity_fld; - if(this == this.realowner.(weaponentity).crylink_lastgroup) - this.realowner.(weaponentity).crylink_lastgroup = NULL; + if(this == this.crylink_owner.(weaponentity).crylink_lastgroup) + this.crylink_owner.(weaponentity).crylink_lastgroup = NULL; W_Crylink_LinkExplode(this.queuenext, this, toucher); this.classname = "spike_oktoremove"; delete(this); @@ -365,7 +297,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity) if(WEP_CVAR_PRI(crylink, joinexplode)) maxdmg += WEP_CVAR_PRI(crylink, joinexplode_damage); - W_SetupShot(actor, weaponentity, false, 2, SND_CRYLINK_FIRE, CH_WEAPON_A, maxdmg); + W_SetupShot(actor, weaponentity, false, 2, SND_CRYLINK_FIRE, CH_WEAPON_A, maxdmg, WEP_CRYLINK.m_id); forward = v_forward; right = v_right; up = v_up; @@ -378,6 +310,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity) proj = new(spike); proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = actor; + proj.crylink_owner = actor; proj.weaponentity_fld = weaponentity; proj.bot_dodge = true; proj.bot_dodgerating = WEP_CVAR_PRI(crylink, damage); @@ -476,7 +409,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity) if(WEP_CVAR_SEC(crylink, joinexplode)) maxdmg += WEP_CVAR_SEC(crylink, joinexplode_damage); - W_SetupShot(actor, weaponentity, false, 2, SND_CRYLINK_FIRE2, CH_WEAPON_A, maxdmg); + W_SetupShot(actor, weaponentity, false, 2, SND_CRYLINK_FIRE2, CH_WEAPON_A, maxdmg, WEP_CRYLINK.m_id | HITTYPE_SECONDARY); forward = v_forward; right = v_right; up = v_up; @@ -490,6 +423,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity) proj.weaponentity_fld = weaponentity; proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = actor; + proj.crylink_owner = actor; proj.bot_dodge = true; proj.bot_dodgerating = WEP_CVAR_SEC(crylink, damage); if(shots == 1) { @@ -649,7 +583,7 @@ METHOD(Crylink, wr_checkammo1, bool(entity thiswep, entity actor, .entity weapon if(actor.(weaponentity).crylink_lastgroup && actor.(weaponentity).crylink_waitrelease) return true; - float ammo_amount = actor.(thiswep.ammo_field) >= WEP_CVAR_PRI(crylink, ammo); + float ammo_amount = GetResourceAmount(actor, thiswep.ammo_type) >= WEP_CVAR_PRI(crylink, ammo); ammo_amount += actor.(weaponentity).(weapon_load[WEP_CRYLINK.m_id]) >= WEP_CVAR_PRI(crylink, ammo); return ammo_amount; } @@ -659,7 +593,7 @@ METHOD(Crylink, wr_checkammo2, bool(entity thiswep, entity actor, .entity weapon if(actor.(weaponentity).crylink_lastgroup && actor.(weaponentity).crylink_waitrelease) return true; - float ammo_amount = actor.(thiswep.ammo_field) >= WEP_CVAR_SEC(crylink, ammo); + float ammo_amount = GetResourceAmount(actor, thiswep.ammo_type) >= WEP_CVAR_SEC(crylink, ammo); ammo_amount += actor.(weaponentity).(weapon_load[WEP_CRYLINK.m_id]) >= WEP_CVAR_SEC(crylink, ammo); return ammo_amount; } @@ -695,4 +629,3 @@ METHOD(Crylink, wr_impacteffect, void(entity thiswep, entity actor)) } } #endif -#endif