Refactored item note/unnote on bank booth handling
QoL - only applies to bank booth, not banker NPCs Added server config world.bank_booth_note_enabled (enabled by default) to toggle the QoL globally Added server config world.bank_booth_note_uim (enabled by default) to toggle the QoL on ultimate ironmen only
This commit is contained in:
@@ -1,114 +0,0 @@
|
|||||||
package core.game.interaction.item.withobject;
|
|
||||||
|
|
||||||
import core.game.interaction.NodeUsageEvent;
|
|
||||||
import core.game.interaction.UseWithHandler;
|
|
||||||
import core.game.node.Node;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
import core.game.node.entity.player.link.IronmanMode;
|
|
||||||
import core.game.node.item.Item;
|
|
||||||
import core.game.world.map.Direction;
|
|
||||||
import core.game.world.map.Location;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.plugin.Plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the unnoting of noted items when used on a bank booth.
|
|
||||||
* @author Vexia
|
|
||||||
* @author Splinter
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public class BankUnnotePlugin extends UseWithHandler {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The bank booth ids.
|
|
||||||
*/
|
|
||||||
private static final int[] BOOTHS = new int[] { 2213, 3194, 5276, 6084, 10517, 11338, 11402, 11758, 12309, 12798, 14367, 16700, 18491, 19230, 20325, 20391, 22819, 24914, 25808, 26972, 27663, 28514, 29085, 30016, 34752, 35647, 36786 };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The banker ids,
|
|
||||||
*/
|
|
||||||
private static final int[] BANKERS = new int[] { 44, 45, 494, 495, 496, 497, 498, 499, 953, 1036, 1360, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 3198, 3199, 3824, 5258, 5260, 5776, 5777, 5912, 5913, 6200, 6532, 6533, 6534, 6535, 6538, 7445, 7446, 7605 };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@Code BankUnnotePlugin} {@Code Object}
|
|
||||||
*/
|
|
||||||
public BankUnnotePlugin() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
|
||||||
for (int id : BOOTHS) {
|
|
||||||
addHandler(id, OBJECT_TYPE, this);
|
|
||||||
}
|
|
||||||
for (int id : BANKERS) {
|
|
||||||
addHandler(id, NPC_TYPE, this);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(NodeUsageEvent event) {
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
final Item item = event.getUsedItem();
|
|
||||||
if (!player.isAdmin() && (player.getIronmanManager().getMode() == IronmanMode.NONE || item.getDefinition().isUnnoted())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (item.getDefinition().isStackable() && item.getDefinition().isUnnoted()) {
|
|
||||||
player.getPacketDispatch().sendMessage("You can't note stackable items.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
int amount = item.getAmount();
|
|
||||||
if (amount > player.getInventory().freeSlots()) {
|
|
||||||
amount = 28 - player.getInventory().freeSlots();
|
|
||||||
}
|
|
||||||
if (amount < 1 || player.getInventory().freeSlots() <= 0) {
|
|
||||||
player.sendMessage("Not enough inventory space.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (player.getInventory().freeSlots() >= amount) {
|
|
||||||
if (player.getInventory().remove(new Item(item.getId(), amount))) {
|
|
||||||
Item newItem = new Item(item.getNoteChange(), amount);
|
|
||||||
player.getInventory().add(newItem);
|
|
||||||
player.getDialogueInterpreter().sendItemMessage(newItem, "You exchange your noted items.");
|
|
||||||
player.lock(1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int toAdd = player.getInventory().freeSlots();
|
|
||||||
if (player.getInventory().remove(new Item(item.getId(), toAdd))) {
|
|
||||||
Item newItem = new Item(item.getNoteChange(), toAdd);
|
|
||||||
player.getInventory().add(newItem);
|
|
||||||
player.getDialogueInterpreter().sendItemMessage(newItem, "You exchange your noted items.");
|
|
||||||
player.lock(1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Location getDestination(Player player, Node with) {
|
|
||||||
if (with instanceof NPC) {
|
|
||||||
NPC npc = (NPC) with;
|
|
||||||
if (npc.getAttribute("facing_booth", false)) {
|
|
||||||
Direction dir = npc.getDirection();
|
|
||||||
return npc.getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0);
|
|
||||||
}
|
|
||||||
if (npc.getId() == 6533) {
|
|
||||||
return Location.create(3167, 3490, 0);// ge bankers.
|
|
||||||
} else if (npc.getId() == 6535) {
|
|
||||||
return Location.create(3162, 3489, 0);
|
|
||||||
} else if (npc.getId() == 4907) {
|
|
||||||
return npc.getLocation().transform(0, -2, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isDynamic() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -16,7 +16,6 @@ import core.net.packet.PacketRepository;
|
|||||||
import core.net.packet.context.PlayerContext;
|
import core.net.packet.context.PlayerContext;
|
||||||
import core.net.packet.out.ClearMinimapFlag;
|
import core.net.packet.out.ClearMinimapFlag;
|
||||||
import org.rs09.consts.Items;
|
import org.rs09.consts.Items;
|
||||||
import rs09.game.interaction.ItemOnBankBooth;
|
|
||||||
import rs09.game.interaction.InteractionListeners;
|
import rs09.game.interaction.InteractionListeners;
|
||||||
import rs09.game.node.entity.skill.farming.CompostBins;
|
import rs09.game.node.entity.skill.farming.CompostBins;
|
||||||
import rs09.game.node.entity.skill.farming.FarmingPatch;
|
import rs09.game.node.entity.skill.farming.FarmingPatch;
|
||||||
@@ -234,10 +233,7 @@ public class ItemActionPacket implements IncomingPacket {
|
|||||||
if(PluginInteractionManager.handle(player,event)){
|
if(PluginInteractionManager.handle(player,event)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(object.getName().toLowerCase().contains("bank booth")){
|
|
||||||
new ItemOnBankBooth().handle(event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
UseWithHandler.run(event);
|
UseWithHandler.run(event);
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
|
|||||||
@@ -113,6 +113,12 @@ class ServerConstants {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var BANK_BOOTH_QUICK_OPEN: Boolean = false
|
var BANK_BOOTH_QUICK_OPEN: Boolean = false
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
var BANK_BOOTH_NOTE_ENABLED: Boolean = true
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
var BANK_BOOTH_NOTE_UIM: Boolean = true
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
var GE_AUTOSAVE_FREQUENCY = secondsToTicks(3600) //1 hour
|
var GE_AUTOSAVE_FREQUENCY = secondsToTicks(3600) //1 hour
|
||||||
|
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
package rs09.game.interaction
|
|
||||||
|
|
||||||
import core.game.interaction.DestinationFlag
|
|
||||||
import core.game.interaction.MovementPulse
|
|
||||||
import core.game.interaction.NodeUsageEvent
|
|
||||||
import core.game.interaction.UseWithHandler
|
|
||||||
import core.game.node.item.Item
|
|
||||||
import core.plugin.Plugin
|
|
||||||
|
|
||||||
class ItemOnBankBooth : UseWithHandler(0) {
|
|
||||||
|
|
||||||
override fun handle(event: NodeUsageEvent?): Boolean {
|
|
||||||
event ?: return false
|
|
||||||
val player = event.player
|
|
||||||
player.pulseManager.run(object : MovementPulse(player, event.usedWith, DestinationFlag.OBJECT) {
|
|
||||||
override fun pulse(): Boolean {
|
|
||||||
return handleNote(event)
|
|
||||||
}
|
|
||||||
}, "movement")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun handleNote(event: NodeUsageEvent?): Boolean {
|
|
||||||
event ?: return false
|
|
||||||
val item = event.usedItem
|
|
||||||
val player = event.player
|
|
||||||
if (item.noteChange != item.id) {
|
|
||||||
if (item.definition.isUnnoted) {
|
|
||||||
val amount = player.inventory.getAmount(item.id)
|
|
||||||
player.inventory.remove(Item(item.id, amount))
|
|
||||||
player.inventory.add(Item(item.noteChange, amount))
|
|
||||||
} else {
|
|
||||||
var amount = item.amount
|
|
||||||
if (amount > player.inventory.freeSlots()) {
|
|
||||||
amount = player.inventory.freeSlots()
|
|
||||||
}
|
|
||||||
player.inventory.remove(Item(item.id, amount))
|
|
||||||
player.inventory.add(Item(item.noteChange, amount))
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
player.sendMessage("This item can't be noted.")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun newInstance(arg: Any?): Plugin<Any> {
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun nodeAllowed(nodeId: Int): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
package rs09.game.interaction.`object`
|
package rs09.game.interaction.`object`
|
||||||
|
|
||||||
import api.openDialogue
|
import api.*
|
||||||
import core.game.content.dialogue.DialogueInterpreter
|
import core.game.content.dialogue.DialogueInterpreter
|
||||||
import core.game.node.Node
|
import core.game.node.Node
|
||||||
import core.game.node.entity.npc.NPC
|
import core.game.node.entity.npc.NPC
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
import core.game.node.entity.player.link.IronmanMode
|
import core.game.node.entity.player.link.IronmanMode
|
||||||
|
import core.game.node.item.Item
|
||||||
import core.game.world.map.Direction
|
import core.game.world.map.Direction
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
import org.rs09.consts.NPCs
|
import org.rs09.consts.NPCs
|
||||||
@@ -127,9 +128,51 @@ class BankBoothHandler : InteractionListener {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun attemptToConvertItems(player: Player, used: Node, with: Node): Boolean {
|
||||||
|
if (!ServerConstants.BANK_BOOTH_NOTE_UIM && player.ironmanManager.checkRestriction(IronmanMode.ULTIMATE)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BankerNPC.checkLunarIsleRestriction(player, with)) {
|
||||||
|
tryInvokeBankerDialogue(player, with)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
val item = used as Item
|
||||||
|
|
||||||
|
if (item.noteChange != item.id) {
|
||||||
|
if (item.definition.isUnnoted) {
|
||||||
|
val amount = amountInInventory(player, item.id)
|
||||||
|
if (removeItem(player, Item(item.id, amount))) {
|
||||||
|
addItem(player, item.noteChange, amount)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var amount = item.amount
|
||||||
|
val freeSlotCount = freeSlots(player)
|
||||||
|
|
||||||
|
if (amount > freeSlotCount) {
|
||||||
|
amount = freeSlotCount
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removeItem(player, Item(item.id, amount))) {
|
||||||
|
addItem(player, item.noteChange, amount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMessage(player, "This item can't be noted.")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
override fun defineListeners() {
|
override fun defineListeners() {
|
||||||
on(BANK_BOOTHS, SCENERY, "use-quickly", "bank", handler = ::quickBankBoothUse)
|
on(BANK_BOOTHS, SCENERY, "use-quickly", "bank", handler = ::quickBankBoothUse)
|
||||||
on(BANK_BOOTHS, SCENERY, "use", handler = ::regularBankBoothUse)
|
on(BANK_BOOTHS, SCENERY, "use", handler = ::regularBankBoothUse)
|
||||||
on(BANK_BOOTHS, SCENERY, "collect", handler = ::collectBankBoothUse)
|
on(BANK_BOOTHS, SCENERY, "collect", handler = ::collectBankBoothUse)
|
||||||
|
|
||||||
|
if (ServerConstants.BANK_BOOTH_NOTE_ENABLED) {
|
||||||
|
onUseAnyWith(SCENERY, *BANK_BOOTHS, handler = ::attemptToConvertItems)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,6 +118,8 @@ object ServerConfigParser {
|
|||||||
ServerConstants.PRELOAD_MAP = data.getBoolean("server.preload_map", false)
|
ServerConstants.PRELOAD_MAP = data.getBoolean("server.preload_map", false)
|
||||||
ServerConstants.REVENANT_POPULATION = data.getLong("world.revenant_population", 30L).toInt()
|
ServerConstants.REVENANT_POPULATION = data.getLong("world.revenant_population", 30L).toInt()
|
||||||
ServerConstants.BANK_BOOTH_QUICK_OPEN = data.getBoolean("world.bank_booth_quick_open", false)
|
ServerConstants.BANK_BOOTH_QUICK_OPEN = data.getBoolean("world.bank_booth_quick_open", false)
|
||||||
|
ServerConstants.BANK_BOOTH_NOTE_ENABLED = data.getBoolean("world.bank_booth_note_enabled", true)
|
||||||
|
ServerConstants.BANK_BOOTH_NOTE_UIM = data.getBoolean("world.bank_booth_note_uim", true)
|
||||||
ServerConstants.DISCORD_GE_WEBHOOK = data.getString("server.discord_webhook", "")
|
ServerConstants.DISCORD_GE_WEBHOOK = data.getString("server.discord_webhook", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user