Implemented the castle wars manual book

This commit is contained in:
Oven Bread 2025-11-10 11:43:16 +00:00 committed by Ryan
parent d1cfe299c6
commit f9a193c8d7
2 changed files with 163 additions and 3 deletions

View file

@ -1,5 +1,6 @@
package content.global.handlers.iface
import content.global.handlers.iface.BookInterface.Companion.FANCY_BOOK_2_27
import core.api.closeInterface
import core.api.getAttribute
import core.api.openInterface
@ -158,9 +159,22 @@ class BookInterface : InterfaceListener {
if (pageSet == getAttribute(player, CURRENT_PAGE_ATTRIBUTE, 0)) {
player.packetDispatch.sendInterfaceConfig(componentId, enableLineId, false)
player.packetDispatch.sendModelOnInterface(modelId, componentId, drawLineId, 0)
player.packetDispatch.sendAngleOnInterface(componentId, drawLineId, zoom, pitch, yaw)
} else {
player.packetDispatch.sendInterfaceConfig(componentId, enableLineId, true)
player.packetDispatch.sendAngleOnInterface(componentId, drawLineId, zoom, pitch, yaw)
}
}
/** Sets item on lineId of pageSet (0 index). Call this in the display function after pageSetup. */
fun setItemOnPage(player: Player, pageSet: Int, itemId: Int, componentId: Int, enableLineId: Int, drawLineId: Int, zoom: Int, pitch: Int, yaw: Int) {
if (pageSet == getAttribute(player, CURRENT_PAGE_ATTRIBUTE, 0)) {
player.packetDispatch.sendInterfaceConfig(componentId, enableLineId, false)
player.packetDispatch.sendItemOnInterface(itemId, 1, componentId, drawLineId)
}
}
/** Clears models(pictures) on lineId of pageSet (0 index). Call this in the display function after pageSetup. */
fun clearModelsOnPage(player: Player, componentId: Int) {
BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS.forEach { drawId ->
player.packetDispatch.sendInterfaceConfig(componentId, drawId, true);
}
}

View file

