X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator_overkill.qc;h=79607a1aa6370531e0f0b750fe08e59c1c9d5481;hb=39d9a37ad3d73b83ce0e9f9d1947c0de09f263e7;hp=3bc1e79589355e376e712199ee3925e1105cff8d;hpb=c6437cd43edc4489ad69746a30b5532f18c1af74;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator_overkill.qc b/qcsrc/server/mutators/mutator_overkill.qc index 3bc1e7958..79607a1aa 100644 --- a/qcsrc/server/mutators/mutator_overkill.qc +++ b/qcsrc/server/mutators/mutator_overkill.qc @@ -1,11 +1,28 @@ #include "mutator_overkill.qh" -#include "../_all.qh" #include "mutator.qh" -void W_Blaster_Attack(float, float, float, float, float, float, float, float, float, float); -void spawnfunc_weapon_hmg(); -void spawnfunc_weapon_rpc(); +void ok_Initialize(); + +REGISTER_MUTATOR(ok, cvar("g_overkill") && !cvar("g_instagib") && !g_nexball && cvar_string("g_mod_balance") == "Overkill") +{ + MUTATOR_ONADD + { + ok_Initialize(); + } + + MUTATOR_ONREMOVE + { + WEP_RPC.spawnflags |= WEP_FLAG_MUTATORBLOCKED; + WEP_HMG.spawnflags |= WEP_FLAG_MUTATORBLOCKED; + } + + return false; +} + +void W_Blaster_Attack(entity, float, float, float, float, float, float, float, float, float, float); +spawnfunc(weapon_hmg); +spawnfunc(weapon_rpc); void ok_DecreaseCharge(entity ent, int wep) { @@ -43,10 +60,10 @@ float ok_CheckWeaponCharge(entity ent, int wep) return (ent.ammo_charge[wep] >= cvar(sprintf("g_overkill_ammo_decharge_%s", wepent.netname))); } -MUTATOR_HOOKFUNCTION(ok_PlayerDamage_Calculate) +MUTATOR_HOOKFUNCTION(ok, PlayerDamage_Calculate, CBC_ORDER_LAST) { if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target)) - if(DEATH_ISWEAPON(frag_deathtype, WEP_BLASTER.m_id)) + if(DEATH_ISWEAPON(frag_deathtype, WEP_BLASTER)) { frag_damage = 0; @@ -63,14 +80,14 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDamage_Calculate) return false; } -MUTATOR_HOOKFUNCTION(ok_PlayerDamage_SplitHealthArmor) +MUTATOR_HOOKFUNCTION(ok, PlayerDamage_SplitHealthArmor) {SELFPARAM(); if(damage_take) self.ok_pauseregen_finished = max(self.ok_pauseregen_finished, time + 2); return false; } -MUTATOR_HOOKFUNCTION(ok_PlayerDies) +MUTATOR_HOOKFUNCTION(ok, PlayerDies) {SELFPARAM(); entity targ = ((frag_attacker) ? frag_attacker : frag_target); @@ -84,7 +101,7 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDies) self.ok_item = true; self.noalign = true; self.pickup_anyway = true; - spawnfunc_item_armor_small(); + spawnfunc_item_armor_small(this); self.movetype = MOVETYPE_TOSS; self.gravity = 1; self.reset = SUB_Remove; @@ -98,8 +115,9 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDies) return false; } +MUTATOR_HOOKFUNCTION(ok, MonsterDropItem) { ok_PlayerDies(); } -MUTATOR_HOOKFUNCTION(ok_PlayerRegen) +MUTATOR_HOOKFUNCTION(ok, PlayerRegen) {SELFPARAM(); // overkill's values are different, so use custom regen if(!self.frozen) @@ -118,12 +136,12 @@ MUTATOR_HOOKFUNCTION(ok_PlayerRegen) return true; // return true anyway, as frozen uses no regen } -MUTATOR_HOOKFUNCTION(ok_ForbidThrowCurrentWeapon) +MUTATOR_HOOKFUNCTION(ok, ForbidThrowCurrentWeapon) { return true; } -MUTATOR_HOOKFUNCTION(ok_PlayerPreThink) +MUTATOR_HOOKFUNCTION(ok, PlayerPreThink) {SELFPARAM(); if(intermission_running || gameover) return false; @@ -149,6 +167,7 @@ MUTATOR_HOOKFUNCTION(ok_PlayerPreThink) int oldwep = self.weapon; self.weapon = WEP_BLASTER.m_id; W_Blaster_Attack( + self, WEP_BLASTER.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(vaporizer, shotangle), WEP_CVAR_SEC(vaporizer, damage), @@ -176,8 +195,9 @@ MUTATOR_HOOKFUNCTION(ok_PlayerPreThink) self.ok_notice_time = time + 2; play2(self, SND(DRYFIRE)); } + Weapon wpn = get_weaponinfo(self.weapon); if(self.weaponentity.state != WS_CLEAR) - w_ready(); + w_ready(wpn, self, self.BUTTON_ATCK, self.BUTTON_ATCK2); self.weapon_blocked = true; } @@ -187,7 +207,7 @@ MUTATOR_HOOKFUNCTION(ok_PlayerPreThink) return false; } -MUTATOR_HOOKFUNCTION(ok_PlayerSpawn) +MUTATOR_HOOKFUNCTION(ok, PlayerSpawn) {SELFPARAM(); if(autocvar_g_overkill_ammo_charge) { @@ -205,7 +225,10 @@ MUTATOR_HOOKFUNCTION(ok_PlayerSpawn) return false; } -MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn) +void _spawnfunc_weapon_hmg() { SELFPARAM(); spawnfunc_weapon_hmg(this); } +void _spawnfunc_weapon_rpc() { SELFPARAM(); spawnfunc_weapon_rpc(this); } + +MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn) {SELFPARAM(); if(autocvar_g_powerups) if(autocvar_g_overkill_powerups_replace) @@ -222,7 +245,7 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn) wep.team = self.team; wep.respawntime = autocvar_g_overkill_superguns_respawn_time; wep.pickup_anyway = true; - wep.think = spawnfunc_weapon_hmg; + wep.think = _spawnfunc_weapon_hmg; wep.nextthink = time + 0.1; return true; } @@ -239,7 +262,7 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn) wep.team = self.team; wep.respawntime = autocvar_g_overkill_superguns_respawn_time; wep.pickup_anyway = true; - wep.think = spawnfunc_weapon_rpc; + wep.think = _spawnfunc_weapon_rpc; wep.nextthink = time + 0.1; return true; } @@ -248,7 +271,7 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn) return false; } -MUTATOR_HOOKFUNCTION(ok_ItemRemove) +MUTATOR_HOOKFUNCTION(ok, FilterItem) {SELFPARAM(); if(self.ok_item) return false; @@ -262,7 +285,7 @@ MUTATOR_HOOKFUNCTION(ok_ItemRemove) return true; } -MUTATOR_HOOKFUNCTION(ok_SpectateCopy) +MUTATOR_HOOKFUNCTION(ok, SpectateCopy) {SELFPARAM(); self.ammo_charge[self.weapon] = other.ammo_charge[other.weapon]; self.ok_use_ammocharge = other.ok_use_ammocharge; @@ -270,12 +293,12 @@ MUTATOR_HOOKFUNCTION(ok_SpectateCopy) return false; } -MUTATOR_HOOKFUNCTION(ok_StartItems) +MUTATOR_HOOKFUNCTION(ok, SetStartItems) { - WepSet ok_start_items = (WEPSET_MACHINEGUN | WEPSET_VORTEX | WEPSET_SHOTGUN); + WepSet ok_start_items = (WEPSET(MACHINEGUN) | WEPSET(VORTEX) | WEPSET(SHOTGUN)); - if(WEP_RPC.weaponstart > 0) { ok_start_items |= WEPSET_RPC; } - if(WEP_HMG.weaponstart > 0) { ok_start_items |= WEPSET_HMG; } + if(WEP_RPC.weaponstart > 0) { ok_start_items |= WEPSET(RPC); } + if(WEP_HMG.weaponstart > 0) { ok_start_items |= WEPSET(HMG); } start_items |= IT_UNLIMITED_WEAPON_AMMO; start_weapons = warmup_start_weapons = ok_start_items; @@ -283,19 +306,19 @@ MUTATOR_HOOKFUNCTION(ok_StartItems) return false; } -MUTATOR_HOOKFUNCTION(ok_BuildMutatorsString) +MUTATOR_HOOKFUNCTION(ok, BuildMutatorsString) { ret_string = strcat(ret_string, ":OK"); return false; } -MUTATOR_HOOKFUNCTION(ok_BuildMutatorsPrettyString) +MUTATOR_HOOKFUNCTION(ok, BuildMutatorsPrettyString) { ret_string = strcat(ret_string, ", Overkill"); return false; } -MUTATOR_HOOKFUNCTION(ok_SetModname) +MUTATOR_HOOKFUNCTION(ok, SetModname) { modname = "Overkill"; return true; @@ -326,35 +349,3 @@ void ok_Initialize() WEP_MACHINEGUN.mdl = "ok_mg"; WEP_VORTEX.mdl = "ok_sniper"; } - -MUTATOR_DEFINITION(mutator_overkill) -{ - MUTATOR_HOOK(ForbidThrowCurrentWeapon, ok_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerPreThink, ok_PlayerPreThink, CBC_ORDER_LAST); - MUTATOR_HOOK(PlayerSpawn, ok_PlayerSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDamage_Calculate, ok_PlayerDamage_Calculate, CBC_ORDER_LAST); - MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, ok_PlayerDamage_SplitHealthArmor, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDies, ok_PlayerDies, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerRegen, ok_PlayerRegen, CBC_ORDER_ANY); - MUTATOR_HOOK(OnEntityPreSpawn, ok_OnEntityPreSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(FilterItem, ok_ItemRemove, CBC_ORDER_ANY); - MUTATOR_HOOK(MonsterDropItem, ok_PlayerDies, CBC_ORDER_ANY); - MUTATOR_HOOK(SpectateCopy, ok_SpectateCopy, CBC_ORDER_ANY); - MUTATOR_HOOK(SetStartItems, ok_StartItems, CBC_ORDER_ANY); - MUTATOR_HOOK(BuildMutatorsString, ok_BuildMutatorsString, CBC_ORDER_ANY); - MUTATOR_HOOK(BuildMutatorsPrettyString, ok_BuildMutatorsPrettyString, CBC_ORDER_ANY); - MUTATOR_HOOK(SetModname, ok_SetModname, CBC_ORDER_ANY); - - MUTATOR_ONADD - { - ok_Initialize(); - } - - MUTATOR_ONREMOVE - { - WEP_RPC.spawnflags |= WEP_FLAG_MUTATORBLOCKED; - WEP_HMG.spawnflags |= WEP_FLAG_MUTATORBLOCKED; - } - - return false; -}