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 diff --git a/item/custom/script.js b/item/custom/script.js index 48a00a0..1b53f64 100644 --- a/item/custom/script.js +++ b/item/custom/script.js @@ -14,11 +14,12 @@ 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."; + document.getElementById("displays").innerHTML = "No uploaded items yet."; } var dataurl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABF0lEQVR4XmMYBSM+BBhJDoEghv949axjIMlMpoGOAhaiHQD1+Y1VL8BaMr7MQtF6/dV9MP8lw3xICBEZEkMgBNB8fvXfY6yB9vLcKbC4eEciJCRuQUPiCv40MYhDgEifowcHPCTWQUMiCH9IDP40AIvzrAfTUDw7TSELhX+AYSWE//ofJA1A0wQDATCEygEcPrn88wGqzPP3EL6oMAMxYMBDYNQBxNcFaBGKEfdo8uJGZpDcwHAVb1IY+rngwN/rEB9eeguhJQUZSAEDHgKEWy+wFlCYNsRj0JKOAZbfYd6F+rwhoQks0mAZCpEZ7LUh8e03AiEhnuAJSfVB84nyOSzghkAaQE/SOgRaxVeGWKuYYRSM+BAAAM/kV0mgX0JmAAAAAElFTkSuQmCC"; @@ -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 +} 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 +} 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", diff --git a/item/script.js b/item/script.js index 5c7f9de..cb99311 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.9/dist/textures/json/1.21.9.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( '/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,86 +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: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': 464, - 'minecraft:warped_fungus_on_a_stick': 100, - }, + durabilities: {}, }, init: function(){ @@ -273,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)){ @@ -373,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'); @@ -390,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'; } 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 +}*/ diff --git a/structure-editor/index.html b/structure-editor/index.html index 1a0b003..a9f6649 100644 --- a/structure-editor/index.html +++ b/structure-editor/index.html @@ -1349,6 +1349,10 @@

T + Leave a value blank to omit it. +
+ Loot Table Path:
+ Loot Table Seed:
Sherds

