package com.asteria.game.character.combat.magic; import java.util.Arrays; import java.util.Optional; import com.asteria.game.NodeType; import com.asteria.game.character.Animation; import com.asteria.game.character.CharacterNode; import com.asteria.game.character.Graphic; import com.asteria.game.character.PoisonType; import com.asteria.game.character.Projectile; import com.asteria.game.character.combat.Combat; import com.asteria.game.character.combat.effect.CombatEffectType; import com.asteria.game.character.player.Player; import com.asteria.game.item.Item; /** * The enumerated type whose elements represent the combat spells that can be * cast. * * @author lare96 <http://github.com/lare96> */ public enum CombatSpells { WIND_STRIKE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 91, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(92)); } @Override public int maximumHit() { return 2; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(90, 6553600)); } @Override public double baseExperience() { return 5; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556), new Item(558) }); } @Override public int levelRequired() { return 1; } @Override public int spellId() { return 1152; } }), CONFUSE(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(716)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 103, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.ATTACK_LOW) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect " + "because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(104)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(102, 6553600)); } @Override public double baseExperience() { return 13; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(557, 2), new Item(559) }); } @Override public int levelRequired() { return 3; } @Override public int spellId() { return 1153; } }), WATER_STRIKE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 94, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(95)); } @Override public int maximumHit() { return 4; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(93, 6553600)); } @Override public double baseExperience() { return 7; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555), new Item(556), new Item(558) }); } @Override public int levelRequired() { return 5; } @Override public int spellId() { return 1154; } }), EARTH_STRIKE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 97, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(98)); } @Override public int maximumHit() { return 6; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(96, 6553600)); } @Override public double baseExperience() { return 9; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 1), new Item(558, 1), new Item(557, 2) }); } @Override public int levelRequired() { return 9; } @Override public int spellId() { return 1156; } }), WEAKEN(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(716)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 106, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.STRENGTH_LOW) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(107)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(105, 6553600)); } @Override public double baseExperience() { return 21; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(557, 2), new Item(559, 1) }); } @Override public int levelRequired() { return 11; } @Override public int spellId() { return 1157; } }), FIRE_STRIKE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 100, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(101)); } @Override public int maximumHit() { return 8; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(99, 6553600)); } @Override public double baseExperience() { return 11; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 1), new Item(558, 1), new Item(554, 3) }); } @Override public int levelRequired() { return 13; } @Override public int spellId() { return 1158; } }), WIND_BOLT(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 118, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(119)); } @Override public int maximumHit() { return 9; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(117, 6553600)); } @Override public double baseExperience() { return 13; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(562, 1) }); } @Override public int levelRequired() { return 17; } @Override public int spellId() { return 1160; } }), CURSE(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(710)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 109, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.DEFENCE_LOW) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect " + "because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(110)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(108, 6553600)); } @Override public double baseExperience() { return 29; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 2), new Item(557, 3), new Item(559, 1) }); } @Override public int levelRequired() { return 19; } @Override public int spellId() { return 1161; } }), BIND(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(710)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 178, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (castOn.getMovementQueue().isLockMovement()) { if (cast.getType() == NodeType.PLAYER) ((Player) cast).getMessages().sendMessage("The spell has " + "no effect because they are already frozen."); return; } if (castOn.getType() == NodeType.PLAYER) { Player player = (Player) castOn; player.getMessages().sendMessage("You have been frozen by " + "magic!"); } castOn.freeze(5); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(181, 6553600)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(177, 6553600)); } @Override public double baseExperience() { return 30; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(557, 3), new Item(561, 2) }); } @Override public int levelRequired() { return 20; } @Override public int spellId() { return 1572; } }), WATER_BOLT(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 121, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(122)); } @Override public int maximumHit() { return 10; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(120, 6553600)); } @Override public double baseExperience() { return 16; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(562, 1), new Item(555, 2) }); } @Override public int levelRequired() { return 23; } @Override public int spellId() { return 1163; } }), EARTH_BOLT(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 124, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(125)); } @Override public int maximumHit() { return 11; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(123, 6553600)); } @Override public double baseExperience() { return 19; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(562, 1), new Item(557, 3) }); } @Override public int levelRequired() { return 29; } @Override public int spellId() { return 1166; } }), FIRE_BOLT(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 127, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(128)); } @Override public int maximumHit() { return 12; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(126, 6553600)); } @Override public double baseExperience() { return 22; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 3), new Item(562, 1), new Item(554, 4) }); } @Override public int levelRequired() { return 35; } @Override public int spellId() { return 1169; } }), CRUMBLE_UNDEAD(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(724)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 146, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(147)); } @Override public int maximumHit() { return 15; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(145, 6553600)); } @Override public double baseExperience() { return 24; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(562, 1), new Item(557, 2) }); } @Override public int levelRequired() { return 39; } @Override public int spellId() { return 1171; } }), WIND_BLAST(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 133, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(134)); } @Override public int maximumHit() { return 13; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(132, 6553600)); } @Override public double baseExperience() { return 25; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 3), new Item(560, 1) }); } @Override public int levelRequired() { return 41; } @Override public int spellId() { return 1172; } }), WATER_BLAST(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 136, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(137)); } @Override public int maximumHit() { return 14; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(135, 6553600)); } @Override public double baseExperience() { return 28; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(556, 3), new Item(560, 1) }); } @Override public int levelRequired() { return 47; } @Override public int spellId() { return 1175; } }), IBAN_BLAST(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(708)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 88, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(89)); } @Override public int maximumHit() { return 25; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(87, 6553600)); } @Override public double baseExperience() { return 30; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.of(new Item[] { new Item(1409) }); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(560, 1), new Item(554, 5) }); } @Override public int levelRequired() { return 50; } @Override public int spellId() { return 1539; } }), SNARE(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(710)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 178, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (castOn.getMovementQueue().isLockMovement()) { if (cast.getType() == NodeType.PLAYER) ((Player) cast).getMessages().sendMessage("The spell has " + "no effect because they are already frozen."); return; } if (castOn.getType() == NodeType.PLAYER) { Player player = (Player) castOn; player.getMessages().sendMessage("You have been frozen by " + "magic!"); } castOn.freeze(10); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(180, 6553600)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(177, 6553600)); } @Override public double baseExperience() { return 60; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(557, 4), new Item(561, 3) }); } @Override public int levelRequired() { return 50; } @Override public int spellId() { return 1582; } }), MAGIC_DART(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1576)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 328, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(329)); } @Override public int maximumHit() { return 19; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(327, 6553600)); } @Override public double baseExperience() { return 30; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.of(new Item[] { new Item(4170) }); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(558, 4), new Item(560, 1) }); } @Override public int levelRequired() { return 50; } @Override public int spellId() { return 12037; } }), EARTH_BLAST(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 139, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(140)); } @Override public int maximumHit() { return 15; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(138, 6553600)); } @Override public double baseExperience() { return 31; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 3), new Item(560, 1), new Item(557, 4) }); } @Override public int levelRequired() { return 53; } @Override public int spellId() { return 1177; } }), FIRE_BLAST(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 130, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(131)); } @Override public int maximumHit() { return 16; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(129, 6553600)); } @Override public double baseExperience() { return 34; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(560, 1), new Item(554, 5) }); } @Override public int levelRequired() { return 59; } @Override public int spellId() { return 1181; } }), SARADOMIN_STRIKE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(811)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(76)); } @Override public int maximumHit() { return 20; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 35; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.of(new Item[] { new Item(2415) }); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(565, 2), new Item(554, 2) }); } @Override public int levelRequired() { return 60; } @Override public int spellId() { return 1190; } }), CLAWS_OF_GUTHIX(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(811)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(77)); } @Override public int maximumHit() { return 20; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 35; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.of(new Item[] { new Item(2416) }); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(565, 2), new Item(554, 2) }); } @Override public int levelRequired() { return 60; } @Override public int spellId() { return 1191; } }), FLAMES_OF_ZAMORAK(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(811)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(78)); } @Override public int maximumHit() { return 20; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 35; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.of(new Item[] { new Item(2417) }); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(565, 2), new Item(554, 2) }); } @Override public int levelRequired() { return 60; } @Override public int spellId() { return 1192; } }), WIND_WAVE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 159, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(160)); } @Override public int maximumHit() { return 17; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(158, 6553600)); } @Override public double baseExperience() { return 36; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 5), new Item(565, 1) }); } @Override public int levelRequired() { return 62; } @Override public int spellId() { return 1183; } }), WATER_WAVE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 162, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(163)); } @Override public int maximumHit() { return 18; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(161, 6553600)); } @Override public double baseExperience() { return 37; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 5), new Item(565, 1), new Item(555, 7) }); } @Override public int levelRequired() { return 65; } @Override public int spellId() { return 1185; } }), VULNERABILITY(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(729)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 168, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.DEFENCE_HIGH) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect " + "because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(169)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(167, 6553600)); } @Override public double baseExperience() { return 76; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(557, 5), new Item(555, 5), new Item(566, 1) }); } @Override public int levelRequired() { return 66; } @Override public int spellId() { return 1542; } }), EARTH_WAVE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 165, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(166)); } @Override public int maximumHit() { return 19; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(164, 6553600)); } @Override public double baseExperience() { return 40; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 5), new Item(565, 1), new Item(557, 7) }); } @Override public int levelRequired() { return 70; } @Override public int spellId() { return 1188; } }), ENFEEBLE(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(729)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 171, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.STRENGTH_HIGH) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect " + "because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(172)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(170, 6553600)); } @Override public double baseExperience() { return 83; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(557, 8), new Item(555, 8), new Item(566, 1) }); } @Override public int levelRequired() { return 73; } @Override public int spellId() { return 1543; } }), FIRE_WAVE(new CombatNormalSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(711)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 156, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(157)); } @Override public int maximumHit() { return 20; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(155, 6553600)); } @Override public double baseExperience() { return 42; } @Override public Optional<Item[]> equipmentRequired(Player player) { return Optional.empty(); } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 5), new Item(565, 1), new Item(554, 7) }); } @Override public int levelRequired() { return 75; } @Override public int spellId() { return 1189; } }), ENTANGLE(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(710)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 178, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (castOn.getMovementQueue().isLockMovement()) { if (cast.getType() == NodeType.PLAYER) ((Player) cast).getMessages().sendMessage("The spell has " + "no effect because they are already frozen."); return; } if (castOn.getType() == NodeType.PLAYER) { Player player = (Player) castOn; player.getMessages().sendMessage("You have been frozen by " + "magic!"); } castOn.freeze(15); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(179, 6553600)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(177, 6553600)); } @Override public double baseExperience() { return 91; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 5), new Item(557, 5), new Item(561, 4) }); } @Override public int levelRequired() { return 79; } @Override public int spellId() { return 1592; } }), STUN(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(729)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 174, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (!castOn.weaken(CombatWeaken.ATTACK_HIGH) && cast.getType() == NodeType.PLAYER) { Player player = (Player) cast; String s = castOn.getType().name().toLowerCase(); player.getMessages().sendMessage("The spell has no effect " + "because the " + s + " has already been weakened."); } } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(107)); } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(173, 6553600)); } @Override public double baseExperience() { return 90; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(557, 12), new Item(555, 12), new Item(556, 1) }); } @Override public int levelRequired() { return 80; } @Override public int spellId() { return 1562; } }), TELEBLOCK(new CombatEffectSpell() { @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1819)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 344, 44, 3, 43, 31, 0)); } @Override public void effect(CharacterNode cast, CharacterNode castOn) { if (castOn.getType() == NodeType.PLAYER) Combat.effect(castOn, CombatEffectType.TELEBLOCK); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(345)); } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 65; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(563, 1), new Item(562, 1), new Item(560, 1) }); } @Override public int levelRequired() { return 85; } @Override public int spellId() { return 12445; } }), SMOKE_RUSH(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.poison(PoisonType.DEFAULT_RANGED); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 384, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(385)); } @Override public int maximumHit() { return 13; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 30; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 1), new Item(554, 1), new Item(562, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 50; } @Override public int spellId() { return 12939; } }), SHADOW_RUSH(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.weaken(CombatWeaken.ATTACK_LOW); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 378, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(379)); } @Override public int maximumHit() { return 14; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 31; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 1), new Item(566, 1), new Item(562, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 52; } @Override public int spellId() { return 12987; } }), BLOOD_RUSH(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; cast.healCharacter((int) (damage * 0.25)); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 372, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(373)); } @Override public int maximumHit() { return 15; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 33; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(565, 1), new Item(562, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 56; } @Override public int spellId() { return 12901; } }), ICE_RUSH(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.freeze(7); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 360, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(361)); } @Override public int maximumHit() { return 18; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 34; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 2), new Item(562, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 58; } @Override public int spellId() { return 12861; } }), SMOKE_BURST(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.poison(PoisonType.DEFAULT_RANGED); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(389)); } @Override public int maximumHit() { return 13; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 36; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(554, 2), new Item(562, 4), new Item(560, 2) }); } @Override public int levelRequired() { return 62; } @Override public int spellId() { return 12963; } }), SHADOW_BURST(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.weaken(CombatWeaken.ATTACK_LOW); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(382)); } @Override public int maximumHit() { return 18; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 37; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 1), new Item(566, 2), new Item(562, 4), new Item(560, 2) }); } @Override public int levelRequired() { return 64; } @Override public int spellId() { return 13011; } }), BLOOD_BURST(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; cast.healCharacter((int) (damage * 0.25)); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(376)); } @Override public int maximumHit() { return 21; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 39; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(565, 2), new Item(562, 4), new Item(560, 2) }); } @Override public int levelRequired() { return 68; } @Override public int spellId() { return 12919; } }), ICE_BURST(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.freeze(10); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(363)); } @Override public int maximumHit() { return 22; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 40; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 4), new Item(562, 4), new Item(560, 2) }); } @Override public int levelRequired() { return 70; } @Override public int spellId() { return 12881; } }), SMOKE_BLITZ(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.poison(PoisonType.DEFAULT_RANGED); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 386, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(387)); } @Override public int maximumHit() { return 23; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 42; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(554, 2), new Item(565, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 74; } @Override public int spellId() { return 12951; } }), SHADOW_BLITZ(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.weaken(CombatWeaken.ATTACK_HIGH); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 380, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(381)); } @Override public int maximumHit() { return 24; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 43; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 2), new Item(566, 2), new Item(565, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 76; } @Override public int spellId() { return 12999; } }), BLOOD_BLITZ(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; cast.healCharacter((int) (damage * 0.25)); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.of(new Projectile(cast, castOn, 374, 44, 3, 43, 31, 0)); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(375)); } @Override public int maximumHit() { return 25; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 45; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(565, 4), new Item(560, 2) }); } @Override public int levelRequired() { return 80; } @Override public int spellId() { return 12911; } }), ICE_BLITZ(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.freeze(10); } @Override public int radius() { return 0; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1978)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(367)); } @Override public int maximumHit() { return 26; } @Override public Optional<Graphic> startGraphic() { return Optional.of(new Graphic(366, 6553600)); } @Override public double baseExperience() { return 46; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 3), new Item(565, 2), new Item(560, 2) }); } @Override public int levelRequired() { return 82; } @Override public int spellId() { return 12871; } }), SMOKE_BARRAGE(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.poison(PoisonType.SUPER_RANGED); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(391)); } @Override public int maximumHit() { return 27; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 48; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(554, 4), new Item(565, 2), new Item(560, 4) }); } @Override public int levelRequired() { return 86; } @Override public int spellId() { return 12975; } }), SHADOW_BARRAGE(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.weaken(CombatWeaken.ATTACK_HIGH); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(383)); } @Override public int maximumHit() { return 28; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 49; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(556, 4), new Item(566, 3), new Item(565, 2), new Item(560, 4) }); } @Override public int levelRequired() { return 88; } @Override public int spellId() { return 13023; } }), BLOOD_BARRAGE(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; cast.healCharacter((int) (damage * 0.25)); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(377)); } @Override public int maximumHit() { return 29; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 51; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(560, 4), new Item(566, 1), new Item(565, 4) }); } @Override public int levelRequired() { return 92; } @Override public int spellId() { return 12929; } }), ICE_BARRAGE(new CombatAncientSpell() { @Override public void effect(CharacterNode cast, CharacterNode castOn, int damage) { if (damage < 1) return; castOn.freeze(15); } @Override public int radius() { return 1; } @Override public Optional<Animation> castAnimation() { return Optional.of(new Animation(1979)); } @Override public Optional<Projectile> projectile(CharacterNode cast, CharacterNode castOn) { return Optional.empty(); } @Override public Optional<Graphic> endGraphic() { return Optional.of(new Graphic(369)); } @Override public int maximumHit() { return 30; } @Override public Optional<Graphic> startGraphic() { return Optional.empty(); } @Override public double baseExperience() { return 52; } @Override public Optional<Item[]> itemsRequired(Player player) { return Optional.of(new Item[] { new Item(555, 6), new Item(565, 2), new Item(560, 4) }); } @Override public int levelRequired() { return 94; } @Override public int spellId() { return 12891; } }); /** * The spell attached to this element. */ private final CombatSpell spell; /** * Creates a new {@link CombatSpells}. * * @param spell * the spell attached to this element. */ private CombatSpells(CombatSpell spell) { this.spell = spell; } /** * Gets the spell attached to this element. * * @return the spell. */ public final CombatSpell getSpell() { return spell; } /** * Gets the spell with a {@link CombatSpell#spellId()} of {@code id}. * * @param id * the identification of the combat spell. * @return the combat spell with that identification. */ public static Optional<CombatSpells> getSpell(int id) { return Arrays.stream(CombatSpells.values()).filter(s -> s != null && s.getSpell().spellId() == id).findFirst(); } }