From b372d5e963201555767740569ebd9b0a355060fe Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 25 Aug 2025 10:55:37 -0600 Subject: [PATCH] Players can now freely swap between unlocked spellbooks with the magic interface sort buttons. The "Level Order" button is the Modern spellbook, "Combat First" is Ancient, and "Teleports first" is Lunar. This makes the ability to swap spellbooks with the Mage's book obsolete, so that feature has been removed. --- .../handlers/iface/MagicBookInterface.java | 38 ++++++++ .../handlers/item/SnowscapeMagesBook.kt | 91 ------------------- 2 files changed, 38 insertions(+), 91 deletions(-) delete mode 100644 Server/src/main/content/global/handlers/item/SnowscapeMagesBook.kt diff --git a/Server/src/main/content/global/handlers/iface/MagicBookInterface.java b/Server/src/main/content/global/handlers/iface/MagicBookInterface.java index af5c87baa..6832efb43 100644 --- a/Server/src/main/content/global/handlers/iface/MagicBookInterface.java +++ b/Server/src/main/content/global/handlers/iface/MagicBookInterface.java @@ -14,6 +14,9 @@ import core.game.node.entity.player.link.SpellBookManager.SpellBook; import core.game.world.GameWorld; import core.plugin.Plugin; +import content.data.Quests; +import static core.api.ContentAPIKt.hasRequirement; + /** * Represents the magic book interface handling of non-combat spells. * @author 'Vexia @@ -42,9 +45,44 @@ public final class MagicBookInterface extends ComponentPlugin { ? SpellBook.ANCIENT : SpellBook.LUNAR; + // Snowscape: Allow switching between unlocked spellbooks with the magic interface sort buttons + if (spellBook == SpellBook.MODERN) { + if (button == 65 && swapSpellBook(player, SpellBook.ANCIENT)) { + return true; + } else if (button == 66 && swapSpellBook(player, SpellBook.LUNAR)) { + return true; + } + } else if (spellBook == SpellBook.ANCIENT) { + if (button == 29 && swapSpellBook(player, SpellBook.MODERN)) { + return true; + } else if (button == 31 && swapSpellBook(player, SpellBook.LUNAR)) { + return true; + } + } else if (spellBook == SpellBook.LUNAR) { + if (button == 40 && swapSpellBook(player, SpellBook.MODERN)) { + return true; + } else if (button == 41 && swapSpellBook(player, SpellBook.ANCIENT)) { + return true; + } + } + + SpellListeners.run(button, SpellListener.NONE, SpellUtils.getBookFromInterface(component.getId()),player,null); boolean result = MagicSpell.castSpell(player, spellBook, button, player); return result; } + + // Snowscape custom function + private boolean swapSpellBook(final Player player, SpellBook spellBook) { + if (spellBook == SpellBook.ANCIENT && !hasRequirement(player, Quests.DESERT_TREASURE)) { + return false; + } else if (spellBook == SpellBook.LUNAR && !hasRequirement(player, Quests.LUNAR_DIPLOMACY)) { + return false; + } + player.getSpellBookManager().setSpellBook(spellBook); + player.getSpellBookManager().update(player); + return true; + } } + diff --git a/Server/src/main/content/global/handlers/item/SnowscapeMagesBook.kt b/Server/src/main/content/global/handlers/item/SnowscapeMagesBook.kt deleted file mode 100644 index 886d0a3a0..000000000 --- a/Server/src/main/content/global/handlers/item/SnowscapeMagesBook.kt +++ /dev/null @@ -1,91 +0,0 @@ -package content.global.handlers.item - -import core.api.* -import core.game.node.Node -import core.game.node.entity.player.Player -import core.game.node.entity.player.link.SpellBookManager.SpellBook -//import core.game.node.item.Item -import core.game.interaction.InteractionListener -import core.game.interaction.IntType -import core.game.world.update.flag.context.Animation -import core.game.world.update.flag.context.Graphics -import core.game.dialogue.* -import core.tools.START_DIALOGUE -import org.rs09.consts.Items -import org.rs09.consts.Sounds -import org.rs09.consts.Scenery -import org.rs09.consts.Animations -import content.data.Quests - -//import core.game.component.Component - -/** - * Listener for the Mage's Book from Mage Training Arena. The other spellbooks can be inscribed into the book by using it on the respective altar. - * Operate the book to switch to spellbooks that have been added. - * - */ -class SnowscapeMagesBook : InteractionListener { - - - override fun defineListeners() { - on(Items.MAGES_BOOK_6889, IntType.ITEM, "operate") { player, node -> - if (player.inCombat()) { - player.sendMessage("You cannot concentrate on the book during combat.") - } else { - player.animate(Animation(6299)) - player.graphics(Graphics(1062)) - openDialogue(player, SnowscapeMagesBookDialogue()) - } - return@on true - } - - val altars = intArrayOf(Scenery.ALTAR_6552,Scenery.ALTAR_17010) - - onUseWith(IntType.SCENERY, Items.MAGES_BOOK_6889, *altars) { player, used, with -> - val ancient = (with.getId() == Scenery.ALTAR_6552) - val quest = if (ancient) Quests.DESERT_TREASURE else Quests.LUNAR_DIPLOMACY - val attribute = if (ancient) "/save:snowscape:magesbook:2" else "/save:snowscape:magesbook:3" - - if (hasRequirement(player, quest)){ - setAttribute(player, attribute, true) - sendDialogue(player, "You carefully focus on the magic in the altar, and inscribe it into the book.") - playAudio(player, Sounds.LUNAR_STAT_SPY_3620) - playAudio(player, Sounds.LUNAR_STAT_SPY_IMPACT_3621) - animate(player, Animations.LUNAR_SPELLBOOK_STATSPY_6293) - } - return@onUseWith true - } - } -} - - - - -class SnowscapeMagesBookDialogue : DialogueFile() { - - - override fun handle(componentID: Int, buttonID: Int) { - when (stage) { - START_DIALOGUE -> options("Modern","Ancient","Lunar").also {stage++} - - 1 -> { - end() - if (player == null) return - // This is ordered a little strange, but checking the quest comes first so that access to the spellbook is lost when the quest is released, until it's completed. - if (buttonID == 2 && !hasRequirement(player!!, Quests.DESERT_TREASURE)) return - if (buttonID == 3 && !hasRequirement(player!!, Quests.LUNAR_DIPLOMACY)) return - if (buttonID > 1 && !getAttribute(player!!, "snowscape:magesbook:$buttonID", false)) { - val altarDescription = if (buttonID == 2) "altar in the Pyramid" else "Astral altar" - sendDialogue(player!!, "The book does not contain the knowledge of those spells. Use the book on the $altarDescription to inscribe it.") - return - } - player!!.spellBookManager.setSpellBook(SpellBook.values()[buttonID - 1]) - player!!.spellBookManager.update(player!!) - playAudio(player!!, Sounds.PRAYER_RECHARGE_2674) - sendMessage(player!!, "You retrieve the inscribed knowledge and let it fill your mind.") - - } - - } - } -}