From 34622cc0b916490c21bb883d38ac04e79e89cf20 Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Mon, 10 Apr 2023 16:02:10 +0200 Subject: [PATCH 1/8] added price estimation to the recipe --- .gitignore | 3 + packages/renderer/src/mods/index.ts | 2 + .../renderer/src/mods/recipe-price/index.ts | 1 + .../src/mods/recipe-price/recipe-price.ts | 76 +++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 packages/renderer/src/mods/recipe-price/index.ts create mode 100644 packages/renderer/src/mods/recipe-price/recipe-price.ts diff --git a/.gitignore b/.gitignore index 8eeb6294..04053e0e 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,6 @@ release dist-ssr *.local .vscode/settings.json + +# Webstorm +.idea \ No newline at end of file diff --git a/packages/renderer/src/mods/index.ts b/packages/renderer/src/mods/index.ts index 46d2babc..48233ce2 100644 --- a/packages/renderer/src/mods/index.ts +++ b/packages/renderer/src/mods/index.ts @@ -15,6 +15,7 @@ import { ShortcutsMod } from './shortcuts' import { ShowResourcesMod } from './show-resources' import { VerticalTimelineMod } from './vertical-timeline' import { ZaapSearchFilterMod } from './zaap-search-filter' +import { RecipePrice } from './recipe-price' export * from './shortcuts' export * from './notifications' @@ -46,5 +47,6 @@ export const MODS = [ RuneListerMod, ShowResourcesMod, ZaapSearchFilterMod, + RecipePrice, ...GENERAL_MODS ] as const diff --git a/packages/renderer/src/mods/recipe-price/index.ts b/packages/renderer/src/mods/recipe-price/index.ts new file mode 100644 index 00000000..2aa230d2 --- /dev/null +++ b/packages/renderer/src/mods/recipe-price/index.ts @@ -0,0 +1 @@ +export * from './recipe-price' diff --git a/packages/renderer/src/mods/recipe-price/recipe-price.ts b/packages/renderer/src/mods/recipe-price/recipe-price.ts new file mode 100644 index 00000000..a55b5bdd --- /dev/null +++ b/packages/renderer/src/mods/recipe-price/recipe-price.ts @@ -0,0 +1,76 @@ +/* eslint-disable prefer-rest-params */ +import { Mod } from '@/mods/mod' +import { DofusWindow } from '@/dofus-window' +import { RootStore } from '@/store' +import { TranslationFunctions } from '@lindo/i18n' + +export class RecipePrice extends Mod { + constructor(wGame: DofusWindow, rootStore: RootStore, LL: TranslationFunctions) { + super(wGame, rootStore, LL) + window.lindoAPI.logger.info('- enable Recipe Prices helper')() + const itemRecipes = this.getWindowById('itemRecipes') + this.hookFunction(itemRecipes, '_displayItem', () => { + setTimeout(() => { + const itemRecipes = this.getWindowById('itemRecipes') as any + const singleton = this.wGame.findSingleton('getAveragePrice', this.wGame) as any + const func = singleton.exports.getAveragePrice + const recipe = itemRecipes?.recipeBox?.rawRecipe + const slots = itemRecipes?.itemBox?.item?.recipeSlots + let res = 0 + let resCost = func(itemRecipes?.recipeBox?.rawRecipe?.resultId) + for (let i = recipe?.ingredientIds?.length - 1; i >= 0; i--) { + const id = recipe.ingredientIds[i] + const cost = func(id) + const quantity = recipe.quantities[i] + if (cost >= 0) res += cost * quantity + } + if (slots === 0) { + res = 0 + resCost = 0 + } + this.injectCost(res, resCost) + }, 100) + }) + } + + destroy(): void { + console.log('destroyed') + } + + private getKamaDiv() { + return "
" + } + + private injectCost(cost: number, resultCost: number) { + const el = this.wGame.document.querySelector('.itemRecipeBox .title') + if (!el) { + throw new Error('') + } + let text = el.innerHTML + const ind = text.indexOf('= 0) text = el.innerHTML.substring(0, ind) + if (cost > 0) + el.innerHTML = `${text} [${cost}]${this.getKamaDiv()} - [${resultCost}]${this.getKamaDiv()}` + else el.innerHTML = text + } + + private hookFunction(object: any, functionName: string, callback: any) { + ;(function(originalFunction) { + object[functionName] = function() { + const returnValue = originalFunction.apply(this, arguments) + callback.apply(this, [returnValue, originalFunction, arguments]) + return returnValue + } + })(object[functionName]) + } + + private getWindowById(id: string) { + const window = this.wGame.gui.windowsContainer.getChildren().find((e) => e.id === id) + if (!window) { + throw new Error(`Can't find the window id ${id}`) + } + return window + } +} From 4f65c87576c1bc90ecdb5ca74c1f19763da3d1b3 Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Mon, 10 Apr 2023 16:19:12 +0200 Subject: [PATCH 2/8] fixed linting problems --- packages/renderer/src/mods/recipe-price/recipe-price.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/renderer/src/mods/recipe-price/recipe-price.ts b/packages/renderer/src/mods/recipe-price/recipe-price.ts index a55b5bdd..b75163dc 100644 --- a/packages/renderer/src/mods/recipe-price/recipe-price.ts +++ b/packages/renderer/src/mods/recipe-price/recipe-price.ts @@ -57,8 +57,8 @@ export class RecipePrice extends Mod { } private hookFunction(object: any, functionName: string, callback: any) { - ;(function(originalFunction) { - object[functionName] = function() { + ;(function (originalFunction) { + object[functionName] = function () { const returnValue = originalFunction.apply(this, arguments) callback.apply(this, [returnValue, originalFunction, arguments]) return returnValue From eb0ec40331c525aa33a5e96c8302f9399fbdd3a8 Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Wed, 19 Apr 2023 19:20:42 +0200 Subject: [PATCH 3/8] added monster spells book --- packages/renderer/src/mods/index.ts | 2 + .../src/mods/ofensive monsters/index.ts | 1 + .../ofensive monsters/offensive-monsters.ts | 256 ++++++++++++++++++ .../main-screen/game-screen/GameScreen.tsx | 2 +- 4 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 packages/renderer/src/mods/ofensive monsters/index.ts create mode 100644 packages/renderer/src/mods/ofensive monsters/offensive-monsters.ts diff --git a/packages/renderer/src/mods/index.ts b/packages/renderer/src/mods/index.ts index 48233ce2..e69c6615 100644 --- a/packages/renderer/src/mods/index.ts +++ b/packages/renderer/src/mods/index.ts @@ -16,6 +16,7 @@ import { ShowResourcesMod } from './show-resources' import { VerticalTimelineMod } from './vertical-timeline' import { ZaapSearchFilterMod } from './zaap-search-filter' import { RecipePrice } from './recipe-price' +import { OffensiveMonsters } from '@/mods/ofensive monsters' export * from './shortcuts' export * from './notifications' @@ -48,5 +49,6 @@ export const MODS = [ ShowResourcesMod, ZaapSearchFilterMod, RecipePrice, + OffensiveMonsters, ...GENERAL_MODS ] as const diff --git a/packages/renderer/src/mods/ofensive monsters/index.ts b/packages/renderer/src/mods/ofensive monsters/index.ts new file mode 100644 index 00000000..cd1d608a --- /dev/null +++ b/packages/renderer/src/mods/ofensive monsters/index.ts @@ -0,0 +1 @@ +export * from './offensive-monsters' diff --git a/packages/renderer/src/mods/ofensive monsters/offensive-monsters.ts b/packages/renderer/src/mods/ofensive monsters/offensive-monsters.ts new file mode 100644 index 00000000..61acd443 --- /dev/null +++ b/packages/renderer/src/mods/ofensive monsters/offensive-monsters.ts @@ -0,0 +1,256 @@ +/* eslint-disable */ +import { Mod } from '@/mods/mod' +import { DofusWindow } from '@/dofus-window' +import { RootStore } from '@/store' +import { TranslationFunctions } from '@lindo/i18n' +//Thanks Moune +export class OffensiveMonsters extends Mod { + private manager: any + private grimoireWindow: any + private oldAddMonster: any + private damageInfo: any + private spellWindow: any + private mobSpells: any + + constructor(wGame: DofusWindow, rootStore: RootStore, LL: TranslationFunctions) { + super(wGame, rootStore, LL) + window.lindoAPI.logger.info('- enable Offensive Monsters')() + this.manager = this.findSingleton('getWindow') as any + this.grimoireWindow = this.manager.getWindow('grimoire') + setTimeout(() => { + + this.initSpellUi() + + this.initWindow() + + this.injectButton() + }, 300) + } + + findSingleton(singleton: string): any { + const ret = this.wGame.findSingleton(singleton, this.wGame) as any + if (Array.isArray(ret)) + return ret + return ret?.exports + } + + destroy(): void { + + if (this.oldAddMonster) { + const x = (this.findSingleton('addMonster') as any) + x.prototype.addMonster = this.oldAddMonster + this.oldAddMonster = null + } + } + + initWindow() { + this.createWindow('mouneSpellMobs', 'Hechizos del monstruo') + this.spellWindow = this.manager.getWindow('mouneSpellMobs') + this.damageInfo = this.spellWindow.windowBody.createChild('div') + this.damageInfo.setText('Dommages x nani') + this.damageInfo.rootElement.style.cssText = ` + text-align: center; + margin-bottom: 10px; + color: navajowhite; + font-size: 20px; + ` + this.spellWindow.windowBody.appendChild(this.mobSpells) + } + + initSpellUi() { + const constr = this.findSingleton('_loadAllSpells') as any + // eslint-disable-next-line new-cap + this.mobSpells = new constr() + this.mobSpells.emit('open') + this.mobSpells.emit('opened') + this.mobSpells._spellsStatus = {} + this.mobSpells._spellCache = {} + this.mobSpells.spells = {} + const r = (this.findSingleton('createSpells') as any[])[1].exports.prototype + this.mobSpells._loadAllSpells = constr.prototype._loadAllSpells.bind(this.mobSpells) + + this.mobSpells._createSpells = r.createSpells.bind(this.mobSpells) + this.mobSpells.addSpells = (this.findSingleton('addSpells') as any).prototype.addSpells.bind( + this.mobSpells + ) + } + + addSpells(ids: any) { + this.mobSpells._createSpells(ids, () => { + const w = (this.findSingleton('getWindow') as any) + w.switch('mouneSpellMobs') + this.mobSpells._loadAllSpells(this.mobSpells._spellCache) + }) + } + + finishSpells(ids: any) { + this.mobSpells._spellCache = {} + this.addSpells(ids) + } + + injectButton() { + function n(e: any, t: any, i: any) { + ;(void 0 === i.min[e] || i.min[e] > t[e]) && (i.min[e] = t[e]), + (void 0 === i.max[e] || i.max[e] < t[e]) && (i.max[e] = t[e]) + } + + function o(e: any) { + for (var t: any = { + min: {}, + max: {} + }, + i = [ + 'level', + 'lifePoints', + 'actionPoints', + 'movementPoints', + 'earthResistance', + 'airResistance', + 'fireResistance', + 'waterResistance', + 'neutralResistance' + ], + o = i.length, + s = 0, + a = e.length; + s < a; + s += 1 + ) + for (let r = e[s], l = 0; l < o; l += 1) { + const c = i[l] + n(c, r, t) + } + return t + } + + const module = this + const buttonCreator = this.findSingleton('DofusButton') as any + const m = (this.findSingleton('getWuiName') as any)[2].exports + const b = (this.findSingleton('getText') as any)[0].exports.getText + const y = this.findSingleton('createMapLocation') as any + this.oldAddMonster = (this.findSingleton('addMonster') as any).prototype.addMonster + ;(this.findSingleton('addMonster') as any).prototype.addMonster = function(e: any, t: any) { + // eslint-disable-next-line new-cap + const i = new m('div', { + className: 'infos' + }) + const n = i.createChild('div', { + className: 'gfx' + }) + n.setStyle('backgroundImage', t) + const s = i.createChild('div', { + className: 'infosGroupRight' + }) + const a = s.createChild('div', { + className: 'cf' + }) + const r = ['name'] + e.isBoss && r.push('boss'), e.isMiniBoss && r.push('miniBoss'), e.isQuestMonster && r.push('questMonster') + const l = true + let c = e.nameId + // eslint-disable-next-line no-unused-expressions + l && (c += ' (' + e.id + ')'), + a.createChild('div', { + className: r, + text: c + }) + const u = o(e.grades) + const d = u.min.level + const h = u.max.level + let p = b('ui.common.short.level') + ' ' + d + // eslint-disable-next-line no-unused-expressions + d !== h && (p += ' ' + b('ui.chat.to') + ' ' + h), + a.createChild('div', { + className: 'level', + text: p + }) + + s.appendChild(y.createMapLocation(e.subareas, this.subAreas, e.favoriteSubareaId)) + const f = this.monsterList.addItem( + { + id: e.id, + element: i, + data: e + }, + { + noRefresh: !0 + } + ) + // eslint-disable-next-line new-cap + const spellButton = new buttonCreator({ + tooltip: 'Ver hechizos de los monstruos', + addIcon: true + }) + spellButton.rootElement.style.cssText = ` + pointer: cursor; + background-image: url(../game/assets/ui/banner/menuIconSpell.png); + background-size: contain; + background-repeat: no-repeat; + width: 30px; + height: 30px; + display: flex; + flex-direction: row; + ` + f.addClassNames('monster'), + (f.monsterData = e), + (f.gradeMinMaxInfo = u), + s._childrenList[1].insertChildBefore(spellButton, s._childrenList[1]._childrenList[1]) + spellButton.on('tap', () => { + const minWisdom = 1 + e.grades[0].wisdom / 100 + const len = e.grades.length + const maxWisdom = 1 + e.grades[len - 1].wisdom / 100 + if (minWisdom == maxWisdom) { + module.damageInfo.setText(`Daños x ${minWisdom}`) + } else { + module.damageInfo.setText(`Daños x ${minWisdom} a x ${maxWisdom}`) + } + module.mobSpells.spells = {} + module.finishSpells(e.spells) + }) + } + } + + createWindow(id: any, name: any) { + const windowMaker = (this.findSingleton('startWaitingForContent') as any[])[0].exports + const superClass = (this.findSingleton('inherits') as any)[0].exports.inherits + + function myWindow(this: any) { + windowMaker.call(this, { + className: id, + title: name, + plusButton: true, + minusButton: true, + positionInfo: { + left: 'c', + top: 'c', + width: '60%', + height: '70%', + isDefault: true + } + }) + this.status = { + lastOpenCoords: {}, + lastWindowInfo: { + x: null, + y: null, + w: null, + h: null + }, + initialSizeAndPosition: { + left: 'c', + bottom: '3%', + width: '50%', + height: '90%' + } + } + this.plusButton.hide() + this.minusButton.hide() + } + + + superClass(myWindow, windowMaker) + + // @ts-ignore + this.manager.addWindow(id, new myWindow) + } +} diff --git a/packages/renderer/src/screens/main-screen/game-screen/GameScreen.tsx b/packages/renderer/src/screens/main-screen/game-screen/GameScreen.tsx index a3cb5dac..674b377c 100644 --- a/packages/renderer/src/screens/main-screen/game-screen/GameScreen.tsx +++ b/packages/renderer/src/screens/main-screen/game-screen/GameScreen.tsx @@ -54,7 +54,7 @@ export const GameScreen = memo(({ game }: GameScreenProps) => { }) if (results.length > 1) { - window.lindoAPI.logger.error( + window.lindoAPI?.logger?.error( `[MG] Singleton searcher found multiple results for key "${searchKey}". Returning all of them.` )() return results From ba9403828381b294cf2ac571ee050ca5b6e094cc Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Thu, 20 Apr 2023 15:27:55 +0200 Subject: [PATCH 4/8] zaap search fixed --- .../zaap-search-filter/zaap-search-filter.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts b/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts index 8f59dcae..2cb51523 100644 --- a/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts +++ b/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts @@ -77,7 +77,7 @@ export class ZaapSearchFilterMod extends Mod { currentZaap.style.display = 'none' if (currentZaap.innerText.toLowerCase().includes(zaapWanted)) { - currentZaap.style.display = 'block' + currentZaap.style.display = '' } } }) @@ -156,11 +156,11 @@ export class ZaapSearchFilterMod extends Mod { if (unfav !== 0) { favorites.splice(unfav, 1) divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` favorites.push(zaap) } @@ -183,11 +183,11 @@ export class ZaapSearchFilterMod extends Mod { if (found) { divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` } @@ -321,11 +321,11 @@ export class ZaapSearchFilterMod extends Mod { if (unfav !== 0) { favorites.splice(unfav, 1) divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` favorites.push(zaap) } @@ -348,11 +348,11 @@ export class ZaapSearchFilterMod extends Mod { if (found) { divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` } @@ -487,11 +487,11 @@ export class ZaapSearchFilterMod extends Mod { if (unfav !== 0) { favorites.splice(unfav, 1) divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` favorites.push(zaap) } @@ -514,11 +514,11 @@ export class ZaapSearchFilterMod extends Mod { if (found) { divButton.innerHTML = ` - + ` } else { divButton.innerHTML = ` - + ` } From 357eacf4ff5d70539cd2d1568dc370468fa0324c Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Thu, 20 Apr 2023 16:34:37 +0200 Subject: [PATCH 5/8] added debug messages for easy debugging --- .../debug message helper/debug messages.ts | 50 +++++++++++++++++++ .../src/mods/debug message helper/index.ts | 1 + packages/renderer/src/mods/index.ts | 2 + 3 files changed, 53 insertions(+) create mode 100644 packages/renderer/src/mods/debug message helper/debug messages.ts create mode 100644 packages/renderer/src/mods/debug message helper/index.ts diff --git a/packages/renderer/src/mods/debug message helper/debug messages.ts b/packages/renderer/src/mods/debug message helper/debug messages.ts new file mode 100644 index 00000000..f406fd36 --- /dev/null +++ b/packages/renderer/src/mods/debug message helper/debug messages.ts @@ -0,0 +1,50 @@ +import { Mod } from '@/mods/mod' +import { DofusWindow } from '@/dofus-window' +import { RootStore } from '@/store' +import { TranslationFunctions } from '@lindo/i18n' +import { EventManager } from '@/mods/helpers' + +export class DebugMessagesMod extends Mod { + private readonly eventManager = new EventManager() + + constructor(wGame: DofusWindow, rootStore: RootStore, LL: TranslationFunctions) { + super(wGame, rootStore, LL) + this.load() + console.log('- enabled debug messages') + } + + private load() { + this.eventManager.on(this.wGame.dofus.connectionManager, 'send', this.onSend) + this.eventManager.on(this.wGame.dofus.connectionManager, 'data', this.onReceive) + this.eventManager.on(this.wGame.dofus.connectionManager, 'messageSequence', this.onMsgSeq) + } + + onSend = (msg: any) => { + if (msg.call === 'sendMessage') { + console.debug('%c-> ' + msg.data.data.type, 'background-color: orange; color:black', msg.data.data.data) + } else { + console.debug('%c-> ' + msg.data.call, 'background-color: red; color:white', msg.data.data) + } + } + + onReceive = (msg: any) => { + const msgCopy = { ...msg } + const type = msg._messageType + delete msgCopy._messageType + console.debug('%c<- ' + type, 'background-color: green;color: white', msgCopy) + } + + onMsgSeq = (msg: any) => { + msg.sequence.forEach((s: any) => { + const msgCopy = { ...s } + delete msgCopy._messageType + console.debug('%cSEQ ' + s._messageType, 'background-color: yellow;color:black;', msgCopy) + }) + } + + destroy(): void { + this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'send', this.onSend) + this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'data', this.onReceive) + this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'messageSequence', this.onMsgSeq) + } +} diff --git a/packages/renderer/src/mods/debug message helper/index.ts b/packages/renderer/src/mods/debug message helper/index.ts new file mode 100644 index 00000000..eda927c7 --- /dev/null +++ b/packages/renderer/src/mods/debug message helper/index.ts @@ -0,0 +1 @@ +export * from './debug messages' diff --git a/packages/renderer/src/mods/index.ts b/packages/renderer/src/mods/index.ts index e69c6615..a182bffc 100644 --- a/packages/renderer/src/mods/index.ts +++ b/packages/renderer/src/mods/index.ts @@ -17,6 +17,7 @@ import { VerticalTimelineMod } from './vertical-timeline' import { ZaapSearchFilterMod } from './zaap-search-filter' import { RecipePrice } from './recipe-price' import { OffensiveMonsters } from '@/mods/ofensive monsters' +import { DebugMessagesMod } from '@/mods/debug message helper' export * from './shortcuts' export * from './notifications' @@ -50,5 +51,6 @@ export const MODS = [ ZaapSearchFilterMod, RecipePrice, OffensiveMonsters, + DebugMessagesMod, ...GENERAL_MODS ] as const From 85a4e7d10dc2aeab2ccfa62c21ed47716b7d176a Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Thu, 20 Apr 2023 16:52:53 +0200 Subject: [PATCH 6/8] fixed the other zaaps search filter --- .../src/mods/zaap-search-filter/zaap-search-filter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts b/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts index 2cb51523..4b608519 100644 --- a/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts +++ b/packages/renderer/src/mods/zaap-search-filter/zaap-search-filter.ts @@ -242,7 +242,7 @@ export class ZaapSearchFilterMod extends Mod { currentZaap.style.display = 'none' if (currentZaap.innerText.toLowerCase().includes(zaapWanted)) { - currentZaap.style.display = 'block' + currentZaap.style.display = '' } } }) @@ -407,7 +407,7 @@ export class ZaapSearchFilterMod extends Mod { currentZaap.style.display = 'none' if (currentZaap.innerText.toLowerCase().includes(zaapWanted)) { - currentZaap.style.display = 'block' + currentZaap.style.display = '' } } }) From 39fbb41e50a676d33ca5c20cb8dd8b68f936350b Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Thu, 20 Apr 2023 20:14:10 +0200 Subject: [PATCH 7/8] added option to toggle the debug logs, disabled by default --- packages/i18n/en/index.ts | 2 ++ packages/i18n/es/index.ts | 2 ++ packages/i18n/fr/index.ts | 2 ++ packages/i18n/i18n-types.ts | 16 ++++++++++ .../debug message helper/debug messages.ts | 29 ++++++++++++++++++- .../option-screen/general/OptionGeneral.tsx | 11 +++++++ .../window-option/window-option.ts | 10 +++++-- 7 files changed, 69 insertions(+), 3 deletions(-) diff --git a/packages/i18n/en/index.ts b/packages/i18n/en/index.ts index 3dfe31c5..4b7a463e 100644 --- a/packages/i18n/en/index.ts +++ b/packages/i18n/en/index.ts @@ -120,6 +120,8 @@ const en: BaseTranslation = { interface: 'Interface', sound: 'Sound', gameData: 'Game data', + debug: 'Debug', + activateDebugLogs: 'Activate the debug logs. Warning: this may worsen the performance', language: 'Language', resolution: 'Resolution', fullScreen: 'Full screen', diff --git a/packages/i18n/es/index.ts b/packages/i18n/es/index.ts index e3c60d78..5aef6536 100644 --- a/packages/i18n/es/index.ts +++ b/packages/i18n/es/index.ts @@ -121,6 +121,8 @@ const es: Translation = { interface: 'Interfaz', sound: 'Sonido', gameData: 'Datos del juego', + debug: 'Debug', + activateDebugLogs: 'Activa los logs de debug. Atencion: Esto puede empeorar el rendimiento', language: 'Lenguaje', resolution: 'Resolución', fullScreen: 'Pantalla completa', diff --git a/packages/i18n/fr/index.ts b/packages/i18n/fr/index.ts index d07fb2c3..21d03cd4 100644 --- a/packages/i18n/fr/index.ts +++ b/packages/i18n/fr/index.ts @@ -121,6 +121,8 @@ const fr: Translation = { interface: 'Interface', sound: 'Son', gameData: 'Données du jeu', + debug: 'Debug', + activateDebugLogs: 'Activer les journaux de débogage. Attention : Cela peut nuire à la performance du système.', language: 'Langue', resolution: 'Résolution', fullScreen: 'Activer le mode plein écran', diff --git a/packages/i18n/i18n-types.ts b/packages/i18n/i18n-types.ts index d34b5e31..4c3649e3 100644 --- a/packages/i18n/i18n-types.ts +++ b/packages/i18n/i18n-types.ts @@ -365,6 +365,14 @@ type RootTranslation = { * Game data */ gameData: string + /** + * Debug + */ + debug: string + /** + * Activate the debug logs. Warning: this may worsen the performance + */ + activateDebugLogs: string /** * Language */ @@ -1439,6 +1447,14 @@ export type TranslationFunctions = { * Game data */ gameData: () => LocalizedString + /** + * Debug + */ + debug: () => LocalizedString + /** + * Activate the debug logs. Warning: this may worsen the performance + */ + activateDebugLogs: () => LocalizedString /** * Language */ diff --git a/packages/renderer/src/mods/debug message helper/debug messages.ts b/packages/renderer/src/mods/debug message helper/debug messages.ts index f406fd36..2913314f 100644 --- a/packages/renderer/src/mods/debug message helper/debug messages.ts +++ b/packages/renderer/src/mods/debug message helper/debug messages.ts @@ -3,17 +3,36 @@ import { DofusWindow } from '@/dofus-window' import { RootStore } from '@/store' import { TranslationFunctions } from '@lindo/i18n' import { EventManager } from '@/mods/helpers' +import { IObjectDidChange, Lambda, observe } from 'mobx' + +interface ValueDidChange { + value: boolean + oldValue: boolean +} export class DebugMessagesMod extends Mod { private readonly eventManager = new EventManager() + private readonly _disposers: Array = [] constructor(wGame: DofusWindow, rootStore: RootStore, LL: TranslationFunctions) { super(wGame, rootStore, LL) - this.load() console.log('- enabled debug messages') + const disposer = observe(this.rootStore.optionStore.window, (change: IObjectDidChange) => { + if (change.name !== 'debugLogs') return + if (change.type !== 'update') return + if (change?.newValue?.value) this.startEvents() + else this.removeEvents() + }) + this._disposers.push(disposer) + if (this.rootStore.optionStore.window.debugLogs) this.load() } private load() { + this.startEvents() + } + + private startEvents() { + console.log('- starting debug events') this.eventManager.on(this.wGame.dofus.connectionManager, 'send', this.onSend) this.eventManager.on(this.wGame.dofus.connectionManager, 'data', this.onReceive) this.eventManager.on(this.wGame.dofus.connectionManager, 'messageSequence', this.onMsgSeq) @@ -43,6 +62,14 @@ export class DebugMessagesMod extends Mod { } destroy(): void { + this.removeEvents() + for (const disposer of this._disposers) { + disposer() + } + } + + private removeEvents() { + console.log('- removing debug events') this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'send', this.onSend) this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'data', this.onReceive) this.eventManager.removeListener(this.wGame.dofus.connectionManager, 'messageSequence', this.onMsgSeq) diff --git a/packages/renderer/src/screens/option-screen/general/OptionGeneral.tsx b/packages/renderer/src/screens/option-screen/general/OptionGeneral.tsx index 934163ed..6d938cb2 100644 --- a/packages/renderer/src/screens/option-screen/general/OptionGeneral.tsx +++ b/packages/renderer/src/screens/option-screen/general/OptionGeneral.tsx @@ -143,6 +143,17 @@ export const OptionGeneral = () => { )} + + {LL.option.general.debug()} + + + } + label={LL.option.general.activateDebugLogs()} + checked={optionStore.window.debugLogs} + onChange={(_, checked) => optionStore.window.setDebugLogs(checked)} + /> + )} diff --git a/packages/shared/models/option-store/window-option/window-option.ts b/packages/shared/models/option-store/window-option/window-option.ts index 51903ee8..c4382ca8 100644 --- a/packages/shared/models/option-store/window-option/window-option.ts +++ b/packages/shared/models/option-store/window-option/window-option.ts @@ -12,6 +12,7 @@ export const WindowOptionModel = types .model('WindowOption') .props({ fullScreen: types.optional(types.boolean, false), + debugLogs: types.optional(types.boolean, false), resolution: types.optional(types.frozen(), { width: 1280, height: 720 @@ -25,6 +26,9 @@ export const WindowOptionModel = types } })) .actions((self) => ({ + setDebugLogs(value: boolean) { + self.debugLogs = value + }, setFullScreen(value: boolean) { self.fullScreen = value }, @@ -56,8 +60,10 @@ export const WindowOptionModel = types type WindowOptionType = Instance -export interface WindowOption extends WindowOptionType {} +export interface WindowOption extends WindowOptionType { +} type WindowOptionSnapshotType = SnapshotOut -export interface WindowOptionSnapshot extends WindowOptionSnapshotType {} +export interface WindowOptionSnapshot extends WindowOptionSnapshotType { +} From 7b82689bdafd1e8c750820293c74376a71971154 Mon Sep 17 00:00:00 2001 From: Aitor Garcia Diez Date: Fri, 21 Apr 2023 02:22:47 +0200 Subject: [PATCH 8/8] fixed linter --- .../models/option-store/window-option/window-option.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/shared/models/option-store/window-option/window-option.ts b/packages/shared/models/option-store/window-option/window-option.ts index c4382ca8..ea72dc80 100644 --- a/packages/shared/models/option-store/window-option/window-option.ts +++ b/packages/shared/models/option-store/window-option/window-option.ts @@ -60,10 +60,8 @@ export const WindowOptionModel = types type WindowOptionType = Instance -export interface WindowOption extends WindowOptionType { -} +export interface WindowOption extends WindowOptionType {} type WindowOptionSnapshotType = SnapshotOut -export interface WindowOptionSnapshot extends WindowOptionSnapshotType { -} +export interface WindowOptionSnapshot extends WindowOptionSnapshotType {}