Refactored bank logic

Removed some unnecessary complexity from bank logic
Improved handling of banking actions
Now correctly tracks the active bank tab
This commit is contained in:
Ceikry
2024-05-31 11:38:00 +00:00
committed by Ryan
parent 082d3a561b
commit 52cf984540
3 changed files with 80 additions and 150 deletions
@@ -1,15 +1,15 @@
package content.global.handlers.iface.bank package content.global.handlers.iface.bank
import content.global.dialogue.BankDepositDialogue
import content.global.dialogue.BankHelpDialogue
import core.ServerConstants
import core.api.* import core.api.*
import core.game.component.Component import core.game.component.Component
import core.game.container.Container import core.game.container.Container
import core.game.interaction.InterfaceListener
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import org.rs09.consts.Components import org.rs09.consts.Components
import org.rs09.consts.Items import org.rs09.consts.Items
import core.ServerConstants
import content.global.dialogue.BankDepositDialogue
import content.global.dialogue.BankHelpDialogue
import core.game.interaction.InterfaceListener
/** /**
* Allows the user to interact with the Bank Interface. * Allows the user to interact with the Bank Interface.
@@ -58,8 +58,6 @@ class BankInterface : InterfaceListener {
} }
private fun onBankInterfaceOpen(player: Player, component: Component): Boolean { private fun onBankInterfaceOpen(player: Player, component: Component): Boolean {
player.bank.sendBankSpace()
val settings = IfaceSettingsBuilder() val settings = IfaceSettingsBuilder()
.enableAllOptions() .enableAllOptions()
.enableSlotSwitch() .enableSlotSwitch()
@@ -74,14 +72,12 @@ class BankInterface : InterfaceListener {
ServerConstants.BANK_SIZE ServerConstants.BANK_SIZE
) )
resetSearch(player)
return false return false
} }
private fun handleTabInteraction(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean { private fun handleTabInteraction(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
if (getAttribute(player, "search", false)) { resetSearch(player)
player.bank.reopen()
}
val clickedTabIndex = -((buttonID - 41) / 2) val clickedTabIndex = -((buttonID - 41) / 2)
when (opcode) { when (opcode) {
@@ -102,36 +98,16 @@ class BankInterface : InterfaceListener {
private fun handleBankMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean { private fun handleBankMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
val item = player.bank.get(slot) val item = player.bank.get(slot)
?: return true ?: return true
resetSearch(player)
when (opcode) { when (opcode) {
OP_AMOUNT_ONE -> runWorldTask { player.bank.takeItem(slot, 1) } OP_AMOUNT_ONE -> player.bank.takeItem(slot, 1)
OP_AMOUNT_FIVE -> runWorldTask { player.bank.takeItem(slot, 5) } OP_AMOUNT_FIVE -> player.bank.takeItem(slot, 5)
OP_AMOUNT_TEN -> runWorldTask { player.bank.takeItem(slot, 10) } OP_AMOUNT_TEN -> player.bank.takeItem(slot, 10)
OP_AMOUNT_LAST_X -> runWorldTask { OP_AMOUNT_LAST_X -> player.bank.takeItem(slot, player.bank.lastAmountX)
player.bank.takeItem( OP_AMOUNT_X -> BankUtils.transferX(player, slot, true)
slot, OP_AMOUNT_ALL -> player.bank.takeItem(slot, player.bank.getAmount(item))
player.bank.lastAmountX OP_AMOUNT_ALL_BUT_ONE -> player.bank.takeItem(slot, player.bank.getAmount(item) - 1)
)
}
OP_AMOUNT_X -> runWorldTask {
BankUtils.transferX(
player,
slot,
true
)
}
OP_AMOUNT_ALL -> runWorldTask {
player.bank.takeItem(
slot,
player.bank.getAmount(item)
)
}
OP_AMOUNT_ALL_BUT_ONE -> runWorldTask {
player.bank.takeItem(
slot,
player.bank.getAmount(item) - 1
)
}
OP_EXAMINE -> { OP_EXAMINE -> {
var examineText = item.definition.examine var examineText = item.definition.examine
val id = item.definition.id val id = item.definition.id
@@ -150,6 +126,7 @@ class BankInterface : InterfaceListener {
private fun handleInventoryMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean { private fun handleInventoryMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
val item = player.inventory.get(slot) val item = player.inventory.get(slot)
?: return true ?: return true
resetSearch(player)
when (opcode) { when (opcode) {
OP_AMOUNT_ONE -> player.bank.addItem(slot, 1) OP_AMOUNT_ONE -> player.bank.addItem(slot, 1)
@@ -211,4 +188,11 @@ class BankInterface : InterfaceListener {
return false return false
} }
private fun resetSearch (player: Player)
{
val lastTab = getAttribute(player, "bank:lasttab", 0)
player.bank.tabIndex = lastTab
setVarc(player, 190, 1) //re-enable "Search" right-click option on search button.
}
} }
+45 -42
View File
@@ -1,36 +1,61 @@
package core.api package core.api
import com.moandjiezana.toml.Toml import com.moandjiezana.toml.Toml
import content.data.consumables.*
import content.data.skill.SkillingTool
import content.global.handlers.iface.ge.StockMarket
import content.global.skill.slayer.SlayerManager
import content.global.skill.slayer.Tasks
import content.global.skill.summoning.familiar.BurdenBeast
import core.ServerConstants
import core.api.utils.GlobalKillCounter
import core.api.utils.Vector
import core.cache.def.impl.AnimationDefinition
import core.cache.def.impl.ItemDefinition import core.cache.def.impl.ItemDefinition
import core.cache.def.impl.SceneryDefinition import core.cache.def.impl.SceneryDefinition
import core.cache.def.impl.VarbitDefinition import core.cache.def.impl.VarbitDefinition
import core.game.activity.Cutscene
import core.game.component.Component import core.game.component.Component
import core.game.consumable.*
import core.game.container.impl.EquipmentContainer import core.game.container.impl.EquipmentContainer
import core.game.dialogue.DialogueFile
import core.game.dialogue.SkillDialogueHandler
import core.game.ge.GrandExchangeRecords
import core.game.interaction.*
import core.game.node.Node import core.game.node.Node
import core.game.node.entity.Entity import core.game.node.entity.Entity
import core.game.node.entity.combat.CombatSwingHandler
import core.game.node.entity.combat.ImpactHandler import core.game.node.entity.combat.ImpactHandler
import core.game.node.entity.impl.Animator import core.game.node.entity.impl.Animator
import core.game.node.entity.impl.ForceMovement import core.game.node.entity.impl.ForceMovement
import core.game.node.entity.impl.Projectile import core.game.node.entity.impl.Projectile
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.info.LogType
import core.game.node.entity.player.info.PlayerMonitor
import core.game.node.entity.player.link.HintIconManager import core.game.node.entity.player.link.HintIconManager
import core.game.node.entity.player.link.IronmanMode import core.game.node.entity.player.link.IronmanMode
import core.game.node.entity.player.link.TeleportManager import core.game.node.entity.player.link.TeleportManager
import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.player.link.audio.Audio
import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.emote.Emotes
import core.game.node.entity.player.link.quest.QuestRepository
import core.game.node.entity.player.link.prayer.PrayerType import core.game.node.entity.player.link.prayer.PrayerType
import core.game.node.entity.player.link.quest.Quest
import core.game.node.entity.player.link.quest.QuestRepository
import core.game.node.entity.skill.Skills import core.game.node.entity.skill.Skills
import content.data.skill.SkillingTool
import content.global.skill.slayer.Tasks
import content.global.skill.summoning.familiar.BurdenBeast
import core.game.node.item.GroundItem import core.game.node.item.GroundItem
import core.game.node.item.GroundItemManager import core.game.node.item.GroundItemManager
import core.game.node.item.Item import core.game.node.item.Item
import core.game.node.scenery.Scenery import core.game.node.scenery.Scenery
import core.game.node.scenery.SceneryBuilder import core.game.node.scenery.SceneryBuilder
import core.game.requirement.*
import core.game.shops.Shops
import core.game.system.config.ItemConfigParser
import core.game.system.config.ServerConfigParser
import core.game.system.task.Pulse import core.game.system.task.Pulse
import core.game.system.timer.*
import core.game.system.timer.impl.*
import core.game.world.GameWorld
import core.game.world.GameWorld.Pulser
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 core.game.world.map.RegionManager import core.game.world.map.RegionManager
@@ -39,48 +64,21 @@ import core.game.world.map.path.Pathfinder
import core.game.world.map.zone.MapZone import core.game.world.map.zone.MapZone
import core.game.world.map.zone.ZoneBorders import core.game.world.map.zone.ZoneBorders
import core.game.world.map.zone.ZoneBuilder import core.game.world.map.zone.ZoneBuilder
import core.game.world.repository.Repository
import core.game.world.update.flag.*
import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag
import core.game.world.update.flag.context.*
import core.net.packet.PacketRepository
import core.net.packet.context.DefaultContext
import core.net.packet.context.MusicContext
import core.net.packet.out.AudioPacket
import core.net.packet.out.MusicPacket
import core.tools.*
import org.rs09.consts.Items import org.rs09.consts.Items
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import core.game.dialogue.DialogueFile
import core.game.dialogue.SkillDialogueHandler
import core.api.utils.GlobalKillCounter
import core.game.shops.Shops
import core.game.ge.GrandExchangeRecords
import core.game.interaction.InteractionListeners
import content.global.handlers.iface.ge.StockMarket
import content.global.skill.slayer.SlayerManager
import content.data.consumables.*
import core.game.activity.Cutscene
import core.game.interaction.*
import core.game.node.entity.player.info.LogType
import core.game.node.entity.player.info.PlayerMonitor
import core.tools.SystemLogger
import core.game.system.config.ItemConfigParser
import core.game.system.config.ServerConfigParser
import core.game.world.GameWorld
import core.game.world.GameWorld.Pulser
import core.game.world.repository.Repository
import core.game.consumable.*
import core.ServerConstants
import core.api.utils.Vector
import core.cache.def.impl.AnimationDefinition
import core.game.node.entity.player.link.quest.Quest
import core.tools.*
import core.game.world.update.flag.*
import core.game.world.update.flag.context.*
import core.game.requirement.*
import core.net.packet.PacketRepository
import core.net.packet.context.MusicContext
import core.net.packet.out.MusicPacket
import core.game.system.timer.*
import core.game.system.timer.impl.*
import core.game.node.entity.combat.CombatSwingHandler
import core.net.packet.context.DefaultContext
import core.net.packet.out.AudioPacket
import org.rs09.consts.Sounds import org.rs09.consts.Sounds
import java.util.regex.*
import java.io.* import java.io.*
import java.util.regex.*
import kotlin.math.* import kotlin.math.*
/** /**
@@ -1271,6 +1269,11 @@ fun setVarbit (player: Player, varbitId: Int, value: Int, save: Boolean = false)
setVarbit (player, def, value, save) setVarbit (player, def, value, save)
} }
fun setVarc (player: Player, varc: Int, value: Int)
{
player.packetDispatch.sendVarcUpdate(varc.toShort(), value)
}
fun reinitVarps (player: Player) { fun reinitVarps (player: Player) {
for ((index, value) in player.varpMap) { for ((index, value) in player.varpMap) {
setVarp(player, index, value, player.saveVarp[index] ?: false) setVarp(player, index, value, player.saveVarp[index] ?: false)
@@ -2068,7 +2071,7 @@ fun dumpContainer(player: Player, container: core.game.container.Container): Int
} }
container.remove(item) container.remove(item)
bank.add(unnote(item)) bank.add(unnote(item), false)
dumpedCount++ dumpedCount++
} }
} }
@@ -131,13 +131,10 @@ public final class BankContainer extends Container {
super.refresh(); super.refresh();
player.getInventory().getListeners().add(listener); player.getInventory().getListeners().add(listener);
player.getInventory().refresh(); player.getInventory().refresh();
setVarp(player, 1249, lastAmountX); setVarp(player, 1249, lastAmountX);
int settings = new IfaceSettingsBuilder().enableOptions(new IntRange(0, 5)).enableExamine().enableSlotSwitch().build(); int settings = new IfaceSettingsBuilder().enableOptions(new IntRange(0, 5)).enableExamine().enableSlotSwitch().build();
player.getPacketDispatch().sendIfaceSettings(settings, 0, 763, 0, 27); player.getPacketDispatch().sendIfaceSettings(settings, 0, 763, 0, 27);
player.getPacketDispatch().sendRunScript(1451, "");
open = true; open = true;
setTabConfigurations();
sendBankSpace();
} }
public void open(Player player) { public void open(Player player) {
@@ -165,8 +162,7 @@ public final class BankContainer extends Container {
player.getPacketDispatch().sendIfaceSettings(settings, 0, 763, 0, 27); player.getPacketDispatch().sendIfaceSettings(settings, 0, 763, 0, 27);
player.getPacketDispatch().sendRunScript(1451, ""); player.getPacketDispatch().sendRunScript(1451, "");
open = true; open = true;
this.player.getBank().setTabConfigurations(player);
} }
@Override @Override
@@ -250,21 +246,8 @@ public final class BankContainer extends Container {
increaseTabStartSlots(tabIndex); increaseTabStartSlots(tabIndex);
} }
super.add(add, true, preferredSlot); super.add(add, true, preferredSlot);
setTabConfigurations();
} }
} }
/**
* Re-opens the bank interface.
*/
public void reopen() {
if (!open) {
return;
}
player.getInterfaceManager().close();
open();
refresh();
}
/** /**
* Takes a item from the bank container and adds one to the inventory * Takes a item from the bank container and adds one to the inventory
@@ -302,15 +285,11 @@ public final class BankContainer extends Container {
if (super.remove(item, slot, false)) { if (super.remove(item, slot, false)) {
player.getInventory().add(add); player.getInventory().add(add);
} }
int tabId = getTabByItemSlot(slot);
if (get(slot) == null) { if (get(slot) == null) {
int tabId = getTabByItemSlot(slot);
decreaseTabStartSlots(tabId); decreaseTabStartSlots(tabId);
} shift();
setTabConfigurations(); } else update();
shift();
if (player.getAttribute("search", false)) {
reopen();
}
} }
/** /**
@@ -386,8 +365,7 @@ public final class BankContainer extends Container {
* Sends the bank space values on the interface. * Sends the bank space values on the interface.
*/ */
public void sendBankSpace() { public void sendBankSpace() {
player.getPacketDispatch().sendString(Integer.toString(capacity() - freeSlots()), 762, 97); setVarc(player, 192, capacity() - freeSlots());
player.getPacketDispatch().sendString(Integer.toString(capacity()), 762, 98);
} }
/** /**
@@ -411,47 +389,17 @@ public final class BankContainer extends Container {
replace(tempTabItems[i], slot, false); replace(tempTabItems[i], slot, false);
} }
refresh(); //We only refresh once. refresh(); //We only refresh once.
setTabConfigurations();
} }
/** /**
* Sets the tab configs. * Sets the tab configs.
*/ */
public void setTabConfigurations() { public void setTabConfigurations() {
int value = getItemsInTab(1); for (int i = 0; i < 8; i++) {
value += getItemsInTab(2) << 10; setVarbit(player, 4885 + i, getItemsInTab(i + 1));
value += getItemsInTab(3) << 20; }
setVarp(player, 1246, value);
value = getItemsInTab(4);
value += getItemsInTab(5) << 10;
value += getItemsInTab(6) << 20;
setVarp(player, 1247, value);
value = -2013265920;
value += (134217728 * (tabIndex == 10 ? 0 : tabIndex));
value += getItemsInTab(7);
value += getItemsInTab(8) << 10;
setVarp(player, 1248, value);
} }
/**
* Sets the tab configs.
*/
public void setTabConfigurations(Player player) {
int value = getItemsInTab(1);
value += getItemsInTab(2) << 10;
value += getItemsInTab(3) << 20;
setVarp(player, 1246, value);
value = getItemsInTab(4);
value += getItemsInTab(5) << 10;
value += getItemsInTab(6) << 20;
setVarp(player, 1247, value);
value = -2013265920;
value += (134217728 * (tabIndex == 10 ? 0 : tabIndex));
value += getItemsInTab(7);
value += getItemsInTab(8) << 10;
setVarp(player, 1248, value);
}
/** /**
* Gets the amount of items in one tab. * Gets the amount of items in one tab.
* @param tabId The tab index. * @param tabId The tab index.
@@ -515,14 +463,9 @@ public final class BankContainer extends Container {
* @param tabIndex The tabIndex to set. * @param tabIndex The tabIndex to set.
*/ */
public void setTabIndex(int tabIndex) { public void setTabIndex(int tabIndex) {
this.tabIndex = tabIndex; this.tabIndex = tabIndex == 0 ? 10 : tabIndex;
setVarbit(player, 4893, tabIndex + 1);
/* setAttribute(player, "bank:lasttab", tabIndex);
* Kludge to update the interface
* after dumping all to prevent
* "invisible" items in slots.
*/
update(true);
} }
/** /**