diff --git a/structure-editor/script.js b/structure-editor/script.js index c6b0408..69bd47d 100644 --- a/structure-editor/script.js +++ b/structure-editor/script.js @@ -1269,24 +1269,65 @@ 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; 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 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) { + finalIdentifier += ":" + rootDamage; // turn into "minecraft:potion:5" + } let itemelement = document.createElement("mcitem"); - itemelement.setAttribute("identifier", name); + itemelement.setAttribute("identifier", finalIdentifier); itemelement.setAttribute("count", count); + + if (customName) { + itemelement.setAttribute("custom-name", customName); + } + + // Durability bar + if (durabilityDamage > 0) { + itemelement.setAttribute("damage", durabilityDamage); + } + + if (rootDamage > 0) { + itemelement.setAttribute("data", rootDamage); + } + + if (enchantments.length > 0) { + itemelement.setAttribute("enchantments", JSON.stringify(enchantments)); +} + 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 +1994,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... @@ -2155,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';">
@@ -2837,7 +2880,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, @@ -3445,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) { @@ -3489,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: { @@ -3537,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'); @@ -3557,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: { @@ -3576,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; } } @@ -3595,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", @@ -3616,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; } diff --git a/world-generator/index.html b/world-generator/index.html index 1cc28ef..bd7073a 100644 --- a/world-generator/index.html +++ b/world-generator/index.html @@ -77,22 +77,47 @@

World Generator


+
- - Infinite World
-
- Biome:
-
-
- - + + Infinite World
+
+ Biome: + +
+ +
+ + +
+ +
+ + +
+
+ + Old
@@ -131,4 +156,4 @@

World Generator

- \ No newline at end of file + diff --git a/world-generator/script.js b/world-generator/script.js index 02e0333..0905255 100644 --- a/world-generator/script.js +++ b/world-generator/script.js @@ -4,6 +4,7 @@ const jszip = new JSZip(); var worldArchive = false; var leveldat = {}; var unparsedldb = {}; +let isCustomBiomeMode = false; function selectWorldType(typeclass){ for(let el of document.getElementById("main-page").getElementsByTagName("tr")){ @@ -38,9 +39,17 @@ function loadWorldArchive(){ //document.getElementById("old-seed").value = ""; } else { - document.getElementById("inf-biome").value = leveldat.value.BiomeOverride.value; - //document.getElementById("inf-seed").value = ""; - } + const savedBiome = leveldat.value.BiomeOverride ? leveldat.value.BiomeOverride.value : "minecraft:plains"; + + if (biomeData[savedBiome]) { + document.getElementById("inf-biome").value = savedBiome; + isCustomBiomeMode = false; + } else { + isCustomBiomeMode = true; + } + + leveldat.value.BiomeOverride.value = savedBiome; +} }); } @@ -85,21 +94,63 @@ var identifiers = {}; function doIdentifiers(){ document.getElementById("block-identifiers").innerHTML = ""; for(var i = 0; i < identifiers.prefixed_block_identifiers.enum.length; i++){ - document.getElementById("block-identifiers").innerHTML += ''; + document.getElementById("block-identifiers").innerHTML += + ''; } document.getElementById("flat-biome").innerHTML = ""; document.getElementById("inf-biome").innerHTML = ""; + for(var i = 0; i < Object.keys(biomeData).length; i++){ - if(biomeData[Object.keys(biomeData)[i]].numeric) { - document.getElementById("flat-biome").innerHTML += ''; + var key = Object.keys(biomeData)[i]; + + if (biomeData[key].numeric) { + document.getElementById("flat-biome").innerHTML += + ''; } - document.getElementById("inf-biome").innerHTML += ''; + + document.getElementById("inf-biome").innerHTML += + ''; } } fetchData(); +// Listener for custom toggle +document.getElementById("inf-custom-toggle").addEventListener("change", function() { + isCustomBiomeMode = this.checked; + + if (isCustomBiomeMode) { + // Show custom input, hide select vanilla + document.getElementById("inf-biome-custom").style.display = "block"; + document.getElementById("inf-biome-custom-warning").style.display = "block"; + document.getElementById("inf-biome").style.display = "none"; + + // Applies custom value (if something has already been entered) + changeInfBiome(document.getElementById("inf-biome-custom").value.trim()); + } else { + // Show select vanilla, hide custom. + document.getElementById("inf-biome-custom").style.display = "none"; + document.getElementById("inf-biome-custom-warning").style.display = "none"; + document.getElementById("inf-biome").style.display = "block"; + + changeInfBiome(document.getElementById("inf-biome").value.trim()); + } +}); + +// Listener para input custom +document.getElementById("inf-biome-custom").addEventListener("input", function() { + if (isCustomBiomeMode) { + changeInfBiome(this.value.trim()); + } +}); + +document.getElementById("inf-biome").addEventListener("change", function() { + if (!isCustomBiomeMode) { + changeInfBiome(this.value); + } +}); + /*
@@ -211,8 +262,15 @@ function renderFlatWorld(justParse){ } document.getElementById("flat-biome").value = flatWorldLayers.biome_id; + + const checkbox = document.getElementById("flat-version-post-118"); + if (checkbox) { + // If the template already has the tag, check the checkbox; otherwise, leave it unchecked. + checkbox.checked = !!flatWorldLayers.world_version; + } } + // Updates the JSON in level.dat leveldat.value["FlatWorldLayers"].value = JSON.stringify(flatWorldLayers); worldArchive.file("level.dat", nbt.writeUncompressed(leveldat, 'little')); } @@ -244,9 +302,13 @@ function changeFlatBiome(value){ renderFlatWorld(); } -function changeInfBiome(value){ - leveldat.value.BiomeOverride.value = value; - if(leveldat.value.RandomSeed) delete leveldat.value.RandomSeed; +function changeInfBiome(value) { + if (!value) return; + + // Always apply the value (whether from the vanilla select or the custom input). + leveldat.value.BiomeOverride.value = value.trim(); + + if (leveldat.value.RandomSeed) delete leveldat.value.RandomSeed; } function changeInfSeed(value){ @@ -272,15 +334,12 @@ function changeOldWorld(){ } } -function flatVersioning(bool){ - if(bool){ - if(!flatWorldLayers.world_version){ - flatWorldLayers.world_version = "version.post_1_18" - } +function flatVersioning(bool) { + if (bool) { + flatWorldLayers.world_version = "version.post_1_18"; // force always as a string + flatWorldLayers.encoding_version = 6; // force always as a string } else { - if(flatWorldLayers.world_version){ - delete flatWorldLayers.world_version; - } + delete flatWorldLayers.world_version; } renderFlatWorld(); @@ -303,4 +362,4 @@ function exportMcworld(){ }); } -selectWorldType("flat"); \ No newline at end of file +selectWorldType("flat"); 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 @@ - -

Miscellaneous

-
-
-
- Simulation Distance:
-
-
-
-
- +
+
+
+
+
+
+
+
+
+
+

+
+
+
@@ -305,4 +327,4 @@

Packaging... - \ No newline at end of file + diff --git a/world-packager/script.js b/world-packager/script.js index 1841b08..ae5c9ac 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 = []; + // We use a Set to ensure that each file path is processed only once. + const processedPaths = new Set(); + + // 1. Manifest Collection (Improved to prevent duplicate folders) + Object.keys(masterzip.files).forEach(path => { + const fiq = masterzip.files[path]; + + // 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/")) { + 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. Process world_behavior_packs.json + try { + const bplistData = await getFile("world_behavior_packs.json"); + if (bplistData) { + const bplist = JSON.parse(bplistData); + mdata.bplist = bplist; + // We use a local Set to avoid visually repeating the same pack in the list. + 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. Process 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. Render the FINAL list + if (packslist.length > 0) { + packsList(packslist); + } else { + // 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."; } } @@ -662,76 +671,223 @@ function parseLanguage(language){ return outputLanguage; } -function updateManifest(){ +function updateManifest() { + const newName = document.getElementById("pack-title").value; + + // 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); - currentPack.header.name = document.getElementById("pack-title").value; + // 2. Update Name and Description + currentPack.header.name = newName; currentPack.header.description = document.getElementById("pack-desc").value; - var packtype = (currentPack.modules[0].type == "data" ? "behavior_packs" : "resource_packs"); + // 3. Determine the correct folder (BP or RP) + const moduleType = currentPack.modules[0].type; + let packtype = ""; + + // Includes 'data', and 'script' as Behavior Packs. + if (moduleType === "data" || moduleType === "script") { + packtype = "behavior_packs"; + } else { + packtype = "resource_packs"; + } + + // 4. Save the file inside the 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; // 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. 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; + packslist[i].display = newName; + break; + } + } -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; + // 6. Update the UI + packsList(packslist); + + // 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) { + item.classList.add("selected"); + } } - if(!filenames.includes("pack_icon.png")){ - alert("Uploaded pack does not include a pack_icon.png file."); return; + + console.log("Successfully saved in: " + finalPath); +} + +// --- GLOBAL VARIABLES --- +const usedPackNames = { + resource_packs: new Map(), + behavior_packs: new Map() +}; + +const packQueue = { + resource_packs: [], + behavior_packs: [] +}; + +// --- UPLOAD PROCESSING --- +function processUplPack(zip) { + const manifestsFound = []; + // 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('/'); + // 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); + } + }); + + if (manifestsFound.length === 0) { + alert("Nenhum manifest.json encontrado."); + return; } + + let processedCount = 0; + + manifestsFound.forEach(function(manifestPath) { + const packFolder = manifestPath.includes('/') + ? manifestPath.substring(0, manifestPath.lastIndexOf('/') + 1) + : ''; + + const iconPath = packFolder + "pack_icon.png"; + + // Check the icon before processing. + 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++; + // Single trigger to save files and update the UI. + if (processedCount === manifestsFound.length) { + // A 500ms delay ensures that the physical recording of the files has finished. + setTimeout(finalizeWorldFiles, 500); + } + + }).catch(err => { + processedCount++; + if (processedCount === manifestsFound.length) finalizeWorldFiles(); + }); + }); - 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); + if (manifestsFound.length > 1) { + console.log(`${manifestsFound.length} packs detected in the file.`); + } +} + +// --- ADD PACK TO MASTER ZIP --- +function addUplPack(name, type, zip, manifest, packFolder = '') { + 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); + + let safePackName = counter > 1 ? `${baseName} (${counter})` : baseName; + const packBasePath = type + "/" + safePackName + "/"; + + // Adds data to the JSON write queue. + packQueue[type].push({ + pack_id: manifest.header.uuid.toString(), + version: manifest.header.version || [1, 0, 0] + }); + + // 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; + + 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); - }) - } +// --- FINALIZATION AND UPDATING OF THE 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) {} + + // Combine lists, avoiding duplicate IDs. + 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] = []; // Clear the queue after saving. + + tasksFinished++; + // Only call doPacks when BOTH types (BP and RP) have finished processing the JSON. + if (tasksFinished === 2 && typeof doPacks === "function") { + doPacks(); } - ); - - masterzip.file("world_" + type + ".json", JSON.stringify(r)); - doPacks(); + }).catch(() => { + // If the file does not exist in the master zip file + 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 +950,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 +1018,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"; 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 +}