Followup improvements to !500

This commit is contained in:
ceikry 2022-03-31 09:22:48 -05:00
parent db7b9d06b2
commit 7ac5b630a3
75 changed files with 746 additions and 753 deletions

View file

@ -19,6 +19,7 @@ import core.game.world.map.build.DynamicRegion;
import core.game.world.map.zone.ZoneRestriction; import core.game.world.map.zone.ZoneRestriction;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.tools.RandomFunction; import core.tools.RandomFunction;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import rs09.game.world.repository.Repository; import rs09.game.world.repository.Repository;
@ -160,12 +161,11 @@ public final class TzhaarFightCavesPlugin extends ActivityPlugin {
} }
} }
player.getPacketDispatch().sendMessage("You were victorious!"); player.getPacketDispatch().sendMessage("You were victorious!");
if (!practice) { if (!practice) {
BossKillCounter.addtoKillcount(player, 2745); BossKillCounter.addtoKillcount(player, 2745);
if (player.getSlayer().getTask() == Tasks.JAD) { if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) {
player.getSkills().addExperience(Skills.SLAYER, 25000); player.getSkills().addExperience(Skills.SLAYER, 25000);
player.getSlayer().clear(); SlayerManager.getInstance(player).clear();
player.sendMessage("You receive 25,000 slayer experience for defeating TzTok-Jad."); player.sendMessage("You receive 25,000 slayer experience for defeating TzTok-Jad.");
} }
player.getDialogueInterpreter().sendDialogues(2617, null, "You even defeated TzTok-Jad, I am most impressed!", "Please accept this gift as a reward."); player.getDialogueInterpreter().sendDialogues(2617, null, "You even defeated TzTok-Jad, I am most impressed!", "Please accept this gift as a reward.");

View file

@ -1,5 +1,6 @@
package core.game.content.consumable; package core.game.content.consumable;
import core.game.content.quest.miniquest.barcrawl.BarcrawlManager;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio; import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item; import core.game.node.item.Item;
@ -21,7 +22,7 @@ public class Potion extends Drink {
if (nextItemId != -1) { if (nextItemId != -1) {
player.getInventory().replace(new Item(nextItemId), item.getSlot()); player.getInventory().replace(new Item(nextItemId), item.getSlot());
} else { } else {
if (player.getBarcrawlManager().isFinished()) { if (BarcrawlManager.getInstance(player).isFinished()) {
player.getInventory().remove(item); player.getInventory().remove(item);
} else { } else {
player.getInventory().replace(new Item(VIAL), item.getSlot()); player.getInventory().replace(new Item(VIAL), item.getSlot());

View file

@ -6,6 +6,7 @@ import core.game.node.Node;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Represents the plugin used to handle the enchanted gem related to slayer. * Represents the plugin used to handle the enchanted gem related to slayer.
@ -26,7 +27,7 @@ public final class ActivateEnchantedGem extends OptionHandler {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
if (!player.getSlayer().hasStarted()) { if (!SlayerManager.getInstance(player).hasStarted()) {
player.getPacketDispatch().sendMessage("You try to activate the gem..."); player.getPacketDispatch().sendMessage("You try to activate the gem...");
return true; return true;
} }

View file

@ -4,6 +4,7 @@ import core.game.ge.GrandExchangeDatabase;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.ExchangeItemSets; import rs09.game.interaction.inter.ge.ExchangeItemSets;
import rs09.game.interaction.inter.ge.StockMarket; import rs09.game.interaction.inter.ge.StockMarket;
@ -102,7 +103,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break; break;
case 21: case 21:
end(); end();
player.getExchangeRecords().openCollectionBox(); GrandExchangeRecords.getInstance(player).openCollectionBox();
break; break;
case 30: case 30:
npc("If that is your wish."); npc("If that is your wish.");
@ -110,7 +111,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break; break;
case 31: case 31:
end(); end();
player.getExchangeRecords().openHistoryLog(player); GrandExchangeRecords.getInstance(player).openHistoryLog(player);
break; break;
case 40: case 40:
npc("It would be my pleasure, sir."); npc("It would be my pleasure, sir.");

View file

@ -73,7 +73,7 @@ public final class BarcrawlDialogue extends DialoguePlugin {
} }
type.message(player, true); type.message(player, true);
player.getInventory().remove(type.getCoins()); player.getInventory().remove(type.getCoins());
player.getBarcrawlManager().complete(type.ordinal()); BarcrawlManager.getInstance(player).complete(type.ordinal());
player.lock(6); player.lock(6);
GameWorld.getPulser().submit(new Pulse(6, player) { GameWorld.getPulser().submit(new Pulse(6, player) {
@Override @Override

View file

@ -1,9 +1,12 @@
package core.game.content.quest.miniquest.barcrawl; package core.game.content.quest.miniquest.barcrawl;
import api.LoginListener;
import api.PersistPlayer;
import core.game.component.Component; import core.game.component.Component;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
@ -13,7 +16,7 @@ import java.nio.ByteBuffer;
* Manages the players barcrawl quest. * Manages the players barcrawl quest.
* @author 'Vexia * @author 'Vexia
*/ */
public final class BarcrawlManager { public final class BarcrawlManager implements LoginListener, PersistPlayer {
/** /**
* The barcrawl card. * The barcrawl card.
@ -53,12 +56,36 @@ public final class BarcrawlManager {
this.player = player; this.player = player;
} }
public void parse(JSONObject data){ public BarcrawlManager() {this.player = null;}
started = (boolean) data.get("started");
JSONArray barsVisisted = (JSONArray) data.get("bars"); @Override
for(int i = 0; i < barsVisisted.size(); i++){ public void login(@NotNull Player player) {
bars[i] = (boolean) barsVisisted.get(i); BarcrawlManager instance = new BarcrawlManager(player);
player.setAttribute("barcrawl-inst", instance);
} }
@Override
public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) {
JSONObject bcData = (JSONObject) data.get("barCrawl");
if(bcData == null) return;
JSONArray barsVisisted = (JSONArray) bcData.get("bars");
BarcrawlManager instance = getInstance(player);
instance.started = (boolean) bcData.get("started");
for(int i = 0; i < barsVisisted.size(); i++){
instance.bars[i] = (boolean) barsVisisted.get(i);
}
}
@Override
public void savePlayer(@NotNull Player player, @NotNull JSONObject save) {
BarcrawlManager instance = getInstance(player);
JSONObject barCrawl = new JSONObject();
barCrawl.put("started", instance.started);
JSONArray barsVisited = new JSONArray();
for(boolean visited : instance.bars)
barsVisited.add(visited);
barCrawl.put("bars",barsVisited);
save.put("barCrawl",barCrawl);
} }
/** /**
@ -153,4 +180,9 @@ public final class BarcrawlManager {
public boolean[] getBars() { public boolean[] getBars() {
return bars; return bars;
} }
public static BarcrawlManager getInstance(Player player)
{
return player.getAttribute("barcrawl-inst", new BarcrawlManager());
}
} }

View file

@ -496,7 +496,7 @@ public enum ClueLevel {
return; return;
} }
} }
if (player.getTreasureTrailManager().isCompleted() || GameWorld.getSettings().isDevMode()) { if (TreasureTrailManager.getInstance(player).isCompleted() || GameWorld.getSettings().isDevMode()) {
final List<Item> rewards = getLoot(player); final List<Item> rewards = getLoot(player);
player.getInterfaceManager().open(new Component(364).setCloseEvent(new CloseEvent() { player.getInterfaceManager().open(new Component(364).setCloseEvent(new CloseEvent() {
private boolean given; private boolean given;
@ -515,10 +515,10 @@ public enum ClueLevel {
if (casket != null) { if (casket != null) {
player.getInventory().remove(casket); player.getInventory().remove(casket);
} }
player.getTreasureTrailManager().incrementClues(this); TreasureTrailManager.getInstance(player).incrementClues(this);
player.getTreasureTrailManager().clearTrail(); TreasureTrailManager.getInstance(player).clearTrail();
player.sendMessage("Well done, you've completed the Treasure Trail!"); player.sendMessage("Well done, you've completed the Treasure Trail!");
player.sendMessage(getChatColor(this) + "You have completed " + player.getTreasureTrailManager().getCompletedClues(this) + " " + this.getName().toLowerCase() + " Treasure Trails.</col>"); player.sendMessage(getChatColor(this) + "You have completed " + TreasureTrailManager.getInstance(player).getCompletedClues(this) + " " + this.getName().toLowerCase() + " Treasure Trails.</col>");
long value = 0; long value = 0;
for (Item item : rewards) { for (Item item : rewards) {
value += item.getValue(); value += item.getValue();
@ -538,7 +538,7 @@ public enum ClueLevel {
} else { } else {
player.getInventory().add(clue); player.getInventory().add(clue);
} }
player.getTreasureTrailManager().setClueId(clue.getId()); TreasureTrailManager.getInstance(player).setClueId(clue.getId());
player.getDialogueInterpreter().sendItemMessage(clue, "You've found another clue!"); player.getDialogueInterpreter().sendItemMessage(clue, "You've found another clue!");
} }

View file

@ -107,14 +107,14 @@ public abstract class ClueScrollPlugin extends MapZone implements Plugin<Object>
* @param clue the clue. * @param clue the clue.
*/ */
public void nextStage(Player player, Item clue) { public void nextStage(Player player, Item clue) {
if (!player.getTreasureTrailManager().hasTrail() || player.getTreasureTrailManager().hasTrail() && clue.getId() != player.getTreasureTrailManager().getClueId()) { if (!TreasureTrailManager.getInstance(player).hasTrail() || TreasureTrailManager.getInstance(player).hasTrail() && clue.getId() != TreasureTrailManager.getInstance(player).getClueId()) {
player.getTreasureTrailManager().startTrail(this); TreasureTrailManager.getInstance(player).startTrail(this);
} }
int currentStage = player.getTreasureTrailManager().getTrailStage(); int currentStage = TreasureTrailManager.getInstance(player).getTrailStage();
if (currentStage >= player.getTreasureTrailManager().getTrailLength()) { if (currentStage >= TreasureTrailManager.getInstance(player).getTrailLength()) {
player.getTreasureTrailManager().clearTrail(); TreasureTrailManager.getInstance(player).clearTrail();
} else { } else {
player.getTreasureTrailManager().incrementStage(); TreasureTrailManager.getInstance(player).incrementStage();
} }
} }

View file

@ -1,8 +1,11 @@
package core.game.content.ttrail; package core.game.content.ttrail;
import api.LoginListener;
import api.PersistPlayer;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.tools.RandomFunction; import core.tools.RandomFunction;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
@ -12,7 +15,7 @@ import java.nio.ByteBuffer;
* Handles the treasure trail of a player. * Handles the treasure trail of a player.
* @author Vexia * @author Vexia
*/ */
public final class TreasureTrailManager { public final class TreasureTrailManager implements LoginListener, PersistPlayer {
/** /**
* The ids of the clues. * The ids of the clues.
@ -58,6 +61,53 @@ public final class TreasureTrailManager {
this.player = player; this.player = player;
} }
public TreasureTrailManager() {this.player = null;}
@Override
public void login(@NotNull Player player) {
TreasureTrailManager instance = new TreasureTrailManager(player);
player.setAttribute("tt-manager", instance);
}
@Override
public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) {
TreasureTrailManager instance = getInstance(player);
JSONObject ttData = (JSONObject) data.get("treasureTrails");
if(ttData == null) return;
JSONArray cc = (JSONArray) ttData.get("completedClues");
for(int i = 0; i < cc.size(); i++)
{
instance.completedClues[i] = Integer.parseInt(cc.get(i).toString());
}
if(ttData.containsKey("trail"))
{
JSONObject trail = (JSONObject) ttData.get("trail");
instance.clueId = Integer.parseInt(trail.get("clueId").toString());
instance.trailLength = Integer.parseInt(trail.get("length").toString());
instance.trailStage = Integer.parseInt(trail.get("stage").toString());
}
}
@Override
public void savePlayer(@NotNull Player player, @NotNull JSONObject save) {
TreasureTrailManager instance = getInstance(player);
JSONObject treasureTrailManager = new JSONObject();
if(instance.hasTrail()){
JSONObject trail = new JSONObject();
trail.put("clueId", Integer.toString(instance.clueId));
trail.put("length", Integer.toString(instance.trailLength));
trail.put("stage", Integer.toString(instance.trailStage));
treasureTrailManager.put("trail",trail);
}
JSONArray completedClues = new JSONArray();
for(int clue : instance.completedClues)
{
completedClues.add(Integer.toString(clue));
}
treasureTrailManager.put("completedClues",completedClues);
save.put("treasureTrails",treasureTrailManager);
}
public void parse(JSONObject data){ public void parse(JSONObject data){
JSONArray cc = (JSONArray) data.get("completedClues"); JSONArray cc = (JSONArray) data.get("completedClues");
for(int i = 0; i < cc.size(); i++){ for(int i = 0; i < cc.size(); i++){
@ -239,4 +289,8 @@ public final class TreasureTrailManager {
this.trailStage = trailStage; this.trailStage = trailStage;
} }
public static TreasureTrailManager getInstance(Player player)
{
return player.getAttribute("tt-manager", new TreasureTrailManager());
}
} }

View file

@ -145,7 +145,7 @@ public final class TreasureTrailPlugin extends OptionHandler {
* @return {@code True} if so. * @return {@code True} if so.
*/ */
private boolean hasClue(Player player) { private boolean hasClue(Player player) {
return player.getTreasureTrailManager().hasClue(); return TreasureTrailManager.getInstance(player).hasClue();
} }
} }

View file

@ -114,7 +114,8 @@ public class GrandExchangeInterface extends ComponentPlugin {
break; break;
} }
GrandExchangeOffer offer; GrandExchangeOffer offer;
if (index > -1 && (offer = player.getExchangeRecords().getOffer(player.getExchangeRecords().getOfferRecords()[index])) != null) { GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
if (index > -1 && (offer = records.getOffer(records.getOfferRecords()[index])) != null) {
StockMarket.withdraw(player, offer, slot >> 1); StockMarket.withdraw(player, offer, slot >> 1);
} }
return true; return true;

View file

@ -15,6 +15,7 @@ import core.plugin.Plugin;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.tools.StringUtils; import core.tools.StringUtils;
import kotlin.Unit; import kotlin.Unit;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Represents the interface plugin used for jewellery crafting. * Represents the interface plugin used for jewellery crafting.
@ -186,7 +187,7 @@ public final class JewelleryInterface extends ComponentPlugin {
}); });
return true; return true;
} }
if(!player.getSlayer().flags.isRingUnlocked() && data.equals(JewelleryItem.SLAYER_RING)){ if(!SlayerManager.getInstance(player).flags.isRingUnlocked() && data.equals(JewelleryItem.SLAYER_RING)){
player.sendMessages("You don't know how to make this. Talk to any Slayer master in order to learn the", "ability that creates Slayer rings."); player.sendMessages("You don't know how to make this. Talk to any Slayer master in order to learn the", "ability that creates Slayer rings.");
return true; return true;
} }

View file

@ -10,6 +10,7 @@ import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Represents the plugin used to handle enchanted jewellery transportation. * Represents the plugin used to handle enchanted jewellery transportation.
@ -27,7 +28,7 @@ public final class EnchantedGemPlugin extends OptionHandler {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
player.sendMessage("You're assigned to kill " + NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "s; only " + player.getSlayer().getAmount() + " more to go."); player.sendMessage("You're assigned to kill " + NPCDefinition.forId((SlayerManager.getInstance(player).getTask().getNpcs()[0])).getName().toLowerCase() + "s; only " + SlayerManager.getInstance(player).getAmount() + " more to go.");
return true; return true;
} }

View file

@ -155,12 +155,12 @@
// interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space."); // interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space.");
// return true; // return true;
// } // }
// if (player.getTreasureTrailManager().hasClue()) { // if (TreasureTrailManager.getInstance(player).hasClue()) {
// interpreter.sendItemMessage(14807, "Sorry, you already have a clue scroll."); // interpreter.sendItemMessage(14807, "Sorry, you already have a clue scroll.");
// break; // break;
// } // }
// if (player.getTreasureTrailManager().hasTrail()) { // if (TreasureTrailManager.getInstance(player).hasTrail()) {
// player.getTreasureTrailManager().clearTrail(); // TreasureTrailManager.getInstance(player).clearTrail();
// } // }
// Item clue = ClueScrollPlugin.getClue(RandomFunction.getRandomElement(ClueLevel.values())); // Item clue = ClueScrollPlugin.getClue(RandomFunction.getRandomElement(ClueLevel.values()));
// if (player.getInventory().remove(BOND)) { // if (player.getInventory().remove(BOND)) {

View file

@ -1,11 +1,15 @@
package core.game.interaction.item.brawling_gloves; package core.game.interaction.item.brawling_gloves;
import api.LoginListener;
import api.PersistPlayer;
import core.cache.def.impl.ItemDefinition; import core.cache.def.impl.ItemDefinition;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.nio.ByteBuffer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Objects; import java.util.Objects;
@ -13,10 +17,46 @@ import java.util.Objects;
* Manages brawling gloves for a player * Manages brawling gloves for a player
* @author ceik * @author ceik
*/ */
public class BrawlingGlovesManager { public class BrawlingGlovesManager implements LoginListener, PersistPlayer {
final Player player; final Player player;
public HashMap<Integer, Integer> GloveCharges = new HashMap<Integer,Integer>(); public HashMap<Integer, Integer> GloveCharges = new HashMap<Integer,Integer>();
public BrawlingGlovesManager(Player player){this.player = player;}
public BrawlingGlovesManager(){this.player = null;}
@Override
public void login(@NotNull Player player) {
BrawlingGlovesManager instance = new BrawlingGlovesManager(player);
player.setAttribute("bg-manager", instance);
}
@Override
public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) {
BrawlingGlovesManager instance = getInstance(player);
if(data.containsKey("brawlingGloves"))
{
JSONArray bgData = (JSONArray) data.get("brawlingGloves");
for (Object bg : bgData) {
JSONObject glove = (JSONObject) bg;
instance.registerGlove(BrawlingGloves.forIndicator(Integer.parseInt(glove.get("gloveId").toString())).getId(), Integer.parseInt(glove.get("charges").toString()));
}
}
}
@Override
public void savePlayer(@NotNull Player player, @NotNull JSONObject save) {
if(getInstance(player).GloveCharges.size() > 0){
JSONArray brawlingGloves = new JSONArray();
getInstance(player).GloveCharges.entrySet().forEach(glove -> {
JSONObject bGlove = new JSONObject();
bGlove.put("gloveId", Integer.toString(BrawlingGloves.forId(glove.getKey()).getIndicator()));
bGlove.put("charges", Integer.toString(glove.getValue()));
brawlingGloves.add(bGlove);
});
save.put("brawlingGloves", brawlingGloves);
}
}
public void registerGlove(int id) { public void registerGlove(int id) {
try { try {
registerGlove(id, Objects.requireNonNull(BrawlingGloves.forId(id)).getCharges()); registerGlove(id, Objects.requireNonNull(BrawlingGloves.forId(id)).getCharges());
@ -26,15 +66,14 @@ public class BrawlingGlovesManager {
} }
public void registerGlove(int id, int charges) {GloveCharges.putIfAbsent(id,charges);} public void registerGlove(int id, int charges) {GloveCharges.putIfAbsent(id,charges);}
public BrawlingGlovesManager(Player player){this.player = player;}
public boolean updateCharges(int glove, int charges){ public void updateCharges(int glove, int charges){
if(GloveCharges.get(glove) != null){ if(GloveCharges.get(glove) != null){
if(GloveCharges.get(glove) - charges <= 0) { if(GloveCharges.get(glove) - charges <= 0) {
GloveCharges.remove(glove); GloveCharges.remove(glove);
player.getEquipment().remove(new Item(glove)); player.getEquipment().remove(new Item(glove));
player.getPacketDispatch().sendMessage("<col=ff0000>You use the last charge of your " + ItemDefinition.forId(glove).getName() + " and they vanish.</col>"); player.getPacketDispatch().sendMessage("<col=ff0000>You use the last charge of your " + ItemDefinition.forId(glove).getName() + " and they vanish.</col>");
return false; return;
} }
int currentCharges = GloveCharges.get(glove); int currentCharges = GloveCharges.get(glove);
GloveCharges.replace(glove,currentCharges - charges); GloveCharges.replace(glove,currentCharges - charges);
@ -43,7 +82,6 @@ public class BrawlingGlovesManager {
player.getPacketDispatch().sendMessage("<col=1fbd0d>Your " + ItemDefinition.forId(glove).getName() + " have " + GloveCharges.get(glove) + " charges left.</col>"); player.getPacketDispatch().sendMessage("<col=1fbd0d>Your " + ItemDefinition.forId(glove).getName() + " have " + GloveCharges.get(glove) + " charges left.</col>");
} }
} }
return true;
} }
public double getExperienceBonus(){ public double getExperienceBonus(){
@ -56,4 +94,9 @@ public class BrawlingGlovesManager {
} }
return bonus; return bonus;
} }
public static BrawlingGlovesManager getInstance(Player player)
{
return player.getAttribute("bg-manager", new BrawlingGlovesManager());
}
} }

View file

@ -92,7 +92,7 @@ public final class BankingPlugin extends OptionHandler {
checkAchievements(player); checkAchievements(player);
return true; return true;
case "collect": case "collect":
player.getExchangeRecords().openCollectionBox(); GrandExchangeRecords.getInstance(player).openCollectionBox();
return true; return true;
case "deposit": case "deposit":
openDepositBox(player); openDepositBox(player);
@ -169,8 +169,9 @@ public final class BankingPlugin extends OptionHandler {
setId((int) args[0]); setId((int) args[0]);
} }
interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?"); interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?");
for (GrandExchangeRecords.OfferRecord r : player.getExchangeRecords().getOfferRecords()) { GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
GrandExchangeOffer o = player.getExchangeRecords().getOffer(r); for (GrandExchangeRecords.OfferRecord r : records.getOfferRecords()) {
GrandExchangeOffer o = records.getOffer(r);
if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) { if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) {
stage = -1; stage = -1;
break; break;
@ -663,7 +664,7 @@ public final class BankingPlugin extends OptionHandler {
player.getBank().open(); player.getBank().open();
checkAchievements(player); checkAchievements(player);
} else { } else {
player.getExchangeRecords().openCollectionBox(); GrandExchangeRecords.getInstance(player).openCollectionBox();
} }
return true; return true;
} }

View file

@ -12,6 +12,7 @@ import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.world.map.Location; import core.game.world.map.Location;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.ExchangeItemSets; import rs09.game.interaction.inter.ge.ExchangeItemSets;
import rs09.game.interaction.inter.ge.StockMarket; import rs09.game.interaction.inter.ge.StockMarket;
@ -46,6 +47,7 @@ public final class GrandExchangePlugin extends OptionHandler {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
if (player.getIronmanManager().checkRestriction() && !option.equals("sets")) { if (player.getIronmanManager().checkRestriction() && !option.equals("sets")) {
return true; return true;
} }
@ -61,14 +63,14 @@ public final class GrandExchangePlugin extends OptionHandler {
StockMarket.openFor(player); StockMarket.openFor(player);
break; break;
case "history": case "history":
player.getExchangeRecords().openHistoryLog(player); records.openHistoryLog(player);
break; break;
case "collect": case "collect":
if (!GrandExchangeDatabase.hasInitialized()) { if (!GrandExchangeDatabase.hasInitialized()) {
player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed..."); player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed...");
break; break;
} }
player.getExchangeRecords().openCollectionBox(); records.openCollectionBox();
break; break;
case "info-logs": case "info-logs":
GEGuidePrice.open(player, GuideType.LOGS); GEGuidePrice.open(player, GuideType.LOGS);
@ -139,7 +141,7 @@ public final class GrandExchangePlugin extends OptionHandler {
player.getBank().open(); player.getBank().open();
break; break;
case "collect": case "collect":
player.getExchangeRecords().openCollectionBox(); GrandExchangeRecords.getInstance(player).openCollectionBox();
break; break;
} }
return true; return true;

View file

@ -8,10 +8,8 @@ import core.game.container.impl.EquipmentContainer;
import core.game.container.impl.InventoryListener; import core.game.container.impl.InventoryListener;
import core.game.content.activity.pyramidplunder.PlunderObjectManager; import core.game.content.activity.pyramidplunder.PlunderObjectManager;
import core.game.content.dialogue.DialogueInterpreter; import core.game.content.dialogue.DialogueInterpreter;
import core.game.content.quest.miniquest.barcrawl.BarcrawlManager;
import core.game.content.ttrail.TreasureTrailManager; import core.game.content.ttrail.TreasureTrailManager;
import core.game.interaction.Interaction; import core.game.interaction.Interaction;
import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState; import core.game.node.entity.combat.BattleState;
import core.game.node.entity.combat.CombatStyle; import core.game.node.entity.combat.CombatStyle;
@ -24,6 +22,7 @@ import core.game.node.entity.player.info.RenderInfo;
import core.game.node.entity.player.info.Rights; import core.game.node.entity.player.info.Rights;
import core.game.node.entity.player.info.UIDInfo; import core.game.node.entity.player.info.UIDInfo;
import core.game.node.entity.player.info.login.LoginConfiguration; import core.game.node.entity.player.info.login.LoginConfiguration;
import core.game.node.entity.player.info.login.PlayerParser;
import core.game.node.entity.player.link.*; import core.game.node.entity.player.link.*;
import core.game.node.entity.player.link.appearance.Appearance; import core.game.node.entity.player.link.appearance.Appearance;
import core.game.node.entity.player.link.audio.AudioManager; import core.game.node.entity.player.link.audio.AudioManager;
@ -38,8 +37,6 @@ import core.game.node.entity.player.link.request.RequestManager;
import core.game.node.entity.player.link.skillertasks.SkillerTasks; import core.game.node.entity.player.link.skillertasks.SkillerTasks;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.construction.HouseManager; import core.game.node.entity.skill.construction.HouseManager;
import core.game.node.entity.skill.hunter.HunterManager;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import core.game.node.entity.skill.summoning.familiar.FamiliarManager; import core.game.node.entity.skill.summoning.familiar.FamiliarManager;
import core.game.node.item.GroundItem; import core.game.node.item.GroundItem;
import core.game.node.item.GroundItemManager; import core.game.node.item.GroundItemManager;
@ -69,14 +66,15 @@ import core.tools.RandomFunction;
import core.tools.StringUtils; import core.tools.StringUtils;
import kotlin.Unit; import kotlin.Unit;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.json.simple.JSONObject;
import org.rs09.consts.Items; import org.rs09.consts.Items;
import rs09.GlobalStats; import rs09.GlobalStats;
import rs09.ServerConstants; import rs09.ServerConstants;
import rs09.game.VarpManager; import rs09.game.VarpManager;
import rs09.game.content.ame.RandomEventManager;
import rs09.game.ge.GrandExchangeRecords; import rs09.game.ge.GrandExchangeRecords;
import rs09.game.node.entity.combat.CombatSwingHandler; import rs09.game.node.entity.combat.CombatSwingHandler;
import rs09.game.node.entity.combat.equipment.EquipmentDegrader; import rs09.game.node.entity.combat.equipment.EquipmentDegrader;
import rs09.game.node.entity.player.info.login.PlayerSaveParser;
import rs09.game.node.entity.player.info.login.PlayerSaver; import rs09.game.node.entity.player.info.login.PlayerSaver;
import rs09.game.node.entity.skill.runecrafting.PouchManager; import rs09.game.node.entity.skill.runecrafting.PouchManager;
import rs09.game.node.entity.state.newsys.State; import rs09.game.node.entity.state.newsys.State;
@ -219,11 +217,6 @@ public class Player extends Entity {
*/ */
private final HintIconManager hintIconManager = new HintIconManager(); private final HintIconManager hintIconManager = new HintIconManager();
/**
* The slayer manager.
*/
private final SlayerManager slayer = new SlayerManager(this);
/** /**
* The quest repository. * The quest repository.
*/ */
@ -244,11 +237,6 @@ public class Player extends Entity {
*/ */
private final GraveManager graveManager = new GraveManager(this); private final GraveManager graveManager = new GraveManager(this);
/**
* The new grand exchange interface manager.
*/
public final GrandExchangeRecords exchangeRecords = new GrandExchangeRecords(this);
/** /**
* The familiar manager. * The familiar manager.
*/ */
@ -298,26 +286,6 @@ public class Player extends Entity {
*/ */
private final HouseManager houseManager = new HouseManager(); private final HouseManager houseManager = new HouseManager();
/**
* The barcrawl miniquest manager.
*/
private final BarcrawlManager barcrawlManager = new BarcrawlManager(this);
/**
* The anti macro handler.
*/
private final RandomEventManager antiMacroHandler = new RandomEventManager(this);
/**
* The hunter manager.
*/
private final HunterManager hunterManager = new HunterManager(this);
/**
* The treasure trail manager.
*/
private final TreasureTrailManager treasureTrailManager = new TreasureTrailManager(this);
/** /**
* The audio manager. * The audio manager.
*/ */
@ -338,12 +306,6 @@ public class Player extends Entity {
*/ */
private final IronmanManager ironmanManager = new IronmanManager(this); private final IronmanManager ironmanManager = new IronmanManager(this);
/**
* Brawling Gloves manager
*/
private final BrawlingGlovesManager brawlingGlovesManager = new BrawlingGlovesManager(this);
/** /**
* The boolean for the player playing. * The boolean for the player playing.
*/ */
@ -411,16 +373,12 @@ public class Player extends Entity {
* @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat.
*/ */
public void clear(boolean force) { public void clear(boolean force) {
/*if (!force && allowRemoval()) {
Repository.getDisconnectionQueue().add(this, true);
return;
}*/
if (force) { if (force) {
Repository.getDisconnectionQueue().remove(getName()); Repository.getDisconnectionQueue().remove(getName());
} }
GameWorld.getLogoutListeners().forEach((it) -> it.logout(this));
setPlaying(false); setPlaying(false);
getWalkingQueue().reset(); getWalkingQueue().reset();
GameWorld.getLogoutListeners().forEach((it) -> it.logout(this));
if(!logoutListeners.isEmpty()){ if(!logoutListeners.isEmpty()){
logoutListeners.forEach((key,method) -> method.invoke(this)); logoutListeners.forEach((key,method) -> method.invoke(this));
} }
@ -432,7 +390,6 @@ public class Player extends Entity {
super.clear(); super.clear();
getZoneMonitor().clear(); getZoneMonitor().clear();
CommunicationInfo.notifyPlayers(this, false, false); CommunicationInfo.notifyPlayers(this, false, false);
hunterManager.logout();
HouseManager.leave(this); HouseManager.leave(this);
UpdateSequence.getRenderablePlayers().remove(this); UpdateSequence.getRenderablePlayers().remove(this);
Repository.getDisconnectionQueue().add(this); Repository.getDisconnectionQueue().add(this);
@ -480,8 +437,6 @@ public class Player extends Entity {
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
antiMacroHandler.tick();
hunterManager.pulse();
musicPlayer.tick(); musicPlayer.tick();
if(getAttribute("fire:immune",0) > 0){ if(getAttribute("fire:immune",0) > 0){
int time = getAttribute("fire:immune",0) - GameWorld.getTicks(); int time = getAttribute("fire:immune",0) - GameWorld.getTicks();
@ -1142,14 +1097,6 @@ public class Player extends Entity {
return hintIconManager; return hintIconManager;
} }
/**
* Gets the slayer.
* @return The slayer.
*/
public SlayerManager getSlayer() {
return slayer;
}
/** /**
* Checks if the player is artifical (AIPlayer). * Checks if the player is artifical (AIPlayer).
* @return {@code True} if so. * @return {@code True} if so.
@ -1263,38 +1210,6 @@ public class Player extends Entity {
return houseManager; return houseManager;
} }
/**
* Gets the barcrawlManager.
* @return The barcrawlManager.
*/
public BarcrawlManager getBarcrawlManager() {
return barcrawlManager;
}
/**
* Gets the antiMacroHandler.
* @return The antiMacroHandler.
*/
public RandomEventManager getAntiMacroHandler() {
return antiMacroHandler;
}
/**
* Gets the hunterManager.
* @return The hunterManager.
*/
public HunterManager getHunterManager() {
return hunterManager;
}
/**
* Gets the btreasureTrailManager.
* @return the treasureTrailManager
*/
public TreasureTrailManager getTreasureTrailManager() {
return treasureTrailManager;
}
/** /**
* Gets the graveManager. * Gets the graveManager.
* @return the graveManager * @return the graveManager
@ -1405,10 +1320,6 @@ public class Player extends Entity {
this.archeryTotal = archeryTotal; this.archeryTotal = archeryTotal;
} }
public BrawlingGlovesManager getBrawlingGlovesManager() { return brawlingGlovesManager;}
public GrandExchangeRecords getExchangeRecords() { return exchangeRecords; }
public boolean hasActiveState(String key){ public boolean hasActiveState(String key){
State state = states.get(key); State state = states.get(key);
if(state != null && state.getPulse() != null){ if(state != null && state.getPulse() != null){

View file

@ -81,11 +81,6 @@ public final class LoginConfiguration {
} else { } else {
configureGameWorld(player); configureGameWorld(player);
} }
if(!player.isArtificial())
{
GameWorld.getLoginListeners().forEach((listener) -> listener.login(player));
}
} }
/** /**
@ -220,10 +215,8 @@ public final class LoginConfiguration {
player.getPacketDispatch().sendRunEnergy(); player.getPacketDispatch().sendRunEnergy();
player.getFamiliarManager().login(); player.getFamiliarManager().login();
player.getInterfaceManager().openDefaultTabs(); player.getInterfaceManager().openDefaultTabs();
player.getExchangeRecords().init();
player.getPacketDispatch().sendString("Friends List - World " + GameWorld.getSettings().getWorldId(), 550, 3); player.getPacketDispatch().sendString("Friends List - World " + GameWorld.getSettings().getWorldId(), 550, 3);
player.getConfigManager().init(); player.getConfigManager().init();
player.getAntiMacroHandler().init();
player.getQuestRepository().syncronizeTab(player); player.getQuestRepository().syncronizeTab(player);
player.getGraveManager().update(); player.getGraveManager().update();
player.getInterfaceManager().close(); player.getInterfaceManager().close();

View file

@ -1,6 +1,7 @@
package core.game.node.entity.player.info.login; package core.game.node.entity.player.info.login;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import org.json.simple.JSONObject;
import rs09.ServerConstants; import rs09.ServerConstants;
import rs09.game.node.entity.player.info.login.PlayerSaveParser; import rs09.game.node.entity.player.info.login.PlayerSaveParser;
import rs09.game.node.entity.player.info.login.PlayerSaver; import rs09.game.node.entity.player.info.login.PlayerSaver;
@ -17,23 +18,15 @@ public final class PlayerParser {
* Parses or creates the player's save file depending on whether or not it exists. * Parses or creates the player's save file depending on whether or not it exists.
* @param player The player. * @param player The player.
*/ */
public static boolean parse(Player player) { public static PlayerSaveParser parse(Player player) {
File JSON = new File(ServerConstants.PLAYER_SAVE_PATH + player.getName() + ".json"); PlayerSaveParser parser = new PlayerSaveParser(player);
try { try {
if (JSON.exists()) { //parse the new JSON type. parser.parse();
new PlayerSaveParser(player).parse(); return parser;
} else { //Create new save
if(!(new File(ServerConstants.PLAYER_SAVE_PATH + "template/template.json")).exists()){
return true;
}
makeFromTemplate(player);
new PlayerSaveParser(player).parse();
}
return true;
} catch (Exception e){ } catch (Exception e){
e.printStackTrace(); e.printStackTrace();
return false; return null;
} }
} }
/** /**

View file

@ -11,6 +11,7 @@ import core.game.system.mysql.SQLManager;
import core.game.system.mysql.SQLTable; import core.game.system.mysql.SQLTable;
import core.game.system.mysql.impl.PlayerSQLHandler; import core.game.system.mysql.impl.PlayerSQLHandler;
import core.net.amsc.WorldCommunicator; import core.net.amsc.WorldCommunicator;
import rs09.game.ge.GrandExchangeRecords;
import java.math.BigInteger; import java.math.BigInteger;
import java.sql.Connection; import java.sql.Connection;
@ -108,7 +109,7 @@ public final class PlayerSQLManager {
table.getColumn("credits").updateValue(player.getDetails().credits); table.getColumn("credits").updateValue(player.getDetails().credits);
table.getColumn("bank").updateValue(player.getBank().format()); table.getColumn("bank").updateValue(player.getBank().format());
table.getColumn("lastLogin").updateValue(player.getDetails().getLastLogin()); table.getColumn("lastLogin").updateValue(player.getDetails().getLastLogin());
table.getColumn("ge").updateValue(player.getExchangeRecords().format()); table.getColumn("ge").updateValue(GrandExchangeRecords.getInstance(player).format());
table.getColumn("inventory").updateValue(player.getInventory().format()); table.getColumn("inventory").updateValue(player.getInventory().format());
table.getColumn("equipment").updateValue(player.getEquipment().format()); table.getColumn("equipment").updateValue(player.getEquipment().format());
table.getColumn("netWorth").updateValue(player.getMonitor().getNetworth()); table.getColumn("netWorth").updateValue(player.getMonitor().getNetworth());

View file

@ -4,6 +4,7 @@ import core.game.component.CloseEvent;
import core.game.component.Component; import core.game.component.Component;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.StockMarket; import rs09.game.interaction.inter.ge.StockMarket;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import core.net.packet.PacketRepository; import core.net.packet.PacketRepository;
@ -202,7 +203,7 @@ public class BankPinManager {
player.getBank().open(); player.getBank().open();
} }
} else if (buttonId == 3) { } else if (buttonId == 3) {
player.getExchangeRecords().openCollectionBox(); GrandExchangeRecords.getInstance(player).openCollectionBox();
} else if (buttonId == 4) { } else if (buttonId == 4) {
StockMarket.openFor(player); StockMarket.openFor(player);
} }

View file

@ -1,6 +1,7 @@
package core.game.node.entity.skill; package core.game.node.entity.skill;
import core.game.interaction.item.brawling_gloves.BrawlingGloves; import core.game.interaction.item.brawling_gloves.BrawlingGloves;
import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.combat.ImpactHandler; import core.game.node.entity.combat.ImpactHandler;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
@ -218,14 +219,15 @@ public final class Skills {
boolean already200m = this.experience[slot] == 200000000; boolean already200m = this.experience[slot] == 200000000;
double experienceAdd = (experience * mod); double experienceAdd = (experience * mod);
//check if a player has brawling gloves and, if equipped, modify xp //check if a player has brawling gloves and, if equipped, modify xp
if(!player.getBrawlingGlovesManager().GloveCharges.isEmpty()){ BrawlingGlovesManager bgManager = BrawlingGlovesManager.getInstance(player);
if(!bgManager.GloveCharges.isEmpty()){
Item gloves = BrawlingGloves.forSkill(slot) == null ? null : new Item(BrawlingGloves.forSkill(slot).getId()); Item gloves = BrawlingGloves.forSkill(slot) == null ? null : new Item(BrawlingGloves.forSkill(slot).getId());
if(gloves == null && (slot == Skills.STRENGTH || slot == Skills.DEFENCE)){ if(gloves == null && (slot == Skills.STRENGTH || slot == Skills.DEFENCE)){
gloves = new Item (BrawlingGloves.forSkill(Skills.ATTACK).getId()); gloves = new Item (BrawlingGloves.forSkill(Skills.ATTACK).getId());
} }
if(gloves != null && player.getEquipment().containsItem(gloves)){ if(gloves != null && player.getEquipment().containsItem(gloves)){
experienceAdd += experienceAdd * player.getBrawlingGlovesManager().getExperienceBonus(); experienceAdd += experienceAdd * bgManager.getExperienceBonus();
player.getBrawlingGlovesManager().updateCharges(gloves.getId(),1); bgManager.updateCharges(gloves.getId(),1);
} }
} }
//Check for Flame Gloves and Ring of Fire //Check for Flame Gloves and Ring of Fire

View file

@ -5,6 +5,7 @@ import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.fletching.Fletching; import core.game.node.entity.skill.fletching.Fletching;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Represents the arrow head pulse to complete the headless arrow. * Represents the arrow head pulse to complete the headless arrow.
@ -43,7 +44,7 @@ public class ArrowHeadPulse extends SkillPulse<Item> {
@Override @Override
public boolean checkRequirements() { public boolean checkRequirements() {
if (arrow.unfinished == 4160) { if (arrow.unfinished == 4160) {
if (!player.getSlayer().flags.isBroadsUnlocked()) { if (!SlayerManager.getInstance(player).flags.isBroadsUnlocked()) {
player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad arrows."); player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad arrows.");
return false; return false;
} }

View file

@ -6,6 +6,7 @@ import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.fletching.Fletching; import core.game.node.entity.skill.fletching.Fletching;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Represents the bolt pulse class to make bolts. * Represents the bolt pulse class to make bolts.
@ -60,7 +61,7 @@ public final class BoltPulse extends SkillPulse<Item> {
@Override @Override
public boolean checkRequirements() { public boolean checkRequirements() {
if (bolt.getUnfinished().getId() == 13279) { if (bolt.getUnfinished().getId() == 13279) {
if (!player.getSlayer().flags.isBroadsUnlocked()) { if (!SlayerManager.getInstance(player).flags.isBroadsUnlocked()) {
player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad bolts."); player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad bolts.");
return false; return false;
} }

View file

@ -129,7 +129,7 @@ public final class DeadfallSetting extends TrapSetting {
@Override @Override
public boolean exceedsLimit(Player player) { public boolean exceedsLimit(Player player) {
return player.getHunterManager().getTrapAmount() > 0 ? true : false; return HunterManager.getInstance(player).getTrapAmount() > 0;
} }
/** /**

View file

@ -1,9 +1,16 @@
package core.game.node.entity.skill.hunter; package core.game.node.entity.skill.hunter;
import api.LoginListener;
import api.LogoutListener;
import api.events.EventHook;
import api.events.TickEvent;
import core.game.node.entity.Entity;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery; import core.game.node.scenery.Scenery;
import org.jetbrains.annotations.NotNull;
import rs09.game.Event;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -13,7 +20,7 @@ import java.util.List;
* Manages the players hunter state. * Manages the players hunter state.
* @author Vexia * @author Vexia
*/ */
public final class HunterManager { public final class HunterManager implements LoginListener, LogoutListener, EventHook<TickEvent> {
/** /**
* The list of active traps. * The list of active traps.
@ -33,10 +40,32 @@ public final class HunterManager {
this.player = player; this.player = player;
} }
/** public HunterManager() {
* Calles every game pulse. this.player = null;
*/ }
public void pulse() {
@Override
public void login(@NotNull Player player) {
HunterManager instance = new HunterManager(player);
player.hook(Event.getTick(), instance);
player.setAttribute("hunter-manager", instance);
}
@Override
public void logout(@NotNull Player player) {
HunterManager instance = getInstance(player);
Iterator<TrapWrapper> iterator = instance.traps.iterator();
TrapWrapper wrapper = null;
while (iterator.hasNext()) {
wrapper = iterator.next();
if (wrapper.getType().getSettings().clear(wrapper, 0)) {
iterator.remove();
}
}
}
@Override
public void process(@NotNull Entity entity, @NotNull TickEvent event) {
if (traps.size() == 0) { if (traps.size() == 0) {
return; return;
} }
@ -50,20 +79,6 @@ public final class HunterManager {
} }
} }
/**
* Called when the player logs out.
*/
public void logout() {
Iterator<TrapWrapper> iterator = traps.iterator();
TrapWrapper wrapper = null;
while (iterator.hasNext()) {
wrapper = iterator.next();
if (wrapper.getType().getSettings().clear(wrapper, 0)) {
iterator.remove();
}
}
}
/** /**
* Register a hunting trap. * Register a hunting trap.
* @param trap the trap. * @param trap the trap.
@ -179,4 +194,8 @@ public final class HunterManager {
return traps; return traps;
} }
public static HunterManager getInstance(Player player)
{
return player.getAttribute("hunter-manager");
}
} }

View file

@ -148,11 +148,11 @@ public final class HunterPlugin extends OptionHandler {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final Scenery object = event.getUsedWith() instanceof Scenery ? (Scenery) event.getUsedWith() : (Scenery) event.getUsed(); final Scenery object = event.getUsedWith() instanceof Scenery ? (Scenery) event.getUsedWith() : (Scenery) event.getUsed();
final Item item = event.getUsedItem(); final Item item = event.getUsedItem();
if (!player.getHunterManager().isOwner(object)) { if (HunterManager.getInstance(player).isOwner(object)) {
player.sendMessage("This isn't your trap!"); player.sendMessage("This isn't your trap!");
return true; return true;
} }
final TrapWrapper wrapper = player.getHunterManager().getWrapper(object); final TrapWrapper wrapper = HunterManager.getInstance(player).getWrapper(object);
if (item.getId() == 594) { if (item.getId() == 594) {
wrapper.smoke(); wrapper.smoke();
} else { } else {

View file

@ -3,6 +3,7 @@ package core.game.node.entity.skill.hunter;
import core.game.node.entity.skill.SkillPulse; import core.game.node.entity.skill.SkillPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.skill.Skills;
import core.game.node.item.GroundItem; import core.game.node.item.GroundItem;
import core.game.node.item.GroundItemManager; import core.game.node.item.GroundItemManager;
import core.game.node.item.Item; import core.game.node.item.Item;
@ -37,6 +38,8 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
*/ */
private int ticks; private int ticks;
private final HunterManager instance;
/** /**
* Constructs a new {@code TrapCreatePulse} {@code Object}. * Constructs a new {@code TrapCreatePulse} {@code Object}.
* @param player the player. * @param player the player.
@ -47,15 +50,16 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
super(player, node); super(player, node);
this.trap = trap; this.trap = trap;
this.startLocation = node instanceof GroundItem ? node.getLocation() : player.getLocation(); this.startLocation = node instanceof GroundItem ? node.getLocation() : player.getLocation();
this.instance = HunterManager.getInstance(player);
} }
@Override @Override
public boolean checkRequirements() { public boolean checkRequirements() {
if (player.getHunterManager().getStaticLevel() < trap.getSettings().getLevel()) { if (player.skills.getStaticLevel(Skills.HUNTER) < trap.getSettings().getLevel()) {
player.sendMessage("You need a Hunter level of at least " + trap.getSettings().getLevel() + " in order to setup a " + node.getName().toLowerCase() + "."); player.sendMessage("You need a Hunter level of at least " + trap.getSettings().getLevel() + " in order to setup a " + node.getName().toLowerCase() + ".");
return false; return false;
} }
if (player.getHunterManager().exceedsTrapLimit(trap)) { if (instance.exceedsTrapLimit(trap)) {
player.sendMessage(trap.getSettings().getLimitMessage(player)); player.sendMessage(trap.getSettings().getLimitMessage(player));
return false; return false;
} }
@ -94,7 +98,7 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
SceneryBuilder.remove(node.asScenery()); SceneryBuilder.remove(node.asScenery());
} }
object = SceneryBuilder.add(object); object = SceneryBuilder.add(object);
player.getHunterManager().register(trap, node, object); instance.register(trap, node, object);
return true; return true;
} }

View file

@ -27,6 +27,8 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
*/ */
private int ticks; private int ticks;
private final HunterManager instance;
/** /**
* Constructs a new {@code TrapDismantlePulse} {@code Object}. * Constructs a new {@code TrapDismantlePulse} {@code Object}.
* @param player the player. * @param player the player.
@ -36,11 +38,12 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
super(player, node); super(player, node);
this.trap = wrapper.getType(); this.trap = wrapper.getType();
this.wrapper = wrapper; this.wrapper = wrapper;
this.instance = HunterManager.getInstance(player);
} }
@Override @Override
public boolean checkRequirements() { public boolean checkRequirements() {
if (wrapper == null || !player.getHunterManager().isOwner(node)) { if (wrapper == null || !instance.isOwner(node)) {
player.sendMessage("This isn't your trap!"); player.sendMessage("This isn't your trap!");
return false; return false;
} }
@ -66,7 +69,7 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
return false; return false;
} }
if (wrapper.getType().getSettings().clear(wrapper, 1)) { if (wrapper.getType().getSettings().clear(wrapper, 1)) {
player.getHunterManager().deregister(wrapper); instance.deregister(wrapper);
if (wrapper.isCaught()) { if (wrapper.isCaught()) {
if (wrapper.getType().equals(Traps.BOX_TRAP)) { if (wrapper.getType().equals(Traps.BOX_TRAP)) {
for (int i : wrapper.getReward().getNpcIds()) { for (int i : wrapper.getReward().getNpcIds()) {

View file

@ -3,6 +3,7 @@ package core.game.node.entity.skill.hunter;
import core.game.content.global.SkillingPets; import core.game.content.global.SkillingPets;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.skill.Skills;
import core.game.node.item.Item; import core.game.node.item.Item;
/** /**
@ -63,7 +64,7 @@ public class TrapNode {
if (wrapper.isCaught() || wrapper.isBusy() || wrapper.isFailed()) { if (wrapper.isCaught() || wrapper.isBusy() || wrapper.isFailed()) {
return false; return false;
} }
return player.getHunterManager().getStaticLevel() >= level && !npc.isInvisible(); return player.skills.getStaticLevel(Skills.HUNTER) >= level && !npc.isInvisible();
} }
/** /**

View file

@ -5,6 +5,7 @@ import core.cache.def.impl.SceneryDefinition;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.skill.Skills;
import core.game.node.item.GroundItem; import core.game.node.item.GroundItem;
import core.game.node.item.GroundItemManager; import core.game.node.item.GroundItemManager;
import core.game.node.item.Item; import core.game.node.item.Item;
@ -232,11 +233,12 @@ public class TrapSetting {
* @param object the object. * @param object the object.
*/ */
public void investigate(Player player, Scenery object) { public void investigate(Player player, Scenery object) {
if (!player.getHunterManager().isOwner(object)) { HunterManager instance = HunterManager.getInstance(player);
if (!instance.isOwner(object)) {
player.sendMessage("This isn't your trap."); player.sendMessage("This isn't your trap.");
return; return;
} }
TrapWrapper wrapper = player.getHunterManager().getWrapper(object); TrapWrapper wrapper = instance.getWrapper(object);
player.sendMessage("This trap " + (wrapper.isSmoked() ? "has" : "hasn't") + " been smoked."); player.sendMessage("This trap " + (wrapper.isSmoked() ? "has" : "hasn't") + " been smoked.");
} }
@ -322,7 +324,7 @@ public class TrapSetting {
* @return {@code True} if so. * @return {@code True} if so.
*/ */
public boolean isSuccess(Player player, final TrapNode node) { public boolean isSuccess(Player player, final TrapNode node) {
double level = player.getHunterManager().getStaticLevel(); double level = player.skills.getStaticLevel(Skills.HUNTER);
double req = node.getLevel(); double req = node.getLevel();
double successChance = Math.ceil((level * 50 - req * 17) / req / 3 * 4); double successChance = Math.ceil((level * 50 - req * 17) / req / 3 * 4);
int roll = RandomFunction.random(99); int roll = RandomFunction.random(99);
@ -474,7 +476,8 @@ public class TrapSetting {
* @return the message. * @return the message.
*/ */
public String getLimitMessage(Player player) { public String getLimitMessage(Player player) {
return "You don't have a high enough Hunter level to set up more than " + player.getHunterManager().getMaximumTraps() + " trap" + (player.getHunterManager().getMaximumTraps() == 1 ? "." : "s."); HunterManager instance = HunterManager.getInstance(player);
return "You don't have a high enough Hunter level to set up more than " + instance.getMaximumTraps() + " trap" + (instance.getMaximumTraps() == 1 ? "." : "s.");
} }
/** /**

View file

@ -1,5 +1,6 @@
package core.game.node.entity.skill.hunter; package core.game.node.entity.skill.hunter;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap; import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
@ -88,6 +89,8 @@ public final class TrapWrapper {
*/ */
private int ticks; private int ticks;
private HunterManager instance;
/** /**
* Constructs a new {@code TrapWrapper} {@code Object}. * Constructs a new {@code TrapWrapper} {@code Object}.
* @param player the player. * @param player the player.
@ -100,7 +103,8 @@ public final class TrapWrapper {
this.object = object; this.object = object;
this.originalId = object.getId(); this.originalId = object.getId();
this.ticks = GameWorld.getTicks() + (100); this.ticks = GameWorld.getTicks() + (100);
this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); this.instance = HunterManager.getInstance(player);
this.object.getAttributes().setAttribute("trap-uid", instance.getUid());
} }
/** /**
@ -125,7 +129,7 @@ public final class TrapWrapper {
Scenery newObject = object.transform(id); Scenery newObject = object.transform(id);
SceneryBuilder.remove(object); SceneryBuilder.remove(object);
this.object = SceneryBuilder.add(newObject); this.object = SceneryBuilder.add(newObject);
this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); this.object.getAttributes().setAttribute("trap-uid", instance.getUid());
} }
/** /**
@ -136,7 +140,7 @@ public final class TrapWrapper {
player.sendMessage("This trap has already been smoked."); player.sendMessage("This trap has already been smoked.");
return; return;
} }
if (player.getHunterManager().getStaticLevel() < 39) { if (player.skills.getStaticLevel(Skills.HUNTER) < 39) {
player.sendMessage("You need a Hunter level of at least 39 to be able to smoke traps."); player.sendMessage("You need a Hunter level of at least 39 to be able to smoke traps.");
return; return;
} }

View file

@ -94,16 +94,18 @@ public enum Traps {
* @param object the object. * @param object the object.
*/ */
public void dismantle(Player player, Scenery object) { public void dismantle(Player player, Scenery object) {
if (!player.getHunterManager().isOwner(object)) { HunterManager instance = HunterManager.getInstance(player);
if (!instance.isOwner(object)) {
player.sendMessage("This isn't your trap!"); player.sendMessage("This isn't your trap!");
return; return;
} }
if (player.getHunterManager().getWrapper(object) == null) { if (instance.getWrapper(object) == null) {
SystemLogger.logErr("NO WRAPPER (HUNTER DISMANTLE)"); SystemLogger.logErr("NO WRAPPER (HUNTER DISMANTLE)");
return; return;
} }
player.faceLocation(object.getLocation()); player.faceLocation(object.getLocation());
player.getPulseManager().run(new TrapDismantlePulse(player, object, player.getHunterManager().getWrapper(object))); player.getPulseManager().run(new TrapDismantlePulse(player, object, instance.getWrapper(object)));
} }
/** /**

View file

@ -6,6 +6,7 @@ import core.game.content.dialogue.FacialExpression;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.world.map.Direction; import core.game.world.map.Direction;
import core.plugin.Initializable; import core.plugin.Initializable;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/** /**
* Rerpresents the enchanted gem dialogue. * Rerpresents the enchanted gem dialogue.
@ -46,7 +47,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
public boolean open(Object... args) { public boolean open(Object... args) {
player.faceLocation(player.getLocation().transform(1, 0, 0)); player.faceLocation(player.getLocation().transform(1, 0, 0));
player.setDirection(Direction.EAST); player.setDirection(Direction.EAST);
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?"); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?");
stage = 0; stage = 0;
return true; return true;
} }
@ -87,13 +88,13 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
end(); end();
break; break;
case 10: case 10:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt. Come and see me", "When you can and I'll give you a new task."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt. Come and see me", "When you can and I'll give you a new task.");
stage = 11; stage = 11;
break; break;
} }
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (player.getSlayer().getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + player.getSlayer().getAmount() + " more to go."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (SlayerManager.getInstance(player).getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((SlayerManager.getInstance(player).getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + SlayerManager.getInstance(player).getAmount() + " more to go.");
player.varpManager.get(2502).setVarbit(0,player.getSlayer().flags.getTaskFlags() >> 4).send(player); player.varpManager.get(2502).setVarbit(0,SlayerManager.getInstance(player).flags.getTaskFlags() >> 4).send(player);
stage = 11; stage = 11;
break; break;
case 11: case 11:
@ -103,20 +104,20 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
case 12: case 12:
switch (buttonId) { switch (buttonId) {
case 1: case 1:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you.");
stage = 21; stage = 21;
break; break;
case 2: case 2:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task.");
stage = 31; stage = 31;
break; break;
case 3: case 3:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 99; stage = 99;
break; break;
} }
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip());
stage = 401; stage = 401;
break; break;
case 4: case 4:
@ -129,7 +130,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
} }
break; break;
case 20: case 20:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you.");
stage = 21; stage = 21;
break; break;
case 21: case 21:
@ -143,16 +144,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10; stage = 10;
break; break;
case 2: case 2:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task.");
stage = 31; stage = 31;
break; break;
case 3: case 3:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 99; stage = 99;
break; break;
} }
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip());
stage = 401; stage = 401;
break; break;
case 4: case 4:
@ -163,7 +164,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
} }
break; break;
case 30: case 30:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task.");
stage = 31; stage = 31;
break; break;
case 31: case 31:
@ -177,16 +178,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10; stage = 10;
break; break;
case 2: case 2:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you.");
stage = 21; stage = 21;
break; break;
case 3: case 3:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 0; stage = 0;
break; break;
} }
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip());
stage = 401; stage = 401;
break; break;
case 4: case 4:
@ -197,12 +198,12 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
} }
break; break;
case 400: case 400:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 0; stage = 0;
break; break;
} }
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip());
stage = 401; stage = 401;
break; break;
case 401: case 401:
@ -220,11 +221,11 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10; stage = 10;
break; break;
case 2: case 2:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you.");
stage = 21; stage = 21;
break; break;
case 3: case 3:
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task.");
stage = 31; stage = 31;
break; break;
case 4: case 4:
@ -243,17 +244,17 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
* @return the location. * @return the location.
*/ */
public String masterLocation() { public String masterLocation() {
if (player.getSlayer().getMaster().getNpc() == Master.MAZCHNA.getNpc()) if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.MAZCHNA.getNpc())
return "Canifis"; return "Canifis";
else if (player.getSlayer().getMaster().getNpc() == Master.TURAEL.getNpc()) else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.TURAEL.getNpc())
return "Taverley"; return "Taverley";
else if (player.getSlayer().getMaster().getNpc() == Master.CHAELDAR.getNpc()) else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.CHAELDAR.getNpc())
return "Zanaris"; return "Zanaris";
else if (player.getSlayer().getMaster().getNpc() == Master.VANNAKA.getNpc()) else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.VANNAKA.getNpc())
return "Edgeville dungeon"; return "Edgeville dungeon";
else if (player.getSlayer().getMaster().getNpc() == Master.DURADEL.getNpc()) else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.DURADEL.getNpc())
return "Shilo village"; return "Shilo village";
else if(player.getSlayer().getMaster() == null) { else if(SlayerManager.getInstance(player).getMaster() == null) {
return "the Gnome Stronghold"; return "the Gnome Stronghold";
} }
return null; return null;

View file

@ -2,6 +2,7 @@ package core.game.node.entity.skill.slayer;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -247,7 +248,7 @@ public enum Master {
} }
public static boolean hasSameTask(Master master, Player player){ public static boolean hasSameTask(Master master, Player player){
return master.tasks.stream().filter(task -> task.task == player.getSlayer().getTask()).count() != 0; return master.tasks.stream().filter(task -> task.task == SlayerManager.getInstance(player).getTask()).count() != 0;
} }
public static class Task{ public static class Task{

View file

@ -2,6 +2,7 @@ package core.game.node.entity.skill.slayer;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import rs09.ServerStore; import rs09.ServerStore;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import core.game.content.dialogue.DialoguePlugin; import core.game.content.dialogue.DialoguePlugin;
import core.game.content.dialogue.FacialExpression; import core.game.content.dialogue.FacialExpression;
@ -224,7 +225,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
end(); end();
break; break;
case -1: // vannaka - has options for achievement diary case -1: // vannaka - has options for achievement diary
if (!player.getSlayer().hasStarted()) { if (!SlayerManager.getInstance(player).hasStarted()) {
options("Who are you?", "Do you have anything for trade?", "Er...nothing...", "I have a question about my Achievement Diary."); options("Who are you?", "Do you have anything for trade?", "Er...nothing...", "I have a question about my Achievement Diary.");
stage = 1; stage = 1;
} else { } else {
@ -244,7 +245,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
break; break;
} }
} }
if (!player.getSlayer().hasStarted()) { if (!SlayerManager.getInstance(player).hasStarted()) {
options("Who are you?", "Do you have anything for trade?", "Er...nothing..."); options("Who are you?", "Do you have anything for trade?", "Er...nothing...");
stage = 1; stage = 1;
} else { } else {
@ -359,8 +360,8 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
case 504: case 504:
if (player.getInventory().freeSlots() != 0) { if (player.getInventory().freeSlots() != 0) {
player.getInventory().add(GEM); player.getInventory().add(GEM);
player.getSlayer().generate(master); SlayerManager.getInstance(player).generate(master);
interpreter.sendDialogues(master.getNpc(), getExpression(master), "We'll start you off hunting " + player.getSlayer().getTaskName() + "'s, you'll need to", "kill " + player.getSlayer().getAmount() + " of them."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "We'll start you off hunting " + SlayerManager.getInstance(player).getTaskName() + "'s, you'll need to", "kill " + SlayerManager.getInstance(player).getAmount() + " of them.");
stage = 510; stage = 510;
} else if (player.getInventory().freeSlots() == 0) { } else if (player.getInventory().freeSlots() == 0) {
player("Sorry, I don't have enough inventory space."); player("Sorry, I don't have enough inventory space.");
@ -491,12 +492,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
stage = 99; stage = 99;
break; break;
} }
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
player.getSlayer().generate(master); SlayerManager.getInstance(player).generate(master);
if (player.getSlayer().getTask() == Tasks.JAD) { if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad.");
} else { } else {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "s."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + SlayerManager.getInstance(player).getAmount() + " " + SlayerManager.getInstance(player).getTaskName() + "s.");
} }
stage = 844; stage = 844;
break; break;
@ -505,12 +506,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "You're still hunting something. But let me check something..."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "You're still hunting something. But let me check something...");
stage = 847; stage = 847;
} else { } else {
player.getSlayer().flags.setTaskStreak(0); SlayerManager.getInstance(player).flags.setTaskStreak(0);
player.getSlayer().generate(master); SlayerManager.getInstance(player).generate(master);
if (player.getSlayer().getTask() == Tasks.JAD) { if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad.");
} else { } else {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "'s."); interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + SlayerManager.getInstance(player).getAmount() + " " + SlayerManager.getInstance(player).getTaskName() + "'s.");
} }
stage = 844; stage = 844;
} }
@ -526,7 +527,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
case 845: case 845:
switch (buttonId) { switch (buttonId) {
case 1: case 1:
interpreter.sendDialogues(master.getNpc(), getExpression(master), player.getSlayer().getTask().getTip()); interpreter.sendDialogues(master.getNpc(), getExpression(master), SlayerManager.getInstance(player).getTask().getTip());
stage = 860; stage = 860;
break; break;
case 2: case 2:
@ -538,7 +539,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
if(rerolls == 10){ if(rerolls == 10){
stage++; stage++;
} else { } else {
player.getSlayer().clear(); SlayerManager.getInstance(player).clear();
getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1); getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1);
stage = 701; stage = 701;
} }
@ -566,7 +567,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
switch(buttonId){ switch(buttonId){
case 1: case 1:
playerl(FacialExpression.FRIENDLY, "Yes, please."); playerl(FacialExpression.FRIENDLY, "Yes, please.");
player.getSlayer().clear(); SlayerManager.getInstance(player).clear();
getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1); getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1);
stage = 701; stage = 701;
break; break;

View file

@ -14,6 +14,7 @@ import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.plugin.ClassScanner; import rs09.plugin.ClassScanner;
/** /**
@ -60,27 +61,27 @@ public class SlayerRewardPlugin extends ComponentPlugin {
switch (button) { switch (button) {
case 23://reassign case 23://reassign
case 26: case 26:
if (!player.getSlayer().hasTask()) { if (!SlayerManager.getInstance(player).hasTask()) {
player.sendMessage("You don't have an active task right now."); player.sendMessage("You don't have an active task right now.");
break; break;
} }
if (purchase(player, 30)) { if (purchase(player, 30)) {
player.getSlayer().clear(); SlayerManager.getInstance(player).clear();
player.sendMessage("You have canceled your current task."); player.sendMessage("You have canceled your current task.");
} }
break; break;
case 24: case 24:
case 27: case 27:
if (player.getSlayer().getTask() == null) { if (SlayerManager.getInstance(player).getTask() == null) {
player.sendMessage("You don't have a slayer task."); player.sendMessage("You don't have a slayer task.");
break; break;
} }
if (player.getSlayer().getRemoved().size() >= 4) { if (SlayerManager.getInstance(player).getRemoved().size() >= 4) {
player.sendMessage("You can't remove anymore tasks."); player.sendMessage("You can't remove anymore tasks.");
break; break;
} }
if (player.getSlayer().getSlayerPoints() >= 30 && !player.isAdmin()) { if (SlayerManager.getInstance(player).getSlayerPoints() >= 30 && !player.isAdmin()) {
int size = player.getSlayer().getRemoved().size(); int size = SlayerManager.getInstance(player).getRemoved().size();
int qp = player.getQuestRepository().getAvailablePoints(); int qp = player.getQuestRepository().getAvailablePoints();
if (size == 0 && qp < 50) { if (size == 0 && qp < 50) {
player.sendMessage("You need 50 quest points as a requirement in order to block one task."); player.sendMessage("You need 50 quest points as a requirement in order to block one task.");
@ -97,8 +98,8 @@ public class SlayerRewardPlugin extends ComponentPlugin {
} }
} }
if (purchase(player, 100)) { if (purchase(player, 100)) {
player.getSlayer().getRemoved().add(player.getSlayer().getTask()); SlayerManager.getInstance(player).getRemoved().add(SlayerManager.getInstance(player).getTask());
player.getSlayer().clear(); SlayerManager.getInstance(player).clear();
updateInterface(player, player.getInterfaceManager().getOpened()); updateInterface(player, player.getInterfaceManager().getOpened());
} }
break; break;
@ -107,10 +108,10 @@ public class SlayerRewardPlugin extends ComponentPlugin {
case 38: case 38:
case 39: case 39:
int index = 3 - (39 - button); int index = 3 - (39 - button);
if (player.getSlayer().getRemoved().isEmpty() || index > player.getSlayer().getRemoved().size() - 1 || player.getSlayer().getRemoved().get(index) == null) { if (SlayerManager.getInstance(player).getRemoved().isEmpty() || index > SlayerManager.getInstance(player).getRemoved().size() - 1 || SlayerManager.getInstance(player).getRemoved().get(index) == null) {
break; break;
} }
player.getSlayer().getRemoved().remove(index); SlayerManager.getInstance(player).getRemoved().remove(index);
updateInterface(player, player.getInterfaceManager().getOpened()); updateInterface(player, player.getInterfaceManager().getOpened());
break; break;
case 15: case 15:
@ -131,34 +132,34 @@ public class SlayerRewardPlugin extends ComponentPlugin {
break; break;
case 22://Broad arrows case 22://Broad arrows
case 29: case 29:
if (player.getSlayer().flags.isBroadsUnlocked()) { if (SlayerManager.getInstance(player).flags.isBroadsUnlocked()) {
player.sendMessage("You don't need to learn this ability again."); player.sendMessage("You don't need to learn this ability again.");
break; break;
} }
if (purchase(player, 300)) { if (purchase(player, 300)) {
player.getSlayer().flags.unlockBroads(); SlayerManager.getInstance(player).flags.unlockBroads();
updateInterface(player, component); updateInterface(player, component);
} }
break; break;
case 23://Slayer ring case 23://Slayer ring
case 30: case 30:
if (player.getSlayer().flags.isRingUnlocked()) { if (SlayerManager.getInstance(player).flags.isRingUnlocked()) {
player.sendMessage("You don't need to learn this ability again."); player.sendMessage("You don't need to learn this ability again.");
break; break;
} }
if (purchase(player, 300)) { if (purchase(player, 300)) {
player.getSlayer().flags.unlockRing(); SlayerManager.getInstance(player).flags.unlockRing();
updateInterface(player, component); updateInterface(player, component);
} }
break; break;
case 24://Slayer helm case 24://Slayer helm
case 31: case 31:
if (player.getSlayer().flags.isHelmUnlocked()) { if (SlayerManager.getInstance(player).flags.isHelmUnlocked()) {
player.sendMessage("You don't need to learn this ability again."); player.sendMessage("You don't need to learn this ability again.");
break; break;
} }
if (purchase(player, 400)) { if (purchase(player, 400)) {
player.getSlayer().flags.unlockHelm(); SlayerManager.getInstance(player).flags.unlockHelm();
updateInterface(player, component); updateInterface(player, component);
} }
break; break;
@ -180,7 +181,7 @@ public class SlayerRewardPlugin extends ComponentPlugin {
break; break;
case 26://ring of slaying case 26://ring of slaying
case 33: case 33:
if (player.getInventory().freeSlots() < 1 && player.getSlayer().getSlayerPoints() >= 75) { if (player.getInventory().freeSlots() < 1 && SlayerManager.getInstance(player).getSlayerPoints() >= 75) {
player.sendMessage("You don't have enough inventory space."); player.sendMessage("You don't have enough inventory space.");
break; break;
} }
@ -220,11 +221,11 @@ public class SlayerRewardPlugin extends ComponentPlugin {
* @return {@code True} if purchased. * @return {@code True} if purchased.
*/ */
private boolean purchase(Player player, int amount) { private boolean purchase(Player player, int amount) {
if (player.getSlayer().getSlayerPoints() < amount) { if (SlayerManager.getInstance(player).getSlayerPoints() < amount) {
player.sendMessage("You need " + amount + " slayer points in order to purchase this reward."); player.sendMessage("You need " + amount + " slayer points in order to purchase this reward.");
return false; return false;
} }
player.getSlayer().setSlayerPoints(player.getSlayer().getSlayerPoints() - amount); SlayerManager.getInstance(player).setSlayerPoints(SlayerManager.getInstance(player).getSlayerPoints() - amount);
updateInterface(player, player.getInterfaceManager().getOpened()); updateInterface(player, player.getInterfaceManager().getOpened());
return true; return true;
} }
@ -249,7 +250,7 @@ public class SlayerRewardPlugin extends ComponentPlugin {
return; return;
} }
String space = ""; String space = "";
String num = String.valueOf(player.getSlayer().getSlayerPoints()); String num = String.valueOf(SlayerManager.getInstance(player).getSlayerPoints());
if (num != "0") { if (num != "0") {
for (int i = 0; i < num.length(); i++) { for (int i = 0; i < num.length(); i++) {
space += " "; space += " ";
@ -261,31 +262,31 @@ public class SlayerRewardPlugin extends ComponentPlugin {
String[] letters = new String[] {"A", "B", "C", "D"}; String[] letters = new String[] {"A", "B", "C", "D"};
Tasks task = null; Tasks task = null;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
task = i > player.getSlayer().getRemoved().size() - 1 ? null : player.getSlayer().getRemoved().get(i); task = i > SlayerManager.getInstance(player).getRemoved().size() - 1 ? null : SlayerManager.getInstance(player).getRemoved().get(i);
player.getPacketDispatch().sendString(task == null ? letters[i] : task.getName(), open.getId(), childs[i]); player.getPacketDispatch().sendString(task == null ? letters[i] : task.getName(), open.getId(), childs[i]);
} }
player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 19); player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 19);
break; break;
case 163://learn case 163://learn
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
switch(i){ switch(i){
case 0: case 0:
player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isBroadsUnlocked()); player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isBroadsUnlocked());
break; break;
case 1: case 1:
player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isRingUnlocked()); player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isRingUnlocked());
break; break;
case 2: case 2:
player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isHelmUnlocked()); player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isHelmUnlocked());
break; break;
default: default:
break; break;
} }
} }
player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 18); player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 18);
break; break;
case 164://buy case 164://buy
player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 20); player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 20);
break; break;
} }
} }
@ -381,7 +382,7 @@ public class SlayerRewardPlugin extends ComponentPlugin {
player.sendMessage("You need a Crafting level of at least 55 in order to do this."); player.sendMessage("You need a Crafting level of at least 55 in order to do this.");
return true; return true;
} }
if (!player.getSlayer().flags.isHelmUnlocked()) { if (!SlayerManager.getInstance(player).flags.isHelmUnlocked()) {
player.sendMessage("You need to unlock the ability to do that first."); player.sendMessage("You need to unlock the ability to do that first.");
return true; return true;
} }

