private static double getDamage(Player killer, Entity target, int usingBow, int usingArrows)
        {
            double damage = CombatFormula.getRangeHit(killer, target, usingBow, usingArrows);

            if (target is Player)
            {
                PrayerData.PrayerHeadIcon prayerHeadIcon = ((Player)target).getPrayers().getHeadIcon();
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    return(damage * 0.60);                //60% decrease.
                }
                else
                {
                    return(damage);
                }
            }
            return(damage);
        }
        public static void fightCaveAttacks(Npc npc, Player p)
        {
            if (npc.isDead() || npc.isDestroyed() || p.isDead() || p.isDestroyed() || p.isDead() || !Location.inFightCave(p.getLocation()) || p.getTeleportTo() != null)
            {
                return;
            }
            double damage = misc.randomDouble(npc.getMaxHit());

            PrayerData.PrayerHeadIcon prayerHeadIcon = p.getPrayers().getHeadIcon();
            int hitDelay  = npc.getHitDelay();
            int animation = npc.getAttackAnimation();

            switch (npc.getId())
            {
            case 2734:                 // Tz-Kih (lvl 22)
            case 2735:
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                break;

            case 2739:                 // Tz-Xil (lvl 90)
            case 2740:
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                p.getPackets().sendProjectile(npc.getLocation(), p.getLocation(), 32, 1616, 50, 40, 34, 50, p);
                break;

            case 2741:                 // Yt-MejKot (lvl 180)
            case 2742:
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                // TODO healing
                break;

            case 2743:                 // Ket-Zek (lvl 360)
            case 2744:
                if (!p.getLocation().withinDistance(npc.getLocation(), 2))
                {
                    hitDelay  = 1600;
                    animation = 9266;
                    npc.setLastGraphics(new Graphics(1622));
                    damage = misc.randomDouble(49);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                    {
                        damage = 0;
                    }
                    Event sendProjectileToNpc = new Event(300);
                    sendProjectileToNpc.setAction(() => {
                        sendProjectileToNpc.stop();
                        p.getPackets().sendProjectile(npc.getLocation(), p.getLocation(), 32, 1623, 50, 40, 34, 80, p);
                    });
                    Server.registerEvent(sendProjectileToNpc);
                }
                else
                {
                    damage = misc.randomDouble(64);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                    {
                        damage = 0;
                    }
                }
                break;

            case 2745:                 // TzTok Jad (lvl 702)
                doJadAttacks(p, npc);
                break;
            }
            if (npc.getId() == 2745)
            {
                return;
            }
            if (animation != 65535)
            {
                npc.setLastAnimation(new Animation(animation));
            }
            p.setLastAttacked(Environment.TickCount);
            npc.setLastAttack(Environment.TickCount);
            p.setAttacker(npc);
            npc.resetCombatTurns();
            if (damage > p.getHp())
            {
                damage = p.getHp();
            }
            int npcId = npc.getId();

            Event losePrayerFightingEvent = new Event(hitDelay);

            losePrayerFightingEvent.setAction(() => {
                losePrayerFightingEvent.stop();
                if (!Location.inFightCave(p.getLocation()) || p.getTeleportTo() != null)
                {
                    return;
                }
                if (npcId == 2734 || npcId == 2735)
                {
                    int prayerLevel    = p.getSkills().getCurLevel(Skills.SKILL.PRAYER);
                    int newPrayerLevel = prayerLevel -= (int)(damage + 1);
                    if (newPrayerLevel <= 0)
                    {
                        newPrayerLevel = 0;
                    }
                    p.getSkills().setCurLevel(Skills.SKILL.PRAYER, newPrayerLevel);
                    p.getPackets().sendSkillLevel(Skills.SKILL.PRAYER);
                }
                else if (npcId == 2743 || npcId == 2744)
                {
                    if (misc.random(1) == 0)
                    {
                        p.setLastGraphics(new Graphics(1624, 0));
                    }
                }
                if ((p.getCombatTurns() > 2 || p.getCombatTurns() < 0))
                {
                    p.setLastAnimation(new Animation(p.getDefenceAnimation()));
                }
                p.hit(damage);
            });
            Server.registerEvent(losePrayerFightingEvent);
        }
