From 4f7e36013591ae165f4e1daed3be294ff454db9c Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Fri, 5 Jul 2019 19:21:31 -0500 Subject: [PATCH 1/6] bank tabs with proper insertion --- .../rsmod/plugins/content/inter/bank/Bank.kt | 4 - .../plugins/content/inter/bank/BankTabs.kt | 137 ++++++++++++++++++ .../content/inter/bank/bank.plugin.kts | 33 ++++- .../content/inter/bank/bank_tabs.plugin.kts | 25 ++++ 4 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt index 2f1de3b972..7fe7dcf2e1 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt @@ -11,9 +11,6 @@ import gg.rsmod.plugins.api.ext.* * @author Tom */ object Bank { - - const val TAB_COUNT = 9 - const val BANK_INTERFACE_ID = 12 const val BANK_MAINTAB_COMPONENT = 13 const val INV_INTERFACE_ID = 15 @@ -25,7 +22,6 @@ object Bank { const val LAST_X_INPUT = 3960 const val QUANTITY_VARBIT = 6590 const val SELECTED_TAB_VARBIT = 4150 - const val TAB0_VARBIT = 4171 /** * Visual varbit for the "Bank your loot" tab area interface when storing diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt new file mode 100644 index 0000000000..1953240c65 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt @@ -0,0 +1,137 @@ +package gg.rsmod.plugins.content.inter.bank + +import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT +import gg.rsmod.game.model.entity.Player +import gg.rsmod.game.model.item.Item +import gg.rsmod.plugins.api.ext.getVarbit +import gg.rsmod.plugins.api.ext.setVarbit +import gg.rsmod.plugins.content.inter.bank.Bank.insert + +/** + * @author bmyte + */ +object BankTabs{ + /** + * Handles the dropping of items into the specified tab of the player's [Bank]. + * + * @param player + * The acting [Player] for which the [INTERACTING_ITEM_SLOT] [Item] should + * be dropped into the specified [dstTab] + * + * @param dstTab + * The bank tab number for which the [INTERACTING_ITEM_SLOT] [Item] is + * to be dropped into. + */ + fun dropToTab(player: Player, dstTab: Int){ + val container = player.bank + + val srcSlot = player.attr[INTERACTING_ITEM_SLOT]!! + val curTab = getCurrentTab(player, srcSlot) + + if(dstTab == curTab){ + return + } + else{ + if(dstTab == 0){ //add to main tab don't insert + container.insert(srcSlot, container.nextFreeSlot - 1) + player.setVarbit(4170+curTab, player.getVarbit(4170+curTab)-1) + // check for empty tab shift + if(player.getVarbit(4170+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } else{ + if(dstTab < curTab || curTab == 0) + container.insert(srcSlot, insertionPoint(player, dstTab)) + else + container.insert(srcSlot, insertionPoint(player, dstTab) - 1) + player.setVarbit(4170+dstTab, player.getVarbit(4170+dstTab)+1) + if(curTab != 0){ + player.setVarbit(4170+curTab, player.getVarbit(4170+curTab)-1) + // check for empty tab shift + if(player.getVarbit(4170+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } + } + } + } + + /** + * Determines the tab a given slot falls into based on + * associative varbit analysis. + * + * @param player + * The acting [Player] whose [Bank] tabs are to be checked + * + * @param slot + * The associated slot for a given [Item] within the player's [Bank] + * + * @return -> Int + * The tab which the specified [slot] resides + */ + fun getCurrentTab(player: Player, slot: Int) : Int { + var current = 0 + for(tab in 1..9){ + current += player.getVarbit(4170+tab) + if(slot < current){ + return tab + } + } + return 0 + } + + /** + * Tabulates the number of tabs the [player] is currently using + * based off associative varbit analysis. + * + * @param player + * The acting [Player] to get the number of in-use tabs for + * + * @return -> Int + * The number of tabs the player has in-use/unlocked + */ + fun numTabsUnlocked(player: Player) : Int { + var tabsUnlocked = 0 + for(tab in 1..9) + if(player.getVarbit(4170 + tab) > 0) + tabsUnlocked++ + return tabsUnlocked + } + + /** + * Determines the insertion point for an item being added to + * a tab based on the tab order and number of items in it and + * previous tabs. + * + * @param player + * The acting [Player] to find the insertion point for placing + * an [Item] in the bank tab specified by [tabIndex] + * + * @param tabIndex + * The tab for which the insertion point is desired + * + * @return -> Int + * The insertion index for inserting into the desired tab + */ + fun insertionPoint(player: Player, tabIndex: Int = 0) : Int { + var dex = 0 + for(tab in 1..tabIndex) + dex += player.getVarbit(4170+tab) + return dex + } + + /** + * Performs the shifting of [Bank] tabs' varbit pointers to remove + * an empty tab, effectively shifting greater tabs down. + * + * @param player + * The acting [Player] which needs bank tabs shifted + * + * @param emptyTabIdx + * The newly emptied bank tab to shift out + */ + fun shiftTabs(player: Player, emptyTabIdx: Int){ + val numUnlocked = numTabsUnlocked(player) + for(tab in emptyTabIdx..numUnlocked) + player.setVarbit(4170+tab, player.getVarbit(4171+tab)) + player.setVarbit(4171+numUnlocked, 0) + } +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts index dc60cc58e4..55c9526302 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts @@ -5,6 +5,10 @@ import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR import gg.rsmod.plugins.content.inter.bank.Bank.insert import gg.rsmod.plugins.content.inter.bank.Bank.removePlaceholder +import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.getCurrentTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked +import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs on_interface_open(Bank.BANK_INTERFACE_ID) { player.bank.shift() @@ -255,12 +259,37 @@ on_component_to_component_item_swap( val container = player.bank + /** + * Handles the empty box components in the last row of each tab + * for dropping items into the specified tab's empty space. + */ + if(dstSlot in 834..843){ + dropToTab(player, dstSlot - 834) + return@on_component_to_component_item_swap + } + if (srcSlot in 0 until container.occupiedSlotCount && dstSlot in 0 until container.occupiedSlotCount) { val insertMode = player.getVarbit(Bank.REARRANGE_MODE_VARBIT) == 1 if (!insertMode) { container.swap(srcSlot, dstSlot) - } else { - container.insert(srcSlot, dstSlot) + } else { // insert mode patch for movement between bank tabs and updating varbits + val curTab = getCurrentTab(player, srcSlot) + val dstTab = getCurrentTab(player, dstSlot) + if(dstTab != curTab){ + if((dstTab>curTab && curTab!=0) || dstTab==0) + container.insert(srcSlot, dstSlot - 1) + else + container.insert(srcSlot, dstSlot) + + if(dstTab != 0) {player.setVarbit(4170+dstTab, player.getVarbit(4170+dstTab)+1)} + if(curTab != 0) { + player.setVarbit(4170+curTab, player.getVarbit(4170+curTab)-1) + if(player.getVarbit(4170+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } + } else{ + container.insert(srcSlot, dstSlot) + } } } else { // Sync the container on the client diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts new file mode 100644 index 0000000000..1292d7ba36 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts @@ -0,0 +1,25 @@ +package gg.rsmod.plugins.content.inter.bank + +import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab + +val BANK_TABLIST_ID = 11 + +/** + * Moving items to tabs via the top tabs bar. + */ +on_component_to_component_item_swap( + srcInterfaceId = Bank.BANK_INTERFACE_ID, srcComponent = Bank.BANK_MAINTAB_COMPONENT, + dstInterfaceId = Bank.BANK_INTERFACE_ID, dstComponent = BANK_TABLIST_ID) { + val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! + dropToTab(player, dstSlot - 10) +} + +/** + * Clears all bank tab varbits for the player, effectively + * dumping all items back into the one main tab. + */ +on_command("tabreset"){ + for(tab in 1..9) + player.setVarbit(4170+tab, 0) +} \ No newline at end of file From 4dfd69f2dd3715464b8b056ac5488a8d0784d1e9 Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Sat, 6 Jul 2019 01:04:49 -0500 Subject: [PATCH 2/6] bank tabs with deposit and withdraw patches --- .../kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt | 8 ++++++++ .../gg/rsmod/plugins/content/inter/bank/BankTabs.kt | 2 ++ .../gg/rsmod/plugins/content/inter/bank/bank.plugin.kts | 7 +++++++ .../plugins/content/inter/bank/bank_tabs.plugin.kts | 9 ++++++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt index 7fe7dcf2e1..34607c2c8d 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt @@ -6,6 +6,7 @@ import gg.rsmod.game.model.entity.Player import gg.rsmod.game.model.item.Item import gg.rsmod.plugins.api.InterfaceDestination import gg.rsmod.plugins.api.ext.* +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint /** * @author Tom @@ -84,6 +85,9 @@ object Bank { val from = p.inventory val to = p.bank + val oldFree = to.freeSlotCount + val curTab = p.getVarbit(SELECTED_TAB_VARBIT) + val amount = Math.min(from.getItemCount(id), amt) var deposited = 0 @@ -109,6 +113,10 @@ object Bank { if (transfer != null) { deposited += transfer.completed + if(placeholderSlot==-1 && curTab!=0 && oldFree!=to.freeSlotCount){ // shift newly add items to tab position + to.insert(to.getItemIndex(copy.id, false), insertionPoint(p, curTab)) + p.setVarbit(4170+curTab, p.getVarbit(4170+curTab)+1) + } } } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt index 1953240c65..8ec312bc67 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt @@ -112,6 +112,8 @@ object BankTabs{ * The insertion index for inserting into the desired tab */ fun insertionPoint(player: Player, tabIndex: Int = 0) : Int { + if(tabIndex == 0) + return player.bank.nextFreeSlot var dex = 0 for(tab in 1..tabIndex) dex += player.getVarbit(4170+tab) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts index 55c9526302..a61f784703 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts @@ -11,6 +11,13 @@ import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs on_interface_open(Bank.BANK_INTERFACE_ID) { + var slotOffset = 0 + for(tab in 1..9){ + for(slot in slotOffset until slotOffset+player.getVarbit(4170+tab)) // from beginning slot of tab to end + if(player.bank[slot] == null) + player.setVarbit(4170+tab, player.getVarbit(4170+tab)-1) + slotOffset += player.getVarbit(4170+tab) + } player.bank.shift() } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts index 1292d7ba36..881ce1b5b8 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts @@ -5,6 +5,13 @@ import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab val BANK_TABLIST_ID = 11 +/** + * Handles setting the current selected tab varbit on tab selection. + */ +on_button(Bank.BANK_INTERFACE_ID, BANK_TABLIST_ID){ + player.setVarbit(Bank.SELECTED_TAB_VARBIT, player.getInteractingSlot()-10) +} + /** * Moving items to tabs via the top tabs bar. */ @@ -22,4 +29,4 @@ on_component_to_component_item_swap( on_command("tabreset"){ for(tab in 1..9) player.setVarbit(4170+tab, 0) -} \ No newline at end of file +} From e4ad0649449839e9fe5537c6a59f2d3998d68316 Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Sat, 13 Jul 2019 17:41:54 -0500 Subject: [PATCH 3/6] completed bank tabs; added swap and insert tab ordering --- .../rsmod/plugins/content/inter/bank/Bank.kt | 5 +- .../plugins/content/inter/bank/BankTabs.kt | 26 +++++ .../content/inter/bank/bank.plugin.kts | 24 +++- .../content/inter/bank/bank_tabs.plugin.kts | 110 +++++++++++++++++- 4 files changed, 158 insertions(+), 7 deletions(-) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt index 34607c2c8d..5001c15a93 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt @@ -114,7 +114,10 @@ object Bank { if (transfer != null) { deposited += transfer.completed if(placeholderSlot==-1 && curTab!=0 && oldFree!=to.freeSlotCount){ // shift newly add items to tab position - to.insert(to.getItemIndex(copy.id, false), insertionPoint(p, curTab)) + var fromPos = to.getItemIndex(copy.id, false) + fromPos = if(fromPos != -1) fromPos else to.nextFreeSlot-1 + val toPos = insertionPoint(p, curTab) + to.insert(fromPos, toPos) p.setVarbit(4170+curTab, p.getVarbit(4170+curTab)+1) } } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt index 8ec312bc67..76a380c5b0 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt @@ -120,6 +120,32 @@ object BankTabs{ return dex } + /** + * Determines the beginning index for a specified bank tab + * based on the tab order and number of items in previous tabs. + * + * @param player + * The acting [Player] to find the start point for the bank tab + * specified by [tabIndex] + * + * @param tabIndex + * The tab for which the start point is desired + * + * @return -> Int + * The start index for the beginning of the desired tab + */ + fun startPoint(player: Player, tabIndex: Int = 0) : Int { + var dex = 0 + if(tabIndex == 0){ + for(tab in 1..9) + dex += player.getVarbit(4170+tab) + } else{ + for(tab in 1 until tabIndex) + dex += player.getVarbit(4170+tab) + } + return dex + } + /** * Performs the shifting of [Bank] tabs' varbit pointers to remove * an empty tab, effectively shifting greater tabs down. diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts index a61f784703..2ee54f5a5d 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts @@ -3,20 +3,28 @@ package gg.rsmod.plugins.content.inter.bank import gg.rsmod.game.action.EquipAction import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.bank.Bank.SELECTED_TAB_VARBIT import gg.rsmod.plugins.content.inter.bank.Bank.insert import gg.rsmod.plugins.content.inter.bank.Bank.removePlaceholder import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab import gg.rsmod.plugins.content.inter.bank.BankTabs.getCurrentTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs on_interface_open(Bank.BANK_INTERFACE_ID) { var slotOffset = 0 for(tab in 1..9){ - for(slot in slotOffset until slotOffset+player.getVarbit(4170+tab)) // from beginning slot of tab to end - if(player.bank[slot] == null) + val size = player.getVarbit(4170+tab) + for(slot in slotOffset until slotOffset+size){ // from beginning slot of tab to end + if(player.bank[slot] == null){ player.setVarbit(4170+tab, player.getVarbit(4170+tab)-1) - slotOffset += player.getVarbit(4170+tab) + // check for empty tab shift + if(player.getVarbit(4170+tab)==0 && tab<=numTabsUnlocked(player)) + shiftTabs(player, tab) + } + } + slotOffset += size } player.bank.shift() } @@ -66,6 +74,11 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 42) { } if (deposited > 0) { any = true + val curTab = player.getVarbit(SELECTED_TAB_VARBIT) + if(placeholderSlot==-1 && curTab!=0){ + to.insert(to.getItemIndex(item.id, false), insertionPoint(player, curTab)) + player.setVarbit(4170+curTab, player.getVarbit(4170+curTab)+1) + } } } @@ -91,6 +104,11 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 44) { } if (deposited > 0) { any = true + val curTab = player.getVarbit(SELECTED_TAB_VARBIT) + if(placeholderSlot==-1 && curTab!=0){ + to.insert(to.getItemIndex(item.id, false), insertionPoint(player, curTab)) + player.setVarbit(4170+curTab, player.getVarbit(4170+curTab)+1) + } EquipAction.onItemUnequip(player, item.id, i) } } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts index 881ce1b5b8..9c9c0b7d8b 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts @@ -1,7 +1,14 @@ package gg.rsmod.plugins.content.inter.bank +import gg.rsmod.game.model.attr.INTERACTING_COMPONENT_CHILD +import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.bank.Bank.insert import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint +import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked +import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs +import gg.rsmod.plugins.content.inter.bank.BankTabs.startPoint val BANK_TABLIST_ID = 11 @@ -9,7 +16,9 @@ val BANK_TABLIST_ID = 11 * Handles setting the current selected tab varbit on tab selection. */ on_button(Bank.BANK_INTERFACE_ID, BANK_TABLIST_ID){ - player.setVarbit(Bank.SELECTED_TAB_VARBIT, player.getInteractingSlot()-10) + val dstTab = player.getInteractingSlot()-10 + if(dstTab <= numTabsUnlocked(player)) + player.setVarbit(Bank.SELECTED_TAB_VARBIT, dstTab) } /** @@ -18,8 +27,103 @@ on_button(Bank.BANK_INTERFACE_ID, BANK_TABLIST_ID){ on_component_to_component_item_swap( srcInterfaceId = Bank.BANK_INTERFACE_ID, srcComponent = Bank.BANK_MAINTAB_COMPONENT, dstInterfaceId = Bank.BANK_INTERFACE_ID, dstComponent = BANK_TABLIST_ID) { - val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! - dropToTab(player, dstSlot - 10) + val srcComponent = player.attr[INTERACTING_COMPONENT_CHILD]!! + if(srcComponent == BANK_TABLIST_ID){ // attempting to drop tab on bank!! + return@on_component_to_component_item_swap + } else{ // perform drop to tab + val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! + dropToTab(player, dstSlot - 10) + } +} + +/** + * Moving tabs via the top tabs bar to swap/insert their order. + */ +on_component_to_component_item_swap( + srcInterfaceId = Bank.BANK_INTERFACE_ID, srcComponent = BANK_TABLIST_ID, + dstInterfaceId = Bank.BANK_INTERFACE_ID, dstComponent = BANK_TABLIST_ID) { + val container = player.bank + + val srcTab = player.attr[INTERACTING_ITEM_SLOT]!! - 10 + val dstTab = player.attr[OTHER_ITEM_SLOT_ATTR]!! - 10 + + if(dstTab==0){ + for(item in startPoint(player, srcTab) until insertionPoint(player, srcTab)){ + container.insert(item, container.nextFreeSlot - 1) + player.setVarbit(4170+srcTab, player.getVarbit(4170+srcTab)-1) + // check for empty tab shift + if(player.getVarbit(4170+srcTab)==0 && srcTab<=numTabsUnlocked(player)) + shiftTabs(player, srcTab) + } + return@on_component_to_component_item_swap + } + + val srcSize = player.getVarbit(4170+srcTab) + val dstSize = player.getVarbit(4170+dstTab) + + val insertMode = player.getVarbit(Bank.REARRANGE_MODE_VARBIT) == 1 + if(insertMode){ + if(dstTab < srcTab){ // insert each of the items in srcTab directly before dstTab moving index up each time to account for shifts + var destination = startPoint(player, dstTab) + for(item in startPoint(player, srcTab) until insertionPoint(player, srcTab)) + container.insert(item, destination++) + + // update tab size varbits according to insertion location + var holder = player.getVarbit(4170+dstTab) + player.setVarbit(4170+dstTab, srcSize) + for(tab in dstTab+1 .. srcTab){ + val temp = player.getVarbit(4170+tab) + player.setVarbit(4170+tab, holder) + holder = temp + } + } else{ // insert each item in srcTab before dstTab consuming index move in the shifts already in insert() + if(dstTab == srcTab+1) + return@on_component_to_component_item_swap + + val destination = startPoint(player, dstTab)-1 + + val srcStart = startPoint(player, srcTab) + for(item in 1..srcSize) + container.insert(srcStart,destination) + + var holder = player.getVarbit(4169+dstTab) + player.setVarbit(4169+dstTab, srcSize) + for(tab in dstTab-2 downTo srcTab){ + val temp = player.getVarbit(4170+tab) + player.setVarbit(4170+tab, holder) + holder = temp + } + } + } else{ // swap tabs in place + val smallerTab = if(dstSize<=srcSize) dstTab else srcTab + val smallSize = player.getVarbit(4170+smallerTab) + val largerTab = if(dstSize>srcSize) dstTab else srcTab + val largeSize = player.getVarbit(4170+largerTab) + + val smallStart = startPoint(player, smallerTab) + val largeStart = startPoint(player, largerTab) + + // direct swap those that will easily fit + var dex = largeStart + for(item in smallStart until insertionPoint(player, smallerTab)) + container.swap(item, dex++) + + // insert left overs from larger tab into smaller tab's end + var insertDex = insertionPoint(player, smallerTab) + var largeEnd = insertionPoint(player, largerTab) + while(dex != largeEnd){ + if(largerTab < smallerTab) { // not size but tab order + container.insert(dex, insertDex - 1) + largeEnd-- + } + else + container.insert(dex++, insertDex++) + } + + // update each tab's size to reflect new contents + player.setVarbit(4170+smallerTab, largeSize) + player.setVarbit(4170+largerTab, smallSize) + } } /** From 599e08ed99a004a45d3cd6841387cdaf5f88c127 Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Sun, 14 Jul 2019 02:07:38 -0500 Subject: [PATCH 4/6] added patch to IfButtonDHandler to set INTERACTING_CHILD_COMPONENT AttributeKey --- .../kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt index f4c6bf1436..342bf46352 100644 --- a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt +++ b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt @@ -31,6 +31,8 @@ class IfButtonDHandler : MessageHandler { client.attr[INTERACTING_ITEM_SLOT] = fromSlot client.attr[OTHER_ITEM_SLOT_ATTR] = toSlot + client.attr[INTERACTING_COMPONENT_CHILD] = fromComponent + val swapped = world.plugins.executeComponentToComponentItemSwap( client, fromInterfaceId, fromComponent, toInterfaceId, toComponent) From d74fcc5363e9a1fd9b4302636f10506c10de5312 Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Tue, 16 Jul 2019 16:42:03 -0500 Subject: [PATCH 5/6] patch adding import for INTERACTING_CHILD_COMPONENT and dump tab to main bank fix --- .../gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts | 5 ++++- .../kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts index 9c9c0b7d8b..9bf560de63 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts @@ -48,8 +48,11 @@ on_component_to_component_item_swap( val dstTab = player.attr[OTHER_ITEM_SLOT_ATTR]!! - 10 if(dstTab==0){ - for(item in startPoint(player, srcTab) until insertionPoint(player, srcTab)){ + var item = startPoint(player, srcTab) + var end = insertionPoint(player, srcTab) + while(item != end){ container.insert(item, container.nextFreeSlot - 1) + end-- player.setVarbit(4170+srcTab, player.getVarbit(4170+srcTab)-1) // check for empty tab shift if(player.getVarbit(4170+srcTab)==0 && srcTab<=numTabsUnlocked(player)) diff --git a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt index 342bf46352..cb1596a9a6 100644 --- a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt +++ b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt @@ -3,6 +3,7 @@ package gg.rsmod.game.message.handler import gg.rsmod.game.message.MessageHandler import gg.rsmod.game.message.impl.IfButtonDMessage import gg.rsmod.game.model.World +import gg.rsmod.game.model.attr.INTERACTING_COMPONENT_CHILD import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR import gg.rsmod.game.model.entity.Client @@ -31,8 +32,7 @@ class IfButtonDHandler : MessageHandler { client.attr[INTERACTING_ITEM_SLOT] = fromSlot client.attr[OTHER_ITEM_SLOT_ATTR] = toSlot - client.attr[INTERACTING_COMPONENT_CHILD] = fromComponent - + client.attr[INTERACTING_COMPONENT_CHILD] = fromComponent val swapped = world.plugins.executeComponentToComponentItemSwap( client, fromInterfaceId, fromComponent, toInterfaceId, toComponent) From 47daeeafcd879e1050c3f5ba8075bf80e227af8f Mon Sep 17 00:00:00 2001 From: bmyte <30365861+bmyte@users.noreply.github.com> Date: Thu, 24 Dec 2020 00:48:24 -0600 Subject: [PATCH 6/6] rev193 upgrade with decent bank tabs and most interfaces previously implemented working again --- README.md | 207 +- data/blocks.yml | 121 +- data/packets.yml | 851 +++--- game.example.yml | 6 +- .../gg/rsmod/plugins/api/EquipmentType.kt | 2 + .../rsmod/plugins/api/InterfaceDestination.kt | 52 +- .../gg/rsmod/plugins/api/OSRSGameframe.kt | 2 - .../kotlin/gg/rsmod/plugins/api/cfg/Items.kt | 1138 +++++++- .../kotlin/gg/rsmod/plugins/api/cfg/Npcs.kt | 1660 +++++++++-- .../kotlin/gg/rsmod/plugins/api/cfg/Objs.kt | 2519 ++++++++++++++++- .../gg/rsmod/plugins/api/ext/PlayerExt.kt | 9 +- .../edgeville/chat/emblem_trader.plugin.kts | 10 +- .../areas/edgeville/spawns/bankers.plugin.kts | 8 +- .../areas/edgeville/spawns/guards.plugin.kts | 12 +- .../areas/edgeville/spawns/men.plugin.kts | 14 +- .../wilderness/wilderness_areas.plugin.kts | 2 +- .../plugins/content/cmd/commands.plugin.kts | 48 +- .../plugins/content/cmd/devops.plugin.kts | 48 + .../plugins/content/inter/attack/AttackTab.kt | 1 + .../inter/attack/attack_tab.plugin.kts | 35 +- .../rsmod/plugins/content/inter/bank/Bank.kt | 39 +- .../plugins/content/inter/bank/BankTabs.kt | 170 ++ .../inter/bank/{PawnExt.kt => Extensions.kt} | 0 .../content/inter/bank/bank.plugin.kts | 168 +- .../content/inter/bank/bank_tabs.plugin.kts | 134 + .../content/inter/bank/commands.plugin.kts | 17 + .../inter/emotes/emotes_tab.plugin.kts | 9 +- .../inter/equipstats/EquipmentStats.kt | 38 +- .../equipstats/equipment_stats.plugin.kts | 50 +- .../inter/follower/call_follower.plugin.kts | 4 +- .../plugins/content/inter/kod/KeptOnDeath.kt | 21 +- .../inter/kod/kept_on_death.plugin.kts | 8 +- .../content/inter/options/OptionsTab.kt | 32 +- .../inter/options/advanced_options.plugin.kts | 20 +- .../inter/options/bond_pouch.plugin.kts | 2 +- .../options/game_notifications.plugin.kts | 5 +- .../inter/options/house_options.plugin.kts | 2 +- .../inter/options/options_tab.plugin.kts | 61 +- .../content/inter/priceguide/PriceGuide.kt | 22 +- .../inter/priceguide/price_guide.plugin.kts | 31 +- .../content/inter/spellfilter/SpellFilters.kt | 3 +- .../inter/spellfilter/spell_filter.plugin.kts | 33 +- .../content/inter/welcome/WelcomeScreen.kt | 27 + .../inter/welcome/welcome_screen.plugin.kts | 19 + .../content/inter/worldmap/WorldMap.kt | 4 +- .../inter/worldmap/world_map.plugin.kts | 52 +- .../ringofdueling/ring_of_dueling.plugin.kts | 2 +- .../mechanics/equipment/equipment.plugin.kts | 29 +- .../mechanics/run/run_energy.plugin.kts | 2 +- .../content/npcs/banker/banker.plugin.kts | 2 +- .../content/npcs/man/man_chat.plugin.kts | 6 +- .../gg/rsmod/plugins/content/osrs.plugin.kts | 34 +- .../thieving/pickpocket/PickpocketNpc.kt | 30 +- .../rsmod/game/message/MessageDecoderSet.kt | 2 + .../game/message/decoder/IfModelOp1Decoder.kt | 12 + .../game/message/decoder/OpObj2Decoder.kt | 18 + .../message/encoder/UpdateInvFullEncoder.kt | 11 +- .../game/message/handler/IfButtonDHandler.kt | 2 + .../game/message/handler/IfModelOp1Handler.kt | 14 + .../game/message/handler/OpObj2Handler.kt | 55 + .../game/message/impl/IfModelOp1Message.kt | 5 + .../rsmod/game/message/impl/OpObj2Message.kt | 8 + .../model/region/update/EntityUpdateType.kt | 18 +- .../game/sync/segment/AddLocalNpcSegment.kt | 4 +- .../sync/segment/PlayerUpdateBlockSegment.kt | 2 +- .../gg/rsmod/net/codec/login/LoginDecoder.kt | 49 +- .../kotlin/gg/rsmod/net/packet/DataType.kt | 12 +- .../gg/rsmod/net/packet/GamePacketBuilder.kt | 52 +- .../gg/rsmod/net/packet/GamePacketReader.kt | 44 +- .../kotlin/gg/rsmod/util/io/BufferUtils.kt | 43 + 70 files changed, 6718 insertions(+), 1454 deletions(-) create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/devops.plugin.kts create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt rename game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/{PawnExt.kt => Extensions.kt} (100%) create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/commands.plugin.kts create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/WelcomeScreen.kt create mode 100644 game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/welcome_screen.plugin.kts create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/decoder/IfModelOp1Decoder.kt create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/decoder/OpObj2Decoder.kt create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/handler/IfModelOp1Handler.kt create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/handler/OpObj2Handler.kt create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/impl/IfModelOp1Message.kt create mode 100644 game/src/main/kotlin/gg/rsmod/game/message/impl/OpObj2Message.kt diff --git a/README.md b/README.md index fddae2e992..25e5bfe5b3 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,53 @@ # RS Mod -**RS Mod** is a server that is highly flexible and user-friendly. We allow the -developer to make and create any sort of plugin they wish without having to -modify the core game module. People without developing experience can have -others make plugins for them and simply drop them into the Plugins module -and it'll automatically load on the next server startup! +[![revision: 193][rev-badge]][patch] -## Getting Started -You can learn how to get started here: [RS Mod Wiki](https://github.com/Tomm0017/rsmod/wiki/Creating-Plugins) +**RS Mod** is a highly flexible user-friendly game server for use with the OSRS client. Implemented in a modular way, the framework allows developers to make and create any sort of plugin they wish without having to +modify the core game module. Due to the plugin capabilities, even owners without programming experience can just have others make plugins for them and simply drop them into the plugins module to be automatically loaded on the next startup! + +
+ RS Mod v2.0 supersedes this!! + + ``` + This repo is entirely separate from the main project which is effectively **DEAD**; as such + you should not expect a great deal of contributions, advancement, or support with this base! + While you can usually find me in the RS Mod discord, their channels will ultimately be for + RS Mod v2.0 and variations from the main repo should see you coming to me for help if using + this codebase. Just shoot me a DM. + ``` +
## Installation -There's two ways to launch RS Mod. One is for users who want to look into the code and -possibly create their own content. The other is for users who simply want to run the server -as fast as possible and log in quick. - -### I want to run the server quickly -- Go to the repository's release page: [Releases](https://github.com/Tomm0017/rsmod/releases) -- Download the latest release (note: *not* the source code package) -- Extract the archive on your desktop (or anywhere of your preference) -- Open the extracted folder and open the following directory: ``game-${version-number}/bin`` -- If you are running Windows, run the ``game.bat`` file. -If you are running Linux or Mac, run the ``game`` file -- The first time you launch it, you will receive a prompt stating that you do not -have an RSA private key. Enter ``y`` on your terminal/command prompt and wait for -a message stating that your key was created. **Do not close the terminal/command prompt** -- Once your key is created, you will have to follow the instructions on the terminal/command prompt - - You need to copy the public keys you are given and replace them in your client - - In your client, you can find the text ``BigInteger("10001`` which will usually be the - place where you need to replace both the public keys (the ``"10001"`` key is usually the same) - - Once you have replaced the keys in the client, you can restart the server and launch your client -- The server release comes with a cache and XTEA keys you can use. Current revision: ``180`` - -### I want to run the server and begin making my own content - -#### 1) Clone/Download the Repository -- Go to the repository page: [RS Mod](https://github.com/Tomm0017/rsmod) -- Clone or download the repository -- Extract the repository in your desktop (or anywhere else you prefer) - - Note: make sure you use ``Extract here`` and *not* ``Extract to rs-mod-master\``, unless - you know what you're doing (it can lead to silly mistakes when setting up your project) - -#### 2) Open the project in IntelliJ -- If you do not have IntelliJ, you can download it from here: https://www.jetbrains.com/idea/download/ + +#### 1) Open IntelliJ +- If you do not have IntelliJ, you can download it from here: https://www.jetbrains.com/idea/download/other.html + +- Rs Mod also uses Kotlin and will require installation of the plugin: https://plugins.jetbrains.com/plugin/6954-kotlin/versions/stable/96647 + +_Note| due to a regression in KotlinScript functionalities in the newest versions of the plugin it is **imperative** you install a version below 1.4.20!_ + +#### 2) Import the project into IntelliJ + +##### -- Using git Revision Control (Recommended) +- In your IntelliJ window, go to the top-left menu bar and navigate to ``File -> New -> Project from Version Control...`` +- Enter the project's git repo URL: https://github.com/bmyte/rsmod.git + - _Note| this will clone the master repo into a local one on your machine and REQUIRES; it is recommended to become familiar with aspects of git revision control for the purposes of maintaining your own changes and even setting up your own remote repo allowing for changes to be stored and synced using services like GitHub_ +- Give the project a bit of time to clone the repo and create and index its files + +##### -- Downloading the source (for those who do not want to install git) + +- Download this repository +- Extract the repository on your desktop (or directory of choice) + - _Note| make sure you use ``Extract here`` and *not* ``Extract to rs-mod-master\``, unless you know what you're doing (it can lead to silly mistakes when setting up your project)_ - In your IntelliJ window, go to the top-left menu bar and navigate to ``File -> New -> Project from Existing Sources...`` -- Select the RSMod repository which you downloaded on the previous step - In the ``Import Project`` window, select ``Import project from external model`` -> ``Gradle`` - In the next window you want to select the following and unselect anything else: - * Select ``Create separate module per source set`` - * Select ``Use default gradle wrapper (recommended)`` - * In the ``Global Gradle settings`` section: - * If ``Offline work`` is selected, unselect it + - Select ``Create separate module per source set`` + - Select ``Use default gradle wrapper (recommended)`` + - In the ``Global Gradle settings`` section: + - If ``Offline work`` is selected, unselect it - Give the project a bit of time to create and index its files -#### 3) Install RSMod +#### 3) Install RS Mod - On the top-right there should be a box ``Add Configuration...``, click on the box - On the top-left of the ``Run/Debug Configurations`` window, click on the ``+`` button - Select ``Gradle`` from the drop-down menu @@ -59,8 +55,8 @@ a message stating that your key was created. **Do not close the terminal/command - ``Gradle project`` click the folder button on its right side and select the ``:game`` option - ``Tasks`` set value to ``install`` - ``Arguments`` set value to ```-x test``` -- Now hit the ``Ok`` button -- Next to the new button that should appear where the ``Add Configuration...`` was previously, +- Now hit the ``Apply`` and then ``Ok`` button +- Next to the new button that should appear where the ``Add Configuration...`` was previously, there should be a green ``run`` button, click on that and let the installation begin. #### 4) RSA key setup @@ -69,90 +65,114 @@ no two servers should use the same private key so you must create your own: - After the ``install`` task completes, it will print out a message on the IntelliJ console - Once your key is created, you will have to follow the instructions on the terminal/command prompt - - You need to copy the public keys you are given and replace them in your client - - In your client, you can find the text ``BigInteger("10001`` which will usually be the - place where you need to replace both the public keys (the ``"10001"`` key is usually the same) - - Once you have replaced the keys in the client, you can restart the server and launch your client + - You need to copy the public key you are given and replace those in your client + - In your client, you can find the text `BigInteger("10001")` which will usually be found with the variable you need to replace with the RSA public key generated -#### 5) Choose your revision +#### 5) Setup the revision Now you're ready to start choosing the direction of your server! -- Go to the archives page and select a revision you want your server to run on: +
+ A note about revisions + + ``` + RS Mod was originally developed/released in an experimental state most compatible with + the revision 180/181 protocols and is archived for posterity and known stability(ish) + in fully working state in this repo's `archived-181` branch. Even this master remains + solely for the purposes of educating aspiring OSRSPS devs to protocols, mechanisms, and + practiced implementations of such in order to learn from. Once RS Mod v2.0 releases, you + should highly consider adopting it over this base as there are inherent issues Tomm saw + which needed to be reworked. + ``` +
+
+ +- Go to the archives page and select the revision you want your server to run on: https://archive.runestats.com/osrs/ - Download whichever archive you want -- Open the archive that you downloaded - Copy the files in its "cache" folder and place them in your RS Mod folder ``${rsmod-project}/data/cache`` - Create the folder ``${rsmod-project}/data/xteas/`` - Copy the file ``xteas.json`` and place it in the ``xteas`` folder you just created +_Note| As indicated by the revision badge, the master branch of this repo is currently on 193, and you should always work to try and match client and cache when catering to a specific revision. Also a fair amount of work is required to change revisions as the protocols and interfaces change from revision to revision._ + #### 6) Run the Server -This step is similar to step ``3) Install RSMod`` +This step is similar to step ``3) Install RS Mod`` -- On the top-right there should be a box ``Add Configuration...``, click on the box +- On the top-right click on the configurations box and select ``Edit Configurations...`` - On the top-left of the ``Run/Debug Configurations`` window, click on the ``+`` button - Select ``Gradle`` from the drop-down menu - In the Unnamed Gradle task, you should now fill in the ``Configuration`` - ``Gradle project`` click the folder button on its right side and select the ``:game`` option - ``Tasks`` set value to ``run`` -- Now hit the ``Ok`` button -- Next to the new button that should appear where the other configuration was previously, +- Now hit the ``Apply`` and then ``Ok`` button +- Next to the new button that should appear where the other configuration was previously, there should be a green ``run`` button, click on that and the server should begin to run. +## Creating Content +You can learn how to get started here: [RS Mod Wiki](https://github.com/Tomm0017/rsmod/wiki/Creating-Plugins) ## Troubleshooting - *Where can I get a client?* - - You can get a client from https://www.rune-server.ee/runescape-development/rs2-server/downloads/684206-180-rsmod-release.html + - You can get a client from the same archive file you download for the cache but will require decompiling the `deob-gamepack.jar` into useable source in order to set the RSA and hostname for connecting to your server. - *I receive a* ``Bad session id`` *message on the log-in screen* - This means the RSA keys on the client do not match the ones created on the server. - You should try to follow the steps in ``4) RSA key setup`` again. + You should try to follow the steps in ``4) RSA key setup`` again. - *I receive a* ``Revision mismatch for channel`` *console message when trying to log in* - - Find the revision of your **client** (*not cache*) - - Open ``${rsmod-project}/game.yml`` - - Edit the value for ``revision: 180`` to match your client's revision + - Your client revision must match the one indicated in the ``${rsmod-project}/game.yml`` configuration file + - This repo is currently set for ``revision: 193`` so match your client's revision to that. - *I receive a* ``error_game_js5connect`` *error on the client console* - You need to launch the server first and *then* the client -- *When following ``2) Open the project in IntelliJ`` my IntelliJ throws the error ``Build model 'org.jetbrains.plugins.gradle.model.ExternalProject' for root project 'gg.rsmod'``* - - This appears to be an issue that can be solved by upgrading your IntelliJ - I receive a `java.lang.NoClassDefFoundError: Could not initialize class class_name_here` when trying to log into the client - - The RSA key you copied to the client should not include `\n` at the end - remove it. + - The RSA key you copied to the client should not include a newline (`\n`) at the end - remove it. ## FAQ #### One or more of my plugins stopped working -- When you buy, or create, and use a Plugin **JAR** - the plugin uses code it -assumes you have on the core game module when it was written. If for some reason -you move, rename, or completely delete the code that the plugin is using - the -plugin will stop working. -- Notes: - - You can add new code to the game module without this being an issue, this - includes adding code to existing methods and files. However, it's best to - avoid writing code to the game module and you should always opt to write a - suggestion for the RS Mod creators to add specific features to the official - game module. -#### I have done some modifications to the game module. How can I tell if one of my plugins is no longer compatible? -- The only way to check is to download the plugin's source files and run it on -your server and see if it compiles correctly! -- Notes: - - You only have to worry about **JAR** plugins suddenly becoming incompatible - when you edit the game module code - - Delete or move the JAR plugin when you add the source plugin, otherwise - the plugins will conflict when trying to bind them on server start-up - - In the future, we will add a tool to check if any of your JAR plugins are - no longer compatible with your game module +- When you use a plugin, the plugin uses code it assumes you have in the core game module +when it was written and compiled. If for some reason you move, rename, or completely delete +the code that the plugin is using, the plugin will fail/stop working. + + _Note| You can add new code to the game module without this being an issue, this + includes adding code to existing methods and files. However, it's best to + avoid writing code to the game module and you should always opt to write a + suggestion for the RS Mod creators to add specific features to the official + game module or at very least for compatibility not rename, remove, or move game + module code._ + +#### I have done some modifications to the game module. How can I tell if one of my plugin is no longer compatible? +- The only way to check is to download the plugin's source files and run it on your server and see if it compiles correctly! +
+ Notes + + ``` + - You only have to worry about **JAR** plugins suddenly becoming incompatible when you edit + core game module code + - Delete or move the plugin `.jar` when you add the source plugin, otherwise the plugins + will conflict when trying to bind them on server start-up + - In the future, we will add a tool to check if any of your JAR plugins are no longer + compatible with your game module + ``` +
+ + #### I would like a feature added to the core game module -- If you would like a feature added, you can create a Pull Request on GitHub or contact **rspsmods@gmail.com** +- If you would like a feature added, you can create a Pull Request on GitHub + #### I found a bug, where can I report it? -- You can report them as Issues on GitHub or contact **rspsmods@gmail.com** +- You can report them as Issues on GitHub ## Acknowledgments -* ##### [![](https://jitpack.io/v/runelite/runelite.svg)](https://jitpack.io/#runelite/runelite) +* ##### Tomm + - For all his hard work on [RS Mod](https://github.com/Tomm0017/rsmod/) + - His dedication to the OSRSPS community and producing a quality Open Source emulation server for it +* ##### [![](https://jitpack.io/v/runelite/runelite.svg)](https://jitpack.io/#runelite/runelite) - Using Cache module from RuneLite * ##### Graham Edgecombe - Using project structure based on Apollo - Using StatefulFrameDecoder, AccessMode, DataConstants, DataOrder, DataTransformation, DataType, GamePacket & GamePacketBuilder from Apollo * ##### Major - - Using Collision Detection from Apollo + - Using Collision Detection from Apollo - Basic idea behind the Region system (known as Chunk on RS Mod) * ##### Polar - Helpful lad who shares a lot of OSRS knowledge @@ -161,11 +181,14 @@ your server and see if it compiles correctly! * ##### Sini - Advice on improving RS Mod's infrastructure * ##### Kris - - Always willing to lend a hand and share some code + - Always willing to lend a hand and share some code * ##### Bart and Scu11 - - Helped solve an issue with setting up KotlinScript + - Helped solve an issue with setting up KotlinScript * ##### Bart (from original OSS team) - The basic idea behind certain features such as TimerSystem, AttributeSystem and Services - The basic idea behind user-friendly plugin binding * ##### Rune-Status - Discord members lending a hand and being helpful + +[patch]: https://oldschool.runescape.wiki/w/2020_Christmas_event +[rev-badge]: https://img.shields.io/badge/revision-193-success diff --git a/data/blocks.yml b/data/blocks.yml index 030a4101de..5a9c0df4e0 100644 --- a/data/blocks.yml +++ b/data/blocks.yml @@ -1,23 +1,23 @@ players: - updating-opcode: 79 - excess-mask: 0x8 + updating-opcode: 75 + excess-mask: 0x40 order: - - HITMARK - - GFX - - MOVEMENT - FORCE_MOVEMENT - FORCE_CHAT + - PUBLIC_CHAT - FACE_TILE - - APPEARANCE + - HITMARK - FACE_PAWN - - PUBLIC_CHAT + - GFX + - MOVEMENT - ANIMATION + - APPEARANCE blocks: - block: APPEARANCE - bit: 0x1 + bit: 0x4 structure: - name: length type: BYTE @@ -27,59 +27,63 @@ players: trans: ADD - block: MOVEMENT - bit: 0x1000 + bit: 0x800 structure: - name: type type: BYTE - trans: ADD + trans: SUBTRACT - block: FORCE_CHAT bit: 0x20 - block: ANIMATION - bit: 0x80 + bit: 0x2 structure: - name: animation type: SHORT + trans: ADD - name: delay type: BYTE + trans: ADD - block: GFX - bit: 0x200 + bit: 0x1000 structure: - name: gfx - order: LITTLE type: SHORT trans: ADD - name: settings - order: MIDDLE + order: LITTLE type: INT - block: PUBLIC_CHAT - bit: 0x10 + bit: 0x80 structure: - name: effects + order: LITTLE type: SHORT trans: ADD - name: icon type: BYTE + trans: ADD - name: auto type: BYTE - trans: NEGATE - name: compressed_length type: BYTE + trans: NEGATE - name: compressed_data type: BYTES - block: FACE_TILE - bit: 0x4 + bit: 0x8 structure: - name: degrees - type: SHORT order: LITTLE + type: SHORT + trans: ADD - block: FACE_PAWN - bit: 0x2 + bit: 0x1 structure: - name: pawn_index type: SHORT @@ -89,31 +93,32 @@ players: bit: 0x100 - block: FORCE_MOVEMENT - bit: 0x400 + bit: 0x100 structure: - name: src_x type: BYTE trans: SUBTRACT - name: src_z type: BYTE - trans: ADD + trans: SUBTRACT - name: dst_x type: BYTE - trans: ADD + trans: SUBTRACT - name: dst_z type: BYTE - trans: SUBTRACT + trans: NEGATE - name: client_delay + order: LITTLE type: SHORT trans: ADD - name: client_duration - order: LITTLE type: SHORT + trans: ADD - name: direction_angle type: SHORT - block: HITMARK - bit: 0x40 + bit: 0x10 structure: - name: hitmarks type: BYTE @@ -123,83 +128,109 @@ players: trans: NEGATE - name: hitbar_percentage type: BYTE - trans: ADD + trans: NEGATE - name: hitbar_to_percentage type: BYTE + trans: SUBTRACT npcs: - updating-opcode: 33 - large-updating-opcode: 81 + updating-opcode: 43 + large-updating-opcode: 36 order: - - FACE_PAWN + - GFX - FACE_TILE - - ANIMATION + - FACE_PAWN + - FORCE_CHAT - APPEARANCE + - ANIMATION - HITMARK - - GFX - - FORCE_CHAT + - FORCE_MOVEMENT blocks: - block: FACE_PAWN - bit: 0x1 + bit: 0x10 structure: - name: pawn_index order: LITTLE type: SHORT - block: FACE_TILE - bit: 0x40 + bit: 0x2 structure: - name: x order: LITTLE type: SHORT trans: ADD - name: z - order: LITTLE type: SHORT trans: ADD - block: ANIMATION - bit: 0x20 + bit: 0x40 structure: - name: animation + order: LITTLE type: SHORT + trans: ADD - name: delay type: BYTE - trans: SUBTRACT - block: APPEARANCE - bit: 0x4 + bit: 0x1 structure: - name: transmog + order: LITTLE type: SHORT - block: GFX bit: 0x8 structure: - name: gfx - order: LITTLE type: SHORT + trans: ADD - name: settings - order: MIDDLE type: INT - block: FORCE_CHAT - bit: 0x2 + bit: 0x20 - block: HITMARK - bit: 0x10 + bit: 0x4 structure: - name: hitmarks type: BYTE - trans: NEGATE + trans: ADD - name: hitbars type: BYTE - trans: ADD - name: hitbar_percentage type: BYTE + trans: NEGATE - name: hitbar_to_percentage type: BYTE - trans: SUBTRACT \ No newline at end of file + trans: NEGATE + + - block: FORCE_MOVEMENT + bit: 0x80 + structure: + - name: src_x + type: BYTE + trans: ADD + - name: src_z + type: BYTE + trans: ADD + - name: dst_x + type: BYTE + trans: ADD + - name: dst_z + type: BYTE + trans: ADD + - name: client_delay + type: SHORT + - name: client_duration + order: LITTLE + type: SHORT + trans: ADD + - name: direction_angle + type: SHORT \ No newline at end of file diff --git a/data/packets.yml b/data/packets.yml index 2ee3ad73c2..d5a6bc061d 100644 --- a/data/packets.yml +++ b/data/packets.yml @@ -7,152 +7,153 @@ out-packets: type: FIXED opcode: 8 structure: + - name: tile + type: BYTE + trans: ADD - name: id + order: LITTLE type: SHORT - - name: height - type: BYTE trans: ADD - name: delay type: SHORT - trans: ADD - - name: tile + - name: height type: BYTE - message: gg.rsmod.game.message.impl.UpdateRebootTimerMessage type: FIXED - opcode: 72 + opcode: 58 structure: - name: cycles + order: LITTLE type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.TriggerOnDialogAbortMessage type: FIXED - opcode: 52 + opcode: 85 - message: gg.rsmod.game.message.impl.SetOpPlayerMessage type: VARIABLE_BYTE - opcode: 66 + opcode: 54 structure: + - name: option + type: BYTES - name: left_click type: BYTE trans: ADD - name: index type: BYTE - trans: ADD - - name: option - type: BYTES + trans: NEGATE - message: gg.rsmod.game.message.impl.SoundAreaMessage type: FIXED - opcode: 12 + opcode: 42 structure: + - name: sound + order: LITTLE + type: SHORT + trans: ADD - name: tile type: BYTE - - name: delay - type: BYTE - trans: SUBTRACT + trans: ADD - name: settings type: BYTE trans: ADD - - name: sound - order: LITTLE - type: SHORT - trans: ADD + - name: delay + type: BYTE + trans: NEGATE - message: gg.rsmod.game.message.impl.MapProjAnimMessage type: FIXED - opcode: 11 + opcode: 17 structure: - - name: end_height - type: BYTE - trans: SUBTRACT - - name: lifespan - type: SHORT - - name: gfx - type: SHORT - trans: ADD - name: start_height type: BYTE trans: SUBTRACT - - name: target_index - order: LITTLE - type: SHORT - - name: angle + - name: offset_x + type: BYTE + - name: offset_z type: BYTE - name: steepness type: BYTE - trans: SUBTRACT - name: delay order: LITTLE type: SHORT + - name: target_index + order: LITTLE + type: SHORT + trans: ADD - name: tile type: BYTE trans: ADD - - name: offset_z + - name: lifespan + type: SHORT + - name: gfx + order: LITTLE + type: SHORT + trans: ADD + - name: angle type: BYTE trans: ADD - - name: offset_x + - name: end_height type: BYTE - trans: NEGATE + trans: SUBTRACT - message: gg.rsmod.game.message.impl.IfMoveSubMessage type: FIXED - opcode: 82 + opcode: 16 structure: - - name: to - type: INT - name: from + order: INVERSED_MIDDLE + type: INT + - name: to + order: LITTLE type: INT - message: gg.rsmod.game.message.impl.RebuildLoginMessage type: VARIABLE_SHORT - opcode: 0 + opcode: 65 structure: - name: gpi type: BYTES - - name: z - order: LITTLE - type: SHORT - trans: ADD - name: x type: SHORT + - name: z + type: SHORT trans: ADD - name: xteas type: BYTES - message: gg.rsmod.game.message.impl.RebuildNormalMessage type: VARIABLE_SHORT - opcode: 0 + opcode: 65 structure: - - name: z - order: LITTLE - type: SHORT - trans: ADD - name: x type: SHORT + - name: z + type: SHORT trans: ADD - name: xteas type: BYTES - message: gg.rsmod.game.message.impl.RebuildRegionMessage type: VARIABLE_SHORT - opcode: 51 + opcode: 1 structure: - name: z type: SHORT - trans: ADD + - name: force_load + type: BYTE + trans: SUBTRACT - name: x order: LITTLE type: SHORT - trans: ADD - - name: force_load - type: BYTE - name: data type: BYTES - message: gg.rsmod.game.message.impl.IfOpenTopMessage type: FIXED - opcode: 84 + opcode: 39 structure: - name: top order: LITTLE @@ -161,136 +162,133 @@ out-packets: - message: gg.rsmod.game.message.impl.IfOpenSubMessage type: FIXED - opcode: 77 + opcode: 69 structure: + - name: overlay + order: LITTLE + type: INT - name: type trans: ADD type: BYTE - - name: overlay - order: MIDDLE - type: INT - name: component order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.UpdateZonePartialFollowsMessage type: FIXED - opcode: 64 + opcode: 30 structure: - name: x type: BYTE - trans: NEGATE + trans: ADD - name: z type: BYTE trans: SUBTRACT - message: gg.rsmod.game.message.impl.UpdateZonePartialEnclosedMessage type: VARIABLE_SHORT - opcode: 17 + opcode: 4 structure: - name: z type: BYTE trans: SUBTRACT - name: x type: BYTE - trans: NEGATE + trans: SUBTRACT - name: payload type: BYTES - message: gg.rsmod.game.message.impl.LocAddChangeMessage type: FIXED - opcode: 6 + opcode: 32 structure: - - name: tile - type: BYTE - trans: ADD + - name: id + type: SHORT - name: settings type: BYTE trans: SUBTRACT - - name: id - type: SHORT - trans: ADD + - name: tile + type: BYTE - message: gg.rsmod.game.message.impl.LocDelMessage type: FIXED - opcode: 13 + opcode: 74 structure: - - name: settings - type: BYTE - trans: SUBTRACT - name: tile type: BYTE - trans: SUBTRACT + trans: NEGATE + - name: settings + type: BYTE + trans: ADD - message: gg.rsmod.game.message.impl.ObjAddMessage type: FIXED - opcode: 26 + opcode: 13 structure: - name: amount - type: SHORT - trans: ADD - - name: item order: LITTLE type: SHORT trans: ADD - name: tile type: BYTE + trans: NEGATE + - name: item + order: LITTLE + type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.ObjDelMessage type: FIXED - opcode: 14 + opcode: 62 structure: - - name: tile - type: BYTE - tran: ADD - name: item order: LITTLE type: SHORT - trans: ADD + - name: tile + type: BYTE + tran: NEGATE - message: gg.rsmod.game.message.impl.ObjCountMessage type: FIXED - opcode: 15 + opcode: 29 structure: - name: item order: LITTLE type: SHORT + - name: tile + type: BYTE + trans: NEGATE - name: new_amount order: LITTLE type: SHORT - trans: ADD - name: old_amount order: LITTLE type: SHORT - - name: tile - type: BYTE - trans: ADD - message: gg.rsmod.game.message.impl.VarpSmallMessage type: FIXED - opcode: 63 + opcode: 59 structure: - name: value type: BYTE - trans: ADD + trans: SUBTRACT - name: id + order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.VarpLargeMessage type: FIXED - opcode: 4 + opcode: 31 structure: - - name: id - type: SHORT - name: value type: INT + order: INVERSED_MIDDLE + - name: id + type: SHORT - message: gg.rsmod.game.message.impl.RunClientScriptMessage type: VARIABLE_SHORT - opcode: 62 + opcode: 50 structure: - name: types type: BYTES @@ -301,7 +299,7 @@ out-packets: - message: gg.rsmod.game.message.impl.MessageGameMessage type: VARIABLE_BYTE - opcode: 3 + opcode: 14 structure: - name: type type: BYTE @@ -314,24 +312,25 @@ out-packets: - message: gg.rsmod.game.message.impl.LogoutFullMessage type: FIXED - opcode: 1 + opcode: 34 - message: gg.rsmod.game.message.impl.UpdateStatMessage type: FIXED - opcode: 22 + opcode: 5 structure: - name: xp order: LITTLE type: INT - - name: skill - type: BYTE - trans: NEGATE - name: level type: BYTE + trans: ADD + - name: skill + type: BYTE + trans: ADD - message: gg.rsmod.game.message.impl.IfSetTextMessage type: VARIABLE_SHORT - opcode: 19 + opcode: 20 structure: - name: hash type: INT @@ -340,58 +339,61 @@ out-packets: - message: gg.rsmod.game.message.impl.UpdateRunEnergyMessage type: FIXED - opcode: 60 + opcode: 61 structure: - name: energy type: BYTE - message: gg.rsmod.game.message.impl.IfCloseSubMessage type: FIXED - opcode: 9 + opcode: 21 structure: - name: hash type: INT - message: gg.rsmod.game.message.impl.IfSetEventsMessage type: FIXED - opcode: 48 + opcode: 79 structure: - - name: setting + - name: hash type: INT - order: LITTLE - name: to + order: LITTLE type: SHORT - trans: ADD - - name: hash + - name: setting type: INT - order: INVERSED_MIDDLE - name: from type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.IfSetHideMessage type: FIXED - opcode: 21 + opcode: 57 structure: - name: hash + order: LITTLE type: INT - name: hidden type: BYTE + trans: ADD - message: gg.rsmod.game.message.impl.IfSetObjectMessage type: FIXED - opcode: 20 + opcode: 46 structure: - name: hash + order: MIDDLE type: INT - - name: item - type: SHORT - name: amount type: INT order: INVERSED_MIDDLE + - name: item + type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.IfSetNpcHeadMessage type: FIXED - opcode: 35 + opcode: 40 structure: - name: npc order: LITTLE @@ -399,29 +401,29 @@ out-packets: trans: ADD - name: hash type: INT - order: INVERSED_MIDDLE + order: MIDDLE - message: gg.rsmod.game.message.impl.IfSetPlayerHeadMessage type: FIXED - opcode: 30 + opcode: 11 structure: - name: hash type: INT - order: INVERSED_MIDDLE - message: gg.rsmod.game.message.impl.IfSetAnimMessage type: FIXED - opcode: 61 + opcode: 63 structure: - - name: anim - type: SHORT - name: hash + order: LITTLE type: INT - order: INVERSED_MIDDLE + - name: anim + type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.SetMapFlagMessage type: FIXED - opcode: 67 + opcode: 47 structure: - name: x type: BYTE @@ -430,7 +432,7 @@ out-packets: - message: gg.rsmod.game.message.impl.UpdateInvFullMessage type: VARIABLE_SHORT - opcode: 70 + opcode: 3 structure: - name: component_hash type: INT @@ -443,7 +445,7 @@ out-packets: - message: gg.rsmod.game.message.impl.UpdateInvPartialMessage type: VARIABLE_SHORT - opcode: 44 + opcode: 38 structure: - name: component_hash type: INT @@ -454,7 +456,7 @@ out-packets: - message: gg.rsmod.game.message.impl.SynthSoundMessage type: FIXED - opcode: 65 + opcode: 48 structure: - name: sound type: SHORT @@ -465,16 +467,15 @@ out-packets: - message: gg.rsmod.game.message.impl.MidiSongMessage type: FIXED - opcode: 23 + opcode: 33 structure: - name: id - order: LITTLE type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.UpdateRunWeightMessage type: FIXED - opcode: 71 + opcode: 10 structure: - name: weight type: SHORT @@ -483,141 +484,135 @@ in-packets: - message: gg.rsmod.game.message.impl.ClickWorldMapMessage type: FIXED - opcode: 45 + opcode: 24 length: 4 structure: - name: data type: INT - order: MIDDLE + order: LITTLE - message: gg.rsmod.game.message.impl.OpLocUMessage type: FIXED opcode: 44 length: 15 structure: + - name: item + sign: UNSIGNED + type: SHORT + trans: ADD - name: pos_z sign: UNSIGNED type: SHORT - order: LITTLE trans: ADD - name: slot sign: UNSIGNED type: SHORT - order: LITTLE - - name: movement_type - sign: UNSIGNED - type: BYTE trans: ADD - - name: unknown - sign: UNSIGNED - type: INT - order: LITTLE - name: pos_x sign: UNSIGNED type: SHORT order: LITTLE trans: ADD + - name: unknown + sign: UNSIGNED + type: INT - name: obj sign: UNSIGNED type: SHORT - - name: item + - name: movement_type sign: UNSIGNED - type: SHORT - order: LITTLE + type: BYTE + trans: SUBTRACT - message: gg.rsmod.game.message.impl.IfButtonDMessage type: FIXED - opcode: 57 + opcode: 97 length: 16 structure: - - name: src_slot - sign: UNSIGNED - type: SHORT - trans: ADD - name: dst_item sign: UNSIGNED type: SHORT trans: ADD - - name: dst_slot + - name: src_item + order: LITTLE sign: UNSIGNED type: SHORT - name: src_component_hash - order: LITTLE + order: INVERSED_MIDDLE type: INT + - name: src_slot + sign: UNSIGNED + type: SHORT + - name: dst_slot + sign: UNSIGNED + order: LITTLE + type: SHORT - name: dst_component_hash order: MIDDLE type: INT - - name: src_item - sign: UNSIGNED - type: SHORT - message: gg.rsmod.game.message.impl.OpHeldDMessage type: FIXED - opcode: 80 + opcode: 75 length: 9 structure: - - name: src_slot - type: SHORT + - name: component_hash + type: INT - name: dst_slot order: LITTLE type: SHORT - - name: component_hash - type: INT + - name: src_slot + type: SHORT - name: insert_mode type: BYTE - trans: NEGATE - message: gg.rsmod.game.message.impl.OpHeldUMessage type: FIXED - opcode: 63 + opcode: 68 length: 16 structure: - - name: from_component - order: MIDDLE - type: INT - - name: to_component - order: INVERSED_MIDDLE - type: INT - - name: from_slot - order: LITTLE - type: SHORT - trans: ADD - name: from_item - order: LITTLE - type: SHORT - - name: to_slot - order: LITTLE type: SHORT - name: to_item - order: LITTLE type: SHORT - trans: ADD + - name: from_slot + type: SHORT + - name: to_component + order: MIDDLE + type: INT + - name: to_slot + type: SHORT + - name: from_component + type: INT - message: gg.rsmod.game.message.impl.OpNpcTMessage type: FIXED - opcode: 86 + opcode: 47 length: 9 structure: - name: npc_index order: LITTLE type: SHORT + - name: component_slot + type: SHORT + order: LITTLE trans: ADD - - name: movement_type - type: BYTE - trans: NEGATE - name: component_hash order: LITTLE type: INT - - name: component_slot - type: SHORT + - name: movement_type + type: BYTE trans: ADD - message: gg.rsmod.game.message.impl.OpNpcUMessage type: FIXED - opcode: 23 + opcode: 26 length: 11 structure: - - name: item + - name: component_hash + type: INT + order: MIDDLE + - name: npc_index sign: UNSIGNED order: LITTLE type: SHORT @@ -625,175 +620,186 @@ in-packets: - name: slot sign: UNSIGNED type: SHORT - - name: npc_index - sign: UNSIGNED order: LITTLE - type: SHORT - trans: ADD - name: movement_type type: BYTE trans: NEGATE - - name: component_hash - type: INT + - name: item + sign: UNSIGNED + type: SHORT - message: gg.rsmod.game.message.impl.OpNpc1Message type: FIXED - opcode: 71 + opcode: 9 length: 3 structure: - - name: movement_type - type: BYTE - trans: NEGATE - name: index - order: LITTLE type: SHORT + trans: ADD + - name: movement_type + type: BYTE + trans: SUBTRACT - message: gg.rsmod.game.message.impl.OpNpc2Message type: FIXED - opcode: 1 + opcode: 19 length: 3 structure: - name: index + order: LITTLE type: SHORT trans: ADD - name: movement_type type: BYTE + trans: SUBTRACT - message: gg.rsmod.game.message.impl.OpNpc3Message type: FIXED - opcode: 33 + opcode: 35 length: 3 structure: - - name: index - order: LITTLE - type: SHORT - trans: ADD - name: movement_type type: BYTE + trans: ADD + - name: index + type: SHORT - message: gg.rsmod.game.message.impl.OpNpc4Message type: FIXED - opcode: 59 + opcode: 87 length: 3 structure: - - name: index - type: SHORT - name: movement_type type: BYTE + trans: SUBTRACT + - name: index + type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.OpNpc5Message type: FIXED - opcode: 31 + opcode: 49 length: 3 structure: - name: movement_type type: BYTE + trans: ADD - name: index + order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.OpNpc6Message type: FIXED - opcode: 30 + opcode: 61 length: 2 structure: - name: npc_id sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.OpObj1Message type: FIXED - opcode: 5 + opcode: 84 length: 7 structure: - - name: z - order: LITTLE + - name: x type: SHORT - trans: ADD - name: item - order: LITTLE type: SHORT - - name: x - order: LITTLE + - name: z type: SHORT - name: movement_type type: BYTE + trans: NEGATE - - message: gg.rsmod.game.message.impl.OpObj3Message + - message: gg.rsmod.game.message.impl.OpObj2Message type: FIXED - opcode: 6 + opcode: 2 length: 7 structure: - name: z - order: LITTLE type: SHORT - name: movement_type type: BYTE trans: SUBTRACT - - name: x - order: LITTLE - type: SHORT - name: item order: LITTLE type: SHORT + - name: x + type: SHORT - - message: gg.rsmod.game.message.impl.OpObj4Message + - message: gg.rsmod.game.message.impl.OpObj3Message type: FIXED - opcode: 29 + opcode: 27 length: 7 structure: - name: z type: SHORT trans: ADD + - name: movement_type + type: BYTE + trans: ADD + - name: x + type: SHORT + trans: ADD - name: item order: LITTLE type: SHORT + + - message: gg.rsmod.game.message.impl.OpObj4Message + type: FIXED + opcode: 21 + length: 7 + structure: - name: x type: SHORT + - name: item + type: SHORT + trans: ADD + - name: z + order: LITTLE + type: SHORT + trans: ADD - name: movement_type type: BYTE - trans: SUBTRACT - message: gg.rsmod.game.message.impl.OpObjUMessage type: FIXED - opcode: 18 + opcode: 36 length: 15 structure: - name: component_hash - order: MIDDLE + order: LITTLE type: INT - - name: item + - name: x sign: UNSIGNED order: LITTLE type: SHORT trans: ADD - - name: movement_type - type: BYTE - trans: ADD - - name: slot + - name: item sign: UNSIGNED order: LITTLE type: SHORT - - name: ground_item + - name: z sign: UNSIGNED order: LITTLE type: SHORT - trans: ADD - - name: x + - name: slot sign: UNSIGNED - order: LITTLE type: SHORT trans: ADD - - name: z + - name: ground_item sign: UNSIGNED order: LITTLE type: SHORT + trans: ADD + - name: movement_type + type: BYTE - message: gg.rsmod.game.message.impl.ResumePObjDialogMessage type: FIXED - opcode: 42 + opcode: 23 length: 2 structure: - name: item @@ -802,21 +808,21 @@ in-packets: - message: gg.rsmod.game.message.impl.ResumePStringDialogMessage type: VARIABLE_BYTE - opcode: 8 + opcode: 77 structure: - name: input type: STRING - message: gg.rsmod.game.message.impl.ClientCheatMessage type: VARIABLE_BYTE - opcode: 60 + opcode: 102 structure: - name: command type: STRING - message: gg.rsmod.game.message.impl.WindowStatusMessage type: FIXED - opcode: 35 + opcode: 101 length: 5 structure: - name: mode @@ -830,71 +836,73 @@ in-packets: - message: gg.rsmod.game.message.impl.MoveGameClickMessage type: VARIABLE_BYTE - opcode: 96 + opcode: 5 structure: - - name: z - sign: UNSIGNED - type: SHORT - trans: ADD - name: x sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - name: movement_type type: BYTE + trans: SUBTRACT + - name: z + sign: UNSIGNED + order: LITTLE + type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.MoveMinimapClickMessage type: VARIABLE_BYTE - opcode: 52 + opcode: 45 structure: - - name: z - sign: UNSIGNED - type: SHORT - trans: ADD - name: x sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - name: movement_type type: BYTE + trans: SUBTRACT + - name: z + sign: UNSIGNED + order: LITTLE + type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.TeleportMessage type: FIXED - opcode: 61 + opcode: 42 length: 9 structure: + - name: x + sign: UNSIGNED + type: SHORT + trans: ADD - name: unknown type: INT - order: MIDDLE + order: LITTLE - name: z sign: UNSIGNED order: LITTLE type: SHORT - name: height type: BYTE - trans: NEGATE - - name: x - sign: UNSIGNED - type: SHORT - message: gg.rsmod.game.message.impl.OpLoc1Message type: FIXED - opcode: 10 + opcode: 66 length: 7 structure: - - name: z - type: SHORT + - name: x sign: UNSIGNED + order: LITTLE + type: SHORT + trans: ADD - name: movement_type type: BYTE - trans: SUBTRACT - - name: id - sign: UNSIGNED + - name: z type: SHORT - trans: ADD - - name: x + sign: UNSIGNED + - name: id sign: UNSIGNED order: LITTLE type: SHORT @@ -902,90 +910,90 @@ in-packets: - message: gg.rsmod.game.message.impl.OpLoc2Message type: FIXED - opcode: 79 + opcode: 83 length: 7 structure: - - name: movement_type - type: BYTE - trans: ADD - name: id sign: UNSIGNED type: SHORT - - name: z + - name: x sign: UNSIGNED + order: LITTLE type: SHORT - - name: x + - name: movement_type + type: BYTE + trans: NEGATE + - name: z sign: UNSIGNED type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.OpLoc3Message type: FIXED - opcode: 89 + opcode: 40 length: 7 structure: - - name: x + - name: z sign: UNSIGNED order: LITTLE type: SHORT trans: ADD + - name: movement_type + type: BYTE + trans: NEGATE - name: id sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - - name: z + - name: x sign: UNSIGNED - order: LITTLE type: SHORT trans: ADD - - name: movement_type - type: BYTE - trans: ADD - message: gg.rsmod.game.message.impl.OpLoc4Message type: FIXED - opcode: 3 + opcode: 43 length: 7 structure: - - name: movement_type - type: BYTE - trans: ADD - name: z sign: UNSIGNED type: SHORT trans: ADD + - name: id + sign: UNSIGNED + type: SHORT + trans: ADD - name: x sign: UNSIGNED type: SHORT trans: ADD - - name: id - sign: UNSIGNED - order: LITTLE - type: SHORT + - name: movement_type + type: BYTE + trans: NEGATE - message: gg.rsmod.game.message.impl.OpLoc5Message type: FIXED - opcode: 94 + opcode: 44 length: 7 structure: - - name: id - sign: UNSIGNED - type: SHORT - name: movement_type type: BYTE - trans: ADD - - name: x + trans: NEGATE + - name: z sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - - name: z + - name: x sign: UNSIGNED order: LITTLE type: SHORT - trans: ADD + - name: id + sign: UNSIGNED + type: SHORT - message: gg.rsmod.game.message.impl.IfButtonMessage type: FIXED - opcodes: 68,21,48,19,40,66,85,14,84,0 + opcodes: 13,59,22,90,37,62,16,25,80,4 length: 8 structure: - name: hash @@ -999,20 +1007,18 @@ in-packets: - message: gg.rsmod.game.message.impl.ResumePauseButtonMessage type: FIXED - opcode: 70 + opcode: 39 length: 6 structure: - name: hash type: INT - order: INVERSED_MIDDLE - name: slot sign: UNSIGNED type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.ResumePCountDialogMessage type: FIXED - opcode: 17 + opcode: 12 length: 4 structure: - name: input @@ -1020,169 +1026,165 @@ in-packets: - message: gg.rsmod.game.message.impl.OpLoc6Message type: FIXED - opcode: 36 + opcode: 94 length: 2 structure: - name: id sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.OpHeld1Message type: FIXED - opcode: 87 + opcode: 57 length: 8 structure: - - name: item - sign: UNSIGNED - order: LITTLE + - name: slot type: SHORT + sign: UNSIGNED - name: component_hash type: INT - order: MIDDLE - - name: slot - type: SHORT + order: LITTLE + - name: item sign: UNSIGNED + type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.OpHeld2Message type: FIXED opcode: 98 length: 8 structure: + - name: slot + sign: UNSIGNED + type: SHORT - name: item sign: UNSIGNED + order: LITTLE type: SHORT - trans: ADD - name: component_hash type: INT - order: INVERSED_MIDDLE - - name: slot - sign: UNSIGNED order: LITTLE - type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.OpHeld3Message type: FIXED - opcode: 72 + opcode: 32 length: 8 structure: - - name: component_hash - order: LITTLE - type: INT - name: slot sign: UNSIGNED order: LITTLE type: SHORT - trans: ADD - name: item sign: UNSIGNED - order: LITTLE type: SHORT trans: ADD + - name: component_hash + order: LITTLE + type: INT - message: gg.rsmod.game.message.impl.OpHeld4Message type: FIXED - opcode: 7 + opcode: 38 length: 8 structure: - - name: item + - name: slot sign: UNSIGNED order: LITTLE type: SHORT trans: ADD - name: component_hash type: INT - - name: slot + order: MIDDLE + - name: item sign: UNSIGNED - order: LITTLE type: SHORT - trans: ADD - message: gg.rsmod.game.message.impl.OpHeld5Message type: FIXED - opcode: 58 + opcode: 82 length: 8 structure: - name: component_hash type: INT + order: INVERSED_MIDDLE - name: slot type: SHORT sign: UNSIGNED + order: LITTLE - name: item sign: UNSIGNED type: SHORT - message: gg.rsmod.game.message.impl.OpHeld6Message type: FIXED - opcode: 24 + opcode: 86 length: 2 structure: - name: item sign: UNSIGNED - order: LITTLE type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.OpHeldTMessage type: FIXED - opcode: 2 + opcode: 93 length: 14 structure: - - name: from_hash - order: MIDDLE - type: INT - - name: to_hash - type: INT - - name: item_slot + - name: item_id sign: UNSIGNED type: SHORT - - name: item_id + - name: item_slot sign: UNSIGNED - order: LITTLE type: SHORT - name: spell_slot sign: UNSIGNED - order: LITTLE type: SHORT + trans: ADD + - name: from_hash + order: MIDDLE + type: INT + - name: to_hash + type: INT + order: LITTLE - message: gg.rsmod.game.message.impl.CloseModalMessage type: FIXED - opcode: 20 + opcode: 73 length: 0 - message: gg.rsmod.game.message.impl.ClanJoinChatLeaveChatMessage type: VARIABLE_BYTE - opcode: 78 + opcode: 58 structure: - name: name type: STRING - message: gg.rsmod.game.message.impl.EventCameraPositionMessage type: FIXED - opcode: 39 + opcode: 48 length: 4 structure: - name: pitch order: LITTLE type: SHORT - trans: ADD - name: yaw order: LITTLE type: SHORT - message: gg.rsmod.game.message.impl.EventMouseIdleMessage type: FIXED - opcode: 49 + opcode: 76 length: 0 - message: gg.rsmod.game.message.impl.EventMouseMoveMessage # TODO: need to refactor code to see what values are received type: VARIABLE_BYTE - opcode: 34 + opcode: 63 ignore: true - message: gg.rsmod.game.message.impl.DetectModifiedClientMessage type: FIXED - opcode: 9 + opcode: 72 length: 4 structure: - name: dummy @@ -1190,7 +1192,7 @@ in-packets: - message: gg.rsmod.game.message.impl.UpdateAppearanceMessage type: FIXED - opcode: 12 + opcode: 89 length: 13 structure: - name: gender @@ -1235,13 +1237,13 @@ in-packets: - message: gg.rsmod.game.message.impl.NoTimeoutMessage type: FIXED - opcode: 22 + opcode: 95 length: 0 ignore: true - message: gg.rsmod.game.message.impl.MessagePublicMessage type: VARIABLE_BYTE - opcode: 97 + opcode: 64 structure: - name: type type: BYTE @@ -1252,29 +1254,29 @@ in-packets: - message: gg.rsmod.game.message.impl.IgnoreMessage # Unknown message type: VARIABLE_BYTE - opcode: 4 + opcode: 100 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: PING_STATISTICS - need to refactor code to see what values are received type: FIXED - opcode: 11 + opcode: 28 length: 10 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: EVENT_MOUSE_CLICK - need to refactor code to see what values are received type: FIXED - opcode: 41 + opcode: 3 length: 6 ignore: true - message: gg.rsmod.game.message.impl.MapBuildCompleteMessage type: FIXED - opcode: 76 + opcode: 8 length: 0 - message: gg.rsmod.game.message.impl.EventAppletFocusMessage type: FIXED - opcode: 73 + opcode: 7 length: 1 structure: - name: state @@ -1282,43 +1284,44 @@ in-packets: - message: gg.rsmod.game.message.impl.EventKeyboardMessage type: VARIABLE_SHORT - opcode: 67 + opcode: 1 structure: + - name: last_key_press + type: MEDIUM + order: MIDDLE - name: key type: BYTE - trans: NEGATE - - name: last_key_press - type: TRI_BYTE + trans: SUBTRACT - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: CLAN_KICKUSER type: VARIABLE_BYTE - opcode: 13 + opcode: 79 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: CHAT_SETMODE type: FIXED - opcode: 15 + opcode: 81 length: 3 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: BUG_REPORT type: VARIABLE_SHORT - opcode: 16 + opcode: 67 - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: MESSAGE_PRIVATE type: VARIABLE_SHORT - opcode: 25 + opcode: 0 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF1_BUTTON2 type: FIXED - opcode: 26 + opcode: 99 length: 8 ignore: true - message: gg.rsmod.game.message.impl.OpPlayer4Message type: FIXED - opcode: 27 + opcode: 50 length: 3 structure: - name: index @@ -1327,223 +1330,209 @@ in-packets: trans: ADD - name: unknown type: BYTE - trans: NEGATE + trans: ADD - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IGNORELIST_DEL type: VARIABLE_BYTE - opcode: 28 + opcode: 91 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF1_BUTTON5 type: FIXED - opcode: 32 + opcode: 30 length: 8 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: FREECAM_EXIT type: FIXED - opcode: 37 + opcode: 17 length: 0 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: SEND_SNAPSHOT type: VARIABLE_BYTE - opcode: 38 - ignore: true - - - message: gg.rsmod.game.message.impl.IgnoreMessage # Unknown - type: VARIABLE_BYTE - opcode: 43 + opcode: 74 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF1_BUTTON1 type: FIXED - opcode: 46 + opcode: 96 length: 8 ignore: true - message: gg.rsmod.game.message.impl.OpPlayer1Message type: FIXED - opcode: 47 + opcode: 33 length: 3 structure: - - name: index - type: SHORT - name: unknown type: BYTE - trans: NEGATE + trans: ADD + - name: index + order: LITTLE + type: SHORT + trans: ADD - message: gg.rsmod.game.message.impl.OpPlayer8Message type: FIXED - opcode: 50 + opcode: 55 length: 3 structure: - name: unknown type: BYTE - trans: NEGATE + trans: SUBTRACT - name: index type: SHORT - order: LITTLE - trans: ADD - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPOBJ5 type: FIXED - opcode: 51 + opcode: 78 length: 7 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPOBJT type: FIXED - opcode: 53 + opcode: 54 length: 13 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: FRIENDLIST_DEL type: VARIABLE_BYTE - opcode: 54 + opcode: 20 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPPLAYERT type: FIXED - opcode: 55 + opcode: 29 length: 9 ignore: true - message: gg.rsmod.game.message.impl.OpPlayer2Message type: FIXED - opcode: 56 + opcode: 11 length: 3 structure: - - name: unknown - type: BYTE - trans: SUBTRACT - name: index + order: LITTLE type: SHORT trans: ADD + - name: unknown + type: BYTE + trans: NEGATE - message: gg.rsmod.game.message.impl.OpPlayer3Message type: FIXED - opcode: 62 + opcode: 52 length: 3 structure: - name: index type: SHORT - trans: ADD - name: unknown type: BYTE + trans: ADD - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF1_BUTTON4 type: FIXED - opcode: 64 + opcode: 88 length: 8 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF1_BUTTON3 type: FIXED - opcode: 65 + opcode: 70 length: 8 ignore: true - - message: gg.rsmod.game.message.impl.IgnoreMessage # Unknown + - message: gg.rsmod.game.message.impl.IfModelOp1Message # Legacy Interface Model Button Option1 type: FIXED opcode: 69 length: 4 - ignore: true - - - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPOBJ2 - type: FIXED - opcode: 74 - length: 7 - ignore: true + structure: + - name: component + type: INT - message: gg.rsmod.game.message.impl.OpPlayer7Message type: FIXED - opcode: 75 + opcode: 53 length: 3 structure: + - name: index + type: SHORT + trans: ADD - name: unknown type: BYTE trans: SUBTRACT - - name: index - type: SHORT - order: LITTLE - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: FRIEND_SETRANK type: VARIABLE_BYTE - opcode: 77 + opcode: 71 length: -1 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPPLAYERU type: FIXED - opcode: 81 + opcode: 56 length: 11 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IF_BUTTONT type: FIXED - opcode: 82 + opcode: 34 length: 16 ignore: true - message: gg.rsmod.game.message.impl.OpPlayer5Message type: FIXED - opcode: 83 + opcode: 51 length: 3 structure: - name: unknown type: BYTE - trans: SUBTRACT + trans: NEGATE - name: index type: SHORT trans: ADD - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: FRIENDLIST_ADD type: VARIABLE_BYTE - opcode: 88 + opcode: 14 length: -1 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: IGNORELIST_ADD type: VARIABLE_BYTE - opcode: 90 + opcode: 92 length: -1 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: REFLECTION_CHECK_REPLY type: VARIABLE_BYTE - opcode: 91 + opcode: 41 length: -1 ignore: true - message: gg.rsmod.game.message.impl.IgnoreMessage # TODO: OPLOCT type: FIXED - opcode: 92 + opcode: 10 length: 13 ignore: true - message: gg.rsmod.game.message.impl.OpPlayer6Message type: FIXED - opcode: 93 + opcode: 15 length: 3 structure: + - name: unknown + type: BYTE + trans: ADD - name: index type: SHORT trans: ADD - - name: unknown - type: BYTE - trans: SUBTRACT - message: gg.rsmod.game.message.impl.ResumePNameDialogMessage type: VARIABLE_BYTE - opcode: 95 + opcode: 18 length: -1 structure: - name: name - type: STRING - - - message: gg.rsmod.game.message.impl.IgnoreMessage # Unknown - type: FIXED - opcode: 99 - length: 7 - ignore: true \ No newline at end of file + type: STRING \ No newline at end of file diff --git a/game.example.yml b/game.example.yml index dacfeb659d..76de4bbb22 100644 --- a/game.example.yml +++ b/game.example.yml @@ -2,11 +2,11 @@ # You want to edit these to fit your game. name: "RS Mod Server" game-port: 43594 -revision: 181 +revision: 193 # The coordinates for the home location. -home-x: 3087 -home-z: 3497 +home-x: 3218 +home-z: 3218 # Privileges # Any privilege you want to be represented in-game you define here. diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/EquipmentType.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/EquipmentType.kt index 55e1ec126b..9809276c22 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/EquipmentType.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/EquipmentType.kt @@ -20,6 +20,8 @@ enum class EquipmentType(val id: Int) { AMMO(id = 13); companion object { + const val EQUIPMENT_INTERFACE_ID = 387 + val values = enumValues() } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/InterfaceDestination.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/InterfaceDestination.kt index dc8464eecf..2f3c4f4979 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/InterfaceDestination.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/InterfaceDestination.kt @@ -5,61 +5,59 @@ import gg.rsmod.game.model.interf.DisplayMode enum class InterfaceDestination(val interfaceId: Int, val fixedChildId: Int, val resizeChildId: Int, val resizeListChildId: Int, val fullscreenChildId: Int = -1, val clickThrough: Boolean = true) { - CHAT_BOX(interfaceId = 162, fixedChildId = 24, resizeChildId = 29, resizeListChildId = 31), + CHAT_BOX(interfaceId = 162, fixedChildId = 27, resizeChildId = 32, resizeListChildId = 34, fullscreenChildId = 1), - USERNAME(interfaceId = 163, fixedChildId = 19, resizeChildId = 9, resizeListChildId = 9), + XP_COUNTER(interfaceId = 122, fixedChildId = 18, resizeChildId = 8, resizeListChildId = 8, fullscreenChildId = 6), - PVP_OVERLAY(interfaceId = -1, fixedChildId = 15, resizeChildId = 4, resizeListChildId = 4), + ATTACK(interfaceId = 593, fixedChildId = 69, resizeChildId = 71, resizeListChildId = 71, fullscreenChildId = 10), - MINI_MAP(interfaceId = 160, fixedChildId = 11, resizeChildId = 28, resizeListChildId = 28), + SKILLS(interfaceId = 320, fixedChildId = 70, resizeChildId = 72, resizeListChildId = 72, fullscreenChildId = 11), - XP_COUNTER(interfaceId = 122, fixedChildId = 17, resizeChildId = 7, resizeListChildId = 7), + QUEST_ROOT(interfaceId = 629, fixedChildId = 71, resizeChildId = 73, resizeListChildId = 73, fullscreenChildId = 12), - SKILLS(interfaceId = 320, fixedChildId = 67, resizeChildId = 69, resizeListChildId = 69), + INVENTORY(interfaceId = 149, fixedChildId = 72, resizeChildId = 74, resizeListChildId = 74, fullscreenChildId = 13), - QUEST(interfaceId = 399, fixedChildId = 68, resizeChildId = 70, resizeListChildId = 70), + EQUIPMENT(interfaceId = 387, fixedChildId = 73, resizeChildId = 75, resizeListChildId = 75, fullscreenChildId = 14), - INVENTORY(interfaceId = 149, fixedChildId = 69, resizeChildId = 71, resizeListChildId = 71), + PRAYER(interfaceId = 541, fixedChildId = 74, resizeChildId = 76, resizeListChildId = 76, fullscreenChildId = 15), - EQUIPMENT(interfaceId = 387, fixedChildId = 70, resizeChildId = 72, resizeListChildId = 72), + MAGIC(interfaceId = 218, fixedChildId = 75, resizeChildId = 77, resizeListChildId = 77, fullscreenChildId = 16), - PRAYER(interfaceId = 541, fixedChildId = 71, resizeChildId = 73, resizeListChildId = 73), + CLAN_CHAT(interfaceId = 7, fixedChildId = 76, resizeChildId = 78, resizeListChildId = 78, fullscreenChildId = 17), - MAGIC(interfaceId = 218, fixedChildId = 72, resizeChildId = 74, resizeListChildId = 74), + ACCOUNT_MANAGEMENT(interfaceId = 109, fixedChildId = 77, resizeChildId = 79, resizeListChildId = 79, fullscreenChildId = 18), - ACCOUNT_MANAGEMENT(interfaceId = 109, fixedChildId = 74, resizeChildId = 76, resizeListChildId = 76), + SOCIAL(interfaceId = 429, fixedChildId = 78, resizeChildId = 80, resizeListChildId = 80, fullscreenChildId = 19), - SOCIAL(interfaceId = 429, fixedChildId = 75, resizeChildId = 77, resizeListChildId = 77), // 432 = ignore + LOG_OUT(interfaceId = 182, fixedChildId = 79, resizeChildId = 81, resizeListChildId = 81, fullscreenChildId = 20), - LOG_OUT(interfaceId = 182, fixedChildId = 76, resizeChildId = 78, resizeListChildId = 78), + SETTINGS(interfaceId = 116, fixedChildId = 80, resizeChildId = 82, resizeListChildId = 82, fullscreenChildId = 21), - SETTINGS(interfaceId = 261, fixedChildId = 77, resizeChildId = 79, resizeListChildId = 79), + EMOTES(interfaceId = 216, fixedChildId = 81, resizeChildId = 83, resizeListChildId = 83, fullscreenChildId = 22), - EMOTES(interfaceId = 216, fixedChildId = 78, resizeChildId = 80, resizeListChildId = 80), + MUSIC(interfaceId = 239, fixedChildId = 82, resizeChildId = 84, resizeListChildId = 84, fullscreenChildId = 23), - MUSIC(interfaceId = 239, fixedChildId = 79, resizeChildId = 81, resizeListChildId = 81), + USERNAME(interfaceId = 163, fixedChildId = 20, resizeChildId = 11, resizeListChildId = 11, fullscreenChildId = 25), - CLAN_CHAT(interfaceId = 7, fixedChildId = 73, resizeChildId = 75, resizeListChildId = 75), + MINI_MAP(interfaceId = 160, fixedChildId = 11, resizeChildId = 31, resizeListChildId = 31, fullscreenChildId = 26), - ATTACK(interfaceId = 593, fixedChildId = 66, resizeChildId = 68, resizeListChildId = 68), + PVP_OVERLAY(interfaceId = -1, fixedChildId = 15, resizeChildId = 4, resizeListChildId = 4, fullscreenChildId = 24), - MAIN_SCREEN(interfaceId = -1, fixedChildId = 21, resizeChildId = 13, resizeListChildId = 13, + MAIN_SCREEN(interfaceId = -1, fixedChildId = 23, resizeChildId = 15, resizeListChildId = 15, fullscreenChildId = 8, clickThrough = false), - TAB_AREA(interfaceId = -1, fixedChildId = 64, resizeChildId = 66, resizeListChildId = 66, + TAB_AREA(interfaceId = -1, fixedChildId = 67, resizeChildId = 66, resizeListChildId = 66, clickThrough = false), WALKABLE(interfaceId = -1, fixedChildId = 14, resizeChildId = 3, resizeListChildId = 3), - WORLD_MAP(interfaceId = -1, fixedChildId = 22, resizeChildId = 14, resizeListChildId = 14, - fullscreenChildId = 28), + WORLD_MAP(interfaceId = -1, fixedChildId = 24, resizeChildId = 16, resizeListChildId = 16, fullscreenChildId = 30), - WORLD_MAP_FULL(interfaceId = -1, fixedChildId = 27, resizeChildId = 27, resizeListChildId = 27, - fullscreenChildId = 27, clickThrough = false); + WORLD_MAP_FULL(interfaceId = -1, fixedChildId = 27, resizeChildId = 27, resizeListChildId = 27, fullscreenChildId = 27, clickThrough = false); fun isSwitchable(): Boolean = when (this) { CHAT_BOX, MAIN_SCREEN, WALKABLE, TAB_AREA, - ATTACK, SKILLS, QUEST, INVENTORY, EQUIPMENT, + ATTACK, SKILLS, QUEST_ROOT, INVENTORY, EQUIPMENT, PRAYER, MAGIC, CLAN_CHAT, ACCOUNT_MANAGEMENT, SOCIAL, LOG_OUT, SETTINGS, EMOTES, MUSIC, PVP_OVERLAY, USERNAME, MINI_MAP, XP_COUNTER, WORLD_MAP -> true @@ -68,6 +66,8 @@ enum class InterfaceDestination(val interfaceId: Int, val fixedChildId: Int, val companion object { val values = enumValues() + + fun getModals() = values.filter { pane -> pane.interfaceId != -1 } } } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/OSRSGameframe.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/OSRSGameframe.kt index 3e1228db2e..2724d9b94a 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/OSRSGameframe.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/OSRSGameframe.kt @@ -5,8 +5,6 @@ package gg.rsmod.plugins.api */ object OSRSGameframe { - //6516= friends list to ignore list - const val XP_DROPS_VISIBLE_VARBIT = 4702 /** diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Items.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Items.kt index 7e9ca989ce..9b73ffa094 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Items.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Items.kt @@ -3804,7 +3804,7 @@ object Items { const val CADARN_LINEAGE_NOTED = 4210 const val ELF_CRYSTAL = 4211 const val NEW_CRYSTAL_BOW = 4212 - const val NEW_CRYSTAL_BOW_NOTED = 4213 + const val NEW_CRYSTAL_BOW_4213 = 4213 const val CRYSTAL_BOW_FULL = 4214 const val CRYSTAL_BOW_910 = 4215 const val CRYSTAL_BOW_810 = 4216 @@ -3826,7 +3826,7 @@ object Items { const val CRYSTAL_SHIELD_310 = 4232 const val CRYSTAL_SHIELD_210 = 4233 const val CRYSTAL_SHIELD_110 = 4234 - const val NEW_CRYSTAL_SHIELD_NOTED = 4235 + const val NEW_CRYSTAL_SHIELD_4235 = 4235 const val SIGNED_OAK_BOW = 4236 const val NETTLEWATER = 4237 const val PUDDLE_OF_SLIME = 4238 @@ -9426,77 +9426,77 @@ object Items { const val BUNNY_EARS_10734 = 10734 const val SCYTHE_10735 = 10735 const val STRENGTH_AMULET_T_10736 = 10736 - const val STRENGTH_AMULET_T_NOTED_10737 = 10737 + const val STRENGTH_AMULET_T_10737 = 10737 const val AMULET_OF_MAGIC_T_10738 = 10738 - const val AMULET_OF_MAGIC_T_NOTED_10739 = 10739 + const val AMULET_OF_MAGIC_T_10739 = 10739 const val A_POWDERED_WIG_10740 = 10740 - const val A_POWDERED_WIG_NOTED_10741 = 10741 + const val A_POWDERED_WIG_10741 = 10741 const val FLARED_TROUSERS_10742 = 10742 - const val FLARED_TROUSERS_NOTED_10743 = 10743 + const val FLARED_TROUSERS_10743 = 10743 const val PANTALOONS_10744 = 10744 - const val PANTALOONS_NOTED_10745 = 10745 + const val PANTALOONS_10745 = 10745 const val SLEEPING_CAP_10746 = 10746 - const val SLEEPING_CAP_NOTED_10747 = 10747 + const val SLEEPING_CAP_10747 = 10747 const val BLACK_ELEGANT_SHIRT_10748 = 10748 - const val BLACK_ELEGANT_SHIRT_NOTED_10749 = 10749 + const val BLACK_ELEGANT_SHIRT_10749 = 10749 const val RED_ELEGANT_SHIRT_10750 = 10750 - const val RED_ELEGANT_SHIRT_NOTED_10751 = 10751 + const val RED_ELEGANT_SHIRT_10751 = 10751 const val BLUE_ELEGANT_SHIRT_10752 = 10752 - const val BLUE_ELEGANT_SHIRT_NOTED_10753 = 10753 + const val BLUE_ELEGANT_SHIRT_10753 = 10753 const val GREEN_ELEGANT_SHIRT_10754 = 10754 - const val GREEN_ELEGANT_SHIRT_NOTED_10755 = 10755 + const val GREEN_ELEGANT_SHIRT_10755 = 10755 const val PURPLE_ELEGANT_SHIRT_10756 = 10756 - const val PURPLE_ELEGANT_SHIRT_NOTED_10757 = 10757 + const val PURPLE_ELEGANT_SHIRT_10757 = 10757 const val RED_BOATER_10758 = 10758 - const val RED_BOATER_NOTED_10759 = 10759 + const val RED_BOATER_10759 = 10759 const val ORANGE_BOATER_10760 = 10760 - const val ORANGE_BOATER_NOTED_10761 = 10761 + const val ORANGE_BOATER_10761 = 10761 const val GREEN_BOATER_10762 = 10762 - const val GREEN_BOATER_NOTED_10763 = 10763 + const val GREEN_BOATER_10763 = 10763 const val BLUE_BOATER_10764 = 10764 - const val BLUE_BOATER_NOTED_10765 = 10765 + const val BLUE_BOATER_10765 = 10765 const val BLACK_BOATER_10766 = 10766 - const val BLACK_BOATER_NOTED_10767 = 10767 + const val BLACK_BOATER_10767 = 10767 const val RED_HEADBAND_10768 = 10768 - const val RED_HEADBAND_NOTED_10769 = 10769 + const val RED_HEADBAND_10769 = 10769 const val BLACK_HEADBAND_10770 = 10770 - const val BLACK_HEADBAND_NOTED_10771 = 10771 + const val BLACK_HEADBAND_10771 = 10771 const val BROWN_HEADBAND_10772 = 10772 - const val BROWN_HEADBAND_NOTED_10773 = 10773 + const val BROWN_HEADBAND_10773 = 10773 const val PIRATES_HAT_10774 = 10774 - const val PIRATES_HAT_NOTED_10775 = 10775 + const val PIRATES_HAT_10775 = 10775 const val ZAMORAK_PLATEBODY_10776 = 10776 - const val ZAMORAK_PLATEBODY_NOTED_10777 = 10777 + const val ZAMORAK_PLATEBODY_10777 = 10777 const val SARADOMIN_PLATE = 10778 - const val SARADOMIN_PLATE_NOTED = 10779 + const val SARADOMIN_PLATE_10779 = 10779 const val GUTHIX_PLATEBODY_10780 = 10780 - const val GUTHIX_PLATEBODY_NOTED_10781 = 10781 + const val GUTHIX_PLATEBODY_10781 = 10781 const val GILDED_PLATEBODY_10782 = 10782 - const val GILDED_PLATEBODY_NOTED_10783 = 10783 + const val GILDED_PLATEBODY_10783 = 10783 const val SARADOMIN_ROBE_TOP_10784 = 10784 - const val SARADOMIN_ROBE_TOP_NOTED_10785 = 10785 + const val SARADOMIN_ROBE_TOP_10785 = 10785 const val ZAMORAK_ROBE_TOP_10786 = 10786 - const val ZAMORAK_ROBE_TOP_NOTED_10787 = 10787 + const val ZAMORAK_ROBE_TOP_10787 = 10787 const val GUTHIX_ROBE_TOP_10788 = 10788 - const val GUTHIX_ROBE_TOP_NOTED_10789 = 10789 + const val GUTHIX_ROBE_TOP_10789 = 10789 const val ZAMORAK_DHIDE_10790 = 10790 - const val ZAMORAK_DHIDE_NOTED_10791 = 10791 + const val ZAMORAK_DHIDE_10791 = 10791 const val SARADOMIN_DHIDE_10792 = 10792 - const val SARADOMIN_DHIDE_NOTED_10793 = 10793 + const val SARADOMIN_DHIDE_10793 = 10793 const val GUTHIX_DRAGONHIDE_10794 = 10794 - const val GUTHIX_DRAGONHIDE_NOTED_10795 = 10795 + const val GUTHIX_DRAGONHIDE_10795 = 10795 const val ROBIN_HOOD_HAT_10796 = 10796 - const val ROBIN_HOOD_HAT_NOTED_10797 = 10797 + const val ROBIN_HOOD_HAT_10797 = 10797 const val RUNE_PLATEBODY_G_10798 = 10798 - const val RUNE_PLATEBODY_G_NOTED_10799 = 10799 + const val RUNE_PLATEBODY_G_10799 = 10799 const val RUNE_PLATEBODY_T_10800 = 10800 - const val RUNE_PLATEBODY_T_NOTED_10801 = 10801 + const val RUNE_PLATEBODY_T_10801 = 10801 const val TAN_CAVALIER_10802 = 10802 - const val TAN_CAVALIER_NOTED_10803 = 10803 + const val TAN_CAVALIER_10803 = 10803 const val DARK_CAVALIER_10804 = 10804 - const val DARK_CAVALIER_NOTED_10805 = 10805 + const val DARK_CAVALIER_10805 = 10805 const val BLACK_CAVALIER_10806 = 10806 - const val BLACK_CAVALIER_NOTED_10807 = 10807 + const val BLACK_CAVALIER_10807 = 10807 const val ARCTIC_PYRE_LOGS = 10808 const val ARCTIC_PYRE_LOGS_NOTED = 10809 const val ARCTIC_PINE_LOGS = 10810 @@ -10380,7 +10380,7 @@ object Items { const val BOX_OF_CHOCOLATE_STRAWBERRIES_11914 = 11914 const val BOX_OF_CHOCOLATE_STRAWBERRIES_NOTED_11915 = 11915 const val SLICE_OF_BIRTHDAY_CAKE = 11916 - const val SLICE_OF_BIRTHDAY_CAKE_NOTED = 11917 + const val SLICE_OF_BIRTHDAY_CAKE_11917 = 11917 const val BIRTHDAY_PRESENT = 11918 const val COW_MASK = 11919 const val DRAGON_PICKAXE = 11920 @@ -11210,7 +11210,7 @@ object Items { const val MAGIC_IMP_BOX_PACK = 12744 const val MAGIC_IMP_BOX_PACK_NOTED = 12745 const val MYSTERIOUS_EMBLEM = 12746 - const val MYSTERIOUS_EMBLEM_NOTED = 12747 + const val MYSTERIOUS_EMBLEM_12747 = 12747 const val MYSTERIOUS_EMBLEM_TIER_2 = 12748 const val MYSTERIOUS_EMBLEM_TIER_3 = 12749 const val MYSTERIOUS_EMBLEM_TIER_4 = 12750 @@ -12134,6 +12134,12 @@ object Items { const val NULL_15345 = 15345 const val NULL_15346 = 15346 const val USELESS_KEY_16684 = 16684 + const val NEW_CRYSTAL_BOW_16888 = 16888 + const val NEW_CRYSTAL_BOW_I_16889 = 16889 + const val NEW_CRYSTAL_SHIELD_16890 = 16890 + const val NEW_CRYSTAL_SHIELD_I_16891 = 16891 + const val NEW_CRYSTAL_HALBERD_FULL_I_16892 = 16892 + const val NEW_CRYSTAL_HALBERD_FULL_16893 = 16893 const val DEAD_ORB_17152 = 17152 const val DWARF_REMAINS_17851 = 17851 const val BAG_FULL_OF_GEMS = 19473 @@ -12890,9 +12896,11 @@ object Items { const val AHRIMS_ROBESKIRT_20599 = 20599 const val RUNE_ARROW_20600 = 20600 const val NULL_20601 = 20601 - const val NULL_NOTED = 20602 + const val NULL_20602 = 20602 + const val NULL_20603 = 20603 const val NULL_20604 = 20604 - const val NULL_NOTED_20605 = 20605 + const val NULL_20605 = 20605 + const val NULL_20606 = 20606 const val RUNE_ARROW_PACK = 20607 const val BLOODIER_KEY = 20608 const val FAIRY_ENCHANTMENT = 20609 @@ -14636,8 +14644,8 @@ object Items { const val URIS_HAT_NOTED = 23256 const val GILDED_COIF = 23258 const val GILDED_COIF_NOTED = 23259 - const val GILDED_DHIDE_VAMBS = 23261 - const val GILDED_DHIDE_VAMBS_NOTED = 23262 + const val GILDED_DHIDE_VAMBRACES = 23261 + const val GILDED_DHIDE_VAMBRACES_NOTED = 23262 const val GILDED_DHIDE_BODY = 23264 const val GILDED_DHIDE_BODY_NOTED = 23265 const val GILDED_DHIDE_CHAPS = 23267 @@ -14780,7 +14788,7 @@ object Items { const val HEALER_ICON_23484 = 23484 const val HEALER_ICON_23485 = 23485 const val HEALER_ICON_23486 = 23486 - const val MYSTERIOUS_EMBLEM_TIER_10_NOTED = 23487 + const val ARCHAIC_EMBLEM_TIER_10 = 23487 const val WINE_OF_ZAMORAK_23489 = 23489 const val LARRANS_KEY = 23490 const val SRARACHA = 23495 @@ -14928,5 +14936,1045 @@ object Items { const val MAGES_BOOK_23652 = 23652 const val AHRIMS_STAFF_23653 = 23653 const val OCCULT_NECKLACE_23654 = 23654 + const val CRYSTAL_SEEDLING = 23655 + const val CRYSTAL_SEEDLING_W = 23657 + const val CRYSTAL_SAPLING = 23659 + const val CRYSTAL_ACORN = 23661 + const val DRAGONSTONE_ARMOUR_SET = 23667 + const val DRAGONSTONE_ARMOUR_SET_NOTED = 23668 + const val FLIER_23670 = 23670 + const val FLIER_NOTED_23671 = 23671 + const val CRYSTAL_AXE = 23673 + const val CRYSTAL_AXE_INACTIVE = 23675 + const val DRAGON_PICKAXE_OR = 23677 + const val CRYSTAL_PICKAXE = 23680 + const val CRYSTAL_PICKAXE_INACTIVE = 23682 + const val DIVINE_SUPER_COMBAT_POTION4 = 23685 + const val DIVINE_SUPER_COMBAT_POTION4_NOTED = 23686 + const val DIVINE_SUPER_COMBAT_POTION3 = 23688 + const val DIVINE_SUPER_COMBAT_POTION3_NOTED = 23689 + const val DIVINE_SUPER_COMBAT_POTION2 = 23691 + const val DIVINE_SUPER_COMBAT_POTION2_NOTED = 23692 + const val DIVINE_SUPER_COMBAT_POTION1 = 23694 + const val DIVINE_SUPER_COMBAT_POTION1_NOTED = 23695 + const val DIVINE_SUPER_ATTACK_POTION4 = 23697 + const val DIVINE_SUPER_ATTACK_POTION4_NOTED = 23698 + const val DIVINE_SUPER_ATTACK_POTION3 = 23700 + const val DIVINE_SUPER_ATTACK_POTION3_NOTED = 23701 + const val DIVINE_SUPER_ATTACK_POTION2 = 23703 + const val DIVINE_SUPER_ATTACK_POTION2_NOTED = 23704 + const val DIVINE_SUPER_ATTACK_POTION1 = 23706 + const val DIVINE_SUPER_ATTACK_POTION1_NOTED = 23707 + const val DIVINE_SUPER_STRENGTH_POTION4 = 23709 + const val DIVINE_SUPER_STRENGTH_POTION4_NOTED = 23710 + const val DIVINE_SUPER_STRENGTH_POTION3 = 23712 + const val DIVINE_SUPER_STRENGTH_POTION3_NOTED = 23713 + const val DIVINE_SUPER_STRENGTH_POTION2 = 23715 + const val DIVINE_SUPER_STRENGTH_POTION2_NOTED = 23716 + const val DIVINE_SUPER_STRENGTH_POTION1 = 23718 + const val DIVINE_SUPER_STRENGTH_POTION1_NOTED = 23719 + const val DIVINE_SUPER_DEFENCE_POTION4 = 23721 + const val DIVINE_SUPER_DEFENCE_POTION4_NOTED = 23722 + const val DIVINE_SUPER_DEFENCE_POTION3 = 23724 + const val DIVINE_SUPER_DEFENCE_POTION3_NOTED = 23725 + const val DIVINE_SUPER_DEFENCE_POTION2 = 23727 + const val DIVINE_SUPER_DEFENCE_POTION2_NOTED = 23728 + const val DIVINE_SUPER_DEFENCE_POTION1 = 23730 + const val DIVINE_SUPER_DEFENCE_POTION1_NOTED = 23731 + const val DIVINE_RANGING_POTION4 = 23733 + const val DIVINE_RANGING_POTION4_NOTED = 23734 + const val DIVINE_RANGING_POTION3 = 23736 + const val DIVINE_RANGING_POTION3_NOTED = 23737 + const val DIVINE_RANGING_POTION2 = 23739 + const val DIVINE_RANGING_POTION2_NOTED = 23740 + const val DIVINE_RANGING_POTION1 = 23742 + const val DIVINE_RANGING_POTION1_NOTED = 23743 + const val DIVINE_MAGIC_POTION4 = 23745 + const val DIVINE_MAGIC_POTION4_NOTED = 23746 + const val DIVINE_MAGIC_POTION3 = 23748 + const val DIVINE_MAGIC_POTION3_NOTED = 23749 + const val DIVINE_MAGIC_POTION2 = 23751 + const val DIVINE_MAGIC_POTION2_NOTED = 23752 + const val DIVINE_MAGIC_POTION1 = 23754 + const val DIVINE_MAGIC_POTION1_NOTED = 23755 + const val YOUNGLLEF = 23757 + const val CORRUPTED_YOUNGLLEF = 23759 + const val SMOLCANO = 23760 + const val CRYSTAL_HARPOON = 23762 + const val CRYSTAL_HARPOON_INACTIVE = 23764 + const val CRYSTAL_IMPLING_JAR = 23768 + const val CLUE_SCROLL_ELITE_23770 = 23770 + const val PRIFDDINAS_TELEPORT = 23771 + const val SCRAWLED_NOTES = 23773 + const val HAND_MIRROR_23775 = 23775 + const val RED_CRYSTAL_23776 = 23776 + const val YELLOW_CRYSTAL_23777 = 23777 + const val GREEN_CRYSTAL_23778 = 23778 + const val CYAN_CRYSTAL_23779 = 23779 + const val BLUE_CRYSTAL_23780 = 23780 + const val MAGENTA_CRYSTAL_23781 = 23781 + const val BLACK_CRYSTAL = 23782 + const val GREEN_CRYSTAL_23783 = 23783 + const val FRACTURED_CRYSTAL_23784 = 23784 + const val ARDOUGNE_KNIGHT_HELM = 23785 + const val ARDOUGNE_KNIGHT_PLATEBODY = 23787 + const val ARDOUGNE_KNIGHT_PLATELEGS = 23789 + const val ARDOUGNE_KNIGHT_TABARD = 23791 + const val BLUE_LIQUID = 23792 + const val GREEN_POWDER = 23793 + const val CLEAR_LIQUID = 23794 + const val RED_POWDER = 23795 + const val ODE_TO_ETERNITY = 23796 + const val ELDER_CADANTINE = 23798 + const val ELDER_CADANTINE_POTION_UNF = 23800 + const val CRYSTAL_23802 = 23802 + const val CRYSTAL_DUST = 23804 + const val INVERSION_POTION = 23806 + const val CRYSTAL_SEED_23808 = 23808 + const val CRYSTAL_SEED_23810 = 23810 + const val ORB_OF_LIGHT_23812 = 23812 + const val CLUE_SCROLL_23814 = 23814 + const val CLUE_SCROLL_23815 = 23815 + const val CLUE_SCROLL_23816 = 23816 + const val CLUE_SCROLL_23817 = 23817 + const val EXPLOSIVE_POTION_23818 = 23818 + const val CORRUPTED_SCEPTRE = 23820 + const val CORRUPTED_AXE = 23821 + const val CORRUPTED_PICKAXE = 23822 + const val CORRUPTED_HARPOON = 23823 + const val CORRUPTED_SHARDS = 23824 + const val CORRUPTED_DUST = 23830 + const val CORRUPTED_SPIKE = 23831 + const val CORRUPTED_BOWSTRING = 23832 + const val CORRUPTED_ORB = 23833 + const val WEAPON_FRAME = 23834 + const val GRYM_LEAF = 23835 + const val LINUM_TIRINUM = 23836 + const val CORRUPTED_ORE = 23837 + const val PHREN_BARK = 23838 + const val VIAL_23839 = 23839 + const val CORRUPTED_HELM_BASIC = 23840 + const val CORRUPTED_HELM_ATTUNED = 23841 + const val CORRUPTED_HELM_PERFECTED = 23842 + const val CORRUPTED_BODY_BASIC = 23843 + const val CORRUPTED_BODY_ATTUNED = 23844 + const val CORRUPTED_BODY_PERFECTED = 23845 + const val CORRUPTED_LEGS_BASIC = 23846 + const val CORRUPTED_LEGS_ATTUNED = 23847 + const val CORRUPTED_LEGS_PERFECTED = 23848 + const val CORRUPTED_HALBERD_BASIC = 23849 + const val CORRUPTED_HALBERD_ATTUNED = 23850 + const val CORRUPTED_HALBERD_PERFECTED = 23851 + const val CORRUPTED_STAFF_BASIC = 23852 + const val CORRUPTED_STAFF_ATTUNED = 23853 + const val CORRUPTED_STAFF_PERFECTED = 23854 + const val CORRUPTED_BOW_BASIC = 23855 + const val CORRUPTED_BOW_ATTUNED = 23856 + const val CORRUPTED_BOW_PERFECTED = 23857 + const val CORRUPTED_TELEPORT_CRYSTAL = 23858 + const val GAUNTLET_CAPE = 23859 + const val CRYSTAL_SCEPTRE = 23861 + const val CRYSTAL_AXE_23862 = 23862 + const val CRYSTAL_PICKAXE_23863 = 23863 + const val CRYSTAL_HARPOON_23864 = 23864 + const val PESTLE_AND_MORTAR_23865 = 23865 + const val CRYSTAL_SHARDS = 23866 + const val CRYSTAL_DUST_23867 = 23867 + const val CRYSTAL_SPIKE = 23868 + const val CRYSTALLINE_BOWSTRING = 23869 + const val CRYSTAL_ORB = 23870 + const val WEAPON_FRAME_23871 = 23871 + const val RAW_PADDLEFISH = 23872 + const val BURNT_FISH_23873 = 23873 + const val PADDLEFISH = 23874 + const val GRYM_LEAF_23875 = 23875 + const val LINUM_TIRINUM_23876 = 23876 + const val CRYSTAL_ORE = 23877 + const val PHREN_BARK_23878 = 23878 + const val VIAL_23879 = 23879 + const val WATERFILLED_VIAL = 23880 + const val GRYM_POTION_UNF = 23881 + const val EGNIOL_POTION_1 = 23882 + const val EGNIOL_POTION_2 = 23883 + const val EGNIOL_POTION_3 = 23884 + const val EGNIOL_POTION_4 = 23885 + const val CRYSTAL_HELM_BASIC = 23886 + const val CRYSTAL_HELM_ATTUNED = 23887 + const val CRYSTAL_HELM_PERFECTED = 23888 + const val CRYSTAL_BODY_BASIC = 23889 + const val CRYSTAL_BODY_ATTUNED = 23890 + const val CRYSTAL_BODY_PERFECTED = 23891 + const val CRYSTAL_LEGS_BASIC = 23892 + const val CRYSTAL_LEGS_ATTUNED = 23893 + const val CRYSTAL_LEGS_PERFECTED = 23894 + const val CRYSTAL_HALBERD_BASIC = 23895 + const val CRYSTAL_HALBERD_ATTUNED = 23896 + const val CRYSTAL_HALBERD_PERFECTED = 23897 + const val CRYSTAL_STAFF_BASIC = 23898 + const val CRYSTAL_STAFF_ATTUNED = 23899 + const val CRYSTAL_STAFF_PERFECTED = 23900 + const val CRYSTAL_BOW_BASIC = 23901 + const val CRYSTAL_BOW_ATTUNED = 23902 + const val CRYSTAL_BOW_PERFECTED = 23903 + const val TELEPORT_CRYSTAL = 23904 + const val TEPHRA = 23905 + const val REFINED_TEPHRA = 23906 + const val IMBUED_TEPHRA = 23907 + const val ZALCANO_SHARD = 23908 + const val ZALCANO_SHARD_NOTED = 23909 + const val CRYSTAL_CROWN = 23911 + const val CRYSTAL_CROWN_23913 = 23913 + const val CRYSTAL_CROWN_23915 = 23915 + const val CRYSTAL_CROWN_23917 = 23917 + const val CRYSTAL_CROWN_23919 = 23919 + const val CRYSTAL_CROWN_23921 = 23921 + const val CRYSTAL_CROWN_23923 = 23923 + const val CRYSTAL_CROWN_23925 = 23925 + const val CRYSTAL_OF_ITHELL = 23927 + const val CRYSTAL_OF_IORWERTH = 23929 + const val CRYSTAL_OF_TRAHAEARN = 23931 + const val CRYSTAL_OF_CADARN = 23933 + const val CRYSTAL_OF_CRWYS = 23935 + const val CRYSTAL_OF_MEILYR = 23937 + const val CRYSTAL_OF_HEFIN = 23939 + const val CRYSTAL_OF_AMLODD = 23941 + const val ELVEN_SIGNET = 23943 + const val ELVEN_SIGNET_NOTED = 23944 + const val ETERNAL_TELEPORT_CRYSTAL = 23946 + const val ELVEN_DAWN = 23948 + const val ELVEN_DAWN_NOTED = 23949 + const val ENHANCED_CRYSTAL_KEY = 23951 + const val CRYSTAL_TOOL_SEED = 23953 + const val CRYSTAL_TOOL_SEED_NOTED = 23954 + const val CRYSTAL_ARMOUR_SEED = 23956 + const val CRYSTAL_ARMOUR_SEED_NOTED = 23957 + const val ENHANCED_CRYSTAL_TELEPORT_SEED = 23959 + const val ENHANCED_CRYSTAL_TELEPORT_SEED_NOTED = 23960 + const val CRYSTAL_SHARD = 23962 + const val CRYSTAL_DUST_23964 = 23964 + const val CRYSTAL_HELM = 23971 + const val CRYSTAL_HELM_INACTIVE = 23973 + const val CRYSTAL_BODY = 23975 + const val CRYSTAL_BODY_INACTIVE = 23977 + const val CRYSTAL_LEGS = 23979 + const val CRYSTAL_LEGS_INACTIVE = 23981 + const val CRYSTAL_BOW = 23983 + const val CRYSTAL_BOW_INACTIVE = 23985 + const val CRYSTAL_HALBERD = 23987 + const val CRYSTAL_HALBERD_INACTIVE = 23989 + const val CRYSTAL_SHIELD = 23991 + const val CRYSTAL_SHIELD_INACTIVE = 23993 + const val BLADE_OF_SAELDOR = 23995 + const val BLADE_OF_SAELDOR_INACTIVE = 23997 + const val BLADE_OF_SAELDOR_INACTIVE_NOTED = 23998 + const val CRYSTAL_GRAIL = 24000 + const val CRYSTAL_GRAIL_NOTED = 24001 + const val ELVEN_BOOTS = 24003 + const val ELVEN_BOOTS_NOTED = 24004 + const val ELVEN_GLOVES = 24006 + const val ELVEN_GLOVES_NOTED = 24007 + const val ELVEN_TOP = 24009 + const val ELVEN_TOP_NOTED = 24010 + const val ELVEN_SKIRT = 24012 + const val ELVEN_SKIRT_NOTED = 24013 + const val ELVEN_TOP_24015 = 24015 + const val ELVEN_TOP_NOTED_24016 = 24016 + const val ELVEN_SKIRT_24018 = 24018 + const val ELVEN_SKIRT_NOTED_24019 = 24019 + const val ELVEN_TOP_24021 = 24021 + const val ELVEN_TOP_NOTED_24022 = 24022 + const val ELVEN_LEGWEAR = 24024 + const val ELVEN_LEGWEAR_NOTED = 24025 + const val ELVEN_TOP_24027 = 24027 + const val ELVEN_TOP_NOTED_24028 = 24028 + const val MEMORIAM_CRYSTAL_1 = 24030 + const val MEMORIAM_CRYSTAL_2 = 24031 + const val MEMORIAM_CRYSTAL_3 = 24032 + const val MEMORIAM_CRYSTAL_4 = 24033 + const val DRAGONSTONE_FULL_HELM = 24034 + const val DRAGONSTONE_FULL_HELM_NOTED = 24035 + const val DRAGONSTONE_PLATEBODY = 24037 + const val DRAGONSTONE_PLATEBODY_NOTED = 24038 + const val DRAGONSTONE_PLATELEGS = 24040 + const val DRAGONSTONE_PLATELEGS_NOTED = 24041 + const val DRAGONSTONE_BOOTS = 24043 + const val DRAGONSTONE_BOOTS_NOTED = 24044 + const val DRAGONSTONE_GAUNTLETS = 24046 + const val DRAGONSTONE_GAUNTLETS_NOTED = 24047 + const val CRAZED_SCRIBBLES = 24049 + const val A_DEAR_FRIEND = 24051 + const val ON_LEPRECHAUNS = 24053 + const val BLOODY_DIARY = 24055 + const val THE_EIGHT_CLANS = 24057 + const val GOLLWYNS_FINAL_STATEMENT = 24059 + const val NIFF__HARRY = 24061 + const val SOGGY_JOURNAL = 24063 + const val EBRILLS_JOURNAL = 24065 + const val STAINED_JOURNAL = 24067 + const val THE_TRUTH_BEHIND_THE_MYTH_EXCERPT = 24069 + const val THE_LIVING_STATUES = 24071 + const val THE_SPURNED_DEMON = 24073 + const val LEGENDS_OF_THE_MOUNTAIN = 24075 + const val CRYSTAL_BOW_24123 = 24123 + const val CRYSTAL_HALBERD_24125 = 24125 + const val CRYSTAL_SHIELD_24127 = 24127 + const val COMBAT_PATH_STARTER_KIT = 24130 + const val COMBAT_PATH_VOUCHER = 24131 + const val MARBLE_LECTERN = 24132 + const val INFERNAL_MAX_CAPE_L = 24133 + const val FIRE_MAX_CAPE_L = 24134 + const val ASSEMBLER_MAX_CAPE_L = 24135 + const val BRONZE_DEFENDER_L = 24136 + const val IRON_DEFENDER_L = 24137 + const val STEEL_DEFENDER_L = 24138 + const val BLACK_DEFENDER_L = 24139 + const val MITHRIL_DEFENDER_L = 24140 + const val ADAMANT_DEFENDER_L = 24141 + const val RUNE_DEFENDER_L = 24142 + const val DRAGON_DEFENDER_L = 24143 + const val STAFF_OF_BALANCE = 24144 + const val STAFF_OF_BALANCE_NOTED = 24145 + const val ARMADYL_HALO_BROKEN = 24147 + const val BANDOS_HALO_BROKEN = 24149 + const val SEREN_HALO_BROKEN = 24151 + const val ANCIENT_HALO_BROKEN = 24153 + const val BRASSICA_HALO_BROKEN = 24155 + const val DECORATIVE_SWORD_L = 24157 + const val DECORATIVE_ARMOUR_L = 24158 + const val DECORATIVE_ARMOUR_L_24159 = 24159 + const val DECORATIVE_HELM_L = 24160 + const val DECORATIVE_SHIELD_L = 24161 + const val DECORATIVE_ARMOUR_L_24162 = 24162 + const val DECORATIVE_ARMOUR_L_24163 = 24163 + const val DECORATIVE_ARMOUR_L_24164 = 24164 + const val DECORATIVE_ARMOUR_L_24165 = 24165 + const val DECORATIVE_ARMOUR_L_24166 = 24166 + const val DECORATIVE_ARMOUR_L_24167 = 24167 + const val DECORATIVE_ARMOUR_L_24168 = 24168 + const val SARADOMIN_HALO_L = 24169 + const val ZAMORAK_HALO_L = 24170 + const val GUTHIX_HALO_L = 24171 + const val HEALER_HAT_L = 24172 + const val FIGHTER_HAT_L = 24173 + const val RANGER_HAT_L = 24174 + const val FIGHTER_TORSO_L = 24175 + const val PENANCE_SKIRT_L = 24176 + const val VOID_KNIGHT_TOP_L = 24177 + const val ELITE_VOID_TOP_L = 24178 + const val VOID_KNIGHT_ROBE_L = 24179 + const val ELITE_VOID_ROBE_L = 24180 + const val VOID_KNIGHT_MACE_L = 24181 + const val VOID_KNIGHT_GLOVES_L = 24182 + const val VOID_MAGE_HELM_L = 24183 + const val VOID_RANGER_HELM_L = 24184 + const val VOID_MELEE_HELM_L = 24185 + const val AVERNIC_DEFENDER_L = 24186 + const val TROUVER_PARCHMENT = 24187 + const val DEADMANS_CHEST_24189 = 24189 + const val DEADMANS_LEGS_24190 = 24190 + const val DEADMANS_CAPE_24191 = 24191 + const val ARMADYL_HALO = 24192 + const val ARMADYL_HALO_L = 24194 + const val BANDOS_HALO = 24195 + const val BANDOS_HALO_L = 24197 + const val SEREN_HALO = 24198 + const val SEREN_HALO_L = 24200 + const val ANCIENT_HALO = 24201 + const val ANCIENT_HALO_L = 24203 + const val BRASSICA_HALO = 24204 + const val BRASSICA_HALO_L = 24206 + const val VICTORS_CAPE_1 = 24207 + const val VICTORS_CAPE_10 = 24209 + const val VICTORS_CAPE_50 = 24211 + const val VICTORS_CAPE_100 = 24213 + const val VICTORS_CAPE_500 = 24215 + const val GUTHIXIAN_ICON = 24217 + const val SWIFT_BLADE = 24219 + const val SWIFT_BLADE_NOTED = 24220 + const val AVAS_ASSEMBLER_L = 24222 + const val FIRE_CAPE_L = 24223 + const val INFERNAL_CAPE_L = 24224 + const val GRANITE_MAUL_24225 = 24225 + const val GRANITE_MAUL_24227 = 24227 + const val ORNATE_MAUL_HANDLE = 24229 + const val ORNATE_MAUL_HANDLE_NOTED = 24230 + const val IMBUED_SARADOMIN_MAX_CAPE_L = 24232 + const val IMBUED_ZAMORAK_MAX_CAPE_L = 24233 + const val IMBUED_GUTHIX_MAX_CAPE_L = 24234 + const val HOUSE_ADVERTISEMENT = 24235 + const val IMBUED_SARADOMIN_CAPE_BROKEN = 24236 + const val IMBUED_SARADOMIN_MAX_CAPE_BROKEN = 24238 + const val IMBUED_GUTHIX_CAPE_BROKEN = 24240 + const val IMBUED_GUTHIX_MAX_CAPE_BROKEN = 24242 + const val IMBUED_ZAMORAK_CAPE_BROKEN = 24244 + const val IMBUED_ZAMORAK_MAX_CAPE_BROKEN = 24246 + const val IMBUED_SARADOMIN_CAPE_L = 24248 + const val IMBUED_GUTHIX_CAPE_L = 24249 + const val IMBUED_ZAMORAK_CAPE_L = 24250 + const val WILDERNESS_CRABS_TELEPORT = 24251 + const val CLUE_SCROLL_ELITE_24253 = 24253 + const val FANG = 24254 + const val VENOM_GLAND = 24255 + const val UNSEALED_LETTER = 24256 + const val UNSEALED_LETTER_24257 = 24257 + const val V_SIGIL = 24258 + const val V_SIGIL_E = 24259 + const val MOLTEN_GLASS_I = 24260 + const val LUNAR_GLASS = 24261 + const val POLISHING_ROCK = 24262 + const val BALLAD_OF_THE_BASILISK = 24263 + const val VS_SHIELD = 24265 + const val VS_SHIELD_24266 = 24266 + const val BASILISK_JAW = 24268 + const val BASILISK_JAW_NOTED = 24269 + const val NEITIZNOT_FACEGUARD = 24271 + const val BASILISK_KNIGHT = 24276 + const val MYSTERIOUS_EMBLEM_TIER_1 = 24277 + const val MYSTERIOUS_EMBLEM_TIER_2_24279 = 24279 + const val MYSTERIOUS_EMBLEM_TIER_3_24281 = 24281 + const val MYSTERIOUS_EMBLEM_TIER_4_24283 = 24283 + const val MYSTERIOUS_EMBLEM_TIER_5_24285 = 24285 + const val DECORATIVE_EMBLEM = 24287 + const val DAGONHAI_HAT = 24288 + const val DAGONHAI_HAT_NOTED = 24289 + const val DAGONHAI_ROBE_TOP = 24291 + const val DAGONHAI_ROBE_TOP_NOTED = 24292 + const val DAGONHAI_ROBE_BOTTOM = 24294 + const val DAGONHAI_ROBE_BOTTOM_NOTED = 24295 + const val WHITE_BED_SHEETS = 24297 + const val SMOKE_POWDER = 24298 + const val SHINY_GLASS = 24299 + const val SPOOKY_HOOD = 24300 + const val SPOOKY_ROBE = 24301 + const val SPOOKY_SKIRT = 24302 + const val SPOOKY_GLOVES = 24303 + const val SPOOKY_BOOTS = 24304 + const val SPOOKY_HOOD_24305 = 24305 + const val SPOOKY_ROBE_24307 = 24307 + const val SPOOKY_SKIRT_24309 = 24309 + const val SPOOKY_GLOVES_24311 = 24311 + const val SPOOKY_BOOTS_24313 = 24313 + const val SPOOKIER_HOOD = 24315 + const val SPOOKIER_ROBE = 24317 + const val SPOOKIER_SKIRT = 24319 + const val SPOOKIER_GLOVES = 24321 + const val SPOOKIER_BOOTS = 24323 + const val PUMPKIN_LANTERN = 24325 + const val SKELETON_LANTERN = 24327 + const val BOUNTY_CRATE = 24329 + const val BIRTHDAY_CAKE_24331 = 24331 + const val BIRTHDAY_CAKE_24332 = 24332 + const val DAGONHAI_ROBES_SET = 24333 + const val DAGONHAI_ROBES_SET_NOTED = 24334 + const val TARGET_TELEPORT = 24336 + const val BOUNTY_HUNTER_HAT_TIER_1 = 24338 + const val BOUNTY_HUNTER_HAT_TIER_2 = 24340 + const val BOUNTY_HUNTER_HAT_TIER_3 = 24342 + const val BOUNTY_HUNTER_HAT_TIER_4 = 24344 + const val BOUNTY_HUNTER_HAT_TIER_5 = 24346 + const val BOUNTY_HUNTER_HAT_TIER_6 = 24348 + const val SCROLL_BOX_BEGINNER = 24361 + const val SCROLL_BOX_EASY = 24362 + const val SCROLL_BOX_MEDIUM = 24363 + const val SCROLL_BOX_HARD = 24364 + const val SCROLL_BOX_ELITE = 24365 + const val SCROLL_BOX_MASTER = 24366 + const val CABBAGE_24367 = 24367 + const val TWISTED_SLAYER_HELMET = 24370 + const val TWISTED_DRAGON_TROPHY = 24372 + const val TWISTED_RUNE_TROPHY = 24374 + const val TWISTED_ADAMANT_TROPHY = 24376 + const val TWISTED_MITHRIL_TROPHY = 24378 + const val TWISTED_STEEL_TROPHY = 24380 + const val TWISTED_IRON_TROPHY = 24382 + const val TWISTED_BRONZE_TROPHY = 24384 + const val TWISTED_HAT_T3 = 24387 + const val TWISTED_COAT_T3 = 24389 + const val TWISTED_TROUSERS_T3 = 24391 + const val TWISTED_BOOTS_T3 = 24393 + const val TWISTED_CANE = 24395 + const val TWISTED_HAT_T2 = 24397 + const val TWISTED_COAT_T2 = 24399 + const val TWISTED_TROUSERS_T2 = 24401 + const val TWISTED_BOOTS_T2 = 24403 + const val TWISTED_HAT_T1 = 24405 + const val TWISTED_COAT_T1 = 24407 + const val TWISTED_TROUSERS_T1 = 24409 + const val TWISTED_BOOTS_T1 = 24411 + const val TWISTED_BANNER = 24413 + const val RUNE_POUCH_L = 24416 + const val INQUISITORS_MACE = 24417 + const val GRAVESTONE = 24418 + const val INQUISITORS_GREAT_HELM = 24419 + const val INQUISITORS_HAUBERK = 24420 + const val INQUISITORS_PLATESKIRT = 24421 + const val NIGHTMARE_STAFF = 24422 + const val HARMONISED_NIGHTMARE_STAFF = 24423 + const val VOLATILE_NIGHTMARE_STAFF = 24424 + const val ELDRITCH_NIGHTMARE_STAFF = 24425 + const val CABBAGE_24426 = 24426 + const val GREEN_GINGERBREAD_SHIELD = 24428 + const val RED_GINGERBREAD_SHIELD = 24430 + const val BLUE_GINGERBREAD_SHIELD = 24431 + const val FESTIVE_CINNAMON_STICK = 24432 + const val FESTIVE_GINGER_POWDER = 24433 + const val FESTIVE_EGG = 24434 + const val FESTIVE_POT = 24435 + const val FESTIVE_FLOUR = 24436 + const val GINGERBREAD_SHIELD = 24437 + const val ICED_GINGERBREAD_SHIELD = 24438 + const val ICED_GINGERBREAD_SHIELD_24439 = 24439 + const val ICED_GINGERBREAD_SHIELD_24440 = 24440 + const val SCAPERUNE_TELEPORT = 24441 + const val BAKERY_STORAGE_KEY = 24442 + const val GINGERBREAD_GNOME = 24443 + const val TWISTED_SLAYER_HELMET_I = 24444 + const val TWISTED_HAT_T3_NOTED = 24446 + const val TWISTED_COAT_T3_NOTED = 24447 + const val TWISTED_TROUSERS_T3_NOTED = 24448 + const val TWISTED_BOOTS_T3_NOTED = 24449 + const val TWISTED_CANE_NOTED = 24450 + const val TWISTED_HAT_T2_NOTED = 24451 + const val TWISTED_COAT_T2_NOTED = 24452 + const val TWISTED_TROUSERS_T2_NOTED = 24453 + const val TWISTED_BOOTS_T2_NOTED = 24454 + const val TWISTED_HAT_T1_NOTED = 24455 + const val TWISTED_COAT_T1_NOTED = 24456 + const val TWISTED_TROUSERS_T1_NOTED = 24457 + const val TWISTED_BOOTS_T1_NOTED = 24458 + const val TWISTED_BANNER_NOTED = 24459 + const val TWISTED_TELEPORT_SCROLL = 24460 + const val TWISTED_TELEPORT_SCROLL_NOTED = 24461 + const val TWISTED_BLUEPRINTS = 24463 + const val TWISTED_BLUEPRINTS_NOTED = 24464 + const val TWISTED_HORNS = 24466 + const val TWISTED_HORNS_NOTED = 24467 + const val TWISTED_RELIC_HUNTER_T1_ARMOUR_SET = 24469 + const val TWISTED_RELIC_HUNTER_T1_ARMOUR_SET_NOTED = 24470 + const val TWISTED_RELIC_HUNTER_T2_ARMOUR_SET = 24472 + const val TWISTED_RELIC_HUNTER_T2_ARMOUR_SET_NOTED = 24473 + const val TWISTED_RELIC_HUNTER_T3_ARMOUR_SET = 24475 + const val TWISTED_RELIC_HUNTER_T3_ARMOUR_SET_NOTED = 24476 + const val OPEN_HERB_SACK = 24478 + const val SPICE_RACK = 24479 + const val OPEN_COAL_BAG = 24480 + const val OPEN_GEM_BAG = 24481 + const val OPEN_SEED_BOX = 24482 + const val PHOENIX_24483 = 24483 + const val PHOENIX_24484 = 24484 + const val PHOENIX_24485 = 24485 + const val PHOENIX_24486 = 24486 + const val INQUISITORS_ARMOUR_SET = 24488 + const val INQUISITORS_ARMOUR_SET_NOTED = 24489 + const val LITTLE_NIGHTMARE = 24491 + const val CLUE_SCROLL_HARD_24493 = 24493 + const val PUZZLE_BOX_HARD_24494 = 24494 + const val JAR_OF_DREAMS = 24495 + const val JAR_OF_DREAMS_NOTED = 24496 + const val INQUISITORS_MACE_NOTED = 24498 + const val INQUISITORS_GREAT_HELM_NOTED = 24500 + const val INQUISITORS_HAUBERK_NOTED = 24502 + const val INQUISITORS_PLATESKIRT_NOTED = 24504 + const val NIGHTMARE_STAFF_NOTED = 24506 + const val HARMONISED_ORB = 24511 + const val HARMONISED_ORB_NOTED = 24512 + const val VOLATILE_ORB = 24514 + const val VOLATILE_ORB_NOTED = 24515 + const val ELDRITCH_ORB = 24517 + const val ELDRITCH_ORB_NOTED = 24518 + const val VICTORS_CAPE_1000 = 24520 + const val NULL_24522 = 24522 + const val DEATHS_COFFER = 24523 + const val GRAVESTONE_24524 = 24524 + const val CAT_EARS = 24525 + const val HELL_CAT_EARS = 24527 + const val LAMP_OF_THE_GATHERER = 24528 + const val HARMONY = 24529 + const val RUNNER_HAT_BROKEN = 24531 + const val RUNNER_HAT_L = 24533 + const val MITHRIL_SEEDS_24534 = 24534 + const val MAGIC_EGG_BALL = 24535 + const val CARROT_SWORD = 24537 + const val _24CARAT_SWORD = 24539 + const val PAINTED_FAKE_MAGIC_EGG = 24541 + const val UNPAINTED_FAKE_MAGIC_EGG = 24542 + const val CONCH_SHELL = 24543 + const val BROKEN_EGG = 24544 + const val DUMMY_PORTAL = 24545 + const val CARROT = 24546 + const val BROKEN_GOAT_HORN = 24547 + const val CAKE_24549 = 24549 + const val BLADE_OF_SAELDOR_C = 24551 + const val BLADE_OF_SAELDOR_C_24553 = 24553 + const val PYROMANCER_SET = 24554 + const val TANGLEROOT_24555 = 24555 + const val TANGLEROOT_24557 = 24557 + const val TANGLEROOT_24559 = 24559 + const val TANGLEROOT_24561 = 24561 + const val TANGLEROOT_24563 = 24563 + const val ANTIQUE_EMBLEM_TIER_1 = 24565 + const val ANTIQUE_EMBLEM_TIER_2 = 24567 + const val ANTIQUE_EMBLEM_TIER_3 = 24569 + const val ANTIQUE_EMBLEM_TIER_4 = 24571 + const val ANTIQUE_EMBLEM_TIER_5 = 24573 + const val ANTIQUE_EMBLEM_TIER_6 = 24575 + const val ANTIQUE_EMBLEM_TIER_7 = 24577 + const val ANTIQUE_EMBLEM_TIER_8 = 24579 + const val ANTIQUE_EMBLEM_TIER_9 = 24581 + const val ANTIQUE_EMBLEM_TIER_10 = 24583 + const val LOOTING_BAG_NOTE = 24585 + const val RUNE_POUCH_NOTE = 24587 + const val BLIGHTED_MANTA_RAY = 24589 + const val BLIGHTED_MANTA_RAY_NOTED = 24590 + const val BLIGHTED_ANGLERFISH = 24592 + const val BLIGHTED_ANGLERFISH_NOTED = 24593 + const val BLIGHTED_KARAMBWAN = 24595 + const val BLIGHTED_KARAMBWAN_NOTED = 24596 + const val BLIGHTED_SUPER_RESTORE4 = 24598 + const val BLIGHTED_SUPER_RESTORE4_NOTED = 24599 + const val BLIGHTED_SUPER_RESTORE3 = 24601 + const val BLIGHTED_SUPER_RESTORE3_NOTED = 24602 + const val BLIGHTED_SUPER_RESTORE2 = 24603 + const val BLIGHTED_SUPER_RESTORE2_NOTED = 24604 + const val BLIGHTED_SUPER_RESTORE1 = 24605 + const val BLIGHTED_SUPER_RESTORE1_NOTED = 24606 + const val BLIGHTED_ANCIENT_ICE_SACK = 24607 + const val BLIGHTED_BIND_SACK = 24609 + const val BLIGHTED_SNARE_SACK = 24611 + const val BLIGHTED_ENTANGLE_SACK = 24613 + const val BLIGHTED_TELEPORT_SPELL_SACK = 24615 + const val VESTAS_BLIGHTED_LONGSWORD = 24617 + const val VESTAS_LONGSWORD_INACTIVE = 24619 + const val BLIGHTED_VENGEANCE_SACK = 24621 + const val DIVINE_BATTLEMAGE_POTION4 = 24623 + const val DIVINE_BATTLEMAGE_POTION4_NOTED = 24624 + const val DIVINE_BATTLEMAGE_POTION3 = 24626 + const val DIVINE_BATTLEMAGE_POTION3_NOTED = 24627 + const val DIVINE_BATTLEMAGE_POTION2 = 24629 + const val DIVINE_BATTLEMAGE_POTION2_NOTED = 24630 + const val DIVINE_BATTLEMAGE_POTION1 = 24632 + const val DIVINE_BATTLEMAGE_POTION1_NOTED = 24633 + const val DIVINE_BASTION_POTION4 = 24635 + const val DIVINE_BASTION_POTION4_NOTED = 24636 + const val DIVINE_BASTION_POTION3 = 24638 + const val DIVINE_BASTION_POTION3_NOTED = 24639 + const val DIVINE_BASTION_POTION2 = 24641 + const val DIVINE_BASTION_POTION2_NOTED = 24642 + const val DIVINE_BASTION_POTION1 = 24644 + const val DIVINE_BASTION_POTION1_NOTED = 24645 + const val LOGS_24650 = 24650 + const val RAW_SHRIMPS_24652 = 24652 + const val RAW_SHRIMPS_NOTED_24653 = 24653 + const val BONES_24655 = 24655 + const val ENRAGED_TEKTINY = 24656 + const val FLYING_VESPINA = 24658 + const val MASSIVE_STORAGE_UNIT = 24660 + const val MASSIVE_STORAGE_UNIT_24661 = 24661 + const val MASSIVE_STORAGE_UNIT_24662 = 24662 + const val MASSIVE_STORAGE_UNIT_24663 = 24663 + const val TWISTED_ANCESTRAL_HAT = 24664 + const val TWISTED_ANCESTRAL_ROBE_TOP = 24666 + const val TWISTED_ANCESTRAL_ROBE_BOTTOM = 24668 + const val TWISTED_ANCESTRAL_COLOUR_KIT = 24670 + const val HAEMALCHEMY_VOLUME_2 = 24672 + const val VYRE_NOBLE_TOP_UNSCENTED = 24673 + const val VYRE_NOBLE_LEGS_UNSCENTED = 24674 + const val VYRE_NOBLE_SHOES_UNSCENTED = 24675 + const val VYRE_NOBLE_TOP = 24676 + const val VYRE_NOBLE_LEGS = 24678 + const val VYRE_NOBLE_SHOES = 24680 + const val OLD_NOTE = 24682 + const val TATTY_NOTE_24684 = 24684 + const val JOURNAL_PAGE = 24686 + const val ANCIENT_ARMOUR = 24688 + const val TOME_OF_EXPERIENCE_24690 = 24690 + const val BLISTERWOOD_LOGS = 24691 + const val RUBY_SICKLE_B = 24693 + const val ENCHANTED_RUBY_SICKLE_B = 24695 + const val BLISTERWOOD_SICKLE = 24697 + const val BLISTERWOOD_FLAIL = 24699 + const val DARK_SQUIRREL = 24701 + const val VYRE = 24702 + const val COIN_POUCH_24703 = 24703 + const val DAEYALT_ESSENCE = 24704 + const val DAEYALT_SHARD = 24706 + const val VAMPYRE = 24708 + const val HALLOWED_CRYSTAL_SHARD = 24709 + const val HALLOWED_MARK = 24711 + const val HALLOWED_TOKEN = 24719 + const val HALLOWED_GRAPPLE = 24721 + const val HALLOWED_FOCUS = 24723 + const val HALLOWED_SYMBOL = 24725 + const val HALLOWED_HAMMER = 24727 + const val DARK_DYE = 24729 + const val HALLOWED_RING = 24731 + const val DARK_ACORN = 24733 + const val RING_OF_ENDURANCE_UNCHARGED = 24735 + const val RING_OF_ENDURANCE = 24736 + const val STRANGE_OLD_LOCKPICK = 24738 + const val STRANGE_OLD_LOCKPICK_FULL = 24740 + const val STRANGE_OLD_LOCKPICK_FULL_NOTED = 24741 + const val GRACEFUL_HOOD_24743 = 24743 + const val GRACEFUL_HOOD_24745 = 24745 + const val GRACEFUL_CAPE_24746 = 24746 + const val GRACEFUL_CAPE_24748 = 24748 + const val GRACEFUL_TOP_24749 = 24749 + const val GRACEFUL_TOP_24751 = 24751 + const val GRACEFUL_LEGS_24752 = 24752 + const val GRACEFUL_LEGS_24754 = 24754 + const val GRACEFUL_GLOVES_24755 = 24755 + const val GRACEFUL_GLOVES_24757 = 24757 + const val GRACEFUL_BOOTS_24758 = 24758 + const val GRACEFUL_BOOTS_24760 = 24760 + const val STRANGE_HALLOWED_TOME = 24761 + const val MYSTERIOUS_PAGE = 24763 + const val MYSTERIOUS_PAGE_24765 = 24765 + const val MYSTERIOUS_PAGE_24767 = 24767 + const val MYSTERIOUS_PAGE_24769 = 24769 + const val MYSTERIOUS_PAGE_24771 = 24771 + const val CLUE_SCROLL_ELITE_24773 = 24773 + const val BLOOD_PINT = 24774 + const val BLOOD_PINT_NOTED = 24775 + const val BLOOD_SHARD = 24777 + const val BLOOD_SHARD_NOTED = 24778 + const val AMULET_OF_BLOOD_FURY = 24780 + const val RAW_MYSTERY_MEAT = 24782 + const val RAW_MYSTERY_MEAT_NOTED = 24783 + const val COOKED_MYSTERY_MEAT = 24785 + const val COOKED_MYSTERY_MEAT_NOTED = 24786 + const val PAT_OF_NOT_GARLIC_BUTTER = 24788 + const val LONG_ROPE = 24790 + const val SEVERED_LEG_24792 = 24792 + const val VYRE_NOBLE_BLAZER = 24794 + const val VYRE_NOBLE_COAT_TAILS = 24796 + const val VYRE_NOBLE_VEST = 24798 + const val VYRE_NOBLE_PANTS = 24800 + const val VYRE_NOBLE_CORSET = 24802 + const val VYRE_NOBLE_SKIRT = 24804 + const val VYRE_NOBLE_DRESS_TOP = 24806 + const val VYRE_NOBLE_DRESS_BOTTOM = 24808 + const val VYRE_NOBLE_BLAZER_24810 = 24810 + const val VYRE_NOBLE_COAT_TAILS_24812 = 24812 + const val VYRE_NOBLE_VEST_24814 = 24814 + const val VYRE_NOBLE_PANTS_24816 = 24816 + const val VYRE_NOBLE_CORSET_24818 = 24818 + const val VYRE_NOBLE_SKIRT_24820 = 24820 + const val VYRE_NOBLE_DRESS_TOP_24822 = 24822 + const val VYRE_NOBLE_DRESS_BOTTOM_24824 = 24824 + const val VYRE_NOBLE_BLAZER_24826 = 24826 + const val VYRE_NOBLE_COAT_TAILS_24828 = 24828 + const val VYRE_NOBLE_VEST_24830 = 24830 + const val VYRE_NOBLE_PANTS_24832 = 24832 + const val VYRE_NOBLE_CORSET_24834 = 24834 + const val VYRE_NOBLE_SKIRT_24836 = 24836 + const val VYRE_NOBLE_DRESS_TOP_24838 = 24838 + const val VYRE_NOBLE_DRESS_BOTTOM_24840 = 24840 + const val A_TASTE_OF_HOPE = 24842 + const val RING_OF_ENDURANCE_UNCHARGED_24844 = 24844 + const val RING_OF_ENDURANCE_UNCHARGED_NOTED = 24845 + const val RED = 24847 + const val ZIGGY = 24849 + const val SOFT_CLAY_PACK_24851 = 24851 + const val BAG_FULL_OF_GEMS_24853 = 24853 + const val MYTHICAL_MAX_CAPE = 24855 + const val MYTHICAL_MAX_HOOD = 24857 + const val WARRIOR_PATH_STARTER_KIT = 24859 + const val WIZARD_PATH_STARTER_KIT = 24860 + const val RANGER_PATH_STARTER_KIT = 24861 + const val KARAMJAN_MONKEY = 24862 + const val ZOMBIE_MONKEY = 24863 + const val MANIACAL_MONKEY = 24864 + const val SKELETON_MONKEY = 24865 + const val KRUK_JR = 24866 + const val PRINCELY_MONKEY = 24867 + const val GOLDEN_ARMADYL_SPECIAL_ATTACK = 24868 + const val GOLDEN_BANDOS_SPECIAL_ATTACK = 24869 + const val GOLDEN_SARADOMIN_SPECIAL_ATTACK = 24870 + const val GOLDEN_ZAMORAK_SPECIAL_ATTACK = 24871 + const val CARPENTERS_HELMET = 24872 + const val CARPENTERS_SHIRT = 24874 + const val CARPENTERS_TROUSERS = 24876 + const val CARPENTERS_BOOTS = 24878 + const val AMYS_SAW = 24880 + const val PLANK_SACK = 24882 + const val SUPPLY_CRATE_24884 = 24884 + const val HOSIDIUS_BLUEPRINTS = 24885 + const val WOODEN_TABLE = 24886 + const val OAK_TABLE = 24887 + const val TEAK_TABLE_24888 = 24888 + const val MAHOGANY_TABLE_24889 = 24889 + const val WOODEN_TABLE_24890 = 24890 + const val OAK_TABLE_24891 = 24891 + const val TEAK_TABLE_24892 = 24892 + const val MAHOGANY_TABLE_24893 = 24893 + const val WOODEN_TABLE_24894 = 24894 + const val OAK_TABLE_24895 = 24895 + const val TEAK_TABLE_24896 = 24896 + const val MAHOGANY_TABLE_24897 = 24897 + const val WOODEN_CABINET = 24898 + const val OAK_CABINET = 24899 + const val TEAK_CABINET = 24900 + const val MAHOGANY_CABINET = 24901 + const val WOODEN_BOOKCASE_24902 = 24902 + const val OAK_BOOKCASE_24903 = 24903 + const val TEAK_BOOKCASE = 24904 + const val MAHOGANY_BOOKCASE_24905 = 24905 + const val WOODEN_WARDROBE = 24906 + const val OAK_WARDROBE_24907 = 24907 + const val TEAK_WARDROBE_24908 = 24908 + const val MAHOGANY_WARDROBE_24909 = 24909 + const val WOODEN_DRESSER = 24910 + const val OAK_DRESSER_24911 = 24911 + const val TEAK_DRESSER_24912 = 24912 + const val MAHOGANY_DRESSER_24913 = 24913 + const val WOODEN_SHELVES = 24914 + const val OAK_SHELVES = 24915 + const val TEAK_SHELVES = 24916 + const val MAHOGANY_SHELVES = 24917 + const val WOODEN_BED_24918 = 24918 + const val OAK_BED_24919 = 24919 + const val TEAK_BED_24920 = 24920 + const val MAHOGANY_BED = 24921 + const val WOODEN_BED_24922 = 24922 + const val OAK_BED_24923 = 24923 + const val TEAK_BED_24924 = 24924 + const val MAHOGANY_BED_24925 = 24925 + const val WOODEN_DRAWER = 24926 + const val OAK_DRAWER = 24927 + const val TEAK_DRAWER = 24928 + const val MAHOGANY_DRAWER = 24929 + const val WOODEN_CHAIR_24930 = 24930 + const val OAK_CHAIR_24931 = 24931 + const val TEAK_CHAIR = 24932 + const val MAHOGANY_CHAIR = 24933 + const val WOODEN_CUPBOARD = 24934 + const val OAK_CUPBOARD = 24935 + const val TEAK_CUPBOARD = 24936 + const val MAHOGANY_CUPBOARD = 24937 + const val WAXWOOD_LOG = 24938 + const val WAXWOOD_PLANK = 24939 + const val MARLOS_CRATE = 24940 + const val BP_OBJ = 24941 + const val REINFORCED_GOGGLES = 24942 + const val SOURHOG_FOOT = 24944 + const val HALLOWED_SACK = 24946 + const val MOONCLAN_TELEPORT = 24949 + const val OURANIA_TELEPORT = 24951 + const val WATERBIRTH_TELEPORT = 24953 + const val BARBARIAN_TELEPORT = 24955 + const val KHAZARD_TELEPORT = 24957 + const val FISHING_GUILD_TELEPORT = 24959 + const val CATHERBY_TELEPORT = 24961 + const val ICE_PLATEAU_TELEPORT = 24963 + const val CABBAGE_24971 = 24971 + const val CABBAGE_24973 = 24973 + const val HEADLESS_HEAD = 24975 + const val MAGICAL_PUMPKIN = 24977 + const val PUMPKIN_24979 = 24979 + const val BROWN_CANDY = 24980 + const val BLUE_CANDY = 24981 + const val WHITE_CANDY = 24982 + const val PURPLE_CANDY = 24983 + const val RED_CANDY = 24984 + const val GREEN_CANDY = 24985 + const val BLACK_CANDY = 24986 + const val ORANGE_CANDY = 24987 + const val PINK_CANDY = 24988 + const val RICKS_BOX = 24989 + const val RICKS_HEAD = 24990 + const val WITCHS_BREW = 24991 + const val SPIDER_SNACK = 24992 + const val INCANTATION = 24993 + const val CABBAGE_24994 = 24994 + const val CABBAGE_24996 = 24996 + const val TRAILBLAZER_HOOD_T3 = 25001 + const val TRAILBLAZER_HOOD_T3_NOTED = 25002 + const val TRAILBLAZER_COAT_T3 = 25004 + const val TRAILBLAZER_COAT_T3_NOTED = 25005 + const val TRAILBLAZER_TROUSERS_T3 = 25007 + const val TRAILBLAZER_TROUSERS_T3_NOTED = 25008 + const val TRAILBLAZER_BOOTS_T3 = 25010 + const val TRAILBLAZER_BOOTS_T3_NOTED = 25011 + const val TRAILBLAZER_CANE = 25013 + const val TRAILBLAZER_CANE_NOTED = 25014 + const val TRAILBLAZER_HOOD_T2 = 25016 + const val TRAILBLAZER_HOOD_T2_NOTED = 25017 + const val TRAILBLAZER_COAT_T2 = 25019 + const val TRAILBLAZER_COAT_T2_NOTED = 25020 + const val TRAILBLAZER_TROUSERS_T2 = 25022 + const val TRAILBLAZER_TROUSERS_T2_NOTED = 25023 + const val TRAILBLAZER_BOOTS_T2 = 25025 + const val TRAILBLAZER_BOOTS_T2_NOTED = 25026 + const val TRAILBLAZER_HOOD_T1 = 25028 + const val TRAILBLAZER_HOOD_T1_NOTED = 25029 + const val TRAILBLAZER_COAT_T1 = 25031 + const val TRAILBLAZER_COAT_T1_NOTED = 25032 + const val TRAILBLAZER_TROUSERS_T1 = 25034 + const val TRAILBLAZER_TROUSERS_T1_NOTED = 25035 + const val TRAILBLAZER_BOOTS_T1 = 25037 + const val TRAILBLAZER_BOOTS_T1_NOTED = 25038 + const val TRAILBLAZER_TROPHY = 25040 + const val TRAILBLAZER_DRAGON_TROPHY = 25042 + const val TRAILBLAZER_RUNE_TROPHY = 25044 + const val TRAILBLAZER_ADAMANT_TROPHY = 25046 + const val TRAILBLAZER_MITHRIL_TROPHY = 25048 + const val TRAILBLAZER_STEEL_TROPHY = 25050 + const val TRAILBLAZER_IRON_TROPHY = 25052 + const val TRAILBLAZER_BRONZE_TROPHY = 25054 + const val TRAILBLAZER_BANNER = 25056 + const val TRAILBLAZER_BANNER_NOTED = 25057 + const val TRAILBLAZER_HARPOON = 25059 + const val TRAILBLAZER_HARPOON_NOTED = 25060 + const val TRAILBLAZER_PICKAXE = 25063 + const val TRAILBLAZER_PICKAXE_NOTED = 25064 + const val TRAILBLAZER_AXE = 25066 + const val TRAILBLAZER_AXE_NOTED = 25067 + const val GRACEFUL_HOOD_25069 = 25069 + const val GRACEFUL_HOOD_25071 = 25071 + const val GRACEFUL_CAPE_25072 = 25072 + const val GRACEFUL_CAPE_25074 = 25074 + const val GRACEFUL_TOP_25075 = 25075 + const val GRACEFUL_TOP_25077 = 25077 + const val GRACEFUL_LEGS_25078 = 25078 + const val GRACEFUL_LEGS_25080 = 25080 + const val GRACEFUL_GLOVES_25081 = 25081 + const val GRACEFUL_GLOVES_25083 = 25083 + const val GRACEFUL_BOOTS_25084 = 25084 + const val GRACEFUL_BOOTS_25086 = 25086 + const val TRAILBLAZER_TELEPORT_SCROLL = 25087 + const val TRAILBLAZER_TELEPORT_SCROLL_NOTED = 25088 + const val TRAILBLAZER_TOOL_ORNAMENT_KIT = 25090 + const val TRAILBLAZER_TOOL_ORNAMENT_KIT_NOTED = 25091 + const val TRAILBLAZER_GLOBE = 25093 + const val TRAILBLAZER_GLOBE_NOTED = 25094 + const val TRAILBLAZER_RUG = 25096 + const val TRAILBLAZER_RUG_NOTED = 25097 + const val TRAILBLAZER_GRACEFUL_ORNAMENT_KIT = 25099 + const val TRAILBLAZER_GRACEFUL_ORNAMENT_KIT_NOTED = 25100 + const val FAIRY_MUSHROOM = 25102 + const val CRYSTAL_OF_MEMORIES = 25104 + const val EXTRADIMENSIONAL_BAG = 25106 + const val EXTRADIMENSIONAL_BAG_25108 = 25108 + const val TRAILBLAZER_AXE_25110 = 25110 + const val TRAILBLAZER_PICKAXE_25112 = 25112 + const val TRAILBLAZER_HARPOON_25114 = 25114 + const val LEAGUE_TOMATO = 25117 + const val BEEKEEPERS_HAT = 25129 + const val BEEKEEPERS_TOP = 25131 + const val BEEKEEPERS_LEGS = 25133 + const val BEEKEEPERS_GLOVES = 25135 + const val BEEKEEPERS_BOOTS = 25137 + const val BONE_FRAGMENTS = 25139 + const val CLAY_HEAD = 25145 + const val FUR_HEAD = 25146 + const val BLOODY_HEAD = 25147 + const val NEILANS_JOURNAL = 25152 + const val ORNATE_UNDEAD_COMBAT_DUMMY = 25154 + const val DECORATIVE_BOOTS_BROKEN = 25155 + const val DECORATIVE_FULL_HELM_BROKEN = 25157 + const val CASTLEWARS_BREW4 = 25159 + const val CASTLEWARS_BREW3 = 25160 + const val CASTLEWARS_BREW2 = 25161 + const val CASTLEWARS_BREW1 = 25162 + const val DECORATIVE_BOOTS = 25163 + const val DECORATIVE_FULL_HELM = 25165 + const val DECORATIVE_BOOTS_25167 = 25167 + const val DECORATIVE_FULL_HELM_25169 = 25169 + const val DECORATIVE_BOOTS_25171 = 25171 + const val DECORATIVE_BOOTS_L = 25173 + const val DECORATIVE_FULL_HELM_25174 = 25174 + const val DECORATIVE_FULL_HELM_L = 25176 + const val SLAYER_HELMET_I_25177 = 25177 + const val BLACK_SLAYER_HELMET_I_25179 = 25179 + const val GREEN_SLAYER_HELMET_I_25181 = 25181 + const val RED_SLAYER_HELMET_I_25183 = 25183 + const val PURPLE_SLAYER_HELMET_I_25185 = 25185 + const val TURQUOISE_SLAYER_HELMET_I_25187 = 25187 + const val HYDRA_SLAYER_HELMET_I_25189 = 25189 + const val TWISTED_SLAYER_HELMET_I_25191 = 25191 + const val GRANITE_RING_I_25193 = 25193 + const val BLUE_CAPE_25195 = 25195 + const val SOUL_FRAGMENT = 25196 + const val SOUL_WARS_GUIDE = 25197 + const val BONES_25199 = 25199 + const val BONES_NOTED_25200 = 25200 + const val SOUL_FRAGMENT_25201 = 25201 + const val BANDAGES_25202 = 25202 + const val POTION_OF_POWER4 = 25203 + const val POTION_OF_POWER3 = 25204 + const val POTION_OF_POWER2 = 25205 + const val POTION_OF_POWER1 = 25206 + const val RED_CAPE_25207 = 25207 + const val BLUE_CAPE_25208 = 25208 + const val BARRICADE_25209 = 25209 + const val BARRICADE_25210 = 25210 + const val EXPLOSIVE_POTION_25211 = 25211 + const val BLUE_ICON = 25212 + const val BLUE_ICON_25213 = 25213 + const val BLUE_ICON_25214 = 25214 + const val BLUE_ICON_25215 = 25215 + const val BLUE_ICON_25216 = 25216 + const val BLUE_ICON_25217 = 25217 + const val BLUE_ICON_25218 = 25218 + const val BLUE_ICON_25219 = 25219 + const val BLUE_ICON_25220 = 25220 + const val BLUE_ICON_25221 = 25221 + const val BLUE_ICON_25222 = 25222 + const val BLUE_ICON_25223 = 25223 + const val BLUE_ICON_25224 = 25224 + const val BLUE_ICON_25225 = 25225 + const val BLUE_ICON_25226 = 25226 + const val BLUE_ICON_25227 = 25227 + const val RED_ICON = 25228 + const val RED_ICON_25229 = 25229 + const val RED_ICON_25230 = 25230 + const val RED_ICON_25231 = 25231 + const val RED_ICON_25232 = 25232 + const val RED_ICON_25233 = 25233 + const val RED_ICON_25234 = 25234 + const val RED_ICON_25235 = 25235 + const val RED_ICON_25236 = 25236 + const val RED_ICON_25237 = 25237 + const val RED_ICON_25238 = 25238 + const val RED_ICON_25239 = 25239 + const val RED_ICON_25240 = 25240 + const val RED_ICON_25241 = 25241 + const val RED_ICON_25242 = 25242 + const val RED_ICON_25243 = 25243 + const val OLD_KEY_25244 = 25244 + const val RING_OF_SUFFERING_I_25246 = 25246 + const val RING_OF_SUFFERING_RI_25248 = 25248 + const val SALVE_AMULETI_25250 = 25250 + const val RING_OF_THE_GODS_I_25252 = 25252 + const val TYRANNICAL_RING_I_25254 = 25254 + const val TREASONOUS_RING_I_25256 = 25256 + const val SEERS_RING_I_25258 = 25258 + const val ARCHERS_RING_I_25260 = 25260 + const val WARRIOR_RING_I_25262 = 25262 + const val BERSERKER_RING_I_25264 = 25264 + const val BLACK_MASK_10_I_25266 = 25266 + const val BLACK_MASK_9_I_25267 = 25267 + const val BLACK_MASK_8_I_25268 = 25268 + const val BLACK_MASK_7_I_25269 = 25269 + const val BLACK_MASK_6_I_25270 = 25270 + const val BLACK_MASK_5_I_25271 = 25271 + const val BLACK_MASK_4_I_25272 = 25272 + const val BLACK_MASK_3_I_25273 = 25273 + const val BLACK_MASK_2_I_25274 = 25274 + const val BLACK_MASK_1_I_25275 = 25275 + const val BLACK_MASK_I_25276 = 25276 + const val SALVE_AMULETEI_25278 = 25278 + const val PURE_ESSENCE_PACK = 25280 + const val SLED_25282 = 25282 + const val RED_FIREFLIES = 25283 + const val GREEN_FIREFLIES = 25284 + const val STICK_25285 = 25285 + const val MOULDY_SAWDUST = 25286 + const val ROTTEN_MEAT = 25287 + const val STALE_BREAD = 25288 + const val GOBLIN_STEW = 25289 + const val GOBLIN_GIFTS = 25290 + const val GIANT_BOULDER = 25314 + const val GOBLIN_DECORATIONS = 25316 /* Auto-generated file using class gg.rsmod.game.service.game.DumpEntityIdService */ } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Npcs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Npcs.kt index 92adfe1247..64c87f040d 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Npcs.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Npcs.kt @@ -98,8 +98,8 @@ object Npcs { const val GHOST_95 = 95 const val GHOST_96 = 96 const val GHOST_97 = 97 - const val SOULLESS = 98 - const val DEATH_WING = 99 + const val GHOST_98 = 98 + const val GHOST_99 = 99 const val ROCK_CRAB = 100 const val ROCKS = 101 const val ROCK_CRAB_102 = 102 @@ -235,12 +235,12 @@ object Npcs { const val BUTTERFLY_238 = 238 const val KING_BLACK_DRAGON = 239 const val BLACK_DEMON = 240 - const val BABY_DRAGON = 241 - const val BABY_DRAGON_242 = 242 - const val BABY_DRAGON_243 = 243 - const val BABY_DRAGON_244 = 244 - const val BABY_DRAGON_245 = 245 - const val BABY_DRAGON_246 = 246 + const val BABY_BLUE_DRAGON = 241 + const val BABY_BLUE_DRAGON_242 = 242 + const val BABY_BLUE_DRAGON_243 = 243 + const val BABY_RED_DRAGON_244 = 244 + const val BABY_RED_DRAGON_245 = 245 + const val BABY_RED_DRAGON_246 = 246 const val RED_DRAGON = 247 const val RED_DRAGON_248 = 248 const val RED_DRAGON_249 = 249 @@ -287,7 +287,7 @@ object Npcs { const val DWARF_290 = 290 const val CHAOS_DWARF = 291 const val DWARF_292 = 292 - const val DWARF_293 = 293 + const val ADVENTURER_JON = 293 const val DWARF_294 = 294 const val DWARF_295 = 295 const val DWARF_296 = 296 @@ -302,15 +302,15 @@ object Npcs { const val JENNIFER = 305 const val LUMBRIDGE_GUIDE_306 = 306 const val DR_JEKYLL = 307 + const val EMBLEM_TRADER = 308 const val REACHER = 309 const val AYESHA = 310 - const val ADAM = 311 + const val IRON_MAN_TUTOR = 311 const val FROG = 312 const val REACHER_313 = 313 const val DR_JEKYLL_314 = 314 - const val EMBLEM_TRADER = 315 - const val EMBLEM_TRADER_316 = 316 - const val PAUL = 317 + const val LEAGUES_TUTOR = 315 + const val LEAGUES_TUTOR_316 = 316 const val DARK_CORE = 318 const val CORPOREAL_BEAST = 319 const val DARK_ENERGY_CORE = 320 @@ -368,8 +368,8 @@ object Npcs { const val PHEASANT_374 = 374 const val RICK_TURPENTINE = 375 const val RICK_TURPENTINE_376 = 376 - const val BEE_KEEPER = 377 - const val BEES = 378 + const val PHOSANIS_NIGHTMARE = 377 + const val THE_NIGHTMARE = 378 const val QUIZ_MASTER = 379 const val PILLORY_GUARD = 380 const val TRAMP = 381 @@ -460,9 +460,9 @@ object Npcs { const val SKELETAL_WYVERN_468 = 468 const val KILLERWATT_469 = 469 const val KILLERWATT_470 = 470 - const val DARK_WIZARD = 472 - const val INVRIGAR_THE_NECROMANCER = 473 - const val DARK_WIZARD_474 = 474 + const val GHOST_472 = 472 + const val GHOST_473 = 473 + const val GHOST_474 = 474 const val HOLE_IN_THE_WALL = 475 const val WALL_BEAST = 476 const val GIANT_FROG = 477 @@ -492,34 +492,35 @@ object Npcs { const val VANESSA = 502 const val RICHARD = 503 const val ALICE = 504 - const val MUGGER = 505 - const val WITCH = 506 - const val WITCH_507 = 507 - const val BLACK_KNIGHT = 508 - const val BLACK_KNIGHT_509 = 509 - const val HIGHWAYMAN = 510 - const val HIGHWAYMAN_511 = 511 - const val CHAOS_DRUID = 512 - const val PIRATE = 513 - const val PIRATE_514 = 514 - const val PIRATE_515 = 515 - const val PIRATE_516 = 516 - const val THUG = 517 - const val ROGUE_518 = 518 - const val MONK_OF_ZAMORAK = 519 - const val MONK_OF_ZAMORAK_520 = 520 - const val MONK_OF_ZAMORAK_521 = 521 - const val TRIBESMAN = 522 - const val DARK_WARRIOR = 523 - const val CHAOS_DRUID_WARRIOR = 524 - const val NECROMANCER = 525 - const val BANDIT_526 = 526 - const val GUARD_BANDIT = 527 - const val BARBARIAN_GUARD = 528 - const val PORTAL = 530 - const val PORTAL_532 = 532 + const val GHOST_505 = 505 + const val GHOST_506 = 506 + const val GHOST_507 = 507 + const val SOULLESS = 508 + const val DEATH_WING = 509 + const val DARK_WIZARD = 510 + const val INVRIGAR_THE_NECROMANCER = 511 + const val DARK_WIZARD_512 = 512 + const val MUGGER = 513 + const val WITCH = 514 + const val WITCH_515 = 515 + const val BLACK_KNIGHT = 516 + const val BLACK_KNIGHT_517 = 517 + const val HIGHWAYMAN = 518 + const val HIGHWAYMAN_519 = 519 + const val CHAOS_DRUID = 520 + const val PIRATE = 521 + const val PIRATE_522 = 522 + const val PIRATE_523 = 523 + const val PIRATE_524 = 524 + const val THUG = 525 + const val ROGUE_526 = 526 + const val MONK_OF_ZAMORAK = 527 + const val MONK_OF_ZAMORAK_528 = 528 + const val MONK_OF_ZAMORAK_529 = 529 + const val TRIBESMAN = 530 + const val DARK_WARRIOR = 531 + const val CHAOS_DRUID_WARRIOR = 532 const val FUNGI = 533 - const val THESSALIA = 534 const val FUNGI_535 = 535 const val ZYGOMITE = 537 const val FUNGI_538 = 538 @@ -622,7 +623,6 @@ object Npcs { const val FISHING_SPOT = 635 const val KARAMTHULHU_636 = 636 const val FUNGI_637 = 637 - const val ELF_TRACKER = 638 const val TYRAS_GUARD = 639 const val UG = 640 const val AGA = 641 @@ -860,8 +860,7 @@ object Npcs { const val SCARG = 886 const val GRUH = 887 const val IRWIN_FEASELBAUM = 888 - const val ELUNED = 889 - const val MOSS_GIANT = 891 + const val MOSS_GUARDIAN = 891 const val GOLRIE = 892 const val FATHER_REEN = 893 const val FATHER_REEN_894 = 894 @@ -976,29 +975,27 @@ object Npcs { const val GUARD_1008 = 1008 const val GUARD_1009 = 1009 const val GERTRUDES_CAT = 1010 - const val GAMBLER = 1011 - const val GAMBLER_1012 = 1012 + const val GAMER = 1011 + const val GAMER_1012 = 1012 const val BARMAN = 1013 - const val GAMBLER_1014 = 1014 - const val GAMBLER_1015 = 1015 - const val GAMBLER_1016 = 1016 - const val GAMBLER_1017 = 1017 - const val GAMBLER_1018 = 1018 - const val GAMBLER_1019 = 1019 + const val GAMER_1014 = 1014 + const val GAMER_1015 = 1015 + const val GAMER_1016 = 1016 + const val GAMER_1017 = 1017 + const val GAMER_1018 = 1018 + const val GAMER_1019 = 1019 const val RAT = 1020 const val RAT_1021 = 1021 const val RAT_1022 = 1022 const val ZYGOMITE_1024 = 1024 - const val BANKER_1027 = 1027 - const val BANKER_1028 = 1028 - const val BANKER_1029 = 1029 - const val BANKER_1030 = 1030 - const val BANKER_1031 = 1031 - const val BANKER_1032 = 1032 - const val BANKER_1033 = 1033 - const val BANKER_1034 = 1034 - const val BANKER_1035 = 1035 - const val BANKER_1036 = 1036 + const val NECROMANCER = 1025 + const val BANDIT_1026 = 1026 + const val GUARD_BANDIT = 1027 + const val BARBARIAN_GUARD = 1028 + const val SLEEPWALKER = 1029 + const val SLEEPWALKER_1030 = 1030 + const val SLEEPWALKER_1031 = 1031 + const val SLEEPWALKER_1032 = 1032 const val SNAKE = 1037 const val MONKEY_1038 = 1038 const val ALBINO_BAT = 1039 @@ -1069,15 +1066,11 @@ object Npcs { const val CHANCY_1106 = 1106 const val HOPS = 1107 const val HOPS_1108 = 1108 - const val GUIDORS_WIFE = 1109 + const val JULIE = 1109 const val GUIDOR = 1110 const val GUARD_1111 = 1111 const val GUARD_1112 = 1112 const val GUARD_1113 = 1113 - const val MOURNER = 1114 - const val MOURNER_1115 = 1115 - const val KILRON = 1116 - const val OMART = 1117 const val MAN_1118 = 1118 const val WOMAN = 1119 const val DOMINIC_ONION = 1120 @@ -1091,22 +1084,16 @@ object Npcs { const val CHILD_1133 = 1133 const val DAMIS_HARD = 1134 const val DAMIS_HARD_1135 = 1135 - const val MOURNER_1136 = 1136 const val PRIEST = 1137 const val MAN_1138 = 1138 const val WOMAN_1139 = 1139 const val WOMAN_1140 = 1140 const val WOMAN_1141 = 1141 const val WOMAN_1142 = 1142 - const val KING_LATHAS = 1143 const val PALADIN_1144 = 1144 const val JERICO = 1145 const val CHEMIST = 1146 const val GUARD_1147 = 1147 - const val MOURNER_1148 = 1148 - const val MOURNER_1149 = 1149 - const val MOURNER_1150 = 1150 - const val MOURNER_1151 = 1151 const val NURSE_SARAH = 1152 const val OGRE_1153 = 1153 const val SHARK_1154 = 1154 @@ -1261,13 +1248,6 @@ object Npcs { const val HARI = 1325 const val BARFY_BILL = 1326 const val TYRAS_GUARD_1327 = 1327 - const val TRADER_STAN = 1328 - const val TRADER_CREWMEMBER = 1329 - const val TRADER_CREWMEMBER_1330 = 1330 - const val TRADER_CREWMEMBER_1331 = 1331 - const val TRADER_CREWMEMBER_1332 = 1332 - const val TRADER_CREWMEMBER_1333 = 1333 - const val TRADER_CREWMEMBER_1334 = 1334 const val JACK_SEAGULL = 1335 const val LONGBOW_BEN = 1336 const val AHAB = 1337 @@ -1528,10 +1508,12 @@ object Npcs { const val BATTLE_MAGE = 1610 const val BATTLE_MAGE_1611 = 1611 const val BATTLE_MAGE_1612 = 1612 + const val BANKER_1613 = 1613 const val PHIALS = 1614 const val BANKNOTE_EXCHANGE_MERCHANT = 1615 const val HIGH_PRIESTESS_ZULHARCINQA = 1616 const val PRIESTESS_ZULGWENWYNIG = 1617 + const val BANKER_1618 = 1618 const val CAT_1619 = 1619 const val CAT_1620 = 1620 const val CAT_1621 = 1621 @@ -1546,6 +1528,8 @@ object Npcs { const val LAZY_CAT_1630 = 1630 const val LAZY_CAT_1631 = 1631 const val LAZY_HELLCAT = 1632 + const val BANKER_1633 = 1633 + const val BANKER_1634 = 1634 const val BABY_IMPLING = 1635 const val YOUNG_IMPLING = 1636 const val GOURMET_IMPLING = 1637 @@ -1650,7 +1634,7 @@ object Npcs { const val BRAWLER_1736 = 1736 const val BRAWLER_1737 = 1737 const val BRAWLER_1738 = 1738 - const val PORTAL_1739 = 1739 + const val PORTAL = 1739 const val PORTAL_1740 = 1740 const val PORTAL_1741 = 1741 const val PORTAL_1742 = 1742 @@ -1768,8 +1752,8 @@ object Npcs { const val SIR_AMIK_VARZE_1867 = 1867 const val SIR_AMIK_VARZE_1869 = 1869 const val EVIL_CHICKEN = 1870 - const val BABY_DRAGON_1871 = 1871 - const val BABY_DRAGON_1872 = 1872 + const val BABY_BLACK_DRAGON = 1871 + const val BABY_BLACK_DRAGON_1872 = 1872 const val KKLIK = 1873 const val ICE_TROLL_RUNT = 1874 const val ICE_TROLL_MALE = 1875 @@ -1931,7 +1915,7 @@ object Npcs { const val ICE_GIANT_2087 = 2087 const val ICE_GIANT_2088 = 2088 const val ICE_GIANT_2089 = 2089 - const val MOSS_GIANT_2090 = 2090 + const val MOSS_GIANT = 2090 const val MOSS_GIANT_2091 = 2091 const val MOSS_GIANT_2092 = 2092 const val MOSS_GIANT_2093 = 2093 @@ -2614,9 +2598,6 @@ object Npcs { const val COMBAT_STONE_2776 = 2776 const val COMBAT_STONE_2777 = 2777 const val COMBAT_STONE_2778 = 2778 - const val TOY_SOLDIER_2779 = 2779 - const val TOY_DOLL_2780 = 2780 - const val TOY_MOUSE_2781 = 2781 const val CLOCKWORK_CAT_2782 = 2782 const val HIRKO = 2783 const val HOLOY = 2784 @@ -2722,7 +2703,7 @@ object Npcs { const val SHOP_KEEPER_2884 = 2884 const val SHOP_ASSISTANT_2885 = 2885 const val AUBURY = 2886 - const val FANCY_DRESS_SHOP_OWNER = 2887 + const val ASYFF = 2887 const val SHOP_KEEPER_2888 = 2888 const val GRUM_2889 = 2889 const val WYDIN_2890 = 2890 @@ -2888,44 +2869,41 @@ object Npcs { const val GOBLIN_3074 = 3074 const val GOBLIN_3075 = 3075 const val GOBLIN_3076 = 3076 - const val HANS = 3077 - const val MAN_3078 = 3078 - const val MAN_3079 = 3079 - const val MAN_3080 = 3080 - const val MAN_3081 = 3081 - const val MAN_3082 = 3082 - const val WOMAN_3083 = 3083 - const val WOMAN_3084 = 3084 - const val WOMAN_3085 = 3085 - const val FARMER_3086 = 3086 - const val FARMER_3087 = 3087 - const val FARMER_3088 = 3088 - const val FARMER_3089 = 3089 - const val FARMER_3090 = 3090 - const val FARMER_3091 = 3091 - const val THIEF_3092 = 3092 - const val THIEF_3093 = 3093 - const val GUARD_3094 = 3094 - const val TRAMP_3095 = 3095 - const val BARBARIAN_3096 = 3096 - const val WIZARD_3097 = 3097 - const val DRUID = 3098 + const val PHOENIX_3077 = 3077 + const val PHOENIX_3078 = 3078 + const val PHOENIX_3079 = 3079 + const val PHOENIX_3080 = 3080 + const val PHOENIX_3081 = 3081 + const val PHOENIX_3082 = 3082 + const val PHOENIX_3083 = 3083 + const val PHOENIX_3084 = 3084 + const val PORTAL_3086 = 3086 + const val PORTAL_3088 = 3088 + const val BANKER_3089 = 3089 + const val BANKER_3090 = 3090 + const val BANKER_3091 = 3091 + const val BANKER_3092 = 3092 + const val BANKER_3093 = 3093 + const val BANKER_3094 = 3094 + const val CHIEF_SERVANT = 3095 + const val TAXIDERMIST = 3096 + const val ESTATE_AGENT = 3097 + const val STONEMASON = 3098 const val HELLPUPPY_3099 = 3099 - const val WARRIOR_WOMAN_3100 = 3100 - const val MAN_3101 = 3101 - const val BARBARIAN_3102 = 3102 - const val ALKHARID_WARRIOR = 3103 - const val PALADIN_3104 = 3104 - const val PALADIN_3105 = 3105 - const val HERO_3106 = 3106 - const val FORESTER = 3107 - const val KNIGHT_OF_ARDOUGNE_3108 = 3108 + const val SIR_RENITEE = 3100 + const val SAWMILL_OPERATOR = 3101 + const val GARDEN_SUPPLIER = 3102 + const val GARDEN_SUPPLIER_3103 = 3103 + const val HANS = 3105 + const val MAN_3106 = 3106 + const val MAN_3107 = 3107 + const val MAN_3108 = 3108 const val MAN_3109 = 3109 - const val WOMAN_3110 = 3110 - const val KNIGHT_OF_ARDOUGNE_3111 = 3111 - const val ARCHER_3112 = 3112 - const val ZOO_KEEPER = 3113 - const val CHUCK = 3114 + const val MAN_3110 = 3110 + const val WOMAN_3111 = 3111 + const val WOMAN_3112 = 3112 + const val WOMAN_3113 = 3113 + const val FARMER_3114 = 3114 const val FARID_MORRISANE_ORES_AND_BARS = 3115 const val TZKIH_3116 = 3116 const val TZKIH_3117 = 3117 @@ -3012,7 +2990,6 @@ object Npcs { const val IRKSOL = 3203 const val FAIRY_3204 = 3204 const val ZAMBO = 3205 - const val SILVER_MERCHANT = 3206 const val GEM_MERCHANT = 3207 const val BAKER = 3208 const val SPICE_SELLER = 3209 @@ -3038,7 +3015,7 @@ object Npcs { const val WIZARD_3232 = 3232 const val LEECH = 3233 const val FERAL_VAMPYRE_3234 = 3234 - const val SPIDER_3235 = 3235 + const val BEE_KEEPER = 3235 const val MIST = 3236 const val FERAL_VAMPYRE_3237 = 3237 const val VAMPYRIC_HOUND = 3238 @@ -3046,30 +3023,30 @@ object Npcs { const val TREE_3240 = 3240 const val BLANDEBIR = 3241 const val METARIALUS = 3242 - const val BARMAN_3243 = 3243 - const val PRIEST_3244 = 3244 - const val GUARD_3245 = 3245 + const val FARMER_3243 = 3243 + const val FARMER_3244 = 3244 + const val FARMER_3245 = 3245 const val WIZARD_FRUMSCONE = 3246 const val WIZARD_AKUTHA = 3247 const val WIZARD_DISTENTOR = 3248 const val WIZARD_SININA = 3249 - const val DOOR_MAN = 3250 - const val WATCHMAN_3251 = 3251 - const val SOLDIER = 3252 - const val WYSON_THE_GARDENER = 3253 - const val SIGBERT_THE_ADVENTURER = 3254 - const val SHIPYARD_WORKER_3255 = 3255 - const val SHIPYARD_WORKER_3256 = 3256 - const val MASTER_FARMER_3257 = 3257 - const val MASTER_FARMER_3258 = 3258 - const val MARKET_GUARD_3259 = 3259 - const val MAN_3260 = 3260 - const val GEE = 3261 - const val DONIE = 3262 + const val FARMER_3250 = 3250 + const val FARMER_3251 = 3251 + const val THIEF_3252 = 3252 + const val THIEF_3253 = 3253 + const val GUARD_3254 = 3254 + const val TRAMP_3255 = 3255 + const val BARBARIAN_3256 = 3256 + const val WIZARD_3257 = 3257 + const val DRUID = 3258 + const val DRUID_3259 = 3259 + const val WARRIOR_WOMAN_3260 = 3260 + const val MAN_3261 = 3261 + const val BARBARIAN_3262 = 3262 const val DRUNKEN_MAN = 3263 const val MAN_3264 = 3264 const val MAN_3265 = 3265 - const val MAN_3266 = 3266 + const val NORMAN = 3266 const val CECILIA = 3267 const val WOMAN_3268 = 3268 const val GUARD_3269 = 3269 @@ -3095,6 +3072,19 @@ object Npcs { const val HOBGOBLIN_3289 = 3289 const val FROG_3290 = 3290 const val POSTIE_PETE = 3291 + const val ALKHARID_WARRIOR = 3292 + const val PALADIN_3293 = 3293 + const val PALADIN_3294 = 3294 + const val HERO_3295 = 3295 + const val FORESTER = 3296 + const val KNIGHT_OF_ARDOUGNE_3297 = 3297 + const val MAN_3298 = 3298 + const val WOMAN_3299 = 3299 + const val KNIGHT_OF_ARDOUGNE_3300 = 3300 + const val ARCHER_3301 = 3301 + const val ZOO_KEEPER = 3302 + const val CHUCK = 3303 + const val BARMAN_3304 = 3304 const val MASTER_CHEF = 3305 const val HENJA = 3306 const val COMBAT_INSTRUCTOR = 3307 @@ -3211,15 +3201,11 @@ object Npcs { const val GRIZZLY_BEAR_CUB = 3424 const val GRIZZLY_BEAR_CUB_3425 = 3425 const val DIRE_WOLF = 3426 - const val LORD_IORWERTH = 3427 - const val ELF_WARRIOR = 3428 - const val ELF_WARRIOR_3429 = 3429 - const val ELVEN_CITY_GUARD = 3430 - const val ELF_WARRIOR_3431 = 3431 + const val IORWERTH_ARCHER = 3428 + const val IORWERTH_WARRIOR = 3429 const val ARIANWYN = 3432 const val TYRAS_GUARD_3433 = 3433 const val TYRAS_GUARD_3434 = 3434 - const val TYRAS_GUARD_3435 = 3435 const val TYRAS_GUARD_3436 = 3436 const val GENERAL_HINING = 3437 const val QUARTERMASTER = 3438 @@ -3271,8 +3257,6 @@ object Npcs { const val MONK_OF_ZAMORAK_3484 = 3484 const val MONK_OF_ZAMORAK_3485 = 3485 const val MONK_OF_ZAMORAK_3486 = 3486 - const val DREZEL = 3488 - const val DREZEL_3489 = 3489 const val JORRAL = 3490 const val MELINA = 3491 const val MELINA_3492 = 3492 @@ -3430,7 +3414,7 @@ object Npcs { const val SEAMAN_THRESNOR = 3646 const val LUTHAS = 3647 const val CUSTOMS_OFFICER = 3648 - const val CAPTAIN_BARNABY_3649 = 3649 + const val TOY_SOLDIER_3649 = 3649 const val GARDENER_3651 = 3651 const val MAN_3652 = 3652 const val LUMBERJACK_LEIF = 3653 @@ -3553,7 +3537,7 @@ object Npcs { const val VYREWATCH_3771 = 3771 const val OLD_MAN_RAL = 3772 const val AEONISIG_RAISPHER = 3774 - const val SAFALAAN = 3775 + const val SAFALAAN_HALLOW = 3775 const val SARIUS_GUILE = 3776 const val ELEMENTAL_BALANCE_3777 = 3777 const val SARIUS_GUILE_3778 = 3778 @@ -3587,16 +3571,16 @@ object Npcs { const val MEIYERDITCH_CITIZEN_3806 = 3806 const val MEIYERDITCH_CITIZEN_3807 = 3807 const val MEIYERDITCH_CITIZEN_3808 = 3808 - const val A_MEIYERDITCH_CHILD = 3809 - const val A_MEIYERDITCH_CHILD_3810 = 3810 - const val A_MEIYERDITCH_CHILD_3811 = 3811 - const val A_MEIYERDITCH_CHILD_3812 = 3812 - const val A_MEIYERDITCH_CHILD_3813 = 3813 - const val A_MEIYERDITCH_CHILD_3814 = 3814 - const val A_MEIYERDITCH_CHILD_3815 = 3815 - const val A_MEIYERDITCH_CHILD_3816 = 3816 - const val A_MEIYERDITCH_CHILD_3817 = 3817 - const val A_MEIYERDITCH_CHILD_3818 = 3818 + const val CHILD_3809 = 3809 + const val CHILD_3810 = 3810 + const val CHILD_3811 = 3811 + const val CHILD_3812 = 3812 + const val CHILD_3813 = 3813 + const val CHILD_3814 = 3814 + const val CHILD_3815 = 3815 + const val CHILD_3816 = 3816 + const val CHILD_3817 = 3817 + const val CHILD_3818 = 3818 const val MEIYERDITCH_MINER = 3819 const val MEIYERDITCH_MINER_3820 = 3820 const val MEIYERDITCH_MINER_3821 = 3821 @@ -3701,7 +3685,6 @@ object Npcs { const val BUTTERFLY_3923 = 3923 const val SIGLI_THE_HUNTSMAN = 3924 const val SWENSEN_THE_NAVIGATOR = 3925 - const val BRUNDT_THE_CHIEFTAIN = 3926 const val GUARD_3928 = 3928 const val GUARD_3929 = 3929 const val TOWN_GUARD_3930 = 3930 @@ -3757,13 +3740,12 @@ object Npcs { const val ZOMBIE_3980 = 3980 const val ZOMBIE_3981 = 3981 const val LESSER_DEMON_3982 = 3982 - const val COUNCILLOR_HALGRIVE = 3983 const val DOCTOR_ORBON = 3984 const val FARMER_BRUMTY = 3985 - const val SICKLOOKING_SHEEP_1 = 3986 - const val SICKLOOKING_SHEEP_2 = 3987 - const val SICKLOOKING_SHEEP_3 = 3988 - const val SICKLOOKING_SHEEP_4 = 3989 + const val RED_SHEEP = 3986 + const val GREEN_SHEEP = 3987 + const val BLUE_SHEEP = 3988 + const val YELLOW_SHEEP = 3989 const val BOY = 3994 const val NORA_T_HAGG = 3995 const val WITCHS_EXPERIMENT = 3996 @@ -3775,10 +3757,6 @@ object Npcs { const val CHOMPY_CHICK_4002 = 4002 const val SHADOW_4004 = 4004 const val DARK_BEAST_4005 = 4005 - const val MOURNER_4006 = 4006 - const val SLAVE = 4007 - const val SLAVE_4008 = 4008 - const val SLAVE_4009 = 4009 const val THORGEL = 4010 const val BILL_TEACH = 4011 const val BILL_TEACH_4012 = 4012 @@ -3854,7 +3832,7 @@ object Npcs { const val DENULTH = 4083 const val SERGEANT = 4084 const val SERGEANT_4085 = 4085 - const val SOLDIER_4086 = 4086 + const val SOLDIER = 4086 const val SOLDIER_4087 = 4087 const val SOLDIER_4088 = 4088 const val SOLDIER_4089 = 4089 @@ -3967,7 +3945,7 @@ object Npcs { const val SCABARAS = 4197 const val CRONDIS = 4198 const val ICTHLARIN = 4199 - const val SLAVE_4200 = 4200 + const val SLAVE = 4200 const val SLAVE_4201 = 4201 const val EMBALMER = 4202 const val CARPENTER = 4203 @@ -4020,26 +3998,18 @@ object Npcs { const val ALRENA_4251 = 4251 const val BRAVEK = 4252 const val BRAVEK_4253 = 4253 - const val CARLA = 4254 const val CLERK = 4255 const val EDMOND_4256 = 4256 const val ELENA_4257 = 4257 - const val HEAD_MOURNER = 4258 - const val MOURNER_4259 = 4259 - const val MOURNER_4260 = 4260 - const val MOURNER_4261 = 4261 - const val RECRUITER = 4262 const val TED_REHNISON = 4263 const val MARTHA_REHNISON = 4264 const val BILLY_REHNISON = 4265 const val MILLI_REHNISON = 4266 - const val JETHICK = 4267 const val MAN_4268 = 4268 const val MAN_4269 = 4269 const val MAN_4270 = 4270 const val MAN_4271 = 4271 const val MAN_4272 = 4272 - const val MOURNER_4273 = 4273 const val LEELA = 4274 const val JOE_4275 = 4275 const val JAIL_GUARD = 4276 @@ -4282,38 +4252,13 @@ object Npcs { const val GUARD_4525 = 4525 const val GUARD_4526 = 4526 const val CHADWELL = 4527 - const val KOFTIK_4528 = 4528 - const val KOFTIK_4529 = 4529 - const val KOFTIK_4530 = 4530 - const val KOFTIK_4531 = 4531 - const val KOFTIK_4532 = 4532 const val BLESSED_SPIDER = 4533 const val BLESSED_GIANT_RAT = 4534 const val BLESSED_GIANT_RAT_4535 = 4535 - const val SLAVE_4536 = 4536 - const val SLAVE_4537 = 4537 - const val SLAVE_4538 = 4538 - const val SLAVE_4539 = 4539 - const val SLAVE_4540 = 4540 - const val SLAVE_4541 = 4541 - const val SLAVE_4542 = 4542 const val BOULDER_4543 = 4543 - const val UNICORN_4544 = 4544 - const val SIR_JERRO = 4545 - const val SIR_CARL = 4546 - const val SIR_HARRY = 4547 - const val HALFSOULLESS = 4548 - const val KARDIA = 4549 - const val WITCHS_CAT_4550 = 4550 const val NILOOF = 4551 const val KLANK = 4552 const val KAMEN = 4553 - const val KALRAG = 4554 - const val OTHAINIAN = 4555 - const val DOOMION = 4556 - const val HOLTHION = 4557 - const val DISCIPLE_OF_IBAN = 4559 - const val LORD_IBAN = 4560 const val SPIDER_4561 = 4561 const val GIANT_BAT_4562 = 4562 const val MONK_4563 = 4563 @@ -4331,11 +4276,11 @@ object Npcs { const val POX_4575 = 4575 const val BONES_4576 = 4576 const val CERIL_CARNILLEAN_4577 = 4577 - const val COUNCILLOR_HALGRIVE_4578 = 4578 + const val COUNCILLOR_HALGRIVE = 4578 const val SPICE_SELLER_4579 = 4579 const val FUR_TRADER_4580 = 4580 const val GEM_MERCHANT_4581 = 4581 - const val SILVER_MERCHANT_4582 = 4582 + const val SILVER_MERCHANT = 4582 const val SILK_MERCHANT_4583 = 4583 const val ZENESHA = 4584 const val ALI_MORRISANE_4585 = 4585 @@ -4767,10 +4712,7 @@ object Npcs { const val SANFEW = 5044 const val KAQEMEEX = 5045 const val CYREG_PADDLEHORN = 5046 - const val CURPILE_FYOD = 5047 const val VELIAF_HURTZ_5048 = 5048 - const val SANI_PILIU = 5049 - const val HAROLD_EVANS = 5050 const val RADIGAD_PONFIT = 5051 const val POLMAFI_FERDYGRIS = 5052 const val IVAN_STROM_5053 = 5053 @@ -4778,9 +4720,6 @@ object Npcs { const val STRANGER_5055 = 5055 const val VANSTROM_KLAUSE_5056 = 5056 const val MIST_5057 = 5057 - const val VANSTROM_KLAUSE_5058 = 5058 - const val VANSTROM_KLAUSE_5059 = 5059 - const val VANSTROM_KLAUSE_5060 = 5060 const val SEA_SLUG_5061 = 5061 const val KENNITH = 5062 const val KENNITH_5063 = 5063 @@ -4910,7 +4849,7 @@ object Npcs { const val CAPTAIN_LAWGOF = 5191 const val GOBLIN_5192 = 5192 const val GOBLIN_5193 = 5193 - const val BABY_DRAGON_5194 = 5194 + const val BABY_GREEN_DRAGON = 5194 const val GOBLIN_5195 = 5195 const val GOBLIN_5196 = 5196 const val GOBLIN_5197 = 5197 @@ -4999,34 +4938,25 @@ object Npcs { const val MONKEY_ZOMBIE_5282 = 5282 const val MONKEY_ZOMBIE_5283 = 5283 const val BONZARA = 5284 - const val MOURNER_5285 = 5285 - const val MOURNER_5286 = 5286 - const val MOURNER_5287 = 5287 const val EMBALMER_5288 = 5288 const val CARPENTER_5289 = 5289 const val LINEN_WORKER = 5290 const val PRIEST_5291 = 5291 - const val ARIANWYN_5292 = 5292 - const val ELF_WARRIOR_5293 = 5293 + const val ELF_WARRIOR = 5293 const val ELF_WARRIOR_5294 = 5294 - const val ELF_WARRIOR_5295 = 5295 - const val ELF_WARRIOR_5296 = 5296 + const val ELF_ARCHER = 5295 + const val ELF_ARCHER_5296 = 5296 const val GOREU = 5297 - const val YSGAWYN = 5298 const val ARVEL = 5299 const val MAWRTH = 5300 - const val KELYN = 5301 const val EOIN = 5302 const val IONA = 5303 - const val ELUNED_5304 = 5304 - const val SICKLOOKING_SHEEP_1_5305 = 5305 - const val SICKLOOKING_SHEEP_2_5306 = 5306 - const val SICKLOOKING_SHEEP_3_5307 = 5307 - const val SICKLOOKING_SHEEP_4_5308 = 5308 + const val ELUNED = 5304 + const val RED_SHEEP_5305 = 5305 + const val GREEN_SHEEP_5306 = 5306 + const val BLUE_SHEEP_5307 = 5307 + const val YELLOW_SHEEP_5308 = 5308 const val GNOME_5309 = 5309 - const val HEAD_MOURNER_5310 = 5310 - const val MOURNER_5311 = 5311 - const val MOURNER_5312 = 5312 const val GPDT_EMPLOYEE = 5313 const val HORACIO = 5315 const val KANGAI_MAU = 5316 @@ -5126,13 +5056,13 @@ object Npcs { const val COMBAT_STONE_5414 = 5414 const val COMBAT_STONE_5415 = 5415 const val COMBAT_STONE_5416 = 5416 - const val CHIEF_SERVANT = 5417 - const val TAXIDERMIST = 5418 - const val ESTATE_AGENT = 5419 - const val STONEMASON = 5420 - const val SIR_RENITEE = 5421 - const val SAWMILL_OPERATOR = 5422 - const val GARDEN_SUPPLIER = 5423 + const val PRIEST_5417 = 5417 + const val GUARD_5418 = 5418 + const val DOOR_MAN = 5419 + const val WATCHMAN_5420 = 5420 + const val SOLDIER_5421 = 5421 + const val WYSON_THE_GARDENER = 5422 + const val SIGBERT_THE_ADVENTURER = 5423 const val CAPT_ARNAV = 5426 const val FLIPPA = 5427 const val TILT = 5428 @@ -5163,7 +5093,7 @@ object Npcs { const val THUMPY = 5454 const val THOMDRIL = 5455 const val KENDALL = 5456 - const val DRUID_5457 = 5457 + const val SHIPYARD_WORKER_5457 = 5457 const val SUSPECT_5458 = 5458 const val SUSPECT_5459 = 5459 const val SUSPECT_5460 = 5460 @@ -5424,8 +5354,12 @@ object Npcs { const val SHEEP_5726 = 5726 const val RABBIT_5727 = 5727 const val IMP_5728 = 5728 + const val SHIPYARD_WORKER_5729 = 5729 + const val MASTER_FARMER_5730 = 5730 + const val MASTER_FARMER_5731 = 5731 + const val MARKET_GUARD_5732 = 5732 const val ELNOCK_INQUISITOR = 5734 - const val IMPLING = 5735 + const val IMMENIZZ = 5735 const val FAIRY_AERYKA = 5736 const val WANDERING_IMPLING = 5737 const val IMP_DEFENDER = 5738 @@ -5552,8 +5486,8 @@ object Npcs { const val SUMMONED_SOUL_5869 = 5869 const val KEY_MASTER = 5870 const val KING_ARTHUR_5871 = 5871 - const val BABY_DRAGON_5872 = 5872 - const val BABY_DRAGON_5873 = 5873 + const val BABY_GREEN_DRAGON_5872 = 5872 + const val BABY_GREEN_DRAGON_5873 = 5873 const val BLACK_DEMON_5874 = 5874 const val BLACK_DEMON_5875 = 5875 const val BLACK_DEMON_5876 = 5876 @@ -5603,6 +5537,7 @@ object Npcs { const val AGILITY_TRAINER_5927 = 5927 const val WEREWOLF_5928 = 5928 const val KNIGHT_5929 = 5929 + const val RICK_5931 = 5931 const val EGG_5932 = 5932 const val EGG_5933 = 5933 const val EGG_5934 = 5934 @@ -5759,10 +5694,6 @@ object Npcs { const val GNOME_WOMAN = 6086 const val GNOME_WOMAN_6087 = 6087 const val CAPTAIN_ERRDO = 6088 - const val CAPTAIN_DALBUR = 6089 - const val CAPTAIN_BLEEMADGE = 6090 - const val CAPTAIN_ERRDO_6091 = 6091 - const val CAPTAIN_KLEMFOODLE = 6092 const val GNOME_6094 = 6094 const val GNOME_6095 = 6095 const val GNOME_6096 = 6096 @@ -5816,7 +5747,7 @@ object Npcs { const val THE_KENDAL_HARD = 6322 const val GIANT_ROC_HARD = 6323 const val SLAGILITH_HARD = 6324 - const val MOSS_GIANT_HARD = 6325 + const val MOSS_GUARDIAN_HARD = 6325 const val SKELETON_HELLHOUND_HARD = 6326 const val AGRITH_NAAR_HARD = 6327 const val KING_ROALD_HARD = 6328 @@ -5877,7 +5808,7 @@ object Npcs { const val THE_KENDAL_6383 = 6383 const val GIANT_ROC_6384 = 6384 const val SLAGILITH_6385 = 6385 - const val MOSS_GIANT_6386 = 6386 + const val MOSS_GUARDIAN_6386 = 6386 const val SKELETON_HELLHOUND_6387 = 6387 const val AGRITH_NAAR_6388 = 6388 const val KING_ROALD_6389 = 6389 @@ -5927,7 +5858,7 @@ object Npcs { const val CAVE_GOBLIN_6436 = 6436 const val CAVE_GOBLIN_6437 = 6437 const val ANIMATED_STEEL_ARMOUR_6438 = 6438 - const val ODOVACAR = 6439 + const val AMY = 6439 const val GIANT_SKELETON_6440 = 6440 const val SKELETON_6441 = 6441 const val SKELETON_6442 = 6442 @@ -6036,7 +5967,7 @@ object Npcs { const val SISTER_SCAROPHIA = 6590 const val LAVA_DRAGON = 6593 const val ENT = 6594 - const val ENT_TRUNK = 6595 + const val PRIFDDINAS_GUARD = 6595 const val ZOMBIE_6596 = 6596 const val ZOMBIE_6597 = 6597 const val ZOMBIE_6598 = 6598 @@ -6187,6 +6118,7 @@ object Npcs { const val BABY_CHINCHOMPA_6757 = 6757 const val BABY_CHINCHOMPA_6758 = 6758 const val BABY_CHINCHOMPA_6759 = 6759 + const val PYRELORD = 6762 const val LIZARDMAN_SHAMAN = 6766 const val LIZARDMAN_SHAMAN_6767 = 6767 const val SPAWN_6768 = 6768 @@ -6206,12 +6138,13 @@ object Npcs { const val HOSA = 6785 const val HELLRAT_BEHEMOTH = 6793 const val MONKEY_ARCHER_6794 = 6794 + const val PYRELORD_6795 = 6795 const val NIEVE_6797 = 6797 const val STEVE = 6798 const val STEVE_6799 = 6799 const val PIEVE = 6801 const val COMBAT_TEST = 6802 - const val MANIACAL_MONKEY = 6803 + const val MANIACAL_MONKEY_6803 = 6803 const val KRUK_6804 = 6804 const val KRUK_6805 = 6805 const val ASSISTANT_LE_SMITH_6806 = 6806 @@ -6219,14 +6152,10 @@ object Npcs { const val AWOWOGEI_6812 = 6812 const val MONKEY_ARCHER_6813 = 6813 const val LAMMY_LANGLE = 6814 - const val GHOST_6815 = 6815 - const val GHOST_6816 = 6816 - const val GHOST_6817 = 6817 - const val GHOST_6818 = 6818 - const val GHOST_6819 = 6819 - const val GHOST_6820 = 6820 - const val GHOST_6821 = 6821 - const val GHOST_6822 = 6822 + const val MAN_6815 = 6815 + const val GEE = 6816 + const val DONIE = 6817 + const val MAN_6818 = 6818 const val TOWN_CRIER_6823 = 6823 const val GIANT_BAT_6824 = 6824 const val ROD_FISHING_SPOT_6825 = 6825 @@ -6688,9 +6617,7 @@ object Npcs { const val DOUBLE_AGENT_7312 = 7312 const val LISA = 7316 const val LISA_7317 = 7317 - const val BEAR = 7318 const val NESTY = 7321 - const val WILD_DOG_7322 = 7322 const val FISHING_SPOT_7323 = 7323 const val HOLGART_7324 = 7324 const val RICK_7327 = 7327 @@ -6746,7 +6673,6 @@ object Npcs { const val WINTER_SOLDIER = 7379 const val CAT_7380 = 7380 const val WINTERTOAD = 7381 - const val ED = 7382 const val SNOW = 7383 const val STUMPY = 7384 const val PUMPY = 7385 @@ -6781,7 +6707,7 @@ object Npcs { const val COUNT_CHECK = 7414 const val BOLOGA = 7415 const val OBOR = 7416 - const val ENIOLA = 7417 + const val AMY_7417 = 7417 const val ZAMORAK_WARRIOR = 7418 const val ZAMORAK_WARRIOR_7419 = 7419 const val ZAMORAK_RANGER = 7420 @@ -6880,7 +6806,6 @@ object Npcs { const val TEKTON_ENRAGED_7544 = 7544 const val TEKTON_7545 = 7545 const val BARTENDER_7546 = 7546 - const val MAN_7547 = 7547 const val SCAVENGER_BEAST = 7548 const val SCAVENGER_BEAST_7549 = 7549 const val GREAT_OLM_RIGHT_CLAW = 7550 @@ -7057,7 +6982,7 @@ object Npcs { const val FISHING_SPOT_7731 = 7731 const val FISHING_SPOT_7732 = 7732 const val FISHING_SPOT_7733 = 7733 - const val RECRUITER_7734 = 7734 + const val RECRUITER = 7734 const val ROCK_GOLEM_7736 = 7736 const val ROCK_GOLEM_7737 = 7737 const val ROCK_GOLEM_7738 = 7738 @@ -7127,7 +7052,7 @@ object Npcs { const val TAR_MONSTER = 7804 const val PASSIVE_TAR_MONSTER = 7805 const val DERANGED_ARCHAEOLOGIST = 7806 - const val GIANT_BOULDER = 7807 + const val GIANT_BOULDER_7807 = 7807 const val GIANT_BOULDER_7808 = 7808 const val GIANT_BOULDER_7809 = 7809 const val LARGE_BOULDER = 7810 @@ -7223,8 +7148,8 @@ object Npcs { const val REVENANT_DARK_BEAST = 7938 const val REVENANT_KNIGHT = 7939 const val REVENANT_DRAGON = 7940 - const val EMBLEM_TRADER_7941 = 7941 - const val EMBLEM_TRADER_7942 = 7942 + const val IRON_MAN_TUTOR_7941 = 7941 + const val EMBLEM_TRADER_7943 = 7943 const val FISHING_SPOT_7946 = 7946 const val FISHING_SPOT_7947 = 7947 const val CORSAIR_TRAITOR_HARD = 7948 @@ -7234,7 +7159,7 @@ object Npcs { const val ERDAN = 7952 const val PRIMULA = 7953 const val MYSTERIOUS_ADVENTURER = 7954 - const val BABY_DRAGON_7955 = 7955 + const val BABY_BLACK_DRAGON_7955 = 7955 const val CAPTAIN_TOCK = 7956 const val CAPTAIN_TOCK_7957 = 7957 const val CAPTAIN_TOCK_7958 = 7958 @@ -7308,9 +7233,9 @@ object Npcs { const val AEONISIG_RAISPHER_8043 = 8043 const val SIR_AMIK_VARZE_8044 = 8044 const val SIR_TIFFY_CASHIEN_8045 = 8045 - const val KING_LATHAS_8046 = 8046 + const val KING_LATHAS = 8046 const val KING_ARTHUR_8047 = 8047 - const val BRUNDT_THE_CHIEFTAIN_8048 = 8048 + const val BRUNDT_THE_CHIEFTAIN = 8048 const val ONEIROMANCER_8049 = 8049 const val DENULTH_8050 = 8050 const val DUKE_HORACIO_8051 = 8051 @@ -7392,8 +7317,8 @@ object Npcs { const val ROBERT_THE_STRONG_8129 = 8129 const val ODYSSEUS_8130 = 8130 const val TORFINN = 8131 - const val TORFINN_8132 = 8132 - const val TORFINN_8133 = 8133 + const val ENIOLA = 8132 + const val ODOVACAR = 8133 const val SARAH_8134 = 8134 const val DRAGONKIN_8135 = 8135 const val ZORGOTH = 8136 @@ -7472,10 +7397,10 @@ object Npcs { const val MERCENARY_8213 = 8213 const val MERCENARY_8214 = 8214 const val MERCENARY_8215 = 8215 - const val SAFALAAN_8216 = 8216 - const val SAFALAAN_8217 = 8217 - const val SAFALAAN_8218 = 8218 - const val SAFALAAN_8219 = 8219 + const val SAFALAAN_HALLOW_8216 = 8216 + const val SAFALAAN_HALLOW_8217 = 8217 + const val SAFALAAN_HALLOW_8218 = 8218 + const val SAFALAAN_HALLOW_8219 = 8219 const val VERTIDA_SEFALATIS = 8220 const val VERTIDA_SEFALATIS_8221 = 8221 const val VERTIDA_SEFALATIS_8222 = 8222 @@ -7525,31 +7450,12 @@ object Npcs { const val YENRAB = 8269 const val LAHSRAM = 8270 const val ERODOEHT = 8271 - const val CARL = 8272 const val LECTOR_GURA = 8273 const val SISTER_SEVI = 8274 const val SISTER_TOEN = 8275 const val SISTER_YRAM = 8276 - const val HAMELN_THE_JESTER = 8277 - const val HANCHEN_THE_HOUND = 8278 - const val KROY = 8279 - const val DAMIEN_LEUCURTE = 8280 - const val LORD_CROMBWICK = 8281 - const val PAINTED_ONE = 8282 - const val KURT = 8283 - const val DON = 8284 - const val DEBRA = 8285 - const val TANYA_8286 = 8286 const val LADY_CROMBWICK = 8287 const val NEMISHKA = 8288 - const val CHRISTOPHER = 8289 - const val CHILD_8290 = 8290 - const val CHILD_8291 = 8291 - const val CHILD_8292 = 8292 - const val CHILD_8293 = 8293 - const val CHILD_8294 = 8294 - const val CHILD_8295 = 8295 - const val CHILD_8296 = 8296 const val SWAMP_CRAB = 8297 const val SWAMP_CRAB_8298 = 8298 const val SWAMPY_LOG = 8299 @@ -7712,7 +7618,6 @@ object Npcs { const val TORMENTED_SOUL_8513 = 8513 const val TRAPPED_SOUL = 8514 const val ALYSSA = 8515 - const val GARDEN_SUPPLIER_8516 = 8516 const val IKKLE_HYDRA_8517 = 8517 const val IKKLE_HYDRA_8518 = 8518 const val IKKLE_HYDRA_8519 = 8519 @@ -7793,8 +7698,7 @@ object Npcs { const val CAT_8594 = 8594 const val FELFIZ_YARYUS = 8595 const val KEITH = 8596 - const val GORDON = 8597 - const val MARY_8598 = 8598 + const val ORNATE_COMBAT_DUMMY = 8598 const val SHAYZIEN_SOLDIER_8599 = 8599 const val SHAYZIEN_SERGEANT = 8600 const val SHAYZIEN_ARCHER = 8601 @@ -7835,7 +7739,6 @@ object Npcs { const val PUFFER_FISH_8667 = 8667 const val ISLWYN_8675 = 8675 const val ILFEEN = 8676 - const val ILFEEN_8677 = 8677 const val FERAL_VAMPYRE_8678 = 8678 const val ABIDOR_CRANK_8679 = 8679 const val DAVON = 8680 @@ -7873,5 +7776,1148 @@ object Npcs { const val SPAWN_OF_SARACHNIS = 8714 const val SPAWN_OF_SARACHNIS_8715 = 8715 const val JUSTINE = 8721 + const val SILVER_MERCHANT_8722 = 8722 + const val GEM_MERCHANT_8723 = 8723 + const val BAKER_8724 = 8724 + const val BAKER_8725 = 8725 + const val SPICE_SELLER_8726 = 8726 + const val FUR_TRADER_8727 = 8727 + const val SILK_MERCHANT_8728 = 8728 + const val YOUNGLLEF_8729 = 8729 + const val CORRUPTED_YOUNGLLEF_8730 = 8730 + const val SMOLCANO_8731 = 8731 + const val MUGGER_8732 = 8732 + const val CRAB_8733 = 8733 + const val MOSS_GIANT_8736 = 8736 + const val YOUNGLLEF_8737 = 8737 + const val CORRUPTED_YOUNGLLEF_8738 = 8738 + const val SMOLCANO_8739 = 8739 + const val CRYSTAL_IMPLING = 8741 + const val CRYSTAL_IMPLING_8742 = 8742 + const val CRYSTAL_IMPLING_8743 = 8743 + const val CRYSTAL_IMPLING_8744 = 8744 + const val CRYSTAL_IMPLING_8745 = 8745 + const val CRYSTAL_IMPLING_8746 = 8746 + const val CRYSTAL_IMPLING_8747 = 8747 + const val CRYSTAL_IMPLING_8748 = 8748 + const val CRYSTAL_IMPLING_8749 = 8749 + const val CRYSTAL_IMPLING_8750 = 8750 + const val CRYSTAL_IMPLING_8751 = 8751 + const val CRYSTAL_IMPLING_8752 = 8752 + const val CRYSTAL_IMPLING_8753 = 8753 + const val CRYSTAL_IMPLING_8754 = 8754 + const val CRYSTAL_IMPLING_8755 = 8755 + const val CRYSTAL_IMPLING_8756 = 8756 + const val CRYSTAL_IMPLING_8757 = 8757 + const val LORD_IORWERTH = 8758 + const val IORWERTH_WARRIOR_8759 = 8759 + const val IORWERTH_ARCHER_8760 = 8760 + const val ELF_TRACKER = 8761 + const val TYRAS_GUARD_8762 = 8762 + const val CAPTAIN_BARNABY_8763 = 8763 + const val CAPTAIN_BARNABY_8764 = 8764 + const val COUNCILLOR_HALGRIVE_8765 = 8765 + const val ELUNED_8766 = 8766 + const val ELUNED_8767 = 8767 + const val ELVEN_SCOUT = 8768 + const val ILFEEN_8769 = 8769 + const val ELVEN_SCOUT_8770 = 8770 + const val MOURNER = 8771 + const val SLAVE_8772 = 8772 + const val SLAVE_8773 = 8773 + const val SLAVE_8774 = 8774 + const val SEREN = 8775 + const val MEMORY_OF_SEREN = 8776 + const val MEMORY_OF_SEREN_8777 = 8777 + const val MEMORY_OF_SEREN_8778 = 8778 + const val MEMORY_OF_SEREN_8779 = 8779 + const val MEMORY_OF_SEREN_8780 = 8780 + const val MEMORY_OF_SEREN_8781 = 8781 + const val MEMORY_OF_SEREN_8782 = 8782 + const val MEMORY_OF_SEREN_8783 = 8783 + const val MEMORY_OF_SEREN_8784 = 8784 + const val ELENA_8791 = 8791 + const val ELENA_8792 = 8792 + const val ELENA_8793 = 8793 + const val ELENA_8794 = 8794 + const val ELENA_8795 = 8795 + const val ELENA_8797 = 8797 + const val ELENA_8798 = 8798 + const val KNIGHT_OF_ARDOUGNE_8799 = 8799 + const val KNIGHT_OF_ARDOUGNE_8800 = 8800 + const val KNIGHT_OF_ARDOUGNE_8801 = 8801 + const val COUNCILLOR_HALGRIVE_8802 = 8802 + const val COUNCILLOR_HALGRIVE_8803 = 8803 + const val OMART = 8804 + const val KILRON = 8805 + const val JETHICK = 8806 + const val CARLA = 8807 + const val BAXTORIAN = 8808 + const val BAXTORIAN_8809 = 8809 + const val BAXTORIAN_8810 = 8810 + const val BAXTORIAN_8811 = 8811 + const val BAXTORIAN_8812 = 8812 + const val BAXTORIAN_8813 = 8813 + const val YSGAWYN = 8814 + const val YSGAWYN_8815 = 8815 + const val YSGAWYN_8816 = 8816 + const val ISLWYN_8818 = 8818 + const val ISLWYN_8819 = 8819 + const val ISLWYN_8821 = 8821 + const val ISLWYN_8822 = 8822 + const val ISLWYN_8823 = 8823 + const val ILFEEN_8825 = 8825 + const val ILFEEN_8827 = 8827 + const val ELUNED_8829 = 8829 + const val ELUNED_8830 = 8830 + const val RESISTANCE_FIGHTER = 8831 + const val RESISTANCE_FIGHTER_8832 = 8832 + const val RESISTANCE_FIGHTER_8833 = 8833 + const val RESISTANCE_FIGHTER_8834 = 8834 + const val RESISTANCE_FIGHTER_8835 = 8835 + const val OMART_8836 = 8836 + const val KILRON_8837 = 8837 + const val ELENA_8838 = 8838 + const val JETHICK_8839 = 8839 + const val OMART_8840 = 8840 + const val KILRON_8841 = 8841 + const val KING_LATHAS_8842 = 8842 + const val LATHAS = 8843 + const val MOURNER_8844 = 8844 + const val MOURNER_8845 = 8845 + const val MOURNER_8846 = 8846 + const val ESSYLLT_8847 = 8847 + const val GNOME_8848 = 8848 + const val PALADIN_8849 = 8849 + const val PALADIN_8850 = 8850 + const val KNIGHT_OF_ARDOUGNE_8851 = 8851 + const val KNIGHT_OF_ARDOUGNE_8852 = 8852 + const val PALADIN_8853 = 8853 + const val KNIGHT_OF_ARDOUGNE_8854 = 8854 + const val KNIGHT_OF_ARDOUGNE_8855 = 8855 + const val EXECUTIONER = 8856 + const val HOODED_FIGURE = 8857 + const val MAN_8858 = 8858 + const val MAN_8859 = 8859 + const val MAN_8860 = 8860 + const val MAN_8861 = 8861 + const val MAN_8862 = 8862 + const val WOMAN_8863 = 8863 + const val WOMAN_8864 = 8864 + const val ARIANWYN_8865 = 8865 + const val ARIANWYN_8866 = 8866 + const val ARIANWYN_8867 = 8867 + const val ARIANWYN_8868 = 8868 + const val MORVRAN_8869 = 8869 + const val MORVRAN_8870 = 8870 + const val ESSYLLT_8871 = 8871 + const val ESSYLLT_8872 = 8872 + const val LORD_IORWERTH_8873 = 8873 + const val LORD_IORWERTH_8874 = 8874 + const val LORD_IORWERTH_8875 = 8875 + const val LORD_IORWERTH_8876 = 8876 + const val IORWERTH_WARRIOR_8877 = 8877 + const val IORWERTH_ARCHER_8878 = 8878 + const val IORWERTH_WARRIOR_8879 = 8879 + const val IORWERTH_ARCHER_8880 = 8880 + const val IORWERTH_WARRIOR_8881 = 8881 + const val IORWERTH_WARRIOR_8882 = 8882 + const val IORWERTH_WARRIOR_8883 = 8883 + const val IORWERTH_WARRIOR_8884 = 8884 + const val IORWERTH_ARCHER_8885 = 8885 + const val IORWERTH_ARCHER_8886 = 8886 + const val REBEL_ARCHER = 8887 + const val REBEL_ARCHER_8888 = 8888 + const val REBEL_ARCHER_8889 = 8889 + const val REBEL_WARRIOR = 8890 + const val REBEL_WARRIOR_8891 = 8891 + const val LADY_TANGWEN_TRAHAEARN = 8892 + const val ELDERLY_ELF = 8893 + const val ELDERLY_ELF_8894 = 8894 + const val LADY_TANGWEN_TRAHAEARN_8895 = 8895 + const val MYSTERIOUS_FIGURE = 8897 + const val LORD_IEUAN_AMLODD = 8898 + const val LORD_IEUAN_AMLODD_8899 = 8899 + const val TREE_8901 = 8901 + const val TREE_8902 = 8902 + const val LORD_PIQUAN_CRWYS = 8903 + const val LORD_PIQUAN_CRWYS_8904 = 8904 + const val ELF_HERMIT = 8906 + const val LADY_CARYS_HEFIN = 8907 + const val LADY_CARYS_HEFIN_8908 = 8908 + const val LADY_FFION_MEILYR = 8910 + const val LADY_FFION_MEILYR_8911 = 8911 + const val LADY_KELYN_ITHELL = 8913 + const val KELYN = 8914 + const val LADY_KELYN_ITHELL_8915 = 8915 + const val FRAGMENT_OF_SEREN = 8917 + const val FRAGMENT_OF_SEREN_8918 = 8918 + const val FRAGMENT_OF_SEREN_8919 = 8919 + const val FRAGMENT_OF_SEREN_8920 = 8920 + const val CRYSTAL_WHIRLWIND = 8921 + const val IORWERTH_WARRIOR_8922 = 8922 + const val IORWERTH_ARCHER_8923 = 8923 + const val IESTIN = 8924 + const val IESTIN_8925 = 8925 + const val IESTIN_8926 = 8926 + const val MAWRTH_8927 = 8927 + const val MAWRTH_8928 = 8928 + const val IONA_8929 = 8929 + const val EOIN_8930 = 8930 + const val EOIN_8931 = 8931 + const val REBEL_ARCHER_8932 = 8932 + const val REBEL_ARCHER_8933 = 8933 + const val REBEL_WARRIOR_8934 = 8934 + const val REBEL_WARRIOR_8935 = 8935 + const val IORWERTH_ARCHER_8936 = 8936 + const val IORWERTH_ARCHER_8937 = 8937 + const val IORWERTH_WARRIOR_8938 = 8938 + const val IORWERTH_WARRIOR_8939 = 8939 + const val KLANK_8940 = 8940 + const val NILOOF_8941 = 8941 + const val KAMEN_8942 = 8942 + const val THORGEL_8943 = 8943 + const val GENERAL_HINING_8944 = 8944 + const val TYRAS_GUARD_8945 = 8945 + const val REBEL_ARCHER_8946 = 8946 + const val REBEL_ARCHER_8947 = 8947 + const val REBEL_WARRIOR_8948 = 8948 + const val REBEL_WARRIOR_8949 = 8949 + const val ESSYLLT_8950 = 8950 + const val BARRIER = 8951 + const val BARRIER_8952 = 8952 + const val IORWERTH_ARCHER_8953 = 8953 + const val IORWERTH_ARCHER_8954 = 8954 + const val IORWERTH_WARRIOR_8955 = 8955 + const val IORWERTH_WARRIOR_8956 = 8956 + const val REBEL_ARCHER_8957 = 8957 + const val REBEL_ARCHER_8958 = 8958 + const val REBEL_WARRIOR_8959 = 8959 + const val REBEL_WARRIOR_8960 = 8960 + const val TYRAS_GUARD_8961 = 8961 + const val TYRAS_GUARD_8962 = 8962 + const val TYRAS_GUARD_8963 = 8963 + const val TYRAS_GUARD_8964 = 8964 + const val REBEL_SCOUT = 8965 + const val REBEL_SCOUT_8966 = 8966 + const val CARLA_8967 = 8967 + const val CLERK_8968 = 8968 + const val HEAD_MOURNER = 8969 + const val MOURNER_8970 = 8970 + const val MOURNER_8971 = 8971 + const val MOURNER_8972 = 8972 + const val RECRUITER_8973 = 8973 + const val JETHICK_8974 = 8974 + const val MOURNER_8975 = 8975 + const val KOFTIK_8976 = 8976 + const val BLESSED_SPIDER_8978 = 8978 + const val SLAVE_8979 = 8979 + const val SLAVE_8980 = 8980 + const val SLAVE_8981 = 8981 + const val SLAVE_8982 = 8982 + const val SLAVE_8983 = 8983 + const val SLAVE_8984 = 8984 + const val SLAVE_8985 = 8985 + const val UNICORN_8986 = 8986 + const val SIR_JERRO = 8987 + const val SIR_CARL = 8988 + const val SIR_HARRY = 8989 + const val HALFSOULLESS = 8990 + const val KARDIA = 8991 + const val WITCHS_CAT_8992 = 8992 + const val KALRAG = 8993 + const val OTHAINIAN = 8994 + const val DOOMION = 8995 + const val HOLTHION = 8996 + const val DISCIPLE_OF_IBAN = 8997 + const val IBAN = 8998 + const val MOURNER_8999 = 8999 + const val MOURNER_9000 = 9000 + const val KILRON_9001 = 9001 + const val OMART_9002 = 9002 + const val MOURNER_9003 = 9003 + const val MOURNER_9004 = 9004 + const val KING_LATHAS_9005 = 9005 + const val KING_THOROS = 9006 + const val MOURNER_9007 = 9007 + const val MOURNER_9008 = 9008 + const val MOURNER_9009 = 9009 + const val MOURNER_9010 = 9010 + const val KING_THOROS_9011 = 9011 + const val MOURNER_9013 = 9013 + const val ARIANWYN_9014 = 9014 + const val KELYN_9015 = 9015 + const val ESSYLLT_9016 = 9016 + const val MOURNER_9017 = 9017 + const val MOURNER_9018 = 9018 + const val ED = 9019 + const val BRYN = 9020 + const val CRYSTALLINE_HUNLLEF = 9021 + const val CRYSTALLINE_HUNLLEF_9022 = 9022 + const val CRYSTALLINE_HUNLLEF_9023 = 9023 + const val CRYSTALLINE_HUNLLEF_9024 = 9024 + const val CRYSTALLINE_RAT = 9026 + const val CRYSTALLINE_SPIDER = 9027 + const val CRYSTALLINE_BAT = 9028 + const val CRYSTALLINE_UNICORN = 9029 + const val CRYSTALLINE_SCORPION = 9030 + const val CRYSTALLINE_WOLF = 9031 + const val CRYSTALLINE_BEAR = 9032 + const val CRYSTALLINE_DRAGON = 9033 + const val CRYSTALLINE_DARK_BEAST = 9034 + const val CORRUPTED_HUNLLEF = 9035 + const val CORRUPTED_HUNLLEF_9036 = 9036 + const val CORRUPTED_HUNLLEF_9037 = 9037 + const val CORRUPTED_HUNLLEF_9038 = 9038 + const val CORRUPTED_RAT = 9040 + const val CORRUPTED_SPIDER = 9041 + const val CORRUPTED_BAT = 9042 + const val CORRUPTED_UNICORN = 9043 + const val CORRUPTED_SCORPION = 9044 + const val CORRUPTED_WOLF = 9045 + const val CORRUPTED_BEAR = 9046 + const val CORRUPTED_DRAGON = 9047 + const val CORRUPTED_DARK_BEAST = 9048 + const val ZALCANO = 9049 + const val ZALCANO_9050 = 9050 + const val GOLEM_9051 = 9051 + const val RHIANNON = 9052 + const val AMROD = 9053 + const val MIRIEL = 9054 + const val CURUFIN = 9055 + const val ENERDHIL = 9056 + const val TATIE = 9057 + const val FINDUILAS = 9058 + const val GELMIR = 9059 + const val MITHRELLAS = 9060 + const val ERESTOR = 9061 + const val LINDIR = 9062 + const val IDRIL = 9063 + const val INGWION = 9064 + const val THINGOL = 9065 + const val ELENWE = 9066 + const val OROPHIN = 9067 + const val VAIRE = 9068 + const val ELLADAN = 9069 + const val GUILIN = 9070 + const val INGWE = 9071 + const val CIRDAN = 9072 + const val GLORFINDEL = 9073 + const val AREDHEL = 9074 + const val CELEGORM = 9075 + const val ANAIRE = 9076 + const val MAEGLIN = 9077 + const val EDRAHIL = 9078 + const val FINGON = 9079 + const val SALGANT = 9080 + const val CELEBRIAN = 9081 + const val IMIN = 9082 + const val OROPHER = 9083 + const val FINGOLFIN = 9084 + const val MAHTAN = 9085 + const val INDIS = 9086 + const val IMINYE = 9087 + const val FEANOR = 9088 + const val SAEROS = 9089 + const val NELLAS = 9090 + const val RHYFEL = 9091 + const val GWYL = 9092 + const val ENILLY = 9093 + const val FFONI = 9094 + const val YMLADD = 9095 + const val SADWRN = 9096 + const val DIOL = 9097 + const val YSBEID = 9098 + const val CLEDDYF = 9099 + const val SAETH = 9100 + const val NIMRODEL = 9101 + const val MAEDHROS = 9102 + const val FINARFIN = 9103 + const val GWINDOR = 9104 + const val ELDALOTE = 9105 + const val ENELYE = 9106 + const val NERDANEL = 9107 + const val NIMLOTH = 9108 + const val FINDIS = 9109 + const val EARWEN = 9110 + const val CARANTHIR = 9111 + const val ENEL = 9112 + const val HENDOR_9113 = 9113 + const val GALATHIL = 9114 + const val TURGON = 9115 + const val LENWE = 9116 + const val ARANWE = 9117 + const val RABBIT_9118 = 9118 + const val LORD_IEUAN_AMLODD_9119 = 9119 + const val LORD_BAXTORIAN_CADARN = 9120 + const val LADY_KELYN_ITHELL_9121 = 9121 + const val LADY_TANGWEN_TRAHAEARN_9122 = 9122 + const val LORD_PIQUAN_CRWYS_9123 = 9123 + const val LADY_FFION_MEILYR_9124 = 9124 + const val LADY_CARYS_HEFIN_9125 = 9125 + const val LORD_IESTIN_IORWERTH = 9126 + const val BANKER_9127 = 9127 + const val BANKER_9128 = 9128 + const val BANKER_9129 = 9129 + const val BANKER_9130 = 9130 + const val BANKER_9131 = 9131 + const val BANKER_9132 = 9132 + const val REESE = 9133 + const val REESE_9134 = 9134 + const val CONWENNA = 9135 + const val CONWENNA_9136 = 9136 + const val ALWYN = 9137 + const val OSWALLT = 9138 + const val EIRA = 9139 + const val SAWMILL_OPERATOR_9140 = 9140 + const val PENNANT = 9141 + const val PENNANT_9142 = 9142 + const val GLADIATOR = 9143 + const val GLADIATOR_9144 = 9144 + const val ELUNED_9145 = 9145 + const val ISLWYN_9146 = 9146 + const val ELENA_9148 = 9148 + const val MORVRAN_9149 = 9149 + const val LILIFANG = 9150 + const val CREFYDD = 9151 + const val YSTWYTH = 9152 + const val IWAN = 9153 + const val DERWEN_9154 = 9154 + const val ELGAN = 9155 + const val CELYN = 9156 + const val ANEIRIN = 9157 + const val GWALLTER = 9158 + const val GWYN = 9159 + const val OSIAN = 9160 + const val CAERWYN = 9161 + const val ANWEN = 9162 + const val GLENDA = 9163 + const val GUINEVERE = 9164 + const val NIA = 9165 + const val SIAN = 9166 + const val BRANWEN = 9167 + const val LLIO = 9168 + const val EFA = 9169 + const val LLIANN = 9170 + const val FISHING_SPOT_9171 = 9171 + const val FISHING_SPOT_9172 = 9172 + const val FISHING_SPOT_9173 = 9173 + const val FISHING_SPOT_9174 = 9174 + const val RHODDWR_TAN = 9175 + const val MEDDWL_YMLAEN_LLAW = 9176 + const val LLEIDR_GOLAU = 9177 + const val GWERIN_HAPUS = 9178 + const val PRESWYLWYR_DALL = 9179 + const val MARWOLAETH_DAWNSIO = 9180 + const val DIRE_WOLF_9181 = 9181 + const val GUARD_9182 = 9182 + const val GUARD_9183 = 9183 + const val GUARD_9184 = 9184 + const val GUARD_9185 = 9185 + const val GUARD_9186 = 9186 + const val GUARD_9187 = 9187 + const val GUARD_9188 = 9188 + const val GUARD_9189 = 9189 + const val GUARD_9190 = 9190 + const val GUARD_9191 = 9191 + const val RAVEN = 9192 + const val LENNY = 9193 + const val GHOST_9194 = 9194 + const val IAN_9195 = 9195 + const val SURMA = 9196 + const val SLIPPERS = 9197 + const val RED_PANDA = 9198 + const val BEAR_CUB_9199 = 9199 + const val ED_9200 = 9200 + const val CRAB_9201 = 9201 + const val TIDE = 9202 + const val ADVENTURER_JON_9244 = 9244 + const val ARIANWYN_HARD = 9246 + const val ESSYLLT_HARD = 9247 + const val ARIANWYN_9248 = 9248 + const val ESSYLLT_9249 = 9249 + const val CAPTAIN_BARNABY_9250 = 9250 + const val TOY_SOLDIER_9251 = 9251 + const val TOY_DOLL_9252 = 9252 + const val TOY_DOLL_9253 = 9253 + const val TOY_MOUSE_9254 = 9254 + const val TOY_MOUSE_9255 = 9255 + const val PENGUIN_SUIT_9257 = 9257 + const val BASILISK_SENTINEL = 9258 + const val OSPAK_9259 = 9259 + const val STYRMIR_9260 = 9260 + const val TORBRUND_9261 = 9261 + const val FRIDGEIR_9262 = 9262 + const val BRUNDT_THE_CHIEFTAIN_9263 = 9263 + const val THORA_THE_BARKEEP_9264 = 9264 + const val BRUNDT_THE_CHIEFTAIN_9265 = 9265 + const val BRUNDT_THE_CHIEFTAIN_9266 = 9266 + const val BRUNDT_THE_CHIEFTAIN_9267 = 9267 + const val BRUNDT_THE_CHIEFTAIN_9268 = 9268 + const val HASKELL = 9270 + const val HASKELL_9271 = 9271 + const val HASKELL_9272 = 9272 + const val AGNAR_9273 = 9273 + const val OLAF_THE_BARD_9274 = 9274 + const val MANNI_THE_REVELLER_9275 = 9275 + const val FREMENNIK_WARRIOR = 9276 + const val FREMENNIK_WARRIOR_9277 = 9277 + const val BRUNDT_THE_CHIEFTAIN_9278 = 9278 + const val BRUNDT_THE_CHIEFTAIN_9279 = 9279 + const val THORVALD_THE_WARRIOR_9280 = 9280 + const val KOSCHEI_THE_DEATHLESS_9281 = 9281 + const val BASILISK_YOUNGLING = 9282 + const val BASILISK_9283 = 9283 + const val BASILISK_9284 = 9284 + const val BASILISK_9285 = 9285 + const val BASILISK_9286 = 9286 + const val MONSTROUS_BASILISK_9287 = 9287 + const val MONSTROUS_BASILISK_9288 = 9288 + const val THE_JORMUNGAND = 9289 + const val THE_JORMUNGAND_9290 = 9290 + const val THE_JORMUNGAND_9291 = 9291 + const val THE_JORMUNGAND_9292 = 9292 + const val BASILISK_KNIGHT_9293 = 9293 + const val BAKUNA = 9294 + const val TYPHOR = 9295 + const val TYPHOR_9296 = 9296 + const val VRITRA = 9297 + const val MAZ = 9298 + const val TRADER_STAN = 9299 + const val TRADER_STAN_9300 = 9300 + const val TRADER_STAN_9301 = 9301 + const val TRADER_STAN_9302 = 9302 + const val TRADER_STAN_9303 = 9303 + const val TRADER_STAN_9304 = 9304 + const val TRADER_STAN_9305 = 9305 + const val LOKAR_SEARUNNER_9306 = 9306 + const val TRADER_STAN_9307 = 9307 + const val TRADER_STAN_9308 = 9308 + const val TRADER_STAN_9309 = 9309 + const val TRADER_STAN_9310 = 9310 + const val TRADER_STAN_9311 = 9311 + const val TRADER_CREWMEMBER = 9312 + const val TRADER_CREWMEMBER_9313 = 9313 + const val TRADER_CREWMEMBER_9314 = 9314 + const val TRADER_CREWMEMBER_9315 = 9315 + const val TRADER_CREWMEMBER_9316 = 9316 + const val TRADER_CREWMEMBER_9317 = 9317 + const val TRADER_CREWMEMBER_9318 = 9318 + const val TRADER_CREWMEMBER_9319 = 9319 + const val TRADER_CREWMEMBER_9320 = 9320 + const val TRADER_CREWMEMBER_9321 = 9321 + const val TRADER_CREWMEMBER_9322 = 9322 + const val TRADER_CREWMEMBER_9323 = 9323 + const val TRADER_CREWMEMBER_9324 = 9324 + const val TRADER_CREWMEMBER_9325 = 9325 + const val TRADER_CREWMEMBER_9326 = 9326 + const val TRADER_CREWMEMBER_9327 = 9327 + const val TRADER_CREWMEMBER_9328 = 9328 + const val TRADER_CREWMEMBER_9329 = 9329 + const val TRADER_CREWMEMBER_9330 = 9330 + const val TRADER_CREWMEMBER_9331 = 9331 + const val TRADER_CREWMEMBER_9332 = 9332 + const val TRADER_CREWMEMBER_9333 = 9333 + const val TRADER_CREWMEMBER_9334 = 9334 + const val TRADER_CREWMEMBER_9335 = 9335 + const val TRADER_CREWMEMBER_9336 = 9336 + const val TRADER_CREWMEMBER_9337 = 9337 + const val TRADER_CREWMEMBER_9338 = 9338 + const val TRADER_CREWMEMBER_9339 = 9339 + const val TRADER_CREWMEMBER_9340 = 9340 + const val TRADER_CREWMEMBER_9341 = 9341 + const val TRADER_CREWMEMBER_9342 = 9342 + const val TRADER_CREWMEMBER_9343 = 9343 + const val TRADER_CREWMEMBER_9344 = 9344 + const val TRADER_CREWMEMBER_9345 = 9345 + const val TRADER_CREWMEMBER_9346 = 9346 + const val TRADER_CREWMEMBER_9347 = 9347 + const val TRADER_CREWMEMBER_9348 = 9348 + const val TRADER_CREWMEMBER_9349 = 9349 + const val TRADER_CREWMEMBER_9350 = 9350 + const val TRADER_CREWMEMBER_9351 = 9351 + const val TRADER_CREWMEMBER_9352 = 9352 + const val TRADER_CREWMEMBER_9353 = 9353 + const val TRADER_CREWMEMBER_9354 = 9354 + const val TRADER_CREWMEMBER_9355 = 9355 + const val TRADER_CREWMEMBER_9356 = 9356 + const val TRADER_CREWMEMBER_9357 = 9357 + const val TRADER_CREWMEMBER_9358 = 9358 + const val TRADER_CREWMEMBER_9359 = 9359 + const val TRADER_CREWMEMBER_9360 = 9360 + const val TRADER_CREWMEMBER_9361 = 9361 + const val TRADER_CREWMEMBER_9362 = 9362 + const val TRADER_CREWMEMBER_9363 = 9363 + const val TRADER_CREWMEMBER_9364 = 9364 + const val TRADER_CREWMEMBER_9365 = 9365 + const val TRADER_CREWMEMBER_9366 = 9366 + const val TRADER_CREWMEMBER_9367 = 9367 + const val TRADER_CREWMEMBER_9368 = 9368 + const val TRADER_CREWMEMBER_9369 = 9369 + const val TRADER_CREWMEMBER_9370 = 9370 + const val TRADER_CREWMEMBER_9371 = 9371 + const val TRADER_CREWMEMBER_9372 = 9372 + const val TRADER_CREWMEMBER_9373 = 9373 + const val TRADER_CREWMEMBER_9374 = 9374 + const val TRADER_CREWMEMBER_9375 = 9375 + const val TRADER_CREWMEMBER_9376 = 9376 + const val TRADER_CREWMEMBER_9377 = 9377 + const val TRADER_CREWMEMBER_9378 = 9378 + const val TRADER_CREWMEMBER_9379 = 9379 + const val TRADER_CREWMEMBER_9380 = 9380 + const val TRADER_CREWMEMBER_9381 = 9381 + const val TRADER_CREWMEMBER_9382 = 9382 + const val TRADER_CREWMEMBER_9383 = 9383 + const val LITTLE_NIGHTMARE_9398 = 9398 + const val LITTLE_NIGHTMARE_9399 = 9399 + const val OATH_LORD_DROWS = 9400 + const val OATHBREAKER_MALS = 9401 + const val OATHBREAKER_EPIWS = 9402 + const val OATHBREAKER_BATS = 9403 + const val LITHIL = 9404 + const val SISTER_ASERET = 9405 + const val SISTER_NAOJ = 9406 + const val SISTER_SALOHCIN = 9407 + const val LUMIERE = 9408 + const val DAER_KRAND = 9409 + const val STRONG_RONNY = 9410 + const val SHURA = 9413 + const val SHURA_9414 = 9414 + const val ACORN_9415 = 9415 + const val PHOSANIS_NIGHTMARE_9416 = 9416 + const val PHOSANIS_NIGHTMARE_9417 = 9417 + const val PHOSANIS_NIGHTMARE_9418 = 9418 + const val PHOSANIS_NIGHTMARE_9419 = 9419 + const val PHOSANIS_NIGHTMARE_9420 = 9420 + const val PHOSANIS_NIGHTMARE_9421 = 9421 + const val PHOSANIS_NIGHTMARE_9422 = 9422 + const val PHOSANIS_NIGHTMARE_9423 = 9423 + const val PHOSANIS_NIGHTMARE_9424 = 9424 + const val THE_NIGHTMARE_9425 = 9425 + const val THE_NIGHTMARE_9426 = 9426 + const val THE_NIGHTMARE_9427 = 9427 + const val THE_NIGHTMARE_9428 = 9428 + const val THE_NIGHTMARE_9429 = 9429 + const val THE_NIGHTMARE_9430 = 9430 + const val THE_NIGHTMARE_9431 = 9431 + const val THE_NIGHTMARE_9432 = 9432 + const val THE_NIGHTMARE_9433 = 9433 + const val TOTEM_9434 = 9434 + const val TOTEM_9435 = 9435 + const val TOTEM_9436 = 9436 + const val TOTEM_9437 = 9437 + const val TOTEM_9438 = 9438 + const val TOTEM_9439 = 9439 + const val TOTEM_9440 = 9440 + const val TOTEM_9441 = 9441 + const val TOTEM_9442 = 9442 + const val TOTEM_9443 = 9443 + const val TOTEM_9444 = 9444 + const val TOTEM_9445 = 9445 + const val SLEEPWALKER_9446 = 9446 + const val SLEEPWALKER_9447 = 9447 + const val SLEEPWALKER_9448 = 9448 + const val SLEEPWALKER_9449 = 9449 + const val SLEEPWALKER_9450 = 9450 + const val SLEEPWALKER_9451 = 9451 + const val PARASITE = 9452 + const val PARASITE_9453 = 9453 + const val HUSK = 9454 + const val HUSK_9455 = 9455 + const val THE_NIGHTMARE_9460 = 9460 + const val THE_NIGHTMARE_9461 = 9461 + const val THE_NIGHTMARE_9462 = 9462 + const val THE_NIGHTMARE_9463 = 9463 + const val THE_NIGHTMARE_9464 = 9464 + const val INFERNAL_PYRELORD = 9465 + const val HUSK_9466 = 9466 + const val HUSK_9467 = 9467 + const val PARASITE_9468 = 9468 + const val PARASITE_9469 = 9469 + const val SLEEPWALKER_9470 = 9470 + const val SISTER_SENGA = 9471 + const val SISTER_SENGA_9472 = 9472 + const val ENT_TRUNK = 9474 + const val GIELINOR_GUIDE_9476 = 9476 + const val SURVIVAL_EXPERT_9477 = 9477 + const val FISHING_SPOT_9478 = 9478 + const val MASTER_NAVIGATOR = 9479 + const val QUEST_GUIDE_9480 = 9480 + const val MINING_INSTRUCTOR_9481 = 9481 + const val COMBAT_INSTRUCTOR_9482 = 9482 + const val GIANT_RAT_9483 = 9483 + const val BANKER_9484 = 9484 + const val BROTHER_BRACE_9485 = 9485 + const val IRON_MAN_TUTOR_9486 = 9486 + const val MAGIC_INSTRUCTOR_9487 = 9487 + const val CHICKEN_9488 = 9488 + const val VELIAF_HURTZ_9489 = 9489 + const val HAMELN_THE_JESTER = 9490 + const val HANCHEN_THE_HOUND = 9491 + const val TANGLEROOT_9492 = 9492 + const val TANGLEROOT_9493 = 9493 + const val TANGLEROOT_9494 = 9494 + const val TANGLEROOT_9495 = 9495 + const val TANGLEROOT_9496 = 9496 + const val TANGLEROOT_9497 = 9497 + const val TANGLEROOT_9498 = 9498 + const val TANGLEROOT_9499 = 9499 + const val TANGLEROOT_9500 = 9500 + const val TANGLEROOT_9501 = 9501 + const val IORWERTH_WARRIOR_9502 = 9502 + const val IORWERTH_WARRIOR_9503 = 9503 + const val ACCOUNT_SECURITY_TUTOR = 9504 + const val HAMELN_THE_JESTER_9505 = 9505 + const val HANCHEN_THE_HOUND_9506 = 9506 + const val ENRAGED_TEKTINY_9511 = 9511 + const val FLYING_VESPINA_9512 = 9512 + const val ENRAGED_TEKTINY_9513 = 9513 + const val FLYING_VESPINA_9514 = 9514 + const val VELIAF_HURTZ_9521 = 9521 + const val VELIAF_HURTZ_9522 = 9522 + const val VELIAF_HURTZ_9523 = 9523 + const val VELIAF_HURTZ_9524 = 9524 + const val VELIAF_HURTZ_9525 = 9525 + const val VELIAF_HURTZ_9526 = 9526 + const val VELIAF_HURTZ_9527 = 9527 + const val VELIAF_HURTZ_9528 = 9528 + const val VELIAF_HURTZ_9529 = 9529 + const val IVAN_STROM_9530 = 9530 + const val IVAN_STROM_9531 = 9531 + const val IVAN_STROM_9532 = 9532 + const val IVAN_STROM_9533 = 9533 + const val IVAN_STROM_9534 = 9534 + const val IVAN_STROM_9535 = 9535 + const val IVAN_STROM_9536 = 9536 + const val SAFALAAN_HALLOW_9537 = 9537 + const val SAFALAAN_HALLOW_9538 = 9538 + const val SAFALAAN_HALLOW_9539 = 9539 + const val SAFALAAN_HALLOW_9540 = 9540 + const val SAFALAAN_HALLOW_9541 = 9541 + const val SAFALAAN_HALLOW_9542 = 9542 + const val KAEL_FORSHAW_9543 = 9543 + const val KAEL_FORSHAW_9544 = 9544 + const val KAEL_FORSHAW_9545 = 9545 + const val KAEL_FORSHAW_9546 = 9546 + const val VERTIDA_SEFALATIS_9547 = 9547 + const val VERTIDA_SEFALATIS_9548 = 9548 + const val VERTIDA_SEFALATIS_9549 = 9549 + const val VERTIDA_SEFALATIS_9550 = 9550 + const val RADIGAD_PONFIT_9551 = 9551 + const val RADIGAD_PONFIT_9552 = 9552 + const val RADIGAD_PONFIT_9553 = 9553 + const val POLMAFI_FERDYGRIS_9554 = 9554 + const val POLMAFI_FERDYGRIS_9555 = 9555 + const val POLMAFI_FERDYGRIS_9556 = 9556 + const val CARL = 9557 + const val CARL_9558 = 9558 + const val KROY = 9559 + const val KROY_9560 = 9560 + const val DAMIEN_LEUCURTE = 9561 + const val DAMIEN_LEUCURTE_9562 = 9562 + const val DAMIEN_LEUCURTE_9563 = 9563 + const val DAMIEN_LEUCURTE_9564 = 9564 + const val LORD_CROMBWICK = 9565 + const val VANSTROM_KLAUSE_9566 = 9566 + const val VANSTROM_KLAUSE_9567 = 9567 + const val VANSTROM_KLAUSE_9568 = 9568 + const val VANSTROM_KLAUSE_9569 = 9569 + const val VANSTROM_KLAUSE_9570 = 9570 + const val VANSTROM_KLAUSE_9571 = 9571 + const val MIST_9572 = 9572 + const val ACIDIC_BLOODVELD = 9573 + const val VANESCULA_DRAKAN_9574 = 9574 + const val VANESCULA_DRAKAN_9575 = 9575 + const val VANESCULA_DRAKAN_9576 = 9576 + const val VANESCULA_DRAKAN_9577 = 9577 + const val LORD_ALEXEI_JOVKAI = 9578 + const val LOWERNIEL_DRAKAN = 9579 + const val WEREWOLF_9580 = 9580 + const val WEREWOLF_9581 = 9581 + const val WEREWOLF_9582 = 9582 + const val PRISONER = 9583 + const val PRISONER_9584 = 9584 + const val PRISONER_9585 = 9585 + const val VAMPYRE_JUVINATE_9586 = 9586 + const val VAMPYRE_JUVINATE_9587 = 9587 + const val DESMODUS_LASIURUS = 9588 + const val MORDAN_NIKAZSI = 9589 + const val VYREWATCH_9590 = 9590 + const val VYREWATCH_9591 = 9591 + const val PRISONER_9592 = 9592 + const val PRISONER_9593 = 9593 + const val MARIA_GADDERANKS = 9594 + const val MARIA_GADDERANKS_9595 = 9595 + const val RON_GADDERANKS = 9596 + const val RON_GADDERANKS_9597 = 9597 + const val SARIUS_GUILE_9598 = 9598 + const val VYREWATCH_SENTINEL = 9599 + const val VYREWATCH_SENTINEL_9600 = 9600 + const val VYREWATCH_SENTINEL_9601 = 9601 + const val VYREWATCH_SENTINEL_9602 = 9602 + const val VYREWATCH_SENTINEL_9603 = 9603 + const val VYREWATCH_SENTINEL_9604 = 9604 + const val VYREWATCH_9605 = 9605 + const val VYREWATCH_9606 = 9606 + const val VYREWATCH_9607 = 9607 + const val VYREWATCH_9608 = 9608 + const val SEAGULL_9609 = 9609 + const val MUTATED_BLOODVELD_9610 = 9610 + const val MUTATED_BLOODVELD_9611 = 9611 + const val NAIL_BEAST_9612 = 9612 + const val NAIL_BEAST_9613 = 9613 + const val VAMPYRE_JUVINATE_9614 = 9614 + const val VAMPYRE_JUVINATE_9615 = 9615 + const val VAMPYRE_JUVINATE_9616 = 9616 + const val VAMPYRE_JUVINATE_9617 = 9617 + const val CURPILE_FYOD = 9619 + const val VELIAF_HURTZ_9621 = 9621 + const val SANI_PILIU = 9622 + const val SANI_PILIU_9623 = 9623 + const val HAROLD_EVANS = 9624 + const val HAROLD_EVANS_9625 = 9625 + const val RADIGAD_PONFIT_9627 = 9627 + const val POLMAFI_FERDYGRIS_9629 = 9629 + const val IVAN_STROM_9631 = 9631 + const val VANSTROM_KLAUSE_9632 = 9632 + const val VELIAF_HURTZ_9633 = 9633 + const val WISKIT_9634 = 9634 + const val GADDERANKS_9635 = 9635 + const val DREZEL = 9636 + const val DARK_SQUIRREL_9637 = 9637 + const val DARK_SQUIRREL_9638 = 9638 + const val MYSTERIOUS_STRANGER_9639 = 9639 + const val MYSTERIOUS_STRANGER_9640 = 9640 + const val BAT_9641 = 9641 + const val BAT_9642 = 9642 + const val SPIDER_9643 = 9643 + const val SPIDER_9644 = 9644 + const val FISH_9645 = 9645 + const val FISH_9646 = 9646 + const val KNIGHT_OF_THE_OWL = 9648 + const val KNIGHT_OF_THE_UNICORN = 9650 + const val KNIGHT_OF_THE_WOLF = 9652 + const val KNIGHT_OF_THE_LION = 9654 + const val ARCHPRIEST_OF_THE_UNICORN = 9656 + const val DARKMEYER_SLAVE = 9657 + const val DARKMEYER_SLAVE_9658 = 9658 + const val MAD_MELVIN96 = 9659 + const val R2T2PNSH0TY = 9660 + const val JYN = 9661 + const val C4SSI4N = 9662 + const val FISHRUNNER82 = 9663 + const val WEAST_SIDE49 = 9664 + const val C0LECT0R890 = 9665 + const val GIANT_SQUIRREL_9666 = 9666 + const val OWL = 9667 + const val OWL_9668 = 9668 + const val NORANNA_TYTANIN = 9675 + const val NORANNA_TYTANIN_9676 = 9676 + const val SLAVE_9677 = 9677 + const val SLAVE_9678 = 9678 + const val SLAVE_9679 = 9679 + const val SLAVE_9680 = 9680 + const val SLAVE_9681 = 9681 + const val SLAVE_9682 = 9682 + const val VAMPYRE_JUVINATE_9683 = 9683 + const val VAMPYRE_JUVINATE_9684 = 9684 + const val VALENTIN_RASPUTIN = 9685 + const val VON_VAN_VON = 9686 + const val VLAD_BECHSTEIN = 9687 + const val DRACONIS_SANGUINE = 9688 + const val MORT_NIGHTSHADE = 9689 + const val VAMPYRUS_DIAEMUS = 9690 + const val CARNIVUS_BELAMORTA = 9691 + const val VORMAR_VAKAN = 9692 + const val MISDRIEVUS_SHADUM = 9693 + const val VLAD_DIAEMUS = 9694 + const val NOCTILLION_LUGOSI = 9695 + const val ALEK_CONSTANTINE = 9696 + const val GRIGOR_RASPUTIN = 9697 + const val HAEMAS_LAMESCUS = 9698 + const val REMUS_KANINUS = 9699 + const val VALLESSIA_DRACYULA = 9700 + const val VIOLETTA_SANGUINE = 9701 + const val DIPHYLLA_BECHSTEIN = 9702 + const val EPISCULA_HELSING = 9703 + const val VAMPYRESSA_VAN_VON = 9704 + const val VALLESSIA_VON_PITT = 9705 + const val VONNETTA_VARNIS = 9706 + const val NATALIDAE_SHADUM = 9707 + const val MORTINA_DAUBENTON = 9708 + const val LASENNA_RASPUTIN = 9709 + const val CANINELLE_DRAYNAR = 9710 + const val VALENTINA_DIAEMUS = 9711 + const val NAKASA_JOVKAI = 9712 + const val CRIMSONETTE_VAN_MARR = 9713 + const val PIPISTRELLE_DRAYNAR = 9714 + const val LADY_NADEZHDA_SHADUM = 9715 + const val LORD_MISCHA_MYRMEL = 9716 + const val LORD_ALEXEI_JOVKAI_9717 = 9717 + const val BANKER_9718 = 9718 + const val BANKER_9719 = 9719 + const val GRINKA_KRAST = 9720 + const val DRASDAN_RANOR = 9721 + const val DESPOINA_CALLIDRA = 9722 + const val LENYIG_KARNA = 9723 + const val VARRIAN_SOBAK = 9724 + const val SLAVE_9725 = 9725 + const val SLAVE_9726 = 9726 + const val VAMPYRE_JUVINATE_9727 = 9727 + const val VAMPYRE_JUVINATE_9728 = 9728 + const val VAMPYRE_JUVINATE_9729 = 9729 + const val VAMPYRE_JUVINATE_9730 = 9730 + const val VAMPYRE_JUVENILE_9731 = 9731 + const val VAMPYRE_JUVENILE_9732 = 9732 + const val VAMPYRE_JUVENILE_9733 = 9733 + const val VAMPYRE_JUVENILE_9734 = 9734 + const val VYREWATCH_9735 = 9735 + const val VYREWATCH_9736 = 9736 + const val VYREWATCH_9737 = 9737 + const val VYREWATCH_9738 = 9738 + const val VYREWATCH_9739 = 9739 + const val VYREWATCH_9740 = 9740 + const val VYREWATCH_9741 = 9741 + const val VYREWATCH_9742 = 9742 + const val WEREWOLF_9743 = 9743 + const val WEREWOLF_9744 = 9744 + const val WEREWOLF_9745 = 9745 + const val AUCTIONEER = 9746 + const val FRANK_9749 = 9749 + const val SPECTATOR = 9750 + const val SPECTATOR_9751 = 9751 + const val SPECTATOR_9752 = 9752 + const val SPECTATOR_9753 = 9753 + const val SPECTATOR_9754 = 9754 + const val SPECTATOR_9755 = 9755 + const val VYREWATCH_SENTINEL_9756 = 9756 + const val VYREWATCH_SENTINEL_9757 = 9757 + const val VYREWATCH_SENTINEL_9758 = 9758 + const val VYREWATCH_SENTINEL_9759 = 9759 + const val VYREWATCH_SENTINEL_9760 = 9760 + const val VYREWATCH_SENTINEL_9761 = 9761 + const val VYREWATCH_SENTINEL_9762 = 9762 + const val VYREWATCH_SENTINEL_9763 = 9763 + const val YENRAB_9764 = 9764 + const val LAHSRAM_9765 = 9765 + const val ERODOEHT_9766 = 9766 + const val CARL_9767 = 9767 + const val ROY = 9768 + const val LECTOR_GURA_9769 = 9769 + const val SISTER_SEVI_9770 = 9770 + const val SISTER_TOEN_9771 = 9771 + const val SISTER_YRAM_9772 = 9772 + const val KROY_9773 = 9773 + const val DAMIEN_LEUCURTE_9774 = 9774 + const val LORD_CROMBWICK_9775 = 9775 + const val PAINTED_ONE = 9776 + const val PAINTED_ONE_9777 = 9777 + const val KURT = 9778 + const val DON = 9779 + const val DEBRA = 9780 + const val TANYA_9781 = 9781 + const val KURT_9782 = 9782 + const val DON_9783 = 9783 + const val DEBRA_9784 = 9784 + const val TANYA_9785 = 9785 + const val CHILD_9786 = 9786 + const val CHILD_9787 = 9787 + const val CHILD_9788 = 9788 + const val CHILD_9789 = 9789 + const val CHILD_9790 = 9790 + const val CHILD_9791 = 9791 + const val CHILD_9792 = 9792 + const val CHILD_9793 = 9793 + const val CHILD_9794 = 9794 + const val CHILD_9795 = 9795 + const val CHILD_9796 = 9796 + const val CHILD_9797 = 9797 + const val CHILD_9798 = 9798 + const val CHILD_9799 = 9799 + const val SLEEPWALKER_9801 = 9801 + const val SLEEPWALKER_9802 = 9802 + const val RED_9850 = 9850 + const val ZIGGY_9851 = 9851 + const val RED_9852 = 9852 + const val ZIGGY_9853 = 9853 + const val DEATH_9855 = 9855 + const val GRAVE = 9856 + const val GRAVE_9857 = 9857 + const val SQUIRE_10368 = 10368 + const val BOBAWU = 10369 + const val MARTEN = 10370 + const val WIZARD_10371 = 10371 + const val WIZARD_10372 = 10372 + const val WIZARD_10373 = 10373 + const val HILL_GIANT_10374 = 10374 + const val HILL_GIANT_10375 = 10375 + const val HILL_GIANT_10376 = 10376 + const val FEROX = 10377 + const val SIGISMUND = 10378 + const val ZAMORAKIAN_ACOLYTE = 10379 + const val ZAMORAKIAN_ACOLYTE_10380 = 10380 + const val ZAMORAKIAN_ACOLYTE_10381 = 10381 + const val REFUGEE = 10382 + const val REFUGEE_10383 = 10383 + const val REFUGEE_10384 = 10384 + const val REFUGEE_10385 = 10385 + const val PHABELLE_BILE = 10386 + const val DERSE_VENATOR = 10387 + const val ANDROS_MAI = 10388 + const val BANKER_10389 = 10389 + const val MERCENARY_10390 = 10390 + const val FINANCIAL_WIZARD_10391 = 10391 + const val CAMARST = 10392 + const val WARRIOR_OF_MURAHS = 10393 + const val WARRIOR_OF_MURAHS_10394 = 10394 + const val WARRIOR_OF_MURAHS_10395 = 10395 + const val SPIKED_TUROTH = 10397 + const val SHADOW_WYRM = 10398 + const val SHADOW_WYRM_10399 = 10399 + const val GUARDIAN_DRAKE = 10400 + const val GUARDIAN_DRAKE_10401 = 10401 + const val COLOSSAL_HYDRA = 10402 + const val TORFINN_10403 = 10403 + const val TORFINN_10404 = 10404 + const val TORFINN_10405 = 10405 + const val TORFINN_10406 = 10406 + const val JARVALD_10407 = 10407 + const val MARLO = 10408 + const val MARLO_10409 = 10409 + const val ELLIE = 10410 + const val ELLIE_10411 = 10411 + const val ANGELO = 10412 + const val ANGELO_10413 = 10413 + const val BOB_10414 = 10414 + const val JEFF_10415 = 10415 + const val SARAH_10416 = 10416 + const val TAU = 10417 + const val LARRY_10418 = 10418 + const val NOELLA = 10419 + const val ROSS = 10420 + const val JESS = 10421 + const val MARIAH = 10422 + const val LEELA_10423 = 10423 + const val BARBARA = 10424 + const val OLD_MAN_YARLO = 10425 + const val OLD_MAN_YARLO_10426 = 10426 + const val OLD_MAN_YARLO_10427 = 10427 + const val SPRIA = 10432 + const val SPRIA_10433 = 10433 + const val SPRIA_10434 = 10434 + const val SOURHOG = 10435 + const val SOURHOG_10436 = 10436 + const val PIG_THING = 10437 + const val ROSIE_10438 = 10438 + const val SHEEPDOG_10439 = 10439 + const val SPIDER_10442 = 10442 + const val SPIDER_10443 = 10443 + const val BEES = 10444 + const val GNORMADIUM_AVLAFRIM_10445 = 10445 + const val GNORMADIUM_AVLAFRIM_10446 = 10446 + const val GNORMADIUM_AVLAFRIM_10447 = 10447 + const val GNORMADIUM_AVLAFRIM_10448 = 10448 + const val EVE_10449 = 10449 + const val GNORMADIUM_AVLAFRIM_10450 = 10450 + const val GNORMADIUM_AVLAFRIM_10451 = 10451 + const val CAPTAIN_DALBUR = 10452 + const val CAPTAIN_DALBUR_10453 = 10453 + const val CAPTAIN_DALBUR_10454 = 10454 + const val CAPTAIN_DALBUR_10455 = 10455 + const val CAPTAIN_DALBUR_10456 = 10456 + const val CAPTAIN_DALBUR_10457 = 10457 + const val CAPTAIN_DALBUR_10458 = 10458 + const val CAPTAIN_BLEEMADGE = 10459 + const val JACKOLANTERN = 10460 + const val CAPTAIN_BLEEMADGE_10461 = 10461 + const val CAPTAIN_BLEEMADGE_10462 = 10462 + const val CAPTAIN_BLEEMADGE_10463 = 10463 + const val CAPTAIN_BLEEMADGE_10464 = 10464 + const val CAPTAIN_BLEEMADGE_10465 = 10465 + const val CAPTAIN_BLEEMADGE_10466 = 10466 + const val CAPTAIN_ERRDO_10467 = 10467 + const val CAPTAIN_ERRDO_10468 = 10468 + const val CAPTAIN_ERRDO_10469 = 10469 + const val CAPTAIN_ERRDO_10470 = 10470 + const val CAPTAIN_ERRDO_10471 = 10471 + const val CAPTAIN_ERRDO_10472 = 10472 + const val CAPTAIN_ERRDO_10473 = 10473 + const val LEAGUES_ASSISTANT = 10476 + const val THESSALIA = 10477 + const val THESSALIA_10478 = 10478 + const val CAPTAIN_KLEMFOODLE = 10479 + const val CAPTAIN_KLEMFOODLE_10480 = 10480 + const val CAPTAIN_KLEMFOODLE_10481 = 10481 + const val CAPTAIN_KLEMFOODLE_10482 = 10482 + const val CAPTAIN_KLEMFOODLE_10483 = 10483 + const val CAPTAIN_KLEMFOODLE_10484 = 10484 + const val CAPTAIN_KLEMFOODLE_10485 = 10485 + const val CAPTAIN_SHORACKS_10486 = 10486 + const val CAPTAIN_SHORACKS_10487 = 10487 + const val CAPTAIN_SHORACKS_10488 = 10488 + const val CAPTAIN_SHORACKS_10489 = 10489 + const val CAPTAIN_SHORACKS_10490 = 10490 + const val CAPTAIN_SHORACKS_10491 = 10491 + const val HEADLESS_BEAST_HARD = 10492 + const val HEADLESS_BEAST = 10493 + const val CHICKEN_10494 = 10494 + const val CHICKEN_10495 = 10495 + const val CHICKEN_10496 = 10496 + const val CHICKEN_10497 = 10497 + const val CHICKEN_10498 = 10498 + const val CHICKEN_10499 = 10499 + const val GORDON = 10500 + const val GORDON_10501 = 10501 + const val MARY_10502 = 10502 + const val MARY_10503 = 10503 + const val MARY_10504 = 10504 + const val SHAYZIEN_SERGEANT_10505 = 10505 + const val HEADLESS_BEAST_10506 = 10506 + const val ORNATE_UNDEAD_COMBAT_DUMMY_10507 = 10507 + const val ORNATE_WILDERNESS_COMBAT_DUMMY = 10508 + const val ORNATE_KALPHITE_COMBAT_DUMMY = 10509 + const val ORNATE_KURASK_COMBAT_DUMMY = 10510 + const val ORNATE_UNDEAD_COMBAT_DUMMY_10511 = 10511 + const val ORNATE_UNDEAD_COMBAT_DUMMY_10512 = 10512 + const val FISHING_SPOT_10513 = 10513 + const val FISHING_SPOT_10514 = 10514 + const val FISHING_SPOT_10515 = 10515 + const val NOMAD = 10516 + const val ZIMBERFIZZ = 10517 + const val ZIMBERFIZZ_10518 = 10518 + const val ZIMBERFIZZ_10519 = 10519 + const val AVATAR_OF_CREATION = 10520 + const val AVATAR_OF_DESTRUCTION = 10521 + const val WOLF_10522 = 10522 + const val FORGOTTEN_SOUL = 10523 + const val FORGOTTEN_SOUL_10524 = 10524 + const val FORGOTTEN_SOUL_10525 = 10525 + const val FORGOTTEN_SOUL_10526 = 10526 + const val NOMAD_10528 = 10528 + const val NOMAD_10529 = 10529 + const val ZIMBERFIZZ_10530 = 10530 + const val AVATAR_OF_CREATION_10531 = 10531 + const val AVATAR_OF_DESTRUCTION_10532 = 10532 + const val WOLF_10533 = 10533 + const val FORGOTTEN_SOUL_10534 = 10534 + const val FORGOTTEN_SOUL_10535 = 10535 + const val FORGOTTEN_SOUL_10536 = 10536 + const val FORGOTTEN_SOUL_10537 = 10537 + const val GHOST_10538 = 10538 + const val BARRICADE_10539 = 10539 + const val BARRICADE_10540 = 10540 + const val BIRD_10541 = 10541 + const val FORGOTTEN_SOUL_10544 = 10544 + const val FORGOTTEN_SOUL_10545 = 10545 + const val DUCK_10546 = 10546 + const val DUCK_10547 = 10547 + const val SCRUBFOOT = 10558 + const val SCRUBFOOT_10559 = 10559 + const val RED_FIREFLIES_10561 = 10561 + const val RED_FIREFLIES_10562 = 10562 + const val GREEN_FIREFLIES_10564 = 10564 + const val GREEN_FIREFLIES_10565 = 10565 + const val GOBLIN_10566 = 10566 + const val GOBLIN_10567 = 10567 /* Auto-generated file using class gg.rsmod.game.service.game.DumpEntityIdService */ } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Objs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Objs.kt index d8f41c5647..244ace44c3 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Objs.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/cfg/Objs.kt @@ -260,7 +260,7 @@ object Objs { const val GRAVE_MARKER = 401 const val TOMBSTONE = 402 const val LARGE_GRAVE_STONE = 403 - const val GRAVESTONE = 404 + const val GRAVESTONE_404 = 404 const val GRAVESTONE_405 = 405 const val LARGE_GRAVE = 406 const val HENGE = 407 @@ -839,8 +839,6 @@ object Objs { const val CURTAIN_1534 = 1534 const val DOOR_1535 = 1535 const val DOOR_1536 = 1536 - const val DOOR_1537 = 1537 - const val DOOR_1538 = 1538 const val DOOR_1540 = 1540 const val DOOR_1541 = 1541 const val DOOR_1543 = 1543 @@ -917,7 +915,7 @@ object Objs { const val GRAPEVINE = 1753 const val GRAPEVINE_1754 = 1754 const val GLASS_DOOR = 1762 - const val PUMP_AND_DRAIN_1763 = 1763 + const val SINK_1763 = 1763 const val DUMMY_1764 = 1764 const val LEAFLETS = 1767 const val CHEST_1768 = 1768 @@ -961,23 +959,21 @@ object Objs { const val DOOR_1991 = 1991 const val GLARIALS_TOMBSTONE = 1992 const val GLARIALS_TOMB = 1993 - const val CLOSED_CHEST_1994 = 1994 - const val OPEN_CHEST_1995 = 1995 + const val CHEST_1994 = 1994 + const val CHEST_1995 = 1995 const val ROCK_1996 = 1996 const val ROCK_1997 = 1997 const val ROPE_1998 = 1998 const val CRATE_1999 = 1999 const val DOOR_2000 = 2000 const val DOOR_2002 = 2002 - const val PILLAR = 2004 - const val STATUE_OF_BAXTORIAN = 2005 const val STATUE_OF_GLARIAL = 2006 - const val LEDGE = 2010 - const val LEDGE_2011 = 2011 + const val DOOR_2010 = 2010 + const val LEDGE = 2011 const val LEDGE_2012 = 2012 const val VINE_2013 = 2013 - const val CHALICE_OF_ETERNITY = 2014 - const val CHALICE_OF_ETERNITY_2015 = 2015 + const val CHALICE = 2014 + const val CHALICE_2015 = 2015 const val WHIRLPOOL_2019 = 2019 const val DEAD_TREE_2020 = 2020 const val BARREL_2022 = 2022 @@ -998,7 +994,6 @@ object Objs { const val DUMMY_2038 = 2038 const val GATE_2039 = 2039 const val GATE_2041 = 2041 - const val CAULDRON_2043 = 2043 const val TROUGH = 2044 const val DOOR_2048 = 2048 const val DOOR_2049 = 2049 @@ -1014,7 +1009,6 @@ object Objs { const val CRATE_2064 = 2064 const val ROPE_LADDER = 2065 const val WALL_2066 = 2066 - const val WATCHTOWER = 2067 const val FENCE = 2068 const val DOOR_2069 = 2069 const val CRATE_2071 = 2071 @@ -1291,7 +1285,7 @@ object Objs { const val CLOSED_CHEST_2436 = 2436 const val GATE_2438 = 2438 const val GATE_2439 = 2439 - const val PILLAR_2440 = 2440 + const val PILLAR = 2440 const val PILLAR_2441 = 2441 const val PILLAR_2442 = 2442 const val PILLAR_2443 = 2443 @@ -1324,8 +1318,7 @@ object Objs { const val TRAWLER_NET_2481 = 2481 const val TRAWLER_NET_2482 = 2482 const val TRAWLER_NET_2483 = 2483 - const val LEAK = 2484 - const val REPAIRED_LEAK = 2485 + const val HOPPER_CONTROLS = 2484 const val SPRAY = 2486 const val SPRAY_2487 = 2487 const val LAMP_2491 = 2491 @@ -1361,9 +1354,6 @@ object Objs { const val BARREL_2530 = 2530 const val MUD_PATCH_2531 = 2531 const val MUD_PILE_2533 = 2533 - const val DOOR_2534 = 2534 - const val DOOR_2535 = 2535 - const val DOOR_2536 = 2536 const val DOOR_2537 = 2537 const val DOOR_2538 = 2538 const val STAIRS_2539 = 2539 @@ -1420,7 +1410,7 @@ object Objs { const val CHEST_2604 = 2604 const val LADDER_2605 = 2605 const val WALL_2606 = 2606 - const val HOPPER_CONTROLS = 2607 + const val HOPPER_CONTROLS_2607 = 2607 const val STAIRCASE_2608 = 2608 const val STAIRCASE_2609 = 2609 const val STAIRCASE_2610 = 2610 @@ -1541,7 +1531,6 @@ object Objs { const val COUNTER_2792 = 2792 const val COUNTER_2793 = 2793 const val LEVER_2794 = 2794 - const val LEVER_2795 = 2795 const val LADDER_2796 = 2796 const val LADDER_2797 = 2797 const val BUSH_2798 = 2798 @@ -1780,15 +1769,15 @@ object Objs { const val BARREL_3210 = 3210 const val POSTER_3212 = 3212 const val CAVE_ENTRANCE_3213 = 3213 - const val UNDERGROUND_PASS_EXIT = 3214 - const val MUD_3216 = 3216 + const val CAVE_EXIT_3214 = 3214 + const val LOOSE_MUD = 3216 const val CAVE_3217 = 3217 const val TUNNEL_3218 = 3218 const val TUNNEL_3219 = 3219 const val DOOR_3220 = 3220 const val DOOR_3221 = 3221 - const val CAVE_STAIRS = 3222 - const val CAVE_STAIRS_3223 = 3223 + const val CAVE_3222 = 3222 + const val CAVE_3223 = 3223 const val CAVE_3224 = 3224 const val TRAP = 3227 const val TRAP_3228 = 3228 @@ -1798,9 +1787,9 @@ object Objs { const val STALAGMITES = 3232 const val TRAP_3233 = 3233 const val ODD_MARKINGS = 3234 - const val OBSTACLE_PIPE = 3235 - const val OBSTACLE_PIPE_3236 = 3236 - const val OBSTACLE_PIPE_3237 = 3237 + const val PIPE_3235 = 3235 + const val PIPE_3236 = 3236 + const val PIPE_3237 = 3237 const val LEDGE_3238 = 3238 const val BRIDGE = 3239 const val BRIDGE_3240 = 3240 @@ -1823,9 +1812,9 @@ object Objs { const val SWAMP = 3263 const val WELL_3264 = 3264 const val PILE_OF_ROCKS = 3265 - const val CAGE_3266 = 3266 + const val GATE_3266 = 3266 const val CAGE_3267 = 3267 - const val CAGE_3268 = 3268 + const val GATE_3268 = 3268 const val DOOR_3270 = 3270 const val DOOR_3271 = 3271 const val CHEST_3272 = 3272 @@ -1860,7 +1849,7 @@ object Objs { const val GUIDE_ROPE = 3340 const val GUIDE_ROPE_3341 = 3341 const val ROCK_PILE_3343 = 3343 - const val BARREL_3344 = 3344 + const val BREW_BARREL = 3344 const val IBANS_THRONE = 3348 const val CAGE_3351 = 3351 const val CAGE_3352 = 3352 @@ -1868,7 +1857,6 @@ object Objs { const val TOMB_3354 = 3354 const val WELL_3359 = 3359 const val CRATE_3360 = 3360 - const val ORB_OF_LIGHT_3361 = 3361 const val WINDOW_3362 = 3362 const val ROCK_3364 = 3364 const val PROTRUDING_ROCKS = 3365 @@ -1933,8 +1921,8 @@ object Objs { const val FUNGI_ON_LOG = 3509 const val ROTTING_BRANCH = 3510 const val BUDDING_BRANCH = 3511 - const val A_SMALL_BUSH = 3512 - const val A_GOLDEN_PEAR_BUSH = 3513 + const val SMALL_BUSH = 3512 + const val GOLDEN_PEAR_BUSH = 3513 const val ROTTING_TREE = 3514 const val GROTTO = 3516 const val GROTTO_TREE = 3517 @@ -2099,7 +2087,6 @@ object Objs { const val TUNNEL_ENTRANCE = 3828 const val ROPE_3829 = 3829 const val COMPOST_BIN_3830 = 3830 - const val TUNNEL_ENTRANCE_3831 = 3831 const val ROPE_3832 = 3832 const val COCOON = 3833 const val COMPOST_BIN_3835 = 3835 @@ -2159,7 +2146,8 @@ object Objs { const val MUSHROOM_3917 = 3917 const val ELVEN_LAMP = 3918 const val TWIGS_3919 = 3919 - const val TRIPWIRE = 3921 + const val TRIPWIRE = 3920 + const val TRIPWIRE_3921 = 3921 const val STICKS = 3922 const val LEAVES_3923 = 3923 const val LEAVES_3924 = 3924 @@ -2174,7 +2162,6 @@ object Objs { const val DENSE_FOREST = 3937 const val DENSE_FOREST_3938 = 3938 const val DENSE_FOREST_3939 = 3939 - const val TRACKS_3941 = 3941 const val HUGE_GATE = 3944 const val HUGE_GATE_3945 = 3945 const val HUGE_GATE_3946 = 3946 @@ -2190,7 +2177,7 @@ object Objs { const val CORPSE_3972 = 3972 const val CORPSE_3973 = 3973 const val CORPSE_3974 = 3974 - const val TAR = 3975 + const val COAL_TAR = 3975 const val CATAPULT_3976 = 3976 const val CATAPULTWINCH = 3977 const val CATAPULTLEVER = 3978 @@ -2218,7 +2205,7 @@ object Objs { const val ALTAR_4008 = 4008 const val BARREL_4024 = 4024 const val BARREL_4025 = 4025 - const val FRACTIONALIZING_STILL = 4026 + const val FRACTIONALISING_STILL = 4026 const val STUMP = 4027 const val TREE_4028 = 4028 const val TREE_4029 = 4029 @@ -2318,7 +2305,6 @@ object Objs { const val HILLSIDE_ENTRANCE_4135 = 4135 const val COUNTER_4138 = 4138 const val SHIPS_LADDER_4139 = 4139 - const val HOLE_4140 = 4140 const val STRANGE_ALTAR = 4141 const val SWAYING_TREE = 4142 const val DANGER_SIGN_4143 = 4143 @@ -2375,7 +2361,7 @@ object Objs { const val FIRE_4265 = 4265 const val FIRE_4266 = 4266 const val SPIT_ROAST = 4267 - const val WOODEN_TABLE = 4269 + const val WOODEN_TABLE_4269 = 4269 const val WOODEN_TABLE_4270 = 4270 const val CHAIR_4271 = 4271 const val TABLE_4272 = 4272 @@ -2419,7 +2405,6 @@ object Objs { const val SHELF_4370 = 4370 const val SHELF_4371 = 4371 const val TABLE_4372 = 4372 - const val SAND_PIT = 4373 const val STANDARD_STAND = 4377 const val STANDARD_STAND_4378 = 4378 const val IRON_LADDER = 4380 @@ -2804,7 +2789,6 @@ object Objs { const val STAIRS_4973 = 4973 const val MINE_CART_4974 = 4974 const val CRATE_4975 = 4975 - const val HULL = 4976 const val GANGPLANK_4977 = 4977 const val GANGPLANK_4978 = 4978 const val HERBS_4979 = 4979 @@ -2919,7 +2903,7 @@ object Objs { const val FIREPLACE_5165 = 5165 const val BOOKCASE_5166 = 5166 const val MEMORIAL = 5167 - const val GRAVE = 5168 + const val GRAVE_5168 = 5168 const val GRAVE_5169 = 5169 const val ENTRANCE_5170 = 5170 const val DOOR_5172 = 5172 @@ -3990,7 +3974,7 @@ object Objs { const val BENCH_7430 = 7430 const val BOOKCASE_7431 = 7431 const val OAK_CHAIR_7433 = 7433 - const val CLOCK_7434 = 7434 + const val GRANDFATHER_CLOCK_7434 = 7434 const val DESK_7438 = 7438 const val CHAIR_7439 = 7439 const val DESK_7440 = 7440 @@ -4286,7 +4270,7 @@ object Objs { const val ALTAR_7814 = 7814 const val EXIT_PORTAL_7819 = 7819 const val EXIT_PORTAL_7820 = 7820 - const val BARRIER = 7821 + const val BARRIER_7821 = 7821 const val BARRIER_7822 = 7822 const val FLOWER_PATCH = 7840 const val FLOWER_PATCH_7841 = 7841 @@ -5118,7 +5102,7 @@ object Objs { const val YOUNG_TREE_8732 = 8732 const val YOUNG_TREE_8733 = 8733 const val NET_TRAP_8734 = 8734 - const val BARREL_TAP = 8737 + const val TAP_8737 = 8737 const val ARDOUGNE_WALL_DOOR = 8738 const val ARDOUGNE_WALL_DOOR_8739 = 8739 const val ARDOUGNE_WALL_DOOR_8740 = 8740 @@ -5158,19 +5142,12 @@ object Objs { const val DOOR_8792 = 8792 const val DOOR_8793 = 8793 const val GNOME_ON_A_RACK = 8795 - const val AN_EMPTY_RACK = 8796 + const val EMPTY_RACK = 8796 const val CLOSED_CHEST_8797 = 8797 const val OPEN_CHEST_8798 = 8798 - const val DESK_8799 = 8799 const val CLOSED_CHEST_8800 = 8800 - const val GRAIN_SACKS = 8801 - const val GRAIN_SACKS_8802 = 8802 - const val GRAIN_SACKS_8803 = 8803 - const val GRAIN_SACKS_8804 = 8804 - const val GRAIN_SACKS_8805 = 8805 - const val GRAIN_SACKS_8806 = 8806 - const val APPLE_BARREL_8807 = 8807 - const val APPLE_BARREL_8808 = 8808 + const val APPLE_PRESS = 8807 + const val APPLE_PRESS_8808 = 8808 const val ROTTEN_APPLE_PILE = 8809 const val GATE_8810 = 8810 const val GATE_8811 = 8811 @@ -5191,6 +5168,8 @@ object Objs { const val STOCKS_8840 = 8840 const val APPLE_TREE_8842 = 8842 const val APPLE_TREE_8843 = 8843 + const val CITY_GATE_8844 = 8844 + const val CITY_GATE_8845 = 8845 const val KELDA_HOPS_PATCH = 8861 const val KELDA_HOPS_PATCH_8862 = 8862 const val KELDA_HOPS_PATCH_8863 = 8863 @@ -5525,11 +5504,11 @@ object Objs { const val BIRD_SNARE_9347 = 9347 const val BIRD_SNARE_9348 = 9348 const val BIRD_SNARE_9349 = 9349 - const val GRAVE_9354 = 9354 - const val GRAVE_9355 = 9355 - const val GRAVE_9356 = 9356 - const val GRAVE_9357 = 9357 - const val GRAVE_9358 = 9358 + const val ORNATE_COMBAT_DUMMY_9354 = 9354 + const val ORNATE_UNDEAD_COMBAT_DUMMY_9355 = 9355 + const val ORNATE_WILDERNESS_COMBAT_DUMMY_9356 = 9356 + const val ORNATE_KALPHITE_COMBAT_DUMMY_9357 = 9357 + const val ORNATE_KURASK_COMBAT_DUMMY_9358 = 9358 const val GRAVESTONE_9359 = 9359 const val GRAVESTONE_9360 = 9360 const val GRAVESTONE_9361 = 9361 @@ -5722,8 +5701,8 @@ object Objs { const val LADDER_9742 = 9742 const val SHIPS_LADDER_9744 = 9744 const val SHIPS_LADDER_9745 = 9745 - const val CRYSTAL_COLLECTOR = 9748 - const val CRYSTAL_COLLECTOR_9749 = 9749 + const val CRYSTAL_DISPENSER = 9748 + const val CRYSTAL_DISPENSER_9749 = 9749 const val CRYSTAL_9751 = 9751 const val CRYSTAL_9752 = 9752 const val OPEN_CHEST_9753 = 9753 @@ -5790,7 +5769,7 @@ object Objs { const val PILLAR_OF_LIGHT_9936 = 9936 const val PILLAR_OF_LIGHT_9937 = 9937 const val PILLAR_OF_LIGHT_9973 = 9973 - const val CAVE_STAIRS_9975 = 9975 + const val CAVE_9975 = 9975 const val CAVE_WALL_9976 = 9976 const val TUNNEL_9977 = 9977 const val LADDER_9978 = 9978 @@ -5947,7 +5926,6 @@ object Objs { const val LADDER_10227 = 10227 const val LADDER_10228 = 10228 const val KINGS_LADDER = 10229 - const val KINGS_LADDER_10230 = 10230 const val BROKEN_KILN_10246 = 10246 const val BROKEN_KILN_10247 = 10247 const val BROKEN_KILN_10248 = 10248 @@ -6118,7 +6096,7 @@ object Objs { const val WHEELBARROW_10516 = 10516 const val BANK_BOOTH_10517 = 10517 const val CLOSED_BANK_BOOTH_10518 = 10518 - const val CHALICE = 10521 + const val CHALICE_10521 = 10521 const val TAPESTRY = 10522 const val STAIRCASE_10525 = 10525 const val STAIRCASE_10526 = 10526 @@ -7010,19 +6988,11 @@ object Objs { const val LADDER_12389 = 12389 const val LADDER_12390 = 12390 const val LADDER_12391 = 12391 - const val SACKS_12392 = 12392 - const val SACKS_12393 = 12393 - const val SACK_PILE = 12394 - const val SACK_PILE_12395 = 12395 const val SACK_12396 = 12396 const val SACK_12399 = 12399 const val CAULDRON_12400 = 12400 const val CAULDRON_12401 = 12401 const val EXPLOSION = 12402 - const val SHELVES_12403 = 12403 - const val SHELVES_12404 = 12404 - const val CUPBOARD_12405 = 12405 - const val CUPBOARD_12406 = 12406 const val STOOL_12407 = 12407 const val STOOL_12408 = 12408 const val STOOL_12409 = 12409 @@ -7178,7 +7148,7 @@ object Objs { const val TABLE_12734 = 12734 const val CLOSED_CHEST_12735 = 12735 const val OPEN_CHEST_12736 = 12736 - const val BROKEN_DOWN_WALL = 12737 + const val BROKEN_WALL_12737 = 12737 const val RUBBLE_12739 = 12739 const val RUBBLE_12740 = 12740 const val FALLEN_WALL = 12741 @@ -7220,7 +7190,7 @@ object Objs { const val BANK_BOOTH_12799 = 12799 const val BANK_BOOTH_12800 = 12800 const val BANK_BOOTH_12801 = 12801 - const val TOMB_12802 = 12802 + const val COFFIN_12802 = 12802 const val BARREL_12804 = 12804 const val BROKEN_FURNACE = 12806 const val REPAIRED_FURNACE = 12807 @@ -7236,7 +7206,7 @@ object Objs { const val EXIT_PATH = 12820 const val PILE_OF_BRICKS_12844 = 12844 const val TABLE_12855 = 12855 - const val STORE_DOOR = 12856 + const val DOOR_12856 = 12856 const val BAR_PUMPS_12857 = 12857 const val TRAPDOOR_12872 = 12872 const val BOOKCASE_12873 = 12873 @@ -7493,7 +7463,7 @@ object Objs { const val MAGIC_CHEST_13291 = 13291 const val MAGIC_CHEST_13292 = 13292 const val WOODEN_TABLE_13293 = 13293 - const val OAK_TABLE = 13294 + const val OAK_TABLE_13294 = 13294 const val OAK_TABLE_13295 = 13295 const val TEAK_TABLE_13296 = 13296 const val TEAK_TABLE_13297 = 13297 @@ -7734,10 +7704,8 @@ object Objs { const val SHELVES_13597 = 13597 const val CRATES_13598 = 13598 const val CRATES_13599 = 13599 - const val BARREL_13600 = 13600 - const val LARGE_BARREL = 13601 const val RACK_OF_BARRELS = 13602 - const val LARGE_BARREL_13603 = 13603 + const val LARGE_BARREL = 13603 const val BARROW = 13604 const val BARROW_13605 = 13605 const val BARROW_13606 = 13606 @@ -7943,8 +7911,8 @@ object Objs { const val RIPPLES = 13842 const val SWAMP_TREE = 13843 const val SWAMP_TREE_13844 = 13844 - const val SWAMP_TREE_13845 = 13845 - const val VINE_HANGING_FROM_BRANCH = 13846 + const val SWAMP_TREE_BRANCH = 13845 + const val SWAMP_TREE_BRANCH_13846 = 13846 const val SWAMP_TREE_13847 = 13847 const val SWAMP_TREE_13848 = 13848 const val SWAMP_TREE_13849 = 13849 @@ -8081,7 +8049,7 @@ object Objs { const val STONE_BLOCK_14203 = 14203 const val STONE_BLOCK_14204 = 14204 const val STONE_BLOCK_14205 = 14205 - const val FINAL_OWNAGE_ELITE_STATUE = 14209 + const val HERBS_14209 = 14209 const val WALL_14212 = 14212 const val WALL_14213 = 14213 const val WALL_14216 = 14216 @@ -8387,7 +8355,7 @@ object Objs { const val CRATE_14739 = 14739 const val BARREL_14740 = 14740 const val CRATES_14741 = 14741 - const val PILE_OF_CRATES = 14742 + const val CRATES_14742 = 14742 const val SACK_14743 = 14743 const val LADDER_14745 = 14745 const val LADDER_14746 = 14746 @@ -8488,7 +8456,7 @@ object Objs { const val POTTERS_WHEEL_14887 = 14887 const val POTTERY_OVEN_14888 = 14888 const val SPINNING_WHEEL_14889 = 14889 - const val SAND_PIT_14890 = 14890 + const val SAND_PIT = 14890 const val BED_14891 = 14891 const val TIGHTROPE_14892 = 14892 const val POLEVAULT = 14894 @@ -9056,7 +9024,7 @@ object Objs { const val LARGE_DOOR_15758 = 15758 const val DOOR_15759 = 15759 const val SACK_15760 = 15760 - const val SACK_PILE_15761 = 15761 + const val SACK_PILE = 15761 const val SACKS_15762 = 15762 const val BED_15767 = 15767 const val CRATE_15768 = 15768 @@ -9367,7 +9335,7 @@ object Objs { const val GATE_16493 = 16493 const val FLAGPOLE_16494 = 16494 const val OBSTACLE_NET = 16499 - const val OBSTACLE_PIPE_16500 = 16500 + const val OBSTACLE_PIPE = 16500 const val EXERCISE_MAT_16508 = 16508 const val OBSTACLE_PIPE_16509 = 16509 const val STRANGE_FLOOR = 16510 @@ -11032,7 +11000,6 @@ object Objs { const val CITY_GATE_20088 = 20088 const val CITY_GATE_20089 = 20089 const val CITY_GATE_20090 = 20090 - const val OPEN_CHEST_20095 = 20095 const val BED_20096 = 20096 const val BED_20097 = 20097 const val COMPOST_BIN_20099 = 20099 @@ -11458,9 +11425,9 @@ object Objs { const val DEAD_EXPLORER = 20788 const val LEVER_20789 = 20789 const val ENTRANCE_20790 = 20790 - const val APPLE_BARREL_20791 = 20791 - const val APPLE_BARREL_20792 = 20792 - const val BARREL_TAP_20794 = 20794 + const val APPLE_PRESS_20791 = 20791 + const val APPLE_PRESS_20792 = 20792 + const val TAP_20794 = 20794 const val EXERCISE_MAT_20801 = 20801 const val TARGET_20802 = 20802 const val TREE_20803 = 20803 @@ -11490,17 +11457,16 @@ object Objs { const val EXIT_PORTAL_20843 = 20843 const val TREE_20844 = 20844 const val TREE_20845 = 20845 - const val BEEHIVE_PART = 20846 - const val BEEHIVE_PART_20847 = 20847 - const val BEEHIVE_PART_20848 = 20848 - const val BEEHIVE_PART_20849 = 20849 - const val INTERFACE_SURROUND = 20850 - const val BUTTON_UP = 20851 - const val BUTTON_DOWN = 20852 - const val BUTTON_LEFT = 20853 - const val BUTTON_RIGHT = 20854 - const val BUTTON_BUILD = 20855 - const val BEEHIVE_20856 = 20856 + const val GATE_20847 = 20847 + const val GATE_20848 = 20848 + const val GATE_20849 = 20849 + const val GATE_20850 = 20850 + const val FLOUR_20851 = 20851 + const val CAVE_20852 = 20852 + const val CAVE_20853 = 20853 + const val CAVE_20854 = 20854 + const val SKELETON_20855 = 20855 + const val SKELETON_20856 = 20856 const val COMPOST_BIN_20870 = 20870 const val COMPOST_BIN_20871 = 20871 const val COMPOST_BIN_20872 = 20872 @@ -13370,7 +13336,7 @@ object Objs { const val DRAGONS_HEAD_25033 = 25033 const val LAW_RIFT = 25034 const val DEATH_RIFT = 25035 - const val HULL_25037 = 25037 + const val HULL = 25037 const val LADDER_25038 = 25038 const val WALL_25039 = 25039 const val WARDROBE_25040 = 25040 @@ -14014,10 +13980,6 @@ object Objs { const val WATERFALL_26497 = 26497 const val WATERFALL_26498 = 26498 const val WATERFALL_26499 = 26499 - const val BIG_DOOR_26502 = 26502 - const val BIG_DOOR_26503 = 26503 - const val BIG_DOOR_26504 = 26504 - const val BIG_DOOR_26505 = 26505 const val ICE_BRIDGE = 26518 const val CRATE_26519 = 26519 const val CAVE_26564 = 26564 @@ -14158,11 +14120,11 @@ object Objs { const val HUTCH_26822 = 26822 const val CAGES_26823 = 26823 const val CAGE_26824 = 26824 - const val ANCIENT_FURY_STATUE = 26825 - const val FATALITY_STATUE = 26826 - const val HEXIS_STATUE = 26827 - const val REIGN_OF_TERROR_STATUE = 26828 - const val STUD_UNIT_STATUE = 26829 + const val HERBS_26825 = 26825 + const val HERBS_26826 = 26826 + const val HERBS_26827 = 26827 + const val HERBS_26828 = 26828 + const val HERBS_26829 = 26829 const val CONSECRATED_HOUSE_26830 = 26830 const val DESECRATED_HOUSE_26831 = 26831 const val NATURE_HOUSE_26832 = 26832 @@ -14255,11 +14217,12 @@ object Objs { const val LIGHT_27093 = 27093 const val CLAN_CUP_PORTAL = 27095 const val EXIT_PORTAL_27096 = 27096 - const val ANTISANTA = 27097 + const val PORTAL_NEXUS_27097 = 27097 const val SOFA = 27098 const val CRATE_27100 = 27100 const val CRATES_27101 = 27101 const val CRATES_27102 = 27102 + const val PORTAL_NEXUS_27106 = 27106 const val CHARCOAL_FURNACE = 27107 const val CHARCOAL_FURNACE_27108 = 27108 const val CHARCOAL_FURNACE_27109 = 27109 @@ -14288,9 +14251,9 @@ object Objs { const val BARREL_27221 = 27221 const val BARREL_27222 = 27222 const val CRATE_27223 = 27223 - const val CRATE_27224 = 27224 - const val CRATE_27225 = 27225 - const val CRATE_27226 = 27226 + const val CRATES_27224 = 27224 + const val CRATES_27225 = 27225 + const val CRATES_27226 = 27226 const val BARREL_27227 = 27227 const val BARREL_27228 = 27228 const val BARREL_27229 = 27229 @@ -14424,6 +14387,8 @@ object Objs { const val BENCH_27511 = 27511 const val CHAIR_27512 = 27512 const val CHAIR_27513 = 27513 + const val TABLE_27514 = 27514 + const val TABLE_27515 = 27515 const val RANGE_27516 = 27516 const val RANGE_27517 = 27517 const val BAR_27518 = 27518 @@ -15291,10 +15256,8 @@ object Objs { const val LADDER_29062 = 29062 const val REWARD_CHEST = 29063 const val SCOREBOARD_29064 = 29064 - const val PLINTH_29065 = 29065 const val DOOR_29066 = 29066 const val DOOR_29067 = 29067 - const val DOOR_29068 = 29068 const val CHEST_29069 = 29069 const val CHEST_29070 = 29070 const val CHEST_29071 = 29071 @@ -15315,7 +15278,7 @@ object Objs { const val SHRINE = 29088 const val LADDER_29089 = 29089 const val MYSTERIOUS_RUINS_29090 = 29090 - const val VENDING_SHRINE = 29091 + const val HOUSE_ADVERTISEMENT_29091 = 29091 const val LADDER_29092 = 29092 const val MYSTERIOUS_RUINS_29094 = 29094 const val MYSTERIOUS_RUINS_29095 = 29095 @@ -15372,9 +15335,6 @@ object Objs { const val MAHOGANY_ADVENTURE_LOG_29151 = 29151 const val GILDED_ADVENTURE_LOG_29152 = 29152 const val MARBLE_ADVENTURE_LOG_29153 = 29153 - const val BASIC_JEWELLERY_BOX_29154 = 29154 - const val FANCY_JEWELLERY_BOX_29155 = 29155 - const val ORNATE_JEWELLERY_BOX_29156 = 29156 const val BOSS_LAIR_DISPLAY_29157 = 29157 const val KRAKEN_DISPLAY = 29158 const val ZULRAH_DISPLAY = 29159 @@ -15456,8 +15416,8 @@ object Objs { const val POOL_OF_RESTORATION = 29237 const val POOL_OF_REVITALISATION = 29238 const val POOL_OF_REJUVENATION = 29239 - const val FANCY_REJUVENATION_POOL_29240 = 29240 - const val ORNATE_REJUVENATION_POOL_29241 = 29241 + const val FANCY_POOL_OF_REJUVENATION = 29240 + const val ORNATE_POOL_OF_REJUVENATION = 29241 const val ZEN_GARDEN = 29242 const val ZEN_GARDEN_29243 = 29243 const val ZEN_GARDEN_29244 = 29244 @@ -15825,10 +15785,10 @@ object Objs { const val CARVED_REDWOOD_29681 = 29681 const val CARVED_REDWOOD_29682 = 29682 const val CRACK_29705 = 29705 - const val BANNER_29706 = 29706 - const val BANQUET_TABLE_29708 = 29708 - const val PRESENT_TABLE = 29709 - const val BIRTHDAY_HAT_TABLE = 29710 + const val POOL_OF_NIGHTMARES = 29706 + const val POOL_OF_NIGHTMARES_29707 = 29707 + const val SCOREBOARD_29708 = 29708 + const val HAMMER_29711 = 29711 const val NOTICEBOARD_29718 = 29718 const val BALLISTA_29719 = 29719 const val STAIRCASE_29720 = 29720 @@ -15868,7 +15828,7 @@ object Objs { const val SLIGHTLY_DARK_CRYSTAL = 29755 const val DIM_CRYSTAL = 29756 const val GLOWING_CRYSTAL_29757 = 29757 - const val BLACK_CRYSTAL = 29758 + const val BLACK_CRYSTAL_29758 = 29758 const val CYAN_CRYSTAL_29759 = 29759 const val MAGENTA_CRYSTAL_29760 = 29760 const val YELLOW_CRYSTAL_29761 = 29761 @@ -16049,7 +16009,14 @@ object Objs { const val PAINTING_30155 = 30155 const val FURNACE_30157 = 30157 const val FURNACE_30158 = 30158 - const val PARTY_BALLOONS = 30161 + const val RETURN_ORB = 30160 + const val LARGE_DOOR_30162 = 30162 + const val LARGE_DOOR_30163 = 30163 + const val DOOR_30164 = 30164 + const val GATE_30165 = 30165 + const val GATE_30166 = 30166 + const val DOOR_30167 = 30167 + const val BOOKCASE_30168 = 30168 const val CRACK_30169 = 30169 const val ROOT_30170 = 30170 const val PORTAL_30172 = 30172 @@ -16785,7 +16752,7 @@ object Objs { const val ENERGY_SPHERE_31680 = 31680 const val THE_CLOISTER_BELL = 31684 const val THE_CLOISTER_BELL_31685 = 31685 - const val THE_GROTESQUE_GUARDIANS_DISPLAY = 31689 + const val GROTESQUE_GUARDIANS_DISPLAY = 31689 const val CAVE_31690 = 31690 const val SAND_PILE_31691 = 31691 const val TUNNEL_ENTRANCE_31692 = 31692 @@ -16926,6 +16893,7 @@ object Objs { const val OLD_PASSAGEWAY = 31891 const val OLD_PASSAGEWAY_31892 = 31892 const val VELVET_CHAIR_31898 = 31898 + const val BOOKCASE_31899 = 31899 const val GOBLIN_CROWD_31900 = 31900 const val GOBLIN_CROWD_31901 = 31901 const val SLAYER_HELMET_DISPLAY_CASE = 31902 @@ -16937,7 +16905,7 @@ object Objs { const val CERBERUS_DISPLAY_31908 = 31908 const val ABYSSAL_SIRE_DISPLAY_31909 = 31909 const val SKOTIZO_DISPLAY_31910 = 31910 - const val THE_GROTESQUE_GUARDIANS_DISPLAY_31911 = 31911 + const val THE_GROTESQUE_GUARDIANS_DISPLAY = 31911 const val VORKATH_DISPLAY = 31912 const val ACHIEVEMENT_DIARY_DISPLAY = 31913 const val ACHIEVEMENT_DIARY_DISPLAY_31914 = 31914 @@ -17117,8 +17085,8 @@ object Objs { const val SWAMP_PASTE_32295 = 32295 const val POTIONS = 32296 const val FIRE_32297 = 32297 - const val LEAK_32298 = 32298 - const val FREMENNIK_WARRIOR = 32299 + const val LEAK = 32298 + const val FREMENNIK_WARRIOR_32299 = 32299 const val FREMENNIK_WARRIOR_32300 = 32300 const val FREMENNIK_WARRIOR_32301 = 32301 const val FREMENNIK_WARRIOR_32302 = 32302 @@ -17315,8 +17283,8 @@ object Objs { const val STONE_TABLET_32634 = 32634 const val CHURCH_ORGAN_32635 = 32635 const val CRATE_32636 = 32636 - const val LADDER_32637 = 32637 - const val LADDER_32638 = 32638 + const val STAIRS_32637 = 32637 + const val STAIRS_32638 = 32638 const val LADDER_32639 = 32639 const val LADDER_32640 = 32640 const val TRAPDOOR_32641 = 32641 @@ -17337,6 +17305,7 @@ object Objs { const val BANK_DEPOSIT_BOX_32665 = 32665 const val BANK_BOOTH_32666 = 32666 const val CLOSED_BANK_BOOTH_32667 = 32667 + const val STATUE_32671 = 32671 const val EASEL_32685 = 32685 const val VERZIKS_THRONE = 32686 const val SUPPORTING_PILLAR_32687 = 32687 @@ -17372,13 +17341,14 @@ object Objs { const val VYRE_WELL_32985 = 32985 const val TATTY_TOY = 32986 const val SCOREBOARD_32987 = 32987 + const val SCOREBOARD_32988 = 32988 const val MONUMENTAL_CHEST = 32990 const val MONUMENTAL_CHEST_32991 = 32991 const val MONUMENTAL_CHEST_32992 = 32992 const val MONUMENTAL_CHEST_32993 = 32993 const val MONUMENTAL_CHEST_32994 = 32994 const val STAIRS_32995 = 32995 - const val TELEPORT_CRYSTAL = 32996 + const val TELEPORT_CRYSTAL_32996 = 32996 const val GRAND_BOOKSHELF = 33000 const val GRAND_BOOKSHELF_33001 = 33001 const val GRAND_BOOKSHELF_33002 = 33002 @@ -18529,7 +18499,7 @@ object Objs { const val ATTAS_PLANT_DISPLAY = 34685 const val LEATHER_SHIELDS = 34686 const val BRYOPHYTA_DISPLAY = 34687 - const val BANNER_34688 = 34688 + const val BOOKCASE_34688 = 34688 const val BLOOMING_HESPORI_SPROUT = 34705 const val SHRIVELLED_PLANT = 34706 const val TWISTED_BUSH = 34712 @@ -18606,7 +18576,6 @@ object Objs { const val RUBBLE_34804 = 34804 const val RUBBLE_34805 = 34805 const val JADFEST_PORTAL = 34826 - const val HUB_PORTAL = 34827 const val LARRANS_SMALL_CHEST_34828 = 34828 const val LARRANS_BIG_CHEST = 34829 const val LARRANS_BIG_CHEST_34830 = 34830 @@ -18655,5 +18624,2271 @@ object Objs { const val WEB_34898 = 34898 const val SLASHED_WEB_34899 = 34899 const val FOG_MARKER = 34905 + const val CRYSTAL_TREE_PATCH = 34907 + const val CRYSTAL_TREE_PATCH_34908 = 34908 + const val CRYSTAL_TREE_PATCH_34909 = 34909 + const val CRYSTAL_TREE_PATCH_34910 = 34910 + const val CRYSTAL_TREE = 34911 + const val CRYSTAL_TREE_34912 = 34912 + const val CRYSTAL_TREE_34913 = 34913 + const val CRYSTAL_TREE_34914 = 34914 + const val CRYSTAL_TREE_34915 = 34915 + const val CRYSTAL_TREE_34916 = 34916 + const val CRYSTAL_TREE_34917 = 34917 + const val CRYSTAL_TREE_34918 = 34918 + const val STAIRCASE_34923 = 34923 + const val STAIRCASE_34924 = 34924 + const val LADDER_34925 = 34925 + const val DOOR_34926 = 34926 + const val DOOR_34927 = 34927 + const val DOOR_34928 = 34928 + const val DOOR_34929 = 34929 + const val DOOR_34930 = 34930 + const val DOOR_34931 = 34931 + const val DOOR_34932 = 34932 + const val DEAD_TREE_34933 = 34933 + const val DEAD_TREE_34934 = 34934 + const val DEAD_TREE_34935 = 34935 + const val TABLE_34936 = 34936 + const val BUCKET_34937 = 34937 + const val SPEAR_WALL_34938 = 34938 + const val DRAWERS_34939 = 34939 + const val SACKS_34940 = 34940 + const val CHEST_34941 = 34941 + const val CHEST_34942 = 34942 + const val SINK_34943 = 34943 + const val TABLE_34944 = 34944 + const val PORTAL_34947 = 34947 + const val GANGPLANK_34948 = 34948 + const val GANGPLANK_34949 = 34949 + const val INCONSPICUOUS_CRATE_MASTER_34950 = 34950 + const val STASH_MASTER_34951 = 34951 + const val ROPE_34955 = 34955 + const val ROCKS_34956 = 34956 + const val ROCKS_34957 = 34957 + const val ELVEN_LAMP_34958 = 34958 + const val LOOM_34959 = 34959 + const val TRACKS_34960 = 34960 + const val TRACKS_34961 = 34961 + const val TALL_REEDS_34962 = 34962 + const val GUARD_34963 = 34963 + const val CAVE_34964 = 34964 + const val PILLAR_34965 = 34965 + const val PILLAR_34966 = 34966 + const val STATUE_OF_BAXTORIAN = 34967 + const val STATUE_PLINTH_34968 = 34968 + const val STATUE_OF_BAXTORIAN_34969 = 34969 + const val BUST_35033 = 35033 + const val BUST_35034 = 35034 + const val BUST_35035 = 35035 + const val BUST_35036 = 35036 + const val BUST_35037 = 35037 + const val BUST_35038 = 35038 + const val PORTAL_35075 = 35075 + const val CRYSTAL_DISPENSER_35076 = 35076 + const val PACK = 35077 + const val FLOATING_BOOK = 35078 + const val FLOATING_BOOK_35079 = 35079 + const val FLOATING_BOOK_35080 = 35080 + const val FLOATING_BOOK_35081 = 35081 + const val PILLAR_OF_LIGHT_35082 = 35082 + const val PILLAR_OF_LIGHT_35083 = 35083 + const val PILLAR_OF_LIGHT_35084 = 35084 + const val PILLAR_OF_LIGHT_35085 = 35085 + const val PILLAR_OF_LIGHT_35086 = 35086 + const val PILLAR_OF_LIGHT_35087 = 35087 + const val PILLAR_OF_LIGHT_35088 = 35088 + const val PILLAR_OF_LIGHT_35089 = 35089 + const val PILLAR_OF_LIGHT_35090 = 35090 + const val PILLAR_OF_LIGHT_35091 = 35091 + const val PILLAR_OF_LIGHT_35092 = 35092 + const val PILLAR_OF_LIGHT_35093 = 35093 + const val PILLAR_OF_LIGHT_35094 = 35094 + const val PILLAR_OF_LIGHT_35095 = 35095 + const val PILLAR_OF_LIGHT_35096 = 35096 + const val PILLAR_OF_LIGHT_35097 = 35097 + const val PILLAR_OF_LIGHT_35098 = 35098 + const val PILLAR_OF_LIGHT_35099 = 35099 + const val PILLAR_OF_LIGHT_35100 = 35100 + const val PILLAR_OF_LIGHT_35101 = 35101 + const val PILLAR_OF_LIGHT_35102 = 35102 + const val PILLAR_OF_LIGHT_35103 = 35103 + const val PILLAR_OF_LIGHT_35104 = 35104 + const val PILLAR_OF_LIGHT_35105 = 35105 + const val PILLAR_OF_LIGHT_35106 = 35106 + const val PILLAR_OF_LIGHT_35107 = 35107 + const val PILLAR_OF_LIGHT_35108 = 35108 + const val PILLAR_OF_LIGHT_35109 = 35109 + const val PILLAR_OF_LIGHT_35110 = 35110 + const val PILLAR_OF_LIGHT_35111 = 35111 + const val PILLAR_OF_LIGHT_35112 = 35112 + const val PILLAR_OF_LIGHT_35113 = 35113 + const val PILLAR_OF_LIGHT_35114 = 35114 + const val PILLAR_OF_LIGHT_35115 = 35115 + const val PILLAR_OF_LIGHT_35116 = 35116 + const val PILLAR_OF_LIGHT_35117 = 35117 + const val PILLAR_OF_LIGHT_35118 = 35118 + const val PILLAR_OF_LIGHT_35119 = 35119 + const val PILLAR_OF_LIGHT_35120 = 35120 + const val PILLAR_OF_LIGHT_35121 = 35121 + const val PILLAR_OF_LIGHT_35122 = 35122 + const val PILLAR_OF_LIGHT_35123 = 35123 + const val PILLAR_OF_LIGHT_35124 = 35124 + const val PILLAR_OF_LIGHT_35125 = 35125 + const val PILLAR_OF_LIGHT_35126 = 35126 + const val PILLAR_OF_LIGHT_35127 = 35127 + const val PILLAR_OF_LIGHT_35128 = 35128 + const val PILLAR_OF_LIGHT_35129 = 35129 + const val PILLAR_OF_LIGHT_35130 = 35130 + const val PILLAR_OF_LIGHT_35131 = 35131 + const val PILLAR_OF_LIGHT_35132 = 35132 + const val PILLAR_OF_LIGHT_35133 = 35133 + const val PILLAR_OF_LIGHT_35134 = 35134 + const val PILLAR_OF_LIGHT_35135 = 35135 + const val PILLAR_OF_LIGHT_35136 = 35136 + const val PILLAR_OF_LIGHT_35137 = 35137 + const val PILLAR_OF_LIGHT_35138 = 35138 + const val PILLAR_OF_LIGHT_35139 = 35139 + const val PILLAR_OF_LIGHT_35140 = 35140 + const val PILLAR_OF_LIGHT_35141 = 35141 + const val PILLAR_OF_LIGHT_35142 = 35142 + const val PILLAR_OF_LIGHT_35143 = 35143 + const val PILLAR_OF_LIGHT_35144 = 35144 + const val PILLAR_OF_LIGHT_35145 = 35145 + const val PILLAR_OF_LIGHT_35146 = 35146 + const val PILLAR_OF_LIGHT_35147 = 35147 + const val PILLAR_OF_LIGHT_35148 = 35148 + const val PILLAR_OF_LIGHT_35149 = 35149 + const val PILLAR_OF_LIGHT_35150 = 35150 + const val PILLAR_OF_LIGHT_35151 = 35151 + const val PILLAR_OF_LIGHT_35152 = 35152 + const val PILLAR_OF_LIGHT_35153 = 35153 + const val PILLAR_OF_LIGHT_35154 = 35154 + const val PILLAR_OF_LIGHT_35155 = 35155 + const val PILLAR_OF_LIGHT_35156 = 35156 + const val PILLAR_OF_LIGHT_35157 = 35157 + const val PILLAR_OF_LIGHT_35158 = 35158 + const val PILLAR_OF_LIGHT_35159 = 35159 + const val PILLAR_OF_LIGHT_35160 = 35160 + const val PILLAR_OF_LIGHT_35161 = 35161 + const val PILLAR_OF_LIGHT_35162 = 35162 + const val PILLAR_OF_LIGHT_35163 = 35163 + const val PILLAR_OF_LIGHT_35164 = 35164 + const val PILLAR_OF_LIGHT_35165 = 35165 + const val PILLAR_OF_LIGHT_35166 = 35166 + const val PILLAR_OF_LIGHT_35167 = 35167 + const val PILLAR_OF_LIGHT_35168 = 35168 + const val PILLAR_OF_LIGHT_35169 = 35169 + const val PILLAR_OF_LIGHT_35170 = 35170 + const val PILLAR_OF_LIGHT_35171 = 35171 + const val PILLAR_OF_LIGHT_35172 = 35172 + const val PILLAR_OF_LIGHT_35173 = 35173 + const val PILLAR_OF_LIGHT_35174 = 35174 + const val PILLAR_OF_LIGHT_35175 = 35175 + const val PILLAR_OF_LIGHT_35176 = 35176 + const val PILLAR_OF_LIGHT_35177 = 35177 + const val PILLAR_OF_LIGHT_35178 = 35178 + const val PILLAR_OF_LIGHT_35179 = 35179 + const val PILLAR_OF_LIGHT_35180 = 35180 + const val PILLAR_OF_LIGHT_35181 = 35181 + const val PILLAR_OF_LIGHT_35182 = 35182 + const val PILLAR_OF_LIGHT_35183 = 35183 + const val PILLAR_OF_LIGHT_35184 = 35184 + const val PILLAR_OF_LIGHT_35185 = 35185 + const val PILLAR_OF_LIGHT_35186 = 35186 + const val PILLAR_OF_LIGHT_35187 = 35187 + const val PILLAR_OF_LIGHT_35188 = 35188 + const val PILLAR_OF_LIGHT_35189 = 35189 + const val PILLAR_OF_LIGHT_35190 = 35190 + const val PILLAR_OF_LIGHT_35191 = 35191 + const val PILLAR_OF_LIGHT_35192 = 35192 + const val PILLAR_OF_LIGHT_35193 = 35193 + const val PILLAR_OF_LIGHT_35194 = 35194 + const val PILLAR_OF_LIGHT_35195 = 35195 + const val PILLAR_OF_LIGHT_35196 = 35196 + const val PILLAR_OF_LIGHT_35197 = 35197 + const val PILLAR_OF_LIGHT_35198 = 35198 + const val PILLAR_OF_LIGHT_35199 = 35199 + const val PILLAR_OF_LIGHT_35200 = 35200 + const val PILLAR_OF_LIGHT_35201 = 35201 + const val PILLAR_OF_LIGHT_35202 = 35202 + const val PILLAR_OF_LIGHT_35203 = 35203 + const val PILLAR_OF_LIGHT_35204 = 35204 + const val PILLAR_OF_LIGHT_35205 = 35205 + const val PILLAR_OF_LIGHT_35206 = 35206 + const val PILLAR_OF_LIGHT_35207 = 35207 + const val PILLAR_OF_LIGHT_35208 = 35208 + const val PILLAR_OF_LIGHT_35209 = 35209 + const val PILLAR_OF_LIGHT_35210 = 35210 + const val PILLAR_OF_LIGHT_35211 = 35211 + const val PILLAR_OF_LIGHT_35221 = 35221 + const val PILLAR_OF_LIGHT_35222 = 35222 + const val PILLAR_OF_LIGHT_35223 = 35223 + const val PILLAR_OF_LIGHT_35224 = 35224 + const val PILLAR_OF_LIGHT_35225 = 35225 + const val PILLAR_OF_LIGHT_35226 = 35226 + const val PILLAR_OF_LIGHT_35227 = 35227 + const val PILLAR_OF_LIGHT_35228 = 35228 + const val PILLAR_OF_LIGHT_35229 = 35229 + const val PILLAR_OF_LIGHT_35230 = 35230 + const val PILLAR_OF_LIGHT_35231 = 35231 + const val PILLAR_OF_LIGHT_35232 = 35232 + const val PILLAR_OF_LIGHT_35233 = 35233 + const val PILLAR_OF_LIGHT_35234 = 35234 + const val PILLAR_OF_LIGHT_35235 = 35235 + const val PILLAR_OF_LIGHT_35236 = 35236 + const val PILLAR_OF_LIGHT_35237 = 35237 + const val PILLAR_OF_LIGHT_35238 = 35238 + const val PILLAR_OF_LIGHT_35239 = 35239 + const val PILLAR_OF_LIGHT_35240 = 35240 + const val PILLAR_OF_LIGHT_35241 = 35241 + const val PILLAR_OF_LIGHT_35242 = 35242 + const val PILLAR_OF_LIGHT_35243 = 35243 + const val PILLAR_OF_LIGHT_35244 = 35244 + const val PILLAR_OF_LIGHT_35245 = 35245 + const val PILLAR_OF_LIGHT_35246 = 35246 + const val PILLAR_OF_LIGHT_35247 = 35247 + const val PILLAR_OF_LIGHT_35248 = 35248 + const val PILLAR_OF_LIGHT_35249 = 35249 + const val PILLAR_OF_LIGHT_35250 = 35250 + const val PILLAR_OF_LIGHT_35251 = 35251 + const val PILLAR_OF_LIGHT_35252 = 35252 + const val PILLAR_OF_LIGHT_35257 = 35257 + const val PILLAR_OF_LIGHT_35258 = 35258 + const val PILLAR_OF_LIGHT_35261 = 35261 + const val PILLAR_OF_LIGHT_35266 = 35266 + const val PILLAR_OF_LIGHT_35267 = 35267 + const val PILLAR_OF_LIGHT_35272 = 35272 + const val PILLAR_OF_LIGHT_35273 = 35273 + const val PILLAR_OF_LIGHT_35274 = 35274 + const val PILLAR_OF_LIGHT_35275 = 35275 + const val PILLAR_OF_LIGHT_35276 = 35276 + const val PILLAR_OF_LIGHT_35277 = 35277 + const val PILLAR_OF_LIGHT_35278 = 35278 + const val PILLAR_OF_LIGHT_35283 = 35283 + const val PILLAR_OF_LIGHT_35284 = 35284 + const val PILLAR_OF_LIGHT_35285 = 35285 + const val PILLAR_OF_LIGHT_35286 = 35286 + const val PILLAR_OF_LIGHT_35287 = 35287 + const val PILLAR_OF_LIGHT_35288 = 35288 + const val PILLAR_OF_LIGHT_35289 = 35289 + const val PILLAR_OF_LIGHT_35290 = 35290 + const val PILLAR_OF_LIGHT_35291 = 35291 + const val PILLAR_OF_LIGHT_35292 = 35292 + const val PILLAR_OF_LIGHT_35293 = 35293 + const val PILLAR_OF_LIGHT_35300 = 35300 + const val PILLAR_OF_LIGHT_35301 = 35301 + const val PILLAR_OF_LIGHT_35302 = 35302 + const val PILLAR_OF_LIGHT_35305 = 35305 + const val PILLAR_OF_LIGHT_35306 = 35306 + const val PILLAR_OF_LIGHT_35311 = 35311 + const val PILLAR_OF_LIGHT_35312 = 35312 + const val PILLAR_OF_LIGHT_35313 = 35313 + const val PILLAR_OF_LIGHT_35314 = 35314 + const val PILLAR_OF_LIGHT_35317 = 35317 + const val PILLAR_OF_LIGHT_35322 = 35322 + const val PILLAR_OF_LIGHT_35323 = 35323 + const val PILLAR_OF_LIGHT_35330 = 35330 + const val PILLAR_OF_LIGHT_35331 = 35331 + const val STAIRS_35387 = 35387 + const val STAIRS_35388 = 35388 + const val STAIRS_35389 = 35389 + const val BOOKS_35434 = 35434 + const val BOOKS_35435 = 35435 + const val BOOKS_35436 = 35436 + const val STEPS_35437 = 35437 + const val STEPS_35438 = 35438 + const val BOOK_CART = 35439 + const val BOOK_CART_35440 = 35440 + const val BUST_35441 = 35441 + const val BUST_35442 = 35442 + const val BUST_35443 = 35443 + const val BUST_35444 = 35444 + const val BUST_35445 = 35445 + const val BUST_35446 = 35446 + const val BOOKS_35447 = 35447 + const val BOOKS_35448 = 35448 + const val SEAL_OF_CADARN = 35451 + const val SEAL_OF_CADARN_35452 = 35452 + const val SEAL_OF_CRWYS = 35453 + const val SEAL_OF_CRWYS_35454 = 35454 + const val SEAL_OF_AMLODD = 35455 + const val SEAL_OF_AMLODD_35456 = 35456 + const val SEAL_OF_HEFIN = 35457 + const val SEAL_OF_HEFIN_35458 = 35458 + const val SEAL_OF_IORWERTH = 35459 + const val SEAL_OF_IORWERTH_35460 = 35460 + const val SEAL_OF_ITHELL = 35461 + const val SEAL_OF_ITHELL_35462 = 35462 + const val SEAL_OF_MEILYR = 35463 + const val SEAL_OF_MEILYR_35464 = 35464 + const val SEAL_OF_TRAHAEARN = 35465 + const val SEAL_OF_TRAHAEARN_35466 = 35466 + const val SEAL_OF_THE_FORGOTTEN = 35467 + const val STAIRCASE_35791 = 35791 + const val STAIRCASE_35792 = 35792 + const val GRATE_35793 = 35793 + const val BROKEN_GRATE = 35794 + const val CELL_DOOR_35795 = 35795 + const val CABINET_35796 = 35796 + const val BED_35797 = 35797 + const val BED_35798 = 35798 + const val LADDER_35799 = 35799 + const val BARREL_35800 = 35800 + const val BARREL_35801 = 35801 + const val FISHING_NET_35802 = 35802 + const val FISHING_NET_35803 = 35803 + const val BARRICADE_35804 = 35804 + const val BARRICADE_35805 = 35805 + const val BARRICADE_35806 = 35806 + const val MOURNER_35807 = 35807 + const val MOURNER_35808 = 35808 + const val MOURNER_35809 = 35809 + const val FIRE_35810 = 35810 + const val FIRE_35811 = 35811 + const val FIRE_35812 = 35812 + const val TRAPDOOR_35815 = 35815 + const val LADDER_35816 = 35816 + const val KNIGHT_OF_ARDOUGNE_35817 = 35817 + const val MAN_35818 = 35818 + const val MAN_35819 = 35819 + const val MAN_35820 = 35820 + const val MAN_35821 = 35821 + const val MAN_35822 = 35822 + const val MAN_35823 = 35823 + const val WOMAN_35824 = 35824 + const val WOMAN_35825 = 35825 + const val WOMAN_35826 = 35826 + const val WOMAN_35827 = 35827 + const val WOMAN_35828 = 35828 + const val WOMAN_35829 = 35829 + const val FARMING_PATCH = 35830 + const val HERB = 35831 + const val HERB_35832 = 35832 + const val HERB_35833 = 35833 + const val HERB_35834 = 35834 + const val CLOSED_CHEST_35835 = 35835 + const val OPEN_CHEST_35836 = 35836 + const val WALL_35837 = 35837 + const val BLOCKED_CREVICE = 35838 + const val BLOCKED_CREVICE_35839 = 35839 + const val CREVICE_35840 = 35840 + const val CREVICE_35841 = 35841 + const val FLOWERS_35842 = 35842 + const val STONE_35843 = 35843 + const val STEPPING_STONE_35844 = 35844 + const val CAVE_35845 = 35845 + const val CAVE_35846 = 35846 + const val CAVE_35847 = 35847 + const val CHEST_35848 = 35848 + const val CHEST_35849 = 35849 + const val ROCKS_35853 = 35853 + const val ROCKS_35854 = 35854 + const val ROCK_35855 = 35855 + const val ROCK_35856 = 35856 + const val ROCK_35857 = 35857 + const val ROCK_35858 = 35858 + const val ROCKS_35859 = 35859 + const val ROCKS_35860 = 35860 + const val MUSHROOMS_35861 = 35861 + const val MUSHROOMS_35862 = 35862 + const val MUSHROOM_35863 = 35863 + const val MUSHROOM_35864 = 35864 + const val MUSHROOM_35865 = 35865 + const val MUSHROOM_35866 = 35866 + const val ELVEN_LAMP_35867 = 35867 + const val ELVEN_LAMP_35868 = 35868 + const val BROKEN_CART_35869 = 35869 + const val BROKEN_CART_35870 = 35870 + const val BARRICADE_35871 = 35871 + const val SACK_35872 = 35872 + const val TABLE_35873 = 35873 + const val BENCH_35874 = 35874 + const val COOKING_POTS_35875 = 35875 + const val COOKING_POTS_35876 = 35876 + const val COOKING_RANGE_35877 = 35877 + const val SYMBOL_35878 = 35878 + const val SYMBOL_35879 = 35879 + const val WELL_35881 = 35881 + const val BROKEN_WELL = 35882 + const val STATUE_SPACE_35883 = 35883 + const val STATUE_35884 = 35884 + const val DWARF_MULTICANNON_35885 = 35885 + const val DWARF_MULTICANNON_35886 = 35886 + const val HOLE_35887 = 35887 + const val HOLE_35888 = 35888 + const val HOLE_35889 = 35889 + const val CATAPULT_35890 = 35890 + const val CATAPULT_35891 = 35891 + const val PILLAR_OF_LIGHT_35892 = 35892 + const val PILLAR_OF_LIGHT_35893 = 35893 + const val PILLAR_OF_LIGHT_35894 = 35894 + const val TUNNEL_35896 = 35896 + const val BLOCKED_TUNNEL_35897 = 35897 + const val TUNNEL_35898 = 35898 + const val TUNNEL_35899 = 35899 + const val FRAGMENT_OF_SEREN_35900 = 35900 + const val FRAGMENT_OF_SEREN_35901 = 35901 + const val FIRE_35912 = 35912 + const val FIRE_35913 = 35913 + const val GRAVESTONE_35914 = 35914 + const val DAISIES_35915 = 35915 + const val DEAD_ELF = 35916 + const val DEAD_ELF_35917 = 35917 + const val DEAD_ELF_35918 = 35918 + const val DEAD_ELF_35919 = 35919 + const val DEAD_ELF_35920 = 35920 + const val DEAD_ELF_35921 = 35921 + const val DEAD_ELF_35922 = 35922 + const val DEAD_ELF_35923 = 35923 + const val DEAD_ELF_35924 = 35924 + const val DEAD_ELF_35925 = 35925 + const val DEAD_ELF_35926 = 35926 + const val DEAD_ELF_35927 = 35927 + const val DEAD_ELF_35928 = 35928 + const val DEAD_ELF_35929 = 35929 + const val DEAD_ELF_35930 = 35930 + const val DOOR_35931 = 35931 + const val DOOR_35932 = 35932 + const val DOOR_35933 = 35933 + const val DOOR_35934 = 35934 + const val DOOR_35935 = 35935 + const val DOOR_35936 = 35936 + const val DAIRY_CHURN_35937 = 35937 + const val ABANDONED_EQUIPMENT = 35938 + const val CRATE_35939 = 35939 + const val CAVE_35940 = 35940 + const val PIPE_35941 = 35941 + const val PIPE_35942 = 35942 + const val ORB_OF_LIGHT_35944 = 35944 + const val CAULDRON_35945 = 35945 + const val CAULDRON_35946 = 35946 + const val WATCHTOWER = 35947 + const val WATCHTOWER_35948 = 35948 + const val SPIRIT_TREE_35949 = 35949 + const val SPIRIT_TREE_35950 = 35950 + const val GRAIN_SACKS = 35954 + const val GRAIN_SACKS_35955 = 35955 + const val GRAIN_SACKS_35956 = 35956 + const val GRAIN_SACKS_35957 = 35957 + const val EMPTY_RACK_35958 = 35958 + const val DESK_35959 = 35959 + const val DESK_35960 = 35960 + const val CLOSED_CHEST_35961 = 35961 + const val OPEN_CHEST_35962 = 35962 + const val DESK_35963 = 35963 + const val CORRUPTED_SCEPTRE_35964 = 35964 + const val TELEPORT_PLATFORM = 35965 + const val SINGING_BOWL_35966 = 35966 + const val CORRUPT_DEPOSIT = 35967 + const val CORRUPT_DEPOSIT_DEPLETED = 35968 + const val PHREN_ROOTS = 35969 + const val PHREN_ROOTS_DEPLETED = 35970 + const val FISHING_SPOT_35971 = 35971 + const val FISHING_SPOT_DEPLETED = 35972 + const val GRYM_ROOT = 35973 + const val GRYM_ROOT_DEPLETED = 35974 + const val LINUM_TIRINUM_35975 = 35975 + const val LINUM_TIRINUM_DEPLETED = 35976 + const val TOOL_STORAGE = 35977 + const val CRYSTAL_SINGING_RECIPES = 35978 + const val EGNIOL_POTIONS = 35979 + const val RANGE_35980 = 35980 + const val WATER_PUMP_35981 = 35981 + const val BARRIER_35982 = 35982 + const val BARRIER_35983 = 35983 + const val TELEPORT_PLATFORM_35984 = 35984 + const val TELEPORT_PLATFORM_35985 = 35985 + const val THE_GAUNTLET = 35986 + const val REWARD_CHEST_35988 = 35988 + const val REWARD_CHEST_35989 = 35989 + const val ILLUMINATED_SYMBOL = 35992 + const val INACTIVE_SYMBOL = 35994 + const val NODE_35998 = 35998 + const val NODE_35999 = 35999 + const val SCOREBOARD_36060 = 36060 + const val CRYSTAL_SCEPTRE_36061 = 36061 + const val TELEPORT_PLATFORM_36062 = 36062 + const val SINGING_BOWL_36063 = 36063 + const val CRYSTAL_DEPOSIT = 36064 + const val CRYSTAL_DEPOSIT_DEPLETED = 36065 + const val PHREN_ROOTS_36066 = 36066 + const val PHREN_ROOTS_DEPLETED_36067 = 36067 + const val FISHING_SPOT_36068 = 36068 + const val FISHING_SPOT_DEPLETED_36069 = 36069 + const val GRYM_ROOT_36070 = 36070 + const val GRYM_ROOT_DEPLETED_36071 = 36071 + const val LINUM_TIRINUM_36072 = 36072 + const val LINUM_TIRINUM_DEPLETED_36073 = 36073 + const val TOOL_STORAGE_36074 = 36074 + const val CRYSTAL_SINGING_RECIPES_36075 = 36075 + const val EGNIOL_POTIONS_36076 = 36076 + const val RANGE_36077 = 36077 + const val WATER_PUMP_36078 = 36078 + const val BARRIER_36079 = 36079 + const val BARRIER_36080 = 36080 + const val GAUNTLET_PORTAL = 36081 + const val TELEPORT_PLATFORM_36082 = 36082 + const val THE_GAUNTLET_36083 = 36083 + const val THE_GAUNTLET_36084 = 36084 + const val BANK_DEPOSIT_BOX_36086 = 36086 + const val REWARD_CHEST_36087 = 36087 + const val REWARD_CHEST_36088 = 36088 + const val ILLUMINATED_SYMBOL_36095 = 36095 + const val INACTIVE_SYMBOL_36097 = 36097 + const val NODE_36101 = 36101 + const val NODE_36102 = 36102 + const val ROCK_FORMATION_GLOWING = 36192 + const val ROCK_FORMATION = 36193 + const val ROCK_FORMATION_DEPLETED = 36194 + const val FURNACE_36195 = 36195 + const val ALTAR_36196 = 36196 + const val TELEPORT_PLATFORM_36197 = 36197 + const val TELEPORT_PLATFORM_36198 = 36198 + const val DEMONIC_SYMBOL = 36199 + const val DEMONIC_SYMBOL_36200 = 36200 + const val BARRIER_36201 = 36201 + const val ROCKS_36202 = 36202 + const val ROCKS_36203 = 36203 + const val ROCKS_36204 = 36204 + const val ROCKS_36205 = 36205 + const val ROCKS_36206 = 36206 + const val ROCKS_36207 = 36207 + const val ROCKS_36208 = 36208 + const val ROCKS_36209 = 36209 + const val ROCKS_36210 = 36210 + const val STEPS_36215 = 36215 + const val CRYSTAL_OUTCROP_36217 = 36217 + const val CRYSTAL_OUTCROP_36218 = 36218 + const val MINE_CART_36219 = 36219 + const val LADDER_36221 = 36221 + const val TIGHTROPE_36225 = 36225 + const val CHIMNEY_36227 = 36227 + const val ROOF_EDGE = 36228 + const val DARK_HOLE_36229 = 36229 + const val LADDER_36231 = 36231 + const val LADDER_36232 = 36232 + const val ROPE_BRIDGE_36233 = 36233 + const val TIGHTROPE_36234 = 36234 + const val ROPE_BRIDGE_36235 = 36235 + const val TIGHTROPE_36236 = 36236 + const val TIGHTROPE_36237 = 36237 + const val DARK_HOLE_36238 = 36238 + const val PORTAL_36240 = 36240 + const val DOOR_36253 = 36253 + const val DOOR_36254 = 36254 + const val CRYSTAL_STAIRCASE = 36387 + const val CRYSTAL_STAIRCASE_36390 = 36390 + const val TELEPORT_PLATFORM_36490 = 36490 + const val MEMORIAM_DEVICE = 36491 + const val ELVEN_LAMP_36492 = 36492 + const val CRYSTAL_SPIRE = 36493 + const val BENCH_36494 = 36494 + const val STAFF_BARREL = 36495 + const val WAND_RACK = 36496 + const val DISPLAY_CASE_36497 = 36497 + const val SHOP_COUNTER_36498 = 36498 + const val SCROLL_36499 = 36499 + const val SCROLL_36500 = 36500 + const val SIGN_36501 = 36501 + const val SHELVES_36502 = 36502 + const val SHELVES_36503 = 36503 + const val SHELVES_36504 = 36504 + const val SHELVES_36505 = 36505 + const val RUNE_POUCHES = 36506 + const val CITY_GATE_36518 = 36518 + const val CITY_GATE_36519 = 36519 + const val CITY_GATE_36520 = 36520 + const val CITY_GATE_36521 = 36521 + const val CITY_GATE_36522 = 36522 + const val CITY_GATE_36523 = 36523 + const val SINGING_BOWL_36552 = 36552 + const val BELL_36553 = 36553 + const val BELL_MECHANISM_36554 = 36554 + const val FURNACE_36555 = 36555 + const val CAVE_ENTRANCE_36556 = 36556 + const val CLOSED_CHEST_36557 = 36557 + const val CHEST_36558 = 36558 + const val BANK_BOOTH_36559 = 36559 + const val CLOSED_BANK_BOOTH_36560 = 36560 + const val ARMOUR_STAND_36561 = 36561 + const val SAND_PIT_36563 = 36563 + const val TABLE_36564 = 36564 + const val DUMMY_36566 = 36566 + const val TABLE_SAW = 36567 + const val MARKET_STALL_36568 = 36568 + const val SILK_STALL_36569 = 36569 + const val SILVER_STALL_36570 = 36570 + const val GEM_STALL_36571 = 36571 + const val SPICE_STALL_36572 = 36572 + const val AMLODD_BANNER = 36573 + const val CADARN_BANNER = 36574 + const val CRWYS_BANNER = 36575 + const val HEFIN_BANNER = 36576 + const val IORWERTH_BANNER = 36577 + const val ITHELL_BANNER = 36578 + const val MEILYR_BANNER = 36579 + const val TRAHAEARN_BANNER = 36580 + const val ELVEN_CRYSTAL_CHEST = 36581 + const val ELVEN_CRYSTAL_CHEST_36582 = 36582 + const val SAILS_36583 = 36583 + const val MILL_36586 = 36586 + const val MILL_36587 = 36587 + const val MILL_36588 = 36588 + const val MILL_36589 = 36589 + const val FLOUR_BIN_36590 = 36590 + const val HOPPER_36591 = 36591 + const val HOPPER_CONTROLS_36592 = 36592 + const val CENOTAPH = 36593 + const val CORPSES = 36594 + const val STATUE_36595 = 36595 + const val STATUE_36596 = 36596 + const val STEPS_36597 = 36597 + const val CAVE_36598 = 36598 + const val SIGN_36600 = 36600 + const val CRYSTAL_OUTCROP_36604 = 36604 + const val BUSH_36605 = 36605 + const val COOKING_POTS_36606 = 36606 + const val ROCK_36607 = 36607 + const val BOOKCASE_36608 = 36608 + const val FLAGPOLE_36609 = 36609 + const val CHAIR_36610 = 36610 + const val DESK_36611 = 36611 + const val STOOL_36612 = 36612 + const val STOOL_36613 = 36613 + const val TELEPORT_PLATFORM_36614 = 36614 + const val TELEPORT_PLATFORM_36615 = 36615 + const val BOOKCASE_36616 = 36616 + const val BOOKCASE_36617 = 36617 + const val BOOKCASE_36618 = 36618 + const val BOOKCASE_36623 = 36623 + const val BOOKCASE_36624 = 36624 + const val BOOKCASE_36625 = 36625 + const val BOOKCASE_36626 = 36626 + const val BOOKCASE_36627 = 36627 + const val BOOKCASE_36628 = 36628 + const val BOOKCASE_36629 = 36629 + const val BOOKCASE_36630 = 36630 + const val BOOKCASE_36631 = 36631 + const val BOOKCASE_36632 = 36632 + const val BOOKCASE_36633 = 36633 + const val BOOKCASE_36634 = 36634 + const val BOOKCASE_36635 = 36635 + const val BOOKCASE_36636 = 36636 + const val BOOKCASE_36637 = 36637 + const val BOOKCASE_36638 = 36638 + const val BOOKCASE_36639 = 36639 + const val BOOKCASE_36640 = 36640 + const val BOOKCASE_36641 = 36641 + const val BOOKCASE_36642 = 36642 + const val BOOKCASE_36643 = 36643 + const val BOOKCASE_36644 = 36644 + const val BOOKCASE_36645 = 36645 + const val BOOKCASE_36646 = 36646 + const val BOOKCASE_36647 = 36647 + const val BOOKCASE_36648 = 36648 + const val BOOKCASE_36649 = 36649 + const val BOOKCASE_36650 = 36650 + const val BOOKCASE_36651 = 36651 + const val BOOKCASE_36652 = 36652 + const val BOOKCASE_36653 = 36653 + const val BOOKCASE_36654 = 36654 + const val BOOKS_36660 = 36660 + const val BOOKS_36661 = 36661 + const val BOOKS_36662 = 36662 + const val BOOK_CART_36663 = 36663 + const val BOOK_CART_36664 = 36664 + const val BOOK_CART_36665 = 36665 + const val BUST_36666 = 36666 + const val BUST_36667 = 36667 + const val BUST_36668 = 36668 + const val BUST_36669 = 36669 + const val BUST_36670 = 36670 + const val BUST_36671 = 36671 + const val TREE_36672 = 36672 + const val TREE_STUMP_36673 = 36673 + const val TREE_36674 = 36674 + const val TREE_STUMP_36675 = 36675 + const val TREE_36676 = 36676 + const val TREE_36677 = 36677 + const val TREE_STUMP_36678 = 36678 + const val TREE_36679 = 36679 + const val TREE_STUMP_36680 = 36680 + const val MAPLE_TREE_36681 = 36681 + const val MAPLE_TREE_36682 = 36682 + const val YEW_36683 = 36683 + const val TREE_STUMP_36684 = 36684 + const val MAGIC_TREE_36685 = 36685 + const val TEAK_36686 = 36686 + const val TREE_STUMP_36687 = 36687 + const val MAHOGANY_36688 = 36688 + const val TREE_STUMP_36689 = 36689 + const val CAVE_36690 = 36690 + const val STEPS_36691 = 36691 + const val TIGHT_GAP = 36692 + const val TIGHT_GAP_36693 = 36693 + const val TIGHT_GAP_36694 = 36694 + const val TIGHT_GAP_36695 = 36695 + const val EYE_36698 = 36698 + const val RANGE_36699 = 36699 + const val CRYSTAL_SINGING_RECIPES_37344 = 37344 + const val ARCHERY_TARGET_37345 = 37345 + const val BANNER_37346 = 37346 + const val BARREL_37347 = 37347 + const val LECTERN_37349 = 37349 + const val HULL_37350 = 37350 + const val LEAK_37351 = 37351 + const val REPAIRED_LEAK = 37352 + const val BOOKS_37380 = 37380 + const val NOTICEBOARD_37381 = 37381 + const val SUPPLY_CHEST = 37382 + const val SUPPLY_CHEST_37383 = 37383 + const val HOUSE_ADVERTISEMENT_37384 = 37384 + const val HOUSE_ADVERTISEMENT_37385 = 37385 + const val HOUSE_ADVERTISEMENT_37386 = 37386 + const val HOUSE_ADVERTISEMENT_37387 = 37387 + const val HOUSE_ADVERTISEMENT_37388 = 37388 + const val HOUSE_ADVERTISEMENT_37389 = 37389 + const val HOUSE_ADVERTISEMENT_37390 = 37390 + const val SAND_PIT_37391 = 37391 + const val SAND_PIT_37392 = 37392 + const val ROCKSLIDE_37395 = 37395 + const val ROCKSLIDE_37396 = 37396 + const val BOXES_37397 = 37397 + const val BOXES_37398 = 37398 + const val BOXES_37399 = 37399 + const val SMALL_GEYSER_37400 = 37400 + const val SMALL_GEYSER_37401 = 37401 + const val LARGE_GEYSER_37402 = 37402 + const val LARGE_GEYSER_37403 = 37403 + const val FISH_STALL_37404 = 37404 + const val FUR_STALL_37405 = 37405 + const val FREMENNIK_BOAT_37406 = 37406 + const val FREMENNIK_BOAT_37407 = 37407 + const val FREMENNIK_BOAT_37408 = 37408 + const val CAVE_37409 = 37409 + const val CAVE_37410 = 37410 + const val STEPS_37411 = 37411 + const val STEPS_37417 = 37417 + const val STEPS_37418 = 37418 + const val DOOR_37421 = 37421 + const val DOOR_37422 = 37422 + const val THE_JORMUNGAND_37424 = 37424 + const val ROUGH_WALL_37431 = 37431 + const val STREAK_INFO = 37434 + const val SWAMPY_SINK = 37435 + const val DOOR_HOTSPOT_37436 = 37436 + const val DOOR_HOTSPOT_37437 = 37437 + const val WINDOW_SPACE_37438 = 37438 + const val SHUTTERED_WINDOW_37441 = 37441 + const val DECORATIVE_WINDOW_37442 = 37442 + const val STAINEDGLASS_WINDOW_37443 = 37443 + const val LOG_PILE_37444 = 37444 + const val SHUTTERED_WINDOW_37445 = 37445 + const val DECORATIVE_WINDOW_37446 = 37446 + const val STAINEDGLASS_WINDOW_37447 = 37447 + const val DECORATIVE_WINDOW_37448 = 37448 + const val STAINEDGLASS_WINDOW_37449 = 37449 + const val DECORATIVE_WINDOW_37450 = 37450 + const val DECORATIVE_WINDOW_37451 = 37451 + const val STAINEDGLASS_WINDOW_37452 = 37452 + const val DECORATIVE_WINDOW_37453 = 37453 + const val STAINEDGLASS_WINDOW_37454 = 37454 + const val DOOR_37455 = 37455 + const val DOOR_37456 = 37456 + const val DOOR_37457 = 37457 + const val STAINEDGLASS_WINDOW_37458 = 37458 + const val DECORATIVE_WINDOW_37459 = 37459 + const val STAINEDGLASS_WINDOW_37460 = 37460 + const val DECORATIVE_WINDOW_37461 = 37461 + const val STAINEDGLASS_WINDOW_37462 = 37462 + const val DOOR_37463 = 37463 + const val DOOR_37464 = 37464 + const val DOOR_37465 = 37465 + const val DOOR_37466 = 37466 + const val LEAGUE_FIRSTS_BOARD = 37482 + const val DRAGON_TROPHY_DISPLAY = 37483 + const val DRAGON_TROPHY_DISPLAY_37484 = 37484 + const val DRAGON_TROPHY_DISPLAY_37485 = 37485 + const val DRAGON_TROPHY_DISPLAY_37486 = 37486 + const val DRAGON_TROPHY_DISPLAY_37487 = 37487 + const val DRAGON_TROPHY_DISPLAY_37488 = 37488 + const val DRAGON_TROPHY_DISPLAY_37489 = 37489 + const val BASIC_JEWELLERY_BOX_37492 = 37492 + const val BASIC_JEWELLERY_BOX_37493 = 37493 + const val BASIC_JEWELLERY_BOX_37494 = 37494 + const val BASIC_JEWELLERY_BOX_37495 = 37495 + const val BASIC_JEWELLERY_BOX_37496 = 37496 + const val BASIC_JEWELLERY_BOX_37497 = 37497 + const val BASIC_JEWELLERY_BOX_37498 = 37498 + const val BASIC_JEWELLERY_BOX_37499 = 37499 + const val BASIC_JEWELLERY_BOX_37500 = 37500 + const val FANCY_JEWELLERY_BOX_37501 = 37501 + const val FANCY_JEWELLERY_BOX_37502 = 37502 + const val FANCY_JEWELLERY_BOX_37503 = 37503 + const val FANCY_JEWELLERY_BOX_37504 = 37504 + const val FANCY_JEWELLERY_BOX_37505 = 37505 + const val FANCY_JEWELLERY_BOX_37506 = 37506 + const val FANCY_JEWELLERY_BOX_37507 = 37507 + const val FANCY_JEWELLERY_BOX_37508 = 37508 + const val FANCY_JEWELLERY_BOX_37509 = 37509 + const val FANCY_JEWELLERY_BOX_37510 = 37510 + const val FANCY_JEWELLERY_BOX_37511 = 37511 + const val FANCY_JEWELLERY_BOX_37512 = 37512 + const val FANCY_JEWELLERY_BOX_37513 = 37513 + const val FANCY_JEWELLERY_BOX_37514 = 37514 + const val FANCY_JEWELLERY_BOX_37515 = 37515 + const val FANCY_JEWELLERY_BOX_37516 = 37516 + const val FANCY_JEWELLERY_BOX_37517 = 37517 + const val FANCY_JEWELLERY_BOX_37518 = 37518 + const val FANCY_JEWELLERY_BOX_37519 = 37519 + const val ORNATE_JEWELLERY_BOX_37520 = 37520 + const val ORNATE_JEWELLERY_BOX_37521 = 37521 + const val ORNATE_JEWELLERY_BOX_37522 = 37522 + const val ORNATE_JEWELLERY_BOX_37523 = 37523 + const val ORNATE_JEWELLERY_BOX_37524 = 37524 + const val ORNATE_JEWELLERY_BOX_37525 = 37525 + const val ORNATE_JEWELLERY_BOX_37526 = 37526 + const val ORNATE_JEWELLERY_BOX_37527 = 37527 + const val ORNATE_JEWELLERY_BOX_37528 = 37528 + const val ORNATE_JEWELLERY_BOX_37529 = 37529 + const val ORNATE_JEWELLERY_BOX_37530 = 37530 + const val ORNATE_JEWELLERY_BOX_37531 = 37531 + const val ORNATE_JEWELLERY_BOX_37532 = 37532 + const val ORNATE_JEWELLERY_BOX_37533 = 37533 + const val ORNATE_JEWELLERY_BOX_37534 = 37534 + const val ORNATE_JEWELLERY_BOX_37535 = 37535 + const val ORNATE_JEWELLERY_BOX_37536 = 37536 + const val ORNATE_JEWELLERY_BOX_37537 = 37537 + const val ORNATE_JEWELLERY_BOX_37538 = 37538 + const val ORNATE_JEWELLERY_BOX_37539 = 37539 + const val ORNATE_JEWELLERY_BOX_37540 = 37540 + const val ORNATE_JEWELLERY_BOX_37541 = 37541 + const val ORNATE_JEWELLERY_BOX_37542 = 37542 + const val ORNATE_JEWELLERY_BOX_37543 = 37543 + const val ORNATE_JEWELLERY_BOX_37544 = 37544 + const val ORNATE_JEWELLERY_BOX_37545 = 37545 + const val ORNATE_JEWELLERY_BOX_37546 = 37546 + const val PORTAL_NEXUS_37547 = 37547 + const val PORTAL_NEXUS_37548 = 37548 + const val PORTAL_NEXUS_37549 = 37549 + const val PORTAL_NEXUS_37550 = 37550 + const val PORTAL_NEXUS_37551 = 37551 + const val PORTAL_NEXUS_37552 = 37552 + const val PORTAL_NEXUS_37553 = 37553 + const val PORTAL_NEXUS_37554 = 37554 + const val PORTAL_NEXUS_37555 = 37555 + const val PORTAL_NEXUS_37556 = 37556 + const val PORTAL_NEXUS_37557 = 37557 + const val PORTAL_NEXUS_37558 = 37558 + const val PORTAL_NEXUS_37559 = 37559 + const val PORTAL_NEXUS_37560 = 37560 + const val PORTAL_NEXUS_37561 = 37561 + const val PORTAL_NEXUS_37562 = 37562 + const val PORTAL_NEXUS_37563 = 37563 + const val PORTAL_NEXUS_37564 = 37564 + const val PORTAL_NEXUS_37565 = 37565 + const val PORTAL_NEXUS_37566 = 37566 + const val PORTAL_NEXUS_37567 = 37567 + const val PORTAL_NEXUS_37568 = 37568 + const val PORTAL_NEXUS_37569 = 37569 + const val PORTAL_NEXUS_37570 = 37570 + const val PORTAL_NEXUS_37571 = 37571 + const val PORTAL_NEXUS_37572 = 37572 + const val PORTAL_NEXUS_37573 = 37573 + const val PORTAL_NEXUS_37574 = 37574 + const val PORTAL_NEXUS_37575 = 37575 + const val PORTAL_NEXUS_37576 = 37576 + const val PORTAL_NEXUS_37577 = 37577 + const val PORTAL_NEXUS_37578 = 37578 + const val PORTAL_NEXUS_37579 = 37579 + const val PORTAL_NEXUS_37580 = 37580 + const val WEISS_PORTAL = 37581 + const val LUMBRIDGE_GRAVEYARD_PORTAL = 37582 + const val DRAYNOR_MANOR_PORTAL = 37583 + const val BATTLEFRONT_PORTAL = 37584 + const val MIND_ALTAR_PORTAL = 37585 + const val SALVE_GRAVEYARD_PORTAL = 37586 + const val FENKENSTRAINS_CASTLE_PORTAL = 37587 + const val WEST_ARDOUGNE_PORTAL = 37588 + const val HARMONY_ISLAND_PORTAL = 37589 + const val CEMETERY_PORTAL = 37590 + const val BARROWS_PORTAL = 37591 + const val APE_ATOLL_DUNGEON_PORTAL = 37592 + const val WEISS_PORTAL_37593 = 37593 + const val LUMBRIDGE_GRAVEYARD_PORTAL_37594 = 37594 + const val DRAYNOR_MANOR_PORTAL_37595 = 37595 + const val BATTLEFRONT_PORTAL_37596 = 37596 + const val MIND_ALTAR_PORTAL_37597 = 37597 + const val SALVE_GRAVEYARD_PORTAL_37598 = 37598 + const val FENKENSTRAINS_CASTLE_PORTAL_37599 = 37599 + const val WEST_ARDOUGNE_PORTAL_37600 = 37600 + const val HARMONY_ISLAND_PORTAL_37601 = 37601 + const val CEMETERY_PORTAL_37602 = 37602 + const val BARROWS_PORTAL_37603 = 37603 + const val APE_ATOLL_DUNGEON_PORTAL_37604 = 37604 + const val WEISS_PORTAL_37605 = 37605 + const val LUMBRIDGE_GRAVEYARD_PORTAL_37606 = 37606 + const val DRAYNOR_MANOR_PORTAL_37607 = 37607 + const val BATTLEFRONT_PORTAL_37608 = 37608 + const val MIND_ALTAR_PORTAL_37609 = 37609 + const val SALVE_GRAVEYARD_PORTAL_37610 = 37610 + const val FENKENSTRAINS_CASTLE_PORTAL_37611 = 37611 + const val WEST_ARDOUGNE_PORTAL_37612 = 37612 + const val HARMONY_ISLAND_PORTAL_37613 = 37613 + const val CEMETERY_PORTAL_37614 = 37614 + const val BARROWS_PORTAL_37615 = 37615 + const val APE_ATOLL_DUNGEON_PORTAL_37616 = 37616 + const val DOOR_HOTSPOT_37617 = 37617 + const val DOOR_HOTSPOT_37618 = 37618 + const val WINDOW_SPACE_37619 = 37619 + const val SPICE_RACK_37620 = 37620 + const val SPICE_RACK_37621 = 37621 + const val THRONE_37622 = 37622 + const val NIGHTMARE_DISPLAY = 37629 + const val NIGHTMARE_TOPIARY = 37630 + const val SUPPLIES_37631 = 37631 + const val BOOKCASE_37725 = 37725 + const val BANNER_37726 = 37726 + const val BOOKCASE_37727 = 37727 + const val RANGE_37728 = 37728 + const val TELESCOPE_37729 = 37729 + const val ENERGY_BARRIER_37730 = 37730 + const val ENERGY_BARRIER_37731 = 37731 + const val SPORE = 37738 + const val SPORE_37739 = 37739 + const val NIGHTMARE_BERRIES = 37740 + const val NIGHTMARE_BERRIES_37741 = 37741 + const val NIGHTMARE_BERRIES_37742 = 37742 + const val NIGHTMARE_BLOSSOM = 37743 + const val NIGHTMARE_BLOSSOM_37744 = 37744 + const val NIGHTMARE_BLOSSOM_37745 = 37745 + const val STATUE_37818 = 37818 + const val STATUE_37819 = 37819 + const val STATUE_37823 = 37823 + const val STATUE_37824 = 37824 + const val STONE_POOL = 37825 + const val BRAZIER_37826 = 37826 + const val CRATE_37827 = 37827 + const val TABLE_37828 = 37828 + const val TABLE_37829 = 37829 + const val TABLE_37830 = 37830 + const val STAIRS_37831 = 37831 + const val STAIRS_37832 = 37832 + const val STAIRS_37833 = 37833 + const val CANDLES_37834 = 37834 + const val STAIRS_37835 = 37835 + const val STAIRS_37836 = 37836 + const val TABLE_37839 = 37839 + const val BENCH_37840 = 37840 + const val BENCH_37841 = 37841 + const val STATUE_37842 = 37842 + const val STATUE_37843 = 37843 + const val CHEST_37844 = 37844 + const val BIG_CHEST = 37845 + const val COFFIN_37849 = 37849 + const val COFFIN_37850 = 37850 + const val BROKEN_CHAIN = 37852 + const val CHAINS = 37853 + const val NIGHTMARE = 37866 + const val TOTEM_37882 = 37882 + const val CRATE_37936 = 37936 + const val DOOR_37937 = 37937 + const val DOOR_37938 = 37938 + const val NAVIGATORS_TABLE = 37939 + const val DOOR_37940 = 37940 + const val DOOR_37941 = 37941 + const val LADDER_37942 = 37942 + const val LADDER_37943 = 37943 + const val ROCKS_37944 = 37944 + const val ROCKS_37945 = 37945 + const val ROCKS_37946 = 37946 + const val FURNACE_37947 = 37947 + const val GATE_37948 = 37948 + const val SCOREBOARD_37949 = 37949 + const val COFFIN_37951 = 37951 + const val GATE_37952 = 37952 + const val GATE_37953 = 37953 + const val GATE_37954 = 37954 + const val LADDER_37955 = 37955 + const val LADDER_37956 = 37956 + const val HANDY_PORTAL = 37957 + const val BANK_BOOTH_37959 = 37959 + const val DOOR_37961 = 37961 + const val DOOR_37963 = 37963 + const val DOOR_37964 = 37964 + const val TREE_37965 = 37965 + const val TREE_37966 = 37966 + const val TREE_37967 = 37967 + const val TREE_37968 = 37968 + const val OAK_37969 = 37969 + const val OAK_37970 = 37970 + const val TREE_37971 = 37971 + const val TREE_37972 = 37972 + const val TREE_37973 = 37973 + const val TREE_37974 = 37974 + const val TREE_37975 = 37975 + const val MASSIVE_STORAGE_UNIT_37978 = 37978 + const val BARREL_37979 = 37979 + const val BARREL_37980 = 37980 + const val STAIRS_37981 = 37981 + const val LAB_TABLE_37982 = 37982 + const val LAB_TABLE_37983 = 37983 + const val BROKEN_TABLE_37984 = 37984 + const val SKELETON_37985 = 37985 + const val CLOSED_CHEST_37986 = 37986 + const val OPEN_CHEST_37987 = 37987 + const val CLOSED_CHEST_37988 = 37988 + const val BLISTERWOOD_TREE = 37989 + const val STRANGE_POOL = 37990 + const val ACID_POOL_37991 = 37991 + const val GATE_37992 = 37992 + const val GATE_37993 = 37993 + const val MAGICAL_FIRE_37994 = 37994 + const val MAGICAL_FIRE_37995 = 37995 + const val MAGICAL_FIRE_37996 = 37996 + const val VALVE_37997 = 37997 + const val VALVE_37998 = 37998 + const val SHELVES_37999 = 37999 + const val ENERGY_BARRIER_38000 = 38000 + const val ENERGY_BARRIER_38001 = 38001 + const val ENERGY_BARRIER_38002 = 38002 + const val ENERGY_BARRIER_38003 = 38003 + const val SWAMP_TREE_BRANCH_38004 = 38004 + const val SWAMP_TREE_BRANCH_38005 = 38005 + const val PATH_38006 = 38006 + const val PATH_38007 = 38007 + const val PATH_38008 = 38008 + const val PATH_38009 = 38009 + const val PATH_38010 = 38010 + const val PATH_38011 = 38011 + const val CELL_DOOR_38012 = 38012 + const val CELL_DOOR_38013 = 38013 + const val CELL_DOOR_38014 = 38014 + const val BLOOD_ORB = 38015 + const val CAVE_38016 = 38016 + const val BOOKSHELF_38017 = 38017 + const val BOOKSHELF_38018 = 38018 + const val BOOKSHELF_38019 = 38019 + const val CAGE_38029 = 38029 + const val CAGE_38030 = 38030 + const val CAGE_38031 = 38031 + const val CAGE_38032 = 38032 + const val RESTRAINING_TABLE = 38034 + const val RESTRAINT_TABLE = 38035 + const val EQUIPMENT_TABLE = 38036 + const val BROKEN_EQUIPMENT_TABLE = 38037 + const val BROKEN_RANGE = 38038 + const val COFFIN_38039 = 38039 + const val COFFIN_38040 = 38040 + const val RAISED_COFFIN = 38041 + const val GRAVESTONE_38042 = 38042 + const val GRAVESTONE_38043 = 38043 + const val MYSTERIOUS_RUINS_38044 = 38044 + const val GRAVE_38049 = 38049 + const val GRAVESTONE_38050 = 38050 + const val GRAVESTONE_38051 = 38051 + const val GRAVESTONE_38052 = 38052 + const val GRAVESTONE_38053 = 38053 + const val GRAVESTONE_38054 = 38054 + const val GRAVESTONE_38055 = 38055 + const val GRAVESTONE_38056 = 38056 + const val MAUSOLEUM_DOOR = 38062 + const val MAUSOLEUM_DOOR_38069 = 38069 + const val MAUSOLEUM_DOOR_38070 = 38070 + const val MAUSOLEUM_DOOR_38071 = 38071 + const val MAUSOLEUM_DOOR_38072 = 38072 + const val COFFIN_38073 = 38073 + const val PLANT_38083 = 38083 + const val PLANT_38088 = 38088 + const val BOAT_38089 = 38089 + const val SKELETON_38091 = 38091 + const val MUD_MOUND = 38092 + const val CAVE_ENTRANCE_38093 = 38093 + const val CAVE_ENTRANCE_38094 = 38094 + const val CRATE_38095 = 38095 + const val CRATE_38096 = 38096 + const val LADDER_38097 = 38097 + const val FISH_38381 = 38381 + const val WIZARD_STATUE = 38409 + const val WIZARD_STATUE_38410 = 38410 + const val WIZARD_STATUE_38411 = 38411 + const val WIZARD_STATUE_38412 = 38412 + const val WIZARD_STATUE_38413 = 38413 + const val WIZARD_STATUE_38414 = 38414 + const val WIZARD_STATUE_38415 = 38415 + const val WIZARD_STATUE_38416 = 38416 + const val WIZARD_STATUE_38417 = 38417 + const val WIZARD_STATUE_38418 = 38418 + const val WIZARD_STATUE_38419 = 38419 + const val WIZARD_STATUE_38420 = 38420 + const val WIZARD_STATUE_38421 = 38421 + const val WIZARD_STATUE_38422 = 38422 + const val WIZARD_STATUE_38423 = 38423 + const val WIZARD_STATUE_38424 = 38424 + const val WIZARD_STATUE_38425 = 38425 + const val DEATHS_DOMAIN = 38426 + const val FIRE_38427 = 38427 + const val KNIGHT_STATUE = 38428 + const val KNIGHT_STATUE_38429 = 38429 + const val KNIGHT_STATUE_38430 = 38430 + const val KNIGHT_STATUE_38431 = 38431 + const val KNIGHT_STATUE_38432 = 38432 + const val KNIGHT_STATUE_38433 = 38433 + const val KNIGHT_STATUE_38434 = 38434 + const val KNIGHT_STATUE_38435 = 38435 + const val KNIGHT_STATUE_38436 = 38436 + const val KNIGHT_STATUE_38437 = 38437 + const val KNIGHT_STATUE_38438 = 38438 + const val KNIGHT_STATUE_38439 = 38439 + const val KNIGHT_STATUE_38440 = 38440 + const val KNIGHT_STATUE_38441 = 38441 + const val KNIGHT_STATUE_38442 = 38442 + const val KNIGHT_STATUE_38443 = 38443 + const val CROSSBOWMAN_STATUE = 38444 + const val CROSSBOWMAN_STATUE_38445 = 38445 + const val CROSSBOWMAN_STATUE_38446 = 38446 + const val STRANGE_TILE = 38447 + const val STRANGE_TILE_38448 = 38448 + const val PRIEST_STATUE = 38449 + const val PRIEST_STATUE_38450 = 38450 + const val MAGICAL_OBELISK = 38451 + const val STAIRS_38452 = 38452 + const val STAIRS_38453 = 38453 + const val STAIRS_38454 = 38454 + const val PLATFORM_38455 = 38455 + const val PLATFORM_38456 = 38456 + const val PLATFORM_38457 = 38457 + const val PLATFORM_38458 = 38458 + const val PLATFORM_38459 = 38459 + const val GATE_38460 = 38460 + const val STAIRS_38461 = 38461 + const val STAIRS_38462 = 38462 + const val STAIRS_38463 = 38463 + const val STAIRS_38464 = 38464 + const val STAIRS_38465 = 38465 + const val STAIRS_38466 = 38466 + const val STAIRS_38467 = 38467 + const val STAIRS_38468 = 38468 + const val STAIRS_38469 = 38469 + const val PLATFORM_38470 = 38470 + const val STAIRS_38471 = 38471 + const val STAIRS_38472 = 38472 + const val STAIRS_38473 = 38473 + const val STAIRS_38474 = 38474 + const val STAIRS_38475 = 38475 + const val STAIRS_38476 = 38476 + const val PLATFORM_38477 = 38477 + const val STAIRS_38478 = 38478 + const val SKELETON_38479 = 38479 + const val URN_38480 = 38480 + const val URN_38481 = 38481 + const val URN_38482 = 38482 + const val URN_38483 = 38483 + const val URN_38484 = 38484 + const val URN_38485 = 38485 + const val URN_38486 = 38486 + const val URN_38487 = 38487 + const val URN_38488 = 38488 + const val URN_38489 = 38489 + const val URN_38490 = 38490 + const val URN_38491 = 38491 + const val METAL_STAND = 38492 + const val METAL_STAND_38493 = 38493 + const val GILDED_STAND = 38494 + const val GILDED_STAND_38495 = 38495 + const val TORCH_38512 = 38512 + const val TORCH_38513 = 38513 + const val TORCH_38514 = 38514 + const val ANCIENT_BOOKS = 38515 + const val ANCIENT_BOOKS_38516 = 38516 + const val ANCIENT_BOOKS_38517 = 38517 + const val ANCIENT_BOOKS_38518 = 38518 + const val STONE_CHEST_38519 = 38519 + const val ICYENE_STATUE = 38521 + const val ICYENE_STATUE_38522 = 38522 + const val LION_STATUE = 38523 + const val LION_STATUE_38524 = 38524 + const val LION_STATUE_38525 = 38525 + const val LION_STATUE_38526 = 38526 + const val LION_STATUE_38527 = 38527 + const val LION_STATUE_38528 = 38528 + const val LION_STATUE_38529 = 38529 + const val WOLF_STATUE = 38530 + const val WOLF_STATUE_38531 = 38531 + const val WOLF_STATUE_38532 = 38532 + const val WOLF_STATUE_38533 = 38533 + const val WOLF_STATUE_38534 = 38534 + const val WOLF_STATUE_38535 = 38535 + const val WOLF_STATUE_38536 = 38536 + const val UNICORN_STATUE = 38537 + const val UNICORN_STATUE_38538 = 38538 + const val UNICORN_STATUE_38539 = 38539 + const val UNICORN_STATUE_38540 = 38540 + const val OWL_STATUE = 38541 + const val OWL_STATUE_38542 = 38542 + const val OWL_STATUE_38543 = 38543 + const val OWL_STATUE_38544 = 38544 + const val JUSTICIAR_STATUE = 38545 + const val JUSTICIAR_STATUE_38546 = 38546 + const val JUSTICIAR_STATUE_38547 = 38547 + const val JUSTICIAR_STATUE_38548 = 38548 + const val RUBBLE_38551 = 38551 + const val RUBBLE_38552 = 38552 + const val RUBBLE_38553 = 38553 + const val RUBBLE_38554 = 38554 + const val TORCH_38555 = 38555 + const val STATUE_38556 = 38556 + const val RUBBLE_38558 = 38558 + const val RUBBLE_38559 = 38559 + const val RUBBLE_38560 = 38560 + const val RUBBLE_38561 = 38561 + const val TORCH_38562 = 38562 + const val RUBBLE_38566 = 38566 + const val RUBBLE_38567 = 38567 + const val RUBBLE_38568 = 38568 + const val RUBBLE_38569 = 38569 + const val RUBBLE_38570 = 38570 + const val RUBBLE_38571 = 38571 + const val RUBBLE_38572 = 38572 + const val RUBBLE_38573 = 38573 + const val MAUSOLEUM_DOOR_38574 = 38574 + const val BROKEN_STATUE = 38590 + const val STAIRS_38596 = 38596 + const val STAIRS_38601 = 38601 + const val STAIRS_38602 = 38602 + const val STAIRS_38603 = 38603 + const val STAIRS_38604 = 38604 + const val STAIRS_38605 = 38605 + const val STAIRS_38606 = 38606 + const val STAIRS_38607 = 38607 + const val STAIRS_38608 = 38608 + const val STAIRS_38609 = 38609 + const val STAIRS_38610 = 38610 + const val STAIRS_38611 = 38611 + const val STAIRS_38612 = 38612 + const val STATUE_38616 = 38616 + const val STATUE_38617 = 38617 + const val STATUE_38618 = 38618 + const val STATUE_38619 = 38619 + const val STAIRS_38694 = 38694 + const val STAIRS_38695 = 38695 + const val STAIRS_38696 = 38696 + const val STAIRS_38697 = 38697 + const val STATUE_38714 = 38714 + const val STATUE_38715 = 38715 + const val STATUE_38716 = 38716 + const val URN_38718 = 38718 + const val URN_38719 = 38719 + const val URN_38720 = 38720 + const val COFFIN_38721 = 38721 + const val COFFIN_38722 = 38722 + const val RUBBLE_38725 = 38725 + const val RUBBLE_38726 = 38726 + const val RUBBLE_38727 = 38727 + const val RUBBLE_38728 = 38728 + const val STAIRS_38763 = 38763 + const val STAIRS_38764 = 38764 + const val NOTICEBOARD_38790 = 38790 + const val PILLAR_38791 = 38791 + const val PILLAR_38792 = 38792 + const val PILLAR_38793 = 38793 + const val PILLAR_38794 = 38794 + const val SARADOMIN_BRAZIER = 38797 + const val SARADOMIN_BRAZIER_38798 = 38798 + const val SARADOMIN_BRAZIER_38799 = 38799 + const val SARADOMIN_BRAZIER_38800 = 38800 + const val SARADOMIN_BRAZIER_38801 = 38801 + const val SARADOMIN_BRAZIER_38802 = 38802 + const val HOLY_BARRIER_38803 = 38803 + const val HOLY_BARRIER_38804 = 38804 + const val HOLY_BARRIER_38805 = 38805 + const val BROKEN_BRIDGE_38806 = 38806 + const val BROKEN_BRIDGE_38807 = 38807 + const val BRIDGE_38808 = 38808 + const val BROKEN_BRIDGE_38809 = 38809 + const val BROKEN_BRIDGE_38810 = 38810 + const val BRIDGE_38811 = 38811 + const val TILE_38822 = 38822 + const val TILE_38823 = 38823 + const val TILE_38824 = 38824 + const val TILE_38825 = 38825 + const val TILE_38826 = 38826 + const val PORTAL_FRAME_38827 = 38827 + const val PORTAL_FRAME_38828 = 38828 + const val PORTAL_38829 = 38829 + const val COFFIN_38830 = 38830 + const val COFFIN_38831 = 38831 + const val COFFIN_38832 = 38832 + const val COFFIN_38833 = 38833 + const val COFFIN_38834 = 38834 + const val COFFIN_38835 = 38835 + const val COFFIN_38836 = 38836 + const val COFFIN_38837 = 38837 + const val COFFIN_38838 = 38838 + const val COFFIN_38839 = 38839 + const val HOLY_BARRIER_38840 = 38840 + const val HOLY_BARRIER_38841 = 38841 + const val STAIRS_38849 = 38849 + const val STAIRS_38850 = 38850 + const val STAIRS_38851 = 38851 + const val STAIRS_38852 = 38852 + const val STAIRS_38984 = 38984 + const val STAIRS_38985 = 38985 + const val STAIRS_38986 = 38986 + const val STAIRS_38987 = 38987 + const val BOX_39064 = 39064 + const val TABLE_39065 = 39065 + const val TABLE_39066 = 39066 + const val TABLE_39067 = 39067 + const val STAIRS_39068 = 39068 + const val STAIRS_39069 = 39069 + const val STATUE_39070 = 39070 + const val STATUE_39071 = 39071 + const val STATUE_39072 = 39072 + const val CHEST_39073 = 39073 + const val BIG_CHEST_39074 = 39074 + const val URN_39075 = 39075 + const val COFFIN_39076 = 39076 + const val STAIRCASE_39092 = 39092 + const val STAIRCASE_39093 = 39093 + const val DAEYALT_ESSENCE_39094 = 39094 + const val DAEYALT_ESSENCE_39095 = 39095 + const val MINE_CART_39117 = 39117 + const val PLINTH_39118 = 39118 + const val BOX_39136 = 39136 + const val TABLE_39137 = 39137 + const val TABLE_39138 = 39138 + const val TABLE_39139 = 39139 + const val STAIRS_39140 = 39140 + const val STAIRS_39141 = 39141 + const val STATUE_39142 = 39142 + const val STATUE_39143 = 39143 + const val CHEST_39144 = 39144 + const val BIG_CHEST_39145 = 39145 + const val LAMP_39152 = 39152 + const val BLOOD_TITHE = 39154 + const val BLOOD_TITHE_39155 = 39155 + const val BLOOD_TITHE_39156 = 39156 + const val BLOOD_TITHE_39157 = 39157 + const val BLOOD_TITHE_39158 = 39158 + const val BLOOD_TITHE_39159 = 39159 + const val CORPSE_CART = 39160 + const val CORPSE_CART_39161 = 39161 + const val FOUNTAIN_39162 = 39162 + const val SLAVE_39163 = 39163 + const val CAGED_PRISONER = 39164 + const val CAGED_PRISONER_39165 = 39165 + const val WALL_39166 = 39166 + const val WALL_39167 = 39167 + const val WALL_39168 = 39168 + const val WALL_39169 = 39169 + const val CRACKED_WALL = 39170 + const val WALL_39172 = 39172 + const val WALL_39173 = 39173 + const val STATUE_39234 = 39234 + const val BANK_BOOTH_39238 = 39238 + const val BANK_DEPOSIT_BOX_39239 = 39239 + const val CHEST_39240 = 39240 + const val FURNACE_39241 = 39241 + const val ANVIL_39242 = 39242 + const val LARGE_DOOR_39251 = 39251 + const val LARGE_DOOR_39253 = 39253 + const val SHELVES_39301 = 39301 + const val SHELVES_39302 = 39302 + const val ROOT_39305 = 39305 + const val ROOT_39306 = 39306 + const val ROOT_39307 = 39307 + const val ROOT_39308 = 39308 + const val BENCH_39311 = 39311 + const val CASTLE_GATES = 39312 + const val DOOR_39372 = 39372 + const val DOOR_39373 = 39373 + const val COFFIN_39388 = 39388 + const val TRUNK_39389 = 39389 + const val CHAIR_39390 = 39390 + const val RANGE_39391 = 39391 + const val CUPBOARD_39392 = 39392 + const val SINK_39393 = 39393 + const val SHOP_COUNTER_39394 = 39394 + const val POTTERS_WHEEL_39395 = 39395 + const val POTTERY_OVEN_39396 = 39396 + const val CELL_DOOR_39402 = 39402 + const val BED_39404 = 39404 + const val DOOR_39406 = 39406 + const val DOOR_39407 = 39407 + const val DOOR_39408 = 39408 + const val DOOR_39409 = 39409 + const val BAR_39441 = 39441 + const val BAR_39442 = 39442 + const val BAR_39443 = 39443 + const val BAR_39444 = 39444 + const val BAR_39445 = 39445 + const val BAR_39446 = 39446 + const val BAR_39447 = 39447 + const val BAR_39448 = 39448 + const val BAR_39449 = 39449 + const val STOOL_39450 = 39450 + const val TABLE_39451 = 39451 + const val TABLE_39452 = 39452 + const val HAT_STAND_39453 = 39453 + const val RANGE_39458 = 39458 + const val SINK_39459 = 39459 + const val COFFIN_39460 = 39460 + const val COFFIN_39461 = 39461 + const val SEWING_MACHINE_39462 = 39462 + const val TABLE_39463 = 39463 + const val TABLE_39464 = 39464 + const val TABLE_39465 = 39465 + const val DOOR_39481 = 39481 + const val DOOR_39482 = 39482 + const val SOFA_39483 = 39483 + const val TABLE_39484 = 39484 + const val TABLE_39485 = 39485 + const val COFFIN_39487 = 39487 + const val WARDROBE_39488 = 39488 + const val SINK_39489 = 39489 + const val RANGE_39490 = 39490 + const val STAIRCASE_39491 = 39491 + const val STAIRCASE_39492 = 39492 + const val CHAIR_39494 = 39494 + const val PLANTER = 39495 + const val LADDER_39500 = 39500 + const val STAIRCASE_39501 = 39501 + const val CHEST_39502 = 39502 + const val STAIRS_39503 = 39503 + const val LADDER_39504 = 39504 + const val TRAPDOOR_39505 = 39505 + const val STAIRS_39506 = 39506 + const val DOOR_39507 = 39507 + const val DOOR_39508 = 39508 + const val DOOR_39509 = 39509 + const val GATE_39510 = 39510 + const val GATE_39512 = 39512 + const val GATE_39513 = 39513 + const val CHAIR_39514 = 39514 + const val DEATHS_DOMAIN_39535 = 39535 + const val DEATHS_DOMAIN_39546 = 39546 + const val DEATHS_DOMAIN_39547 = 39547 + const val DEATHS_DOMAIN_39548 = 39548 + const val PORTAL_39549 = 39549 + const val DEATHS_COFFER_39550 = 39550 + const val DESK_39570 = 39570 + const val MUNCHER = 39571 + const val CHAIR_39572 = 39572 + const val CHAIR_39573 = 39573 + const val DEATHS_SCYTHE = 39574 + const val CHEST_39575 = 39575 + const val CHEST_39576 = 39576 + const val CHEST_39577 = 39577 + const val CHEST_39578 = 39578 + const val WEAPONS = 39579 + const val BOOKS_39580 = 39580 + const val BOOKS_39581 = 39581 + const val COFFIN_39608 = 39608 + const val STAIRS_39609 = 39609 + const val CRYPT = 39617 + const val RUSTED_ANVIL = 39620 + const val MOUNTED_MAX_CAPE_39621 = 39621 + const val DEATHS_DOMAIN_39637 = 39637 + const val CASUAL = 39639 + const val COMPETITIVE = 39640 + const val HIGH_STAKES = 39641 + const val ALTAR_39642 = 39642 + const val STAIRS_39643 = 39643 + const val LADDER_39644 = 39644 + const val LADDER_39645 = 39645 + const val LIFT_PLATFORM_39646 = 39646 + const val STAIRS_39647 = 39647 + const val OPENING_39648 = 39648 + const val STAIRS_39650 = 39650 + const val POOL_OF_REFRESHMENT = 39651 + const val BARRIER_39652 = 39652 + const val BARRIER_39653 = 39653 + const val GATE_39657 = 39657 + const val GATE_39658 = 39658 + const val GATE_39659 = 39659 + const val GATE_39660 = 39660 + const val STATUE_39674 = 39674 + const val CORPSE_39675 = 39675 + const val TREE_39676 = 39676 + const val TREE_39677 = 39677 + const val TREE_39678 = 39678 + const val TREE_39679 = 39679 + const val BUSH_39680 = 39680 + const val BUSH_39681 = 39681 + const val BUSH_39682 = 39682 + const val BENCH_39687 = 39687 + const val CAMPING_EQUIPMENT_39688 = 39688 + const val TWISTED_CRATE = 39689 + const val BARREL_39690 = 39690 + const val STONE_PILE_39691 = 39691 + const val STONE_PILE_39692 = 39692 + const val WOOD_39693 = 39693 + const val SACKS_39695 = 39695 + const val SACKS_39696 = 39696 + const val FLOWERS_39697 = 39697 + const val FLOWERS_39698 = 39698 + const val FLOWERS_39699 = 39699 + const val FLOWERS_39700 = 39700 + const val TABLE_39716 = 39716 + const val STOOL_39718 = 39718 + const val HOLE_39719 = 39719 + const val WELL_39720 = 39720 + const val CAVE_39721 = 39721 + const val ALTAR_39723 = 39723 + const val GIANT_ANVIL_39724 = 39724 + const val STONE_PILE_39740 = 39740 + const val STONE_PILE_39741 = 39741 + const val HERBS_39748 = 39748 + const val HERBS_39749 = 39749 + const val HERBS_39750 = 39750 + const val HERBS_39751 = 39751 + const val HERBS_39752 = 39752 + const val HERBS_39753 = 39753 + const val HERBS_39754 = 39754 + const val HERBS_39755 = 39755 + const val HERBS_39756 = 39756 + const val HERBS_39757 = 39757 + const val HERBS_39758 = 39758 + const val HERBS_39759 = 39759 + const val HERBS_39760 = 39760 + const val HERBS_39761 = 39761 + const val HERBS_39762 = 39762 + const val HERBS_39763 = 39763 + const val HERBS_39764 = 39764 + const val HERBS_39765 = 39765 + const val HERBS_39766 = 39766 + const val HERBS_39767 = 39767 + const val HERBS_39768 = 39768 + const val HERBS_39769 = 39769 + const val HERBS_39770 = 39770 + const val HERBS_39771 = 39771 + const val HERBS_39772 = 39772 + const val HERBS_39773 = 39773 + const val HERBS_39774 = 39774 + const val HERBS_39775 = 39775 + const val HERBS_39776 = 39776 + const val HERBS_39777 = 39777 + const val HERBS_39778 = 39778 + const val HERBS_39779 = 39779 + const val HERBS_39780 = 39780 + const val HERBS_39781 = 39781 + const val HERBS_39782 = 39782 + const val HERBS_39783 = 39783 + const val HERBS_39784 = 39784 + const val HERBS_39785 = 39785 + const val HERBS_39786 = 39786 + const val HERBS_39787 = 39787 + const val HERBS_39788 = 39788 + const val HERBS_39789 = 39789 + const val HERBS_39790 = 39790 + const val HERBS_39791 = 39791 + const val HERBS_39792 = 39792 + const val HERBS_39793 = 39793 + const val HERBS_39794 = 39794 + const val HERBS_39795 = 39795 + const val HERBS_39796 = 39796 + const val HERBS_39797 = 39797 + const val HERBS_39798 = 39798 + const val HERBS_39799 = 39799 + const val HERBS_39800 = 39800 + const val HERBS_39801 = 39801 + const val HERBS_39802 = 39802 + const val HERBS_39803 = 39803 + const val HERBS_39804 = 39804 + const val HERBS_39805 = 39805 + const val HERBS_39806 = 39806 + const val HERBS_39807 = 39807 + const val HERBS_39808 = 39808 + const val HERBS_39809 = 39809 + const val HERBS_39810 = 39810 + const val HERBS_39811 = 39811 + const val HERB_PATCH_39812 = 39812 + const val HERB_PATCH_39813 = 39813 + const val HERBS_39814 = 39814 + const val HERBS_39815 = 39815 + const val HERBS_39816 = 39816 + const val HERB_PATCH_39817 = 39817 + const val HERB_PATCH_39818 = 39818 + const val HERBS_39819 = 39819 + const val HERBS_39820 = 39820 + const val HERBS_39821 = 39821 + const val HERB_PATCH_39822 = 39822 + const val HERB_PATCH_39823 = 39823 + const val HERBS_39824 = 39824 + const val HERBS_39825 = 39825 + const val HERBS_39826 = 39826 + const val HERB_PATCH_39827 = 39827 + const val HERB_PATCH_39828 = 39828 + const val HERBS_39829 = 39829 + const val HERBS_39830 = 39830 + const val HERBS_39831 = 39831 + const val HERB_PATCH_39832 = 39832 + const val HERB_PATCH_39833 = 39833 + const val HERBS_39834 = 39834 + const val HERBS_39835 = 39835 + const val HERBS_39836 = 39836 + const val HERB_PATCH_39837 = 39837 + const val HERB_PATCH_39838 = 39838 + const val HERBS_39839 = 39839 + const val HERBS_39840 = 39840 + const val HERBS_39841 = 39841 + const val HERB_PATCH_39842 = 39842 + const val HERB_PATCH_39843 = 39843 + const val HERBS_39844 = 39844 + const val HERBS_39845 = 39845 + const val HERBS_39846 = 39846 + const val HERB_PATCH_39847 = 39847 + const val HERB_PATCH_39848 = 39848 + const val HERBS_39849 = 39849 + const val HERBS_39850 = 39850 + const val HERBS_39851 = 39851 + const val HERB_PATCH_39852 = 39852 + const val HERB_PATCH_39853 = 39853 + const val HERBS_39854 = 39854 + const val HERBS_39855 = 39855 + const val HERBS_39856 = 39856 + const val HERB_PATCH_39857 = 39857 + const val HERB_PATCH_39858 = 39858 + const val HERBS_39859 = 39859 + const val HERBS_39860 = 39860 + const val HERBS_39861 = 39861 + const val HERB_PATCH_39862 = 39862 + const val HERB_PATCH_39863 = 39863 + const val HERBS_39864 = 39864 + const val HERBS_39865 = 39865 + const val HERBS_39866 = 39866 + const val HERB_PATCH_39867 = 39867 + const val HERB_PATCH_39868 = 39868 + const val HERBS_39869 = 39869 + const val HERBS_39870 = 39870 + const val HERBS_39871 = 39871 + const val HERB_PATCH_39872 = 39872 + const val HERB_PATCH_39873 = 39873 + const val HERBS_39874 = 39874 + const val HERBS_39875 = 39875 + const val HERBS_39876 = 39876 + const val HERB_PATCH_39877 = 39877 + const val HERB_PATCH_39878 = 39878 + const val HERBS_39879 = 39879 + const val HERBS_39880 = 39880 + const val HERBS_39881 = 39881 + const val DOOR_39882 = 39882 + const val BROKEN_TABLE_39891 = 39891 + const val TEAK_TABLE_39892 = 39892 + const val WOODEN_TABLE_39893 = 39893 + const val OAK_TABLE_39894 = 39894 + const val TEAK_TABLE_39895 = 39895 + const val MAHOGANY_TABLE_39896 = 39896 + const val BROKEN_GRANDFATHER_CLOCK = 39897 + const val BROKEN_CABINET = 39898 + const val CABINET_39899 = 39899 + const val CABINET_39900 = 39900 + const val CABINET_39901 = 39901 + const val CABINET_39902 = 39902 + const val CABINET_39903 = 39903 + const val BROKEN_CABINET_39904 = 39904 + const val CABINET_39905 = 39905 + const val CABINET_39906 = 39906 + const val CABINET_39907 = 39907 + const val CABINET_39908 = 39908 + const val CABINET_39909 = 39909 + const val BOOKCASE_39910 = 39910 + const val BOOKCASE_39911 = 39911 + const val BOOKCASE_39912 = 39912 + const val BOOKCASE_39913 = 39913 + const val BOOKCASE_39914 = 39914 + const val BOOKCASE_39915 = 39915 + const val WARDROBE_39916 = 39916 + const val WARDROBE_39917 = 39917 + const val WARDROBE_39918 = 39918 + const val WARDROBE_39919 = 39919 + const val WARDROBE_39920 = 39920 + const val WARDROBE_39921 = 39921 + const val BROKEN_DRAWERS = 39922 + const val DRAWERS_39923 = 39923 + const val DRAWERS_39924 = 39924 + const val DRAWERS_39925 = 39925 + const val DRAWERS_39926 = 39926 + const val DRAWERS_39927 = 39927 + const val BROKEN_TABLE_39928 = 39928 + const val TABLE_39929 = 39929 + const val TABLE_39930 = 39930 + const val TABLE_39931 = 39931 + const val TABLE_39932 = 39932 + const val TABLE_39933 = 39933 + const val BROKEN_SHELVES = 39934 + const val SHELVES_39935 = 39935 + const val SHELVES_39936 = 39936 + const val SHELVES_39937 = 39937 + const val SHELVES_39938 = 39938 + const val SHELVES_39939 = 39939 + const val BED_39940 = 39940 + const val BROKEN_BED_39941 = 39941 + const val BED_39942 = 39942 + const val BED_39943 = 39943 + const val BED_39944 = 39944 + const val BED_39945 = 39945 + const val BED_39946 = 39946 + const val BROKEN_DRESSER = 39947 + const val DRESSER_39948 = 39948 + const val DRESSER_39949 = 39949 + const val DRESSER_39950 = 39950 + const val DRESSER_39951 = 39951 + const val DRESSER_39952 = 39952 + const val BROKEN_MIRROR = 39953 + const val BROKEN_CHAIR = 39954 + const val CHAIR_39955 = 39955 + const val CHAIR_39956 = 39956 + const val CHAIR_39957 = 39957 + const val CHAIR_39958 = 39958 + const val CHAIR_39959 = 39959 + const val TABLE_39960 = 39960 + const val TABLE_39961 = 39961 + const val TABLE_39962 = 39962 + const val TABLE_39963 = 39963 + const val TABLE_39964 = 39964 + const val TABLE_39965 = 39965 + const val TABLE_39966 = 39966 + const val TABLE_39967 = 39967 + const val TABLE_39968 = 39968 + const val TABLE_39969 = 39969 + const val TABLE_39970 = 39970 + const val TABLE_39971 = 39971 + const val BED_39972 = 39972 + const val BED_39973 = 39973 + const val BED_39974 = 39974 + const val BED_39975 = 39975 + const val BED_39976 = 39976 + const val BED_39977 = 39977 + const val BED_39978 = 39978 + const val BROKEN_RANGE_39979 = 39979 + const val BROKEN_RANGE_39980 = 39980 + const val BROKEN_TABLE_40016 = 40016 + const val TABLE_40017 = 40017 + const val TABLE_40018 = 40018 + const val TABLE_40019 = 40019 + const val TABLE_40020 = 40020 + const val TABLE_40021 = 40021 + const val BROKEN_SINK = 40022 + const val SINK_40023 = 40023 + const val COOKING_SHELVES_40024 = 40024 + const val COOKING_SHELVES_40025 = 40025 + const val COOKING_SHELVES_40026 = 40026 + const val COOKING_SHELVES_40027 = 40027 + const val COOKING_SHELVES_40028 = 40028 + const val COOKING_SHELVES_40029 = 40029 + const val BROKEN_TABLE_40030 = 40030 + const val TABLE_40031 = 40031 + const val TABLE_40032 = 40032 + const val TABLE_40033 = 40033 + const val TABLE_40034 = 40034 + const val TABLE_40035 = 40035 + const val CUPBOARD_40036 = 40036 + const val CUPBOARD_40037 = 40037 + const val CUPBOARD_40038 = 40038 + const val CUPBOARD_40039 = 40039 + const val CUPBOARD_40040 = 40040 + const val CUPBOARD_40041 = 40041 + const val BED_40042 = 40042 + const val BED_40043 = 40043 + const val BED_40044 = 40044 + const val BED_40045 = 40045 + const val BED_40046 = 40046 + const val BED_40047 = 40047 + const val BED_40048 = 40048 + const val BED_40049 = 40049 + const val BED_40050 = 40050 + const val BED_40051 = 40051 + const val BED_40052 = 40052 + const val BED_40053 = 40053 + const val BED_40054 = 40054 + const val DRAWERS_40055 = 40055 + const val DRAWERS_40056 = 40056 + const val DRAWERS_40057 = 40057 + const val DRAWERS_40058 = 40058 + const val DRAWERS_40059 = 40059 + const val DRAWERS_40060 = 40060 + const val CHAIR_40061 = 40061 + const val CHAIR_40062 = 40062 + const val CHAIR_40063 = 40063 + const val CHAIR_40064 = 40064 + const val CHAIR_40065 = 40065 + const val CHAIR_40066 = 40066 + const val BROKEN_RANGE_40067 = 40067 + const val RANGE_40068 = 40068 + const val TABLE_SPACE_40069 = 40069 + const val TABLE_SPACE_40070 = 40070 + const val TABLE_SPACE_40071 = 40071 + const val TABLE_SPACE_40072 = 40072 + const val CABINET_SPACE = 40073 + const val BOOKCASE_SPACE_40074 = 40074 + const val WARDROBE_SPACE_40075 = 40075 + const val DRESSER_SPACE_40076 = 40076 + const val SHELVES_SPACE = 40077 + const val CUPBOARD_SPACE = 40078 + const val CHAIR_SPACE_40079 = 40079 + const val BED_SPACE_40080 = 40080 + const val BED_SPACE_40081 = 40081 + const val DRAWER_SPACE = 40082 + const val BROKEN_SINK_40100 = 40100 + const val BROKEN_TABLE_40101 = 40101 + const val TABLE_40102 = 40102 + const val TABLE_40103 = 40103 + const val TABLE_40104 = 40104 + const val TABLE_40105 = 40105 + const val TABLE_40106 = 40106 + const val TABLE_40107 = 40107 + const val TABLE_40108 = 40108 + const val TABLE_40109 = 40109 + const val TABLE_40110 = 40110 + const val TABLE_40111 = 40111 + const val TABLE_40112 = 40112 + const val CUPBOARD_40113 = 40113 + const val BROKEN_CUPBOARD = 40114 + const val CUPBOARD_40115 = 40115 + const val CUPBOARD_40116 = 40116 + const val CUPBOARD_40117 = 40117 + const val CUPBOARD_40118 = 40118 + const val CUPBOARD_40119 = 40119 + const val BROKEN_SHELVES_40120 = 40120 + const val SHELVES_40121 = 40121 + const val SHELVES_40122 = 40122 + const val SHELVES_40123 = 40123 + const val SHELVES_40124 = 40124 + const val SHELVES_40125 = 40125 + const val BED_40126 = 40126 + const val BROKEN_BED_40127 = 40127 + const val BED_40128 = 40128 + const val BED_40129 = 40129 + const val BED_40130 = 40130 + const val BED_40131 = 40131 + const val BED_40132 = 40132 + const val BROKEN_OLD_BOOKSHELF = 40133 + const val OLD_BOOKSHELF_40134 = 40134 + const val OLD_BOOKSHELF_40135 = 40135 + const val OLD_BOOKSHELF_40136 = 40136 + const val OLD_BOOKSHELF_40137 = 40137 + const val OLD_BOOKSHELF_40138 = 40138 + const val HAT_STAND_40139 = 40139 + const val HAT_STAND_40140 = 40140 + const val GRANDFATHER_CLOCK_40141 = 40141 + const val DRAWERS_40142 = 40142 + const val DRAWERS_40143 = 40143 + const val DRAWERS_40144 = 40144 + const val DRAWERS_40145 = 40145 + const val DRAWERS_40146 = 40146 + const val DRAWERS_40147 = 40147 + const val BROKEN_RANGE_40148 = 40148 + const val RANGE_40149 = 40149 + const val DRAWERS_40150 = 40150 + const val DRAWERS_40151 = 40151 + const val DRAWERS_40152 = 40152 + const val DRAWERS_40153 = 40153 + const val DRAWERS_40154 = 40154 + const val DRAWERS_40155 = 40155 + const val DOOR_40178 = 40178 + const val BROKEN_MIRROR_40179 = 40179 + const val DRAWERS_40180 = 40180 + const val DRAWERS_40181 = 40181 + const val DRAWERS_40182 = 40182 + const val DRAWERS_40183 = 40183 + const val DRAWERS_40184 = 40184 + const val DRAWERS_40185 = 40185 + const val DRAWERS_40186 = 40186 + const val DRAWERS_40187 = 40187 + const val DRAWERS_40188 = 40188 + const val DRAWERS_40189 = 40189 + const val DRAWERS_40190 = 40190 + const val DRAWERS_40191 = 40191 + const val BROKEN_BED_40192 = 40192 + const val BED_40193 = 40193 + const val BED_40194 = 40194 + const val BED_40195 = 40195 + const val BED_40196 = 40196 + const val BED_40197 = 40197 + const val BED_40198 = 40198 + const val BROKEN_BED_40199 = 40199 + const val BED_40200 = 40200 + const val BED_40201 = 40201 + const val BED_40202 = 40202 + const val BED_40203 = 40203 + const val BED_40204 = 40204 + const val BED_40205 = 40205 + const val BED_40206 = 40206 + const val BED_40207 = 40207 + const val BED_40208 = 40208 + const val BED_40209 = 40209 + const val BED_40210 = 40210 + const val BED_40211 = 40211 + const val BROKEN_BATH = 40212 + const val BATH_40213 = 40213 + const val CRATES_40214 = 40214 + const val BROKEN_STOOL = 40215 + const val BROKEN_STOOL_40216 = 40216 + const val STOOL_HOTSPOT = 40217 + const val STOOL_40218 = 40218 + const val BROKEN_CHAIR_40219 = 40219 + const val BROKEN_CHAIR_40220 = 40220 + const val CHAIR_HOTSPOT = 40221 + const val CHAIR_40222 = 40222 + const val BROKEN_TABLE_40225 = 40225 + const val BROKEN_TABLE_40226 = 40226 + const val TABLE_HOTSPOT = 40227 + const val TABLE_40228 = 40228 + const val CAMPBED = 40229 + const val CAMPBED_40230 = 40230 + const val BED_HOTSPOT = 40231 + const val BED_40232 = 40232 + const val ROTTEN_CARPET = 40233 + const val ROTTEN_CARPET_40236 = 40236 + const val CARPET_HOTSPOT = 40237 + const val CARPET = 40240 + const val PITFALL_40243 = 40243 + const val DAGANNOTH_SUPREME_JR_40244 = 40244 + const val VASA_MINIRIO_40245 = 40245 + const val GENERAL_GRAARDOR_JR_40246 = 40246 + const val SMOLCANO_40247 = 40247 + const val BABY_MOLE_40248 = 40248 + const val KALPHITE_PRINCESS_40249 = 40249 + const val SMOKE_DEVIL_40250 = 40250 + const val CHOMPY_CHICK_40251 = 40251 + const val DARK_SQUIRREL_40252 = 40252 + const val TANGLEROOT_40253 = 40253 + const val CAT_40254 = 40254 + const val CAT_40255 = 40255 + const val CAT_40256 = 40256 + const val CAT_40257 = 40257 + const val CAT_40258 = 40258 + const val CAT_40259 = 40259 + const val HELLCAT_40260 = 40260 + const val OVERGROWN_CAT_40261 = 40261 + const val OVERGROWN_CAT_40262 = 40262 + const val OVERGROWN_CAT_40263 = 40263 + const val OVERGROWN_CAT_40264 = 40264 + const val OVERGROWN_CAT_40265 = 40265 + const val OVERGROWN_CAT_40266 = 40266 + const val OVERGROWN_HELLCAT_40267 = 40267 + const val LAZY_CAT_40268 = 40268 + const val LAZY_CAT_40269 = 40269 + const val LAZY_CAT_40270 = 40270 + const val LAZY_CAT_40271 = 40271 + const val LAZY_CAT_40272 = 40272 + const val LAZY_CAT_40273 = 40273 + const val LAZY_HELLCAT_40274 = 40274 + const val WILY_CAT_40275 = 40275 + const val WILY_CAT_40276 = 40276 + const val WILY_CAT_40277 = 40277 + const val WILY_CAT_40278 = 40278 + const val WILY_CAT_40279 = 40279 + const val WILY_CAT_40280 = 40280 + const val WILY_HELLCAT_40281 = 40281 + const val DRAWERS_40282 = 40282 + const val DRAWERS_40283 = 40283 + const val BOXES_40284 = 40284 + const val NOTICE_BOARD_40307 = 40307 + const val STRANGE_HOLE_40308 = 40308 + const val STRANGE_HOLE_40309 = 40309 + const val CABBAGE_40310 = 40310 + const val POTATOES_40311 = 40311 + const val CARROT_40312 = 40312 + const val BROKEN_DEAD_TREE = 40313 + const val DAMAGED_CART = 40314 + const val FALLEN_TREE_40315 = 40315 + const val DEAD_SOURHOG = 40316 + const val DEAD_SOURHOG_40317 = 40317 + const val DEAD_SOURHOG_40318 = 40318 + const val DEAD_SOURHOG_40319 = 40319 + const val SKELETON_40320 = 40320 + const val SKELETON_40321 = 40321 + const val SCRAWLED_NOTE_40323 = 40323 + const val PILE_OF_ROPE_40324 = 40324 + const val DOOR_40325 = 40325 + const val ROPE_40330 = 40330 + const val BLOCKAGE_40331 = 40331 + const val CRUMBLING_WALL_40355 = 40355 + const val ROCKS_40356 = 40356 + const val LECTERN_40357 = 40357 + const val LECTERN_40358 = 40358 + const val PICTURE_40359 = 40359 + const val MOUNTED_HEAD_SPACE = 40360 + const val MOUNTED_HEAD = 40361 + const val SHELVES_40362 = 40362 + const val SHELVES_40363 = 40363 + const val WORKBENCH_40364 = 40364 + const val ROCKS_40365 = 40365 + const val ROCKS_40366 = 40366 + const val BARREL_OF_FLOUR_40367 = 40367 + const val STAIRCASE_40381 = 40381 + const val DOOR_40382 = 40382 + const val MAGICAL_PUMPKIN_40383 = 40383 + const val MAGICAL_PUMPKIN_40384 = 40384 + const val MAGICAL_PUMPKIN_40385 = 40385 + const val CAVERN_40386 = 40386 + const val OPENING_40387 = 40387 + const val STAIRS_40388 = 40388 + const val OPENING_40389 = 40389 + const val STAIRS_40390 = 40390 + const val OPENING_40391 = 40391 + const val ROCK_40396 = 40396 + const val ROCK_40397 = 40397 + const val ROCK_40398 = 40398 + const val ROCK_40399 = 40399 + const val ARCHWAY_40400 = 40400 + const val ARCHWAY_40401 = 40401 + const val ARCHWAY_40402 = 40402 + const val ARCHWAY_40403 = 40403 + const val ARCHWAY_40404 = 40404 + const val ARCHWAY_40405 = 40405 + const val ARCHWAY_40406 = 40406 + const val ARCHWAY_40407 = 40407 + const val WAYSTONE = 40408 + const val WAYSTONE_40409 = 40409 + const val WAYSTONE_40410 = 40410 + const val WAYSTONE_40411 = 40411 + const val WAYSTONE_40412 = 40412 + const val WAYSTONE_40413 = 40413 + const val WAYSTONE_40414 = 40414 + const val WAYSTONE_40415 = 40415 + const val WAYSTONE_40416 = 40416 + const val KINGS_LADDER_40417 = 40417 + const val KINGS_LADDER_40418 = 40418 + const val BIG_DOOR_40419 = 40419 + const val BIG_DOOR_40420 = 40420 + const val TUNNEL_ENTRANCE_40421 = 40421 + const val TUNNEL_ENTRANCE_40422 = 40422 + const val TABLE_40423 = 40423 + const val TABLE_40424 = 40424 + const val SHELVES_40425 = 40425 + const val WOOD_40426 = 40426 + const val ORNATE_VAMPYRE_COMBAT_DUMMY = 40430 + const val ORNATE_DRAGON_COMBAT_DUMMY = 40431 + const val TABLE_40432 = 40432 + const val TREE_40433 = 40433 + const val SUPPLIES_40434 = 40434 + const val SOUL_OBELISK = 40435 + const val SOUL_OBELISK_40436 = 40436 + const val BLUE_BARRIER = 40437 + const val RED_BARRIER = 40438 + const val NEUTRAL_BARRIER = 40439 + const val PORTAL_40440 = 40440 + const val PORTAL_40441 = 40441 + const val BANDAGE_TABLE = 40442 + const val BARRICADE_TABLE = 40443 + const val BARRICADE_TABLE_40444 = 40444 + const val EXPLOSIVE_POTION_TABLE = 40445 + const val POTION_OF_POWER_TABLE = 40446 + const val TENT_40447 = 40447 + const val SCOREBOARD_40448 = 40448 + const val SOUL_OBELISK_40449 = 40449 + const val SOUL_OBELISK_40450 = 40450 + const val SOUL_OBELISK_40451 = 40451 + const val BLUE_BARRIER_40452 = 40452 + const val BLUE_BARRIER_40453 = 40453 + const val BLUE_BARRIER_40454 = 40454 + const val RED_BARRIER_40455 = 40455 + const val RED_BARRIER_40456 = 40456 + const val RED_BARRIER_40457 = 40457 + const val NEUTRAL_BARRIER_40458 = 40458 + const val NEUTRAL_BARRIER_40459 = 40459 + const val PORTAL_40460 = 40460 + const val PORTAL_40461 = 40461 + const val BANDAGE_TABLE_40462 = 40462 + const val BANDAGE_TABLE_40463 = 40463 + const val BARRICADE_TABLE_40464 = 40464 + const val BARRICADE_TABLE_40465 = 40465 + const val EXPLOSIVE_POTION_TABLE_40466 = 40466 + const val EXPLOSIVE_POTION_TABLE_40467 = 40467 + const val POTION_OF_POWER_TABLE_40468 = 40468 + const val POTION_OF_POWER_TABLE_40469 = 40469 + const val BLUE_BARRIER_40470 = 40470 + const val RED_BARRIER_40471 = 40471 + const val BALANCE_PORTAL = 40472 + const val BANK_CHEST_40473 = 40473 + const val SOUL_WARS_PORTAL = 40474 + const val SOUL_WARS_PORTAL_40475 = 40475 + const val PORTAL_40476 = 40476 + const val GRAVESTONE_40491 = 40491 + const val GRAVESTONE_40492 = 40492 + const val GRAVESTONE_40493 = 40493 + const val GRAVESTONE_40494 = 40494 + const val GRAVESTONE_40495 = 40495 + const val GRAVESTONE_40496 = 40496 + const val GRAVESTONE_40497 = 40497 + const val GRAVESTONE_40498 = 40498 + const val GRAVESTONE_40499 = 40499 + const val CRATE_40544 = 40544 + const val CRATE_40545 = 40545 + const val CRATE_40546 = 40546 + const val CRATE_40547 = 40547 + const val BARREL_40548 = 40548 + const val BARREL_40549 = 40549 + const val TORCH_40550 = 40550 + const val TORCH_40551 = 40551 + const val CRATE_40588 = 40588 + const val CRATE_40589 = 40589 + const val BARREL_40590 = 40590 + const val TREE_40715 = 40715 + const val TREE_40716 = 40716 + const val FENCE_40723 = 40723 + const val ANVIL_40725 = 40725 + const val FIRE_40728 = 40728 + const val TENT_40731 = 40731 + const val BROKEN_POTTERS_WHEEL = 40732 + const val POTTERS_WHEEL_40733 = 40733 + const val BROKEN_SPINNING_WHEEL_40734 = 40734 + const val SPINNING_WHEEL_40735 = 40735 + const val CAVE_40736 = 40736 + const val OPENING_40737 = 40737 + const val BONES_40738 = 40738 + const val CHEST_40739 = 40739 + const val CHEST_40741 = 40741 + const val LOCKED_CHEST_40742 = 40742 + const val BARREL_40744 = 40744 + const val TREE_40750 = 40750 + const val TREE_STUMP_40751 = 40751 + const val TREE_40752 = 40752 + const val TREE_STUMP_40753 = 40753 + const val MAPLE_TREE_40754 = 40754 + const val MAPLE_TREE_40755 = 40755 + const val YEW_40756 = 40756 + const val TREE_STUMP_40757 = 40757 + const val TEAK_40758 = 40758 + const val TREE_STUMP_40759 = 40759 + const val MAHOGANY_40760 = 40760 + const val TREE_STUMP_40761 = 40761 + const val DOOR_HOTSPOT_40768 = 40768 + const val DOOR_HOTSPOT_40769 = 40769 + const val WINDOW_SPACE_40770 = 40770 + const val CHRISTMAS_CURTAINS = 40771 + const val CHRISTMAS_CURTAINS_40772 = 40772 + const val CHRISTMAS_CURTAINS_40773 = 40773 + const val DECORATED_LIMESTONE_FIREPLACE = 40774 + const val DECORATED_LIMESTONE_FIREPLACE_40775 = 40775 + const val DECORATED_MARBLE_FIREPLACE = 40776 + const val DECORATED_MARBLE_FIREPLACE_40777 = 40777 + const val CHRISTMASSPIRIT_TREE = 40778 + const val SPIRITUAL_FAIRY_TREE_40780 = 40780 + const val SPIRITUAL_FAIRY_TREE_40781 = 40781 + const val SPIRITUAL_FAIRY_TREE_40782 = 40782 + const val SPIRITUAL_FAIRY_TREE_40783 = 40783 + const val SPIRITUAL_FAIRY_TREE_40784 = 40784 + const val SPIRITUAL_FAIRY_TREE_40785 = 40785 + const val SPIRITUAL_FAIRY_TREE_40786 = 40786 + const val SPIRITUAL_FAIRY_TREE_40787 = 40787 + const val SPIRITUAL_FAIRY_TREE_40788 = 40788 + const val SPIRITUAL_FAIRY_TREE_40789 = 40789 + const val SPIRITUAL_FAIRY_TREE_40790 = 40790 + const val SPIRITUAL_FAIRY_TREE_40791 = 40791 + const val SPIRITUAL_FAIRY_TREE_40792 = 40792 + const val SPIRITUAL_FAIRY_TREE_40793 = 40793 + const val SPIRITUAL_FAIRY_TREE_40794 = 40794 + const val SPIRITUAL_FAIRY_TREE_40795 = 40795 + const val SPIRITUAL_FAIRY_TREE_40796 = 40796 + const val SPIRITUAL_FAIRY_TREE_40797 = 40797 + const val SPIRITUAL_FAIRY_TREE_40798 = 40798 + const val SPIRITUAL_FAIRY_TREE_40799 = 40799 + const val SPIRITUAL_FAIRY_TREE_40800 = 40800 + const val SPIRITUAL_FAIRY_TREE_40801 = 40801 + const val SPIRITUAL_FAIRY_TREE_40802 = 40802 + const val SPIRITUAL_FAIRY_TREE_40803 = 40803 + const val SPIRITUAL_FAIRY_TREE_40804 = 40804 + const val SPIRITUAL_FAIRY_TREE_40805 = 40805 + const val SPIRITUAL_FAIRY_TREE_40806 = 40806 + const val SPIRITUAL_FAIRY_TREE_40807 = 40807 + const val SPIRITUAL_FAIRY_TREE_40808 = 40808 + const val SPIRITUAL_FAIRY_TREE_40809 = 40809 + const val SPIRITUAL_FAIRY_TREE_40810 = 40810 + const val SPIRITUAL_FAIRY_TREE_40811 = 40811 + const val SPIRITUAL_FAIRY_TREE_40812 = 40812 + const val SPIRITUAL_FAIRY_TREE_40813 = 40813 + const val SPIRITUAL_FAIRY_TREE_40814 = 40814 + const val SPIRITUAL_FAIRY_TREE_40815 = 40815 + const val SPIRITUAL_FAIRY_TREE_40816 = 40816 + const val SPIRITUAL_FAIRY_TREE_40817 = 40817 + const val SPIRITUAL_FAIRY_TREE_40818 = 40818 + const val SPIRITUAL_FAIRY_TREE_40819 = 40819 + const val SPIRITUAL_FAIRY_TREE_40820 = 40820 + const val SPIRITUAL_FAIRY_TREE_40821 = 40821 + const val SPIRITUAL_FAIRY_TREE_40822 = 40822 + const val SPIRITUAL_FAIRY_TREE_40823 = 40823 + const val SPIRITUAL_FAIRY_TREE_40824 = 40824 + const val SPIRITUAL_FAIRY_TREE_40825 = 40825 + const val SPIRITUAL_FAIRY_TREE_40826 = 40826 + const val SPIRITUAL_FAIRY_TREE_40827 = 40827 + const val SPIRITUAL_FAIRY_TREE_40828 = 40828 + const val SPIRITUAL_FAIRY_TREE_40829 = 40829 + const val SPIRITUAL_FAIRY_TREE_40830 = 40830 + const val SPIRITUAL_FAIRY_TREE_40831 = 40831 + const val SPIRITUAL_FAIRY_TREE_40832 = 40832 + const val SPIRITUAL_FAIRY_TREE_40833 = 40833 + const val SPIRITUAL_FAIRY_TREE_40834 = 40834 + const val SPIRITUAL_FAIRY_TREE_40835 = 40835 + const val SPIRITUAL_FAIRY_TREE_40836 = 40836 + const val SPIRITUAL_FAIRY_TREE_40837 = 40837 + const val SPIRITUAL_FAIRY_TREE_40838 = 40838 + const val SPIRITUAL_FAIRY_TREE_40839 = 40839 + const val SPIRITUAL_FAIRY_TREE_40840 = 40840 + const val SPIRITUAL_FAIRY_TREE_40841 = 40841 + const val SPIRITUAL_FAIRY_TREE_40842 = 40842 + const val SPIRITUAL_FAIRY_TREE_40843 = 40843 + const val FROZEN_POOL_OF_RESTORATION = 40844 + const val FROZEN_POOL_OF_REVITALISATION = 40845 + const val FROZEN_POOL_OF_REJUVENATION = 40846 + const val FROZEN_FANCY_POOL_OF_REJUVENATION = 40847 + const val FROZEN_ORNATE_POOL_OF_REJUVENATION = 40848 + const val SHUTTERED_WINDOW_40849 = 40849 + const val DECORATIVE_WINDOW_40850 = 40850 + const val STAINEDGLASS_WINDOW_40851 = 40851 + const val DECORATIVE_WINDOW_40852 = 40852 + const val STAINEDGLASS_WINDOW_40853 = 40853 + const val DECORATIVE_WINDOW_40854 = 40854 + const val STAINEDGLASS_WINDOW_40855 = 40855 + const val DECORATIVE_WINDOW_40856 = 40856 + const val STAINEDGLASS_WINDOW_40857 = 40857 + const val DOOR_40858 = 40858 + const val DOOR_40859 = 40859 + const val DOOR_40860 = 40860 + const val DOOR_40861 = 40861 + const val SACKS_40871 = 40871 + const val SACKS_40872 = 40872 + const val SACKS_40873 = 40873 + const val SACKS_40874 = 40874 + const val SACK_PILE_40875 = 40875 + const val SACK_PILE_40876 = 40876 + const val SACK_PILE_40877 = 40877 + const val SACK_PILE_40878 = 40878 + const val SHELVES_40879 = 40879 + const val SHELVES_40880 = 40880 + const val SHELVES_40881 = 40881 + const val SHELVES_40882 = 40882 + const val CUPBOARD_40883 = 40883 + const val CUPBOARD_40884 = 40884 + const val CUPBOARD_40885 = 40885 + const val CUPBOARD_40886 = 40886 + const val CAVE_ENTRANCE_40887 = 40887 + const val CAVE_EXIT_40888 = 40888 + const val CREVICE_40889 = 40889 + const val FIRE_REMAINS_40891 = 40891 + const val SLED_40892 = 40892 + const val SLOPE_40893 = 40893 + const val SLOPE_END = 40894 + const val PEBBLES = 40896 + const val BOULDER_40897 = 40897 + const val BOULDER_40899 = 40899 + const val STICK_40901 = 40901 + const val STICK_40902 = 40902 + const val CAULDRON_40903 = 40903 + const val TREASURE_CHEST_40904 = 40904 + const val ROCKS_40905 = 40905 + const val ROCKS_40906 = 40906 + const val SOCKING = 40909 + const val SOCKING_40910 = 40910 + const val SOCKING_40911 = 40911 + const val EVERGREEN_40932 = 40932 + const val EVERGREEN_40933 = 40933 + const val TREE_40937 = 40937 + const val TREE_40938 = 40938 /* Auto-generated file using class gg.rsmod.game.service.game.DumpEntityIdService */ } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/ext/PlayerExt.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/ext/PlayerExt.kt index 0674d4703d..4458e57eac 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/ext/PlayerExt.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/api/ext/PlayerExt.kt @@ -74,7 +74,7 @@ fun Player.setInterfaceEvents(interfaceId: Int, component: Int, from: Int, to: I } fun Player.setInterfaceEvents(interfaceId: Int, component: Int, range: IntRange, setting: Int) { - write(IfSetEventsMessage(hash = ((interfaceId shl 16) or component), fromChild = range.start, toChild = range.endInclusive, setting = setting)) + write(IfSetEventsMessage(hash = ((interfaceId shl 16) or component), fromChild = range.first, toChild = range.last, setting = setting)) } fun Player.setComponentText(interfaceId: Int, component: Int, text: String) { @@ -115,9 +115,6 @@ fun Player.openInterface(interfaceId: Int, dest: InterfaceDestination, fullscree val displayMode = if (!fullscreen || dest.fullscreenChildId == -1) interfaces.displayMode else DisplayMode.FULLSCREEN val child = getChildId(dest, displayMode) val parent = getDisplayComponentId(displayMode) - if (displayMode == DisplayMode.FULLSCREEN) { - openOverlayInterface(displayMode) - } openInterface(parent, child, interfaceId, if (dest.clickThrough) 1 else 0, isModal = dest == InterfaceDestination.MAIN_SCREEN) } @@ -477,6 +474,7 @@ fun Player.calculateAndSetCombatLevel(): Boolean { fun Player.calculateDeathContainers(): DeathContainers { var keepAmount = if (hasSkullIcon(SkullIcon.WHITE)) 0 else 3 + if (getVarbit(599) == 1) keepAmount++ if (attr[PROTECT_ITEM_ATTR] == true) { keepAmount++ } @@ -508,8 +506,7 @@ fun Player.calculateDeathContainers(): DeathContainers { return DeathContainers(kept = keptContainer, lost = lostContainer) } -// Note: this does not take ground items, that may belong to the player, into -// account. +// Note: this does not take ground items, that may belong to the player, into account. fun Player.hasItem(item: Int, amount: Int = 1): Boolean = containers.values.firstOrNull { container -> container.getItemCount(item) >= amount } != null fun Player.isPrivilegeEligible(to: String): Boolean = world.privileges.isEligible(privilege, to) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/chat/emblem_trader.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/chat/emblem_trader.plugin.kts index b540f9b6e5..2aebbd9cad 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/chat/emblem_trader.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/chat/emblem_trader.plugin.kts @@ -6,12 +6,12 @@ val LIMIT_TARGETS_VARBIT = 6503 val SKULL_SHORT_DURATION = 500 val SKULL_LONG_DURATION = 2000 -arrayOf(Npcs.EMBLEM_TRADER, Npcs.EMBLEM_TRADER_316).forEach { npc -> +arrayOf(Npcs.EMBLEM_TRADER, Npcs.EMBLEM_TRADER_7943).forEach { npc -> on_npc_option(npc = npc, option = "talk-to") { player.queue { chat(this) } } - on_npc_option(npc = npc, option = "trade") { + on_npc_option(npc = npc, option = "rewards") { open_bounty_store(player) } @@ -26,7 +26,7 @@ arrayOf(Npcs.EMBLEM_TRADER, Npcs.EMBLEM_TRADER_316).forEach { npc -> } if (npc == Npcs.EMBLEM_TRADER) { - on_npc_option(npc = npc, option = "hide-streaks") { + on_npc_option(npc = npc, option = "coffer") { player.queue { if (options("Yes", "No", title = "Hide kill streak data?") == 1) { hide_killstreak_data(player) @@ -34,8 +34,8 @@ arrayOf(Npcs.EMBLEM_TRADER, Npcs.EMBLEM_TRADER_316).forEach { npc -> } } } - } else if (npc == Npcs.EMBLEM_TRADER_316) { - on_npc_option(npc = npc, option = "show-streaks") { + } else if (npc == Npcs.EMBLEM_TRADER_7943) { + on_npc_option(npc = npc, option = "coffer") { player.queue { if (options("Yes", "No", title = "Show kill streak data?") == 1) { show_killstreak_data(player) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/bankers.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/bankers.plugin.kts index b129f04249..6c732159f0 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/bankers.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/bankers.plugin.kts @@ -1,6 +1,6 @@ package gg.rsmod.plugins.content.areas.edgeville.spawns -spawn_npc(npc = Npcs.BANKER_1028, x = 3096, z = 3492, direction = Direction.NORTH) -spawn_npc(npc = Npcs.BANKER_1027, x = 3098, z = 3492, direction = Direction.NORTH) -spawn_npc(npc = Npcs.BANKER_1028, x = 3096, z = 3491, direction = Direction.WEST) -spawn_npc(npc = Npcs.BANKER_1027, x = 3096, z = 3489, direction = Direction.WEST) \ No newline at end of file +spawn_npc(npc = Npcs.BANKER_1634, x = 3096, z = 3492, direction = Direction.NORTH) +spawn_npc(npc = Npcs.BANKER_1633, x = 3098, z = 3492, direction = Direction.NORTH) +spawn_npc(npc = Npcs.BANKER_1634, x = 3096, z = 3491, direction = Direction.WEST) +spawn_npc(npc = Npcs.BANKER_1633, x = 3096, z = 3489, direction = Direction.WEST) \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/guards.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/guards.plugin.kts index 9891c103ca..86ecca5adb 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/guards.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/guards.plugin.kts @@ -1,11 +1,11 @@ package gg.rsmod.plugins.content.areas.edgeville.spawns // Near jail -spawn_npc(npc = Npcs.GUARD_3094, x = 3108, z = 3513, walkRadius = 5) -spawn_npc(npc = Npcs.GUARD_3094, x = 3110, z = 3515, walkRadius = 5) -spawn_npc(npc = Npcs.GUARD_3094, x = 3114, z = 3513, walkRadius = 5) -spawn_npc(npc = Npcs.GUARD_3094, x = 3114, z = 3517, walkRadius = 5) +spawn_npc(npc = Npcs.GUARD_1001, x = 3108, z = 3513, walkRadius = 5) +spawn_npc(npc = Npcs.GUARD_1001, x = 3110, z = 3515, walkRadius = 5) +spawn_npc(npc = Npcs.GUARD_1001, x = 3114, z = 3513, walkRadius = 5) +spawn_npc(npc = Npcs.GUARD_1001, x = 3114, z = 3517, walkRadius = 5) // Near ditch -spawn_npc(npc = Npcs.GUARD_3094, x = 3094, z = 3518, walkRadius = 5) -spawn_npc(npc = Npcs.GUARD_3094, x = 3085, z = 3519, walkRadius = 5) \ No newline at end of file +spawn_npc(npc = Npcs.GUARD_1001, x = 3094, z = 3518, walkRadius = 5) +spawn_npc(npc = Npcs.GUARD_1001, x = 3085, z = 3519, walkRadius = 5) \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/men.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/men.plugin.kts index 0479905b91..773f6c87a7 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/men.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/edgeville/spawns/men.plugin.kts @@ -1,13 +1,13 @@ package gg.rsmod.plugins.content.areas.edgeville.spawns // Inside east building -spawn_npc(npc = Npcs.MAN_3078, x = 3094, z = 3511, walkRadius = 3) -spawn_npc(npc = Npcs.MAN_3078, x = 3097, z = 3511, walkRadius = 3) +spawn_npc(npc = Npcs.MAN_1118, x = 3094, z = 3511, walkRadius = 3) +spawn_npc(npc = Npcs.MAN_1118, x = 3097, z = 3511, walkRadius = 3) -spawn_npc(npc = Npcs.MAN_3080, x = 3097, z = 3508, walkRadius = 3) -spawn_npc(npc = Npcs.MAN_3080, x = 3092, z = 3508, walkRadius = 3) +spawn_npc(npc = Npcs.MAN_1138, x = 3097, z = 3508, walkRadius = 3) +spawn_npc(npc = Npcs.MAN_1138, x = 3092, z = 3508, walkRadius = 3) // Outside east building -spawn_npc(npc = Npcs.MAN_3078, x = 3105, z = 3510, walkRadius = 10) -spawn_npc(npc = Npcs.MAN_3079, x = 3103, z = 3515, walkRadius = 10) -spawn_npc(npc = Npcs.MAN_3080, x = 3103, z = 3509, walkRadius = 10) \ No newline at end of file +spawn_npc(npc = Npcs.MAN_3014, x = 3105, z = 3510, walkRadius = 10) +spawn_npc(npc = Npcs.MAN_3014, x = 3103, z = 3515, walkRadius = 10) +spawn_npc(npc = Npcs.MAN_1138, x = 3103, z = 3509, walkRadius = 10) \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/wilderness/wilderness_areas.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/wilderness/wilderness_areas.plugin.kts index 9ea513294b..c26262ee60 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/wilderness/wilderness_areas.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/areas/wilderness/wilderness_areas.plugin.kts @@ -40,7 +40,7 @@ fun set_in_wild(player: Player, inWilderness: Boolean) { player.closeInterface(dest = InterfaceDestination.PVP_OVERLAY) player.removeOption(2) } - player.setComponentHidden(interfaceId = INTERFACE_ID, component = SKULL_CROSSOUT_COMPONENT, hidden = inWilderness) + //player.setComponentHidden(interfaceId = INTERFACE_ID, component = SKULL_CROSSOUT_COMPONENT, hidden = inWilderness) } fun in_wilderness(tile: Tile): Boolean = tile.getWildernessLevel() > 0 \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/commands.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/commands.plugin.kts index da957c90b9..02bb761006 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/commands.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/commands.plugin.kts @@ -5,14 +5,16 @@ import gg.rsmod.game.model.bits.INFINITE_VARS_STORAGE import gg.rsmod.game.model.bits.InfiniteVarsType import gg.rsmod.game.model.combat.CombatClass import gg.rsmod.game.model.priv.Privilege +import gg.rsmod.game.model.timer.FORCE_DISCONNECTION_TIMER +import gg.rsmod.plugins.content.cmd.Commands_plugin.Command.tryWithUsage import gg.rsmod.plugins.content.combat.CombatConfigs import gg.rsmod.plugins.content.combat.formula.MagicCombatFormula import gg.rsmod.plugins.content.combat.formula.MeleeCombatFormula import gg.rsmod.plugins.content.combat.formula.RangedCombatFormula import gg.rsmod.plugins.content.combat.getCombatTarget -import gg.rsmod.plugins.content.inter.bank.openBank import gg.rsmod.plugins.content.magic.MagicSpells import java.text.DecimalFormat +import kotlin.system.exitProcess on_command("max") { val target = player.getCombatTarget() ?: player @@ -44,6 +46,21 @@ on_command("empty") { player.inventory.removeAll() } +on_command("shutdown", Privilege.ADMIN_POWER) { + val args = player.getCommandArgs() + tryWithUsage(player, args, "Invalid format! Example of proper command ::shutdown 500"){ values -> + val cycles = values[0].toInt() + world.queue { + world.rebootTimer = cycles + world.sendRebootTimer(cycles) + wait(cycles) + world.players.forEach { player -> player.timers[FORCE_DISCONNECTION_TIMER] = 0 } + wait(5) + exitProcess(0) + } + } +} + on_command("reboot", Privilege.ADMIN_POWER) { val args = player.getCommandArgs() tryWithUsage(player, args, "Invalid format! Example of proper command ::reboot 500") { values -> @@ -58,10 +75,6 @@ on_command("home", Privilege.ADMIN_POWER) { player.moveTo(home) } -on_command("obank", Privilege.ADMIN_POWER) { - player.openBank() -} - on_command("noclip", Privilege.ADMIN_POWER) { val noClip = !(player.attr[NO_CLIP_ATTR] ?: false) player.attr[NO_CLIP_ATTR] = noClip @@ -305,15 +318,6 @@ on_command("getvarbits", Privilege.ADMIN_POWER) { } } -on_command("interface", Privilege.ADMIN_POWER) { - val args = player.getCommandArgs() - tryWithUsage(player, args, "Invalid format! Example of proper command ::interface 214") { values -> - val component = values[0].toInt() - player.openInterface(component, InterfaceDestination.MAIN_SCREEN) - player.message("Opening interface $component") - } -} - on_command("clip", Privilege.ADMIN_POWER) { val chunk = world.chunks.getOrCreate(player.tile) val matrix = chunk.getMatrix(player.tile.height) @@ -329,11 +333,13 @@ on_command("clip", Privilege.ADMIN_POWER) { } } -fun tryWithUsage(player: Player, args: Array, failMessage: String, tryUnit: Function1, Unit>) { - try { - tryUnit.invoke(args) - } catch (e: Exception) { - player.message(failMessage) - e.printStackTrace() +object Command { + fun tryWithUsage(player: Player, args: Array, failMessage: String, tryUnit: Function1, Unit>) { + try { + tryUnit.invoke(args) + } catch (e: Exception) { + player.message(failMessage) + e.printStackTrace() + } } -} \ No newline at end of file +} diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/devops.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/devops.plugin.kts new file mode 100644 index 0000000000..48586ed270 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/cmd/devops.plugin.kts @@ -0,0 +1,48 @@ +package gg.rsmod.plugins.content.cmd + +import gg.rsmod.game.model.priv.Privilege +import gg.rsmod.plugins.content.cmd.Commands_plugin.Command.tryWithUsage + +on_command("script", Privilege.DEV_POWER){ + val args = player.getCommandArgs() + tryWithUsage(player, args, "Invalid format! Example of proper command ::script id args...") { values -> + val id = values[0].toInt() + val clientArgs = MutableList(values.size-1) {} + for(arg in 1 until values.size) + clientArgs[arg-1] = values[arg].toIntOrNull() ?: values[arg] + player.runClientScript(id, *clientArgs.toTypedArray()) + player.message("Executing cs_$id$clientArgs") + } +} + +on_command("interface", Privilege.DEV_POWER) { + val args = player.getCommandArgs() + tryWithUsage(player, args, "Invalid format! Example of proper command ::interface 214") { values -> + val component = values[0].toInt() + player.openInterface(component, InterfaceDestination.MAIN_SCREEN) + player.message("Opening interface $component") + } +} + +on_command("openinterface", Privilege.DEV_POWER) { + val args = player.getCommandArgs() + tryWithUsage(player, args, "Invalid format! Example of proper command ::openinterface interfId parentId pChildId clickThrough isModal") { values -> + val component = values[0].toInt() + val parent = values[1].toIntOrNull() ?: getDisplayComponentId(player.interfaces.displayMode) + val child = values[2].toInt() + var clickable = values[3].toIntOrNull() ?: 0 + clickable = if(clickable != 1) 0 else 1 + val modal = values[4].toIntOrNull() ?: 1 == 1 + player.openInterface(parent, child, component, clickable, isModal = modal) + player.message("Opening interface $component on $parent:$child") + } +} + +on_command("closeinterface", Privilege.DEV_POWER) { + val args = player.getCommandArgs() + tryWithUsage(player, args, "Invalid format! Example of proper command ::closeinterface interfaceId") { values -> + val interfaceId = values[0].toInt() + player.closeInterface(interfaceId) + player.message("Closing interface $interfaceId") + } +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/AttackTab.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/AttackTab.kt index ee90c24c24..fda0af2787 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/AttackTab.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/AttackTab.kt @@ -8,6 +8,7 @@ import gg.rsmod.plugins.api.ext.setVarp * @author Tom */ object AttackTab { + const val ATTACK_TAB_INTERFACE_ID = 593 const val ATTACK_STYLE_VARP = 43 const val DISABLE_AUTO_RETALIATE_VARP = 172 diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/attack_tab.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/attack_tab.plugin.kts index 79705da6d3..7faf1e3c84 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/attack_tab.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/attack/attack_tab.plugin.kts @@ -1,5 +1,10 @@ package gg.rsmod.plugins.content.inter.attack +import gg.rsmod.plugins.content.inter.attack.AttackTab.ATTACK_TAB_INTERFACE_ID +import gg.rsmod.plugins.content.inter.attack.AttackTab.ATTACK_STYLE_VARP +import gg.rsmod.plugins.content.inter.attack.AttackTab.DISABLE_AUTO_RETALIATE_VARP +import gg.rsmod.plugins.content.inter.attack.AttackTab.SPECIAL_ATTACK_VARP +import gg.rsmod.plugins.content.inter.attack.AttackTab.setEnergy import gg.rsmod.game.model.attr.NEW_ACCOUNT_ATTR /** @@ -7,53 +12,53 @@ import gg.rsmod.game.model.attr.NEW_ACCOUNT_ATTR */ on_login { if (player.attr.getOrDefault(NEW_ACCOUNT_ATTR, false)) { - AttackTab.setEnergy(player, 100) + setEnergy(player, 100) } } /** * Attack style buttons */ -on_button(interfaceId = 593, component = 3) { - player.setVarp(AttackTab.ATTACK_STYLE_VARP, 0) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 4) { + player.setVarp(ATTACK_STYLE_VARP, 0) } -on_button(interfaceId = 593, component = 7) { - player.setVarp(AttackTab.ATTACK_STYLE_VARP, 1) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 8) { + player.setVarp(ATTACK_STYLE_VARP, 1) } -on_button(interfaceId = 593, component = 11) { - player.setVarp(AttackTab.ATTACK_STYLE_VARP, 2) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 12) { + player.setVarp(ATTACK_STYLE_VARP, 2) } -on_button(interfaceId = 593, component = 15) { - player.setVarp(AttackTab.ATTACK_STYLE_VARP, 3) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 16) { + player.setVarp(ATTACK_STYLE_VARP, 3) } /** * Toggle auto-retaliate button. */ -on_button(interfaceId = 593, component = 29) { - player.toggleVarp(AttackTab.DISABLE_AUTO_RETALIATE_VARP) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 30) { + player.toggleVarp(DISABLE_AUTO_RETALIATE_VARP) } /** * Toggle special attack. */ -on_button(interfaceId = 593, component = 35) { - player.toggleVarp(AttackTab.SPECIAL_ATTACK_VARP) +on_button(interfaceId = ATTACK_TAB_INTERFACE_ID, component = 36) { + player.toggleVarp(SPECIAL_ATTACK_VARP) } /** * Disable special attack when switching weapons. */ on_equip_to_slot(EquipmentType.WEAPON.id) { - player.setVarp(AttackTab.SPECIAL_ATTACK_VARP, 0) + player.setVarp(SPECIAL_ATTACK_VARP, 0) } /** * Disable special attack on log-out. */ on_logout { - player.setVarp(AttackTab.SPECIAL_ATTACK_VARP, 0) + player.setVarp(SPECIAL_ATTACK_VARP, 0) } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt index 2f1de3b972..b271449e1b 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Bank.kt @@ -6,16 +6,16 @@ import gg.rsmod.game.model.entity.Player import gg.rsmod.game.model.item.Item import gg.rsmod.plugins.api.InterfaceDestination import gg.rsmod.plugins.api.ext.* +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint +import gg.rsmod.plugins.content.inter.bank.BankTabs.SELECTED_TAB_VARBIT +import gg.rsmod.plugins.content.inter.bank.BankTabs.BANK_TAB_ROOT_VARBIT /** * @author Tom */ object Bank { - - const val TAB_COUNT = 9 - const val BANK_INTERFACE_ID = 12 - const val BANK_MAINTAB_COMPONENT = 13 + const val BANK_MAINTAB_COMPONENT = 12 const val INV_INTERFACE_ID = 15 const val INV_INTERFACE_CHILD = 3 @@ -24,8 +24,7 @@ object Bank { const val ALWAYS_PLACEHOLD_VARBIT = 3755 const val LAST_X_INPUT = 3960 const val QUANTITY_VARBIT = 6590 - const val SELECTED_TAB_VARBIT = 4150 - const val TAB0_VARBIT = 4171 + const val INCINERATOR_VARBIT = 5102 /** * Visual varbit for the "Bank your loot" tab area interface when storing @@ -88,6 +87,9 @@ object Bank { val from = p.inventory val to = p.bank + val oldFree = to.freeSlotCount + val curTab = p.getVarbit(SELECTED_TAB_VARBIT) + val amount = Math.min(from.getItemCount(id), amt) var deposited = 0 @@ -113,6 +115,13 @@ object Bank { if (transfer != null) { deposited += transfer.completed + if(placeholderSlot==-1 && curTab!=0 && oldFree!=to.freeSlotCount){ // shift newly add items to tab position + var fromPos = to.getItemIndex(copy.id, false) + fromPos = if(fromPos != -1) fromPos else to.nextFreeSlot-1 + val toPos = insertionPoint(p, curTab) + to.insert(fromPos, toPos) + p.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, p.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)+1) + } } } @@ -128,15 +137,17 @@ object Bank { p.setComponentText(interfaceId = BANK_INTERFACE_ID, component = 8, text = p.bank.capacity.toString()) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 13, range = 0..815, setting = 1312766) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 13, range = 825..833, setting = 2) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 13, range = 834..843, setting = 1048576) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 11, range = 10..10, setting = 1048578) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 11, range = 11..19, setting = 1179714) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 12, range = 0..815, setting = 1312766) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 12, range = 825..833, setting = 2) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 12, range = 834..843, setting = 1048576) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 10, range = 10..10, setting = 1048706) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 10, range = 11..19, setting = 1179842) p.setInterfaceEvents(interfaceId = INV_INTERFACE_ID, component = 3, range = 0..27, setting = 1181694) - p.setInterfaceEvents(interfaceId = INV_INTERFACE_ID, component = 10, range = 0..27, setting = 1054) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 47, range = 1..816, setting = 2) - p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 50, range = 0..3, setting = 2) + p.setInterfaceEvents(interfaceId = INV_INTERFACE_ID, component = 13, range = 0..27, setting = 1054) + p.setInterfaceEvents(interfaceId = INV_INTERFACE_ID, component = 19, range = 0..27, setting = 1054) + p.setInterfaceEvents(interfaceId = INV_INTERFACE_ID, component = 4, range = 0..27, setting = 1180674) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 46, range = 1..816, setting = 2) + p.setInterfaceEvents(interfaceId = BANK_INTERFACE_ID, component = 49, range = 0..3, setting = 2) p.setVarbit(BANK_YOUR_LOOT_VARBIT, 0) } diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt new file mode 100644 index 0000000000..eda9330be6 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/BankTabs.kt @@ -0,0 +1,170 @@ +package gg.rsmod.plugins.content.inter.bank + +import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT +import gg.rsmod.game.model.entity.Player +import gg.rsmod.game.model.item.Item +import gg.rsmod.plugins.api.ext.getVarbit +import gg.rsmod.plugins.api.ext.setVarbit +import gg.rsmod.plugins.content.inter.bank.Bank.insert + +/** + * @author bmyte + */ +object BankTabs{ + const val BANK_TABLIST_ID = 10 + + const val SELECTED_TAB_VARBIT = 4150 + const val BANK_TAB_ROOT_VARBIT = 4170 + + /** + * Handles the dropping of items into the specified tab of the player's [Bank]. + * + * @param player + * The acting [Player] for which the [INTERACTING_ITEM_SLOT] [Item] should + * be dropped into the specified [dstTab] + * + * @param dstTab + * The bank tab number for which the [INTERACTING_ITEM_SLOT] [Item] is + * to be dropped into. + */ + fun dropToTab(player: Player, dstTab: Int){ + val container = player.bank + + val srcSlot = player.attr[INTERACTING_ITEM_SLOT]!! + val curTab = getCurrentTab(player, srcSlot) + + if(dstTab == curTab){ + return + } + else{ + if(dstTab == 0){ //add to main tab don't insert + container.insert(srcSlot, container.nextFreeSlot - 1) + player.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)-1) + // check for empty tab shift + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } else{ + if(dstTab < curTab || curTab == 0) + container.insert(srcSlot, insertionPoint(player, dstTab)) + else + container.insert(srcSlot, insertionPoint(player, dstTab) - 1) + player.setVarbit(BANK_TAB_ROOT_VARBIT+dstTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+dstTab)+1) + if(curTab != 0){ + player.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)-1) + // check for empty tab shift + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } + } + } + } + + /** + * Determines the tab a given slot falls into based on + * associative varbit analysis. + * + * @param player + * The acting [Player] whose [Bank] tabs are to be checked + * + * @param slot + * The associated slot for a given [Item] within the player's [Bank] + * + * @return -> Int + * The tab which the specified [slot] resides + */ + fun getCurrentTab(player: Player, slot: Int) : Int { + var current = 0 + for(tab in 1..9){ + current += player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + if(slot < current){ + return tab + } + } + return 0 + } + + /** + * Tabulates the number of tabs the [player] is currently using + * based off associative varbit analysis. + * + * @param player + * The acting [Player] to get the number of in-use tabs for + * + * @return -> Int + * The number of tabs the player has in-use/unlocked + */ + fun numTabsUnlocked(player: Player) : Int { + var tabsUnlocked = 0 + for(tab in 1..9) + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) > 0) + tabsUnlocked++ + return tabsUnlocked + } + + /** + * Determines the insertion point for an item being added to + * a tab based on the tab order and number of items in it and + * previous tabs. + * + * @param player + * The acting [Player] to find the insertion point for placing + * an [Item] in the bank tab specified by [tabIndex] + * + * @param tabIndex + * The tab for which the insertion point is desired + * + * @return -> Int + * The insertion index for inserting into the desired tab + */ + fun insertionPoint(player: Player, tabIndex: Int = 0) : Int { + if(tabIndex == 0) + return player.bank.nextFreeSlot + var dex = 0 + for(tab in 1..tabIndex) + dex += player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + return dex + } + + /** + * Determines the beginning index for a specified bank tab + * based on the tab order and number of items in previous tabs. + * + * @param player + * The acting [Player] to find the start point for the bank tab + * specified by [tabIndex] + * + * @param tabIndex + * The tab for which the start point is desired + * + * @return -> Int + * The start index for the beginning of the desired tab + */ + fun startPoint(player: Player, tabIndex: Int = 0) : Int { + var dex = 0 + if(tabIndex == 0){ + for(tab in 1..9) + dex += player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + } else{ + for(tab in 1 until tabIndex) + dex += player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + } + return dex + } + + /** + * Performs the shifting of [Bank] tabs' varbit pointers to remove + * an empty tab, effectively shifting greater tabs down. + * + * @param player + * The acting [Player] which needs bank tabs shifted + * + * @param emptyTabIdx + * The newly emptied bank tab to shift out + */ + fun shiftTabs(player: Player, emptyTabIdx: Int){ + val numUnlocked = numTabsUnlocked(player) + for(tab in emptyTabIdx..numUnlocked) + player.setVarbit(BANK_TAB_ROOT_VARBIT+tab, player.getVarbit(BANK_TAB_ROOT_VARBIT+tab+1)) + player.setVarbit(BANK_TAB_ROOT_VARBIT+numUnlocked+1, 0) + } +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/PawnExt.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Extensions.kt similarity index 100% rename from game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/PawnExt.kt rename to game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/Extensions.kt diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts index dc60cc58e4..dabc515694 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank.plugin.kts @@ -3,42 +3,92 @@ package gg.rsmod.plugins.content.inter.bank import gg.rsmod.game.action.EquipAction import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.bank.Bank.BANK_INTERFACE_ID +import gg.rsmod.plugins.content.inter.bank.Bank.BANK_MAINTAB_COMPONENT +import gg.rsmod.plugins.content.inter.bank.Bank.INV_INTERFACE_ID +import gg.rsmod.plugins.content.inter.bank.Bank.INV_INTERFACE_CHILD +import gg.rsmod.plugins.content.inter.bank.Bank.INCINERATOR_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.REARRANGE_MODE_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.WITHDRAW_AS_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.QUANTITY_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.LAST_X_INPUT +import gg.rsmod.plugins.content.inter.bank.Bank.ALWAYS_PLACEHOLD_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.deposit import gg.rsmod.plugins.content.inter.bank.Bank.insert +import gg.rsmod.plugins.content.inter.bank.Bank.withdraw import gg.rsmod.plugins.content.inter.bank.Bank.removePlaceholder - -on_interface_open(Bank.BANK_INTERFACE_ID) { +import gg.rsmod.plugins.content.inter.bank.BankTabs.SELECTED_TAB_VARBIT +import gg.rsmod.plugins.content.inter.bank.BankTabs.BANK_TAB_ROOT_VARBIT +import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.getCurrentTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint +import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked +import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs + +on_interface_open(BANK_INTERFACE_ID) { + var slotOffset = 0 + for(tab in 1..9){ + val size = player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + for(slot in slotOffset until slotOffset+size){ // from beginning slot of tab to end + if(player.bank[slot] == null){ + player.setVarbit(BANK_TAB_ROOT_VARBIT+tab, player.getVarbit(BANK_TAB_ROOT_VARBIT+tab)-1) + // check for empty tab shift + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+tab)==0 && tab<=numTabsUnlocked(player)) + shiftTabs(player, tab) + } + } + slotOffset += size + } player.bank.shift() } -on_interface_close(Bank.BANK_INTERFACE_ID) { +on_interface_close(BANK_INTERFACE_ID) { player.closeInterface(dest = InterfaceDestination.TAB_AREA) player.closeInputDialog() } -intArrayOf(17, 19).forEachIndexed { index, button -> - on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = button) { - player.setVarbit(Bank.REARRANGE_MODE_VARBIT, index) +intArrayOf(16, 18).forEachIndexed { index, button -> + on_button(interfaceId = BANK_INTERFACE_ID, component = button) { + player.setVarbit(REARRANGE_MODE_VARBIT, index) } } -intArrayOf(22, 24).forEachIndexed { index, button -> - on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = button) { - player.setVarbit(Bank.WITHDRAW_AS_VARBIT, index) +intArrayOf(21, 23).forEachIndexed { index, button -> + on_button(interfaceId = BANK_INTERFACE_ID, component = button) { + player.setVarbit(WITHDRAW_AS_VARBIT, index) } } -on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 38) { - player.toggleVarbit(Bank.ALWAYS_PLACEHOLD_VARBIT) +on_button(interfaceId = BANK_INTERFACE_ID, component = 37) { + player.toggleVarbit(ALWAYS_PLACEHOLD_VARBIT) } -intArrayOf(28, 30, 32, 34, 36).forEach { quantity -> - on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = quantity) { - val state = (quantity - 28) / 2 - player.setVarbit(Bank.QUANTITY_VARBIT, state) +intArrayOf(27, 29, 31, 33, 35).forEach { quantity -> + on_button(interfaceId = BANK_INTERFACE_ID, component = quantity) { + val state = (quantity - 27) / 2 + player.setVarbit(QUANTITY_VARBIT, state) } } -on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 42) { +/** + * Added incinerator support. + */ +on_button(interfaceId = BANK_INTERFACE_ID, component = 52) { + player.toggleVarbit(INCINERATOR_VARBIT) +} + +on_button(interfaceId = BANK_INTERFACE_ID, component = 46) { + val slot = player.getInteractingSlot()-1 + val destroyItems = player.bank[slot]!! + val tabAffected = getCurrentTab(player, slot) + player.message("attempting to incinerate $destroyItems") + player.bank.remove(destroyItems, assureFullRemoval = true) + player.setVarbit(BANK_TAB_ROOT_VARBIT+tabAffected, player.getVarbit(BANK_TAB_ROOT_VARBIT+tabAffected)-1) + player.bank.shift() +} + +// bank inventory +on_button(interfaceId = BANK_INTERFACE_ID, component = 41) { val from = player.inventory val to = player.bank @@ -55,6 +105,11 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 42) { } if (deposited > 0) { any = true + val curTab = player.getVarbit(SELECTED_TAB_VARBIT) + if(placeholderSlot==-1 && curTab!=0){ + to.insert(to.getItemIndex(item.id, false), insertionPoint(player, curTab)) + player.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)+1) + } } } @@ -63,7 +118,8 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 42) { } } -on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 44) { +// bank equipment +on_button(interfaceId = BANK_INTERFACE_ID, component = 43) { val from = player.equipment val to = player.bank @@ -80,6 +136,11 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 44) { } if (deposited > 0) { any = true + val curTab = player.getVarbit(SELECTED_TAB_VARBIT) + if(placeholderSlot==-1 && curTab!=0){ + to.insert(to.getItemIndex(item.id, false), insertionPoint(player, curTab)) + player.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)+1) + } EquipAction.onItemUnequip(player, item.id, i) } } @@ -89,7 +150,8 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 44) { } } -on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CHILD) p@ { +// deposit +on_button(interfaceId = INV_INTERFACE_ID, component = INV_INTERFACE_CHILD) p@ { val opt = player.getInteractingOption() val slot = player.getInteractingSlot() val item = player.inventory[slot] ?: return@p @@ -99,7 +161,7 @@ on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CH return@p } - val quantityVarbit = player.getVarbit(Bank.QUANTITY_VARBIT) + val quantityVarbit = player.getVarbit(QUANTITY_VARBIT) var amount: Int when { @@ -107,7 +169,7 @@ on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CH 2 -> 1 4 -> 5 5 -> 10 - 6 -> player.getVarbit(Bank.LAST_X_INPUT) + 6 -> player.getVarbit(LAST_X_INPUT) 7 -> -1 // X 8 -> 0 // All else -> return@p @@ -115,7 +177,7 @@ on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CH opt == 2 -> amount = when (quantityVarbit) { 1 -> 5 2 -> 10 - 3 -> if (player.getVarbit(Bank.LAST_X_INPUT) == 0) -1 else player.getVarbit(Bank.LAST_X_INPUT) + 3 -> if (player.getVarbit(LAST_X_INPUT) == 0) -1 else player.getVarbit(LAST_X_INPUT) 4 -> 0 // All else -> return@p } @@ -123,7 +185,7 @@ on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CH 3 -> 1 4 -> 5 5 -> 10 - 6 -> player.getVarbit(Bank.LAST_X_INPUT) + 6 -> player.getVarbit(LAST_X_INPUT) 7 -> -1 // X 8 -> 0 // All else -> return@p @@ -136,17 +198,18 @@ on_button(interfaceId = Bank.INV_INTERFACE_ID, component = Bank.INV_INTERFACE_CH player.queue(TaskPriority.WEAK) { amount = inputInt("How many would you like to bank?") if (amount > 0) { - player.setVarbit(Bank.LAST_X_INPUT, amount) - Bank.deposit(player, item.id, amount) + player.setVarbit(LAST_X_INPUT, amount) + deposit(player, item.id, amount) } } return@p } - Bank.deposit(player, item.id, amount) + deposit(player, item.id, amount) } -on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { +// withdraw +on_button(interfaceId = BANK_INTERFACE_ID, component = BANK_MAINTAB_COMPONENT) p@ { val opt = player.getInteractingOption() val slot = player.getInteractingSlot() val item = player.bank[slot] ?: return@p @@ -159,13 +222,13 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { var amount: Int var placehold = false - val quantityVarbit = player.getVarbit(Bank.QUANTITY_VARBIT) + val quantityVarbit = player.getVarbit(QUANTITY_VARBIT) when { quantityVarbit == 0 -> amount = when (opt) { 1 -> 1 3 -> 5 4 -> 10 - 5 -> player.getVarbit(Bank.LAST_X_INPUT) + 5 -> player.getVarbit(LAST_X_INPUT) 6 -> -1 // X 7 -> item.amount 8 -> item.amount - 1 @@ -179,7 +242,7 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { 0 -> 1 1 -> 5 2 -> 10 - 3 -> if (player.getVarbit(Bank.LAST_X_INPUT) == 0) -1 else player.getVarbit(Bank.LAST_X_INPUT) + 3 -> if (player.getVarbit(LAST_X_INPUT) == 0) -1 else player.getVarbit(LAST_X_INPUT) 4 -> item.amount 8 -> { placehold = true @@ -191,7 +254,7 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { 2 -> 1 3 -> 5 4 -> 10 - 5 -> player.getVarbit(Bank.LAST_X_INPUT) + 5 -> player.getVarbit(LAST_X_INPUT) 6 -> -1 // X 7 -> item.amount 8 -> item.amount - 1 @@ -215,8 +278,8 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { player.queue(TaskPriority.WEAK) { amount = inputInt("How many would you like to withdraw?") if (amount > 0) { - player.setVarbit(Bank.LAST_X_INPUT, amount) - Bank.withdraw(player, item.id, amount, slot, placehold) + player.setVarbit(LAST_X_INPUT, amount) + withdraw(player, item.id, amount, slot, placehold) } } return@p @@ -224,7 +287,7 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { amount = Math.max(0, amount) if (amount > 0) { - Bank.withdraw(player, item.id, amount, slot, placehold) + withdraw(player, item.id, amount, slot, placehold) } } @@ -232,8 +295,8 @@ on_button(interfaceId = Bank.BANK_INTERFACE_ID, component = 13) p@ { * Swap items in bank inventory interface. */ on_component_to_component_item_swap( - srcInterfaceId = Bank.INV_INTERFACE_ID, srcComponent = Bank.INV_INTERFACE_CHILD, - dstInterfaceId = Bank.INV_INTERFACE_ID, dstComponent = Bank.INV_INTERFACE_CHILD) { + srcInterfaceId = INV_INTERFACE_ID, srcComponent = INV_INTERFACE_CHILD, + dstInterfaceId = INV_INTERFACE_ID, dstComponent = INV_INTERFACE_CHILD) { val srcSlot = player.attr[INTERACTING_ITEM_SLOT]!! val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! @@ -248,19 +311,44 @@ on_component_to_component_item_swap( * Swap items in main bank tab. */ on_component_to_component_item_swap( - srcInterfaceId = Bank.BANK_INTERFACE_ID, srcComponent = Bank.BANK_MAINTAB_COMPONENT, - dstInterfaceId = Bank.BANK_INTERFACE_ID, dstComponent = Bank.BANK_MAINTAB_COMPONENT) { + srcInterfaceId = BANK_INTERFACE_ID, srcComponent = BANK_MAINTAB_COMPONENT, + dstInterfaceId = BANK_INTERFACE_ID, dstComponent = BANK_MAINTAB_COMPONENT) { val srcSlot = player.attr[INTERACTING_ITEM_SLOT]!! val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! val container = player.bank + /** + * Handles the empty box components in the last row of each tab + * for dropping items into the specified tab's empty space. + */ + if(dstSlot in 834..843){ + dropToTab(player, dstSlot - 834) + return@on_component_to_component_item_swap + } + if (srcSlot in 0 until container.occupiedSlotCount && dstSlot in 0 until container.occupiedSlotCount) { - val insertMode = player.getVarbit(Bank.REARRANGE_MODE_VARBIT) == 1 + val insertMode = player.getVarbit(REARRANGE_MODE_VARBIT) == 1 if (!insertMode) { container.swap(srcSlot, dstSlot) - } else { - container.insert(srcSlot, dstSlot) + } else { // insert mode patch for movement between bank tabs and updating varbits + val curTab = getCurrentTab(player, srcSlot) + val dstTab = getCurrentTab(player, dstSlot) + if(dstTab != curTab){ + if((dstTab>curTab && curTab!=0) || dstTab==0) + container.insert(srcSlot, dstSlot - 1) + else + container.insert(srcSlot, dstSlot) + + if(dstTab != 0) {player.setVarbit(BANK_TAB_ROOT_VARBIT+dstTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+dstTab)+1)} + if(curTab != 0) { + player.setVarbit(BANK_TAB_ROOT_VARBIT+curTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)-1) + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+curTab)==0 && curTab<=numTabsUnlocked(player)) + shiftTabs(player, curTab) + } + } else{ + container.insert(srcSlot, dstSlot) + } } } else { // Sync the container on the client diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts new file mode 100644 index 0000000000..127d5e0398 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/bank_tabs.plugin.kts @@ -0,0 +1,134 @@ +package gg.rsmod.plugins.content.inter.bank + +import gg.rsmod.game.model.attr.INTERACTING_COMPONENT_CHILD +import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT +import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.bank.Bank.BANK_INTERFACE_ID +import gg.rsmod.plugins.content.inter.bank.Bank.BANK_MAINTAB_COMPONENT +import gg.rsmod.plugins.content.inter.bank.Bank.REARRANGE_MODE_VARBIT +import gg.rsmod.plugins.content.inter.bank.Bank.insert +import gg.rsmod.plugins.content.inter.bank.BankTabs.BANK_TABLIST_ID +import gg.rsmod.plugins.content.inter.bank.BankTabs.BANK_TAB_ROOT_VARBIT +import gg.rsmod.plugins.content.inter.bank.BankTabs.SELECTED_TAB_VARBIT +import gg.rsmod.plugins.content.inter.bank.BankTabs.dropToTab +import gg.rsmod.plugins.content.inter.bank.BankTabs.insertionPoint +import gg.rsmod.plugins.content.inter.bank.BankTabs.numTabsUnlocked +import gg.rsmod.plugins.content.inter.bank.BankTabs.shiftTabs +import gg.rsmod.plugins.content.inter.bank.BankTabs.startPoint + +/** + * Handles setting the current selected tab varbit on tab selection. + */ +on_button(BANK_INTERFACE_ID, BANK_TABLIST_ID){ + val dstTab = player.getInteractingSlot()-10 + if(dstTab <= numTabsUnlocked(player)) + player.setVarbit(SELECTED_TAB_VARBIT, dstTab) +} + +/** + * Moving items to tabs via the top tabs bar. + */ +on_component_to_component_item_swap( + srcInterfaceId = BANK_INTERFACE_ID, srcComponent = BANK_MAINTAB_COMPONENT, + dstInterfaceId = BANK_INTERFACE_ID, dstComponent = BANK_TABLIST_ID) { + val srcComponent = player.attr[INTERACTING_COMPONENT_CHILD]!! + if(srcComponent == BANK_TABLIST_ID){ // attempting to drop tab on bank!! + return@on_component_to_component_item_swap + } else{ // perform drop to tab + val dstSlot = player.attr[OTHER_ITEM_SLOT_ATTR]!! + dropToTab(player, dstSlot - 10) + } +} + +/** + * Moving tabs via the top tabs bar to swap/insert their order. + */ +on_component_to_component_item_swap( + srcInterfaceId = BANK_INTERFACE_ID, srcComponent = BANK_TABLIST_ID, + dstInterfaceId = BANK_INTERFACE_ID, dstComponent = BANK_TABLIST_ID) { + val container = player.bank + + val srcTab = player.attr[INTERACTING_ITEM_SLOT]!! - 10 + val dstTab = player.attr[OTHER_ITEM_SLOT_ATTR]!! - 10 + + if(dstTab==0){ + var item = startPoint(player, srcTab) + var end = insertionPoint(player, srcTab) + while(item != end){ + container.insert(item, container.nextFreeSlot - 1) + end-- + player.setVarbit(BANK_TAB_ROOT_VARBIT+srcTab, player.getVarbit(BANK_TAB_ROOT_VARBIT+srcTab)-1) + // check for empty tab shift + if(player.getVarbit(BANK_TAB_ROOT_VARBIT+srcTab)==0 && srcTab<=numTabsUnlocked(player)) + shiftTabs(player, srcTab) + } + return@on_component_to_component_item_swap + } + + val srcSize = player.getVarbit(BANK_TAB_ROOT_VARBIT+srcTab) + val dstSize = player.getVarbit(BANK_TAB_ROOT_VARBIT+dstTab) + + val insertMode = player.getVarbit(REARRANGE_MODE_VARBIT) == 1 + if(insertMode){ + if(dstTab < srcTab){ // insert each of the items in srcTab directly before dstTab moving index up each time to account for shifts + var destination = startPoint(player, dstTab) + for(item in startPoint(player, srcTab) until insertionPoint(player, srcTab)) + container.insert(item, destination++) + + // update tab size varbits according to insertion location + var holder = player.getVarbit(BANK_TAB_ROOT_VARBIT+dstTab) + player.setVarbit(BANK_TAB_ROOT_VARBIT+dstTab, srcSize) + for(tab in dstTab+1 .. srcTab){ + val temp = player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + player.setVarbit(BANK_TAB_ROOT_VARBIT+tab, holder) + holder = temp + } + } else{ // insert each item in srcTab before dstTab consuming index move in the shifts already in insert() + if(dstTab == srcTab+1) + return@on_component_to_component_item_swap + + val destination = startPoint(player, dstTab)-1 + + val srcStart = startPoint(player, srcTab) + for(item in 1..srcSize) + container.insert(srcStart,destination) + + var holder = player.getVarbit(4169+dstTab) + player.setVarbit(4169+dstTab, srcSize) + for(tab in dstTab-2 downTo srcTab){ + val temp = player.getVarbit(BANK_TAB_ROOT_VARBIT+tab) + player.setVarbit(BANK_TAB_ROOT_VARBIT+tab, holder) + holder = temp + } + } + } else{ // swap tabs in place + val smallerTab = if(dstSize<=srcSize) dstTab else srcTab + val smallSize = player.getVarbit(BANK_TAB_ROOT_VARBIT+smallerTab) + val largerTab = if(dstSize>srcSize) dstTab else srcTab + val largeSize = player.getVarbit(BANK_TAB_ROOT_VARBIT+largerTab) + + val smallStart = startPoint(player, smallerTab) + val largeStart = startPoint(player, largerTab) + + // direct swap those that will easily fit + var dex = largeStart + for(item in smallStart until insertionPoint(player, smallerTab)) + container.swap(item, dex++) + + // insert left overs from larger tab into smaller tab's end + var insertDex = insertionPoint(player, smallerTab) + var largeEnd = insertionPoint(player, largerTab) + while(dex != largeEnd){ + if(largerTab < smallerTab) { // not size but tab order + container.insert(dex, insertDex - 1) + largeEnd-- + } + else + container.insert(dex++, insertDex++) + } + + // update each tab's size to reflect new contents + player.setVarbit(BANK_TAB_ROOT_VARBIT+smallerTab, largeSize) + player.setVarbit(BANK_TAB_ROOT_VARBIT+largerTab, smallSize) + } +} diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/commands.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/commands.plugin.kts new file mode 100644 index 0000000000..c21493d468 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/bank/commands.plugin.kts @@ -0,0 +1,17 @@ +package gg.rsmod.plugins.content.inter.bank + +import gg.rsmod.game.model.priv.Privilege + +on_command("obank", Privilege.ADMIN_POWER) { + player.openBank() +} + +/** + * Clears all bank tab varbits for the player, effectively + * dumping all items back into the one main tab. + */ +on_command("tabreset"){ + for(tab in 1..9) + player.setVarbit(BankTabs.BANK_TAB_ROOT_VARBIT +tab, 0) + player.setVarbit(BankTabs.SELECTED_TAB_VARBIT, 0) +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/emotes/emotes_tab.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/emotes/emotes_tab.plugin.kts index 56e293d05f..a0912eaf04 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/emotes/emotes_tab.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/emotes/emotes_tab.plugin.kts @@ -1,11 +1,14 @@ package gg.rsmod.plugins.content.inter.emotes +import gg.rsmod.plugins.content.inter.emotes.EmotesTab.COMPONENT_ID +import gg.rsmod.plugins.content.inter.emotes.EmotesTab.performEmote + on_login { - player.setInterfaceEvents(interfaceId = EmotesTab.COMPONENT_ID, component = 1, range = 0..47, setting = 2) + player.setInterfaceEvents(interfaceId = COMPONENT_ID, component = 1, range = 0..47, setting = 2) } -on_button(interfaceId = EmotesTab.COMPONENT_ID, component = 1) p@ { +on_button(interfaceId = COMPONENT_ID, component = 1) p@ { val slot = player.getInteractingSlot() val emote = Emote.values.firstOrNull { e -> e.slot == slot } ?: return@p - EmotesTab.performEmote(player, emote) + performEmote(player, emote) } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/EquipmentStats.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/EquipmentStats.kt index 743d9ee89d..2813f55378 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/EquipmentStats.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/EquipmentStats.kt @@ -10,12 +10,12 @@ import gg.rsmod.plugins.api.ext.* */ object EquipmentStats { - const val INTERFACE_ID = 84 - const val TAB_INTERFACE_ID = 85 + const val EQUIPMENTSTATS_INTERFACE_ID = 84 + const val EQUIPMENTSTATS_TAB_INTERFACE_ID = 85 private val MAGE_ELITE_VOID = intArrayOf(Items.VOID_MAGE_HELM, Items.ELITE_VOID_TOP, Items.ELITE_VOID_ROBE, Items.VOID_KNIGHT_GLOVES) - private fun formatBonus(p: Player, slot: BonusSlot): String = EquipmentStats.formatBonus(p.getBonus(slot)) + private fun formatBonus(p: Player, slot: BonusSlot): String = formatBonus(p.getBonus(slot)) private fun formatBonus(bonus: Int): String = if (bonus < 0) bonus.toString() else "+$bonus" @@ -37,29 +37,29 @@ object EquipmentStats { var index: Int index = 23 - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Stab: ${formatBonus(p, BonusSlot.ATTACK_STAB)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Slash: ${formatBonus(p, BonusSlot.ATTACK_SLASH)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Crush: ${formatBonus(p, BonusSlot.ATTACK_CRUSH)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Magic: ${formatBonus(p, BonusSlot.ATTACK_MAGIC)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index, text = "Range: ${formatBonus(p, BonusSlot.ATTACK_RANGED)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Stab: ${formatBonus(p, BonusSlot.ATTACK_STAB)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Slash: ${formatBonus(p, BonusSlot.ATTACK_SLASH)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Crush: ${formatBonus(p, BonusSlot.ATTACK_CRUSH)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Magic: ${formatBonus(p, BonusSlot.ATTACK_MAGIC)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index, text = "Range: ${formatBonus(p, BonusSlot.ATTACK_RANGED)}") index = 29 - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Stab: ${formatBonus(p, BonusSlot.DEFENCE_STAB)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Slash: ${formatBonus(p, BonusSlot.DEFENCE_SLASH)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Crush: ${formatBonus(p, BonusSlot.DEFENCE_CRUSH)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Range: ${formatBonus(p, BonusSlot.DEFENCE_RANGED)}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index, text = "Magic: ${formatBonus(p, BonusSlot.DEFENCE_MAGIC)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Stab: ${formatBonus(p, BonusSlot.DEFENCE_STAB)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Slash: ${formatBonus(p, BonusSlot.DEFENCE_SLASH)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Crush: ${formatBonus(p, BonusSlot.DEFENCE_CRUSH)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Range: ${formatBonus(p, BonusSlot.DEFENCE_RANGED)}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index, text = "Magic: ${formatBonus(p, BonusSlot.DEFENCE_MAGIC)}") index = 35 - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Melee strength: ${EquipmentStats.formatBonus(p.getStrengthBonus())}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index++, text = "Ranged strength: ${EquipmentStats.formatBonus(p.getRangedStrengthBonus())}") - p.setComponentText(interfaceId = INTERFACE_ID, component = index, text = "Magic damage: ${EquipmentStats.formatBonus(magicDamageBonus)}%") - p.setComponentText(interfaceId = INTERFACE_ID, component = 38, text = "Prayer: ${EquipmentStats.formatBonus(p.getPrayerBonus())}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Melee strength: ${EquipmentStats.formatBonus(p.getStrengthBonus())}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index++, text = "Ranged strength: ${EquipmentStats.formatBonus(p.getRangedStrengthBonus())}") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = index, text = "Magic damage: ${EquipmentStats.formatBonus(magicDamageBonus)}%") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = 38, text = "Prayer: ${EquipmentStats.formatBonus(p.getPrayerBonus())}") val undead = String.format("%.1f", undeadBonus) val slayer = String.format("%.1f", slayerBonus) - p.setComponentText(interfaceId = INTERFACE_ID, component = 40, text = "Undead: $undead%") - p.setComponentText(interfaceId = INTERFACE_ID, component = 41, text = "Slayer: $slayer%") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = 40, text = "Undead: $undead%") + p.setComponentText(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = 41, text = "Slayer: $slayer%") } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/equipment_stats.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/equipment_stats.plugin.kts index bbb39ae1a5..99d4dba6eb 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/equipment_stats.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/equipstats/equipment_stats.plugin.kts @@ -1,15 +1,19 @@ package gg.rsmod.plugins.content.inter.equipstats +import gg.rsmod.plugins.api.EquipmentType.Companion.EQUIPMENT_INTERFACE_ID +import gg.rsmod.plugins.content.inter.equipstats.EquipmentStats.EQUIPMENTSTATS_INTERFACE_ID +import gg.rsmod.plugins.content.inter.equipstats.EquipmentStats.EQUIPMENTSTATS_TAB_INTERFACE_ID +import gg.rsmod.plugins.content.inter.equipstats.EquipmentStats.sendBonuses import gg.rsmod.game.action.EquipAction fun bind_unequip(equipment: EquipmentType, component: Int) { - on_button(interfaceId = EquipmentStats.INTERFACE_ID, component = component) { + on_button(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, component = component) { val opt = player.getInteractingOption() if (opt == 1) { EquipAction.unequip(player, equipment.id) player.calculateBonuses() - EquipmentStats.sendBonuses(player) + sendBonuses(player) } else if (opt == 10) { val item = player.equipment[equipment.id] ?: return@on_button world.sendExamine(player, item.id, ExamineEntityType.ITEM) @@ -18,14 +22,14 @@ fun bind_unequip(equipment: EquipmentType, component: Int) { if (!world.plugins.executeItem(player, item.id, opt)) { val slot = player.getInteractingSlot() if (world.devContext.debugButtons) { - player.message("Unhandled button action: [component=[${EquipmentStats.INTERFACE_ID}:$component], option=$opt, slot=$slot, item=${item.id}]") + player.message("Unhandled button action: [component=[${EQUIPMENTSTATS_INTERFACE_ID}:$component], option=$opt, slot=$slot, item=${item.id}]") } } } } } -on_button(interfaceId = EquipmentStats.TAB_INTERFACE_ID, component = 0) { +on_button(interfaceId = EQUIPMENTSTATS_TAB_INTERFACE_ID, component = 0) { val slot = player.getInteractingSlot() val opt = player.getInteractingOption() val item = player.inventory[slot] ?: return@on_button @@ -34,7 +38,7 @@ on_button(interfaceId = EquipmentStats.TAB_INTERFACE_ID, component = 0) { val result = EquipAction.equip(player, item, inventorySlot = slot) if (result == EquipAction.Result.SUCCESS) { player.calculateBonuses() - EquipmentStats.sendBonuses(player) + sendBonuses(player) } else if (result == EquipAction.Result.UNHANDLED) { player.message("You can't equip that.") } @@ -43,32 +47,32 @@ on_button(interfaceId = EquipmentStats.TAB_INTERFACE_ID, component = 0) { } } -on_button(interfaceId = 387, component = 17) { +on_button(interfaceId = EQUIPMENT_INTERFACE_ID, component = 1) { if (!player.lock.canInterfaceInteract()) { return@on_button } player.setInterfaceUnderlay(-1, -1) - player.openInterface(interfaceId = EquipmentStats.INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) - player.openInterface(interfaceId = EquipmentStats.TAB_INTERFACE_ID, dest = InterfaceDestination.TAB_AREA) + player.openInterface(interfaceId = EQUIPMENTSTATS_INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) + player.openInterface(interfaceId = EQUIPMENTSTATS_TAB_INTERFACE_ID, dest = InterfaceDestination.TAB_AREA) player.runClientScript(149, 5570560, 93, 4, 7, 1, -1, "Equip", "", "", "", "") - player.setInterfaceEvents(interfaceId = EquipmentStats.TAB_INTERFACE_ID, component = 0, range = 0..27, setting = 1180674) + player.setInterfaceEvents(interfaceId = EQUIPMENTSTATS_TAB_INTERFACE_ID, component = 0, range = 0..27, setting = 1180674) - EquipmentStats.sendBonuses(player) + sendBonuses(player) } -on_interface_close(interfaceId = EquipmentStats.INTERFACE_ID) { - player.closeInterface(interfaceId = EquipmentStats.TAB_INTERFACE_ID) +on_interface_close(interfaceId = EQUIPMENTSTATS_INTERFACE_ID) { + player.closeInterface(interfaceId = EQUIPMENTSTATS_TAB_INTERFACE_ID) } -bind_unequip(EquipmentType.HEAD, component = 11) -bind_unequip(EquipmentType.CAPE, component = 12) -bind_unequip(EquipmentType.AMULET, component = 13) -bind_unequip(EquipmentType.AMMO, component = 21) -bind_unequip(EquipmentType.WEAPON, component = 14) -bind_unequip(EquipmentType.CHEST, component = 15) -bind_unequip(EquipmentType.SHIELD, component = 16) -bind_unequip(EquipmentType.LEGS, component = 17) -bind_unequip(EquipmentType.GLOVES, component = 18) -bind_unequip(EquipmentType.BOOTS, component = 19) -bind_unequip(EquipmentType.RING, component = 20) \ No newline at end of file +bind_unequip(EquipmentType.HEAD, component = 10) +bind_unequip(EquipmentType.CAPE, component = 11) +bind_unequip(EquipmentType.AMULET, component = 12) +bind_unequip(EquipmentType.AMMO, component = 20) +bind_unequip(EquipmentType.WEAPON, component = 13) +bind_unequip(EquipmentType.CHEST, component = 14) +bind_unequip(EquipmentType.SHIELD, component = 15) +bind_unequip(EquipmentType.LEGS, component = 16) +bind_unequip(EquipmentType.GLOVES, component = 17) +bind_unequip(EquipmentType.BOOTS, component = 18) +bind_unequip(EquipmentType.RING, component = 19) \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/follower/call_follower.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/follower/call_follower.plugin.kts index 7ffafd0550..f906a9db9d 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/follower/call_follower.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/follower/call_follower.plugin.kts @@ -1,5 +1,7 @@ package gg.rsmod.plugins.content.inter.follower -on_button(interfaceId = 387, component = 23) { +import gg.rsmod.plugins.api.EquipmentType.Companion.EQUIPMENT_INTERFACE_ID + +on_button(interfaceId = EQUIPMENT_INTERFACE_ID, component = 7) { player.message("You do not have a follower.") } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/KeptOnDeath.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/KeptOnDeath.kt index 65e54f461f..4e9ec44a5f 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/KeptOnDeath.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/KeptOnDeath.kt @@ -1,6 +1,8 @@ package gg.rsmod.plugins.content.inter.kod import gg.rsmod.game.model.World +import gg.rsmod.game.model.container.ContainerStackType +import gg.rsmod.game.model.container.ItemContainer import gg.rsmod.game.model.entity.Player import gg.rsmod.plugins.api.InterfaceDestination import gg.rsmod.plugins.api.ext.* @@ -10,18 +12,25 @@ import java.text.DecimalFormat * @author Tom */ object KeptOnDeath { - - const val COMPONENT_ID = 4 + const val KOD_INTERFACE_ID = 4 + const val KOD_COMPONENT_ID = 5 fun open(p: Player, world: World) { val deathContainers = p.calculateDeathContainers() val keptContainer = deathContainers.kept + val dummyContainer = ItemContainer(world.definitions, capacity = 50, stackType = ContainerStackType.NO_STACK) val lostContainer = deathContainers.lost - p.sendItemContainer(key = 584, container = keptContainer) - p.sendItemContainer(key = 468, container = lostContainer) + dummyContainer.add(368, 9) + dummyContainer.add(324, 41) + + p.sendItemContainer(interfaceId = -1, component = 230, key = 584, container = lostContainer) + p.sendItemContainer(interfaceId = -1, component = 90, key = 468, container = dummyContainer) + p.sendItemContainer(interfaceId = -1, component = 209, key = 93, container = keptContainer) p.setInterfaceUnderlay(color = -1, transparency = -1) - p.openInterface(interfaceId = 4, dest = InterfaceDestination.MAIN_SCREEN) - p.runClientScript(118, 0, "", keptContainer.occupiedSlotCount, 0, 0, "${DecimalFormat().format(lostContainer.getNetworth(world))} gp") + p.openInterface(interfaceId = KOD_INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) + p.runClientScript(972, 0, 0, 0, 0, "", if (p.getVarp(599)==1) 4 else 3, keptContainer[0]?.id ?: -1, keptContainer[1]?.id ?: -1, keptContainer[2]?.id ?: -1, if (p.getVarbit(599) == 1) keptContainer[3]!!.id else -1) + p.setInterfaceEvents(interfaceId = KOD_INTERFACE_ID, component = 12, range = 0..3, setting = 1) + p.setComponentText(KOD_INTERFACE_ID, 18, "Guide risk value:
${DecimalFormat().format(lostContainer.getNetworth(world))} gp") } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/kept_on_death.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/kept_on_death.plugin.kts index 2ab572c153..8f4ed12db5 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/kept_on_death.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/kod/kept_on_death.plugin.kts @@ -1,13 +1,17 @@ package gg.rsmod.plugins.content.inter.kod -on_button(interfaceId = 387, component = 21) { +import gg.rsmod.plugins.api.EquipmentType.Companion.EQUIPMENT_INTERFACE_ID +import gg.rsmod.plugins.content.inter.kod.KeptOnDeath.KOD_INTERFACE_ID +import gg.rsmod.plugins.content.inter.kod.KeptOnDeath.KOD_COMPONENT_ID + +on_button(interfaceId = EQUIPMENT_INTERFACE_ID, component = KOD_COMPONENT_ID) { if (!player.lock.canInterfaceInteract()) { return@on_button } KeptOnDeath.open(player, world) } -on_interface_close(interfaceId = KeptOnDeath.COMPONENT_ID) { +on_interface_close(interfaceId = KOD_INTERFACE_ID) { /** * Have to resend inventory when this interface is closed as it sent a 'fake' * inventory container to the tab area, which can mess up other tab area diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/OptionsTab.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/OptionsTab.kt index d48ece3b29..642beefc83 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/OptionsTab.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/OptionsTab.kt @@ -7,8 +7,36 @@ import gg.rsmod.game.model.bits.BitStorage */ object OptionsTab { - const val INTERFACE_ID = 261 - const val ADVANCED_COMPONENT_ID = 60 + const val OPTIONS_INTERFACE_ID = 116 + const val OPTIONS_TAB_SELECTED_VARBIT = 9683 + const val ALL_SETTINGS_INTERFACE_ID = 134 + const val ALL_SETTINGS_BUTTON_ID = 29 + + /** + * Control Settings Tab + */ + const val CONTROL_SETTINGS_BUTTON_ID = 65 + const val ACCEPT_AID_BUTTON_ID = 26 + const val ACCEPT_AID_VARBIT = 4180 + const val RUN_MODE_VARP = 173 + + const val HOUSE_OPT_BUTTON_ID = 28 + const val HOUSE_OPT_INTERFACE_ID = 370 // close button on 21 + + const val BOND_BUTTON_ID = 30 + const val BONDS_INTERFACE_ID = 65 + + /** + * Audio Settings Tab + */ + const val AUDIO_SETTINGS_BUTTON_ID = 70 + const val MUSIC_UNLOCK_MESSAGE_VARBIT = 10078 + + /** + * Display Settings Tab + */ + const val DISPLAY_SETTINGS_BUTTON_ID = 71 + const val DISPLAY_MODE_DROPDOWN_ID = 12 val GAME_NOTIFICATIONS = BitStorage(persistenceKey = "game_notifications") } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/advanced_options.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/advanced_options.plugin.kts index 1eaac5ff6a..c8ba47a9a0 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/advanced_options.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/advanced_options.plugin.kts @@ -2,27 +2,27 @@ package gg.rsmod.plugins.content.inter.options import gg.rsmod.game.model.interf.DisplayMode -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 4) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 4) { player.toggleVarbit(OSRSGameframe.CHATBOX_SCROLLBAR_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 6) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 6) { player.toggleVarbit(OSRSGameframe.DISABLE_SIDEPANELS_OPAQUE_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 8) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 8) { player.toggleVarbit(OSRSGameframe.DISABLE_XP_TILL_LEVEL_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 10) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 10) { player.toggleVarbit(OSRSGameframe.DISABLE_PRAYER_TOOLTIP_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 12) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 12) { player.toggleVarbit(OSRSGameframe.DISABLE_SPECIAL_ATTACK_TOOLTIP_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 16) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 16) { player.toggleVarbit(OSRSGameframe.HIDE_DATA_ORBS_VARBIT) /** @@ -35,15 +35,15 @@ on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 16) { } } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 18) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 18) { player.toggleVarbit(OSRSGameframe.CHATBOX_TRANSPARENT_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 20) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 20) { player.toggleVarbit(OSRSGameframe.CHATBOX_SOLID_VARBIT) } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 21) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 21) { player.toggleVarbit(OSRSGameframe.SIDESTONES_ARRAGEMENT_VARBIT) if (player.isClientResizable()) { @@ -52,6 +52,6 @@ on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 21) { } } -on_button(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, component = 23) { +on_button(interfaceId = OptionsTab.ALL_SETTINGS_BUTTON_ID, component = 23) { player.toggleVarbit(OSRSGameframe.CLOSE_TABS_WITH_HOTKEY_VARBIT) } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/bond_pouch.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/bond_pouch.plugin.kts index f7f327b3a2..fb19b7b483 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/bond_pouch.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/bond_pouch.plugin.kts @@ -1,6 +1,6 @@ package gg.rsmod.plugins.content.inter.options -on_button(interfaceId = OptionsTab.INTERFACE_ID, component = 100) { +on_button(interfaceId = OptionsTab.OPTIONS_INTERFACE_ID, component = 30) { /** [Varp (SHORT)]: id=1780, state=6 [Varp (SHORT)]: id=1781, state=4 diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/game_notifications.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/game_notifications.plugin.kts index adcb8e6b93..95da6754db 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/game_notifications.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/game_notifications.plugin.kts @@ -1,6 +1,9 @@ package gg.rsmod.plugins.content.inter.options -on_button(interfaceId = OptionsTab.INTERFACE_ID, component = 71) { +/** + * custom game notifications implementation unsure of proper component to map to + */ +on_button(interfaceId = OptionsTab.OPTIONS_INTERFACE_ID, component = 7000) { player.queue { while (true) { diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/house_options.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/house_options.plugin.kts index 689b844268..a5d149cc15 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/house_options.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/house_options.plugin.kts @@ -1,6 +1,6 @@ package gg.rsmod.plugins.content.inter.options -on_button(interfaceId = OptionsTab.INTERFACE_ID, component = 98) { +on_button(interfaceId = OptionsTab.OPTIONS_INTERFACE_ID, component = 28) { /** Teleport inside + doors: varp 1047 */ diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/options_tab.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/options_tab.plugin.kts index dd016bf62b..2570709976 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/options_tab.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/options/options_tab.plugin.kts @@ -1,23 +1,31 @@ package gg.rsmod.plugins.content.inter.options -import gg.rsmod.game.model.attr.DISPLAY_MODE_CHANGE_ATTR +import gg.rsmod.plugins.content.inter.options.OptionsTab.OPTIONS_INTERFACE_ID +import gg.rsmod.plugins.content.inter.options.OptionsTab.ALL_SETTINGS_INTERFACE_ID +import gg.rsmod.plugins.content.inter.options.OptionsTab.ALL_SETTINGS_BUTTON_ID import gg.rsmod.game.model.interf.DisplayMode fun bind_setting(child: Int, plugin: Plugin.() -> Unit) { - on_button(interfaceId = OptionsTab.INTERFACE_ID, component = child) { + on_button(interfaceId = OPTIONS_INTERFACE_ID, component = child) { + plugin(this) + } +} + +fun bind_advanced_setting(child: Int, plugin: Plugin.() -> Unit) { + on_button(interfaceId = ALL_SETTINGS_INTERFACE_ID, component = child) { plugin(this) } } on_login { - player.setInterfaceEvents(interfaceId = OptionsTab.INTERFACE_ID, component = 106, range = 1..4, setting = 2) // Player option priority - player.setInterfaceEvents(interfaceId = OptionsTab.INTERFACE_ID, component = 107, range = 1..4, setting = 2) // Npc option priority + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 6, range = 1..4, setting = 2) // Player option priority + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 7, range = 1..4, setting = 2) // Npc option priority } /** * Toggle mouse scroll wheel zoom. */ -on_button(interfaceId = OptionsTab.INTERFACE_ID, component = 5) { +on_button(interfaceId = OPTIONS_INTERFACE_ID, component = 5) { // TODO(Tom): figure out why this varbit isn't causing the cross to be drawn. // It technically works since it won't allow zooming with mouse wheel, but it // doesn't visually show on the interface. @@ -39,24 +47,40 @@ for (offset in 0..3) { /** * Changing display modes (fixed, resizable). */ -set_window_status_logic { - val change = player.attr[DISPLAY_MODE_CHANGE_ATTR] - val mode = when (change) { - 2 -> if (player.getVarbit(OSRSGameframe.SIDESTONES_ARRAGEMENT_VARBIT) == 1) DisplayMode.RESIZABLE_LIST else DisplayMode.RESIZABLE_NORMAL +on_login { + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 40, range = 0..4, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 42, range = 0..4, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 44, range = 0..4, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 35, range = 1..4, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 36, range = 1..4, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 37, range = 1..3, setting = 2) + player.setInterfaceEvents(interfaceId = OPTIONS_INTERFACE_ID, component = 115, range = 0..3, setting = 2) +} + +on_button(OPTIONS_INTERFACE_ID, 37) { + val slot = player.getInteractingSlot() + val mode = when (slot) { + 2 -> DisplayMode.RESIZABLE_NORMAL + 3 -> DisplayMode.RESIZABLE_LIST else -> DisplayMode.FIXED } player.toggleDisplayInterface(mode) + player.runClientScript(3998, slot-1) } /** * Advanced options. */ -bind_setting(child = 35) { +bind_setting(child = ALL_SETTINGS_BUTTON_ID) { if (!player.lock.canInterfaceInteract()) { return@bind_setting } player.setInterfaceUnderlay(color = -1, transparency = -1) - player.openInterface(interfaceId = OptionsTab.ADVANCED_COMPONENT_ID, dest = InterfaceDestination.MAIN_SCREEN) + player.openInterface(interfaceId = ALL_SETTINGS_INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) +} + +on_button(ALL_SETTINGS_INTERFACE_ID, 4) { + player.closeInterface(ALL_SETTINGS_INTERFACE_ID) } /** @@ -159,16 +183,19 @@ bind_setting(child = 83) { } /** - * Toggle shift-click dropping. + * Toggle shift-click dropping is an advanced setting under an entire tab. */ -bind_setting(child = 85) { - player.toggleVarbit(OSRSGameframe.SHIFT_CLICK_DROP_VARBIT) +bind_advanced_setting(child = 17) { + when(player.getInteractingSlot()) { + 30 -> player.toggleVarbit(OSRSGameframe.SHIFT_CLICK_DROP_VARBIT) + else -> return@bind_advanced_setting + } } /** * Set player option priority. */ -bind_setting(child = 106) { +bind_setting(child = 6) { val slot = player.getInteractingSlot() player.setVarp(OSRSGameframe.PLAYER_ATTACK_PRIORITY_VARP, slot - 1) } @@ -176,7 +203,7 @@ bind_setting(child = 106) { /** * Set npc option priority. */ -bind_setting(child = 107) { +bind_setting(child = 7) { val slot = player.getInteractingSlot() player.setVarp(OSRSGameframe.NPC_ATTACK_PRIORITY_VARP, slot - 1) } @@ -184,6 +211,6 @@ bind_setting(child = 107) { /** * Toggle aid. */ -bind_setting(child = 92) { +bind_setting(child = 26) { player.toggleVarp(OSRSGameframe.ACCEPT_AID_VARP) } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/PriceGuide.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/PriceGuide.kt index 258de3ca55..3d68a06405 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/PriceGuide.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/PriceGuide.kt @@ -17,8 +17,8 @@ import java.text.DecimalFormat */ object PriceGuide { - const val INTERFACE_ID = 464 - const val TAB_INTERFACE_ID = 238 + const val PRICE_GUIDE_INTERFACE_ID = 464 + const val PRICE_GUIDE_TAB_INTERFACE_ID = 238 private val GUIDE_CONTAINER = AttributeKey() private val TEMP_INV_CONTAINER = AttributeKey() @@ -28,18 +28,18 @@ object PriceGuide { p.attr[TEMP_INV_CONTAINER] = ItemContainer(p.inventory) p.setInterfaceUnderlay(color = -1, transparency = -1) - p.openInterface(interfaceId = INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) - p.openInterface(interfaceId = TAB_INTERFACE_ID, dest = InterfaceDestination.TAB_AREA) + p.openInterface(interfaceId = PRICE_GUIDE_INTERFACE_ID, dest = InterfaceDestination.MAIN_SCREEN) + p.openInterface(interfaceId = PRICE_GUIDE_TAB_INTERFACE_ID, dest = InterfaceDestination.TAB_AREA) update(p) - p.setInterfaceEvents(interfaceId = INTERFACE_ID, component = 2, range = 0..27, setting = 1086) + p.setInterfaceEvents(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 2, range = 0..27, setting = 1086) p.runClientScript(149, 15597568, 93, 4, 7, 0, -1, "Add", "Add-5", "Add-10", "Add-All", "Add-X") - p.setInterfaceEvents(interfaceId = TAB_INTERFACE_ID, component = 0, range = 0..27, setting = 1086) + p.setInterfaceEvents(interfaceId = PRICE_GUIDE_TAB_INTERFACE_ID, component = 0, range = 0..27, setting = 1086) } fun close(p: Player) { - p.closeInterface(TAB_INTERFACE_ID) + p.closeInterface(PRICE_GUIDE_TAB_INTERFACE_ID) p.attr.remove(GUIDE_CONTAINER) p.attr.remove(TEMP_INV_CONTAINER) } @@ -183,9 +183,9 @@ object PriceGuide { val valueService = p.world.getService(ItemMarketValueService::class.java) val cost = valueService?.get(item) ?: def.cost - p.setComponentItem(interfaceId = INTERFACE_ID, component = 8, item = item, amountOrZoom = 1) + p.setComponentItem(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 8, item = item, amountOrZoom = 1) p.runClientScript(600, 0, 1, 15, 30408716) - p.setComponentText(interfaceId = INTERFACE_ID, component = 12, text = "${def.name}:
${DecimalFormat().format(cost)}") + p.setComponentText(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 12, text = "${def.name}:
${DecimalFormat().format(cost)}") } fun update(p: Player) { @@ -195,7 +195,7 @@ object PriceGuide { p.sendItemContainer(key = 90, container = guideContainer) p.sendItemContainer(key = 93, container = invContainer) - p.setComponentItem(interfaceId = INTERFACE_ID, component = 8, item = -1, amountOrZoom = 1) + p.setComponentItem(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 8, item = -1, amountOrZoom = 1) val valueService = p.world.getService(ItemMarketValueService::class.java) val costs = Array(size = guideContainer.capacity) { 0 } @@ -209,6 +209,6 @@ object PriceGuide { p.runClientScript(785, *costs) p.runClientScript(600, 1, 1, 15, 30408716) - p.setComponentText(interfaceId = INTERFACE_ID, component = 12, text = "Total guide price:
${DecimalFormat().format(guideContainer.getNetworth(p.world))}") + p.setComponentText(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 12, text = "Total guide price:
${DecimalFormat().format(guideContainer.getNetworth(p.world))}") } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/price_guide.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/price_guide.plugin.kts index 5b9ac8daac..48e7e7c84b 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/price_guide.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/priceguide/price_guide.plugin.kts @@ -1,36 +1,45 @@ package gg.rsmod.plugins.content.inter.priceguide -on_button(interfaceId = 387, component = 19) { +import gg.rsmod.plugins.api.EquipmentType.Companion.EQUIPMENT_INTERFACE_ID +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.PRICE_GUIDE_INTERFACE_ID +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.PRICE_GUIDE_TAB_INTERFACE_ID +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.add +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.close +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.depositInventory +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.remove +import gg.rsmod.plugins.content.inter.priceguide.PriceGuide.search + +on_button(interfaceId = EQUIPMENT_INTERFACE_ID, component = 3) { if (!player.lock.canInterfaceInteract()) { return@on_button } PriceGuide.open(player) } -on_interface_close(interfaceId = PriceGuide.INTERFACE_ID) { - PriceGuide.close(player) +on_interface_close(interfaceId = PRICE_GUIDE_INTERFACE_ID) { + close(player) player.closeInputDialog() } -on_button(interfaceId = PriceGuide.TAB_INTERFACE_ID, component = 0) { +on_button(interfaceId = PRICE_GUIDE_TAB_INTERFACE_ID, component = 0) { player.queue(TaskPriority.WEAK) { - PriceGuide.add(this, player.getInteractingSlot(), player.getInteractingOption()) + add(this, player.getInteractingSlot(), player.getInteractingOption()) } } -on_button(interfaceId = PriceGuide.INTERFACE_ID, component = 2) { +on_button(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 2) { player.queue(TaskPriority.WEAK) { - PriceGuide.remove(this, player.getInteractingSlot(), player.getInteractingOption()) + remove(this, player.getInteractingSlot(), player.getInteractingOption()) } } -on_button(interfaceId = PriceGuide.INTERFACE_ID, component = 10) { - PriceGuide.depositInventory(player) +on_button(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 10) { + depositInventory(player) } -on_button(interfaceId = PriceGuide.INTERFACE_ID, component = 5) { +on_button(interfaceId = PRICE_GUIDE_INTERFACE_ID, component = 5) { player.queue(TaskPriority.WEAK) { val item = searchItemInput("Select an item to ask about its price:") - PriceGuide.search(player, item) + search(player, item) } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/SpellFilters.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/SpellFilters.kt index acb64c292f..05d565f5eb 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/SpellFilters.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/SpellFilters.kt @@ -5,7 +5,8 @@ package gg.rsmod.plugins.content.inter.spellfilter */ object SpellFilters { - const val INTERFACE_ID = 218 + const val SPELL_FILTER_INTERFACE_ID = 218 + const val SPELL_FILTER_COMPONENT_ID = 185 const val DISABLE_FILTERS_VARBIT = 6718 diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/spell_filter.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/spell_filter.plugin.kts index a6ae786857..154decec0f 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/spell_filter.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/spellfilter/spell_filter.plugin.kts @@ -1,34 +1,41 @@ package gg.rsmod.plugins.content.inter.spellfilter +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.SPELL_FILTER_INTERFACE_ID +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.SPELL_FILTER_COMPONENT_ID +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.DISABLE_FILTERS_VARBIT +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.FILTER_COMBAT_VARBIT +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.FILTER_BY_LEVEL_VARBIT +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.FILTER_BY_RUNES_VARBIT +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.FILTER_TELEPORTS_VARBIT +import gg.rsmod.plugins.content.inter.spellfilter.SpellFilters.FILTER_UTILITY_VARBIT import gg.rsmod.game.model.interf.DisplayMode on_login { - player.setInterfaceEvents(interfaceId = SpellFilters.INTERFACE_ID, component = 184, range = 0..4, setting = 2) + player.setInterfaceEvents(interfaceId = SPELL_FILTER_INTERFACE_ID, component = SPELL_FILTER_COMPONENT_ID, range = 0..4, setting = 2) } DisplayMode.values.forEach { mode -> val child = when (mode) { - DisplayMode.RESIZABLE_NORMAL -> 57 - DisplayMode.RESIZABLE_LIST -> 56 - DisplayMode.FIXED -> 54 + DisplayMode.RESIZABLE_NORMAL -> 77 + DisplayMode.RESIZABLE_LIST -> 77 + DisplayMode.FIXED -> 75 else -> return@forEach } on_button(interfaceId = getDisplayComponentId(mode), component = child) { val opt = player.getInteractingOption() if (opt == 2) { - player.toggleVarbit(SpellFilters.DISABLE_FILTERS_VARBIT) + player.toggleVarbit(DISABLE_FILTERS_VARBIT) } } } -on_button(interfaceId = SpellFilters.INTERFACE_ID, component = 184) { - val slot = player.getInteractingSlot() - val varbit = when (slot) { - 0 -> SpellFilters.FILTER_COMBAT_VARBIT - 1 -> SpellFilters.FILTER_TELEPORTS_VARBIT - 2 -> SpellFilters.FILTER_UTILITY_VARBIT - 3 -> SpellFilters.FILTER_BY_LEVEL_VARBIT - 4 -> SpellFilters.FILTER_BY_RUNES_VARBIT +on_button(interfaceId = SPELL_FILTER_INTERFACE_ID, component = SPELL_FILTER_COMPONENT_ID) { + val varbit = when (player.getInteractingSlot()) { + 0 -> FILTER_COMBAT_VARBIT + 1 -> FILTER_TELEPORTS_VARBIT + 2 -> FILTER_UTILITY_VARBIT + 3 -> FILTER_BY_LEVEL_VARBIT + 4 -> FILTER_BY_RUNES_VARBIT else -> return@on_button } player.toggleVarbit(varbit) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/WelcomeScreen.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/WelcomeScreen.kt new file mode 100644 index 0000000000..fcdb0c8d3b --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/WelcomeScreen.kt @@ -0,0 +1,27 @@ +package gg.rsmod.plugins.content.inter.welcome + +import gg.rsmod.game.model.entity.Player +import gg.rsmod.game.model.interf.DisplayMode +import gg.rsmod.plugins.api.ext.* +import gg.rsmod.plugins.api.getDisplayComponentId + +object WelcomeScreen { + const val WELCOME_SCREEN_ID = 378 + + fun openChristmasWelcome(player: Player) { + player.setVarp(261, 666) // last logged on 666 minutes ago + player.setVarp(1780, 400) // 400 days of membership left + + player.openOverlayInterface(DisplayMode.FULLSCREEN) + player.openInterface(getDisplayComponentId(DisplayMode.FULLSCREEN), 29, WELCOME_SCREEN_ID) + + player.setComponentText(WELCOME_SCREEN_ID, 7, "Happy Christmas!
" + + "Rev193 thanks to the fine folks in the RsMod Discord
" + + "drop in and thank people like Tomm, Kris, & Bart.") + + player.setComponentHidden(WELCOME_SCREEN_ID, 51, false) + + player.runClientScript(1080, "https://discord.gg/UznZnZR") + player.runClientScript(828, 1) // members for Christmas + } +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/welcome_screen.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/welcome_screen.plugin.kts new file mode 100644 index 0000000000..e1cc846182 --- /dev/null +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/welcome/welcome_screen.plugin.kts @@ -0,0 +1,19 @@ +package gg.rsmod.plugins.content.inter.welcome + +import gg.rsmod.plugins.content.inter.welcome.WelcomeScreen.WELCOME_SCREEN_ID +import gg.rsmod.plugins.content.Osrs_plugin.OSRSInterfaces.openDefaultInterfaces + +on_button(WELCOME_SCREEN_ID, 78) { + player.closeInterface(WELCOME_SCREEN_ID) + openDefaultInterfaces(player) +} + +on_button(WELCOME_SCREEN_ID, 86) { + player.runClientScript(1081, "https://www.rune-server.ee/runescape-development/rs2-server/downloads/684206-181-rs-mod-release.html", 1, 1) + +} + +on_button(WELCOME_SCREEN_ID, 83) { + player.runClientScript(1081, "https://github.com/bmyte/rsmod", 1, 1) + +} \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/WorldMap.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/WorldMap.kt index b4c19f37bd..30d6255c19 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/WorldMap.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/WorldMap.kt @@ -12,6 +12,6 @@ object WorldMap { val UPDATE_TIMER = TimerKey() val LAST_TILE = AttributeKey() - const val INTERFACE_ID = 595 - const val FULLSCREEN_INTERFACE_ID = 594 + const val WORLD_MAP_INTERFACE_ID = 595 + const val WORLD_MAP_FULLSCREEN_INTERFACE_ID = 594 } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/world_map.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/world_map.plugin.kts index 0268ba4f2c..bdb6ba9879 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/world_map.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/inter/worldmap/world_map.plugin.kts @@ -1,44 +1,62 @@ package gg.rsmod.plugins.content.inter.worldmap -on_button(interfaceId = 160, component = 43) { +import gg.rsmod.plugins.content.inter.worldmap.WorldMap.WORLD_MAP_INTERFACE_ID +import gg.rsmod.plugins.content.inter.worldmap.WorldMap.WORLD_MAP_FULLSCREEN_INTERFACE_ID +import gg.rsmod.plugins.content.inter.worldmap.WorldMap.LAST_TILE +import gg.rsmod.plugins.content.inter.worldmap.WorldMap.UPDATE_TIMER + +on_button(interfaceId = 160, component = 46) { if (!player.lock.canInterfaceInteract()) { return@on_button } - if (!player.isInterfaceVisible(WorldMap.INTERFACE_ID)) { + if (!player.isInterfaceVisible(WORLD_MAP_INTERFACE_ID)) { val opt = player.getInteractingOption() player.sendWorldMapTile() - player.openInterface(interfaceId = WorldMap.INTERFACE_ID, dest = InterfaceDestination.WORLD_MAP, fullscreen = opt == 2) - if (opt == 2) { - player.openInterface(interfaceId = WorldMap.FULLSCREEN_INTERFACE_ID, dest = InterfaceDestination.WORLD_MAP_FULL, fullscreen = true) + player.openInterface(interfaceId = WORLD_MAP_INTERFACE_ID, dest = InterfaceDestination.WORLD_MAP, fullscreen = opt != 2) + if (opt != 2) { + player.openInterface(interfaceId = WORLD_MAP_FULLSCREEN_INTERFACE_ID, dest = InterfaceDestination.WORLD_MAP_FULL, fullscreen = true) } - player.setInterfaceEvents(interfaceId = WorldMap.INTERFACE_ID, component = 20, range = 0..4, setting = 2) - player.timers[WorldMap.UPDATE_TIMER] = 1 + player.setInterfaceEvents(interfaceId = WORLD_MAP_INTERFACE_ID, component = 20, range = 0..4, setting = 2) + player.timers[UPDATE_TIMER] = 1 } else { - player.closeInterface(WorldMap.INTERFACE_ID) + player.closeInterface(WORLD_MAP_INTERFACE_ID) } } -on_button(interfaceId = WorldMap.INTERFACE_ID, component = 37) { - player.closeInterface(WorldMap.INTERFACE_ID) +/** + * Esc key closes. + */ +on_button(interfaceId = WORLD_MAP_INTERFACE_ID, component = 4) { + player.closeInterface(WORLD_MAP_INTERFACE_ID) + player.openOverlayInterface(player.interfaces.displayMode) + player.attr.remove(LAST_TILE) + player.timers.remove(UPDATE_TIMER) +} + +/** + * 'x' button closes + */ +on_button(interfaceId = WORLD_MAP_INTERFACE_ID, component = 38) { + player.closeInterface(WORLD_MAP_INTERFACE_ID) player.openOverlayInterface(player.interfaces.displayMode) - player.attr.remove(WorldMap.LAST_TILE) - player.timers.remove(WorldMap.UPDATE_TIMER) + player.attr.remove(LAST_TILE) + player.timers.remove(UPDATE_TIMER) } -on_timer(WorldMap.UPDATE_TIMER) { - if (player.isInterfaceVisible(WorldMap.INTERFACE_ID)) { +on_timer(UPDATE_TIMER) { + if (player.isInterfaceVisible(WORLD_MAP_INTERFACE_ID)) { /* * Only send the world when the last tile recorded is not the same as * the current one being stood on, so we're not needlessly sending the * script every cycle. */ - val lastTile = player.attr[WorldMap.LAST_TILE] + val lastTile = player.attr[LAST_TILE] if (lastTile == null || !lastTile.sameAs(player.tile)) { player.sendWorldMapTile() - player.attr[WorldMap.LAST_TILE] = player.tile + player.attr[LAST_TILE] = player.tile } - player.timers[WorldMap.UPDATE_TIMER] = 1 + player.timers[UPDATE_TIMER] = 1 } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/items/ringofdueling/ring_of_dueling.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/items/ringofdueling/ring_of_dueling.plugin.kts index 33a74c966c..5286c222bc 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/items/ringofdueling/ring_of_dueling.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/items/ringofdueling/ring_of_dueling.plugin.kts @@ -17,7 +17,7 @@ private val SOUNDAREA_VOLUME = 1 private val LOCATIONS = mapOf( "Duel Arena" to Tile(3308, 3234, 0), "Castle Wars" to Tile(2440, 3089, 0), - "Clan Wars" to Tile(3370, 3161, 0) + "Ferox Enclave" to Tile(3370, 3161, 0) ) RING_OF_DUELING.forEach { duel -> diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/equipment/equipment.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/equipment/equipment.plugin.kts index 83830d3d7e..42e09f1119 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/equipment/equipment.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/equipment/equipment.plugin.kts @@ -1,11 +1,16 @@ package gg.rsmod.plugins.content.mechanics.equipment +import gg.rsmod.plugins.api.EquipmentType.Companion.EQUIPMENT_INTERFACE_ID import gg.rsmod.game.action.EquipAction +/** + * This actually varies by item and needs to be worked into a proper implementation + * accounting for such. + */ val EQUIP_ITEM_SOUND = 2238 fun bind_unequip(equipment: EquipmentType, child: Int) { - on_button(interfaceId = 387, component = child) { + on_button(interfaceId = EQUIPMENT_INTERFACE_ID, component = child) { val opt = player.getInteractingOption() when (opt) { 1 -> { @@ -39,14 +44,14 @@ for (equipment in EquipmentType.values) { } } -bind_unequip(EquipmentType.HEAD, child = 6) -bind_unequip(EquipmentType.CAPE, child = 7) -bind_unequip(EquipmentType.AMULET, child = 8) -bind_unequip(EquipmentType.AMMO, child = 16) -bind_unequip(EquipmentType.WEAPON, child = 9) -bind_unequip(EquipmentType.CHEST, child = 10) -bind_unequip(EquipmentType.SHIELD, child = 11) -bind_unequip(EquipmentType.LEGS, child = 12) -bind_unequip(EquipmentType.GLOVES, child = 13) -bind_unequip(EquipmentType.BOOTS, child = 14) -bind_unequip(EquipmentType.RING, child = 15) \ No newline at end of file +bind_unequip(EquipmentType.HEAD, child = 14) +bind_unequip(EquipmentType.CAPE, child = 15) +bind_unequip(EquipmentType.AMULET, child = 16) +bind_unequip(EquipmentType.AMMO, child = 17) +bind_unequip(EquipmentType.WEAPON, child = 18) +bind_unequip(EquipmentType.CHEST, child = 19) +bind_unequip(EquipmentType.SHIELD, child = 20) +bind_unequip(EquipmentType.LEGS, child = 21) +bind_unequip(EquipmentType.GLOVES, child = 22) +bind_unequip(EquipmentType.BOOTS, child = 23) +bind_unequip(EquipmentType.RING, child = 24) \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/run/run_energy.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/run/run_energy.plugin.kts index 36a5a212a1..a074baa970 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/run/run_energy.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/mechanics/run/run_energy.plugin.kts @@ -19,6 +19,6 @@ on_button(interfaceId = 160, component = 22) { /** * Settings button. */ -on_button(interfaceId = 261, component = 95) { +on_button(interfaceId = 116, component = 27) { RunEnergy.toggle(player) } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/banker/banker.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/banker/banker.plugin.kts index 4d6326aa8e..e574ba821b 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/banker/banker.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/banker/banker.plugin.kts @@ -2,7 +2,7 @@ package gg.rsmod.plugins.content.npcs.banker import gg.rsmod.plugins.content.inter.bank.openBank -arrayOf(Npcs.BANKER_1027, Npcs.BANKER_1028).forEach { banker -> +arrayOf(Npcs.BANKER_1633, Npcs.BANKER_1634).forEach { banker -> on_npc_option(npc = banker, option = "talk-to", lineOfSightDistance = 2) { player.queue { dialog(this) diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/man/man_chat.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/man/man_chat.plugin.kts index db2c0d8573..ff7a1525f8 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/man/man_chat.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/npcs/man/man_chat.plugin.kts @@ -1,8 +1,8 @@ package gg.rsmod.plugins.content.npcs.man -val MEN = arrayOf(Npcs.MAN_3014, Npcs.MAN_3078, Npcs.MAN_3079, Npcs.MAN_3080, - Npcs.MAN_3081, Npcs.MAN_3082, Npcs.MAN_3260, Npcs.MAN_3264, Npcs.MAN_3265, - Npcs.MAN_3266, Npcs.MAN_3652, Npcs.MAN_6987, Npcs.MAN_6988, Npcs.MAN_6989, +val MEN = arrayOf(Npcs.MAN_3014, Npcs.MAN_1118, Npcs.MAN_6815, Npcs.MAN_3106, + Npcs.MAN_3107, Npcs.MAN_3108, Npcs.MAN_3109, Npcs.MAN_3264, Npcs.MAN_3265, + Npcs.MAN_6818, Npcs.MAN_3652, Npcs.MAN_6987, Npcs.MAN_6988, Npcs.MAN_6989, Npcs.MAN_7281) MEN.forEach { man -> diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/osrs.plugin.kts b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/osrs.plugin.kts index 1b18818e91..33e9fbc211 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/osrs.plugin.kts +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/osrs.plugin.kts @@ -2,6 +2,7 @@ package gg.rsmod.plugins.content import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR +import gg.rsmod.plugins.content.inter.welcome.WelcomeScreen.openChristmasWelcome /** * Closing main modal for players. @@ -33,17 +34,8 @@ on_login { player.sendWeaponComponentInformation() player.sendCombatLevelText() - // Interface-related logic. - player.openOverlayInterface(player.interfaces.displayMode) - InterfaceDestination.values.filter { pane -> pane.interfaceId != -1 }.forEach { pane -> - if (pane == InterfaceDestination.XP_COUNTER && player.getVarbit(OSRSGameframe.XP_DROPS_VISIBLE_VARBIT) == 0) { - return@forEach - } else if (pane == InterfaceDestination.MINI_MAP && player.getVarbit(OSRSGameframe.HIDE_DATA_ORBS_VARBIT) == 1) { - return@forEach - } - player.openInterface(pane.interfaceId, pane) - } + openChristmasWelcome(player) // Inform the client whether or not we have a display name. val displayName = player.username.isNotBlank() @@ -83,4 +75,26 @@ on_component_item_swap(interfaceId = 149, component = 0) { // Sync the container on the client container.dirty = true } +} + +object OSRSInterfaces { + fun openDefaultInterfaces(player: Player) { + player.openOverlayInterface(player.interfaces.displayMode) + openModals(player) + } + + fun openModals(player: Player, fullscreen: Boolean = false) { + InterfaceDestination.getModals().forEach { pane -> + if (pane == InterfaceDestination.XP_COUNTER && player.getVarbit(OSRSGameframe.XP_DROPS_VISIBLE_VARBIT) == 0) { + return@forEach + } else if (pane == InterfaceDestination.MINI_MAP && player.getVarbit(OSRSGameframe.HIDE_DATA_ORBS_VARBIT) == 1) { + return@forEach + } else if (pane == InterfaceDestination.QUEST_ROOT) { + player.openInterface(pane.interfaceId, pane, fullscreen) + player.openInterface(InterfaceDestination.QUEST_ROOT.interfaceId, 33, 399, 1) + return@forEach + } + player.openInterface(pane.interfaceId, pane, fullscreen) + } + } } \ No newline at end of file diff --git a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/skills/thieving/pickpocket/PickpocketNpc.kt b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/skills/thieving/pickpocket/PickpocketNpc.kt index 8b11b39e80..a2fef1b79e 100644 --- a/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/skills/thieving/pickpocket/PickpocketNpc.kt +++ b/game/plugins/src/main/kotlin/gg/rsmod/plugins/content/skills/thieving/pickpocket/PickpocketNpc.kt @@ -25,13 +25,13 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe MAN_WOMAN( npcIds = intArrayOf( //Man NPC npcIds - Npcs.MAN_3014, Npcs.MAN_3078, Npcs.MAN_3079, Npcs.MAN_3080, Npcs.MAN_3081, - Npcs.MAN_3082, Npcs.MAN_3101, Npcs.MAN_3109, Npcs.MAN_3260, Npcs.MAN_3264, - Npcs.MAN_3265, Npcs.MAN_3266, Npcs.MAN_3652, Npcs.MAN_6987, Npcs.MAN_6988, - Npcs.MAN_6989, Npcs.MAN_7547, + Npcs.MAN_3014, Npcs.MAN_3110, Npcs.MAN_3298, Npcs.MAN_3106, + Npcs.MAN_3107, Npcs.MAN_3108, Npcs.MAN_3109, Npcs.MAN_3264, Npcs.MAN_3265, + Npcs.MAN_3261, Npcs.MAN_3652, Npcs.MAN_6987, Npcs.MAN_6988, Npcs.MAN_6989, + Npcs.MAN_6818, //Woman NPC Ids - Npcs.WOMAN_3015, Npcs.WOMAN_3083, Npcs.WOMAN_3084, Npcs.WOMAN_3085, Npcs.WOMAN_3110, + Npcs.WOMAN_3015, Npcs.WOMAN_3111, Npcs.WOMAN_3112, Npcs.WOMAN_3113, Npcs.WOMAN_3299, Npcs.WOMAN_3268, Npcs.WOMAN_6990, Npcs.WOMAN_6991, Npcs.WOMAN_6992 ), experience = 8.0, @@ -44,7 +44,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), FARMER( npcIds = intArrayOf( - Npcs.FARMER_3086, Npcs.FARMER_3087, Npcs.FARMER_3088 + Npcs.FARMER_3243, Npcs.FARMER_3244, Npcs.FARMER_3114 ), experience = 14.5, reqLevel = 10, @@ -153,7 +153,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), ALKHARID_WARRIOR( npcIds = intArrayOf( - Npcs.ALKHARID_WARRIOR, Npcs.WARRIOR_WOMAN_3100 + Npcs.ALKHARID_WARRIOR, Npcs.WARRIOR_WOMAN_3260 ), experience = 26.0, reqLevel = 25, @@ -165,7 +165,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), ROGUE( npcIds = intArrayOf( - Npcs.ROGUE_518 + Npcs.ROGUE_526 ), experience = 35.5, reqLevel = 32, @@ -210,7 +210,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), MASTER_FARMER( npcIds = intArrayOf( - Npcs.MASTER_FARMER_3257, Npcs.MASTER_FARMER_3258, Npcs.MARTIN_THE_MASTER_GARDENER + Npcs.MASTER_FARMER_5730, Npcs.MASTER_FARMER_5731, Npcs.MARTIN_THE_MASTER_GARDENER ), experience = 43.0, reqLevel = 38, @@ -263,7 +263,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), GUARD( npcIds = intArrayOf( - Npcs.GUARD_3094 + Npcs.GUARD_3010 ), experience = 46.8, reqLevel = 40, @@ -317,7 +317,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), KNIGHT( npcIds = intArrayOf( - Npcs.KNIGHT_OF_ARDOUGNE_3108, Npcs.KNIGHT_OF_ARDOUGNE_3111 + Npcs.KNIGHT_OF_ARDOUGNE_3297, Npcs.KNIGHT_OF_ARDOUGNE_3300 ), experience = 84.3, reqLevel = 55, @@ -341,7 +341,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), YANILLE_WATCHMAN( npcIds = intArrayOf( - Npcs.WATCHMAN_3251 + Npcs.WATCHMAN_5420 ), experience = 137.5, reqLevel = 65, @@ -366,7 +366,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), PALADIN( npcIds = intArrayOf( - Npcs.PALADIN_3104, Npcs.PALADIN_3105 + Npcs.PALADIN_3293, Npcs.PALADIN_3294 ), experience = 151.75, reqLevel = 70, @@ -397,7 +397,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe stunTicks = 8 ), HERO( - npcIds = intArrayOf(Npcs.HERO_3106), + npcIds = intArrayOf(Npcs.HERO_3295), experience = 275.0, reqLevel = 80, rewards = arrayOf( @@ -414,7 +414,7 @@ enum class PickpocketNpc(val npcIds: IntArray, val experience: Double, val reqLe ), ELF( npcIds = intArrayOf( - Npcs.GOREU, Npcs.YSGAWYN, Npcs.ARVEL, Npcs.MAWRTH, Npcs.KELYN, Npcs.SIGMUND_5322, Npcs.SANDY + Npcs.GOREU, Npcs.ARVEL, Npcs.MAWRTH, Npcs.KELYN_9015, Npcs.SIGMUND_5322, Npcs.SANDY ), experience = 353.0, reqLevel = 85, diff --git a/game/src/main/kotlin/gg/rsmod/game/message/MessageDecoderSet.kt b/game/src/main/kotlin/gg/rsmod/game/message/MessageDecoderSet.kt index bea1bcb95c..a6f64bb3d9 100644 --- a/game/src/main/kotlin/gg/rsmod/game/message/MessageDecoderSet.kt +++ b/game/src/main/kotlin/gg/rsmod/game/message/MessageDecoderSet.kt @@ -48,6 +48,7 @@ class MessageDecoderSet { put(CloseModalMessage::class.java, CloseModalDecoder(), CloseMainComponentHandler(), structures) put(IfButtonMessage::class.java, IfButton1Decoder(), IfButton1Handler(), structures) put(IfButtonDMessage::class.java, IfButtonDDecoder(), IfButtonDHandler(), structures) + put(IfModelOp1Message::class.java, IfModelOp1Decoder(), IfModelOp1Handler(), structures) put(ResumePauseButtonMessage::class.java, ResumePauseButtonDecoder(), ResumePauseButtonHandler(), structures) put(ResumePCountDialogMessage::class.java, ResumePCountDialogDecoder(), ResumePCountDialogHandler(), structures) @@ -75,6 +76,7 @@ class MessageDecoderSet { put(OpLocUMessage::class.java, OpLocUDecoder(), OpLocUHandler(), structures) put(OpObj1Message::class.java, OpObj1Decoder(), OpObj1Handler(), structures) + put(OpObj2Message::class.java, OpObj2Decoder(), OpObj2Handler(), structures) put(OpObj3Message::class.java, OpObj3Decoder(), OpObj3Handler(), structures) put(OpObj4Message::class.java, OpObj4Decoder(), OpObj4Handler(), structures) put(OpObjUMessage::class.java, OpObjUDecoder(), OpObjUHandler(), structures) diff --git a/game/src/main/kotlin/gg/rsmod/game/message/decoder/IfModelOp1Decoder.kt b/game/src/main/kotlin/gg/rsmod/game/message/decoder/IfModelOp1Decoder.kt new file mode 100644 index 0000000000..859c947706 --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/decoder/IfModelOp1Decoder.kt @@ -0,0 +1,12 @@ +package gg.rsmod.game.message.decoder + +import gg.rsmod.game.message.MessageDecoder +import gg.rsmod.game.message.impl.IfModelOp1Message + +class IfModelOp1Decoder : MessageDecoder() { + + override fun decode(opcode: Int, opcodeIndex: Int, values: HashMap, stringValues: HashMap): IfModelOp1Message { + val component = values["component"]!!.toInt() + return IfModelOp1Message(component = component) + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/message/decoder/OpObj2Decoder.kt b/game/src/main/kotlin/gg/rsmod/game/message/decoder/OpObj2Decoder.kt new file mode 100644 index 0000000000..7f043a3350 --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/decoder/OpObj2Decoder.kt @@ -0,0 +1,18 @@ +package gg.rsmod.game.message.decoder + +import gg.rsmod.game.message.MessageDecoder +import gg.rsmod.game.message.impl.OpObj2Message + +/** + * @author Tom + */ +class OpObj2Decoder : MessageDecoder() { + + override fun decode(opcode: Int, opcodeIndex: Int, values: HashMap, stringValues: HashMap): OpObj2Message { + val item = values["item"]!!.toInt() + val x = values["x"]!!.toInt() + val z = values["z"]!!.toInt() + val movementType = values["movement_type"]!!.toInt() + return OpObj2Message(item, x, z, movementType) + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/message/encoder/UpdateInvFullEncoder.kt b/game/src/main/kotlin/gg/rsmod/game/message/encoder/UpdateInvFullEncoder.kt index 9f40004a5c..212a455a7a 100644 --- a/game/src/main/kotlin/gg/rsmod/game/message/encoder/UpdateInvFullEncoder.kt +++ b/game/src/main/kotlin/gg/rsmod/game/message/encoder/UpdateInvFullEncoder.kt @@ -3,6 +3,7 @@ package gg.rsmod.game.message.encoder import gg.rsmod.game.message.MessageEncoder import gg.rsmod.game.message.impl.UpdateInvFullMessage import gg.rsmod.net.packet.DataOrder +import gg.rsmod.net.packet.DataTransformation import gg.rsmod.net.packet.DataType import gg.rsmod.net.packet.GamePacketBuilder @@ -28,14 +29,14 @@ class UpdateInvFullEncoder : MessageEncoder() { val buf = GamePacketBuilder() message.items.forEach { item -> - if (item != null) { - buf.put(DataType.SHORT, item.id + 1) - buf.put(DataType.BYTE, Math.min(255, item.amount)) + if (item != null && item.amount != 0) { + buf.put(DataType.SHORT, DataTransformation.ADD, item.id + 1) + buf.put(DataType.BYTE, DataTransformation.NEGATE, Math.min(255, item.amount)) if (item.amount >= 255) { - buf.put(DataType.INT, DataOrder.INVERSED_MIDDLE, item.amount) + buf.put(DataType.INT, DataOrder.MIDDLE, item.amount) } } else { - buf.put(DataType.SHORT, 0) + buf.put(DataType.SHORT, DataTransformation.ADD, 0) buf.put(DataType.BYTE, 0) } } diff --git a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt index f4c6bf1436..cb1596a9a6 100644 --- a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt +++ b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfButtonDHandler.kt @@ -3,6 +3,7 @@ package gg.rsmod.game.message.handler import gg.rsmod.game.message.MessageHandler import gg.rsmod.game.message.impl.IfButtonDMessage import gg.rsmod.game.model.World +import gg.rsmod.game.model.attr.INTERACTING_COMPONENT_CHILD import gg.rsmod.game.model.attr.INTERACTING_ITEM_SLOT import gg.rsmod.game.model.attr.OTHER_ITEM_SLOT_ATTR import gg.rsmod.game.model.entity.Client @@ -31,6 +32,7 @@ class IfButtonDHandler : MessageHandler { client.attr[INTERACTING_ITEM_SLOT] = fromSlot client.attr[OTHER_ITEM_SLOT_ATTR] = toSlot + client.attr[INTERACTING_COMPONENT_CHILD] = fromComponent val swapped = world.plugins.executeComponentToComponentItemSwap( client, fromInterfaceId, fromComponent, toInterfaceId, toComponent) diff --git a/game/src/main/kotlin/gg/rsmod/game/message/handler/IfModelOp1Handler.kt b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfModelOp1Handler.kt new file mode 100644 index 0000000000..8dcd203c5a --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/handler/IfModelOp1Handler.kt @@ -0,0 +1,14 @@ +package gg.rsmod.game.message.handler + +import gg.rsmod.game.message.MessageHandler +import gg.rsmod.game.message.impl.IfButtonMessage +import gg.rsmod.game.message.impl.IfModelOp1Message +import gg.rsmod.game.model.World +import gg.rsmod.game.model.entity.Client + +class IfModelOp1Handler : MessageHandler { + + override fun handle(client: Client, world: World, message: IfModelOp1Message) { + IfButton1Handler().handle(client, world, IfButtonMessage(message.component, 0, -1, -1)) + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/message/handler/OpObj2Handler.kt b/game/src/main/kotlin/gg/rsmod/game/message/handler/OpObj2Handler.kt new file mode 100644 index 0000000000..5b59bd7eae --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/handler/OpObj2Handler.kt @@ -0,0 +1,55 @@ +package gg.rsmod.game.message.handler + +import gg.rsmod.game.action.GroundItemPathAction +import gg.rsmod.game.message.MessageHandler +import gg.rsmod.game.message.impl.OpObj2Message +import gg.rsmod.game.model.EntityType +import gg.rsmod.game.model.Tile +import gg.rsmod.game.model.World +import gg.rsmod.game.model.attr.INTERACTING_GROUNDITEM_ATTR +import gg.rsmod.game.model.attr.INTERACTING_OPT_ATTR +import gg.rsmod.game.model.entity.Client +import gg.rsmod.game.model.entity.GroundItem +import gg.rsmod.game.model.entity.Player +import gg.rsmod.game.model.priv.Privilege +import java.lang.ref.WeakReference + +/** + * @author Tom + */ +class OpObj2Handler : MessageHandler { + + override fun handle(client: Client, world: World, message: OpObj2Message) { + /* + * If tile is too far away, don't process it. + */ + val tile = Tile(message.x, message.z, client.tile.height) + if (!tile.viewableFrom(client.tile, Player.TILE_VIEW_DISTANCE)) { + return + } + + if (!client.lock.canGroundItemInteract()) { + return + } + + log(client, "Ground Item action 1: item=%d, x=%d, z=%d, movement=%d", message.item, message.x, message.z, message.movementType) + + /* + * Get the region chunk that the object would belong to. + */ + val chunk = world.chunks.getOrCreate(tile) + val item = chunk.getEntities(tile, EntityType.GROUND_ITEM).firstOrNull { it.item == message.item && it.canBeViewedBy(client) } ?: return + + if (message.movementType == 1 && world.privileges.isEligible(client.privilege, Privilege.ADMIN_POWER)) { + client.moveTo(item.tile) + } + + client.closeInterfaceModal() + client.interruptQueues() + client.resetInteractions() + + client.attr[INTERACTING_OPT_ATTR] = 1 + client.attr[INTERACTING_GROUNDITEM_ATTR] = WeakReference(item) + client.executePlugin(GroundItemPathAction.walkPlugin) + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/message/impl/IfModelOp1Message.kt b/game/src/main/kotlin/gg/rsmod/game/message/impl/IfModelOp1Message.kt new file mode 100644 index 0000000000..3407dbd4cb --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/impl/IfModelOp1Message.kt @@ -0,0 +1,5 @@ +package gg.rsmod.game.message.impl + +import gg.rsmod.game.message.Message + +data class IfModelOp1Message(val component: Int) : Message \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/message/impl/OpObj2Message.kt b/game/src/main/kotlin/gg/rsmod/game/message/impl/OpObj2Message.kt new file mode 100644 index 0000000000..9caa2744e4 --- /dev/null +++ b/game/src/main/kotlin/gg/rsmod/game/message/impl/OpObj2Message.kt @@ -0,0 +1,8 @@ +package gg.rsmod.game.message.impl + +import gg.rsmod.game.message.Message + +/** + * @author Tom + */ +data class OpObj2Message(val item: Int, val x: Int, val z: Int, val movementType: Int) : Message \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/model/region/update/EntityUpdateType.kt b/game/src/main/kotlin/gg/rsmod/game/model/region/update/EntityUpdateType.kt index dd7c91345c..b9921b027d 100644 --- a/game/src/main/kotlin/gg/rsmod/game/model/region/update/EntityUpdateType.kt +++ b/game/src/main/kotlin/gg/rsmod/game/model/region/update/EntityUpdateType.kt @@ -7,14 +7,14 @@ package gg.rsmod.game.model.region.update * @author Tom */ enum class EntityUpdateType(val id: Int) { - UPDATE_GROUND_ITEM(id = 0), - SPAWN_PROJECTILE(id = 1), + REMOVE_GROUND_ITEM(id = 0), + PLAY_TILE_SOUND(id = 1), UNKNOWN(id = 2), - MAP_ANIM(id = 3), - ANIMATE_OBJECT(id = 4), - PLAY_TILE_SOUND(id = 5), - REMOVE_OBJECT(id = 6), - REMOVE_GROUND_ITEM(id = 7), - SPAWN_GROUND_ITEM(id = 8), - SPAWN_OBJECT(id = 9) + UPDATE_GROUND_ITEM(id = 3), + SPAWN_PROJECTILE(id = 4), + SPAWN_GROUND_ITEM(id = 5), + SPAWN_OBJECT(id = 6), + MAP_ANIM(id = 7), + REMOVE_OBJECT(id = 8), + ANIMATE_OBJECT(id = 9); } \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/sync/segment/AddLocalNpcSegment.kt b/game/src/main/kotlin/gg/rsmod/game/sync/segment/AddLocalNpcSegment.kt index 59702c2078..3884705dcc 100644 --- a/game/src/main/kotlin/gg/rsmod/game/sync/segment/AddLocalNpcSegment.kt +++ b/game/src/main/kotlin/gg/rsmod/game/sync/segment/AddLocalNpcSegment.kt @@ -35,11 +35,11 @@ class AddLocalNpcSegment(val player: Player, val npc: Npc, private val requiresB val facing = if (npc.lastFacingDirection != Direction.NONE) npc.lastFacingDirection else Direction.SOUTH buf.putBits(15, npc.index) - buf.putBits(if (largeScene) 8 else 5, dx) + buf.putBits(14, id) buf.putBits(1, if (requiresBlockUpdate) 1 else 0) + buf.putBits(if (largeScene) 8 else 5, dx) buf.putBits(3, facing.npcWalkValue) buf.putBits(1, if (requiresBlockUpdate) 1 else 0) buf.putBits(if (largeScene) 8 else 5, dz) - buf.putBits(14, id) } } \ No newline at end of file diff --git a/game/src/main/kotlin/gg/rsmod/game/sync/segment/PlayerUpdateBlockSegment.kt b/game/src/main/kotlin/gg/rsmod/game/sync/segment/PlayerUpdateBlockSegment.kt index e938284cfe..0620f9b2c5 100644 --- a/game/src/main/kotlin/gg/rsmod/game/sync/segment/PlayerUpdateBlockSegment.kt +++ b/game/src/main/kotlin/gg/rsmod/game/sync/segment/PlayerUpdateBlockSegment.kt @@ -82,8 +82,8 @@ class PlayerUpdateBlockSegment(val other: Player, private val newPlayer: Boolean // NOTE(Tom): seems that they don't use reverse bytes as they once use to. // If they do at some point read reverse bytes, we can add support for it. // To fix the issues that would arise, simply write the smart after the bytes. + buf.putBytesReverse(structure[4].transformation, compressed, length) buf.putSmart(chatMessage.text.length) - buf.putBytes(structure[4].transformation, compressed, 0, length) } UpdateBlockType.FORCE_CHAT -> { diff --git a/net/src/main/kotlin/gg/rsmod/net/codec/login/LoginDecoder.kt b/net/src/main/kotlin/gg/rsmod/net/codec/login/LoginDecoder.kt index 946e3c29fe..be80673f75 100644 --- a/net/src/main/kotlin/gg/rsmod/net/codec/login/LoginDecoder.kt +++ b/net/src/main/kotlin/gg/rsmod/net/codec/login/LoginDecoder.kt @@ -1,7 +1,10 @@ package gg.rsmod.net.codec.login import gg.rsmod.net.codec.StatefulFrameDecoder +import gg.rsmod.util.io.BufferUtils.readInverseMiddleInt import gg.rsmod.util.io.BufferUtils.readJagexString +import gg.rsmod.util.io.BufferUtils.readLEInt +import gg.rsmod.util.io.BufferUtils.readMiddleEndianInt import gg.rsmod.util.io.BufferUtils.readString import gg.rsmod.util.io.Xtea import io.netty.buffer.ByteBuf @@ -10,7 +13,6 @@ import io.netty.channel.ChannelFutureListener import io.netty.channel.ChannelHandlerContext import mu.KLogging import java.math.BigInteger -import java.util.Arrays /** * @author Tom @@ -48,9 +50,16 @@ class LoginDecoder(private val serverRevision: Int, private val cacheCrcs: IntAr if (buf.readableBytes() >= size) { val revision = buf.readInt() buf.skipBytes(Int.SIZE_BYTES) // Always 1 - buf.skipBytes(Byte.SIZE_BYTES) + + /** + * login protocols see param4 sent before and inside the xtea buffer + * and clientType here is an addition since the inclusion of mobile; + * all of this is ignored by rsmod for now. + */ + buf.skipBytes(Byte.SIZE_BYTES) // param4 is written as a signed byte + val clientType = buf.readUnsignedByte().toInt() // 0 for desktop if (revision == serverRevision) { - payloadLength = size - (Int.SIZE_BYTES + Int.SIZE_BYTES + Byte.SIZE_BYTES) + payloadLength = size - (Int.SIZE_BYTES + Int.SIZE_BYTES + Byte.SIZE_BYTES + Byte.SIZE_BYTES) decodePayload(ctx, buf, out) } else { ctx.writeResponse(LoginResultType.REVISION_MISMATCH) @@ -153,9 +162,9 @@ class LoginDecoder(private val serverRevision: Int, private val cacheCrcs: IntAr xteaBuf.skipBytes(Int.SIZE_BYTES * 3) - val crcs = IntArray(cacheCrcs.size) { xteaBuf.readInt() } + val crcs = decodeCRCs(xteaBuf) - for (i in 0 until crcs.size) { + for (i in crcs.indices) { /** * CRC for index 16 is always sent as 0 (at least on the * Desktop client, need to look into mobile). @@ -166,7 +175,7 @@ class LoginDecoder(private val serverRevision: Int, private val cacheCrcs: IntAr if (crcs[i] != cacheCrcs[i]) { buf.resetReaderIndex() buf.skipBytes(payloadLength) - logger.info { "User '$username' login request crc mismatch [requestCrc=${Arrays.toString(crcs)}, cacheCrc=${Arrays.toString(cacheCrcs)}]." } + logger.info { "User '$username' login request crc mismatch [requestCrc=${crcs.contentToString()}, cacheCrc=${cacheCrcs.contentToString()}]." } ctx.writeResponse(LoginResultType.REVISION_MISMATCH) return } @@ -182,6 +191,24 @@ class LoginDecoder(private val serverRevision: Int, private val cacheCrcs: IntAr } } + private fun decodeCRCs(xteaBuf: ByteBuf): IntArray { + val crcs = IntArray(cacheCrcs.size) + + /** + * switch based on incoming CRCorder + */ + for(i in CRCorder.indices){ + when(val idx = CRCorder[i]){ + 9,20,4 -> crcs[idx] = xteaBuf.readInt() + 11,18,1,19,2,0,16 -> crcs[idx] = xteaBuf.readLEInt() + 17,15,7 -> crcs[idx] = xteaBuf.readMiddleEndianInt() + 5,13,12,10,14,8,3,6 -> crcs[idx] = xteaBuf.readInverseMiddleInt() + } + } + + return crcs + } + private fun ChannelHandlerContext.writeResponse(result: LoginResultType) { val buf = channel().alloc().buffer(1) buf.writeByte(result.id) @@ -197,5 +224,15 @@ class LoginDecoder(private val serverRevision: Int, private val cacheCrcs: IntAr companion object : KLogging() { private const val LOGIN_OPCODE = 16 private const val RECONNECT_OPCODE = 18 + + /** + * As of revision 190 the client now sends the CRCs out of order + * and with varying byte orders + */ + private val CRCorder = intArrayOf( + 5,13,12,11,9, + 20,10,18,17,15, + 1,14,19,8,2, + 3,0,4,16,7,6) } } diff --git a/net/src/main/kotlin/gg/rsmod/net/packet/DataType.kt b/net/src/main/kotlin/gg/rsmod/net/packet/DataType.kt index 8e07cebc01..f4aefafd3a 100644 --- a/net/src/main/kotlin/gg/rsmod/net/packet/DataType.kt +++ b/net/src/main/kotlin/gg/rsmod/net/packet/DataType.kt @@ -26,27 +26,27 @@ package gg.rsmod.net.packet enum class DataType(val bytes: Int) { /** - * A byte. + * A byte is a single byte. */ BYTE(1), /** - * A short. + * A short value spans 3 bytes. */ SHORT(2), /** - * A 'tri byte' - a group of three bytes. + * A medium value spans 3 bytes. */ - TRI_BYTE(3), + MEDIUM(3), /** - * An integer. + * An integer value spans 4 bytes. */ INT(4), /** - * A long. + * A long value spans 8 bytes. */ LONG(8), diff --git a/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketBuilder.kt b/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketBuilder.kt index 7534bd37a9..2136d81bae 100644 --- a/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketBuilder.kt +++ b/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketBuilder.kt @@ -151,22 +151,40 @@ class GamePacketBuilder { DataOrder.MIDDLE -> { Preconditions.checkArgument(transformation == DataTransformation.NONE, "Middle endian cannot be transformed.") - Preconditions.checkArgument(type == DataType.INT, "Middle endian can only be used with an integer.") + Preconditions.checkArgument(type == DataType.INT || type == DataType.MEDIUM, "Middle endian can only be used with integer and medium values.") - buffer.writeByte((longValue shr 8).toByte().toInt()) - buffer.writeByte(longValue.toByte().toInt()) - buffer.writeByte((longValue shr 24).toByte().toInt()) - buffer.writeByte((longValue shr 16).toByte().toInt()) + when (type) { + DataType.MEDIUM -> { + buffer.writeByte((longValue shr 8).toByte().toInt()) + buffer.writeByte((longValue shr 16).toByte().toInt()) + buffer.writeByte(longValue.toByte().toInt()) + } + DataType.INT -> { + buffer.writeByte((longValue shr 8).toByte().toInt()) + buffer.writeByte(longValue.toByte().toInt()) + buffer.writeByte((longValue shr 24).toByte().toInt()) + buffer.writeByte((longValue shr 16).toByte().toInt()) + } + } } DataOrder.INVERSED_MIDDLE -> { Preconditions.checkArgument(transformation == DataTransformation.NONE, "Inversed middle endian cannot be transformed.") - Preconditions.checkArgument(type == DataType.INT, "Inversed middle endian can only be used with an integer.") + Preconditions.checkArgument(type == DataType.INT || type == DataType.MEDIUM, "Inversed middle endian can only be used with integer and medium values.") - buffer.writeByte((longValue shr 16).toByte().toInt()) - buffer.writeByte((longValue shr 24).toByte().toInt()) - buffer.writeByte(longValue.toByte().toInt()) - buffer.writeByte((longValue shr 8).toByte().toInt()) + when (type) { + DataType.MEDIUM -> { + buffer.writeByte(longValue.toByte().toInt()) + buffer.writeByte((longValue shr 16).toByte().toInt()) + buffer.writeByte((longValue shr 8).toByte().toInt()) + } + DataType.INT -> { + buffer.writeByte((longValue shr 16).toByte().toInt()) + buffer.writeByte((longValue shr 24).toByte().toInt()) + buffer.writeByte(longValue.toByte().toInt()) + buffer.writeByte((longValue shr 8).toByte().toInt()) + } + } } else -> throw IllegalArgumentException("Unknown order.") } @@ -344,9 +362,9 @@ class GamePacketBuilder { * * @param bytes The byte array. */ - fun putBytesReverse(bytes: ByteArray) { + fun putBytesReverse(bytes: ByteArray, length: Int = bytes.size) { checkByteAccess() - for (i in bytes.indices.reversed()) { + for (i in length-1 downTo 0) { buffer.writeByte(bytes[i].toInt()) } } @@ -356,8 +374,8 @@ class GamePacketBuilder { * * @param buffer The source [ByteBuf]. */ - fun putBytesReverse(buffer: ByteBuf) { - val bytes = ByteArray(buffer.readableBytes()) + fun putBytesReverse(buffer: ByteBuf, length: Int = buffer.readableBytes()) { + val bytes = ByteArray(length) buffer.markReaderIndex() try { buffer.readBytes(bytes) @@ -373,11 +391,11 @@ class GamePacketBuilder { * @param transformation The transformation. * @param bytes The byte array. */ - fun putBytesReverse(transformation: DataTransformation, bytes: ByteArray) { + fun putBytesReverse(transformation: DataTransformation, bytes: ByteArray, length: Int = bytes.size) { if (transformation == DataTransformation.NONE) { - putBytesReverse(bytes) + putBytesReverse(bytes, length) } else { - for (i in bytes.indices.reversed()) { + for (i in length-1 downTo 0) { put(DataType.BYTE, transformation, bytes[i]) } } diff --git a/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketReader.kt b/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketReader.kt index 3b0e18cf75..02d25ed586 100644 --- a/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketReader.kt +++ b/net/src/main/kotlin/gg/rsmod/net/packet/GamePacketReader.kt @@ -188,24 +188,44 @@ class GamePacketReader(packet: GamePacket) { if (transformation != DataTransformation.NONE) { throw IllegalArgumentException("Middle endian cannot be transformed.") } - if (type != DataType.INT) { - throw IllegalArgumentException("Middle endian can only be used with an integer.") + if (!(type == DataType.INT || type == DataType.MEDIUM)) { + throw IllegalArgumentException("Middle endian can only be used with integer and medium values.") + } + + when (type) { + DataType.MEDIUM -> { + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() + } + DataType.INT -> { + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 24).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() + } } - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 24).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() } else if (order == DataOrder.INVERSED_MIDDLE) { if (transformation != DataTransformation.NONE) { throw IllegalArgumentException("Inversed middle endian cannot be transformed.") } - if (type != DataType.INT) { - throw IllegalArgumentException("Inversed middle endian can only be used with an integer.") + if (!(type == DataType.INT || type == DataType.MEDIUM)) { + throw IllegalArgumentException("Inversed middle endian can only be used with integer and medium values.") + } + + when (type) { + DataType.MEDIUM -> { + longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() + } + DataType.INT -> { + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 24).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() + longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() + } } - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 16).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 24).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF).toLong() - longValue = longValue or (buffer.readByte().toInt() and 0xFF shl 8).toLong() } else { throw IllegalArgumentException("Unknown order.") } diff --git a/util/src/main/kotlin/gg/rsmod/util/io/BufferUtils.kt b/util/src/main/kotlin/gg/rsmod/util/io/BufferUtils.kt index 8bffecf8c9..74fcf18fba 100644 --- a/util/src/main/kotlin/gg/rsmod/util/io/BufferUtils.kt +++ b/util/src/main/kotlin/gg/rsmod/util/io/BufferUtils.kt @@ -37,4 +37,47 @@ object BufferUtils { return "" } } + + /** + * Gets a 32-bit integer at the current {@code readerIndex} + * in Litte endian format (DCBA) + * and increases the {@code readerIndex} by {@code 4} in this buffer. + * + * @throws IndexOutOfBoundsException + * if {@code this.readableBytes} is less than {@code 4} + * + * Note| this method now is natively implemented in netty and shouldn't be needed + * commented out for posterity and to keep it from showing in code completion + */ + fun ByteBuf.readLEInt(): Int { + if(readableBytes() < 4) throw IndexOutOfBoundsException("buffer does not contain enough bytes to read an int") + return (readByte().toInt() and 0xFF) + ((readByte().toInt() and 0xFF) shl 8) + ((readByte().toInt() and 0xFF) shl 16) + ((readByte().toInt() and 0xFF) shl 24) + } + + /** + * Gets a 32-bit integer at the current {@code readerIndex} + * in Inverse Middle endian format (BADC) + * and increases the {@code readerIndex} by {@code 4} in this buffer. + * + * @throws IndexOutOfBoundsException + * if {@code this.readableBytes} is less than {@code 4} + */ + fun ByteBuf.readInverseMiddleInt(): Int { + if(readableBytes() < 4) throw IndexOutOfBoundsException("buffer does not contain enough bytes to read an int") + return ((readByte().toInt() and 0xFF) shl 16) + ((readByte().toInt() and 0xFF) shl 24) + (readByte().toInt() and 0xFF) + ((readByte().toInt() and 0xFF) shl 8) + } + + /** + * Gets a 32-bit integer at the current {@code readerIndex} + * in Middle endian format (CDAB) + * and increases the {@code readerIndex} by {@code 4} in this buffer. + * + * @throws IndexOutOfBoundsException + * if {@code this.readableBytes} is less than {@code 4} + */ + fun ByteBuf.readMiddleEndianInt(): Int { + if(readableBytes() < 4) throw IndexOutOfBoundsException("buffer does not contain enough bytes to read an int") + return ((readByte().toInt() and 0xFF) shl 8) + (readByte().toInt() and 0xFF) + ((readByte().toInt() and 0xFF) shl 24) + ((readByte().toInt() and 0xFF) shl 16) + } + } \ No newline at end of file