Unified and reimplemented various banker dialogues

Accessibility to second bank is now locked behind server config toggle second_bank
Eniola, Arnold Lydspor, and Emerald Benedict now offer access to second bank
Locked the backported ability to charge our ring of wealth with GE teleports behind server config toggle ring_of_wealth_teleport
Corrected enchant spells to always yield uncharged dragonstone items, rather than fully charged ones
Fixed inauthentic jewellery UI
Locked the availability of our inauthentic player commands behind server config toggle player_commands. Admins are immune to this and still always have all commands available. Note that this includes ::confirmrules, so be sure not to set your server to show rules and info, but not allow commands
This commit is contained in:
Player Name 2025-11-25 12:56:41 +00:00 committed by Ryan
parent 78f1c58b4e
commit 1fa2d3460f
20 changed files with 468 additions and 1014 deletions

View file

@ -20,7 +20,7 @@ import org.rs09.consts.Sounds
import java.util.* import java.util.*
/** /**
* Represents an enchanted jewellery. * Represents a piece of enchanted jewellery.
* @author Vexia, downthecrop, Player Name * @author Vexia, downthecrop, Player Name
*/ */
enum class EnchantedJewellery( enum class EnchantedJewellery(

View file

@ -1,181 +0,0 @@
package content.global.dialogue
import core.api.*
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.IronmanMode
import core.plugin.Initializable
import core.game.dialogue.IfTopic
import core.game.dialogue.Topic
import content.global.handlers.npc.BankerNPC
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
@Initializable
class BankerDialogue(player: Player? = null) : core.game.dialogue.DialoguePlugin(player) {
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
START_DIALOGUE -> when {
hasIronmanRestriction(player, IronmanMode.ULTIMATE) -> {
npcl(
core.game.dialogue.FacialExpression.ANNOYED,
"My apologies, dear ${if (player.isMale) "sir" else "madam"}, " +
"our services are not available for Ultimate ${if (player.isMale) "Ironmen" else "Ironwomen"}"
).also { stage = END_DIALOGUE }
}
else -> {
npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Good day, how may I help you?"
).also {
if (hasAwaitingGrandExchangeCollections(player)) {
stage++
} else {
stage += 2
}
}
}
}
1 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Before we go any further, I should inform you that you " +
"have items ready for collection from the Grand Exchange."
).also { stage++ }
2 -> showTopics(
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to access my bank account, please.", 10),
IfTopic(
core.game.dialogue.FacialExpression.FRIENDLY,
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
13,
hasActivatedSecondaryBankAccount(player)
),
IfTopic(
core.game.dialogue.FacialExpression.FRIENDLY,
"I'd like to open a secondary bank account.",
20,
!hasActivatedSecondaryBankAccount(player)
),
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to check my PIN settings.", 11),
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to collect items.", 12),
Topic(core.game.dialogue.FacialExpression.ASKING, "What is this place?", 3),
)
3 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"This is a branch of the Bank of Gielinor. We have branches in many towns."
).also { stage++ }
4 -> playerl(
core.game.dialogue.FacialExpression.ASKING,
"And what do you do?"
).also { stage++ }
5 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"We will look after your items and money for you. " +
"Leave your valuables with us if you want to keep them safe."
).also { stage = END_DIALOGUE }
10 -> {
openBankAccount(player)
end()
}
11 -> {
openBankPinSettings(player)
end()
}
12 -> {
openGrandExchangeCollectionBox(player)
end()
}
13 -> {
toggleBankAccount(player)
npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Your active bank account has been switched. " +
"You can now access your ${getBankAccountName(player)} account."
).also { stage = 2 }
}
20 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Certainly. We offer secondary accounts to all our customers."
).also { stage++ }
21 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"The secondary account comes with a standard fee of 5,000,000 coins. The fee is non-refundable " +
"and account activation is permanent."
).also { stage++ }
22 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"If your inventory does not contain enough money to cover the costs, we will complement " +
"the amount with the money inside your primary bank account."
).also { stage++ }
23 -> npcl(
core.game.dialogue.FacialExpression.ASKING,
"Knowing all this, would you like to proceed with opening your secondary bank account?"
).also { stage++ }
24 -> showTopics(
Topic(core.game.dialogue.FacialExpression.HAPPY, "Yes, I am still interested.", 25),
Topic(core.game.dialogue.FacialExpression.ANNOYED, "Actually, I've changed my mind.", 26)
)
25 -> {
when (activateSecondaryBankAccount(player)) {
SecondaryBankAccountActivationResult.ALREADY_ACTIVE -> {
npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Your bank account was already activated, there is no need to pay twice."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.INTERNAL_FAILURE -> {
npcl(
core.game.dialogue.FacialExpression.ANNOYED,
"I must apologize, the transaction was not successful. Please check your " +
"primary bank account and your inventory - if there's money missing, please " +
"screenshot your chat box and contact the game developers."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.NOT_ENOUGH_MONEY -> {
npcl(
core.game.dialogue.FacialExpression.ANNOYED,
"It appears that you do not have the money necessary to cover the costs " +
"associated with opening a secondary bank account. I will be waiting here " +
"until you do."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.SUCCESS -> {
npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Your secondary bank account has been opened and can be accessed through any " +
"of the Bank of Gielinor's employees. Thank you for choosing our services."
).also { stage = END_DIALOGUE }
}
}
}
26 -> npcl(
core.game.dialogue.FacialExpression.FRIENDLY,
"Very well. Should you decide a secondary bank account is needed, do not hesitate to " +
"contact any of the Bank of Gielinor's stationary employees. We will be happy to help."
).also { stage = END_DIALOGUE }
}
return true
}
override fun getIds(): IntArray = BankerNPC.NPC_IDS
}

View file

