X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Foverkill%2Foverkill.qc;h=b8a203990af6aaa2797788d24fd1f543e0974843;hb=2cc219c0762e106241165f3b08fac54a516cda89;hp=758437ef02a9a3a3ce0d1f0f70ecea12bdda68b4;hpb=0dbdb22db2053df47bd9c2d871540a0e42ea0521;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/overkill/overkill.qc b/qcsrc/common/mutators/mutator/overkill/overkill.qc index 758437ef0..b8a203990 100644 --- a/qcsrc/common/mutators/mutator/overkill/overkill.qc +++ b/qcsrc/common/mutators/mutator/overkill/overkill.qc @@ -41,7 +41,7 @@ REGISTER_MUTATOR(ok, cvar("g_overkill") && !cvar("g_instagib") && !g_nexball && MUTATOR_HOOKFUNCTION(ok, W_DecreaseAmmo) { - entity actor = MUTATOR_ARGV(0, entity); + entity actor = M_ARGV(0, entity); if (actor.ok_use_ammocharge) { ok_DecreaseCharge(actor, PS(actor).m_weapon.m_id); @@ -51,7 +51,7 @@ MUTATOR_HOOKFUNCTION(ok, W_DecreaseAmmo) MUTATOR_HOOKFUNCTION(ok, W_Reload) { - entity actor = MUTATOR_ARGV(0, entity); + entity actor = M_ARGV(0, entity); return actor.ok_use_ammocharge; } @@ -77,7 +77,7 @@ void ok_IncreaseCharge(entity ent, int wep) if (wepent == WEP_Null) return; // dummy if(ent.ok_use_ammocharge) - if(!ent.BUTTON_ATCK) // not while attacking? + if(!PHYS_INPUT_BUTTON_ATCK(ent)) // not while attacking? ent.ammo_charge[wep] = min(autocvar_g_overkill_ammo_charge_limit, ent.ammo_charge[wep] + cvar(sprintf("g_overkill_ammo_charge_rate_%s", wepent.netname)) * frametime / W_TICSPERFRAME); } @@ -94,6 +94,12 @@ float ok_CheckWeaponCharge(entity ent, int wep) MUTATOR_HOOKFUNCTION(ok, PlayerDamage_Calculate, CBC_ORDER_LAST) { + entity frag_attacker = M_ARGV(1, entity); + entity frag_target = M_ARGV(2, entity); + float frag_deathtype = M_ARGV(3, float); + float frag_damage = M_ARGV(4, float); + vector frag_force = M_ARGV(6, vector); + if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target)) if(DEATH_ISWEAPON(frag_deathtype, WEP_BLASTER)) { @@ -101,30 +107,32 @@ MUTATOR_HOOKFUNCTION(ok, PlayerDamage_Calculate, CBC_ORDER_LAST) if(frag_attacker != frag_target) if(frag_target.health > 0) - if(frag_target.frozen == 0) + if(STAT(FROZEN, frag_target) == 0) if(!IS_DEAD(frag_target)) { Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE); frag_force = '0 0 0'; } + + M_ARGV(4, float) = frag_damage; + M_ARGV(6, vector) = frag_force; } return false; } MUTATOR_HOOKFUNCTION(ok, PlayerDamage_SplitHealthArmor) -{SELFPARAM(); +{ if(damage_take) - self.ok_pauseregen_finished = max(self.ok_pauseregen_finished, time + 2); + frag_target.ok_pauseregen_finished = max(frag_target.ok_pauseregen_finished, time + 2); return false; } MUTATOR_HOOKFUNCTION(ok, PlayerDies) { - SELFPARAM(); entity targ = ((frag_attacker) ? frag_attacker : frag_target); - if(IS_MONSTER(this)) + if(IS_MONSTER(frag_target)) { remove(other); // remove default item other = NULL; @@ -136,14 +144,16 @@ MUTATOR_HOOKFUNCTION(ok, PlayerDies) e.pickup_anyway = true; e.spawnfunc_checked = true; spawnfunc_item_armor_small(e); - e.movetype = MOVETYPE_TOSS; - e.gravity = 1; - e.reset = SUB_Remove; - setorigin(e, frag_target.origin + '0 0 32'); - e.velocity = '0 0 200' + normalize(targ.origin - self.origin) * 500; - SUB_SetFade(e, time + 5, 1); + if (!wasfreed(e)) { // might have been blocked by a mutator + e.movetype = MOVETYPE_TOSS; + e.gravity = 1; + e.reset = SUB_Remove; + setorigin(e, frag_target.origin + '0 0 32'); + e.velocity = '0 0 200' + normalize(targ.origin - frag_target.origin) * 500; + SUB_SetFade(e, time + 5, 1); + } - this.ok_lastwep = PS(this).m_switchweapon.m_id; + frag_target.ok_lastwep = PS(frag_target).m_switchweapon.m_id; return false; } @@ -152,7 +162,7 @@ MUTATOR_HOOKFUNCTION(ok, MonsterDropItem) { ok_PlayerDies(); } MUTATOR_HOOKFUNCTION(ok, PlayerRegen) {SELFPARAM(); // overkill's values are different, so use custom regen - if(!self.frozen) + if(!STAT(FROZEN, self)) { self.armorvalue = CalcRotRegen(self.armorvalue, autocvar_g_balance_armor_regenstable, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, 1 * frametime * (time > self.ok_pauseregen_finished), 0, 0, 1, 1 * frametime * (time > self.pauserotarmor_finished), autocvar_g_balance_armor_limit); self.health = CalcRotRegen(self.health, autocvar_g_balance_health_regenstable, 0, 100, 1 * frametime * (time > self.ok_pauseregen_finished), 200, 0, autocvar_g_balance_health_rotlinear, 1 * frametime * (time > self.pauserothealth_finished), autocvar_g_balance_health_limit); @@ -178,18 +188,23 @@ MUTATOR_HOOKFUNCTION(ok, PlayerPreThink) if(intermission_running || gameover) return false; - if(IS_DEAD(self) || !IS_PLAYER(self) || self.frozen) + if(IS_DEAD(self) || !IS_PLAYER(self) || STAT(FROZEN, self)) return false; if(self.ok_lastwep) { - PS(self).m_switchweapon = Weapons_from(self.ok_lastwep); + Weapon newwep = Weapons_from(self.ok_lastwep); + if(self.ok_lastwep == WEP_HMG.m_id) + newwep = WEP_MACHINEGUN; + if(self.ok_lastwep == WEP_RPC.m_id) + newwep = WEP_VORTEX; + PS(self).m_switchweapon = newwep; self.ok_lastwep = 0; } ok_IncreaseCharge(self, PS(self).m_weapon.m_id); - if(self.BUTTON_ATCK2) + if(PHYS_INPUT_BUTTON_ATCK2(self)) if(!forbidWeaponUse(self) || self.weapon_blocked) // allow if weapon is blocked if(time >= self.jump_interval) { @@ -221,7 +236,7 @@ MUTATOR_HOOKFUNCTION(ok, PlayerPreThink) if(self.ok_use_ammocharge) if(!ok_CheckWeaponCharge(self, PS(self).m_weapon.m_id)) { - if(autocvar_g_overkill_ammo_charge_notice && time > self.ok_notice_time && self.BUTTON_ATCK && IS_REAL_CLIENT(self) && PS(self).m_weapon == PS(self).m_switchweapon) + if(autocvar_g_overkill_ammo_charge_notice && time > self.ok_notice_time && PHYS_INPUT_BUTTON_ATCK(self) && IS_REAL_CLIENT(self) && PS(self).m_weapon == PS(self).m_switchweapon) { //Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_OVERKILL_CHARGE); self.ok_notice_time = time + 2; @@ -230,35 +245,41 @@ MUTATOR_HOOKFUNCTION(ok, PlayerPreThink) Weapon wpn = PS(self).m_weapon; .entity weaponentity = weaponentities[0]; // TODO: unhardcode if(self.(weaponentity).state != WS_CLEAR) - w_ready(wpn, self, weaponentity, (self.BUTTON_ATCK ? 1 : 0) | (self.BUTTON_ATCK2 ? 2 : 0)); + w_ready(wpn, self, weaponentity, PHYS_INPUT_BUTTON_ATCK(self) | (PHYS_INPUT_BUTTON_ATCK2(self) << 1)); self.weapon_blocked = true; } - self.BUTTON_ATCK2 = 0; + PHYS_INPUT_BUTTON_ATCK2(self) = false; return false; } MUTATOR_HOOKFUNCTION(ok, PlayerSpawn) -{SELFPARAM(); +{ + entity player = M_ARGV(0, entity); + if(autocvar_g_overkill_ammo_charge) { - FOREACH(Weapons, it != WEP_Null, LAMBDA(self.ammo_charge[it.m_id] = autocvar_g_overkill_ammo_charge_limit)); + FOREACH(Weapons, it != WEP_Null, LAMBDA(player.ammo_charge[it.m_id] = autocvar_g_overkill_ammo_charge_limit)); - self.ok_use_ammocharge = 1; - self.ok_notice_time = time; + player.ok_use_ammocharge = 1; + player.ok_notice_time = time; } else - self.ok_use_ammocharge = 0; + player.ok_use_ammocharge = 0; + + // if player changed their weapon while dead, don't switch to their death weapon + if(player.impulse) + player.ok_lastwep = 0; - self.ok_pauseregen_finished = time + 2; + player.ok_pauseregen_finished = time + 2; return false; } -void self_spawnfunc_weapon_hmg() { SELFPARAM(); spawnfunc_weapon_hmg(this); } -void self_spawnfunc_weapon_rpc() { SELFPARAM(); spawnfunc_weapon_rpc(this); } +void self_spawnfunc_weapon_hmg(entity this) { spawnfunc_weapon_hmg(this); } +void self_spawnfunc_weapon_rpc(entity this) { spawnfunc_weapon_rpc(this); } MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn) {SELFPARAM(); @@ -277,7 +298,7 @@ MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn) wep.respawntime = autocvar_g_overkill_superguns_respawn_time; wep.pickup_anyway = true; wep.spawnfunc_checked = true; - wep.think = self_spawnfunc_weapon_hmg; + setthink(wep, self_spawnfunc_weapon_hmg); wep.nextthink = time + 0.1; return true; } @@ -294,7 +315,7 @@ MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn) wep.respawntime = autocvar_g_overkill_superguns_respawn_time; wep.pickup_anyway = true; wep.spawnfunc_checked = true; - wep.think = self_spawnfunc_weapon_rpc; + setthink(wep, self_spawnfunc_weapon_rpc); wep.nextthink = time + 0.1; return true; }