diff --git a/Server/data/configs/item_configs.json b/Server/data/configs/item_configs.json index b7e93f8e4..eb7238ac8 100644 --- a/Server/data/configs/item_configs.json +++ b/Server/data/configs/item_configs.json @@ -99712,7 +99712,7 @@ }, { "destroy_message": "You can reclaim this item from the place you found it.", - "examine": "A scroll for Sir Tiffy. The wax seal is broken. / Before reading the scroll: A scroll for Sir Tiffy. It is sealed with a wax insignia.", + "examine": "A scroll for Sir Tiffy. It is sealed with a wax insignia.", "durability": null, "name": "Knight's notes", "tradeable": "false", @@ -99722,7 +99722,7 @@ }, { "destroy_message": "You can reclaim this item from the place you found it.", - "examine": "A scroll for Sir Tiffy. The wax seal is broken. / Before reading the scroll: A scroll for Sir Tiffy. It is sealed with a wax insignia.", + "examine": "A scroll for Sir Tiffy. The wax seal is broken.", "durability": null, "name": "Knight's notes", "tradeable": "false", diff --git a/Server/src/main/content/global/handlers/iface/BookInterface.kt b/Server/src/main/content/global/handlers/iface/BookInterface.kt index f648187da..270a90c9a 100644 --- a/Server/src/main/content/global/handlers/iface/BookInterface.kt +++ b/Server/src/main/content/global/handlers/iface/BookInterface.kt @@ -14,9 +14,18 @@ import core.game.node.entity.player.Player * This will handle component(26), component(27) and component(49) globally. * DO NOT extend this class or override on(26), on(27), on(49) for defineInterfaceListeners. * - * Instead, simply call BookInterface.pageSetup(...) and pass two attributes. + * Instead, simply call BookInterface.pageSetup(...) and pass two attributes to open a book. * bookInterfaceCallback - function to callback (player: Player, pageNum: Int, buttonID: Int) : Boolean * bookInterfaceCurrentPage - 0 for first page. + * Recommend creating a display() function both to be called when opening an item and passing it to the callback. + * + * You may at any time after pageSetup, + * - call any functions below + * - call player.packetDispatch.sendInterfaceConfig + * - call player.packetDispatch.sendString + * + * @see content.region.desert.quest.thegolem.VarmensNotes for a quest-like example. + * @see content.global.handlers.item.book.GeneralRuleBook for an interactive page-jumping book. * * @author ovenbreado */ @@ -41,7 +50,7 @@ class BookInterface : InterfaceListener { /** Sets up standard pagination and page numbering. Call this for default setup of book components. */ fun pageSetup(player: Player, bookComponent: Int, title: String, contents: Array) { val currentPage = getAttribute(player, "bookInterfaceCurrentPage", 0) - closeInterface(player) // Important: Close previous book interfaces. + closeInterface(player) // Important: Close previous interfaces. if (bookComponent == FANCY_BOOK_26) { openInterface(player, FANCY_BOOK_26) // Important: Opens the current interface. clearBookLines(player, FANCY_BOOK_26, FANCY_BOOK_26_LINE_IDS); @@ -115,14 +124,15 @@ class BookInterface : InterfaceListener { } } - /** Check book is read. Trigger off */ + /** Function to check if player read to the last page. For quest triggers. */ fun isLastPage(pageNum: Int, totalPages: Int): Boolean { return pageNum == totalPages - 1; } /** PRIVATE: Increments the current page and invokes the callback function. */ private fun changePageAndCallback(player: Player, increment: Int, buttonId: Int) { - val callback :((player: Player, pageNum: Int, buttonId: Int) -> Boolean)? = getAttribute(player, "bookInterfaceCallback", null) + val callback: ((player: Player, pageNum: Int, buttonId: Int) -> Boolean)? = + getAttribute(player, "bookInterfaceCallback", null) val currentPage = getAttribute(player, "bookInterfaceCurrentPage", 0) setAttribute(player, "bookInterfaceCurrentPage", currentPage + increment) @@ -166,6 +176,7 @@ class PageSet(vararg pages: Page) { this.pages = pages as Array } } + /** Constructs a new Page object. */ class Page(vararg lines: BookLine) { val lines: Array @@ -174,8 +185,9 @@ class Page(vararg lines: BookLine) { this.lines = lines as Array } } -/** Constructs a new Page object. */ -class BookLine ( + +/** Constructs a new BookLine object. */ +class BookLine( val message: String, val child: Int ) \ No newline at end of file diff --git a/Server/src/main/content/global/handlers/iface/ScrollInterface.kt b/Server/src/main/content/global/handlers/iface/ScrollInterface.kt new file mode 100644 index 000000000..46405f374 --- /dev/null +++ b/Server/src/main/content/global/handlers/iface/ScrollInterface.kt @@ -0,0 +1,47 @@ +package content.global.handlers.iface + +import core.api.closeInterface +import core.api.openInterface +import core.game.node.entity.player.Player +import org.rs09.consts.Components + +/** + * Interface listener for Scrolls + * Use this to set up a simple scroll display. + * + * Currently, scrolls do not happen to have any button interactions, so no listeners are here yet. + * This is generally a helper class until certain scrolls require interactions. + * + * @author ovenbreado + */ +class ScrollInterface { + + companion object { + /** This is a 15-Lines scroll */ + private val MESSAGESCROLL_220_LINE_IDS = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) + + fun scrollSetup(player: Player, scrollComponent: Int, contents: Array) { + closeInterface(player) // Important: Close previous interfaces. + if (scrollComponent == Components.MESSAGESCROLL_220) { + openInterface(player, Components.MESSAGESCROLL_220) + setPageContent(player, Components.MESSAGESCROLL_220, MESSAGESCROLL_220_LINE_IDS, contents); + } + } + + /** Set text contents of scroll */ + fun setPageContent(player: Player, componentId: Int, scrollLineIds: Array, contents: Array) { + for (line in contents) { + // This is to prevent error child lines being set and crashing the client. + if (scrollLineIds.contains(line.child)) { + player.packetDispatch.sendString(line.message, componentId, line.child) + } + } + } + } +} + +/** Constructs a new ScrollLine object. */ +class ScrollLine( + val message: String, + val child: Int +) \ No newline at end of file diff --git a/Server/src/main/content/region/asgarnia/trollheim/dialogue/KnightsNotes.kt b/Server/src/main/content/region/asgarnia/trollheim/dialogue/KnightsNotes.kt new file mode 100644 index 000000000..582ad7c38 --- /dev/null +++ b/Server/src/main/content/region/asgarnia/trollheim/dialogue/KnightsNotes.kt @@ -0,0 +1,55 @@ +package content.region.asgarnia.trollheim.dialogue + +import content.global.handlers.iface.ScrollInterface +import content.global.handlers.iface.ScrollLine +import core.api.* +import core.game.interaction.IntType +import core.game.interaction.InteractionListener +import org.rs09.consts.Items +import org.rs09.consts.Components + +/** + * @author szu + */ +class KnightsNotes : InteractionListener { + companion object { + val CONTENTS = arrayOf( + ScrollLine("My friend, you were right to send me to investigate the",3), + ScrollLine("dwarf's drunken claims, for I have discovered a treasure",4), + ScrollLine("beyond our wildest dreams. The aviantese are alive, and I",5), + ScrollLine("suspect they still guard the godsword! Beneath the remnants",6), + ScrollLine("of the temple a great battle is being fought between followers",7), + ScrollLine("of Bandos, Armadyl, Saradomin and Zamorak. My command was",8), + ScrollLine("slaughtered and I am grieviously wounded. YOU MUST PREVENT",9), + ScrollLine("THE GODSWORD FROM FALLING INTO THE WRONG HANDS! I do not",10), + ScrollLine("know how I am going to get this message to you, why is that",11), + ScrollLine("talking skull never around when he's needed? Your comrade,",12), + ScrollLine("Sir Gerry.",13), + ); + } + + override fun defineListeners() { + // The scroll has not been opened. This will lead to a different dialogue with Sir Tiffy Cashien. + on(Items.KNIGHTS_NOTES_11734, IntType.ITEM, "read") { player, _ -> + sendDialogueOptions(player, "The scroll is sealed. Do you still want to open it?", "Yes", "No") + player!!.packetDispatch.sendInterfaceConfig(228, 6, true) + player!!.packetDispatch.sendInterfaceConfig(228, 9, false) // childId 7 is left 8 is right + addDialogueAction(player) { player, button -> + if (button == 2) { + sendMessage(player, "You break the wax seal and open the scroll."); + if (removeItem(player, Items.KNIGHTS_NOTES_11734)) { + addItem(player, Items.KNIGHTS_NOTES_11735) + ScrollInterface.scrollSetup(player, Components.MESSAGESCROLL_220, CONTENTS) + } + } + return@addDialogueAction + } + return@on true + } + // The scroll has been read. This will lead to a different dialogue with Sir Tiffy Cashien. + on(Items.KNIGHTS_NOTES_11735, IntType.ITEM, "read") { player, _ -> + ScrollInterface.scrollSetup(player, Components.MESSAGESCROLL_220, CONTENTS) + return@on true + } + } +} \ No newline at end of file