public DeathEvent(Entity entity) : base(entity is Player ? 6000 : (((Npc)entity).getDeathTime())) { this.entity = entity; this.firstNpcStage = false; this.entity.setEntityFocus(65535); this.entity.setLastAnimation(new Animation(entity.getDeathAnimation(), 50)); this.lastAttacker = entity.getAttacker() == null ? null : entity.getAttacker(); entity.setPoisonAmount(0); if (entity.getFollow() != null) { entity.getFollow().setFollowing(null); } if (entity.getTarget() != null) { if (entity.getTarget().getAttacker() == null || entity.getTarget().getAttacker().Equals(entity)) Combat.resetCombat(entity.getTarget(), 1); } if (entity.getAttacker() != null) { if (entity.getAttacker().getTarget() == null || entity.getAttacker().getTarget().Equals(entity)) Combat.resetCombat(entity.getAttacker(), 1); } entity.setTarget(null); entity.setAttacker(null); if (entity.getKiller() != null) { if (entity is Npc) { if (((Npc)this.entity).getId() >= 2025 && ((Npc)this.entity).getId() <= 2030) { Barrows.killBrother((Player)entity.getKiller(), ((Npc)this.entity).getId()); } if (entity.getKiller() is Player) { Slayer.checkSlayerKill((Player)entity.getKiller(), (Npc)entity); } } } if (entity is Player) { if (((Player)entity).getPrayers().getHeadIcon() == PrayerData.RETRIBUTION) { doRedemption((Player)entity); } ((Player)entity).setDistanceEvent(null); ((Player)entity).getWalkingQueue().resetWalkingQueue(); ((Player)entity).getPackets().clearMapFlag(); ((Player)entity).removeTemporaryAttribute("autoCasting"); if (((Player)entity).getDuel() == null) { if (!Location.inFightPits(entity.getLocation()) && !Location.inFightCave(entity.getLocation())) { ((Player)entity).getPackets().sendMessage("Oh dear, you are dead!"); } else { ((Player)entity).getPackets().sendMessage("You have been defeated!"); } } ((Player)entity).setTemporaryAttribute("unmovable", true); if (((Player)entity).getDuel() != null) { ((Player)entity).getDuel().getPlayer2().setTemporaryAttribute("unmovable", true); } SkillHandler.resetAllSkills((Player)entity); if ((entity.getKiller() is Player)) { Player killer = (Player)entity.getKiller(); if (killer.getDuel() == null) { int id = Misc.random(DEATH_MESSAGES.Length - 1); string deathMessage = DEATH_MESSAGES[id]; if (id <= 4) { killer.getPackets().sendMessage(deathMessage + " " + ((Player)entity).getLoginDetails().getUsername() + "."); } else { killer.getPackets().sendMessage(((Player)entity).getLoginDetails().getUsername() + " " + deathMessage + "."); } } else { killer.setPoisonAmount(0); } } } }
private static bool canCastSpell(Player p, Entity target, int i, bool fakeNPC) { // fakeNPC is used to keep location when autocasting. if (fakeNPC) { return !p.isDead(); } if (target.isDead() || p.isDead() || target.isDestroyed() || p.isDestroyed()) { return false; } if (target is Npc) { if (((Npc)target).getHp() <= 0) { return false; } if (i == 47) { p.getPackets().sendMessage("You cannot cast Teleblock upon an NPC."); return false; } } if ((target is Player) && (p is Player)) { if (Location.inFightPits(target.getLocation()) && Location.inFightPits(target.getLocation())) { if (!Server.getMinigames().getFightPits().hasGameStarted()) { return false; } return true; } if (p.getDuel() != null) { if (((Player)target).getDuel() != null) { if (p.getDuel().getPlayer2().Equals(((Player)target)) && ((Player)target).getDuel().getPlayer2().Equals(p)) { if (p.getDuel().ruleEnabled(DuelSession.RULE.NO_MAGIC)) { p.getPackets().sendMessage("Magical combat has been disabled in this duel!"); return false; } if (p.getDuel().getStatus() == 6 && ((Player)target).getDuel().getStatus() == 6) { return true; } } } p.getPackets().sendMessage("That isn't your opponent."); return false; } if (i == 47) { if (((Player)target).getTemporaryAttribute("teleblocked") != null) { p.getPackets().sendMessage("That player already has a teleportation block upon them."); return false; } } if (!Location.inWilderness(target.getLocation())) { p.getPackets().sendMessage("That player isn't in the wilderness."); return false; } if (!Location.inWilderness(p.getLocation())) { p.getPackets().sendMessage("You aren't in the wilderness."); return false; } int killerWildLevel = p.getLocation().wildernessLevel(); int targetWildLevel = ((Player)target).getLocation().wildernessLevel(); int killerCombatLevel = p.getSkills().getCombatLevel(); int targetCombatLevel = ((Player)target).getSkills().getCombatLevel(); int highest = killerCombatLevel > targetCombatLevel ? killerCombatLevel : targetCombatLevel; int lowest = highest == killerCombatLevel ? targetCombatLevel : killerCombatLevel; int difference = (highest - lowest); if (difference > killerWildLevel || difference > targetWildLevel) { ((Player)p).getPackets().sendMessage("You must move deeper into the wilderness to attack that player."); return false; } } if (!Location.inMultiCombat(target.getLocation())) { if (p.getAttacker() != null && !p.getAttacker().Equals(target)) { p.getPackets().sendMessage("You are already in combat!"); return false; } if (target.getAttacker() != null && !target.getAttacker().Equals(p)) { string type = target is Player ? "player" : "npc"; p.getPackets().sendMessage("That " + type + " is already in combat."); return false; } } if (p.getSkills().getCurLevel(Skills.SKILL.MAGIC) < SPELL_LEVEL[i]) { p.getPackets().sendMessage("You need a Magic level of " + SPELL_LEVEL[i] + " to cast that spell."); return false; } if (!hasRunes(p, RUNES[i], RUNE_AMOUNTS[i])) { p.getPackets().sendMessage("You do not have enough runes to cast that spell."); return false; } if (NEEDS_STAFF[i]) { if ((i != 38 && p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) != STAFF[i]) || (i == 38 && p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) != 8841 && p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) != STAFF[i])) { p.getPackets().sendMessage("You need to wield " + STAFF_NAME[i] + " to cast this spell."); return false; } } if (i == 37) { if (p.getEquipment().getItemInSlot(ItemData.EQUIP.CAPE) != 2412) { p.getPackets().sendMessage("You need to wear the Cape of Saradomin to be able to cast Saradomin Strike."); return false; } } if (i == 38) { if (p.getEquipment().getItemInSlot(ItemData.EQUIP.CAPE) != 2413) { p.getPackets().sendMessage("You need to wear the Cape of Guthix to be able to cast Claws of Guthix."); return false; } } if (i == 39) { if (p.getEquipment().getItemInSlot(ItemData.EQUIP.CAPE) != 2414) { p.getPackets().sendMessage("You need to wear the Cape of Zamorak to be able to cast Flames of Zamorak."); return false; } } return true; }
public static void resetCombat(Entity killer, int type) { if (killer != null) { killer.setEntityFocus(65535); killer.setTarget(null); killer.getFollow().setFollowing(null); if (type == 1) { killer.setLastAttack(0); killer.setLastAttacked(0); if (killer.getAttacker() != null) { if (killer.getAttacker().getEntityFocus() != -1) { if (killer.getAttacker().getEntityFocus() == killer.getClientIndex()) { killer.getAttacker().setEntityFocus(65535); } } killer.setAttacker(null); } } } }
private static bool canAttack(Entity killer, Entity target, bool usingRange) { if (target.isDead() || killer.isDead() || target.isDestroyed() || killer.isDestroyed()) { return false; } if (killer is Npc) { if (((Npc)killer).getId() < 2025 && ((Npc)killer).getId() > 2030) { if (!target.getLocation().inArea(((Npc)killer).getMinimumCoords().getX(), ((Npc)killer).getMinimumCoords().getY(), ((Npc)killer).getMaximumCoords().getX(), ((Npc)killer).getMaximumCoords().getY())) { return false; } } } if (target is Npc) { if (((Npc)target).getHp() <= 0) { return false; } if (((Npc)target).getId() >= 6222 && ((Npc)target).getId() <= 6228) { if (!usingRange && killer is Player) { ((Player)killer).getPackets().sendMessage("You are unable to reach the flying beast.."); return false; } } } if ((target is Player) && (killer is Player)) { if (Location.inFightPits(target.getLocation()) && Location.inFightPits(((Player)killer).getLocation())) { if (!Server.getMinigames().getFightPits().hasGameStarted()) { return false; } return true; } if (((Player)killer).getDuel() != null) { if (((Player)target).getDuel() != null) { if (((Player)killer).getDuel().getPlayer2().Equals(((Player)target)) && ((Player)target).getDuel().getPlayer2().Equals(((Player)killer))) { if (((Player)killer).getDuel().ruleEnabled(DuelSession.RULE.NO_MELEE)) { ((Player)killer).getPackets().sendMessage("Melee combat has been disabled in this duel!"); return false; } if (((Player)killer).getDuel().getStatus() == 6 && ((Player)target).getDuel().getStatus() == 6) { return true; } } } ((Player)killer).getPackets().sendMessage("That isn't your opponent."); return false; } else if (!Location.inWilderness(target.getLocation())) { ((Player)killer).getPackets().sendMessage("That player isn't in the wilderness."); return false; } else if (!Location.inWilderness(killer.getLocation())) { ((Player)killer).getPackets().sendMessage("You aren't in the wilderness."); return false; } int killerWildLevel = ((Player)killer).getLocation().wildernessLevel(); int targetWildLevel = ((Player)target).getLocation().wildernessLevel(); int killerCombatLevel = ((Player)killer).getSkills().getCombatLevel(); int targetCombatLevel = ((Player)target).getSkills().getCombatLevel(); int highest = killerCombatLevel > targetCombatLevel ? killerCombatLevel : targetCombatLevel; int lowest = highest == killerCombatLevel ? targetCombatLevel : killerCombatLevel; int difference = (highest - lowest); if (difference > killerWildLevel || difference > targetWildLevel) { ((Player)killer).getPackets().sendMessage("You must move deeper into the wilderness to attack that player."); return false; } } if (!Location.inMultiCombat(target.getLocation())) { if (killer.getAttacker() != null && !killer.getAttacker().Equals(target) && killer.getLastAttacked() > 0) { if (killer is Player) { ((Player)killer).getPackets().sendMessage("You are already in combat!"); } return false; } if (target.getAttacker() != null && !target.getAttacker().Equals(killer) && target.getLastAttacked() > 0) { if (killer is Player) { string type = target is Player ? "player" : "npc"; ((Player)killer).getPackets().sendMessage("That " + type + " is already in combat."); } return false; } } return true; }
public static void combatLoop(Entity killer) { bool usingRange = killer is Player ? RangeCombat.isUsingRange(killer) : npcUsesRange(killer); Entity target = killer.getTarget(); killer.incrementCombatTurns(); bool autoCasting = killer is Npc ? false : ((Player)killer).getTemporaryAttribute("autoCasting") != null; bool dragonfire = false; bool guthanSpecial = false; //if you are auto casting you are not in combat loop. if (autoCasting) return; //If who you were attacking or who attacked you doesn't exist anymore. [Most important, should be first] if (target == null || (killer.getAttacker() == null && target == null)) { //stop fighting. resetCombat(killer, 1); return; } //If it's the npc attacking and npc isn't owned by a player or player is attacking if ((killer is Npc) && ((Npc)killer).getOwner() == null || killer is Player) { if (killer.getLastAttacked() > 0 || killer.getLastAttack() > 0) { //if the last time npc or player was attacked was 6 seconds ago or last time npc or player attacked was 6 seconds ago if (isXSecondsSinceCombat(killer, killer.getLastAttacked(), 6000) && isXSecondsSinceCombat(killer, killer.getLastAttack(), 6000)) { //stop fighting. resetCombat(killer, 1); return; } } } //If you are a player and using range then your distance is 8 or if you are a npc using range get the npc's attackRange otherwise get the sie of the npc as distance. int distance = (killer is Player && usingRange) ? 8 : killer is Npc && usingRange ? getNpcAttackRange(killer) : getNPCSize(killer, target); //if you the player are not using range and you are attacking another player if (!usingRange && killer is Player && target is Player) { //if the player who is getting attacked is not standing still. if (((Player)target).getSprites().getPrimarySprite() != -1) { //if you are using range on a player who is moving then distance to attack is 11, otherwise no range it's 3. distance = usingRange ? 11 : 3; } } //If all[player vs player], [player vs npc] or [npc vs player] are within distance of each other. if (!killer.getLocation().withinDistance(target.getLocation(), distance) && !target.getLocation().withinDistance(killer.getLocation(), distance)) { return; } //Can you [npc or player] even attack the entity if (!canAttack(killer, target, usingRange)) { //stop fighting. resetCombat(killer, 0); return; } //are you [npc or player] using ranged attacks? if (usingRange) { //if you are a player if (killer is Player) { //Do you have ammo and a bow? if (RangeCombat.hasAmmo(killer) && RangeCombat.hasValidBowArrow(killer)) { ((Player)killer).getWalkingQueue().resetWalkingQueue(); ((Player)killer).getPackets().closeInterfaces(); ((Player)killer).getPackets().clearMapFlag(); } else { //You cannot attack the monster as you don't have ammo or a bow. killer.setTarget(null); return; } } } //are you a player who is attacking a npc. if (target is Npc && killer is Player) { //If you are attacking Zilyana boss. if (((Npc)target).getId() == 6247) { // Zilyana (sara boss) //TODO: Stop any walking err why only zilyana boss?, have to check this out later. ((Player)killer).getWalkingQueue().resetWalkingQueue(); ((Player)killer).getPackets().clearMapFlag(); } } //All the checks above are passed, below starts the actual assigning of target and doing the attack. //if you [npc or player] attacking turn is greater or equal to your attacking speed. if (killer.getCombatTurns() >= killer.getAttackSpeed()) { //if [npc or player] has auto attack back on, and who they are attacking still exists. if (target.isAutoRetaliating() && target.getTarget() == null) { //make the [npc or player] follow who they are trying to attack. target.getFollow().setFollowing(killer); //make the [npc or player] face up to their attacker. target.setEntityFocus(killer.getClientIndex()); if ((target.getCombatTurns() >= (target.getAttackSpeed() / 2)) && target.getAttacker() == null) { target.setCombatTurns(target.getAttackSpeed() / 2); } //assign the [npc or player] who is getting attacked it's target who is attacking them. target.setTarget(killer); //if the person who is getting attacked is a player if (target is Player) { //stop the movement of player who is getting attacked ((Player)target).getWalkingQueue().resetWalkingQueue(); ((Player)target).getPackets().clearMapFlag(); } } //set the attack delay, if you are using range then delay is 2.4 seconds, otherwise magic.. 2.75 seconds. int delay = usingRange ? 2400 : 2750; //if delay has come up. if (Environment.TickCount - killer.getLastMagicAttack() < delay) { //If the player who is attacking using range. if (usingRange && killer is Player) { //Stop the movement of the attacker who is using ranged attacks. ((Player)killer).getWalkingQueue().resetWalkingQueue(); ((Player)killer).getPackets().clearMapFlag(); } return; } //if the attacker is a npc if (killer is Npc) { //perform the npc attack as a killer on your target (most likely a player) if (NPCAttack.npcAttack((Npc)killer, target)) { return; //if the dice 50/50 kicks in and the npc attacking is a dragon. } else if ((Misc.random(2) == 0) && isDragon(killer)) { //do your dragon fire as a dragon npc. doDragonfire(killer, target); //dragonfire was done, variable used to stop some attack animation. dragonfire = true; } } //If the person getting attacked is a player. if (target is Player) { //Close all your interfaces. ((Player)target).getPackets().closeInterfaces(); } //if the attacker [npc or player] has a attack animation and dragonfire variable wasn't set. if ((killer.getAttackAnimation() != 65535) && !dragonfire) { //do your attack animation as a [npc or player]. killer.setLastAnimation(new Animation(killer.getAttackAnimation())); } //If the [player or npc] is using ranged attacks if (!usingRange) { if (target.getCombatTurns() < 0 || target.getCombatTurns() > 0) { //if the [player or npc] getting attacked has a defensive animation. if (target.getDefenceAnimation() != 65535) { //do a blocking/defensive animation. target.setLastAnimation(new Animation(target.getDefenceAnimation())); } } } //make the attacker [player or npc] start following the attacked. killer.getFollow().setFollowing(target); //set a timer for the [player or npc] which indicates the last time they were attacked by killer. target.setLastAttacked(Environment.TickCount); //set a timer for the [player or npc] which indicates the last time they attacked the target. killer.setLastAttack(Environment.TickCount); //reset the combat turns. [this makes sure both attackers don't attack at same time] killer.resetCombatTurns(); //assign the [npc or player] who is getting attacked it's target who is attacking them. target.setAttacker(killer); //set a skulls, the method checks if [player attacks player] also [checks if player is dueling or in fightpits or has skull], otherwise gets skull. setSkull(killer, target); //if the attacker is a player. if (killer is Player) { //set attacking player's combatType to melee attack. ((Player)killer).setLastCombatType(CombatType.MELEE); //close all your interfaces as a attacker ((Player)killer).getPackets().closeInterfaces(); //if you the attacking player is using a special attack. if (((Player)killer).getSpecialAttack().isUsingSpecial()) { //do your special attack on your target which may be a [player or npc] if (((Player)killer).getSpecialAttack().doSpecialAttack(killer, target)) { return; } //if you the attacking player is wearing guthan armour set. } else if (CombatFormula.wearingGuthan((Player)killer)) { //roll a 25% dice. if (Misc.random(4) == 0) { //if dice hits 25%, show some kind of graphics.. killer.setLastGraphics(new Graphics(398, 0)); //set some variable to indicate you are using guthan special. guthanSpecial = true; } } } //if you the [player or npc] is using range. if (usingRange) { //Go into the RangeCombat ranging logic loop processing class. RangeCombat.rangeCombatLoop(killer, target); return; } //if the dragon npc did his dragonfire attack quit right here. if (dragonfire) { return; } //copies guthanSpecial variable to a different variable so it won't change when passed into a Event. bool guthanSpec = guthanSpecial; //get the damage you as the attacker [player or npc] will do on target [player or npc] double damage = getDamage(killer, target); //checks if damage will kill the player, sets a temporary variable 'willDie' checkIfWillDie(target, damage); //trigger the attack event based on the attackers [player or npc] hit delay Event attackEvent = new Event(killer.getHitDelay()); attackEvent.setAction(() => { //stop attack event after this run attackEvent.stop(); //add the XP for the killer [player only]. addXp(killer, target, damage); //set the hit to be sent on the attacked target [player or npc] target.hit((int)damage); //if the attacker [player] is using the Smite prayer drain prayer from target [player] based on damage done checkSmite(killer, target, damage); //if the attack [pla checkRecoil(killer, target, damage); checkVengeance(killer, target, damage); //if you are using the guthanSpecial which does some healing if (guthanSpec) { // heals 30% of the damage, and an added random 70% of the damage killer.heal((int)(damage * 0.30 + (Misc.randomDouble() * (damage * 0.70)))); } //if the target you are attacking is a npc. if (target is Npc) { //if it is Tzhaar monsters, you as the attacker will take 1 damage. if (((Npc)target).getId() == 2736 || ((Npc)target).getId() == 2737) { // Tzhaar lvl 45s killer.hit(1); // their recoil attack } } }); Server.registerEvent(attackEvent); } }