X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator_instagib.qc;h=77b7559e49ef418f242d946085ed10fd07f0d67c;hp=141172e2fb6f1d680dc8bb36c7a3c698f7c87cb5;hb=86c9dc7c3696c329496b06375c1e79fb407401ce;hpb=d1ec6cd7b36e2c16817720fe5cce775fc3d26357 diff --git a/qcsrc/server/mutators/mutator_instagib.qc b/qcsrc/server/mutators/mutator_instagib.qc index 141172e2fb..77b7559e49 100644 --- a/qcsrc/server/mutators/mutator_instagib.qc +++ b/qcsrc/server/mutators/mutator_instagib.qc @@ -1,20 +1,25 @@ +#include "../_all.qh" + +#include "mutator.qh" + +#include "../cl_client.qh" +#include "../../common/buffs.qh" + +#include "../../common/items/all.qc" + void spawnfunc_item_minst_cells (void) { if (!g_instagib) { remove(self); return; } if (!self.ammo_cells) self.ammo_cells = autocvar_g_instagib_ammo_drop; - StartItem ("models/items/a_cells.md3", - "misc/itempickup.wav", 45, 0, - "Vaporizer Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100); + StartItemA (ITEM_VaporizerCells); } void instagib_health_mega() { self.max_health = 1; - StartItem ("models/items/g_h100.md3", - "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, - "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH); + StartItemA (ITEM_ExtraLife); } .float instagib_nextthink; @@ -37,6 +42,14 @@ void instagib_ammocheck() instagib_stop_countdown(self); else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO) || (self.flags & FL_GODMODE)) instagib_stop_countdown(self); + else if(autocvar_g_rm && autocvar_g_rm_laser) + { + if(!self.instagib_needammo) + { + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_INSTAGIB_DOWNGRADE); + self.instagib_needammo = true; + } + } else { self.instagib_needammo = true; @@ -119,7 +132,7 @@ MUTATOR_HOOKFUNCTION(instagib_MonsterLoot) MUTATOR_HOOKFUNCTION(instagib_MonsterSpawn) { // always refill ammo - if(self.monsterid == MON_MAGE) + if(self.monsterid == MON_MAGE.monsterid) self.skin = 1; return false; @@ -127,7 +140,7 @@ MUTATOR_HOOKFUNCTION(instagib_MonsterSpawn) MUTATOR_HOOKFUNCTION(instagib_BotShouldAttack) { - if(checkentity.items & IT_STRENGTH) + if(checkentity.items & ITEM_Strength.m_itemid) return true; return false; @@ -162,14 +175,14 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups) if (!(self.effects & EF_FULLBRIGHT)) self.effects |= EF_FULLBRIGHT; - if (self.items & IT_STRENGTH) + if (self.items & ITEM_Strength.m_itemid) { play_countdown(self.strength_finished, "misc/poweroff.wav"); if (time > self.strength_finished) { self.alpha = default_player_alpha; self.exteriorweaponentity.alpha = default_weapon_alpha; - self.items &= ~IT_STRENGTH; + self.items &= ~ITEM_Strength.m_itemid; Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY); } } @@ -179,18 +192,18 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups) { self.alpha = autocvar_g_instagib_invis_alpha; self.exteriorweaponentity.alpha = autocvar_g_instagib_invis_alpha; - self.items |= IT_STRENGTH; + self.items |= ITEM_Strength.m_itemid; Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY); } } - if (self.items & IT_INVINCIBLE) + if (self.items & ITEM_Shield.m_itemid) { play_countdown(self.invincible_finished, "misc/poweroff.wav"); if (time > self.invincible_finished) { - self.items &= ~IT_INVINCIBLE; + self.items &= ~ITEM_Shield.m_itemid; Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED); } } @@ -198,7 +211,7 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups) { if (time < self.invincible_finished) { - self.items |= IT_INVINCIBLE; + self.items |= ITEM_Shield.m_itemid; Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname); Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED); } @@ -208,7 +221,7 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups) MUTATOR_HOOKFUNCTION(instagib_PlayerPhysics) { - if(self.items & IT_INVINCIBLE) + if(self.items & ITEM_Shield.m_itemid) self.stat_sv_maxspeed = self.stat_sv_maxspeed * autocvar_g_instagib_speed_highspeed; return false; @@ -236,16 +249,33 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerDamage) if(IS_PLAYER(frag_target)) { - if ((frag_deathtype == DEATH_FALL) || - (frag_deathtype == DEATH_DROWN) || - (frag_deathtype == DEATH_SLIME) || - (frag_deathtype == DEATH_LAVA)) + if(frag_deathtype == DEATH_FALL) + frag_damage = 0; // never count fall damage + + if(!autocvar_g_instagib_damagedbycontents) + switch(frag_deathtype) { - frag_damage = 0; + case DEATH_DROWN: + case DEATH_SLIME: + case DEATH_LAVA: + frag_damage = 0; + break; } if(IS_PLAYER(frag_attacker)) - if(DEATH_ISWEAPON(frag_deathtype, WEP_VAPORIZER)) + if(DEATH_ISWEAPON(frag_deathtype, WEP_VAPORIZER.m_id)) + { + if(frag_target.armorvalue) + { + frag_target.armorvalue -= 1; + frag_damage = 0; + frag_target.damage_dealt += 1; + frag_attacker.damage_dealt += 1; // TODO: change this to a specific hitsound for armor hit + Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_INSTAGIB_LIVES_REMAINING, frag_target.armorvalue); + } + } + + if(IS_PLAYER(frag_attacker) && DEATH_ISWEAPON(frag_deathtype, WEP_BLASTER.m_id)) { if(frag_deathtype & HITTYPE_SECONDARY) { @@ -257,14 +287,6 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerDamage) frag_force = '0 0 0'; } } - else if(frag_target.armorvalue) - { - frag_target.armorvalue -= 1; - frag_damage = 0; - frag_target.damage_dealt += 1; - frag_attacker.damage_dealt += 1; // TODO: change this to a specific hitsound for armor hit - Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_INSTAGIB_LIVES_REMAINING, frag_target.armorvalue); - } } } @@ -281,7 +303,7 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerDamage) frag_mirrordamage = 0; } - if(frag_target.items & IT_STRENGTH) + if((frag_target.buffs & BUFF_INVISIBLE.m_itemid) || (frag_target.items & ITEM_Strength.m_itemid)) yoda = 1; return false; @@ -310,19 +332,21 @@ MUTATOR_HOOKFUNCTION(instagib_FilterItem) if(self.classname == "item_cells") return true; // no normal cells? - if(self.weapon == WEP_VAPORIZER && self.classname == "droppedweapon") + if(self.weapon == WEP_VAPORIZER.m_id && self.classname == "droppedweapon") { self.ammo_cells = autocvar_g_instagib_ammo_drop; return false; } - if(self.weapon == WEP_DEVASTATOR || self.weapon == WEP_VORTEX) + if(self.weapon == WEP_DEVASTATOR.m_id || self.weapon == WEP_VORTEX.m_id) { - entity e = spawn(); + entity e = spawn(), oldself; setorigin(e, self.origin); - entity oldself; oldself = self; self = e; + self.noalign = oldself.noalign; + self.cnt = oldself.cnt; + self.team = oldself.team; spawnfunc_item_minst_cells(); self = oldself; return true; @@ -346,7 +370,7 @@ MUTATOR_HOOKFUNCTION(instagib_CustomizeWaypoint) // if you have the invisibility powerup, sprites ALWAYS are restricted to your team // but only apply this to real players, not to spectators - if((self.owner.flags & FL_CLIENT) && (self.owner.items & IT_STRENGTH) && (e == other)) + if((self.owner.flags & FL_CLIENT) && (self.owner.items & ITEM_Strength.m_itemid) && (e == other)) if(DIFF_TEAM(self.owner, e)) return true; @@ -355,15 +379,23 @@ MUTATOR_HOOKFUNCTION(instagib_CustomizeWaypoint) MUTATOR_HOOKFUNCTION(instagib_ItemCountdown) { - switch(self.items) + switch (self.items) { - case IT_STRENGTH: item_name = "item-invis"; item_color = '0 0 1'; break; - case IT_NAILS: item_name = "item-extralife"; item_color = '1 0 0'; break; - case IT_INVINCIBLE: item_name = "item-speed"; item_color = '1 0 1'; break; + case ITEM_Strength.m_itemid: item_name = "item-invis"; item_color = '0 0 1'; break; + case ITEM_ExtraLife.m_itemid: item_name = "item-extralife"; item_color = '1 0 0'; break; + case ITEM_Shield.m_itemid: item_name = "item-speed"; item_color = '1 0 1'; break; } return false; } +MUTATOR_HOOKFUNCTION(instagib_PlayerDies) +{ + if(DEATH_ISWEAPON(frag_deathtype, WEP_VAPORIZER.m_id)) + frag_damage = 1000; // always gib if it was a vaporizer death + + return FALSE; +} + MUTATOR_HOOKFUNCTION(instagib_ItemTouch) { if(self.ammo_cells) @@ -396,7 +428,7 @@ MUTATOR_HOOKFUNCTION(instagib_ItemTouch) MUTATOR_HOOKFUNCTION(instagib_OnEntityPreSpawn) { if (!autocvar_g_powerups) { return false; } - if (!(self.classname == "item_strength" || self.classname == "item_invincible" || self.classname == "item_health_mega")) + if (!(self.classname == "item_strength" || self.classname == "item_invincible" || self.itemdef == ITEM_HealthMega)) return false; entity e = spawn(); @@ -449,6 +481,7 @@ MUTATOR_DEFINITION(mutator_instagib) MUTATOR_HOOK(FilterItem, instagib_FilterItem, CBC_ORDER_ANY); MUTATOR_HOOK(CustomizeWaypoint, instagib_CustomizeWaypoint, CBC_ORDER_ANY); MUTATOR_HOOK(Item_RespawnCountdown, instagib_ItemCountdown, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDies, instagib_PlayerDies, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, instagib_SplitHealthArmor, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPowerups, instagib_PlayerPowerups, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, instagib_ForbidThrowing, CBC_ORDER_ANY);