public static void newMagicAttack(Player p, Entity target, int id, bool ancients) { int index = getSpellIndex(p, id, ancients); bool autoCasting = p.getTemporaryAttribute("autoCasting") != null; bool fakeNPC = target != null && target is Npc && ((Npc)target).getId() == 0; Entity lastAutocastEntity = null; bool frozen = false; if (index == -1) { return; } if (p.getTarget() == null) { if (autoCasting) { if (Location.inMultiCombat(p.getLocation())) { lastAutocastEntity = (Entity) p.getTemporaryAttribute("autocastEntity") == null ? null : (Entity) p.getTemporaryAttribute("autocastEntity"); if (lastAutocastEntity == null || lastAutocastEntity is Player) { p.removeTemporaryAttribute("autoCasting"); Combat.resetCombat(p, 1); return; } if (hitsMulti(p, index)) { Location location = (Location)p.getTemporaryAttribute("autocastLocation"); Entity newTarget = new Npc(0); newTarget.setLocation(location); p.setTarget(newTarget); newMagicAttack(p, newTarget, id, ancients); return; } } else { p.removeTemporaryAttribute("autoCasting"); Combat.resetCombat(p, 1); return; } } else { p.removeTemporaryAttribute("autoCasting"); Combat.resetCombat(p, 1); return; } } else { if (!canCastSpell(p, target, index, fakeNPC)) { p.removeTemporaryAttribute("autoCasting"); Combat.resetCombat(p, 1); return; } } int distance = 8; if (target is Player) { if (((Player)target).getSprites().getPrimarySprite() != -1) { distance = 8; } } if (!fakeNPC) { // we're actually attacking a real npc/player if (!p.getLocation().withinDistance(target.getLocation(), distance)) { p.getFollow().setFollowing(target); Event attemptMagicAttackEvent = new Event(500); int attemptMagicAttackCounter = 0; attemptMagicAttackEvent.setAction(() => { if (p.getLocation().withinDistance(target.getLocation(), distance) && p.getTarget() != null) { attemptMagicAttackEvent.stop(); newMagicAttack(p, target, id, ancients); return; } attemptMagicAttackCounter++; if (attemptMagicAttackCounter >= 12) { attemptMagicAttackEvent.stop(); } }); Server.registerEvent(attemptMagicAttackEvent); return; } } int timeSinceLastCast = autoCasting ? 3500 : 2000; if (Environment.TickCount - p.getLastMagicAttack() < timeSinceLastCast) { p.getWalkingQueue().resetWalkingQueue(); //return; } int time = p.getLastCombatType().Equals(Combat.CombatType.MAGE) ? 1550 : 600; if (Environment.TickCount - p.getLastAttack() < time) { int delay = p.getLastCombatType().Equals(Combat.CombatType.MAGE) ? 1350 : 800; Event attemptMagicAttackEvent = new Event(500); attemptMagicAttackEvent.setAction(() => { if (Environment.TickCount - p.getLastAttack() > delay) { attemptMagicAttackEvent.stop(); newMagicAttack(p, target, id, ancients); } }); Server.registerEvent(attemptMagicAttackEvent); p.getWalkingQueue().resetWalkingQueue(); p.getPackets().clearMapFlag(); p.setLastCombatType(Combat.CombatType.MAGE); return; } if (fakeNPC && !monsterInArea(p, target)) { p.removeTemporaryAttribute("autoCasting"); Combat.resetCombat(p, 1); return; } int endGfx = END_GFX[index]; double damage = misc.random(CombatFormula.getMagicHit(p, target, getSpellMaxHit(p, index))); bool mp = false; bool magicProtect = mp; if (target is Player) { mp = ((Player) target).getPrayers().getHeadIcon() == PrayerData.MAGIC; } if (magicProtect) { damage *= 0.60; } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) == 8841) { damage *= 1.10; // void mace 10% hit increase. } if (damage == 0 && index != 41 && index != 42 && index != 43 && index != 44 && index != 45 && index != 46 && index != 47) { endGfx = 85; } if (!deleteRunes(p, RUNES[index], RUNE_AMOUNTS[index])) { p.setTarget(null); return; } p.getFollow().setFollowing(null); p.getWalkingQueue().resetWalkingQueue(); p.getPackets().clearMapFlag(); p.setFaceLocation(target.getLocation()); if (HANDS_GFX[index] != -1) { p.setLastGraphics(new Graphics(HANDS_GFX[index], 0 , getStartingGraphicHeight(index))); } p.setLastAnimation(new Animation(SPELL_ANIM[index])); p.getPackets().closeInterfaces(); if (target is Player) { ((Player) target).getPackets().closeInterfaces(); } target.setAttacker(p); p.setTarget(target); target.setLastAttacked(Environment.TickCount); p.setLastAttack(Environment.TickCount); p.setLastMagicAttack(Environment.TickCount); p.setCombatTurns(p.getAttackSpeed()); Combat.setSkull(p, target); if (damage > 0) { frozen = freezeTarget(index, target); if (!frozen && index == 31) { endGfx = 1677; } } if (AIR_GFX[index] != -1 || ((index == 31 || index == 27) && target is Player && ((Player)target).getWalkingQueue().isRunning())) { sendProjectile(index, target, p); } if (damage > target.getHp()) { damage = target.getHp(); } if (index == 47 && misc.random(2) == 0) { endGfx = 85; } Combat.checkIfWillDie(target, damage); Event doMagicAttackEvent = new Event(getSpellHitDelay(index)); doMagicAttackEvent.setAction(() => { doMagicAttackEvent.stop(); if (p == null || p.isDead() || !fakeNPC && (target.isDead() || target.isHidden() || target.isDestroyed())) { return; } if (target.isAutoRetaliating() && target.getTarget() == null && damage > 0) { if (target is Npc) { } else { if (((Player) target).getTemporaryAttribute("autoCastSpell") != null) { int autoCastSpell = (int)((Player) target).getTemporaryAttribute("autoCastSpell"); ((Player) target).setTemporaryAttribute("autoCasting", true); target.setTarget(p); MagicCombat.newMagicAttack((Player) target, p, autoCastSpell, ((Player) target).getTemporaryAttribute("autoCastAncients") != null); } } target.getFollow().setFollowing(p); target.setEntityFocus(p.getClientIndex()); if ((target.getCombatTurns() <= (target.getAttackSpeed() / 2) || target.getCombatTurns() >= (target.getAttackSpeed()))) { target.setCombatTurns(target.getAttackSpeed() / 2); } target.setTarget(p); if (target is Player) { ((Player) target).getWalkingQueue().resetWalkingQueue(); ((Player) target).getPackets().clearMapFlag(); } } addMagicXp(p, target, damage, index, true); target.setLastGraphics(new Graphics(endGfx, 0, getGroundHeight(index, endGfx))); if (index == 47 && endGfx != 85) { // teleblock if (target is Player) { teleblockPlayer(p, (Player)target); } } if (damage != 0) { Combat.checkRecoil(p, target, damage); Combat.checkSmite(p, target, damage); Combat.checkVengeance(p, target, damage); hitInMulti(p, target, index); applyMiasmicEffects(p, target, index); if ((target.getCombatTurns() > 2 || target.getCombatTurns() < 0) && !target.isDead()) { target.setLastAnimation(new Animation(target.getDefenceAnimation())); } if (index != 27) { target.hit((int)damage); if (index == 18 || index == 22 || index == 26 || index == 30) { p.heal(Convert.ToInt32(damage / 4)); } } else if (index == 27){ Event doHitEvent = new Event(1000); doHitEvent.setAction(() => { doHitEvent.stop(); target.hit((int)damage); }); Server.registerEvent(doHitEvent); } } }); Server.registerEvent(doMagicAttackEvent); if (p.getTemporaryAttribute("autoCasting") != null) { if (p.getTemporaryAttribute("autoCastSpell") != null) { if (id != (int)p.getTemporaryAttribute("autoCastSpell")) { p.setTarget(null); return; } } if (!fakeNPC) { p.setTemporaryAttribute("autocastLocation", target.getLocation()); p.setTemporaryAttribute("autocastEntity", target); } Event autoCastSpellEvent = new Event(3500); autoCastSpellEvent.setAction(() => { autoCastSpellEvent.stop(); if (p.getTemporaryAttribute("autoCasting") != null && p.getTemporaryAttribute("autoCastSpell") != null) { int autoCastSpell = (int)p.getTemporaryAttribute("autoCastSpell"); MagicCombat.newMagicAttack(p, p.getTarget(), autoCastSpell, p.getTemporaryAttribute("autoCastAncients") != null); } }); Server.registerEvent(autoCastSpellEvent); } else { p.setTarget(null); } }
private static int applyBoltGraphic(Player killer, Entity target, int damage, int bolt) { int hit = misc.random(10); if (hit != 0 || getBowType(killer) != BOW_TYPE.CROSSBOW) { return damage; } double maxDamage = getDamage((Player)killer, target, ((Player)killer).getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON), bolt); switch(bolt) { case 9236: // Opal. target.setLastGraphics(new Graphics(749)); maxDamage *= 1.25; break; case 9237: // Jade. target.setLastGraphics(new Graphics(756)); //TODO Falling emote break; case 9238: // Pearl. target.setLastGraphics(new Graphics(750)); break; case 9239: // Topaz. target.setLastGraphics(new Graphics(757, 0, 0)); if (target is Player) { int magicLevel = ((Player) target).getSkills().getCurLevel(Skills.SKILL.MAGIC); if (magicLevel == 1) return (int)maxDamage; int magicLevelDeduction = misc.random(1,10); magicLevelDeduction = Math.Min(magicLevelDeduction, (magicLevel - 1)); string s = magicLevelDeduction == 1 ? "" : "s"; ((Player)target).getSkills().setCurLevel(Skills.SKILL.MAGIC, magicLevel - magicLevelDeduction); ((Player)target).getPackets().sendSkillLevel(Skills.SKILL.MAGIC); ((Player)target).getPackets().sendMessage("Your Magic level has been reduced by " + magicLevelDeduction + " level" + s + " !"); } break; case 9240: // Sapphire. target.setLastGraphics(new Graphics(751)); if (target is Player) { int prayerLevel = ((Player)target).getSkills().getCurLevel(Skills.SKILL.PRAYER); if (prayerLevel == 1) return (int)maxDamage; int prayerLevelDeduction = misc.random(1, 10); prayerLevelDeduction = Math.Min(prayerLevelDeduction, (prayerLevel - 1)); string s = prayerLevelDeduction == 1 ? "" : "s"; ((Player)target).getSkills().setCurLevel(Skills.SKILL.PRAYER, prayerLevel - prayerLevelDeduction); ((Player)target).getPackets().sendSkillLevel(Skills.SKILL.PRAYER); ((Player)target).getPackets().sendMessage("Your Prayer level has been lowered by " + prayerLevelDeduction + " level" + s + " !"); killer.getPackets().sendMessage("You steal " + prayerLevelDeduction + " Prayer point" + s + " from your opponent!"); int prayerLevelObtained = Math.Min(killer.getSkills().getCurLevel(Skills.SKILL.PRAYER)+prayerLevelDeduction, killer.getSkills().getMaxLevel(Skills.SKILL.PRAYER)); killer.getSkills().setCurLevel(Skills.SKILL.PRAYER, prayerLevelObtained); killer.getPackets().sendSkillLevel(Skills.SKILL.PRAYER); } break; case 9241: // Emerald. if (!target.isPoisoned()) { Server.registerEvent(new PoisonEvent(target, 6)); target.setLastGraphics(new Graphics(752)); } break; case 9242: // Ruby target.setLastGraphics(new Graphics(754)); int currentHP = killer.getHp(); bool has11Percent = (currentHP * 0.11) < currentHP; int removeFromOpponent = (int) (target.getHp() * 0.20); //20% off opponents HP. if (has11Percent) { killer.hit((int)(currentHP * 0.10)); target.hit(removeFromOpponent); killer.getPackets().sendMessage("You sacrifice some of your own health to deal more damage to your opponent!"); } break; case 9243: // Diamond. target.setLastGraphics(new Graphics(758)); maxDamage *= 1.15; //TODO this affects opponents range defence for X minutes. break; case 9244: // Dragon. bool hitsFire = true; if (target is Player) { int shield = ((Player)target).getEquipment().getItemInSlot(ItemData.EQUIP.SHIELD); /* * Opponent has anti-fire shield. */ if (shield == 11283 || shield == 1540) { hitsFire = false; } } else { int id = ((Npc)target).getId(); /* * NPC is a dragon */ if ((id >= 50 && id <= 55) || id == 941 || (id >= 1589 && id <= 1592) || id == 2642 || id == 3376 || id == 3588 || id == 3590 || (id >= 4665 && id <= 4684) || id == 5178 || id == 5362 || id == 5363) { hitsFire = false; } } if (hitsFire) { target.setLastGraphics(new Graphics(756)); maxDamage *= 1.45; //increase damage by 145%. } break; case 9245: // Onyx. target.setLastGraphics(new Graphics(753)); maxDamage *= 1.15; killer.heal(misc.random((int) (maxDamage * 0.60))); break; } damage = misc.random((int)maxDamage); if (misc.random(2) == 0 && bolt != 9242) { damage = (int) ((maxDamage * 0.50) + misc.random((int) (maxDamage * 0.50))); } if (damage > target.getHp()) { damage = target.getHp(); } return damage; }
public static void hitInMulti(Player p, Entity mainTarget, int index) { if (!Location.inMultiCombat(p.getLocation()) || !Location.inMultiCombat(mainTarget.getLocation())) { return; } else if (!hitsMulti(p, index)) { return; } Location l = mainTarget.getLocation(); double totalDamage = 0; if (mainTarget is Npc) { foreach(Npc n in Server.getNpcList()) { if (n == null || n.Equals(mainTarget) || n.isDead() || n.isHidden() || n.isDestroyed()) { continue; } if (n.getLocation().inArea(l.getX() - 1, l.getY() - 1, l.getX() + 1, l.getY() + 1)) { if (!canCastSpell2(p, mainTarget, index, false)) { continue; } if (n.isAutoRetaliating() && n.getTarget() == null) { //n.getFollow().setFollowing(killer); n.setEntityFocus(p.getClientIndex()); n.setCombatTurns(n.getAttackSpeed() / 2); n.setTarget(p); } int damage = misc.random(misc.random(getSpellMaxHit(p, index))); //double randomize? uhh wtf? int graphic = END_GFX[index]; if (damage == 0) { graphic = 85; } if (damage > n.getHp()) { damage = n.getHp(); } if (damage > 0) { bool frozen = freezeTarget(index, n); if (!frozen && index == 31) { graphic = 1677; } } totalDamage += damage; n.setAttacker(p); n.setLastAttacked(Environment.TickCount); n.setLastGraphics(new Graphics(graphic, 0, getGroundHeight(index, graphic))); n.hit(damage); if ((n.getCombatTurns() > 2 || n.getCombatTurns() < 0)) { n.setLastAnimation(new Animation(n.getDefenceAnimation())); } addDamage(p, n, damage); } } } else { foreach(Player target in Server.getPlayerList()) { if (mainTarget == null || target.Equals(mainTarget) || target.isDead() || target.isHidden() || target.isDestroyed()) { continue; } if (target.getLocation().inArea(l.getX() - 1, l.getY() - 1, l.getX() + 1, l.getY() + 1)) { if (!canCastSpell2(p, mainTarget, index, false)) { continue; } if (target.isAutoRetaliating() && target.getTarget() == null) { //n.getFollow().setFollowing(killer); target.setEntityFocus(p.getClientIndex()); target.setCombatTurns(target.getAttackSpeed() / 2); target.setTarget(p); } int damage = misc.random(misc.random(getSpellMaxHit(p, index))); //double randomize? uhh wtf? int graphic = END_GFX[index]; if (damage == 0) { graphic = 85; } if (damage > target.getHp()) { damage = target.getHp(); } if (damage > 0) { bool frozen = freezeTarget(index, target); if (!frozen && index == 31) { graphic = 1677; } } totalDamage += damage; target.setAttacker(p); target.setLastAttacked(Environment.TickCount); target.setLastGraphics(new Graphics(graphic, 0, getGroundHeight(index, graphic))); target.hit(damage); if ((target.getCombatTurns() > 2 || target.getCombatTurns() < 0)) { target.setLastAnimation(new Animation(target.getDefenceAnimation())); } addDamage(p, target, damage); } } } if (totalDamage > 0) { addMagicXp(p, null, totalDamage, index, false); if (index == 18 || index == 22 || index == 26 || index == 30) { p.heal((int) (totalDamage * 0.25)); } } }