From 26faa2ecc2360aa5b9b815d181807b9aff60c811 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Wed, 18 Feb 2026 18:04:04 -0300
Subject: [PATCH 03/20] Enhance createItemElement with damage attributes
Refactor item element creation to include root damage and durability attributes.
---
structure-editor/script.js | 57 ++++++++++++++++++++++++++++++--------
1 file changed, 46 insertions(+), 11 deletions(-)
diff --git a/structure-editor/script.js b/structure-editor/script.js
index c6b0408..5c24a75 100644
--- a/structure-editor/script.js
+++ b/structure-editor/script.js
@@ -1269,24 +1269,40 @@ function createItemElement(itemdata){
if(!itemdata.Name) return document.createElement("empty");
if(itemdata.Count && itemdata.Count.value < 1) return document.createElement("empty");
- let name = itemdata.Name.value;
+ let baseName = itemdata.Name.value; // ex: "minecraft:potion"
let count = itemdata.Count.value;
let tags = (itemdata.hasOwnProperty("tag") ? itemdata.tag.value : {});
- let damage = (tags.Damage ? itemdata.Damage.value : false);
- let enchanted = tags.hasOwnProperty("ench"); //TODO: list enchantment data
- //TODO: item custom names, ect.
+
+ let rootDamage = itemdata.Damage ? itemdata.Damage.value : 0; // data/metadata (o que queremos usar!)
+ let durabilityDamage = (tags.Damage ? tags.Damage.value : 0); // durabilidade gasta
+
+ let enchanted = tags.hasOwnProperty("ench");
+
+ // Se houver rootDamage >0, "injeta" no identifier como :data
+ let finalIdentifier = baseName;
+ if (rootDamage > 0) {
+ finalIdentifier += ":" + rootDamage; // vira "minecraft:potion:5"
+ }
let itemelement = document.createElement("mcitem");
- itemelement.setAttribute("identifier", name);
+ itemelement.setAttribute("identifier", finalIdentifier); // ← agora usa o com data!
itemelement.setAttribute("count", count);
+
+ // Barra de durabilidade (já separada, como antes)
+ if (durabilityDamage > 0) {
+ itemelement.setAttribute("damage", durabilityDamage);
+ }
+
+ // Opcional: se quiser manter rootDamage separado pra debug/futuro
+ if (rootDamage > 0) {
+ itemelement.setAttribute("data", rootDamage);
+ }
+
itemelement.setAttribute("width", "27px");
itemelement.setAttribute("height", "27px");
- itemelement.classList = ["nohover hovertooltip"];
- itemelement.classList.toggle("enchanted", enchanted)
+ itemelement.classList.add("nohover", "hovertooltip");
+ itemelement.classList.toggle("enchanted", enchanted);
itemelement.style.fontSize = "9pt";
- if(damage){
- itemelement.setAttribute("damage", damage);
- }
return itemelement;
}
@@ -1953,6 +1969,8 @@ function openTileEntityEditor(){
// Uses the same function as the Item Frame to create the visual icon.
document.getElementById("tentity-decoratedpot-item").appendChild(createItemElement(tileEntity.item.value));
}
+ document.getElementById("tentity-decoratedpot-loottable").value = currentValidTile.data.hasOwnProperty("LootTable") ? currentValidTile.data.LootTable.value : "";
+ document.getElementById("tentity-decoratedpot-loottableseed").value = currentValidTile.data.hasOwnProperty("LootTableSeed") ? currentValidTile.data.LootTableSeed.value : "";
// If there is any logic to Sherds (shards), it continues here...
@@ -2837,7 +2855,24 @@ function saveTileEntity(){
}
break;
}
- case 'decoratedpot': {
+ case 'decoratedpot': {
+ if(document.getElementById("tentity-decoratedpot-loottable").value != ""){
+ currentValidTile.data.LootTable = {
+ "type": "string",
+ "value": document.getElementById("tentity-decoratedpot-loottable").value
+ }
+ } else {
+ delete currentValidTile.data.LootTable;
+ }
+
+ if(document.getElementById("tentity-decoratedpot-loottable").value != ""){
+ currentValidTile.data.LootTableSeed = {
+ "type": "int",
+ "value": parseFloat(document.getElementById("tentity-decoratedpot-loottableseed").value)
+ }
+ } else {
+ delete currentValidTile.data.LootTableSeed;
+ }
tileEntity.sherds = nbt.list(nbt.string([
document.getElementById("tentity-decoratedpot-sherd0").value,
document.getElementById("tentity-decoratedpot-sherd1").value,
From a4b1d8c3409e76c9a0de17b0395f8ba0b021d552 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Wed, 18 Feb 2026 18:20:55 -0300
Subject: [PATCH 04/20] Refactor comments and variable names for clarity
---
structure-editor/script.js | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/structure-editor/script.js b/structure-editor/script.js
index 5c24a75..381bc25 100644
--- a/structure-editor/script.js
+++ b/structure-editor/script.js
@@ -1269,31 +1269,30 @@ function createItemElement(itemdata){
if(!itemdata.Name) return document.createElement("empty");
if(itemdata.Count && itemdata.Count.value < 1) return document.createElement("empty");
- let baseName = itemdata.Name.value; // ex: "minecraft:potion"
+ let baseName = itemdata.Name.value;
let count = itemdata.Count.value;
let tags = (itemdata.hasOwnProperty("tag") ? itemdata.tag.value : {});
- let rootDamage = itemdata.Damage ? itemdata.Damage.value : 0; // data/metadata (o que queremos usar!)
- let durabilityDamage = (tags.Damage ? tags.Damage.value : 0); // durabilidade gasta
+ let rootDamage = itemdata.Damage ? itemdata.Damage.value : 0; // data/metadata
+ let durabilityDamage = (tags.Damage ? tags.Damage.value : 0); // durability
let enchanted = tags.hasOwnProperty("ench");
- // Se houver rootDamage >0, "injeta" no identifier como :data
+ // If rootDamage >0, "inject" it into the identifier as :data
let finalIdentifier = baseName;
if (rootDamage > 0) {
- finalIdentifier += ":" + rootDamage; // vira "minecraft:potion:5"
+ finalIdentifier += ":" + rootDamage; // turn into "minecraft:potion:5"
}
let itemelement = document.createElement("mcitem");
- itemelement.setAttribute("identifier", finalIdentifier); // ← agora usa o com data!
+ itemelement.setAttribute("identifier", finalIdentifier);
itemelement.setAttribute("count", count);
- // Barra de durabilidade (já separada, como antes)
+ // Durability bar
if (durabilityDamage > 0) {
itemelement.setAttribute("damage", durabilityDamage);
}
- // Opcional: se quiser manter rootDamage separado pra debug/futuro
if (rootDamage > 0) {
itemelement.setAttribute("data", rootDamage);
}
From 71414021dee6b5cb47982f4405b62051edbd0ab1 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Wed, 18 Feb 2026 19:53:29 -0300
Subject: [PATCH 05/20] Update durability values for items in script.js
---
item/script.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/item/script.js b/item/script.js
index da216dd..e0ed54e 100644
--- a/item/script.js
+++ b/item/script.js
@@ -204,6 +204,8 @@ var mcitems = {
'minecraft:diamond_spear': 1561,
'minecraft:netherite_spear': 2031,
+ 'minecraft:brush': 64,
+ 'minecraft:mace': 500,
'minecraft:fishing_rod': 384,
'minecraft:flint_and_steel': 64,
'minecraft:carrot_on_a_stick': 25,
@@ -212,7 +214,7 @@ var mcitems = {
'minecraft:bow': 384,
'minecraft:trident': 250,
'minecraft:elytra': 432,
- 'minecraft:crossbow': 464,
+ 'minecraft:crossbow': 465,
'minecraft:warped_fungus_on_a_stick': 100,
},
},
From 13144b53b28c0b047f531fe1a65322450e7d093f Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 03:22:52 -0300
Subject: [PATCH 06/20] Updated map
---
item/data/mapping.json | 377 ++++++++++++++++++++++++-----------------
1 file changed, 219 insertions(+), 158 deletions(-)
diff --git a/item/data/mapping.json b/item/data/mapping.json
index a8522ab..37b99cc 100644
--- a/item/data/mapping.json
+++ b/item/data/mapping.json
@@ -207,6 +207,39 @@
"minecraft:red_concrete_powder",
"minecraft:black_concrete_powder"
],
+ "minecraft:suspicious_stew": [
+ {"description": "Night Vision (0:05)"},
+ {"description": "Jump Boost (0:05)"},
+ {"description": "§cWeakness (0:07)"},
+ {"description": "§cBlindness (0:07)"},
+ {"description": "§cPoison (0:11)"},
+ {"description": "Saturation (0:03)"},
+ {"description": "Saturation (0:03)"},
+ {"description": "Fire Resistance (0:03)"},
+ {"description": "Regeneration (0:07)"},
+ {"description": "§cWither (0:07)"},
+ {"description": "Night Vision (0:05)"},
+ {"description": "§cBlindness (0:07)"},
+ {"description": "§cNausea (0:07)"}
+ ],
+
+ "minecraft:filled_map": [
+ {"readable": "Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_filled.png"},
+ {},
+ {"readable": "Locator Map" },
+ {"readable": "Ocean Explorer Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_monument.png"},
+ {"readable": "Woodland Explorer Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_mansion.png"},
+ {"readable": "Treasure Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_nautilus.png"},
+ {"readable": "Locked Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_locked.png"},
+ {"readable": "Snowy Village Map" },
+ {"readable": "Taiga Village Map" },
+ {"readable": "Plains Village Map" },
+ {"readable": "Savanna Village Map" },
+ {"readable": "Desert Village Map" },
+ {"readable": "Jungle Village Map" },
+ {"readable": "Swamp Village Map" },
+ {"readable": "Trial Explorer Map", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/map_trial_chambers.png"}
+ ],
"minecraft:arrow": [
"minecraft:arrow",
"minecraft:tipped_arrow",
@@ -214,44 +247,49 @@
"minecraft:tipped_arrow",
"minecraft:tipped_arrow",
"minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow",
- "minecraft:tipped_arrow"
- ],
+ {"readable": "Arrow of Night Vision", "description": "Night Vision (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_nightvision.png"},
+ {"readable": "Arrow of Night Vision", "description": "Night Vision (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_nightvision.png"},
+ {"readable": "Arrow of Invisibility", "description": "Invisibility (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_invisibility.png"},
+ {"readable": "Arrow of Invisibility", "description": "Invisibility (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_invisibility.png"},
+ {"readable": "Arrow of Leaping", "description": "Jump Boost (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_leaping.png"},
+ {"readable": "Arrow of Leaping", "description": "Jump Boost (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_leaping.png"},
+ {"readable": "Arrow of Leaping", "description": "Jump Boost II (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_leaping.png"},
+ {"readable": "Arrow of Fire Resistance", "description": "Fire Resistance (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_fireres.png"},
+ {"readable": "Arrow of Fire Resistance", "description": "Fire Resistance (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_fireres.png"},
+ {"readable": "Arrow of Swiftness", "description": "Speed (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_swift.png"},
+ {"readable": "Arrow of Swiftness", "description": "Speed (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_swift.png"},
+ {"readable": "Arrow of Swiftness", "description": "Speed II (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_swift.png"},
+ {"readable": "Arrow of Slowness", "description": "§cSlowness (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_slow.png"},
+ {"readable": "Arrow of Slowness", "description": "§cSlowness (0:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_slow.png"},
+ {"readable": "Arrow of Water Breathing", "description": "Water Breathing (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_waterbreathing.png"},
+ {"readable": "Arrow of Water Breathing", "description": "Water Breathing (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_waterbreathing.png"},
+ {"readable": "Arrow of Healing", "description": "Instant Health", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_healing.png"},
+ {"readable": "Arrow of Healing", "description": "Instant Health II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_healing.png"},
+ {"readable": "Arrow of Harming", "description": "§cInstant Damage", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_harm.png"},
+ {"readable": "Arrow of Harming", "description": "§cInstant Damage II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_harm.png"},
+ {"readable": "Arrow of Poison", "description": "§cPoison (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_poison.png"},
+ {"readable": "Arrow of Poison", "description": "§cPoison (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_poison.png"},
+ {"readable": "Arrow of Poison", "description": "§cPoison II (0:02)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_poison.png"},
+ {"readable": "Arrow of Regeneration", "description": "Regeneration (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_regen.png"},
+ {"readable": "Arrow of Regeneration", "description": "Regeneration (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_regen.png"},
+ {"readable": "Arrow of Regeneration", "description": "Regeneration II (0:02)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_regen.png"},
+ {"readable": "Arrow of Strength", "description": "Strength (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_strength.png"},
+ {"readable": "Arrow of Strength", "description": "Strength (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_strength.png"},
+ {"readable": "Arrow of Strength", "description": "Strength II (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_strength.png"},
+ {"readable": "Arrow of Weakness", "description": "Weakness (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_weakness.png"},
+ {"readable": "Arrow of Weakness", "description": "Weakness (0:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_weakness.png"},
+ {"readable": "Arrow of Decay", "description": "Wither II (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_wither.png"},
+ {"readable": "Arrow of the Turtle Master", "description": ["§cSlowness IV (0:02)","Resistance III (0:02)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_turtlemaster.png"},
+ {"readable": "Arrow of the Turtle Master", "description": ["§cSlowness IV (0:05)","Resistance III (0:05)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_turtlemaster.png"},
+ {"readable": "Arrow of the Turtle Master", "description": ["§cSlowness VI (0:02)","Resistance IV (0:02)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_turtlemaster.png"},
+ {"readable": "Arrow of Slow Falling", "description": "Slow Falling (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_slowfalling.png"},
+ {"readable": "Arrow of Slow Falling", "description": "Slow Falling (0:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_slowfalling.png"},
+ {"readable": "Arrow of Slowness", "description": "§cSlowness IV (0:02)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_slow.png"},
+ {"readable": "Arrow of Wind Charging", "description": "§cWind Charged (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_windCharged.png"},
+ {"readable": "Arrow of Weaving", "description": "§cWeaving (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_weaving.png"},
+ {"readable": "Arrow of Oozing", "description": "§cOozing (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_oozing.png"},
+ {"readable": "Arrow of Infestation", "description": "§cInfested (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/tipped_arrow_infested.png"}
+],
"minecraft:coral_block": [
"minecraft:tube_coral_block",
"minecraft:brain_coral_block",
@@ -323,44 +361,48 @@
{"readable": "Mundane Potion +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_drinkable.png"},
{"readable": "Thick Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_drinkable.png"},
{"readable": "Awkward Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_drinkable.png"},
- {"readable": "Potion of Night Vision", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_nightVision.png"},
- {"readable": "Potion of Night Vision +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_nightVision.png"},
- {"readable": "Potion of Invisibility", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_invisibility.png"},
- {"readable": "Potion of Invisibility +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_invisibility.png"},
- {"readable": "Potion of Leaping", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
- {"readable": "Potion of Leaping +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
- {"readable": "Potion of Leaping II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
- {"readable": "Potion of Fire Resistance", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_fireResistance.png"},
- {"readable": "Potion of Fire Resistance +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_fireResistance.png"},
- {"readable": "Potion of Swiftness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
- {"readable": "Potion of Swiftness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
- {"readable": "Potion of Swiftness II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
- {"readable": "Potion of Slowness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"},
- {"readable": "Potion of Slowness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"},
- {"readable": "Potion of Water Breathing", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_waterBreathing.png"},
- {"readable": "Potion of Water Breathing +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_waterBreathing.png"},
- {"readable": "Potion of Healing", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_heal.png"},
- {"readable": "Potion of Healing II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_heal.png"},
- {"readable": "Potion of Harming", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_harm.png"},
- {"readable": "Potion of Harming II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_harm.png"},
- {"readable": "Potion of Poison", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
- {"readable": "Potion of Poison +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
- {"readable": "Potion of Poison II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
- {"readable": "Potion of Regeneration", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
- {"readable": "Potion of Regeneration +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
- {"readable": "Potion of Regeneration II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
- {"readable": "Potion of Strength", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_confusion.png"},
- {"readable": "Potion of Strength +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_confusion.png"},
- {"readable": "Potion of Strength II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_confusion.png"},
- {"readable": "Potion of Weakness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_weakness.png"},
- {"readable": "Potion of Weakness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_weakness.png"},
- {"readable": "Potion of Decay", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_wither.png"},
- {"readable": "Potion of the Turtle Master", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
- {"readable": "Potion of the Turtle Master +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
- {"readable": "Potion of the Turtle Master II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
- {"readable": "Potion of Slow Falling", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_slowFall.png"},
- {"readable": "Potion of Slow Falling +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_slowFall.png"},
- {"readable": "Potion of Slowness II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"}
+ {"readable": "Potion of Night Vision", "description": "Night Vision (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_nightVision.png"},
+ {"readable": "Potion of Night Vision", "description": "Night Vision (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_nightVision.png"},
+ {"readable": "Potion of Invisibility", "description": "Invisibility (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_invisibility.png"},
+ {"readable": "Potion of Invisibility", "description": "Invisibility (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_invisibility.png"},
+ {"readable": "Potion of Leaping", "description": "Jump Boost (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
+ {"readable": "Potion of Leaping", "description": "Jump Boost (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
+ {"readable": "Potion of Leaping", "description": "Jump Boost II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_jump.png"},
+ {"readable": "Potion of Fire Resistance", "description": "Fire Resistance (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_fireResistance.png"},
+ {"readable": "Potion of Fire Resistance", "description": "Fire Resistance (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_fireResistance.png"},
+ {"readable": "Potion of Swiftness", "description": "Speed (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
+ {"readable": "Potion of Swiftness", "description": "Speed (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
+ {"readable": "Potion of Swiftness", "description": "Speed II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSpeed.png"},
+ {"readable": "Potion of Slowness", "description": "§cSlowness (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"},
+ {"readable": "Potion of Slowness", "description": "§cSlowness (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"},
+ {"readable": "Potion of Water Breathing", "description": "Water Breathing (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_waterBreathing.png"},
+ {"readable": "Potion of Water Breathing", "description": "Water Breathing (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_waterBreathing.png"},
+ {"readable": "Potion of Healing", "description": "Instant Health", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_heal.png"},
+ {"readable": "Potion of Healing", "description": "Instant Health II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_heal.png"},
+ {"readable": "Potion of Harming", "description": "§cInstant Damage", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_harm.png"},
+ {"readable": "Potion of Harming", "description": "§cInstant Damage II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_harm.png"},
+ {"readable": "Potion of Poison", "description": "§cPoison (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
+ {"readable": "Potion of Poison", "description": "§cPoison (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
+ {"readable": "Potion of Poison", "description": "§cPoison (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_poison.png"},
+ {"readable": "Potion of Regeneration", "description": "Regeneration (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
+ {"readable": "Potion of Regeneration", "description": "Regeneration (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
+ {"readable": "Potion of Regeneration", "description": "Regeneration II (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_regeneration.png"},
+ {"readable": "Potion of Strength", "description": "Strength (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_damageBoost.png"},
+ {"readable": "Potion of Strength", "description": "Strength (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_damageBoost.png"},
+ {"readable": "Potion of Strength", "description": "Strength II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_damageBoost.png"},
+ {"readable": "Potion of Weakness", "description": "Weakness (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_weakness.png"},
+ {"readable": "Potion of Weakness", "description": "Weakness (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_weakness.png"},
+ {"readable": "Potion of Decay", "description": "Wither II (0:40)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_wither.png"},
+ {"readable": "Potion of the Turtle Master", "description": ["§cSlowness IV (0:20)","Resistance III (0:20)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
+ {"readable": "Potion of the Turtle Master", "description": ["§cSlowness IV (0:40)","Resistance III (0:40)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
+ {"readable": "Potion of the Turtle Master", "description": ["§cSlowness VI (0:20)","Resistance IV (0:20)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_turtleMaster.png"},
+ {"readable": "Potion of Slow Falling", "description": "Slow Falling (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_slowFall.png"},
+ {"readable": "Potion of Slow Falling", "description": "Slow Falling (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_slowFall.png"},
+ {"readable": "Potion of Slowness", "description": "§cSlowness IV (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_moveSlowdown.png"},
+ {"readable": "Potion of Wind Charging", "description": "§cWind Charged (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_windCharged.png"},
+ {"readable": "Potion of Weaving", "description": "§cWeaving (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_weaving.png"},
+ {"readable": "Potion of Oozing", "description": "§cOozing (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_oozing.png"},
+ {"readable": "Potion of Infestation", "description": "§cInfested (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_infested.png"}
],
"minecraft:splash_potion": [
{"readable": "Splash Water Bottle", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash.png"},
@@ -368,89 +410,98 @@
{"readable": "Splash Mundane Potion +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash.png"},
{"readable": "Splash Thick Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash.png"},
{"readable": "Splash Awkward Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash.png"},
- {"readable": "Splash Potion of Night Vision", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_nightVision.png"},
- {"readable": "Splash Potion of Night Vision +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_nightVision.png"},
- {"readable": "Splash Potion of Invisibility", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_invisibility.png"},
- {"readable": "Splash Potion of Invisibility +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_invisibility.png"},
- {"readable": "Splash Potion of Leaping", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
- {"readable": "Splash Potion of Leaping +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
- {"readable": "Splash Potion of Leaping II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
- {"readable": "Splash Potion of Fire Resistance", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_fireResistance.png"},
- {"readable": "Splash Potion of Fire Resistance +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_fireResistance.png"},
- {"readable": "Splash Potion of Swiftness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
- {"readable": "Splash Potion of Swiftness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
- {"readable": "Splash Potion of Swiftness II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
- {"readable": "Splash Potion of Slowness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"},
- {"readable": "Splash Potion of Slowness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"},
- {"readable": "Splash Potion of Water Breathing", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_waterBreathing.png"},
- {"readable": "Splash Potion of Water Breathing +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_waterBreathing.png"},
- {"readable": "Splash Potion of Healing", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_heal.png"},
- {"readable": "Splash Potion of Healing II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_heal.png"},
- {"readable": "Splash Potion of Harming", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_harm.png"},
- {"readable": "Splash Potion of Harming II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_harm.png"},
- {"readable": "Splash Potion of Poison", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
- {"readable": "Splash Potion of Poison +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
- {"readable": "Splash Potion of Poison II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
- {"readable": "Splash Potion of Regeneration", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
- {"readable": "Splash Potion of Regeneration +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
- {"readable": "Splash Potion of Regeneration II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
- {"readable": "Splash Potion of Strength", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_confusion.png"},
- {"readable": "Splash Potion of Strength +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_confusion.png"},
- {"readable": "Splash Potion of Strength II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_confusion.png"},
- {"readable": "Splash Potion of Weakness", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_weakness.png"},
- {"readable": "Splash Potion of Weakness +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_weakness.png"},
- {"readable": "Splash Potion of Decay", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_wither.png"},
- {"readable": "Splash Potion of the Turtle Master", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
- {"readable": "Splash Potion of the Turtle Master +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
- {"readable": "Splash Potion of the Turtle Master II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
- {"readable": "Splash Potion of Slow Falling", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_slowFall.png"},
- {"readable": "Splash Potion of Slow Falling +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_slowFall.png"},
- {"readable": "Splash Potion of Slowness II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"}
- ],
+ {"readable": "Splash Potion of Night Vision", "description": "Night Vision (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_nightVision.png"},
+ {"readable": "Splash Potion of Night Vision", "description": "Night Vision (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_nightVision.png"},
+ {"readable": "Splash Potion of Invisibility", "description": "Invisibility (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_invisibility.png"},
+ {"readable": "Splash Potion of Invisibility", "description": "Invisibility (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_invisibility.png"},
+ {"readable": "Splash Potion of Leaping", "description": "Jump Boost (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
+ {"readable": "Splash Potion of Leaping", "description": "Jump Boost (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
+ {"readable": "Splash Potion of Leaping", "description": "Jump Boost II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_jump.png"},
+ {"readable": "Splash Potion of Fire Resistance", "description": "Fire Resistance (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_fireResistance.png"},
+ {"readable": "Splash Potion of Fire Resistance", "description": "Fire Resistance (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_fireResistance.png"},
+ {"readable": "Splash Potion of Swiftness", "description": "Speed (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
+ {"readable": "Splash Potion of Swiftness", "description": "Speed (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
+ {"readable": "Splash Potion of Swiftness", "description": "Speed II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSpeed.png"},
+ {"readable": "Splash Potion of Slowness", "description": "§cSlowness (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"},
+ {"readable": "Splash Potion of Slowness", "description": "§cSlowness (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"},
+ {"readable": "Splash Potion of Water Breathing", "description": "Water Breathing (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_waterBreathing.png"},
+ {"readable": "Splash Potion of Water Breathing", "description": "Water Breathing (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_waterBreathing.png"},
+ {"readable": "Splash Potion of Healing", "description": "Instant Health", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_heal.png"},
+ {"readable": "Splash Potion of Healing", "description": "Instant Health II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_heal.png"},
+ {"readable": "Splash Potion of Harming", "description": "§cInstant Damage", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_harm.png"},
+ {"readable": "Splash Potion of Harming", "description": "§cInstant Damage II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_harm.png"},
+ {"readable": "Splash Potion of Poison", "description": "§cPoison (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
+ {"readable": "Splash Potion of Poison", "description": "§cPoison (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
+ {"readable": "Splash Potion of Poison", "description": "§cPoison (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_poison.png"},
+ {"readable": "Splash Potion of Regeneration", "description": "Regeneration (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
+ {"readable": "Splash Potion of Regeneration", "description": "Regeneration (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
+ {"readable": "Splash Potion of Regeneration", "description": "Regeneration II (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_regeneration.png"},
+ {"readable": "Splash Potion of Strength", "description": "Strength (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_damageBoost.png"},
+ {"readable": "Splash Potion of Strength", "description": "Strength (8:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_damageBoost.png"},
+ {"readable": "Splash Potion of Strength", "description": "Strength II (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_damageBoost.png"},
+ {"readable": "Splash Potion of Weakness", "description": "Weakness (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_weakness.png"},
+ {"readable": "Splash Potion of Weakness", "description": "Weakness (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_weakness.png"},
+ {"readable": "Splash Potion of Decay", "description": "Wither II (0:40)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_wither.png"},
+ {"readable": "Splash Potion of the Turtle Master", "description": ["§cSlowness IV (0:20)","Resistance III (0:20)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
+ {"readable": "Splash Potion of the Turtle Master", "description": ["§cSlowness IV (0:40)","Resistance III (0:40)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
+ {"readable": "Splash Potion of the Turtle Master", "description": ["§cSlowness VI (0:20)","Resistance IV (0:20)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_turtleMaster.png"},
+ {"readable": "Splash Potion of Slow Falling", "description": "Slow Falling (1:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_slowFall.png"},
+ {"readable": "Splash Potion of Slow Falling", "description": "Slow Falling (4:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_slowFall.png"},
+ {"readable": "Splash Potion of Slowness", "description": "§cSlowness IV (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_moveSlowdown.png"},
+ {"readable": "Splash Potion of Wind Charging", "description": "§cWind Charged (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_windCharged.png"},
+ {"readable": "Splash Potion of Weaving", "description": "§cWeaving (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_weaving.png"},
+ {"readable": "Splash Potion of Oozing", "description": "§cOozing (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_oozing.png"},
+ {"readable": "Splash Potion of Infestation", "description": "§cInfested (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_splash_infested.png"}
+],
"minecraft:lingering_potion": [
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion",
- "minecraft:lingering_potion"
- ],
+ {"readable": "Lingering Water Bottle", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering.png"},
+ {"readable": "Lingering Mundane Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering.png"},
+ {"readable": "Lingering Mundane Potion +", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering.png"},
+ {"readable": "Lingering Thick Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering.png"},
+ {"readable": "Lingering Awkward Potion", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering.png"},
+ {"readable": "Lingering Potion of Night Vision", "description": "Night Vision (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_nightVision.png"},
+ {"readable": "Lingering Potion of Night Vision", "description": "Night Vision (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_nightVision.png"},
+ {"readable": "Lingering Potion of Invisibility", "description": "Invisibility (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_invisibility.png"},
+ {"readable": "Lingering Potion of Invisibility", "description": "Invisibility (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_invisibility.png"},
+ {"readable": "Lingering Potion of Leaping", "description": "Jump Boost (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_jump.png"},
+ {"readable": "Lingering Potion of Leaping", "description": "Jump Boost (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_jump.png"},
+ {"readable": "Lingering Potion of Leaping", "description": "Jump Boost II (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_jump.png"},
+ {"readable": "Lingering Potion of Fire Resistance", "description": "Fire Resistance (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_fireResistance.png"},
+ {"readable": "Lingering Potion of Fire Resistance", "description": "Fire Resistance (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_fireResistance.png"},
+ {"readable": "Lingering Potion of Swiftness", "description": "Speed (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSpeed.png"},
+ {"readable": "Lingering Potion of Swiftness", "description": "Speed (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSpeed.png"},
+ {"readable": "Lingering Potion of Swiftness", "description": "Speed II (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSpeed.png"},
+ {"readable": "Lingering Potion of Slowness", "description": "§cSlowness (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSlowdown.png"},
+ {"readable": "Lingering Potion of Slowness", "description": "§cSlowness (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSlowdown.png"},
+ {"readable": "Lingering Potion of Water Breathing", "description": "Water Breathing (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_waterBreathing.png"},
+ {"readable": "Lingering Potion of Water Breathing", "description": "Water Breathing (2:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_waterBreathing.png"},
+ {"readable": "Lingering Potion of Healing", "description": "Instant Health", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_heal.png"},
+ {"readable": "Lingering Potion of Healing", "description": "Instant Health II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_heal.png"},
+ {"readable": "Lingering Potion of Harming", "description": "§cInstant Damage", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_harm.png"},
+ {"readable": "Lingering Potion of Harming", "description": "§cInstant Damage II", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_harm.png"},
+ {"readable": "Lingering Potion of Poison", "description": "§cPoison (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_poison.png"},
+ {"readable": "Lingering Potion of Poison", "description": "§cPoison (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_poison.png"},
+ {"readable": "Lingering Potion of Poison", "description": "§cPoison (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_poison.png"},
+ {"readable": "Lingering Potion of Regeneration", "description": "Regeneration (0:11)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_regeneration.png"},
+ {"readable": "Lingering Potion of Regeneration", "description": "Regeneration (0:30)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_regeneration.png"},
+ {"readable": "Lingering Potion of Regeneration", "description": "Regeneration II (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_regeneration.png"},
+ {"readable": "Lingering Potion of Strength", "description": "Strength (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_damageBoost.png"},
+ {"readable": "Lingering Potion of Strength", "description": "Strength (3:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_damageBoost.png"},
+ {"readable": "Lingering Potion of Strength", "description": "Strength II (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_damageBoost.png"},
+ {"readable": "Lingering Potion of Weakness", "description": "Weakness (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_weakness.png"},
+ {"readable": "Lingering Potion of Weakness", "description": "Weakness (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_weakness.png"},
+ {"readable": "Lingering Potion of Decay", "description": "Wither II (0:10)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_wither.png"},
+ {"readable": "Lingering Potion of the Turtle Master", "description": ["§cSlowness IV (0:05)","Resistance III (0:05)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_turtleMaster.png"},
+ {"readable": "Lingering Potion of the Turtle Master", "description": ["§cSlowness IV (0:10)","Resistance III (0:10)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_turtleMaster.png"},
+ {"readable": "Lingering Potion of the Turtle Master", "description": ["§cSlowness VI (0:05)","Resistance IV (0:05)"], "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_turtleMaster.png"},
+ {"readable": "Lingering Potion of Slow Falling", "description": "Slow Falling (0:22)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_slowFall.png"},
+ {"readable": "Lingering Potion of Slow Falling", "description": "Slow Falling (1:00)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_slowFall.png"},
+ {"readable": "Lingering Potion of Slowness", "description": "§cSlowness IV (0:05)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_moveSlowdown.png"},
+ {"readable": "Lingering Potion of Wind Charging", "description": "§cWind Charged (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_windCharged.png"},
+ {"readable": "Lingering Potion of Weaving", "description": "§cWeaving (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_weaving.png"},
+ {"readable": "Lingering Potion of Oozing", "description": "§cOozing (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_oozing.png"},
+ {"readable": "Lingering Potion of Infestation", "description": "§cInfested (0:45)", "texture": "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/potion_bottle_lingering_infested.png"}
+],
"minecraft:goat_horn": [
"minecraft:goat_horn",
"minecraft:goat_horn",
@@ -463,6 +514,16 @@
"minecraft:goat_horn",
"minecraft:goat_horn"
],
+ "minecraft:goat_horn": [
+ {"readable": "§eGoat Horn", "description": "Ponder"},
+ {"description": "Sing"},
+ {"description": "Seek"},
+ {"description": "Feel"},
+ {"description": "Admire"},
+ {"description": "Call"},
+ {"description": "Yearn"},
+ {"description": "Dream"}
+],
"minecraft:planks": [
"minecraft:oak_planks",
"minecraft:spruce_planks",
From 99323180ff8801322d4e9d2d62fa70cb1cae94e7 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 03:24:30 -0300
Subject: [PATCH 07/20] The durability system has been migrated.
---
item/data/durabilities.json | 86 +++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/item/data/durabilities.json b/item/data/durabilities.json
index e69de29..1c4d6e5 100644
--- a/item/data/durabilities.json
+++ b/item/data/durabilities.json
@@ -0,0 +1,86 @@
+{
+ "minecraft:turtle_helmet": 275,
+ "minecraft:leather_helmet": 55,
+ "minecraft:copper_helmet": 121,
+ "minecraft:golden_helmet": 77,
+ "minecraft:chainmail_helmet": 165,
+ "minecraft:iron_helmet": 165,
+ "minecraft:diamond_helmet": 363,
+ "minecraft:netherite_helmet": 407,
+ "minecraft:leather_chestplate": 80,
+ "minecraft:copper_chestplate": 176,
+ "minecraft:golden_chestplate": 112,
+ "minecraft:chainmail_chestplate": 240,
+ "minecraft:iron_chestplate": 240,
+ "minecraft:diamond_chestplate": 528,
+ "minecraft:netherite_chestplate": 592,
+ "minecraft:leather_leggings": 75,
+ "minecraft:copper_leggings": 165,
+ "minecraft:golden_leggings": 105,
+ "minecraft:chainmail_leggings": 225,
+ "minecraft:iron_leggings": 225,
+ "minecraft:diamond_leggings": 495,
+ "minecraft:netherite_leggings": 555,
+ "minecraft:leather_boots": 65,
+ "minecraft:copper_boots": 143,
+ "minecraft:golden_boots": 91,
+ "minecraft:chainmail_boots": 195,
+ "minecraft:iron_boots": 195,
+ "minecraft:diamond_boots": 429,
+ "minecraft:netherite_boots": 481,
+
+ "minecraft:golden_pickaxe": 32,
+ "minecraft:wooden_pickaxe": 59,
+ "minecraft:stone_pickaxe": 131,
+ "minecraft:copper_pickaxe": 190,
+ "minecraft:iron_pickaxe": 250,
+ "minecraft:diamond_pickaxe": 1561,
+ "minecraft:netherite_pickaxe": 2031,
+ "minecraft:golden_axe": 32,
+ "minecraft:wooden_axe": 59,
+ "minecraft:stone_axe": 131,
+ "minecraft:copper_axe": 190,
+ "minecraft:iron_axe": 250,
+ "minecraft:diamond_axe": 1561,
+ "minecraft:netherite_axe": 2031,
+ "minecraft:golden_hoe": 32,
+ "minecraft:wooden_hoe": 59,
+ "minecraft:stone_hoe": 131,
+ "minecraft:copper_hoe": 190,
+ "minecraft:iron_hoe": 250,
+ "minecraft:diamond_hoe": 1561,
+ "minecraft:netherite_hoe": 2031,
+ "minecraft:golden_shovel": 32,
+ "minecraft:wooden_shovel": 59,
+ "minecraft:stone_shovel": 131,
+ "minecraft:copper_shovel": 190,
+ "minecraft:iron_shovel": 250,
+ "minecraft:diamond_shovel": 1561,
+ "minecraft:netherite_shovel": 2031,
+ "minecraft:golden_sword": 32,
+ "minecraft:wooden_sword": 59,
+ "minecraft:stone_sword": 131,
+ "minecraft:copper_sword": 190,
+ "minecraft:iron_sword": 250,
+ "minecraft:diamond_sword": 1561,
+ "minecraft:netherite_sword": 2031,
+ "minecraft:wooden_spear": 59,
+ "minecraft:stone_spear": 131,
+ "minecraft:copper_spear": 190,
+ "minecraft:iron_spear": 250,
+ "minecraft:diamond_spear": 1561,
+ "minecraft:netherite_spear": 2031,
+
+ "minecraft:flint_and_steel": 64,
+ "minecraft:brush": 64,
+ "minecraft:fishing_rod": 384,
+ "minecraft:carrot_on_a_stick": 25,
+ "minecraft:warped_fungus_on_a_stick": 100,
+ "minecraft:shears": 238,
+ "minecraft:shield": 336,
+ "minecraft:bow": 384,
+ "minecraft:trident": 250,
+ "minecraft:elytra": 432,
+ "minecraft:crossbow": 465,
+ "minecraft:mace": 500
+}
From 227d9a0cf5eac52bb20e0aa40f47780a9aa71a3e Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 13:27:29 -0300
Subject: [PATCH 08/20] Enhance fetchData and tooltip functionality
Refactor fetchData function to include additional data fetching for durabilities and enchantments. Update tooltip display logic and remove hardcoded durabilities.
---
item/script.js | 395 +++++++++++++++++++++++++++++--------------------
1 file changed, 234 insertions(+), 161 deletions(-)
diff --git a/item/script.js b/item/script.js
index e0ed54e..1c99ff6 100644
--- a/item/script.js
+++ b/item/script.js
@@ -3,23 +3,41 @@
async function fetchData() {
//Get vanilla item data
mcitems.data.items = await fetch(
- 'https://unpkg.com/minecraft-textures@1.21.11/dist/textures/json/1.21.11.id.json'
+ 'https://cdn.jsdelivr.net/npm/minecraft-textures@1.21.11/dist/textures/json/1.21.11.id.json'
).then((response) => response.json())
//Get identifier mapping data
mcitems.data.mapping = await fetch(
'/item/data/mapping.json'
).then((response) => response.json())
+
+ mcitems.data.durabilities = await fetch(
+ '/item/data/durabilities.json'
+ ).then((response) => response.json());
+
+ mcitems.data.enchantments = await fetch(
+ '/data/general.json'
+ ).then((response) => response.json());
+
+ if (window.localStorage.customItems) {
+ mcitems.data.customitems = JSON.parse(window.localStorage.customItems);
+
+ // INJECT the durabilities of customized items into the global map.
+ for (let id in mcitems.data.customitems) {
+ let customItem = mcitems.data.customitems[id];
+ if (customItem.durability && customItem.durability > 0) {
+ mcitems.data.durabilities[id] = parseInt(customItem.durability);
+ }
+ }
+ }
mcitems.init()
-
- if (window.localStorage.customItems)
- mcitems.data.customitems = JSON.parse(window.localStorage.customItems)
+
//Append tooltip element to page
let tooltipel = document.createElement("div");
tooltipel.style.display = "none";
tooltipel.classList = ["tooltip"];
- tooltipel.innerHTML = '
Item NameEfficiency VLoreminecraft:identifier';
+ tooltipel.innerHTML = '
Item NameEfficiency VLoreminecraft:identifier';
document.body.appendChild(tooltipel);
}
@@ -129,94 +147,7 @@ var mcitems = {
items: {},
customitems: {},
mapping: {},
- durabilities: {
- //Armor
- 'minecraft:turtle_helmet': 275,
- 'minecraft:leather_helmet': 55,
- 'minecraft:copper_helmet': 121,
- 'minecraft:golden_helmet': 77,
- 'minecraft:chainmail_helmet': 165,
- 'minecraft:iron_helmet': 165,
- 'minecraft:diamond_helmet': 363,
- 'minecraft:netherite_helmet': 407,
- 'minecraft:leather_chestplate': 80,
- 'minecraft:copper_chestplate': 176,
- 'minecraft:golden_chestplate': 112,
- 'minecraft:chainmail_chestplate': 240,
- 'minecraft:iron_chestplate': 240,
- 'minecraft:diamond_chestplate': 528,
- 'minecraft:netherite_chestplate': 592,
- 'minecraft:leather_leggings': 75,
- 'minecraft:copper_leggings': 165,
- 'minecraft:golden_leggings': 105,
- 'minecraft:chainmail_leggings': 225,
- 'minecraft:iron_leggings': 225,
- 'minecraft:diamond_leggings': 495,
- 'minecraft:netherite_leggings': 555,
- 'minecraft:leather_boots': 65,
- 'minecraft:copper_boots': 143,
- 'minecraft:golden_boots': 91,
- 'minecraft:chainmail_boots': 195,
- 'minecraft:iron_boots': 195,
- 'minecraft:diamond_boots': 429,
- 'minecraft:netherite_boots': 481,
-
- //Tools
- 'minecraft:golden_pickaxe': 32,
- 'minecraft:wooden_pickaxe': 59,
- 'minecraft:stone_pickaxe': 131,
- 'minecraft:copper_pickaxe': 190,
- 'minecraft:iron_pickaxe': 250,
- 'minecraft:diamond_pickaxe': 1561,
- 'minecraft:netherite_pickaxe': 2031,
- 'minecraft:golden_axe': 32,
- 'minecraft:wooden_axe': 59,
- 'minecraft:stone_axe': 131,
- 'minecraft:copper_axe': 190,
- 'minecraft:iron_axe': 250,
- 'minecraft:diamond_axe': 1561,
- 'minecraft:netherite_axe': 2031,
- 'minecraft:golden_hoe': 32,
- 'minecraft:wooden_hoe': 59,
- 'minecraft:stone_hoe': 131,
- 'minecraft:copper_hoe': 190,
- 'minecraft:iron_hoe': 250,
- 'minecraft:diamond_hoe': 1561,
- 'minecraft:netherite_hoe': 2031,
- 'minecraft:golden_shovel': 32,
- 'minecraft:wooden_shovel': 59,
- 'minecraft:stone_shovel': 131,
- 'minecraft:copper_shovel': 190,
- 'minecraft:iron_shovel': 250,
- 'minecraft:diamond_shovel': 1561,
- 'minecraft:netherite_shovel': 2031,
- 'minecraft:golden_sword': 32,
- 'minecraft:wooden_sword': 59,
- 'minecraft:stone_sword': 131,
- 'minecraft:copper_sword': 190,
- 'minecraft:iron_sword': 250,
- 'minecraft:diamond_sword': 1561,
- 'minecraft:netherite_sword': 2031,
- 'minecraft:wooden_spear': 59,
- 'minecraft:stone_spear': 131,
- 'minecraft:copper_spear': 190,
- 'minecraft:iron_spear': 250,
- 'minecraft:diamond_spear': 1561,
- 'minecraft:netherite_spear': 2031,
-
- 'minecraft:brush': 64,
- 'minecraft:mace': 500,
- 'minecraft:fishing_rod': 384,
- 'minecraft:flint_and_steel': 64,
- 'minecraft:carrot_on_a_stick': 25,
- 'minecraft:shears': 238,
- 'minecraft:shield': 336,
- 'minecraft:bow': 384,
- 'minecraft:trident': 250,
- 'minecraft:elytra': 432,
- 'minecraft:crossbow': 465,
- 'minecraft:warped_fungus_on_a_stick': 100,
- },
+ durabilities: {},
},
init: function(){
@@ -281,50 +212,84 @@ var mcitems = {
}
},
getData: function (identifier, allowlist) {
- var items = Object.keys(mcitems.data.items.items || {})
- var customitems = Object.keys(mcitems.data.customitems || {})
- //Default, 'failed' output
- var output = {
- texture:
- 'https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_shield.png',
- readable: 'Unknown',
- }
+ var items = Object.keys(mcitems.data.items.items || {})
+ var customitems = Object.keys(mcitems.data.customitems || {})
- identifier = mcitems.mapItemIdentifier(mcitems.parseItemIdentifier(identifier));
-
- if(typeof identifier === 'object'){
- //Identifier was mapped to a specific display name and not another identifier. Return the mapped data.
- return identifier;
+ // Default fallback
+ var output = {
+ texture: 'https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_shield.png',
+ readable: 'Unknown',
+ description: false
}
+
+ let parsed = mcitems.parseItemIdentifier(identifier);
+ if (!parsed) return output;
+
+ let baseIdentifier = parsed.namespace + ':' + parsed.identifier;
+ let dataValue = parsed.data || 0;
+
+ // Top priority: custom items from localStorage
+ if (customitems.includes(baseIdentifier)) {
+ let custom = mcitems.data.customitems[baseIdentifier];
+ return {
+ texture: custom.texture || output.texture,
+ readable: custom.readable || baseIdentifier,
+ description: custom.description || false
+ };
+ }
+
+ // Try mapping (mapping.json)
+ let mapped = null;
+ if (Object.keys(mcitems.data.mapping).includes(baseIdentifier)) {
+ let mappedData = mcitems.data.mapping[baseIdentifier];
+
+ if (Array.isArray(mappedData)) {
+ let variantValue = mappedData[dataValue];
+
+ if (typeof variantValue === 'string') {
+ // Simple string = redirect to another vanilla identifier
+ let redirectId = variantValue;
+ let vanillaRedirect = mcitems.data.items.items[redirectId] || {};
+ mapped = vanillaRedirect;
+ } else if (typeof variantValue === 'object' && variantValue !== null) {
+ // Object → merge with base (index 0)
+ let baseMapped = mappedData[0] || {};
+ mapped = {
+ readable: variantValue.readable || baseMapped.readable,
+ texture: variantValue.texture || baseMapped.texture,
+ description: variantValue.description || baseMapped.description
+ };
+ } else {
+ mapped = mappedData[0] || {};
+ }
+ } else if (typeof mappedData === 'object' && mappedData !== null) {
+ mapped = mappedData;
+ } else if (typeof mappedData === 'string') {
+ // Redirect global
+ let vanillaRedirect = mcitems.data.items.items[mappedData] || {};
+ mapped = vanillaRedirect;
+ }
+ }
+
+ // 3. Vanilla
+ let vanillaData = mcitems.data.items.items[baseIdentifier] || {};
+
+ // Final merge
+ output = {
+ readable: mapped?.readable || vanillaData.readable || output.readable,
+ texture: mapped?.texture || vanillaData.texture || output.texture,
+ description: mapped?.description || vanillaData.description || false
+ };
- try {
- //If tag uses a valid allowlist and identifier is not on it, output the 'failed' result.
- if (allowlist && eval(allowlist)) {
- if (!eval(allowlist).includes(identifier)) {
- return output
- }
- }
- } catch (e) {}
-
- if (items.includes(identifier)) {
- output = mcitems.data.items.items[identifier]
- } else if (customitems.includes(identifier)) {
- output = mcitems.data.customitems[identifier]
- } else if (identifier == 'null' || !identifier) {
- //No item to display, render partially transparent.
- output.texture =
- 'https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_chestplate.png'
- output.readable = 'No item'
- } else {
- //Invalid, take other data
- output.texture =
- 'https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_shield.png'
- output.readable = identifier
- //if(!identifier.includes("element")) console.log(identifier);
- }
+ if (identifier == 'null' || !identifier) {
+ output.texture = 'https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_chestplate.png';
+ output.readable = 'No item';
+ } else if (!items.includes(baseIdentifier) && !customitems.includes(baseIdentifier) && !mapped) {
+ output.readable = baseIdentifier;
+ }
- return output
- },
+ return output;
+},
mapItemIdentifier: function(identifier) {
var baseIdentifier = identifier.namespace + ':' + identifier.identifier;
if(Object.keys(mcitems.data.mapping).includes(baseIdentifier)){
@@ -381,6 +346,68 @@ var mcitems = {
}
return output;
},
+ formatMinecraftText: function(text) {
+ if (!text) return "";
+
+ const colorMap = {
+ '0': '#000000', '1': '#0000AA', '2': '#00AA00', '3': '#00AAAA',
+ '4': '#AA0000', '5': '#AA00AA', '6': '#FFAA00', '7': '#C6C6C6',
+ '8': '#555555', '9': '#5555FF', 'a': '#55FF55', 'b': '#55FFFF',
+ 'c': '#FF5555', 'd': '#FF55FF', 'e': '#FFFF55', 'f': '#FFFFFF',
+ 'g': '#DDD605', 'h': '#E3D4D1', 'i': '#CECACA', 'j': '#443A3B',
+ 'm': '#971607', 'n': '#B4684D', 'p': '#DEB12D', 'q': '#119F36',
+ 's': '#2CBAA8', 't': '#21497B', 'u': '#9A5CC6', 'v': '#EB7114'
+ };
+
+ let html = "";
+ let currentFormats = {
+ color: null,
+ bold: false,
+ italic: false,
+ obfuscated: false // This is our STRIKE / §k
+ };
+
+ const parts = text.split(/§/);
+
+ // Initial text without formatting.
+ if (parts[0]) html += `
${parts[0]}`;
+
+ for (let i = 1; i < parts.length; i++) {
+ let part = parts[i];
+ if (part.length === 0) continue;
+
+ let code = part.charAt(0).toLowerCase();
+ let content = part.substring(1);
+
+ if (colorMap[code]) {
+ currentFormats.color = colorMap[code];
+ } else if (code === 'l') {
+ currentFormats.bold = true;
+ } else if (code === 'o') {
+ currentFormats.italic = true;
+ } else if (code === 'k') {
+ currentFormats.obfuscated = true;
+ } else if (code === 'r') {
+ currentFormats.color = null;
+ currentFormats.bold = false;
+ currentFormats.italic = false;
+ currentFormats.obfuscated = false;
+ }
+
+ // Applies classes based on active flags
+ let classes = [];
+ if (currentFormats.bold) classes.push("mc-bold");
+ if (currentFormats.italic) classes.push("mc-italic");
+ if (currentFormats.obfuscated) classes.push("mc-obfuscated");
+
+ let style = currentFormats.color ? `style="color: ${currentFormats.color}"` : "";
+ let classAttr = classes.length > 0 ? `class="${classes.join(' ')}"` : "";
+
+ html += `
${content}`;
+ }
+
+ return html;
+},
tooltip: {
hover: function(e) {
let tooltip = document.querySelector('.tooltip');
@@ -398,40 +425,86 @@ var mcitems = {
tooltip.style.top = y + 'px';
}
},
- show: function(element){
- let tooltip = document.querySelector('.tooltip')
+ show: function(element) {
+ let tooltip = document.querySelector('.tooltip');
+ let itemid = element.getAttribute("identifier");
+ let allowlist = element.hasAttribute('allowlist') ? element.getAttribute('allowlist') : false;
+
+ var itemdata = mcitems.getData(itemid, allowlist);
- var itemdata = JSON.parse(element.getAttribute("itemdata"));
+ let itemname = element.getAttribute("custom-name") || (element.querySelector('img').getAttribute("data-title") !== itemid ? element.querySelector('img').getAttribute("data-title") : "Unknown Name");
+ let itemDescription = itemdata.description || false;
+ let enchStr = element.getAttribute("enchantments");
+ let itemEnchs = [];
+ if (enchStr) {
+ try {
+ const rawEnchants = JSON.parse(enchStr); // ex: [{id:1, level:3}, {id:9, level:1}]
- //let itemname = ((getFunction('set_name', 'name', itemdata) != false) ? getFunction('set_name', 'name', itemdata) : (element.children[0].getAttribute("data-title") != element.getAttribute("identifier") ? element.children[0].getAttribute("data-title") : "Unknown Name"));
- let itemname = (element.children[0].getAttribute("data-title") != element.getAttribute("identifier") ? element.children[0].getAttribute("data-title") : "Unknown Name");
- let customitemname = false;
- let itemenchs = false//doEnchantments(itemdata);
- let itemlore = false//((getFunction('set_lore', 'lore', itemdata) != false) ? getFunction('set_lore', 'lore', itemdata).join("
") : false)
- let itemid = element.getAttribute("identifier");
+ itemEnchs = rawEnchants.map(ench => {
+ let enchName = `Unknown Enchant (${ench.id})`; // fallback
+ let isCurse = false; // Variable to control whether it's a curse
- document.querySelector('.tooltip-name').innerHTML = itemname;
- if(customitemname){
- document.querySelector('.tooltip-name').style.fontStyle = 'italic'
- } else {
- document.querySelector('.tooltip-name').style.fontStyle = 'unset'
- }
+ // Search for the name by numeric ID in the loaded list.
+ const enchMap = mcitems.data.enchantments?.enchantments || {};
+ for (const key in enchMap) {
+ if (enchMap[key].numeric === ench.id) {
+ enchName = enchMap[key].name;
+ if (enchMap[key].curse === true) {
+ isCurse = true;
+ }
+ break;
+ }
+ }
- if(itemenchs === false){
- document.querySelector('.tooltip-enchs').innerHTML = "";
- } else {
- document.querySelector('.tooltip-enchs').innerHTML = itemenchs;
- }
+ // Converts level to Roman numerals
+ const numerals = mcitems.data.enchantments?.numerals || ["0","I","II","III","IV","V"];
+ const roman = numerals[ench.level] || ench.level.toString();
- if(itemlore === false){
- document.querySelector('.tooltip-lore').innerHTML = "";
- } else {
- document.querySelector('.tooltip-lore').innerHTML = itemlore;
- }
- document.querySelector('.tooltip-identifier').innerHTML = itemid;
+ let colorCode = isCurse ? "§c" : "§7";
- tooltip.style.display = 'block';
- },
+ return mcitems.formatMinecraftText(colorCode + enchName + " " + roman);
+ });
+ } catch (err) {
+ console.warn("Error parsing enchantments:", err);
+ itemEnchs = [];
+ }
+ }
+ let itemlore = false; // Lore logic, currently disabled
+
+ // Update Name
+ document.querySelector('.tooltip-name').innerHTML = mcitems.formatMinecraftText(itemname);
+ document.querySelector('.tooltip-name').style.fontStyle = 'unset';
+
+ // Update the Description
+ let descEl = document.querySelector('.tooltip-description');
+
+ if (itemDescription) {
+ // If it's an array, format each line individually. If it's a string, format the entire string.
+ if (Array.isArray(itemDescription)) {
+ let formattedLines = itemDescription.map(line => mcitems.formatMinecraftText(line));
+ descEl.innerHTML = formattedLines.join("
");
+ } else {
+ descEl.innerHTML = mcitems.formatMinecraftText(itemDescription);
+ }
+ descEl.style.display = 'block';
+ } else {
+ descEl.style.display = 'none';
+ }
+
+ let enchEl = document.querySelector('.tooltip-enchs');
+ if (itemEnchs.length > 0) {
+ enchEl.innerHTML = itemEnchs
+ .map(line => mcitems.formatMinecraftText("§b" + line))
+ .join("
"); //
It's the line break in tooltips.
+ enchEl.style.display = 'block';
+ } else {
+ enchEl.style.display = 'none';
+ }
+ document.querySelector('.tooltip-lore').innerHTML = itemlore || "";
+ document.querySelector('.tooltip-identifier').innerHTML = itemid;
+
+ tooltip.style.display = 'block';
+},
hide: function(){
document.querySelector('.tooltip').style.display = 'none';
}
From 01b42199827a86763406eca3d9631c99ebdc9985 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 13:29:45 -0300
Subject: [PATCH 09/20] Fix fetch URL for Minecraft item data
---
item/script.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/item/script.js b/item/script.js
index 1c99ff6..cb99311 100644
--- a/item/script.js
+++ b/item/script.js
@@ -3,7 +3,7 @@
async function fetchData() {
//Get vanilla item data
mcitems.data.items = await fetch(
- 'https://cdn.jsdelivr.net/npm/minecraft-textures@1.21.11/dist/textures/json/1.21.11.id.json'
+ 'https://unpkg.com/minecraft-textures@1.21.11/dist/textures/json/1.21.11.id.json'
).then((response) => response.json())
//Get identifier mapping data
mcitems.data.mapping = await fetch(
From cd38322f6778ec1a14bcf95bfc952b69c3dc7dc0 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 13:31:56 -0300
Subject: [PATCH 10/20] Add tooltip styles for obfuscated text and description
Added styles for tooltip and tooltip description.
---
item/style.css | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/item/style.css b/item/style.css
index 38822f1..6891f23 100644
--- a/item/style.css
+++ b/item/style.css
@@ -99,6 +99,27 @@ mcitem[identifier="null"]:hover, mcitem[identifier=""]:hover{
text-shadow: 0.125em 0.125em 0 #3f3f3f;
}
+.tooltip .mc-obfuscated {
+ text-decoration: line-through !important;
+ text-decoration-color: currentColor !important;
+
+ text-shadow: 5px 5px 0px currentColor !important;
+
+ letter-spacing: -1.5px;
+
+ display: inline-block;
+ white-space: pre;
+}
+.mc-bold { font-weight: bold; }
+.mc-italic { font-style: italic; }
+
+.tooltip-description {
+ display: block;
+ color: lightgray;
+ line-height: 1.4;
+ padding: 2px 0;
+}
+
.tooltip-identifier {
font-size: 0.75em;
color: darkgray;
@@ -145,4 +166,4 @@ mcitem[identifier="null"]:hover, mcitem[identifier=""]:hover{
/*@font-face {
font-family: Minecraftia;
src: url(data:font/truetype;base64,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gICAAQD/AAAABQAAAAACAAOAAAMABwALAA8AEwAAITUhFSU1MxUlETMZATUzFT0BIRUBAAEA/oCA/wCAgAEAgICAgICAAYD+gAGAgICAgIAABQAAAAACAAOAAAMABwALAA8AEwAAMTUhFT0BMxU1ETMRATUzFSU1IRUBAICA/wCA/oABAICAgICAgAGA/oABgICAgICAAAAABQAAAQACAAKAAAMABwALAA8AEwAAETUzFSE1MxUlNSEVJTUzFSE1MxWAAQCA/oABAP6AgAEAgAEAgICAgICAgICAgICAAAAAAQAAAIACgAMAAAsAACURITUhETMRIRUhEQEA/wABAIABAP8AgAEAgAEA/wCA/wAAAQAA/4AAgAEAAAMAABURMxGAgAGA/oAAAQAAAYACgAIAAAMAABE1IRUCgAGAgIAAAQAAAAAAgAEAAAMAADERMxGAAQD/AAAABQAAAAACgAOAAAMABwALAA8AEwAAMTUzFTURMxkBNTMVNREzGQE1MxWAgICAgICAgAEA/wABAICAgAEA/wABAICAAAAFAAAAAAKAA4AAAwAHAA8AFwAbAAAzNSEVATUzFQERMxEzFSMVIREjNTM1MxEBNSEVgAGA/wCA/oCAgIABgICAgP4AAYCAgAGAgID/AAKA/oCAgAGAgID9gAKAgIAAAAABAAAAAAKAA4AACwAAMTUhESM1MzUzESEVAQCAgIABAIACAICA/QCAAAAAAAYAAAAAAoADgAAHAAsADwATABcAGwAAMREzFSE1MxEBNTMVPQEhFQE1MxUFETMRATUhFYABgID+AIABAP4AgAGAgP4AAYABAICA/wABAICAgICAAQCAgIABAP8AAQCAgAAAAAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAMzUhFSU1MxUhETMRATUhFQE1MxUFETMRATUhFYABgP4AgAGAgP6AAQD+AIABgID+AAGAgICAgIABAP8AAQCAgAEAgICAAQD/AAEAgIAAAAMAAAAAAoADgAADAAcAEwAAEzUzFT0BMxUTESERMxUhESM1IRGAgICA/gCAAYCAAQACAICAgICA/YABAAEAgAGAgPyAAAAAAAQAAAAAAoADgAADAAcACwATAAAzNSEVJTUzFSERMxEBESEVIRUhFYABgP4AgAGAgP2AAoD+AAGAgICAgIABgP6AAYABgICAgAAAAAAFAAAAAAKAA4AAAwAHAA8AEwAXAAAzNSEVNREzESERMxUhFSEZATUzFT0BIRWAAYCA/YCAAYD+gIABAICAgAEA/wACAICA/wACAICAgICAAAMAAAAAAoADgAADAAcADwAAIREzGQE1MxU1ESEVIxEhEQEAgID+gIACgAGA/oABgICAgAEAgAEA/oAAAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAAzNSEVJREzESERMxEBNSEVJREzESERMxEBNSEVgAGA/gCAAYCA/gABgP4AgAGAgP4AAYCAgIABAP8AAQD/AAEAgICAAQD/AAEA/wABAICAAAAAAAUAAAAAAoADgAADAAcACwATABcAADM1IRU9ATMVAREzEQE1ITUhETMRATUhFYABAID+AIABgP6AAYCA/gABgICAgICAAYABAP8A/wCAgAEA/gACAICAAAACAAAAAACAAwAAAwAHAAAxETMRAxEzEYCAgAEA/wACAAEA/wAAAAAAAgAA/4AAgAMAAAMABwAAFREzEQMRMxGAgICAAYD+gAKAAQD/AAAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAAhNTMVJTUzFSU1MxUlNTMVPQEzFT0BMxU9ATMVAYCA/wCA/wCA/wCAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAgAAAIACgAKAAAMABwAAPQEhFQE1IRUCgP2AAoCAgIABgICAAAAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAAxNTMVPQEzFT0BMxU9ATMVJTUzFSU1MxUlNTMVgICAgP8AgP8AgP8AgICAgICAgICAgICAgICAgICAgICAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAACE1MxUDNTMVPQEzFQE1MxUFETMRATUhFQEAgICAgP4AgAGAgP4AAYCAgAEAgICAgIABAICAgAEA/wABAICAAAAABAAAAAADAAOAAAMABwAPABMAADM1IRUlETMRNxEhETMRMxEBNSEVgAIA/YCAgAEAgID9gAIAgICAAoD9gIABgP8AAYD+AAIAgIAAAAIAAAAAAoADgAALAA8AADERMxEhETMRIxEhGQE1IRWAAYCAgP6AAYADAP8AAQD9AAGA/oADAICAAAAAAAMAAAAAAoADgAADAAcAEwAAJREzEQM1MxUBESEVIRUhFSERIRUCAICAgP2AAgD+gAGA/oABgIABgP6AAgCAgP2AA4CAgID+gIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAzNSEVPQEzFSERMxEBNTMVJTUhFYABgID9gIABgID+AAGAgICAgIACgP2AAgCAgICAgAACAAAAAAKAA4AAAwALAAAlETMRBREhFSERIRUCAID9gAIA/oABgIACgP2AgAOAgP2AgAAAAQAAAAACgAOAAAsAADERIRUhFSEVIREhFQKA/gABAP8AAgADgICAgP6AgAABAAAAAAKAA4AACQAAMREhFSEVIRUhEQKA/gABAP8AA4CAgID+AAAABAAAAAACgAOAAAMACQANABEAADM1IRU1ESE1IREhETMZATUhFYABgP8AAYD9gIACAICAgAGAgP4AAoD9gAKAgIAAAAABAAAAAAKAA4AACwAAMREzESERMxEjESERgAGAgID+gAOA/wABAPyAAgD+AAAAAAABAAAAAAGAA4AACwAAMTUzESM1IRUjETMVgIABgICAgAKAgID9gIAAAwAAAAACgAOAAAMABwALAAAzNSEVJTUzFSERMxGAAYD+AIABgICAgICAgAMA/QAABQAAAAACgAOAAAMABwALABMAFwAAIREzEQE1MxUDNTMVAREzESEVIREBNTMVAgCA/wCAgID+AIABAP8AAYCAAYD+gAGAgIABAICA/YADgP8AgP4AAwCAgAAAAAABAAAAAAKAA4AABQAAMREzESEVgAIAA4D9AIAAAwAAAAACgAOAAAMACwATAAABNTMVAREzFTMVIxEhESM1MzUzEQEAgP6AgICAAYCAgIACAICA/gADgICA/YACgICA/IAAAAAAAwAAAAACgAOAAAMACwATAAABNTMVAREzFTMVIxEhESM1MxEzEQEAgP6AgICAAYCAgIACAICA/gADgICA/YABgIABgPyAAAAABAAAAAACgAOAAAMABwALAA8AADM1IRUlETMRIREzEQE1IRWAAYD+AIABgID+AAGAgICAAoD9gAKA/YACgICAAAIAAAAAAoADgAADAA0AAAE1MxUBESEVIRUhFSERAgCA/YACAP6AAYD+gAKAgID9gAOAgICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVMzUzFSU1MxUhETMRJREzEQE1IRWAAQCAgP8AgP4AgAGAgP4AAYCAgICAgICAAoD9gIACAP4AAgCAgAAAAAMAAAAAAoADgAADAAcAEQAAIREzEQM1MxUBESEVIRUhFSERAgCAgID9gAIA/oABgP6AAgD+AAKAgID9gAOAgICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVJTUzFSERMxEBNSEVJTUzFT0BIRWAAYD+AIABgID+AAGA/gCAAgCAgICAgAGA/oABgICAgICAgICAAAAAAAEAAAAAAoADgAAHAAAhESE1IRUhEQEA/wACgP8AAwCAgP0AAAMAAAAAAoADgAADAAcACwAAMzUhFSURMxEhETMRgAGA/gCAAYCAgICAAwD9AAMA/QAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAhNTMVJREzETMRMxEBETMRIREzEQEAgP8AgICA/gCAAYCAgICAAQD/AAEA/wABAAIA/gACAP4AAAAAAAMAAAAAAoADgAADAAsAEwAAATUzFQERMxEzFSMVITUjNTMRMxEBAID+gICAgAGAgICAAQCAgP8AA4D9gICAgIACgPyAAAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAMREzESERMxEBNTMVMzUzFSU1MxUlNTMVMzUzFSU1MxUhNTMVgAGAgP4AgICA/wCA/wCAgID+AIABgIABgP6AAYD+gAGAgICAgICAgICAgICAgICAgIAABQAAAAACgAOAAAMABwALAA8AEwAAIREzEQE1MxUzNTMVJTUzFSE1MxUBAID/AICAgP4AgAGAgAKA/YACgICAgICAgICAgAAABQAAAAACgAOAAAUACQANABEAFwAAMREzFSEVATUzFT0BMxU9ATMVPQEhNSERgAH//gGAgID+AAKAAQCAgAEAgICAgICAgICAgID/AAAAAAABAAAAAAGAA4AABwAAMREhFSERIRUBgP8AAQADgID9gIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAhNTMVJREzEQE1MxUlETMRATUzFQIAgP8AgP8AgP8AgP8AgICAgAEA/wABAICAgAEA/wABAICAAAAAAAEAAAAAAYADgAAHAAAxNSERITUhEQEA/wABgIACgID8gAAAAAUAAAIAAoADgAADAAcACwAPABMAABE1MxUhNTMVJTUzFTM1MxUlNTMVgAGAgP4AgICA/wCAAgCAgICAgICAgICAgIAAAQAAAAACgACAAAMAADE1IRUCgICAAAAAAgAAAgABAAOAAAMABwAAEzUzFSURMxGAgP8AgAIAgICAAQD/AAAAAAMAAAAAAoACgAADAA0AEQAAPQEzHQE1ITUhNSE1MxEBNSEVgAGA/oABgID+AAGAgICAgICAgID+AAIAgIAAAAADAAAAAAKAA4AAAwAHABEAACURMxEBNSEVAREzETMVIxEhFQIAgP6AAQD+AICAgAGAgAGA/oABgICA/gADgP6AgP8AgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAzNSEVPQEzFSERMxEBNTMVJTUhFYABgID9gIABgID+AAGAgICAgIABgP6AAQCAgICAgAADAAAAAAKAA4AAAwAHABEAADURMxkBNSEVATUhESM1MxEzEYABAP8AAYCAgICAAYD+gAGAgID+AIABAIABgPyAAAAAAAMAAAAAAoACgAADAA0AEQAAMzUhFSURMxUhNTMRIRURNSEVgAIA/YCAAYCA/gABgICAgAGAgID/AIABgICAAAACAAAAAAIAA4AACwAPAAAzESM1MzUzFSEVIRkBNSEVgICAgAEA/wABAAIAgICAgP4AAwCAgAAAAAMAAP+AAoACgAADAAcAEQAAFTUhFQERMxEBNSE1IREhNSERAgD+AIABgP6AAYD+gAIAgICAAYABAP8A/wCAgAEAgP2AAAAAAAMAAAAAAoADgAADAAcADwAAIREzEQE1IRUBETMRMxUjEQIAgP6AAQD+AICAgAIA/gACAICA/gADgP6AgP6AAAACAAAAAACAA4AAAwAHAAAxETMRAzUzFYCAgAKA/YADAICAAAAEAAD/gAKAA4AAAwAHAAsADwAAFzUhFSURMxEhETMRAzUzFYABgP4AgAGAgICAgICAgAEA/wACgP2AAwCAgAAABQAAAAACAAOAAAMABwALAA8AFwAAITUzFSU1MxUDNTMVPQEzFQERMxEzFSMRAYCA/wCAgICA/gCAgICAgICAgAEAgICAgID+AAOA/gCA/wAAAAAAAgAAAAABAAOAAAMABwAAMzUzFSURMxGAgP8AgICAgAMA/QAABAAAAAACgAKAAAMABwANABEAAAERMxETETMRIREhFSMRATUzFQEAgICA/YABAIABAIABAAEA/wD/AAIA/gACgID+AAIAgIAAAgAAAAACgAKAAAMACQAAIREzESERIRUhEQIAgP2AAgD+gAIA/gACgID+AAAEAAAAAAKAAoAAAwAHAAsADwAAMzUhFSURMxEhETMRATUhFYABgP4AgAGAgP4AAYCAgIABgP6AAYD+gAGAgIAAAwAA/4ACgAKAAAMADwATAAABETMRAREzFTMVIxUhFSEREzUhFQIAgP2AgICAAYD+gIABAAEAAQD/AP6AAwCAgICA/wACgICAAAAAAAMAAP+AAoACgAADAAcAEwAAGQEzGQE1IRUTESE1ITUjNTM1MxGAAQCA/oABgICAgAEAAQD/AAEAgID9gAEAgICAgP0AAAAAAAMAAAAAAoACgAADAAsADwAAATUzFQERMxUzFSMREzUhFQIAgP2AgICAgAEAAYCAgP6AAoCAgP6AAgCAgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAxNSEVPQEzFSU1IRUlNTMVPQEhFQIAgP4AAYD+AIACAICAgICAgICAgICAgICAAAIAAAAAAYADgAADAA8AACE1MxUlESM1MxEzETMVIxEBAID/AICAgICAgICAAYCAAQD/AID+gAAAAgAAAAACgAKAAAMACQAANREzERU1IREzEYABgICAAgD+AICAAgD9gAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAhNTMVJTUzFTM1MxUlETMRIREzEQEAgP8AgICA/gCAAYCAgICAgICAgIABgP6AAYD+gAACAAAAAAKAAoAAAwANAAA1ETMRFTUzETMRMxEzEYCAgICAgAIA/gCAgAEA/wACAP2AAAAACQAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjAAAxNTMVITUzFSU1MxUzNTMVJTUzFSU1MxUzNTMVJTUzFSE1MxWAAYCA/gCAgID/AID/AICAgP4AgAGAgICAgICAgICAgICAgICAgICAgICAgIAAAAMAAP+AAoACgAADAAcADwAAFTUhFQERMxEBNSE1IREzEQIA/gCAAYD+gAGAgICAgAGAAYD+gP8AgIABgP2AAAADAAAAAAKAAoAABwALABMAADE1MzUzFSEVATUzFT0BITUhFSMVgIABgP6AgP6AAoCAgICAgAEAgICAgICAgAAABQAAAAACAAOAAAMABwALAA8AEwAAITUhFSURMxEBNTMVNREzGQE1IRUBAAEA/oCA/wCAgAEAgICAAQD/AAEAgICAAQD/AAEAgIAAAAIAAAAAAIADgAADAAcAADERMxEDETMRgICAAYD+gAIAAYD+gAAAAAAFAAAAAAIAA4AAAwAHAAsADwATAAAxNSEVNREzGQE1MxUlETMRATUhFQEAgID/AID+gAEAgICAAQD/AAEAgICAAQD/AAEAgIAAAAAABAAAAoADAAOAAAMABwALAA8AABE1MxUhNSEVJTUhFSE1MxWAAQABAP4AAQABAIACgICAgICAgICAgAAAAgAAAAAAgAMAAAMABwAAMREzEQM1MxWAgIACAP4AAoCAgAAABAAAAAACgAOAAAMABwALAB8AAAE1MxUhETMRATUzFQE1IzUzESM1MzUzFTMVIxEzFSMVAgCA/YCAAYCA/oCAgICAgICAgIABAICAAYD+gAEAgID+AICAAYCAgICA/oCAgAAAAAMAAAAAAoADgAAPABMAFwAAMTUzESM1MxEzESEVIREhFQM1MxUlNSEVgICAgAEA/wABgICA/oABAIABAIABAP8AgP8AgAKAgICAgIAAAAAACAAAAIACAAMAAAMABwALAA8AEwAXABsAHwAAPQEzFSE1MxUlNSEVJTUzFSE1MxUlNSEVJTUzFSE1MxWAAQCA/oABAP6AgAEAgP6AAQD+gIABAICAgICAgICAgICAgICAgICAgICAgIAAAAAABQAAAAACgAOAABMAFwAbAB8AIwAAITUjNTM1IzUzNTMVMxUjFTMVIxUBNTMVMzUzFSU1MxUhNTMVAQCAgICAgICAgID/AICAgP4AgAGAgICAgICAgICAgIACgICAgICAgICAgAAAAAACAAAAAACAA4AAAwAHAAAxETMRAxEzEYCAgAGA/oACAAGA/oAAAAAACAAAAAACAAOAAAMABwALAA8AEwAXABsAHwAAMTUhFT0BMxUlNSEVJTUzFSE1MxUlNSEVJTUzFT0BIRUBgID+gAEA/oCAAQCA/oABAP6AgAGAgICAgICAgICAgICAgICAgICAgICAgAACAAADAAKAA4AAAwAHAAARNSEVMzUhFQEAgAEAAwCAgICAAAADAAAAAAMAAoAADQARABsAADM1IxEzETMVMzUzFTMVNREzESURIzUhFSMVIxWAgICAgICAgP4AgAIAgICAAYD/AICAgICAAYD+gIABAICAgIAAAAABAAACAAGAA4AACQAAETUzNSM1IRUzEYCAAQCAAgCAgICA/wAAAAAACgAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjACcAACE1MxUzNTMVJTUzFTM1MxUlNTMVMzUzFSU1MxUzNTMVJTUzFTM1MxUBAICAgP4AgICA/gCAgID/AICAgP8AgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAEAAAAAAoABgAAFAAAhESE1IRECAP4AAoABAID+gAAAAQAAAgACgAKAAAMAABE1IRUCgAIAgIAAAwAAAQADAAOAAAMABwAZAAABNSMVIREzERU1MxEzNSE1IRUjFTM1MxEjFQIAgP6AgICA/wACAICAgIABgICAAYD+gICAAQCAgICAgP6AgAABAAADAAKAA4AAAwAAETUhFQKAAwCAgAAEAAACAAGAA4AAAwAHAAsADwAAEzUzFSU1MxUzNTMVJTUzFYCA/wCAgID/AIACAICAgICAgICAgIAAAAACAAAAAAMAA4AAAwAPAAAxNSEVAREhNSERIREhFSERAwD+AP8AAQABAAEA/wCAgAEAAQCAAQD/AID/AAABAAABAAIAA4AAEQAAGQEzNTM1ITUhFTMVIxUjFSEVgID/AAGAgICAAQABAAEAgICAgICAgIAAAAEAAAEAAgADgAAPAAARNSE1IzUzNSE1IRUzESMVAQCAgP8AAYCAgAEAgICAgICA/oCAAAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAABAAAAgAOAA4AADwAAPQEzESERIREhESMVIRUjFYABAAEAAQCA/oCAgIACgP6AAYD+gICAgAAAAAIAAAAABAADgAADABEAAAERIxETESE1IxEzNSERIREjEQGAgID/AICAA4D/AIACAAEA/wD+AAGAgAEAgPyAAwD9AAAAAQAAAQABAAGAAAMAABE1IRUBAAEAgIAAAwAAAAABgAIAAAMABwANAAAxNSEVPQEzFSU1MzUzEQEAgP6AgICAgICAgICAgP8AAAAAAAEAAAIAAQADgAAFAAATESM1IRGAgAEAAgABAID+gAAABAAAAgABgAOAAAMABwALAA8AABM1MxUlNTMVMzUzFSU1MxWAgP8AgICA/wCAAgCAgICAgICAgICAAAAACgAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjACcAADE1MxUzNTMVJTUzFTM1MxUlNTMVMzUzFSU1MxUzNTMVJTUzFTM1MxWAgID/AICAgP8AgICA/gCAgID+AICAgICAgICAgICAgICAgICAgICAgICAgICAgAAABwAAAAACgAOAAAMABwANABEAFQAZAB0AADE1MxU1ETMRBTUjESERATUzFTURMxElETMRJTUzFYCAAQCAAQD+gICA/gCAAYCAgICAAQD/AICAAQD+gAGAgICAAQD/AIABAP8AgICAAAAIAAAAAAKAA4AAAwAJAA0AEQAVABkAHQAhAAAxNTMVIREzFTMVJREzESU1MxUlNTMVNREzESURMxElNTMVgAEAgID+AIABAID+gICA/gCAAYCAgIABAICAgAEA/wCAgICAgICAAQD/AIABAP8AgICAAAAAAAUAAAAAAoADgAADAAkADQAbAB8AADE1MxUhNSMRIREBETMRAREjNTM1IxEhETMVIxEBNTMVgAGAgAEA/wCA/oCAgIABAICAAQCAgICAAQD+gAIAAQD/AP6AAQCAgAEA/oCA/wACgICAAAAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAMzUhFT0BMxUhETMZATUzFT0BMxUDNTMVgAGAgP2AgICAgICAgICAgAEA/wABAICAgICAAQCAgAAABAAAAAACgAUAAAsADwATABcAADERMxEhETMRIxEhGQE1IRUBNTMVJTUzFYABgICA/oABgP8AgP8AgAMA/wABAP0AAYD+gAMAgIABAICAgICAAAAABAAAAAACgAUAAAsADwATABcAADERMxEhETMRIxEhGQE1IRUBNTMVPQEzFYABgICA/oABgP8AgIADAP8AAQD9AAGA/oADAICAAQCAgICAgAAFAAAAAAKABQAACwAPABMAFwAbAAAxETMRIREzESMRIRkBNSEVATUzFTM1MxUlNTMVgAGAgID+gAGA/oCAgID/AIADAP8AAQD9AAGA/oADAICAAQCAgICAgICAAAMAAAAAAoAEgAALAA8AEwAAMREzESERMxEjESEZATUhFQE1IRWAAYCAgP6AAYD+gAGAAwD/AAEA/QABgP6AAwCAgAEAgIAAAAQAAAAAAoAEgAALAA8AEwAXAAAxETMRIREzESMRIRkBNSEVATUhFTM1IRWAAYCAgP6AAYD+AAEAgAEAAwD/AAEA/QABgP6AAwCAgAEAgICAgAAAAAMAAAAAAoAEgAALABMAFwAAMREzESERMxEjESEZAjMVMzUzEQE1MxWAAYCAgP6AgICA/wCAAwD/AAEA/QABgP6AAwABAICA/wABAICAAAAAAQAAAAACgAOAABUAADERMxUzNSM1IRUhFTMVIxEhFSERIxGAgIACAP8AgIABAP6AgAMAgICAgICA/oCAAgD+AAAAAAAHAAD/AAKAA4AABwALAA8AEwAXABsAHwAAATUjNSEVMxUDNTMVJTUhFT0BMxUhETMRATUzFSU1IRUBgIABAICAgP4AAYCA/YCAAYCA/gABgP8AgICAgAEAgICAgICAgIACAP4AAYCAgICAgAADAAAAAAKABQAACwAPABMAADERIRUhFSEVIREhFQE1MxUlNTMVAoD+AAEA/wACAP6AgP8AgAOAgICA/oCABACAgICAgAAAAAADAAAAAAKABQAACwAPABMAADERIRUhFSEVIREhFQE1MxU9ATMVAoD+AAEA/wACAP6AgIADgICAgP6AgAQAgICAgIAAAAQAAAAAAoAFAAALAA8AEwAXAAAxESEVIRUhFSERIRUBNTMVMzUzFSU1MxUCgP4AAQD/AAIA/gCAgID/AIADgICAgP6AgAQAgICAgICAgAAAAwAAAAACgASAAAsADwATAAAxESEVIRUhFSERIRUBNSEVMzUhFQKA/gABAP8AAgD9gAEAgAEAA4CAgID+gIAEAICAgIAAAAAAAwAAAAABAAQAAAMABwALAAAzETMRAzUzFSU1MxWAgICA/wCAAoD9gAMAgICAgIAAAwCAAAABgAQAAAMABwALAAAzETMRAzUzFT0BMxWAgICAgAKA/YADAICAgICAAAAABAAAAAABgAQAAAMABwALAA8AADMRMxEBNTMVMzUzFSU1MxWAgP8AgICA/wCAAoD9gAMAgICAgICAgAAAAwAAAAABgAOAAAMABwALAAAzETMRATUzFTM1MxWAgP8AgICAAoD9gAMAgICAgAAAAv+AAAACgAOAAAMAEwAAJREzEQURIzUzESEVIREhFSERIRUCAID9gICAAgD+gAEA/wABgIACgP2AgAGAgAGAgP8AgP8AgAAABAAAAAACgASAAAMACwATABcAAAE1MxUBETMVMxUjESERIzUzETMRATUhFQEAgP6AgICAAYCAgID+AAGAAgCAgP4AA4CAgP2AAYCAAYD8gAQAgIAABgAAAAACgAUAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVATUzFSU1MxWAAYD+AIABgID+AAGA/wCA/wCAgICAAoD9gAKA/YACgICAAQCAgICAgAAAAAAGAAAAAAKABQAAAwAHAAsADwATABcAADM1IRUlETMRIREzEQE1IRUBNTMVPQEzFYABgP4AgAGAgP4AAYD/AICAgICAAoD9gAKA/YACgICAAQCAgICAgAAABgAAAAACgAUAAAMABwALAA8AFQAZAAAzNSEVJREzESERMxEBNTMVAzUhETMRATUzFYABgP4AgAGAgP4AgIABAID/AICAgIACgP2AAoD9gAOAgID/AIABAP6AAYCAgAAABQAAAAACgASAAAMABwALAA8AEwAAMzUhFSURMxEhETMRATUhFQE1IRWAAYD+AIABgID+AAGA/oABgICAgAKA/YACgP2AAoCAgAEAgIAAAAAGAAAAAAKABIAAAwAHAAsADwATABcAADM1IRUlETMRIREzEQE1IRUBNSEVMzUhFYABgP4AgAGAgP4AAYD+AAEAgAEAgICAAoD9gAKA/YACgICAAQCAgICAAAAAAAkAAACAAoADAAADAAcACwAPABMAFwAbAB8AIwAAPQEzFSE1MxUlNTMVMzUzFSU1MxUlNTMVMzUzFSU1MxUhNTMVgAGAgP4AgICA/wCA/wCAgID+AIABgICAgICAgICAgICAgICAgICAgICAgICAgAAFAAAAAAKAA4AAAwAHAA8AFwAbAAAzNSEVATUzFQERMxEzFSMVIREjNTM1MxEBNSEVgAGA/wCA/oCAgIABgICAgP4AAYCAgAGAgID/AAKA/oCAgAGAgID9gAKAgIAAAAAFAAAAAAKABIAAAwAHAAsADwATAAAzNSEVJREzESERMxEBNTMVJTUzFYABgP4AgAGAgP6AgP8AgICAgAMA/QADAP0AAwCAgICAgAAABQAAAAACgASAAAMABwALAA8AEwAAMzUhFSURMxEhETMRATUzFT0BMxWAAYD+AIABgID+gICAgICAAwD9AAMA/QADAICAgICAAAAAAAQAAAAAAoAEgAADAAcACwAPAAAzNSEVJREzESERMxEBNSEVgAGA/gCAAYCA/gABgICAgAMA/QADAP0AA4CAgAAFAAAAAAKA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AAACgAOAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVPQEzFSU1IRWAAYD+AIABgID+AAGAgP4AAYCAgIABgP6AAYD+gAGAgICAgICAgIAAAAUAAAAAAoADgAADAAcACwAPABMAADM1IRUlETMRIREzEQE1IRUBNSEVgAGA/gCAAYCA/gABgP6AAYCAgIABgP6AAYD+gAGAgIABAICAAAAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVATUhFTM1IRWAAYD+AIABgID+AAGA/gABAIABAICAgAGA/oABgP6AAYCAgAEAgICAgAAAAAADAAAAAAMAA4AAAwAHAAsAACERIREBNSEVAREhEQEAAQD+AAMA/gABAAEA/wABgICAAQABAP8AAAMAAAAAAoACgAADAA0AFwAAATUzFQE1IxEzETMVIRU1ESM1ITUhFTMRAQCA/wCAgIABAID/AAGAgAEAgID/AIABgP8AgICAAQCAgID+gAAAAwAAAAACgAOAAAMACQANAAA1ETMRFTUhETMRATUhFYABgID9gAEAgAIA/gCAgAIA/YADAICAAAADAAAAAAKAA4AAAwAJAA0AADURMxEVNSERMxEBNSEVgAGAgP8AAQCAAgD+AICAAgD9gAMAgIAAAAMAAAAAAoADgAADAAkADQAANREzERU1IREzEQE1MxWAAYCA/oCAgAIA/gCAgAIA/YADAICAAAAABAAAAAACgAOAAAMACQANABEAADURMxEVNSERMxEBNTMVMzUzFYABgID+AICAgIACAP4AgIACAP2AAwCAgICAAAUAAP+AAoADgAADAAcADwATABcAABU1IRUBETMRATUhNSERMxEBNTMVPQEzFQIA/gCAAYD+gAGAgP6AgICAgIABgAGA/oD/AICAAYD9gAKAgICAgIAAAAACAAD/gAGAAwAAAwAPAAABNTMVAREzETMVIxUzFSMRAQCA/oCAgICAgAEAgID+gAOA/wCAgID/AAAAAAAFAAD/gAKAA4AAAwAHAA8AEwAXAAAVNSEVAREzEQE1ITUhETMRATUzFTM1MxUCAP4AgAGA/oABgID+AICAgICAgAGAAYD+gP8AgIABgP2AAwCAgICAAAAABwAAAAACgASAAAMABwALAA8AEwAXABsAACERMxEBNTMVMzUzFSU1MxUhNTMVATUhFTM1IRUBAID/AICAgP4AgAGAgP2AAQCAAQACgP2AAoCAgICAgICAgIABAICAgIAAAwAAAAACgAOAAAMACwARAAAhNSEVNREjNTMRMxEFESEVIREBAAEAgICA/YACAP6AgICAAQCAAQD9gIADgID9AAAAAAABAAABgAKAAgAAAwAAETUhFQKAAYCAgAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAACAAAAAAEAAYAAAwAHAAAxNTMVNREzEYCAgICAAQD/AAAAAAACAAACAAEAA4AAAwAHAAATNTMVJREzEYCA/wCAAgCAgIABAP8AAAAABAAAAgACAAOAAAMABwALAA8AABE1MxUzNTMVJREzETMRMxGAgID/AICAgAIAgICAgIABAP8AAQD/AAAABAAAAgACAAOAAAMABwALAA8AABE1MxUzNTMVJREzETMRMxGAgID/AICAgAIAgICAgIABAP8AAQD/AAAABAAAAAACAAGAAAMABwALAA8AADE1MxUzNTMVJREzETMRMxGAgID/AICAgICAgICAAQD/AAEA/wAAAAAAAQAAAAACgAOAAAsAACERITUhETMRIRUhEQEA/wABAIABAP8AAgCAAQD/AID+AAAAAQAAAQABgAKAAAsAABM1IzUzNTMVMxUjFYCAgICAgAEAgICAgICAAAMAAAAAAoABAAADAAcACwAAMREzETMRMxEzETMRgICAgIABAP8AAQD/AAEA/wAAAAUAAACAAYADAAADAAcACwAPABMAACU1MxUlNTMVJTUzFT0BMxU9ATMVAQCA/wCA/wCAgICAgICAgICAgICAgICAgIAABQAAAIABgAMAAAMABwALAA8AEwAAPQEzFT0BMxU9ATMVJTUzFSU1MxWAgID/AID/AICAgICAgICAgICAgICAgIAAAAABAAAAAAKAA4AAFwAAITUjNSMRMzUzNSEVIRUjFSEVIRUzFSEVAQCAgICAAYD/AIABgP6AgAEAgIABgICAgICAgICAgAAAAAABAAACAAMAA4AADwAAExEjNSEVMzUzFTMRITUjFYCAAYCAgID/AIACAAEAgICAgP8AgIAAAwAAAAACgAOAAA0AEQAVAAAzESM1MzUzFSER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);
-}*/
\ No newline at end of file
+}*/
From d2a27d7b18898d065531a69449fa0413bad339f5 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 13:34:27 -0300
Subject: [PATCH 11/20] Add durability feature to custom items
Refactor item display and update functionality to include durability. Update createRow function to handle durability input.
---
item/custom/script.js | 39 +++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/item/custom/script.js b/item/custom/script.js
index 48a00a0..6b94a18 100644
--- a/item/custom/script.js
+++ b/item/custom/script.js
@@ -14,9 +14,10 @@
var customItemsData = JSON.parse(window.localStorage.customItems);
document.getElementById("displays").innerHTML = "";
for(var i = 0; i < Object.keys(customItemsData).length; i++){
- var entry = customItemsData[Object.keys(customItemsData)[i]];
- document.getElementById("displays").innerHTML += createRow(entry.texture, Object.keys(customItemsData)[i], entry.readable, i);
- }
+ var key = Object.keys(customItemsData)[i];
+ var entry = customItemsData[key];
+ document.getElementById("displays").innerHTML += createRow(entry.texture, key, entry.readable, i, entry.durability);
+}
if(Object.keys(customItemsData).length == 0){
document.getElementById("displays").innerHTML = "
| No uploaded items yet. |
";
}
@@ -41,7 +42,8 @@
}
customItemsData[identifier] = {
readable: "My Custom Item",
- texture: dataurl
+ texture: dataurl,
+ durability: 0
};
window.localStorage.customItems = JSON.stringify(customItemsData);
location.reload();
@@ -53,18 +55,31 @@
location.reload();
}
-function updateItem(index, el){
- var entry = customItemsData[Object.keys(customItemsData)[index]];
- entry.readable = el.value;
- window.localStorage.customItems = JSON.stringify(customItemsData);
+function createRow(texture, identifier, namevalue, index, durability){
+ return '
' +
+ ' | ' +
+ ''+identifier+' | ' +
+ ' | ' +
+ // NEW NUMERICAL FIELD FOR DURABILITY
+ ' | ' +
+ ' | ' +
+ '
';
}
-function createRow(texture, identifier, namevalue, index){
- return '
 | '+identifier+' | |  |
';
- //'
 | | |  |
';
+function updateItem(index, el, field){
+ var keys = Object.keys(customItemsData);
+ var entry = customItemsData[keys[index]];
+
+ if(field === 'durability') {
+ entry.durability = parseInt(el.value) || 0;
+ } else {
+ entry.readable = el.value;
+ }
+
+ window.localStorage.customItems = JSON.stringify(customItemsData);
}
function abort(el){
el.src = "https://github.com/Mojang/bedrock-samples/raw/main/resource_pack/textures/items/empty_armor_slot_shield.png";
-}
\ No newline at end of file
+}
From 7019c6a30f1fadd81096b137e2647ad54b3e19a4 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 13:37:57 -0300
Subject: [PATCH 12/20] Add Max Durability column to index.html
---
item/custom/index.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/item/custom/index.html b/item/custom/index.html
index 23d2da8..7ec584e 100644
--- a/item/custom/index.html
+++ b/item/custom/index.html
@@ -20,6 +20,7 @@
| Icon |
Identifier |
Display Name |
+ Max Durability |
Delete |
From 0252a8e8ca1dce27dc7746607aabbdfb9316f3ca Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 14:18:22 -0300
Subject: [PATCH 13/20] Refactor item attributes and enhance enchantment
handling
---
structure-editor/script.js | 61 ++++++++++++++++++++++++++------------
1 file changed, 42 insertions(+), 19 deletions(-)
diff --git a/structure-editor/script.js b/structure-editor/script.js
index 381bc25..69bd47d 100644
--- a/structure-editor/script.js
+++ b/structure-editor/script.js
@@ -1272,12 +1272,30 @@ function createItemElement(itemdata){
let baseName = itemdata.Name.value;
let count = itemdata.Count.value;
let tags = (itemdata.hasOwnProperty("tag") ? itemdata.tag.value : {});
+ let customName = null;
+ if (tags.display && tags.display.value.Name) {
+ customName = tags.display.value.Name.value;
+ }
let rootDamage = itemdata.Damage ? itemdata.Damage.value : 0; // data/metadata
let durabilityDamage = (tags.Damage ? tags.Damage.value : 0); // durability
let enchanted = tags.hasOwnProperty("ench");
+ let enchantments = [];
+ if (tags.ench && tags.ench.value && tags.ench.value.value) {
+ let list = tags.ench.value.value; // Here we get the actual array []
+
+ if (Array.isArray(list)) {
+ enchantments = list.map(enc => {
+ return {
+ id: enc.id.value, // id: 1
+ level: enc.lvl.value // lvl: 3
+ };
+ });
+ }
+ }
+
// If rootDamage >0, "inject" it into the identifier as :data
let finalIdentifier = baseName;
if (rootDamage > 0) {
@@ -1288,6 +1306,10 @@ function createItemElement(itemdata){
itemelement.setAttribute("identifier", finalIdentifier);
itemelement.setAttribute("count", count);
+ if (customName) {
+ itemelement.setAttribute("custom-name", customName);
+ }
+
// Durability bar
if (durabilityDamage > 0) {
itemelement.setAttribute("damage", durabilityDamage);
@@ -1297,6 +1319,10 @@ function createItemElement(itemdata){
itemelement.setAttribute("data", rootDamage);
}
+ if (enchantments.length > 0) {
+ itemelement.setAttribute("enchantments", JSON.stringify(enchantments));
+}
+
itemelement.setAttribute("width", "27px");
itemelement.setAttribute("height", "27px");
itemelement.classList.add("nohover", "hovertooltip");
@@ -2172,7 +2198,7 @@ case 'tspawner': {
Equip:
+ placeholder="loot_tables/equipment/trial_chamber_iron.json" oninput="this.parentElement.nextElementSibling.style.display = this.value.trim() !== '' ? 'grid' : 'none';">
@@ -3479,32 +3505,31 @@ if (document.getElementById("item-banner-tab") && document.getElementById("item-
const isOminous = document.getElementById("item-banner-type").checked;
const bannerBaseSelect = document.getElementById("item-banner-base");
- // 1. Salva a Cor Base
+ // 1. Save the Base Color
if (isShield) {
- // No Escudo: Salva no NBT (tag.Base) usando o valor do select comum
+ // In the Shield: Saves to NBT (tag.Base) using the common select value.
if (bannerBaseSelect) {
tags.Base = { type: 'int', value: parseInt(bannerBaseSelect.value) };
}
- // Escudo não usa Type 1
+ // The shield does not use Type 1.
tags.Type = { type: 'int', value: 0 };
} else {
- // No Banner: Salva o Type (Ominous)
+ // In the Banner: Saves Type (Ominous)
tags.Type = { type: 'int', value: isOminous ? 1 : 0 };
- // A cor base (Damage) já é controlada pelo listener que você corrigiu
}
const patternsArray = [];
- // 2. Lógica dos PATTERNS (Desenhos)
+ // 2. Logic of PATTERNS
if (isShield && isOminous) {
- // No Escudo, "Ominous" é o padrão "ill" (Cor 15)
+ // In the Shield, "Ominous" is the pattern "ill" (Color 15)
patternsArray.push({
Pattern: { type: 'string', value: "ill" },
Color: { type: 'int', value: 15 }
});
}
- // Se não for Ominous, processa a lista de patterns normalmente
+ // If it's not Ominous, it processes the pattern list normally.
if (!isOminous) {
const patternList = document.getElementById("item-banner-patterns-list");
if (patternList) {
@@ -3523,7 +3548,7 @@ if (document.getElementById("item-banner-tab") && document.getElementById("item-
}
}
- // 3. Salva a tag Patterns final
+ // 3. Save the final Patterns tag.
tags.Patterns = {
type: 'list',
value: {
@@ -3571,7 +3596,7 @@ if (document.getElementById("item-fireworks-tab") && document.getElementById("it
const rows = document.querySelectorAll('.explosion-row');
const explosionsArray = [];
- // 1. Coleta os dados de todas as explosões na interface
+ // 1. Collects data from all explosions on the interface.
rows.forEach(row => {
const type = row.querySelector('.fw-type');
const color = row.querySelector('.fw-color');
@@ -3591,12 +3616,12 @@ if (document.getElementById("item-fireworks-tab") && document.getElementById("it
}
});
- // 2. Grava conforme o tipo de item (Rocket ou Star)
+ // 2. Record according to the item type (Rocket or Star)
if (isRocket) {
const flightInput = document.getElementById("item-firework-flight");
const flightVal = flightInput ? parseInt(flightInput.value) : 1;
- // No Foguete, tudo vai dentro da tag 'Fireworks'
+ // In Firework, everything goes under the 'Fireworks' tag.
tags.Fireworks = {
type: "compound",
value: {
@@ -3610,18 +3635,16 @@ if (document.getElementById("item-fireworks-tab") && document.getElementById("it
}
}
};
- // Limpeza: remove a tag de estrela caso exista
delete tags.FireworksItem;
} else if (isStar) {
- // Na Estrela, usa 'FireworksItem' e pega apenas a primeira explosão da lista
+ // In star, use 'FireworksItem' and pick only the first explosion from the list.
if (explosionsArray.length > 0) {
tags.FireworksItem = {
type: "compound",
value: explosionsArray[0].value
};
}
- // Limpeza: remove a tag de foguete caso exista
delete tags.Fireworks;
}
}
@@ -3629,12 +3652,12 @@ if (document.getElementById("item-fireworks-tab") && document.getElementById("it
// Armor trim
const isTrimmable = data.trimmable_armors.includes(item.Name.value);
-// Verifica se é uma armadura da lista ou se já possui a tag (custom/addons)
+// Check if it's an armor item from the list or if it already has the tag (custom/addons).
if (isTrimmable || tags.Trim) {
const selectedMaterial = document.getElementById("item-armor-trim-material").value;
const selectedPattern = document.getElementById("item-armor-trim-pattern").value;
- // Só grava se ambos forem diferentes de "none"
+ // It only records if both are different from "none".
if (selectedMaterial !== "none" && selectedPattern !== "none") {
tags.Trim = {
"type": "compound",
@@ -3650,7 +3673,7 @@ if (isTrimmable || tags.Trim) {
}
};
} else {
- // Se o usuário selecionou "none", removemos a tag Trim para limpar o NBT
+ // If the user selected "none", remove the Trim tag to clear the NBT.
if (tags.Trim) {
delete tags.Trim;
}
From a8190cb30d31b2c133627dc3c5133abec81006ae Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 14:21:41 -0300
Subject: [PATCH 14/20] Enhance world settings and manifest handling
Added new settings for hardcore mode, freeze damage, and various world settings. Updated manifest handling and improved pack upload processing.
---
world-packager/script.js | 499 +++++++++++++++++++++++++--------------
1 file changed, 328 insertions(+), 171 deletions(-)
diff --git a/world-packager/script.js b/world-packager/script.js
index 1841b08..3edd8b3 100644
--- a/world-packager/script.js
+++ b/world-packager/script.js
@@ -156,6 +156,7 @@ function openWorldSettings(){
}
document.getElementById("ws-name").value = leveldat.value.LevelName.value;
document.getElementById("ws-seed").innerHTML = leveldat.value.RandomSeed.value.valueOf().toString();
+ document.getElementById("ws-hradcore").checked = (leveldat.value.IsHardcore.value == 0 ? false : true);
document.getElementById("ws-difficulty").value = leveldat.value.Difficulty.value;
document.getElementById("ws-gametype").value = leveldat.value.GameType.value;
document.getElementById("ws-generator").value = leveldat.value.Generator.value;
@@ -187,18 +188,27 @@ function openWorldGamerules(){
document.getElementById("wg-drowningdamage").checked = leveldat.value.drowningdamage.value;
document.getElementById("wg-falldamage").checked = leveldat.value.falldamage.value;
document.getElementById("wg-firedamage").checked = leveldat.value.firedamage.value;
+ document.getElementById("wg-freezedamage").checked = leveldat.value.freezedamage.value;
//freezedamage
document.getElementById("wg-forcegamemode").checked = leveldat.value.ForceGameType.value;
document.getElementById("wg-funclimit").value = leveldat.value.functioncommandlimit.value;
document.getElementById("wg-keepinventory").checked = leveldat.value.keepinventory.value;
document.getElementById("wg-mobgriefing").checked = leveldat.value.mobgriefing.value;
document.getElementById("wg-naturalregen").checked = leveldat.value.naturalregeneration.value;
+ document.getElementById("wg-projectbreakblock").checked = leveldat.value.projectilescanbreakblocks.value;
+ document.getElementById("wg-pvp").checked = leveldat.value.pvp.value;
document.getElementById("wg-randomtick").value = leveldat.value.randomtickspeed.value;
+ document.getElementById("wg-recipeunlock").checked = leveldat.value.recipesunlock.value;
+ document.getElementById("wg-recipetoast").checked = leveldat.value.showrecipemessages.value;
document.getElementById("wg-sendcommandfeedback").checked = leveldat.value.sendcommandfeedback.value;
document.getElementById("wg-showcoordiantes").checked = leveldat.value.showcoordinates.value;
+ document.getElementById("wg-showdaysplayde").checked = leveldat.value.showdaysplayed.value;
document.getElementById("wg-showdeathmessages").checked = leveldat.value.showdeathmessages.value;
document.getElementById("wg-tntexplodes").checked = leveldat.value.tntexplodes.value;
+ document.getElementById("wg-tntexplodesdecay").checked = leveldat.value.tntexplosiondropdecay.value;
+ document.getElementById("wg-respawnblocksexplodes").checked = leveldat.value.respawnblocksexplode.value;
document.getElementById("wg-spawnradius").value = leveldat.value.spawnradius.value;
+ document.getElementById("wg-playerssleepingpercentage").value = leveldat.value.playerssleepingpercentage.value;
document.getElementById("wg-chainlimit").value = leveldat.value.maxcommandchainlength.value;
}
@@ -253,8 +263,11 @@ function openWorldMisc(){
document.getElementById("wm-multiplayer").checked = leveldat.value.MultiplayerGame.value;
document.getElementById("wm-multiplayervisible").checked = leveldat.value.MultiplayerGameIntent.value;
document.getElementById("wm-visibility").value = leveldat.value.XBLBroadcastIntent.value;
+ document.getElementById("wm-deftpermission").value = leveldat.value.permissionsLevel.value;
+ document.getElementById("wm-playerpermission").value = leveldat.value.playerPermissionsLevel.value;
document.getElementById("wm-lanbroadcase").checked = leveldat.value.LANBroadcast.value;
document.getElementById("wm-lanvisible").checked = leveldat.value.LANBroadcastIntent.value;
+ document.getElementById("wm-locatorbar").checked = leveldat.value.locatorbar.value;
}
function updateWorldSettings() {
@@ -263,6 +276,7 @@ function updateWorldSettings() {
//Update levelname.txt
masterzip.file("levelname.txt", document.getElementById("ws-name").value);
//leveldat.value.RandomSeed.value[1] = parseFloat(document.getElementById("ws-seed").value);
+ leveldat.value.IsHardcore.value = (document.getElementById("ws-hradcore").checked == true ? 1 : 0);
leveldat.value.Difficulty.value = parseFloat(document.getElementById("ws-difficulty").value);
leveldat.value.GameType.value = parseFloat(document.getElementById("ws-gametype").value);
leveldat.value.Generator.value = parseFloat(document.getElementById("ws-generator").value);
@@ -270,7 +284,7 @@ function updateWorldSettings() {
leveldat.value.SpawnX.value = parseFloat(document.getElementById("ws-spawnx").value);
leveldat.value.SpawnY.value = parseFloat(document.getElementById("ws-spawny").value);
leveldat.value.SpawnZ.value = parseFloat(document.getElementById("ws-spawnz").value);
- leveldat.value.spawnMobs.valvue = (document.getElementById("ws-spawnmobs").checked == true ? 1 : 0);
+ leveldat.value.spawnMobs.value = (document.getElementById("ws-spawnmobs").checked == true ? 1 : 0);
leveldat.value.bonusChestEnabled.value = (document.getElementById("ws-bonuschest").checked == true ? 1 : 0);
leveldat.value.bonusChestSpawned.value = (document.getElementById("ws-bonuschestspawned").checked == true ? 1 : 0);
@@ -294,18 +308,27 @@ function updateGamerules(){
leveldat.value.drowningdamage.value = (document.getElementById("wg-drowningdamage").checked == true ? 1 : 0);
leveldat.value.falldamage.value = (document.getElementById("wg-falldamage").checked == true ? 1 : 0);
leveldat.value.firedamage.value = (document.getElementById("wg-firedamage").checked == true ? 1 : 0);
+ leveldat.value.freezedamage.value = (document.getElementById("wg-freezedamage").checked == true ? 1 : 0);
//freezedamage
leveldat.value.ForceGameType.value = (document.getElementById("wg-forcegamemode").checked == true ? 1 : 0);
leveldat.value.functioncommandlimit.value = parseFloat(document.getElementById("wg-funclimit").value);
leveldat.value.keepinventory.value = (document.getElementById("wg-keepinventory").checked == true ? 1 : 0);
leveldat.value.mobgriefing.value = (document.getElementById("wg-mobgriefing").checked == true ? 1 : 0);
leveldat.value.naturalregeneration.value = (document.getElementById("wg-naturalregen").checked == true ? 1 : 0);
+ leveldat.value.projectilescanbreakblocks.value = (document.getElementById("wg-projectbreakblock").checked == true ? 1 : 0);
+ leveldat.value.pvp.value = (document.getElementById("wg-pvp").checked == true ? 1 : 0);
leveldat.value.randomtickspeed.value = parseFloat(document.getElementById("wg-randomtick").value);
+ leveldat.value.recipesunlock.value = (document.getElementById("wg-recipeunlock").checked == true ? 1 : 0);
+ leveldat.value.showrecipemessages.value = (document.getElementById("wg-recipetoast").checked == true ? 1 : 0);
leveldat.value.sendcommandfeedback.value = (document.getElementById("wg-sendcommandfeedback").checked == true ? 1 : 0);
leveldat.value.showcoordinates.value = (document.getElementById("wg-showcoordiantes").checked == true ? 1 : 0);
+ leveldat.value.showdaysplayed.value = (document.getElementById("wg-showdaysplayde").checked == true ? 1 : 0);
leveldat.value.showdeathmessages.value = (document.getElementById("wg-showdeathmessages").checked == true ? 1 : 0);
leveldat.value.tntexplodes.value = (document.getElementById("wg-tntexplodes").checked == true ? 1 : 0);
+ leveldat.value.tntexplosiondropdecay.value = (document.getElementById("wg-tntexplodesdecay").checked == true ? 1 : 0);
+ leveldat.value.respawnblocksexplode.value = (document.getElementById("wg-respawnblocksexplodes").checked == true ? 1 : 0);
leveldat.value.spawnradius.value = parseFloat(document.getElementById("wg-spawnradius").value);
+ leveldat.value.playerssleepingpercentage.value = parseFloat(document.getElementById("wg-playerssleepingpercentage").value);
leveldat.value.maxcommandchainlength.value = parseFloat(document.getElementById("wg-chainlimit").value);
//Update level.dat inside zip file
@@ -359,8 +382,11 @@ function updateWorldMisc() {
leveldat.value.MultiplayerGame.value = (document.getElementById("wm-multiplayer").checked == true ? 1 : 0);
leveldat.value.MultiplayerGameIntent.value = (document.getElementById("wm-multiplayervisible").checked == true ? 1 : 0);
leveldat.value.XBLBroadcastIntent.value = parseFloat(document.getElementById("wm-visibility").value);
+ leveldat.value.permissionsLevel.value = parseFloat(document.getElementById("wm-deftpermission").value);
+ leveldat.value.playerPermissionsLevel.value = parseFloat(document.getElementById("wm-playerpermission").value);
leveldat.value.LANBroadcast.value = (document.getElementById("wm-lanbroadcase").checked == true ? 1 : 0);
leveldat.value.LANBroadcastIntent.value = (document.getElementById("wm-lanvisible").checked == true ? 1 : 0);
+ leveldat.value.locatorbar.value = (document.getElementById("wm-locatorbar").checked == true ? 1 : 0);
//Update level.dat inside zip file
updateLevelDat();
@@ -484,133 +510,116 @@ function movePack(mode){
masterzip.file("world_resource_packs.json", JSON.stringify(wrp, null, 3));
}
-function doPacks(){
+async function doPacks() {
document.getElementById("pack-list").innerHTML = "";
- mdata = {
- bplist: [],
- rplist: [],
- bps: [],
- rps: []
- };
+ mdata = { bplist: [], rplist: [], bps: [], rps: [] };
packslist = [];
-
- if(masterzip.folder(/behavior_packs/)){
- for(var i = 0; i < Object.keys(masterzip.files).length; i++){
- var fiq = masterzip.files[Object.keys(masterzip.files)[i]];
- if(fiq.name.startsWith("behavior_packs") && !fiq.dir){
- //It's a file within the behavior packs directory
- if(fiq.name.includes("/manifest.json")){
- //It's a manifest.json file.
- const fiqName = fiq.name;
- getFile(fiq.name).then(function(result){
- result = JSON.parse(result);
- if(mdata.bps.filter(e => e.header.uuid === result.header.uuid).length == 0){
- if(!result.metadata) result.metadata = {};
- result.metadata.folder = fiqName.split("/")[1];
- mdata.bps.push(result);
- } else {
- alert("Multiple behavior packs with the same UUID were found. Only the first example will show up in the editor.");
- }
- })
- }
- /*if(fiq.name.includes("/en_US.lang")){
- //It's a language file, make sure the contents don't include "pack.name"
- getFile(fiq.name).then(function(result){
- result = parseLanguage(result);
- if(Object.keys(result).includes('pack.name')){
- mdata.bps[mdata.bps.length-1].header.name.replaceAll("pack.name", result["pack.name"]);
- }
- })
- }*/
- }
- }
- }
-
- if(masterzip.folder(/resource_packs/)){
- for(var i = 0; i < Object.keys(masterzip.files).length; i++){
- var fiq = masterzip.files[Object.keys(masterzip.files)[i]];
- if(fiq.name.startsWith("resource_packs") && !fiq.dir){
- //It's a file within the resource packs directory
- if(fiq.name.includes("/manifest.json")){
- //It's a manifest.json file.
- const fiqName = fiq.name;
- getFile(fiq.name).then(function(result){
- result = JSON.parse(result);
- if(mdata.rps.filter(e => e.header.uuid === result.header.uuid).length == 0){
- if(!result.metadata) result.metadata = {};
- result.metadata.folder = fiqName.split("/")[1];
- mdata.rps.push(result);
- } else {
- alert("Multiple resource packs with the same UUID were found. Only the first example will show up in the editor.");
+ const manifestPromises = [];
+ // Usamos um Set para garantir que cada caminho de arquivo seja processado uma única vez
+ const processedPaths = new Set();
+
+ // 1. Coleta de Manifests (Melhorada para evitar duplicatas de pastas)
+ Object.keys(masterzip.files).forEach(path => {
+ const fiq = masterzip.files[path];
+
+ // Critérios:
+ // - Não pode ser diretório
+ // - Tem que terminar exatamente com /manifest.json
+ // - Tem que estar dentro das pastas corretas
+ if (!fiq.dir && path.endsWith("/manifest.json") && !processedPaths.has(path)) {
+
+ if (path.startsWith("behavior_packs/")) {
+ processedPaths.add(path);
+ manifestPromises.push(
+ getFile(path).then(result => {
+ const resJson = JSON.parse(result);
+ if (!mdata.bps.some(e => e.header.uuid === resJson.header.uuid)) {
+ if (!resJson.metadata) resJson.metadata = {};
+ resJson.metadata.folder = path.split("/")[1];
+ mdata.bps.push(resJson);
}
})
- }
- /*if(fiq.name.includes("/en_US.lang")){
- //It's a language file, make sure the contents don't include "pack.name"
- getFile(fiq.name).then(function(result){
- result = parseLanguage(result);
- if(Object.keys(result).includes('pack.name')){
- mdata.rps[mdata.rps.length-1].header.name.replaceAll("pack.name", result["pack.name"]);
+ );
+ } else if (path.startsWith("resource_packs/")) {
+ processedPaths.add(path);
+ manifestPromises.push(
+ getFile(path).then(result => {
+ const resJson = JSON.parse(result);
+ if (!mdata.rps.some(e => e.header.uuid === resJson.header.uuid)) {
+ if (!resJson.metadata) resJson.metadata = {};
+ resJson.metadata.folder = path.split("/")[1];
+ mdata.rps.push(resJson);
}
})
- }*/
+ );
}
}
- }
-
- if(getFile("world_behavior_packs.json")){
- getFile("world_behavior_packs.json").then(
- function(bplist){
- bplist = JSON.parse(bplist);
- mdata.bplist = bplist;
- for(var i = 0; i < bplist.length; i++){
- var uuid = bplist[i].pack_id;
- var version = bplist[i].version;
- for(var a = 0; a < mdata.bps.length; a++){
- if(mdata.bps[a].header.uuid == uuid && unifyVersion(mdata.bps[a].header.version) == unifyVersion(version)){
- packslist.push(
- {
- type: 'bp',
- uuid: mdata.bps[a].header.uuid,
- version: mdata.bps[a].header.version,
- name: mdata.bps[a].header.name,
- display: mdata.bps[a].metadata.folder
- }
- );
- packsList(packslist);
- }
- }
+ });
+
+ await Promise.all(manifestPromises);
+
+ // 2. Processar world_behavior_packs.json
+ try {
+ const bplistData = await getFile("world_behavior_packs.json");
+ if (bplistData) {
+ const bplist = JSON.parse(bplistData);
+ mdata.bplist = bplist;
+ // Usamos um Set local para não repetir o mesmo pack visualmente na lista
+ const addedUUIDs = new Set();
+
+ bplist.forEach(item => {
+ const match = mdata.bps.find(bp =>
+ bp.header.uuid == item.pack_id &&
+ unifyVersion(bp.header.version) == unifyVersion(item.version)
+ );
+ if (match && !addedUUIDs.has(match.header.uuid)) {
+ addedUUIDs.add(match.header.uuid);
+ packslist.push({
+ type: 'bp',
+ uuid: match.header.uuid,
+ version: match.header.version,
+ name: match.header.name,
+ display: match.header.name || match.metadata.folder
+ });
}
- }
- )
- }
-
- if(getFile("world_resource_packs.json")){
- getFile("world_resource_packs.json").then(
- function(rplist){
- rplist = JSON.parse(rplist);
- mdata.rplist = rplist;
- for(var i = 0; i < rplist.length; i++){
- var uuid = rplist[i].pack_id;
- var version = rplist[i].version;
- for(var a = 0; a < mdata.rps.length; a++){
- if(mdata.rps[a].header.uuid == uuid && unifyVersion(mdata.rps[a].header.version) == unifyVersion(version)){
- packslist.push(
- {
- type: 'rp',
- uuid: mdata.rps[a].header.uuid,
- name: mdata.rps[a].header.name,
- version: mdata.rps[a].header.version,
- display: mdata.rps[a].metadata.folder
- }
- );
- packsList(packslist);
- }
- }
+ });
+ }
+ } catch (e) {}
+
+ // 3. Processar world_resource_packs.json
+ try {
+ const rplistData = await getFile("world_resource_packs.json");
+ if (rplistData) {
+ const rplist = JSON.parse(rplistData);
+ mdata.rplist = rplist;
+ const addedUUIDs = new Set();
+
+ rplist.forEach(item => {
+ const match = mdata.rps.find(rp =>
+ rp.header.uuid == item.pack_id &&
+ unifyVersion(rp.header.version) == unifyVersion(item.version)
+ );
+ if (match && !addedUUIDs.has(match.header.uuid)) {
+ addedUUIDs.add(match.header.uuid);
+ packslist.push({
+ type: 'rp',
+ uuid: match.header.uuid,
+ name: match.header.name,
+ version: match.header.version,
+ display: match.header.name || match.metadata.folder
+ });
}
- }
- )
+ });
+ }
+ } catch (e) {}
+
+ // 4. Renderiza a lista FINAL
+ if (packslist.length > 0) {
+ packsList(packslist);
+ } else {
+ // SE A LISTA ESTIVER VAZIA, VOLTA A MENSAGEM ORIGINAL
+ document.getElementById("pack-list").innerHTML = "Packs will show up here
with their directory's name.";
}
}
@@ -662,76 +671,224 @@ function parseLanguage(language){
return outputLanguage;
}
-function updateManifest(){
+function updateManifest() {
+ const newName = document.getElementById("pack-title").value;
+
+ // 1. Atualiza as versões no objeto atual
currentPack.header.version = updateVersion(currentPack.header.version, document.getElementById("pack-version").value);
currentPack.header.min_engine_version = updateVersion(currentPack.header.min_engine_version, document.getElementById("pack-me-version").value);
- currentPack.header.name = document.getElementById("pack-title").value;
+ // 2. Atualiza Nome e Descrição
+ currentPack.header.name = newName;
currentPack.header.description = document.getElementById("pack-desc").value;
- var packtype = (currentPack.modules[0].type == "data" ? "behavior_packs" : "resource_packs");
+ // 3. Determina a pasta correta (BP ou RP)
+ const moduleType = currentPack.modules[0].type;
+ let packtype = "";
+
+ // Inclui 'data', 'script' e 'javascript' como Behavior Packs
+ if (moduleType === "data" || moduleType === "script") {
+ packtype = "behavior_packs";
+ } else {
+ packtype = "resource_packs";
+ }
+
+ // 4. Salva o arquivo dentro do ZIP
var fileManifest = JSON.parse(JSON.stringify(currentPack));
- delete fileManifest.metadata.folder;
- masterzip.file(packtype + "/" + currentPack.metadata.folder + "/manifest.json", JSON.stringify(fileManifest, null, 3));
+ const folderName = currentPack.metadata.folder; // Nome da pasta original salva no upload
+ delete fileManifest.metadata; // Limpa metadados do site antes de salvar no ZIP
+
+ const finalPath = packtype + "/" + folderName + "/manifest.json";
+ masterzip.file(finalPath, JSON.stringify(fileManifest, null, 3));
+
+ // 5. Sincroniza visualmente com a lista lateral (Packslist)
+ for (var i = 0; i < packslist.length; i++) {
+ if (packslist[i].uuid === currentPack.header.uuid) {
+ packslist[i].name = newName;
+ packslist[i].display = newName;
+ break;
+ }
+ }
+
+ // 6. Atualiza a UI
+ packsList(packslist);
+
+ // Mantém o destaque visual (seleção) no pack editado
+ const items = document.getElementsByClassName("idlabel");
+ for (let item of items) {
+ if (item.getAttribute("uuid") === currentPack.header.uuid) {
+ item.classList.add("selected");
+ }
+ }
+
+ console.log("Salvo com sucesso em: " + finalPath);
}
-function processUplPack(zip){
- var filenames = Object.keys(zip.files);
- if(!filenames.includes("manifest.json")){
- alert("Uploaded pack does not include a manifest.json file."); return;
+// --- VARIÁVEIS GLOBAIS ---
+const usedPackNames = {
+ resource_packs: new Map(),
+ behavior_packs: new Map()
+};
+
+const packQueue = {
+ resource_packs: [],
+ behavior_packs: []
+};
+
+// --- PROCESSAMENTO DE UPLOAD ---
+function processUplPack(zip) {
+ const manifestsFound = [];
+ // Filtra manifestos reais, ignorando duplicatas de caminhos
+ const paths = Object.keys(zip.files);
+
+ paths.forEach(path => {
+ if (zip.files[path].dir) return;
+ const parts = path.split('/');
+ // Aceita manifest na raiz ou em subpastas de 1 nível (padrão mcaddon)
+ if (parts.length <= 2 && parts[parts.length - 1] === "manifest.json") {
+ manifestsFound.push(path);
+ }
+ });
+
+ if (manifestsFound.length === 0) {
+ alert("Nenhum manifest.json encontrado.");
+ return;
}
- if(!filenames.includes("pack_icon.png")){
- alert("Uploaded pack does not include a pack_icon.png file."); return;
+
+ let processedCount = 0;
+
+ manifestsFound.forEach(function(manifestPath) {
+ const packFolder = manifestPath.includes('/')
+ ? manifestPath.substring(0, manifestPath.lastIndexOf('/') + 1)
+ : '';
+
+ const iconPath = packFolder + "pack_icon.png";
+
+ // Verifica ícone antes de processar
+ if (!zip.files[iconPath]) {
+ alert(`Pack em "${packFolder || 'raiz'}" ignorado: falta pack_icon.png`);
+ processedCount++;
+ if (processedCount === manifestsFound.length) finalizeWorldFiles();
+ return;
+ }
+
+ zip.file(manifestPath).async("text").then(function(manifestText) {
+ let manifest;
+ try {
+ manifest = JSON.parse(manifestText);
+ } catch (e) {
+ console.error("Erro ao ler manifest:", manifestPath);
+ processedCount++;
+ return;
+ }
+
+ const moduleType = manifest?.modules?.[0]?.type;
+ let targetFolder;
+
+ if (moduleType === "resources") {
+ targetFolder = "resource_packs";
+ } else if (moduleType === "data" || moduleType === "script") {
+ targetFolder = "behavior_packs";
+ }
+
+ if (targetFolder) {
+ addUplPack(manifest.header.name, targetFolder, zip, manifest, packFolder);
+ }
+
+ processedCount++;
+ // Gatilho único para salvar os arquivos e atualizar a UI
+ if (processedCount === manifestsFound.length) {
+ // Delay de 500ms garante que as gravações físicas dos arquivos terminaram
+ setTimeout(finalizeWorldFiles, 500);
+ }
+
+ }).catch(err => {
+ processedCount++;
+ if (processedCount === manifestsFound.length) finalizeWorldFiles();
+ });
+ });
+
+ // Mensagem movida para o final do fluxo para não sobrepor o carregamento
+ if (manifestsFound.length > 1) {
+ console.log(`${manifestsFound.length} packs detectados no arquivo.`);
}
-
- zip.file("manifest.json").async("text").then(function(manifestResult){
- manifestResult = JSON.parse(manifestResult);
- if(manifestResult.modules[0].type == "resources"){
- addUplPack(manifestResult.header.name, "resource_packs", zip, manifestResult);
- } else if(manifestResult.modules[0].type == "data") {
- addUplPack(manifestResult.header.name, "behavior_packs", zip, manifestResult);
+}
+
+// --- ADICIONAR PACK AO ZIP MESTRE ---
+function addUplPack(name, type, zip, manifest, packFolder = '') {
+ let baseName = (manifest?.header?.name || "Pack_Sem_Nome").trim().replace(/[^a-zA-Z0-9-_. ]/g, '_');
+ const nameMap = usedPackNames[type] || new Map();
+ let counter = (nameMap.get(baseName) || 0) + 1;
+ nameMap.set(baseName, counter);
+
+ let safePackName = counter > 1 ? `${baseName} (${counter})` : baseName;
+ const packBasePath = type + "/" + safePackName + "/";
+
+ // Adiciona dados na fila de escrita do JSON
+ packQueue[type].push({
+ pack_id: manifest.header.uuid.toString(),
+ version: manifest.header.version || [1, 0, 0]
+ });
+
+ // Copia os arquivos de forma assíncrona
+ Object.keys(zip.files).filter(f => f.startsWith(packFolder)).forEach(myFileName => {
+ var file = zip.file(myFileName);
+ if (!file || file.dir) return;
+
+ var relativePath = packFolder ? myFileName.substring(packFolder.length) : myFileName;
+ var targetPath = packBasePath + relativePath;
+
+ if (myFileName.match(/\.(png|jpg|jpeg)$/i)) {
+ file.async("base64").then(res => masterzip.file(targetPath, res, {base64: true}));
} else {
- alert("Unrecognized pack type.");
- return;
+ file.async("text").then(res => masterzip.file(targetPath, res));
}
});
}
-function addUplPack(name, type, zip, manifest){
- var filenames = Object.keys(zip.files);
- var path = type + "/" + name + "/";
- //Merge old zip with master zip (project)
- for(var i = 0; i < filenames.length; i++){
- if(zip.file(filenames[i])){
- const myFileName = filenames[i];
- if(filenames[i].endsWith(".png")){
- zip.file(filenames[i]).async("base64").then(function(fileresult){
- fileresult = fileresult.toString();
- masterzip.file(path + myFileName, fileresult, {base64: true});
- })
- } else {
- zip.file(filenames[i]).async("text").then(function(fileresult){
- fileresult = fileresult.toString();
- masterzip.file(path + myFileName, fileresult);
- })
- }
+// --- FINALIZAÇÃO E ATUALIZAÇÃO DA INTERFACE ---
+function finalizeWorldFiles() {
+ const types = ["resource_packs", "behavior_packs"];
+ let tasksFinished = 0;
+
+ types.forEach(type => {
+ const worldFile = "world_" + type + ".json";
+ const queue = packQueue[type];
+
+ if (queue.length === 0) {
+ tasksFinished++;
+ if (tasksFinished === 2 && typeof doPacks === "function") doPacks();
+ return;
}
- }
-
- //Add pack to world_*_packs.json
- masterzip.file("world_" + type + ".json").async("text").then(function(r){
- r = JSON.parse(r);
- r.push(
- {
- pack_id: manifest.header.uuid.toString(),
- version: JSON.parse(JSON.stringify(manifest.header.version))
+
+ masterzip.file(worldFile).async("text").then(content => {
+ let existingPacks = [];
+ try { existingPacks = JSON.parse(content); } catch (e) {}
+
+ // Combina listas evitando IDs duplicados
+ const combined = [...existingPacks];
+ queue.forEach(np => {
+ if (!combined.some(ep => ep.pack_id === np.pack_id)) {
+ combined.push(np);
+ }
+ });
+
+ masterzip.file(worldFile, JSON.stringify(combined, null, 3));
+ packQueue[type] = []; // Limpa a fila após salvar
+
+ tasksFinished++;
+ // Só chama doPacks quando AMBOS os tipos (BP e RP) terminarem de processar o JSON
+ if (tasksFinished === 2 && typeof doPacks === "function") {
+ doPacks();
}
- );
-
- masterzip.file("world_" + type + ".json", JSON.stringify(r));
- doPacks();
+ }).catch(() => {
+ // Caso o arquivo não exista no zip mestre
+ masterzip.file(worldFile, JSON.stringify(queue, null, 3));
+ packQueue[type] = [];
+ tasksFinished++;
+ if (tasksFinished === 2 && typeof doPacks === "function") doPacks();
+ });
});
- //console.log(masterzip);
}
function deletePack(){
@@ -794,7 +951,7 @@ function deleteWT(){
if(confirm("Are you sure you want to turn off World Template mode? This will make your project export as a .mcworld file and it will delete the attached manifest.json file.")){
document.getElementById("add-wt").style.display = "inline-block";
document.getElementById("wt-settings").style.display = "none";
- document.getElementById("downloadworldbutton").innerHTML = "Download World";
+ document.getElementById("downloadworldbutton").innerHTML = "Download World File";
masterzip.remove("manifest.json");
}
}
@@ -862,4 +1019,4 @@ function downloadProject(){
inForcedMode = true;
document.getElementById("overlay").style.display = "block";
-document.getElementById("upload-notice").style.display = "block";
\ No newline at end of file
+document.getElementById("upload-notice").style.display = "block";
From 7e10d6d2e6e96d6548279ae6fa2cea6359437d3d Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 14:30:34 -0300
Subject: [PATCH 15/20] Translate and clarify comments in script.js
Updated comments in script.js to improve clarity and translate from Portuguese to English.
---
world-packager/script.js | 81 ++++++++++++++++++++--------------------
1 file changed, 40 insertions(+), 41 deletions(-)
diff --git a/world-packager/script.js b/world-packager/script.js
index 3edd8b3..ae5c9ac 100644
--- a/world-packager/script.js
+++ b/world-packager/script.js
@@ -516,17 +516,17 @@ async function doPacks() {
packslist = [];
const manifestPromises = [];
- // Usamos um Set para garantir que cada caminho de arquivo seja processado uma única vez
+ // We use a Set to ensure that each file path is processed only once.
const processedPaths = new Set();
- // 1. Coleta de Manifests (Melhorada para evitar duplicatas de pastas)
+ // 1. Manifest Collection (Improved to prevent duplicate folders)
Object.keys(masterzip.files).forEach(path => {
const fiq = masterzip.files[path];
- // Critérios:
- // - Não pode ser diretório
- // - Tem que terminar exatamente com /manifest.json
- // - Tem que estar dentro das pastas corretas
+ // Criteria:
+ // - It cannot be a directory.
+ // - It has to end exactly with /manifest.json
+ // - It needs to be in the correct folders.
if (!fiq.dir && path.endsWith("/manifest.json") && !processedPaths.has(path)) {
if (path.startsWith("behavior_packs/")) {
@@ -559,13 +559,13 @@ async function doPacks() {
await Promise.all(manifestPromises);
- // 2. Processar world_behavior_packs.json
+ // 2. Process world_behavior_packs.json
try {
const bplistData = await getFile("world_behavior_packs.json");
if (bplistData) {
const bplist = JSON.parse(bplistData);
mdata.bplist = bplist;
- // Usamos um Set local para não repetir o mesmo pack visualmente na lista
+ // We use a local Set to avoid visually repeating the same pack in the list.
const addedUUIDs = new Set();
bplist.forEach(item => {
@@ -587,7 +587,7 @@ async function doPacks() {
}
} catch (e) {}
- // 3. Processar world_resource_packs.json
+ // 3. Process world_resource_packs.json
try {
const rplistData = await getFile("world_resource_packs.json");
if (rplistData) {
@@ -614,11 +614,11 @@ async function doPacks() {
}
} catch (e) {}
- // 4. Renderiza a lista FINAL
+ // 4. Render the FINAL list
if (packslist.length > 0) {
packsList(packslist);
} else {
- // SE A LISTA ESTIVER VAZIA, VOLTA A MENSAGEM ORIGINAL
+ // If the list is empty, the original message will be returned.
document.getElementById("pack-list").innerHTML = "Packs will show up here
with their directory's name.";
}
}
@@ -674,34 +674,34 @@ function parseLanguage(language){
function updateManifest() {
const newName = document.getElementById("pack-title").value;
- // 1. Atualiza as versões no objeto atual
+ // 1. Updates the versions in the current object.
currentPack.header.version = updateVersion(currentPack.header.version, document.getElementById("pack-version").value);
currentPack.header.min_engine_version = updateVersion(currentPack.header.min_engine_version, document.getElementById("pack-me-version").value);
- // 2. Atualiza Nome e Descrição
+ // 2. Update Name and Description
currentPack.header.name = newName;
currentPack.header.description = document.getElementById("pack-desc").value;
- // 3. Determina a pasta correta (BP ou RP)
+ // 3. Determine the correct folder (BP or RP)
const moduleType = currentPack.modules[0].type;
let packtype = "";
- // Inclui 'data', 'script' e 'javascript' como Behavior Packs
+ // Includes 'data', and 'script' as Behavior Packs.
if (moduleType === "data" || moduleType === "script") {
packtype = "behavior_packs";
} else {
packtype = "resource_packs";
}
- // 4. Salva o arquivo dentro do ZIP
+ // 4. Save the file inside the ZIP.
var fileManifest = JSON.parse(JSON.stringify(currentPack));
- const folderName = currentPack.metadata.folder; // Nome da pasta original salva no upload
- delete fileManifest.metadata; // Limpa metadados do site antes de salvar no ZIP
+ const folderName = currentPack.metadata.folder; // Name of the original folder saved during upload.
+ delete fileManifest.metadata; // Clear website metadata before saving to ZIP file.
const finalPath = packtype + "/" + folderName + "/manifest.json";
masterzip.file(finalPath, JSON.stringify(fileManifest, null, 3));
- // 5. Sincroniza visualmente com a lista lateral (Packslist)
+ // 5. Visually synchronizes with the sidebar (Packslist)
for (var i = 0; i < packslist.length; i++) {
if (packslist[i].uuid === currentPack.header.uuid) {
packslist[i].name = newName;
@@ -710,10 +710,10 @@ function updateManifest() {
}
}
- // 6. Atualiza a UI
+ // 6. Update the UI
packsList(packslist);
- // Mantém o destaque visual (seleção) no pack editado
+ // Maintains visual prominence (selection) in the edited pack.
const items = document.getElementsByClassName("idlabel");
for (let item of items) {
if (item.getAttribute("uuid") === currentPack.header.uuid) {
@@ -721,10 +721,10 @@ function updateManifest() {
}
}
- console.log("Salvo com sucesso em: " + finalPath);
+ console.log("Successfully saved in: " + finalPath);
}
-// --- VARIÁVEIS GLOBAIS ---
+// --- GLOBAL VARIABLES ---
const usedPackNames = {
resource_packs: new Map(),
behavior_packs: new Map()
@@ -735,16 +735,16 @@ const packQueue = {
behavior_packs: []
};
-// --- PROCESSAMENTO DE UPLOAD ---
+// --- UPLOAD PROCESSING ---
function processUplPack(zip) {
const manifestsFound = [];
- // Filtra manifestos reais, ignorando duplicatas de caminhos
+ // Filters genuine manifests, ignoring duplicate paths.
const paths = Object.keys(zip.files);
paths.forEach(path => {
if (zip.files[path].dir) return;
const parts = path.split('/');
- // Aceita manifest na raiz ou em subpastas de 1 nível (padrão mcaddon)
+ // Accepts manifest files in the root directory or in single-level subfolders (McCaddon standard).
if (parts.length <= 2 && parts[parts.length - 1] === "manifest.json") {
manifestsFound.push(path);
}
@@ -764,7 +764,7 @@ function processUplPack(zip) {
const iconPath = packFolder + "pack_icon.png";
- // Verifica ícone antes de processar
+ // Check the icon before processing.
if (!zip.files[iconPath]) {
alert(`Pack em "${packFolder || 'raiz'}" ignorado: falta pack_icon.png`);
processedCount++;
@@ -796,9 +796,9 @@ function processUplPack(zip) {
}
processedCount++;
- // Gatilho único para salvar os arquivos e atualizar a UI
+ // Single trigger to save files and update the UI.
if (processedCount === manifestsFound.length) {
- // Delay de 500ms garante que as gravações físicas dos arquivos terminaram
+ // A 500ms delay ensures that the physical recording of the files has finished.
setTimeout(finalizeWorldFiles, 500);
}
@@ -807,16 +807,15 @@ function processUplPack(zip) {
if (processedCount === manifestsFound.length) finalizeWorldFiles();
});
});
-
- // Mensagem movida para o final do fluxo para não sobrepor o carregamento
+
if (manifestsFound.length > 1) {
- console.log(`${manifestsFound.length} packs detectados no arquivo.`);
+ console.log(`${manifestsFound.length} packs detected in the file.`);
}
}
-// --- ADICIONAR PACK AO ZIP MESTRE ---
+// --- ADD PACK TO MASTER ZIP ---
function addUplPack(name, type, zip, manifest, packFolder = '') {
- let baseName = (manifest?.header?.name || "Pack_Sem_Nome").trim().replace(/[^a-zA-Z0-9-_. ]/g, '_');
+ let baseName = (manifest?.header?.name || "Pack_Without_Name").trim().replace(/[^a-zA-Z0-9-_. ]/g, '_');
const nameMap = usedPackNames[type] || new Map();
let counter = (nameMap.get(baseName) || 0) + 1;
nameMap.set(baseName, counter);
@@ -824,13 +823,13 @@ function addUplPack(name, type, zip, manifest, packFolder = '') {
let safePackName = counter > 1 ? `${baseName} (${counter})` : baseName;
const packBasePath = type + "/" + safePackName + "/";
- // Adiciona dados na fila de escrita do JSON
+ // Adds data to the JSON write queue.
packQueue[type].push({
pack_id: manifest.header.uuid.toString(),
version: manifest.header.version || [1, 0, 0]
});
- // Copia os arquivos de forma assíncrona
+ // Copy the files asynchronously.
Object.keys(zip.files).filter(f => f.startsWith(packFolder)).forEach(myFileName => {
var file = zip.file(myFileName);
if (!file || file.dir) return;
@@ -846,7 +845,7 @@ function addUplPack(name, type, zip, manifest, packFolder = '') {
});
}
-// --- FINALIZAÇÃO E ATUALIZAÇÃO DA INTERFACE ---
+// --- FINALIZATION AND UPDATING OF THE INTERFACE ---
function finalizeWorldFiles() {
const types = ["resource_packs", "behavior_packs"];
let tasksFinished = 0;
@@ -865,7 +864,7 @@ function finalizeWorldFiles() {
let existingPacks = [];
try { existingPacks = JSON.parse(content); } catch (e) {}
- // Combina listas evitando IDs duplicados
+ // Combine lists, avoiding duplicate IDs.
const combined = [...existingPacks];
queue.forEach(np => {
if (!combined.some(ep => ep.pack_id === np.pack_id)) {
@@ -874,15 +873,15 @@ function finalizeWorldFiles() {
});
masterzip.file(worldFile, JSON.stringify(combined, null, 3));
- packQueue[type] = []; // Limpa a fila após salvar
+ packQueue[type] = []; // Clear the queue after saving.
tasksFinished++;
- // Só chama doPacks quando AMBOS os tipos (BP e RP) terminarem de processar o JSON
+ // Only call doPacks when BOTH types (BP and RP) have finished processing the JSON.
if (tasksFinished === 2 && typeof doPacks === "function") {
doPacks();
}
}).catch(() => {
- // Caso o arquivo não exista no zip mestre
+ // If the file does not exist in the master zip file
masterzip.file(worldFile, JSON.stringify(queue, null, 3));
packQueue[type] = [];
tasksFinished++;
From 02c5f0e4311ecc6f70da5389817855973d8aa86d Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 14:34:08 -0300
Subject: [PATCH 16/20] Enhance mobile styles for tier editor and elements
Added styles for tier editor and improved mobile responsiveness.
---
world-packager/style.css | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/world-packager/style.css b/world-packager/style.css
index e70eabf..79fe840 100644
--- a/world-packager/style.css
+++ b/world-packager/style.css
@@ -90,20 +90,42 @@
display: none;
}
+/* Solves the problem of the compressed/small editor */
+.tier-editor {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 10001;
+}
+
@media only screen and (max-width: 920px) {
+ .tier-editor {
+ width: 95vw; /* Expands sideways on mobile */
+ }
+
.worldsettings-inner {
column-count: unset;
column-gap: unset;
+ max-height: 65vh; /* Set the height for the scroll to work. */
+ overflow-y: auto; /* Enables vertical scrolling. */
}
.gamerules-inner {
column-count: unset;
column-gap: unset;
+ max-height: 65vh; /* Set the height for the scroll to work. */
+ overflow-y: auto; /* Enables vertical scrolling. */
}
- .worldsettings-inner .idlabel2 {
+ .worldsettings-inner .idlabel2,
+ .gamerules-inner .idlabel2 {
border-radius: 10px;
white-space: unset;
+ display: flex; /* Improves alignment on mobile. */
+ justify-content: space-between;
+ padding: 8px 10px; /* Increase the volume slightly for the touch. */
+ margin-bottom: 4px;
}
.mobilewarning {
@@ -117,13 +139,13 @@
display: block;
width: 100%;
border-radius: 10px 10px 0px 0px;
- padding: 0;
+ padding: 10px 0; /* Padding adicionado para não ficar achatado */
}
.upload-pack {
display: block;
width: 100%;
border-radius: 0px 0px 10px 10px;
- padding: 5px 0px;
+ padding: 10px 0px; /* Padding adicionado para não ficar achatado */
}
-}
\ No newline at end of file
+}
From 2317fcbf12f347d09af6a78a92f447718fcf40a7 Mon Sep 17 00:00:00 2001
From: joaololpvp <83421325+joaololpvp@users.noreply.github.com>
Date: Tue, 24 Feb 2026 14:35:08 -0300
Subject: [PATCH 17/20] Update HTML structure and button labels
---
world-packager/index.html | 126 ++++++++++++++++++++++----------------
1 file changed, 74 insertions(+), 52 deletions(-)
diff --git a/world-packager/index.html b/world-packager/index.html
index 0f6d349..866d60a 100644
--- a/world-packager/index.html
+++ b/world-packager/index.html
@@ -25,7 +25,6 @@
-
-
@@ -305,4 +327,4 @@ Packaging...
-