X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_nex.qc;h=d152a6e083949b56586aa4179f46556090841b84;hb=d4a496548f33a19bae54c700639079dcf453dde1;hp=3a85e113adc6a9ccbe7bd33469122e155664078f;hpb=7f052d0b351f6925ed9a1d6025d6efceb77ebc22;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_nex.qc b/qcsrc/server/w_nex.qc index 3a85e113a..d152a6e08 100644 --- a/qcsrc/server/w_nex.qc +++ b/qcsrc/server/w_nex.qc @@ -2,23 +2,23 @@ REGISTER_WEAPON(NEX, w_nex, IT_CELLS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "nex", "nex", "Nex"); #else #ifdef SVQC -void SendCSQCNexBeamParticle() { +void SendCSQCNexBeamParticle(float charge) { vector v; v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos); WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); WriteByte(MSG_BROADCAST, TE_CSQC_NEXGUNBEAMPARTICLE); - WriteCoord(MSG_BROADCAST, w_shotorg_x); WriteCoord(MSG_BROADCAST, w_shotorg_y); WriteCoord(MSG_BROADCAST, w_shotorg_z); WriteCoord(MSG_BROADCAST, v_x); WriteCoord(MSG_BROADCAST, v_y); WriteCoord(MSG_BROADCAST, v_z); + WriteByte(MSG_BROADCAST, bound(0, 255 * charge, 255)); } void W_Nex_Attack (float issecondary) { - float mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, myammo; + float mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, myammo, charge; if(issecondary) { mydmg = cvar("g_balance_nex_secondary_damage"); @@ -43,6 +43,17 @@ void W_Nex_Attack (float issecondary) float flying; flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last + if(cvar("g_balance_nex_charge")) + { + charge = cvar("g_balance_nex_charge_mindmg") / mydmg + (1 - cvar("g_balance_nex_charge_mindmg") / mydmg) * self.nex_charge; + self.nex_charge *= cvar("g_balance_nex_charge_shot_multiplier"); // do this AFTER setting mydmg/myforce + // O RLY? -- divVerent + } + else + charge = 1; + mydmg *= charge; + myforce *= charge; + W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", mydmg); yoda = 0; @@ -52,7 +63,7 @@ void W_Nex_Attack (float issecondary) AnnounceTo(self, "yoda"); //beam and muzzle flash done on client - SendCSQCNexBeamParticle(); + SendCSQCNexBeamParticle(charge); // flash and burn the wall if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) @@ -64,9 +75,9 @@ void W_Nex_Attack (float issecondary) void spawnfunc_weapon_nex (void); // defined in t_items.qc -.float sent_nex_scope; float w_nex(float req) { + float dt; if (req == WR_AIM) { self.BUTTON_ATCK = bot_aim(1000000, 0, 1, FALSE); @@ -74,6 +85,9 @@ float w_nex(float req) } else if (req == WR_THINK) { + if(cvar("g_balance_nex_charge") && self.nex_charge < cvar("g_balance_nex_charge_limit")) + self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_rate") * frametime / W_TICSPERFRAME); + if (self.BUTTON_ATCK) { if (weapon_prepareattack(0, cvar("g_balance_nex_primary_refire"))) @@ -84,24 +98,35 @@ float w_nex(float req) } if (self.BUTTON_ATCK2) { - if(cvar("g_balance_nex_secondary")) + if(cvar("g_balance_nex_secondary_charge")) { - if (weapon_prepareattack(0, cvar("g_balance_nex_secondary_refire"))) + self.nex_charge_rottime = time + cvar("g_balance_nex_charge_rot_pause"); + dt = frametime / W_TICSPERFRAME; + if(self.nex_charge < 1) { - W_Nex_Attack(1); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_secondary_animtime"), w_ready); + dt = min(dt, (1 - self.nex_charge) / cvar("g_balance_nex_secondary_charge_rate")); + if not(self.items & IT_UNLIMITED_WEAPON_AMMO) + { + if(cvar("g_balance_nex_secondary_ammo")) + { + dt = min(dt, (self.ammo_cells - cvar("g_balance_nex_primary_ammo")) / cvar("g_balance_nex_secondary_ammo")); + dt = max(0, dt); + if(dt > 0) + { + self.ammo_cells = max(cvar("g_balance_nex_secondary_ammo"), self.ammo_cells - cvar("g_balance_nex_secondary_ammo") * dt); + } + } + } + self.nex_charge += dt * cvar("g_balance_nex_secondary_charge_rate"); } } - else + else if(cvar("g_balance_nex_secondary")) { - if(clienttype(self) == CLIENTTYPE_REAL) - if(!self.sent_nex_scope) + if (weapon_prepareattack(0, cvar("g_balance_nex_secondary_refire"))) { - msg_entity = self; - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_NEX_SCOPE); - self.sent_nex_scope = 1; - } + W_Nex_Attack(1); + weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_secondary_animtime"), w_ready); + } } } } @@ -121,7 +146,11 @@ float w_nex(float req) else if (req == WR_CHECKAMMO1) return self.ammo_cells >= cvar("g_balance_nex_primary_ammo"); else if (req == WR_CHECKAMMO2) + { + if(cvar("g_balance_nex_secondary_charge")) + return self.ammo_cells >= cvar("g_balance_nex_primary_ammo"); return self.ammo_cells >= cvar("g_balance_nex_secondary_ammo"); + } return TRUE; }; #endif