Redwings Drop III: Ceikry GE, Job, Slayer, Achievement Diary rewrites

This commit is contained in:
skelsoft
2022-03-18 23:35:19 +00:00
committed by Ceikry
parent 37a503746b
commit 0b9d540d45
147 changed files with 3488 additions and 2996 deletions
@@ -1,5 +1,7 @@
package core.game.container.impl;
import core.game.component.CloseEvent;
import core.game.container.access.InterfaceContainer;
import rs09.ServerConstants;
import core.game.component.Component;
import core.game.container.*;
@@ -81,6 +83,18 @@ public final class BankContainer extends Container {
this.player = player;
}
/**
* Method used to open the deposit box.
*/
public void openDepositBox() {
player.getInterfaceManager().open(new Component(11)).setCloseEvent((player, c) -> {
player.getInterfaceManager().openDefaultTabs();
return true;
});
player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6);
InterfaceContainer.generateItems(player, player.getInventory().toArray(), new String[]{"Examine", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit-1"}, 11, 15, 5, 7);
}
/**
* Open the bank.
*/
@@ -130,7 +144,7 @@ public final class BankContainer extends Container {
BankContainer.this.close();
return true;
});
this.player.getBank().refresh(player.getBank().listener);
refresh(listener);
player.getInterfaceManager().openSingleTab(new Component(763));
player.getInventory().getListeners().add(player.getBank().listener);
player.getInventory().refresh();
@@ -1073,21 +1073,6 @@ public final class RangingGuildPlugin extends OptionHandler {
super(id, location);
}
@Override
public void finalizeDeath(Entity killer) {
super.finalizeDeath(killer);
if (killer instanceof Player) {
Player player = (Player) killer;
if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 6)) {
player.setAttribute("/save:diary:seers:tower-archers",
player.getAttribute("diary:seers:tower-archers", 0)
| 1 << getId() - 688);
if (player.getAttribute("diary:seers:tower-archers", 0) == 15) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 6);
}
}
}
}
@Override
public AbstractNPC construct(int id, Location location, Object... objects) {
@@ -244,9 +244,6 @@ public final class BalloonManager extends OptionHandler {
getBalloons().remove(object);
player.animate(Animation.create(10017));
// Pop a party balloon
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 12);
GameWorld.getPulser().submit(new Pulse(1) {
int counter;
@@ -121,7 +121,6 @@ public final class StrongHoldSecurityPlugin extends MapZone implements Plugin<Ob
openComponent(player, Location.create(2358, 5215, 0));
return true;
case 16149:// fourth ladder going down.
player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 4);
openComponent(player, Location.create(2042, 5245, 0));
return true;
case 16135:// claim gift of piece.
@@ -103,18 +103,6 @@ public final class TzhaarFightCaveNPC extends AbstractNPC {
return mover instanceof TzhaarFightCaveNPC;
}
@Override
public void finalizeDeath(Entity killer) {
if (killer.isPlayer()) {
Player player = killer.asPlayer();
// Successfully kill a Ket-Zek in the Fight Caves
if ((getId() == 2743 || getId() == 2744)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 1);
}
}
super.finalizeDeath(killer);
}
/**
* Heals the NPC.
* @param amount The amount to heal.
@@ -4,6 +4,8 @@ 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.interaction.inter.ge.ExchangeItemSets;
import rs09.game.interaction.inter.ge.StockMarket;
/**
* Handles the GrandExchangeClerk dialogue.
@@ -92,7 +94,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break;
case 11:
end();
player.getPlayerGrandExchange().open();
StockMarket.openFor(player);
break;
case 20:
npc("As you wish, sir.");
@@ -100,7 +102,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break;
case 21:
end();
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
break;
case 30:
npc("If that is your wish.");
@@ -108,7 +110,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break;
case 31:
end();
player.getPlayerGrandExchange().openHistoryLog(player);
player.getExchangeRecords().openHistoryLog(player);
break;
case 40:
npc("It would be my pleasure, sir.");
@@ -116,7 +118,7 @@ public final class GrandExchangeClerk extends DialoguePlugin {
break;
case 41:
end();
player.getPlayerGrandExchange().openItemSets();
ExchangeItemSets.openFor(player);
break;
case 50:
npc("If you say so, sir.");
@@ -2,6 +2,7 @@ package core.game.content.global;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item;
import core.game.system.task.Pulse;
import rs09.game.world.GameWorld;
@@ -162,9 +163,9 @@ public enum EnchantedJewellery {
}
player.lock();
player.visualize(ANIMATION, GRAPHICS);
player.getAudioManager().send(200);
player.getAudioManager().send(new Audio(200), true);
player.getImpactHandler().setDisabledTicks(4);
GameWorld.getPulser().submit(new Pulse(4, player) {
GameWorld.getPulser().submit(new Pulse(4) {
@Override
public boolean pulse() {
player.unlock();
@@ -201,45 +201,6 @@ public final class ClimbActionHandler {
for (String message : messages) {
player.getPacketDispatch().sendMessage(message);
}
// Achievement Diary Handlers
// falador climb to top of white knight's castle
player.debug(destination.toString());
if ((destination.equals(2959, 3338, 3) || destination.equals(2983, 3350, 3) || destination.equals(2995, 3341, 3))) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 3);
}
// falador dark wizards tower proselyte
if (destination.equals(2908, 3336, 2)
&& isEquipped(player, Items.PROSELYTE_SALLET_9672)
&& isEquipped(player, Items.PROSELYTE_HAUBERK_9674)
&& isEquipped(player, Items.PROSELYTE_CUISSE_9676)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 0);
}
// falador enter the mining guild
if (destination.equals(3021, 9739, 0)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 6);
}
// Climb to the highest point in Lumbridge
if (destination.equals(3207, 3222, 3)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 0);
}
// Climb to the top of the Wizards' Tower
if (destination.equals(3104, 3161, 2)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 11);
}
// Enter Edgeville Dungeon using the entrance to the south of<br><br>Edgeville
if (destination.equals(3096, 9867, 0)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 10);
}
// Find the highest point in Varrock
if (destination.equals(3206, 3497, 3) || destination.equals(3223, 3472, 3) || destination.equals(3258, 3486, 3)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 18);
}
return true;
}
});
@@ -3,7 +3,7 @@ package core.game.ge;
import core.game.component.Component;
import core.game.node.entity.player.Player;
import core.tools.StringUtils;
import rs09.game.ge.OfferManager;
import rs09.game.ge.GrandExchange;
/**
* Represents the glass used to open the guide prices for the different type of
@@ -140,7 +140,7 @@ public final class GEGuidePrice {
player.getPacketDispatch().sendInterfaceConfig(642, i, false);
}
for (GuideItem item : getItems()) {
player.getPacketDispatch().sendString("" + OfferManager.getRecommendedPrice(item.item, false) + " gp", COMPONENT.getId(), item.getChildData()[0]);
player.getPacketDispatch().sendString("" + GrandExchange.getRecommendedPrice(item.item, false) + " gp", COMPONENT.getId(), item.getChildData()[0]);
}
}
}
@@ -8,10 +8,8 @@ import core.game.component.ComponentDefinition;
import core.game.component.ComponentPlugin;
import core.game.ge.GEGuidePrice;
import core.game.ge.GEItemSet;
import core.game.ge.GrandExchangeDatabase;
import core.game.ge.OfferState;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.RunScript;
import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item;
import core.game.system.task.Pulse;
@@ -21,9 +19,10 @@ import core.net.packet.out.ContainerPacket;
import core.plugin.Initializable;
import core.plugin.Plugin;
import kotlin.Unit;
import rs09.game.ge.GrandExchange;
import rs09.game.ge.GrandExchangeOffer;
import rs09.game.ge.OfferManager;
import rs09.game.ge.PlayerGrandExchange;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.interaction.inter.ge.StockMarket;
import rs09.game.interaction.npc.BogrogPouchSwapper;
import rs09.game.world.GameWorld;
@@ -37,8 +36,8 @@ public class GrandExchangeInterface extends ComponentPlugin {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
ComponentDefinition.put(105, this); // Main interface
ComponentDefinition.put(107, this); // Selling tab
//ComponentDefinition.put(105, this); // Main interface
//ComponentDefinition.put(107, this); // Selling tab
ComponentDefinition.put(109, this); // Collection interface
ComponentDefinition.put(389, this); // Search interface
ComponentDefinition.put(644, this); // Item sets inventory interface
@@ -47,64 +46,26 @@ public class GrandExchangeInterface extends ComponentPlugin {
return this;
}
/**
* Increments the opened grand exchange offer amount.
* @param player The player.
* @param amount The amount to increment.
*/
@SuppressWarnings("deprecation")
private void setOfferAmount(Player player, GrandExchangeOffer offer, int amount) {
if (offer == null || amount < 0 || offer.getOfferState() != OfferState.PENDING) {
return;
}
offer.setAmount(amount);
player.getConfigManager().send(1110, offer.getAmount());
}
/**
* Increments the opened grand exchange offer amount.
* @param player The player.
*/
@SuppressWarnings("deprecation")
private void setOfferValue(Player player, GrandExchangeOffer offer, int value) {
if (offer == null || value < 1 || offer.getOfferState() != OfferState.PENDING) {
return;
}
if (value == OfferManager.getRecommendedPrice(offer.getItemID(), false)) {
player.getAudioManager().send(new Audio(4043, 1, 1));
} else if (value > offer.getOfferedValue()) {
player.getAudioManager().send(new Audio(4041, 1, 1));
} else {
player.getAudioManager().send(new Audio(4045, 1, 1));
}
offer.setOfferedValue(value);
player.varpManager.get(1111).setVarbit(0,offer.getOfferedValue()).send(player);
}
@Override
public boolean handle(final Player player, final Component component, final int opcode, final int button, final int slot, final int itemId) {
GameWorld.getPulser().submit(new Pulse(1, player) {
@Override
public boolean pulse() {
switch (component.getId()) {
case 644:
case 645:
handleItemSet(player, component, opcode, button, slot, itemId);
return true;
case 389:
handleSearchInterface(player, opcode, button, slot, itemId);
return true;
case 107:
handleSellingTab(player, opcode, button, slot, itemId);
return true;
case 109:
handleCollectionBox(player, opcode, button, slot, itemId);
return true;
case 642:
handleGuidePrice(player, opcode, button, slot, itemId);
return true;
case 644:
case 645:
handleItemSet(player, component, opcode, button, slot, itemId);
return true;
case 389:
handleSearchInterface(player, opcode, button, slot, itemId);
return true;
case 109:
handleCollectionBox(player, opcode, button, slot, itemId);
return true;
case 642:
handleGuidePrice(player, opcode, button, slot, itemId);
return true;
}
handleMainInterface(player, opcode, button, slot, itemId);
return true;
}
});
@@ -122,37 +83,9 @@ public class GrandExchangeInterface extends ComponentPlugin {
*/
public boolean handleSearchInterface(final Player player, int opcode, int button, int slot, int itemId) {
switch (button) {
case 10:
player.getInterfaceManager().closeChatbox();
return true;
}
return false;
}
/**
* Handles the selling tab interface options.
* @param player The player.
* @param opcode The packet opcode.
* @param button The button id.
* @param slot The slot.
* @param itemId The item id.
* @return {@code true} if the option got handled.
*/
public boolean handleSellingTab(final Player player, int opcode, int button, int slot, int itemId) {
if (button != 18 || slot < 0 || slot > 27) {
return false;
}
Item item = player.getInventory().get(slot);
if (item == null) {
return false;
}
switch (opcode) {
case 196:
player.getPacketDispatch().sendMessage(item.getDefinition().getExamine());
return true;
case 155:
player.getPlayerGrandExchange().constructSale(item);
return true;
case 10:
player.getInterfaceManager().closeChatbox();
return true;
}
return false;
}
@@ -169,20 +102,20 @@ public class GrandExchangeInterface extends ComponentPlugin {
public boolean handleCollectionBox(final Player player, int opcode, int button, int slot, int itemId) {
int index = -1;
switch (button) {
case 18:
case 23:
case 28:
index = (button - 18) >> 2;
break;
case 36:
case 44:
case 52:
index = 3 + ((button - 36) >> 3);
break;
case 18:
case 23:
case 28:
index = (button - 18) >> 2;
break;
case 36:
case 44:
case 52:
index = 3 + ((button - 36) >> 3);
break;
}
GrandExchangeOffer offer;
if (index > -1 && (offer = player.getPlayerGrandExchange().getOffers()[index]) != null) {
player.getPlayerGrandExchange().withdraw(offer, slot >> 1);
if (index > -1 && (offer = player.getExchangeRecords().getOffer(player.getExchangeRecords().getOfferRecords()[index])) != null) {
StockMarket.withdraw(player, offer, slot >> 1);
}
return true;
}
@@ -213,192 +146,44 @@ public class GrandExchangeInterface extends ComponentPlugin {
return;
}
switch (opcode) {
case 124:
player.getPacketDispatch().sendMessage(item.getDefinition().getExamine());
break;
case 196:
if (inventory) {
if (player.getInventory().freeSlots() < set.getComponents().length - 1) {
player.getPacketDispatch().sendMessage("You don't have enough inventory space for the component parts.");
return;
case 124:
player.getPacketDispatch().sendMessage(item.getDefinition().getExamine());
break;
case 196:
if (inventory) {
if (player.getInventory().freeSlots() < set.getComponents().length - 1) {
player.getPacketDispatch().sendMessage("You don't have enough inventory space for the component parts.");
return;
}
if (!player.getInventory().remove(item, false)) {
return;
}
for (int id : set.getComponents()) {
player.getInventory().add(new Item(id, 1));
}
player.getInventory().refresh();
player.getPacketDispatch().sendMessage("You successfully traded your set for its component items!");
} else {
if (!player.getInventory().containItems(set.getComponents())) {
player.getPacketDispatch().sendMessage("You don't have the parts that make up this set.");
break;
}
for (int id : set.getComponents()) {
player.getInventory().remove(new Item(id, 1), false);
}
player.getInventory().add(item);
player.getInventory().refresh();
player.getPacketDispatch().sendMessage("You successfully traded your item components for a set!");
}
if (!player.getInventory().remove(item, false)) {
return;
}
for (int id : set.getComponents()) {
player.getInventory().add(new Item(id, 1));
}
player.getInventory().refresh();
player.getPacketDispatch().sendMessage("You successfully traded your set for its component items!");
} else {
if (!player.getInventory().containItems(set.getComponents())) {
player.getPacketDispatch().sendMessage("You don't have the parts that make up this set.");
break;
}
for (int id : set.getComponents()) {
player.getInventory().remove(new Item(id, 1), false);
}
player.getInventory().add(item);
player.getInventory().refresh();
player.getPacketDispatch().sendMessage("You successfully traded your item components for a set!");
}
player.getAudioManager().send(new Audio(4044, 1, 1));
PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, player.getAttribute("container-key", 93), player.getInventory(), false));
break;
case 155:
player.getPacketDispatch().sendMessage((String) CS2Mapping.forId(1089).getMap().get(set.getItemId()));
break;
player.getAudioManager().send(new Audio(4044, 1, 1));
PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, player.getAttribute("container-key", 93), player.getInventory(), false));
break;
case 155:
player.getPacketDispatch().sendMessage((String) CS2Mapping.forId(1089).getMap().get(set.getItemId()));
break;
}
}
/**
* Handles the main interface options.
* @param player The player.
* @param opcode The packet opcode.
* @param button The button id.
* @param slot The slot.
* @param itemId The item id.
* @return {@code true} if the option got handled.
*/
public boolean handleMainInterface(final Player player, int opcode, int button, int slot, int itemId) {
final GrandExchangeOffer offer = player.getPlayerGrandExchange().getTemporaryOffer();
final GrandExchangeOffer opened = player.getPlayerGrandExchange().getOpenedOffer();
int amount = offer == null ? 0 : offer.getAmount();
switch (button) {
case 209:
case 211:
if (opened == null) {
return false;
}
player.getPlayerGrandExchange().withdraw(opened, (button - 209) >> 1);
return true;
case 190:
player.getPlayerGrandExchange().confirmOffer();
player.getPlayerGrandExchange().setTemporaryOffer(null);
return true;
case 194:
player.getPlayerGrandExchange().openSearch();
return true;
case 203:
if (opened == null) {
return false;
}
player.getPlayerGrandExchange().abort(opened.getIndex());
return true;
case 18:
case 34:
case 50:
case 69:
case 88:
case 107:
if (opcode == 205) {
player.getPlayerGrandExchange().abort((button - 18) >> 4);
return true;
}
player.getPlayerGrandExchange().view((button - 18) >> 4);
return true;
case 30:
case 46:
case 62:
case 81:
case 100:
case 119:
player.getPlayerGrandExchange().openBuy((button - 30) >> 4);
return true;
case 31:
case 47:
case 63:
case 82:
case 101:
case 120:
player.getPlayerGrandExchange().openSell((button - 31) >> 4);
return true;
case 157: // -1
setOfferAmount(player, offer, amount - 1);
return true;
case 159: // +1
setOfferAmount(player, offer, amount + 1);
return true;
case 162: // 1
setOfferAmount(player, offer, offer != null && offer.getSell() ? 1 : amount + 1);
return true;
case 164: // 10
setOfferAmount(player, offer, offer != null && offer.getSell() ? 10 : amount + 10);
return true;
case 166: // 100
setOfferAmount(player, offer, offer != null && offer.getSell() ? 100 : amount + 100);
return true;
case 168: // 1000 / sell all
if (offer != null && offer.getSell()) {
setOfferAmount(player, offer, PlayerGrandExchange.getInventoryAmount(player, offer.getItemID()));
return true;
}
setOfferAmount(player, offer, amount + 1000);
return true;
case 170: // value x
sendInputDialogue(player, false, "Enter the amount:", (value) -> {
if (player.getInterfaceManager().getChatbox().getId() == 389) {
player.getPlayerGrandExchange().openSearch();
}
String s = value.toString();
s = s.replace("k","000");
s = s.replace("K","000");
s = s.replace("m","000000");
s = s.replace("M","000000");
setOfferAmount(player, offer, Integer.parseInt(s));
return Unit.INSTANCE;
});
return false;
case 180:
if (offer != null) {
setOfferValue(player, offer, OfferManager.getRecommendedPrice(offer.getItemID(), false));
return true;
}
return false;
case 177: // mid - 5% value
case 183: // mid + 5% value
if (offer != null) {
setOfferValue(player, offer, (int) (OfferManager.getRecommendedPrice(offer.getItemID(), false) * (button == 177 ? 0.95 : 1.05)));
return true;
}
return false;
case 171: // Decrease value by 1
case 173: // Increase value with 1
if (offer != null) {
setOfferValue(player, offer, offer.getOfferedValue() + (button == 171 ? -1 : 1));
return true;
}
return false;
case 185: // Set value x
if (offer == null) {
player.getPacketDispatch().sendMessage("Please select an offer first.");
return true;
}
sendInputDialogue(player, false, "Enter the amount:", (value) -> {
if (player.getInterfaceManager().getChatbox().getId() == 389) {
player.getPlayerGrandExchange().openSearch();
}
String s = value.toString();
s = s.replace("k","000");
s = s.replace("K","000");
s = s.replace("m","000000");
s = s.replace("M","000000");
setOfferValue(player, offer, Integer.parseInt(s));
return Unit.INSTANCE;
});
return false;
case 195:
player.getInterfaceManager().close();
return true;
case 127:
player.getPlayerGrandExchange().setTemporaryOffer(null);
player.getInterfaceManager().closeSingleTab();
player.getInterfaceManager().closeChatbox();
return true;
}
return false;
}
/***
* Method used to handle the guide price opcode.
* @param player the player.
@@ -409,29 +194,29 @@ public class GrandExchangeInterface extends ComponentPlugin {
*/
private void handleGuidePrice(final Player player, final int opcode, final int buttonId, final int slot, final int itemId) {
switch (opcode) {
case 155:
GEGuidePrice.GuideType type = player.getAttribute("guide-price", null);
if (type == null) {
return;
}
int subtract = 0;
if (buttonId >= 15 && buttonId <= 23) {
subtract = 15;
}
if (buttonId >= 43 && buttonId <= 57) {
subtract = 43;
}
if (buttonId >= 89 && buttonId <= 103) {
subtract = 89;
}
if (buttonId >= 135 && buttonId <= 144) {
subtract = 135;
}
if (buttonId >= 167 && buttonId <= 182) {
subtract = 167;
}
player.getPacketDispatch().sendMessage(ItemDefinition.forId(type.getItems()[buttonId - subtract].getItem()).getExamine());
break;
case 155:
GEGuidePrice.GuideType type = player.getAttribute("guide-price", null);
if (type == null) {
return;
}
int subtract = 0;
if (buttonId >= 15 && buttonId <= 23) {
subtract = 15;
}
if (buttonId >= 43 && buttonId <= 57) {
subtract = 43;
}
if (buttonId >= 89 && buttonId <= 103) {
subtract = 89;
}
if (buttonId >= 135 && buttonId <= 144) {
subtract = 135;
}
if (buttonId >= 167 && buttonId <= 182) {
subtract = 167;
}
player.getPacketDispatch().sendMessage(ItemDefinition.forId(type.getItems()[buttonId - subtract].getItem()).getExamine());
break;
}
}
}
@@ -3,6 +3,7 @@ package core.game.interaction.npc
import api.*
import core.cache.def.impl.NPCDefinition
import core.game.component.Component
import core.game.content.dialogue.FacialExpression
import core.plugin.Initializable
import core.game.interaction.OptionHandler
import core.game.node.Node
@@ -12,6 +13,7 @@ import core.plugin.Plugin
import core.game.node.entity.skill.crafting.TanningProduct
import org.rs09.consts.NPCs
import rs09.game.interaction.InteractionListener
import rs09.tools.END_DIALOGUE
/**
* Represents the plugin used for an npc with the trade option.
@@ -42,6 +44,24 @@ class NPCTradePlugin : InteractionListener() {
node.asNpc().openShop(player)
return@on true
}
on(NPCs.FUR_TRADER_1316, NPC,"trade") { player, node ->
if (!isQuestComplete(player, "Fremennik Trials")) {
sendNPCDialogue(player, NPCs.FUR_TRADER_1316, "I don't sell to outerlanders.", FacialExpression.ANNOYED).also { END_DIALOGUE }
} else {
END_DIALOGUE.also { node.asNpc().openShop(player) }
}
return@on true
}
on(NPCs.FISH_MONGER_1315, NPC,"trade") { player, node ->
if (!isQuestComplete(player, "Fremennik Trials")) {
sendNPCDialogue(player, NPCs.FISH_MONGER_1315, "I don't sell to outerlanders.", FacialExpression.ANNOYED).also { END_DIALOGUE }
} else {
END_DIALOGUE.also { node.asNpc().openShop(player) }
}
return@on true
}
}
override fun defineDestinationOverrides() {
@@ -32,8 +32,8 @@ import core.game.world.update.flag.context.Animation;
import core.plugin.Initializable;
import core.plugin.Plugin;
import kotlin.Unit;
import org.rs09.consts.Items;
import rs09.game.content.dialogue.DumpContainer;
import rs09.game.content.dialogue.DepositAllDialogue;
import rs09.game.ge.GrandExchangeRecords;
import rs09.game.ge.GrandExchangeOffer;
import rs09.game.world.GameWorld;
@@ -92,7 +92,7 @@ public final class BankingPlugin extends OptionHandler {
checkAchievements(player);
return true;
case "collect":
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
return true;
case "deposit":
openDepositBox(player);
@@ -174,7 +174,8 @@ public final class BankingPlugin extends OptionHandler {
return true;
}
interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?");
for (GrandExchangeOffer o : player.getPlayerGrandExchange().getOffers()) {
for (GrandExchangeRecords.OfferRecord r : player.getExchangeRecords().getOfferRecords()) {
GrandExchangeOffer o = player.getExchangeRecords().getOffer(r);
if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) {
stage = -1;
break;
@@ -428,7 +429,7 @@ public final class BankingPlugin extends OptionHandler {
case 762:
switch (button) {
case 18:
p.getDialogueInterpreter().open(new DumpContainer().getID());
p.getDialogueInterpreter().open(new DepositAllDialogue().getID());
return true;
case 23:
p.getDialogueInterpreter().sendOptions("Select an Option", "Check bank value", "Banking assistance", "Close");
@@ -675,7 +676,7 @@ public final class BankingPlugin extends OptionHandler {
player.getBank().open();
checkAchievements(player);
} else {
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
}
return true;
}
@@ -12,6 +12,8 @@ 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.interaction.inter.ge.ExchangeItemSets;
import rs09.game.interaction.inter.ge.StockMarket;
/**
* Represents the plugin used for grand exchange npc and object options.
@@ -56,17 +58,17 @@ public final class GrandExchangePlugin extends OptionHandler {
player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed...");
break;
}
player.getPlayerGrandExchange().open();
StockMarket.openFor(player);
break;
case "history":
player.getPlayerGrandExchange().openHistoryLog(player);
player.getExchangeRecords().openHistoryLog(player);
break;
case "collect":
if (!GrandExchangeDatabase.hasInitialized()) {
player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed...");
break;
}
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
break;
case "info-logs":
GEGuidePrice.open(player, GuideType.LOGS);
@@ -84,7 +86,7 @@ public final class GrandExchangePlugin extends OptionHandler {
GEGuidePrice.open(player, GuideType.WEAPONS_AND_ARMOUR);
break;
case "sets":
player.getPlayerGrandExchange().openItemSets();
ExchangeItemSets.openFor(player);
break;
}
return true;
@@ -137,7 +139,7 @@ public final class GrandExchangePlugin extends OptionHandler {
player.getBank().open();
break;
case "collect":
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
break;
}
return true;
@@ -55,7 +55,7 @@ public class LumbridgeBasementPlugin extends OptionHandler {
SceneryDefinition.forId(40849).getHandlers().put("option:jump-down", this);
SceneryDefinition.forId(40260).getHandlers().put("option:climb-through", this);
SceneryDefinition.forId(41077).getHandlers().put("option:crawl-through", this);
PluginManager.definePlugins(new LightCreatureNPC(), new LightCreatureHandler(), new FishMongerDialogue());
PluginManager.definePlugins(new LightCreatureNPC(), new LightCreatureHandler());
SceneryBuilder.add(new Scenery(40260, Location.create(2526, 5828, 2), 2));
return this;
}
@@ -256,69 +256,4 @@ public class LumbridgeBasementPlugin extends OptionHandler {
}
}
/**
* Handles the fish monger dialogue.
* @author Vexia
*
*/
public class FishMongerDialogue extends DialoguePlugin {
/**
* Constructs the {@code FishMongerDialogue}
*/
public FishMongerDialogue() {
/*
* empty.
*/
}
/**
* Constructs the {@code FishMongerDialogue}
*/
public FishMongerDialogue(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new FishMongerDialogue(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
npc("Hello, " + player.getUsername() + " would you like to look at", "my wares?");
stage = 0;
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
options("Yes, please.", "No, thanks.");
stage++;
break;
case 1:
switch (buttonId) {
case 1:
end();
npc.openShop(player);
break;
case 2:
end();
break;
}
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] {1369};
}
}
}
@@ -12,6 +12,7 @@ import core.game.node.entity.combat.equipment.WeaponInterface.AttackStyle;
import core.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item;
import core.game.node.scenery.Scenery;
import core.game.node.scenery.SceneryBuilder;
@@ -73,6 +74,7 @@ public final class SlashWebPlugin extends OptionHandler {
}
final boolean success = RandomFunction.random(2) == 1;
player.lock(2);
player.getAudioManager().send(new Audio(2548));
player.animate(weapon == KNIFE ? KNIFE_ANIMATION : ANIMATION);
if (success) {
player.getPacketDispatch().sendMessage("You slash the web apart.");
@@ -1,5 +1,7 @@
package core.game.node.entity;
import api.events.Event;
import api.events.EventHook;
import core.game.content.holiday.HolidayEvent;
import core.game.interaction.DestinationFlag;
import core.game.node.Node;
@@ -28,6 +30,7 @@ import core.game.world.update.flag.context.Graphics;
import rs09.game.node.entity.combat.CombatSwingHandler;
import rs09.game.world.update.UpdateMasks;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -107,6 +110,13 @@ public abstract class Entity extends Node {
*/
private final ActionLocks locks = new ActionLocks();
/**
* The mapping of event types to event hooks
*/
private HashMap<Class<?>, ArrayList<EventHook>> hooks = new HashMap<>();
/**
* If the entity is invisible.
*/
@@ -145,6 +155,54 @@ public abstract class Entity extends Node {
}
}
/**
* Dispatches an event to this entity's event hooks
*/
public void dispatch(Event event)
{
if(this.hooks.containsKey(event.getClass()))
{
this.hooks.get(event.getClass()).forEach((hook) -> { hook.process(this, event); });
}
}
/**
* Unhooks an eventhook from this entity
*/
public void unhook(EventHook hook)
{
GameWorld.getPulser().submit(new Pulse() {
@Override
public boolean pulse() {
for(ArrayList<EventHook> s : hooks.values()) s.remove(hook);
return true;
}
});
}
/**
* Hooks an eventhook to this entity
*/
public void hook(Event event, EventHook hook)
{
hook(event.getClass(), hook);
}
public void hook(Class<?> event, EventHook hook)
{
ArrayList<EventHook> hookList;
if(hooks.get(event) != null)
{
hookList = hooks.get(event);
}
else
{
hookList = new ArrayList<EventHook>();
}
hookList.add(hook);
hooks.put(event, hookList);
}
/**
* Initializes the entity.
*/
@@ -1,6 +1,5 @@
package core.game.node.entity.combat.special;
import core.plugin.Initializable;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState;
@@ -10,13 +9,12 @@ import core.game.node.entity.impl.Animator.Priority;
import core.game.node.entity.player.Player;
import core.game.world.update.flag.context.Animation;
import core.game.world.update.flag.context.Graphics;
import core.plugin.Initializable;
import core.plugin.Plugin;
import core.tools.RandomFunction;
/**
* Represents the dragon axe's clobbrer special handler.
* @author Emperor
* @version 1.0
* Handles the Dragon axe special attack.
* @author Crash
*/
@Initializable
public final class ClobberSpecialHandler extends MeleeSwingHandler implements Plugin<Object> {
@@ -36,8 +34,14 @@ public final class ClobberSpecialHandler extends MeleeSwingHandler implements Pl
*/
private static final Graphics GRAPHIC = new Graphics(479, 96);
@Override
public Object fireEvent(String identifier, Object... args) {
switch (identifier) {
case "instant_spec":
case "ncspec":
return true;
}
return null;
}
@@ -49,29 +53,13 @@ public final class ClobberSpecialHandler extends MeleeSwingHandler implements Pl
@Override
public int swing(Entity entity, Entity victim, BattleState state) {
if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) {
Player p = (Player) entity;
if (!p.getSettings().drainSpecial(SPECIAL_ENERGY))
return -1;
}
state.setStyle(CombatStyle.MELEE);
int hit = 0;
if (entity instanceof Player) {
entity.asPlayer().sendChat("Chop chop!");
}
if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.05, 1.0)) {
hit = RandomFunction.random(calculateHit(entity, victim, 1.0));
if (hit > 9) {
int amount = hit / 10;
victim.getSkills().updateLevel(Skills.DEFENCE, -amount, 0);
victim.getSkills().updateLevel(Skills.MAGIC, -amount, 0);
}
}
entity.getSkills().updateLevel(Skills.WOODCUTTING, 3);
state.setEstimatedHit(hit);
return 1;
p.sendChat("Chop chop!");
p.visualize(ANIMATION, GRAPHIC);
p.getSkills().updateLevel(Skills.WOODCUTTING, 3, p.getSkills().getStaticLevel(Skills.WOODCUTTING) + 3);
return -1;
}
@Override
public void visualize(Entity entity, Entity victim, BattleState state) {
entity.visualize(ANIMATION, GRAPHIC);
}
}
@@ -0,0 +1,80 @@
package core.game.node.entity.combat.special;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState;
import core.game.node.entity.combat.CombatStyle;
import rs09.game.node.entity.combat.handlers.RangeSwingHandler;
import core.game.node.entity.impl.Projectile;
import core.game.node.entity.player.Player;
import core.game.world.update.flag.context.Graphics;
import core.plugin.Plugin;
import core.plugin.Initializable;
import core.tools.RandomFunction;
/**
* Represents the Seercull's special attack which lowers the opponent's magic
* level.
* @author Splinter
* @version 1.0
*/
@Initializable
public final class SeercullSpecialHandler extends RangeSwingHandler implements Plugin<Object> {
/**
* The special energy required.
*/
private static final int SPECIAL_ENERGY = 100;
/**
* The attack animation.
*/
private static final Graphics DRAWBACK_GFX = new Graphics(472, 96);
@Override
public Object fireEvent(String identifier, Object... args) {
return null;
}
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
CombatStyle.RANGE.getSwingHandler().register(6724, this);
return this;
}
@Override
public int swing(Entity entity, Entity victim, BattleState state) {
Player p = (Player) entity;
configureRangeData(p, state);
if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) {
entity.getProperties().getCombatPulse().stop();
p.getSettings().toggleSpecialBar();
return -1;
}
if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) {
return -1;
}
int hit = 0;
if (isAccurateImpact(entity, victim, CombatStyle.RANGE, 1.05, 1.0)) {
hit = RandomFunction.random(calculateHit(entity, victim, 1.0));
victim.getSkills().updateLevel(Skills.MAGIC, -hit, 0);
}
Companion.useAmmo(entity, state, victim.getLocation());
state.setEstimatedHit(hit);
return 1;
}
@Override
public void visualize(Entity entity, Entity victim, BattleState state) {
victim.graphics(new Graphics(474));
int speed = (int) (35 + (entity.getLocation().getDistance(victim.getLocation()) * 10));
entity.visualize(entity.getProperties().getAttackAnimation(), DRAWBACK_GFX);
Projectile.create(entity, victim, 473, 40, 40, 40, speed, 15, 11).send();
}
@Override
public void impact(final Entity entity, final Entity victim, final BattleState state) {
int hit = state.getEstimatedHit();
victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.RANGE, state);
}
}
@@ -0,0 +1,78 @@
package core.game.node.entity.combat.special;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState;
import core.game.node.entity.combat.CombatStyle;
import rs09.game.node.entity.combat.handlers.MeleeSwingHandler;
import core.game.node.entity.impl.Animator.Priority;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
import core.game.world.update.flag.context.Animation;
import core.game.world.update.flag.context.Graphics;
import core.plugin.Plugin;
import core.plugin.Initializable;
import core.tools.RandomFunction;
/**
* Handles Darklight's special attack, Weaken.
* @author Crash, based on Emperor's code for other special attacks
*/
@Initializable
public final class WeakenSpecialHandler extends MeleeSwingHandler implements Plugin<Object> {
/**
* The special energy required.
*/
private static final int SPECIAL_ENERGY = 50;
/**
* The attack animation.
*/
private static final Animation ANIMATION = new Animation(2890, Priority.HIGH);
/**
* The graphic.
*/
private static final Graphics GRAPHIC = new Graphics(483);
@Override
public Object fireEvent(String identifier, Object... args) {
return null;
}
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
CombatStyle.MELEE.getSwingHandler().register(6746, this);
return this;
}
@Override
public int swing(Entity entity, Entity victim, BattleState state) {
if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) {
return -1;
}
state.setStyle(CombatStyle.MELEE);
int hit = 0;
if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.0, 1.0)) {
hit = RandomFunction.random(calculateHit(entity, victim, 1.0));
}
state.setEstimatedHit(hit);
if (victim instanceof Player) {
((Player) victim).getPacketDispatch().sendMessage("You have been drained.");
}
int lower = (int) (victim.getSkills().getLevel(Skills.DEFENCE) * 0.05);
victim.getSkills().updateLevel(Skills.DEFENCE, -lower, 0);
int lower2 = (int) (victim.getSkills().getLevel(Skills.ATTACK) * 0.05);
victim.getSkills().updateLevel(Skills.ATTACK, -lower2, 0);
int lower3 = (int) (victim.getSkills().getLevel(Skills.STRENGTH) * 0.05);
victim.getSkills().updateLevel(Skills.STRENGTH, -lower3, 0);
return hit;
}
@Override
public void visualize(Entity entity, Entity victim, BattleState state) {
entity.visualize(ANIMATION, GRAPHIC);
entity.asPlayer().getAudioManager().send(new Audio(225), true);
}
}
@@ -1,5 +1,6 @@
package core.game.node.entity.npc;
import api.events.NPCKillEvent;
import core.cache.def.impl.NPCDefinition;
import core.game.content.dialogue.DialoguePlugin;
import core.game.content.global.shop.Shop;
@@ -442,17 +443,9 @@ public class NPC extends Entity {
if(walkRadius == 0)
walkRadius = 3;
}
getPulseManager().run(new MovementPulse(this, getProperties().getSpawnLocation(), Pathfinder.SMART) {
@Override
public boolean pulse() {
return true;
}
}, "movement");
if (aggressiveHandler != null) {
aggressiveHandler.setPauseTicks(walkRadius + 1);
}
nextWalk = GameWorld.getTicks() + walkRadius + 1;
return;
}
if (aggressive && aggressiveHandler != null && aggressiveHandler.selectTarget()) {
return;
@@ -527,12 +520,6 @@ public class NPC extends Entity {
if (getZoneMonitor().handleDeath(killer)) {
return;
}
if (task != null && killer instanceof Player && ((Player) killer).getSlayer().getTask() == task && ((Player) killer).getSlayer().hasTask()) {
((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), this);
}
if (killer instanceof Player && killer.getAttribute("jobs:id",null) != null) {
JobManager.handleDeath(id,(Player) killer);
}
setRespawnTick(GameWorld.getTicks() + definition.getConfiguration(NPCConfigParser.RESPAWN_DELAY, 17));
Player p = !(killer instanceof Player) ? null : (Player) killer;
if (p != null) {
@@ -543,6 +530,7 @@ public class NPC extends Entity {
if (!isRespawn()) {
clear();
}
killer.dispatch(new NPCKillEvent(this));
}
/**
@@ -717,7 +705,19 @@ public class NPC extends Entity {
*/
protected Location getMovementDestination() {
if (!pathBoundMovement || movementPath == null || movementPath.length < 1) {
return getProperties().getSpawnLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0);
Location returnToSpawnLocation = getProperties().getSpawnLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0);
int dist = (int) Location.getDistance(location, returnToSpawnLocation);
int pathLimit = 15;
if(dist > pathLimit || dist < -pathLimit)
{
int diffX = returnToSpawnLocation.getX() - location.getX();
int diffY = returnToSpawnLocation.getY() - location.getY();
returnToSpawnLocation = location.transform(
Math.min(Math.max(-pathLimit, diffX), pathLimit), //Try to path no more than pathLimit and no less than -pathLimit tiles away in the X and Y directions
Math.min(Math.max(-pathLimit, diffY), pathLimit),
0);
}
return returnToSpawnLocation;
}
Location l = movementPath[movementIndex++];
if (movementIndex == movementPath.length) {
@@ -20,7 +20,7 @@ import rs09.game.ai.AIRepository;
import rs09.game.ai.general.GeneralBotCreator;
import rs09.game.content.global.GlobalKillCounter;
import rs09.game.content.global.NPCDropTable;
import rs09.game.ge.OfferManager;
import rs09.game.ge.GrandExchange;
import rs09.game.system.config.ItemConfigParser;
import rs09.game.world.repository.Repository;
@@ -162,7 +162,7 @@ public final class NPCDropTables {
}
}
player.sendMessage(player.getInterfaceManager().isResizable()+"");
int price = item.getName().endsWith("charm") ? 100 : OfferManager.getRecommendedPrice(itemId, false);
int price = item.getName().endsWith("charm") ? 100 : GrandExchange.getRecommendedPrice(itemId, false);
looter.getGlobalData().setLootSharePoints(looter.getGlobalData().getLootSharePoints() - (price) + ((price / looters.size())));
looter.sendMessage((player.getInterfaceManager().isResizable() ? "<col=32CD32>" : "<col=009900>") + "You received: " + item.getAmount() + " " + item.getName());
for (Player p : looters) {
@@ -50,18 +50,6 @@ public final class CowNPC extends AbstractNPC {
return new CowNPC(id, location);
}
@Override
public void finalizeDeath(final Entity killer) {
super.finalizeDeath(killer);
if (killer != null) {
Player player = killer.asPlayer();
// Obtain a cow-hide from a cow in the field north-east of<br><br>Lumbridge
if (player.getViewport().getRegion().getId() == 12850 || player.getViewport().getRegion().getId() == 12851) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 1);
}
}
}
@Override
public int[] getIds() {
return new int[] { 81, 397, 955, 1766, 1767, 3309 };
@@ -50,17 +50,6 @@ public final class DuckNPC extends AbstractNPC {
return new DuckNPC(id, location);
}
@Override
public void finalizeDeath(final Entity killer) {
super.finalizeDeath(killer);
if (killer instanceof Player) {
final Player player = killer.asPlayer();
if (this.getLocation().withinDistance(new Location(2991,3383,0))) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,0, 9);
}
}
}
@Override
public int[] getIds() {
return new int[] { 46, 2693, 6113 };
@@ -1,74 +0,0 @@
package core.game.node.entity.npc.other;
import core.game.node.entity.Entity;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.world.map.Location;
import core.plugin.Initializable;
/**
* Represents the Earth, Fire, Air, and Water Elemental NPCs.
* @author afaroutdude
*/
@Initializable
public final class ElementalMonsterNPC extends AbstractNPC {
/**
* Constructs a new {@code DuckNPC} {@code Object}.
*/
public ElementalMonsterNPC() {
super(0, null);
}
/**
* Constructs a new {@code DuckNPC} {@code Object}.
* @param id the id.
* @param location the location.
*/
public ElementalMonsterNPC(int id, Location location) {
super(id, location, true);
}
@Override
public AbstractNPC construct(int id, Location location, Object... objects) {
return new ElementalMonsterNPC(id, location);
}
@Override
public void finalizeDeath(final Entity killer) {
super.finalizeDeath(killer);
if (killer instanceof Player) {
final Player player = killer.asPlayer();
if (this.getLocation().withinDistance(new Location(2719, 9889, 0), 100)) {
switch (this.getId()) {
case 1019:
player.setAttribute("/save:diary:seers:elemental:fire", true);
break;
case 1020:
player.setAttribute("/save:diary:seers:elemental:earth", true);
break;
case 1021:
player.setAttribute("/save:diary:seers:elemental:air", true);
break;
case 1022:
player.setAttribute("/save:diary:seers:elemental:water", true);
break;
}
if (player.getAttribute("diary:seers:elemental:fire", false)
&& player.getAttribute("diary:seers:elemental:earth", false)
&& player.getAttribute("diary:seers:elemental:air", false)
&& player.getAttribute("diary:seers:elemental:water", false)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 4);
}
}
}
}
@Override
public int[] getIds() {
return new int[] { 1019, 1020, 1021, 1022 };
}
}
@@ -1,63 +0,0 @@
package core.game.node.entity.npc.other;
import core.game.node.entity.Entity;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.world.map.Location;
import core.plugin.Initializable;
/**
* Represents a Jogre NPC.
* @author Vexia
*/
@Initializable
public class JogreNPC extends AbstractNPC {
/**
* If the jogre is in the pothole zone.
*/
private boolean inPothole;
/**
* Constructs a new {@code JogreNPC} {@code Object}
* @param id the id.
* @param location the location.
*/
public JogreNPC(int id, Location location) {
super(id, location);
}
@Override
public void init() {
super.init();
inPothole = this.getViewport().getRegion().getId() == 11412;
}
/**
* Constructs a new {@code JogreNPC} {@code Object}
*/
public JogreNPC() {
this(-1, null);
}
@Override
public AbstractNPC construct(int id, Location location, Object... objects) {
return new JogreNPC(id, location);
}
@Override
public void finalizeDeath(Entity killer) {
if (inPothole && killer.isPlayer()) {
Player player = killer.asPlayer();
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 9);
}
super.finalizeDeath(killer);
}
@Override
public int[] getIds() {
return new int[] { 113 };
}
}
@@ -1,58 +0,0 @@
package core.game.node.entity.npc.other;
import core.game.node.entity.Entity;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.plugin.Initializable;
import core.game.world.map.Location;
/**
* Represents a rat npc.
* @author afaroutdude
*/
@Initializable
public class LumbridgeSwampGiantRatNPC extends AbstractNPC {
/**
* The NPC ids of NPCs using this plugin.
*/
private static final int[] ID = { 86 };
/**
* Constructs a new {@code RatNPC} {@code Object}.
*/
public LumbridgeSwampGiantRatNPC() {
super(0, null);
}
/**
* Constructs a new {@code RatNPC} {@code Object}.
* @param id the id.
* @param location the location.
*/
private LumbridgeSwampGiantRatNPC(int id, Location location) {
super(id, location, true);
}
@Override
public AbstractNPC construct(int id, Location location, Object... objects) {
return new LumbridgeSwampGiantRatNPC(id, location);
}
@Override
public void finalizeDeath(final Entity killer) {
super.finalizeDeath(killer);
// Kill a giant rat in Lumbridge Swamp
if (killer instanceof Player && (killer.getViewport().getRegion().getId() == 12593 || killer.getViewport().getRegion().getId() == 12849)) {
killer.asPlayer().getAchievementDiaryManager().finishTask(killer.asPlayer(), DiaryType.LUMBRIDGE, 1, 7);
}
}
@Override
public int[] getIds() {
return ID;
}
}
@@ -53,15 +53,6 @@ public final class MetalDragonNPC extends AbstractNPC {
return combatAction;
}
@Override
public void finalizeDeath(Entity killer) {
if (killer.isPlayer() && (killer.getViewport().getRegion().getId() == 10899 || killer.getViewport().getRegion().getId() == 10900)) {
Player player = killer.asPlayer();
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 9);
}
super.finalizeDeath(killer);
}
@Override
public int getDragonfireProtection(boolean fire) {
return 0x2 | 0x4 | 0x8;
@@ -1,56 +0,0 @@
package core.game.node.entity.npc.other;
import core.game.node.entity.Entity;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.plugin.Initializable;
import core.game.world.map.Location;
/**
* Handles the zombie npc.
* @author Vexia
*
*/
@Initializable
public class ZombieNPC extends AbstractNPC {
/**
* Constructs the {@code ZombieNPC}
*/
public ZombieNPC() {
super(0, null);
}
/**
* Constructs the {@code ZombieNPC}
* @param id The id.
* @param location The location.
*/
public ZombieNPC(int id, Location location) {
super(id, location);
}
@Override
public void finalizeDeath(Entity killer) {
super.finalizeDeath(killer);
if (killer instanceof Player) {
Player player = killer.asPlayer();
// Defeat a zombie in the sewers under the jail
if (player.getViewport().getRegion().getId() == 12438 || player.getViewport().getRegion().getId() == 12439) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 18);
}
}
}
@Override
public AbstractNPC construct(int id, Location location, Object... objects) {
return new ZombieNPC(id, location);
}
@Override
public int[] getIds() {
return new int[] {73, 74};
}
}
@@ -40,7 +40,7 @@ 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 core.game.node.entity.skill.slayer.SlayerManager;
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;
@@ -77,7 +77,7 @@ import rs09.GlobalStats;
import rs09.ServerConstants;
import rs09.game.VarpManager;
import rs09.game.content.ame.RandomEventManager;
import rs09.game.ge.PlayerGrandExchange;
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.PlayerSaver;
@@ -86,7 +86,6 @@ import rs09.game.node.entity.state.newsys.State;
import rs09.game.node.entity.state.newsys.StateRepository;
import rs09.game.system.SystemLogger;
import rs09.game.world.GameWorld;
import rs09.game.world.repository.DisconnectionQueue;
import rs09.game.world.repository.Repository;
import rs09.game.world.update.MapChunkRenderer;
import rs09.game.world.update.NPCRenderer;
@@ -251,7 +250,7 @@ public class Player extends Entity {
/**
* The new grand exchange interface manager.
*/
private final PlayerGrandExchange playerGrandExchange = new PlayerGrandExchange(this);
public final GrandExchangeRecords exchangeRecords = new GrandExchangeRecords(this);
/**
* The familiar manager.
@@ -398,6 +397,8 @@ public class Player extends Entity {
@Override
public void init() {
if(!artificial)
SystemLogger.logInfo(getUsername() + " initialising...");
if (!artificial) {
getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION);
getDetails().getSession().setObject(this);
@@ -1445,7 +1446,7 @@ public class Player extends Entity {
public BrawlingGlovesManager getBrawlingGlovesManager() { return brawlingGlovesManager;}
public PlayerGrandExchange getPlayerGrandExchange() { return playerGrandExchange; }
public GrandExchangeRecords getExchangeRecords() { return exchangeRecords; }
public boolean hasActiveState(String key){
State state = states.get(key);
@@ -80,6 +80,11 @@ public final class LoginConfiguration {
} else {
configureGameWorld(player);
}
if(!player.isArtificial())
{
GameWorld.getLoginListeners().forEach((listener) -> listener.login(player));
}
}
/**
@@ -203,6 +208,8 @@ public final class LoginConfiguration {
* @param player the player.
*/
public static final void config(final Player player) {
if(!player.isArtificial())
SystemLogger.logInfo("configuring player " + player.getUsername());
player.getInventory().refresh();
player.getEquipment().refresh();
player.getSkills().refresh();
@@ -212,7 +219,7 @@ public final class LoginConfiguration {
player.getPacketDispatch().sendRunEnergy();
player.getFamiliarManager().login();
player.getInterfaceManager().openDefaultTabs();
player.getPlayerGrandExchange().init();
player.getExchangeRecords().init();
player.getPacketDispatch().sendString("Friends List - World " + GameWorld.getSettings().getWorldId(), 550, 3);
player.getConfigManager().init();
player.getAntiMacroHandler().init();
@@ -221,6 +228,8 @@ public final class LoginConfiguration {
player.getInterfaceManager().close();
player.getEmoteManager().refresh();
player.getInterfaceManager().openInfoBars();
if(!player.isArtificial())
SystemLogger.logInfo("finished configuring player " + player.getUsername());
}
/**
@@ -108,7 +108,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.getPlayerGrandExchange().format());
table.getColumn("ge").updateValue(player.getExchangeRecords().format());
table.getColumn("inventory").updateValue(player.getInventory().format());
table.getColumn("equipment").updateValue(player.getEquipment().format());
table.getColumn("netWorth").updateValue(player.getMonitor().getNetworth());
@@ -1,10 +1,10 @@
package core.game.node.entity.player.link;
import core.cache.misc.buffer.ByteBufferUtils;
import core.game.component.CloseEvent;
import core.game.component.Component;
import core.game.node.entity.player.Player;
import rs09.game.interaction.inter.ge.StockMarket;
import rs09.game.world.GameWorld;
import core.net.packet.PacketRepository;
import core.net.packet.context.ChildPositionContext;
@@ -14,7 +14,6 @@ import core.net.packet.out.StringPacket;
import core.tools.RandomFunction;
import org.json.simple.JSONObject;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -203,9 +202,9 @@ public class BankPinManager {
player.getBank().open();
}
} else if (buttonId == 3) {
player.getPlayerGrandExchange().openCollectionBox();
player.getExchangeRecords().openCollectionBox();
} else if (buttonId == 4) {
player.getPlayerGrandExchange().open();
StockMarket.openFor(player);
}
}
@@ -6,6 +6,7 @@ import core.game.node.entity.Entity;
import core.game.node.entity.impl.Animator.Priority;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest;
import core.game.node.entity.player.link.audio.Audio;
import core.game.system.task.Pulse;
import rs09.game.world.GameWorld;
import core.game.world.map.Location;
@@ -197,7 +198,7 @@ public class TeleportManager {
public boolean pulse() {
if (delay == 0) {
if (entity instanceof Player) {
entity.asPlayer().getAudioManager().send(200);
entity.asPlayer().getAudioManager().send(new Audio(200), true);
}
entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote()));
entity.graphics(new Graphics(getSettings().getStartGfx()));
@@ -206,7 +207,7 @@ public class TeleportManager {
fireRandom(entity, location);
} else if (delay == 4) {
if (entity instanceof Player) {
entity.asPlayer().getAudioManager().send(201);
entity.asPlayer().getAudioManager().send(new Audio(201), true);
}
entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH));
entity.graphics(new Graphics(getSettings().getEndGfx()));
@@ -202,7 +202,7 @@ public final class HouseManager {
player.getConfigManager().set(261, buildingMode);
player.getConfigManager().set(262, getRoomAmount());
player.getAudioManager().send(new Audio(984));
// player.getMusicPlayer().unlock(454, true);
player.getMusicPlayer().unlock(454, true);
GameWorld.getPulser().submit(new Pulse(1, player) {
@Override
public boolean pulse() {
@@ -7,6 +7,7 @@ import core.game.content.dialogue.DialogueInterpreter;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
import core.game.system.task.Pulse;
import rs09.game.world.GameWorld;
import core.game.world.map.Location;
@@ -78,7 +79,7 @@ public class MountedGloryPlugin extends OptionHandler {
}
player.lock();
player.visualize(ANIMATION, GRAPHICS);
player.getAudioManager().send(200);
player.getAudioManager().send(new Audio(200), true);
player.getImpactHandler().setDisabledTicks(4);
GameWorld.getPulser().submit(new Pulse(4, player) {
@Override
@@ -90,7 +90,12 @@ public enum CookableItems {
//Miscellaneous
RAW_OOMLIE(Items.RAW_OOMLIE_2337, 0, Items.BURNT_OOMLIE_2426, 50, 0, 999,0,0), // always burns
OOMLIE_WRAP(Items.COOKED_OOMLIE_WRAP_2343, Items.WRAPPED_OOMLIE_2341, Items.BURNT_OOMLIE_WRAP_2345, 50, 110, 999,0,0),
SEAWEED(Items.SEAWEED_401,0,Items.SODA_ASH_1781,0,0,999,0,0);
SEAWEED(Items.SEAWEED_401,0,Items.SODA_ASH_1781,0,0,999,0,0),
/**
* Sinew gets overridden by BEEF in this enum, due to values being looked up by the items RAW id.
* This gets corrected in {@link core.game.node.entity.skill.cooking.SinewCookingPulse}
*/
SINEW(Items.SINEW_9436,Items.RAW_BEEF_2132,Items.SINEW_9436,0,3,0,0,0);
public final static HashMap<Integer,CookableItems>cookingMap = new HashMap<>();
public final static HashMap<Integer, CookableItems>intentionalBurnMap = new HashMap<>();
@@ -0,0 +1,32 @@
package core.game.node.entity.skill.cooking;
import core.game.node.entity.player.Player;
import core.game.node.item.Item;
import core.game.node.scenery.Scenery;
/**
* Fixes the half assed previous implementation of cooking Sinew.
* @author Woah
*/
public class SinewCookingPulse extends StandardCookingPulse {
public SinewCookingPulse(Player player, Scenery object, int initial, int product, int amount) {
super(player, object, initial, product, amount);
}
@Override
public boolean checkRequirements() {
properties = CookableItems.SINEW;
return super.checkRequirements();
}
@Override
public boolean isBurned(Player player, Scenery object, int food) {
return false;
}
@Override
public String getMessage(Item food, Item product, boolean burned) {
return "You dry a piece of beef and extract the sinew.";
}
}
@@ -32,6 +32,7 @@ public class StandardCookingPulse extends Pulse {
private Player player;
private double experience;
private boolean burned = false;
public CookableItems properties;
public StandardCookingPulse(Player player, Scenery object, int initial, int product, int amount) {
this.player = player;
@@ -43,6 +44,7 @@ public class StandardCookingPulse extends Pulse {
@Override
public void start() {
properties = CookableItems.forId(initial);
if (checkRequirements()) {
super.start();
cook(player, object, CookableItems.cookingMap.get(initial) != null && isBurned(player, object, initial), initial, product);
@@ -63,7 +65,6 @@ public class StandardCookingPulse extends Pulse {
}
public boolean checkRequirements() {
CookableItems properties = CookableItems.forId(initial);
this.level = 1;
this.experience = 0;
if (properties != null) {
@@ -214,11 +215,8 @@ public class StandardCookingPulse extends Pulse {
if (food.getId() == Items.RAW_OOMLIE_2337) {
return "The meat is far too delicate to cook like this. Perhaps you should wrap something around it to protect it from the heat.";
}
switch (product.getId()) {
case Items.SINEW_9436:
return "You dry the meat into sinew.";
case Items.SODA_ASH_1781:
return "You burn the seaweed into soda ash.";
if (product.getId() == Items.SODA_ASH_1781) {
return "You burn the seaweed into soda ash.";
}
if (CookableItems.intentionalBurn(food.getId())) {
return "You deliberately burn the perfectly good piece of meat.";
@@ -1,5 +1,6 @@
package core.game.node.entity.skill.firemaking;
import api.events.LitFireEvent;
import core.game.world.map.zone.ZoneBorders;
import core.game.content.quest.tutorials.tutorialisland.TutorialSession;
import core.game.content.quest.tutorials.tutorialisland.TutorialStage;
@@ -140,20 +141,8 @@ public final class FireMakingPulse extends SkillPulse<Item> {
int playerRegion = player.getViewport().getRegion().getId();
if (fire == Log.MAGIC && playerRegion == 10806) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,2, 5);
}
// Light a campfire from normal logs in Lumbridge Swamp
if (fire == Log.NORMAL && (playerRegion == 12593 || playerRegion == 12849)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 9);
}
// Light a willow log fire in Lumbridge Castle courtyard
if (fire == Log.WILLOW
&& new ZoneBorders(3216, 3207, 3225, 3233, 0).insideBorder(player)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 3);
}
setLastFire();
player.dispatch(new LitFireEvent(fire.getLogId()));
}
@Override
@@ -28,7 +28,7 @@ public enum Fish {
LOBSTER(new Item(377), 40, 90, 0.16, 0.375),
BASS(new Item(363), 46, 100, 0.078, 0.16),
SWORDFISH(new Item(371), 50, 100, 0.105, 0.191),
LAVA_EEL(new Item(2148), 53, 100, 0.227, 0.379),
LAVA_EEL(new Item(2148), 53, 30, 0.227, 0.379),
MONKFISH(new Item(7944), 62, 120, 0.293, 0.356),
KARAMBWAN(new Item(3142), 65, 105, 0.414, 0.629),
SHARK(new Item(383), 76, 110, 0.121, 0.16),
@@ -40,7 +40,7 @@ public class StringPulse extends SkillPulse<Item> {
@Override
public boolean checkRequirements() {
if (getDelay() == 1) {
setDelay(bow.string == 1777 ? 2 : 1);
setDelay(2);
}
if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) {
player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow.");
@@ -1,5 +1,6 @@
package core.game.node.entity.skill.gather.woodcutting;
import api.events.ResourceGatheredEvent;
import core.cache.def.impl.ItemDefinition;
import core.game.container.impl.EquipmentContainer;
import core.game.content.dialogue.FacialExpression;
@@ -159,6 +160,7 @@ public class WoodcuttingSkillPulse extends Pulse {
}
//give the reward
player.getInventory().add(new Item(reward, rewardAmount));
player.dispatch(new ResourceGatheredEvent(reward, rewardAmount, node));
int cutLogs = player.getAttribute(STATS_BASE + ":" + STATS_LOGS,0);
player.setAttribute("/save:" + STATS_BASE + ":" + STATS_LOGS,++cutLogs);
@@ -174,7 +176,6 @@ public class WoodcuttingSkillPulse extends Pulse {
}
}
applyAchievementTask(reward); // apply achievements
}
// Tutorial stuff, maybe?
if (tutorialStage == 7) {
@@ -261,55 +262,6 @@ public class WoodcuttingSkillPulse extends Pulse {
return reward;
}
/**
* Checks if the has completed any achievements from their diary
*/
private void applyAchievementTask(int reward) {
// Cut a log from a teak tree
if (reward == Items.TEAK_LOGS_6333) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 7);
}
// Cut a log from a mahogany tree
if (reward == Items.MAHOGANY_LOGS_6332) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 8);
}
int playerRegion = player.getViewport().getRegion().getId();
// Chop down a dying tree in the Lumber Yard
if (node.getId() == 24168 && playerRegion == 13110) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 6);
}
if (resource == WoodcuttingNode.YEW && playerRegion == 10806) {
if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 1)) {
player.setAttribute("/save:diary:seers:cut-yew", player.getAttribute("diary:seers:cut-yew", 0) + 1);
}
if (player.getAttribute("diary:seers:cut-yew", 0) >= 5) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 1);
}
}
/* if (resource.isFarming()) {
PatchWrapper tree = player.getFarmingManager().getPatchWrapper(node.getWrapper().getId());
if (node.getId() == 8389
&& node.getLocation().equals(3003, 3372, 0)
&& Trees.forNode(tree.getNode()) != null
&& (Trees.forNode(tree.getNode()) == Trees.YEW || Trees.forNode(tree.getNode()) == Trees.MAGIC)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 3);
}
}
*/
// Cut down a dead tree in Lumbridge Swamp
if (resource.name().toLowerCase().startsWith("dead") && (playerRegion == 12593 || playerRegion == 12849)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 8);
}
// Cut a willow tree, east of Lumbridge Castle
if (resource.name().toLowerCase().startsWith("willow") && playerRegion == 12850) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 6);
}
}
/**
* Checks if the player gets rewarded.
*
@@ -1,5 +1,7 @@
package core.game.node.entity.skill.magic;
import org.rs09.consts.Items;
import java.util.HashMap;
import java.util.Map;
@@ -12,7 +14,7 @@ public enum MagicStaff {
/**
* Represents the fire rune staves.
*/
FIRE_RUNE(554, 1387, 1393, 1401, 3053, 3055, 3056, 11736, 11738),
FIRE_RUNE(554, 1387, 1393, 1401, 3053, 3054, 3055, 3056, 11736, 11738),
/**
* Represents the water rune staves.
@@ -9,6 +9,7 @@ import core.game.world.map.Location;
import core.plugin.Initializable;
import rs09.game.node.entity.combat.CombatSwingHandler;
import rs09.game.node.entity.combat.handlers.MagicSwingHandler;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
/**
* Handles the aberrant spectre npc.
@@ -11,6 +11,7 @@ import rs09.game.node.entity.combat.handlers.MeleeSwingHandler;
import core.game.node.entity.impl.Animator.Priority;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
import rs09.game.world.GameWorld;
import core.game.world.map.Location;
import core.game.world.update.flag.context.Animation;
@@ -11,6 +11,7 @@ import core.game.node.entity.player.Player;
import core.game.world.map.Location;
import core.plugin.Initializable;
import core.tools.RandomFunction;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
/**
* Handles the Cave Horrors on Mos'le Harmless. You technically do not need a witchwood icon to fight them.
@@ -11,6 +11,7 @@ import rs09.game.node.entity.combat.handlers.MeleeSwingHandler;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.world.map.Location;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
/**
* Handles the dust devil npc.
@@ -43,7 +43,7 @@ public final class KuraskNPC extends AbstractNPC {
boolean effective = false;
if (state.getAttacker() instanceof Player) {
final Player player = (Player) state.getAttacker();
effective = new SlayerUtils(player).hasBroadWeaponEquipped(state);
effective = SlayerUtils.hasBroadWeaponEquipped(player, state);
}
if (!effective) {
state.setEstimatedHit(0);
@@ -218,9 +218,9 @@ public enum Master {
}
int npc_id,required_combat,required_slayer;
int[] assignment_range;
public int[] assignment_range;
int[] streakPoints;
List<Task> tasks;
public List<Task> tasks;
Master(int npc_id, int required_combat, int required_slayer, int[] assignment_range, int[] streakPoints, Task... tasks) {
this.npc_id = npc_id;
this.required_combat = required_combat;
@@ -251,11 +251,11 @@ public enum Master {
}
public static class Task{
Tasks task;
Integer weight;
public Tasks task;
public Integer weight;
Task(Tasks task, Integer weight){
this.task = task;
this.weight = weight;
}
}
}
}
@@ -5,6 +5,7 @@ import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState;
import rs09.game.node.entity.combat.handlers.MeleeSwingHandler;
import core.game.node.entity.player.Player;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
/**
* The swing handler for an npc that requires a mirror shield with its victim.
@@ -84,15 +84,6 @@ public final class SkeletalWyvernNPC extends AbstractNPC {
return COMBAT_HANDLER;
}
@Override
public void finalizeDeath(final Entity killer) {
super.finalizeDeath(killer);
if (killer instanceof Player) {
final Player player = killer.asPlayer();
player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 2, 8);
}
}
@Override
public int[] getIds() {
return Tasks.SKELETAL_WYVERN.getNpcs();
@@ -1,87 +0,0 @@
package core.game.node.entity.skill.slayer
import api.*
import api.EquipmentSlot
import core.game.node.entity.player.Player
import org.rs09.consts.Items
import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks
/**
* Represents a slayer equipment.
* @author Ceikry
*/
object SlayerEquipmentFlags {
val blackMasks = (Items.BLACK_MASK_10_8901..Items.BLACK_MASK_8921).map { it }.toIntArray()
val slayerItems = intArrayOf(Items.NOSE_PEG_4168, Items.EARMUFFS_4166, Items.FACE_MASK_4164, *blackMasks, Items.SPINY_HELMET_4551, Items.SLAYER_CAPET_9787, Items.SLAYER_CAPE_9786, Items.SLAYER_HELMET_13263, Items.WITCHWOOD_ICON_8923, Items.MIRROR_SHIELD_4156)
@JvmStatic
fun updateFlags(player: Player){
var flags = 0
if(SkillcapePerks.isActive(SkillcapePerks.TRICKS_OF_THE_TRADE,player) && getAttribute(player, "cape_perks:tott:helmet-stored", false)) flags = 0x3F
else if(hasItem(player, Items.SLAYER_HELMET_13263)) flags = 0x1F
else if(hasItem(player, Items.NOSE_PEG_4168)) flags = 1
else if(hasItem(player, Items.EARMUFFS_4166)) flags = flags or (1 shl 1)
else if(hasItem(player, Items.FACE_MASK_4164)) flags = flags or (1 shl 2)
else if((getItemFromEquipment(player, EquipmentSlot.HAT)?.id ?: 0) in blackMasks) flags = flags or (1 shl 3)
else if(hasItem(player, Items.SPINY_HELMET_4551)) flags = flags or (1 shl 4)
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
}
@JvmStatic
fun hasNosePeg(player: Player): Boolean{
return player.slayer.flags.equipmentFlags and 1 == 1
}
@JvmStatic
fun hasEarmuffs(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 1) and 1 == 1
}
@JvmStatic
fun hasFaceMask(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 2) and 1 == 1
}
@JvmStatic
fun hasBlackMask(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 3) and 1 == 1
}
@JvmStatic
fun hasSpinyHelmet(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 4) and 1 == 1
}
@JvmStatic
fun hasWitchwoodIcon(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 7) and 1 == 1
}
@JvmStatic
fun hasMirrorShield(player: Player): Boolean {
return (player.slayer.flags.equipmentFlags shr 8) and 1 == 1
}
@JvmStatic
fun getDamAccBonus(player: Player): Double {
val isCape = player.slayer.flags.equipmentFlags == 0x3F
val hasMask = hasBlackMask(player)
return if(isCape) 1.075
else if(hasMask) 1.15
else 1.0
}
private fun hasItem(player: Player, id: Int): Boolean{
return (getItemFromEquipment(player, EquipmentSlot.HAT)?.id ?: 0) == id
}
fun isSlayerEq(item: Int): Boolean{
return item in slayerItems
}
}
@@ -1,347 +0,0 @@
package core.game.node.entity.skill.slayer;
import core.cache.def.impl.NPCDefinition;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.node.entity.skill.Skills;
import core.tools.RandomFunction;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import rs09.game.node.entity.skill.slayer.SlayerFlags;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Manages the players slayer task.
* @author Vexia
*
*/
public final class SlayerManager {
/**
* The player instance.
*/
private final Player player;
/**
* The player's slayer flags
*/
public final SlayerFlags flags;
/**
* Constructs a new {@Code SlayerManager} {@Code Object}
* @param player The player.
*/
public SlayerManager(Player player) {
this.player = player;
this.flags = new SlayerFlags(player);
}
public void parse(JSONObject slayerData){
Object m = slayerData.get("master");
if(m != null) {
flags.setMaster(Master.forId(Integer.parseInt(m.toString())));
}
Object t = slayerData.get("taskId");
if(t != null)
flags.setTask(Tasks.values()[Integer.parseInt(t.toString())]);
Object a = slayerData.get("taskAmount");
if(a != null)
flags.setTaskAmount(Integer.parseInt(a.toString()));
Object points = slayerData.get("points");
if(points != null){
flags.setPoints(Integer.parseInt(points.toString()));
}
Object taskStreak = slayerData.get("taskStreak");
if(taskStreak != null){
flags.setTaskStreak(Integer.parseInt(taskStreak.toString()));
}
Object la = slayerData.get("learned_rewards");
if(la != null) {
JSONArray learnedArray = (JSONArray) slayerData.get("learned_rewards");
for (int i = 0; i < learnedArray.size(); i++) {
boolean unlocked = (boolean) learnedArray.get(i);
switch(i){
case 0:
if(unlocked) flags.unlockBroads();
break;
case 1:
if(unlocked) flags.unlockRing();
break;
case 2:
if(unlocked) flags.unlockHelm();
break;
default:
break;
}
}
}
JSONArray removedTasks = (JSONArray) slayerData.get("removedTasks");
if(removedTasks != null){
for(int i = 0; i < removedTasks.size(); i++){
flags.getRemoved().add(Tasks.values()[Integer.parseInt(removedTasks.get(i).toString())]);
}
}
Object completedTasks = slayerData.get("totalTasks").toString();
if(completedTasks != null) flags.setCompletedTasks(Integer.parseInt(completedTasks.toString()));
if(flags.getCompletedTasks() >= 4) flags.flagCanEarnPoints();
//New system parsing
if(slayerData.containsKey("equipmentFlags"))
flags.setEquipmentFlags(Integer.parseInt(slayerData.get("equipmentFlags").toString()));
if(slayerData.containsKey("taskFlags"))
flags.setTaskFlags(Integer.parseInt(slayerData.get("taskFlags").toString()));
if(slayerData.containsKey("rewardFlags"))
flags.setRewardFlags(Integer.parseInt(slayerData.get("rewardFlags").toString()));
}
/**
* Called when a hunted creature dies.
* @param player The player.
* @param npc The NPC. You're currently
*/
public void finalizeDeath(Player player, NPC npc) {
if(hasTask()) {
player.getSkills().addExperience(Skills.SLAYER, npc.getSkills().getMaximumLifepoints());
decrementAmount(1);
if(!hasTask()){
flags.setTaskStreak(flags.getTaskStreak() + 1);
flags.setCompletedTasks(flags.getCompletedTasks() + 1);
if ((flags.getCompletedTasks() > 4 || flags.canEarnPoints() ) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) {
int points = flags.getMaster().getTaskPoints()[0];
if (flags.getTaskStreak() % 50 == 0) {
points = flags.getMaster().getTaskPoints()[2];
} else if (flags.getTaskStreak() % 10 == 0) {
points = flags.getMaster().getTaskPoints()[1];
}
flags.incrementPoints(points);
if (flags.getPoints() > 64000) {
flags.setPoints(64000);
}
player.sendMessages("You've completed " + flags.getTaskStreak() + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(),"You have completed " + flags.getCompletedTasks() + " tasks in total. Return to a Slayer master.");
} else if(flags.getCompletedTasks() == 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.getCompletedTasks()) + " more task(s) to start gaining points.", "Return to a Slayer master.");
}
}
}
}
/**
* Assigns a task to the manager.
* @param task the task.
* @param master the master.
*/
public void assign(Tasks task, final Master master) {
setMaster(master);
setTask(task);
setAmount(getRandomAmount(master.assignment_range));
if (master == Master.DURADEL) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 8);
} else if (master == Master.VANNAKA) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 14);
}
getPlayer().varpManager.get(2502).setVarbit(0, flags.getTaskFlags() >> 4).send(player);
}
/**
* Method used to assign a new task for a player.
* @param master the master to give the task.
*/
public void generate(Master master) {
final List<Master.Task> tasks = new ArrayList<>(10);
final int[] taskWeightSum = {0};
master.tasks.stream().filter(task -> canBeAssigned(task.task) && task.task.combatCheck <= player.getProperties().getCurrentCombatLevel()).forEach(task -> {
taskWeightSum[0] += task.weight;
tasks.add(task);
});
Collections.shuffle(tasks, RandomFunction.RANDOM);
int rnd = RandomFunction.random(taskWeightSum[0]);
for(Master.Task task : tasks){
if(rnd < task.weight)
assign(task.task,master);
rnd -= task.weight;
}
}
public boolean canBeAssigned(Tasks task){
return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !flags.getRemoved().contains(task);
}
/**
* Clears the task.
*/
public void clear() {
setAmount(0);
}
/**
* Gets a random amount.
* @param ranges the ranges.
* @return the amt.
*/
private int getRandomAmount(int[] ranges) {
return RandomFunction.random(ranges[0], ranges[1]);
}
/**
* Gets the task name.
* @return the name.
*/
public String getTaskName() {
Tasks task = flags.getTask();
if (task.getNpcs() == null) {
return "no npcs report me";
}
if (task.getNpcs().length < 1) {
return "npc length too small report me";
}
return NPCDefinition.forId(task.getNpcs()[0]).getName().toLowerCase();
}
/**
* Gets the task.
* @return The task.
*/
public Tasks getTask() {
return flags.getTask();
}
/**
* Sets the task.
* @param task The task to set.
*/
public void setTask(Tasks task){
flags.setTask(task);
}
/**
* Gets the player.
* @return The player.
*/
public Player getPlayer() {
return player;
}
/**
* Gets the master.
* @return The master.
*/
public Master getMaster() {
return flags.getMaster();
}
/**
* Sets the master.
* @param master The master to set.
*/
public void setMaster(Master master) {
flags.setMaster(master);
}
/**
* Checks if a <b>Player</b> contains a task.
* @return {@code True} if so.
*/
public boolean hasTask() {
return getAmount() > 0;
}
/**
* Method used to check if the task is completed.
* @return <code>True</code> if so.
*/
public boolean isCompleted() {
return flags.getTaskAmount() <= 0;
}
/**
* Gets the amount.
* @return The amount.
*/
public int getAmount() {
return flags.getTaskAmount();
}
/**
* Sets the amount.
* @param amount The amount to set.
*/
public void setAmount(int amount) {
flags.setTaskAmount(amount);
}
/**
* Method used to decrement an amount.
* @param amount the amount.
*/
public void decrementAmount(int amount) {
flags.decrementTaskAmount(amount);
player.varpManager.get(2502).setVarbit(0, flags.getTaskFlags() >> 4).send(player);
}
/**
* Method used to check if the player has started slayer.
* @return {@code True} if so.
*/
public boolean hasStarted() {
return flags.getCompletedTasks() > 0 || flags.getTaskAmount() > 0;
}
/**
* Gets the slayerPoints.
* @return the slayerPoints.
*/
public int getSlayerPoints() {
return flags.getPoints();
}
/**
* Sets the slayerPoints.
* @param slayerPoints the slayerPoints to set
*/
public void setSlayerPoints(int slayerPoints) {
flags.setPoints(slayerPoints);
}
/**
* Gets the taskCount.
* @return the taskCount.
*/
public int getTaskCount() {
return flags.getTaskStreak();
}
/**
* Sets the taskCount.
* @param taskCount the taskCount to set
*/
public void setTaskCount(int taskCount) {
flags.setTaskStreak(taskCount);
}
/**
* Gets the removed.
* @return the removed.
*/
public List<Tasks> getRemoved() {
return flags.getRemoved();
}
public int getTotalTasks() {return flags.getCompletedTasks();}
public boolean isCanEarnPoints(){
return flags.canEarnPoints();
}
}
@@ -505,7 +505,7 @@ 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().setTaskCount(0);
player.getSlayer().flags.setTaskStreak(0);
player.getSlayer().generate(master);
if (player.getSlayer().getTask() == Tasks.JAD) {
interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad.");
@@ -43,7 +43,7 @@ public final class TurothNPC extends AbstractNPC {
boolean effective = false;
if (state.getAttacker() instanceof Player) {
final Player player = (Player) state.getAttacker();
effective = new SlayerUtils(player).hasBroadWeaponEquipped(state);
effective = SlayerUtils.hasBroadWeaponEquipped(player, state);
}
if (!effective) {
state.setEstimatedHit(0);
@@ -1,7 +1,7 @@
package core.game.node.entity.skill.slayer.dungeon;
import core.cache.def.impl.NPCDefinition;
import core.game.node.entity.skill.slayer.SlayerEquipmentFlags;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
import core.game.interaction.Option;
import core.game.node.Node;
import core.game.node.entity.Entity;
@@ -2,7 +2,7 @@ package core.game.node.entity.skill.slayer.dungeon;
import core.cache.def.impl.SceneryDefinition;
import core.game.component.Component;
import core.game.node.entity.skill.slayer.SlayerEquipmentFlags;
import rs09.game.node.entity.skill.slayer.SlayerEquipmentFlags;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.Entity;
@@ -18,8 +18,8 @@ public enum Stall {
SILK_STALL(new Integer[]{34383, 2560}, new Integer[] { 34381, 634 }, 20, new Item[]{new Item(950, 1)}, 24, 13,"silk"),
WINE_STALL(new Integer[]{2046}, new Integer[] { 634 }, 22, new Item[]{new Item(1935, 1), new Item(1937, 1), new Item(1993, 1), new Item(7919, 1)}, 27, 27,"wine"), //OBJECT MISSING IN CACHE
MARKET_SEED_STALL(new Integer[]{7053}, new Integer[] { 634 }, 27, new Item[]{new Item(5096, 1), new Item(5097, 1), new Item(5101, 1), new Item(5318, 1), new Item(5319, 1), new Item(5324, 1)}, 10, 19,"seeds"),
FUR_STALL(new Integer[]{34387, 2563}, new Integer[] { 34381, 634 }, 35, new Item[]{new Item(6814, 1), new Item(958, 1)}, 36, 25,"fur"),
FISH_STALL(new Integer[]{4277, 4705, 4707}, new Integer[] { 634 }, 42, new Item[]{new Item(331, 1), new Item(359, 1), new Item(377, 1)}, 42, 27,"fish"),
FUR_STALL(new Integer[]{ 34387, 2563, 4278}, new Integer[] { 34381, 634, 634 }, 35, new Item[]{new Item(6814, 1), new Item(958, 1)}, 36, 25,"fur"),
FISH_STALL(new Integer[]{ 4277, 4705, 4707 }, new Integer[] { 634, 634, 634 }, 42, new Item[]{new Item(331, 1), new Item(359, 1), new Item(377, 1)}, 42, 27,"fish"),
CROSSBOW_STALL(new Integer[]{17031}, new Integer[] { 6984 }, 49, new Item[]{new Item(877, 3), new Item(9420, 1), new Item(9440, 1)}, 52, 19,"equipment"),
SILVER_STALL(new Integer[]{2565, 6164, 34382}, new Integer[] { 634, 6984, 34381}, 50, new Item[]{new Item(442, 1)}, 54, 50,"jewellery"),
SPICE_STALL(new Integer[]{34386, 6166}, new Integer[] { 34381, 6984 }, 65, new Item[]{new Item(2007, 1)}, 81, 134,"spices"),
@@ -15,6 +15,8 @@ import core.game.world.update.flag.context.Animation;
import core.tools.RandomFunction;
import core.tools.StringUtils;
import static api.ContentAPIKt.*;
/**
* Represents the pulse used to thieve a stall.
* @author 'Vexia
@@ -70,6 +72,15 @@ public final class StallThiefPulse extends SkillPulse<Scenery> {
player.getPacketDispatch().sendMessage("You don't have enough inventory space.");
return false;
}
if (player.getLocation().isInRegion(10553) && !isQuestComplete(player, "Fremennik Trials") && stall.full_ids.contains(4278)) {
sendDialogue(player, "The fur trader is staring at you suspiciously. You cannot steal from his stall while he distrusts you.");
return false;
}
if (player.getLocation().isInRegion(10553) && !isQuestComplete(player, "Fremennik Trials") && stall.full_ids.contains(4277)) {
sendDialogue(player, "The fishmonger is staring at you suspiciously. You cannot steal from his stall while he distrusts you.");
return false;
}
return true;
}
@@ -100,7 +111,7 @@ public final class StallThiefPulse extends SkillPulse<Scenery> {
player.getSavedData().getGlobalData().setSilkSteal(System.currentTimeMillis() + 1800000);
}
if (node.isActive()) {
SceneryBuilder.replace(((Scenery) node), ((Scenery) node).transform(stall.getEmpty(node.getId())), stall.getDelay());
SceneryBuilder.replace(node, node.transform(stall.getEmpty(node.getId())), stall.getDelay());
}
final Item item = stall.getRandomLoot();
player.getInventory().add(item);
@@ -8,7 +8,6 @@ import core.game.interaction.Interaction;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.combat.equipment.DegradableEquipment;
import rs09.game.ge.OfferManager;
/**
* Represents an item.
@@ -8,7 +8,6 @@ import rs09.Server;
import rs09.ServerConstants;
import rs09.ServerStore;
import rs09.game.content.global.GlobalKillCounter;
import rs09.game.ge.OfferManager;
import rs09.game.system.SystemLogger;
import rs09.game.world.repository.Repository;
@@ -94,7 +93,6 @@ public final class SystemTermination {
Repository.getDisconnectionQueue().update();
GlobalKillCounter.save();
GrandExchangeDatabase.save();
OfferManager.save();
SystemLogger.flushLogs();
SystemLogger.logInfo("[SystemTerminator] Saved Grand Exchange databases!");
Repository.getDisconnectionQueue().clear();
@@ -287,6 +287,23 @@ public final class Location extends Node {
return locs;
}
/**
* Gets a square of 3 x 3 tiles as an ArrayList<Location>
*/
public ArrayList<Location> get3x3Tiles() {
ArrayList<Location> locs = new ArrayList<>();
locs.add(transform(0,0,0)); //Center
locs.add(transform(0,1,0)); //N
locs.add(transform(1,1,0)); //NE
locs.add(transform(1,0,0)); //E
locs.add(transform(1,-1,0)); //SE
locs.add(transform(0,-1,0)); //S
locs.add(transform(-1,-1,0));//SW
locs.add(transform(-1,0,0));//W
locs.add(transform(-1,1,0));//NW
return locs;
}
/**
* Gets the x position on the region chunk.
* @return The x position on the region chunk.
@@ -1,12 +1,10 @@
package core.game.world.map
import core.game.world.map.RegionManager
import core.game.world.map.RegionPlane
import core.game.node.scenery.Scenery
import core.game.node.Node
import core.game.node.entity.Entity
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.scenery.Scenery
import core.game.world.map.zone.ZoneBorders
import core.tools.RandomFunction
import rs09.game.system.SystemLogger
@@ -729,6 +727,27 @@ object RegionManager {
return players
}
/**
* Gets a list of local players.
* @param l The location.
* @param distance The distance to that location.
* @return The list of players.
*/
@JvmStatic
fun getLocalPlayersMaxNorm(l: Location, distance: Int): MutableList<Player> {
val players: MutableList<Player> = LinkedList()
for (regionX in ((l.regionX - 6) shr 3)..((l.regionX + 6) shr 3)) {
for (regionY in ((l.regionY - 6) shr 3)..((l.regionY + 6) shr 3)) {
for (player in forId((regionX shl 8) or regionY).planes[l.z].players) {
if (player.location.withinMaxnormDistance(l, distance)) {
players.add(player)
}
}
}
}
return players
}
/**
* Gets a list of local players within 16 tile distance of the location.
* @param l The location.
@@ -194,9 +194,6 @@ public final class WildernessZone extends MapZone {
if (e instanceof NPC) {
e.asNpc().getDefinition().getDropTables().drop(e.asNpc(), killer);
if (((NPC) e).getTask() != null && ((Player) killer).getSlayer().getTask() == e.asNpc().getTask()) {
((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), e.asNpc());
}
e.asNpc().setRespawnTick(GameWorld.getTicks() + e.asNpc().getDefinition().getConfiguration(NPCConfigParser.RESPAWN_DELAY, 17));
if (!e.asNpc().isRespawn()) {
e.asNpc().clear();
@@ -5,7 +5,6 @@ import core.game.node.entity.player.Player;
import core.gui.ConsoleFrame;
import core.gui.ConsoleTab;
import rs09.game.ge.GrandExchangeOffer;
import rs09.game.ge.OfferManager;
import javax.swing.*;
import java.awt.*;
@@ -142,12 +141,12 @@ public class GrandExchangeTab extends ConsoleTab {
JOptionPane.showMessageDialog(null, "Error! No player found.");
return;
}
for (GrandExchangeOffer o : player.getPlayerGrandExchange().getOffers()) {
/* for (GrandExchangeOffer o : player.getPlayerGrandExchange().getOfferRecords()) {
if (o == null) {
continue;
}
addOffer(o);
}
}*/
}
/**
@@ -161,12 +160,12 @@ public class GrandExchangeTab extends ConsoleTab {
} catch (NumberFormatException e) {
}
for (GrandExchangeOffer o : OfferManager.getOffersForItem(itemId)) {
/* for (GrandExchangeOffer o : OfferManager.getOffersForItem(itemId)) {
if (o == null) {
continue;
}
addOffer(o);
}
}*/
}
/**
@@ -184,8 +183,8 @@ public class GrandExchangeTab extends ConsoleTab {
JOptionPane.showMessageDialog(null, "Error! No data in DB yet. Press load.");
return;
}
for (GrandExchangeOffer offer : OfferManager.getOFFER_MAPPING().values()) {
/* for (GrandExchangeOffer offer : OfferManager.getOFFER_MAPPING().values()) {
model.addElement(offer);
}
}*/
}
}
@@ -33,6 +33,9 @@ public final class ExaminePacket implements IncomingPacket {
player.debug("Object id: " + id + ", models: " + (d.getModelIds() != null ? Arrays.toString(d.getModelIds()) : null) + ", anim: " + d.animationId + ", config: " + (d.getVarbitID() != -1 ? d.getVarbitID() + " (file)" : d.getConfigId()) + ".");
player.debug("Varp config index: " + VarbitDefinition.forObjectID(d.getVarbitID()).getConfigId());
player.getPacketDispatch().sendMessage(""+name+"");
/*if {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection("LandscapeParser.removeGameObject(new GameObject("+coords+"));//"+ d.getName() ), null);
}*/
break;
case 235:
case 92: // Item examine
@@ -1,8 +1,14 @@
package core.net.packet.in;
import api.ContentAPIKt;
import core.game.ge.GrandExchangeDatabase;
import core.game.ge.GrandExchangeEntry;
import core.game.node.entity.player.Player;
import core.net.packet.IncomingPacket;
import core.net.packet.IoBuffer;
import rs09.game.ge.GrandExchange;
import rs09.game.ge.GrandExchangeOffer;
import rs09.game.interaction.inter.ge.StockMarket;
/**
* Represents the <b>Incoming</b> packet of the grand exchange.
@@ -13,7 +19,23 @@ public class GrandExchangePacket implements IncomingPacket {
@Override
public void decode(Player player, int opcode, IoBuffer buffer) {
int itemId = buffer.getShort();
player.getPlayerGrandExchange().constructBuy(itemId);
GrandExchangeOffer offer = player.getAttribute("ge-temp", new GrandExchangeOffer());
int index = player.getAttribute("ge-index", -1);
offer.setItemID(itemId);
offer.setSell(false);
GrandExchangeEntry entry = GrandExchangeDatabase.getDatabase().get(itemId);
if(entry == null || !ContentAPIKt.itemDefinition(itemId).isTradeable())
{
ContentAPIKt.sendMessage(player, "That item is blacklisted from the grand exchange.");
return;
}
offer.setPlayer(player);
offer.setAmount(1);
offer.setOfferedValue(GrandExchange.getRecommendedPrice(itemId, false));
offer.setIndex(index);
StockMarket.updateVarbits(player, offer, index, false);
player.setAttribute("ge-temp",offer);
player.getPacketDispatch().sendString(GrandExchange.getOfferStats(itemId, false), 105, 142);
player.getInterfaceManager().closeChatbox();
}
@@ -1,5 +1,6 @@
package core.net.packet.in;
import api.events.InteractionEvent;
import core.cache.def.impl.SceneryDefinition;
import core.cache.def.impl.VarbitDefinition;
import core.game.content.quest.PluginInteractionManager;
@@ -29,6 +30,7 @@ import rs09.game.world.repository.Repository;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.function.IntPredicate;
/**
@@ -25,6 +25,7 @@ public class DatabaseManager {
public DatabaseManager connect() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://" + db.host() + "/" + db.name() + "?useTimezone=true&serverTimezone=UTC", db.username(), db.password());
connections.put(db.name(), connection);
@@ -37,6 +38,8 @@ public class DatabaseManager {
SystemLogger.logErr("Couldn't connect to the database.");
e.printStackTrace();
ServerConstants.MYSQL = false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return this;
}