From 6ab783513f985da886d6d9a5ffc934144ce38abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E6=B2=90=E5=91=80?= <163636894+zimuya4153@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:49:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9/=E4=BF=AE=E5=A4=8D7=E5=A4=84?= =?UTF-8?q?=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复玩家设置标题翻译问题 - 修复翻译方块不需要权限的bug - 新增默认语言文件3个(繁体,英式英语,美式英语) - 优化代码,提前获取NBT防止重复获取浪费性能 - 调换配置文件参数位置和修正配置文件注释错误 - 修改默认配置文件部分设置 - 修复有假人报错问题 --- Config.js | 131 ++++++++++++++++++++++++-------------------- Language/en-US.lang | 96 ++++++++++++++++++++++++++++++++ Language/en_GB.lang | 94 +++++++++++++++++++++++++++++++ Language/zh_TW.lang | 94 +++++++++++++++++++++++++++++++ Waila.js | 68 +++++++++++++++++++---- manifest.json | 4 +- tooth.json | 6 +- 7 files changed, 417 insertions(+), 76 deletions(-) create mode 100644 Language/en-US.lang create mode 100644 Language/en_GB.lang create mode 100644 Language/zh_TW.lang diff --git a/Config.js b/Config.js index ad0b2a5..35b8618 100644 --- a/Config.js +++ b/Config.js @@ -8,7 +8,7 @@ module.exports = { /** 无论如何都会显示(方块和实体前面) @type {ConfigItem[]} */ AllBefore: [ {// Boss栏换行 - Conditions: (Player, PlayerConfig, ViewVector) => PlayerConfig["Mode"] === 0, + Conditions: (_Player, _ViewVector, _Cache, PlayerConfig) => PlayerConfig["Mode"] === 0, Text: "\n\n", }, ], @@ -16,111 +16,110 @@ module.exports = { Block: [ {// 方块名字 Conditions: true, - Text: (Player, PlayerConfig, Block) => I18nAPI.get('plugins.Waila.block.name', [Block.getTranslateName(Player.langCode), Block.type], Player.langCode) + Text: (Player, Block) => I18nAPI.get('plugins.Waila.block.name', [Block.getTranslateName(Player.langCode), Block.type], Player.langCode) }, {// 挖掘时间 - Conditions: (_Player, _PlayerConfig, Block) => !Block.isUnbreakable, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.destroytime', [((Block.getBlockDestroySpeed() * 1.5) / Player.getHand().getDestroyBlockSpeed(Block)).toFixed(2).toString()], Player.langCode) + Conditions: (_Player, Block) => !Block.isUnbreakable, + Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.hardness', [Block.getBlockDestroySpeed().toFixed(1).toString()], Player.langCode) }, {// 是否可以采集 - Conditions: (_Player, _PlayerConfig, Block) => !Block.isUnbreakable, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.destroy', [(Block.isAlwaysDestroyable() || Player.getHand().canDestroySpecial(Block)) ? '§a✔' : '§c✘'], Player.langCode) + Conditions: (_Player, Block) => !Block.isUnbreakable, + Text: (Player, Block,Cache) => '\n' + I18nAPI.get('plugins.Waila.block.destroy', [(!(Player.isAdventure && !Cache['HandItem'].canDestroy(Block)) && (Block.isAlwaysDestroyable() || Cache['HandItem'].canDestroySpecial(Block))) ? '§a✔' : '§c✘'], Player.langCode) }, {// 蛋糕 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:cake', - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.cake.status', [(7 - Block.getNbt().getTag('states').getData('bite_counter')).toString()], Player.langCode) + Conditions: (_Player, Block) => Block.type === 'minecraft:cake', + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get('plugins.Waila.block.cake.status', [(7 - Cache['BlockNbt'].getTag('states').getData('bite_counter')).toString()], Player.langCode) }, {// 箱子容量 - Conditions: (_Player, _PlayerConfig, Block) => Block.hasContainer(), - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.chest.size', [Block.getContainer().getAllItems().filter(Item => !Item.isNull()).length.toString(), Block.getContainer().size.toString()], Player.langCde) + Conditions: (_Player, Block) => Block.hasContainer(), + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get('plugins.Waila.block.chest.size', [Cache['BlockContainer'].getAllItems().filter(Item => !Item.isNull()).length.toString(), Cache['BlockContainer'].size.toString()], Player.langCde) }, - {// 农作物成熟程度数值 - Conditions: (_Player, _PlayerConfig, Block) => Block.isCropBlock, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.Cropnum', [Block.variant.toString()], Player.langCode) + {// 农作物成熟程度数值 + Conditions: (_Player, Block) => Block.isCropBlock, + Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.Cropnum', [Block.variant.toString()], Player.langCode) }, - {// 红石粉等级 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:redstone_wire', - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.redstonelv', [Block.variant.toString()], Player.langCode) + {// 红石粉等级 + Conditions: (_Player, Block) => Block.type === 'minecraft:redstone_wire', + Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.redstonelv', [Block.variant.toString()], Player.langCode) }, {// 开关状态 - Conditions: (_Player, _PlayerConfig, Block) => Block.getNbt()?.getTag('states')?.getData('open_bit') != null, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.open_status.${Block.getNbt()?.getTag('states')?.getData('open_bit') ? 'open' : 'close'}`, [], Player.langCode) + Conditions: (_Player, _Block, Cache) => Cache['BlockNbt']?.getTag('states')?.getData('open_bit') != null, + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.open_status.${Cache['BlockNbt'].getTag('states')?.getData('open_bit') ? 'open' : 'close'}`, [], Player.langCode) }, {// 唱片机 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:jukebox' && Block?.getBlockEntity()?.getNbt()?.getTag('RecordItem')?.getData('Name') != null, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.jukebox`, [I18nAPI.get(`item.record_${Block.getBlockEntity().getNbt().getTag('RecordItem').getData('Name').slice(21)}.desc`, [], Player.langCode)], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:jukebox' && Cache['BlockEntityNbt']?.getTag('RecordItem')?.getData('Name') != null, + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.jukebox`, [I18nAPI.get(`item.record_${Cache['BlockEntityNbt'].getTag('RecordItem').getData('Name').slice(21)}.desc`, [], Player.langCode)], Player.langCode) }, {// 花盆 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:flower_pot' && Block?.getBlockEntity()?.getNbt()?.getTag('PlantBlock') !== null, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.flower_pot`, [I18nAPI.get(Minecraft.getBlockTranslateKeyFromName(Block?.getBlockEntity().getNbt().getTag('PlantBlock').getData('name')), [], Player.langCode)], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:flower_pot' && Cache['BlockEntityNbt']?.getTag('PlantBlock')?.getData('name') != null, + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.flower_pot`, [I18nAPI.get(Minecraft.getBlockTranslateKeyFromName(Cache['BlockEntityNbt'].getTag('PlantBlock').getData('name')), [], Player.langCode)], Player.langCode) }, {// 命令方块 - Conditions: (_Player, _PlayerConfig, Block) => ['minecraft:repeating_command_block', 'minecraft:command_block', 'minecraft:chain_command_block'].includes(Block.type) && Block?.getBlockEntity()?.getNbt()?.getData('Command') !== '', - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.commandblock.command`, [Block?.getBlockEntity().getNbt().getData('Command')], Player.langCode) + Conditions: (_Player, Block, Cache) => ['minecraft:repeating_command_block', 'minecraft:command_block', 'minecraft:chain_command_block'].includes(Block.type) && Cache['BlockEntityNbt']?.getData('Command') !== '', + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.commandblock.command`, [Cache['BlockEntityNbt'].getData('Command')], Player.langCode) }, {// 刷怪笼 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:mob_spawner' && ![null, ''].includes(Block?.getBlockEntity()?.getNbt()?.getData('EntityIdentifier')), - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.mob_spawner`, [Block?.getBlockEntity().getNbt().getData('EntityIdentifier')], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:mob_spawner' && ![null, ''].includes(Cache['BlockEntityNbt']?.getData('EntityIdentifier')), + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.mob_spawner`, [Cache['BlockEntityNbt'].getData('EntityIdentifier')], Player.langCode) }, {// 音符盒 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:noteblock', - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.noteblock`, [Block?.getBlockEntity().getNbt().getData('note').toString()], Player.langCode) + Conditions: (_Player, Block) => Block.type === 'minecraft:noteblock', + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.noteblock`, [Cache['BlockEntityNbt'].getData('note').toString()], Player.langCode) }, - {// 音符盒 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:composter', - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get(`plugins.Waila.block.composter`, [Block?.getNbt()?.getTag('states')?.getData('composter_fill_level')?.toString()], Player.langCode) + {// 堆肥桶 + Conditions: (_Player, Block) => Block.type === 'minecraft:composter', + Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.composter`, [Cache['BlockNbt']?.getTag('states')?.getData('composter_fill_level')?.toString()], Player.langCode) }, {// 信标 - Conditions: (_Player, _PlayerConfig, Block) => Block.type === 'minecraft:beacon' && ![0, null].includes(Block?.getBlockEntity()?.getNbt()?.getData('primary')), - Text: (Player, _PlayerConfig, Block) => { + Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:beacon' && ![0, null].includes(Cache['BlockEntityNbt']?.getData('primary')), + Text: (Player, _Block, Cache) => { const BuffID = [null, 'moveSpeed', 'moveSlowdown', 'digSpeed', 'digSlowDown', 'damageBoost', 'heal', 'harm', 'jump', 'confusion', 'regeneration', 'resistance', 'fireResistance', 'waterBreathing', 'invisibility', 'blindness', 'nightVision', 'hunger', 'weakness', 'poison', 'wither', 'healthBoost', 'absorption', 'saturation', 'levitation', 'poison', 'conduitPower', 'slowFalling']; - const BlockEntityNbt = Block.getBlockEntity().getNbt(); - return '\n' + I18nAPI.get(`plugins.Waila.block.beacon`, [I18nAPI.get(`potion.${BuffID[BlockEntityNbt.getData('primary')]}`, [], Player.langCode) + ' ' + (BlockEntityNbt.getData('secondary') !== 0 ? I18nAPI.get(`potion.${BuffID[BlockEntityNbt.getData('secondary')]}`, [], Player.langCode) : '')], Player.langCode); + return '\n' + I18nAPI.get(`plugins.Waila.block.beacon`, [I18nAPI.get(`potion.${BuffID[Cache['BlockEntityNbt'].getData('primary')]}`, [], Player.langCode) + ' ' + (Cache['BlockEntityNbt'].getData('secondary') !== 0 ? I18nAPI.get(`potion.${BuffID[Cache['BlockEntityNbt'].getData('secondary')]}`, [], Player.langCode) : '')], Player.langCode); } }, {// 方块坐标 Conditions: true, - Text: (Player, _PlayerConfig, Block) => '\n' + I18nAPI.get('plugins.Waila.block.pos', [Block.pos.x.toString(), Block.pos.y.toString(), Block.pos.z.toString()], Player.langCode) + Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.pos', [Block.pos.x.toString(), Block.pos.y.toString(), Block.pos.z.toString()], Player.langCode) }, ], /** 指向实体时显示 @type {ConfigItem[]} */ Entity: [ {// 名字 Conditions: true, - Text: (Player, PlayerConfig, Entity) => I18nAPI.get('plugins.Waila.entity.name', [Entity.getTranslateName() === Entity.name ? Entity.getTranslateName(Player.langCode) : Entity.name, Entity.type], Player.langCode) + Text: (Player, Entity) => I18nAPI.get('plugins.Waila.entity.name', [Entity.getTranslateName() === Entity.name ? Entity.getTranslateName(Player.langCode) : Entity.name, Entity.type], Player.langCode) }, {// 血量 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.maxHealth !== 0, - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.health', [Entity.health.toString(), Entity.maxHealth.toString()], Player.langCode) + Conditions: (_Player, Entity) => Entity.maxHealth !== 0, + Text: (Player, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.health', [Entity.health.toString(), Entity.maxHealth.toString()], Player.langCode) }, {// 盔甲架 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:armor_stand', - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.pose', [Entity.getNbt().getTag('Pose').getData('PoseIndex').toString()], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === 'minecraft:armor_stand', + Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.pose', [Cache['EntityNbt'].getTag('Pose').getData('PoseIndex').toString()], Player.langCode) }, {// 画 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:painting', - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.painting', [Entity.getNbt().getData('Motif')], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === 'minecraft:painting', + Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.painting', [Cache['EntityNbt'].getData('Motif')], Player.langCode) }, {// 史莱姆大小 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:slime', - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.slime.size', [Entity.getNbt().getData('Size').toString()], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === 'minecraft:slime', + Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.slime.size', [Cache['EntityNbt'].getData('Size').toString()], Player.langCode) }, {// 下路方块 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:falling_block', - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.falling_block', [I18nAPI.get(Minecraft.getBlockTranslateKeyFromName(Entity.getNbt().getTag('FallingBlock').getData('name')), [], Player.langCode)], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === 'minecraft:falling_block', + Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.falling_block', [I18nAPI.get(Minecraft.getBlockTranslateKeyFromName(Cache['EntityNbt'].getTag('FallingBlock').getData('name')), [], Player.langCode)], Player.langCode) }, {// TNT爆炸时间 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:tnt', - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.tnt', [Entity.getNbt()?.getData('Fuse')?.toString() ?? '0'], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === 'minecraft:tnt', + Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.tnt', [Cache['EntityNbt']?.getData('Fuse')?.toString() ?? '0'], Player.langCode) }, {// 村民 - Conditions: (_Player, _PlayerConfig, Entity) => Entity.type === 'minecraft:villager_v2' && Entity.getNbt()?.getTag('Offers')?.getTag('Recipes') != null, - Text: (Player, _PlayerConfig, Entity) => { - let EntityNbt = Entity.getNbt(),/** @type {NbtList} */OffersNbts = EntityNbt.getTag('Offers').getTag('Recipes'),/** @type {String[]} */ OffersTexts = []; + Conditions: (_Player, Entity, Cache) => Entity.type === 'minecraft:villager_v2' && Cache['EntityNbt']?.getTag('Offers')?.getTag('Recipes') != null, + Text: (Player, _Entity, Cache) => { + let /** @type {NbtList} */OffersNbts = Cache['EntityNbt'].getTag('Offers').getTag('Recipes'),/** @type {String[]} */ OffersTexts = []; for (let index = 0; index < OffersNbts.getSize(); index++) { const /** @type {NbtCompound} */OffersNbt = OffersNbts.getData(index); - if (EntityNbt.getTag('Offers').getTag('TierExpRequirements').getData(OffersNbt.getData('tier')).getData(OffersNbt.getData('tier').toString()) > EntityNbt.getData('Riches')) continue; + if (Cache['EntityNbt'].getTag('Offers').getTag('TierExpRequirements').getData(OffersNbt.getData('tier')).getData(OffersNbt.getData('tier').toString()) > Cache['EntityNbt'].getData('Riches')) continue; const BuyItemA = mc.newItem(OffersNbt.getTag('buyA').getData('Name'), OffersNbt.getData('buyCountA')); OffersTexts[index] = I18nAPI.get('plugins.Waila.entity.village.offers.item1', [BuyItemA.getTranslateName(Player.langCode), BuyItemA.count.toString()], Player.langCode); if (OffersNbt.getTag('buyB')) { @@ -135,13 +134,13 @@ module.exports = { }, {// 实体坐标 Conditions: true, - Text: (Player, _PlayerConfig, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.pos', [Entity.pos.x.toFixed(2).toString(), Entity.pos.y.toFixed(2).toString(), Entity.pos.z.toFixed(2).toString()], Player.langCode) + Text: (Player, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.pos', [Entity.pos.x.toFixed(2).toString(), Entity.pos.y.toFixed(2).toString(), Entity.pos.z.toFixed(2).toString()], Player.langCode) }, ], /** 无论如何都会显示(方块和实体后面) @type {ConfigItem[]} */ AllAfter: [ {// 物品栏上方和actionbar换行(防止领地挡住) - Conditions: (Player, PlayerConfig, ViewVector) => [2, 3].includes(PlayerConfig["Mode"]), + Conditions: (_Player, _ViewVector, _Cache, PlayerConfig) => [2, 3].includes(PlayerConfig["Mode"]), Text: "\n", }, ], @@ -155,7 +154,7 @@ module.exports = { Percent: 100, }, /** 默认文本 @type {String} */ - DefaultText: "\n\n&plugins.Waila.get.error&", + DefaultText: "", /** 刷新时间(秒) @type {Number} */ Hz: 0.1, /** 查找最大距离 @type {Number} */ @@ -174,6 +173,20 @@ module.exports = { /** * @typedef {Object} ConfigItem - * @property {function(Player, PlayerConfig, Block|Entity): boolean | boolean} Conditions - 条件函数 - * @property {(string | function(Player, PlayerConfig, Block|Entity): string)} Text - 文本内容 - */ + * @property {function(Player, Block|Entity, + * { + * HandItem:Item + * BlockNbt:NbtCompound|null, + * BlockEntityNbt:NbtCompound|null, + * BlockContainer:Container|null, + * EntityNbt:NbtCompound|null + * },PlayerConfig): boolean | boolean} Conditions - 条件函数 + * @property {(string | function(Player, Block|Entity, + * { + * HandItem:Item + * BlockNbt:NbtCompound|null, + * BlockEntityNbt:NbtCompound|null, + * BlockContainer:Container|null, + * EntityNbt:NbtCompound|null + * },PlayerConfig): string)} Text - 文本内容 + */ \ No newline at end of file diff --git a/Language/en-US.lang b/Language/en-US.lang new file mode 100644 index 0000000..a5fc318 --- /dev/null +++ b/Language/en-US.lang @@ -0,0 +1,96 @@ +## Command Translations +plugins.Waila.command.description=§bHighlight Settings §7- §dby Xiaoxiaozi Mu +plugins.Waila.command.translators.error=§cTarget block §a%s §calready has a translation→ §e%s +plugins.Waila.command.translators.succes=§eTarget block §b%s §ehas been translated to §6%s +plugins.Waila.command.language.error=§cLanguage §a%s §cdoes not exist +plugins.Waila.gui.title=§eHighlight Settings +plugins.Waila.gui.cancel=§8Settings canceled +plugins.Waila.gui.succes=§gSettings successful +plugins.Waila.gui.switch=§bHighlight Switch +plugins.Waila.gui.dropdown=§aDisplay Mode +plugins.Waila.gui.dropdown.items.bossbar=§1BOSS Bar +plugins.Waila.gui.dropdown.items.tell_popup=§2Jukebox Message +plugins.Waila.gui.dropdown.items.tell_tip=§3Above Item Bar +plugins.Waila.gui.dropdown.items.actionBar=§5Action Bar + +## Configuration File Translations +plugins.Waila.block.name=§6%s §7(%s) +plugins.Waila.block.hardness=Hardness §6%s +plugins.Waila.block.destroy=§l%s §r§7Can be destroyed?§r +plugins.Waila.block.cake.status=§3Cake Status:§c%s/7 +plugins.Waila.block.chest.size=§bCapacity:§a%s/%s +plugins.Waila.block.jukebox=§8Playing Record §c%s +plugins.Waila.block.beacon=§7Selected Effect:§5%s +plugins.Waila.block.noteblock=§cMusical Scale:§d%s +plugins.Waila.block.composter=§bCompost Level:§e%s/8 +plugins.Waila.block.mob_spawner=§dSpawning Mob:§a%s +plugins.Waila.block.commandblock.command=§dCommand:§a%s +plugins.Waila.block.flower_pot=§dPlanted Flower:§b%s +plugins.Waila.block.open_status.open=§eOpen Status:§6Open +plugins.Waila.block.open_status.close=§eOpen Status:§6Closed +plugins.Waila.block.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s +plugins.Waila.block.Cropnum=§3Growth Level:§g%s +plugins.Waila.block.redstonelv=§cRedstone Level:§e%s + +plugins.Waila.entity.name=§6%s §7(%s) +plugins.Waila.entity.pose=§dPose ID:§a%s +plugins.Waila.entity.painting=§aTheme:§6%s +plugins.Waila.entity.slime.size=§6Size:§3%s +plugins.Waila.entity.falling_block=§7Block:§9%s +plugins.Waila.entity.tnt=§dExplosion Time:§a%s(Tick) +plugins.Waila.entity.village.offers=§cTrade Information:\n +plugins.Waila.entity.village.offers.item1= §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item2= §g+ §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item3= §6=> %s§r§a*§b%s +plugins.Waila.entity.health=§l§c❤ §a%s/%s§r +plugins.Waila.entity.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s + +## Completing Mojang's Untranslated Blocks or Entities +tile.daylight_detector_inverted.name=Inverted Daylight Detector +tile.melon_stem.name=Melon Stem +tile.wall_sign.name=Oak Wall Sign +tile.spruce_wall_sign.name=Spruce Wall Sign +tile.birch_wall_sign.name=Birch Wall Sign +tile.jungle_wall_sign.name=Jungle Wall Sign +tile.acacia_wall_sign.name=Acacia Wall Sign +tile.darkoak_wall_sign.name=Dark Oak Wall Sign +tile.mangrove_wall_sign.name=Mangrove Wall Sign +tile.cherry_wall_sign.name=Cherry Wall Sign +tile.bamboo_wall_sign.name=Bamboo Wall Sign +tile.warped_wall_sign.name=Warped Wall Sign +tile.oak_hanging_sign.name=Oak Hanging Sign +tile.spruce_hanging_sign.name=Spruce Hanging Sign +tile.birch_hanging_sign.name=Birch Hanging Sign +tile.jungle_hanging_sign.name=Jungle Hanging Sign +tile.acacia_hanging_sign.name=Acacia Hanging Sign +tile.dark_oak_hanging_sign.name=Dark Oak Hanging Sign +tile.mangrove_hanging_sign.name=Mangrove Hanging Sign +tile.cherry_hanging_sign.name=Cherry Hanging Sign +tile.bamboo_hanging_sign.name=Bamboo Hanging Sign +tile.warped_hanging_sign.name=Warped Hanging Sign +tile.lit_redstone_ore.name=Glowing Redstone Ore +tile.lit_deepslate_redstone_ore.name=Glowing Deepslate Redstone Ore +tile.torchflower_crop.name=Torchflower Seedling +tile.pitcher_crop.name=Pitcher Plant Pod +tile.unpowered_repeater.name=Redstone Repeater +tile.powered_repeater.name=Activated Redstone Repeater +tile.sticky_piston_arm_collision.name=Sticky Piston Arm +tile.piston_arm_collision.name=Piston Arm +tile.wooden_door.name=Oak Door +tile.spruce_door.name=Spruce Door +tile.birch_door.name=Birch Door +tile.jungle_door.name=Jungle Door +tile.acacia_door.name=Acacia Door +tile.dark_oak_door.name=Dark Oak Door +tile.mangrove_door.name=Mangrove Door +tile.cherry_door.name=Cherry Door +tile.bamboo_door.name=Bamboo Door +tile.iron_door.name=Iron Door +tile.crimson_door.name=Crimson Door +tile.warped_door.name=Warped Door +tile.lit_redstone_lamp.name=Glowing Redstone Lamp +tile.frame.name=Item Frame +tile.skull.name=Skull +tile.flower_pot.name=Flower Pot +tile.end_portal.name=End Portal +tile.end_gateway.name=End Gateway Block \ No newline at end of file diff --git a/Language/en_GB.lang b/Language/en_GB.lang new file mode 100644 index 0000000..31ee6a8 --- /dev/null +++ b/Language/en_GB.lang @@ -0,0 +1,94 @@ +## Command Translations +plugins.Waila.command.description=§bHighlight Settings §7- §dby Xiaoxiaozi Mu +plugins.Waila.command.translators.error=§cTarget block §a%s §calready has a translation→ §e%s +plugins.Waila.command.translators.succes=§eTarget block §b%s §ehas been translated to §6%s +plugins.Waila.command.language.error=§cLanguage §a%s §cdoes not exist +plugins.Waila.gui.title=§eHighlight Settings +plugins.Waila.gui.cancel=§8Settings canceled +plugins.Waila.gui.succes=§gSettings successful +plugins.Waila.gui.switch=§bHighlight switch +plugins.Waila.gui.dropdown=§aDisplay mode +plugins.Waila.gui.dropdown.items.bossbar=§1BOSS bar +plugins.Waila.gui.dropdown.items.tell_popup=§2Jukebox message +plugins.Waila.gui.dropdown.items.tell_tip=§3Above the item bar +plugins.Waila.gui.dropdown.items.actionBar=§5Action bar + +## Configuration File Translations +plugins.Waila.block.name=§6%s §7(%s) +plugins.Waila.block.hardness=Hardness §6%s +plugins.Waila.block.destroy=§l%s §r§7Can it be collected?§r +plugins.Waila.block.cake.status=§3Cake status: §c%s/7 +plugins.Waila.block.chest.size=§bCapacity: §a%s/%s +plugins.Waila.block.jukebox=§8Playing record §c%s +plugins.Waila.block.beacon=§7Select effect: §5%s +plugins.Waila.block.noteblock=§cMusical scale §6: §d%s +plugins.Waila.block.composter=§bCompost level §a: §e%s/8 +plugins.Waila.block.mob_spawner=§dSpawn monster: §a%s +plugins.Waila.block.commandblock.command=§dCommand: §a%s +plugins.Waila.block.flower_pot=§dPlanted flower §b: %s +plugins.Waila.block.open_status.open=§eOpen status: §6Open +plugins.Waila.block.open_status.close=§eOpen status: §6Closed +plugins.Waila.block.pos=§7X: §g%s §7Y: §g%s §7Z: §g%s +plugins.Waila.block.Cropnum=§3Growth level: §g%s +plugins.Waila.block.redstonelv=§cRedstone level: §e%s + +plugins.Waila.entity.name=§6%s §7(%s) +plugins.Waila.entity.pose=§dPose ID: §a%s +plugins.Waila.entity.painting=§aTheme: §6%s +plugins.Waila.entity.slime.size=§6Size: §3%s +plugins.Waila.entity.falling_block=§7Block: §9%s +plugins.Waila.entity.tnt=§dExplosion time: §a%s (Tick) +plugins.Waila.entity.village.offers=§cTransaction information:\n +plugins.Waila.entity.village.offers.item1= §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item2= §g+ §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item3= §6=> %s§r§a*§b%s +plugins.Waila.entity.health=§l§c❤ §a%s/%s§r +plugins.Waila.entity.pos=§7X: §g%s §7Y: §g%s §7Z: §g%s + +## Completing Blocks or Entities Not Translated by Mojang +tile.daylight_detector_inverted.name=Night Sensor +tile.melon_stem.name=Watermelon Stem +tile.wall_sign.name=Oak Sign +tile.spruce_wall_sign.name=Spruce Sign +tile.birch_wall_sign.name=Birch Sign +tile.jungle_wall_sign.name=Jungle Sign +tile.acacia_wall_sign.name=Acacia Sign +tile.darkoak_wall_sign.name=Dark Oak Sign +tile.mangrove_wall_sign.name=Mangrove Sign +tile.cherry_wall_sign.name=Cherry Sign +tile.bamboo_wall_sign.name=Bamboo Sign +tile.warped_wall_sign.name=Warped Sign +tile.oak_hanging_sign.name=Oak Hanging Sign +tile.spruce_hanging_sign.name=Spruce Hanging Sign +tile.birch_hanging_sign.name=Birch Hanging Sign +tile.jungle_hanging_sign.name=Jungle Hanging Sign +tile.acacia_hanging_sign.name=Acacia Hanging Sign +tile.dark_oak_hanging_sign.name=Dark Oak Hanging Sign +tile.mangrove_hanging_sign.name=Mangrove Hanging Sign +tile.cherry_hanging_sign.name=Cherry Hanging Sign +tile.bamboo_hanging_sign.name=Bamboo Hanging Sign +tile.warped_hanging_sign.name=Warped Hanging Sign +tile.lit_redstone_ore.name=Glowing Redstone Ore +tile.lit_deepslate_redstone_ore.name=Glowing Deepslate Redstone Ore +tile.torchflower_crop.name=Torch Flower Seedling +tile.pitcher_crop.name=Pitcher Plant Pod +tile.unpowered_repeater.name=Redstone Repeater +tile.powered_repeater.name=Activated Redstone Repeater +tile.wooden_door.name=Oak Door +tile.spruce_door.name=Spruce Door +tile.birch_door.name=Birch Door +tile.jungle_door.name=Jungle Door +tile.acacia_door.name=Acacia Door +tile.dark_oak_door.name=Dark Oak Door +tile.mangrove_door.name=Mangrove Door Dream +tile.cherry_door.name=Cherry Door +tile.bamboo_door.name=Bamboo Door +tile.iron_door.name=Iron Door +tile.crimson_door.name=Crimson Door +tile.warped_door.name=Warped Door +tile.lit_redstone_lamp.name=Glowing Redstone Lamp +tile.frame.name=Item Frame +tile.skull.name=Skull +tile.flower_pot.name=Flower Pot +tile.end_portal.name=End Portal +tile.end_gateway.name=End Gateway Block \ No newline at end of file diff --git a/Language/zh_TW.lang b/Language/zh_TW.lang new file mode 100644 index 0000000..2419bb5 --- /dev/null +++ b/Language/zh_TW.lang @@ -0,0 +1,94 @@ +## 命令翻译 +plugins.Waila.command.description=§b高亮顯示設置 §7- §dby 小小的子沐呀 +plugins.Waila.command.translators.error=§c目標方塊 §a%s §c已有翻譯→ §e%s +plugins.Waila.command.translators.succes=§e目標方塊 §b%s §e已翻譯成 §6%s +plugins.Waila.command.language.error=§c語言 §a%s §c不存在 +plugins.Waila.gui.title=§e高亮顯示設置 +plugins.Waila.gui.cancel=§8已取消設置 +plugins.Waila.gui.succes=§g設置成功 +plugins.Waila.gui.switch=§b高亮顯示開關 +plugins.Waila.gui.dropdown=§a顯示模式 +plugins.Waila.gui.dropdown.items.bossbar=§1BOSS欄 +plugins.Waila.gui.dropdown.items.tell_popup=§2音樂盒消息 +plugins.Waila.gui.dropdown.items.tell_tip=§3物品欄上方 +plugins.Waila.gui.dropdown.items.actionBar=§5活動欄 + +## 配置文件翻译 +plugins.Waila.block.name=§6%s §7(%s) +plugins.Waila.block.hardness=硬度 §6%s +plugins.Waila.block.destroy=§l%s §r§7能否採集§r +plugins.Waila.block.cake.status=§3蛋糕狀態:§c%s/7 +plugins.Waila.block.chest.size=§b容量:§a%s/%s +plugins.Waila.block.jukebox=§8播放唱片 §c%s +plugins.Waila.block.beacon=§7選擇效果:§5%s +plugins.Waila.block.noteblock=§c音階§6:§d%s +plugins.Waila.block.composter=§b堆肥量§a:§e%s/8 +plugins.Waila.block.mob_spawner=§d生成怪物:§a%s +plugins.Waila.block.commandblock.command=§d命令:§a%s +plugins.Waila.block.flower_pot=§d種植的花§b:%s +plugins.Waila.block.open_status.open=§e開啟狀態:§6開 +plugins.Waila.block.open_status.close=§e開啟狀態:§6關 +plugins.Waila.block.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s +plugins.Waila.block.Cropnum=§3成長程度:§g%s +plugins.Waila.block.redstonelv=§c紅石等級:§e%s + +plugins.Waila.entity.name=§6%s §7(%s) +plugins.Waila.entity.pose=§d姿勢ID:§a%s +plugins.Waila.entity.painting=§a主題:§6%s +plugins.Waila.entity.slime.size=§6大小:§3%s +plugins.Waila.entity.falling_block=§7方塊:§9%s +plugins.Waila.entity.tnt=§d爆炸時間:§a%s(Tick) +plugins.Waila.entity.village.offers=§c交易資訊:\n +plugins.Waila.entity.village.offers.item1= §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item2= §g+ §d%s§r§a*§b%s +plugins.Waila.entity.village.offers.item3= §6=> %s§r§a*§b%s +plugins.Waila.entity.health=§l§c❤ §a%s/%s§r +plugins.Waila.entity.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s + +## 補全Mojang沒有翻譯的方塊或實體 +tile.daylight_detector_inverted.name=黑夜感測器 +tile.melon_stem.name=西瓜莖 +tile.wall_sign.name=橡木告示牌 +tile.spruce_wall_sign.name=雲杉木告示牌 +tile.birch_wall_sign.name=白樺木告示牌 +tile.jungle_wall_sign.name=叢林木告示牌 +tile.acacia_wall_sign.name=金合歡告示牌 +tile.darkoak_wall_sign.name=深色橡木告示牌 +tile.mangrove_wall_sign.name=紅樹木告示牌 +tile.cherry_wall_sign.name=櫻花木告示牌 +tile.bamboo_wall_sign.name=竹制告示牌 +tile.warped_wall_sign.name=詭異木告示牌 +tile.oak_hanging_sign.name=橡木懸挂告示牌 +tile.spruce_hanging_sign.name=雲杉木懸挂告示牌 +tile.birch_hanging_sign.name=白樺木懸式告示牌 +tile.jungle_hanging_sign.name=叢林懸挂告示牌 +tile.acacia_hanging_sign.name=金合歡懸挂告示牌 +tile.dark_oak_hanging_sign.name=深色橡木懸挂告示牌 +tile.mangrove_hanging_sign.name=紅樹木懸挂告示牌 +tile.cherry_hanging_sign.name=櫻花木懸挂告示牌 +tile.bamboo_hanging_sign.name=竹制懸挂告示牌 +tile.warped_hanging_sign.name=翹曲懸挂告示牌 +tile.lit_redstone_ore.name=發光的紅石礦石 +tile.lit_deepslate_redstone_ore.name=發光的深層紅石礦石 +tile.torchflower_crop.name=火把花幼苗 +tile.pitcher_crop.name=猪笼草莢果 +tile.unpowered_repeater.name=紅石中繼器 +tile.powered_repeater.name=激活的紅石中繼器 +tile.wooden_door.name=橡木門 +tile.spruce_door.name=雲杉木門 +tile.birch_door.name=白樺木門 +tile.jungle_door.name=叢林木門 +tile.acacia_door.name=金合歡木門 +tile.dark_oak_door.name=深色橡木門 +tile.mangrove_door.name=紅樹木夢 +tile.cherry_door.name=櫻花木門 +tile.bamboo_door.name=竹門 +tile.iron_door.name=鐵門 +tile.crimson_door.name=緋紅木門 +tile.warped_door.name=詭異門 +tile.lit_redstone_lamp.name=發光的紅石燈 +tile.frame.name=物品展示框 +tile.skull.name=頭顱 +tile.flower_pot.name=花盆 +tile.end_portal.name=末地傳送門 +tile.end_gateway.name=末地折躍門方塊 diff --git a/Waila.js b/Waila.js index 7bb5469..63322ce 100644 --- a/Waila.js +++ b/Waila.js @@ -12,8 +12,22 @@ /** * @typedef {Object} ConfigItem - * @property {function(Player, PlayerConfig, Block|Entity): boolean | boolean} Conditions - 条件函数 - * @property {(string | function(Player, PlayerConfig, Block|Entity): string)} Text - 文本内容 + * @property {function(Player, Block|Entity, + * { + * HandItem:Item + * BlockNbt:NbtCompound|null, + * BlockEntityNbt:NbtCompound|null, + * BlockContainer:Container|null, + * EntityNbt:NbtCompound|null + * },PlayerConfig): boolean | boolean} Conditions - 条件函数 + * @property {(string | function(Player, Block|Entity, + * { + * HandItem:Item + * BlockNbt:NbtCompound|null, + * BlockEntityNbt:NbtCompound|null, + * BlockContainer:Container|null, + * EntityNbt:NbtCompound|null + * },PlayerConfig): string)} Text - 文本内容 */ LLSE_Player.prototype.updateBossBarTitle = @@ -38,6 +52,9 @@ const { I18nAPI, Minecraft } = require('./GMLIB-LegacyRemoteCallApi/lib/GMLIB_AP const /** 玩家数据文件 */ Data = new JsonConfigFile('./plugins/Waila/Data.json'); Minecraft.setFixI18nEnabled();// 修复Mojang的i18n问题 +/** 报错记录,防刷屏 @type {String[]} */ +let ErrorList = []; + setInterval(() => { mc.getOnlinePlayers().forEach(Player => { const /** @type {PlayerConfig} */ PlayerConfig = Data.get(Player.uuid, { 'Enabled': 1, 'Mode': 0 }); @@ -51,13 +68,35 @@ setInterval(() => { if ((!ViewBlock || ViewBlock?.pos?.toString().replace(/ /g, '').includes('(0,0,0)')) && !ViewEntity) { text += Config.DefaultText.replace(/&(.*)&/g, (_, key) => I18nAPI.get(key, [], Player.langCode)); } else { - const EvalGetText = (Items => - (typeof (Items.Conditions) === 'function' ? Items.Conditions(Player, PlayerConfig, ViewEntity ?? ViewBlock) : Items.Conditions) - ? (typeof (Items.Text) === 'string' ? Items.Text : Items.Text(Player, PlayerConfig, ViewEntity ?? ViewBlock)) ?? '' - : '' - ); + let TempCache = { + 'HandItem':Player.getHand(), + 'BlockNbt': ViewBlock ? ViewBlock.getNbt() : null, + 'BlockEntityNbt': ViewBlock.hasBlockEntity() ? ViewBlock.getBlockEntity().getNbt() : null, + 'BlockContainer': ViewBlock.hasContainer() ? ViewBlock.getContainer() : null, + 'EntityNbt': ViewEntity ? ViewEntity.getNbt() : null, + } + const EvalGetText = + /** + * @param {ConfigItem} Items + * @returns {String} + */ + Items => { + try { + if (typeof (Items.Conditions) === 'function' ? Items.Conditions(Player, ViewEntity ?? ViewBlock, TempCache, PlayerConfig) : Items.Conditions) { + return typeof (Items.Text) === 'string' ? Items.Text : Items.Text(Player, ViewEntity ?? ViewBlock, TempCache, PlayerConfig); + } + } catch (error) { + const ErrorText = `报错:${error.message}\n文本条件:${Items.Conditions.toString()}\n文本结果:${Items.Text.toString()}\n堆栈:\n${error.stack}` + if(ErrorList.includes(ErrorText))return; + ErrorList.push(ErrorText); + logger.error(ErrorText); + } + return ''; + }; text += Config.AllBefore.map(EvalGetText).join(''); - if (ViewEntity && (!ViewBlock || Player.distanceTo(ViewEntity) <= Player.distanceTo(ViewBlock.pos))) text += Config.Entity.map(EvalGetText).join(''); else { + if (ViewEntity && (!ViewBlock || Player.distanceTo(ViewEntity) <= Player.distanceTo(ViewBlock.pos))) + text += Config.Entity.map(EvalGetText).join(''); + else { ViewEntity = null; text += Config.Block.map(EvalGetText).join(''); } @@ -77,21 +116,26 @@ mc.listen('onServerStarted', () => { setInterval(() => { mc.getOnlinePlayers().forEach(Player => { const /** @type {PlayerConfig} */ PlayerConfig = Data.get(Player.uuid, { 'Enabled': 1, 'Mode': 0 }); - if (PlayerConfig.Enabled && PlayerConfig.Mode === 0) Player.setBossBar(Config.Bossbar.ID, Config.DefaultText.replace(/&(.*)&/g, (_, key) => I18nAPI.get(key, [], Player.langCode)), Config.Bossbar.Percent, Config.Bossbar.Color); + if (!( + Player.isSimulatedPlayer() + || [null, true].includes(Player.isLoading) + || !PlayerConfig.Enabled + || PlayerConfig.Mode !== 0 + )) Player.setBossBar(Config.Bossbar.ID, Config.DefaultText.replace(/&(.*)&/g, (_, key) => I18nAPI.get(key, [], Player.langCode)), Config.Bossbar.Percent, Config.Bossbar.Color); }); }, 5 * 1000); I18nAPI.loadLanguageDirectory(`./plugins/Waila/Language`); mc.regPlayerCmd('waila', I18nAPI.get('plugins.Waila.command.description'), (Player, args) => { - if (args[1] != null) { + if (args[1] != null && Player.isOP()) { const ViewBlock = Player.getBlockFromViewVector(false, false, Config.maxDistance, false); - if(ViewBlock.name!==ViewBlock.getTranslateKey())return Player.tell(I18nAPI.get('plugins.Waila.command.translators.error',[ViewBlock.type,ViewBlock.getTranslateName()],Player.langCode)); + if (ViewBlock.name !== ViewBlock.getTranslateKey()) return Player.tell(I18nAPI.get('plugins.Waila.command.translators.error', [ViewBlock.type, ViewBlock.getTranslateName()], Player.langCode)); if (!I18nAPI.getSupportedLanguages().includes(args[0])) return Player.tell(I18nAPI.get('plugins.Waila.command.language.error', [args[0]], Player.langCode)); File.writeLine(`./plugins/Waila/Language/${args[0]}.lang`, `${ViewBlock.getTranslateKey()}=${args[1]}`); I18nAPI.loadLanguageDirectory(`./plugins/Waila/Language`); return Player.tell(I18nAPI.get('plugins.Waila.command.translators.succes', [ViewBlock.type, args[1]], Player.langCode)); } const /** @type {PlayerConfig} */ PlayerConfig = Data.get(Player.uuid, { 'Enabled': 1, 'Mode': 0 }); - const Form = mc.newCustomForm().setTitle(I18nAPI.get('plugins.Waila.gui.title')); + const Form = mc.newCustomForm().setTitle(I18nAPI.get('plugins.Waila.gui.title', [], Player.langCode)); Form.addSwitch(I18nAPI.get('plugins.Waila.gui.switch', [], Player.langCode), PlayerConfig['Enabled']); Form.addDropdown(I18nAPI.get('plugins.Waila.gui.dropdown', [], Player.langCode), ['bossbar', 'tell_popup', 'tell_tip', 'actionBar'].map(key => I18nAPI.get(`plugins.Waila.gui.dropdown.items.${key}`, [], Player.langCode)), PlayerConfig['Mode']); Player.sendForm(Form, (Player, FormData) => { diff --git a/manifest.json b/manifest.json index 86995b8..a72f7df 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "type": "lse-quickjs", "description":"普普通通的搞高亮显示", "author":"小小的子沐呀", - "version":"1.1.0", + "version":"1.2.0", "dependencies": [ { "name": "legacy-script-engine-quickjs", @@ -12,7 +12,7 @@ }, { "name": "GMLIB", - "version":"0.12.7" + "version":"0.12.8" }, { "name": "GMLIB-LegacyRemoteCallApi", diff --git a/tooth.json b/tooth.json index 8cbdbe9..a24750c 100644 --- a/tooth.json +++ b/tooth.json @@ -1,7 +1,7 @@ { "format_version": 2, "tooth": "github.com/zimuya4153/LSE_Waila", - "version": "1.1.0", + "version": "1.2.0", "info": { "name": "LSE_Waila", "description": "普普通通的高亮显示~", @@ -15,11 +15,11 @@ "legacyscriptengine" ] }, - "asset_url": "https://github.com/zimuya4153/LSE_Waila/releases/download/v1.1.0/LSE_Waila-1.1.0.zip", + "asset_url": "https://github.com/zimuya4153/LSE_Waila/releases/download/v1.2.0/LSE_Waila-1.2.0.zip", "dependencies": { "github.com/LiteLDev/LeviLamina": ">=0.12.x", "gitea.litebds.com/LiteLDev/legacy-script-engine-quickjs": ">=0.7.9", - "github.com/GroupMountain/GMLIB": ">=0.12.7", + "github.com/GroupMountain/GMLIB": ">=0.12.8", "github.com/GroupMountain/GMLIB-LegacyRemoteCallApi": ">=0.12.8" }, "files": {