From c6b625b6172f991606a02d18791e404dcd8566a3 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sat, 28 Nov 2020 16:49:59 -0600 Subject: [PATCH 01/12] Starting on a new game interface system Why did I call them widgets? --- data/config/game-interfaces.json5 | 85 ++++++++++++++++++ package-lock.json | 32 +++++-- package.json | 2 + src/config/index.ts | 4 + src/config/shop-config.ts | 13 ++- .../character-design-packet.js | 4 +- .../inbound-packets/item-on-item-packet.js | 6 +- src/net/inbound-packets/item-on-npc-packet.js | 4 +- .../inbound-packets/item-on-object-packet.js | 4 +- src/plugins/buttons/logout-button-plugin.ts | 4 +- src/plugins/buttons/player-emotes-plugin.ts | 4 +- .../buttons/player-setting-button-plugin.ts | 4 +- src/plugins/combat/combat-styles.ts | 10 +-- src/plugins/commands/quest-reset-command.ts | 4 +- .../items/buckets/empty-container-plugin.ts | 6 +- src/plugins/items/drop-item-plugin.ts | 6 +- .../items/equipment/equip-item-plugin.ts | 4 +- .../items/equipment/equipment-stats-plugin.ts | 14 +-- .../items/equipment/unequip-item-plugin.ts | 6 +- src/plugins/items/move-item-plugin.ts | 4 +- src/plugins/items/pickup-item-plugin.ts | 4 +- src/plugins/items/pots/empty-pot-plugin.ts | 4 +- .../items/shopping/buy-from-shop-plugin.ts | 11 ++- .../items/shopping/item-value-plugin.ts | 6 +- src/plugins/items/shopping/sell-to-shop.ts | 12 +-- src/plugins/items/swap-items-plugin.ts | 6 +- src/plugins/npcs/al-kharid/karim-plugin.ts | 4 +- .../npcs/varrock/blue-moon-inn-plugin.ts | 6 +- .../varrock/master-smithing-tutor-plugin.ts | 4 +- src/plugins/objects/bank/bank-plugin.ts | 43 ++++----- .../player/login-update-settings-plugin.ts | 28 +++--- .../quests/goblin-diplomacy-tutorial/index.ts | 27 +++--- src/plugins/quests/quest-journal-plugin.ts | 14 +-- src/plugins/rune.js | 1 + .../skills/crafting/spinning-wheel-plugin.ts | 6 +- src/plugins/skills/prayer.js | 4 +- .../runecrafting/runecrafting-crafting.ts | 6 +- src/plugins/skills/skill-guide-plugin.ts | 28 +++--- .../skills/smithing/smelting-plugin.ts | 32 +++---- src/world/actor/player/interface-state.ts | 60 +++++++++++++ src/world/actor/player/player.ts | 86 +++++++++--------- src/world/config/widget.ts | 88 +------------------ 42 files changed, 390 insertions(+), 310 deletions(-) create mode 100644 data/config/game-interfaces.json5 create mode 100644 src/world/actor/player/interface-state.ts diff --git a/data/config/game-interfaces.json5 b/data/config/game-interfaces.json5 new file mode 100644 index 000000000..c0e807265 --- /dev/null +++ b/data/config/game-interfaces.json5 @@ -0,0 +1,85 @@ +{ + characterDesign: 269, + furnace: { + widgetId: 311, + slots: { + slot0: { modelId: 4, titleId: 16 }, + slot1: { modelId: 5, titleId: 20 }, + slot2: { modelId: 6, titleId: 24 }, + slot3: { modelId: 7, titleId: 28 }, + slot4: { modelId: 8, titleId: 32 }, + slot5: { modelId: 9, titleId: 36 }, + slot6: { modelId: 10, titleId: 40 }, + slot7: { modelId: 11, titleId: 44 }, + slot8: { modelId: 12, titleId: 48 } + } + }, + inventory: { + widgetId: 149, + containerId: 0 + }, + equipment: { + widgetId: 387, + containerId: 25 + }, + equipmentStats: { + widgetId: 465, + containerId: 103 + }, + equipmentStatsInventory: { + widgetId: 336, + containerId: 0 + }, + bank: { + depositBoxWidget: { + widgetId: 11 + }, + pinSettingsWidget: { + widgetId: 14 + }, + screenWidget: { + widgetId: 12, + containerId: 89 + }, + tabWidget: { + widgetId: 266, + containerId: 0 + } + }, + defaultCombatStyle: 92, + skillGuide: 308, + skillsTab: 320, + friendsList: 131, + ignoreList: 148, + logoutTab: 182, + settingsTab: 261, + emotesTab: 464, + musicPlayerTab: 239, + prayerTab: 271, + standardSpellbookTab: 192, + questTab: 274, + shop: { + widgetId: 300, + containerId: 75, + title: 76 + }, + shopPlayerInventory: { + widgetId: 301, + containerId: 0 + }, + questJournal: 275, + questReward: 277, + welcomeScreen: 378, + welcomeScreenChildren: { + cogs: 16, + question: 17, + drama: 18, + bankPin: 19, + bankPinQuestion: 20, + scamming: 21, + bankPinKey: 22, + christmas: 23, + killcount: 24 + }, + whatWouldYouLikeToSpin: 459 +} diff --git a/package-lock.json b/package-lock.json index 02edbb17d..c857f3f4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1746,9 +1746,9 @@ "dev": true }, "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", + "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==", "dev": true }, "@types/lodash": { @@ -4784,12 +4784,11 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "keyv": { @@ -6823,6 +6822,23 @@ "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" + }, + "dependencies": { + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, "tslib": { diff --git a/package.json b/package.json index 7261f795d..c671e7126 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "crc-32": "^1.2.0", "express": "^4.17.1", "js-yaml": "^3.13.1", + "json5": "^2.1.3", "lodash": "^4.17.15", "quadtree-lib": "^1.0.9", "rxjs": "^6.5.4", @@ -59,6 +60,7 @@ "@types/express": "^4.17.2", "@types/hapi__joi": "^16.0.6", "@types/js-yaml": "^3.12.1", + "@types/json5": "0.0.30", "@types/lodash": "^4.14.149", "@types/node": "^12.12.6", "@types/uuid": "^3.4.6", diff --git a/src/config/index.ts b/src/config/index.ts index 1bd8f9732..c0c7292d0 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -17,6 +17,7 @@ import { } from '@server/config/npc-config'; import { loadNpcSpawnConfigurations, NpcSpawn } from '@server/config/npc-spawn-config'; import { loadShopConfigurations, Shop } from '@server/config/shop-config'; +import json5 from 'json5'; export async function loadConfigurationFiles(configurationDir: string): Promise { @@ -47,6 +48,7 @@ export let npcIdMap: { [key: number]: string }; export let npcPresetMap: NpcPresetConfiguration; export let npcSpawns: NpcSpawn[] = []; export let shopMap: { [key: string]: Shop }; +export let gameInterfaces: { [key: string]: any }; export async function loadConfigurations(): Promise { @@ -63,6 +65,8 @@ export async function loadConfigurations(): Promise { npcSpawns = await loadNpcSpawnConfigurations('data/config/npc-spawns'); shopMap = await loadShopConfigurations('data/config/shops'); + + gameInterfaces = json5.parse(readFileSync('data/config/game-interfaces.json5', 'utf8')); } diff --git a/src/config/shop-config.ts b/src/config/shop-config.ts index e01b5643b..69225a3fc 100644 --- a/src/config/shop-config.ts +++ b/src/config/shop-config.ts @@ -1,7 +1,6 @@ import { ItemContainer } from '@server/world/items/item-container'; -import { findItem, loadConfigurationFiles } from '@server/config/index'; +import { findItem, loadConfigurationFiles, gameInterfaces } from '@server/config/index'; import { Player } from '@server/world/actor/player/player'; -import { widgets } from '@server/world/config/widget'; import { ItemDetails } from '@server/config/item-config'; @@ -92,13 +91,13 @@ export class Shop { public open(player: Player): void { player.metadata['lastOpenedShop'] = this; - player.outgoingPackets.updateWidgetString(widgets.shop.widgetId, widgets.shop.title, this.name); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shop, this.container); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, player.inventory); + player.outgoingPackets.updateWidgetString(gameInterfaces.shop.widgetId, gameInterfaces.shop.title, this.name); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shop, this.container); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, player.inventory); player.activeWidget = { - widgetId: widgets.shop.widgetId, - secondaryWidgetId: widgets.shopPlayerInventory.widgetId, + widgetId: gameInterfaces.shop.widgetId, + secondaryWidgetId: gameInterfaces.shopPlayerInventory.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; diff --git a/src/net/inbound-packets/character-design-packet.js b/src/net/inbound-packets/character-design-packet.js index eb7b6123f..258d79821 100644 --- a/src/net/inbound-packets/character-design-packet.js +++ b/src/net/inbound-packets/character-design-packet.js @@ -1,7 +1,7 @@ -import { widgets } from '../../world/config/widget'; +import { gameInterfaces } from '../../config'; const characterDesignPacket = (player, packet) => { - if(!player.activeWidget || player.activeWidget.widgetId !== widgets.characterDesign) { + if(!player.activeWidget || player.activeWidget.widgetId !== gameInterfaces.characterDesign) { return; } diff --git a/src/net/inbound-packets/item-on-item-packet.js b/src/net/inbound-packets/item-on-item-packet.js index dcd4af64b..bcf626b72 100644 --- a/src/net/inbound-packets/item-on-item-packet.js +++ b/src/net/inbound-packets/item-on-item-packet.js @@ -1,6 +1,6 @@ -import { widgets } from '../../world/config/widget'; import { logger } from '@runejs/core'; import { actionHandler } from '../../world/action'; +import { gameInterfaces } from '../../config'; const itemOnItemPacket = (player, packet) => { const { buffer } = packet; @@ -13,8 +13,8 @@ const itemOnItemPacket = (player, packet) => { const usedItemId = buffer.get('SHORT', 'UNSIGNED', 'LITTLE_ENDIAN'); const usedSlot = buffer.get('SHORT', 'UNSIGNED'); - if(usedWidgetId === widgets.inventory.widgetId && usedContainerId === widgets.inventory.containerId && - usedWithWidgetId === widgets.inventory.widgetId && usedWithContainerId === widgets.inventory.containerId) { + if(usedWidgetId === gameInterfaces.inventory.widgetId && usedContainerId === gameInterfaces.inventory.containerId && + usedWithWidgetId === gameInterfaces.inventory.widgetId && usedWithContainerId === gameInterfaces.inventory.containerId) { if(usedSlot < 0 || usedSlot > 27 || usedWithSlot < 0 || usedWithSlot > 27) { return; } diff --git a/src/net/inbound-packets/item-on-npc-packet.js b/src/net/inbound-packets/item-on-npc-packet.js index 0050e10ac..05f54e1e6 100644 --- a/src/net/inbound-packets/item-on-npc-packet.js +++ b/src/net/inbound-packets/item-on-npc-packet.js @@ -1,8 +1,8 @@ -import { widgets } from '../../world/config/widget'; import { logger } from '@runejs/core'; import { world } from '../../game-server'; import { World } from '../../world'; import { actionHandler } from '../../world/action'; +import { gameInterfaces } from '../../config'; const itemOnNpcPacket = (player, packet) => { const { buffer } = packet; @@ -13,7 +13,7 @@ const itemOnNpcPacket = (player, packet) => { const itemContainerId = buffer.get('SHORT'); let usedItem; - if(itemWidgetId === widgets.inventory.widgetId && itemContainerId === widgets.inventory.containerId) { + if(itemWidgetId === gameInterfaces.inventory.widgetId && itemContainerId === gameInterfaces.inventory.containerId) { if(itemSlot < 0 || itemSlot > 27) { return; } diff --git a/src/net/inbound-packets/item-on-object-packet.js b/src/net/inbound-packets/item-on-object-packet.js index 4ad76289f..e73d453d7 100644 --- a/src/net/inbound-packets/item-on-object-packet.js +++ b/src/net/inbound-packets/item-on-object-packet.js @@ -1,8 +1,8 @@ -import { widgets } from '../../world/config/widget'; import { logger } from '@runejs/core'; import { Position } from '../../world/position'; import { cache, world } from '../../game-server'; import { actionHandler } from '../../world/action'; +import { gameInterfaces } from '../../config'; const itemOnObjectPacket = (player, packet) => { const { buffer } = packet; @@ -15,7 +15,7 @@ const itemOnObjectPacket = (player, packet) => { const objectX = buffer.get('SHORT', 'UNSIGNED', 'LITTLE_ENDIAN'); let usedItem; - if (itemWidgetId === widgets.inventory.widgetId && itemContainerId === widgets.inventory.containerId) { + if (itemWidgetId === gameInterfaces.inventory.widgetId && itemContainerId === gameInterfaces.inventory.containerId) { if (itemSlot < 0 || itemSlot > 27) { return; } diff --git a/src/plugins/buttons/logout-button-plugin.ts b/src/plugins/buttons/logout-button-plugin.ts index 4c49a22da..4c183feb3 100644 --- a/src/plugins/buttons/logout-button-plugin.ts +++ b/src/plugins/buttons/logout-button-plugin.ts @@ -1,6 +1,6 @@ import { buttonAction } from '@server/world/action/button-action'; -import { widgets } from '@server/world/config/widget'; import { world } from '@server/game-server'; +import { gameInterfaces } from '@server/config'; export const action: buttonAction = (details) => { const { player } = details; @@ -14,4 +14,4 @@ export const action: buttonAction = (details) => { } }; -export default { type: 'button', widgetId: widgets.logoutTab, buttonIds: 6, action }; +export default { type: 'button', widgetId: gameInterfaces.logoutTab, buttonIds: 6, action }; diff --git a/src/plugins/buttons/player-emotes-plugin.ts b/src/plugins/buttons/player-emotes-plugin.ts index 2697df070..99fa9d766 100644 --- a/src/plugins/buttons/player-emotes-plugin.ts +++ b/src/plugins/buttons/player-emotes-plugin.ts @@ -1,7 +1,7 @@ import { buttonAction } from '@server/world/action/button-action'; -import { widgets } from '@server/world/config/widget'; import { Player } from '@server/world/actor/player/player'; import { itemIds } from '@server/world/config/item-ids'; +import { gameInterfaces } from '@server/config'; interface Emote { animationId: number; @@ -181,4 +181,4 @@ export const action: buttonAction = (details) => { } }; -export default { type: 'button', widgetId: widgets.emotesTab, buttonIds, action }; +export default { type: 'button', widgetId: gameInterfaces.emotesTab, buttonIds, action }; diff --git a/src/plugins/buttons/player-setting-button-plugin.ts b/src/plugins/buttons/player-setting-button-plugin.ts index 96cc97fc6..3ce2ef735 100644 --- a/src/plugins/buttons/player-setting-button-plugin.ts +++ b/src/plugins/buttons/player-setting-button-plugin.ts @@ -1,5 +1,5 @@ import { buttonAction } from '@server/world/action/button-action'; -import { widgets } from '@server/world/config/widget'; +import { gameInterfaces } from '@server/config'; const buttonIds: number[] = [ 0, // walk/run @@ -19,4 +19,4 @@ export const action: buttonAction = (details) => { player.settingChanged(buttonId); }; -export default { type: 'button', widgetId: widgets.settingsTab, buttonIds: buttonIds, action }; +export default { type: 'button', widgetId: gameInterfaces.settingsTab, buttonIds: buttonIds, action }; diff --git a/src/plugins/combat/combat-styles.ts b/src/plugins/combat/combat-styles.ts index b15ba81ab..57cdbb8ad 100644 --- a/src/plugins/combat/combat-styles.ts +++ b/src/plugins/combat/combat-styles.ts @@ -1,8 +1,8 @@ import { equipAction, EquipActionData } from '@server/world/action/equip-action'; import { ItemDetails, WeaponStyle, weaponWidgetIds } from '@server/config/item-config'; -import { widgets, widgetScripts } from '@server/world/config/widget'; +import { interfaceScripts } from '@server/world/config/widget'; import { Player, playerInitAction } from '@server/world/actor/player/player'; -import { findItem } from '@server/config'; +import { findItem, gameInterfaces } from '@server/config'; import { buttonAction } from '@server/world/action/button-action'; import { combatStyles } from '@server/world/actor/combat'; import { serverConfig } from '@server/game-server'; @@ -13,12 +13,12 @@ export function updateCombatStyle(player: Player, weaponStyle: WeaponStyle, styl player.settings.attackStyle = styleIndex; const buttonId = combatStyles[weaponStyle][styleIndex].button_id; - player.outgoingPackets.updateClientConfig(widgetScripts.attackStyle, buttonId); + player.outgoingPackets.updateClientConfig(interfaceScripts.attackStyle, buttonId); } export function showUnarmed(player: Player): void { - player.modifyWidget(widgets.defaultCombatStyle, { childId: 0, text: 'Unarmed' }); - player.setSidebarWidget(0, widgets.defaultCombatStyle); + player.modifyWidget(gameInterfaces.defaultCombatStyle, { childId: 0, text: 'Unarmed' }); + player.setSidebarWidget(0, gameInterfaces.defaultCombatStyle); let style = 0; if(player.savedMetadata.combatStyle) { style = player.savedMetadata.combatStyle[1] || null; diff --git a/src/plugins/commands/quest-reset-command.ts b/src/plugins/commands/quest-reset-command.ts index b12090108..76469359d 100644 --- a/src/plugins/commands/quest-reset-command.ts +++ b/src/plugins/commands/quest-reset-command.ts @@ -1,11 +1,11 @@ import { commandAction } from '@server/world/action/player-command-action'; -import { widgetScripts } from '@server/world/config/widget'; +import { interfaceScripts } from '@server/world/config/widget'; const action: commandAction = (details) => { const { player } = details; player.quests.find(quest => quest.questId === 'cooksAssistant').stage = 'COLLECTING'; - player.outgoingPackets.updateClientConfig(widgetScripts.questPoints, 1000); + player.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, 1000); }; export default { diff --git a/src/plugins/items/buckets/empty-container-plugin.ts b/src/plugins/items/buckets/empty-container-plugin.ts index a21e14730..ae53610d5 100644 --- a/src/plugins/items/buckets/empty-container-plugin.ts +++ b/src/plugins/items/buckets/empty-container-plugin.ts @@ -1,8 +1,8 @@ import { itemAction } from '@server/world/action/item-action'; -import { widgets } from '@server/world/config/widget'; import { soundIds } from '@server/world/config/sound-ids'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot } = details; @@ -27,12 +27,12 @@ export const action: itemAction = (details) => { } // @TODO only update necessary slots - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); }; export default { type: 'item_action', - widgets: widgets.inventory, + widgets: gameInterfaces.inventory, options: 'empty', itemIds: [itemIds.bucketOfMilk, itemIds.bucketOfWater, itemIds.jugOfWater], action, diff --git a/src/plugins/items/drop-item-plugin.ts b/src/plugins/items/drop-item-plugin.ts index c0a0fd3aa..417588f08 100644 --- a/src/plugins/items/drop-item-plugin.ts +++ b/src/plugins/items/drop-item-plugin.ts @@ -1,9 +1,9 @@ -import { widgets } from '@server/world/config/widget'; import { itemAction } from '@server/world/action/item-action'; import { soundIds } from '@server/world/config/sound-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { serverConfig } from '@server/game-server'; import { Rights } from '@server/world/actor/player/player'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = ({ player, itemId, itemSlot }) => { const inventory = player.inventory; @@ -20,7 +20,7 @@ export const action: itemAction = ({ player, itemId, itemSlot }) => { } inventory.remove(itemSlot); - player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, itemSlot, null); + player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, itemSlot, null); player.playSound(soundIds.dropItem, 5); player.instance.spawnWorldItem(item, player.position, player, 300); player.actionsCancelled.next(); @@ -28,7 +28,7 @@ export const action: itemAction = ({ player, itemId, itemSlot }) => { export default { type: 'item_action', - widgets: widgets.inventory, + widgets: gameInterfaces.inventory, options: 'drop', action, cancelOtherActions: false diff --git a/src/plugins/items/equipment/equip-item-plugin.ts b/src/plugins/items/equipment/equip-item-plugin.ts index 65c44710b..295815518 100644 --- a/src/plugins/items/equipment/equip-item-plugin.ts +++ b/src/plugins/items/equipment/equip-item-plugin.ts @@ -1,5 +1,5 @@ -import { widgets } from '@server/world/config/widget'; import { itemAction } from '@server/world/action/item-action'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, itemDetails } = details; @@ -15,7 +15,7 @@ export const action: itemAction = (details) => { export default { type: 'item_action', - widgets: widgets.inventory, + widgets: gameInterfaces.inventory, options: 'equip', action, cancelOtherActions: false diff --git a/src/plugins/items/equipment/equipment-stats-plugin.ts b/src/plugins/items/equipment/equipment-stats-plugin.ts index 914430e87..4420e70b2 100644 --- a/src/plugins/items/equipment/equipment-stats-plugin.ts +++ b/src/plugins/items/equipment/equipment-stats-plugin.ts @@ -1,6 +1,6 @@ import { buttonAction } from '@server/world/action/button-action'; -import { widgets } from '@server/world/config/widget'; import { Player } from '@server/world/actor/player/player'; +import { gameInterfaces } from '@server/config'; export function updateBonusStrings(player: Player): void { [ @@ -16,7 +16,7 @@ export function updateBonusStrings(player: Player): void { { id: 117, text: 'Range', value: player.bonuses.defensive.ranged }, { id: 119, text: 'Strength', value: player.bonuses.skill.strength }, { id: 120, text: 'Prayer', value: player.bonuses.skill.prayer }, - ].forEach(bonus => player.modifyWidget(widgets.equipmentStats.widgetId, { childId: bonus.id, + ].forEach(bonus => player.modifyWidget(gameInterfaces.equipmentStats.widgetId, { childId: bonus.id, text: `${bonus.text}: ${bonus.value > 0 ? `+${bonus.value}` : bonus.value}` })); } @@ -27,15 +27,15 @@ export const action: buttonAction = (details) => { updateBonusStrings(player); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, player.equipment); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipmentStats, player.equipment); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); player.activeWidget = { - widgetId: widgets.equipmentStats.widgetId, - secondaryWidgetId: widgets.inventory.widgetId, + widgetId: gameInterfaces.equipmentStats.widgetId, + secondaryWidgetId: gameInterfaces.inventory.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; }; -export default { type: 'button', widgetId: widgets.equipment.widgetId, buttonIds: 24, action }; +export default { type: 'button', widgetId: gameInterfaces.equipment.widgetId, buttonIds: 24, action }; diff --git a/src/plugins/items/equipment/unequip-item-plugin.ts b/src/plugins/items/equipment/unequip-item-plugin.ts index 073af7ba6..f65f12b66 100644 --- a/src/plugins/items/equipment/unequip-item-plugin.ts +++ b/src/plugins/items/equipment/unequip-item-plugin.ts @@ -1,6 +1,6 @@ -import { widgets } from '@server/world/config/widget'; import { itemAction } from '@server/world/action/item-action'; import { getItemFromContainer } from '@server/world/items/item-container'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, itemDetails } = details; @@ -25,8 +25,8 @@ export const action: itemAction = (details) => { export default { type: 'item_action', widgets: [ - widgets.equipment, - widgets.equipmentStats + gameInterfaces.equipment, + gameInterfaces.equipmentStats ], options: 'remove', action, diff --git a/src/plugins/items/move-item-plugin.ts b/src/plugins/items/move-item-plugin.ts index 92d6c7896..31cb92fad 100644 --- a/src/plugins/items/move-item-plugin.ts +++ b/src/plugins/items/move-item-plugin.ts @@ -1,13 +1,13 @@ import { swapItemsAction } from '@server/world/action/swap-items-action'; -import { widgets } from '@server/world/config/widget'; import { ItemContainer } from '@server/world/items/item-container'; import { Player } from '@server/world/actor/player/player'; +import { gameInterfaces } from '@server/config'; type WidgetDetail = [ number, number, (player: Player) => ItemContainer ]; const movableWidgets: WidgetDetail[] = [ // Player Bank Screen - [ widgets.bank.screenWidget.widgetId, widgets.bank.screenWidget.containerId, player => player.bank ] + [ gameInterfaces.bank.screenWidget.widgetId, gameInterfaces.bank.screenWidget.containerId, player => player.bank ] ]; function moveItem(player: Player, container: ItemContainer, widget: { widgetId: number, containerId: number }, diff --git a/src/plugins/items/pickup-item-plugin.ts b/src/plugins/items/pickup-item-plugin.ts index 7fde8f28a..3df1ee6e1 100644 --- a/src/plugins/items/pickup-item-plugin.ts +++ b/src/plugins/items/pickup-item-plugin.ts @@ -1,7 +1,7 @@ import { worldItemAction } from '@server/world/action/world-item-action'; import { Item } from '../../world/items/item'; -import { widgets } from '../../world/config/widget'; import { soundIds } from '@server/world/config/sound-ids'; +import { gameInterfaces } from '@server/config'; export const action: worldItemAction = ({ player, worldItem, itemDetails }) => { const inventory = player.inventory; @@ -37,7 +37,7 @@ export const action: worldItemAction = ({ player, worldItem, itemDetails }) => { }; inventory.add(item); - player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, item); + player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, item); player.playSound(soundIds.pickupItem, 3); player.actionsCancelled.next(); }; diff --git a/src/plugins/items/pots/empty-pot-plugin.ts b/src/plugins/items/pots/empty-pot-plugin.ts index 9a5b97145..bfc60cab4 100644 --- a/src/plugins/items/pots/empty-pot-plugin.ts +++ b/src/plugins/items/pots/empty-pot-plugin.ts @@ -1,10 +1,10 @@ import { itemAction } from '@server/world/action/item-action'; -import { widgets } from '@server/world/config/widget'; import { soundIds } from '@server/world/config/sound-ids'; import { RunePlugin } from '@server/plugins/plugin'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { ActionType } from '@server/world/action'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot } = details; @@ -24,7 +24,7 @@ export const action: itemAction = (details) => { export default { type: 'item_action', - widgets: widgets.inventory, + widgets: gameInterfaces.inventory, options: 'empty', itemIds: [itemIds.potOfFlour], action, diff --git a/src/plugins/items/shopping/buy-from-shop-plugin.ts b/src/plugins/items/shopping/buy-from-shop-plugin.ts index 030d6a471..b796efb6a 100644 --- a/src/plugins/items/shopping/buy-from-shop-plugin.ts +++ b/src/plugins/items/shopping/buy-from-shop-plugin.ts @@ -1,9 +1,8 @@ import { itemAction } from '@server/world/action/item-action'; -import { widgets } from '@server/world/config/widget'; import { Item } from '@server/world/items/item'; import { getItemFromContainer, ItemContainer } from '@server/world/items/item-container'; import { itemIds } from '@server/world/config/item-ids'; -import { findItem } from '@server/config'; +import { findItem, gameInterfaces } from '@server/config'; import { Shop } from '@server/config/shop-config'; @@ -104,14 +103,14 @@ export const action: itemAction = (details) => { removeCoins(inventory, coinsIndex, buyCost); } - player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.shop, itemSlot, shopContainer.items[itemSlot]); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); + player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.shop, itemSlot, shopContainer.items[itemSlot]); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); }; export default { type: 'item_action', - widgets: widgets.shop, + widgets: gameInterfaces.shop, options: [ 'buy-1', 'buy-5', 'buy-10' ], action, cancelOtherActions: false diff --git a/src/plugins/items/shopping/item-value-plugin.ts b/src/plugins/items/shopping/item-value-plugin.ts index 01639ce68..00c51bcaf 100644 --- a/src/plugins/items/shopping/item-value-plugin.ts +++ b/src/plugins/items/shopping/item-value-plugin.ts @@ -1,6 +1,6 @@ import { itemAction } from '@server/world/action/item-action'; -import { widgets } from '@server/world/config/widget'; import { Shop } from '@server/config/shop-config'; +import { gameInterfaces } from '@server/config'; export const shopSellValueAction: itemAction = ({ player, itemDetails }) => { const itemValue = itemDetails.value || 1; @@ -24,13 +24,13 @@ export const shopPurchaseValueAction: itemAction = ({ player, itemDetails }) => export default [{ type: 'item_action', - widgets: widgets.shop, + widgets: gameInterfaces.shop, options: 'value', action: shopSellValueAction, cancelOtherActions: false }, { type: 'item_action', - widgets: widgets.shopPlayerInventory, + widgets: gameInterfaces.shopPlayerInventory, options: 'value', action: shopPurchaseValueAction, cancelOtherActions: false diff --git a/src/plugins/items/shopping/sell-to-shop.ts b/src/plugins/items/shopping/sell-to-shop.ts index e16d4797b..68c6f8e98 100644 --- a/src/plugins/items/shopping/sell-to-shop.ts +++ b/src/plugins/items/shopping/sell-to-shop.ts @@ -1,14 +1,14 @@ import { itemAction } from '@server/world/action/item-action'; -import { widgets } from '@server/world/config/widget'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { Shop } from '@server/config/shop-config'; +import { gameInterfaces } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, option, itemDetails } = details; - if(!player.activeWidget || player.activeWidget.widgetId !== widgets.shop.widgetId) { + if(!player.activeWidget || player.activeWidget.widgetId !== gameInterfaces.shop.widgetId) { return; } @@ -80,14 +80,14 @@ export const action: itemAction = (details) => { } } - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shop, shopContainer); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shop, shopContainer); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); }; export default { type: 'item_action', - widgets: widgets.shopPlayerInventory, + widgets: gameInterfaces.shopPlayerInventory, options: [ 'sell-1', 'sell-5', 'sell-10' ], action, cancelOtherActions: false diff --git a/src/plugins/items/swap-items-plugin.ts b/src/plugins/items/swap-items-plugin.ts index 7128ffaff..fc008ed9b 100644 --- a/src/plugins/items/swap-items-plugin.ts +++ b/src/plugins/items/swap-items-plugin.ts @@ -1,15 +1,15 @@ import { swapItemsAction } from '@server/world/action/swap-items-action'; -import { widgets } from '@server/world/config/widget'; import { ItemContainer } from '@server/world/items/item-container'; import { Player } from '@server/world/actor/player/player'; +import { gameInterfaces } from '@server/config'; type WidgetDetail = [ number, number, (player: Player) => ItemContainer ]; const swappableWidgets: WidgetDetail[] = [ // Player Inventory - [ widgets.inventory.widgetId, widgets.inventory.containerId, player => player.inventory ], + [ gameInterfaces.inventory.widgetId, gameInterfaces.inventory.containerId, player => player.inventory ], // Player Bank Screen - [ widgets.bank.screenWidget.widgetId, widgets.bank.screenWidget.containerId, player => player.bank ] + [ gameInterfaces.bank.screenWidget.widgetId, gameInterfaces.bank.screenWidget.containerId, player => player.bank ] ]; function swapItems(container: ItemContainer, fromSlot: number, toSlot: number): void { diff --git a/src/plugins/npcs/al-kharid/karim-plugin.ts b/src/plugins/npcs/al-kharid/karim-plugin.ts index 651d8af64..3c92bbe0d 100644 --- a/src/plugins/npcs/al-kharid/karim-plugin.ts +++ b/src/plugins/npcs/al-kharid/karim-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { itemIds } from '@server/world/config/item-ids'; -import { widgets } from '@server/world/config/widget'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; +import { gameInterfaces } from '@server/config'; const talkToAction : npcAction = (details) => { const { player, npc } = details; @@ -31,7 +31,7 @@ const talkToAction : npcAction = (details) => { } inventory.add({ itemId: itemIds.kebab, amount: 1 }); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); return; } diff --git a/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts b/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts index 4fdc8fddf..ec50dd69c 100644 --- a/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts +++ b/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; import { itemIds } from '@server/world/config/item-ids'; -import { widgets } from '@server/world/config/widget'; +import { gameInterfaces } from '@server/config'; const talkToBartender : npcAction = (details) => { @@ -43,7 +43,7 @@ const talkToBartender : npcAction = (details) => { // Give the beer. player.inventory.add(itemIds.beer); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); } }), ], @@ -123,7 +123,7 @@ const talkToCook : npcAction = (details) => { // Give the cabbage. player.inventory.add(itemIds.cabbage); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); }), cook => [Emote.HAPPY, `It's a deal. Now, make sure you eat it all up. Cabbage is good for you.`], ], diff --git a/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts b/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts index d7c681847..8714ac18a 100644 --- a/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts +++ b/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { dialogue, Emote, execute, goto } from '@server/world/actor/dialogue'; import { itemIds } from '@server/world/config/item-ids'; -import { widgets } from '@server/world/config/widget'; +import { gameInterfaces } from '@server/config'; const talkTo : npcAction = (details) => { @@ -16,7 +16,7 @@ const talkTo : npcAction = (details) => { execute(() => { player.inventory.add(itemIds.hammer); player.sendMessage('The Master Smithing Tutor gives you a hammer.', true); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); }), tutor => [Emote.GENERIC, `You're going to get your hand on some metal bars.`], tutor => [Emote.GENERIC, `You could do this by mining your own ores and smelting them at a furnace.`], diff --git a/src/plugins/objects/bank/bank-plugin.ts b/src/plugins/objects/bank/bank-plugin.ts index ac6ec8672..8cecc873b 100644 --- a/src/plugins/objects/bank/bank-plugin.ts +++ b/src/plugins/objects/bank/bank-plugin.ts @@ -1,11 +1,12 @@ import { objectIds } from '@server/world/config/object-ids'; -import { widgets, widgetScripts } from '@server/world/config/widget'; +import { interfaceScripts } from '@server/world/config/widget'; import { objectAction } from '@server/world/action/object-action'; import { ItemContainer } from '@server/world/items/item-container'; import { itemAction } from '@server/world/action/item-action'; import { fromNote, Item, toNote } from '@server/world/items/item'; import { buttonAction } from '@server/world/action/button-action'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; +import { gameInterfaces } from '@server/config'; const buttonIds: number[] = [ @@ -17,21 +18,21 @@ const buttonIds: number[] = [ export const openBankInterface: objectAction = ({ player }) => { player.activeWidget = { - widgetId: widgets.bank.screenWidget.widgetId, - secondaryWidgetId: widgets.bank.tabWidget.widgetId, + widgetId: gameInterfaces.bank.screenWidget.widgetId, + secondaryWidgetId: gameInterfaces.bank.tabWidget.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, player.inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, player.bank); - player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, player.settings.bankInsertMode); - player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, player.settings.bankWithdrawNoteMode); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, player.bank); + player.outgoingPackets.updateClientConfig(interfaceScripts.bankInsertMode, player.settings.bankInsertMode); + player.outgoingPackets.updateClientConfig(interfaceScripts.bankWithdrawNoteMode, player.settings.bankWithdrawNoteMode); }; export const openPinSettings: objectAction = ({ player }) => { player.activeWidget = { - widgetId: widgets.bank.pinSettingsWidget.widgetId, + widgetId: gameInterfaces.bank.pinSettingsWidget.widgetId, type: 'SCREEN', closeOnWalk: true }; @@ -40,8 +41,8 @@ export const openPinSettings: objectAction = ({ player }) => { export const depositItem: itemAction = (details) => { // Check if player might be spawning widget clientside if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { + !(details.player.activeWidget.widgetId === gameInterfaces.bank.screenWidget.widgetId) || + !(details.player.activeWidget.secondaryWidgetId === gameInterfaces.bank.tabWidget.widgetId)) { return; } @@ -99,17 +100,17 @@ export const depositItem: itemAction = (details) => { playerBank.addStacking(itemToAdd); - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, details.player.bank); }; export const withdrawItem: itemAction = (details) => { // Check if player might be spawning widget clientside if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { + !(details.player.activeWidget.widgetId === gameInterfaces.bank.screenWidget.widgetId) || + !(details.player.activeWidget.secondaryWidgetId === gameInterfaces.bank.tabWidget.widgetId)) { return; } // Check if the player has the item @@ -174,9 +175,9 @@ export const withdrawItem: itemAction = (details) => { } - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, details.player.bank); }; export const btnAction: buttonAction = (details) => { @@ -238,17 +239,17 @@ export default [{ action: openBankInterface }, { type: 'item_action', - widgets: widgets.bank.tabWidget, + widgets: gameInterfaces.bank.tabWidget, options: ['deposit-1', 'deposit-5', 'deposit-10', 'deposit-all'], action: depositItem, }, { type: 'item_action', - widgets: widgets.bank.screenWidget, + widgets: gameInterfaces.bank.screenWidget, options: ['withdraw-1', 'withdraw-5', 'withdraw-10', 'withdraw-all'], action: withdrawItem, }, { type: 'button', - widgetId: widgets.bank.screenWidget.widgetId, + widgetId: gameInterfaces.bank.screenWidget.widgetId, buttonIds: buttonIds, action: btnAction }]; diff --git a/src/plugins/player/login-update-settings-plugin.ts b/src/plugins/player/login-update-settings-plugin.ts index a1e547870..2d9102ecc 100644 --- a/src/plugins/player/login-update-settings-plugin.ts +++ b/src/plugins/player/login-update-settings-plugin.ts @@ -1,6 +1,6 @@ import { playerInitAction } from '@server/world/actor/player/player'; import { validateSettings } from '@server/world/actor/player/player-data'; -import { widgetScripts } from '@server/world/config/widget'; +import { interfaceScripts } from '@server/world/config/widget'; export const action: playerInitAction = (details) => { const { player } = details; @@ -8,19 +8,19 @@ export const action: playerInitAction = (details) => { validateSettings(player); const settings = player.settings; - player.outgoingPackets.updateClientConfig(widgetScripts.brightness, settings.screenBrightness); - player.outgoingPackets.updateClientConfig(widgetScripts.mouseButtons, settings.twoMouseButtonsEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(widgetScripts.splitPrivateChat, settings.splitPrivateChatEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(widgetScripts.chatEffects, settings.chatEffectsEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(widgetScripts.acceptAid, settings.acceptAidEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(widgetScripts.musicVolume, settings.musicVolume); - player.outgoingPackets.updateClientConfig(widgetScripts.soundEffectVolume, settings.soundEffectVolume); - player.outgoingPackets.updateClientConfig(widgetScripts.areaEffectVolume, settings.areaEffectVolume); - player.outgoingPackets.updateClientConfig(widgetScripts.runMode, settings.runEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(widgetScripts.autoRetaliate, settings.autoRetaliateEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(widgetScripts.attackStyle, settings.attackStyle); - player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, settings.bankInsertMode); - player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, settings.bankWithdrawNoteMode); + player.outgoingPackets.updateClientConfig(interfaceScripts.brightness, settings.screenBrightness); + player.outgoingPackets.updateClientConfig(interfaceScripts.mouseButtons, settings.twoMouseButtonsEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(interfaceScripts.splitPrivateChat, settings.splitPrivateChatEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(interfaceScripts.chatEffects, settings.chatEffectsEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(interfaceScripts.acceptAid, settings.acceptAidEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(interfaceScripts.musicVolume, settings.musicVolume); + player.outgoingPackets.updateClientConfig(interfaceScripts.soundEffectVolume, settings.soundEffectVolume); + player.outgoingPackets.updateClientConfig(interfaceScripts.areaEffectVolume, settings.areaEffectVolume); + player.outgoingPackets.updateClientConfig(interfaceScripts.runMode, settings.runEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(interfaceScripts.autoRetaliate, settings.autoRetaliateEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(interfaceScripts.attackStyle, settings.attackStyle); + player.outgoingPackets.updateClientConfig(interfaceScripts.bankInsertMode, settings.bankInsertMode); + player.outgoingPackets.updateClientConfig(interfaceScripts.bankWithdrawNoteMode, settings.bankWithdrawNoteMode); player.outgoingPackets.updateSocialSettings(); }; diff --git a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts index 109b42eda..8975c9759 100644 --- a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts +++ b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts @@ -1,5 +1,4 @@ import { defaultPlayerTabWidgets, Player, playerInitAction, Tabs } from '@server/world/actor/player/player'; -import { widgets } from '@server/world/config/widget'; import { serverConfig, world } from '@server/game-server'; import { npcAction } from '@server/world/action/npc-action'; import uuidv4 from 'uuid/v4'; @@ -7,7 +6,7 @@ import { Npc } from '@server/world/actor/npc/npc'; import { logger } from '@runejs/core'; import { Position } from '@server/world/position'; import { WorldInstance } from '@server/world/instances'; -import { findNpc } from '@server/config'; +import { findNpc, gameInterfaces } from '@server/config'; import { updateCombatStyleWidget } from '@server/plugins/combat/combat-styles'; import { runescapeGuideDialogueHandler } from '@server/plugins/quests/goblin-diplomacy-tutorial/runescape-guide-dialogue'; import { harlanDialogueHandler } from '@server/plugins/quests/goblin-diplomacy-tutorial/melee-tutor-dialogue'; @@ -19,14 +18,14 @@ import { equipAction } from '@server/world/action/equip-action'; export const tutorialTabWidgetOrder = [ - [ Tabs.settings, widgets.settingsTab ], - [ Tabs.friends, widgets.friendsList ], - [ Tabs.ignoreList, widgets.ignoreList ], - [ Tabs.emotes, widgets.emotesTab ], - [ Tabs.music, widgets.musicPlayerTab ], - [ Tabs.inventory, widgets.inventory.widgetId ], - [ Tabs.skills, widgets.skillsTab ], - [ Tabs.equipment, widgets.equipment.widgetId ], + [ Tabs.settings, gameInterfaces.settingsTab ], + [ Tabs.friends, gameInterfaces.friendsList ], + [ Tabs.ignoreList, gameInterfaces.ignoreList ], + [ Tabs.emotes, gameInterfaces.emotesTab ], + [ Tabs.music, gameInterfaces.musicPlayerTab ], + [ Tabs.inventory, gameInterfaces.inventory.widgetId ], + [ Tabs.skills, gameInterfaces.skillsTab ], + [ Tabs.equipment, gameInterfaces.equipment.widgetId ], [ Tabs.combatStyle, -1 ], // @TODO prayer, magic, ]; @@ -95,7 +94,7 @@ export const startTutorial = async (player: Player): Promise => { defaultPlayerTabWidgets.forEach((widgetId: number, tabIndex: number) => { if(widgetId !== -1) { - player.outgoingPackets.sendTabWidget(tabIndex, widgetId === widgets.logoutTab ? widgetId : null); + player.outgoingPackets.sendTabWidget(tabIndex, widgetId === gameInterfaces.logoutTab ? widgetId : null); } }); @@ -105,10 +104,10 @@ export const startTutorial = async (player: Player): Promise => { player.inventory.add('rs:coins'); player.inventory.add('rs:coins'); player.inventory.add('rs:coins'); - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); await player.openInteractiveWidget({ - widgetId: widgets.characterDesign, + widgetId: gameInterfaces.characterDesign, type: 'SCREEN', disablePlayerMovement: true }).toPromise(); @@ -144,7 +143,7 @@ export async function handleTutorial(player: Player): Promise { defaultPlayerTabWidgets.forEach((widgetId: number, tabIndex: number) => { if(widgetId !== -1) { - player.setSidebarWidget(tabIndex, widgetId === widgets.logoutTab ? widgetId : null); + player.setSidebarWidget(tabIndex, widgetId === gameInterfaces.logoutTab ? widgetId : null); } }); diff --git a/src/plugins/quests/quest-journal-plugin.ts b/src/plugins/quests/quest-journal-plugin.ts index 090eaf07f..53f6e5e0d 100644 --- a/src/plugins/quests/quest-journal-plugin.ts +++ b/src/plugins/quests/quest-journal-plugin.ts @@ -1,7 +1,7 @@ import { buttonAction } from '@server/world/action/button-action'; -import { widgets } from '@server/world/config/widget'; import { wrapText } from '@server/util/strings'; import { pluginActions } from '@server/game-server'; +import { gameInterfaces } from '@server/config'; export const action: buttonAction = (details) => { const { player, buttonId } = details; @@ -32,26 +32,26 @@ export const action: buttonAction = (details) => { lines = [ 'Invalid Quest Stage' ]; } - player.modifyWidget(widgets.questJournal, { childId: 2, text: '@dre@' + questData.name }); + player.modifyWidget(gameInterfaces.questJournal, { childId: 2, text: '@dre@' + questData.name }); for(let i = 0; i <= 100; i++) { if(i === 0) { - player.modifyWidget(widgets.questJournal, { childId: 3, text: `${lines[0]}` }); + player.modifyWidget(gameInterfaces.questJournal, { childId: 3, text: `${lines[0]}` }); continue; } if(lines.length > i) { - player.modifyWidget(widgets.questJournal, { childId: (i + 4), text: `${lines[i]}` }); + player.modifyWidget(gameInterfaces.questJournal, { childId: (i + 4), text: `${lines[i]}` }); } else { - player.modifyWidget(widgets.questJournal, { childId: (i + 4), text: '' }); + player.modifyWidget(gameInterfaces.questJournal, { childId: (i + 4), text: '' }); } } player.activeWidget = { - widgetId: widgets.questJournal, + widgetId: gameInterfaces.questJournal, type: 'SCREEN', closeOnWalk: true }; }; -export default { type: 'button', widgetId: widgets.questTab, action }; +export default { type: 'button', widgetId: gameInterfaces.questTab, action }; diff --git a/src/plugins/rune.js b/src/plugins/rune.js index feaae3781..098186839 100644 --- a/src/plugins/rune.js +++ b/src/plugins/rune.js @@ -13,3 +13,4 @@ export * from '../world/actor/update-flags'; export * from '../world/actor/skills'; export * from '../world/actor/player/achievements'; export * from '../task/task'; +export { gameInterfaces } from '../config'; diff --git a/src/plugins/skills/crafting/spinning-wheel-plugin.ts b/src/plugins/skills/crafting/spinning-wheel-plugin.ts index 0ab6f6d69..df64278ed 100644 --- a/src/plugins/skills/crafting/spinning-wheel-plugin.ts +++ b/src/plugins/skills/crafting/spinning-wheel-plugin.ts @@ -6,9 +6,9 @@ import { itemIds } from '@server/world/config/item-ids'; import { loopingAction } from '@server/world/action'; import { Skill } from '@server/world/actor/skills'; import { cache } from '@server/game-server'; -import { widgets } from '@server/world/config/widget'; import { animationIds } from '@server/world/config/animation-ids'; import { objectIds } from '@server/world/config/object-ids'; +import { gameInterfaces } from '@server/config'; interface Spinnable { input: number | number[]; @@ -73,7 +73,7 @@ const widgetButtonIds: Map = new Map { details.player.activeWidget = { - widgetId: widgets.whatWouldYouLikeToSpin, + widgetId: gameInterfaces.whatWouldYouLikeToSpin, type: 'SCREEN', closeOnWalk: true }; @@ -186,7 +186,7 @@ export default [ }, { type: 'button', - widgetId: widgets.whatWouldYouLikeToSpin, + widgetId: gameInterfaces.whatWouldYouLikeToSpin, buttonIds: Array.from(widgetButtonIds.keys()), action: buttonClicked } diff --git a/src/plugins/skills/prayer.js b/src/plugins/skills/prayer.js index 91b94cd21..01d6783fb 100644 --- a/src/plugins/skills/prayer.js +++ b/src/plugins/skills/prayer.js @@ -3,7 +3,7 @@ import { soundIds } from '../../world/config/sound-ids'; import { animationIds } from '../../world/config/animation-ids'; import { Achievements, giveAchievement } from '../../world/actor/player/achievements'; import { Skill } from '../../world/actor/skills'; -import { widgets } from '../../world/config/widget'; +import { gameInterfaces } from '../../config'; const action = async details => { const { player, itemSlot } = details; @@ -18,7 +18,7 @@ const action = async details => { module.exports = { type: 'item_action', - widgets: widgets.inventory, + widgets: gameInterfaces.inventory, options: 'bury', itemIds: itemIds.bones, action, diff --git a/src/plugins/skills/runecrafting/runecrafting-crafting.ts b/src/plugins/skills/runecrafting/runecrafting-crafting.ts index d241c4f8c..c44da7bcf 100644 --- a/src/plugins/skills/runecrafting/runecrafting-crafting.ts +++ b/src/plugins/skills/runecrafting/runecrafting-crafting.ts @@ -4,7 +4,6 @@ import { objectAction, ObjectActionData } from '@server/world/action/object-action'; import { Skill } from '@server/world/actor/skills'; -import { widgets } from '@server/world/config/widget'; import { altars, combinationRunes, getEntityByAttr, @@ -16,6 +15,7 @@ import { RunecraftingCombinationRune } from '@server/plugins/skills/runecrafting import { randomBetween } from '@server/util/num'; import { itemIds } from '@server/world/config/item-ids'; import { cache } from '@server/game-server'; +import { gameInterfaces } from '@server/config'; const craftRune: objectAction = (details: ObjectActionData) => { @@ -45,7 +45,7 @@ const craftRune: objectAction = (details: ObjectActionData) => { // Add experience player.skills.addExp(Skill.RUNECRAFTING, (rune.xp * essenceAvailable)); // Update widget items. - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); return; } @@ -113,7 +113,7 @@ const craftCombinationRune: itemOnObjectAction = (details: ItemOnObjectActionDat player.inventory.removeFirst(item.itemId); } // Update widget items. - player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); player.sendMessage(`You craft some ${runeDetails.name}.`); return; } diff --git a/src/plugins/skills/skill-guide-plugin.ts b/src/plugins/skills/skill-guide-plugin.ts index 3dafac567..3aa81f7dd 100644 --- a/src/plugins/skills/skill-guide-plugin.ts +++ b/src/plugins/skills/skill-guide-plugin.ts @@ -4,7 +4,7 @@ import { JSON_SCHEMA, safeLoad } from 'js-yaml'; import { readFileSync } from 'fs'; import { Player } from '@server/world/actor/player/player'; import { widgetAction } from '@server/world/action/widget-action'; -import { widgets } from '@server/world/config/widget'; +import { gameInterfaces } from '@server/config'; // @TODO fix me! @@ -53,17 +53,17 @@ function loadGuide(player: Player, guideId: number, subGuideId: number = 0, refr const guide: SkillGuide = guides.find(g => g.id === guideId); if(refreshSidebar) { - player.modifyWidget(widgets.skillGuide, { childId: 133, text: (guide.members ? 'Members only skill' : '') }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 133, text: (guide.members ? 'Members only skill' : '') }); for(let i = 0; i < sidebarTextIds.length; i++) { const sidebarId = sidebarIds[i]; let hidden: boolean = true; if(i >= guide.subGuides.length) { - player.modifyWidget(widgets.skillGuide, { childId: sidebarTextIds[i], text: '' }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarTextIds[i], text: '' }); hidden = true; } else { - player.modifyWidget(widgets.skillGuide, { childId: sidebarTextIds[i], text: guide.subGuides[i].name }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarTextIds[i], text: guide.subGuides[i].name }); hidden = false; } @@ -71,30 +71,30 @@ function loadGuide(player: Player, guideId: number, subGuideId: number = 0, refr // Apparently you can never have only TWO subguides... // Because childId 98 deletes both options 2 AND 3. So, good thing there are no guides with only 2 sections, I guess?... // Verified this in an interface editor, and they are indeed grouped in a single layer for some reason... - player.modifyWidget(widgets.skillGuide, { childId: sidebarIds[i], hidden }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarIds[i], hidden }); } } } const subGuide: SkillSubGuide = guide.subGuides[subGuideId]; - player.modifyWidget(widgets.skillGuide, { childId: 1, text: (guide.name + ' - ' + subGuide.name) }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 1, text: (guide.name + ' - ' + subGuide.name) }); const itemIds: number[] = subGuide.lines.map(g => g.itemId).concat(new Array(30 - subGuide.lines.length).fill(null)); - player.outgoingPackets.sendUpdateAllWidgetItemsById({ widgetId: widgets.skillGuide, containerId: 132 }, itemIds); + player.outgoingPackets.sendUpdateAllWidgetItemsById({ widgetId: gameInterfaces.skillGuide, containerId: 132 }, itemIds); for(let i = 0; i < 30; i++) { if(subGuide.lines.length <= i) { - player.modifyWidget(widgets.skillGuide, { childId: 5 + i, text: '' }); - player.modifyWidget(widgets.skillGuide, { childId: 45 + i, text: '' }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 5 + i, text: '' }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 45 + i, text: '' }); } else { - player.modifyWidget(widgets.skillGuide, { childId: 5 + i, text: subGuide.lines[i].level.toString() }); - player.modifyWidget(widgets.skillGuide, { childId: 45 + i, text: subGuide.lines[i].text }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 5 + i, text: subGuide.lines[i].level.toString() }); + player.modifyWidget(gameInterfaces.skillGuide, { childId: 45 + i, text: subGuide.lines[i].text }); } } player.activeWidget = { - widgetId: widgets.skillGuide, + widgetId: gameInterfaces.skillGuide, type: 'SCREEN', closeOnWalk: true }; @@ -126,6 +126,6 @@ export const openSubGuideAction: widgetAction = (details) => { }; export default [ - { type: 'button', widgetId: widgets.skillsTab, buttonIds, action: openGuideAction }, - { type: 'widget_action', widgetIds: widgets.skillGuide, childIds: sidebarTextIds, optionId: 0, action: openSubGuideAction } + { type: 'button', widgetId: gameInterfaces.skillsTab, buttonIds, action: openGuideAction }, + { type: 'widget_action', widgetIds: gameInterfaces.skillGuide, childIds: sidebarTextIds, optionId: 0, action: openSubGuideAction } ]; diff --git a/src/plugins/skills/smithing/smelting-plugin.ts b/src/plugins/skills/smithing/smelting-plugin.ts index 51fc24edd..716519363 100644 --- a/src/plugins/skills/smithing/smelting-plugin.ts +++ b/src/plugins/skills/smithing/smelting-plugin.ts @@ -2,7 +2,6 @@ import { Item } from '@server/world/items/item'; import { ItemContainer } from '@server/world/items/item-container'; import { objectIds } from '@server/world/config/object-ids'; import { objectAction, ObjectActionData } from '@server/world/action/object-action'; -import { widgets } from '@server/world/config/widget'; import { buttonAction, ButtonActionData } from '@server/world/action/button-action'; import { itemIds } from '@server/world/config/item-ids'; import { Subscription } from 'rxjs'; @@ -12,6 +11,7 @@ import { loopingAction } from '@server/world/action'; import { animationIds } from '@server/world/config/animation-ids'; import { soundIds } from '@server/world/config/sound-ids'; import { colors } from '@server/util/colors'; +import { gameInterfaces } from '@server/config'; export interface Bar { barId: number; @@ -110,7 +110,7 @@ const RUNEITE : Bar = { export const openSmeltingInterface: objectAction = (details) => { details.player.activeWidget = { - widgetId: widgets.furnace.widgetId, + widgetId: gameInterfaces.furnace.widgetId, type: 'CHAT', closeOnWalk: true }; @@ -118,14 +118,14 @@ export const openSmeltingInterface: objectAction = (details) => { }; const widgetItems = [ - { slot: widgets.furnace.slots.slot1, bar: BLURITE }, - { slot: widgets.furnace.slots.slot2, bar: IRON }, - { slot: widgets.furnace.slots.slot3, bar: SILVER }, - { slot: widgets.furnace.slots.slot4, bar: STEEL }, - { slot: widgets.furnace.slots.slot5, bar: GOLD }, - { slot: widgets.furnace.slots.slot6, bar: MITHRIL }, - { slot: widgets.furnace.slots.slot7, bar: ADAMANTITE }, - { slot: widgets.furnace.slots.slot8, bar: RUNEITE } + { slot: gameInterfaces.furnace.slots.slot1, bar: BLURITE }, + { slot: gameInterfaces.furnace.slots.slot2, bar: IRON }, + { slot: gameInterfaces.furnace.slots.slot3, bar: SILVER }, + { slot: gameInterfaces.furnace.slots.slot4, bar: STEEL }, + { slot: gameInterfaces.furnace.slots.slot5, bar: GOLD }, + { slot: gameInterfaces.furnace.slots.slot6, bar: MITHRIL }, + { slot: gameInterfaces.furnace.slots.slot7, bar: ADAMANTITE }, + { slot: gameInterfaces.furnace.slots.slot8, bar: RUNEITE } ]; interface Smeltable { @@ -178,15 +178,15 @@ const loadSmeltingInterface = (details: ObjectActionData) => { const theKnightsSwordQuest = details.player.quests.find(quest => quest.questId === 'theKnightsSword'); // Send the items to the widget. widgetItems.forEach((item) => { - details.player.outgoingPackets.setItemOnWidget(widgets.furnace.widgetId, item.slot.modelId, item.bar.barId, 125); + details.player.outgoingPackets.setItemOnWidget(gameInterfaces.furnace.widgetId, item.slot.modelId, item.bar.barId, 125); if (!details.player.skills.hasLevel(Skill.SMITHING, item.bar.requiredLevel)) { - details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); + details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); } else { - details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.black }); + details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.black }); } // Check if the player has completed 'The Knight's Sword' quest, even if the level is okay. if (item.bar.quest !== undefined && (theKnightsSwordQuest == undefined || theKnightsSwordQuest.stage !== 'COMPLETE')) { - details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); + details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); } }); }; @@ -259,7 +259,7 @@ const smeltProduct = (details: ButtonActionData, bar: Bar, count: number) => { export const buttonClicked : buttonAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === widgets.furnace.widgetId)) { + if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === gameInterfaces.furnace.widgetId)) { return; } @@ -295,7 +295,7 @@ export default [ }, { type: 'button', - widgetId: widgets.furnace.widgetId, + widgetId: gameInterfaces.furnace.widgetId, buttonIds: Array.from(widgetButtonIds.keys()), action: buttonClicked } diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts new file mode 100644 index 000000000..152c51d17 --- /dev/null +++ b/src/world/actor/player/interface-state.ts @@ -0,0 +1,60 @@ +import { Player } from '@server/world/actor/player/player'; + + +export type GameInterfacePosition = 'gamescreen' | 'fullscreen' | 'chatbox' | 'tabarea'; +export type GameInterfaceType = 'queued' | 'queued_solo' | 'multi' | 'solo'; + +export class GameInterface { + interfaceId: number; + position: GameInterfacePosition; + type: GameInterfaceType; + walkable: boolean; +} + +export class InterfaceState { + + public readonly interfaces: { [key: string]: GameInterface }; + private readonly player: Player + + public constructor(player: Player) { + this.interfaces = { + 'gamescreen': null, + 'fullscreen': null, + 'chatbox': null, + 'tabarea': null + }; + this.player = player; + } + + public showGameInterface(interfaceId: number, position: GameInterfacePosition, + type: GameInterfaceType, walkable: boolean): void { + const gameInterface = new GameInterface(); + gameInterface.interfaceId = interfaceId; + gameInterface.position = position; + gameInterface.type = type; + gameInterface.walkable = walkable; + this.showInterface(gameInterface); + } + + public getInterface(position: GameInterfacePosition): GameInterface | null { + return this.interfaces[position] || null; + } + + private showInterface(gameInterface: GameInterface): void { + this.interfaces[gameInterface.position] = gameInterface; + } + + get gamescreenInterface(): GameInterface | null { + return this.interfaces.gamescreen || null; + } + get fullscreenInterface(): GameInterface | null { + return this.interfaces.fullscreen || null; + } + get chatboxInterface(): GameInterface | null { + return this.interfaces.chatbox || null; + } + get tabareaInterface(): GameInterface | null { + return this.interfaces.tabarea || null; + } + +} diff --git a/src/world/actor/player/player.ts b/src/world/actor/player/player.ts index 4a23e84d1..9b5469e27 100644 --- a/src/world/actor/player/player.ts +++ b/src/world/actor/player/player.ts @@ -14,7 +14,7 @@ import { PlayerSave, PlayerSettings, QuestProgress, savePlayerData } from './player-data'; -import { PlayerWidget, widgets, widgetScripts } from '../../config/widget'; +import { PlayerWidget, interfaceScripts } from '../../config/widget'; import { ContainerUpdateEvent, getItemFromContainer, ItemContainer } from '../../items/item-container'; import { Item } from '../../items/item'; import { Npc } from '../npc/npc'; @@ -39,7 +39,7 @@ import { ItemDetails, OffensiveBonuses, SkillBonuses } from '@server/config/item-config'; -import { findItem, npcIdMap } from '@server/config'; +import { findItem, npcIdMap, gameInterfaces } from '@server/config'; import { NpcDetails } from '@server/config/npc-config'; import { animationIds } from '@server/world/config/animation-ids'; import { combatStyles } from '@server/world/actor/combat'; @@ -60,10 +60,10 @@ export const playerOptions: { option: string, index: number, placement: 'TOP' | ]; export const defaultPlayerTabWidgets = [ - -1, widgets.skillsTab, widgets.questTab, widgets.inventory.widgetId, - widgets.equipment.widgetId, widgets.prayerTab, widgets.standardSpellbookTab, null, - widgets.friendsList, widgets.ignoreList, widgets.logoutTab, widgets.settingsTab, widgets.emotesTab, - widgets.musicPlayerTab + -1, gameInterfaces.skillsTab, gameInterfaces.questTab, gameInterfaces.inventory.widgetId, + gameInterfaces.equipment.widgetId, gameInterfaces.prayerTab, gameInterfaces.standardSpellbookTab, null, + gameInterfaces.friendsList, gameInterfaces.ignoreList, gameInterfaces.logoutTab, gameInterfaces.settingsTab, gameInterfaces.emotesTab, + gameInterfaces.musicPlayerTab ]; export enum Tabs { @@ -183,8 +183,8 @@ export class Player extends Actor { this.skills.values.forEach((skill, index) => this.outgoingPackets.updateSkill(index, skill.level, skill.exp)); - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipment, this.equipment); + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipment, this.equipment); for(const item of this.equipment.items) { if(item) { actionHandler.call('equip_action', this, item.itemId, 'EQUIP'); @@ -194,7 +194,7 @@ export class Player extends Actor { if(this.firstTimePlayer) { if(!serverConfig.tutorialEnabled) { this.openInteractiveWidget({ - widgetId: widgets.characterDesign, + widgetId: gameInterfaces.characterDesign, type: 'SCREEN', disablePlayerMovement: true }).toPromise(); @@ -210,18 +210,18 @@ export class Player extends Actor { } else { loginDaysStr = daysSinceLogin + ' days ago'; } - this.outgoingPackets.updateWidgetString(widgets.welcomeScreenChildren.question, 1, `Want to help RuneJS improve?\\nSend us a pull request over on Github!`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 13, `You last logged in @red@${ loginDaysStr }@bla@ from: @red@${ this.lastAddress }`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 16, `You have @yel@0 unread messages\\nin your message centre.`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 14, `\\nYou have not yet set any recovery questions.\\nIt is @lre@strongly@yel@ recommended that you do so.\\n\\nIf you don't you will be @lre@unable to recover your\\n@lre@password@yel@ if you forget it, or it is stolen.`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 22, `To change your recovery questions:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Set new recovery questions'.`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 17, `\\nYou do not have a Bank PIN.\\nPlease visit a bank if you would like one.`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 21, `To start a subscripton:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Start a new subscription'`); - this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 19, `You are not a member.\\n\\nChoose to subscribe and\\nyou'll get loads of extra\\nbenefits and features.`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreenChildren.question, 1, `Want to help RuneJS improve?\\nSend us a pull request over on Github!`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 13, `You last logged in @red@${ loginDaysStr }@bla@ from: @red@${ this.lastAddress }`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 16, `You have @yel@0 unread messages\\nin your message centre.`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 14, `\\nYou have not yet set any recovery questions.\\nIt is @lre@strongly@yel@ recommended that you do so.\\n\\nIf you don't you will be @lre@unable to recover your\\n@lre@password@yel@ if you forget it, or it is stolen.`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 22, `To change your recovery questions:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Set new recovery questions'.`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 17, `\\nYou do not have a Bank PIN.\\nPlease visit a bank if you would like one.`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 21, `To start a subscripton:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Start a new subscription'`); + this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 19, `You are not a member.\\n\\nChoose to subscribe and\\nyou'll get loads of extra\\nbenefits and features.`); this.activeWidget = { - widgetId: widgets.welcomeScreen, - secondaryWidgetId: widgets.welcomeScreenChildren.question, + widgetId: gameInterfaces.welcomeScreen, + secondaryWidgetId: gameInterfaces.welcomeScreenChildren.question, type: 'FULLSCREEN' }; } @@ -232,7 +232,7 @@ export class Player extends Actor { this.updateBonuses(); this.updateCarryWeight(true); - this.modifyWidget(widgets.musicPlayerTab, { childId: 82, textColor: colors.green }); // Set "Harmony" to green/unlocked on the music tab + this.modifyWidget(gameInterfaces.musicPlayerTab, { childId: 82, textColor: colors.green }); // Set "Harmony" to green/unlocked on the music tab this.playSong(songs.harmony); this.updateQuestTab(); @@ -509,41 +509,41 @@ export class Player extends Actor { } if(playerQuest.stage === 'NOT_STARTED' && stage !== 'COMPLETE') { - this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.yellow }); + this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: colors.yellow }); } else if(playerQuest.stage !== 'COMPLETE' && stage === 'COMPLETE') { - this.outgoingPackets.updateClientConfig(widgetScripts.questPoints, questData.points + this.getQuestPoints()); - this.modifyWidget(widgets.questReward, { childId: 2, text: `You have completed ${ questData.name }!` }); - this.modifyWidget(widgets.questReward, { + this.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, questData.points + this.getQuestPoints()); + this.modifyWidget(gameInterfaces.questReward, { childId: 2, text: `You have completed ${ questData.name }!` }); + this.modifyWidget(gameInterfaces.questReward, { childId: 8, text: `${ questData.points } Quest Point${ questData.points > 1 ? 's' : '' }` }); for(let i = 0; i < 5; i++) { if(i >= questData.completion.rewards.length) { - this.modifyWidget(widgets.questReward, { childId: 9 + i, text: '' }); + this.modifyWidget(gameInterfaces.questReward, { childId: 9 + i, text: '' }); } else { - this.modifyWidget(widgets.questReward, { childId: 9 + i, text: questData.completion.rewards[i] }); + this.modifyWidget(gameInterfaces.questReward, { childId: 9 + i, text: questData.completion.rewards[i] }); } } if(questData.completion.itemId) { - this.outgoingPackets.updateWidgetModel1(widgets.questReward, 3, + this.outgoingPackets.updateWidgetModel1(gameInterfaces.questReward, 3, (cache.itemDefinitions.get(questData.completion.itemId) as ItemDefinition).inventoryModelId); } else if(questData.completion.modelId) { - this.outgoingPackets.updateWidgetModel1(widgets.questReward, 3, questData.completion.modelId); + this.outgoingPackets.updateWidgetModel1(gameInterfaces.questReward, 3, questData.completion.modelId); } - this.outgoingPackets.setWidgetModelRotationAndZoom(widgets.questReward, 3, + this.outgoingPackets.setWidgetModelRotationAndZoom(gameInterfaces.questReward, 3, questData.completion.modelRotationX || 0, questData.completion.modelRotationY || 0, questData.completion.modelZoom || 0); this.activeWidget = { - widgetId: widgets.questReward, + widgetId: gameInterfaces.questReward, type: 'SCREEN', closeOnWalk: true }; - this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.green }); + this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: colors.green }); questData.completion.onComplete(this); } @@ -564,7 +564,7 @@ export class Player extends Actor { this.outgoingPackets.updateWidgetString(widgetId, childId, text); } if(hidden !== undefined) { - this.outgoingPackets.toggleWidgetVisibility(widgets.skillGuide, childId, hidden); + this.outgoingPackets.toggleWidgetVisibility(gameInterfaces.skillGuide, childId, hidden); } if(textColor !== undefined) { const { r, g, b } = hexToRgb(textColor); @@ -658,7 +658,7 @@ export class Player extends Actor { return -1; } - this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, null); + this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, null); return slot; } @@ -669,7 +669,7 @@ export class Player extends Actor { public removeItem(slot: number): void { this.inventory.remove(slot); - this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, null); + this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, null); } public giveItem(item: number | Item): boolean { @@ -678,7 +678,7 @@ export class Player extends Actor { return false; } - this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, addedItem.slot, addedItem.item); + this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, addedItem.slot, addedItem.item); return true; } @@ -925,11 +925,11 @@ export class Player extends Actor { this.updateBonuses(); // @TODO change packets to only update modified container slots - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipment, this.equipment); + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipment, this.equipment); - if(this.hasWidgetOpen(widgets.equipmentStats.widgetId)) { - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, this.equipment); + if(this.hasWidgetOpen(gameInterfaces.equipmentStats.widgetId)) { + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipmentStats, this.equipment); updateBonusStrings(this); } @@ -1007,9 +1007,9 @@ export class Player extends Actor { private inventoryUpdated(event: ContainerUpdateEvent): void { if(event.type === 'CLEAR_ALL') { - this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); } else if(event.type === 'ADD') { - this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, event.slot, event.item); + this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, event.slot, event.item); } this.updateCarryWeight(); } @@ -1062,7 +1062,7 @@ export class Player extends Actor { * Updates the player's quest tab progress. */ private updateQuestTab(): void { - this.outgoingPackets.updateClientConfig(widgetScripts.questPoints, this.getQuestPoints()); + this.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, this.getQuestPoints()); const questMap = pluginActions.quest; if(!questMap) { @@ -1078,7 +1078,7 @@ export class Player extends Actor { color = stage === 'COMPLETE' ? colors.green : colors.yellow; } - this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: color }); + this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: color }); }); } diff --git a/src/world/config/widget.ts b/src/world/config/widget.ts index 618424c03..b75e642cc 100644 --- a/src/world/config/widget.ts +++ b/src/world/config/widget.ts @@ -1,92 +1,6 @@ import { Subject } from 'rxjs'; -export const widgets: any = { - characterDesign: 269, - furnace: { - widgetId: 311, - slots: { - slot0: { modelId: 4, titleId: 16 }, - slot1: { modelId: 5, titleId: 20 }, - slot2: { modelId: 6, titleId: 24 }, - slot3: { modelId: 7, titleId: 28 }, - slot4: { modelId: 8, titleId: 32 }, - slot5: { modelId: 9, titleId: 36 }, - slot6: { modelId: 10, titleId: 40 }, - slot7: { modelId: 11, titleId: 44 }, - slot8: { modelId: 12, titleId: 48 }, - } - }, - inventory: { - widgetId: 149, - containerId: 0 - }, - equipment: { - widgetId: 387, - containerId: 25 - }, - equipmentStats: { - widgetId: 465, - containerId: 103 - }, - equipmentStatsInventory: { - widgetId: 336, - containerId: 0 - }, - bank: { - depositBoxWidget: { - widgetId: 11 - }, - pinSettingsWidget: { - widgetId: 14 - }, - screenWidget: { - widgetId: 12, - containerId: 89, - }, - tabWidget: { - widgetId: 266, - containerId: 0 - } - }, - defaultCombatStyle: 92, - skillGuide: 308, - skillsTab: 320, - friendsList: 131, - ignoreList: 148, - logoutTab: 182, - settingsTab: 261, - emotesTab: 464, - musicPlayerTab: 239, - prayerTab: 271, - standardSpellbookTab: 192, - questTab: 274, - shop: { - widgetId: 300, - containerId: 75, - title: 76 - }, - shopPlayerInventory: { - widgetId: 301, - containerId: 0 - }, - questJournal: 275, - questReward: 277, - welcomeScreen: 378, - welcomeScreenChildren: { - cogs: 16, - question: 17, - drama: 18, - bankPin: 19, - bankPinQuestion: 20, - scamming: 21, - bankPinKey: 22, - christmas: 23, - killcount: 24 - }, - whatWouldYouLikeToSpin: 459 -}; - -export const widgetScripts = { +export const interfaceScripts = { musicPlayer: 18, attackStyle: 43, brightness: 166, From b765b1ecc97d606b1c075d537615a72c2c3d7bc7 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sat, 28 Nov 2020 17:02:29 -0600 Subject: [PATCH 02/12] More work --- src/world/actor/player/interface-state.ts | 71 +++++++++++++++++++---- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 152c51d17..95e97e055 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -1,22 +1,70 @@ import { Player } from '@server/world/actor/player/player'; +import { ItemContainer } from '@server/world/items/item-container'; +export type TabType = 'combat_options' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | + 'spellbook' | 'friends_list' | 'ignore_list' | 'logout' | 'emotes' | 'game_settings' | 'music_player'; export type GameInterfacePosition = 'gamescreen' | 'fullscreen' | 'chatbox' | 'tabarea'; export type GameInterfaceType = 'queued' | 'queued_solo' | 'multi' | 'solo'; +export const tabIndex: { [key: string]: number } = { + 'combat_options': 0, + 'skills': 1, + 'quests': 2, + 'inventory': 3, + 'equipment': 4, + 'prayers': 5, + 'spellbook': 6, + 'friends_list': 8, + 'ignore_list': 9, + 'logout': 10, + 'emotes': 11, + 'game_settings': 12, + 'music_player': 13 +}; + export class GameInterface { - interfaceId: number; - position: GameInterfacePosition; - type: GameInterfaceType; - walkable: boolean; + + public interfaceId: number; + public position: GameInterfacePosition; + public type: GameInterfaceType; + public container: ItemContainer = null; + public walkable: boolean = false; + + public constructor(interfaceId: number, position: GameInterfacePosition, type: GameInterfaceType = 'multi', + container: ItemContainer = null, walkable: boolean = false) { + this.interfaceId = interfaceId; + this.position = position; + this.type = type; + this.container = container; + this.walkable = walkable; + } + } + export class InterfaceState { + public readonly tabs: { [key: string]: GameInterface }; public readonly interfaces: { [key: string]: GameInterface }; private readonly player: Player public constructor(player: Player) { + this.tabs = { + 'combat_options': null, + 'skills': null, + 'quests': null, + 'inventory': null, + 'equipment': null, + 'prayers': null, + 'spellbook': null, + 'friends_list': null, + 'ignore_list': null, + 'logout': null, + 'emotes': null, + 'game_settings': null, + 'music_player': null + }; this.interfaces = { 'gamescreen': null, 'fullscreen': null, @@ -28,12 +76,15 @@ export class InterfaceState { public showGameInterface(interfaceId: number, position: GameInterfacePosition, type: GameInterfaceType, walkable: boolean): void { - const gameInterface = new GameInterface(); - gameInterface.interfaceId = interfaceId; - gameInterface.position = position; - gameInterface.type = type; - gameInterface.walkable = walkable; - this.showInterface(gameInterface); + this.showInterface(new GameInterface(interfaceId, position, type, null, walkable)); + } + + public setTab(type: TabType, gameInterface: GameInterface): void { + this.tabs[type] = gameInterface; + } + + public getTab(type: TabType): GameInterface | null { + return this.tabs[type] || null; } public getInterface(position: GameInterfacePosition): GameInterface | null { From 4a4cdaa576cb13c685b4b132ce3d37394cc5007a Mon Sep 17 00:00:00 2001 From: Tynarus Date: Tue, 1 Dec 2020 18:04:56 -0600 Subject: [PATCH 03/12] Simplifying names and adding more structure --- src/world/actor/player/interface-state.ts | 103 ++++++++++++++-------- 1 file changed, 68 insertions(+), 35 deletions(-) diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 95e97e055..061503fd9 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -2,42 +2,58 @@ import { Player } from '@server/world/actor/player/player'; import { ItemContainer } from '@server/world/items/item-container'; -export type TabType = 'combat_options' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | - 'spellbook' | 'friends_list' | 'ignore_list' | 'logout' | 'emotes' | 'game_settings' | 'music_player'; -export type GameInterfacePosition = 'gamescreen' | 'fullscreen' | 'chatbox' | 'tabarea'; -export type GameInterfaceType = 'queued' | 'queued_solo' | 'multi' | 'solo'; +export type TabType = 'combat' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | + 'spells' | 'friends' | 'ignores' | 'logout' | 'emotes' | 'settings' | 'music'; + +export type GameInterfacePosition = 'screen' | 'full' | 'chatbox' | 'tabarea'; + export const tabIndex: { [key: string]: number } = { - 'combat_options': 0, + 'combat': 0, 'skills': 1, 'quests': 2, 'inventory': 3, 'equipment': 4, 'prayers': 5, - 'spellbook': 6, - 'friends_list': 8, - 'ignore_list': 9, + 'spells': 6, + 'friends': 8, + 'ignores': 9, 'logout': 10, 'emotes': 11, - 'game_settings': 12, - 'music_player': 13 + 'settings': 12, + 'music': 13 }; + +export interface GameInterfaceOptions { + position: GameInterfacePosition; + multi?: boolean; + queued?: boolean; + containerId?: number; + container?: ItemContainer; + walkable?: boolean; +} + export class GameInterface { public interfaceId: number; public position: GameInterfacePosition; - public type: GameInterfaceType; + public multi: boolean = false; + public queued: boolean = false; + public containerId: number; public container: ItemContainer = null; public walkable: boolean = false; - public constructor(interfaceId: number, position: GameInterfacePosition, type: GameInterfaceType = 'multi', - container: ItemContainer = null, walkable: boolean = false) { + public constructor(interfaceId: number, options: GameInterfaceOptions) { + const { position, multi, queued, containerId, container, walkable } = options; + this.interfaceId = interfaceId; this.position = position; - this.type = type; - this.container = container; - this.walkable = walkable; + this.multi = multi || false; + this.queued = queued || false; + this.containerId = containerId || -1; + this.container = container || null; + this.walkable = walkable || false; } } @@ -47,39 +63,53 @@ export class InterfaceState { public readonly tabs: { [key: string]: GameInterface }; public readonly interfaces: { [key: string]: GameInterface }; - private readonly player: Player + private readonly player: Player; public constructor(player: Player) { this.tabs = { - 'combat_options': null, + 'combat': null, 'skills': null, 'quests': null, 'inventory': null, 'equipment': null, 'prayers': null, - 'spellbook': null, - 'friends_list': null, - 'ignore_list': null, + 'spells': null, + 'friend': null, + 'ignores': null, 'logout': null, 'emotes': null, - 'game_settings': null, - 'music_player': null + 'settings': null, + 'music': null }; this.interfaces = { - 'gamescreen': null, - 'fullscreen': null, + 'screen': null, + 'full': null, 'chatbox': null, 'tabarea': null }; this.player = player; } - public showGameInterface(interfaceId: number, position: GameInterfacePosition, - type: GameInterfaceType, walkable: boolean): void { - this.showInterface(new GameInterface(interfaceId, position, type, null, walkable)); + public openInterface(interfaceId: number, options: GameInterfaceOptions): void { + this.showInterface(new GameInterface(interfaceId, options)); } - public setTab(type: TabType, gameInterface: GameInterface): void { + public setTab(type: TabType, gameInterface: GameInterface | number): void { + if(typeof gameInterface === 'number') { + let container: ItemContainer | undefined; + if(type === 'inventory') { + container = this.player.inventory; + } else if(type === 'equipment') { + container = this.player.equipment; + } + + gameInterface = new GameInterface(gameInterface, { + position: 'tabarea', + multi: true, + walkable: true, + container + }) + } this.tabs[type] = gameInterface; } @@ -95,16 +125,19 @@ export class InterfaceState { this.interfaces[gameInterface.position] = gameInterface; } - get gamescreenInterface(): GameInterface | null { - return this.interfaces.gamescreen || null; + public get screenInterface(): GameInterface | null { + return this.interfaces.screen || null; } - get fullscreenInterface(): GameInterface | null { - return this.interfaces.fullscreen || null; + + public get fullScreenInterface(): GameInterface | null { + return this.interfaces.full || null; } - get chatboxInterface(): GameInterface | null { + + public get chatboxInterface(): GameInterface | null { return this.interfaces.chatbox || null; } - get tabareaInterface(): GameInterface | null { + + public get tabareaInterface(): GameInterface | null { return this.interfaces.tabarea || null; } From 7bc0f7df6149c8ffcfa7f000938d96b8205d3f1c Mon Sep 17 00:00:00 2001 From: Tynarus Date: Tue, 1 Dec 2020 18:19:19 -0600 Subject: [PATCH 04/12] wip --- src/world/actor/player/interface-state.ts | 25 ++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 061503fd9..98ac15964 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -34,6 +34,7 @@ export interface GameInterfaceOptions { walkable?: boolean; } + export class GameInterface { public interfaceId: number; @@ -61,8 +62,8 @@ export class GameInterface { export class InterfaceState { - public readonly tabs: { [key: string]: GameInterface }; - public readonly interfaces: { [key: string]: GameInterface }; + public readonly tabs: { [key: string]: GameInterface | null }; + public readonly interfaces: { [key: string]: GameInterface | null }; private readonly player: Player; public constructor(player: Player) { @@ -81,21 +82,27 @@ export class InterfaceState { 'settings': null, 'music': null }; + this.interfaces = { 'screen': null, 'full': null, 'chatbox': null, 'tabarea': null }; + this.player = player; } public openInterface(interfaceId: number, options: GameInterfaceOptions): void { - this.showInterface(new GameInterface(interfaceId, options)); + const gameInterface = new GameInterface(interfaceId, options); + this.interfaces[gameInterface.position] = gameInterface; + this.showInterface(gameInterface); } - public setTab(type: TabType, gameInterface: GameInterface | number): void { - if(typeof gameInterface === 'number') { + public setTab(type: TabType, gameInterface: GameInterface | number | null): void { + if(gameInterface && typeof gameInterface === 'number') { + // Create a new tab interface instance + let container: ItemContainer | undefined; if(type === 'inventory') { container = this.player.inventory; @@ -108,9 +115,13 @@ export class InterfaceState { multi: true, walkable: true, container - }) + }); } + + gameInterface = gameInterface as GameInterface || null; + this.tabs[type] = gameInterface; + this.player.outgoingPackets.sendTabWidget(tabIndex[type], gameInterface === null ? -1 : gameInterface.interfaceId); } public getTab(type: TabType): GameInterface | null { @@ -122,7 +133,7 @@ export class InterfaceState { } private showInterface(gameInterface: GameInterface): void { - this.interfaces[gameInterface.position] = gameInterface; + // @TODO determine which packet to ship and then shipit } public get screenInterface(): GameInterface | null { From 5a27c6bbbb0a910c322e44b30ff2505d68796cdc Mon Sep 17 00:00:00 2001 From: Tynarus Date: Fri, 4 Dec 2020 17:02:07 -0600 Subject: [PATCH 05/12] Lots of renaming --- src/world/actor/player/interface-state.ts | 106 +++++++++++++--------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 98ac15964..d51479583 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -5,7 +5,7 @@ import { ItemContainer } from '@server/world/items/item-container'; export type TabType = 'combat' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | 'spells' | 'friends' | 'ignores' | 'logout' | 'emotes' | 'settings' | 'music'; -export type GameInterfacePosition = 'screen' | 'full' | 'chatbox' | 'tabarea'; +export type GameInterfaceSlot = 'full' | 'screen' | 'chatbox' | 'tabarea'; export const tabIndex: { [key: string]: number } = { @@ -25,8 +25,8 @@ export const tabIndex: { [key: string]: number } = { }; -export interface GameInterfaceOptions { - position: GameInterfacePosition; +export interface WidgetOptions { + slot: GameInterfaceSlot; multi?: boolean; queued?: boolean; containerId?: number; @@ -35,21 +35,21 @@ export interface GameInterfaceOptions { } -export class GameInterface { +export class Widget { - public interfaceId: number; - public position: GameInterfacePosition; + public widgetId: number; + public slot: GameInterfaceSlot; public multi: boolean = false; public queued: boolean = false; public containerId: number; public container: ItemContainer = null; public walkable: boolean = false; - public constructor(interfaceId: number, options: GameInterfaceOptions) { - const { position, multi, queued, containerId, container, walkable } = options; + public constructor(interfaceId: number, options: WidgetOptions) { + const { slot, multi, queued, containerId, container, walkable } = options; - this.interfaceId = interfaceId; - this.position = position; + this.widgetId = interfaceId; + this.slot = slot; this.multi = multi || false; this.queued = queued || false; this.containerId = containerId || -1; @@ -62,8 +62,8 @@ export class GameInterface { export class InterfaceState { - public readonly tabs: { [key: string]: GameInterface | null }; - public readonly interfaces: { [key: string]: GameInterface | null }; + public readonly tabs: { [key: string]: Widget | null }; + public readonly widgetSlots: { [key: string]: Widget | null }; private readonly player: Player; public constructor(player: Player) { @@ -75,7 +75,7 @@ export class InterfaceState { 'equipment': null, 'prayers': null, 'spells': null, - 'friend': null, + 'friends': null, 'ignores': null, 'logout': null, 'emotes': null, @@ -83,24 +83,29 @@ export class InterfaceState { 'music': null }; - this.interfaces = { - 'screen': null, - 'full': null, - 'chatbox': null, - 'tabarea': null - }; + this.widgetSlots = {}; + this.clearSlots(); this.player = player; } - public openInterface(interfaceId: number, options: GameInterfaceOptions): void { - const gameInterface = new GameInterface(interfaceId, options); - this.interfaces[gameInterface.position] = gameInterface; - this.showInterface(gameInterface); + public openWidget(widgetId: number, options: WidgetOptions): void { + const widget = new Widget(widgetId, options); + + if(widget.queued) { + // @TODO queued widgets + } + + if(widget.slot === 'full' || !widget.multi) { + this.clearSlots(); + } + + this.widgetSlots[widget.slot] = widget; + this.showWidget(widget); } - public setTab(type: TabType, gameInterface: GameInterface | number | null): void { - if(gameInterface && typeof gameInterface === 'number') { + public setTab(type: TabType, widget: Widget | number | null): void { + if(widget && typeof widget === 'number') { // Create a new tab interface instance let container: ItemContainer | undefined; @@ -110,46 +115,61 @@ export class InterfaceState { container = this.player.equipment; } - gameInterface = new GameInterface(gameInterface, { - position: 'tabarea', + widget = new Widget(widget, { + slot: 'tabarea', multi: true, walkable: true, container }); } - gameInterface = gameInterface as GameInterface || null; + widget = widget as Widget || null; - this.tabs[type] = gameInterface; - this.player.outgoingPackets.sendTabWidget(tabIndex[type], gameInterface === null ? -1 : gameInterface.interfaceId); + this.tabs[type] = widget; + this.player.outgoingPackets.sendTabWidget(tabIndex[type], widget === null ? -1 : widget.widgetId); } - public getTab(type: TabType): GameInterface | null { + public getTab(type: TabType): Widget | null { return this.tabs[type] || null; } - public getInterface(position: GameInterfacePosition): GameInterface | null { - return this.interfaces[position] || null; + public getWidget(slot: GameInterfaceSlot): Widget | null { + return this.widgetSlots[slot] || null; + } + + private showWidget(widget: Widget): void { + if(widget.slot === 'full' && widget.containerId !== undefined) { + this.player.outgoingPackets.showFullscreenWidget(widget.widgetId, widget.containerId); + } else if(widget.slot === 'screen') { + + } else if(widget.slot === 'chatbox') { + + } else if(widget.slot === 'tabarea') { + + } } - private showInterface(gameInterface: GameInterface): void { - // @TODO determine which packet to ship and then shipit + private clearSlots(): void { + this.widgetSlots.full = null; + this.widgetSlots.screen = null; + this.widgetSlots.chatbox = null; + this.widgetSlots.tabarea = null; } - public get screenInterface(): GameInterface | null { - return this.interfaces.screen || null; + public get fullScreenWidget(): Widget | null { + return this.widgetSlots.full || null; } - public get fullScreenInterface(): GameInterface | null { - return this.interfaces.full || null; + public get screenWidget(): Widget | null { + return this.widgetSlots.screen || null; } - public get chatboxInterface(): GameInterface | null { - return this.interfaces.chatbox || null; + public get chatboxWidget(): Widget | null { + return this.widgetSlots.chatbox || null; } - public get tabareaInterface(): GameInterface | null { - return this.interfaces.tabarea || null; + public get tabareaWidget(): Widget | null { + return this.widgetSlots.tabarea || null; } } From d3f6c93e7393a3837e99b8d0bf12b332c95119b6 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Fri, 4 Dec 2020 18:59:03 -0600 Subject: [PATCH 06/12] Updating RxJS to 8 and adding a widget closed listener --- package-lock.json | 15 ++++++++++++--- package.json | 2 +- src/world/actor/player/interface-state.ts | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c857f3f4b..bdc6718a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2899,6 +2899,15 @@ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6125,9 +6134,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "7.0.0-beta.8", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.0.0-beta.8.tgz", + "integrity": "sha512-rnLwH1WJR67m7p5m+KQNqXd1A+PO/WLZZMd1JuzIRm2AOmhJttBGyDiyanky65rHaYzhEztU1QPak68hm+R4qA==", "requires": { "tslib": "^1.9.0" } diff --git a/package.json b/package.json index c671e7126..fefeb76df 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "json5": "^2.1.3", "lodash": "^4.17.15", "quadtree-lib": "^1.0.9", - "rxjs": "^6.5.4", + "rxjs": "^7.0.0-beta.8", "source-map-support": "^0.5.16", "ts-node": "^8.4.1", "tslib": "^1.10.0", diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index d51479583..3c156ec3a 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -1,5 +1,6 @@ import { Player } from '@server/world/actor/player/player'; import { ItemContainer } from '@server/world/items/item-container'; +import { Subject, lastValueFrom } from 'rxjs'; export type TabType = 'combat' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | @@ -64,6 +65,7 @@ export class InterfaceState { public readonly tabs: { [key: string]: Widget | null }; public readonly widgetSlots: { [key: string]: Widget | null }; + public readonly closed: Subject = new Subject(); private readonly player: Player; public constructor(player: Player) { @@ -89,6 +91,25 @@ export class InterfaceState { this.player = player; } + public async widgetClosed(slot: GameInterfaceSlot): Promise { + const widget = this.widgetSlots[slot]; + if(!widget) { + return null; + } + + return await lastValueFrom(this.closed.asObservable()); + } + + public closeWidget(slot: GameInterfaceSlot): void { + const widget = this.widgetSlots[slot]; + if(!widget) { + return; + } + + this.closed.next(widget); + this.widgetSlots[slot] = null; + } + public openWidget(widgetId: number, options: WidgetOptions): void { const widget = new Widget(widgetId, options); From b5fc83778cc13498e23f4619697c8f71dbfd8162 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 09:02:01 -0600 Subject: [PATCH 07/12] Adding tab overlay and chat dialogue widget packets --- src/net/outbound-packets.ts | 12 +++++++ src/world/actor/player/interface-state.ts | 41 +++++++++++++++++++---- src/world/actor/player/player.ts | 39 +++++++++++---------- 3 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/net/outbound-packets.ts b/src/net/outbound-packets.ts index 8c7db184a..ea69734c1 100644 --- a/src/net/outbound-packets.ts +++ b/src/net/outbound-packets.ts @@ -407,6 +407,12 @@ export class OutboundPackets { this.queue(packet); } + public showTabWidget(widgetId: number): void { + const packet = new Packet(237); + packet.put(widgetId, 'SHORT'); + this.queue(packet); + } + public sendTabWidget(tabIndex: number, widgetId: number | null): void { if(widgetId < 0) { return; @@ -443,6 +449,12 @@ export class OutboundPackets { this.queue(packet); } + public showChatDialogue(widgetId: number): void { + const packet = new Packet(185); + packet.put(widgetId, 'SHORT'); + this.queue(packet); + } + public updateCarryWeight(weight: number): void { const packet = new Packet(171); packet.put(weight, 'SHORT'); diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 3c156ec3a..6ebf388dd 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -60,7 +60,9 @@ export class Widget { } - +/** + * Control's a Player's Game Interface state. + */ export class InterfaceState { public readonly tabs: { [key: string]: Widget | null }; @@ -159,17 +161,44 @@ export class InterfaceState { } private showWidget(widget: Widget): void { - if(widget.slot === 'full' && widget.containerId !== undefined) { - this.player.outgoingPackets.showFullscreenWidget(widget.widgetId, widget.containerId); - } else if(widget.slot === 'screen') { + const { outgoingPackets: packets } = this.player; + const { widgetId, containerId, slot, multi, walkable } = widget; + + if(slot === 'full' || !multi) { + this.closeOthers(slot); + } - } else if(widget.slot === 'chatbox') { + if(slot === 'full' && containerId !== undefined) { + packets.showFullscreenWidget(widgetId, containerId); + } else if(slot === 'screen') { + if(walkable) { - } else if(widget.slot === 'tabarea') { + } else { + packets.showScreenWidget(widgetId); + } + } else if(slot === 'chatbox') { + if(multi) { + // Dialogue Widget + packets.showChatDialogue(widgetId); + } else { + // Chatbox Widget + packets.showChatboxWidget(widgetId); + } + } else if(slot === 'tabarea') { + if(multi) { + } else { + packets.showTabWidget(widgetId); + } } } + private closeOthers(openSlot: GameInterfaceSlot): void { + const slots: GameInterfaceSlot[] = Object.keys(this.widgetSlots) + .filter(slot => slot !== openSlot) as GameInterfaceSlot[]; + slots.forEach(slot => this.closeWidget(slot)); + } + private clearSlots(): void { this.widgetSlots.full = null; this.widgetSlots.screen = null; diff --git a/src/world/actor/player/player.ts b/src/world/actor/player/player.ts index 9b5469e27..12e429e06 100644 --- a/src/world/actor/player/player.ts +++ b/src/world/actor/player/player.ts @@ -45,6 +45,8 @@ import { animationIds } from '@server/world/config/animation-ids'; import { combatStyles } from '@server/world/actor/combat'; import { WorldInstance, TileModifications } from '@server/world/instances'; import { Cutscene } from '@server/world/actor/player/cutscenes'; +import { InterfaceState } from '@server/world/actor/player/interface-state'; +import { dialogue } from '@server/world/actor/dialogue'; export const playerOptions: { option: string, index: number, placement: 'TOP' | 'BOTTOM' }[] = [ { @@ -108,6 +110,7 @@ export class Player extends Actor { public readonly numericInputEvent: Subject; public readonly dialogueInteractionEvent: Subject; public readonly personalInstance = new WorldInstance(uuidv4()); + public readonly interfaceState = new InterfaceState(this); public isLowDetail: boolean; public trackedPlayers: Player[]; public trackedNpcs: Npc[]; @@ -193,11 +196,16 @@ export class Player extends Actor { if(this.firstTimePlayer) { if(!serverConfig.tutorialEnabled) { - this.openInteractiveWidget({ + this.interfaceState.openWidget(gameInterfaces.characterDesign, { + slot: 'screen', + multi: false, + walkable: false + }) + /*this.openInteractiveWidget({ widgetId: gameInterfaces.characterDesign, type: 'SCREEN', disablePlayerMovement: true - }).toPromise(); + }).toPromise();*/ } } else if(serverConfig.showWelcome && this.savedMetadata.tutorialComplete) { const daysSinceLogin = daysSinceLastLogin(this.loginDate); @@ -219,11 +227,10 @@ export class Player extends Actor { this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 21, `To start a subscripton:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Start a new subscription'`); this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 19, `You are not a member.\\n\\nChoose to subscribe and\\nyou'll get loads of extra\\nbenefits and features.`); - this.activeWidget = { - widgetId: gameInterfaces.welcomeScreen, - secondaryWidgetId: gameInterfaces.welcomeScreenChildren.question, - type: 'FULLSCREEN' - }; + this.interfaceState.openWidget(gameInterfaces.welcomeScreen, { + slot: 'full', + containerId: gameInterfaces.welcomeScreenChildren.question + }); } for(const playerOption of playerOptions) { @@ -238,7 +245,7 @@ export class Player extends Actor { this.inventory.containerUpdated.subscribe(event => this.inventoryUpdated(event)); - this.actionsCancelled.subscribe(type => { + /*this.actionsCancelled.subscribe(type => { let closeWidget = false; const widget = this.activeWidget; @@ -266,7 +273,7 @@ export class Player extends Actor { this.outgoingPackets.closeActiveWidgets(); this._activeWidget = null; } - }); + });*/ this._loginDate = new Date(); this._lastAddress = (this._socket?.address() as AddressInfo)?.address || '127.0.0.1'; @@ -607,23 +614,21 @@ export class Player extends Actor { * @returns A Promise that resolves when the player has clicked the "click to continue" button or * after their chat messages have been sent. */ - public async sendMessage(messages: string | string[], showDialogue: boolean = false): Promise { + public async sendMessage(messages: string | string[], showDialogue: boolean = false): Promise { if(!Array.isArray(messages)) { messages = [ messages ]; } if(!showDialogue) { messages.forEach(message => this.outgoingPackets.chatboxMessage(message)); - return Promise.resolve(); } else { - if(messages.length > 5) { - throw new Error(`Dialogues have a maximum of 5 lines!`); + for(let i = 0; i < messages.length; i++) { + messages[i] = messages[i]?.trim() || ''; } - return dialogueAction(this, { type: 'TEXT', lines: messages }).then(async d => { - d.close(); - return Promise.resolve(); - }); + return await dialogue([ this ], [ + text => (messages as string[]).join(' ') + ]); } } From d2ca1e977175cbc14684a857461553c91ff86d27 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 09:30:23 -0600 Subject: [PATCH 08/12] Renaming some game interface stuff --- .../{game-interfaces.json5 => widgets.json5} | 0 src/config/index.ts | 4 +- src/config/shop-config.ts | 12 +-- .../character-design-packet.js | 4 +- .../inbound-packets/item-on-item-packet.js | 6 +- src/net/inbound-packets/item-on-npc-packet.js | 4 +- .../inbound-packets/item-on-object-packet.js | 4 +- src/plugins/buttons/logout-button-plugin.ts | 4 +- src/plugins/buttons/player-emotes-plugin.ts | 4 +- .../buttons/player-setting-button-plugin.ts | 4 +- src/plugins/combat/combat-styles.ts | 6 +- .../items/buckets/empty-container-plugin.ts | 6 +- src/plugins/items/drop-item-plugin.ts | 6 +- .../items/equipment/equip-item-plugin.ts | 4 +- .../items/equipment/equipment-stats-plugin.ts | 14 ++-- .../items/equipment/unequip-item-plugin.ts | 6 +- src/plugins/items/move-item-plugin.ts | 4 +- src/plugins/items/pickup-item-plugin.ts | 4 +- src/plugins/items/pots/empty-pot-plugin.ts | 4 +- .../items/shopping/buy-from-shop-plugin.ts | 10 +-- .../items/shopping/item-value-plugin.ts | 6 +- src/plugins/items/shopping/sell-to-shop.ts | 12 +-- src/plugins/items/swap-items-plugin.ts | 6 +- src/plugins/npcs/al-kharid/karim-plugin.ts | 4 +- .../npcs/varrock/blue-moon-inn-plugin.ts | 6 +- .../varrock/master-smithing-tutor-plugin.ts | 4 +- src/plugins/objects/bank/bank-plugin.ts | 38 ++++----- .../quests/goblin-diplomacy-tutorial/index.ts | 26 +++--- src/plugins/quests/quest-journal-plugin.ts | 14 ++-- src/plugins/rune.js | 2 +- .../skills/crafting/spinning-wheel-plugin.ts | 6 +- src/plugins/skills/prayer.js | 4 +- .../runecrafting/runecrafting-crafting.ts | 6 +- src/plugins/skills/skill-guide-plugin.ts | 28 +++---- .../skills/smithing/smelting-plugin.ts | 32 ++++---- src/world/actor/player/player.ts | 82 +++++++++---------- 36 files changed, 193 insertions(+), 193 deletions(-) rename data/config/{game-interfaces.json5 => widgets.json5} (100%) diff --git a/data/config/game-interfaces.json5 b/data/config/widgets.json5 similarity index 100% rename from data/config/game-interfaces.json5 rename to data/config/widgets.json5 diff --git a/src/config/index.ts b/src/config/index.ts index c0c7292d0..ed534cbc3 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -48,7 +48,7 @@ export let npcIdMap: { [key: number]: string }; export let npcPresetMap: NpcPresetConfiguration; export let npcSpawns: NpcSpawn[] = []; export let shopMap: { [key: string]: Shop }; -export let gameInterfaces: { [key: string]: any }; +export let widgets: { [key: string]: any }; export async function loadConfigurations(): Promise { @@ -66,7 +66,7 @@ export async function loadConfigurations(): Promise { shopMap = await loadShopConfigurations('data/config/shops'); - gameInterfaces = json5.parse(readFileSync('data/config/game-interfaces.json5', 'utf8')); + widgets = json5.parse(readFileSync('data/config/widgets.json5', 'utf8')); } diff --git a/src/config/shop-config.ts b/src/config/shop-config.ts index 69225a3fc..56db6fb6d 100644 --- a/src/config/shop-config.ts +++ b/src/config/shop-config.ts @@ -1,5 +1,5 @@ import { ItemContainer } from '@server/world/items/item-container'; -import { findItem, loadConfigurationFiles, gameInterfaces } from '@server/config/index'; +import { findItem, loadConfigurationFiles, widgets } from '@server/config/index'; import { Player } from '@server/world/actor/player/player'; import { ItemDetails } from '@server/config/item-config'; @@ -91,13 +91,13 @@ export class Shop { public open(player: Player): void { player.metadata['lastOpenedShop'] = this; - player.outgoingPackets.updateWidgetString(gameInterfaces.shop.widgetId, gameInterfaces.shop.title, this.name); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shop, this.container); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, player.inventory); + player.outgoingPackets.updateWidgetString(widgets.shop.widgetId, widgets.shop.title, this.name); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shop, this.container); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, player.inventory); player.activeWidget = { - widgetId: gameInterfaces.shop.widgetId, - secondaryWidgetId: gameInterfaces.shopPlayerInventory.widgetId, + widgetId: widgets.shop.widgetId, + secondaryWidgetId: widgets.shopPlayerInventory.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; diff --git a/src/net/inbound-packets/character-design-packet.js b/src/net/inbound-packets/character-design-packet.js index 258d79821..d7aee9fa3 100644 --- a/src/net/inbound-packets/character-design-packet.js +++ b/src/net/inbound-packets/character-design-packet.js @@ -1,7 +1,7 @@ -import { gameInterfaces } from '../../config'; +import { widgets } from '../../config'; const characterDesignPacket = (player, packet) => { - if(!player.activeWidget || player.activeWidget.widgetId !== gameInterfaces.characterDesign) { + if(!player.activeWidget || player.activeWidget.widgetId !== widgets.characterDesign) { return; } diff --git a/src/net/inbound-packets/item-on-item-packet.js b/src/net/inbound-packets/item-on-item-packet.js index bcf626b72..4e413ba08 100644 --- a/src/net/inbound-packets/item-on-item-packet.js +++ b/src/net/inbound-packets/item-on-item-packet.js @@ -1,6 +1,6 @@ import { logger } from '@runejs/core'; import { actionHandler } from '../../world/action'; -import { gameInterfaces } from '../../config'; +import { widgets } from '../../config'; const itemOnItemPacket = (player, packet) => { const { buffer } = packet; @@ -13,8 +13,8 @@ const itemOnItemPacket = (player, packet) => { const usedItemId = buffer.get('SHORT', 'UNSIGNED', 'LITTLE_ENDIAN'); const usedSlot = buffer.get('SHORT', 'UNSIGNED'); - if(usedWidgetId === gameInterfaces.inventory.widgetId && usedContainerId === gameInterfaces.inventory.containerId && - usedWithWidgetId === gameInterfaces.inventory.widgetId && usedWithContainerId === gameInterfaces.inventory.containerId) { + if(usedWidgetId === widgets.inventory.widgetId && usedContainerId === widgets.inventory.containerId && + usedWithWidgetId === widgets.inventory.widgetId && usedWithContainerId === widgets.inventory.containerId) { if(usedSlot < 0 || usedSlot > 27 || usedWithSlot < 0 || usedWithSlot > 27) { return; } diff --git a/src/net/inbound-packets/item-on-npc-packet.js b/src/net/inbound-packets/item-on-npc-packet.js index 05f54e1e6..c1f3753f7 100644 --- a/src/net/inbound-packets/item-on-npc-packet.js +++ b/src/net/inbound-packets/item-on-npc-packet.js @@ -2,7 +2,7 @@ import { logger } from '@runejs/core'; import { world } from '../../game-server'; import { World } from '../../world'; import { actionHandler } from '../../world/action'; -import { gameInterfaces } from '../../config'; +import { widgets } from '../../config'; const itemOnNpcPacket = (player, packet) => { const { buffer } = packet; @@ -13,7 +13,7 @@ const itemOnNpcPacket = (player, packet) => { const itemContainerId = buffer.get('SHORT'); let usedItem; - if(itemWidgetId === gameInterfaces.inventory.widgetId && itemContainerId === gameInterfaces.inventory.containerId) { + if(itemWidgetId === widgets.inventory.widgetId && itemContainerId === widgets.inventory.containerId) { if(itemSlot < 0 || itemSlot > 27) { return; } diff --git a/src/net/inbound-packets/item-on-object-packet.js b/src/net/inbound-packets/item-on-object-packet.js index e73d453d7..06ca26c3e 100644 --- a/src/net/inbound-packets/item-on-object-packet.js +++ b/src/net/inbound-packets/item-on-object-packet.js @@ -2,7 +2,7 @@ import { logger } from '@runejs/core'; import { Position } from '../../world/position'; import { cache, world } from '../../game-server'; import { actionHandler } from '../../world/action'; -import { gameInterfaces } from '../../config'; +import { widgets } from '../../config'; const itemOnObjectPacket = (player, packet) => { const { buffer } = packet; @@ -15,7 +15,7 @@ const itemOnObjectPacket = (player, packet) => { const objectX = buffer.get('SHORT', 'UNSIGNED', 'LITTLE_ENDIAN'); let usedItem; - if (itemWidgetId === gameInterfaces.inventory.widgetId && itemContainerId === gameInterfaces.inventory.containerId) { + if (itemWidgetId === widgets.inventory.widgetId && itemContainerId === widgets.inventory.containerId) { if (itemSlot < 0 || itemSlot > 27) { return; } diff --git a/src/plugins/buttons/logout-button-plugin.ts b/src/plugins/buttons/logout-button-plugin.ts index 4c183feb3..91b3e769c 100644 --- a/src/plugins/buttons/logout-button-plugin.ts +++ b/src/plugins/buttons/logout-button-plugin.ts @@ -1,6 +1,6 @@ import { buttonAction } from '@server/world/action/button-action'; import { world } from '@server/game-server'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: buttonAction = (details) => { const { player } = details; @@ -14,4 +14,4 @@ export const action: buttonAction = (details) => { } }; -export default { type: 'button', widgetId: gameInterfaces.logoutTab, buttonIds: 6, action }; +export default { type: 'button', widgetId: widgets.logoutTab, buttonIds: 6, action }; diff --git a/src/plugins/buttons/player-emotes-plugin.ts b/src/plugins/buttons/player-emotes-plugin.ts index 99fa9d766..d0cfd80e6 100644 --- a/src/plugins/buttons/player-emotes-plugin.ts +++ b/src/plugins/buttons/player-emotes-plugin.ts @@ -1,7 +1,7 @@ import { buttonAction } from '@server/world/action/button-action'; import { Player } from '@server/world/actor/player/player'; import { itemIds } from '@server/world/config/item-ids'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; interface Emote { animationId: number; @@ -181,4 +181,4 @@ export const action: buttonAction = (details) => { } }; -export default { type: 'button', widgetId: gameInterfaces.emotesTab, buttonIds, action }; +export default { type: 'button', widgetId: widgets.emotesTab, buttonIds, action }; diff --git a/src/plugins/buttons/player-setting-button-plugin.ts b/src/plugins/buttons/player-setting-button-plugin.ts index 3ce2ef735..27275bff2 100644 --- a/src/plugins/buttons/player-setting-button-plugin.ts +++ b/src/plugins/buttons/player-setting-button-plugin.ts @@ -1,5 +1,5 @@ import { buttonAction } from '@server/world/action/button-action'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const buttonIds: number[] = [ 0, // walk/run @@ -19,4 +19,4 @@ export const action: buttonAction = (details) => { player.settingChanged(buttonId); }; -export default { type: 'button', widgetId: gameInterfaces.settingsTab, buttonIds: buttonIds, action }; +export default { type: 'button', widgetId: widgets.settingsTab, buttonIds: buttonIds, action }; diff --git a/src/plugins/combat/combat-styles.ts b/src/plugins/combat/combat-styles.ts index 57cdbb8ad..e44440676 100644 --- a/src/plugins/combat/combat-styles.ts +++ b/src/plugins/combat/combat-styles.ts @@ -2,7 +2,7 @@ import { equipAction, EquipActionData } from '@server/world/action/equip-action' import { ItemDetails, WeaponStyle, weaponWidgetIds } from '@server/config/item-config'; import { interfaceScripts } from '@server/world/config/widget'; import { Player, playerInitAction } from '@server/world/actor/player/player'; -import { findItem, gameInterfaces } from '@server/config'; +import { findItem, widgets } from '@server/config'; import { buttonAction } from '@server/world/action/button-action'; import { combatStyles } from '@server/world/actor/combat'; import { serverConfig } from '@server/game-server'; @@ -17,8 +17,8 @@ export function updateCombatStyle(player: Player, weaponStyle: WeaponStyle, styl } export function showUnarmed(player: Player): void { - player.modifyWidget(gameInterfaces.defaultCombatStyle, { childId: 0, text: 'Unarmed' }); - player.setSidebarWidget(0, gameInterfaces.defaultCombatStyle); + player.modifyWidget(widgets.defaultCombatStyle, { childId: 0, text: 'Unarmed' }); + player.setSidebarWidget(0, widgets.defaultCombatStyle); let style = 0; if(player.savedMetadata.combatStyle) { style = player.savedMetadata.combatStyle[1] || null; diff --git a/src/plugins/items/buckets/empty-container-plugin.ts b/src/plugins/items/buckets/empty-container-plugin.ts index ae53610d5..ffe390f8b 100644 --- a/src/plugins/items/buckets/empty-container-plugin.ts +++ b/src/plugins/items/buckets/empty-container-plugin.ts @@ -2,7 +2,7 @@ import { itemAction } from '@server/world/action/item-action'; import { soundIds } from '@server/world/config/sound-ids'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot } = details; @@ -27,12 +27,12 @@ export const action: itemAction = (details) => { } // @TODO only update necessary slots - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); }; export default { type: 'item_action', - widgets: gameInterfaces.inventory, + widgets: widgets.inventory, options: 'empty', itemIds: [itemIds.bucketOfMilk, itemIds.bucketOfWater, itemIds.jugOfWater], action, diff --git a/src/plugins/items/drop-item-plugin.ts b/src/plugins/items/drop-item-plugin.ts index 417588f08..ee5d9dff8 100644 --- a/src/plugins/items/drop-item-plugin.ts +++ b/src/plugins/items/drop-item-plugin.ts @@ -3,7 +3,7 @@ import { soundIds } from '@server/world/config/sound-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { serverConfig } from '@server/game-server'; import { Rights } from '@server/world/actor/player/player'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = ({ player, itemId, itemSlot }) => { const inventory = player.inventory; @@ -20,7 +20,7 @@ export const action: itemAction = ({ player, itemId, itemSlot }) => { } inventory.remove(itemSlot); - player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, itemSlot, null); + player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, itemSlot, null); player.playSound(soundIds.dropItem, 5); player.instance.spawnWorldItem(item, player.position, player, 300); player.actionsCancelled.next(); @@ -28,7 +28,7 @@ export const action: itemAction = ({ player, itemId, itemSlot }) => { export default { type: 'item_action', - widgets: gameInterfaces.inventory, + widgets: widgets.inventory, options: 'drop', action, cancelOtherActions: false diff --git a/src/plugins/items/equipment/equip-item-plugin.ts b/src/plugins/items/equipment/equip-item-plugin.ts index 295815518..f483e66ff 100644 --- a/src/plugins/items/equipment/equip-item-plugin.ts +++ b/src/plugins/items/equipment/equip-item-plugin.ts @@ -1,5 +1,5 @@ import { itemAction } from '@server/world/action/item-action'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, itemDetails } = details; @@ -15,7 +15,7 @@ export const action: itemAction = (details) => { export default { type: 'item_action', - widgets: gameInterfaces.inventory, + widgets: widgets.inventory, options: 'equip', action, cancelOtherActions: false diff --git a/src/plugins/items/equipment/equipment-stats-plugin.ts b/src/plugins/items/equipment/equipment-stats-plugin.ts index 4420e70b2..8acadbab4 100644 --- a/src/plugins/items/equipment/equipment-stats-plugin.ts +++ b/src/plugins/items/equipment/equipment-stats-plugin.ts @@ -1,6 +1,6 @@ import { buttonAction } from '@server/world/action/button-action'; import { Player } from '@server/world/actor/player/player'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export function updateBonusStrings(player: Player): void { [ @@ -16,7 +16,7 @@ export function updateBonusStrings(player: Player): void { { id: 117, text: 'Range', value: player.bonuses.defensive.ranged }, { id: 119, text: 'Strength', value: player.bonuses.skill.strength }, { id: 120, text: 'Prayer', value: player.bonuses.skill.prayer }, - ].forEach(bonus => player.modifyWidget(gameInterfaces.equipmentStats.widgetId, { childId: bonus.id, + ].forEach(bonus => player.modifyWidget(widgets.equipmentStats.widgetId, { childId: bonus.id, text: `${bonus.text}: ${bonus.value > 0 ? `+${bonus.value}` : bonus.value}` })); } @@ -27,15 +27,15 @@ export const action: buttonAction = (details) => { updateBonusStrings(player); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipmentStats, player.equipment); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, player.equipment); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); player.activeWidget = { - widgetId: gameInterfaces.equipmentStats.widgetId, - secondaryWidgetId: gameInterfaces.inventory.widgetId, + widgetId: widgets.equipmentStats.widgetId, + secondaryWidgetId: widgets.inventory.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; }; -export default { type: 'button', widgetId: gameInterfaces.equipment.widgetId, buttonIds: 24, action }; +export default { type: 'button', widgetId: widgets.equipment.widgetId, buttonIds: 24, action }; diff --git a/src/plugins/items/equipment/unequip-item-plugin.ts b/src/plugins/items/equipment/unequip-item-plugin.ts index f65f12b66..4cc0b492f 100644 --- a/src/plugins/items/equipment/unequip-item-plugin.ts +++ b/src/plugins/items/equipment/unequip-item-plugin.ts @@ -1,6 +1,6 @@ import { itemAction } from '@server/world/action/item-action'; import { getItemFromContainer } from '@server/world/items/item-container'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, itemDetails } = details; @@ -25,8 +25,8 @@ export const action: itemAction = (details) => { export default { type: 'item_action', widgets: [ - gameInterfaces.equipment, - gameInterfaces.equipmentStats + widgets.equipment, + widgets.equipmentStats ], options: 'remove', action, diff --git a/src/plugins/items/move-item-plugin.ts b/src/plugins/items/move-item-plugin.ts index 31cb92fad..98b561e7e 100644 --- a/src/plugins/items/move-item-plugin.ts +++ b/src/plugins/items/move-item-plugin.ts @@ -1,13 +1,13 @@ import { swapItemsAction } from '@server/world/action/swap-items-action'; import { ItemContainer } from '@server/world/items/item-container'; import { Player } from '@server/world/actor/player/player'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; type WidgetDetail = [ number, number, (player: Player) => ItemContainer ]; const movableWidgets: WidgetDetail[] = [ // Player Bank Screen - [ gameInterfaces.bank.screenWidget.widgetId, gameInterfaces.bank.screenWidget.containerId, player => player.bank ] + [ widgets.bank.screenWidget.widgetId, widgets.bank.screenWidget.containerId, player => player.bank ] ]; function moveItem(player: Player, container: ItemContainer, widget: { widgetId: number, containerId: number }, diff --git a/src/plugins/items/pickup-item-plugin.ts b/src/plugins/items/pickup-item-plugin.ts index 3df1ee6e1..7c21e36ed 100644 --- a/src/plugins/items/pickup-item-plugin.ts +++ b/src/plugins/items/pickup-item-plugin.ts @@ -1,7 +1,7 @@ import { worldItemAction } from '@server/world/action/world-item-action'; import { Item } from '../../world/items/item'; import { soundIds } from '@server/world/config/sound-ids'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: worldItemAction = ({ player, worldItem, itemDetails }) => { const inventory = player.inventory; @@ -37,7 +37,7 @@ export const action: worldItemAction = ({ player, worldItem, itemDetails }) => { }; inventory.add(item); - player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, item); + player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, item); player.playSound(soundIds.pickupItem, 3); player.actionsCancelled.next(); }; diff --git a/src/plugins/items/pots/empty-pot-plugin.ts b/src/plugins/items/pots/empty-pot-plugin.ts index bfc60cab4..d0c7e67e5 100644 --- a/src/plugins/items/pots/empty-pot-plugin.ts +++ b/src/plugins/items/pots/empty-pot-plugin.ts @@ -4,7 +4,7 @@ import { RunePlugin } from '@server/plugins/plugin'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { ActionType } from '@server/world/action'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot } = details; @@ -24,7 +24,7 @@ export const action: itemAction = (details) => { export default { type: 'item_action', - widgets: gameInterfaces.inventory, + widgets: widgets.inventory, options: 'empty', itemIds: [itemIds.potOfFlour], action, diff --git a/src/plugins/items/shopping/buy-from-shop-plugin.ts b/src/plugins/items/shopping/buy-from-shop-plugin.ts index b796efb6a..6cb9f0b58 100644 --- a/src/plugins/items/shopping/buy-from-shop-plugin.ts +++ b/src/plugins/items/shopping/buy-from-shop-plugin.ts @@ -2,7 +2,7 @@ import { itemAction } from '@server/world/action/item-action'; import { Item } from '@server/world/items/item'; import { getItemFromContainer, ItemContainer } from '@server/world/items/item-container'; import { itemIds } from '@server/world/config/item-ids'; -import { findItem, gameInterfaces } from '@server/config'; +import { findItem, widgets } from '@server/config'; import { Shop } from '@server/config/shop-config'; @@ -103,14 +103,14 @@ export const action: itemAction = (details) => { removeCoins(inventory, coinsIndex, buyCost); } - player.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.shop, itemSlot, shopContainer.items[itemSlot]); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); + player.outgoingPackets.sendUpdateSingleWidgetItem(widgets.shop, itemSlot, shopContainer.items[itemSlot]); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); }; export default { type: 'item_action', - widgets: gameInterfaces.shop, + widgets: widgets.shop, options: [ 'buy-1', 'buy-5', 'buy-10' ], action, cancelOtherActions: false diff --git a/src/plugins/items/shopping/item-value-plugin.ts b/src/plugins/items/shopping/item-value-plugin.ts index 00c51bcaf..6b7235a4a 100644 --- a/src/plugins/items/shopping/item-value-plugin.ts +++ b/src/plugins/items/shopping/item-value-plugin.ts @@ -1,6 +1,6 @@ import { itemAction } from '@server/world/action/item-action'; import { Shop } from '@server/config/shop-config'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const shopSellValueAction: itemAction = ({ player, itemDetails }) => { const itemValue = itemDetails.value || 1; @@ -24,13 +24,13 @@ export const shopPurchaseValueAction: itemAction = ({ player, itemDetails }) => export default [{ type: 'item_action', - widgets: gameInterfaces.shop, + widgets: widgets.shop, options: 'value', action: shopSellValueAction, cancelOtherActions: false }, { type: 'item_action', - widgets: gameInterfaces.shopPlayerInventory, + widgets: widgets.shopPlayerInventory, options: 'value', action: shopPurchaseValueAction, cancelOtherActions: false diff --git a/src/plugins/items/shopping/sell-to-shop.ts b/src/plugins/items/shopping/sell-to-shop.ts index 68c6f8e98..14c1ea15a 100644 --- a/src/plugins/items/shopping/sell-to-shop.ts +++ b/src/plugins/items/shopping/sell-to-shop.ts @@ -2,13 +2,13 @@ import { itemAction } from '@server/world/action/item-action'; import { itemIds } from '@server/world/config/item-ids'; import { getItemFromContainer } from '@server/world/items/item-container'; import { Shop } from '@server/config/shop-config'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, option, itemDetails } = details; - if(!player.activeWidget || player.activeWidget.widgetId !== gameInterfaces.shop.widgetId) { + if(!player.activeWidget || player.activeWidget.widgetId !== widgets.shop.widgetId) { return; } @@ -80,14 +80,14 @@ export const action: itemAction = (details) => { } } - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shop, shopContainer); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.shopPlayerInventory, inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shop, shopContainer); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); }; export default { type: 'item_action', - widgets: gameInterfaces.shopPlayerInventory, + widgets: widgets.shopPlayerInventory, options: [ 'sell-1', 'sell-5', 'sell-10' ], action, cancelOtherActions: false diff --git a/src/plugins/items/swap-items-plugin.ts b/src/plugins/items/swap-items-plugin.ts index fc008ed9b..1c78a4f6b 100644 --- a/src/plugins/items/swap-items-plugin.ts +++ b/src/plugins/items/swap-items-plugin.ts @@ -1,15 +1,15 @@ import { swapItemsAction } from '@server/world/action/swap-items-action'; import { ItemContainer } from '@server/world/items/item-container'; import { Player } from '@server/world/actor/player/player'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; type WidgetDetail = [ number, number, (player: Player) => ItemContainer ]; const swappableWidgets: WidgetDetail[] = [ // Player Inventory - [ gameInterfaces.inventory.widgetId, gameInterfaces.inventory.containerId, player => player.inventory ], + [ widgets.inventory.widgetId, widgets.inventory.containerId, player => player.inventory ], // Player Bank Screen - [ gameInterfaces.bank.screenWidget.widgetId, gameInterfaces.bank.screenWidget.containerId, player => player.bank ] + [ widgets.bank.screenWidget.widgetId, widgets.bank.screenWidget.containerId, player => player.bank ] ]; function swapItems(container: ItemContainer, fromSlot: number, toSlot: number): void { diff --git a/src/plugins/npcs/al-kharid/karim-plugin.ts b/src/plugins/npcs/al-kharid/karim-plugin.ts index 3c92bbe0d..eec5c6406 100644 --- a/src/plugins/npcs/al-kharid/karim-plugin.ts +++ b/src/plugins/npcs/al-kharid/karim-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { itemIds } from '@server/world/config/item-ids'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const talkToAction : npcAction = (details) => { const { player, npc } = details; @@ -31,7 +31,7 @@ const talkToAction : npcAction = (details) => { } inventory.add({ itemId: itemIds.kebab, amount: 1 }); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, inventory); return; } diff --git a/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts b/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts index ec50dd69c..e2e08bf60 100644 --- a/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts +++ b/src/plugins/npcs/varrock/blue-moon-inn-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; import { itemIds } from '@server/world/config/item-ids'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const talkToBartender : npcAction = (details) => { @@ -43,7 +43,7 @@ const talkToBartender : npcAction = (details) => { // Give the beer. player.inventory.add(itemIds.beer); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); } }), ], @@ -123,7 +123,7 @@ const talkToCook : npcAction = (details) => { // Give the cabbage. player.inventory.add(itemIds.cabbage); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); }), cook => [Emote.HAPPY, `It's a deal. Now, make sure you eat it all up. Cabbage is good for you.`], ], diff --git a/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts b/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts index 8714ac18a..8220dde32 100644 --- a/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts +++ b/src/plugins/npcs/varrock/master-smithing-tutor-plugin.ts @@ -1,7 +1,7 @@ import { npcAction } from '@server/world/action/npc-action'; import { dialogue, Emote, execute, goto } from '@server/world/actor/dialogue'; import { itemIds } from '@server/world/config/item-ids'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const talkTo : npcAction = (details) => { @@ -16,7 +16,7 @@ const talkTo : npcAction = (details) => { execute(() => { player.inventory.add(itemIds.hammer); player.sendMessage('The Master Smithing Tutor gives you a hammer.', true); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); }), tutor => [Emote.GENERIC, `You're going to get your hand on some metal bars.`], tutor => [Emote.GENERIC, `You could do this by mining your own ores and smelting them at a furnace.`], diff --git a/src/plugins/objects/bank/bank-plugin.ts b/src/plugins/objects/bank/bank-plugin.ts index 8cecc873b..21438979f 100644 --- a/src/plugins/objects/bank/bank-plugin.ts +++ b/src/plugins/objects/bank/bank-plugin.ts @@ -6,7 +6,7 @@ import { itemAction } from '@server/world/action/item-action'; import { fromNote, Item, toNote } from '@server/world/items/item'; import { buttonAction } from '@server/world/action/button-action'; import { dialogue, Emote, execute } from '@server/world/actor/dialogue'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const buttonIds: number[] = [ @@ -18,21 +18,21 @@ const buttonIds: number[] = [ export const openBankInterface: objectAction = ({ player }) => { player.activeWidget = { - widgetId: gameInterfaces.bank.screenWidget.widgetId, - secondaryWidgetId: gameInterfaces.bank.tabWidget.widgetId, + widgetId: widgets.bank.screenWidget.widgetId, + secondaryWidgetId: widgets.bank.tabWidget.widgetId, type: 'SCREEN_AND_TAB', closeOnWalk: true }; - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, player.inventory); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, player.bank); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, player.bank); player.outgoingPackets.updateClientConfig(interfaceScripts.bankInsertMode, player.settings.bankInsertMode); player.outgoingPackets.updateClientConfig(interfaceScripts.bankWithdrawNoteMode, player.settings.bankWithdrawNoteMode); }; export const openPinSettings: objectAction = ({ player }) => { player.activeWidget = { - widgetId: gameInterfaces.bank.pinSettingsWidget.widgetId, + widgetId: widgets.bank.pinSettingsWidget.widgetId, type: 'SCREEN', closeOnWalk: true }; @@ -41,8 +41,8 @@ export const openPinSettings: objectAction = ({ player }) => { export const depositItem: itemAction = (details) => { // Check if player might be spawning widget clientside if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === gameInterfaces.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === gameInterfaces.bank.tabWidget.widgetId)) { + !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || + !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { return; } @@ -100,17 +100,17 @@ export const depositItem: itemAction = (details) => { playerBank.addStacking(itemToAdd); - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, details.player.bank); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank); }; export const withdrawItem: itemAction = (details) => { // Check if player might be spawning widget clientside if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === gameInterfaces.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === gameInterfaces.bank.tabWidget.widgetId)) { + !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || + !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { return; } // Check if the player has the item @@ -175,9 +175,9 @@ export const withdrawItem: itemAction = (details) => { } - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.tabWidget, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, details.player.inventory); - details.player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.bank.screenWidget, details.player.bank); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory); + details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank); }; export const btnAction: buttonAction = (details) => { @@ -239,17 +239,17 @@ export default [{ action: openBankInterface }, { type: 'item_action', - widgets: gameInterfaces.bank.tabWidget, + widgets: widgets.bank.tabWidget, options: ['deposit-1', 'deposit-5', 'deposit-10', 'deposit-all'], action: depositItem, }, { type: 'item_action', - widgets: gameInterfaces.bank.screenWidget, + widgets: widgets.bank.screenWidget, options: ['withdraw-1', 'withdraw-5', 'withdraw-10', 'withdraw-all'], action: withdrawItem, }, { type: 'button', - widgetId: gameInterfaces.bank.screenWidget.widgetId, + widgetId: widgets.bank.screenWidget.widgetId, buttonIds: buttonIds, action: btnAction }]; diff --git a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts index 8975c9759..745a8b6a0 100644 --- a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts +++ b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts @@ -6,7 +6,7 @@ import { Npc } from '@server/world/actor/npc/npc'; import { logger } from '@runejs/core'; import { Position } from '@server/world/position'; import { WorldInstance } from '@server/world/instances'; -import { findNpc, gameInterfaces } from '@server/config'; +import { findNpc, widgets } from '@server/config'; import { updateCombatStyleWidget } from '@server/plugins/combat/combat-styles'; import { runescapeGuideDialogueHandler } from '@server/plugins/quests/goblin-diplomacy-tutorial/runescape-guide-dialogue'; import { harlanDialogueHandler } from '@server/plugins/quests/goblin-diplomacy-tutorial/melee-tutor-dialogue'; @@ -18,14 +18,14 @@ import { equipAction } from '@server/world/action/equip-action'; export const tutorialTabWidgetOrder = [ - [ Tabs.settings, gameInterfaces.settingsTab ], - [ Tabs.friends, gameInterfaces.friendsList ], - [ Tabs.ignoreList, gameInterfaces.ignoreList ], - [ Tabs.emotes, gameInterfaces.emotesTab ], - [ Tabs.music, gameInterfaces.musicPlayerTab ], - [ Tabs.inventory, gameInterfaces.inventory.widgetId ], - [ Tabs.skills, gameInterfaces.skillsTab ], - [ Tabs.equipment, gameInterfaces.equipment.widgetId ], + [ Tabs.settings, widgets.settingsTab ], + [ Tabs.friends, widgets.friendsList ], + [ Tabs.ignoreList, widgets.ignoreList ], + [ Tabs.emotes, widgets.emotesTab ], + [ Tabs.music, widgets.musicPlayerTab ], + [ Tabs.inventory, widgets.inventory.widgetId ], + [ Tabs.skills, widgets.skillsTab ], + [ Tabs.equipment, widgets.equipment.widgetId ], [ Tabs.combatStyle, -1 ], // @TODO prayer, magic, ]; @@ -94,7 +94,7 @@ export const startTutorial = async (player: Player): Promise => { defaultPlayerTabWidgets.forEach((widgetId: number, tabIndex: number) => { if(widgetId !== -1) { - player.outgoingPackets.sendTabWidget(tabIndex, widgetId === gameInterfaces.logoutTab ? widgetId : null); + player.outgoingPackets.sendTabWidget(tabIndex, widgetId === widgets.logoutTab ? widgetId : null); } }); @@ -104,10 +104,10 @@ export const startTutorial = async (player: Player): Promise => { player.inventory.add('rs:coins'); player.inventory.add('rs:coins'); player.inventory.add('rs:coins'); - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); await player.openInteractiveWidget({ - widgetId: gameInterfaces.characterDesign, + widgetId: widgets.characterDesign, type: 'SCREEN', disablePlayerMovement: true }).toPromise(); @@ -143,7 +143,7 @@ export async function handleTutorial(player: Player): Promise { defaultPlayerTabWidgets.forEach((widgetId: number, tabIndex: number) => { if(widgetId !== -1) { - player.setSidebarWidget(tabIndex, widgetId === gameInterfaces.logoutTab ? widgetId : null); + player.setSidebarWidget(tabIndex, widgetId === widgets.logoutTab ? widgetId : null); } }); diff --git a/src/plugins/quests/quest-journal-plugin.ts b/src/plugins/quests/quest-journal-plugin.ts index 53f6e5e0d..4f34a7599 100644 --- a/src/plugins/quests/quest-journal-plugin.ts +++ b/src/plugins/quests/quest-journal-plugin.ts @@ -1,7 +1,7 @@ import { buttonAction } from '@server/world/action/button-action'; import { wrapText } from '@server/util/strings'; import { pluginActions } from '@server/game-server'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export const action: buttonAction = (details) => { const { player, buttonId } = details; @@ -32,26 +32,26 @@ export const action: buttonAction = (details) => { lines = [ 'Invalid Quest Stage' ]; } - player.modifyWidget(gameInterfaces.questJournal, { childId: 2, text: '@dre@' + questData.name }); + player.modifyWidget(widgets.questJournal, { childId: 2, text: '@dre@' + questData.name }); for(let i = 0; i <= 100; i++) { if(i === 0) { - player.modifyWidget(gameInterfaces.questJournal, { childId: 3, text: `${lines[0]}` }); + player.modifyWidget(widgets.questJournal, { childId: 3, text: `${lines[0]}` }); continue; } if(lines.length > i) { - player.modifyWidget(gameInterfaces.questJournal, { childId: (i + 4), text: `${lines[i]}` }); + player.modifyWidget(widgets.questJournal, { childId: (i + 4), text: `${lines[i]}` }); } else { - player.modifyWidget(gameInterfaces.questJournal, { childId: (i + 4), text: '' }); + player.modifyWidget(widgets.questJournal, { childId: (i + 4), text: '' }); } } player.activeWidget = { - widgetId: gameInterfaces.questJournal, + widgetId: widgets.questJournal, type: 'SCREEN', closeOnWalk: true }; }; -export default { type: 'button', widgetId: gameInterfaces.questTab, action }; +export default { type: 'button', widgetId: widgets.questTab, action }; diff --git a/src/plugins/rune.js b/src/plugins/rune.js index 098186839..83fb692b3 100644 --- a/src/plugins/rune.js +++ b/src/plugins/rune.js @@ -13,4 +13,4 @@ export * from '../world/actor/update-flags'; export * from '../world/actor/skills'; export * from '../world/actor/player/achievements'; export * from '../task/task'; -export { gameInterfaces } from '../config'; +export { widgets } from '../config'; diff --git a/src/plugins/skills/crafting/spinning-wheel-plugin.ts b/src/plugins/skills/crafting/spinning-wheel-plugin.ts index df64278ed..5eaf60014 100644 --- a/src/plugins/skills/crafting/spinning-wheel-plugin.ts +++ b/src/plugins/skills/crafting/spinning-wheel-plugin.ts @@ -8,7 +8,7 @@ import { Skill } from '@server/world/actor/skills'; import { cache } from '@server/game-server'; import { animationIds } from '@server/world/config/animation-ids'; import { objectIds } from '@server/world/config/object-ids'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; interface Spinnable { input: number | number[]; @@ -73,7 +73,7 @@ const widgetButtonIds: Map = new Map { details.player.activeWidget = { - widgetId: gameInterfaces.whatWouldYouLikeToSpin, + widgetId: widgets.whatWouldYouLikeToSpin, type: 'SCREEN', closeOnWalk: true }; @@ -186,7 +186,7 @@ export default [ }, { type: 'button', - widgetId: gameInterfaces.whatWouldYouLikeToSpin, + widgetId: widgets.whatWouldYouLikeToSpin, buttonIds: Array.from(widgetButtonIds.keys()), action: buttonClicked } diff --git a/src/plugins/skills/prayer.js b/src/plugins/skills/prayer.js index 01d6783fb..9655029b2 100644 --- a/src/plugins/skills/prayer.js +++ b/src/plugins/skills/prayer.js @@ -3,7 +3,7 @@ import { soundIds } from '../../world/config/sound-ids'; import { animationIds } from '../../world/config/animation-ids'; import { Achievements, giveAchievement } from '../../world/actor/player/achievements'; import { Skill } from '../../world/actor/skills'; -import { gameInterfaces } from '../../config'; +import { widgets } from '../../config'; const action = async details => { const { player, itemSlot } = details; @@ -18,7 +18,7 @@ const action = async details => { module.exports = { type: 'item_action', - widgets: gameInterfaces.inventory, + widgets: widgets.inventory, options: 'bury', itemIds: itemIds.bones, action, diff --git a/src/plugins/skills/runecrafting/runecrafting-crafting.ts b/src/plugins/skills/runecrafting/runecrafting-crafting.ts index c44da7bcf..f68429c1b 100644 --- a/src/plugins/skills/runecrafting/runecrafting-crafting.ts +++ b/src/plugins/skills/runecrafting/runecrafting-crafting.ts @@ -15,7 +15,7 @@ import { RunecraftingCombinationRune } from '@server/plugins/skills/runecrafting import { randomBetween } from '@server/util/num'; import { itemIds } from '@server/world/config/item-ids'; import { cache } from '@server/game-server'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; const craftRune: objectAction = (details: ObjectActionData) => { @@ -45,7 +45,7 @@ const craftRune: objectAction = (details: ObjectActionData) => { // Add experience player.skills.addExp(Skill.RUNECRAFTING, (rune.xp * essenceAvailable)); // Update widget items. - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); return; } @@ -113,7 +113,7 @@ const craftCombinationRune: itemOnObjectAction = (details: ItemOnObjectActionDat player.inventory.removeFirst(item.itemId); } // Update widget items. - player.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, player.inventory); + player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); player.sendMessage(`You craft some ${runeDetails.name}.`); return; } diff --git a/src/plugins/skills/skill-guide-plugin.ts b/src/plugins/skills/skill-guide-plugin.ts index 3aa81f7dd..3dfcc90c9 100644 --- a/src/plugins/skills/skill-guide-plugin.ts +++ b/src/plugins/skills/skill-guide-plugin.ts @@ -4,7 +4,7 @@ import { JSON_SCHEMA, safeLoad } from 'js-yaml'; import { readFileSync } from 'fs'; import { Player } from '@server/world/actor/player/player'; import { widgetAction } from '@server/world/action/widget-action'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; // @TODO fix me! @@ -53,17 +53,17 @@ function loadGuide(player: Player, guideId: number, subGuideId: number = 0, refr const guide: SkillGuide = guides.find(g => g.id === guideId); if(refreshSidebar) { - player.modifyWidget(gameInterfaces.skillGuide, { childId: 133, text: (guide.members ? 'Members only skill' : '') }); + player.modifyWidget(widgets.skillGuide, { childId: 133, text: (guide.members ? 'Members only skill' : '') }); for(let i = 0; i < sidebarTextIds.length; i++) { const sidebarId = sidebarIds[i]; let hidden: boolean = true; if(i >= guide.subGuides.length) { - player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarTextIds[i], text: '' }); + player.modifyWidget(widgets.skillGuide, { childId: sidebarTextIds[i], text: '' }); hidden = true; } else { - player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarTextIds[i], text: guide.subGuides[i].name }); + player.modifyWidget(widgets.skillGuide, { childId: sidebarTextIds[i], text: guide.subGuides[i].name }); hidden = false; } @@ -71,30 +71,30 @@ function loadGuide(player: Player, guideId: number, subGuideId: number = 0, refr // Apparently you can never have only TWO subguides... // Because childId 98 deletes both options 2 AND 3. So, good thing there are no guides with only 2 sections, I guess?... // Verified this in an interface editor, and they are indeed grouped in a single layer for some reason... - player.modifyWidget(gameInterfaces.skillGuide, { childId: sidebarIds[i], hidden }); + player.modifyWidget(widgets.skillGuide, { childId: sidebarIds[i], hidden }); } } } const subGuide: SkillSubGuide = guide.subGuides[subGuideId]; - player.modifyWidget(gameInterfaces.skillGuide, { childId: 1, text: (guide.name + ' - ' + subGuide.name) }); + player.modifyWidget(widgets.skillGuide, { childId: 1, text: (guide.name + ' - ' + subGuide.name) }); const itemIds: number[] = subGuide.lines.map(g => g.itemId).concat(new Array(30 - subGuide.lines.length).fill(null)); - player.outgoingPackets.sendUpdateAllWidgetItemsById({ widgetId: gameInterfaces.skillGuide, containerId: 132 }, itemIds); + player.outgoingPackets.sendUpdateAllWidgetItemsById({ widgetId: widgets.skillGuide, containerId: 132 }, itemIds); for(let i = 0; i < 30; i++) { if(subGuide.lines.length <= i) { - player.modifyWidget(gameInterfaces.skillGuide, { childId: 5 + i, text: '' }); - player.modifyWidget(gameInterfaces.skillGuide, { childId: 45 + i, text: '' }); + player.modifyWidget(widgets.skillGuide, { childId: 5 + i, text: '' }); + player.modifyWidget(widgets.skillGuide, { childId: 45 + i, text: '' }); } else { - player.modifyWidget(gameInterfaces.skillGuide, { childId: 5 + i, text: subGuide.lines[i].level.toString() }); - player.modifyWidget(gameInterfaces.skillGuide, { childId: 45 + i, text: subGuide.lines[i].text }); + player.modifyWidget(widgets.skillGuide, { childId: 5 + i, text: subGuide.lines[i].level.toString() }); + player.modifyWidget(widgets.skillGuide, { childId: 45 + i, text: subGuide.lines[i].text }); } } player.activeWidget = { - widgetId: gameInterfaces.skillGuide, + widgetId: widgets.skillGuide, type: 'SCREEN', closeOnWalk: true }; @@ -126,6 +126,6 @@ export const openSubGuideAction: widgetAction = (details) => { }; export default [ - { type: 'button', widgetId: gameInterfaces.skillsTab, buttonIds, action: openGuideAction }, - { type: 'widget_action', widgetIds: gameInterfaces.skillGuide, childIds: sidebarTextIds, optionId: 0, action: openSubGuideAction } + { type: 'button', widgetId: widgets.skillsTab, buttonIds, action: openGuideAction }, + { type: 'widget_action', widgetIds: widgets.skillGuide, childIds: sidebarTextIds, optionId: 0, action: openSubGuideAction } ]; diff --git a/src/plugins/skills/smithing/smelting-plugin.ts b/src/plugins/skills/smithing/smelting-plugin.ts index 716519363..66266c565 100644 --- a/src/plugins/skills/smithing/smelting-plugin.ts +++ b/src/plugins/skills/smithing/smelting-plugin.ts @@ -11,7 +11,7 @@ import { loopingAction } from '@server/world/action'; import { animationIds } from '@server/world/config/animation-ids'; import { soundIds } from '@server/world/config/sound-ids'; import { colors } from '@server/util/colors'; -import { gameInterfaces } from '@server/config'; +import { widgets } from '@server/config'; export interface Bar { barId: number; @@ -110,7 +110,7 @@ const RUNEITE : Bar = { export const openSmeltingInterface: objectAction = (details) => { details.player.activeWidget = { - widgetId: gameInterfaces.furnace.widgetId, + widgetId: widgets.furnace.widgetId, type: 'CHAT', closeOnWalk: true }; @@ -118,14 +118,14 @@ export const openSmeltingInterface: objectAction = (details) => { }; const widgetItems = [ - { slot: gameInterfaces.furnace.slots.slot1, bar: BLURITE }, - { slot: gameInterfaces.furnace.slots.slot2, bar: IRON }, - { slot: gameInterfaces.furnace.slots.slot3, bar: SILVER }, - { slot: gameInterfaces.furnace.slots.slot4, bar: STEEL }, - { slot: gameInterfaces.furnace.slots.slot5, bar: GOLD }, - { slot: gameInterfaces.furnace.slots.slot6, bar: MITHRIL }, - { slot: gameInterfaces.furnace.slots.slot7, bar: ADAMANTITE }, - { slot: gameInterfaces.furnace.slots.slot8, bar: RUNEITE } + { slot: widgets.furnace.slots.slot1, bar: BLURITE }, + { slot: widgets.furnace.slots.slot2, bar: IRON }, + { slot: widgets.furnace.slots.slot3, bar: SILVER }, + { slot: widgets.furnace.slots.slot4, bar: STEEL }, + { slot: widgets.furnace.slots.slot5, bar: GOLD }, + { slot: widgets.furnace.slots.slot6, bar: MITHRIL }, + { slot: widgets.furnace.slots.slot7, bar: ADAMANTITE }, + { slot: widgets.furnace.slots.slot8, bar: RUNEITE } ]; interface Smeltable { @@ -178,15 +178,15 @@ const loadSmeltingInterface = (details: ObjectActionData) => { const theKnightsSwordQuest = details.player.quests.find(quest => quest.questId === 'theKnightsSword'); // Send the items to the widget. widgetItems.forEach((item) => { - details.player.outgoingPackets.setItemOnWidget(gameInterfaces.furnace.widgetId, item.slot.modelId, item.bar.barId, 125); + details.player.outgoingPackets.setItemOnWidget(widgets.furnace.widgetId, item.slot.modelId, item.bar.barId, 125); if (!details.player.skills.hasLevel(Skill.SMITHING, item.bar.requiredLevel)) { - details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); + details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); } else { - details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.black }); + details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.black }); } // Check if the player has completed 'The Knight's Sword' quest, even if the level is okay. if (item.bar.quest !== undefined && (theKnightsSwordQuest == undefined || theKnightsSwordQuest.stage !== 'COMPLETE')) { - details.player.modifyWidget(gameInterfaces.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); + details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red }); } }); }; @@ -259,7 +259,7 @@ const smeltProduct = (details: ButtonActionData, bar: Bar, count: number) => { export const buttonClicked : buttonAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === gameInterfaces.furnace.widgetId)) { + if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === widgets.furnace.widgetId)) { return; } @@ -295,7 +295,7 @@ export default [ }, { type: 'button', - widgetId: gameInterfaces.furnace.widgetId, + widgetId: widgets.furnace.widgetId, buttonIds: Array.from(widgetButtonIds.keys()), action: buttonClicked } diff --git a/src/world/actor/player/player.ts b/src/world/actor/player/player.ts index 12e429e06..ed190d463 100644 --- a/src/world/actor/player/player.ts +++ b/src/world/actor/player/player.ts @@ -39,7 +39,7 @@ import { ItemDetails, OffensiveBonuses, SkillBonuses } from '@server/config/item-config'; -import { findItem, npcIdMap, gameInterfaces } from '@server/config'; +import { findItem, npcIdMap, widgets } from '@server/config'; import { NpcDetails } from '@server/config/npc-config'; import { animationIds } from '@server/world/config/animation-ids'; import { combatStyles } from '@server/world/actor/combat'; @@ -62,10 +62,10 @@ export const playerOptions: { option: string, index: number, placement: 'TOP' | ]; export const defaultPlayerTabWidgets = [ - -1, gameInterfaces.skillsTab, gameInterfaces.questTab, gameInterfaces.inventory.widgetId, - gameInterfaces.equipment.widgetId, gameInterfaces.prayerTab, gameInterfaces.standardSpellbookTab, null, - gameInterfaces.friendsList, gameInterfaces.ignoreList, gameInterfaces.logoutTab, gameInterfaces.settingsTab, gameInterfaces.emotesTab, - gameInterfaces.musicPlayerTab + -1, widgets.skillsTab, widgets.questTab, widgets.inventory.widgetId, + widgets.equipment.widgetId, widgets.prayerTab, widgets.standardSpellbookTab, null, + widgets.friendsList, widgets.ignoreList, widgets.logoutTab, widgets.settingsTab, widgets.emotesTab, + widgets.musicPlayerTab ]; export enum Tabs { @@ -186,8 +186,8 @@ export class Player extends Actor { this.skills.values.forEach((skill, index) => this.outgoingPackets.updateSkill(index, skill.level, skill.exp)); - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipment, this.equipment); + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipment, this.equipment); for(const item of this.equipment.items) { if(item) { actionHandler.call('equip_action', this, item.itemId, 'EQUIP'); @@ -196,7 +196,7 @@ export class Player extends Actor { if(this.firstTimePlayer) { if(!serverConfig.tutorialEnabled) { - this.interfaceState.openWidget(gameInterfaces.characterDesign, { + this.interfaceState.openWidget(widgets.characterDesign, { slot: 'screen', multi: false, walkable: false @@ -218,18 +218,18 @@ export class Player extends Actor { } else { loginDaysStr = daysSinceLogin + ' days ago'; } - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreenChildren.question, 1, `Want to help RuneJS improve?\\nSend us a pull request over on Github!`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 13, `You last logged in @red@${ loginDaysStr }@bla@ from: @red@${ this.lastAddress }`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 16, `You have @yel@0 unread messages\\nin your message centre.`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 14, `\\nYou have not yet set any recovery questions.\\nIt is @lre@strongly@yel@ recommended that you do so.\\n\\nIf you don't you will be @lre@unable to recover your\\n@lre@password@yel@ if you forget it, or it is stolen.`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 22, `To change your recovery questions:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Set new recovery questions'.`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 17, `\\nYou do not have a Bank PIN.\\nPlease visit a bank if you would like one.`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 21, `To start a subscripton:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Start a new subscription'`); - this.outgoingPackets.updateWidgetString(gameInterfaces.welcomeScreen, 19, `You are not a member.\\n\\nChoose to subscribe and\\nyou'll get loads of extra\\nbenefits and features.`); - - this.interfaceState.openWidget(gameInterfaces.welcomeScreen, { + this.outgoingPackets.updateWidgetString(widgets.welcomeScreenChildren.question, 1, `Want to help RuneJS improve?\\nSend us a pull request over on Github!`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 13, `You last logged in @red@${ loginDaysStr }@bla@ from: @red@${ this.lastAddress }`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 16, `You have @yel@0 unread messages\\nin your message centre.`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 14, `\\nYou have not yet set any recovery questions.\\nIt is @lre@strongly@yel@ recommended that you do so.\\n\\nIf you don't you will be @lre@unable to recover your\\n@lre@password@yel@ if you forget it, or it is stolen.`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 22, `To change your recovery questions:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Set new recovery questions'.`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 17, `\\nYou do not have a Bank PIN.\\nPlease visit a bank if you would like one.`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 21, `To start a subscripton:\\n1) Logout and return to the frontpage of this website.\\n2) Choose 'Start a new subscription'`); + this.outgoingPackets.updateWidgetString(widgets.welcomeScreen, 19, `You are not a member.\\n\\nChoose to subscribe and\\nyou'll get loads of extra\\nbenefits and features.`); + + this.interfaceState.openWidget(widgets.welcomeScreen, { slot: 'full', - containerId: gameInterfaces.welcomeScreenChildren.question + containerId: widgets.welcomeScreenChildren.question }); } @@ -239,7 +239,7 @@ export class Player extends Actor { this.updateBonuses(); this.updateCarryWeight(true); - this.modifyWidget(gameInterfaces.musicPlayerTab, { childId: 82, textColor: colors.green }); // Set "Harmony" to green/unlocked on the music tab + this.modifyWidget(widgets.musicPlayerTab, { childId: 82, textColor: colors.green }); // Set "Harmony" to green/unlocked on the music tab this.playSong(songs.harmony); this.updateQuestTab(); @@ -516,41 +516,41 @@ export class Player extends Actor { } if(playerQuest.stage === 'NOT_STARTED' && stage !== 'COMPLETE') { - this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: colors.yellow }); + this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.yellow }); } else if(playerQuest.stage !== 'COMPLETE' && stage === 'COMPLETE') { this.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, questData.points + this.getQuestPoints()); - this.modifyWidget(gameInterfaces.questReward, { childId: 2, text: `You have completed ${ questData.name }!` }); - this.modifyWidget(gameInterfaces.questReward, { + this.modifyWidget(widgets.questReward, { childId: 2, text: `You have completed ${ questData.name }!` }); + this.modifyWidget(widgets.questReward, { childId: 8, text: `${ questData.points } Quest Point${ questData.points > 1 ? 's' : '' }` }); for(let i = 0; i < 5; i++) { if(i >= questData.completion.rewards.length) { - this.modifyWidget(gameInterfaces.questReward, { childId: 9 + i, text: '' }); + this.modifyWidget(widgets.questReward, { childId: 9 + i, text: '' }); } else { - this.modifyWidget(gameInterfaces.questReward, { childId: 9 + i, text: questData.completion.rewards[i] }); + this.modifyWidget(widgets.questReward, { childId: 9 + i, text: questData.completion.rewards[i] }); } } if(questData.completion.itemId) { - this.outgoingPackets.updateWidgetModel1(gameInterfaces.questReward, 3, + this.outgoingPackets.updateWidgetModel1(widgets.questReward, 3, (cache.itemDefinitions.get(questData.completion.itemId) as ItemDefinition).inventoryModelId); } else if(questData.completion.modelId) { - this.outgoingPackets.updateWidgetModel1(gameInterfaces.questReward, 3, questData.completion.modelId); + this.outgoingPackets.updateWidgetModel1(widgets.questReward, 3, questData.completion.modelId); } - this.outgoingPackets.setWidgetModelRotationAndZoom(gameInterfaces.questReward, 3, + this.outgoingPackets.setWidgetModelRotationAndZoom(widgets.questReward, 3, questData.completion.modelRotationX || 0, questData.completion.modelRotationY || 0, questData.completion.modelZoom || 0); this.activeWidget = { - widgetId: gameInterfaces.questReward, + widgetId: widgets.questReward, type: 'SCREEN', closeOnWalk: true }; - this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: colors.green }); + this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.green }); questData.completion.onComplete(this); } @@ -571,7 +571,7 @@ export class Player extends Actor { this.outgoingPackets.updateWidgetString(widgetId, childId, text); } if(hidden !== undefined) { - this.outgoingPackets.toggleWidgetVisibility(gameInterfaces.skillGuide, childId, hidden); + this.outgoingPackets.toggleWidgetVisibility(widgets.skillGuide, childId, hidden); } if(textColor !== undefined) { const { r, g, b } = hexToRgb(textColor); @@ -663,7 +663,7 @@ export class Player extends Actor { return -1; } - this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, null); + this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, null); return slot; } @@ -674,7 +674,7 @@ export class Player extends Actor { public removeItem(slot: number): void { this.inventory.remove(slot); - this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, slot, null); + this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, slot, null); } public giveItem(item: number | Item): boolean { @@ -683,7 +683,7 @@ export class Player extends Actor { return false; } - this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, addedItem.slot, addedItem.item); + this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, addedItem.slot, addedItem.item); return true; } @@ -930,11 +930,11 @@ export class Player extends Actor { this.updateBonuses(); // @TODO change packets to only update modified container slots - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipment, this.equipment); + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipment, this.equipment); - if(this.hasWidgetOpen(gameInterfaces.equipmentStats.widgetId)) { - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.equipmentStats, this.equipment); + if(this.hasWidgetOpen(widgets.equipmentStats.widgetId)) { + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, this.equipment); updateBonusStrings(this); } @@ -1012,9 +1012,9 @@ export class Player extends Actor { private inventoryUpdated(event: ContainerUpdateEvent): void { if(event.type === 'CLEAR_ALL') { - this.outgoingPackets.sendUpdateAllWidgetItems(gameInterfaces.inventory, this.inventory); + this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); } else if(event.type === 'ADD') { - this.outgoingPackets.sendUpdateSingleWidgetItem(gameInterfaces.inventory, event.slot, event.item); + this.outgoingPackets.sendUpdateSingleWidgetItem(widgets.inventory, event.slot, event.item); } this.updateCarryWeight(); } @@ -1083,7 +1083,7 @@ export class Player extends Actor { color = stage === 'COMPLETE' ? colors.green : colors.yellow; } - this.modifyWidget(gameInterfaces.questTab, { childId: questData.questTabId, textColor: color }); + this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: color }); }); } From 188e05b1c16d245e668109f472174fdb8944c914 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 10:32:33 -0600 Subject: [PATCH 09/12] Yeeting old widget code --- src/config/index.ts | 6 +- src/config/shop-config.ts | 14 +- .../character-design-packet.js | 2 +- .../inbound-packets/widgets-closed-packet.js | 2 +- src/net/outbound-packets.ts | 9 +- src/plugins/combat/combat-styles.ts | 4 +- src/plugins/commands/quest-reset-command.ts | 4 +- .../items/equipment/equipment-stats-plugin.ts | 9 + src/plugins/objects/bank/bank-plugin.ts | 6 +- .../player/login-update-settings-plugin.ts | 28 +-- src/world/actor/player/interface-state.ts | 42 +++-- src/world/actor/player/player.ts | 160 ++---------------- src/world/config/widget.ts | 2 +- 13 files changed, 93 insertions(+), 195 deletions(-) diff --git a/src/config/index.ts b/src/config/index.ts index ed534cbc3..a715909d1 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -18,7 +18,7 @@ import { import { loadNpcSpawnConfigurations, NpcSpawn } from '@server/config/npc-spawn-config'; import { loadShopConfigurations, Shop } from '@server/config/shop-config'; import json5 from 'json5'; - +require('json5/lib/register'); export async function loadConfigurationFiles(configurationDir: string): Promise { const files = []; @@ -48,7 +48,7 @@ export let npcIdMap: { [key: number]: string }; export let npcPresetMap: NpcPresetConfiguration; export let npcSpawns: NpcSpawn[] = []; export let shopMap: { [key: string]: Shop }; -export let widgets: { [key: string]: any }; +export const widgets: { [key: string]: any } = require('../../data/config/widgets.json5'); export async function loadConfigurations(): Promise { @@ -65,8 +65,6 @@ export async function loadConfigurations(): Promise { npcSpawns = await loadNpcSpawnConfigurations('data/config/npc-spawns'); shopMap = await loadShopConfigurations('data/config/shops'); - - widgets = json5.parse(readFileSync('data/config/widgets.json5', 'utf8')); } diff --git a/src/config/shop-config.ts b/src/config/shop-config.ts index 56db6fb6d..b346fc0e7 100644 --- a/src/config/shop-config.ts +++ b/src/config/shop-config.ts @@ -95,12 +95,14 @@ export class Shop { player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shop, this.container); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.shopPlayerInventory, player.inventory); - player.activeWidget = { - widgetId: widgets.shop.widgetId, - secondaryWidgetId: widgets.shopPlayerInventory.widgetId, - type: 'SCREEN_AND_TAB', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgets.shop.widgetId, { + slot: 'screen', + multi: true + }); + player.interfaceState.openWidget(widgets.shopPlayerInventory.widgetId, { + slot: 'tabarea', + multi: true + }); } } diff --git a/src/net/inbound-packets/character-design-packet.js b/src/net/inbound-packets/character-design-packet.js index d7aee9fa3..325aa8048 100644 --- a/src/net/inbound-packets/character-design-packet.js +++ b/src/net/inbound-packets/character-design-packet.js @@ -38,7 +38,7 @@ const characterDesignPacket = (player, packet) => { }; player.updateFlags.appearanceUpdateRequired = true; - player.closeActiveWidgets(); + player.player.interfaceState.closeAll(); }; export default { diff --git a/src/net/inbound-packets/widgets-closed-packet.js b/src/net/inbound-packets/widgets-closed-packet.js index 271fabc44..f80a076bf 100644 --- a/src/net/inbound-packets/widgets-closed-packet.js +++ b/src/net/inbound-packets/widgets-closed-packet.js @@ -1,5 +1,5 @@ export default { opcode: 176, size: 0, - handler: player => player.closeActiveWidgets(false) + handler: player => player.interfaceState.closeAll() }; diff --git a/src/net/outbound-packets.ts b/src/net/outbound-packets.ts index ea69734c1..370370cf4 100644 --- a/src/net/outbound-packets.ts +++ b/src/net/outbound-packets.ts @@ -312,10 +312,15 @@ export class OutboundPackets { this.queue(new Packet(180)); } - public showScreenWidget(widgetId: number): void { - const packet = new Packet(118); + public showScreenOverlayWidget(widgetId: number): void { + const packet = new Packet(56); packet.put(widgetId, 'SHORT'); + this.queue(packet); + } + public showStandaloneScreenWidget(widgetId: number): void { + const packet = new Packet(118); + packet.put(widgetId, 'SHORT'); this.queue(packet); } diff --git a/src/plugins/combat/combat-styles.ts b/src/plugins/combat/combat-styles.ts index e44440676..2e14f1b74 100644 --- a/src/plugins/combat/combat-styles.ts +++ b/src/plugins/combat/combat-styles.ts @@ -1,6 +1,6 @@ import { equipAction, EquipActionData } from '@server/world/action/equip-action'; import { ItemDetails, WeaponStyle, weaponWidgetIds } from '@server/config/item-config'; -import { interfaceScripts } from '@server/world/config/widget'; +import { widgetScripts } from '@server/world/config/widget'; import { Player, playerInitAction } from '@server/world/actor/player/player'; import { findItem, widgets } from '@server/config'; import { buttonAction } from '@server/world/action/button-action'; @@ -13,7 +13,7 @@ export function updateCombatStyle(player: Player, weaponStyle: WeaponStyle, styl player.settings.attackStyle = styleIndex; const buttonId = combatStyles[weaponStyle][styleIndex].button_id; - player.outgoingPackets.updateClientConfig(interfaceScripts.attackStyle, buttonId); + player.outgoingPackets.updateClientConfig(widgetScripts.attackStyle, buttonId); } export function showUnarmed(player: Player): void { diff --git a/src/plugins/commands/quest-reset-command.ts b/src/plugins/commands/quest-reset-command.ts index 76469359d..b12090108 100644 --- a/src/plugins/commands/quest-reset-command.ts +++ b/src/plugins/commands/quest-reset-command.ts @@ -1,11 +1,11 @@ import { commandAction } from '@server/world/action/player-command-action'; -import { interfaceScripts } from '@server/world/config/widget'; +import { widgetScripts } from '@server/world/config/widget'; const action: commandAction = (details) => { const { player } = details; player.quests.find(quest => quest.questId === 'cooksAssistant').stage = 'COLLECTING'; - player.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, 1000); + player.outgoingPackets.updateClientConfig(widgetScripts.questPoints, 1000); }; export default { diff --git a/src/plugins/items/equipment/equipment-stats-plugin.ts b/src/plugins/items/equipment/equipment-stats-plugin.ts index 8acadbab4..cf4c2da10 100644 --- a/src/plugins/items/equipment/equipment-stats-plugin.ts +++ b/src/plugins/items/equipment/equipment-stats-plugin.ts @@ -36,6 +36,15 @@ export const action: buttonAction = (details) => { type: 'SCREEN_AND_TAB', closeOnWalk: true }; + + player.interfaceState.openWidget(widgets.equipmentStats.widgetId, { + multi: true, + slot: 'screen' + }); + player.interfaceState.openWidget(widgets.inventory.widgetId, { + multi: true, + slot: 'tabarea' + }); }; export default { type: 'button', widgetId: widgets.equipment.widgetId, buttonIds: 24, action }; diff --git a/src/plugins/objects/bank/bank-plugin.ts b/src/plugins/objects/bank/bank-plugin.ts index 21438979f..63b34c533 100644 --- a/src/plugins/objects/bank/bank-plugin.ts +++ b/src/plugins/objects/bank/bank-plugin.ts @@ -1,5 +1,5 @@ import { objectIds } from '@server/world/config/object-ids'; -import { interfaceScripts } from '@server/world/config/widget'; +import { widgetScripts } from '@server/world/config/widget'; import { objectAction } from '@server/world/action/object-action'; import { ItemContainer } from '@server/world/items/item-container'; import { itemAction } from '@server/world/action/item-action'; @@ -26,8 +26,8 @@ export const openBankInterface: objectAction = ({ player }) => { player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, player.inventory); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, player.bank); - player.outgoingPackets.updateClientConfig(interfaceScripts.bankInsertMode, player.settings.bankInsertMode); - player.outgoingPackets.updateClientConfig(interfaceScripts.bankWithdrawNoteMode, player.settings.bankWithdrawNoteMode); + player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, player.settings.bankInsertMode); + player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, player.settings.bankWithdrawNoteMode); }; export const openPinSettings: objectAction = ({ player }) => { diff --git a/src/plugins/player/login-update-settings-plugin.ts b/src/plugins/player/login-update-settings-plugin.ts index 2d9102ecc..a1e547870 100644 --- a/src/plugins/player/login-update-settings-plugin.ts +++ b/src/plugins/player/login-update-settings-plugin.ts @@ -1,6 +1,6 @@ import { playerInitAction } from '@server/world/actor/player/player'; import { validateSettings } from '@server/world/actor/player/player-data'; -import { interfaceScripts } from '@server/world/config/widget'; +import { widgetScripts } from '@server/world/config/widget'; export const action: playerInitAction = (details) => { const { player } = details; @@ -8,19 +8,19 @@ export const action: playerInitAction = (details) => { validateSettings(player); const settings = player.settings; - player.outgoingPackets.updateClientConfig(interfaceScripts.brightness, settings.screenBrightness); - player.outgoingPackets.updateClientConfig(interfaceScripts.mouseButtons, settings.twoMouseButtonsEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(interfaceScripts.splitPrivateChat, settings.splitPrivateChatEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(interfaceScripts.chatEffects, settings.chatEffectsEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(interfaceScripts.acceptAid, settings.acceptAidEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(interfaceScripts.musicVolume, settings.musicVolume); - player.outgoingPackets.updateClientConfig(interfaceScripts.soundEffectVolume, settings.soundEffectVolume); - player.outgoingPackets.updateClientConfig(interfaceScripts.areaEffectVolume, settings.areaEffectVolume); - player.outgoingPackets.updateClientConfig(interfaceScripts.runMode, settings.runEnabled ? 1 : 0); - player.outgoingPackets.updateClientConfig(interfaceScripts.autoRetaliate, settings.autoRetaliateEnabled ? 0 : 1); - player.outgoingPackets.updateClientConfig(interfaceScripts.attackStyle, settings.attackStyle); - player.outgoingPackets.updateClientConfig(interfaceScripts.bankInsertMode, settings.bankInsertMode); - player.outgoingPackets.updateClientConfig(interfaceScripts.bankWithdrawNoteMode, settings.bankWithdrawNoteMode); + player.outgoingPackets.updateClientConfig(widgetScripts.brightness, settings.screenBrightness); + player.outgoingPackets.updateClientConfig(widgetScripts.mouseButtons, settings.twoMouseButtonsEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(widgetScripts.splitPrivateChat, settings.splitPrivateChatEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(widgetScripts.chatEffects, settings.chatEffectsEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(widgetScripts.acceptAid, settings.acceptAidEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(widgetScripts.musicVolume, settings.musicVolume); + player.outgoingPackets.updateClientConfig(widgetScripts.soundEffectVolume, settings.soundEffectVolume); + player.outgoingPackets.updateClientConfig(widgetScripts.areaEffectVolume, settings.areaEffectVolume); + player.outgoingPackets.updateClientConfig(widgetScripts.runMode, settings.runEnabled ? 1 : 0); + player.outgoingPackets.updateClientConfig(widgetScripts.autoRetaliate, settings.autoRetaliateEnabled ? 0 : 1); + player.outgoingPackets.updateClientConfig(widgetScripts.attackStyle, settings.attackStyle); + player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, settings.bankInsertMode); + player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, settings.bankWithdrawNoteMode); player.outgoingPackets.updateSocialSettings(); }; diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 6ebf388dd..35c0e0a85 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -32,7 +32,6 @@ export interface WidgetOptions { queued?: boolean; containerId?: number; container?: ItemContainer; - walkable?: boolean; } @@ -44,10 +43,9 @@ export class Widget { public queued: boolean = false; public containerId: number; public container: ItemContainer = null; - public walkable: boolean = false; public constructor(interfaceId: number, options: WidgetOptions) { - const { slot, multi, queued, containerId, container, walkable } = options; + const { slot, multi, queued, containerId, container } = options; this.widgetId = interfaceId; this.slot = slot; @@ -55,7 +53,6 @@ export class Widget { this.queued = queued || false; this.containerId = containerId || -1; this.container = container || null; - this.walkable = walkable || false; } } @@ -69,6 +66,7 @@ export class InterfaceState { public readonly widgetSlots: { [key: string]: Widget | null }; public readonly closed: Subject = new Subject(); private readonly player: Player; + private _screenOverlayWidget: number | null; public constructor(player: Player) { this.tabs = { @@ -88,11 +86,22 @@ export class InterfaceState { }; this.widgetSlots = {}; + this._screenOverlayWidget = null; this.clearSlots(); this.player = player; } + public openScreenOverlayWidget(widgetId: number): void { + this._screenOverlayWidget = widgetId; + this.player.outgoingPackets.showScreenOverlayWidget(widgetId); + } + + public closeScreenOverlayWidget(): void { + this._screenOverlayWidget = null; + this.player.outgoingPackets.showScreenOverlayWidget(-1); + } + public async widgetClosed(slot: GameInterfaceSlot): Promise { const widget = this.widgetSlots[slot]; if(!widget) { @@ -141,7 +150,6 @@ export class InterfaceState { widget = new Widget(widget, { slot: 'tabarea', multi: true, - walkable: true, container }); } @@ -156,13 +164,22 @@ export class InterfaceState { return this.tabs[type] || null; } + public widgetOpen(slot: GameInterfaceSlot, widgetId: number): boolean { + return this.getWidget(slot)?.widgetId === widgetId; + } + public getWidget(slot: GameInterfaceSlot): Widget | null { return this.widgetSlots[slot] || null; } + public closeAll(): void { + const slots: GameInterfaceSlot[] = Object.keys(this.widgetSlots) as GameInterfaceSlot[]; + slots.forEach(slot => this.closeWidget(slot)); + } + private showWidget(widget: Widget): void { const { outgoingPackets: packets } = this.player; - const { widgetId, containerId, slot, multi, walkable } = widget; + const { widgetId, containerId, slot, multi } = widget; if(slot === 'full' || !multi) { this.closeOthers(slot); @@ -171,10 +188,11 @@ export class InterfaceState { if(slot === 'full' && containerId !== undefined) { packets.showFullscreenWidget(widgetId, containerId); } else if(slot === 'screen') { - if(walkable) { - + const tabWidget = this.getWidget('tabarea'); + if(multi && tabWidget) { + packets.showScreenAndTabWidgets(widgetId, tabWidget.widgetId); } else { - packets.showScreenWidget(widgetId); + packets.showStandaloneScreenWidget(widgetId); } } else if(slot === 'chatbox') { if(multi) { @@ -185,8 +203,9 @@ export class InterfaceState { packets.showChatboxWidget(widgetId); } } else if(slot === 'tabarea') { + const screenWidget = this.getWidget('screen'); if(multi) { - + packets.showScreenAndTabWidgets(screenWidget.widgetId, widgetId); } else { packets.showTabWidget(widgetId); } @@ -222,4 +241,7 @@ export class InterfaceState { return this.widgetSlots.tabarea || null; } + public get screenOverlayWidget(): number | null { + return this._screenOverlayWidget; + } } diff --git a/src/world/actor/player/player.ts b/src/world/actor/player/player.ts index ed190d463..066a631c1 100644 --- a/src/world/actor/player/player.ts +++ b/src/world/actor/player/player.ts @@ -14,22 +14,20 @@ import { PlayerSave, PlayerSettings, QuestProgress, savePlayerData } from './player-data'; -import { PlayerWidget, interfaceScripts } from '../../config/widget'; +import { PlayerWidget, widgetScripts } from '../../config/widget'; import { ContainerUpdateEvent, getItemFromContainer, ItemContainer } from '../../items/item-container'; import { Item } from '../../items/item'; import { Npc } from '../npc/npc'; import { NpcSyncTask } from './sync/npc-sync-task'; -import { Observable, Subject } from 'rxjs'; +import { Subject } from 'rxjs'; import { Chunk, ChunkUpdateItem } from '@server/world/map/chunk'; import { QuadtreeKey } from '@server/world'; import { daysSinceLastLogin } from '@server/util/time'; import { itemIds } from '@server/world/config/item-ids'; -import { dialogueAction } from '@server/world/actor/player/dialogue-action'; import { songs } from '@server/world/config/songs'; import { colors, hexToRgb, rgbTo16Bit } from '@server/util/colors'; import { ItemDefinition } from '@runejs/cache-parser'; import { PlayerCommandAction } from '@server/world/action/player-command-action'; -import { take } from 'rxjs/operators'; import { updateBonusStrings } from '@server/plugins/items/equipment/equipment-stats-plugin'; import { Action, actionHandler } from '@server/world/action'; import { @@ -198,14 +196,8 @@ export class Player extends Actor { if(!serverConfig.tutorialEnabled) { this.interfaceState.openWidget(widgets.characterDesign, { slot: 'screen', - multi: false, - walkable: false - }) - /*this.openInteractiveWidget({ - widgetId: gameInterfaces.characterDesign, - type: 'SCREEN', - disablePlayerMovement: true - }).toPromise();*/ + multi: false + }); } } else if(serverConfig.showWelcome && this.savedMetadata.tutorialComplete) { const daysSinceLogin = daysSinceLastLogin(this.loginDate); @@ -245,36 +237,6 @@ export class Player extends Actor { this.inventory.containerUpdated.subscribe(event => this.inventoryUpdated(event)); - /*this.actionsCancelled.subscribe(type => { - let closeWidget = false; - - const widget = this.activeWidget; - - if(widget && !widget.permanent) { - if(type === 'manual-movement' || type === 'pathing-movement') { - if(widget.closeOnWalk) { - closeWidget = true; - } - } else if(type === 'keep-widgets-open' || type === 'button' || type === 'widget') { - closeWidget = false; - } else { - closeWidget = true; - } - } - - if(closeWidget) { - widget.closed.next(); - widget.closed.complete(); - - if(widget.forceClosed !== undefined) { - widget.forceClosed(); - } - - this.outgoingPackets.closeActiveWidgets(); - this._activeWidget = null; - } - });*/ - this._loginDate = new Date(); this._lastAddress = (this._socket?.address() as AddressInfo)?.address || '127.0.0.1'; @@ -385,29 +347,6 @@ export class Player extends Actor { return true; } - public openInteractiveWidget(widget: PlayerWidget): Observable { - const subject = new Subject(); - this.activeWidget = widget; - - this.actionsCancelled.pipe(take(1)).subscribe(() => { - subject.next(-1); - subject.complete(); - }); - - this.metadata.buttonListener = { - widgetId: widget.widgetId, - event: new Subject() - }; - - this.metadata.buttonListener.event.pipe(take(1)).subscribe(buttonId => { - delete this.metadata.buttonListener; - subject.next(buttonId); - subject.complete(); - }); - - return subject.asObservable(); - } - /** * Should be fired whenever the player's chunk changes. This will fire off chunk updates for all chunks not * already tracked by the player - all the new chunks that are coming into view. @@ -518,7 +457,7 @@ export class Player extends Actor { if(playerQuest.stage === 'NOT_STARTED' && stage !== 'COMPLETE') { this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.yellow }); } else if(playerQuest.stage !== 'COMPLETE' && stage === 'COMPLETE') { - this.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, questData.points + this.getQuestPoints()); + this.outgoingPackets.updateClientConfig(widgetScripts.questPoints, questData.points + this.getQuestPoints()); this.modifyWidget(widgets.questReward, { childId: 2, text: `You have completed ${ questData.name }!` }); this.modifyWidget(widgets.questReward, { childId: 8, @@ -544,11 +483,10 @@ export class Player extends Actor { questData.completion.modelRotationX || 0, questData.completion.modelRotationY || 0, questData.completion.modelZoom || 0); - this.activeWidget = { - widgetId: widgets.questReward, - type: 'SCREEN', - closeOnWalk: true - }; + this.interfaceState.openWidget(widgets.questReward, { + slot: 'screen', + multi: false + }); this.modifyWidget(widgets.questTab, { childId: questData.questTabId, textColor: colors.green }); @@ -764,19 +702,6 @@ export class Player extends Actor { } } - /** - * Queues up a widget to be displayed when the active widget is closed. - * If there is no active widget, the provided widget will be automatically displayed. - * @param widget The widget to queue. - */ - public queueWidget(widget: PlayerWidget): void { - if(this.activeWidget === null) { - this.activeWidget = widget; - } else { - this.queuedWidgets.push(widget); - } - } - public sendLogMessage(message: string, isConsole: boolean): void { if(isConsole) { this.outgoingPackets.consoleMessage(message); @@ -807,36 +732,6 @@ export class Player extends Actor { } } - /** - * Closes the currently active widget or widget pair. - * @param notifyClient [optional] Whether or not to notify the game client that widgets should be cleared. Defaults to true. - */ - public closeActiveWidgets(notifyClient: boolean = true): void { - if(notifyClient) { - if(this.queuedWidgets.length !== 0) { - this.activeWidget = this.queuedWidgets.shift(); - } else { - this.activeWidget = null; - } - } else { - this._activeWidget = null; - - if(this.queuedWidgets.length !== 0) { - this.activeWidget = this.queuedWidgets.shift(); - } else { - this.actionsCancelled.next('keep-widgets-open'); - } - } - } - - /** - * Checks to see if the player has the specified widget ID open on their screen or not. - * @param widgetId The ID of the widget to look for. - */ - public hasWidgetOpen(widgetId: number): boolean { - return this.activeWidget && this.activeWidget.widgetId === widgetId; - } - public isItemEquipped(item: number | Item | string): boolean { if(typeof item === 'string') { item = findItem(item)?.gameId || 0; @@ -933,7 +828,7 @@ export class Player extends Actor { this.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, this.inventory); this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipment, this.equipment); - if(this.hasWidgetOpen(widgets.equipmentStats.widgetId)) { + if(this.interfaceState.widgetOpen('screen', widgets.equipmentStats.widgetId)) { this.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, this.equipment); updateBonusStrings(this); } @@ -1067,7 +962,7 @@ export class Player extends Actor { * Updates the player's quest tab progress. */ private updateQuestTab(): void { - this.outgoingPackets.updateClientConfig(interfaceScripts.questPoints, this.getQuestPoints()); + this.outgoingPackets.updateClientConfig(widgetScripts.questPoints, this.getQuestPoints()); const questMap = pluginActions.quest; if(!questMap) { @@ -1241,39 +1136,6 @@ export class Player extends Actor { this._appearance = value; } - public get activeWidget(): PlayerWidget { - return this._activeWidget; - } - - public set activeWidget(value: PlayerWidget) { - if(value !== null) { - value.closed = new Subject(); - - if(value.beforeOpened !== undefined) { - value.beforeOpened(); - } - - if(value.type === 'SCREEN') { - this.outgoingPackets.showScreenWidget(value.widgetId); - } else if(value.type === 'CHAT') { - this.outgoingPackets.showChatboxWidget(value.widgetId); - } else if(value.type === 'FULLSCREEN') { - this.outgoingPackets.showFullscreenWidget(value.widgetId, value.secondaryWidgetId); - } else if(value.type === 'SCREEN_AND_TAB') { - this.outgoingPackets.showScreenAndTabWidgets(value.widgetId, value.secondaryWidgetId); - } - - if(value.afterOpened !== undefined) { - value.afterOpened(); - } - } else { - this.outgoingPackets.closeActiveWidgets(); - } - - this.actionsCancelled.next('keep-widgets-open'); - this._activeWidget = value; - } - public get equipment(): ItemContainer { return this._equipment; } diff --git a/src/world/config/widget.ts b/src/world/config/widget.ts index b75e642cc..ed4ea09d0 100644 --- a/src/world/config/widget.ts +++ b/src/world/config/widget.ts @@ -1,6 +1,6 @@ import { Subject } from 'rxjs'; -export const interfaceScripts = { +export const widgetScripts = { musicPlayer: 18, attackStyle: 43, brightness: 166, From a34b0109470caa710fea68c0563a68e16364a494 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 10:56:35 -0600 Subject: [PATCH 10/12] Fixing some widget errors --- src/plugins/quests/quest-journal-plugin.ts | 9 +++-- src/plugins/skills/skill-guide-plugin.ts | 9 +++-- src/world/actor/dialogue.ts | 38 +++++++++++----------- src/world/actor/player/interface-state.ts | 4 +++ 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/plugins/quests/quest-journal-plugin.ts b/src/plugins/quests/quest-journal-plugin.ts index 11973060c..48cfdb5f0 100644 --- a/src/plugins/quests/quest-journal-plugin.ts +++ b/src/plugins/quests/quest-journal-plugin.ts @@ -52,11 +52,10 @@ export const action: buttonAction = (details) => { } } - player.activeWidget = { - widgetId: widgets.questJournal, - type: 'SCREEN', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgets.questJournal, { + slot: 'screen', + multi: false + }); }; export default { type: 'button', widgetId: widgets.questTab, action }; diff --git a/src/plugins/skills/skill-guide-plugin.ts b/src/plugins/skills/skill-guide-plugin.ts index 3dfcc90c9..0d22ddfd7 100644 --- a/src/plugins/skills/skill-guide-plugin.ts +++ b/src/plugins/skills/skill-guide-plugin.ts @@ -93,11 +93,10 @@ function loadGuide(player: Player, guideId: number, subGuideId: number = 0, refr } } - player.activeWidget = { - widgetId: widgets.skillGuide, - type: 'SCREEN', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgets.skillGuide, { + slot: 'screen', + multi: false + }); player.metadata['activeSkillGuide'] = guideId; } diff --git a/src/world/actor/dialogue.ts b/src/world/actor/dialogue.ts index 898a6e67d..46f414eef 100644 --- a/src/world/actor/dialogue.ts +++ b/src/world/actor/dialogue.ts @@ -6,6 +6,7 @@ import _ from 'lodash'; import { wrapText } from '@server/util/strings'; import { take } from 'rxjs/operators'; import { findNpc } from '@server/config'; +import { lastValueFrom } from 'rxjs'; export enum Emote { POMPOUS = 'POMPOUS', @@ -525,15 +526,15 @@ async function runDialogueAction(player: Player, dialogueAction: string | Dialog const permanent = additionalOptions?.permanent || false; - player.activeWidget = { - widgetId: widgetId, - type: 'CHAT', - closeOnWalk, - permanent - }; + player.interfaceState.openWidget(widgetId, { + slot: 'chatbox', + multi: true + }); + + const dialogueChoice = await Promise.race([ lastValueFrom(player.dialogueInteractionEvent.pipe(take(1))), + lastValueFrom(player.interfaceState.closed.pipe(take(1))) ]); - const dialogueChoice = await Promise.race([ player.dialogueInteractionEvent.pipe(take(1)).toPromise(), - player.activeWidget.closed.pipe(take(1)).toPromise() ]); + console.log(dialogueChoice); if(dialogueChoice === undefined) { throw new Error('Dialogue Cancelled'); @@ -556,7 +557,7 @@ async function runDialogueAction(player: Player, dialogueAction: string | Dialog async function runParsedDialogue(player: Player, dialogueTree: ParsedDialogueTree, tag?: string, additionalOptions?: AdditionalOptions): Promise { for(let i = 0; i < dialogueTree.length; i++) { tag = await runDialogueAction(player, dialogueTree[i], tag, additionalOptions); - player.activeWidget = null; + player.interfaceState.closeWidget('chatbox'); } return tag === undefined; @@ -584,7 +585,7 @@ export async function dialogue(participants: (Player | NpcParticipant)[], dialog runParsedDialogue(player, parsedDialogueTree, undefined, additionalOptions).then(() => { resolve(); }).catch(error => { - player.activeWidget = null; + player.interfaceState.closeWidget('chatbox'); reject(error); }); }); @@ -681,11 +682,10 @@ export async function itemSelectionDialogue(player: Player, type: 'COOKING' | 'M }); return new Promise((resolve, reject) => { - player.activeWidget = { - widgetId, - type: 'CHAT', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgetId, { + slot: 'chatbox', + multi: true + }); let actionsSub = player.actionsCancelled.subscribe(() => { actionsSub.unsubscribe(); @@ -693,7 +693,7 @@ export async function itemSelectionDialogue(player: Player, type: 'COOKING' | 'M }); const interactionSub = player.dialogueInteractionEvent.subscribe(childId => { - if(!player.activeWidget || player.activeWidget.widgetId !== widgetId) { + if(!player.interfaceState.widgetOpen('chatbox', widgetId)) { interactionSub.unsubscribe(); actionsSub.unsubscribe(); reject('Active Widget Mismatch'); @@ -739,10 +739,10 @@ export async function itemSelectionDialogue(player: Player, type: 'COOKING' | 'M interactionSub.unsubscribe(); if(input < 1 || input > 2147483647) { - player.closeActiveWidgets(); + player.interfaceState.closeWidget('chatbox'); reject('Invalid User Amount Input'); } else { - player.closeActiveWidgets(); + player.interfaceState.closeWidget('chatbox'); resolve({ itemId, amount: input } as ItemSelection); } }); @@ -753,7 +753,7 @@ export async function itemSelectionDialogue(player: Player, type: 'COOKING' | 'M actionsSub.unsubscribe(); interactionSub.unsubscribe(); - player.closeActiveWidgets(); + player.interfaceState.closeWidget('chatbox'); resolve({ itemId, amount } as ItemSelection); } }); diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 35c0e0a85..17ae8a2fe 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -122,6 +122,10 @@ export class InterfaceState { } public openWidget(widgetId: number, options: WidgetOptions): void { + if(this.widgetOpen(options.slot, widgetId)) { + return; + } + const widget = new Widget(widgetId, options); if(widget.queued) { From 36b2e1a3ad86ba36a3af1f6c88fdc7545ec14b21 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 13:46:24 -0600 Subject: [PATCH 11/12] Converting plugins to the new game interface system --- .../inbound-packets/button-click-packet.js | 8 +-- .../character-design-packet.js | 2 +- .../inbound-packets/widgets-closed-packet.js | 2 +- src/plugins/commands/widget-commands.ts | 22 +++--- .../dialogue/dialogue-option-plugin.ts | 4 +- src/plugins/dialogue/item-selection-plugin.ts | 4 +- .../items/equipment/equipment-stats-plugin.ts | 7 -- .../items/shopping/buy-from-shop-plugin.ts | 2 +- src/plugins/items/shopping/sell-to-shop.ts | 2 +- src/plugins/objects/bank/bank-plugin.ts | 30 ++++---- .../quests/goblin-diplomacy-tutorial/index.ts | 26 +++++-- .../stage-handler.ts | 51 ++++++-------- .../skills/crafting/spinning-wheel-plugin.ts | 12 ++-- .../skills/level-up-dialogue-plugin.ts | 2 +- .../skills/smithing/smelting-plugin.ts | 14 ++-- src/world/actor/dialogue.ts | 46 ++++++------ src/world/actor/player/dialogue-action.ts | 9 +-- src/world/actor/player/interface-state.ts | 70 +++++++++++++++---- src/world/actor/player/player.ts | 18 ++++- src/world/actor/walking-queue.ts | 13 ++-- src/world/index.ts | 2 +- 21 files changed, 187 insertions(+), 159 deletions(-) diff --git a/src/net/inbound-packets/button-click-packet.js b/src/net/inbound-packets/button-click-packet.js index 133b611d5..408aec03f 100644 --- a/src/net/inbound-packets/button-click-packet.js +++ b/src/net/inbound-packets/button-click-packet.js @@ -1,17 +1,11 @@ import { actionHandler } from '../../world/action'; -const ignoreButtons = [ - '269:99' // character design accept button -]; - const buttonClickPacket = (player, packet) => { const { buffer } = packet; const widgetId = buffer.get('SHORT'); const buttonId = buffer.get('SHORT'); - if(ignoreButtons.indexOf(`${widgetId}:${buttonId}`) === -1) { - actionHandler.call('button', player, widgetId, buttonId); - } + actionHandler.call('button', player, widgetId, buttonId); }; export default { diff --git a/src/net/inbound-packets/character-design-packet.js b/src/net/inbound-packets/character-design-packet.js index 325aa8048..bce0e57b2 100644 --- a/src/net/inbound-packets/character-design-packet.js +++ b/src/net/inbound-packets/character-design-packet.js @@ -38,7 +38,7 @@ const characterDesignPacket = (player, packet) => { }; player.updateFlags.appearanceUpdateRequired = true; - player.player.interfaceState.closeAll(); + player.player.interfaceState.closeAllSlots(); }; export default { diff --git a/src/net/inbound-packets/widgets-closed-packet.js b/src/net/inbound-packets/widgets-closed-packet.js index f80a076bf..61ceb792b 100644 --- a/src/net/inbound-packets/widgets-closed-packet.js +++ b/src/net/inbound-packets/widgets-closed-packet.js @@ -1,5 +1,5 @@ export default { opcode: 176, size: 0, - handler: player => player.interfaceState.closeAll() + handler: player => player.interfaceState.closeAllSlots() }; diff --git a/src/plugins/commands/widget-commands.ts b/src/plugins/commands/widget-commands.ts index d8d23c0b8..3e8c5a07f 100644 --- a/src/plugins/commands/widget-commands.ts +++ b/src/plugins/commands/widget-commands.ts @@ -7,18 +7,18 @@ const action: commandAction = (details) => { const secondaryWidgetId: number = args.secondaryWidgetId as number; if(secondaryWidgetId === 1) { - player.activeWidget = { - type: 'SCREEN', - widgetId, - closeOnWalk: true - }; + player.interfaceState.openWidget(widgetId, { + slot: 'screen' + }); } else { - player.activeWidget = { - type: 'SCREEN_AND_TAB', - widgetId, - secondaryWidgetId, - closeOnWalk: true - }; + player.interfaceState.openWidget(widgetId, { + slot: 'screen', + multi: true + }); + player.interfaceState.openWidget(secondaryWidgetId, { + slot: 'tabarea', + multi: true + }); } }; diff --git a/src/plugins/dialogue/dialogue-option-plugin.ts b/src/plugins/dialogue/dialogue-option-plugin.ts index a93afdf82..b5bdee75b 100644 --- a/src/plugins/dialogue/dialogue-option-plugin.ts +++ b/src/plugins/dialogue/dialogue-option-plugin.ts @@ -11,8 +11,8 @@ const dialogueIds = [ * Handles a basic NPC/Player/Option/Text dialogue choice/action. */ export const action: widgetAction = (details) => { - const { player, childId } = details; - player.dialogueInteractionEvent.next(childId); + const { player, widgetId, childId } = details; + player.interfaceState.closeWidget(widgetId, childId); }; export default { type: 'widget_action', widgetIds: dialogueIds, action, cancelActions: true }; diff --git a/src/plugins/dialogue/item-selection-plugin.ts b/src/plugins/dialogue/item-selection-plugin.ts index 61a66103a..7d1c00237 100644 --- a/src/plugins/dialogue/item-selection-plugin.ts +++ b/src/plugins/dialogue/item-selection-plugin.ts @@ -4,8 +4,8 @@ import { widgetAction } from '@server/world/action/widget-action'; * Handles an item selection dialogue choice. */ export const action: widgetAction = (details) => { - const { player, childId } = details; - player.dialogueInteractionEvent.next(childId); + const { player, widgetId, childId } = details; + player.interfaceState.closeWidget(widgetId, childId); }; export default { type: 'widget_action', widgetIds: [ 303, 304, 305, 306, 307, 309 ], action, cancelActions: false }; diff --git a/src/plugins/items/equipment/equipment-stats-plugin.ts b/src/plugins/items/equipment/equipment-stats-plugin.ts index cf4c2da10..5257f8315 100644 --- a/src/plugins/items/equipment/equipment-stats-plugin.ts +++ b/src/plugins/items/equipment/equipment-stats-plugin.ts @@ -30,13 +30,6 @@ export const action: buttonAction = (details) => { player.outgoingPackets.sendUpdateAllWidgetItems(widgets.equipmentStats, player.equipment); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); - player.activeWidget = { - widgetId: widgets.equipmentStats.widgetId, - secondaryWidgetId: widgets.inventory.widgetId, - type: 'SCREEN_AND_TAB', - closeOnWalk: true - }; - player.interfaceState.openWidget(widgets.equipmentStats.widgetId, { multi: true, slot: 'screen' diff --git a/src/plugins/items/shopping/buy-from-shop-plugin.ts b/src/plugins/items/shopping/buy-from-shop-plugin.ts index 6cb9f0b58..67fc65977 100644 --- a/src/plugins/items/shopping/buy-from-shop-plugin.ts +++ b/src/plugins/items/shopping/buy-from-shop-plugin.ts @@ -15,7 +15,7 @@ function removeCoins(inventory: ItemContainer, coinsIndex: number, cost: number) export const action: itemAction = (details) => { const { player, itemId, itemSlot, widgetId, option } = details; - if(!player.activeWidget || player.activeWidget.widgetId !== widgetId) { + if(!player.interfaceState.findWidget(widgetId)) { return; } diff --git a/src/plugins/items/shopping/sell-to-shop.ts b/src/plugins/items/shopping/sell-to-shop.ts index 14c1ea15a..6ab56ed2d 100644 --- a/src/plugins/items/shopping/sell-to-shop.ts +++ b/src/plugins/items/shopping/sell-to-shop.ts @@ -8,7 +8,7 @@ import { widgets } from '@server/config'; export const action: itemAction = (details) => { const { player, itemId, itemSlot, option, itemDetails } = details; - if(!player.activeWidget || player.activeWidget.widgetId !== widgets.shop.widgetId) { + if(!player.interfaceState.findWidget(widgets.shop.widgetId)) { return; } diff --git a/src/plugins/objects/bank/bank-plugin.ts b/src/plugins/objects/bank/bank-plugin.ts index 63b34c533..203b90025 100644 --- a/src/plugins/objects/bank/bank-plugin.ts +++ b/src/plugins/objects/bank/bank-plugin.ts @@ -17,12 +17,14 @@ const buttonIds: number[] = [ ]; export const openBankInterface: objectAction = ({ player }) => { - player.activeWidget = { - widgetId: widgets.bank.screenWidget.widgetId, - secondaryWidgetId: widgets.bank.tabWidget.widgetId, - type: 'SCREEN_AND_TAB', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgets.bank.screenWidget.widgetId, { + slot: 'screen', + multi: true + }); + player.interfaceState.openWidget(widgets.bank.tabWidget.widgetId, { + slot: 'tabarea', + multi: true + }); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, player.inventory); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, player.bank); @@ -31,18 +33,14 @@ export const openBankInterface: objectAction = ({ player }) => { }; export const openPinSettings: objectAction = ({ player }) => { - player.activeWidget = { - widgetId: widgets.bank.pinSettingsWidget.widgetId, - type: 'SCREEN', - closeOnWalk: true - }; + player.interfaceState.openWidget(widgets.bank.pinSettingsWidget.widgetId, { + slot: 'screen' + }); }; export const depositItem: itemAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { + if (!details.player.interfaceState.findWidget(widgets.bank.screenWidget.widgetId)) { return; } @@ -108,9 +106,7 @@ export const depositItem: itemAction = (details) => { export const withdrawItem: itemAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || - !(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) || - !(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) { + if (!details.player.interfaceState.findWidget(widgets.bank.screenWidget.widgetId)) { return; } // Check if the player has the item diff --git a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts index 745a8b6a0..6a048af3f 100644 --- a/src/plugins/quests/goblin-diplomacy-tutorial/index.ts +++ b/src/plugins/quests/goblin-diplomacy-tutorial/index.ts @@ -15,6 +15,7 @@ import { Subject } from 'rxjs'; import { dialogue } from '@server/world/actor/dialogue'; import { take } from 'rxjs/operators'; import { equipAction } from '@server/world/action/equip-action'; +import { buttonAction } from '@server/world/action/button-action'; export const tutorialTabWidgetOrder = [ @@ -106,11 +107,17 @@ export const startTutorial = async (player: Player): Promise => { player.inventory.add('rs:coins'); player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory); - await player.openInteractiveWidget({ - widgetId: widgets.characterDesign, - type: 'SCREEN', - disablePlayerMovement: true - }).toPromise(); + await dialogue([ player ], [ + titled => [ `Getting Started`, `\nCreate your character!` ] + ], { + permanent: true + }); + + player.interfaceState.openWidget(widgets.characterDesign, { + slot: 'screen' + }); + + await player.interfaceState.widgetClosed('screen'); }; export async function spawnGoblinBoi(player: Player, spawnPoint: 'beginning' | 'end'): Promise { @@ -208,6 +215,10 @@ const trainingSwordEquipAction: equipAction = async ({ player, itemDetails }) => } }; +const createCharacterAction: buttonAction = ({ player }): void => { + player.interfaceState.closeAllSlots(); +}; + export default [ { type: 'player_init', @@ -232,5 +243,10 @@ export default [ equipType: 'EQUIP', action: trainingSwordEquipAction, itemIds: [ 9703, 9704 ] + }, + { + type: 'button', + widgetId: widgets.characterDesign, + action: createCharacterAction } ]; diff --git a/src/plugins/quests/goblin-diplomacy-tutorial/stage-handler.ts b/src/plugins/quests/goblin-diplomacy-tutorial/stage-handler.ts index f22544d35..8c54ad54c 100644 --- a/src/plugins/quests/goblin-diplomacy-tutorial/stage-handler.ts +++ b/src/plugins/quests/goblin-diplomacy-tutorial/stage-handler.ts @@ -1,14 +1,11 @@ import { Player, Tabs } from '@server/world/actor/player/player'; import { dialogue } from '@server/world/actor/dialogue'; -import { Subject } from 'rxjs'; -import { take } from 'rxjs/operators'; import { handleTutorial, npcHint, showTabWidgetHint, spawnGoblinBoi, startTutorial, unlockAvailableTabs } from '@server/plugins/quests/goblin-diplomacy-tutorial/index'; -import { Position } from '@server/world/position'; import { schedule } from '@server/task/task'; import { world } from '@server/game-server'; import { findNpc } from '@server/config'; @@ -42,13 +39,11 @@ export const goblinDiplomacyStageHandler: { [key: number]: (player: Player) => v unlockAvailableTabs(player, 1); - if(!player.activeWidget) { - dialogue([ player ], [ - titled => [ `Getting Started`, `\nSpeak with the Guide to continue.` ] - ], { - permanent: true - }); - } + dialogue([ player ], [ + titled => [ `Getting Started`, `\nSpeak with the Guide to continue.` ] + ], { + permanent: true + }); }, 20: player => { showTabWidgetHint(player, Tabs.friends, 2, 25, @@ -71,13 +66,11 @@ export const goblinDiplomacyStageHandler: { [key: number]: (player: Player) => v unlockAvailableTabs(player, 4); - if(!player.activeWidget) { - dialogue([ player ], [ - titled => [ `Continue`, `\nSpeak with the Guide to continue.` ] - ], { - permanent: true - }); - } + dialogue([ player ], [ + titled => [ `Continue`, `\nSpeak with the Guide to continue.` ] + ], { + permanent: true + }); }, 40: player => { showTabWidgetHint(player, Tabs.music, 5, 45, @@ -89,26 +82,22 @@ export const goblinDiplomacyStageHandler: { [key: number]: (player: Player) => v npcHint(player, 'rs:runescape_guide'); unlockAvailableTabs(player, 5); - if(!player.activeWidget) { - dialogue([ player ], [ - titled => [ `Continue`, `\nSpeak with the Guide to continue.` ] - ], { - permanent: true - }); - } + dialogue([ player ], [ + titled => [ `Continue`, `\nSpeak with the Guide to continue.` ] + ], { + permanent: true + }); }, 50: player => { player.metadata.blockObjectInteractions = false; npcHint(player, 'rs:melee_combat_tutor'); unlockAvailableTabs(player, 5); - if(!player.activeWidget) { - dialogue([ player ], [ - titled => [ `Continue`, `\nSpeak with the Melee Combat Tutor to continue.` ] - ], { - permanent: true - }); - } + dialogue([ player ], [ + titled => [ `Continue`, `\nSpeak with the Melee Combat Tutor to continue.` ] + ], { + permanent: true + }); }, 55: player => { showTabWidgetHint(player, Tabs.inventory, 6, 60, diff --git a/src/plugins/skills/crafting/spinning-wheel-plugin.ts b/src/plugins/skills/crafting/spinning-wheel-plugin.ts index 5eaf60014..646e0837d 100644 --- a/src/plugins/skills/crafting/spinning-wheel-plugin.ts +++ b/src/plugins/skills/crafting/spinning-wheel-plugin.ts @@ -72,11 +72,9 @@ const widgetButtonIds: Map = new Map { - details.player.activeWidget = { - widgetId: widgets.whatWouldYouLikeToSpin, - type: 'SCREEN', - closeOnWalk: true - }; + details.player.interfaceState.openWidget(widgets.whatWouldYouLikeToSpin, { + slot: 'screen' + }); }; const spinProduct: any = (details: ButtonActionData, spinnable: Spinnable, count: number) => { @@ -139,13 +137,13 @@ const spinProduct: any = (details: ButtonActionData, spinnable: Spinnable, count export const buttonClicked: buttonAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === 459)) { + if (!details.player.interfaceState.findWidget(459)) { return; } const product = widgetButtonIds.get(details.buttonId); // Close the widget as it is no longer needed - details.player.closeActiveWidgets(); + details.player.interfaceState.closeAllSlots(); if (!details.player.skills.hasLevel(Skill.CRAFTING, product.spinnable.requiredLevel)) { details.player.sendMessage(`You need a crafting level of ${product.spinnable.requiredLevel} to craft ${cache.itemDefinitions.get(product.spinnable.output).name.toLowerCase()}.`, true); diff --git a/src/plugins/skills/level-up-dialogue-plugin.ts b/src/plugins/skills/level-up-dialogue-plugin.ts index aa499fdcc..4ddae86e6 100644 --- a/src/plugins/skills/level-up-dialogue-plugin.ts +++ b/src/plugins/skills/level-up-dialogue-plugin.ts @@ -17,7 +17,7 @@ const widgetIds = [ */ export const action: widgetAction = (details) => { const { player } = details; - player.closeActiveWidgets(); + player.interfaceState.closeChatOverlayWidget(); }; export default { type: 'widget_action', widgetIds, action, cancelActions: false }; diff --git a/src/plugins/skills/smithing/smelting-plugin.ts b/src/plugins/skills/smithing/smelting-plugin.ts index 66266c565..e238d399e 100644 --- a/src/plugins/skills/smithing/smelting-plugin.ts +++ b/src/plugins/skills/smithing/smelting-plugin.ts @@ -109,11 +109,9 @@ const RUNEITE : Bar = { }; export const openSmeltingInterface: objectAction = (details) => { - details.player.activeWidget = { - widgetId: widgets.furnace.widgetId, - type: 'CHAT', - closeOnWalk: true - }; + details.player.interfaceState.openWidget(widgets.furnace.widgetId, { + slot: 'chatbox' + }) loadSmeltingInterface(details); }; @@ -259,13 +257,13 @@ const smeltProduct = (details: ButtonActionData, bar: Bar, count: number) => { export const buttonClicked : buttonAction = (details) => { // Check if player might be spawning widget clientside - if (!details.player.activeWidget || !(details.player.activeWidget.widgetId === widgets.furnace.widgetId)) { + if (!details.player.interfaceState.findWidget(widgets.furnace.widgetId)) { return; } const product = widgetButtonIds.get(details.buttonId); - details.player.closeActiveWidgets(); + details.player.interfaceState.closeAllSlots(); if (!product.takesInput) { smeltProduct(details, product.bar, product.count); @@ -288,7 +286,7 @@ export const buttonClicked : buttonAction = (details) => { export default [ { type: 'object_action', - objectIds: [objectIds.furnace], + objectIds: [objectIds.furnace, 11666], options: ['smelt'], walkTo: true, action: openSmeltingInterface diff --git a/src/world/actor/dialogue.ts b/src/world/actor/dialogue.ts index 46f414eef..e812f7b03 100644 --- a/src/world/actor/dialogue.ts +++ b/src/world/actor/dialogue.ts @@ -519,34 +519,30 @@ async function runDialogueAction(player: Player, dialogueAction: string | Dialog } if(tag === undefined && widgetId) { - let closeOnWalk = true; - if(additionalOptions && additionalOptions.closeOnWalk !== undefined) { - closeOnWalk = additionalOptions.closeOnWalk; - } - const permanent = additionalOptions?.permanent || false; - player.interfaceState.openWidget(widgetId, { - slot: 'chatbox', - multi: true - }); - - const dialogueChoice = await Promise.race([ lastValueFrom(player.dialogueInteractionEvent.pipe(take(1))), - lastValueFrom(player.interfaceState.closed.pipe(take(1))) ]); + if(permanent) { + player.interfaceState.openChatOverlayWidget(widgetId); + } else { + player.interfaceState.openWidget(widgetId, { + slot: 'chatbox', + multi: false + }); - console.log(dialogueChoice); + const widgetClosedEvent = await player.interfaceState.widgetClosed('chatbox'); - if(dialogueChoice === undefined) { - throw new Error('Dialogue Cancelled'); - } + if(widgetClosedEvent.data === undefined) { + throw new Error('Dialogue Cancelled.'); + } - if(isOptions && typeof dialogueChoice === 'number') { - const optionsAction = dialogueAction as OptionsDialogueAction; - const options = Object.keys(optionsAction.options); - const trees = options.map(option => optionsAction.options[option]); - const tree: ParsedDialogueTree = trees[dialogueChoice - 1]; - if(tree && tree.length !== 0) { - await runParsedDialogue(player, tree, tag, additionalOptions); + if(isOptions && typeof widgetClosedEvent.data === 'number') { + const optionsAction = dialogueAction as OptionsDialogueAction; + const options = Object.keys(optionsAction.options); + const trees = options.map(option => optionsAction.options[option]); + const tree: ParsedDialogueTree = trees[widgetClosedEvent.data - 1]; + if(tree && tree.length !== 0) { + await runParsedDialogue(player, tree, tag, additionalOptions); + } } } } @@ -557,7 +553,6 @@ async function runDialogueAction(player: Player, dialogueAction: string | Dialog async function runParsedDialogue(player: Player, dialogueTree: ParsedDialogueTree, tag?: string, additionalOptions?: AdditionalOptions): Promise { for(let i = 0; i < dialogueTree.length; i++) { tag = await runDialogueAction(player, dialogueTree[i], tag, additionalOptions); - player.interfaceState.closeWidget('chatbox'); } return tag === undefined; @@ -585,7 +580,6 @@ export async function dialogue(participants: (Player | NpcParticipant)[], dialog runParsedDialogue(player, parsedDialogueTree, undefined, additionalOptions).then(() => { resolve(); }).catch(error => { - player.interfaceState.closeWidget('chatbox'); reject(error); }); }); @@ -593,8 +587,10 @@ export async function dialogue(participants: (Player | NpcParticipant)[], dialog try { await run(); + player.interfaceState.closeAllSlots(); return true; } catch(error) { + player.interfaceState.closeAllSlots(); logger.warn(`Dialogue cancelled.`); return false; } diff --git a/src/world/actor/player/dialogue-action.ts b/src/world/actor/player/dialogue-action.ts index 564fd4058..c4833c78b 100644 --- a/src/world/actor/player/dialogue-action.ts +++ b/src/world/actor/player/dialogue-action.ts @@ -137,12 +137,9 @@ export class DialogueAction { } return new Promise((resolve, reject) => { - this.p.activeWidget = { - widgetId: widgetId, - type: 'CHAT', - closeOnWalk: true, - forceClosed: () => reject(new WidgetsClosedWarning()) - }; + this.p.interfaceState.openWidget(widgetId, { + slot: 'chatbox' + }) const sub = this.p.dialogueInteractionEvent.subscribe(action => { sub.unsubscribe(); diff --git a/src/world/actor/player/interface-state.ts b/src/world/actor/player/interface-state.ts index 17ae8a2fe..869fdca76 100644 --- a/src/world/actor/player/interface-state.ts +++ b/src/world/actor/player/interface-state.ts @@ -1,6 +1,7 @@ import { Player } from '@server/world/actor/player/player'; import { ItemContainer } from '@server/world/items/item-container'; import { Subject, lastValueFrom } from 'rxjs'; +import { filter, take } from 'rxjs/operators'; export type TabType = 'combat' | 'skills' | 'quests' | 'inventory' | 'equipment' | 'prayers' | @@ -57,6 +58,11 @@ export class Widget { } +interface WidgetClosedEvent { + widget: Widget; + data?: number; +} + /** * Control's a Player's Game Interface state. */ @@ -64,9 +70,10 @@ export class InterfaceState { public readonly tabs: { [key: string]: Widget | null }; public readonly widgetSlots: { [key: string]: Widget | null }; - public readonly closed: Subject = new Subject(); + public readonly closed: Subject = new Subject(); private readonly player: Player; private _screenOverlayWidget: number | null; + private _chatOverlayWidget: number | null; public constructor(player: Player) { this.tabs = { @@ -87,11 +94,22 @@ export class InterfaceState { this.widgetSlots = {}; this._screenOverlayWidget = null; + this._chatOverlayWidget = null; this.clearSlots(); this.player = player; } + public openChatOverlayWidget(widgetId: number): void { + this._chatOverlayWidget = widgetId; + this.player.outgoingPackets.showChatDialogue(widgetId); + } + + public closeChatOverlayWidget(): void { + this._chatOverlayWidget = null; + this.player.outgoingPackets.showChatDialogue(-1); + } + public openScreenOverlayWidget(widgetId: number): void { this._screenOverlayWidget = widgetId; this.player.outgoingPackets.showScreenOverlayWidget(widgetId); @@ -102,27 +120,33 @@ export class InterfaceState { this.player.outgoingPackets.showScreenOverlayWidget(-1); } - public async widgetClosed(slot: GameInterfaceSlot): Promise { - const widget = this.widgetSlots[slot]; - if(!widget) { - return null; - } - - return await lastValueFrom(this.closed.asObservable()); + public async widgetClosed(slot: GameInterfaceSlot): Promise { + return await lastValueFrom(this.closed.pipe( + filter(event => event.widget.slot === slot)).pipe(take(1))); } - public closeWidget(slot: GameInterfaceSlot): void { - const widget = this.widgetSlots[slot]; + public closeWidget(widgetId: number, data?: number): void; + public closeWidget(slot: GameInterfaceSlot, data?: number): void; + public closeWidget(i: GameInterfaceSlot | number, data?: number): void { + let widget: Widget | null; + + if(typeof i === 'number') { + widget = this.findWidget(i); + } else { + widget = this.widgetSlots[i] || null; + } + if(!widget) { return; } - this.closed.next(widget); - this.widgetSlots[slot] = null; + this.closed.next({ widget, data }); + this.widgetSlots[widget.slot] = null; } public openWidget(widgetId: number, options: WidgetOptions): void { if(this.widgetOpen(options.slot, widgetId)) { + console.log('already open'); return; } @@ -168,17 +192,33 @@ export class InterfaceState { return this.tabs[type] || null; } - public widgetOpen(slot: GameInterfaceSlot, widgetId: number): boolean { - return this.getWidget(slot)?.widgetId === widgetId; + public findWidget(widgetId: number): Widget | null { + const slots: GameInterfaceSlot[] = Object.keys(this.widgetSlots) as GameInterfaceSlot[]; + let widget: Widget; + slots.forEach(slot => { + if(this.widgetSlots[slot]?.widgetId === widgetId) { + widget = this.widgetSlots[slot]; + } + }); + return widget || null; + } + + public widgetOpen(slot: GameInterfaceSlot, widgetId?: number): boolean { + if(widgetId === undefined) { + return this.getWidget(slot) !== null; + } else { + return this.getWidget(slot)?.widgetId === widgetId; + } } public getWidget(slot: GameInterfaceSlot): Widget | null { return this.widgetSlots[slot] || null; } - public closeAll(): void { + public closeAllSlots(): void { const slots: GameInterfaceSlot[] = Object.keys(this.widgetSlots) as GameInterfaceSlot[]; slots.forEach(slot => this.closeWidget(slot)); + this.player.outgoingPackets.closeActiveWidgets(); } private showWidget(widget: Widget): void { diff --git a/src/world/actor/player/player.ts b/src/world/actor/player/player.ts index 066a631c1..68b965a40 100644 --- a/src/world/actor/player/player.ts +++ b/src/world/actor/player/player.ts @@ -131,7 +131,6 @@ export class Player extends Actor { private _lastAddress: string; private firstTimePlayer: boolean; private _appearance: Appearance; - private _activeWidget: PlayerWidget; private queuedWidgets: PlayerWidget[]; private _bonuses: { offensive: OffensiveBonuses, defensive: DefensiveBonuses, skill: SkillBonuses }; private _carryWeight: number; @@ -157,7 +156,6 @@ export class Player extends Actor { this.npcUpdateTask = new NpcSyncTask(this); this.trackedPlayers = []; this.trackedNpcs = []; - this._activeWidget = null; this.queuedWidgets = []; this._carryWeight = 0; this._equipment = new ItemContainer(14); @@ -237,6 +235,22 @@ export class Player extends Actor { this.inventory.containerUpdated.subscribe(event => this.inventoryUpdated(event)); + this.actionsCancelled.subscribe(type => { + let closeWidget: boolean; + + if(type === 'manual-movement' || type === 'pathing-movement') { + closeWidget = true; + } else if(type === 'keep-widgets-open' || type === 'button' || type === 'widget') { + closeWidget = false; + } else { + closeWidget = true; + } + + if(closeWidget) { + this.interfaceState.closeAllSlots(); + } + }); + this._loginDate = new Date(); this._lastAddress = (this._socket?.address() as AddressInfo)?.address || '127.0.0.1'; diff --git a/src/world/actor/walking-queue.ts b/src/world/actor/walking-queue.ts index 27d2d308c..77106c59d 100644 --- a/src/world/actor/walking-queue.ts +++ b/src/world/actor/walking-queue.ts @@ -136,14 +136,11 @@ export class WalkingQueue { if(this.actor instanceof Player) { this.actor.actionsCancelled.next('pathing-movement'); - - const activeWidget = this.actor.activeWidget; - if(activeWidget && (!walkPosition.metadata || !walkPosition.metadata.ignoreWidgets)) { - if(activeWidget.disablePlayerMovement) { - this.resetDirections(); - return; - } - } + // if(activeWidget.disablePlayerMovement) { + // this.resetDirections(); + // return; + // } + //this.actor.interfaceState.closeAllSlots(); } if(this.actor.metadata['faceActorClearedByWalking'] === undefined || this.actor.metadata['faceActorClearedByWalking']) { diff --git a/src/world/index.ts b/src/world/index.ts index e8ffa8176..b8fb03095 100644 --- a/src/world/index.ts +++ b/src/world/index.ts @@ -288,7 +288,7 @@ export class World { for(let i = 0; i < 1000; i++) { const player = new Player(null, null, null, i, `test${i}`, 'abs', true); this.registerPlayer(player); - player.activeWidget = null; + player.interfaceState.closeAllSlots(); xOffset++; From 6f44f9e419ca2142d31b4ec3a883fd0b9a6a49a7 Mon Sep 17 00:00:00 2001 From: Tynarus Date: Sun, 6 Dec 2020 13:53:23 -0600 Subject: [PATCH 12/12] Fixing lint error --- src/plugins/quests/quest-journal-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/quests/quest-journal-plugin.ts b/src/plugins/quests/quest-journal-plugin.ts index 48cfdb5f0..3c399d5b1 100644 --- a/src/plugins/quests/quest-journal-plugin.ts +++ b/src/plugins/quests/quest-journal-plugin.ts @@ -15,7 +15,7 @@ export const action: buttonAction = (details) => { (playerQuest) => playerQuest.questId === quest.questTabId ); - let playerStage = "NOT_STARTED"; + let playerStage = 'NOT_STARTED'; if (playerQuest && playerQuest.stage) { playerStage = playerQuest.stage; }