View file

@ -74,8 +74,8 @@ public class StrongholdSlayerCave extends MapZone implements Plugin<Object> {
return true; return true;
} }
attack: { attack: {
if (player.getSlayer().getMaster() == Master.NIEVE) { if (SlayerManager.getInstance(player).getMaster() == Master.NIEVE) {
for (int i : player.getSlayer().getTask().getNpcs()) { for (int i : SlayerManager.getInstance(player).getTask().getNpcs()) {
if (i != id) { if (i != id) {
continue; continue;
} }
@ -206,8 +206,8 @@ public class StrongholdSlayerCave extends MapZone implements Plugin<Object> {
return super.continueAttack(player, target, style, message); return super.continueAttack(player, target, style, message);
} }
int id = target.getId(); int id = target.getId();
if (player.getSlayer().getMaster() == Master.NIEVE) { if (SlayerManager.getInstance(player).getMaster() == Master.NIEVE) {
for (int i : player.getSlayer().getTask().getNpcs()) { for (int i : SlayerManager.getInstance(player).getTask().getNpcs()) {
if (i != id) { if (i != id) {
continue; continue;
} }

View file

@ -18,6 +18,7 @@ import org.rs09.consts.Components
import rs09.ServerConstants import rs09.ServerConstants
import rs09.game.Event import rs09.game.Event
import rs09.game.camerautils.PlayerCamera import rs09.game.camerautils.PlayerCamera
import rs09.game.content.ame.RandomEventManager
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
@ -231,7 +232,7 @@ abstract class Cutscene(val player: Player) {
player.lock() player.lock()
player.hook(Event.SelfDeath, CUTSCENE_DEATH_HOOK) player.hook(Event.SelfDeath, CUTSCENE_DEATH_HOOK)
player.logoutListeners["cutscene"] = {player -> player.location = exitLocation; player.getCutscene()?.end() } player.logoutListeners["cutscene"] = {player -> player.location = exitLocation; player.getCutscene()?.end() }
player.antiMacroHandler.enabled = false RandomEventManager.getInstance(player)!!.enabled = false
} }
/** /**
@ -260,7 +261,7 @@ abstract class Cutscene(val player: Player) {
clearNPCs() clearNPCs()
player.unhook(CUTSCENE_DEATH_HOOK) player.unhook(CUTSCENE_DEATH_HOOK)
player.logoutListeners.remove("cutscene") player.logoutListeners.remove("cutscene")
player.antiMacroHandler.enabled = true RandomEventManager.getInstance(player)!!.enabled = false
return true return true
} }
} }

View file

@ -13,3 +13,4 @@ data class InteractionEvent(val target: Node, val option: String) : Event
data class ButtonClickedEvent(val iface: Int, val buttonId: Int) : Event data class ButtonClickedEvent(val iface: Int, val buttonId: Int) : Event
data class UsedWithEvent(val used: Int, val with: Int) : Event data class UsedWithEvent(val used: Int, val with: Int) : Event
data class SelfDeath(val killer: Entity) : Event data class SelfDeath(val killer: Entity) : Event
data class TickEvent(val source: Entity) : Event

View file

@ -3,12 +3,13 @@ package rs09.game
import api.events.* import api.events.*
object Event { object Event {
val ResourceProduced = ResourceProducedEvent::class.java @JvmStatic val ResourceProduced = ResourceProducedEvent::class.java
val NPCKilled = NPCKillEvent::class.java @JvmStatic val NPCKilled = NPCKillEvent::class.java
val Teleport = TeleportEvent::class.java @JvmStatic val Teleport = TeleportEvent::class.java
val FireLit = LitFireEvent::class.java @JvmStatic val FireLit = LitFireEvent::class.java
val Interaction = InteractionEvent::class.java @JvmStatic val Interaction = InteractionEvent::class.java
val ButtonClicked = ButtonClickedEvent::class.java @JvmStatic val ButtonClicked = ButtonClickedEvent::class.java
val UsedWith = UsedWithEvent::class.java @JvmStatic val UsedWith = UsedWithEvent::class.java
val SelfDeath = SelfDeath::class.java @JvmStatic val SelfDeath = SelfDeath::class.java
@JvmStatic val Tick = TickEvent::class.java
} }

View file

@ -1,9 +1,15 @@
package rs09.game.content.ame package rs09.game.content.ame
import api.LoginListener
import api.events.EventHook
import api.events.TickEvent
import api.getAttribute import api.getAttribute
import api.setAttribute
import core.game.node.entity.Entity
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.world.map.zone.ZoneRestriction import core.game.world.map.zone.ZoneRestriction
import core.tools.RandomFunction import core.tools.RandomFunction
import rs09.game.Event
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
import kotlin.random.Random import kotlin.random.Random
@ -11,15 +17,23 @@ import kotlin.random.Random
private const val AVG_DELAY_TICKS = 6000 // 60 minutes private const val AVG_DELAY_TICKS = 6000 // 60 minutes
private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2 private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2
private const val MAX_DELAY_TICKS = MIN_DELAY_TICKS + AVG_DELAY_TICKS // window of 60 min centered on 60 min (30 to 90 min) private const val MAX_DELAY_TICKS = MIN_DELAY_TICKS + AVG_DELAY_TICKS // window of 60 min centered on 60 min (30 to 90 min)
class RandomEventManager(val player: Player) { class RandomEventManager(val player: Player? = null) : LoginListener, EventHook<TickEvent> {
var event: RandomEventNPC? = null var event: RandomEventNPC? = null
var enabled: Boolean = false var enabled: Boolean = false
var nextSpawn = 0 var nextSpawn = 0
val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin") val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin")
fun tick() { override fun login(player: Player) {
if (player.isArtificial) return if(player.isArtificial) return
if (GameWorld.ticks > nextSpawn && getAttribute(player, "tutorial:complete", false)) fireEvent() val instance = RandomEventManager(player)
player.hook(Event.Tick, instance)
setAttribute(player, "random-manager", instance)
instance.rollNextSpawn()
SystemLogger.logRE("Initialized REManager for ${player.username}.")
}
override fun process(entity: Entity, event: TickEvent) {
if (GameWorld.ticks > nextSpawn && getAttribute(player!!, "tutorial:complete", false)) fireEvent()
} }
fun fireEvent() { fun fireEvent() {
@ -27,29 +41,21 @@ class RandomEventManager(val player: Player) {
rollNextSpawn() rollNextSpawn()
return return
} }
if (player.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) { if (player!!.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) {
nextSpawn = GameWorld.ticks + 3000 nextSpawn = GameWorld.ticks + 3000
return return
} }
val currentAction = player.pulseManager.current.toString() val currentAction = player.pulseManager.current.toString()
var ame = RandomEvents.values().random() val ame: RandomEvents = if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){ RandomEvents.TREE_SPIRIT
ame = RandomEvents.TREE_SPIRIT } else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){
} RandomEvents.RIVER_TROLL
else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){ } else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){
ame = RandomEvents.RIVER_TROLL RandomEvents.ROCK_GOLEM
} } else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){
else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){ RandomEvents.SHADE
ame = RandomEvents.ROCK_GOLEM } else {
} RandomEvents.values().filter { it.type != "skill" }.random()
else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){
ame = RandomEvents.SHADE
}
else {
ame = RandomEvents.values().random()
while(ame.type == "skill"){
ame = RandomEvents.values().random()
}
} }
event = ame.npc.create(player,ame.loot,ame.type) event = ame.npc.create(player,ame.loot,ame.type)
if (event!!.spawnLocation == null) { if (event!!.spawnLocation == null) {
@ -61,14 +67,14 @@ class RandomEventManager(val player: Player) {
SystemLogger.logRE("Fired ${event!!.name} for ${player.username}") SystemLogger.logRE("Fired ${event!!.name} for ${player.username}")
} }
fun init() {
if (player.isArtificial) return
rollNextSpawn()
SystemLogger.logRE("Initialized REManager for ${player.username}")
enabled = true
}
private fun rollNextSpawn() { private fun rollNextSpawn() {
nextSpawn = GameWorld.ticks + RandomFunction.random(MIN_DELAY_TICKS, MAX_DELAY_TICKS) nextSpawn = GameWorld.ticks + RandomFunction.random(MIN_DELAY_TICKS, MAX_DELAY_TICKS)
} }
companion object {
@JvmStatic fun getInstance(player: Player): RandomEventManager?
{
return getAttribute(player, "random-manager", null)
}
}
} }

View file

@ -37,7 +37,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
open fun terminate() { open fun terminate() {
finalized = true finalized = true
pulseManager.clear("amemovement") pulseManager.clear("amemovement")
player.antiMacroHandler.event = null RandomEventManager.getInstance(player)!!.event = null
if (initialized) { if (initialized) {
poofClear(this) poofClear(this)
} }

View file

@ -1,6 +1,7 @@
package rs09.game.content.ame.events package rs09.game.content.ame.events
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.ame.events.supriseexam.SurpriseExamUtils import rs09.game.content.ame.events.supriseexam.SurpriseExamUtils
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
@ -22,11 +23,11 @@ class MysteriousOldManDialogue(val type: String) : DialogueFile() {
1 -> { 1 -> {
end() end()
teleport(player!!,type) teleport(player!!,type)
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)?.event?.terminate()
} }
2 -> { 2 -> {
end() end()
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)?.event?.terminate()
} }
} }
} }

View file

@ -3,6 +3,7 @@ package rs09.game.content.ame.events.certer
import api.addItemOrDrop import api.addItemOrDrop
import core.game.component.Component import core.game.component.Component
import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.emote.Emotes
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE import rs09.tools.END_DIALOGUE
@ -29,13 +30,13 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() {
npc("Sorry, I don't think so.").also { npc("Sorry, I don't think so.").also {
player!!.setAttribute("certer:reward", true) player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE stage = END_DIALOGUE
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)?.event?.terminate()
} }
} else { } else {
npc("Thank you, I hope you like your present. I must be", "leaving now though.").also { npc("Thank you, I hope you like your present. I must be", "leaving now though.").also {
player!!.setAttribute("certer:reward", true) player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE stage = END_DIALOGUE
player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } RandomEventManager.getInstance(player!!)!!.event!!.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) }
} }
} }
} }
@ -50,7 +51,7 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() {
// Wave goodbye // Wave goodbye
npc!!.animate(Emotes.WAVE.animation) npc!!.animate(Emotes.WAVE.animation)
// Terminate the event // Terminate the event
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)?.event?.terminate()
} else { } else {
player!!.setAttribute("random:pause", false) player!!.setAttribute("random:pause", false)
} }

View file

@ -3,6 +3,7 @@ package rs09.game.content.ame.events.certer
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import org.rs09.consts.Items import org.rs09.consts.Items
import rs09.game.content.ame.RandomEventManager
import rs09.game.interaction.InterfaceListener import rs09.game.interaction.InterfaceListener
class CerterEventInterface : InterfaceListener() { class CerterEventInterface : InterfaceListener() {
@ -36,7 +37,7 @@ class CerterEventInterface : InterfaceListener() {
val correctAnswer = player.getAttribute("certer:correctIndex", 0) val correctAnswer = player.getAttribute("certer:correctIndex", 0)
player.setAttribute("certer:correct", correctAnswer == answer) player.setAttribute("certer:correct", correctAnswer == answer)
player.interfaceManager.close() player.interfaceManager.close()
player.dialogueInterpreter.open(CerterDialogue(false), player.antiMacroHandler.event?.asNpc()) player.dialogueInterpreter.open(CerterDialogue(false), RandomEventManager.getInstance(player)!!.event?.asNpc())
return@on true return@on true
} }

View file

@ -2,6 +2,7 @@ package rs09.game.content.ame.events.drilldemon
import core.game.content.dialogue.FacialExpression import core.game.content.dialogue.FacialExpression
import core.game.system.task.Pulse import core.game.system.task.Pulse
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE import rs09.tools.END_DIALOGUE
import rs09.tools.START_DIALOGUE import rs09.tools.START_DIALOGUE
@ -9,7 +10,7 @@ import rs09.tools.START_DIALOGUE
class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() { class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() {
override fun handle(componentID: Int, buttonID: Int) { override fun handle(componentID: Int, buttonID: Int) {
var correctAmt = player!!.getAttribute(DrillDemonUtils.DD_CORRECT_COUNTER,0) var correctAmt = player!!.getAttribute(DrillDemonUtils.DD_CORRECT_COUNTER,0)
if(correctAmt == 4 && player!!.antiMacroHandler.event == null) { if(correctAmt == 4 && RandomEventManager.getInstance(player!!)!!.event == null) {
when(stage){ when(stage){
0 -> npc(FacialExpression.OLD_NORMAL,"My god you actually did it, you limp","wristed worm-bodied MAGGOT! Take this","and get out of my sight.").also { stage++ } 0 -> npc(FacialExpression.OLD_NORMAL,"My god you actually did it, you limp","wristed worm-bodied MAGGOT! Take this","and get out of my sight.").also { stage++ }
1 -> { 1 -> {
@ -24,7 +25,7 @@ class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() {
}) })
} }
} }
} else if(player!!.antiMacroHandler.event == null){ } else if(RandomEventManager.getInstance(player!!)!!.event == null){
when(stage){ when(stage){
START_DIALOGUE -> if(isCorrect) npc(FacialExpression.OLD_NORMAL,"Good! Now...").also { stage++ } else npc(FacialExpression.OLD_ANGRY1,"WRONG, MAGGOT!").also { stage++ } START_DIALOGUE -> if(isCorrect) npc(FacialExpression.OLD_NORMAL,"Good! Now...").also { stage++ } else npc(FacialExpression.OLD_ANGRY1,"WRONG, MAGGOT!").also { stage++ }
1 -> { 1 -> {
@ -40,12 +41,12 @@ class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() {
1 -> { 1 -> {
end() end()
DrillDemonUtils.teleport(player!!) DrillDemonUtils.teleport(player!!)
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE stage = END_DIALOGUE
} }
2 -> { 2 -> {
end() end()
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE stage = END_DIALOGUE
} }
} }

View file

@ -7,6 +7,7 @@ import core.game.component.Component
import core.game.node.entity.combat.ImpactHandler import core.game.node.entity.combat.ImpactHandler
import core.game.node.item.GroundItemManager import core.game.node.item.GroundItemManager
import core.game.node.item.Item import core.game.node.item.Item
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE import rs09.tools.END_DIALOGUE
@ -15,7 +16,7 @@ class GenieDialogue : DialogueFile() {
val assigned = player!!.getAttribute("genie:item",0) val assigned = player!!.getAttribute("genie:item",0)
npcl(FacialExpression.NEUTRAL, "Ah, so you are there, ${player!!.name.capitalize()}. I'm so glad you summoned me. Please take this lamp and make your wish.") npcl(FacialExpression.NEUTRAL, "Ah, so you are there, ${player!!.name.capitalize()}. I'm so glad you summoned me. Please take this lamp and make your wish.")
addItemOrDrop(player!!, assigned) addItemOrDrop(player!!, assigned)
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE stage = END_DIALOGUE
} }
} }

View file

@ -5,6 +5,7 @@ import core.game.component.Component
import core.game.node.entity.combat.ImpactHandler import core.game.node.entity.combat.ImpactHandler
import core.game.node.item.GroundItemManager import core.game.node.item.GroundItemManager
import core.game.node.item.Item import core.game.node.item.Item
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE import rs09.tools.END_DIALOGUE
@ -26,13 +27,13 @@ class SandwichLadyDialogue(val isChoice: Boolean) : DialogueFile() {
0 -> if(choice != assigned){ 0 -> if(choice != assigned){
npc!!.sendChat("That's not what I said you could have!") npc!!.sendChat("That's not what I said you could have!")
player!!.impactHandler.manualHit(npc,3,ImpactHandler.HitsplatType.NORMAL) player!!.impactHandler.manualHit(npc,3,ImpactHandler.HitsplatType.NORMAL)
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)!!.event?.terminate()
} else { } else {
npc("Here you are, dear. I hope you enjoy it!") npc("Here you are, dear. I hope you enjoy it!")
if(!player!!.inventory.add(Item(assigned))){ if(!player!!.inventory.add(Item(assigned))){
GroundItemManager.create(Item(assigned),player) GroundItemManager.create(Item(assigned),player)
} }
player!!.antiMacroHandler.event?.terminate() RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE stage = END_DIALOGUE
} }
} }

View file

@ -2,6 +2,7 @@ package rs09.game.content.ame.events.sandwichlady
import core.game.node.item.Item import core.game.node.item.Item
import org.rs09.consts.Items import org.rs09.consts.Items
import rs09.game.content.ame.RandomEventManager
import rs09.game.interaction.InterfaceListener import rs09.game.interaction.InterfaceListener
class SandwichLadyInterface : InterfaceListener(){ class SandwichLadyInterface : InterfaceListener(){
@ -31,7 +32,7 @@ class SandwichLadyInterface : InterfaceListener(){
player.setAttribute("sandwich-lady:choice",item.id) player.setAttribute("sandwich-lady:choice",item.id)
player.interfaceManager.close() player.interfaceManager.close()
player.dialogueInterpreter.open(SandwichLadyDialogue(true),player.antiMacroHandler.event) player.dialogueInterpreter.open(SandwichLadyDialogue(true), RandomEventManager.getInstance(player)!!.event)
return@on true return@on true
} }
} }

View file

@ -7,6 +7,7 @@ import core.game.node.entity.player.Player
import core.plugin.Initializable import core.plugin.Initializable
import org.rs09.consts.Items import org.rs09.consts.Items
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import rs09.game.ge.GrandExchangeRecords
/** /**
* @author qmqz * @author qmqz
@ -37,7 +38,7 @@ class SirsalBankerDialogue(player: Player? = null) : DialoguePlugin(player){
1 -> when (buttonId) { 1 -> when (buttonId) {
1 -> end().also { player.bank.open() } 1 -> end().also { player.bank.open() }
2 -> end().also { player.bankPinManager.openSettings() } 2 -> end().also { player.bankPinManager.openSettings() }
3 -> end().also { player.exchangeRecords.openCollectionBox() } 3 -> end().also { GrandExchangeRecords.getInstance(player).openCollectionBox() }
4 -> player(FacialExpression.HALF_ASKING, "What is this place?").also { stage = 5 } 4 -> player(FacialExpression.HALF_ASKING, "What is this place?").also { stage = 5 }
} }

View file

@ -1,6 +1,7 @@
package rs09.game.content.global.action package rs09.game.content.global.action
import core.game.container.impl.EquipmentContainer import core.game.container.impl.EquipmentContainer
import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager
import core.game.node.Node import core.game.node.Node
import core.game.node.entity.combat.equipment.WeaponInterface import core.game.node.entity.combat.equipment.WeaponInterface
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
@ -62,7 +63,7 @@ class EquipHandler : InteractionListener() {
//check if a brawling glove is being equipped and register it //check if a brawling glove is being equipped and register it
if (item.id in 13845..13857) { if (item.id in 13845..13857) {
player.debug("Registering gloves... ID: " + item.id) player.debug("Registering gloves... ID: " + item.id)
player.brawlingGlovesManager.registerGlove(item.id) BrawlingGlovesManager.getInstance(player).registerGlove(item.id)
} }
if (item.id == Items.BLACK_CHAINBODY_1107 && player.getAttribute("diary:falador:black-chain-bought", false) if (item.id == Items.BLACK_CHAINBODY_1107 && player.getAttribute("diary:falador:black-chain-bought", false)
&& ZoneBorders(2969, 3310, 2975, 3314, 0).insideBorder(player) && ZoneBorders(2969, 3310, 2975, 3314, 0).insideBorder(player)

View file

@ -17,7 +17,7 @@ class TutorialLoginCheck : LoginListener {
setAttribute(player, "/save:tutorial:complete", true) setAttribute(player, "/save:tutorial:complete", true)
return return
} }
GameWorld.Pulser.submit(object : Pulse() { GameWorld.Pulser.submit(object : Pulse(2) {
override fun pulse(): Boolean { override fun pulse(): Boolean {
TutorialStage.load(player, getAttribute(player, "tutorial:stage", 0), true) TutorialStage.load(player, getAttribute(player, "tutorial:stage", 0), true)
return true return true

View file

@ -214,7 +214,7 @@ class GrandExchange : StartupListener {
offer.playerUID = player.details.uid offer.playerUID = player.details.uid
offer.offerState = OfferState.REGISTERED offer.offerState = OfferState.REGISTERED
//player.exchangeRecords.update(offer) //GrandExchangeRecords.getInstance(player).update(offer)
if (offer.sell) { if (offer.sell) {
Repository.sendNews(player.username + " just offered " + offer.amount + " " + getItemName(offer.itemID) + " on the GE.") Repository.sendNews(player.username + " just offered " + offer.amount + " " + getItemName(offer.itemID) + " on the GE.")
@ -257,10 +257,10 @@ class GrandExchange : StartupListener {
seller.update() seller.update()
val sellerPlayer = Repository.uid_map[seller.playerUID] val sellerPlayer = Repository.uid_map[seller.playerUID]
sellerPlayer?.exchangeRecords?.visualizeRecords() GrandExchangeRecords.getInstance(sellerPlayer).visualizeRecords()
buyer.update() buyer.update()
val buyerPlayer = Repository.uid_map[buyer.playerUID] val buyerPlayer = Repository.uid_map[buyer.playerUID]
buyerPlayer?.exchangeRecords?.visualizeRecords() GrandExchangeRecords.getInstance(buyerPlayer).visualizeRecords()
} }
fun getValidOffers(): List<GrandExchangeOffer> fun getValidOffers(): List<GrandExchangeOffer>

View file

@ -41,15 +41,59 @@ import java.util.*
* @author Angle * @author Angle
*/ */
class GrandExchangeRecords(private val player: Player) { class GrandExchangeRecords(private val player: Player? = null) : PersistPlayer, LoginListener {
var history = arrayOfNulls<GrandExchangeOffer>(5) var history = arrayOfNulls<GrandExchangeOffer>(5)
val offerRecords = arrayOfNulls<OfferRecord>(6) val offerRecords = arrayOfNulls<OfferRecord>(6)
override fun login(player: Player) {
val instance = GrandExchangeRecords(player)
instance.init()
player.setAttribute("ge-records", instance)
}
override fun parsePlayer(player: Player, data: JSONObject) {
/**
* Parse history from JSON
*/
val historyRaw = data["ge-history"]
if(historyRaw != null){
val history = historyRaw as JSONArray
for (i in history.indices) {
val offer = history[i] as JSONObject
val o = GrandExchangeOffer()
o.itemID = offer["itemId"].toString().toInt()
o.sell = offer["isSell"] as Boolean
o.totalCoinExchange = (offer["totalCoinExchange"].toString().toInt())
o.completedAmount = (offer["completedAmount"].toString().toInt())
getInstance(player).history[i] = o
}
}
}
override fun savePlayer(player: Player, save: JSONObject) {
/**
* Save history to JSON
*/
val history = JSONArray()
getInstance(player).history.map {
if(it != null){
val historyEntry = JSONObject()
historyEntry["isSell"] = it.sell
historyEntry["itemId"] = it.itemID.toString()
historyEntry["totalCoinExchange"] = it.totalCoinExchange.toString()
historyEntry["completedAmount"] = it.completedAmount.toString()
history.add(historyEntry)
SystemLogger.logInfo("Adding history entry for ${it.itemID}")
}
}
save["ge-history"] = history
}
/** /**
* Opens the collection box. * Opens the collection box.
*/ */
fun openCollectionBox() { fun openCollectionBox() {
if (!player.bankPinManager.isUnlocked) { if (!player!!.bankPinManager.isUnlocked) {
player.bankPinManager.openType(3) player.bankPinManager.openType(3)
return return
} }
@ -143,7 +187,7 @@ class GrandExchangeRecords(private val player: Player) {
*/ */
val conn = GEDB.connect() val conn = GEDB.connect()
val stmt = conn.createStatement() val stmt = conn.createStatement()
val offer_records = stmt.executeQuery("SELECT * from player_offers where player_uid = ${player.details.uid} AND offer_state < 6") val offer_records = stmt.executeQuery("SELECT * from player_offers where player_uid = ${player!!.details.uid} AND offer_state < 6")
val needsIndex = ArrayDeque<GrandExchangeOffer>() val needsIndex = ArrayDeque<GrandExchangeOffer>()
@ -175,23 +219,6 @@ class GrandExchangeRecords(private val player: Player) {
} }
visualizeRecords() visualizeRecords()
/**
* Parse history from JSON
*/
val historyRaw = geData["history"]
if(historyRaw != null){
val history = historyRaw as JSONArray
for (i in history.indices) {
val offer = history[i] as JSONObject
var o = GrandExchangeOffer()
o.itemID = offer["itemId"].toString().toInt()
o.sell = offer["isSell"] as Boolean
o.totalCoinExchange = (offer["totalCoinExchange"].toString().toInt())
o.completedAmount = (offer["completedAmount"].toString().toInt())
history[i] = o
}
}
} }
/** /**
@ -210,7 +237,7 @@ class GrandExchangeRecords(private val player: Player) {
} }
} }
if (updated) { if (updated) {
sendMessage(player, "You have items from the Grand Exchange waiting in your collection box.") sendMessage(player!!, "You have items from the Grand Exchange waiting in your collection box.")
} }
} }
@ -242,4 +269,11 @@ class GrandExchangeRecords(private val player: Player) {
} }
data class OfferRecord(val uid: Long, val slot: Int) data class OfferRecord(val uid: Long, val slot: Int)
companion object {
@JvmStatic fun getInstance(player: Player? = null): GrandExchangeRecords
{
return player?.getAttribute("ge-records", GrandExchangeRecords()) ?: GrandExchangeRecords()
}
}
} }

View file

@ -11,6 +11,7 @@ import core.game.world.update.flag.context.ChatMessage
import core.game.world.update.flag.player.ChatFlag import core.game.world.update.flag.player.ChatFlag
import core.net.amsc.MSPacketRepository import core.net.amsc.MSPacketRepository
import core.net.amsc.WorldCommunicator import core.net.amsc.WorldCommunicator
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.world.GameWorld.Pulser import rs09.game.world.GameWorld.Pulser
import rs09.net.packet.`in`.QCPacketType import rs09.net.packet.`in`.QCPacketType
import java.nio.ByteBuffer import java.nio.ByteBuffer
@ -114,8 +115,8 @@ object QCRepository {
//My current slayer assignment is //My current slayer assignment is
else if(qcString.contains("My current Slayer assignment is")){ else if(qcString.contains("My current Slayer assignment is")){
val amount = player?.slayer?.amount val amount = SlayerManager.getInstance(player!!).amount
val taskName = NPCDefinition.forId(player?.slayer?.task?.ids?.get(0) ?: 0).name.toLowerCase() val taskName = NPCDefinition.forId(SlayerManager.getInstance(player!!).task?.ids?.get(0) ?: 0).name.toLowerCase()
if(amount ?: 0 > 0){ if(amount ?: 0 > 0){
qcString = qcString.replace("complete", "$amount $taskName") qcString = qcString.replace("complete", "$amount $taskName")
} }

View file

@ -92,7 +92,7 @@ class StockMarket : InterfaceListener() {
on(Components.STOCKMARKET_105){player, _, op, button, _, _ -> on(Components.STOCKMARKET_105){player, _, op, button, _, _ ->
val tempOffer = getAttribute(player, "ge-temp", GrandExchangeOffer()) val tempOffer = getAttribute(player, "ge-temp", GrandExchangeOffer())
var openedIndex = getAttribute(player, "ge-index", -1) var openedIndex = getAttribute(player, "ge-index", -1)
var openedOffer = player.exchangeRecords.getOffer(openedIndex) var openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex)
when(button) when(button)
{ {
@ -105,19 +105,19 @@ class StockMarket : InterfaceListener() {
203 -> abortOffer(player, openedOffer) 203 -> abortOffer(player, openedOffer)
18,34,50,69,88,107 -> { 18,34,50,69,88,107 -> {
openedIndex = (button - 18) shr 4 openedIndex = (button - 18) shr 4
openedOffer = player.exchangeRecords.getOffer(openedIndex) openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex)
if(op == 205) abortOffer(player, openedOffer) if(op == 205) abortOffer(player, openedOffer)
else updateVarbits(player, openedOffer, openedIndex) else updateVarbits(player, openedOffer, openedIndex)
} }
30,46,62,81,100,119 -> { 30,46,62,81,100,119 -> {
openedIndex = (button - 30) shr 4 openedIndex = (button - 30) shr 4
openedOffer = player.exchangeRecords.getOffer(openedIndex) openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex)
updateVarbits(player, openedOffer, openedIndex) updateVarbits(player, openedOffer, openedIndex)
player.interfaceManager.openChatbox(Components.OBJDIALOG_389) player.interfaceManager.openChatbox(Components.OBJDIALOG_389)
} }
31,47,63,82,101,120 -> { 31,47,63,82,101,120 -> {
openedIndex = (button - 31) shr 4 openedIndex = (button - 31) shr 4
openedOffer = player.exchangeRecords.getOffer(openedIndex) openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex)
updateVarbits(player, openedOffer, openedIndex, true) updateVarbits(player, openedOffer, openedIndex, true)
player.interfaceManager.openSingleTab(Component(Components.STOCKSIDE_107)).open(player) player.interfaceManager.openSingleTab(Component(Components.STOCKSIDE_107)).open(player)
player.packetDispatch.sendRunScript( player.packetDispatch.sendRunScript(
@ -257,7 +257,7 @@ class StockMarket : InterfaceListener() {
} }
if(GrandExchange.dispatch(player, offer)) if(GrandExchange.dispatch(player, offer))
{ {
player.exchangeRecords.offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid,offer.index) GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid,offer.index)
player.removeAttribute("ge-temp") player.removeAttribute("ge-temp")
} }
else else
@ -276,7 +276,7 @@ class StockMarket : InterfaceListener() {
} }
if(GrandExchange.dispatch(player, offer) && removeItem(player, Item(995, total))) if(GrandExchange.dispatch(player, offer) && removeItem(player, Item(995, total)))
{ {
player.exchangeRecords.offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid, offer.index) GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid, offer.index)
player.removeAttribute("ge-temp") player.removeAttribute("ge-temp")
} }
} }
@ -371,10 +371,10 @@ class StockMarket : InterfaceListener() {
{ {
val newHistory = arrayOfNulls<GrandExchangeOffer>(5) val newHistory = arrayOfNulls<GrandExchangeOffer>(5)
newHistory[0] = offer newHistory[0] = offer
System.arraycopy(player.exchangeRecords.history, 0, newHistory, 1, 4) System.arraycopy(GrandExchangeRecords.getInstance(player).history, 0, newHistory, 1, 4)
player.exchangeRecords.history = newHistory GrandExchangeRecords.getInstance(player).history = newHistory
} }
player.exchangeRecords.offerRecords[offer.index] = null GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = null
toMainInterface(player) toMainInterface(player)
} }
offer.update() offer.update()

View file

@ -1,8 +1,10 @@
package rs09.game.interaction.npc package rs09.game.interaction.npc
import core.game.content.quest.miniquest.barcrawl.BarcrawlManager
import core.game.content.quest.miniquest.barcrawl.BarcrawlType import core.game.content.quest.miniquest.barcrawl.BarcrawlType
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import rs09.game.content.activity.gnomecooking.* import rs09.game.content.activity.gnomecooking.*
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.ame.RandomEvents import rs09.game.content.ame.RandomEvents
import rs09.game.interaction.InteractionListener import rs09.game.interaction.InteractionListener
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
@ -19,8 +21,8 @@ class NPCTalkListener : InteractionListener() {
on(barCrawlNPCs, NPC, "talk-to", "talk"){player, node -> on(barCrawlNPCs, NPC, "talk-to", "talk"){player, node ->
val type = BarcrawlType.forId(node.id) val type = BarcrawlType.forId(node.id)
val instance = BarcrawlManager.getInstance(player)
if (player.barcrawlManager.isFinished || !player.barcrawlManager.isStarted || player.barcrawlManager.isCompleted(type!!.ordinal)) { if (instance.isFinished || !instance.isStarted || instance.isCompleted(type!!.ordinal)) {
player.dialogueInterpreter.open(node.id, node) player.dialogueInterpreter.open(node.id, node)
} else { } else {
player.dialogueInterpreter.open("barcrawl dialogue", node.id, type) player.dialogueInterpreter.open("barcrawl dialogue", node.id, type)
@ -31,10 +33,10 @@ class NPCTalkListener : InteractionListener() {
on(NPC,"talk-to","talk","talk to"){player,node -> on(NPC,"talk-to","talk","talk to"){player,node ->
val npc = node.asNpc() val npc = node.asNpc()
if(RandomEvents.randomIDs.contains(node.id)){ if(RandomEvents.randomIDs.contains(node.id)){
if(player.antiMacroHandler.event == null || player.antiMacroHandler.event!!.id != node.id){ if(RandomEventManager.getInstance(player)!!.event == null || RandomEventManager.getInstance(player)!!.event!!.id != node.id){
player.sendMessage("They aren't interested in talking to you.") player.sendMessage("They aren't interested in talking to you.")
} else { } else {
player.antiMacroHandler.event!!.talkTo(node.asNpc()) RandomEventManager.getInstance(player)!!.event!!.talkTo(node.asNpc())
} }
return@on true return@on true
} }

View file

@ -19,6 +19,7 @@ import core.game.world.map.path.Pathfinder
import core.tools.RandomFunction import core.tools.RandomFunction
import rs09.game.node.entity.combat.CombatSwingHandler import rs09.game.node.entity.combat.CombatSwingHandler
import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks
import rs09.game.node.entity.skill.slayer.SlayerManager
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.floor import kotlin.math.floor
@ -146,7 +147,7 @@ open class MeleeSwingHandler
val amuletName = (if(entity is Player) getItemFromEquipment(entity, EquipmentSlot.AMULET)?.name ?: "null" else "null").toLowerCase() val amuletName = (if(entity is Player) getItemFromEquipment(entity, EquipmentSlot.AMULET)?.name ?: "null" else "null").toLowerCase()
val victimName = entity.properties.combatPulse.getVictim()?.name ?: "none" val victimName = entity.properties.combatPulse.getVictim()?.name ?: "none"
if(entity is Player && entity.slayer.task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) if(entity is Player && SlayerManager.getInstance(entity).task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true)
effectiveAttackLevel *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer Helm/ Black Mask/ Slayer cape effectiveAttackLevel *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer Helm/ Black Mask/ Slayer cape
else if (entity is Player //Salve amulet else if (entity is Player //Salve amulet
@ -179,7 +180,7 @@ open class MeleeSwingHandler
cumulativeStr *= getSetMultiplier(entity, Skills.STRENGTH) cumulativeStr *= getSetMultiplier(entity, Skills.STRENGTH)
if(entity is Player && entity.slayer.task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) if(entity is Player && SlayerManager.getInstance(entity).task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true)
cumulativeStr *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer helm/black mask/skillcape cumulativeStr *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer helm/black mask/skillcape
/*val hit = (16 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier /*val hit = (16 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier

View file

@ -1,5 +1,6 @@
package rs09.game.node.entity.player.info.login package rs09.game.node.entity.player.info.login
import api.LoginListener
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.entity.player.info.PlayerDetails import core.game.node.entity.player.info.PlayerDetails
import core.game.node.entity.player.info.login.LoginConfiguration import core.game.node.entity.player.info.login.LoginConfiguration
@ -14,10 +15,12 @@ import core.net.amsc.ManagementServerState
import core.net.amsc.WorldCommunicator import core.net.amsc.WorldCommunicator
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
import rs09.game.world.GameWorld.loginListeners
import rs09.game.world.repository.Repository import rs09.game.world.repository.Repository
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.locks.Lock import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock import java.util.concurrent.locks.ReentrantLock
import java.util.function.Consumer
/** /**
* Parses the login of a player. * Parses the login of a player.
@ -105,14 +108,21 @@ class LoginParser(
reconnect(player, type) reconnect(player, type)
return return
} }
if(!PlayerParser.parse(player)){ try {
val parser = PlayerParser.parse(player)
?: throw IllegalStateException("Failed parsing save for: " + player.username) //Parse core
loginListeners.forEach(Consumer { listener: LoginListener -> listener.login(player) }) //Run our login hooks
parser.runContentHooks() //Run our saved-content-parsing hooks
}
catch (e: Exception)
{
e.printStackTrace()
Repository.removePlayer(player) Repository.removePlayer(player)
Repository.LOGGED_IN_PLAYERS.remove(player.username) Repository.LOGGED_IN_PLAYERS.remove(player.username)
Repository.lobbyPlayers.remove(player) Repository.lobbyPlayers.remove(player)
Repository.playerNames.remove(player.name) Repository.playerNames.remove(player.name)
MSPacketRepository.sendPlayerRemoval(player.name) MSPacketRepository.sendPlayerRemoval(player.name)
flag(Response.ERROR_LOADING_PROFILE) flag(Response.ERROR_LOADING_PROFILE)
return
} }
//Repository.getPlayerNames().put(player.getName(), player); //Repository.getPlayerNames().put(player.getName(), player);
GameWorld.Pulser.submit(object : Pulse(1) { GameWorld.Pulser.submit(object : Pulse(1) {
@ -141,8 +151,12 @@ class LoginParser(
} }
} catch (t: Throwable) { } catch (t: Throwable) {
t.printStackTrace() t.printStackTrace()
Repository.removePlayer(player)
Repository.LOGGED_IN_PLAYERS.remove(player.username)
Repository.lobbyPlayers.remove(player)
Repository.playerNames.remove(player.name) Repository.playerNames.remove(player.name)
MSPacketRepository.sendPlayerRemoval(player.name) MSPacketRepository.sendPlayerRemoval(player.name)
flag(Response.ERROR_LOADING_PROFILE)
} }
return true return true
} }

View file

@ -1,5 +1,6 @@
package rs09.game.node.entity.player.info.login package rs09.game.node.entity.player.info.login
import api.PersistPlayer
import core.game.interaction.item.brawling_gloves.BrawlingGloves import core.game.interaction.item.brawling_gloves.BrawlingGloves
import core.game.node.entity.combat.CombatSpell import core.game.node.entity.combat.CombatSpell
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
@ -18,6 +19,7 @@ import rs09.game.node.entity.skill.farming.CompostBins
import rs09.game.node.entity.skill.farming.FarmingPatch import rs09.game.node.entity.skill.farming.FarmingPatch
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
import java.io.File
import java.io.FileReader import java.io.FileReader
import java.util.* import java.util.*
@ -27,8 +29,11 @@ import java.util.*
* @param player: The player we are parsing. * @param player: The player we are parsing.
*/ */
class PlayerSaveParser(val player: Player) { class PlayerSaveParser(val player: Player) {
companion object {
val contentHooks = ArrayList<PersistPlayer>()
}
var parser = JSONParser() var parser = JSONParser()
var reader: FileReader? = FileReader(ServerConstants.PLAYER_SAVE_PATH + player.name + ".json") var reader: FileReader? = null
var saveFile: JSONObject? = null var saveFile: JSONObject? = null
var read = true var read = true
@ -36,8 +41,12 @@ class PlayerSaveParser(val player: Player) {
val bin_varps = CompostBins.values().map { it.varpIndex }.toIntArray() val bin_varps = CompostBins.values().map { it.varpIndex }.toIntArray()
init { init {
reader val JSON = File(ServerConstants.PLAYER_SAVE_PATH + player.name + ".json")
?: SystemLogger.logWarn("Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } if(JSON.exists())
{
reader = FileReader(JSON)
}
reader ?: SystemLogger.logWarn("Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false }
if (read) { if (read) {
saveFile = parser.parse(reader) as JSONObject saveFile = parser.parse(reader) as JSONObject
} }
@ -45,48 +54,40 @@ class PlayerSaveParser(val player: Player) {
fun parse() = GlobalScope.launch { fun parse() = GlobalScope.launch {
if (read) { if (read) {
launch {
parseCore() parseCore()
parseAttributes() parseAttributes()
parseSkills() parseSkills()
parseSettings() parseSettings()
parseSlayer()
parseQuests() parseQuests()
parseAppearance() parseAppearance()
parseGrave() parseGrave()
parseVarps() parseVarps()
parseStates() parseStates()
}
launch {
parseSpellbook() parseSpellbook()
parseGrandExchange()
parseSavedData() parseSavedData()
parseAutocastSpell() parseAutocastSpell()
parseFarming() parseFarming()
parseConfigs() parseConfigs()
parseMonitor() parseMonitor()
}
launch {
parseMusic() parseMusic()
parseFamiliars() parseFamiliars()
parseBarCrawl()
parseAntiMacro()
parseTT()
parseBankPin() parseBankPin()
}
launch {
parseHouse() parseHouse()
parseIronman() parseIronman()
parseEmoteManager() parseEmoteManager()
parseStatistics() parseStatistics()
parseBrawlingGloves()
parseAchievements() parseAchievements()
parsePouches() parsePouches()
}
parsePouches() parsePouches()
} }
} }
fun runContentHooks()
{
if(read)
contentHooks.forEach{it.parsePlayer(player, saveFile!!)}
}
fun parseVarps(){ fun parseVarps(){
if(saveFile!!.containsKey("varps")) if(saveFile!!.containsKey("varps"))
player.varpManager.parse(saveFile!!["varps"] as JSONArray) player.varpManager.parse(saveFile!!["varps"] as JSONArray)
@ -127,16 +128,6 @@ class PlayerSaveParser(val player: Player) {
} }
} }
fun parseBrawlingGloves() {
if (saveFile!!.containsKey("brawlingGloves")) {
val bgData: JSONArray = saveFile!!["brawlingGloves"] as JSONArray
for (bg in bgData) {
val glove = bg as JSONObject
player.brawlingGlovesManager.registerGlove(BrawlingGloves.forIndicator(glove.get("gloveId").toString().toInt()).id, glove.get("charges").toString().toInt())
}
}
}
fun parseStatistics() { fun parseStatistics() {
if (saveFile!!.containsKey("statistics")) { if (saveFile!!.containsKey("statistics")) {
val stats: JSONArray = saveFile!!["statistics"] as JSONArray val stats: JSONArray = saveFile!!["statistics"] as JSONArray
@ -186,14 +177,6 @@ class PlayerSaveParser(val player: Player) {
player.bankPinManager.parse(bpData) player.bankPinManager.parse(bpData)
} }
fun parseTT() {
val ttData = saveFile!!["treasureTrails"] as JSONObject
player.treasureTrailManager.parse(ttData)
}
fun parseAntiMacro() {
}
fun parseStates() { fun parseStates() {
player.states.clear() player.states.clear()
SystemLogger.logErr("Parsing states") SystemLogger.logErr("Parsing states")
@ -211,11 +194,6 @@ class PlayerSaveParser(val player: Player) {
} }
} }
fun parseBarCrawl() {
val barCrawlData = saveFile!!["barCrawl"] as JSONObject
player.barcrawlManager.parse(barCrawlData)
}
fun parseFamiliars() { fun parseFamiliars() {
val familiarData = saveFile!!["familiarManager"] as JSONObject val familiarData = saveFile!!["familiarManager"] as JSONObject
player.familiarManager.parse(familiarData) player.familiarManager.parse(familiarData)
@ -301,14 +279,6 @@ class PlayerSaveParser(val player: Player) {
player.savedData.globalData.parse(globalData) player.savedData.globalData.parse(globalData)
} }
fun parseGrandExchange() {
val geData: Any? = saveFile!!["grand_exchange"]
if (geData != null) {
player.exchangeRecords.parse(geData as JSONObject)
}
}
fun parseSpellbook() { fun parseSpellbook() {
val spellbookData = (saveFile!!["spellbook"] as String).toInt() val spellbookData = (saveFile!!["spellbook"] as String).toInt()
player.spellBookManager.setSpellBook(SpellBookManager.SpellBook.forInterface(spellbookData)) player.spellBookManager.setSpellBook(SpellBookManager.SpellBook.forInterface(spellbookData))
@ -332,12 +302,6 @@ class PlayerSaveParser(val player: Player) {
player.questRepository.parse(questData) player.questRepository.parse(questData)
} }
fun parseSlayer() {
saveFile ?: return
val slayerData = saveFile!!["slayer"] as JSONObject
player.slayer.parse(slayerData)
}
fun parseCore() { fun parseCore() {
saveFile ?: return saveFile ?: return
val coreData = saveFile!!["core_data"] as JSONObject val coreData = saveFile!!["core_data"] as JSONObject

View file

@ -1,5 +1,6 @@
package rs09.game.node.entity.player.info.login package rs09.game.node.entity.player.info.login
import api.PersistPlayer
import core.game.container.Container import core.game.container.Container
import core.game.interaction.item.brawling_gloves.BrawlingGloves import core.game.interaction.item.brawling_gloves.BrawlingGloves
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
@ -28,51 +29,36 @@ import javax.script.ScriptEngineManager
* @author Ceikry * @author Ceikry
*/ */
class PlayerSaver (val player: Player){ class PlayerSaver (val player: Player){
private fun populate(): JSONObject = runBlocking{ companion object {
val contentHooks = ArrayList<PersistPlayer>()
}
private fun populate(): JSONObject {
val saveFile = JSONObject() val saveFile = JSONObject()
val a = launch {
saveCoreData(saveFile) saveCoreData(saveFile)
saveSkills(saveFile) saveSkills(saveFile)
saveSettings(saveFile) saveSettings(saveFile)
saveSlayer(saveFile)
saveQuests(saveFile) saveQuests(saveFile)
saveAppearance(saveFile) saveAppearance(saveFile)
saveSpellbook(saveFile) saveSpellbook(saveFile)
saveVarps(saveFile) saveVarps(saveFile)
}
val b = launch {
saveGraveType(saveFile) saveGraveType(saveFile)
saveGrandExchangeData(saveFile)
saveSavedData(saveFile) saveSavedData(saveFile)
saveAutocast(saveFile) saveAutocast(saveFile)
saveFarming(saveFile)
saveConfigs(saveFile) saveConfigs(saveFile)
savePlayerMonitor(saveFile) savePlayerMonitor(saveFile)
}
val c = launch {
saveMusicPlayer(saveFile) saveMusicPlayer(saveFile)
saveFamiliarManager(saveFile) saveFamiliarManager(saveFile)
saveBarCrawl(saveFile)
saveStateManager(saveFile) saveStateManager(saveFile)
saveAntiMacroHandler(saveFile)
saveTreasureTrails(saveFile)
saveBankPinData(saveFile) saveBankPinData(saveFile)
}
val d = launch {
saveHouseData(saveFile) saveHouseData(saveFile)
saveAchievementData(saveFile) saveAchievementData(saveFile)
saveIronManData(saveFile) saveIronManData(saveFile)
saveEmoteData(saveFile) saveEmoteData(saveFile)
saveStatManager(saveFile) saveStatManager(saveFile)
saveBrawlingGloves(saveFile)
saveAttributes(saveFile) saveAttributes(saveFile)
}
a.join()
b.join()
c.join()
d.join()
savePouches(saveFile) savePouches(saveFile)
saveFile contentHooks.forEach { it.savePlayer(player, saveFile) }
return saveFile
} }
fun save() = runBlocking { fun save() = runBlocking {
val manager = ScriptEngineManager() val manager = ScriptEngineManager()
@ -138,19 +124,6 @@ class PlayerSaver (val player: Player){
} }
} }
fun saveBrawlingGloves(root: JSONObject){
if(player.brawlingGlovesManager.GloveCharges.isNotEmpty()){
val brawlingGloves = JSONArray()
player.brawlingGlovesManager.GloveCharges.map {
val brawlingGlove = JSONObject()
brawlingGlove.put("gloveId",BrawlingGloves.forId(it.key).indicator.toString())
brawlingGlove.put("charges",it.value.toString())
brawlingGloves.add(brawlingGlove)
}
root.put("brawlingGloves",brawlingGloves)
}
}
fun saveStatManager(root: JSONObject){ fun saveStatManager(root: JSONObject){
val statistics = JSONArray() val statistics = JSONArray()
var index = 0 var index = 0
@ -277,33 +250,6 @@ class PlayerSaver (val player: Player){
root.put("bankPinManager",bankPinManager) root.put("bankPinManager",bankPinManager)
} }
fun saveTreasureTrails(root: JSONObject){
val treasureTrailManager = JSONObject()
if(player.treasureTrailManager.hasTrail()){
val trail = JSONObject()
trail.put("clueId",player.treasureTrailManager.clueId.toString())
trail.put("length",player.treasureTrailManager.trailLength.toString())
trail.put("stage",player.treasureTrailManager.trailStage.toString())
treasureTrailManager.put("trail",trail)
}
val completedClues = JSONArray()
player.treasureTrailManager.completedClues.map {
completedClues.add(it.toString())
}
treasureTrailManager.put("completedClues",completedClues)
root.put("treasureTrails",treasureTrailManager)
}
fun saveAntiMacroHandler(root: JSONObject){
/*if(player.antiMacroHandler.isSaveRequired){
val antiMacroEvent = JSONObject()
if(player.antiMacroHandler.hasEvent()){
antiMacroEvent.put("eventName",player.antiMacroHandler.event.name)
root.put("antiMacroEvent",antiMacroEvent)
}
}*/
}
fun saveStateManager(root: JSONObject){ fun saveStateManager(root: JSONObject){
val states = JSONArray() val states = JSONArray()
player.states.forEach{key,clazz -> player.states.forEach{key,clazz ->
@ -317,17 +263,6 @@ class PlayerSaver (val player: Player){
root.put("states",states) root.put("states",states)
} }
fun saveBarCrawl(root: JSONObject){
val barCrawl = JSONObject()
barCrawl.put("started",player.barcrawlManager.isStarted)
val barsVisited = JSONArray()
player.barcrawlManager.bars.map {
barsVisited.add(it)
}
barCrawl.put("bars",barsVisited)
root.put("barCrawl",barCrawl)
}
fun saveFamiliarManager(root: JSONObject){ fun saveFamiliarManager(root: JSONObject){
val familiarManager = JSONObject() val familiarManager = JSONObject()
val petDetails = JSONArray() val petDetails = JSONArray()
@ -395,56 +330,6 @@ class PlayerSaver (val player: Player){
root.put("configs",configs) root.put("configs",configs)
} }
fun saveFarming(root: JSONObject){
/*val farming = JSONObject()
if(player.farmingManager.equipment.container.itemCount() != 0) {
val equipment = saveContainer(player.farmingManager.equipment.container)
farming.put("equipment",equipment)
}
if(player.farmingManager.compostManager.bins.size != 0){
val bins = JSONArray()
player.farmingManager.compostManager.bins.map { compostBin ->
val bin = JSONObject()
bin.put("wrapperId",compostBin.wrapperId.toString())
if(compostBin.timeStamp != 0L){
bin.put("timeStamp",compostBin.timeStamp.toString())
}
if(compostBin.compostLevel > 0) {
bin.put("compostLevel",compostBin.compostLevel.toString())
}
if(compostBin.container.itemCount() > 0) {
val compostContainer = saveContainer(compostBin.container)
bin.put("compostContainer", compostContainer)
}
bins.add(bin)
}
farming.put("bins",bins)
player.farmingManager.seedlingManager.save(farming)
}
if(player.farmingManager.patches.size != 0){
val wrappers = JSONArray()
player.farmingManager.patches.map {
val wrapper = JSONObject()
wrapper.put("wrapperId",it.wrapperId.toString())
if(player.farmingManager.amuletBoundWrapper == player.farmingManager.getPatchWrapper(it.wrapperId))
farming.put("farmingAmuletWrapperID",it.wrapperId)
val cycle = JSONObject()
cycle.put("compostThreshold",it.cycle.compostThreshold.toString())
cycle.put("growthTime",it.cycle.growthTime.toString())
cycle.put("harvestAmount",it.cycle.harvestAmount.toString())
cycle.put("protection",it.cycle.isProtected)
wrapper.put("cycle",cycle)
if(it.node != null){
wrapper.put("nodeId",it.patch.getNodePosition(it.node).toString())
}
wrappers.add(wrapper)
}
farming.put("wrappers",wrappers)
}
root.put("farming",farming)*/
}
fun saveAutocast(root: JSONObject){ fun saveAutocast(root: JSONObject){
player.properties.autocastSpell ?: return player.properties.autocastSpell ?: return
val spell = JSONObject() val spell = JSONObject()
@ -631,36 +516,6 @@ class PlayerSaver (val player: Player){
root.put("activityData",activityData) root.put("activityData",activityData)
} }
fun saveGrandExchangeData(root: JSONObject){
val grandExchange = JSONObject()
if(player.exchangeRecords.hasActiveOffer()){
val offers = JSONArray()
player.exchangeRecords.offerRecords.map {
if(it != null){
val offer = JSONObject()
offer["index"] = it.slot.toString()
offer["uid"] = it.uid.toString()
offers.add(offer)
}
}
grandExchange["offers"] = offers
}
val history = JSONArray()
player.exchangeRecords.history.map {
if(it != null){
val historyEntry = JSONObject()
historyEntry["isSell"] = it.sell
historyEntry["itemId"] = it.itemID.toString()
historyEntry["totalCoinExchange"] = it.totalCoinExchange.toString()
historyEntry["completedAmount"] = it.completedAmount.toString()
history.add(historyEntry)
}
}
grandExchange["history"] = history
root["grand_exchange"] = grandExchange
}
fun saveGraveType(root: JSONObject){ fun saveGraveType(root: JSONObject){
root.put("grave_type",player.graveManager.type.ordinal.toString()) root.put("grave_type",player.graveManager.type.ordinal.toString())
} }
@ -697,24 +552,6 @@ class PlayerSaver (val player: Player){
root.put("quests",quests) root.put("quests",quests)
} }
fun saveSlayer(root: JSONObject){
val slayer = JSONObject()
val slayerManager = player.slayer
if(slayerManager.removed.isNotEmpty()) {
val removedTasks = JSONArray()
slayerManager.removed.map {
removedTasks.add(it.ordinal.toString())
}
slayer.put("removedTasks",removedTasks)
}
slayer.put("taskStreak",slayerManager.flags.taskStreak.toString())
slayer.put("totalTasks",slayerManager.flags.completedTasks.toString())
slayer.put("equipmentFlags",slayerManager.flags.equipmentFlags)
slayer.put("taskFlags", slayerManager.flags.taskFlags)
slayer.put("rewardFlags", slayerManager.flags.rewardFlags)
root.put("slayer",slayer)
}
fun saveSettings(root: JSONObject){ fun saveSettings(root: JSONObject){
val settings = JSONObject() val settings = JSONObject()
settings.put("brightness",player.settings.brightness.toString()) settings.put("brightness",player.settings.brightness.toString())

View file

@ -2,12 +2,14 @@ package rs09.game.node.entity.player.info.stats
import core.game.component.Component import core.game.component.Component
import core.game.content.global.BossKillCounter import core.game.content.global.BossKillCounter
import core.game.content.ttrail.TreasureTrailManager
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.plugin.Initializable import core.plugin.Initializable
import org.rs09.consts.Items; import org.rs09.consts.Items;
import org.rs09.consts.NPCs; import org.rs09.consts.NPCs;
import rs09.game.content.global.GlobalKillCounter; import rs09.game.content.global.GlobalKillCounter;
import rs09.game.interaction.InterfaceListener import rs09.game.interaction.InterfaceListener
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.system.command.Command import rs09.game.system.command.Command
import rs09.game.system.command.Privilege import rs09.game.system.command.Privilege
import rs09.game.system.command.sets.CommandSet import rs09.game.system.command.sets.CommandSet
@ -38,11 +40,11 @@ fun sendStats(player: Player, other: Player, page: Int){
0 -> { 0 -> {
when(i) { when(i) {
//Various stats //Various stats
97 -> sendLine(player,"Easy Clues: ${other.treasureTrailManager.completedClues[0]}",i) 97 -> sendLine(player,"Easy Clues: ${TreasureTrailManager.getInstance(other).completedClues[0]}",i)
68 -> sendLine(player,"Medium Clues: ${other.treasureTrailManager.completedClues[1]}",i) 68 -> sendLine(player,"Medium Clues: ${TreasureTrailManager.getInstance(other).completedClues[1]}",i)
69 -> sendLine(player,"Hard Clues: ${other.treasureTrailManager.completedClues[2]}",i) 69 -> sendLine(player,"Hard Clues: ${TreasureTrailManager.getInstance(other).completedClues[2]}",i)
70 -> sendLine(player,SPACER,i) 70 -> sendLine(player,SPACER,i)
71 -> sendLine(player,"Slayer Tasks: ${other.slayer.flags.completedTasks}",i) 71 -> sendLine(player,"Slayer Tasks: ${SlayerManager.getInstance(other).flags.completedTasks}",i)
72 -> sendLine(player,"Quest Points: ${other.questRepository.points}",i) 72 -> sendLine(player,"Quest Points: ${other.questRepository.points}",i)
73 -> sendLine(player,"Ironman Mode: ${other.ironmanManager.mode.name.toLowerCase()}",i) 73 -> sendLine(player,"Ironman Mode: ${other.ironmanManager.mode.name.toLowerCase()}",i)
74 -> sendLine(player,"Deaths: ${other.getAttribute("$STATS_BASE:$STATS_DEATHS",0)}",i) 74 -> sendLine(player,"Deaths: ${other.getAttribute("$STATS_BASE:$STATS_DEATHS",0)}",i)

View file

@ -43,7 +43,7 @@ class BarbarianOutpostCourse
val id = node.id val id = node.id
getCourse(player) getCourse(player)
when (id) { when (id) {
2115, 2116 -> if (!player.barcrawlManager.isFinished || player.barcrawlManager.isStarted) { 2115, 2116 -> if (!BarcrawlManager.getInstance(player).isFinished || BarcrawlManager.getInstance(player).isStarted) {
player.dialogueInterpreter.open(384) player.dialogueInterpreter.open(384)
} else { } else {
DoorActionHandler.handleAutowalkDoor(player, node as Scenery) DoorActionHandler.handleAutowalkDoor(player, node as Scenery)
@ -65,7 +65,7 @@ class BarbarianOutpostCourse
sendMessage(player, "You climb the low wall...") sendMessage(player, "You climb the low wall...")
AgilityHandler.forceWalk(player, flag, node.location.transform(-1, 0, 0), node.location.transform(1, 0, 0), Animation.create(839), 10, 13.5, null) AgilityHandler.forceWalk(player, flag, node.location.transform(-1, 0, 0), node.location.transform(1, 0, 0), Animation.create(839), 10, 13.5, null)
} }
455 -> player.barcrawlManager.read() 455 -> BarcrawlManager.getInstance(player).read()
385 -> { 385 -> {
sendMessage(player, "The scorpion stings you!") sendMessage(player, "The scorpion stings you!")
player.impactHandler.manualHit(player, 3, HitsplatType.NORMAL) player.impactHandler.manualHit(player, 3, HitsplatType.NORMAL)
@ -217,9 +217,9 @@ class BarbarianOutpostCourse
} }
override fun open(vararg args: Any): Boolean { override fun open(vararg args: Any): Boolean {
if (!player.barcrawlManager.isStarted) { if (!BarcrawlManager.getInstance(player).isStarted) {
npc("O, waddya want?") npc("O, waddya want?")
} else if (player.barcrawlManager.isFinished && !player.barcrawlManager.isStarted) { } else if (BarcrawlManager.getInstance(player).isFinished && !BarcrawlManager.getInstance(player).isStarted) {
npc("'Ello friend.") npc("'Ello friend.")
stage = 50 stage = 50
} else { } else {
@ -250,7 +250,7 @@ class BarbarianOutpostCourse
stage++ stage++
} }
4 -> end() 4 -> end()
5 -> if (player.barcrawlManager.isFinished) { 5 -> if (BarcrawlManager.getInstance(player).isFinished) {
npc("You may pass if you like. You are a true", "barbarian now.") npc("You may pass if you like. You are a true", "barbarian now.")
stage = 4 stage = 4
} else { } else {
@ -280,8 +280,8 @@ class BarbarianOutpostCourse
stage++ stage++
} }
10 -> { 10 -> {
player.barcrawlManager.reset() BarcrawlManager.getInstance(player).reset()
player.barcrawlManager.isStarted = true BarcrawlManager.getInstance(player).isStarted = true
player.inventory.add(BarcrawlManager.BARCRAWL_CARD, player) player.inventory.add(BarcrawlManager.BARCRAWL_CARD, player)
interpreter.sendDialogue("The guard hands you a Barcrawl card.") interpreter.sendDialogue("The guard hands you a Barcrawl card.")
stage++ stage++
@ -295,10 +295,10 @@ class BarbarianOutpostCourse
stage++ stage++
} }
13 -> end() 13 -> end()
20 -> if (!player.barcrawlManager.hasCard()) { 20 -> if (!BarcrawlManager.getInstance(player).hasCard()) {
player("I've lost my barcrawl card...") player("I've lost my barcrawl card...")
stage = 23 stage = 23
} else if (player.barcrawlManager.isFinished) { } else if (BarcrawlManager.getInstance(player).isFinished) {
player("I tink I jusht 'bout done dem all... but I losht count...") player("I tink I jusht 'bout done dem all... but I losht count...")
stage = 24 stage = 24
} else { } else {
@ -318,7 +318,7 @@ class BarbarianOutpostCourse
if (!player.inventory.containsItem(BarcrawlManager.BARCRAWL_CARD)) { if (!player.inventory.containsItem(BarcrawlManager.BARCRAWL_CARD)) {
end() end()
} }
player.barcrawlManager.isStarted = false BarcrawlManager.getInstance(player).isStarted = false
player.bank.remove(BarcrawlManager.BARCRAWL_CARD) player.bank.remove(BarcrawlManager.BARCRAWL_CARD)
player.inventory.remove(BarcrawlManager.BARCRAWL_CARD) player.inventory.remove(BarcrawlManager.BARCRAWL_CARD)
interpreter.sendDialogue("You give the card to the barbarian.") interpreter.sendDialogue("You give the card to the barbarian.")

View file

@ -12,6 +12,7 @@ import core.game.node.entity.impl.ForceMovement
import core.game.node.entity.npc.AbstractNPC import core.game.node.entity.npc.AbstractNPC
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.entity.skill.Skills import core.game.node.entity.skill.Skills
import core.game.node.entity.skill.hunter.HunterManager
import core.game.node.item.Item import core.game.node.item.Item
import core.game.node.scenery.Scenery import core.game.node.scenery.Scenery
import core.game.system.task.Pulse import core.game.system.task.Pulse
@ -176,9 +177,9 @@ class PitfallListeners : InteractionListener() {
return@on true return@on true
} }
val maxTraps = player.hunterManager.maximumTraps val maxTraps = HunterManager.getInstance(player).maximumTraps
if(player.getAttribute("pitfall:count", 0) >= maxTraps) { if(player.getAttribute("pitfall:count", 0) >= maxTraps) {
player.sendMessage("You can't set up more than ${maxTraps} pitfall traps at your hunter level.") player.sendMessage("You can't set up more than $maxTraps pitfall traps at your hunter level.")
return@on true return@on true
} }
player.incrementAttribute("pitfall:count", 1) player.incrementAttribute("pitfall:count", 1)

View file

@ -29,47 +29,47 @@ object SlayerEquipmentFlags {
if((getItemFromEquipment(player, EquipmentSlot.AMULET)?.id ?: 0) == Items.WITCHWOOD_ICON_8923) flags = flags or (1 shl 7) if((getItemFromEquipment(player, EquipmentSlot.AMULET)?.id ?: 0) == Items.WITCHWOOD_ICON_8923) flags = flags or (1 shl 7)
if((getItemFromEquipment(player, EquipmentSlot.SHIELD)?.id ?: 0) == Items.MIRROR_SHIELD_4156) flags = flags or (1 shl 8) if((getItemFromEquipment(player, EquipmentSlot.SHIELD)?.id ?: 0) == Items.MIRROR_SHIELD_4156) flags = flags or (1 shl 8)
player.slayer.flags.equipmentFlags = flags SlayerManager.getInstance(player).flags.equipmentFlags = flags
} }
@JvmStatic @JvmStatic
fun hasNosePeg(player: Player): Boolean{ fun hasNosePeg(player: Player): Boolean{
return player.slayer.flags.equipmentFlags and 1 == 1 return SlayerManager.getInstance(player).flags.equipmentFlags and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasEarmuffs(player: Player): Boolean { fun hasEarmuffs(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 1) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 1) and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasFaceMask(player: Player): Boolean { fun hasFaceMask(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 2) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 2) and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasBlackMask(player: Player): Boolean { fun hasBlackMask(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 3) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 3) and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasSpinyHelmet(player: Player): Boolean { fun hasSpinyHelmet(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 4) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 4) and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasWitchwoodIcon(player: Player): Boolean { fun hasWitchwoodIcon(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 7) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 7) and 1 == 1
} }
@JvmStatic @JvmStatic
fun hasMirrorShield(player: Player): Boolean { fun hasMirrorShield(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 8) and 1 == 1 return (SlayerManager.getInstance(player).flags.equipmentFlags shr 8) and 1 == 1
} }
@JvmStatic @JvmStatic
fun getDamAccBonus(player: Player): Double { fun getDamAccBonus(player: Player): Double {
val isCape = player.slayer.flags.equipmentFlags == 0x3F val isCape = SlayerManager.getInstance(player).flags.equipmentFlags == 0x3F
val hasMask = hasBlackMask(player) val hasMask = hasBlackMask(player)
return if(isCape) 1.075 return if(isCape) 1.075

View file

@ -1,6 +1,5 @@
package rs09.game.node.entity.skill.slayer package rs09.game.node.entity.skill.slayer
import core.game.node.entity.player.Player
import core.game.node.entity.skill.slayer.Master import core.game.node.entity.skill.slayer.Master
import core.game.node.entity.skill.slayer.Tasks import core.game.node.entity.skill.slayer.Tasks
@ -8,7 +7,7 @@ import core.game.node.entity.skill.slayer.Tasks
* Bitflag-based system for storing slayer-related data for a player and various helper functions. * Bitflag-based system for storing slayer-related data for a player and various helper functions.
* @author Ceikry * @author Ceikry
*/ */
class SlayerFlags(val player: Player) { class SlayerFlags {
var taskFlags = 0 var taskFlags = 0
var rewardFlags = 0 var rewardFlags = 0
var equipmentFlags = 0 var equipmentFlags = 0

View file

@ -1,47 +0,0 @@
package rs09.game.node.entity.skill.slayer
import api.events.EventHook
import api.events.NPCKillEvent
import api.rewardXP
import core.game.node.entity.Entity
import core.game.node.entity.player.Player
import core.game.node.entity.skill.Skills
import core.game.node.entity.skill.slayer.Master
object SlayerKillHook : EventHook<NPCKillEvent>
{
override fun process(entity: Entity, event: NPCKillEvent) {
val npc = event.npc
val player = entity as? Player ?: return
val slayer = player.slayer
val flags = slayer.flags
if (slayer.hasTask()) {
rewardXP(player, Skills.SLAYER, npc.skills.maximumLifepoints.toDouble())
slayer.decrementAmount(1)
if(slayer.hasTask()) return
flags.taskStreak = flags.taskStreak + 1
flags.completedTasks = flags.completedTasks + 1
if ((flags.completedTasks > 4 || flags.canEarnPoints()) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) {
var points = flags.getMaster().taskPoints[0]
if (flags.taskStreak % 50 == 0) {
points = flags.getMaster().taskPoints[2]
} else if (flags.taskStreak % 10 == 0) {
points = flags.getMaster().taskPoints[1]
}
flags.incrementPoints(points)
if (flags.getPoints() > 64000) {
flags.setPoints(64000)
}
player.sendMessages("You've completed " + flags.taskStreak + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(), "You have completed " + flags.completedTasks + " tasks in total. Return to a Slayer master.")
} else if (flags.completedTasks == 4) {
player.sendMessage("You've completed your task; you will start gaining points on your next task!")
flags.flagCanEarnPoints()
} else if (flags.getMaster() == Master.TURAEL) {
player.sendMessages("You've completed your task; Tasks from Turael do not award points.", "Return to a Slayer master.")
} else {
player.sendMessages("You've completed your task; Complete " + (4 - flags.completedTasks) + " more task(s) to start gaining points.", "Return to a Slayer master.")
}
}
}
}

View file

@ -1,7 +1,15 @@
package rs09.game.node.entity.skill.slayer package rs09.game.node.entity.skill.slayer
import api.LoginListener
import api.PersistPlayer
import api.events.EventHook
import api.events.NPCKillEvent
import api.getAttribute
import api.rewardXP
import core.cache.def.impl.NPCDefinition import core.cache.def.impl.NPCDefinition
import core.game.node.entity.Entity
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.entity.skill.Skills
import core.game.node.entity.skill.slayer.Master import core.game.node.entity.skill.slayer.Master
import core.game.node.entity.skill.slayer.Tasks import core.game.node.entity.skill.slayer.Tasks
import org.json.simple.JSONArray import org.json.simple.JSONArray
@ -10,23 +18,44 @@ import rs09.game.Event
import java.util.* import java.util.*
/** /**
* Manages the players slayer task. * Manages the players slayer data.
* @author Ceikry * @author Ceikry
*/ */
class SlayerManager(val player: Player) { class SlayerManager(val player: Player? = null) : LoginListener, PersistPlayer, EventHook<NPCKillEvent> {
override fun login(player: Player) {
init { val instance = SlayerManager(player)
player.hook(Event.NPCKilled, SlayerKillHook) player.hook(Event.NPCKilled, instance)
player.setAttribute("slayer-manager", instance)
} }
/** /**
* The player's slayer flags * The player's slayer flags
*/ */
@JvmField @JvmField
val flags: SlayerFlags = SlayerFlags(player) val flags: SlayerFlags = SlayerFlags()
fun parse(slayerData: JSONObject) { override fun savePlayer(player: Player, save: JSONObject) {
val slayer = JSONObject()
val slayerManager = getInstance(player)
if(slayerManager.removed.isNotEmpty()) {
val removedTasks = JSONArray()
slayerManager.removed.map {
removedTasks.add(it.ordinal.toString())
}
slayer["removedTasks"] = removedTasks
}
slayer["taskStreak"] = slayerManager.flags.taskStreak.toString()
slayer["totalTasks"] = slayerManager.flags.completedTasks.toString()
slayer["equipmentFlags"] = slayerManager.flags.equipmentFlags
slayer["taskFlags"] = slayerManager.flags.taskFlags
slayer["rewardFlags"] = slayerManager.flags.rewardFlags
save["slayer"] = slayer
}
override fun parsePlayer(player: Player, data: JSONObject) {
val slayerData = data["slayer"] as JSONObject
val m = slayerData["master"] val m = slayerData["master"]
val flags = getInstance(player).flags
if (m != null) { if (m != null) {
flags.setMaster(Master.forId(m.toString().toInt())) flags.setMaster(Master.forId(m.toString().toInt()))
} }
@ -71,13 +100,48 @@ class SlayerManager(val player: Player) {
if (slayerData.containsKey("rewardFlags")) flags.rewardFlags = slayerData["rewardFlags"].toString().toInt() if (slayerData.containsKey("rewardFlags")) flags.rewardFlags = slayerData["rewardFlags"].toString().toInt()
} }
override fun process(entity: Entity, event: NPCKillEvent) {
val npc = event.npc
val player = entity as? Player ?: return
val slayer = getInstance(player)
val flags = slayer.flags
if (slayer.hasTask() && npc.id in slayer.task!!.npcs) {
rewardXP(player, Skills.SLAYER, npc.skills.maximumLifepoints.toDouble())
slayer.decrementAmount(1)
if(slayer.hasTask()) return
flags.taskStreak = flags.taskStreak + 1
flags.completedTasks = flags.completedTasks + 1
if ((flags.completedTasks > 4 || flags.canEarnPoints()) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) {
var points = flags.getMaster().taskPoints[0]
if (flags.taskStreak % 50 == 0) {
points = flags.getMaster().taskPoints[2]
} else if (flags.taskStreak % 10 == 0) {
points = flags.getMaster().taskPoints[1]
}
flags.incrementPoints(points)
if (flags.getPoints() > 64000) {
flags.setPoints(64000)
}
player.sendMessages("You've completed " + flags.taskStreak + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(), "You have completed " + flags.completedTasks + " tasks in total. Return to a Slayer master.")
} else if (flags.completedTasks == 4) {
player.sendMessage("You've completed your task; you will start gaining points on your next task!")
flags.flagCanEarnPoints()
} else if (flags.getMaster() == Master.TURAEL) {
player.sendMessages("You've completed your task; Tasks from Turael do not award points.", "Return to a Slayer master.")
} else {
player.sendMessages("You've completed your task; Complete " + (4 - flags.completedTasks) + " more task(s) to start gaining points.", "Return to a Slayer master.")
}
}
}
/** /**
* Method used to assign a new task for a player. * Method used to assign a new task for a player.
* @param master the master to give the task. * @param master the master to give the task.
*/ */
fun generate(master: Master) { fun generate(master: Master) {
val task = SlayerUtils.generate(player, master) ?: return val task = SlayerUtils.generate(player!!, master) ?: return
SlayerUtils.assign(player, task, master) SlayerUtils.assign(player!!, task, master)
} }
/** /**
@ -137,7 +201,7 @@ class SlayerManager(val player: Player) {
fun decrementAmount(amount: Int) { fun decrementAmount(amount: Int) {
flags.decrementTaskAmount(amount) flags.decrementTaskAmount(amount)
player.varpManager.get(2502).setVarbit(0, flags.taskFlags shr 4).send(player) player!!.varpManager.get(2502).setVarbit(0, flags.taskFlags shr 4).send(player)
} }
/** /**
@ -169,4 +233,11 @@ class SlayerManager(val player: Player) {
get() = flags.removed get() = flags.removed
val isCanEarnPoints: Boolean val isCanEarnPoints: Boolean
get() = flags.canEarnPoints() get() = flags.canEarnPoints()
companion object {
@JvmStatic fun getInstance(player: Player) : SlayerManager
{
return getAttribute(player, "slayer-manager", SlayerManager())
}
}
} }

View file

@ -31,20 +31,20 @@ object SlayerUtils {
fun canBeAssigned(player: Player, task: Tasks): Boolean fun canBeAssigned(player: Player, task: Tasks): Boolean
{ {
return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !player.slayer.flags.removed.contains(task) return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !SlayerManager.getInstance(player).flags.removed.contains(task)
} }
fun assign(player: Player, task: Tasks, master: Master) fun assign(player: Player, task: Tasks, master: Master)
{ {
player.slayer.master = master SlayerManager.getInstance(player).master = master
player.slayer.task = task SlayerManager.getInstance(player).task = task
player.slayer.amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1]) SlayerManager.getInstance(player).amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1])
if (master == Master.DURADEL) { if (master == Master.DURADEL) {
player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 2, 8) player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 2, 8)
} else if (master == Master.VANNAKA) { } else if (master == Master.VANNAKA) {
player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 1, 14) player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 1, 14)
} }
player.varpManager.get(2502).setVarbit(0, player.slayer.flags.taskFlags shr 4).send(player) player.varpManager.get(2502).setVarbit(0, SlayerManager.getInstance(player).flags.taskFlags shr 4).send(player)
} }
@JvmStatic @JvmStatic

View file

@ -28,6 +28,7 @@ import rs09.game.ai.pvp.PVPAIPBuilderUtils
import rs09.game.ai.resource.ResourceAIPActions import rs09.game.ai.resource.ResourceAIPActions
import rs09.game.ai.skillingbot.SkillingBotsBuilder import rs09.game.ai.skillingbot.SkillingBotsBuilder
import rs09.game.ai.wilderness.PvPBotsBuilder import rs09.game.ai.wilderness.PvPBotsBuilder
import rs09.game.node.entity.skill.slayer.SlayerManager
import java.util.* import java.util.*
/** /**
@ -195,7 +196,7 @@ class AIPCommandPlugin : CommandPlugin() {
return true return true
} }
"slayerpoints" -> { "slayerpoints" -> {
player.slayer.slayerPoints = 50000 SlayerManager.getInstance(player).slayerPoints = 50000
return true return true
} }
"dragonbot" -> { "dragonbot" -> {
@ -265,11 +266,11 @@ class AIPCommandPlugin : CommandPlugin() {
} }
"ranger" -> { "ranger" -> {
} }
"removetask" -> return if (!player.slayer.hasTask()) { "removetask" -> return if (!SlayerManager.getInstance(player).hasTask()) {
player.sendMessage("You don't have an active task right now.") player.sendMessage("You don't have an active task right now.")
true true
} else { } else {
player.slayer.clear() SlayerManager.getInstance(player).clear()
player.sendMessage("You have canceled your current task.") player.sendMessage("You have canceled your current task.")
true true
} }

View file

@ -22,6 +22,7 @@ import kotlinx.coroutines.launch
import org.rs09.consts.Components import org.rs09.consts.Components
import rs09.ServerConstants import rs09.ServerConstants
import rs09.game.content.activity.fishingtrawler.TrawlerLoot import rs09.game.content.activity.fishingtrawler.TrawlerLoot
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.ame.RandomEvents import rs09.game.content.ame.RandomEvents
import rs09.game.ge.GrandExchange import rs09.game.ge.GrandExchange
import rs09.game.node.entity.state.newsys.states.FarmingState import rs09.game.node.entity.state.newsys.states.FarmingState
@ -461,13 +462,13 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){
} }
define("testlady", Privilege.ADMIN){ player, _ -> define("testlady", Privilege.ADMIN){ player, _ ->
player.antiMacroHandler.event = RandomEvents.RIVER_TROLL.npc.create(player) RandomEventManager.getInstance(player)!!.event = RandomEvents.RIVER_TROLL.npc.create(player)
player.antiMacroHandler.event!!.init() RandomEventManager.getInstance(player)!!.event!!.init()
} }
define("revent", Privilege.ADMIN){ player, _ -> define("revent", Privilege.ADMIN){ player, _ ->
println(player.pulseManager.current) println(player.pulseManager.current)
player.antiMacroHandler.fireEvent() RandomEventManager.getInstance(player)!!.fireEvent()
} }
define("addcredits", Privilege.ADMIN){ player, _ -> define("addcredits", Privilege.ADMIN){ player, _ ->

View file

@ -2,6 +2,7 @@ package rs09.game.system.command.sets
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import core.plugin.Initializable import core.plugin.Initializable
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.system.command.Command import rs09.game.system.command.Command
import rs09.game.system.command.Privilege import rs09.game.system.command.Privilege
@ -13,8 +14,8 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){
*/ */
define("finishtask"){player,_ -> define("finishtask"){player,_ ->
notify(player, "Kill the npc that spawned to finish your task.") notify(player, "Kill the npc that spawned to finish your task.")
player.slayer.amount = 1 SlayerManager.getInstance(player).amount = 1
val finisher = NPC(player.slayer.task?.npcs?.get(0) ?: 0, player.location) val finisher = NPC(SlayerManager.getInstance(player).task?.npcs?.get(0) ?: 0, player.location)
finisher.isRespawn = false finisher.isRespawn = false
finisher.init() finisher.init()
} }
@ -32,7 +33,7 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){
reject(player,"Amount needs to be a valid integer!") reject(player,"Amount needs to be a valid integer!")
} }
player.slayer.slayerPoints = amount!! SlayerManager.getInstance(player).slayerPoints = amount!!
notify(player, "Set slayer points to $amount.") notify(player, "Set slayer points to $amount.")
} }
} }

View file

@ -15,8 +15,11 @@ import io.github.classgraph.ClassInfo
import rs09.game.ai.general.scriptrepository.PlayerScripts import rs09.game.ai.general.scriptrepository.PlayerScripts
import rs09.game.interaction.InteractionListener import rs09.game.interaction.InteractionListener
import rs09.game.interaction.InterfaceListener import rs09.game.interaction.InterfaceListener
import rs09.game.node.entity.player.info.login.PlayerSaveParser
import rs09.game.node.entity.player.info.login.PlayerSaver
import rs09.game.node.entity.skill.magic.SpellListener import rs09.game.node.entity.skill.magic.SpellListener
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.system.command.Command
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
import java.util.* import java.util.*
import java.util.function.Consumer import java.util.function.Consumer
@ -106,6 +109,15 @@ object ClassScanner {
val clazz = it.loadClass().newInstance() as TickListener val clazz = it.loadClass().newInstance() as TickListener
GameWorld.tickListeners.add(clazz) GameWorld.tickListeners.add(clazz)
} }
result.getClassesImplementing("api.PersistPlayer").filter { !it.isAbstract }.forEach {
val clazz = it.loadClass().newInstance() as PersistPlayer
PlayerSaver.contentHooks.add(clazz)
PlayerSaveParser.contentHooks.add(clazz)
}
result.getClassesImplementing("api.PersistWorld").filter { !it.isAbstract }.forEach {
val clazz = it.loadClass().newInstance() as PersistPlayer
PlayerSaver.contentHooks.add(clazz)
}
} }
/** /**