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.plugin.Initializable;
import core.tools.RandomFunction;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.game.world.GameWorld;
import rs09.game.world.repository.Repository;
@ -160,12 +161,11 @@ public final class TzhaarFightCavesPlugin extends ActivityPlugin {
}
}
player.getPacketDispatch().sendMessage("You were victorious!");
if (!practice) {
BossKillCounter.addtoKillcount(player, 2745);
if (player.getSlayer().getTask() == Tasks.JAD) {
if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) {
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.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;
import core.game.content.quest.miniquest.barcrawl.BarcrawlManager;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item;
@ -21,7 +22,7 @@ public class Potion extends Drink {
if (nextItemId != -1) {
player.getInventory().replace(new Item(nextItemId), item.getSlot());
} else {
if (player.getBarcrawlManager().isFinished()) {
if (BarcrawlManager.getInstance(player).isFinished()) {
player.getInventory().remove(item);
} else {
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.plugin.Initializable;
import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Represents the plugin used to handle the enchanted gem related to slayer.
@ -26,7 +27,7 @@ public final class ActivateEnchantedGem extends OptionHandler {
@Override
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...");
return true;
}

View file

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

View file

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

View file

@ -1,9 +1,12 @@
package core.game.content.quest.miniquest.barcrawl;
import api.LoginListener;
import api.PersistPlayer;
import core.game.component.Component;
import core.game.node.entity.player.Player;
import core.game.node.item.Item;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@ -13,7 +16,7 @@ import java.nio.ByteBuffer;
* Manages the players barcrawl quest.
* @author 'Vexia
*/
public final class BarcrawlManager {
public final class BarcrawlManager implements LoginListener, PersistPlayer {
/**
* The barcrawl card.
@ -53,12 +56,36 @@ public final class BarcrawlManager {
this.player = player;
}
public void parse(JSONObject data){
started = (boolean) data.get("started");
JSONArray barsVisisted = (JSONArray) data.get("bars");
for(int i = 0; i < barsVisisted.size(); i++){
bars[i] = (boolean) barsVisisted.get(i);
public BarcrawlManager() {this.player = null;}
@Override
public void login(@NotNull Player player) {
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() {
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;
}
}
if (player.getTreasureTrailManager().isCompleted() || GameWorld.getSettings().isDevMode()) {
if (TreasureTrailManager.getInstance(player).isCompleted() || GameWorld.getSettings().isDevMode()) {
final List<Item> rewards = getLoot(player);
player.getInterfaceManager().open(new Component(364).setCloseEvent(new CloseEvent() {
private boolean given;
@ -515,10 +515,10 @@ public enum ClueLevel {
if (casket != null) {
player.getInventory().remove(casket);
}
player.getTreasureTrailManager().incrementClues(this);
player.getTreasureTrailManager().clearTrail();
TreasureTrailManager.getInstance(player).incrementClues(this);
TreasureTrailManager.getInstance(player).clearTrail();
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;
for (Item item : rewards) {
value += item.getValue();
@ -538,7 +538,7 @@ public enum ClueLevel {
} else {
player.getInventory().add(clue);
}
player.getTreasureTrailManager().setClueId(clue.getId());
TreasureTrailManager.getInstance(player).setClueId(clue.getId());
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.
*/
public void nextStage(Player player, Item clue) {
if (!player.getTreasureTrailManager().hasTrail() || player.getTreasureTrailManager().hasTrail() && clue.getId() != player.getTreasureTrailManager().getClueId()) {
player.getTreasureTrailManager().startTrail(this);
if (!TreasureTrailManager.getInstance(player).hasTrail() || TreasureTrailManager.getInstance(player).hasTrail() && clue.getId() != TreasureTrailManager.getInstance(player).getClueId()) {
TreasureTrailManager.getInstance(player).startTrail(this);
}
int currentStage = player.getTreasureTrailManager().getTrailStage();
if (currentStage >= player.getTreasureTrailManager().getTrailLength()) {
player.getTreasureTrailManager().clearTrail();
int currentStage = TreasureTrailManager.getInstance(player).getTrailStage();
if (currentStage >= TreasureTrailManager.getInstance(player).getTrailLength()) {
TreasureTrailManager.getInstance(player).clearTrail();
} else {
player.getTreasureTrailManager().incrementStage();
TreasureTrailManager.getInstance(player).incrementStage();
}
}

View file

@ -1,8 +1,11 @@
package core.game.content.ttrail;
import api.LoginListener;
import api.PersistPlayer;
import core.game.node.entity.player.Player;
import core.tools.RandomFunction;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@ -12,7 +15,7 @@ import java.nio.ByteBuffer;
* Handles the treasure trail of a player.
* @author Vexia
*/
public final class TreasureTrailManager {
public final class TreasureTrailManager implements LoginListener, PersistPlayer {
/**
* The ids of the clues.
@ -58,6 +61,53 @@ public final class TreasureTrailManager {
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){
JSONArray cc = (JSONArray) data.get("completedClues");
for(int i = 0; i < cc.size(); i++){
@ -239,4 +289,8 @@ public final class TreasureTrailManager {
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.
*/
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;
}
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);
}
return true;

View file

@ -15,6 +15,7 @@ import core.plugin.Plugin;
import core.plugin.Initializable;
import core.tools.StringUtils;
import kotlin.Unit;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Represents the interface plugin used for jewellery crafting.
@ -186,7 +187,7 @@ public final class JewelleryInterface extends ComponentPlugin {
});
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.");
return true;
}

View file

@ -10,6 +10,7 @@ import core.game.node.entity.player.Player;
import core.game.node.item.Item;
import core.plugin.Initializable;
import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Represents the plugin used to handle enchanted jewellery transportation.
@ -27,7 +28,7 @@ public final class EnchantedGemPlugin extends OptionHandler {
@Override
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;
}

View file

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

View file

@ -1,11 +1,15 @@
package core.game.interaction.item.brawling_gloves;
import api.LoginListener;
import api.PersistPlayer;
import core.cache.def.impl.ItemDefinition;
import core.game.node.entity.player.Player;
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.Objects;
@ -13,10 +17,46 @@ import java.util.Objects;
* Manages brawling gloves for a player
* @author ceik
*/
public class BrawlingGlovesManager {
public class BrawlingGlovesManager implements LoginListener, PersistPlayer {
final Player player;
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) {
try {
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 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) - charges <= 0) {
GloveCharges.remove(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>");
return false;
return;
}
int currentCharges = GloveCharges.get(glove);
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>");
}
}
return true;
}
public double getExperienceBonus(){
@ -56,4 +94,9 @@ public class BrawlingGlovesManager {
}
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);
return true;
case "collect":
player.getExchangeRecords().openCollectionBox();
GrandExchangeRecords.getInstance(player).openCollectionBox();
return true;
case "deposit":
openDepositBox(player);
@ -169,8 +169,9 @@ public final class BankingPlugin extends OptionHandler {
setId((int) args[0]);
}
interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?");
for (GrandExchangeRecords.OfferRecord r : player.getExchangeRecords().getOfferRecords()) {
GrandExchangeOffer o = player.getExchangeRecords().getOffer(r);
GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
for (GrandExchangeRecords.OfferRecord r : records.getOfferRecords()) {
GrandExchangeOffer o = records.getOffer(r);
if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) {
stage = -1;
break;
@ -663,7 +664,7 @@ public final class BankingPlugin extends OptionHandler {
player.getBank().open();
checkAchievements(player);
} else {
player.getExchangeRecords().openCollectionBox();
GrandExchangeRecords.getInstance(player).openCollectionBox();
}
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.world.map.Location;
import core.plugin.Plugin;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.ExchangeItemSets;
import rs09.game.interaction.inter.ge.StockMarket;
@ -46,6 +47,7 @@ public final class GrandExchangePlugin extends OptionHandler {
@Override
public boolean handle(Player player, Node node, String option) {
GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
if (player.getIronmanManager().checkRestriction() && !option.equals("sets")) {
return true;
}
@ -61,14 +63,14 @@ public final class GrandExchangePlugin extends OptionHandler {
StockMarket.openFor(player);
break;
case "history":
player.getExchangeRecords().openHistoryLog(player);
records.openHistoryLog(player);
break;
case "collect":
if (!GrandExchangeDatabase.hasInitialized()) {
player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed...");
break;
}
player.getExchangeRecords().openCollectionBox();
records.openCollectionBox();
break;
case "info-logs":
GEGuidePrice.open(player, GuideType.LOGS);
@ -139,7 +141,7 @@ public final class GrandExchangePlugin extends OptionHandler {
player.getBank().open();
break;
case "collect":
player.getExchangeRecords().openCollectionBox();
GrandExchangeRecords.getInstance(player).openCollectionBox();
break;
}
return true;

View file

@ -8,10 +8,8 @@ import core.game.container.impl.EquipmentContainer;
import core.game.container.impl.InventoryListener;
import core.game.content.activity.pyramidplunder.PlunderObjectManager;
import core.game.content.dialogue.DialogueInterpreter;
import core.game.content.quest.miniquest.barcrawl.BarcrawlManager;
import core.game.content.ttrail.TreasureTrailManager;
import core.game.interaction.Interaction;
import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager;
import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState;
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.UIDInfo;
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.appearance.Appearance;
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.skill.Skills;
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.item.GroundItem;
import core.game.node.item.GroundItemManager;
@ -69,14 +66,15 @@ import core.tools.RandomFunction;
import core.tools.StringUtils;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import org.json.simple.JSONObject;
import org.rs09.consts.Items;
import rs09.GlobalStats;
import rs09.ServerConstants;
import rs09.game.VarpManager;
import rs09.game.content.ame.RandomEventManager;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.node.entity.combat.CombatSwingHandler;
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.skill.runecrafting.PouchManager;
import rs09.game.node.entity.state.newsys.State;
@ -219,11 +217,6 @@ public class Player extends Entity {
*/
private final HintIconManager hintIconManager = new HintIconManager();
/**
* The slayer manager.
*/
private final SlayerManager slayer = new SlayerManager(this);
/**
* The quest repository.
*/
@ -244,11 +237,6 @@ public class Player extends Entity {
*/
private final GraveManager graveManager = new GraveManager(this);
/**
* The new grand exchange interface manager.
*/
public final GrandExchangeRecords exchangeRecords = new GrandExchangeRecords(this);
/**
* The familiar manager.
*/
@ -298,26 +286,6 @@ public class Player extends Entity {
*/
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.
*/
@ -338,12 +306,6 @@ public class Player extends Entity {
*/
private final IronmanManager ironmanManager = new IronmanManager(this);
/**
* Brawling Gloves manager
*/
private final BrawlingGlovesManager brawlingGlovesManager = new BrawlingGlovesManager(this);
/**
* 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.
*/
public void clear(boolean force) {
/*if (!force && allowRemoval()) {
Repository.getDisconnectionQueue().add(this, true);
return;
}*/
if (force) {
Repository.getDisconnectionQueue().remove(getName());
}
GameWorld.getLogoutListeners().forEach((it) -> it.logout(this));
setPlaying(false);
getWalkingQueue().reset();
GameWorld.getLogoutListeners().forEach((it) -> it.logout(this));
if(!logoutListeners.isEmpty()){
logoutListeners.forEach((key,method) -> method.invoke(this));
}
@ -432,7 +390,6 @@ public class Player extends Entity {
super.clear();
getZoneMonitor().clear();
CommunicationInfo.notifyPlayers(this, false, false);
hunterManager.logout();
HouseManager.leave(this);
UpdateSequence.getRenderablePlayers().remove(this);
Repository.getDisconnectionQueue().add(this);
@ -480,8 +437,6 @@ public class Player extends Entity {
@Override
public void tick() {
super.tick();
antiMacroHandler.tick();
hunterManager.pulse();
musicPlayer.tick();
if(getAttribute("fire:immune",0) > 0){
int time = getAttribute("fire:immune",0) - GameWorld.getTicks();
@ -1142,14 +1097,6 @@ public class Player extends Entity {
return hintIconManager;
}
/**
* Gets the slayer.
* @return The slayer.
*/
public SlayerManager getSlayer() {
return slayer;
}
/**
* Checks if the player is artifical (AIPlayer).
* @return {@code True} if so.
@ -1263,38 +1210,6 @@ public class Player extends Entity {
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.
* @return the graveManager
@ -1405,10 +1320,6 @@ public class Player extends Entity {
this.archeryTotal = archeryTotal;
}
public BrawlingGlovesManager getBrawlingGlovesManager() { return brawlingGlovesManager;}
public GrandExchangeRecords getExchangeRecords() { return exchangeRecords; }
public boolean hasActiveState(String key){
State state = states.get(key);
if(state != null && state.getPulse() != null){

View file

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

View file

@ -1,6 +1,7 @@
package core.game.node.entity.player.info.login;
import core.game.node.entity.player.Player;
import org.json.simple.JSONObject;
import rs09.ServerConstants;
import rs09.game.node.entity.player.info.login.PlayerSaveParser;
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.
* @param player The player.
*/
public static boolean parse(Player player) {
File JSON = new File(ServerConstants.PLAYER_SAVE_PATH + player.getName() + ".json");
public static PlayerSaveParser parse(Player player) {
PlayerSaveParser parser = new PlayerSaveParser(player);
try {
if (JSON.exists()) { //parse the new JSON type.
new PlayerSaveParser(player).parse();
} 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;
parser.parse();
return parser;
} catch (Exception e){
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.impl.PlayerSQLHandler;
import core.net.amsc.WorldCommunicator;
import rs09.game.ge.GrandExchangeRecords;
import java.math.BigInteger;
import java.sql.Connection;
@ -108,7 +109,7 @@ public final class PlayerSQLManager {
table.getColumn("credits").updateValue(player.getDetails().credits);
table.getColumn("bank").updateValue(player.getBank().format());
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("equipment").updateValue(player.getEquipment().format());
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.node.entity.player.Player;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.StockMarket;
import rs09.game.world.GameWorld;
import core.net.packet.PacketRepository;
@ -202,7 +203,7 @@ public class BankPinManager {
player.getBank().open();
}
} else if (buttonId == 3) {
player.getExchangeRecords().openCollectionBox();
GrandExchangeRecords.getInstance(player).openCollectionBox();
} else if (buttonId == 4) {
StockMarket.openFor(player);
}

View file

@ -1,6 +1,7 @@
package core.game.node.entity.skill;
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.combat.ImpactHandler;
import core.game.node.entity.npc.NPC;
@ -218,14 +219,15 @@ public final class Skills {
boolean already200m = this.experience[slot] == 200000000;
double experienceAdd = (experience * mod);
//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());
if(gloves == null && (slot == Skills.STRENGTH || slot == Skills.DEFENCE)){
gloves = new Item (BrawlingGloves.forSkill(Skills.ATTACK).getId());
}
if(gloves != null && player.getEquipment().containsItem(gloves)){
experienceAdd += experienceAdd * player.getBrawlingGlovesManager().getExperienceBonus();
player.getBrawlingGlovesManager().updateCharges(gloves.getId(),1);
experienceAdd += experienceAdd * bgManager.getExperienceBonus();
bgManager.updateCharges(gloves.getId(),1);
}
}
//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.player.Player;
import core.game.node.item.Item;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Represents the arrow head pulse to complete the headless arrow.
@ -43,7 +44,7 @@ public class ArrowHeadPulse extends SkillPulse<Item> {
@Override
public boolean checkRequirements() {
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.");
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.player.Player;
import core.game.node.item.Item;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Represents the bolt pulse class to make bolts.
@ -60,7 +61,7 @@ public final class BoltPulse extends SkillPulse<Item> {
@Override
public boolean checkRequirements() {
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.");
return false;
}

View file

@ -129,7 +129,7 @@ public final class DeadfallSetting extends TrapSetting {
@Override
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;
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.Node;
import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery;
import org.jetbrains.annotations.NotNull;
import rs09.game.Event;
import java.util.ArrayList;
import java.util.Iterator;
@ -13,7 +20,7 @@ import java.util.List;
* Manages the players hunter state.
* @author Vexia
*/
public final class HunterManager {
public final class HunterManager implements LoginListener, LogoutListener, EventHook<TickEvent> {
/**
* The list of active traps.
@ -33,10 +40,32 @@ public final class HunterManager {
this.player = player;
}
/**
* Calles every game pulse.
*/
public void pulse() {
public HunterManager() {
this.player = null;
}
@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) {
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.
* @param trap the trap.
@ -179,4 +194,8 @@ public final class HunterManager {
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 Scenery object = event.getUsedWith() instanceof Scenery ? (Scenery) event.getUsedWith() : (Scenery) event.getUsed();
final Item item = event.getUsedItem();
if (!player.getHunterManager().isOwner(object)) {
if (HunterManager.getInstance(player).isOwner(object)) {
player.sendMessage("This isn't your trap!");
return true;
}
final TrapWrapper wrapper = player.getHunterManager().getWrapper(object);
final TrapWrapper wrapper = HunterManager.getInstance(player).getWrapper(object);
if (item.getId() == 594) {
wrapper.smoke();
} 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.Node;
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.GroundItemManager;
import core.game.node.item.Item;
@ -37,6 +38,8 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
*/
private int ticks;
private final HunterManager instance;
/**
* Constructs a new {@code TrapCreatePulse} {@code Object}.
* @param player the player.
@ -47,15 +50,16 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
super(player, node);
this.trap = trap;
this.startLocation = node instanceof GroundItem ? node.getLocation() : player.getLocation();
this.instance = HunterManager.getInstance(player);
}
@Override
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() + ".");
return false;
}
if (player.getHunterManager().exceedsTrapLimit(trap)) {
if (instance.exceedsTrapLimit(trap)) {
player.sendMessage(trap.getSettings().getLimitMessage(player));
return false;
}
@ -94,7 +98,7 @@ public final class TrapCreatePulse extends SkillPulse<Node> {
SceneryBuilder.remove(node.asScenery());
}
object = SceneryBuilder.add(object);
player.getHunterManager().register(trap, node, object);
instance.register(trap, node, object);
return true;
}

View file

@ -27,6 +27,8 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
*/
private int ticks;
private final HunterManager instance;
/**
* Constructs a new {@code TrapDismantlePulse} {@code Object}.
* @param player the player.
@ -36,11 +38,12 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
super(player, node);
this.trap = wrapper.getType();
this.wrapper = wrapper;
this.instance = HunterManager.getInstance(player);
}
@Override
public boolean checkRequirements() {
if (wrapper == null || !player.getHunterManager().isOwner(node)) {
if (wrapper == null || !instance.isOwner(node)) {
player.sendMessage("This isn't your trap!");
return false;
}
@ -66,7 +69,7 @@ public final class TrapDismantlePulse extends SkillPulse<Scenery> {
return false;
}
if (wrapper.getType().getSettings().clear(wrapper, 1)) {
player.getHunterManager().deregister(wrapper);
instance.deregister(wrapper);
if (wrapper.isCaught()) {
if (wrapper.getType().equals(Traps.BOX_TRAP)) {
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.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.skill.Skills;
import core.game.node.item.Item;
/**
@ -63,7 +64,7 @@ public class TrapNode {
if (wrapper.isCaught() || wrapper.isBusy() || wrapper.isFailed()) {
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.entity.npc.NPC;
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.GroundItemManager;
import core.game.node.item.Item;
@ -232,11 +233,12 @@ public class TrapSetting {
* @param object the 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.");
return;
}
TrapWrapper wrapper = player.getHunterManager().getWrapper(object);
TrapWrapper wrapper = instance.getWrapper(object);
player.sendMessage("This trap " + (wrapper.isSmoked() ? "has" : "hasn't") + " been smoked.");
}
@ -322,7 +324,7 @@ public class TrapSetting {
* @return {@code True} if so.
*/
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 successChance = Math.ceil((level * 50 - req * 17) / req / 3 * 4);
int roll = RandomFunction.random(99);
@ -474,7 +476,8 @@ public class TrapSetting {
* @return the message.
*/
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;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap;
import core.game.node.entity.player.Player;
import core.game.node.item.Item;
@ -88,6 +89,8 @@ public final class TrapWrapper {
*/
private int ticks;
private HunterManager instance;
/**
* Constructs a new {@code TrapWrapper} {@code Object}.
* @param player the player.
@ -100,7 +103,8 @@ public final class TrapWrapper {
this.object = object;
this.originalId = object.getId();
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);
SceneryBuilder.remove(object);
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.");
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.");
return;
}

View file

@ -94,16 +94,18 @@ public enum Traps {
* @param object the 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!");
return;
}
if (player.getHunterManager().getWrapper(object) == null) {
if (instance.getWrapper(object) == null) {
SystemLogger.logErr("NO WRAPPER (HUNTER DISMANTLE)");
return;
}
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.world.map.Direction;
import core.plugin.Initializable;
import rs09.game.node.entity.skill.slayer.SlayerManager;
/**
* Rerpresents the enchanted gem dialogue.
@ -46,7 +47,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
public boolean open(Object... args) {
player.faceLocation(player.getLocation().transform(1, 0, 0));
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;
return true;
}
@ -87,13 +88,13 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
end();
break;
case 10:
if (!player.getSlayer().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.");
if (!SlayerManager.getInstance(player).hasTask()) {
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;
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.");
player.varpManager.get(2502).setVarbit(0,player.getSlayer().flags.getTaskFlags() >> 4).send(player);
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,SlayerManager.getInstance(player).flags.getTaskFlags() >> 4).send(player);
stage = 11;
break;
case 11:
@ -103,20 +104,20 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
case 12:
switch (buttonId) {
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;
break;
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;
break;
case 3:
if (!player.getSlayer().hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 99;
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;
break;
case 4:
@ -129,7 +130,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
}
break;
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;
break;
case 21:
@ -143,16 +144,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10;
break;
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;
break;
case 3:
if (!player.getSlayer().hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 99;
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;
break;
case 4:
@ -163,7 +164,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
}
break;
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;
break;
case 31:
@ -177,16 +178,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10;
break;
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;
break;
case 3:
if (!player.getSlayer().hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 0;
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;
break;
case 4:
@ -197,12 +198,12 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
}
break;
case 400:
if (!player.getSlayer().hasTask()) {
interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
if (!SlayerManager.getInstance(player).hasTask()) {
interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt.");
stage = 0;
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;
break;
case 401:
@ -220,11 +221,11 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
stage = 10;
break;
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;
break;
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;
break;
case 4:
@ -243,17 +244,17 @@ public final class EnchantedGemDialogue extends DialoguePlugin {
* @return the location.
*/
public String masterLocation() {
if (player.getSlayer().getMaster().getNpc() == Master.MAZCHNA.getNpc())
if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.MAZCHNA.getNpc())
return "Canifis";
else if (player.getSlayer().getMaster().getNpc() == Master.TURAEL.getNpc())
else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.TURAEL.getNpc())
return "Taverley";
else if (player.getSlayer().getMaster().getNpc() == Master.CHAELDAR.getNpc())
else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.CHAELDAR.getNpc())
return "Zanaris";
else if (player.getSlayer().getMaster().getNpc() == Master.VANNAKA.getNpc())
else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.VANNAKA.getNpc())
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";
else if(player.getSlayer().getMaster() == null) {
else if(SlayerManager.getInstance(player).getMaster() == null) {
return "the Gnome Stronghold";
}
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.player.Player;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import java.util.ArrayList;
import java.util.Arrays;
@ -247,7 +248,7 @@ public enum Master {
}
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{

View file

@ -2,6 +2,7 @@ package core.game.node.entity.skill.slayer;
import org.json.simple.JSONObject;
import rs09.ServerStore;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.game.world.GameWorld;
import core.game.content.dialogue.DialoguePlugin;
import core.game.content.dialogue.FacialExpression;
@ -224,7 +225,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
end();
break;
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.");
stage = 1;
} else {
@ -244,7 +245,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
break;
}
}
if (!player.getSlayer().hasStarted()) {
if (!SlayerManager.getInstance(player).hasStarted()) {
options("Who are you?", "Do you have anything for trade?", "Er...nothing...");
stage = 1;
} else {
@ -359,8 +360,8 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
case 504:
if (player.getInventory().freeSlots() != 0) {
player.getInventory().add(GEM);
player.getSlayer().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.");
SlayerManager.getInstance(player).generate(master);
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;
} else if (player.getInventory().freeSlots() == 0) {
player("Sorry, I don't have enough inventory space.");
@ -491,12 +492,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
stage = 99;
break;
}
if (!player.getSlayer().hasTask()) {
player.getSlayer().generate(master);
if (player.getSlayer().getTask() == Tasks.JAD) {
if (!SlayerManager.getInstance(player).hasTask()) {
SlayerManager.getInstance(player).generate(master);
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.");
} 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;
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...");
stage = 847;
} else {
player.getSlayer().flags.setTaskStreak(0);
player.getSlayer().generate(master);
if (player.getSlayer().getTask() == Tasks.JAD) {
SlayerManager.getInstance(player).flags.setTaskStreak(0);
SlayerManager.getInstance(player).generate(master);
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.");
} 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;
}
@ -526,7 +527,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
case 845:
switch (buttonId) {
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;
break;
case 2:
@ -538,7 +539,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
if(rerolls == 10){
stage++;
} else {
player.getSlayer().clear();
SlayerManager.getInstance(player).clear();
getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1);
stage = 701;
}
@ -566,7 +567,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin {
switch(buttonId){
case 1:
playerl(FacialExpression.FRIENDLY, "Yes, please.");
player.getSlayer().clear();
SlayerManager.getInstance(player).clear();
getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1);
stage = 701;
break;

View file

@ -14,6 +14,7 @@ import core.game.node.entity.player.Player;
import core.game.node.item.Item;
import core.plugin.Initializable;
import core.plugin.Plugin;
import rs09.game.node.entity.skill.slayer.SlayerManager;
import rs09.plugin.ClassScanner;
/**
@ -60,27 +61,27 @@ public class SlayerRewardPlugin extends ComponentPlugin {
switch (button) {
case 23://reassign
case 26:
if (!player.getSlayer().hasTask()) {
if (!SlayerManager.getInstance(player).hasTask()) {
player.sendMessage("You don't have an active task right now.");
break;
}
if (purchase(player, 30)) {
player.getSlayer().clear();
SlayerManager.getInstance(player).clear();
player.sendMessage("You have canceled your current task.");
}
break;
case 24:
case 27:
if (player.getSlayer().getTask() == null) {
if (SlayerManager.getInstance(player).getTask() == null) {
player.sendMessage("You don't have a slayer task.");
break;
}
if (player.getSlayer().getRemoved().size() >= 4) {
if (SlayerManager.getInstance(player).getRemoved().size() >= 4) {
player.sendMessage("You can't remove anymore tasks.");
break;
}
if (player.getSlayer().getSlayerPoints() >= 30 && !player.isAdmin()) {
int size = player.getSlayer().getRemoved().size();
if (SlayerManager.getInstance(player).getSlayerPoints() >= 30 && !player.isAdmin()) {
int size = SlayerManager.getInstance(player).getRemoved().size();
int qp = player.getQuestRepository().getAvailablePoints();
if (size == 0 && qp < 50) {
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)) {
player.getSlayer().getRemoved().add(player.getSlayer().getTask());
player.getSlayer().clear();
SlayerManager.getInstance(player).getRemoved().add(SlayerManager.getInstance(player).getTask());
SlayerManager.getInstance(player).clear();
updateInterface(player, player.getInterfaceManager().getOpened());
}
break;
@ -107,10 +108,10 @@ public class SlayerRewardPlugin extends ComponentPlugin {
case 38:
case 39:
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;
}
player.getSlayer().getRemoved().remove(index);
SlayerManager.getInstance(player).getRemoved().remove(index);
updateInterface(player, player.getInterfaceManager().getOpened());
break;
case 15:
@ -131,34 +132,34 @@ public class SlayerRewardPlugin extends ComponentPlugin {
break;
case 22://Broad arrows
case 29:
if (player.getSlayer().flags.isBroadsUnlocked()) {
if (SlayerManager.getInstance(player).flags.isBroadsUnlocked()) {
player.sendMessage("You don't need to learn this ability again.");
break;
}
if (purchase(player, 300)) {
player.getSlayer().flags.unlockBroads();
SlayerManager.getInstance(player).flags.unlockBroads();
updateInterface(player, component);
}
break;
case 23://Slayer ring
case 30:
if (player.getSlayer().flags.isRingUnlocked()) {
if (SlayerManager.getInstance(player).flags.isRingUnlocked()) {
player.sendMessage("You don't need to learn this ability again.");
break;
}
if (purchase(player, 300)) {
player.getSlayer().flags.unlockRing();
SlayerManager.getInstance(player).flags.unlockRing();
updateInterface(player, component);
}
break;
case 24://Slayer helm
case 31:
if (player.getSlayer().flags.isHelmUnlocked()) {
if (SlayerManager.getInstance(player).flags.isHelmUnlocked()) {
player.sendMessage("You don't need to learn this ability again.");
break;
}
if (purchase(player, 400)) {
player.getSlayer().flags.unlockHelm();
SlayerManager.getInstance(player).flags.unlockHelm();
updateInterface(player, component);
}
break;
@ -180,7 +181,7 @@ public class SlayerRewardPlugin extends ComponentPlugin {
break;
case 26://ring of slaying
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.");
break;
}
@ -220,11 +221,11 @@ public class SlayerRewardPlugin extends ComponentPlugin {
* @return {@code True} if purchased.
*/
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.");
return false;
}
player.getSlayer().setSlayerPoints(player.getSlayer().getSlayerPoints() - amount);
SlayerManager.getInstance(player).setSlayerPoints(SlayerManager.getInstance(player).getSlayerPoints() - amount);
updateInterface(player, player.getInterfaceManager().getOpened());
return true;
}
@ -249,7 +250,7 @@ public class SlayerRewardPlugin extends ComponentPlugin {
return;
}
String space = "";
String num = String.valueOf(player.getSlayer().getSlayerPoints());
String num = String.valueOf(SlayerManager.getInstance(player).getSlayerPoints());
if (num != "0") {
for (int i = 0; i < num.length(); i++) {
space += " ";
@ -261,31 +262,31 @@ public class SlayerRewardPlugin extends ComponentPlugin {
String[] letters = new String[] {"A", "B", "C", "D"};
Tasks task = null;
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(space + player.getSlayer().getSlayerPoints(), open.getId(), 19);
player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 19);
break;
case 163://learn
for (int i = 0; i < 3; i++) {
switch(i){
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;
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;
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;
default:
break;
}
}
player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 18);
player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 18);
break;
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;
}
}
@ -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.");
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.");
return true;
}

View file

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

View file

@ -18,6 +18,7 @@ import org.rs09.consts.Components
import rs09.ServerConstants
import rs09.game.Event
import rs09.game.camerautils.PlayerCamera
import rs09.game.content.ame.RandomEventManager
import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld
@ -231,7 +232,7 @@ abstract class Cutscene(val player: Player) {
player.lock()
player.hook(Event.SelfDeath, CUTSCENE_DEATH_HOOK)
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()
player.unhook(CUTSCENE_DEATH_HOOK)
player.logoutListeners.remove("cutscene")
player.antiMacroHandler.enabled = true
RandomEventManager.getInstance(player)!!.enabled = false
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 UsedWithEvent(val used: Int, val with: Int) : 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.*
object Event {
val ResourceProduced = ResourceProducedEvent::class.java
val NPCKilled = NPCKillEvent::class.java
val Teleport = TeleportEvent::class.java
val FireLit = LitFireEvent::class.java
val Interaction = InteractionEvent::class.java
val ButtonClicked = ButtonClickedEvent::class.java
val UsedWith = UsedWithEvent::class.java
val SelfDeath = SelfDeath::class.java
@JvmStatic val ResourceProduced = ResourceProducedEvent::class.java
@JvmStatic val NPCKilled = NPCKillEvent::class.java
@JvmStatic val Teleport = TeleportEvent::class.java
@JvmStatic val FireLit = LitFireEvent::class.java
@JvmStatic val Interaction = InteractionEvent::class.java
@JvmStatic val ButtonClicked = ButtonClickedEvent::class.java
@JvmStatic val UsedWith = UsedWithEvent::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
import api.LoginListener
import api.events.EventHook
import api.events.TickEvent
import api.getAttribute
import api.setAttribute
import core.game.node.entity.Entity
import core.game.node.entity.player.Player
import core.game.world.map.zone.ZoneRestriction
import core.tools.RandomFunction
import rs09.game.Event
import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld
import kotlin.random.Random
@ -11,15 +17,23 @@ import kotlin.random.Random
private const val AVG_DELAY_TICKS = 6000 // 60 minutes
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)
class RandomEventManager(val player: Player) {
class RandomEventManager(val player: Player? = null) : LoginListener, EventHook<TickEvent> {
var event: RandomEventNPC? = null
var enabled: Boolean = false
var nextSpawn = 0
val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin")
fun tick() {
override fun login(player: Player) {
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() {
@ -27,29 +41,21 @@ class RandomEventManager(val player: Player) {
rollNextSpawn()
return
}
if (player.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) {
if (player!!.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) {
nextSpawn = GameWorld.ticks + 3000
return
}
val currentAction = player.pulseManager.current.toString()
var ame = RandomEvents.values().random()
if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
ame = RandomEvents.TREE_SPIRIT
}
else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){
ame = RandomEvents.RIVER_TROLL
}
else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){
ame = RandomEvents.ROCK_GOLEM
}
else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){
ame = RandomEvents.SHADE
}
else {
ame = RandomEvents.values().random()
while(ame.type == "skill"){
ame = RandomEvents.values().random()
}
val ame: RandomEvents = if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
RandomEvents.TREE_SPIRIT
} else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){
RandomEvents.RIVER_TROLL
} else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){
RandomEvents.ROCK_GOLEM
} else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){
RandomEvents.SHADE
} else {
RandomEvents.values().filter { it.type != "skill" }.random()
}
event = ame.npc.create(player,ame.loot,ame.type)
if (event!!.spawnLocation == null) {
@ -61,14 +67,14 @@ class RandomEventManager(val player: Player) {
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() {
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() {
finalized = true
pulseManager.clear("amemovement")
player.antiMacroHandler.event = null
RandomEventManager.getInstance(player)!!.event = null
if (initialized) {
poofClear(this)
}

View file

@ -1,6 +1,7 @@
package rs09.game.content.ame.events
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.dialogue.DialogueFile
@ -22,11 +23,11 @@ class MysteriousOldManDialogue(val type: String) : DialogueFile() {
1 -> {
end()
teleport(player!!,type)
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)?.event?.terminate()
}
2 -> {
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 core.game.component.Component
import core.game.node.entity.player.link.emote.Emotes
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE
@ -29,13 +30,13 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() {
npc("Sorry, I don't think so.").also {
player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)?.event?.terminate()
}
} else {
npc("Thank you, I hope you like your present. I must be", "leaving now though.").also {
player!!.setAttribute("certer:reward", true)
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
npc!!.animate(Emotes.WAVE.animation)
// Terminate the event
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)?.event?.terminate()
} else {
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.item.Item
import org.rs09.consts.Items
import rs09.game.content.ame.RandomEventManager
import rs09.game.interaction.InterfaceListener
class CerterEventInterface : InterfaceListener() {
@ -36,7 +37,7 @@ class CerterEventInterface : InterfaceListener() {
val correctAnswer = player.getAttribute("certer:correctIndex", 0)
player.setAttribute("certer:correct", correctAnswer == answer)
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
}

View file

@ -2,6 +2,7 @@ package rs09.game.content.ame.events.drilldemon
import core.game.content.dialogue.FacialExpression
import core.game.system.task.Pulse
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE
import rs09.tools.START_DIALOGUE
@ -9,7 +10,7 @@ import rs09.tools.START_DIALOGUE
class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() {
override fun handle(componentID: Int, buttonID: Int) {
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){
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 -> {
@ -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){
START_DIALOGUE -> if(isCorrect) npc(FacialExpression.OLD_NORMAL,"Good! Now...").also { stage++ } else npc(FacialExpression.OLD_ANGRY1,"WRONG, MAGGOT!").also { stage++ }
1 -> {
@ -40,12 +41,12 @@ class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() {
1 -> {
end()
DrillDemonUtils.teleport(player!!)
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE
}
2 -> {
end()
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)!!.event?.terminate()
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.item.GroundItemManager
import core.game.node.item.Item
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE
@ -15,7 +16,7 @@ class GenieDialogue : DialogueFile() {
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.")
addItemOrDrop(player!!, assigned)
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)!!.event?.terminate()
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.item.GroundItemManager
import core.game.node.item.Item
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE
@ -26,13 +27,13 @@ class SandwichLadyDialogue(val isChoice: Boolean) : DialogueFile() {
0 -> if(choice != assigned){
npc!!.sendChat("That's not what I said you could have!")
player!!.impactHandler.manualHit(npc,3,ImpactHandler.HitsplatType.NORMAL)
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)!!.event?.terminate()
} else {
npc("Here you are, dear. I hope you enjoy it!")
if(!player!!.inventory.add(Item(assigned))){
GroundItemManager.create(Item(assigned),player)
}
player!!.antiMacroHandler.event?.terminate()
RandomEventManager.getInstance(player!!)!!.event?.terminate()
stage = END_DIALOGUE
}
}

View file

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

View file

@ -7,6 +7,7 @@ import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import rs09.game.ge.GrandExchangeRecords
/**
* @author qmqz
@ -37,7 +38,7 @@ class SirsalBankerDialogue(player: Player? = null) : DialoguePlugin(player){
1 -> when (buttonId) {
1 -> end().also { player.bank.open() }
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 }
}

View file

@ -1,6 +1,7 @@
package rs09.game.content.global.action
import core.game.container.impl.EquipmentContainer
import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager
import core.game.node.Node
import core.game.node.entity.combat.equipment.WeaponInterface
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
if (item.id in 13845..13857) {
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)
&& ZoneBorders(2969, 3310, 2975, 3314, 0).insideBorder(player)

View file

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

View file

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

View file

@ -41,15 +41,59 @@ import java.util.*
* @author Angle
*/
class GrandExchangeRecords(private val player: Player) {
class GrandExchangeRecords(private val player: Player? = null) : PersistPlayer, LoginListener {
var history = arrayOfNulls<GrandExchangeOffer>(5)
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.
*/
fun openCollectionBox() {
if (!player.bankPinManager.isUnlocked) {
if (!player!!.bankPinManager.isUnlocked) {
player.bankPinManager.openType(3)
return
}
@ -143,7 +187,7 @@ class GrandExchangeRecords(private val player: Player) {
*/
val conn = GEDB.connect()
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>()
@ -175,23 +219,6 @@ class GrandExchangeRecords(private val player: Player) {
}
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) {
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)
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.net.amsc.MSPacketRepository
import core.net.amsc.WorldCommunicator
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.world.GameWorld.Pulser
import rs09.net.packet.`in`.QCPacketType
import java.nio.ByteBuffer
@ -114,8 +115,8 @@ object QCRepository {
//My current slayer assignment is
else if(qcString.contains("My current Slayer assignment is")){
val amount = player?.slayer?.amount
val taskName = NPCDefinition.forId(player?.slayer?.task?.ids?.get(0) ?: 0).name.toLowerCase()
val amount = SlayerManager.getInstance(player!!).amount
val taskName = NPCDefinition.forId(SlayerManager.getInstance(player!!).task?.ids?.get(0) ?: 0).name.toLowerCase()
if(amount ?: 0 > 0){
qcString = qcString.replace("complete", "$amount $taskName")
}

View file

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

View file

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

View file

@ -19,6 +19,7 @@ import core.game.world.map.path.Pathfinder
import core.tools.RandomFunction
import rs09.game.node.entity.combat.CombatSwingHandler
import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks
import rs09.game.node.entity.skill.slayer.SlayerManager
import kotlin.math.ceil
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 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
else if (entity is Player //Salve amulet
@ -179,7 +180,7 @@ open class MeleeSwingHandler
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
/*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
import api.LoginListener
import core.game.node.entity.player.Player
import core.game.node.entity.player.info.PlayerDetails
import core.game.node.entity.player.info.login.LoginConfiguration
@ -14,10 +15,12 @@ import core.net.amsc.ManagementServerState
import core.net.amsc.WorldCommunicator
import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld
import rs09.game.world.GameWorld.loginListeners
import rs09.game.world.repository.Repository
import java.util.concurrent.TimeUnit
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
import java.util.function.Consumer
/**
* Parses the login of a player.
@ -105,14 +108,21 @@ class LoginParser(
reconnect(player, type)
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.LOGGED_IN_PLAYERS.remove(player.username)
Repository.lobbyPlayers.remove(player)
Repository.playerNames.remove(player.name)
MSPacketRepository.sendPlayerRemoval(player.name)
flag(Response.ERROR_LOADING_PROFILE)
return
}
//Repository.getPlayerNames().put(player.getName(), player);
GameWorld.Pulser.submit(object : Pulse(1) {
@ -141,8 +151,12 @@ class LoginParser(
}
} catch (t: Throwable) {
t.printStackTrace()
Repository.removePlayer(player)
Repository.LOGGED_IN_PLAYERS.remove(player.username)
Repository.lobbyPlayers.remove(player)
Repository.playerNames.remove(player.name)
MSPacketRepository.sendPlayerRemoval(player.name)
flag(Response.ERROR_LOADING_PROFILE)
}
return true
}

View file

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

View file

@ -1,5 +1,6 @@
package rs09.game.node.entity.player.info.login
import api.PersistPlayer
import core.game.container.Container
import core.game.interaction.item.brawling_gloves.BrawlingGloves
import core.game.node.entity.player.Player
@ -28,51 +29,36 @@ import javax.script.ScriptEngineManager
* @author Ceikry
*/
class PlayerSaver (val player: Player){
private fun populate(): JSONObject = runBlocking{
companion object {
val contentHooks = ArrayList<PersistPlayer>()
}
private fun populate(): JSONObject {
val saveFile = JSONObject()
val a = launch {
saveCoreData(saveFile)
saveSkills(saveFile)
saveSettings(saveFile)
saveSlayer(saveFile)
saveQuests(saveFile)
saveAppearance(saveFile)
saveSpellbook(saveFile)
saveVarps(saveFile)
}
val b = launch {
saveGraveType(saveFile)
saveGrandExchangeData(saveFile)
saveSavedData(saveFile)
saveAutocast(saveFile)
saveFarming(saveFile)
saveConfigs(saveFile)
savePlayerMonitor(saveFile)
}
val c = launch {
saveMusicPlayer(saveFile)
saveFamiliarManager(saveFile)
saveBarCrawl(saveFile)
saveStateManager(saveFile)
saveAntiMacroHandler(saveFile)
saveTreasureTrails(saveFile)
saveBankPinData(saveFile)
}
val d = launch {
saveHouseData(saveFile)
saveAchievementData(saveFile)
saveIronManData(saveFile)
saveEmoteData(saveFile)
saveStatManager(saveFile)
saveBrawlingGloves(saveFile)
saveAttributes(saveFile)
}
a.join()
b.join()
c.join()
d.join()
savePouches(saveFile)
saveFile
contentHooks.forEach { it.savePlayer(player, saveFile) }
return saveFile
}
fun save() = runBlocking {
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){
val statistics = JSONArray()
var index = 0
@ -277,33 +250,6 @@ class PlayerSaver (val player: Player){
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){
val states = JSONArray()
player.states.forEach{key,clazz ->
@ -317,17 +263,6 @@ class PlayerSaver (val player: Player){
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){
val familiarManager = JSONObject()
val petDetails = JSONArray()
@ -395,56 +330,6 @@ class PlayerSaver (val player: Player){
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){
player.properties.autocastSpell ?: return
val spell = JSONObject()
@ -631,36 +516,6 @@ class PlayerSaver (val player: Player){
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){
root.put("grave_type",player.graveManager.type.ordinal.toString())
}
@ -697,24 +552,6 @@ class PlayerSaver (val player: Player){
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){
val settings = JSONObject()
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.content.global.BossKillCounter
import core.game.content.ttrail.TreasureTrailManager
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items;
import org.rs09.consts.NPCs;
import rs09.game.content.global.GlobalKillCounter;
import rs09.game.interaction.InterfaceListener
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.system.command.Command
import rs09.game.system.command.Privilege
import rs09.game.system.command.sets.CommandSet
@ -38,11 +40,11 @@ fun sendStats(player: Player, other: Player, page: Int){
0 -> {
when(i) {
//Various stats
97 -> sendLine(player,"Easy Clues: ${other.treasureTrailManager.completedClues[0]}",i)
68 -> sendLine(player,"Medium Clues: ${other.treasureTrailManager.completedClues[1]}",i)
69 -> sendLine(player,"Hard Clues: ${other.treasureTrailManager.completedClues[2]}",i)
97 -> sendLine(player,"Easy Clues: ${TreasureTrailManager.getInstance(other).completedClues[0]}",i)
68 -> sendLine(player,"Medium Clues: ${TreasureTrailManager.getInstance(other).completedClues[1]}",i)
69 -> sendLine(player,"Hard Clues: ${TreasureTrailManager.getInstance(other).completedClues[2]}",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)
73 -> sendLine(player,"Ironman Mode: ${other.ironmanManager.mode.name.toLowerCase()}",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
getCourse(player)
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)
} else {
DoorActionHandler.handleAutowalkDoor(player, node as Scenery)
@ -65,7 +65,7 @@ class BarbarianOutpostCourse
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)
}
455 -> player.barcrawlManager.read()
455 -> BarcrawlManager.getInstance(player).read()
385 -> {
sendMessage(player, "The scorpion stings you!")
player.impactHandler.manualHit(player, 3, HitsplatType.NORMAL)
@ -217,9 +217,9 @@ class BarbarianOutpostCourse
}
override fun open(vararg args: Any): Boolean {
if (!player.barcrawlManager.isStarted) {
if (!BarcrawlManager.getInstance(player).isStarted) {
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.")
stage = 50
} else {
@ -250,7 +250,7 @@ class BarbarianOutpostCourse
stage++
}
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.")
stage = 4
} else {
@ -280,8 +280,8 @@ class BarbarianOutpostCourse
stage++
}
10 -> {
player.barcrawlManager.reset()
player.barcrawlManager.isStarted = true
BarcrawlManager.getInstance(player).reset()
BarcrawlManager.getInstance(player).isStarted = true
player.inventory.add(BarcrawlManager.BARCRAWL_CARD, player)
interpreter.sendDialogue("The guard hands you a Barcrawl card.")
stage++
@ -295,10 +295,10 @@ class BarbarianOutpostCourse
stage++
}
13 -> end()
20 -> if (!player.barcrawlManager.hasCard()) {
20 -> if (!BarcrawlManager.getInstance(player).hasCard()) {
player("I've lost my barcrawl card...")
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...")
stage = 24
} else {
@ -318,7 +318,7 @@ class BarbarianOutpostCourse
if (!player.inventory.containsItem(BarcrawlManager.BARCRAWL_CARD)) {
end()
}
player.barcrawlManager.isStarted = false
BarcrawlManager.getInstance(player).isStarted = false
player.bank.remove(BarcrawlManager.BARCRAWL_CARD)
player.inventory.remove(BarcrawlManager.BARCRAWL_CARD)
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.player.Player
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.scenery.Scenery
import core.game.system.task.Pulse
@ -176,9 +177,9 @@ class PitfallListeners : InteractionListener() {
return@on true
}
val maxTraps = player.hunterManager.maximumTraps
val maxTraps = HunterManager.getInstance(player).maximumTraps
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
}
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.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
fun hasNosePeg(player: Player): Boolean{
return player.slayer.flags.equipmentFlags and 1 == 1
return SlayerManager.getInstance(player).flags.equipmentFlags and 1 == 1
}
@JvmStatic
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
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
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
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
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
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
fun getDamAccBonus(player: Player): Double {
val isCape = player.slayer.flags.equipmentFlags == 0x3F
val isCape = SlayerManager.getInstance(player).flags.equipmentFlags == 0x3F
val hasMask = hasBlackMask(player)
return if(isCape) 1.075

View file

@ -1,6 +1,5 @@
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.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.
* @author Ceikry
*/
class SlayerFlags(val player: Player) {
class SlayerFlags {
var taskFlags = 0
var rewardFlags = 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
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.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
import core.game.node.entity.skill.slayer.Tasks
import org.json.simple.JSONArray
@ -10,23 +18,44 @@ import rs09.game.Event
import java.util.*
/**
* Manages the players slayer task.
* Manages the players slayer data.
* @author Ceikry
*/
class SlayerManager(val player: Player) {
init {
player.hook(Event.NPCKilled, SlayerKillHook)
class SlayerManager(val player: Player? = null) : LoginListener, PersistPlayer, EventHook<NPCKillEvent> {
override fun login(player: Player) {
val instance = SlayerManager(player)
player.hook(Event.NPCKilled, instance)
player.setAttribute("slayer-manager", instance)
}
/**
* The player's slayer flags
*/
@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 flags = getInstance(player).flags
if (m != null) {
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()
}
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.
* @param master the master to give the task.
*/
fun generate(master: Master) {
val task = SlayerUtils.generate(player, master) ?: return
SlayerUtils.assign(player, task, master)
val task = SlayerUtils.generate(player!!, master) ?: return
SlayerUtils.assign(player!!, task, master)
}
/**
@ -137,7 +201,7 @@ class SlayerManager(val player: Player) {
fun decrementAmount(amount: Int) {
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
val isCanEarnPoints: Boolean
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
{
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)
{
player.slayer.master = master
player.slayer.task = task
player.slayer.amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1])
SlayerManager.getInstance(player).master = master
SlayerManager.getInstance(player).task = task
SlayerManager.getInstance(player).amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1])
if (master == Master.DURADEL) {
player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 2, 8)
} else if (master == Master.VANNAKA) {
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

View file

@ -28,6 +28,7 @@ import rs09.game.ai.pvp.PVPAIPBuilderUtils
import rs09.game.ai.resource.ResourceAIPActions
import rs09.game.ai.skillingbot.SkillingBotsBuilder
import rs09.game.ai.wilderness.PvPBotsBuilder
import rs09.game.node.entity.skill.slayer.SlayerManager
import java.util.*
/**
@ -195,7 +196,7 @@ class AIPCommandPlugin : CommandPlugin() {
return true
}
"slayerpoints" -> {
player.slayer.slayerPoints = 50000
SlayerManager.getInstance(player).slayerPoints = 50000
return true
}
"dragonbot" -> {
@ -265,11 +266,11 @@ class AIPCommandPlugin : CommandPlugin() {
}
"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.")
true
} else {
player.slayer.clear()
SlayerManager.getInstance(player).clear()
player.sendMessage("You have canceled your current task.")
true
}

View file

@ -22,6 +22,7 @@ import kotlinx.coroutines.launch
import org.rs09.consts.Components
import rs09.ServerConstants
import rs09.game.content.activity.fishingtrawler.TrawlerLoot
import rs09.game.content.ame.RandomEventManager
import rs09.game.content.ame.RandomEvents
import rs09.game.ge.GrandExchange
import rs09.game.node.entity.state.newsys.states.FarmingState
@ -461,13 +462,13 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){
}
define("testlady", Privilege.ADMIN){ player, _ ->
player.antiMacroHandler.event = RandomEvents.RIVER_TROLL.npc.create(player)
player.antiMacroHandler.event!!.init()
RandomEventManager.getInstance(player)!!.event = RandomEvents.RIVER_TROLL.npc.create(player)
RandomEventManager.getInstance(player)!!.event!!.init()
}
define("revent", Privilege.ADMIN){ player, _ ->
println(player.pulseManager.current)
player.antiMacroHandler.fireEvent()
RandomEventManager.getInstance(player)!!.fireEvent()
}
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.plugin.Initializable
import rs09.game.node.entity.skill.slayer.SlayerManager
import rs09.game.system.command.Command
import rs09.game.system.command.Privilege
@ -13,8 +14,8 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){
*/
define("finishtask"){player,_ ->
notify(player, "Kill the npc that spawned to finish your task.")
player.slayer.amount = 1
val finisher = NPC(player.slayer.task?.npcs?.get(0) ?: 0, player.location)
SlayerManager.getInstance(player).amount = 1
val finisher = NPC(SlayerManager.getInstance(player).task?.npcs?.get(0) ?: 0, player.location)
finisher.isRespawn = false
finisher.init()
}
@ -32,7 +33,7 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){
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.")
}
}

View file

@ -15,8 +15,11 @@ import io.github.classgraph.ClassInfo
import rs09.game.ai.general.scriptrepository.PlayerScripts
import rs09.game.interaction.InteractionListener
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.system.SystemLogger
import rs09.game.system.command.Command
import rs09.game.world.GameWorld
import java.util.*
import java.util.function.Consumer
@ -106,6 +109,15 @@ object ClassScanner {
val clazz = it.loadClass().newInstance() as TickListener
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)
}
}
/**