Slayer.java
Code:
package com.exoria.game.player.actions;
import java.io.Serializable;
import com.exoria.game.npc.NPC;
import com.exoria.game.player.Player;
import com.exoria.game.player.Skills;
import com.exoria.utils.Utils;
public class Slayer {
/**
* @author aksel
* @since 5/8/22
* @Version 0.1
* @updated 6/10/22 - more mobs and code cleanup
*/
public enum Master {
/**
* spira - no req Chaeldar - 75 cb Duradel - 100 cb Kuradal - 110 cb 90 slayer
*/
/**
* key - name, npcid, combatlevel, levelreqired, taskmin, taskmax, npcnames
*/
SPRIA(8462, 3, 1, new int[] { 10, 30 }, "Hobgoblin", "Giant bat", "Cave crawler", "Cow",
"Cockatrice", "Rock crab", "Hill giant", "Ice warrior", "Rockslug", "Pyrefiend"),
CHAELDAR(1598, 3, 1, new int[] { 20, 60 }, "Hobgoblin", "Red dragon",
"Basilisk", "Bloodveld", "Blue dragon", "Bronze Dragon", "Cave crawler", "Cockatrice", "Dust devil",
"Fire giant", "Gargoyle", "Green dragon", "Hellhound", "Hill giant", "Ice giant", "Ice warrior",
"Infernal mage", "Jelly", "Kurask", "Lesser demon", "Moss giant", "Pyrefiend", "Rockslug",
"Turoth", "Black demon", "Greater demon", "Iron dragon", "Steel dragon", "Skeletal wyvern"),
DURADEL(8466, 3, 1, new int[] { 40, 100 }, "Waterfiend", "Abyssal demon", "Red dragon",
"Black demon", "Black dragon", "Bloodveld", "Blue Dragon", "Green dragon", "Dark beast",
"Dust devil", "Fire giant", "Glacor", "Ganodermic beast", "Frost dragon", "Ice strykewyrm",
"Mutated jadinko male", "Gargoyle", "Greater demon", "Hellhound", "Iron Dragon", "Kurask",
"Mithril dragon", "Skeletal wyvern", "Steel dragon", "Turoth"),
KURADAL(9085, 3, 1, new int[] { 3, 30 }, "Pest queen", "Kree'arra", "General graardor", "K'ril tsutsaroth",
"Commander zilyana", "Nex", "Kalphite queen", "Corporeal beast", "Giant mole", "Bork", "The kendal",
"King black dragon", "Char", "Sea troll queen", "Barrelchest", "Wildywyrm", "Chaos elemental",
"Dagannoth kings", "Tormented demon", "Sunfreet"),
SUMONA(7780, 3, 1, new int[] { 5, 50 }, "Pest queen", "Kree'arra", "General graardor", "Commander zilyana",
"Nex", "Kalphite queen", "Corporeal beast", "K'ril tsutsaroth", "Char", "Sea troll queen", "Barrelchest", "Wildywyrm",
"Chaos elemental", "Dagannoth kings", "Tormented demon", "Sunfreet");
private int master;
private int combatLevel;
private int levelRequired;
private int[] taskamount;
private Object[] tasks;
private Master(int master, int combatLevel, int levelRequired, int[] range, Object... tasks) {
this.combatLevel = combatLevel;
this.levelRequired = levelRequired;
this.taskamount = range;
this.tasks = tasks;
this.master = master;
}
public int getMaster() {
return master;
}
public int getCombatLevel() {
return combatLevel;
}
public int getLevelRequired() {
return levelRequired;
}
public int[] getRange() {
return taskamount;
}
public Object[] getTasks() {
return tasks;
}
public static Master forId(int npcId) {
for (Master master : Master.values()) {
if (master.getMaster() == npcId)
return master;
}
return null;
}
}
public static class SlayerTask implements Serializable {
private static final long serialVersionUID = 3925639922342382315L;
private Master master;
private int index;
private int amount;
public SlayerTask(Master master, int index, int amount) {
this.master = master;
this.index = index;
this.amount = amount;
}
public void setMaster(Master master) {
this.master = master;
}
public void setIndex(int index) {
this.index = index;
}
public void setAmount(int amount) {
this.amount = amount;
}
public Master getMaster() {
return master;
}
public int getIndex() {
return index;
}
public int getAmount() {
return amount;
}
public String getName() {
try {
return master.getTasks()[getIndex()].toString();
} catch (ArrayIndexOutOfBoundsException e) {
}
return "<col=ff0000> - If you see this get a new task</col>";
}
}
public static void submitRandomTask(Player player, Master master) {
SlayerTask task = null;
if (master == null) {
player.setSlayerMaster(master);
master = player.getSlayerMaster();
}
if (player.getSlayerMaster() != master) {
player.setSlayerMaster(master);
}
int index = Utils.getRandom(master.getTasks().length);
int amount = Utils.random(master.getRange()[0], master.getRange()[1]);
task = new SlayerTask(master, index, amount);
if (player.getSlayerTask() == null)
player.setSlayerTask(task);
}
/**
* @Param player
* @Param npc
*/
public static void killedTask(Player player, NPC npc) {
SlayerTask task = player.getSlayerTask();
task.setAmount(task.getAmount() - 1);
player.getSkills().addXp(Skills.SLAYER, npc.getCombatDefinitions().getHitpoints() / 10);
Master master = player.getSlayerMaster();
int bonus = 40 + Utils.random(10);
int bonus2 = 50 + Utils.random(20);
if (task.getAmount() == 0) {
task = null;
player.setSlayerTask(task);
player.addFinishedTask(1);
switch (master) {
case SPRIA:
player.addSlayerPoints(8);
player.setLowSlayer(player.getLowSlayer() + 1);
player.getPackets().sendGameMessage("You have completed your task and gain 8 points.");
player.getPackets()
.sendGameMessage("You have completed " + player.getLowSlayer() + " Low slayer tasks.");
break;
case CHAELDAR:
player.addSlayerPoints(15);
player.setMedSlayer(player.getMedSlayer() + 1);
player.getPackets().sendGameMessage("You have completed your task and gain 15 points.");
player.getPackets()
.sendGameMessage("You have completed " + player.getMedSlayer() + " Medium slayer tasks.");
break;
case DURADEL:
player.addSlayerPoints(25);
player.setHighSlayer(player.getHighSlayer() + 1);
player.getPackets().sendGameMessage("You have completed your task and gain 25 points.");
player.getPackets()
.sendGameMessage("You have completed " + player.getHighSlayer() + " High slayer tasks.");
break;
case KURADAL:
player.addSlayerPoints(bonus);
player.setBossSlayer(player.getBossSlayer() + 1);
player.getPackets().sendGameMessage("You have completed your task and gain " + bonus + " points.");
player.getPackets()
.sendGameMessage("You have completed " + player.getBossSlayer() + " Boss slayer tasks.");
break;
case SUMONA:
player.addSlayerPoints(bonus2);
player.setBossSlayer(player.getBossSlayer() + 1);
player.getPackets().sendGameMessage("You have completed your task and gain " + bonus2 + " points.");
player.getPackets()
.sendGameMessage("You have completed " + player.getBossSlayer() + " Boss slayer tasks.");
break;
}
}
}
}
SlayerReward.java
Code:
package com.exoria.game.player.dialogues.slayer;
import com.exoria.cache.loaders.ItemDefinitions;
import com.exoria.game.player.Skills;
import com.exoria.game.player.dialogues.Dialogue;
public class SlayerReward extends Dialogue {
/**
* @author Aksel
* @since 5/23/22
* @contact [email protected]
*/
private int rewardId;
private int rewardPrice;
@Override
public void start() {
rewardId = (Integer) parameters[0];
rewardPrice = (Integer) parameters[1];
switch (rewardId) {
case 1337:
sendOptionsDialogue(
"Buy Small amount of XP for " + rewardPrice + " Slayer points?",
"<col=ff0000>Buy", "Cancel");
break;
case 1338:
sendOptionsDialogue(
"Buy Large amount of XP for " + rewardPrice + " Slayer points?",
"<col=ff0000>Buy", "Cancel");
break;
case 6:
sendOptionsDialogue(
"Buy Dwarf Cannon Set for " + rewardPrice + " Slayer points?",
"<col=ff0000>Buy", "Cancel");
break;
default:
sendOptionsDialogue(
"Buy " + ItemDefinitions.forId(rewardId).getName() + " for " + rewardPrice + " Slayer points?",
"<col=ff0000>Buy", "Cancel");
break;
}
}
@Override
public void run(int interfaceId, int componentId) {
switch (componentId) {
case OPTION_1:
if (player.getSlayerPoints() < rewardPrice) {
player.out("You do not have enough points for this reward. You have " + player.getSlayerPoints()
+ " and you need " + rewardPrice + ".");
end();
return;
}
switch (rewardId) {
case 15497:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 6:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(6, 1);
player.getInventory().addItem(8, 1);
player.getInventory().addItem(10, 1);
player.getInventory().addItem(12, 1);
end();
break;
case 1337:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getSkills().addXp(Skills.SLAYER, 2000);
end();
break;
case 1338:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getSkills().addXp(Skills.SLAYER, 10000);
end();
break;
case 4164:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 4151:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 22532:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 22538:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 22544:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
case 22550:
player.setSlayerPoints(player.getSlayerPoints() - rewardPrice);
player.getInventory().addItem(rewardId, 1);
end();
break;
}
break;
case OPTION_2:
end();
break;
}
}
@Override
public void finish() {
}
}
SlayerTele.java
Code:
package com.exoria.game.player.dialogues.slayer;
import com.exoria.game.WorldTile;
import com.exoria.game.player.content.Magic;
import com.exoria.game.player.dialogues.Dialogue;
public class SlayerTele extends Dialogue {
@Override
public void start() {
sendOptionsDialogue("Slayer Teleports", "Brimhaven Dung",
"Slayer Tower", "Fremennik Slayer Cave", "Ancient Caverns", "Ice Dung");
}
@Override
public void run(int interfaceId, int componentId) {
switch (componentId) {
case OPTION_1:
teleportPlayer(2744, 3150, 0);
end();
break;
case OPTION_2:
teleportPlayer(3428, 3532, 0);
end();
break;
case OPTION_3:
teleportPlayer(2804, 10002, 0);
end();
break;
case OPTION_4:
teleportPlayer(1764, 5365, 1);
end();
break;
case OPTION_5:
teleportPlayer(3006, 9549, 0);
end();
break;
}
}
private void teleportPlayer(int x, int y, int z) {
Magic.sendNormalTeleportSpell(player, 0, 0.0D, new WorldTile(x, y, z), new int[0]);
player.stopAll();
}
@Override
public void finish() {
}
}
SlayerD.java
Code:
package com.exoria.game.player.dialogues;
import com.exoria.game.player.content.TaskTele;
import com.exoria.game.player.content.interfaces.SlayerInter;
import com.exoria.game.player.content.interfaces.SlayerMasterInter;
public class SlayerD extends Dialogue {
int npcId;
@Override
public void start() {
npcId = (Integer) parameters[0];
sendOptionsDialogue("What would you like to do?", "Give me a new task", "Reset Task (FREE)", "Rewards", "Teleport to Task");
stage = 2;
}
@Override
public void run(int interfaceId, int c) {
if (stage == 2) {
switch (c) {
case OPTION_1:
end();
SlayerMasterInter.send(player);
break;
case OPTION_2:
player.setSlayerTask(null);
player.out("You reset your slayer task.");
end();
break;
case OPTION_3:
SlayerInter.send(player);
end();
break;
case OPTION_4:
String task = player.getSlayerTask().getName();
TaskTele.teleportPlayerToTask(player, task);
end();
break;
}
}
}
@Override
public void finish() {
}
}
SlayerHubInter.java
Code:
package com.exoria.game.player.content.interfaces;
import com.exoria.game.player.Player;
import com.exoria.game.player.content.TaskTele;
public class SlayerHubInter {
public static void send(Player player) {
player.getInterfaceManager().sendInterface(1329);
}
public static void handle(Player player, int c) {
switch (c) {
case 18:
SlayerMasterInter.send(player);
break;
case 20:
TaskTele.teleportPlayerToTask(player, player.getSlayerTask().getName());
break;
case 22:
SlayerInter.send(player);
break;
}
}
}
SlayerInter.java
Code:
package com.exoria.game.player.content.interfaces;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
import java.util.Map.Entry;
import com.exoria.cache.loaders.ItemDefinitions;
import com.exoria.game.item.Item;
import com.exoria.game.item.ItemsContainer;
import com.exoria.game.player.Player;
public class SlayerInter {
public enum SlayerRewards {
SLAYER_HELM(new int[] { 15497 }, 36, 400, "Slayer Helmet"),
RED_SLAYER_HELM(new int[] { 22532 }, 40, 550, "Red Slayer Helmet"),
BLUE_SLAYER_HELM(new int[] { 22538 }, 44, 550, "Blue Slayer Helmet"),
GREEN_SLAYER_HELM(new int[] { 22544 }, 48, 550, "Green Slayer Helmet"),
YELLOW_SLAYER_HELM(new int[] { 22550 }, 52, 550, "Yellow Slayer Helmet"),
DWARF_CANNON(new int[] { 6, 8, 10, 12 }, 56, 1500, "Dwarf Cannon Set"),
ABYSSAL_WHIP(new int[] { 4151 }, 60, 200, null),
FACE_MASK(new int[] { 4164 }, 64, 0, null),
ENCHANTED_GEM(new int[] { 4155 }, 68, 0, null),
TZKALTRADECERT(new int[] { 29837 }, 72, 2000, null);
private static Map<Integer, SlayerRewards> keySlotIds = new HashMap<Integer, SlayerRewards>();
private static Map<Integer, SlayerRewards> keyItemIds = new HashMap<Integer, SlayerRewards>();
public static SlayerRewards forSlotId(int id) {
return keySlotIds.get(id);
}
public static SlayerRewards forItemId(int id) {
return keyItemIds.get(id);
}
static {
for (SlayerRewards reward : SlayerRewards.values()) {
keySlotIds.put(reward.slotId, reward);
keyItemIds.put(reward.id[0], reward);
}
}
private int[] id;
private int cost;
private int slotId;
private String name;
private SlayerRewards(int[] id, int slotId, int cost, String nameOverride) {
this.id = id;
this.cost = cost;
this.slotId = slotId;
this.name = nameOverride == null ? ItemDefinitions.getItemDefinitions(id[0]).getName() : nameOverride;
}
public int[] getId() {
return id;
}
public String getName() {
return name;
}
public int getCost() {
return cost;
}
public int getSlotId() {
return slotId;
}
}
private static final NavigableMap<Long, String> suffixes = new TreeMap<>();
static {
suffixes.put(1_000L, "K");
suffixes.put(1_000_000L, "M");
suffixes.put(1_000_000_000L, "G");
suffixes.put(1_000_000_000_000L, "T");
suffixes.put(1_000_000_000_000_000L, "P");
suffixes.put(1_000_000_000_000_000_000L, "E");
}
public static String format(long value) {
if (value == Long.MIN_VALUE)
return format(Long.MIN_VALUE + 1);
if (value < 0)
return "-" + format(-value);
if (value < 1000)
return Long.toString(value);
Entry<Long, String> e = suffixes.floorEntry(value);
Long divideBy = e.getKey();
String suffix = e.getValue();
long truncated = value / (divideBy / 10);
boolean hasDecimal = truncated < 100 && (truncated / 10d) != (truncated / 10);
return hasDecimal ? (truncated / 10d) + suffix : (truncated / 10) + suffix;
}
public static void generateItemPreview(Player player, int slotId) {
selectedReward = SlayerRewards.forSlotId(slotId);
ItemsContainer<Item> itemImg = new ItemsContainer<>(1, true);
itemImg.add(new Item(selectedReward.id[0]));
player.getPackets().sendItems(1550, itemImg);
player.getPackets().sendItemsToContainer(1331, 22, 1550, 1, 1, 0, 150, "Examine");
player.getPackets().sendIComponentText(1331, 18, selectedReward.name);
player.getPackets().sendIComponentText(1331, 26, selectedReward.cost == 0 ? "FREE" : format(selectedReward.cost));
player.getPackets().sendHideIComponent(1331, 17, false);
player.getPackets().sendHideIComponent(1331, 23, false);
player.getPackets().sendHideIComponent(1331, 30, false);
}
public static SlayerRewards selectedReward = null;
public static void send(Player player) {
player.getInterfaceManager().sendInterface(1331);
player.getPackets().sendIComponentText(1331, 34, "Points: " + format(player.getSlayerPoints()));
int count = 0;
for (SlayerRewards reward : SlayerRewards.values()) {
player.getPackets().sendIComponentText(1331, reward.slotId + 3,
reward.cost == 0 ? "FREE" : format(reward.cost));
ItemsContainer<Item> itemImg = new ItemsContainer<>(1, true);
itemImg.add(new Item(reward.id[0]));
player.getPackets().sendItems(1500 + count, itemImg);
player.getPackets().sendItemsToContainer(1331, reward.slotId + 2, 1500 + count, 1, 1, 0, 150, "Examine");
player.getPackets().sendHideIComponent(1331, reward.slotId, false);
count++;
}
}
public static void handle(Player player, int c) {
switch (c) {
case 30:
if (selectedReward != null){
if (player.getSlayerPoints() < selectedReward.cost){
player.out("You do not have enough Slayer Points to purchase this.");
return;
}
if (player.getInventory().getFreeSlots() < selectedReward.id.length){
player.out("You need to clear some inventory space before purchasing this.");
return;
}
player.setSlayerPoints(player.getSlayerPoints() - selectedReward.cost);
for (int index = 0; index < selectedReward.id.length; index++) {
player.getInventory().addItem(selectedReward.id[index], 1);
}
player.out(MessageFormat.format("You have purchased 1x <col=00ff00>{0}</col>.", selectedReward.name));
player.getPackets().sendIComponentText(1331, 34, "Points: " + format(player.getSlayerPoints()));
}
break;
default:
generateItemPreview(player, c);
break;
}
}
}
SlayerMasterInter.java
Code:
package com.exoria.game.player.content.interfaces;
import com.exoria.game.player.Player;
import com.exoria.game.player.Skills;
import com.exoria.game.player.actions.Slayer;
public class SlayerMasterInter {
public static void send(Player player) {
player.getInterfaceManager().sendInterface(1330);
if (!player.isVip()) {
player.getPackets().sendHideIComponent(1330, 30, true);
}
}
public static void handle(Player player, int c) {
switch (c) {
case 18:
player.setSlayerTask(null);
Slayer.submitRandomTask(player, Slayer.Master.SPRIA);
try {
player.out("Your new task is to kill " + player.getSlayerTask().getAmount() + " "
+ player.getSlayerTask().getName().toLowerCase() + ".");
} catch (ArrayIndexOutOfBoundsException t) {
}
break;
case 21:
if (player.getSkills().getCombatLevel() < 75) {
player.out("You must be 75 combat level to get a Medium task.");
return;
}
player.setSlayerTask(null);
Slayer.submitRandomTask(player, Slayer.Master.CHAELDAR);
try {
player.out("Your new task is to kill " + player.getSlayerTask().getAmount() + " "
+ player.getSlayerTask().getName().toLowerCase() + ".");
} catch (ArrayIndexOutOfBoundsException t) {
}
break;
case 24:
if (player.getSkills().getCombatLevel() < 100) {
player.out("You must be 100 combat level to get a Hard task.");
return;
}
player.setSlayerTask(null);
Slayer.submitRandomTask(player, Slayer.Master.DURADEL);
try {
player.out("Your new task is to kill " + player.getSlayerTask().getAmount() + " "
+ player.getSlayerTask().getName().toLowerCase() + ".");
} catch (ArrayIndexOutOfBoundsException t) {
}
break;
case 27:
if (player.getSkills().getCombatLevel() < 110 & player.getSkills().getLevel(Skills.SLAYER) < 90) {
player.out("You must be 110 combat level & 90 slayer to get a Boss task.");
return;
}
player.setSlayerTask(null);
Slayer.submitRandomTask(player, Slayer.Master.KURADAL);
try {
player.out("Your new task is to kill " + player.getSlayerTask().getAmount() + " "
+ player.getSlayerTask().getName().toLowerCase() + ".");
} catch (ArrayIndexOutOfBoundsException t) {
}
break;
case 30:
if (!player.isVip()) {
player.out("You must be a VIP to use this!");
return;
}
if (player.getSkills().getCombatLevel() < 110 & player.getSkills().getLevel(Skills.SLAYER) < 90) {
player.out("You must be 110 combat level & 90 slayer to get a VIP task.");
return;
}
player.setSlayerTask(null);
Slayer.submitRandomTask(player, Slayer.Master.SUMONA);
try {
player.out("Your new task is to kill " + player.getSlayerTask().getAmount() + " "
+ player.getSlayerTask().getName().toLowerCase() + ".");
} catch (ArrayIndexOutOfBoundsException t) {
}
break;
}
}
}
Let me know if I missed anything. Otherwise, enjoy.
This does have a coople of custom interfaces you will need to add. You are on your own for that one.