Beispiel #3
0
        public static void attack(Npc npc, Entity target)
        {
            if (npc.isDead() || npc.isDestroyed() || target.isDead() || target.isDestroyed() || target.isDead())
            {
                return;
            }
            double damage = misc.randomDouble(npc.getMaxHit());

            PrayerData.PrayerHeadIcon prayerHeadIcon = ((Player)target).getPrayers().getHeadIcon();
            int  hitDelay  = npc.getHitDelay();
            int  animation = npc.getAttackAnimation();
            bool special   = false;

            switch (npc.getId())
            {
            case 6263:                 // Steelwill (bandos mage)
                hitDelay  = 1000;
                animation = 65535;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                {
                    damage = 0;
                }

                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1203, 50, 40, 34, 50, target);
                //npc.graphics(1201);
                break;

            case 6260:                 // Graardor (bandos)
                randomMessage(npc, BANDOS_SHOUTS);
                if (misc.random(3) == 0)
                {
                    special   = true;
                    hitDelay  = 1000;
                    animation = 7063;
                    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1200, 50, 40, 34, 50, target);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                    {
                        damage = 0;
                    }
                    else
                    {
                        damage = misc.randomDouble(35);
                    }
                }
                else
                {
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                    {
                        damage = 0;
                    }
                }
                break;

            case 6265:                 // Grimspike (bandos range)
                hitDelay  = 1000;
                animation = 65535;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1206, 50, 40, 34, 50, target);
                //npc.graphics(1201);
                break;

            case 6247:                 // Zilyana (sara boss)
                randomMessage(npc, SARADOMIN_SHOUTS);
                //One out of 3 chance
                if (misc.random(3) == 0)
                {
                    animation = 6967;
                    special   = true;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                    {
                        damage = 0;
                    }
                }
                else
                {
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                    {
                        damage = 0;
                    }
                }
                break;

            case 6250:                 // Growler (sara mage)
                hitDelay = 1000;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1227, 50, 20, 27, 50, target);
                break;

            case 6252:                 // Bree (sara range)
                hitDelay = 1000;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1227, 50, 20, 27, 50, target);
                //TODO all anims
                break;

            case 6203:                 // K'ril Tsutsaroth (zammy boss)
                randomMessage(npc, ZAMORAK_SHOUTS);
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                //One out of 3 chance.
                if (misc.random(3) == 0)
                {
                    animation = 6947;
                    damage    = misc.randomDouble(49);
                    if (prayerHeadIcon != PrayerData.PrayerHeadIcon.MELEE && damage < (49 / 2))
                    {
                        damage = (49 / 2) + misc.randomDouble(49 / 2);
                    }
                }
                //One out of 4 chance.
                if (misc.random(4) == 0)
                {
                    if (!target.isPoisoned())
                    {
                        if (damage > 0)
                        {
                            Server.registerEvent(new PoisonEvent(target, 16));
                        }
                    }
                }
                break;

            case 6208:                 // Balfrug Kreeyath (zammy mage)
                hitDelay = 1200;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1213, 50, 20, 27, 70, target);
                // TODO attack anim
                break;

            case 6206:                 // Zakl'n Gritch (zammy range)
                hitDelay = 1200;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                npc.setLastGraphics(new Graphics(1208));
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1209, 50, 20, 27, 70, target);
                break;

            case 6222:                 // Kree'arra (armadyl boss)
                //One out of 4 chance npc talking will display.
                if (misc.random(4) == 0)
                {
                    npc.setForceText("Kraaaaw!");
                }
                hitDelay = 1200;
                //50% chance
                if (misc.random(2) == 0 && npc.getAttacker() != null && npc.getAttacker().Equals(npc.getTarget()))
                {
                    special = true;
                    // Magic attack
                    damage = misc.randomDouble(21);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                    {
                        damage = 0;
                    }
                    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1198, 50, 20, 27, 70, target);
                }
                else if (npc.getAttacker() != null && npc.getAttacker().Equals(npc.getTarget()))
                {
                    //range attack
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                    {
                        damage = 0;
                    }
                    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1197, 50, 20, 27, 70, target);
                }
                else
                {
                    // do melee attack because they arent attacking kree arra
                    damage = misc.randomDouble(25);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                    {
                        damage = 0;
                    }
                    animation = 6977;
                }
                break;

            case 6223:                 // Armadyl mage
                hitDelay = 1200;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1199, 50, 20, 27, 70, target);
                break;

            case 6225:                 // Armadyl range
                hitDelay = 1200;
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1190, 50, 20, 27, 70, target);
                break;
            }
            if (animation != 65535)
            {
                npc.setLastAnimation(new Animation(animation));
            }
            target.setLastAttacked(Environment.TickCount);
            npc.setLastAttack(Environment.TickCount);
            target.setAttacker(npc);
            npc.resetCombatTurns();
            if (damage > target.getHp())
            {
                damage = target.getHp();
            }
            double hit         = damage;
            Event  attackEvent = new Event(hitDelay);

            attackEvent.setAction(() => {
                attackEvent.stop();
                if (npc.getId() == 6263)
                {
                    target.setLastGraphics(new Graphics(((hit > 0.10) ? 166 : 85), 0, 100));
                }
                else if (npc.getId() == 6260)
                {
                    if (special)
                    {
                        target.setLastGraphics(new Graphics(((hit > 0.10) ? 160 : 65535), 0, 100));
                    }
                }
                else if (npc.getId() == 6247)
                {
                    if (special)
                    {
                        if (hit < 0.10)   //No damage.
                        {
                            return;
                        }
                        else
                        {
                            target.setLastGraphics(new Graphics(1207, 0, 100));
                            npc.setCombatTurns(npc.getAttackSpeed() * 2);
                        }
                    }
                }
                else if (npc.getId() == 6208)
                {
                    if (hit < 0.10)                     //No damage.
                    {
                        target.setLastGraphics(new Graphics(85, 0, 100));
                    }
                }
                else if (npc.getId() == 6222)
                {
                    if (special)
                    {
                        target.setLastGraphics(new Graphics(((hit > 0.10) ? 85 : 65535), 0, 100));
                    }
                }
                if ((target.getCombatTurns() > 2 || target.getCombatTurns() < 0))
                {
                    target.setLastAnimation(new Animation(target.getDefenceAnimation()));
                }
                target.hit(hit);
            });
            Server.registerEvent(attackEvent);
        }
        private static void doJadAttacks(Player p, Npc npc)
        {
            if (npc.getHp() <= (npc.getMaxHp() * 0.50))
            {
                if (p.getFightCave() != null)
                {
                    if (!p.getFightCave().isHealersSpawned())
                    {
                        summonJadHealers(p, npc);
                        p.getFightCave().setHealersSpawned(true);
                    }
                }
            }
            npc.resetCombatTurns();
            npc.setEntityFocus(p.getClientIndex());
            switch (misc.random(1))
            {
            case 0:                 // Range
                npc.setLastAnimation(new Animation(9276));
                npc.setLastGraphics(new Graphics(1625));
                Event jadRangeAttackEvent  = new Event(1600);
                int   jadRangeAttackStatus = 0;
                jadRangeAttackEvent.setAction(() => {
                    double hit = 0;
                    PrayerData.PrayerHeadIcon prayerHeadIcon = p.getPrayers().getHeadIcon();
                    if (jadRangeAttackStatus == 0)
                    {
                        jadRangeAttackStatus++;
                        jadRangeAttackEvent.setTick(1500);
                        p.setLastGraphics(new Graphics(451));
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                        {
                            hit = 0;
                        }
                        else
                        {
                            hit = misc.randomDouble(96);
                        }
                    }
                    else
                    {
                        if (prayerHeadIcon != PrayerData.PrayerHeadIcon.RANGE)
                        {
                            hit = misc.randomDouble(96);
                        }
                        jadRangeAttackEvent.stop();
                        p.setLastAttacked(Environment.TickCount);
                        npc.setLastAttack(Environment.TickCount);
                        p.setAttacker(npc);
                        if (hit > p.getHp())
                        {
                            hit = p.getHp();
                        }
                        if (!Location.inFightCave(p.getLocation()) || p.getTeleportTo() != null)
                        {
                            return;
                        }
                        if ((p.getCombatTurns() > 2 || p.getCombatTurns() < 0))
                        {
                            p.setLastAnimation(new Animation(p.getDefenceAnimation()));
                        }
                        p.hit(hit);
                        Event animationEvent = new Event(100);
                        animationEvent.setAction(() => {
                            animationEvent.stop();
                            p.setLastGraphics(new Graphics(157, 0, 100));
                        });
                        Server.registerEvent(animationEvent);
                    }
                });
                Server.registerEvent(jadRangeAttackEvent);
                break;

            case 1:                 // Magic
                npc.setLastGraphics(new Graphics(1626));
                Event jadMagicAttackEvent  = new Event(300);
                int   jadMagicAttackStatus = 0;
                jadMagicAttackEvent.setAction(() => {
                    double hit = 0;
                    PrayerData.PrayerHeadIcon prayerHeadIcon = p.getPrayers().getHeadIcon();
                    npc.setLastAnimation(new Animation(9278));
                    if (jadMagicAttackStatus == 0)
                    {
                        jadMagicAttackStatus++;
                        jadMagicAttackEvent.setTick(1600);
                        p.getPackets().sendProjectile(npc.getLocation(), p.getLocation(), 32, 1627, 50, 40, 34, 90, p);
                    }
                    else
                    {
                        jadMagicAttackEvent.stop();
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                        {
                            hit = 0;
                        }
                        else
                        {
                            hit = misc.randomDouble(96);
                        }
                        p.setLastAttacked(Environment.TickCount);
                        npc.setLastAttack(Environment.TickCount);
                        p.setAttacker(npc);
                        if (hit > p.getHp())
                        {
                            hit = p.getHp();
                        }
                        if (!Location.inFightCave(p.getLocation()) || p.getTeleportTo() != null)
                        {
                            return;
                        }
                        if ((p.getCombatTurns() > 2 || p.getCombatTurns() < 0))
                        {
                            p.setLastAnimation(new Animation(p.getDefenceAnimation()));
                        }
                        p.hit(hit);
                        Event animationEvent = new Event(100);
                        animationEvent.setAction(() => {
                            animationEvent.stop();
                            p.setLastGraphics(new Graphics(157, 0, 100));
                        });
                        Server.registerEvent(animationEvent);
                    }
                });
                Server.registerEvent(jadMagicAttackEvent);
                break;
            }
        }
        public static void attack(Npc npc, Entity target)
        {
            if (npc.isDead() || npc.getOwner() == null || npc.isDestroyed() || target.isDead() || target.isDestroyed())
            {
                return;
            }
            double damage = misc.randomDouble(npc.getMaxHit());

            PrayerData.PrayerHeadIcon prayerHeadIcon = ((Player)target).getPrayers().getHeadIcon();
            int  hitDelay = npc.getHitDelay();
            bool special  = false;

            switch (npc.getId())
            {
            case 2026:                 // Dharok
                int healthHit = (npc.getMaxHp() - npc.getHp()) / 2;
                damage = misc.randomDouble(damage + healthHit);
                if (misc.random(1) == 0)
                {
                    if (damage < (npc.getMaxHp() / 3))
                    {
                        damage = (npc.getMaxHp() / 4) + misc.randomDouble(damage + healthHit) - (npc.getMaxHp() / 4);
                    }
                }
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                break;

            case 2025:                 // Ahrim
                hitDelay = 1000;
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 156, 50, 40, 34, 60, target);
                if (misc.random(3) == 0)
                {
                    special = true;
                    Skills.SKILL[] weakenableSkills = (Skills.SKILL[])Enum.GetValues(typeof(Skills.SKILL));
                    Skills.SKILL   weakenedSkill    = weakenableSkills[misc.random(0, 2)];
                    int            currentLevel     = ((Player)target).getSkills().getCurLevel(weakenedSkill);
                    int            newLevel         = currentLevel - misc.random(((Player)target).getSkills().getMaxLevel(weakenedSkill) / 12);
                    newLevel = Math.Max(0, newLevel);
                    ((Player)target).getSkills().setCurLevel(weakenedSkill, newLevel);
                    ((Player)target).getPackets().sendSkillLevel(weakenedSkill);
                }
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
                {
                    damage = 0;
                }
                break;

            case 2027:                 // Guthan
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                if (misc.random(3) == 0)
                {
                    special = true;
                    target.setLastGraphics(new Graphics(398));
                    npc.heal(misc.random((int)damage));
                }
                break;

            case 2030:                 // Verac
                if (misc.random(1) == 0 && prayerHeadIcon != PrayerData.PrayerHeadIcon.MELEE)
                {
                    if (damage <= npc.getMaxHit() / 2)
                    {
                        damage += npc.getMaxHit() / 2;
                        if (damage > npc.getMaxHit())
                        {
                            damage = npc.getMaxHit();
                        }
                    }
                }
                break;

            case 2029:                 // Torag
                if (misc.random(3) == 0)
                {
                    special = true;
                }
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
                {
                    damage = 0;
                }
                break;

            case 2028:                 // Karil
                hitDelay = 700;
                ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 27, 50, 40, 34, 40, target);
                if (misc.random(10) == 0)
                {
                    special = true;
                    int agility    = ((Player)target).getSkills().getCurLevel(Skills.SKILL.AGILITY);
                    int newAgility = agility / 4;
                    if (newAgility <= 1)
                    {
                        newAgility = 1;
                    }
                    ((Player)target).getSkills().setCurLevel(Skills.SKILL.AGILITY, newAgility);
                    ((Player)target).getPackets().sendSkillLevel(Skills.SKILL.AGILITY);
                }
                if (misc.random(1) == 0)
                {
                    damage = damage > 0 ? damage : misc.randomDouble(npc.getMaxHit());
                }
                if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
                {
                    damage = 0;
                }
                break;
            }
            npc.setLastAnimation(new Animation(npc.getAttackAnimation()));
            target.setLastAttacked(Environment.TickCount);
            npc.setLastAttack(Environment.TickCount);
            npc.resetCombatTurns();
            target.setAttacker(npc);
            if ((target.getCombatTurns() > 2 || target.getCombatTurns() < 0))
            {
                target.setLastAnimation(new Animation(target.getDefenceAnimation()));
            }
            if (damage > target.getHp())
            {
                damage = target.getHp();
            }
            Event doHitEvent = new Event(hitDelay);

            doHitEvent.setAction(() => {
                if (npc.getId() == 2025)
                {
                    if (special)
                    {
                        target.setLastGraphics(new Graphics(400, 0, 100));
                        ((Player)target).getPackets().sendMessage("You feel weakened.");
                    }
                    target.setLastGraphics(new Graphics(damage == 0 ? 85 : 157, 0, 100));
                }
                else if (npc.getId() == 2027)
                {
                    if (special)
                    {
                        if (!npc.isDead())
                        {
                            int newHp = npc.getHp() + (int)damage;
                            if (newHp > npc.getMaxHp())
                            {
                                newHp = npc.getMaxHp();
                            }
                            npc.setHp(newHp);
                        }
                    }
                }
                else if (npc.getId() == 2029)
                {
                    if (special)
                    {
                        target.setLastGraphics(new Graphics(399, 0, 100));
                        int energy    = ((Player)target).getRunEnergy();
                        int newEnergy = energy - (int)(energy * 0.50);
                        if (newEnergy < 0)
                        {
                            newEnergy = 0;
                        }
                        ((Player)target).getPackets().sendMessage("You feel drained of energy.");
                        ((Player)target).setRunEnergy(newEnergy);
                        ((Player)target).getPackets().sendEnergy();
                    }
                }
                else if (npc.getId() == 2028)
                {
                    if (special)
                    {
                        target.setLastGraphics(new Graphics(399));
                        ((Player)target).getPackets().sendMessage("You feel less agile.");
                    }
                }
                target.hit(damage);
                doHitEvent.stop();
            });
        }