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 开关及样式

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",