@ -1,14 +1,19 @@
package content.global.handlers.item package content.global.handlers.item
import core.ServerConstants
import core.api.* import core.api.*
import core.game.interaction.IntType import core.game.interaction.IntType
import core.game.interaction.InteractionListener import core.game.interaction.InteractionListener
import core.game.interaction.QueueStrength import core.game.interaction.QueueStrength
import core.game.node.entity.player.info.LogType
import core.game.node.entity.player.info.PlayerMonitor
import core.game.node.item.Item
import core.game.world.update.flag.context.Animation
import org.rs09.consts.Animations
import org.rs09.consts.Items import org.rs09.consts.Items
import org.rs09.consts.Sounds import org.rs09.consts.Sounds
class EnchantJewelleryTabListener : InteractionListener { class EnchantJewelleryTabListener : InteractionListener {
private val LVL_1_ENCHANT = mapOf( private val LVL_1_ENCHANT = mapOf(
Items.SAPPHIRE_RING_1637 to Items.RING_OF_RECOIL_2550, Items.SAPPHIRE_RING_1637 to Items.RING_OF_RECOIL_2550,
Items.SAPPHIRE_NECKLACE_1656 to Items.GAMES_NECKLACE8_3853, Items.SAPPHIRE_NECKLACE_1656 to Items.GAMES_NECKLACE8_3853,
@ -21,65 +26,69 @@ class EnchantJewelleryTabListener : InteractionListener {
Items.EMERALD_AMULET_1696 to Items.AMULET_OF_DEFENCE_1729, Items.EMERALD_AMULET_1696 to Items.AMULET_OF_DEFENCE_1729,
Items.EMERALD_BRACELET_11076 to Items.CASTLEWAR_BRACE3_11079 Items.EMERALD_BRACELET_11076 to Items.CASTLEWAR_BRACE3_11079
) )
private val LVL_3_ENCHANT = mapOf( private val LVL_3_ENCHANT = mapOf(
Items.RUBY_RING_1641 to Items.RING_OF_FORGING_2568, Items.RUBY_RING_1641 to Items.RING_OF_FORGING_2568,
Items.RUBY_NECKLACE_1660 to Items.DIGSITE_PENDANT_5_11194, Items.RUBY_NECKLACE_1660 to Items.DIGSITE_PENDANT_5_11194,
Items.RUBY_AMULET_1698 to Items.AMULET_OF_STRENGTH_1725, Items.RUBY_AMULET_1698 to Items.AMULET_OF_STRENGTH_1725,
Items.RUBY_BRACELET_11085 to Items.INOCULATION_BRACE_11088 Items.RUBY_BRACELET_11085 to Items.INOCULATION_BRACE_11088
) )
private val LVL_4_ENCHANT = mapOf( private val LVL_4_ENCHANT = mapOf(
Items.DIAMOND_RING_1643 to Items.RING_OF_LIFE_2570, Items.DIAMOND_RING_1643 to Items.RING_OF_LIFE_2570,
Items.DIAMOND_NECKLACE_1662 to Items.PHOENIX_NECKLACE_11090, Items.DIAMOND_NECKLACE_1662 to Items.PHOENIX_NECKLACE_11090,
Items.DIAMOND_AMULET_1700 to Items.AMULET_OF_POWER_1731, Items.DIAMOND_AMULET_1700 to Items.AMULET_OF_POWER_1731,
Items.DIAMOND_BRACELET_11092 to Items.FORINTHRY_BRACE5_11095 Items.DIAMOND_BRACELET_11092 to Items.FORINTHRY_BRACE5_11095
) )
private val LVL_5_ENCHANT = mapOf( private val LVL_5_ENCHANT = mapOf(
Items.DRAGONSTONE_RING_1645 to Items.RING_OF_WEALTH4_14646, Items.DRAGONSTONE_RING_1645 to Items.RING_OF_WEALTH_2572,
Items.DRAGON_NECKLACE_1664 to Items.SKILLS_NECKLACE4_11105, Items.DRAGON_NECKLACE_1664 to Items.SKILLS_NECKLACE_11113,
Items.DRAGONSTONE_AMMY_1702 to Items.AMULET_OF_GLORY4_1712, Items.DRAGONSTONE_AMMY_1702 to Items.AMULET_OF_GLORY_1704,
Items.DRAGON_BRACELET_11115 to Items.COMBAT_BRACELET4_11118 Items.DRAGON_BRACELET_11115 to Items.COMBAT_BRACELET_11126
) )
private val LVL_6_ENCHANT = mapOf( private val LVL_6_ENCHANT = mapOf(
Items.ONYX_RING_6575 to Items.RING_OF_STONE_6583, Items.ONYX_RING_6575 to Items.RING_OF_STONE_6583,
Items.ONYX_NECKLACE_6577 to Items.BERSERKER_NECKLACE_11128, Items.ONYX_NECKLACE_6577 to Items.BERSERKER_NECKLACE_11128,
Items.ONYX_AMULET_6581 to Items.AMULET_OF_FURY_6585, Items.ONYX_AMULET_6581 to Items.AMULET_OF_FURY_6585,
Items.ONYX_BRACELET_11130 to Items.REGEN_BRACELET_11133 Items.ONYX_BRACELET_11130 to Items.REGEN_BRACELET_11133
) )
private val TAB_MAPPING = arrayOf(
Pair(Items.ENCHANT_SAPPHIRE_8016, LVL_1_ENCHANT),
Pair(Items.ENCHANT_EMERALD_8017, LVL_2_ENCHANT),
Pair(Items.ENCHANT_RUBY_8018, LVL_3_ENCHANT),
Pair(Items.ENCHANT_DIAMOND_8019, LVL_4_ENCHANT),
Pair(Items.ENCHANT_DRAGONSTN_8020, LVL_5_ENCHANT),
Pair(Items.ENCHANT_ONYX_8021, LVL_6_ENCHANT)
)
override fun defineListeners() { override fun defineListeners() {
on(IntType.ITEM, "break") {player, node -> for ((tablet, mapping) in TAB_MAPPING) {
on(tablet, IntType.ITEM, "break") { player, _ ->
sendMessage(player, "Try using the tablet on the item instead.") //TODO authentic message
return@on true
}
for ((unenchanted, enchanted) in mapping) {
onUseWith(IntType.ITEM, tablet, unenchanted) { player, tabItem, node ->
var product = enchanted
if (product == Items.RING_OF_WEALTH_2572 && ServerConstants.RING_OF_WEALTH_TELEPORT) {
product = Items.RING_OF_WEALTH_14638
}
if (removeItem(player, Item(tabItem.id))) {
closeAllInterfaces(player) closeAllInterfaces(player)
delayEntity(player, 1)
queueScript(player, strength = QueueStrength.SOFT) {
val items = when (node.id) {
8016 -> LVL_1_ENCHANT //Sapphire
8017 -> LVL_2_ENCHANT
8018 -> LVL_3_ENCHANT
8019 -> LVL_4_ENCHANT
8020 -> LVL_5_ENCHANT
8021 -> LVL_6_ENCHANT
else -> return@queueScript stopExecuting(player)
}
if (inInventory(player, node.id)) {
for (item in player.inventory.toArray()) {
if (item == null) continue
val product = items[item.id] ?: continue
if (removeItem(player, node.id) && (removeItem(player, item.id)) && addItem(player, product)) {
playAudio(player, Sounds.POH_TABLET_BREAK_979) playAudio(player, Sounds.POH_TABLET_BREAK_979)
animate(player, 4069, true) val anim = Animation(Animations.POH_TABLET_BREAK_4069)
break animate(player, anim, true)
} delayEntity(player, anim.duration)
} queueScript(player, anim.duration, QueueStrength.SOFT) {
val item = node.asItem()
val ret = replaceSlot(player, item.slot, Item(product), item)
if (ret != item) {
PlayerMonitor.log(player, LogType.DUPE_ALERT, "Unknown slot-replacement problem when enchanting jewellery (adding $product replaced $ret rather than $item)")
} }
return@queueScript stopExecuting(player) return@queueScript stopExecuting(player)
} }
return@on true }
return@onUseWith true
}
}
} }
} }
} }

View file

@ -1,38 +1,33 @@
package content.global.handlers.npc package content.global.handlers.npc
import content.global.handlers.scenery.BankBoothListener
import core.ServerConstants
import core.api.* import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
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.npc.AbstractNPC import core.game.node.entity.npc.AbstractNPC
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.world.map.Direction import core.game.world.map.Direction
import core.game.world.map.Location import core.game.world.map.Location
import core.plugin.Initializable import core.plugin.Initializable
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import core.game.interaction.InteractionListener
import core.game.interaction.IntType
import content.global.handlers.scenery.BankBoothListener
/** /**
* Provides dialogue tree for all generic banker NPCs as well as * Provides dialogue tree for all generic banker NPCs as well as
* handles all the common interactions like 'bank' and 'collect'. * handles all the common interactions like 'bank' and 'collect'.
* *
* @author vddCore * @author vddCore
* @author Player Name
*/ */
@Initializable @Initializable
class BankerNPC : AbstractNPC, InteractionListener { class BankerNPC : AbstractNPC, InteractionListener {
companion object {
private const val LUNAR_ISLE_BANK_REGION = 8253
val SPECIAL_NPC_IDS = intArrayOf(
NPCs.SIRSAL_BANKER_4519, NPCs.FADLI_958, NPCs.BANK_TUTOR_4907, NPCs.JADE_4296,
NPCs.OGRESS_BANKER_7049, NPCs.OGRESS_BANKER_7050, NPCs.ARNOLD_LYDSPOR_3824,
/* Maximillian Sackville - Near Wilderness bounty-hunter area. */
NPCs.BANKER_6538
)
val NPC_IDS = intArrayOf( val NPC_IDS = intArrayOf(
NPCs.BANKER_44, NPCs.BANKER_45, NPCs.BANKER_494, NPCs.BANKER_495, NPCs.BANKER_496, NPCs.BANKER_497, NPCs.BANKER_44, NPCs.BANKER_45, NPCs.BANKER_494, NPCs.BANKER_495, NPCs.BANKER_496, NPCs.BANKER_497,
NPCs.BANKER_498, NPCs.BANKER_499, NPCs.BANKER_1036, NPCs.BANKER_1360, NPCs.BANKER_2163, NPCs.BANKER_2164, NPCs.BANKER_498, NPCs.BANKER_499, NPCs.BANKER_1036, NPCs.BANKER_1360, NPCs.BANKER_2163, NPCs.BANKER_2164,
@ -41,22 +36,19 @@ class BankerNPC : AbstractNPC, InteractionListener {
NPCs.BANKER_5777, NPCs.BANKER_5912, NPCs.BANKER_5913, NPCs.BANKER_6200, NPCs.BANKER_6532, NPCs.BANKER_6533, NPCs.BANKER_5777, NPCs.BANKER_5912, NPCs.BANKER_5913, NPCs.BANKER_6200, NPCs.BANKER_6532, NPCs.BANKER_6533,
NPCs.BANKER_6534, NPCs.BANKER_6535, NPCs.BANKER_7445, NPCs.BANKER_7446, NPCs.BANKER_7605, NPCs.BANKER_6534, NPCs.BANKER_6535, NPCs.BANKER_7445, NPCs.BANKER_7446, NPCs.BANKER_7605,
NPCs.GUNDAI_902, NPCs.GUNDAI_902,
NPCs.GHOST_BANKER_1702, NPCs.GNOME_BANKER_166, NPCs.NARDAH_BANKER_3046, NPCs.MAGNUS_GRAM_5488, NPCs.TZHAAR_KET_ZUH_2619, NPCs.GHOST_BANKER_1702, NPCs.GNOME_BANKER_166, NPCs.NARDAH_BANKER_3046, NPCs.MAGNUS_GRAM_5488, NPCs.TZHAAR_KET_ZUH_2619,
NPCs.SIRSAL_BANKER_4519, NPCs.FADLI_958, NPCs.BANK_TUTOR_4907, NPCs.JADE_4296,
NPCs.OGRESS_BANKER_7049, NPCs.OGRESS_BANKER_7050,
NPCs.BANKER_6538
) )
private val ALL_BANKER_NPC_IDS = intArrayOf( companion object {
*SPECIAL_NPC_IDS, private const val LUNAR_ISLE_BANK_REGION = 8253
*NPC_IDS
)
/** /**
* This is poorly named, but performs a few checks to see if the player * This is poorly named, but performs a few checks to see if the player
* is trying to access the bank on the Lunar Isle and returns a boolean * is trying to access the bank on the Lunar Isle and returns a boolean
* controlling whether or not to pass the quick bank or collection use. * controlling whether or not to pass the quick bank or collection use.
*
* TODO
* The location of this method is shit too. Find a better place for it?
*/ */
fun checkLunarIsleRestriction(player: Player, node: Node): Boolean { fun checkLunarIsleRestriction(player: Player, node: Node): Boolean {
if (node.location.regionId != LUNAR_ISLE_BANK_REGION) if (node.location.regionId != LUNAR_ISLE_BANK_REGION)
@ -121,37 +113,35 @@ class BankerNPC : AbstractNPC, InteractionListener {
private fun provideDestinationOverride(entity: Entity, node: Node): Location { private fun provideDestinationOverride(entity: Entity, node: Node): Location {
val npc = node as NPC val npc = node as NPC
return when(npc.id) { return when(npc.id) {
/* Ogress bankers are 2x2 with their spawn being offset to south-western tile. */ /* Ogress bankers are 2x2 with their spawn being offset to south-western tile. */
NPCs.OGRESS_BANKER_7049, NPCs.OGRESS_BANKER_7049, NPCs.OGRESS_BANKER_7050 -> npc.location.transform(3, 1, 0)
NPCs.OGRESS_BANKER_7050 -> npc.location.transform(3, 1, 0)
NPCs.BANKER_6532, NPCs.BANKER_6533,
NPCs.BANKER_6534, NPCs.BANKER_6535 -> npc.location.transform(npc.direction, 1)
/* Magnus has no bank booth nearby so we need to handle that edge case here. */ /* Magnus has no bank booth nearby so we need to handle that edge case here. */
NPCs.MAGNUS_GRAM_5488 -> npc.location.transform(Direction.NORTH, 2) NPCs.MAGNUS_GRAM_5488 -> npc.location.transform(Direction.NORTH, 2)
/* Special-cased NPCs, idk why */
NPCs.BANKER_6532, NPCs.BANKER_6533, NPCs.BANKER_6534, NPCs.BANKER_6535 -> npc.location.transform(npc.direction, 1)
else -> { else -> {
if (npc is BankerNPC) { if (npc is BankerNPC) {
npc.findAdjacentBankBoothLocation()?.let { npc.findAdjacentBankBoothLocation()?.let {
return it.second return it.second
} }
} }
return npc.location return npc.location
} }
} }
} }
override fun defineListeners() { override fun defineListeners() {
on(ALL_BANKER_NPC_IDS, IntType.NPC, "bank", handler = Companion::attemptBank) on(NPC_IDS, IntType.NPC, "bank", handler = Companion::attemptBank)
on(ALL_BANKER_NPC_IDS, IntType.NPC, "collect", handler = Companion::attemptCollect) on(NPC_IDS, IntType.NPC, "collect", handler = Companion::attemptCollect)
on(NPC_IDS, IntType.NPC, "talk-to") { player, node ->
DialogueLabeller.open(player, BankerDialogueLabellerFile(), node as NPC)
return@on true
}
} }
override fun defineDestinationOverrides() { override fun defineDestinationOverrides() {
setDest(IntType.NPC, ALL_BANKER_NPC_IDS, "bank", "collect", "talk-to", handler = ::provideDestinationOverride) setDest(IntType.NPC, NPC_IDS, "bank", "collect", "talk-to", handler = ::provideDestinationOverride)
} }
override fun init() { override fun init() {
@ -167,5 +157,167 @@ class BankerNPC : AbstractNPC, InteractionListener {
} }
} }
override fun getIds(): IntArray = ALL_BANKER_NPC_IDS class BankerDialogueLabellerFile : DialogueLabeller() {
val BANKERS_WITH_EXTRA_OPTION = intArrayOf(NPCs.BANK_TUTOR_4907, NPCs.JADE_4296, NPCs.BANKER_6538)
override fun addConversation() {
exec { player, npc ->
if (npc.id == NPCs.SIRSAL_BANKER_4519 && !hasSealOfPassage(player)) {
loadLabel(player, "no seal of passage")
}
if (hasIronmanRestriction(player, IronmanMode.ULTIMATE)) {
if (npc.id == NPCs.JADE_4296) loadLabel(player, "uim for jade")
loadLabel(player, "uim")
}
if (npc.id == NPCs.JADE_4296) loadLabel(player, "hello for jade")
loadLabel(player, "hello")
}
label("no seal of passage")
npc(ChatAnim.ANNOYED, "What are you doing here, Fremennik?!")
player(ChatAnim.WORRIED, "I have a Seal of Pass...")
npc(ChatAnim.ANGRY, "No you don't! Begone!")
// todo: kick them out, but only one of the two banker types should do so (see historical wiki)
goto("nowhere")
label("uim for jade")
npc(ChatAnim.ANNOYED, "Greetings, warrior. I wish I could help you, but our services are not available for Ultimate Iron@g[men,women].")
goto("nowhere")
label("uim")
npc(ChatAnim.ANNOYED, "My apologies, dear @g[sir,madam], our services are not available for Ultimate Iron@g[men,women]")
goto("nowhere")
label("hello for jade")
npc("Greetings warrior, how may I help you?")
exec { player, _ -> loadLabel(player, if (hasAwaitingGrandExchangeCollections(player)) "ge collect" else "main options") }
label("hello")
npc("Good day, would you like to access your bank account?")
exec { player, _ -> loadLabel(player, if (hasAwaitingGrandExchangeCollections(player)) "ge collect" else "main options") }
label("ge collect")
npc("Before we go any further, I should inform you that you have items ready for collection from the Grand Exchange.")
goto("main options")
label("main options")
options(
DialogueOption("how to use", "How do I use the bank?") { _, npc -> return@DialogueOption npc.id == NPCs.BANK_TUTOR_4907 },
DialogueOption("who is the bounty hunter banker", "Who are you?") { _, npc -> return@DialogueOption npc.id == NPCs.BANKER_6538 },
DialogueOption("access", "I'd like to access my bank account please.", expression = ChatAnim.ASKING),
DialogueOption("buy second bank", "I'd like to open a secondary bank account.") { player, _ -> return@DialogueOption ServerConstants.SECOND_BANK && !hasActivatedSecondaryBankAccount(player) },
DialogueOption("switch second bank", "I'd like to switch to my primary bank account.") { player, _ -> return@DialogueOption hasActivatedSecondaryBankAccount(player) && isUsingSecondaryBankAccount(player) },
DialogueOption("switch second bank", "I'd like to switch to my secondary bank account.") { player, _ -> return@DialogueOption hasActivatedSecondaryBankAccount(player) && !isUsingSecondaryBankAccount(player) },
DialogueOption("pin", "I'd like to check my PIN settings."),
DialogueOption("collect", "I'd like to collect items."),
DialogueOption("what is this place", "What is this place?") { _, npc -> return@DialogueOption npc.id !in BANKERS_WITH_EXTRA_OPTION },
DialogueOption("jade's employment history", "How long have you worked here?") { _, npc -> return@DialogueOption npc.id == NPCs.JADE_4296 },
DialogueOption("is the bounty hunter banker afraid", "Aren't you afraid of working in the Wilderness?") { _, npc -> return@DialogueOption npc.id == NPCs.BANKER_6538 && !ServerConstants.SECOND_BANK }
)
label("how to use")
options(
DialogueOption("using bank", "Using the bank itself.", "Using the bank itself. I'm not sure how....?"),
DialogueOption("using deposit", "Using bank deposit boxes.", "Using Bank deposit boxes.... what are they?"),
DialogueOption("using PIN", "What's this PIN thing that people keep talking about?", "What's this PIN thing that people keep talking about?"),
DialogueOption("nowhere", "Goodbye.")
)
label("using bank")
npc("Speak to any banker and ask to see your bank", "account. If you have set a PIN you will be asked for", "it, then all the belongings you have placed in the bank", "will appear in the window. To withdraw one item, left-")
npc("click on it once.")
npc("To withdraw many, right-click on the item and select", "from the menu. The same for depositing, left-click on", "the item in your inventory to deposit it in the bank.", "Right-click on it to deposit many of the same items.")
npc("To move things around in your bank: firstly select", "Swap or Insert as your default moving mode, you can", "find these buttons on the bank window itself. Then click", "and drag an item to where you want it to appear.")
npc("You may withdraw 'notes' or 'certificates' when the", "items you are trying to withdraw do not stack in your", "inventory. This will only work for items which are", "tradeable.")
npc("For instance, if you wanted to sell 100 logs to another", "player, they would not fit in one inventory and you", "would need to do multiple trades. Instead, click the", "Note button to withdraw the logs as 'certs' or 'notes'")
npc("then withdraw the items you need.")
goto("how to use")
label("using deposit")
npc("They look like grey pillars, there's one just over there,", "near the desk. Bank deposit boxes save so much time.", "If you're simply wanting to deposit a single item, 'Use'", "it on the deposit box.")
npc("Otherwise, simply click once on the box and it will give", "you a choice of what to deposit in an interface very", "similar to the bank itself. Very quick for when you're", "simply fishing or mining etc.")
goto("how to use")
label("using PIN")
npc("The PIN - Personal Identification Number - can be", "set on your bank account to protect the items there in", "case someone finds out your account password. It", "consists of four numbers that you remember and tell")
npc("no one.")
npc("So if someone did manage to get your password they", "couldn't steal your items if they were in the bank.")
goto("how to use")
label("who is the bounty hunter banker")
npc(ChatAnim.NEUTRAL, "How inconsiderate of me, dear @g[sir,madam]. My name is Maximillian Sackville and I conduct operations here on behalf of The Bank of Gielinor.")
goto("main options")
label("access")
exec { player, _ -> openBankAccount(player) }
goto("nowhere")
label("buy second bank")
npc("Certainly. We offer secondary accounts to all our customers.")
npc("The secondary account comes with a standard fee of 5,000,000 coins. The fee is non-refundable and account activation is permanent.")
npc("If your inventory does not contain enough money to cover the costs, we will complement the amount with the money inside your primary bank account.")
npc("Knowing all this, would you like to proceed with opening your secondary bank account?")
options(
DialogueOption("buy second bank yes", "Yes, I am still interested.", expression = ChatAnim.HAPPY),
DialogueOption("buy second bank no", "Actually, I've changed my mind.", expression = ChatAnim.ANNOYED)
)
label("buy second bank yes")
exec { player, _ -> loadLabel(player, when (activateSecondaryBankAccount(player)) {
SecondaryBankAccountActivationResult.ALREADY_ACTIVE -> "already"
SecondaryBankAccountActivationResult.INTERNAL_FAILURE -> "failure"
SecondaryBankAccountActivationResult.NOT_ENOUGH_MONEY -> "not enough cash"
SecondaryBankAccountActivationResult.SUCCESS -> "success"
}) }
label("already")
npc(ChatAnim.FRIENDLY, "Your bank account was already activated, there is no need to pay twice.")
goto("main options")
label("failure")
npc(ChatAnim.ANNOYED, "I must apologize, the transaction was not successful. Please check your primary bank account and your inventory - if there's money missing, please screenshot your chatbox and contact the game developers.")
goto("main options")
label("not enough cash")
npc(ChatAnim.ANNOYED, "It appears that you do not have the money necessary to cover the costs associated with opening a secondary bank account. I will be waiting here until you do.")
goto("main options")
label("success")
npc(ChatAnim.FRIENDLY, "Your secondary bank account has been opened and can be accessed through any of the Bank of Gielinor's employees. Thank you for choosing our services.")
goto("main options")
label("buy second bank no")
npc("Very well. Should you decide a secondary bank account is needed, do not hesitate to contact any of the Bank of Gielinor's stationary employees. We will be happy to help.")
goto("main options")
label("switch second bank")
exec { player, _ ->
toggleBankAccount(player)
loadLabel(player, if (isUsingSecondaryBankAccount(player)) "now secondary" else "now primary")
}
label("now primary")
npc("Your active bank account has been switched. You can now access your primary account.")
goto("main options")
label("now secondary")
npc("Your active bank account has been switched. You can now access your secondary account.")
goto("main options")
label("pin")
exec { player, _ -> openBankPinSettings(player) }
goto("nowhere")
label("collect")
exec { player, _ -> openGrandExchangeCollectionBox(player) }
goto("nowhere")
label("what is this place")
npc("This is a branch of the Bank of Gielinor. We have branches in many towns.")
player("And what do you do?")
npc("We will look after your items and money for you. Leave your valuables with us if you want to keep them safe.")
goto("main options")
label("jade's employment history")
npc(ChatAnim.FRIENDLY, "Oh, ever since the Guild opened. I like it here.")
player(ChatAnim.ASKING, "Why's that?")
npc(ChatAnim.FRIENDLY, "Well... what with all these warriors around, there's not much chance of my bank being robbed, is there?")
goto("nowhere")
label("is the bounty hunter banker afraid")
npc(ChatAnim.NEUTRAL, "While the Wilderness is quite a dangerous place, The Bank of Gielinor offers us - roving bankers - extraordinary benefits for our hard work in hazardous environments.")
npc(ChatAnim.NEUTRAL, "This allows us to provide our services to customers regardless of their current whereabouts. Our desire to serve is stronger than our fear of the Wilderness.")
goto("nowhere")
}
}
override fun getIds(): IntArray = NPC_IDS
} }

View file

@ -1,120 +0,0 @@
package content.minigame.bountyhunter
import core.api.*
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.IronmanMode
import core.plugin.Initializable
import org.rs09.consts.NPCs
import core.game.dialogue.IfTopic
import core.game.dialogue.Topic
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
/**
* Provides dialogue tree for Maximillian Sackville,
* the Bounty Hounter roving banker.
*
* @author vddCore
*/
@Initializable
class MaximillianSackvilleDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
START_DIALOGUE -> when {
hasIronmanRestriction(player, IronmanMode.ULTIMATE) -> {
npcl(
FacialExpression.NEUTRAL,
"My apologies, dear ${if (player.isMale) "sir" else "madam"}, " +
"our services are not available for Ultimate ${if (player.isMale) "Ironmen" else "Ironwomen"}."
).also { stage = END_DIALOGUE }
}
else -> {
npcl(
FacialExpression.NEUTRAL,
"Good day, how may I help you?"
).also {
if (hasAwaitingGrandExchangeCollections(player)) {
stage++
} else {
stage += 2
}
}
}
}
1 -> npcl(
FacialExpression.NEUTRAL,
"Before we go any further, I should inform you that you " +
"have items ready for collection from the Grand Exchange."
).also { stage++ }
2 -> playerl(
FacialExpression.ASKING,
"Who are you?"
).also { stage++ }
3 -> npcl(
FacialExpression.NEUTRAL,
"How inconsiderate of me, dear ${if (player.isMale) "sir" else "madam"}. " +
"My name is Maximillian Sackville and I conduct operations here on behalf " +
"of The Bank of Gielinor."
).also { stage++ }
4 -> showTopics(
Topic(FacialExpression.NEUTRAL, "I'd like to access my bank account.", 10),
IfTopic(
FacialExpression.NEUTRAL,
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
11,
hasActivatedSecondaryBankAccount(player)
),
Topic(FacialExpression.NEUTRAL, "I'd like to check my PIN settings.", 12),
Topic(FacialExpression.NEUTRAL, "I'd like to collect items.", 13),
Topic(FacialExpression.ASKING, "Aren't you afraid of working in the Wilderness?", 5)
)
5 -> npcl(
FacialExpression.NEUTRAL,
"While the Wilderness is quite a dangerous place, The Bank of Gielinor offers " +
"us - roving bankers - extraordinary benefits for our hard work in hazardous environments."
).also { stage++ }
6 -> npcl(
FacialExpression.NEUTRAL,
"This allows us to provide our services to customers regardless of their current " +
"whereabouts. Our desire to serve is stronger than our fear of the Wilderness."
).also { stage = END_DIALOGUE }
10 -> {
openBankAccount(player)
end()
}
11 -> {
toggleBankAccount(player)
npcl(
FacialExpression.NEUTRAL,
"Naturally. You can now access your ${getBankAccountName(player)} bank account."
).also { stage = END_DIALOGUE }
}
12 -> {
openBankPinSettings(player)
end()
}
13 -> {
openGrandExchangeCollectionBox(player)
end()
}
}
return true
}
override fun getIds() = intArrayOf(NPCs.BANKER_6538)
}

View file

@ -1,6 +1,8 @@
package content.minigame.mta package content.minigame.mta
import content.minigame.mta.impl.EnchantingZone.Shapes import content.minigame.mta.impl.EnchantingZone.Shapes
import core.ServerConstants
import core.api.replaceSlot
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.spell.SpellType import core.game.node.entity.combat.spell.SpellType
@ -9,6 +11,8 @@ import core.game.node.entity.player.link.SpellBookManager.SpellBook
import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.player.link.audio.Audio
import core.game.node.entity.combat.spell.MagicSpell import core.game.node.entity.combat.spell.MagicSpell
import core.game.node.entity.combat.spell.Runes import core.game.node.entity.combat.spell.Runes
import core.game.node.entity.player.info.LogType
import core.game.node.entity.player.info.PlayerMonitor
import core.game.node.item.Item import core.game.node.item.Item
import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Animation
import core.game.world.update.flag.context.Graphics import core.game.world.update.flag.context.Graphics
@ -47,7 +51,7 @@ class EnchantSpell : MagicSpell {
return false return false
} }
entity.interfaceManager.setViewedTab(6) entity.interfaceManager.setViewedTab(6)
val enchanted = jewellery?.getOrDefault(target.id,null) var enchanted = jewellery?.getOrDefault(target.id,null)
if (enchanted == null) { if (enchanted == null) {
entity.packetDispatch.sendMessage("You can't use this spell on this item.") entity.packetDispatch.sendMessage("You can't use this spell on this item.")
@ -56,12 +60,15 @@ class EnchantSpell : MagicSpell {
if (!meetsRequirements(entity, true, true)) { if (!meetsRequirements(entity, true, true)) {
return false return false
} }
if (enchanted.id == Items.RING_OF_WEALTH_2572 && ServerConstants.RING_OF_WEALTH_TELEPORT) {
if (entity.inventory.remove(target)) { enchanted = Item(Items.RING_OF_WEALTH_14638)
visualize(entity, target)
entity.inventory.add(enchanted)
} }
visualize(entity, target)
val ret = replaceSlot(entity, target.slot, enchanted)
if (ret != target) {
PlayerMonitor.log(entity, LogType.DUPE_ALERT, "Unknown slot-replacement problem when enchanting jewellery (adding $enchanted replaced $ret rather than $target)")
}
//MTA-Specific Code //MTA-Specific Code
if (entity.zoneMonitor.isInZone("Enchantment Chamber")) { if (entity.zoneMonitor.isInZone("Enchantment Chamber")) {
@ -184,10 +191,10 @@ class EnchantSpell : MagicSpell {
SpellBook.MODERN.register(51, EnchantSpell(68, 78.0, SpellBook.MODERN.register(51, EnchantSpell(68, 78.0,
mapOf( mapOf(
//Begin Jewelry Enchantment //Begin Jewelry Enchantment
Items.DRAGONSTONE_RING_1645 to Item(14646), Items.DRAGONSTONE_RING_1645 to Item(Items.RING_OF_WEALTH_2572),
Items.DRAGON_NECKLACE_1664 to Item(Items.SKILLS_NECKLACE4_11105), Items.DRAGON_NECKLACE_1664 to Item(Items.SKILLS_NECKLACE_11113),
Items.DRAGONSTONE_AMMY_1702 to Item(Items.AMULET_OF_GLORY4_1712), Items.DRAGONSTONE_AMMY_1702 to Item(Items.AMULET_OF_GLORY_1704),
Items.DRAGON_BRACELET_11115 to Item(Items.COMBAT_BRACELET4_11118), Items.DRAGON_BRACELET_11115 to Item(Items.COMBAT_BRACELET_11126),
//Begin MTA-Specific Enchantments //Begin MTA-Specific Enchantments
Items.CUBE_6899 to Item(Items.ORB_6902), Items.CUBE_6899 to Item(Items.ORB_6902),
Items.CYLINDER_6898 to Item(Items.ORB_6902), Items.CYLINDER_6898 to Item(Items.ORB_6902),

View file

@ -1,5 +1,6 @@
package content.region.asgarnia.burthorpe.dialogue package content.region.asgarnia.burthorpe.dialogue
import core.ServerConstants
import core.api.* import core.api.*
import core.game.dialogue.DialoguePlugin import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression import core.game.dialogue.FacialExpression
@ -21,7 +22,7 @@ import core.tools.START_DIALOGUE
class EmeraldBenedictDialogue(player: Player? = null) : DialoguePlugin(player) { class EmeraldBenedictDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun handle(interfaceId: Int, buttonId: Int): Boolean { override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) { when (stage) {
START_DIALOGUE -> if(hasIronmanRestriction(player, IronmanMode.ULTIMATE)) { START_DIALOGUE -> if (hasIronmanRestriction(player, IronmanMode.ULTIMATE)) {
npcl( npcl(
FacialExpression.ANNOYED, FacialExpression.ANNOYED,
"Get lost, tin can." "Get lost, tin can."
@ -53,6 +54,12 @@ class EmeraldBenedictDialogue(player: Player? = null) : DialoguePlugin(player) {
4, 4,
hasActivatedSecondaryBankAccount(player) hasActivatedSecondaryBankAccount(player)
), ),
IfTopic(
FacialExpression.ASKING,
"Yes, but can you open a secondary bank account for me?",
7,
ServerConstants.SECOND_BANK && !hasActivatedSecondaryBankAccount(player)
),
Topic(FacialExpression.ASKING, "Yes, but can you show me my PIN settings?", 5), Topic(FacialExpression.ASKING, "Yes, but can you show me my PIN settings?", 5),
Topic(FacialExpression.ASKING, "Yes, but can you show me my collection box?", 6), Topic(FacialExpression.ASKING, "Yes, but can you show me my collection box?", 6),
Topic(FacialExpression.ANNOYED, "Yes, thanks. And I'll keep hold of it too.", END_DIALOGUE) Topic(FacialExpression.ANNOYED, "Yes, thanks. And I'll keep hold of it too.", END_DIALOGUE)
@ -68,7 +75,7 @@ class EmeraldBenedictDialogue(player: Player? = null) : DialoguePlugin(player) {
npcl( npcl(
FacialExpression.SUSPICIOUS, FacialExpression.SUSPICIOUS,
"Sure thing. Feel free to rummage through whatever's in your ${getBankAccountName(player)} now." "Sure thing. Feel free to rummage through whatever's in your ${getBankAccountName(player)} now."
).also { stage = END_DIALOGUE } ).also { stage = 2 }
} }
5 -> { 5 -> {
@ -80,6 +87,20 @@ class EmeraldBenedictDialogue(player: Player? = null) : DialoguePlugin(player) {
openGrandExchangeCollectionBox(player) openGrandExchangeCollectionBox(player)
end() end()
} }
7 -> {
npcl(
FacialExpression.SUSPICIOUS,
"Sure, just give me five million in gold and I'll take care of it."
).also { stage++ }
}
8 -> {
playerl(
FacialExpression.SUSPICIOUS,
"On second thought, I think I'll ask somebody more reputable..."
).also { stage = END_DIALOGUE }
}
} }
return true return true

View file

@ -1,106 +0,0 @@
package content.region.asgarnia.burthorpe.dialogue
import core.api.*
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.IronmanMode
import core.plugin.Initializable
import org.rs09.consts.NPCs
import core.game.dialogue.IfTopic
import core.game.dialogue.Topic
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
/**
* Provides a dialogue tree for Jade inside Warriors' Guild.
*
* @author vddCore
*/
@Initializable
class JadeDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
START_DIALOGUE -> if (hasIronmanRestriction(player, IronmanMode.ULTIMATE)) {
npcl(
FacialExpression.NEUTRAL,
"Greetings, warrior. I wish I could help you, but " +
"our services are not available for Ultimate ${if (player.isMale) "Ironmen" else "Ironwomen"}."
).also { stage = END_DIALOGUE }
}
else {
npcl(
FacialExpression.NEUTRAL,
"Greetings warrior, how may I help you?"
).also {
if (hasAwaitingGrandExchangeCollections(player)) {
stage++
} else {
stage += 2
}
}
}
1 -> npcl(
FacialExpression.NEUTRAL,
"Before we go any further, I should inform you that you " +
"have items ready for collection from the Grand Exchange."
).also { stage++ }
2 -> showTopics(
Topic(FacialExpression.NEUTRAL, "I'd like to access my bank account, please.", 10),
IfTopic(
FacialExpression.NEUTRAL,
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
13,
hasActivatedSecondaryBankAccount(player)
),
Topic(FacialExpression.NEUTRAL, "I'd like to check my PIN settings.", 11),
Topic(FacialExpression.NEUTRAL, "I'd like to see my collection box.", 12),
Topic(FacialExpression.ASKING, "How long have you worked here?", 3)
)
3 -> npcl(
FacialExpression.FRIENDLY,
"Oh, ever since the Guild opened. I like it here."
).also { stage++ }
4 -> playerl(
FacialExpression.ASKING,
"Why's that?"
).also { stage++ }
5 -> npcl(
FacialExpression.FRIENDLY,
"Well... What with all these warriors around, there's not much chance of my bank being robbed, is there?"
).also { stage = 2 }
10 -> {
openBankAccount(player)
end()
}
11 -> {
openBankPinSettings(player)
end()
}
12 -> {
openGrandExchangeCollectionBox(player)
end()
}
13 -> {
toggleBankAccount(player)
npcl(
FacialExpression.FRIENDLY,
"Of course! Your ${getBankAccountName(player)} account is now active!"
).also { stage = END_DIALOGUE }
}
}
return true
}
override fun getIds(): IntArray = intArrayOf(NPCs.JADE_4296)
}

View file

@ -1,5 +1,6 @@
package content.region.asgarnia.burthorpe.handlers; package content.region.asgarnia.burthorpe.handlers;
import core.ServerConstants;
import core.cache.def.impl.SceneryDefinition; import core.cache.def.impl.SceneryDefinition;
import content.data.EnchantedJewellery; import content.data.EnchantedJewellery;
import core.game.global.action.DoorActionHandler; import core.game.global.action.DoorActionHandler;
@ -18,11 +19,15 @@ import core.plugin.Initializable;
import core.plugin.ClassScanner; import core.plugin.ClassScanner;
import static core.api.ContentAPIKt.hasRequirement; import static core.api.ContentAPIKt.hasRequirement;
import static core.api.ContentAPIKt.sendMessage;
import content.data.Quests; import content.data.Quests;
import org.rs09.consts.Items;
/** /**
* Represents the hero guild. * Represents the hero guild.
* @author Vexia * @author Vexia
* @author Player Name
*/ */
@Initializable @Initializable
public final class HeroGuildPlugin extends OptionHandler { public final class HeroGuildPlugin extends OptionHandler {
@ -56,6 +61,7 @@ public final class HeroGuildPlugin extends OptionHandler {
/** /**
* Handles the recharging of dragonstone jewellery. * Handles the recharging of dragonstone jewellery.
* @author Vexia * @author Vexia
* @author Player Name
*/ */
public static final class JewelleryRechargePlugin extends UseWithHandler { public static final class JewelleryRechargePlugin extends UseWithHandler {
@ -65,8 +71,7 @@ public final class HeroGuildPlugin extends OptionHandler {
private static final int[] IDS = new int[] { 1710, 1708, 1706, 1704, 11107, 11109, 11111, 11113, 11120, 11122, 11124, 11126, 10354, 10356, 10358, 10360, 10362, 14644,14642,14640,14638, 2572 }; private static final int[] IDS = new int[] { 1710, 1708, 1706, 1704, 11107, 11109, 11111, 11113, 11120, 11122, 11124, 11126, 10354, 10356, 10358, 10360, 10362, 14644,14642,14640,14638, 2572 };
/** /**
* Constructs a new {@Code JewelleryRechargePlugin} {@Code * Constructs a new JewelleryRechargePlugin object
* Object}
*/ */
public JewelleryRechargePlugin() { public JewelleryRechargePlugin() {
super(IDS); super(IDS);
@ -83,19 +88,25 @@ public final class HeroGuildPlugin extends OptionHandler {
@Override @Override
public boolean handle(NodeUsageEvent event) { public boolean handle(NodeUsageEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (!hasRequirement(player, Quests.HEROES_QUEST)) if (!hasRequirement(player, Quests.HEROES_QUEST)) {
return true; return true; //hasRequirement shows the message
}
final EnchantedJewellery jewellery; final EnchantedJewellery jewellery;
assert event.getUsedItem() != null; assert event.getUsedItem() != null;
jewellery = EnchantedJewellery.Companion.getIdMap().get(event.getUsedItem().getId()); jewellery = EnchantedJewellery.Companion.getIdMap().get(event.getUsedItem().getId());
if (!hasRequirement(player, Quests.HEROES_QUEST)) if (jewellery == null) {
return true; return false; //nothing interesting happens
if (jewellery == EnchantedJewellery.COMBAT_BRACELET || jewellery == EnchantedJewellery.SKILLS_NECKLACE) }
if (!hasRequirement(player, Quests.LEGENDS_QUEST)) if (jewellery == EnchantedJewellery.RING_OF_WEALTH) {
return true; if (!ServerConstants.RING_OF_WEALTH_TELEPORT) {
if (jewellery == null && event.getUsedItem().getId() != 2572) { return false;
}
}
if (jewellery == EnchantedJewellery.COMBAT_BRACELET || jewellery == EnchantedJewellery.SKILLS_NECKLACE) {
if (!hasRequirement(player, Quests.LEGENDS_QUEST)) {
return true; return true;
} }
}
boolean fam = event.getUsedWith() instanceof NPC; boolean fam = event.getUsedWith() instanceof NPC;
if (fam && jewellery != EnchantedJewellery.AMULET_OF_GLORY & jewellery != EnchantedJewellery.AMULET_OF_GLORY_T) { if (fam && jewellery != EnchantedJewellery.AMULET_OF_GLORY & jewellery != EnchantedJewellery.AMULET_OF_GLORY_T) {
return false; return false;
@ -113,9 +124,9 @@ public final class HeroGuildPlugin extends OptionHandler {
player.getInventory().replace(rechargedItem, event.getUsedItem().getSlot()); player.getInventory().replace(rechargedItem, event.getUsedItem().getSlot());
String name = jewellery.getJewelleryName(rechargedItem); String name = jewellery.getJewelleryName(rechargedItem);
if (!fam) { if (!fam) {
player.sendMessage("You dip the " + name + " in the fountain..."); sendMessage(player, "You dip the " + name.toLowerCase() + " in the fountain...");
} else { } else {
player.sendMessage("Your titan recharges the glory."); sendMessage(player, "Your titan recharges the " + name.toLowerCase() + ".");
} }
return true; return true;
} }

View file

@ -1,209 +0,0 @@
package content.region.fremennik.lunarisle.dialogue
import core.api.*
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.IronmanMode
import core.plugin.Initializable
import org.rs09.consts.NPCs
import core.game.dialogue.IfTopic
import core.game.dialogue.Topic
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
/**
* Handles Sirsal banker dialogue tree.
*
* @author vddCore
*/
@Initializable
class SirsalBankerDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
START_DIALOGUE -> if (hasSealOfPassage(player)) {
if (hasIronmanRestriction(player, IronmanMode.ULTIMATE)) {
npcl(
FacialExpression.NEUTRAL,
"My apologies, dear ${if (player.isMale) "sir" else "madam"}, " +
"our services are not available for Ultimate ${if (player.isMale) "Ironmen" else "Ironwomen"}"
).also { stage = END_DIALOGUE }
} else {
npcl(
FacialExpression.NEUTRAL,
"Good day, how may I help you?"
).also {
if (hasAwaitingGrandExchangeCollections(player)) {
stage++
} else {
stage += 2
}
}
}
} else {
playerl(FacialExpression.HALF_WORRIED, "Hi, I...")
stage = 30
}
1 -> npcl(
FacialExpression.NEUTRAL,
"Before we go any further, I should inform you that you " +
"have items ready for collection from the Grand Exchange."
).also { stage++ }
2 -> showTopics(
Topic(FacialExpression.NEUTRAL, "I'd like to access my bank account, please.", 10),
IfTopic(
FacialExpression.NEUTRAL,
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
13,
hasActivatedSecondaryBankAccount(player)
),
IfTopic(
FacialExpression.NEUTRAL,
"I'd like to open a secondary bank account.",
20,
!hasActivatedSecondaryBankAccount(player)
),
Topic(FacialExpression.NEUTRAL, "I'd like to check my PIN settings.", 11),
Topic(FacialExpression.NEUTRAL, "I'd like to collect items.", 12),
Topic(FacialExpression.ASKING, "What is this place?", 3),
)
3 -> npcl(
FacialExpression.NEUTRAL,
"This is a branch of the Bank of Gielinor. We have branches in many towns."
).also { stage++ }
4 -> playerl(
FacialExpression.ASKING,
"And what do you do?"
).also { stage++ }
5 -> npcl(
FacialExpression.NEUTRAL,
"We will look after your items and money for you. " +
"Leave your valuables with us if you want to keep them safe."
).also { stage = END_DIALOGUE }
10 -> {
openBankAccount(player)
end()
}
11 -> {
openBankPinSettings(player)
end()
}
12 -> {
openGrandExchangeCollectionBox(player)
end()
}
13 -> {
toggleBankAccount(player)
npcl(
FacialExpression.NEUTRAL,
"Your active bank account has been switched. " +
"You can now access your ${getBankAccountName(player)} account."
).also { stage = END_DIALOGUE }
}
20 -> npcl(
FacialExpression.NEUTRAL,
"Certainly. We offer secondary accounts to all our customers."
).also { stage++ }
21 -> npcl(
FacialExpression.NEUTRAL,
"The secondary account comes with a standard fee of 5,000,000 coins. The fee is non-refundable " +
"and account activation is permanent."
).also { stage++ }
22 -> npcl(
FacialExpression.NEUTRAL,
"If your inventory does not contain enough money to cover the costs, we will complement " +
"the amount with the money inside your primary bank account."
).also { stage++ }
23 -> npcl(
FacialExpression.ASKING,
"Knowing all this, would you like to proceed with opening your secondary bank account?"
).also { stage++ }
24 -> showTopics(
Topic(FacialExpression.NEUTRAL, "Yes, I am still interested.", 25),
Topic(FacialExpression.NEUTRAL, "Actually, I've changed my mind.", 26)
)
25 -> {
when (activateSecondaryBankAccount(player)) {
SecondaryBankAccountActivationResult.ALREADY_ACTIVE -> {
npcl(
FacialExpression.NEUTRAL,
"Your bank account was already activated, there is no need to pay twice."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.INTERNAL_FAILURE -> {
npcl(
FacialExpression.NEUTRAL,
"I must apologize, the transaction was not successful. Please check your " +
"primary bank account and your inventory - if there's money missing, please " +
"screenshot your chat box and contact the game developers."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.NOT_ENOUGH_MONEY -> {
npcl(
FacialExpression.NEUTRAL,
"It appears that you do not have the money necessary to cover the costs " +
"associated with opening a secondary bank account. I will be waiting here " +
"until you do."
).also { stage = END_DIALOGUE }
}
SecondaryBankAccountActivationResult.SUCCESS -> {
npcl(
FacialExpression.NEUTRAL,
"Your secondary bank account has been opened and can be accessed through any " +
"of the Bank of Gielinor's employees. Thank you for choosing our services."
).also { stage = END_DIALOGUE }
}
}
}
26 -> npcl(
FacialExpression.NEUTRAL,
"Very well. Should you decide a secondary bank account is needed, do not hesitate to " +
"contact any of the Bank of Gielinor's stationary employees. We will be happy to help."
).also { stage = END_DIALOGUE }
30 -> npcl(
FacialExpression.ANNOYED,
"What are you doing here, Fremennik?!"
).also { stage++ }
31 -> playerl(
FacialExpression.WORRIED,
"I have a Seal of Pass..."
).also { stage++ }
32 -> npcl(
FacialExpression.ANGRY,
"No you don't! Begone!"
).also { stage = END_DIALOGUE }
/* TODO: Is the above related to Lunar Diplomacy? */
}
return true
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.SIRSAL_BANKER_4519)
}
}

View file

@ -1,8 +1,10 @@
package content.region.kandarin.dialogue package content.region.kandarin.dialogue
import core.ServerConstants
import core.api.* import core.api.*
import core.game.dialogue.DialoguePlugin import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression import core.game.dialogue.FacialExpression
import core.game.dialogue.IfTopic
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.plugin.Initializable import core.plugin.Initializable
@ -54,11 +56,16 @@ class EniolaDialogue(player: Player? = null) : DialoguePlugin(player) {
4 -> showTopics( 4 -> showTopics(
Topic(FacialExpression.HALF_THINKING, "If you work for the bank, what are you doing here?", 10), Topic(FacialExpression.HALF_THINKING, "If you work for the bank, what are you doing here?", 10),
Topic(FacialExpression.NEUTRAL, "I'd like to access my bank account, please.", 30), Topic(FacialExpression.NEUTRAL, "I'd like to access my bank account, please.", 30),
IfTopic(FacialExpression.NEUTRAL, "I'd like to open a secondary bank account.", 5, ServerConstants.SECOND_BANK && !hasActivatedSecondaryBankAccount(player)),
IfTopic(FacialExpression.NEUTRAL, "I'd like to switch to my ${getBankAccountName(player, true)} bank account.", 40, hasActivatedSecondaryBankAccount(player)),
Topic(FacialExpression.NEUTRAL, "I'd like to check my PIN settings.", 31), Topic(FacialExpression.NEUTRAL, "I'd like to check my PIN settings.", 31),
Topic(FacialExpression.NEUTRAL, "I'd like to see my collection box.", 32), Topic(FacialExpression.NEUTRAL, "I'd like to see my collection box.", 32),
Topic(FacialExpression.NEUTRAL, "Never mind.", END_DIALOGUE) IfTopic(FacialExpression.NEUTRAL, "Never mind.", END_DIALOGUE, !ServerConstants.SECOND_BANK)
) )
5 -> npcl(FacialExpression.ASKING, "Sorry, ${if (player.isMale) "sir" else "ma'am"}, the bank didn't license me for that.").also { stage++ }
6 -> playerl(FacialExpression.HALF_GUILTY, "Oh, okay, I'll ask a banker who is stationed in an actual bank.").also { stage = END_DIALOGUE }
10 -> npcl( 10 -> npcl(
FacialExpression.NEUTRAL, FacialExpression.NEUTRAL,
"My presence here is the start of a new enterprise of travelling banks. " + "My presence here is the start of a new enterprise of travelling banks. " +
@ -133,7 +140,7 @@ class EniolaDialogue(player: Player? = null) : DialoguePlugin(player) {
22 -> npcl( 22 -> npcl(
FacialExpression.NEUTRAL, FacialExpression.NEUTRAL,
"I'm sorry to hear that, dear ${if (player.isMale) "sir" else "madam"}. " "I'm sorry to hear that, dear ${if (player.isMale) "sir" else "madam"}."
).also { stage++ } ).also { stage++ }
23 -> npcl( 23 -> npcl(
@ -158,6 +165,11 @@ class EniolaDialogue(player: Player? = null) : DialoguePlugin(player) {
openInterface(player, Components.BANK_CHARGE_ZMI_619) openInterface(player, Components.BANK_CHARGE_ZMI_619)
end() end()
} }
40 -> {
toggleBankAccount(player)
npcl( FacialExpression.NEUTRAL, "Your active bank account has been switched. You can now access your ${getBankAccountName(player)} account.").also { stage = END_DIALOGUE }
}
} }
return true return true

View file

@ -1,115 +1,101 @@
package content.region.kandarin.pisc.dialogue package content.region.kandarin.pisc.dialogue
import core.api.* import core.ServerConstants
import core.game.dialogue.DialoguePlugin import core.api.addItemOrDrop
import core.game.dialogue.FacialExpression import core.api.hasActivatedSecondaryBankAccount
import core.game.node.entity.player.Player import core.api.hasIronmanRestriction
import core.api.isUsingSecondaryBankAccount
import core.api.openBankAccount
import core.api.openBankPinSettings
import core.api.openGrandExchangeCollectionBox
import core.api.openNpcShop
import core.api.toggleBankAccount
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.link.IronmanMode import core.game.node.entity.player.link.IronmanMode
import core.plugin.Initializable import core.game.node.item.Item
import org.rs09.consts.Items import org.rs09.consts.Items
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import core.game.dialogue.IfTopic
import core.game.dialogue.Topic
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
/** class ArnoldLydsporDialogue : InteractionListener {
* Provides the regular dialogue for Arnold Lydspor. override fun defineListeners() {
* TODO: Swan Song quest will need a special case handling. on(NPCs.ARNOLD_LYDSPOR_3824, IntType.NPC, "talk-to") { player, node ->
* DialogueLabeller.open(player, ArnoldLydsporLabellerFile(), node as NPC)
* @author vddCore return@on true
*/ }
@Initializable on(NPCs.ARNOLD_LYDSPOR_3824, IntType.NPC, "bank") { player, _ ->
class ArnoldLydsporDialogue(player: Player? = null) : DialoguePlugin(player) { openBankAccount(player)
override fun handle(interfaceId: Int, buttonId: Int): Boolean { return@on true
when (stage) { }
START_DIALOGUE -> npcl( on(NPCs.ARNOLD_LYDSPOR_3824, IntType.NPC, "collect") { player, _ ->
FacialExpression.FRIENDLY, openGrandExchangeCollectionBox(player)
"Ah, you come back! What you want from Arnold, heh?" return@on true
).also { stage++ } }
}
1 -> showTopics( class ArnoldLydsporLabellerFile : DialogueLabeller() {
IfTopic( override fun addConversation() {
FacialExpression.ASKING, npc(ChatAnim.FRIENDLY, "Ah, you come back! What you want from Arnold, heh?")
"Can you open my bank account, please?", goto("main options")
2,
!hasIronmanRestriction(player, IronmanMode.ULTIMATE)
),
IfTopic( label("main options")
FacialExpression.NEUTRAL, options(
"I'd like to check my bank PIN settings.", DialogueOption("access", "Can you open my bank account please?", expression = ChatAnim.ASKING) { player, _ -> !hasIronmanRestriction(player, IronmanMode.ULTIMATE) },
3, DialogueOption("buy second bank", "I'd like to open a secondary bank account.") { player, _ -> return@DialogueOption !hasIronmanRestriction(player, IronmanMode.ULTIMATE) && ServerConstants.SECOND_BANK && !hasActivatedSecondaryBankAccount(player) },
!hasIronmanRestriction(player, IronmanMode.ULTIMATE) DialogueOption("switch second bank", "I'd like to switch to my primary bank account.") { player, _ -> return@DialogueOption hasActivatedSecondaryBankAccount(player) && isUsingSecondaryBankAccount(player) },
), DialogueOption("switch second bank", "I'd like to switch to my secondary bank account.") { player, _ -> return@DialogueOption hasActivatedSecondaryBankAccount(player) && !isUsingSecondaryBankAccount(player) },
IfTopic( DialogueOption("pin", "I'd like to check my PIN settings.", expression = ChatAnim.NEUTRAL) { player, _ -> !hasIronmanRestriction(player, IronmanMode.ULTIMATE) },
FacialExpression.NEUTRAL, DialogueOption("collect", "I'd like to collect items.", expression = ChatAnim.NEUTRAL) { player, _ -> !hasIronmanRestriction(player, IronmanMode.STANDARD) },
"I'd like to collect items.", DialogueOption("trade", "Would you like to trade?", expression = ChatAnim.ASKING),
4, DialogueOption("chat", "Nothing, I just came to chat.", expression = ChatAnim.FRIENDLY) { player, _ -> return@DialogueOption hasIronmanRestriction(player, IronmanMode.STANDARD) || !ServerConstants.SECOND_BANK }
!hasIronmanRestriction(player, IronmanMode.ULTIMATE)
),
Topic(FacialExpression.ASKING, "Would you like to trade?", 5),
Topic(FacialExpression.FRIENDLY, "Nothing, I just came to chat.", 7)
) )
2 -> { label("access")
openBankAccount(player) exec { player, _ -> openBankAccount(player) }
end() goto("nowhere")
label("buy second bank")
npc(ChatAnim.GUILTY, "I'm so sorry! My little shop does not have the fibre-optic connections to be able to open a second account. Try asking again in a brick-and-mortar building in a big city!")
player(ChatAnim.FRIENDLY, "That's okay, I understand. I will ask again in a big bank like Varrock's.")
goto("nowhere")
label("switch second bank")
exec {
player, _ -> toggleBankAccount(player)
loadLabel(player, if (isUsingSecondaryBankAccount(player)) "now secondary" else "now primary")
} }
label("now primary")
npc("Your active bank account has been switched. You can now access your primary account.")
goto("main options")
label("now secondary")
npc("Your active bank account has been switched. You can now access your secondary account.")
goto("main options")
3 -> { label("pin")
openBankPinSettings(player) exec { player, _ -> openBankPinSettings(player) }
end() goto("nowhere")
label("collect")
exec { player, _ -> openGrandExchangeCollectionBox(player) }
goto("nowhere")
label("trade")
npc(ChatAnim.FRIENDLY, "Ja, I have wide range of stock...")
exec { player, _ -> openNpcShop(player, NPCs.ARNOLD_LYDSPOR_3824) }
goto("nowhere")
label("chat")
npc("Ah, that is nice - always I like to chat, but Herr Caranos tell me to get back to work! Here, you been nice, so have a present.")
exec { player, _ -> addItemOrDrop(player, Items.CABBAGE_1965) }
item(Item(Items.CABBAGE_1965), "Arnold gives you a cabbage.")
player(ChatAnim.HALF_THINKING, "A cabbage?")
npc(ChatAnim.HAPPY, "Ja, cabbage is good for you!")
player(ChatAnim.NEUTRAL, "Um... Thanks!")
goto("nowhere")
} }
4 -> {
openGrandExchangeCollectionBox(player)
end()
} }
5 -> npcl(
FacialExpression.FRIENDLY,
"Ja, I have wide range of stock..."
).also { stage++ }
6 -> {
openNpcShop(player, NPCs.ARNOLD_LYDSPOR_3824)
end()
}
7 -> npcl(FacialExpression.FRIENDLY,
"Ah, that is nice - always I like to chat, but " +
"Herr Caranos tell me to get back to work! " +
"Here, you been nice, so have a present."
).also { stage++ }
8 -> sendItemDialogue(
player,
Items.CABBAGE_1965,
"Arnold gives you a cabbage."
).also {
addItemOrDrop(player, Items.CABBAGE_1965)
stage++
}
9 -> playerl(
FacialExpression.HALF_THINKING,
"A cabbage?"
).also { stage++ }
10 -> npcl(
FacialExpression.HAPPY,
"Ja, cabbage is good for you!"
).also { stage++ }
11 -> playerl(
FacialExpression.NEUTRAL,
"Um... Thanks!"
).also { stage = END_DIALOGUE }
}
return true
}
override fun getIds(): IntArray = intArrayOf(NPCs.ARNOLD_LYDSPOR_3824)
} }

View file

@ -1,155 +0,0 @@
package content.region.misc.tutisland.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.node.entity.npc.NPC;
import core.plugin.Initializable;
import core.game.node.entity.player.Player;
/**
* Represents the banker tutor dialogue.
* @author 'Vexia
* @version 1.0
*/
@Initializable
public final class BankerTutorDialogue extends DialoguePlugin {
/**
* Constructs a new {@code BankerTutorDialogue} {@code Object}.
* @param player the player.
*/
public BankerTutorDialogue(final Player player) {
super(player);
}
/**
* Constructs a new {@code BankerTutorDialogue} {@code Object}.
*/
public BankerTutorDialogue() {
/**
* empty.
*/
}
@Override
public DialoguePlugin newInstance(Player player) {
return new BankerTutorDialogue(player);
}
@Override
public boolean open(Object... args) {
npc = args[0] instanceof NPC ? (NPC) args[0] : null;
npc("Good day, would you like to access your bank account?");
stage = 0;
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
options("How do I use the bank?", "I'd like to access my bank account please.", "I'd like to check my PIN settings.");
stage = 1;
break;
case 1:
switch (buttonId) {
case 1:
options("Using the bank itself.", "Using Bank deposit boxes.", "What's this PIN thing that people keep talking about?", "Goodbye.");
stage = 9;
break;
case 2:
end();
player.getBank().open();
break;
case 3:
end();
player.getBankPinManager().openSettings();
break;
}
break;
case 9:
switch (buttonId) {
case 1:
player("Using the bank itself. I'm not sure how....?");
stage = 10;
break;
case 2:
player("Using Bank deposit boxes.... what are they?");
stage = 20;
break;
case 3:
player("What's this PIN thing that people keep talking about?");
stage = 30;
break;
case 4:
player("Goodbye.");
stage = 99;
break;
}
break;
case 10:
npc("Speak to any banker and ask to see your bank", "account. If you have set a PIN you will be asked for", "it, then all the belongings you have placed in the bank", "will appear in the window. To withdraw one item, left-");
stage = 11;
break;
case 11:
npc("click on it once.");
stage = 12;
break;
case 12:
npc("To withdraw many, right-click on the item and select", "from the menu. The same for depositing, left-click on", "the item in your inventory to deposit it in the bank.", "Right-click on it to deposit many of the same items.");
stage = 13;
break;
case 13:
npc("To move things around in your bank: firstly select", "Swap or Insert as your default moving mode, you can", "find these buttons on the bank window itself. Then click", "and drag an item to where you want it to appear.");
stage = 14;
break;
case 14:
npc("You may withdraw 'notes' or 'certificates' when the", "items you are trying to withdraw do not stack in your", "inventory. This will only work for items which are", "tradeable.");
stage = 15;
break;
case 15:
npc("For instance, if you wanted to sell 100 logs to another", "player, they would not fit in one inventory and you", "would need to do multiple trades. Instead, click the", "Note button to do withdraw the logs as 'certs' or 'notes',");
stage = 16;
break;
case 16:
npc("then withdraw the items you need.");
stage = 99;
break;
case 20:
npc("They look like grey pillars, there's one just over there,", "near the desk. Bank deposit boxes save so much time.", "If you're simply wanting to deposit a single item, 'Use'", "it on the deposit box.");
stage = 21;
break;
case 21:
npc("Otherwise, simply click once on the box and it will give", "you a choice of what to deposit in an interface very", "similar to the bank itself. Very quick for when you're", "simply fishing or mining etc.");
stage = 22;
break;
case 22:
end();
break;
case 30:
npc("The PIN - Personal Identification Number - can be", "set on your bank account to protect the items there in", "case someone finds out your account password. It", "consists of four numbers that you remember and tell");
stage = 31;
break;
case 31:
npc("no one.");
stage = 32;
break;
case 32:
npc("So if someone did manage to get your password they", "couldn't steal your items if they were in the bank.");
stage = 33;
break;
case 33:
end();
break;
case 99:
end();
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 4907 };
}
}

View file

@ -246,7 +246,7 @@ package content.region.misthalin.barbvillage.stronghold.playersafety
addItem(player, Items.SAFETY_GLOVES_12629) addItem(player, Items.SAFETY_GLOVES_12629)
sendItemDialogue( sendItemDialogue(
player, Items.SAFETY_GLOVES_12629, player, Items.SAFETY_GLOVES_12629,
"You open the chest to find a pair of safety gloves. " "You open the chest to find a pair of safety gloves."
) )
} }
} }

View file

@ -68,7 +68,7 @@ class BookcaseEastDialogueFile : DialogueFile() {
class ChimneySweepingOnABudgetBook { class ChimneySweepingOnABudgetBook {
companion object { companion object {
private val TITLE = "Chimney Sweeping on a Budget " private val TITLE = "Chimney Sweeping on a Budget"
val CONTENTS = arrayOf( val CONTENTS = arrayOf(
PageSet( PageSet(
Page( Page(

View file

@ -339,6 +339,24 @@ class ServerConstants {
@JvmField @JvmField
var ENHANCED_DEEP_WILDERNESS = false var ENHANCED_DEEP_WILDERNESS = false
@JvmField
var WILDERNESS_EXCLUSIVE_LOOT = false
@JvmField
var SHOOTING_STAR_RING = false
@JvmField
var RING_OF_WEALTH_TELEPORT = false
@JvmField
var SECOND_BANK = false
@JvmField
var PLAYER_COMMANDS = false
@JvmField
var BOOSTED_TRAWLER_REWARDS = false
@JvmField @JvmField
var STARTUP_MOMENT = Calendar.getInstance() var STARTUP_MOMENT = Calendar.getInstance()

View file

@ -2083,7 +2083,7 @@ fun runcs2 (player: Player, scriptId: Int, vararg arguments: Any) {
* @param callback a callback to handle the selection. The parameters passed to the callback are the slot in the inventory of the selected item, and the 0-9 index of the option clicked. * @param callback a callback to handle the selection. The parameters passed to the callback are the slot in the inventory of the selected item, and the 0-9 index of the option clicked.
**/ **/
@JvmOverloads @JvmOverloads
fun sendItemSelect (player: Player, vararg options: String, keepAlive: Boolean = false, callback: (slot: Int, optionIndex: Int) -> Unit) { fun sendItemSelect(player: Player, vararg options: String, keepAlive: Boolean = false, callback: (slot: Int, optionIndex: Int) -> Unit) {
player.interfaceManager.openSingleTab(Component(12)) player.interfaceManager.openSingleTab(Component(12))
val scriptArgs = arrayOf ((12 shl 16) + 18, 93, 4, 7, 0, -1, "", "", "", "", "", "", "", "", "") val scriptArgs = arrayOf ((12 shl 16) + 18, 93, 4, 7, 0, -1, "", "", "", "", "", "", "", "", "")
for (i in 0 until min(9, options.size)) for (i in 0 until min(9, options.size))

View file

@ -2,7 +2,6 @@ package core.game.node.entity.impl;
import core.game.interaction.Clocks; import core.game.interaction.Clocks;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.npc.NPC;
import core.game.world.GameWorld; import core.game.world.GameWorld;
import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Animation;
import core.game.world.update.flag.context.Graphics; import core.game.world.update.flag.context.Graphics;

View file

@ -2,6 +2,7 @@ package core.game.system.command
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.ServerConstants import core.ServerConstants
import core.game.node.entity.player.info.Rights
import core.game.world.GameWorld import core.game.world.GameWorld
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -12,7 +13,10 @@ import kotlin.collections.ArrayList
class Command(val name: String, val privilege: Privilege, val usage: String = "UNDOCUMENTED", val description: String = "UNDOCUMENTED", val handle: (Player, Array<String>) -> Unit) { class Command(val name: String, val privilege: Privilege, val usage: String = "UNDOCUMENTED", val description: String = "UNDOCUMENTED", val handle: (Player, Array<String>) -> Unit) {
fun attemptHandling(player: Player, args: Array<String>?){ fun attemptHandling(player: Player, args: Array<String>?){
args ?: return args ?: return
if(player.rights.ordinal >= privilege.ordinal || GameWorld.settings?.isDevMode == true || ServerConstants.I_AM_A_CHEATER){ val hasRights = player.rights == Rights.ADMINISTRATOR || (ServerConstants.PLAYER_COMMANDS && player.rights.ordinal >= privilege.ordinal)
val isDev = GameWorld.settings?.isDevMode == true
val isCheater = ServerConstants.I_AM_A_CHEATER
if (hasRights || isDev || isCheater) {
handle(player,args) handle(player,args)
} }
} }

View file

@ -167,6 +167,12 @@ object ServerConfigParser {
ServerConstants.FORCE_EASTER_EVENTS = data.getBoolean("world.force_easter_randoms", false) ServerConstants.FORCE_EASTER_EVENTS = data.getBoolean("world.force_easter_randoms", false)
ServerConstants.RUNECRAFTING_FORMULA_REVISION = data.getLong("world.runecrafting_formula_revision", 581).toInt() ServerConstants.RUNECRAFTING_FORMULA_REVISION = data.getLong("world.runecrafting_formula_revision", 581).toInt()
ServerConstants.ENHANCED_DEEP_WILDERNESS = data.getBoolean("world.enhanced_deep_wilderness", false) ServerConstants.ENHANCED_DEEP_WILDERNESS = data.getBoolean("world.enhanced_deep_wilderness", false)
ServerConstants.WILDERNESS_EXCLUSIVE_LOOT = data.getBoolean("world.wilderness_exclusive_loot", false)
ServerConstants.SHOOTING_STAR_RING = data.getBoolean("world.shooting_star_ring", false)
ServerConstants.RING_OF_WEALTH_TELEPORT = data.getBoolean("world.ring_of_wealth_teleport", false)
ServerConstants.SECOND_BANK = data.getBoolean("world.second_bank", false)
ServerConstants.PLAYER_COMMANDS = data.getBoolean("world.player_commands", false)
ServerConstants.BOOSTED_TRAWLER_REWARDS = data.getBoolean("world.boosted_trawler_rewards", false)
ServerConstants.CONNECTIVITY_CHECK_URL = data.getString("server.connectivity_check_url", "https://google.com,https://2009scape.org") ServerConstants.CONNECTIVITY_CHECK_URL = data.getString("server.connectivity_check_url", "https://google.com,https://2009scape.org")
ServerConstants.CONNECTIVITY_TIMEOUT = data.getLong("server.connectivity_timeout", 500L).toInt() ServerConstants.CONNECTIVITY_TIMEOUT = data.getLong("server.connectivity_timeout", 500L).toInt()