47 ABYSSAL_WHIP(
new int[]{4151, 80, 21371, 15441, 15442, 15443, 15444}, 50,
AbyssalWhip.get()),
54 DRAGON_DAGGER(
new int[]{1215, 1231, 5680, 5698}, 25,
DragonDagger.get()),
59 OSMUM_FANG(
new int[]{26219, 27246}, 25,
OsmumFang.get()),
60 DRAGON_CLAWS(
new int[]{13652, 20784}, 50,
DragonClaws.get()),
61 DRAGON_SPEAR(
new int[]{1249, 1263, 5730, 3176, 5716, 11824, 11889}, 25,
DragonSpear.get()),
62 DRAGON_MACE(
new int[]{1434}, 25,
DragonMace.get()),
63 DRAGON_2H(
new int[]{7158}, 60,
Dragon2h.get()),
66 STAFF_OF_DEAD(
new int[]{11791, 12904}, 100,
DefaultMelee.get()) {
68 public void enable(
Player player) {
69 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
70 player.send(
new SendMessage(
"You do not have enough special energy left!"));
73 player.staffOfDeadSpecial.reset();
74 player.animate(1720,
true);
76 player.skills.setLevel(1, 125);
77 player.send(
new SendMessage(
"Your defence has been boosted!"));
81 DRAGON_AXE(
new int[]{6739, 13241, 20011}, 100,
DefaultMelee.get()) {
83 public void enable(
Player player) {
84 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
85 player.send(
new SendMessage(
"You do not have enough special energy left!"));
91 player.send(
new SendMessage(
"Your Woodcutting rate has increased by x2!"));
95 DRAGON_HARPOON(
new int[]{21028,25373,21031}, 100,
DefaultMelee.get()) {
97 public void enable(
Player player) {
98 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
99 player.send(
new SendMessage(
"You do not have enough special energy left!"));
105 player.speak(
"Here fishy fishies!");
109 DRAGON_PICKAXE(
new int[]{11920, 12797, 23677, 25376,27695,13243}, 100,
DefaultMelee.get()) {
111 public void enable(
Player player) {
112 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
113 player.send(
new SendMessage(
"You do not have enough special energy left!"));
118 player.speak(
"Smashing!");
122 DRAGON_BATTLEAXE(
new int[]{1377}, 100,
DefaultMelee.get()) {
124 public void enable(
Player player) {
125 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
126 player.send(
new SendMessage(
"You do not have enough special energy left!"));
129 player.speak(
"Raarrrrrgggggghhhhhhh!");
132 player.skills.modifyLevel(level -> level - level / 10,
Skill.
ATTACK);
133 player.skills.modifyLevel(level -> level - level / 10,
Skill.
DEFENCE);
134 player.skills.modifyLevel(level -> level - level / 10,
Skill.
RANGED);
135 player.skills.modifyLevel(level -> level - level / 10,
Skill.
MAGIC);
136 player.skills.modifyLevel(level -> level + 10 + (player.skills.getMaxLevel(
Skill.
STRENGTH) - level) / 4,
Skill.
STRENGTH, 0, 120);
148 ARMADYL_GODSWORD(
new int[]{11802, 81, 20368}, 50,
ArmadylGodsword.get()),
150 BANDOS_GODSWORD(
new int[]{11804, 20370}, 50,
BandosGodsword.get()),
154 BLOW_PIPE(
new int[]{12926}, 50, Blowpipe.get()),
155 DARK_BOW(
new int[]{11235, 12765, 12766, 12767, 12768}, 55,
DarkBow.get()),
156 MAGIC_SHORTBOW(
new int[]{861, 12788}, 55,
MagicShortbow.get()),
157 BALLISTA(
new int[]{19478, 19481}, 55,
Ballista.get()),
162 public void enable(
Player player) {
163 super.enable(player);
164 if (player.isSpecialActivated()) {
165 player.getCombat().setCooldown(0);
171 SARADOMIN_SWORD(
new int[]{11838, 12809}, 100,
SaradominSword.get()),
174 STAFF_OF_THE_DEAD(
new int[]{11791, 12904}, 100,
DefaultMelee.get()) {
176 public void enable(
Player player) {
177 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
178 player.send(
new SendMessage(
"You do not have enough special energy left!"));
181 player.animate(1720,
true);
183 player.skills.setLevel(1, 125);
184 player.staffOfDeadSpecial.reset();
185 player.send(
new SendMessage(
"Your defence has been boosted!"));
189 TOXIC_STAFF_OF_THE_DEAD(
new int[]{12904}, 100,
DefaultMelee.get()) {
191 public void enable(
Player player) {
192 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
193 player.send(
new SendMessage(
"You do not have enough special energy left!"));
196 player.animate(1720,
true);
198 player.skills.setLevel(1, 125);
199 player.staffOfDeadSpecial.reset();
200 player.send(
new SendMessage(
"Your defence has been boosted!"));
204 GRANITE_MAUL(
new int[]{4153, 24225}, 50,
GraniteMaul.get()) {
206 public void enable(
Player player) {
207 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
208 player.send(
new SendMessage(
"You do not have enough special energy left!"));
212 player.setSpecialActivated(
true);
215 Combat<Player> combat = player.getCombat();
216 Mob defender = combat.getLastVictim();
218 if (combat.isAttacking(defender)) {
219 combat.performChecks(defender);
220 combat.submitStrategy(defender,
GraniteMaul.get());
225 public void disable(
Player player,
boolean clicked) {
229 boolean doubleSpec = !player.attributes.has(
"granite-maul-spec");
230 int current = player.getSpecialPercentage().intValue();
232 if (clicked && doubleSpec && current >=
getAmount()) {
233 player.attributes.set(
"granite-maul-spec",
true);
235 player.attributes.remove(
"granite-maul-spec");
236 super.disable(player, clicked);
241 DINHS_BULWARK(
new int[]{21015}, 50,
DinhsBulwark.get()),
244 DRAGON_KNIVES(
new int[] { 22804 }, 25,
DragonKnife.get());
249 private final int[] ids;
254 private final int amount;
259 private final CombatStrategy<Player> strategy;
269 this.amount = amount;
270 this.strategy = strategy;
273 public static Optional<CombatSpecial> forId(
int weapon) {
274 Optional<CombatSpecial> special = Arrays.stream(
CombatSpecial.values()).filter(c -> Arrays.stream(c.getIds()).anyMatch(id -> weapon ==
id)).findFirst();
294 player.getSpecialPercentage().decrementAndGet(amount, 0);
296 disable(player,
false);
299 public static void drain(
Player player,
int toDrain) {
301 player.getSpecialPercentage().decrementAndGet(toDrain, 0);
302 updateSpecialAmount(player);
313 player.getSpecialPercentage().incrementAndGet(amount, 100);
324 if (player.getWeapon().getSpecialBar() == -1 || player.getWeapon().getSpecialMeter() == -1) {
328 int specialBar = player.getWeapon().getSpecialMeter();
329 int specialAmount = player.getSpecialPercentage().get() / 10;
332 for (
int i = 10; i > 0; i--) {
333 player.send(
new SendMoveComponent(specialAmount >= i ? 500 : 0, 0, --specialBar));
344 if (player.getCombatSpecial() !=
null) {
345 player.getCombatSpecial().disable(player,
false);
348 if (player.getWeapon().getSpecialBar() == -1) {
349 player.setCombatSpecial(
null);
354 Item item = player.equipment.get(
Equipment.WEAPON_SLOT);
356 player.setCombatSpecial(
null);
361 Optional<CombatSpecial> special = Arrays.stream(
CombatSpecial.values()).filter(c -> Arrays.stream(c.getIds()).anyMatch(id -> item.getId() ==
id)).findFirst();
362 if (special.isPresent()) {
364 player.setCombatSpecial(special.get());
369 player.setCombatSpecial(
null);
390 public void enable(
Player player) {
391 if (
Activity.evaluate(player, it -> !it.canUseSpecial(player))) {
395 if (!player.isSpecialActivated()) {
396 if (player.getSpecialPercentage().intValue() < player.getCombatSpecial().getAmount()) {
397 player.send(
new SendMessage(
"You do not have enough special energy left!"));
402 player.setSpecialActivated(
true);
406 public void disable(
Player player,
boolean clicked) {
407 if (player.isSpecialActivated()) {
409 player.setSpecialActivated(
false);