@ -0,0 +1,146 @@
package content.minigame.castlewars
import content.data.Quests
import content.global.handlers.iface.BookInterface
import content.global.handlers.iface.BookLine
import content.global.handlers.iface.Page
import content.global.handlers.iface.PageSet
import core.api.getAttribute
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.entity.player.Player
import core.game.system.command.sets.ModelViewerCommandSet.Companion.ATTRIBUTE_MODEL_NUMBER
import core.game.system.command.sets.ModelViewerCommandSet.Companion.ATTRIBUTE_PITCH
import core.game.system.command.sets.ModelViewerCommandSet.Companion.ATTRIBUTE_YAW
import core.game.system.command.sets.ModelViewerCommandSet.Companion.ATTRIBUTE_ZOOM
import core.game.system.command.sets.ModelViewerCommandSet.Companion.DEF_BOOK
import core.game.world.GameWorld
import org.rs09.consts.Items
class CastlewarsBook : InteractionListener {
companion object {
private val TITLE = "Castle Wars Manual"
private val CONTENTS = arrayOf(
PageSet(
Page(
BookLine("Objective:", 38),
BookLine("The aim is to get into your", 39),
BookLine("opponents castle and take", 40),
BookLine("their team standard. Then", 41),
BookLine("bring that back and capture", 42),
BookLine("it on your teams standard. ", 43),
),
Page(
BookLine("Toolkit:", 58),
BookLine("This useful item allows you", 59),
BookLine("to repair broken doors and", 60),
BookLine("catapults. Simply use it on", 61),
BookLine("the item to be repaired, or", 62),
BookLine("have one in your inventory", 63),
BookLine("when you select the option,", 64),
BookLine("and you'll rebuild it!", 65)
)
),
PageSet(
Page(
BookLine("Bandages:", 43),
BookLine("These can be used to heal", 44),
BookLine("some health and restore some", 45),
BookLine("of your running energy.", 46),
BookLine("You can also use them to", 47),
BookLine("heal fellow players.", 48),
),
Page(
BookLine("Explosive Potion:", 58),
BookLine("A simple but effective item,", 59),
BookLine("use it to blow up your", 60),
BookLine("opponents catapult and", 61),
BookLine("barricades! It can also be", 62),
BookLine("used to clear the tunnels", 63),
BookLine("under the arena for some,", 64),
BookLine("sneak attacks into your", 65),
BookLine("opponents castle!", 66)
)
),
PageSet(
Page(
BookLine("Barricade:", 43),
BookLine("Use these constructs to block", 44),
BookLine("your opponents movement", 45),
BookLine("and prevent them accessing", 46),
BookLine("your castle. Each team can", 47),
BookLine("only have 10 built at any one", 48),
BookLine("time.", 49),
),
Page(
BookLine("Bucket:", 58),
BookLine("Fill a bucket with water and", 59),
BookLine("you can use it to put out a", 60),
BookLine("burning catapult or barricade,", 61),
BookLine("but be quick or it'll be", 62),
BookLine("destroyed.", 63),
)
),
PageSet(
Page(
BookLine("Tinderbox:", 43),
BookLine("Logs aren't all that's", 44),
BookLine("flammable, use a tinderbox to", 45),
BookLine("set light to your opponents", 46),
BookLine("You can also use them to", 47),
BookLine("catapult and barricades.", 48),
),
Page(
BookLine("Pickaxe:", 58),
BookLine("Use a pickaxe to mine your", 59),
BookLine("way through the tunnels", 60),
BookLine("under the arena for a sneak", 61),
BookLine("attack into your opponents", 62),
BookLine("castle. Don't forget to", 63),
BookLine("collapse the tunnels into your", 64),
BookLine(" own castle though! ", 65),
)
),
PageSet(
Page(
BookLine("Catapult:", 43),
BookLine("Use this war machine to", 44),
BookLine("launch rocks at your", 45),
BookLine("opponents. Just give it rough", 46),
BookLine("coordinates and let the rock", 47),
BookLine("fly, just be careful not to hit", 48),
BookLine("your team with it!", 49),
),
Page(
BookLine("Rock:", 58),
BookLine("Used as ammo for the", 59),
BookLine("catapult, and not much else.", 60),
BookLine("Brings new meaning to the", 61),
BookLine("phrase 'flies like a rock'.", 62),
)
),
)
private fun display(player: Player, pageNum: Int, buttonID: Int) : Boolean {
BookInterface.pageSetup(player, BookInterface.FANCY_BOOK_2_27, TITLE, CONTENTS)
BookInterface.clearModelsOnPage(player, BookInterface.FANCY_BOOK_2_27);
BookInterface.setItemOnPage(player, 0, Items.TOOLKIT_4051, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[17], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[17], 768, 192, 1792)
BookInterface.setItemOnPage(player, 1, Items.BANDAGES_4049, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[2], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[2], 768, 192, 1792)
BookInterface.setItemOnPage(player, 1, Items.EXPLOSIVE_POTION_4045, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[17], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[17], 768, 192, 1792)
BookInterface.setItemOnPage(player, 2, Items.BARRICADE_4053, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[2], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[2], 768, 192, 1792)
BookInterface.setItemOnPage(player, 2, Items.BUCKET_OF_WATER_1929, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[17], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[17], 768, 192, 1792)
BookInterface.setItemOnPage(player, 3, Items.TINDERBOX_590, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[2], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[2], 768, 192, 1792)
BookInterface.setItemOnPage(player, 3, Items.BRONZE_PICKAXE_1265, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[17], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[17], 768, 192, 1792)
BookInterface.setModelOnPage(player, 4, 38202, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[4], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[4], 4048, 192, 768)
BookInterface.setItemOnPage(player, 4, Items.ROCK_4043, BookInterface.FANCY_BOOK_2_27, BookInterface.FANCY_BOOK_2_27_IMAGE_ENABLE_DRAW_IDS[17], BookInterface.FANCY_BOOK_2_27_IMAGE_DRAW_IDS[17], 768, 192, 1792)
return true
}
}
override fun defineListeners() {
on(Items.CASTLEWARS_MANUAL_4055, IntType.ITEM, "read") { player, _ ->
BookInterface.openBook(player, BookInterface.FANCY_BOOK_2_27, ::display)
return@on true
}
}
}