diff --git a/Config.js b/Config.js index 749b7c1..885c416 100644 --- a/Config.js +++ b/Config.js @@ -1,7 +1,6 @@ -// LiteLoader-AIDS automatic generated -/// - -const { I18nAPI, Minecraft, UserCache } = require('./../GMLIB-LegacyRemoteCallApi/lib/GMLIB_API-JS.js'); +/// +/// +/// module.exports = { Config: { @@ -16,204 +15,224 @@ module.exports = { Block: [ {// 方块名字 Conditions: true, - Text: (Player, Block) => I18nAPI.get('plugins.Waila.block.name', [Block.getTranslateName(Player.langCode), Block.type], Player.langCode) + Text: (Player, Block) => tr("plugins.Waila.block.name", Player.langCode, Block.getTranslateName(Player.langCode), Block.type) }, - {// 硬度 - Conditions: (_Player, Block) => !Block.isUnbreakable, - Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.hardness', [Block.getBlockDestroySpeed().toFixed(1).toString()], Player.langCode) + {// 挖掘速度 + Conditions: (Player, Block) => !Player.isCreative && !Block.isUnbreakable, + Text: (Player, Block) => "\n" + tr("plugins.Waila.block.destroyTime", Player.langCode, 0.1 / Player.getDestroyProgress(Block)) }, {// 是否可以采集 - 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, Block) => !Player.isCreative && !Block.isUnbreakable, + Text: (Player, Block, Cache) => "\n" + tr("plugins.Waila.block.destroy", Player.langCode, (!(Player.isAdventure && !Cache["HandItem"].canDestroy(Block)) && (Block.isAlwaysDestroyable() || Cache["HandItem"].canDestroySpecial(Block))) ? "§a✔" : "§c✘") }, {// 蛋糕 - 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, Block) => Block.type === "minecraft:cake", + Text: (Player, _Block, Cache) => "\n" + tr("plugins.Waila.block.cake.status", Player.langCode, 7 - Cache["BlockNbt"].getTag("states").getData("bite_counter")) }, {// 箱子容量 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(), Cache['BlockContainer'].getAllItems().map(Item => Item.count).reduce((acc, curr) => acc + curr).toString(), (Cache['BlockContainer'].size * 64).toString()], Player.langCde) + Text: (Player, _Block, Cache) => "\n" + tr("plugins.Waila.block.chest.size", Player.langCde, Cache["BlockContainer"].getAllItems().filter(Item => !Item.isNull()).length, Cache["BlockContainer"].size, Cache["BlockContainer"].getAllItems().map(Item => Item.count).reduce((acc, curr) => acc + curr), Cache["BlockContainer"].size * 64, Player.langCde) }, {// 农作物成熟程度数值 Conditions: (_Player, Block) => Block.isCropBlock, - Text: (Player, Block) => '\n' + I18nAPI.get('plugins.Waila.block.Cropnum', [Block.variant.toString()], Player.langCode) + Text: (Player, Block) => "\n" + tr("plugins.Waila.block.Cropnum", Player.langCode, Block.variant) }, {// 红石粉等级 - 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, Block) => Block.type === "minecraft:redstone_wire", + Text: (Player, Block) => "\n" + tr("plugins.Waila.block.redstonelv", Player.langCode, Block.variant) }, {// 开关状态 - 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, _Block, Cache) => Cache["BlockNbt"]?.getTag("states")?.getData("open_bit") != null, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.open_status.${Cache["BlockNbt"].getTag("states")?.getData("open_bit") ? "open" : "close"}`, 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, Block, Cache) => Block.type === "minecraft:jukebox" && Cache["BlockEntityNbt"]?.getTag("RecordItem")?.getData("Name") != null, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.jukebox`, Player.langCode, `item.record_${Cache["BlockEntityNbt"].getTag("RecordItem").getData("Name").slice(21)}.desc`) }, {// 花盆 - 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, Block, Cache) => Block.type === "minecraft:flower_pot" && Cache["BlockEntityNbt"]?.getTag("PlantBlock")?.getData("name") != null, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.flower_pot`, Player.langCode, Minecraft.getBlockTranslateKeyFromName(Cache["BlockEntityNbt"].getTag("PlantBlock").getData("name"))) }, {// 命令方块 - Conditions: (_Player, Block, Cache) => ['minecraft:repeating_command_block', 'minecraft:command_block', 'minecraft:chain_command_block'].includes(Block.type) && Cache['BlockEntityNbt']?.getData('Command') !== '' && Cache['BlockEntityNbt'].getData('Command').length < 100, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.commandblock.command`, [Cache['BlockEntityNbt'].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") !== "" && Cache["BlockEntityNbt"].getData("Command").length < 100, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.commandblock.command`, Player.langCode, Cache["BlockEntityNbt"].getData("Command")) }, {// 刷怪笼 - 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, Block, Cache) => Block.type === "minecraft:mob_spawner" && ![null, ""].includes(Cache["BlockEntityNbt"]?.getData("EntityIdentifier")), + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.mob_spawner`, Player.langCode, Cache["BlockEntityNbt"].getData("EntityIdentifier")) }, {// 音符盒 - 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, Block) => Block.type === "minecraft:noteblock", + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.noteblock`, Player.langCode, Cache["BlockEntityNbt"].getData("note")) }, {// 堆肥桶 - 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, Block) => Block.type === "minecraft:composter", + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.composter`, Player.langCode, Cache["BlockNbt"]?.getTag("states")?.getData("composter_fill_level")) }, {// 钟摆动时间 - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:bell' && Cache['BlockEntityNbt'].getData('Ringing'), - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.RingingTime`, [((50 - Cache['BlockEntityNbt'].getData('Ticks')) / 20)?.toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:bell" && Cache["BlockEntityNbt"].getData("Ringing"), + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.RingingTime`, Player.langCode, (50 - Cache["BlockEntityNbt"].getData("Ticks")) / 20) }, {// 酿造剩余时间 - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:brewing_stand' && Cache['BlockEntityNbt'].getData('CookTime') > 0, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.BrewingStand.cookTime`, [(Cache['BlockEntityNbt'].getData('CookTime') / 20)?.toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:brewing_stand" && Cache["BlockEntityNbt"].getData("CookTime") > 0, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.BrewingStand.cookTime`, Player.langCode, (Cache["BlockEntityNbt"].getData("CookTime") / 20)) }, {// 酿造剩余燃料 - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:brewing_stand' && Cache['BlockEntityNbt'].getData('FuelAmount') > 0, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.BrewingStand.Fuel`, [Cache['BlockEntityNbt'].getData('FuelAmount').toString(), Cache['BlockEntityNbt'].getData('FuelTotal').toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:brewing_stand" && Cache["BlockEntityNbt"].getData("FuelAmount") > 0, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.BrewingStand.Fuel`, Player.langCode, Cache["BlockEntityNbt"].getData("FuelAmount"), Cache["BlockEntityNbt"].getData("FuelTotal")) }, {// 信标 - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:beacon' && ![0, null].includes(Cache['BlockEntityNbt']?.getData('primary')), - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.beacon`, [I18nAPI.get(`potion.${Cache['BuffKeyID'][Cache['BlockEntityNbt'].getData('primary')]}`, [], Player.langCode) + ' ' + (Cache['BlockEntityNbt'].getData('secondary') !== 0 ? I18nAPI.get(`potion.${Cache['BuffKeyID'][Cache['BlockEntityNbt'].getData('secondary')]}`, [], Player.langCode) : '')], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:beacon" && ![0, null].includes(Cache["BlockEntityNbt"]?.getData("primary")), + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.beacon`, Player.langCode, Cache["BuffKeyID"][Cache["BlockEntityNbt"].getData("primary")], Cache["BlockEntityNbt"].getData("secondary") !== 0 ? Cache["BuffKeyID"][Cache["BlockEntityNbt"].getData("secondary")] : "") }, {// 炼药锅药水效果 - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:cauldron' && Cache['BlockEntityNbt']?.getData('PotionId') !== -1, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.cauldron`, [I18nAPI.get(`potion.${Cache['BuffKeyID'][Cache['BlockEntityNbt'].getData('PotionId')]}`, [], Player.langCode), I18nAPI.get(`itemGroup.name.${['potion', 'splashPotion', 'lingeringPotion'][Cache['BlockEntityNbt'].getData('PotionType')]}`)], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:cauldron" && Cache["BlockEntityNbt"]?.getData("PotionId") !== -1, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.cauldron`, Player.langCode, `potion.${Cache["BuffKeyID"][Cache["BlockEntityNbt"].getData("PotionId")]}`, `itemGroup.name.${["potion", "splashPotion", "lingeringPotion"][Cache["BlockEntityNbt"].getData("PotionType")]}`) }, {// 红石比较器信号强度 - Conditions: (_Player, Block) => Block.type === 'minecraft:powered_comparator', - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.powered_comparator`, [Cache['BlockEntityNbt'].getData('OutputSignal').toString()], Player.langCode) + Conditions: (_Player, Block) => Block.type === "minecraft:powered_comparator", + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.powered_comparator`, Player.langCode, Cache["BlockEntityNbt"].getData("OutputSignal")) }, {// 末地折跃门 - Conditions: (_Player, Block) => Block.type === 'minecraft:end_gateway' && Block.pos.dimid === 2, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.end_gateway`, [Cache['BlockEntityNbt'].getData('ExitPortal').toArray().map(item => item.toString()).join(' ')], Player.langCode) + Conditions: (_Player, Block) => Block.type === "minecraft:end_gateway" && Block.pos.dimid === 2, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.end_gateway`, Player.langCode, Cache["BlockEntityNbt"].getData("ExitPortal").toArray().map(item => item.toString()).join(" ")) }, {// 熔炼存储经验 - Conditions: (_Player, Block, Cache) => ['minecraft:furnace', 'minecraft:lit_furnace', 'minecraft:blast_furnace', 'minecraft:lit_blast_furnace', 'minecraft:smoker', 'minecraft:lit_smoker'].includes(Block.type) && Cache['BlockEntityNbt']?.getData('StoredXPInt') > 0, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.furnace.StoredXPInt`, [Cache['BlockEntityNbt'].getData('StoredXPInt').toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => ["minecraft:furnace", "minecraft:lit_furnace", "minecraft:blast_furnace", "minecraft:lit_blast_furnace", "minecraft:smoker", "minecraft:lit_smoker"].includes(Block.type) && Cache["BlockEntityNbt"]?.getData("StoredXPInt") > 0, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.furnace.StoredXPInt`, Player.langCode, Cache["BlockEntityNbt"].getData("StoredXPInt")) }, {// 熔炼熔炼进度 - Conditions: (_Player, Block, Cache) => ['minecraft:lit_furnace', 'minecraft:lit_blast_furnace', 'minecraft:lit_smoker'].includes(Block.type) && Cache['BlockEntityNbt']?.getData('CookTime') > 0, - Text: (Player, Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.furnace.CookTime`, [(Cache['BlockEntityNbt'].getData('CookTime') / (Block.type === 'minecraft:lit_furnace' ? 2 : 1)).toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => ["minecraft:lit_furnace", "minecraft:lit_blast_furnace", "minecraft:lit_smoker"].includes(Block.type) && Cache["BlockEntityNbt"]?.getData("CookTime") > 0, + Text: (Player, Block, Cache) => "\n" + tr(`plugins.Waila.block.furnace.CookTime`, Player.langCode, (Cache["BlockEntityNbt"].getData("CookTime") / (Block.type === "minecraft:lit_furnace" ? 2 : 1))) }, {// 熔炼剩余燃料 - Conditions: (_Player, Block, Cache) => ['minecraft:lit_furnace', 'minecraft:lit_blast_furnace', 'minecraft:lit_smoker'].includes(Block.type) && Cache['BlockEntityNbt']?.getData('BurnTime') > 0, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.furnace.Burn`, [Cache['BlockEntityNbt']?.getData('BurnTime').toString(), Cache['BlockEntityNbt']?.getData('BurnDuration').toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => ["minecraft:lit_furnace", "minecraft:lit_blast_furnace", "minecraft:lit_smoker"].includes(Block.type) && Cache["BlockEntityNbt"]?.getData("BurnTime") > 0, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.furnace.Burn`, Player.langCode, Cache["BlockEntityNbt"]?.getData("BurnTime"), Cache["BlockEntityNbt"]?.getData("BurnDuration")) }, {// 最后编辑告示牌的玩家 - Conditions: (_Player, Block, Cache) => Block.type.includes('_sign') && Cache['BlockEntityNbt']?.getTag('FrontText')?.getData('TextOwner') !== '', - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.sign`, [UserCache.getNameByXuid(Cache['BlockEntityNbt'].getTag('FrontText').getData('TextOwner'))], Player.langCode) + Conditions: (_Player, Block) => Block.type.includes("_sign"), + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.sign`, Player.langCode, UserCache.getNameByXuid(Cache["BlockEntityNbt"].getTag("FrontText").getData("TextOwner") || "小小的子沐呀~") || "无", UserCache.getNameByXuid(Cache["BlockEntityNbt"].getTag("BackText").getData("TextOwner") || "小小的子沐呀~") || "无") }, {// 磁石ID - Conditions: (_Player, Block, Cache) => Block.type === 'minecraft:lodestone' && Cache['BlockEntityNbt']?.getTag('trackingHandle') != null, - Text: (Player, _Block, Cache) => '\n' + I18nAPI.get(`plugins.Waila.block.lodestone`, [Cache['BlockEntityNbt']?.getTag('trackingHandle').toString()], Player.langCode) + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:lodestone" && Cache["BlockEntityNbt"]?.getTag("trackingHandle") != null, + Text: (Player, _Block, Cache) => "\n" + tr(`plugins.Waila.block.lodestone`, Player.langCode, Cache["BlockEntityNbt"]?.getTag("trackingHandle")) + }, + {// 装饰罐 + Conditions: (_Player, Block, Cache) => Block.type === "minecraft:decorated_pot" && Cache["BlockEntityNbt"]?.getTag("item")?.getData("Name"), + Text: (Player, _Block, Cache) => { + const item = mc.newItem(Cache["BlockEntityNbt"].getTag("item")); + return "\n" + tr(`plugins.Waila.block.decorated_pot`, Player.langCode, item.getTranslateName(Player.langCode), item.count); + } }, ], /** 指向实体时显示 @type {ConfigItem[]} */ Entity: [ {// 名字 Conditions: true, - Text: (Player, Entity) => I18nAPI.get('plugins.Waila.entity.name', [Entity.getTranslateName() === Entity.name ? Entity.getTranslateName(Player.langCode) : Entity.name, Entity.type], Player.langCode) + Text: (Player, Entity) => tr("plugins.Waila.entity.name", Player.langCode, Entity.isPlayer() ? Entity.toPlayer().realName : Entity.getNameTag() || Entity.getTranslateName(Player.langCode), Entity.type) }, {// 血量 Conditions: (_Player, Entity) => Entity.maxHealth !== 0, - Text: (Player, Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.health', [Cache['EntityNbt'].getTag('Attributes').toArray().find(Attribute => Attribute.Name === 'minecraft:health')['Current'].toFixed(2).toString(), Entity.maxHealth.toString()], Player.langCode) + Text: (Player, Entity, Cache) => "\n" + tr("plugins.Waila.entity.health", Player.langCode, Cache["EntityNbt"].getTag("Attributes").toArray().find(Attribute => Attribute.Name === "minecraft:health")["Current"], Entity.maxHealth) }, {// 盔甲架 - 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, Entity) => Entity.type === "minecraft:armor_stand", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.pose", Player.langCode, Cache["EntityNbt"].getTag("Pose").getData("PoseIndex")) }, {// 画 - 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, Entity) => Entity.type === "minecraft:painting", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.painting", Player.langCode, Cache["EntityNbt"].getData("Motif")) }, {// 史莱姆大小 - 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, Entity) => Entity.type === "minecraft:slime", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.slime.size", Player.langCode, Cache["EntityNbt"].getData("Size")) }, {// 下路方块 - 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) + Conditions: (_Player, Entity) => Entity.type === "minecraft:falling_block", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.falling_block", Player.langCode, Minecraft.getBlockTranslateKeyFromName(Cache["EntityNbt"].getTag("FallingBlock").getData("name")), Player.langCode) }, {// TNT爆炸时间 - 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, Entity) => Entity.type === "minecraft:tnt", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.tnt", Player.langCode, Cache["EntityNbt"]?.getData("Fuse")) }, {// 繁殖冷却时间 - Conditions: (_Player, _Entity, Cache) => Cache['EntityNbt'].getData('BreedCooldown') > 0, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.breedcooldown', [(Cache['EntityNbt']?.getData('BreedCooldown') / 20)?.toFixed(1)?.toString()], Player.langCode) + Conditions: (_Player, _Entity, Cache) => Cache["EntityNbt"].getData("BreedCooldown") > 0, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.breedcooldown", Player.langCode, Cache["EntityNbt"]?.getData("BreedCooldown") / 20) }, {// 成年所需时间 - Conditions: (_Player, Entity) => Entity.isBaby, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.age', [(Math.abs(Cache['EntityNbt']?.getData('Age')) / 20)?.toFixed(1)?.toString()], Player.langCode) + Conditions: (_Player, Entity, Cache) => Entity.isBaby && Cache["EntityNbt"]?.getData("Age") < 0, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.age", Player.langCode, (Math.abs(Cache["EntityNbt"]?.getData("Age")) / 20)) }, {// 跳跃高度 - Conditions: (_Player, Entity) => ['minecraft:horse', 'minecraft:skeleton_horse', 'minecraft:zombie_horse', 'minecraft:donkey', 'minecraft:mule'].includes(Entity.type), - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.jump', [(Cache['EntityNbt'].getTag('Attributes').toArray().find(Attribute => Attribute.Name === 'minecraft:horse.jump_strength')['Current'] / 0.2724275).toFixed(1).toString()], Player.langCode) + Conditions: (_Player, Entity) => ["minecraft:horse", "minecraft:skeleton_horse", "minecraft:zombie_horse", "minecraft:donkey", "minecraft:mule"].includes(Entity.type), + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.jump", Player.langCode, Cache["EntityNbt"].getTag("Attributes").toArray().find(Attribute => Attribute.Name === "minecraft:horse.jump_strength")["Current"] / 0.2724275) }, {// 当前移动速度 Conditions: (_Player, Entity) => Entity.isMoving && Entity.speed >= 1, - Text: (Player, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.speed', [Entity.speed.toFixed(2).toString()], Player.langCode) + Text: (Player, Entity) => "\n" + tr("plugins.Waila.entity.speed", Player.langCode, Entity.speed) }, {// 村民职业 - Conditions: (_Player, Entity, Cache) => Entity.type === 'minecraft:villager_v2' && !Entity.isBaby && Cache['EntityNbt'].getData('PreferredProfession') != null, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.village.profession', [I18nAPI.get(`entity.villager.${({ 'armorer': 'armor', 'weaponsmith': 'weapon', 'leatherworker': 'leather', 'toolsmith': 'tool', 'undefined': 'unskilled' })[Cache['EntityNbt'].getData('PreferredProfession')] ?? Cache['EntityNbt'].getData('PreferredProfession')}`, [], Player.langCode)], Player.langCode) + Conditions: (_Player, Entity, Cache) => Entity.type === "minecraft:villager_v2" && !Entity.hasFamily("nitwit") && !Entity.isBaby && Cache["EntityNbt"].getData("PreferredProfession") != null, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.village.profession", Player.langCode, `entity.villager.${({ "armorer": "armor", "weaponsmith": "weapon", "leatherworker": "leather", "toolsmith": "tool", "undefined": "unskilled" })[Cache["EntityNbt"].getData("PreferredProfession")] ?? Cache["EntityNbt"].getData("PreferredProfession")}`) }, {// 燃烧时间 - Conditions: (_Player, Entity) => Entity.isOnFire, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.fire_time', [(Cache['EntityNbt'].getTag('internalComponents').getTag('OnFireComponent').getTag('OnFireTicksRemaining') / 20).toFixed(2).toString()], Player.langCode) + Conditions: (_Player, Entity, Cache) => Entity.isOnFire && Cache["EntityNbt"]?.getTag("internalComponents")?.getTag("OnFireComponent")?.getTag("OnFireTicksRemaining") != null, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.fire_time", Player.langCode, Cache["EntityNbt"].getTag("internalComponents").getTag("OnFireComponent").getTag("OnFireTicksRemaining") / 20) }, {// 无敌时间 - Conditions: (_Player, _Entity, Cache) => Cache['EntityNbt'].getData('HurtTime') > 0, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.Invincible_time', [(Cache['EntityNbt'].getData('HurtTime') / 20).toFixed(1).toString()], Player.langCode) + Conditions: (_Player, _Entity, Cache) => Cache["EntityNbt"].getData("HurtTime") > 0, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.Invincible_time", Player.langCode, Cache["EntityNbt"].getData("HurtTime") / 20) }, {// 玩家游戏模式 Conditions: (_Player, Entity) => Entity.isPlayer(), - Text: (Player, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.gamemode', [I18nAPI.get(`gameMode.${['survival', 'creative', 'adventure', null, null, null, 'spectator'][Entity.toPlayer().gameMode]}`, [], Player.langCode)], Player.langCode) + Text: (Player, Entity) => "\n" + tr("plugins.Waila.entity.gamemode", Player.langCode, tr(`gameMode.${["survival", "creative", "adventure", null, null, null, "spectator"][Entity.toPlayer().gameMode]}`, Player.langCode)) }, {// 末影螨剩余存在时间 - Conditions: (_Player, Entity) => Entity.type === 'minecraft:endermite', - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.endermite.Lifetime', [((2400 - Cache['EntityNbt'].getData('Lifetime')) / 20).toFixed(1).toString()], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === "minecraft:endermite", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.endermite.Lifetime", Player.langCode, 2400 - Cache["EntityNbt"].getData("Lifetime")) }, {// 山羊羊角数量 - Conditions: (_Player, Entity) => Entity.type === 'minecraft:goat', - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.goat.GoatHornCount', [Cache['EntityNbt'].getData('GoatHornCount').toString()], Player.langCode) + Conditions: (_Player, Entity) => Entity.type === "minecraft:goat", + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.goat.GoatHornCount", Player.langCode, Cache["EntityNbt"].getData("GoatHornCount")) }, {// 拥有BUFF - Conditions: (_Player, _Entity, Cache) => Cache['EntityNbt']?.getTag('ActiveEffects') != null, - Text: (Player, _Entity, Cache) => '\n' + I18nAPI.get('plugins.Waila.entity.buffs', [Cache['EntityNbt'].getTag('ActiveEffects').toArray().map(buff => I18nAPI.get('plugins.Waila.entity.buffs.items', [I18nAPI.get(`potion.${Cache['BuffKeyID'][buff.Id]}`, [], Player.langCode), buff.Amplifier === -1 ? I18nAPI.get('plugins.Waila.entity.buffs.maxLevel', [], Player.langCode) : (buff.Amplifier + 1).toString()], Player.langCode)).join('')], Player.langCode) + Conditions: (_Player, Entity) => Entity.getAllEffects().length !== 0, + Text: (Player, /** @type {Entity} */Entity, Cache) => + "\n" + tr("plugins.Waila.entity.buffs", Player.langCode, + Entity.getAllEffectsInfo().map(effectInfo => + [ + "plugins.Waila.entity.buffs.items", + Cache["BuffKeyID"][effectInfo.Id], + effectInfo.Amplifier == 255 ? "plugins.Waila.entity.buffs.maxLevel" : effectInfo.Amplifier + 1 + ] + ) + ) }, {// 朝向 Conditions: true, - Text: (Player, Entity) => '\n' + I18nAPI.get('plugins.Waila.entity.direction', [I18nAPI.get(`plugins.Waila.entity.direction.${['north', 'east', 'south', 'west'][Entity.direction.toFacing()]}`, [], Player.langCode)], Player.langCde) + Text: (Player, Entity) => "\n" + tr("plugins.Waila.entity.direction", Player.langCode, tr(`plugins.Waila.entity.direction.${["north", "east", "south", "west"][Entity.direction.toFacing()]}`, Player.langCode)) + }, + {// 命令方块矿车 + Conditions: (_Player, Entity, Cache) => Entity.type === "minecraft:command_block_minecart" && Cache["EntityNbt"].getData("Command") !== "" && Cache["EntityNbt"].getData("Command").length < 100, + Text: (Player, _Entity, Cache) => "\n" + tr("plugins.Waila.entity.commandblock.command", Player.langCode, Cache["EntityNbt"].getData("Command")) }, {// 村民 - Conditions: (_Player, _Entity, Cache) => Cache['EntityNbt']?.getTag('Offers')?.getTag('Recipes') != null, + Conditions: (_Player, _Entity, Cache) => Cache["EntityNbt"]?.getTag("Offers")?.getTag("Recipes") != null, Text: (Player, _Entity, Cache) => { - let /** @type {NbtList} */OffersNbts = Cache['EntityNbt'].getTag('Offers').getTag('Recipes'),/** @type {String[]} */ OffersTexts = []; + 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 (OffersNbt.getData('tier') > Cache['EntityNbt'].getData('TradeTier')) 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')) { - const BuyItemB = mc.newItem(OffersNbt.getTag('buyB').getData('Name'), OffersNbt.getData('buyCountB')); - OffersTexts[index] += I18nAPI.get('plugins.Waila.entity.village.offers.item2', [BuyItemB.getTranslateName(Player.langCode), BuyItemB.count.toString()], Player.langCode); + if (OffersNbt.getData("tier") > Cache["EntityNbt"].getData("TradeTier")) continue; + const BuyItemA = mc.newItem(OffersNbt.getTag("buyA").getData("Name"), OffersNbt.getData("buyCountA")); + OffersTexts[index] = tr("plugins.Waila.entity.village.offers.item1", Player.langCode, BuyItemA.getTranslateName(Player.langCode), BuyItemA.count); + if (OffersNbt.getTag("buyB")?.getTag("Name")) { + const BuyItemB = mc.newItem(OffersNbt.getTag("buyB").getData("Name"), OffersNbt.getData("buyCountB")); + OffersTexts[index] += tr("plugins.Waila.entity.village.offers.item2", Player.langCode, BuyItemB.getTranslateName(Player.langCode), BuyItemB.count); } - const SellItem = mc.newItem(OffersNbt.getTag('sell').getData('Name'), OffersNbt.getTag('sell').getData('Count')); - OffersTexts[index] += I18nAPI.get('plugins.Waila.entity.village.offers.item3', [SellItem.getTranslateName(Player.langCode), SellItem.count.toString()], Player.langCode); + const SellItem = mc.newItem(OffersNbt.getTag("sell").getData("Name"), OffersNbt.getTag("sell").getData("Count")); + OffersTexts[index] += tr("plugins.Waila.entity.village.offers.item3", Player.langCode, SellItem.getTranslateName(Player.langCode), SellItem.count); } - return '\n' + I18nAPI.get('plugins.Waila.entity.village.offers', [], Player.langCode) + OffersTexts.join('\n'); + return "\n" + tr("plugins.Waila.entity.village.offers", Player.langCode) + OffersTexts.join("\n"); } }, ], @@ -221,11 +240,11 @@ module.exports = { AllAfter: [ {// 距离 Conditions: true, - Text: (Player, Vein) => '\n' + I18nAPI.get('plugins.Waila.distance', [Player.distanceTo(Vein.pos).toFixed(1).toString()], Player.langCode) + Text: (Player, Vein) => "\n" + tr("plugins.Waila.distance", Player.langCode, Player.distanceTo(Vein.pos)) }, {// 坐标 Conditions: true, - Text: (Player, Vein) => '\n' + I18nAPI.get('plugins.Waila.pos', [Vein.pos.x.toFixed(2).toString(), Vein.pos.y.toFixed(2).toString(), Vein.pos.z.toFixed(2).toString()], Player.langCode) + Text: (Player, Vein) => "\n" + tr("plugins.Waila.pos", Player.langCode, Vein.pos.x, Vein.pos.y, Vein.pos.z) }, {// 物品栏上方和actionbar换行(防止领地挡住) Conditions: (_Player, _ViewVector, _Cache, PlayerConfig) => [2, 3].includes(PlayerConfig["Mode"]), @@ -249,9 +268,24 @@ module.exports = { Hz: 0.1, /** 查找最大距离 @type {Number} */ maxDistance: 10, + // https://www.minebbs.com/resources/information-bar.5208/ + /** 是否换行(用于适配材质包) @type {boolean} */ + NewLine: true, }, }; +/** 翻译字符串 @type {function(string,string,...string):string} */ +const tr = (key, language, ...args) => + Array.isArray(key) + ? tr(key[0], language, ...key.slice(1), ...args) + : I18nAPI.get(key, args.map(str => { + if (Array.isArray(str)) return tr(str[0], language, ...str.slice(1)); + if (typeof str !== "number") return I18nAPI.get(str?.toString() ?? "", [], language); + str = str.toFixed(2).toString().replace(/\.?0+$/, ""); + if (/.[0-9]0/i.test(str.slice(-1))) str = str.slice(0, -1); + return str; + }), language); + /** * @typedef {Object} PlayerConfig * @property {Boolean} Enabled 开启状态 diff --git a/Language/en-US.lang b/Language/en-US.lang index f99ccaf..bc8a708 100644 --- a/Language/en-US.lang +++ b/Language/en-US.lang @@ -20,58 +20,60 @@ plugins.Waila.distance=§c distance:§a%s frame plugins.Waila.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s plugins.Waila.block.name=§6%s §7(%s) -plugins.Waila.block.hardness=§7 hardness §6%s +plugins.Waila.block.destroyTime=§7destoryTime §6%ss plugins.Waila.block.destroy=§l%s §r§7 Can it be collected §r plugins.Waila.block.cake.status=§3 Cake status:§c%s/7 -plugins.Waila.block.cake.size=§b capacity:§a%s/%s §d%s/%s +plugins.Waila.block.cake.size=§bcapacity:§a%s/%s §d%s/%s plugins.Waila.block.jukebox=§8Play records §c%s -plugins.Waila.block.beacon=§7 Select effect:§5%s +plugins.Waila.block.beacon=§7Select effect:§5%s %s plugins.Waila.block.noteblock=§c Scale §6:§d%s plugins.Waila.block.composter=§b amount of compost§a:§e%s/8 plugins.Waila.block.mob_spawner=§d Generate monsters:§a%s -plugins.Waila.block.commandblock.command=§d command:Âa%s +plugins.Waila.block.commandblock.command=§d command:§a%s plugins.Waila.block.flower_pot=§dPlanted flowers§b:%s plugins.Waila.block.open_status.open=§eOpen status:§6Open plugins.Waila.block.open_status.close=§eOpen status:§6Close plugins.Waila.block.Cropnum=§3 Growth Level:§g%s plugins.Waila.block.RingingTime=§eRinging time:§d%s -plugins.Waila.block.BrewingStand.cookTime=§d Brewing time left:Âa%s -plugins.Waila.block.BrewingStand.Fuel=§6 Fuel left:Âb%s/%s -plugins.Waila.block.cauldron=§cPotion effect:Âd%sÂ6(%s) -plugins.Waila.block.powered_comparator=§dSignal strength:Âc%s -plugins.Waila.block.end_gateway=§cTransmission coordinates:Âd%s -plugins.Waila.block.furnace.StoredXPInt=§b Stored experience:Âa%s -plugins.Waila.block.lodestone=§eMagnet ID:Âb%s -plugins.Waila.block.furnace.CookTime=§eBurning progress percentage:Âc%s -plugins.Waila.block.furnace.Burn=§dRemaining fuel:Âb%s/%s -plugins.Waila.block.sign=§cLast edited by player:Â6%s -plugins.Waila.block.redstonelv=§cRedstone level:Âe%s +plugins.Waila.block.BrewingStand.cookTime=§d Brewing time left:§a%s +plugins.Waila.block.BrewingStand.Fuel=§6 Fuel left:§b%s/%s +plugins.Waila.block.cauldron=§cPotion effect:§d%s§6(%s) +plugins.Waila.block.powered_comparator=§dSignal strength:§c%s +plugins.Waila.block.end_gateway=§cTransmission coordinates:§d%s +plugins.Waila.block.furnace.StoredXPInt=§b Stored experience:§a%s +plugins.Waila.block.lodestone=§eMagnet ID:§b%s +plugins.Waila.block.furnace.CookTime=§eBurning progress percentage:§c%s +plugins.Waila.block.furnace.Burn=§dRemaining fuel:§b%s/%s +plugins.Waila.block.sign=§cLast edited by player:§6%s§e|§6%s +plugins.Waila.block.redstonelv=§cRedstone level:§e%s +plugins.Waila.block.decorated_pot=§bStored Items:§6%s*§d%s plugins.Waila.entity.name=§6%s §7(%s) plugins.Waila.entity.pose=§d Pose ID:§a%s plugins.Waila.entity.painting=§a theme:§6%s -plugins.Waila.entity.slime.size=§6 size:Â 3%s -plugins.Waila.entity.falling_block=§7 square:Â 9%s -plugins.Waila.entity.tnt=§dExplosion time:Âa%s(Tick) +plugins.Waila.entity.slime.size=§6 size:§ 3%s +plugins.Waila.entity.falling_block=§7 square:§ 9%s +plugins.Waila.entity.tnt=§dExplosion time:§a%s(Tick) plugins.Waila.entity.village.offers=§cTrading info:\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.breedcooldown=§eBreeding cooldown:§c%ss -plugins.Waila.entity.age=§6 Remaining adult time:Âc%ss -plugins.Waila.entity.jump=§dJump height:Â%ss -plugins.Waila.entity.speed=§eCurrent movement speed:Âb%s m/s +plugins.Waila.entity.age=§6 Remaining adult time:§c%ss +plugins.Waila.entity.jump=§dJump height:§%ss +plugins.Waila.entity.speed=§eCurrent movement speed:§b%s m/s plugins.Waila.entity.village.profession=§b village profession §e%s plugins.Waila.entity.Invincible_time=§d Invincible time:§6%s -plugins.Waila.entity.buffs=§a Possess buffs:Âr%s +plugins.Waila.entity.commandblock.command=§eCommand:§a%s +plugins.Waila.entity.buffs=§a Possess buffs:§r%s plugins.Waila.entity.buffs.items= §e%s§6*§b%s plugins.Waila.entity.buffs.maxLevel=§c full level plugins.Waila.entity.gamemode=§e game mode §c%s plugins.Waila.entity.endermite.Lifetime=§a Existence time:§6%s -plugins.Waila.entity.goat.GoatHornCount=§a Goat horn count:Âe%s -plugins.Waila.entity.fire_time=§cBurn time:Â 4%ss -plugins.Waila.entity.direction=§d Direction:Âa%s +plugins.Waila.entity.goat.GoatHornCount=§a Goat horn count:§e%s +plugins.Waila.entity.fire_time=§cBurn time:§ 4%ss +plugins.Waila.entity.direction=§d Direction:§a%s plugins.Waila.entity.direction.east=East plugins.Waila.entity.direction.south=South plugins.Waila.entity.direction.west=West diff --git a/Language/en_GB.lang b/Language/en_GB.lang index 8e5a56f..196e2ba 100644 --- a/Language/en_GB.lang +++ b/Language/en_GB.lang @@ -20,58 +20,60 @@ plugins.Waila.distance=§c distance:§a%s frame plugins.Waila.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s plugins.Waila.block.name=§6%s §7(%s) -plugins.Waila.block.hardness=§7 hardness §6%s +plugins.Waila.block.destroyTime=§7destroyTime §6%ss plugins.Waila.block.destroy=§l%s §r§7 Can it be collected §r plugins.Waila.block.cake.status=§3 Cake status:§c%s/7 plugins.Waila.block.cake.size=§b capacity:§a%s/%s §d%s/%s plugins.Waila.block.jukebox=§8Play record §c%s -plugins.Waila.block.beacon=§7 Select effect:§5%s +plugins.Waila.block.beacon=§7Select effect:§5%s %s plugins.Waila.block.noteblock=§c Scale §6:§d%s -plugins.Waila.block.composter=§b amount of compost§a:§e%s/8 -plugins.Waila.block.mob_spawner=§d Generate monster:Âa%s -plugins.Waila.block.commandblock.command=§d command:Âa%s +plugins.Waila.block.composter=§bamount of compost§a:§e%s/8 +plugins.Waila.block.mob_spawner=§dGenerate monster:§a%s +plugins.Waila.block.commandblock.command=§d command:§a%s plugins.Waila.block.flower_pot=§dPlanted flowers§b:%s plugins.Waila.block.open_status.open=§eOpen status:§6Open plugins.Waila.block.open_status.close=§eOpen status:§6Close plugins.Waila.block.Cropnum=§3 Growth Level:§g%s -plugins.Waila.block.RingingTime=§eSwinging Time:Âd%s -plugins.Waila.block.BrewingStand.cookTime=§d Brewing time left:Âa%s -plugins.Waila.block.BrewingStand.Fuel=§6 Remaining Fuel:Âb%s/%s -plugins.Waila.block.cauldron=§cPotion effect:Âd%sÂ6(%s) -plugins.Waila.block.powered_comparator=§dSignal strength:Âc%s -plugins.Waila.block.end_gateway=§cTransmission coordinates:Âd%s -plugins.Waila.block.furnace.StoredXPInt=§b Stored experience:Âa%s -plugins.Waila.block.lodestone=§eMagnet ID:Âb%s -plugins.Waila.block.furnace.CookTime=§eBurning progress percentage:Âc%s -plugins.Waila.block.furnace.Burn=§dRemaining fuel:Âb%s/%s -plugins.Waila.block.sign=§cLast edited player:Â6%s -plugins.Waila.block.redstonelv=§cRedstone level:Âe%s +plugins.Waila.block.RingingTime=§eSwinging Time:§d%s +plugins.Waila.block.BrewingStand.cookTime=§d Brewing time left:§a%s +plugins.Waila.block.BrewingStand.Fuel=§6 Remaining Fuel:§b%s/%s +plugins.Waila.block.cauldron=§cPotion effect:§d%s§6(%s) +plugins.Waila.block.powered_comparator=§dSignal strength:§c%s +plugins.Waila.block.end_gateway=§cTransmission coordinates:§d%s +plugins.Waila.block.furnace.StoredXPInt=§b Stored experience:§a%s +plugins.Waila.block.lodestone=§eMagnet ID:§b%s +plugins.Waila.block.furnace.CookTime=§eBurning progress percentage:§c%s +plugins.Waila.block.furnace.Burn=§dRemaining fuel:§b%s/%s +plugins.Waila.block.sign=§cLast edited player:§6%s§e|§6%s +plugins.Waila.block.redstonelv=§cRedstone level:§e%s +plugins.Waila.block.decorated_pot=§bStored Items:§6%s*§d%s plugins.Waila.entity.name=§6%s §7(%s) plugins.Waila.entity.pose=§d Pose ID:§a%s plugins.Waila.entity.painting=§a theme:§6%s plugins.Waila.entity.slime.size=§6 size:§3%s -plugins.Waila.entity.falling_block=§7 square:Â 9%s -plugins.Waila.entity.tnt=§dExplosion time:Âa%s(Tick) +plugins.Waila.entity.falling_block=§7 square:§ 9%s +plugins.Waila.entity.tnt=§dExplosion time:§a%s(Tick) plugins.Waila.entity.village.offers=§cTrading info:\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.breedcooldown=§eBreeding cooldown:§c%ss -plugins.Waila.entity.age=§6 Remaining adult time:Âc%ss -plugins.Waila.entity.jump=§dJump height:Â%ss -plugins.Waila.entity.speed=§eCurrent speed:Âb%s m/s +plugins.Waila.entity.age=§6 Remaining adult time:§c%ss +plugins.Waila.entity.jump=§dJump height:§%ss +plugins.Waila.entity.speed=§eCurrent speed:§b%s m/s plugins.Waila.entity.village.profession=§b village profession §e%s plugins.Waila.entity.Invincible_time=§d Invincible time:§6%s -plugins.Waila.entity.buffs=§a Possess buffs:Âr%s +plugins.Waila.entity.commandblock.command=§eCommand:§a%s +plugins.Waila.entity.buffs=§a Possess buffs:§r%s plugins.Waila.entity.buffs.items= §e%s§6*§b%s plugins.Waila.entity.buffs.maxLevel=§c full level plugins.Waila.entity.gamemode=§e game mode §c%s plugins.Waila.entity.endermite.Lifetime=§a Existence time:§6%s -plugins.Waila.entity.goat.GoatHornCount=§a Goat horn count:Âe%s -plugins.Waila.entity.fire_time=§cBurn time:Â 4%ss -plugins.Waila.entity.direction=§d Direction:Âa%s +plugins.Waila.entity.goat.GoatHornCount=§a Goat horn count:§e%s +plugins.Waila.entity.fire_time=§cBurn time:§ 4%ss +plugins.Waila.entity.direction=§d Direction:§a%s plugins.Waila.entity.direction.east=East plugins.Waila.entity.direction.south=South plugins.Waila.entity.direction.west=West diff --git a/Language/zh_CN.lang b/Language/zh_CN.lang index 840167b..e1c185c 100644 --- a/Language/zh_CN.lang +++ b/Language/zh_CN.lang @@ -20,12 +20,12 @@ plugins.Waila.distance=§c距离:§a%s 格 plugins.Waila.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s plugins.Waila.block.name=§6%s §7(%s) -plugins.Waila.block.hardness=§7硬度 §6%s +plugins.Waila.block.destroyTime=§7挖掘时间 §6%ss 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 §d%s/%s plugins.Waila.block.jukebox=§8播放唱片 §c%s -plugins.Waila.block.beacon=§7选择效果:§5%s +plugins.Waila.block.beacon=§7选择效果:§5%s %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 @@ -44,8 +44,9 @@ plugins.Waila.block.furnace.StoredXPInt=§b存储经验:§a%s plugins.Waila.block.lodestone=§e磁石ID:§b%s plugins.Waila.block.furnace.CookTime=§e燃烧进度百分比:§c%s plugins.Waila.block.furnace.Burn=§d剩余燃料:§b%s/%s -plugins.Waila.block.sign=§c最后编辑玩家:§6%s +plugins.Waila.block.sign=§c最后编辑玩家:§6%s§e|§6%s plugins.Waila.block.redstonelv=§c红石等级:§e%s +plugins.Waila.block.decorated_pot=§b存储物品:§6%s*§d%s plugins.Waila.entity.name=§6%s §7(%s) plugins.Waila.entity.pose=§d姿势ID:§a%s @@ -64,6 +65,7 @@ plugins.Waila.entity.jump=§d跳跃高度:§a%s格 plugins.Waila.entity.speed=§e当前移动速度:§b%s m/s plugins.Waila.entity.village.profession=§b村民职业 §e%s plugins.Waila.entity.Invincible_time=§d无敌时间:§6%s +plugins.Waila.entity.commandblock.command=§e命令:§a%s plugins.Waila.entity.buffs=§a拥有buff:§r%s plugins.Waila.entity.buffs.items= §e%s§6*§b%s plugins.Waila.entity.buffs.maxLevel=§c满级 diff --git a/Language/zh_TW.lang b/Language/zh_TW.lang index df91580..d0789ad 100644 --- a/Language/zh_TW.lang +++ b/Language/zh_TW.lang @@ -20,12 +20,12 @@ plugins.Waila.distance=§c距離:§a%s 格 plugins.Waila.pos=§7X:§g%s §7Y:§g%s §7Z:§g%s plugins.Waila.block.name=§6%s §7(%s) -plugins.Waila.block.hardness=§7硬度 §6%s +plugins.Waila.block.destroyTime=§7挖掘時間 §6%ss 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 §d%s/%s plugins.Waila.block.jukebox=§8播放唱片 §c%s -plugins.Waila.block.beacon=§7選擇效果:§5%s +plugins.Waila.block.beacon=§7選擇效果:§5%s %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 @@ -44,8 +44,9 @@ plugins.Waila.block.furnace.StoredXPInt=§b存儲經驗:§a%s plugins.Waila.block.lodestone=§e磁石ID:§b%s plugins.Waila.block.furnace.CookTime=§e燃燒進度百分比:§c%s plugins.Waila.block.furnace.Burn=§d剩餘燃料:§b%s/%s -plugins.Waila.block.sign=§c最後編輯玩家:§6%s +plugins.Waila.block.sign=§c最後編輯玩家:§6%s§e|§6%s plugins.Waila.block.redstonelv=§c紅石等級:§e%s +plugins.Waila.block.decorated_pot=§b存儲物品:§6%s*§d%s plugins.Waila.entity.name=§6%s §7(%s) plugins.Waila.entity.pose=§d姿勢ID:§a%s @@ -64,6 +65,7 @@ plugins.Waila.entity.jump=§d跳躍高度:§a%s格 plugins.Waila.entity.speed=§e當前移動速度:§b%s m/s plugins.Waila.entity.village.profession=§b村民職業 §e%s plugins.Waila.entity.Invincible_time=§d無敵時間:§6%s +plugins.Waila.entity.commandblock.command=§e命令:§a%s plugins.Waila.entity.buffs=§a擁有buff:§r%s plugins.Waila.entity.buffs.items= §e%s§6*§b%s plugins.Waila.entity.buffs.maxLevel=§c滿級 diff --git a/README.md b/README.md index edd357d..91e82fe 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## 简单介绍 Waila 是一个 LSE 高亮显示插件,他集成了许多原版信息的具体化显示,可以更好的方便玩家对方块或生物的信息进行查看 -> 默认自带 47 种信息属性显示 +> 默认自带 49 种信息属性显示 ## 图骗展示 @@ -63,6 +63,8 @@ Waila 是一个 LSE 高亮显示插件,他集成了许多原版信息的具体 游戏内玩家可输入/waila 来设置自己的 Waila 开关及样式 ![表单](https://github.com/zimuya4153/LSE_Waila/blob/main/image/form.png?raw=true) PS:如果装了我们的 [UI 包](https://wwm.lanzouq.com/iSMiT20o39ze "点击前往下载链接"),那活动栏将是一个非常好的选择 +PS:如果装了 [信息栏](https://www.minebbs.com/resources/information-bar.5208/ "点击前往下载链接"),那侧边栏也是一个很好的选择 +(装了信息栏材质包,需前往`Config.json`文件修改`NewLine`为`false`) `温馨提示:"UI 包"是可以被点击的超链接` # 特别操作 @@ -159,6 +161,9 @@ module.exports = { Hz: 0.1, /** 查找最大距离 @type {Number} */ maxDistance: 10, + // https://www.minebbs.com/resources/information-bar.5208/ + /** 是否换行(用于适配材质包) @type {boolean} */ + NewLine: true, }, }; ``` diff --git a/Waila.js b/Waila.js index 37dd8c5..ec1cc60 100644 --- a/Waila.js +++ b/Waila.js @@ -48,10 +48,17 @@ LLSE_Player.prototype.updateBossBarTitle = return this.sendPacket(bs.createPacket(0x4A)); } -/** 配置文件 @type {{AllBefore:ConfigItem[],Block:ConfigItem[],Entity:ConfigItem[],AllAfter:ConfigItem[],Bossbar:{ID:Number,Color:Number,Percent:Number},DefaultText:String,DefaultMode:0|1|2|3,Hz:Number,maxDistance:Number}} */ +/** 配置文件 @type {{AllBefore:ConfigItem[],Block:ConfigItem[],Entity:ConfigItem[],AllAfter:ConfigItem[],Bossbar:{ID:Number,Color:Number,Percent:Number},DefaultText:String,DefaultMode:0|1|2|3,Hz:Number,maxDistance:Number,NewLine:boolean}} */ const Config = require('./Waila/Config.js').Config; -const { PAPI } = require('./GMLIB-LegacyRemoteCallApi/lib/BEPlaceholderAPI-JS.js'); -const { I18nAPI, Minecraft } = require('./GMLIB-LegacyRemoteCallApi/lib/GMLIB_API-JS.js'); +(() => { + let requireFunction = {}; + const modules = ['GMLIB-LegacyRemoteCallApi/lib/GMLIB_API-JS.js', 'GMLIB-LegacyRemoteCallApi/lib/EventAPI-JS.js', 'GMLIB-LegacyRemoteCallApi/lib/BEPlaceholderAPI-JS.js']; + modules.forEach(path => { + try { requireFunction = Object.assign(requireFunction, require(`./${path}`)); } catch { } + try { requireFunction = Object.assign(requireFunction, require(`./../${path}`)); } catch { } + }); + Object.keys(requireFunction).forEach(name => this[name] = requireFunction[name]); +})(); const /** 玩家数据文件 */ Data = new JsonConfigFile('./plugins/Waila/Data.json'); Minecraft.setFixI18nEnabled();// 修复Mojang的i18n问题 @@ -68,7 +75,7 @@ setInterval(() => { ) return; let ViewEntity = Player.getEntityFromViewVector(Config.maxDistance), ViewBlock = Player.getBlockFromViewVector(false, false, Config.maxDistance, false); let text = ''; - if ((!ViewBlock || ViewBlock?.pos?.toString().replace(/ /g, '').includes('(0,0,0)')) && !ViewEntity) { + if (((!ViewBlock || (ViewBlock.pos.x === 0 && ViewBlock.pos.y === 0 && ViewBlock.pos.z === 0 && Player.distanceTo(ViewBlock.pos) > Config.maxDistance)) && !ViewEntity) || Player.isSpectator) { text += Config.DefaultText.replace(/&(.*)&/g, (_, key) => I18nAPI.get(key, [], Player.langCode)); } else { let TempCache = { @@ -77,7 +84,7 @@ setInterval(() => { 'BlockEntityNbt': ViewBlock.hasBlockEntity() ? ViewBlock.getBlockEntity().getNbt() : null, 'BlockContainer': ViewBlock.hasContainer() ? ViewBlock.getContainer() : null, 'EntityNbt': ViewEntity ? ViewEntity.getNbt() : null, - 'BuffKeyID': [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'], + 'BuffKeyID': ['potion.empty', 'potion.moveSpeed', 'potion.moveSlowdown', 'potion.digSpeed', 'potion.digSlowDown', 'potion.damageBoost', 'potion.heal', 'potion.harm', 'potion.jump', 'potion.confusion', 'potion.regeneration', 'potion.resistance', 'potion.fireResistance', 'potion.waterBreathing', 'potion.invisibility', 'potion.blindness', 'potion.nightVision', 'potion.hunger', 'potion.weakness', 'potion.poison', 'potion.wither', 'potion.healthBoost', 'potion.absorption', 'potion.saturation', 'potion.levitation', 'potion.poison', 'potion.conduitPower', 'potion.slowFalling', 'effect.badOmen', 'effect.villageHero', 'effect.darkness'], } const EvalGetText = /** @@ -85,18 +92,18 @@ setInterval(() => { * @returns {String} */ Items => { - const ErrorLog = (text,error) => { - const ErrorText = `\n${text}报错:${error.message}\n文本条件:${Items.Conditions.toString()}\n文本结果:${Items.Text.toString()}\n堆栈:\n${error.stack}` + const ErrorLog = (text, error) => { + const ErrorText = `\n${text}报错:${error.message} 玩家:${Player.realName}(${Player.uuid})\n文本条件:${Items.Conditions.toString()}\n文本结果:${Items.Text.toString()}\n堆栈:\n${error.stack}` if (ErrorList.includes(ErrorText)) return; ErrorList.push(ErrorText); logger.error(ErrorText); } try { if (!(typeof (Items.Conditions) === 'function' ? Items.Conditions(Player, ViewEntity ?? ViewBlock, TempCache, PlayerConfig) : Items.Conditions)) return ''; - } catch (error) { ErrorLog('条件判断',error) } + } catch (error) { ErrorLog('条件判断', error) } try { return typeof (Items.Text) === 'string' ? Items.Text : Items.Text(Player, ViewEntity ?? ViewBlock, TempCache, PlayerConfig); - } catch (error) { ErrorLog('返回文本结果',error) } + } catch (error) { ErrorLog('返回文本结果', error) } return '' }; text += Config.AllBefore.map(EvalGetText).join(''); @@ -116,10 +123,16 @@ setInterval(() => { case 3: return Player.setTitle(text, 4); case 4: { Player.removeSidebar(); - Player.setSidebar(I18nAPI.get('plugins.Waila.sidebar.title', [], Player.langCode), text.split('\n').reduce((acc, val, index) => { - acc[val] = index + 1; - return acc; - }, {}),0); + Player.setSidebar( + I18nAPI.get('plugins.Waila.sidebar.title', [], Player.langCode), + Config.NewLine + ? text.split('\n').reduce((acc, val, index) => { + acc[val] = index + 1; + return acc; + }, {}) + : { [text]: 0 } + , 0 + ); } } }); @@ -150,16 +163,31 @@ mc.listen('onServerStarted', () => { const /** @type {PlayerConfig} */ PlayerConfig = Data.get(Player.uuid, { 'Enabled': 1, 'Mode': Config.DefaultMode }); 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','sidebar'].map(key => I18nAPI.get(`plugins.Waila.gui.dropdown.items.${key}`, [], Player.langCode)), PlayerConfig['Mode']); + Form.addDropdown(I18nAPI.get('plugins.Waila.gui.dropdown', [], Player.langCode), ['bossbar', 'tell_popup', 'tell_tip', 'actionBar', 'sidebar'].map(key => I18nAPI.get(`plugins.Waila.gui.dropdown.items.${key}`, [], Player.langCode)), PlayerConfig['Mode']); Player.sendForm(Form, (Player, FormData) => { if (!FormData) return Player.tell(I18nAPI.get('plugins.Waila.gui.cancel', [], Player.langCode)); Data.set(Player.uuid, Object.assign({}, { Enabled: FormData[0], Mode: FormData[1] })); - if(PlayerConfig.Mode===4&&FormData[1]!==4) Player.removeSidebar(); + if (PlayerConfig.Mode === 4 && FormData[1] !== 4) Player.removeSidebar(); if (FormData[0] && FormData[1] === 0) Player.setBossBar(Config.Bossbar.ID, Config.DefaultText.replace(/&(.*)&/g, (_, key) => I18nAPI.get(key, [], Player.langCode)), Config.Bossbar.Percent, Config.Bossbar.Color); - else - Player.removeBossBar(Config.Bossbar.ID); + else Player.removeBossBar(Config.Bossbar.ID); Player.tell(I18nAPI.get('plugins.Waila.gui.succes', [], Player.langCode)); }); }); -}); \ No newline at end of file +}); + +/** + * 插件卸载检测(防重载或卸载bossbar/sidebar残留) + * @param {string} cmd 命令 + */ +function unloadDetection(cmd) { + /^ll\s+(?:reload|unload)\s+(?:Waila|\[minebbs\]-Waila)$/.test(cmd) + && mc.getOnlinePlayers().forEach(Player => + Data.get(Player.uuid, { 'Enabled': 1, 'Mode': Config.DefaultMode }).Mode === 4 + ? Player.removeSidebar() + : Player.removeBossBar(Config.Bossbar.ID) + ); +} + +mc.listen('onConsoleCmd', cmd => unloadDetection(cmd)); +mc.listen('onPlayerCmd', (player, cmd) => player.permLevel >= 3 && unloadDetection(cmd) || true); \ No newline at end of file diff --git a/manifest.json b/manifest.json index 434e5e7..5c1b869 100644 --- a/manifest.json +++ b/manifest.json @@ -4,19 +4,16 @@ "type": "lse-quickjs", "description":"普普通通的搞高亮显示", "author":"小小的子沐呀", - "version":"1.4.0", + "version":"1.4.1", "dependencies": [ { - "name": "legacy-script-engine-quickjs", - "version":"0.7.9" + "name": "legacy-script-engine-quickjs" }, { - "name": "GMLIB", - "version":"0.12.8" + "name": "GMLIB" }, { - "name": "GMLIB-LegacyRemoteCallApi", - "version":"0.12.8" + "name": "GMLIB-LegacyRemoteCallApi" } ] } \ No newline at end of file diff --git a/tooth.json b/tooth.json index 39b0c31..4063032 100644 --- a/tooth.json +++ b/tooth.json @@ -1,7 +1,7 @@ { "format_version": 2, "tooth": "github.com/zimuya4153/LSE_Waila", - "version": "1.4.0", + "version": "1.4.1", "info": { "name": "LSE_Waila", "description": "普普通通的高亮显示~", @@ -15,7 +15,7 @@ "legacyscriptengine" ] }, - "asset_url": "https://github.com/zimuya4153/LSE_Waila/releases/download/v1.4.0/LSE_Waila-1.4.0.zip", + "asset_url": "https://github.com/zimuya4153/LSE_Waila/releases/download/v1.4.1/LSE_Waila-1.4.1.zip", "dependencies": { "github.com/LiteLDev/LeviLamina": ">=0.12.x", "gitea.litebds.com/LiteLDev/legacy-script-engine-quickjs": ">=0.7.9",