From 075214029efed1cf7c32999b7f7a3dff09a9e06b Mon Sep 17 00:00:00 2001 From: ChrisM-Pek Date: Wed, 9 Sep 2026 23:02:25 +0200 Subject: [PATCH] feat(onlyfun): add ChrisM, Duncan and other skin-face fireworks Co-authored-by: Cursor --- build.gradle | 80 +++--- onlyfun/art/skins/bake_portraits.py | 174 +++++++++++ onlyfun/art/skins/chrism.png | Bin 0 -> 4930 bytes onlyfun/art/skins/creveforest.png | Bin 0 -> 1575 bytes onlyfun/art/skins/duncan.png | Bin 0 -> 3047 bytes onlyfun/art/skins/kaninscheun.png | Bin 0 -> 1028 bytes onlyfun/art/skins/lbeast.png | Bin 0 -> 4029 bytes onlyfun/art/skins/poupoutain.png | Bin 0 -> 933 bytes onlyfun/art/skins/sacdchips.png | Bin 0 -> 2464 bytes onlyfun/art/skins/vaselline.png | Bin 0 -> 1549 bytes onlyfun/art/skins/write_firework_assets.py | 47 +++ .../client/SkinFaceFireworkClient.java | 10 +- .../item/SkinFaceFireworkExplosions.java | 19 +- .../onlyfun/item/SkinFaceFireworkItem.java | 30 ++ .../onlyfun/item/SkinFacePortrait.java | 269 ++++++++++++++++++ .../onlyfun/registry/OnlyFunCreativeTab.java | 4 + .../onlyfun/registry/OnlyFunRegistries.java | 24 +- .../assets/onlyfun/items/chrism_firework.json | 6 + .../onlyfun/items/creveforest_firework.json | 6 + .../assets/onlyfun/items/duncan_firework.json | 6 + .../onlyfun/items/kaninscheun_firework.json | 6 + .../assets/onlyfun/items/lbeast_firework.json | 6 + .../onlyfun/items/poupoutain_firework.json | 6 + .../onlyfun/items/sacdchips_firework.json | 6 + .../onlyfun/items/vaselline_firework.json | 6 + .../resources/assets/onlyfun/lang/en_us.json | 9 + .../resources/assets/onlyfun/lang/fr_fr.json | 9 + .../resources/assets/onlyfun/lang/ru_ru.json | 9 + .../onlyfun/models/item/chrism_firework.json | 6 + .../models/item/creveforest_firework.json | 6 + .../onlyfun/models/item/duncan_firework.json | 6 + .../models/item/kaninscheun_firework.json | 6 + .../onlyfun/models/item/lbeast_firework.json | 6 + .../models/item/poupoutain_firework.json | 6 + .../models/item/sacdchips_firework.json | 6 + .../models/item/vaselline_firework.json | 6 + .../onlyfun/textures/item/chrism_firework.png | Bin 0 -> 246 bytes .../textures/item/creveforest_firework.png | Bin 0 -> 261 bytes .../onlyfun/textures/item/duncan_firework.png | Bin 0 -> 247 bytes .../textures/item/kaninscheun_firework.png | Bin 0 -> 197 bytes .../onlyfun/textures/item/lbeast_firework.png | Bin 0 -> 359 bytes .../textures/item/poupoutain_firework.png | Bin 0 -> 149 bytes .../textures/item/sacdchips_firework.png | Bin 0 -> 317 bytes .../textures/item/vaselline_firework.png | Bin 0 -> 209 bytes .../data/onlyfun/recipe/chrism_firework.json | 13 + .../onlyfun/recipe/creveforest_firework.json | 13 + .../data/onlyfun/recipe/duncan_firework.json | 13 + .../onlyfun/recipe/kaninscheun_firework.json | 13 + .../data/onlyfun/recipe/lbeast_firework.json | 13 + .../onlyfun/recipe/poupoutain_firework.json | 13 + .../onlyfun/recipe/sacdchips_firework.json | 13 + .../onlyfun/recipe/vaselline_firework.json | 13 + .../onlyfun/item/SkinFaceFireworkSmoke.java | 62 ++-- 53 files changed, 870 insertions(+), 76 deletions(-) create mode 100644 onlyfun/art/skins/bake_portraits.py create mode 100644 onlyfun/art/skins/chrism.png create mode 100644 onlyfun/art/skins/creveforest.png create mode 100644 onlyfun/art/skins/duncan.png create mode 100644 onlyfun/art/skins/kaninscheun.png create mode 100644 onlyfun/art/skins/lbeast.png create mode 100644 onlyfun/art/skins/poupoutain.png create mode 100644 onlyfun/art/skins/sacdchips.png create mode 100644 onlyfun/art/skins/vaselline.png create mode 100644 onlyfun/art/skins/write_firework_assets.py create mode 100644 onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/item/SkinFaceFireworkItem.java create mode 100644 onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/item/SkinFacePortrait.java create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/chrism_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/creveforest_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/duncan_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/kaninscheun_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/lbeast_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/poupoutain_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/sacdchips_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/items/vaselline_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/chrism_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/creveforest_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/duncan_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/kaninscheun_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/lbeast_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/poupoutain_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/sacdchips_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/models/item/vaselline_firework.json create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/chrism_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/creveforest_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/duncan_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/kaninscheun_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/lbeast_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/poupoutain_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/sacdchips_firework.png create mode 100644 onlyfun/src/main/resources/assets/onlyfun/textures/item/vaselline_firework.png create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/chrism_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/creveforest_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/duncan_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/kaninscheun_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/lbeast_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/poupoutain_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/sacdchips_firework.json create mode 100644 onlyfun/src/main/resources/data/onlyfun/recipe/vaselline_firework.json diff --git a/build.gradle b/build.gradle index f8f01b0..1082b8c 100644 --- a/build.gradle +++ b/build.gradle @@ -3916,11 +3916,15 @@ project(":onlyfun") { "src/main/java/fr/koka99cab/sanctuary26/onlyfun/world/CobbleDungeonStructure.java").text def dungeonStructureSet = new JsonSlurper().parse(file( "src/main/resources/data/onlyfun/worldgen/structure_set/cobble_dungeons.json")) - def expectedItems = ["normal_lootbox", "cape_lootbox", "spawn_egg_lootbox", "anomaly_lootbox", "lucky_block", "nourra_firework"] + def fireworkIds = ["nourra", "chrism", "kaninscheun", "poupoutain", "lbeast", + "creveforest", "sacdchips", "vaselline", "duncan"] + def expectedItems = ["normal_lootbox", "cape_lootbox", "spawn_egg_lootbox", "anomaly_lootbox", "lucky_block"] + + fireworkIds.collect { "${it}_firework" } def missingModels = expectedItems.findAll { id -> !file("src/main/resources/assets/onlyfun/items/${id}.json").exists() } - def textureIds = ["normal_lootbox", "cape_lootbox", "spawn_egg_lootbox", "anomaly_lootbox", "nourra_firework"] + def textureIds = ["normal_lootbox", "cape_lootbox", "spawn_egg_lootbox", "anomaly_lootbox"] + + fireworkIds.collect { "${it}_firework" } def invalidTextures = textureIds.findAll { id -> def texture = file("src/main/resources/assets/onlyfun/textures/item/${id}.png") if (!texture.isFile()) return true @@ -4138,41 +4142,53 @@ project(":onlyfun") { || !shopCsvText.contains("TRUE,ITEM,iliketomoveit:magic_cloud,1,3072,192,") || !javaText.contains("MAGIC_CLOUD, MAGIC_CARPET") || !file("src/main/resources/assets/onlyfun/models/block/lucky_block.json").text.contains("onlyfun:block/lucky_block") - || !javaText.contains("class NourraFireworkItem extends FireworkRocketItem") - || !javaText.contains("class SkinFaceFireworkExplosions") - || !javaText.contains("FACE = {") - || !javaText.contains("HOOD = {") - || !javaText.contains("HOOD_TOP = {") - || !javaText.contains("0x4A9DFC") - || !javaText.contains("TRANSPARENT") - || !javaText.contains("class SkinFaceFireworkClient") - || !javaText.contains("DustParticleOptions") - || !javaText.contains("PIXEL = 1.85D") - || !javaText.contains("LARGE_PIXEL = 2.7D") - || !javaText.contains("LARGE_SPARK_SIZE = 5.15F") - || !javaText.contains("SPARK_LIFETIME_TICKS = 38") - || !javaText.contains("new Fireworks(3, List.of())") - || !javaText.contains("LIFETIME_TRIM_TICKS = 5") - || !javaText.contains("onlyfun\$midFlightLifetime") - || !javaText.contains("onlyfun\$drawSkinFace") - || !javaText.contains("output.accept(OnlyFunRegistries.NOURRA_FIREWORK)") - || !file("src/main/resources/onlyfun.mixins.json").text.contains("FireworkRocketLifetimeMixin") - || !file("src/main/resources/onlyfun.client.mixins.json").text.contains("FireworkRocketEntityMixin") - || !file("src/main/resources/onlyfun.client.mixins.json").text.contains("ParticleLifetimeAccessor") - || !file("src/main/resources/fabric.mod.json").text.contains("onlyfun.mixins.json") - || !file("src/main/resources/fabric.mod.json").text.contains("onlyfun.client.mixins.json") - || !file("src/main/resources/data/onlyfun/recipe/nourra_firework.json").text.contains("onlyfun:nourra_firework") - || ["fr_fr", "en_us", "ru_ru"].any { locale -> - def translations = new JsonSlurper().parse(file( - "src/main/resources/assets/onlyfun/lang/${locale}.json")) - !translations.containsKey("item.onlyfun.nourra_firework") - || !translations.containsKey("tooltip.onlyfun.nourra_firework") - } || !missingModels.isEmpty() || !invalidTextureHashes.isEmpty() || !invalidTextures.isEmpty()) { throw new GradleException("Only Fun natural-distribution contract is incomplete: models=${missingModels}, textures=${invalidTextures}, hashes=${invalidTextureHashes}") } + def fireworkFailures = [] + if (!javaText.contains("class SkinFaceFireworkItem extends FireworkRocketItem")) fireworkFailures << "SkinFaceFireworkItem" + if (!javaText.contains("enum SkinFacePortrait")) fireworkFailures << "SkinFacePortrait" + if (!javaText.contains("class SkinFaceFireworkExplosions")) fireworkFailures << "SkinFaceFireworkExplosions" + if (!javaText.contains("CHRISM(")) fireworkFailures << "CHRISM" + if (!javaText.contains("DUNCAN(")) fireworkFailures << "DUNCAN" + if (!javaText.contains("0x4A9DFC")) fireworkFailures << "nourraEyes" + if (!javaText.contains("TRANSPARENT")) fireworkFailures << "TRANSPARENT" + if (!javaText.contains("class SkinFaceFireworkClient")) fireworkFailures << "client" + if (!javaText.contains("DustParticleOptions")) fireworkFailures << "dust" + if (!javaText.contains("PIXEL = 1.85D")) fireworkFailures << "pixel" + if (!javaText.contains("LARGE_PIXEL = 2.7D")) fireworkFailures << "largePixel" + if (!javaText.contains("LARGE_SPARK_SIZE = 5.15F")) fireworkFailures << "largeSpark" + if (!javaText.contains("SPARK_LIFETIME_TICKS = 38")) fireworkFailures << "lifetime" + if (!javaText.contains("new Fireworks(3, List.of())")) fireworkFailures << "fireworks" + if (!javaText.contains("LIFETIME_TRIM_TICKS = 5")) fireworkFailures << "trim" + if (!javaText.contains("onlyfun\$midFlightLifetime")) fireworkFailures << "midFlight" + if (!javaText.contains("onlyfun\$drawSkinFace")) fireworkFailures << "drawSkinFace" + if (!javaText.contains("OnlyFunRegistries.skinFireworks()")) fireworkFailures << "tab" + if (!file("src/main/resources/onlyfun.mixins.json").text.contains("FireworkRocketLifetimeMixin")) fireworkFailures << "commonMixin" + if (!file("src/main/resources/onlyfun.client.mixins.json").text.contains("FireworkRocketEntityMixin")) fireworkFailures << "clientMixin" + if (!file("src/main/resources/onlyfun.client.mixins.json").text.contains("ParticleLifetimeAccessor")) fireworkFailures << "particleAccessor" + if (!file("src/main/resources/fabric.mod.json").text.contains("onlyfun.mixins.json")) fireworkFailures << "fabricCommon" + if (!file("src/main/resources/fabric.mod.json").text.contains("onlyfun.client.mixins.json")) fireworkFailures << "fabricClient" + fireworkIds.each { fireworkId -> + if (!file("src/main/resources/data/onlyfun/recipe/${fireworkId}_firework.json").text.contains("onlyfun:${fireworkId}_firework")) { + fireworkFailures << "recipe:${fireworkId}" + } + } + ["fr_fr", "en_us", "ru_ru"].each { locale -> + def translations = new JsonSlurper().parse(file( + "src/main/resources/assets/onlyfun/lang/${locale}.json")) + if (!translations.containsKey("tooltip.onlyfun.skin_face_firework")) fireworkFailures << "tooltip:${locale}" + fireworkIds.each { fireworkId -> + if (translations["item.onlyfun.${fireworkId}_firework"] == null) { + fireworkFailures << "lang:${locale}:${fireworkId}" + } + } + } + if (!fireworkFailures.isEmpty()) { + throw new GradleException("Only Fun firework contract is incomplete: ${fireworkFailures}") + } } } diff --git a/onlyfun/art/skins/bake_portraits.py b/onlyfun/art/skins/bake_portraits.py new file mode 100644 index 0000000..dbfb0ec --- /dev/null +++ b/onlyfun/art/skins/bake_portraits.py @@ -0,0 +1,174 @@ +from pathlib import Path + +from PIL import Image + +TRANSPARENT = -1 +PEOPLE = [ + ("chrism", "ChrisM", "red_dye"), + ("kaninscheun", "Kaninscheun", "yellow_dye"), + ("poupoutain", "Poupoutain", "light_gray_dye"), + ("lbeast", "lBeast", "brown_dye"), + ("creveforest", "CreveForest", "green_dye"), + ("sacdchips", "SacDChips", "orange_dye"), + ("vaselline", "Vaselline", "white_dye"), + ("duncan", "Duncan", "pink_dye"), +] +ROOT = Path(__file__).resolve().parents[2] + + +def rgb(pixel): + red, green, blue, _alpha = pixel + return (red << 16) | (green << 8) | blue + + +def extract(path): + image = Image.open(path).convert("RGBA") + face = [] + hood = [] + hood_top = [] + inner_top = [] + for y in range(8, 16): + for x in range(8, 16): + face.append(rgb(image.getpixel((x, y)))) + for y in range(8, 16): + for x in range(40, 48): + red, green, blue, alpha = image.getpixel((x, y)) + hood.append(TRANSPARENT if alpha < 128 else (red << 16) | (green << 8) | blue) + for y in range(6, 8): + for x in range(8, 16): + inner_top.append(rgb(image.getpixel((x, y)))) + for y in range(6, 8): + for x in range(40, 48): + red, green, blue, alpha = image.getpixel((x, y)) + if alpha < 128: + hood_top.append(inner_top[(y - 6) * 8 + (x - 40)]) + else: + hood_top.append((red << 16) | (green << 8) | blue) + return face, hood, hood_top + + +def fmt(values): + lines = [] + for index in range(0, len(values), 8): + chunk = values[index:index + 8] + parts = ["-1" if value == TRANSPARENT else f"0x{value:06X}" for value in chunk] + comma = "," if index + 8 < len(values) else "" + lines.append("\t\t" + ", ".join(parts) + comma) + return "\n".join(lines) + + +NOURRA_FACE = [ + 0x000000, 0x020202, 0x0A0A0A, 0x111111, 0x111111, 0x0A0A0A, 0x020202, 0x000000, + 0x020202, 0x0A0A0A, 0x111111, 0x181818, 0x181818, 0x111111, 0x0A0A0A, 0x020202, + 0x0A0A0A, 0x111111, 0x181818, 0x212121, 0x212121, 0x181818, 0x111111, 0x0A0A0A, + 0x111111, 0x181818, 0x212121, 0x2B2B2B, 0x2B2B2B, 0x212121, 0x181818, 0x111111, + 0x111111, 0x000000, 0x000000, 0xFFF0E1, 0xFFF0E1, 0x000000, 0x000000, 0x111111, + 0x0A0A0A, 0xFFFFFF, 0x4A9DFC, 0xFDE8D7, 0xFFF0E1, 0x4A9DFC, 0xFFFFFF, 0x0A0A0A, + 0x020202, 0xFFFFFF, 0x4A9DFC, 0xFDE8D7, 0xFDE8D7, 0x4A9DFC, 0xFFFFFF, 0x020202, + 0x000000, 0xF0C6A5, 0xF7D5B9, 0xFCE1CA, 0xFCE1CA, 0xF7D5B9, 0xF0C6A5, 0x000000, +] +NOURRA_HOOD = [ + 0x000000, 0x0D0D0D, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0x0D0D0D, 0x000000, + 0x0D0D0D, 0x707070, 0xD8D8D8, 0xE5E5E5, 0xE5E5E5, 0xD8D8D8, 0x707070, 0x0D0D0D, + 0xCBCBCB, 0xD8D8D8, 0xFFFFFF, 0x212121, 0x212121, 0x181818, 0xD8D8D8, 0xCBCBCB, + 0xD8D8D8, 0x181818, 0x212121, 0x2B2B2B, 0x2B2B2B, 0x212121, 0x181818, 0xD8D8D8, + 0x111111, 0x181818, 0x212121, 0x2B2B2B, TRANSPARENT, TRANSPARENT, TRANSPARENT, 0x111111, + 0x0A0A0A, 0x111111, 0x181818, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, + 0x020202, 0x0A0A0A, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, + TRANSPARENT, 0x020202, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, TRANSPARENT, +] +NOURRA_TOP = [ + 0xBEBEBE, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0xBEBEBE, + 0xB8B8B8, 0xB8B8B8, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0xB8B8B8, 0xB8B8B8, +] + + +def main(): + entries = [("nourra", NOURRA_FACE, NOURRA_HOOD, NOURRA_TOP)] + for ident, _display, _dye in PEOPLE: + face, hood, top = extract(ROOT / "art" / "skins" / f"{ident}.png") + entries.append((ident, face, hood, top)) + print(ident, "hood opaque", sum(1 for value in hood if value != TRANSPARENT)) + + out = ROOT / "src" / "main" / "java" / "fr" / "koka99cab" / "sanctuary26" / "onlyfun" / "item" / "SkinFacePortrait.java" + chunks = [ + "package fr.koka99cab.sanctuary26.onlyfun.item;\n\n", + "import net.minecraft.world.item.ItemStack;\n\n", + "/** Baked 8x8 inner face, hood overlay and hood-top strip for each skin firework. */\n", + "public enum SkinFacePortrait {\n", + ] + for index, (ident, face, hood, top) in enumerate(entries): + comma = "," if index + 1 < len(entries) else ";" + chunks.append( + f"\t{ident.upper()}(\"{ident}\", new int[] {{\n{fmt(face)}\n\t}}, new int[] {{\n{fmt(hood)}\n\t}}, new int[] {{\n{fmt(top)}\n\t}}){comma}\n" + ) + chunks.append(""" + public static final int WIDTH = 8; + public static final int HEIGHT = 8; + public static final int TRANSPARENT = -1; + + private final String id; + private final int[] face; + private final int[] hood; + private final int[] hoodTop; + + SkinFacePortrait(String id, int[] face, int[] hood, int[] hoodTop) { + this.id = id; + this.face = face; + this.hood = hood; + this.hoodTop = hoodTop; + } + + public String id() { + return id; + } + + public String itemId() { + return id + \"_firework\"; + } + + public int[] face() { + return face; + } + + public int[] hood() { + return hood; + } + + public int[] hoodTop() { + return hoodTop; + } + + public int opaqueHoodPixels() { + int count = 0; + for (int color : hood) { + if (color != TRANSPARENT) count++; + } + return count; + } + + public int[] portrait() { + int[] pixels = new int[WIDTH * (HEIGHT + 2)]; + System.arraycopy(hoodTop, 0, pixels, 0, hoodTop.length); + for (int index = 0; index < face.length; index++) { + pixels[hoodTop.length + index] = hood[index] == TRANSPARENT ? face[index] : hood[index]; + } + return pixels; + } + + public int portraitHeight() { + return HEIGHT + hoodTop.length / WIDTH; + } + + public static SkinFacePortrait of(ItemStack stack) { + if (stack.isEmpty() || !(stack.getItem() instanceof SkinFaceFireworkItem item)) return null; + return item.portrait(); + } +} +""") + out.write_text("".join(chunks), encoding="utf-8") + print("wrote", out) + + +if __name__ == "__main__": + main() diff --git a/onlyfun/art/skins/chrism.png b/onlyfun/art/skins/chrism.png new file mode 100644 index 0000000000000000000000000000000000000000..d4539c7ff0eca14f5f8a408228a23d45e987cf52 GIT binary patch literal 4930 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 literal 0 HcmV?d00001 diff --git a/onlyfun/art/skins/creveforest.png b/onlyfun/art/skins/creveforest.png new file mode 100644 index 0000000000000000000000000000000000000000..46bdb8a3f35eea6ee0b0152194de507b25777930 GIT binary patch literal 1575 zcmV+?2H5$DP)5B>lVmgpf_69sRI3L*r9 zms|ud-UN@Hg}r$3Jo?&w?VHb5cXc~6&ScmJU%I>MTUFop>RZ)4-7}e1aO(UEt!-`Z zw8k=DpWc0b=Gu64e}B4r>sDi9Fj+P@AYoE66LwjOW1pu!d}ZcZ5cx!kU||wj#&{Qw znUM=f!X~Gq1xVtyycQmM?d_R9O^(8_On!`a;fS$|$P_m*WfW{ybDJgK?gXy6hTLm|LoW6jadZM z3ltz{*@W}jm{)+)H$SbnZ%6BZXEIa0i~RS$f7zHtkO_SP5X=h3yKuzVMKIMf{e9jg zfS15LP>eg*Uv4*5ojViBgXBx{mEeL4l~V476{f)6u)U>-yT)>KRXhq;2lYb!;~Z>L}Ano%`AZa--v|uGYR* z&v+6ftuh@mvt(>H3K?Jq>R@Ge-+!_(Z*aa&g0}330`NFg0G)HWEK~r_j0Mo3B6{uH zucr@gKQaB~&mS5QbgnYhnUMTB(_ZhT{$0;_5}p8-8@2jDu#!4DFe~eg?%?2HdgKRYMQj%X4}5-Q##E-d8lL(2>hz7@_M4;H zcvF7!n=9>;=NJ?P*tz&!E5dW{Uz`!424|1VzYSbw0Yvz|cR!dhm8Afs$q_7oOaeGF zmnMM7j}<^`Jq2(E=r}|GW~t!*CBR#MeAEiClnj_>3FK@$I0~@HB`|jem@v%(bea7` z${VBCd7l6!|E%L4BBHbupk(P&!$j#`vOW>KOk@f&*LrCQq$o1_^X`zh$z1a(LK4m_ zN)ZMLz?mPL0SeSJ?aj{*JZ)gR|33Vb{P}!f0h_WQQzG4E_N!sy*`PVdF3VX=qOAZ( zON&BbQZPO-X135656ylxOuQaxImmlAK4~mF&vopbJZF^ac8CBxs&B?MHoh7f0rZIL z$K0_4qySEF6KgZzP!yL_FcMDz99!DZ_~cu|gq?Gc9LU!xnr1TZ<(^ruUztU5J^h*b zzE&OM8XI2?of(h=(9)+wDEEa@8T~C7H$&CU8($60CfL=Xm8GRmk-rUX(Gr;Fv z0$3muPqF5WuZD@9@=B(sK6l79raJqT2$?uyv8LI1H}e+2yr`qyxz0Xrn< zPtboXN_~~ex{$s@aHIh{By6mnepKXk9 zgDF7C^8W!Gf8~$>UIKk4kt_gTlUsx&OhN3&@mCHBU=jMv8Nk=!ePU#p{W$*0;mwL4 zGiZF5PoqC=Z8t>+&#z6iB*8B`W7>24m7_$U^mTWL0Q@A*PvdJTz{fvb?hT$KQV3tu zw`6Y5@mCHDP|JW6fR^>O_8foZc<07mFQGKgJdJ*R?K%F+Ap!2#Iyv2X`fOwT-@%ao zA5aJikUkuLvit!=%l{v6)-8Z%+JfcLA}m6H ZzX12h;7tV}Vaxyk002ovPDHLkV1it+@GSrU literal 0 HcmV?d00001 diff --git a/onlyfun/art/skins/duncan.png b/onlyfun/art/skins/duncan.png new file mode 100644 index 0000000000000000000000000000000000000000..a94b4bfbea8d3cb0289756e92c883acf85aac59d GIT binary patch literal 3047 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 tooltip, TooltipFlag flag) { + tooltip.accept(Component.translatable("tooltip.onlyfun.skin_face_firework").withStyle(ChatFormatting.AQUA)); + super.appendHoverText(stack, context, display, tooltip, flag); + } +} diff --git a/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/item/SkinFacePortrait.java b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/item/SkinFacePortrait.java new file mode 100644 index 0000000..5159e0f --- /dev/null +++ b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/item/SkinFacePortrait.java @@ -0,0 +1,269 @@ +package fr.koka99cab.sanctuary26.onlyfun.item; + +import net.minecraft.world.item.ItemStack; + +/** Baked 8x8 inner face, hood overlay and hood-top strip for each skin firework. */ +public enum SkinFacePortrait { + NOURRA("nourra", new int[] { + 0x000000, 0x020202, 0x0A0A0A, 0x111111, 0x111111, 0x0A0A0A, 0x020202, 0x000000, + 0x020202, 0x0A0A0A, 0x111111, 0x181818, 0x181818, 0x111111, 0x0A0A0A, 0x020202, + 0x0A0A0A, 0x111111, 0x181818, 0x212121, 0x212121, 0x181818, 0x111111, 0x0A0A0A, + 0x111111, 0x181818, 0x212121, 0x2B2B2B, 0x2B2B2B, 0x212121, 0x181818, 0x111111, + 0x111111, 0x000000, 0x000000, 0xFFF0E1, 0xFFF0E1, 0x000000, 0x000000, 0x111111, + 0x0A0A0A, 0xFFFFFF, 0x4A9DFC, 0xFDE8D7, 0xFFF0E1, 0x4A9DFC, 0xFFFFFF, 0x0A0A0A, + 0x020202, 0xFFFFFF, 0x4A9DFC, 0xFDE8D7, 0xFDE8D7, 0x4A9DFC, 0xFFFFFF, 0x020202, + 0x000000, 0xF0C6A5, 0xF7D5B9, 0xFCE1CA, 0xFCE1CA, 0xF7D5B9, 0xF0C6A5, 0x000000 + }, new int[] { + 0x000000, 0x0D0D0D, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0x0D0D0D, 0x000000, + 0x0D0D0D, 0x707070, 0xD8D8D8, 0xE5E5E5, 0xE5E5E5, 0xD8D8D8, 0x707070, 0x0D0D0D, + 0xCBCBCB, 0xD8D8D8, 0xFFFFFF, 0x212121, 0x212121, 0x181818, 0xD8D8D8, 0xCBCBCB, + 0xD8D8D8, 0x181818, 0x212121, 0x2B2B2B, 0x2B2B2B, 0x212121, 0x181818, 0xD8D8D8, + 0x111111, 0x181818, 0x212121, 0x2B2B2B, -1, -1, -1, 0x111111, + 0x0A0A0A, 0x111111, 0x181818, -1, -1, -1, -1, -1, + 0x020202, 0x0A0A0A, -1, -1, -1, -1, -1, -1, + -1, 0x020202, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0xBEBEBE, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0xBEBEBE, + 0xB8B8B8, 0xB8B8B8, 0xCBCBCB, 0xD8D8D8, 0xD8D8D8, 0xCBCBCB, 0xB8B8B8, 0xB8B8B8 + }), + CHRISM("chrism", new int[] { + 0xF59589, 0xF89C90, 0xFEA398, 0xFEA398, 0xFCA297, 0xF89B8F, 0xF2978B, 0xF49488, + 0xF59589, 0xFB9D91, 0xFA9D92, 0xFCA095, 0xFCA095, 0xFCA095, 0xF89B8F, 0xF49488, + 0xF59589, 0xFB9A8E, 0xFD9E93, 0xFDA196, 0xFDA196, 0xFD9E93, 0xFB9A8E, 0xFF988B, + 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, + 0xFE8B7E, 0x000000, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0x000000, 0xFD8B7D, + 0xF67D70, 0xF68375, 0xFA897C, 0xFE8B7E, 0xFE8B7E, 0xFE8B7E, 0xF68375, 0xF67D70, + 0x000000, 0xFFFFFF, 0x000000, 0x000000, 0x000000, 0x000000, 0xFFFFFF, 0x000000, + 0xEE6858, 0x000000, 0x000000, 0xFF1408, 0xFC0C00, 0x000000, 0x000000, 0xEE6858 + }, new int[] { + 0xFF8071, 0xFF8274, 0xFF796A, 0xFA7B6C, 0xFE7E70, 0xF97769, 0xFB7F70, 0xFF7A6B, + 0xF56E5E, 0xFF9185, 0xFF8375, 0xFF9084, 0xFB8A7E, 0xFE9286, 0xFF8B7E, 0xF68274, + 0xFA7263, 0xFF9488, 0xFE9084, 0xFE8C80, 0xFF9286, 0xF77F72, 0xF89084, 0xF97465, + 0xFF8273, 0xFF8E82, 0xFA8D81, 0xF68477, 0xF69186, 0xFF8F83, 0xFD9286, 0xFF7767, + 0xFF8173, 0xFB887B, 0xFC9084, 0xFF9083, 0xFF978B, 0xFF8375, 0xF48A7E, 0xFF8173, + 0xFD7D6E, -1, 0xF5897D, 0xFF8C7F, 0xF3877A, 0xFF897C, -1, 0xFF7060, + 0xFC7667, 0xFF897B, 0xFF9488, -1, -1, 0xF37F72, 0xF89186, 0xFD7566, + 0xFF8375, 0xFF7F70, 0xF88072, 0xF88173, 0xFC7869, 0xFF8173, 0xFF8678, 0xFF7C6D + }, new int[] { + 0xF97566, 0xFF8C7F, 0xF4867A, 0xFF877A, 0xF4786A, 0xFF8678, 0xF97E70, 0xFF7F71, + 0xFF897B, 0xFB7566, 0xFF8C7F, 0xF77F72, 0xF77769, 0xFF7C6E, 0xF88578, 0xF87B6D + }), + KANINSCHEUN("kaninscheun", new int[] { + 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, + 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xFFCC66, 0xEAD900, 0xEDDF2D, + 0xEAD900, 0xEDDF2D, 0xEAD900, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xEDDF2D, + 0xEAD900, 0x000000, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0x000000, 0xEDDF2D, + 0xEAD900, 0x000000, 0x000000, 0xFFCC66, 0xFFCC66, 0x000000, 0x000000, 0xEDDF2D, + 0xEAD900, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xFFCC66, 0xEDDF2D, + 0xEAD900, 0xFFCC66, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xFFCC66, 0xEDDF2D, + 0xEAD900, 0xEAD900, 0xEDDF2D, 0xFFCC66, 0xFFCC66, 0xEAD900, 0xEAD900, 0xEDDF2D + }, new int[] { + -1, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, -1, + 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, + 0xEDDF2D, 0xEAD900, 0xEDDF2D, -1, -1, -1, 0xEDDF2D, 0xEAD900, + 0xEDDF2D, 0xEAD900, -1, -1, -1, -1, -1, 0xEAD900, + 0xEDDF2D, -1, -1, -1, -1, -1, -1, 0xEAD900, + 0xEDDF2D, -1, -1, -1, -1, -1, -1, 0xEAD900, + 0xEDDF2D, -1, -1, -1, -1, -1, -1, 0xEAD900, + -1, 0xEAD900, -1, -1, -1, -1, 0xEDDF2D, -1 + }, new int[] { + 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, + 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900, 0xEDDF2D, 0xEAD900 + }), + POUPOUTAIN("poupoutain", new int[] { + 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x342404, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0x342404, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x342404, 0xE0DFDE, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0xE7E6E4, 0x4B5456, + 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456 + }, new int[] { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, 0x4B5456, + 0x414B4C, 0x414B4C, 0x414B4C, 0x414B4C, 0x414B4C, 0x414B4C, 0x414B4C, 0x414B4C + }), + LBEAST("lbeast", new int[] { + 0x8A6C30, 0x8A6B31, 0x644B1A, 0x5D4B1E, 0x896F37, 0x80672A, 0x614B1A, 0x4C3910, + 0x957538, 0x816C34, 0x6D5521, 0x715B20, 0xA88C44, 0x9C7E3B, 0x7F6625, 0x7D6325, + 0xB59F6D, 0xC1AC74, 0xC8B378, 0xD0BB7C, 0xD9C382, 0xE7CF8A, 0xD2BC7E, 0xC6A574, + 0xB39C6C, 0x2B2324, 0x2B2324, 0xD5BA80, 0xD7BE80, 0x2B2324, 0x2B2324, 0xCBA977, + 0xDCC285, 0xBAA0A6, 0x42597E, 0xF1D491, 0xD7BD7F, 0x42597E, 0xBAA0A6, 0xECC48B, + 0xEACC8C, 0xFAF3F5, 0x87A6D2, 0xFDDB98, 0xDCBE81, 0x87A6D2, 0xFAF3F5, 0xF1C88E, + 0xE4C082, 0xF6D695, 0xFBDD96, 0xFBE197, 0xFBE197, 0xFDDC95, 0xF6D695, 0xEBC288, + 0xE9C183, 0xEFC68A, 0xF6D695, 0xFDDC94, 0xFBE197, 0xF6D695, 0xF4C98C, 0xDFB67D + }, new int[] { + 0x7E652E, 0xC5A253, 0xC5A253, 0xBB984A, 0xD0A64E, 0xBB984A, 0xC5A253, 0x715B29, + 0x947438, 0xEAC269, 0x96772C, 0xB69045, 0xD0A64E, 0xBB984A, 0xC5A253, 0x7E652E, + 0xB49043, 0xD0A64E, -1, 0xD0A64E, 0xE4C368, 0xBB984A, 0xD0A64E, 0x8A6E32, + 0x96772C, -1, -1, -1, -1, 0xBB9853, 0xD1AD5C, 0xB18D46, + 0xD0A64E, -1, -1, -1, -1, -1, -1, 0x9C7D39, + -1, -1, -1, -1, -1, -1, -1, 0x9C7D39, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0x846932, 0x907336, 0xA18340, 0xAE8E45, 0xAE8E45, 0x886F36, 0x7B6431, 0x6E5A2C, + 0x7A6029, 0x886F36, 0x95793B, 0xA18340, 0xA18340, 0x95793B, 0x886F36, 0x7B6431 + }), + CREVEFOREST("creveforest", new int[] { + 0x2D4C54, 0x2D4C54, 0x2D4C54, 0x2D4C54, 0x355C5E, 0x2D4C54, 0x2D4C54, 0x2D4C54, + 0x2D4C54, 0x2D4C54, 0x355C5E, 0x355C5E, 0x355C5E, 0x355C5E, 0x2D4C54, 0x2D4C54, + 0x2D4C54, 0x355C5E, 0x79A88F, 0x8FC49B, 0x79A88F, 0x79A88F, 0x355C5E, 0x2D4C54, + 0x355C5E, 0x79A88F, 0x8FC49B, 0x9ED69C, 0x8FC49B, 0x8FC49B, 0x79A88F, 0x355C5E, + 0x355C5E, 0x1E2E33, 0x1E2E33, 0xB7E8A9, 0x9ED69C, 0x1E2E33, 0x1E2E33, 0x355C5E, + 0x1E2E33, 0x9BB0AC, 0x344C46, 0xD3F5BA, 0xB7E8A9, 0x344C46, 0x9BB0AC, 0x1E2E33, + 0x2D4C54, 0xEBEBEB, 0x79B8AB, 0xD3F5BA, 0xB7E8A9, 0x79B8AB, 0xEBEBEB, 0x355C5E, + 0x2D4C54, 0x8FC49B, 0xB7E8A9, 0x9ED69C, 0xB7E8A9, 0xB7E8A9, 0x8FC49B, 0x355C5E + }, new int[] { + -1, 0x549C62, 0x4D8C64, 0x4D8C64, 0x549C62, 0x3D785D, 0x4D8C64, -1, + 0x549C62, 0x549C62, 0x4D8C64, 0x4D8C64, 0x4D8C64, 0x3D785D, 0x4D8C64, 0x549C62, + 0x4D8C64, 0x4D8C64, 0x3D785D, 0x3D785D, 0x3D785D, 0x355C5E, 0x3D785D, 0x4D8C64, + 0x3D785D, 0x3D785D, 0x355C5E, -1, 0x355C5E, 0x2D4C54, 0x355C5E, 0x3D785D, + 0x3D785D, -1, 0x2D4C54, -1, -1, -1, 0x355C5E, 0x3D785D, + 0x355C5E, -1, -1, -1, -1, -1, -1, 0x355C5E, + 0x2D4C54, -1, -1, -1, -1, -1, -1, 0x2D4C54, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0x355C5E, 0x355C5E, 0x355C5E, 0x355C5E, 0x3D785D, 0x355C5E, 0x2D4C54, 0x355C5E, + 0x2D4C54, 0x549C62, 0x4D8C64, 0x4D8C64, 0x549C62, 0x3D785D, 0x4D8C64, 0x355C5E + }), + SACDCHIPS("sacdchips", new int[] { + 0x3E1A05, 0x421D05, 0x391904, 0x421C06, 0x391904, 0x632C08, 0x3D1B05, 0x552607, + 0x421D05, 0x421D05, 0x391904, 0xF1DACD, 0xF2DDD1, 0xEFD7C9, 0xEED4C5, 0x632C08, + 0xEBCCBA, 0xECCFBE, 0xEDD1C1, 0xE7C3AE, 0xEDD1C1, 0xEED4C5, 0xF2DDD1, 0xECCFBE, + 0xECCFBE, 0x341704, 0x341704, 0xE7C3AE, 0xEBCCBA, 0x341704, 0x341704, 0xF1DACD, + 0xEBCCBA, 0xEEEEEE, 0x602F10, 0xEDD1C1, 0xF2DDD1, 0x602F10, 0xEEEEEE, 0xEDD1C1, + 0xE7C3AE, 0xEDD1C1, 0xE7C3AE, 0xF2DDD1, 0xF1DACD, 0xEDD1C1, 0xE7C3AE, 0xEDD1C1, + 0xE6C0AA, 0xECCFBE, 0xEBCCBA, 0x000000, 0x000000, 0xEDD1C1, 0xEAC9B6, 0xEBCCBA, + 0xEAC9B6, 0xECCFBE, 0xF2DDD1, 0xECCFBE, 0xEAC9B6, 0xF1DACD, 0xECCFBE, 0xF1DACD + }, new int[] { + -1, 0x180A02, 0x261003, 0x2B1204, 0x341604, 0x210E03, 0x2F1404, -1, + -1, -1, -1, 0x2B1204, 0x210E03, 0x471E06, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0x261003, 0x180A02, 0x210E03, 0x1D0C02, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0x3E1A05, 0x3E1A05, 0x210E03, 0x1D0C02, 0x341604, 0x180A02, 0x2F1404, 0x1D0C02, + 0x391805, 0x421C06, 0x421C06, 0x3E1A05, 0x471E06, 0x1D0C02, 0x341604, 0x341604 + }), + VASELLINE("vaselline", new int[] { + 0xEBE176, 0xEBE176, 0xEBE176, 0xE8DC5F, 0xE8DC5F, 0xE8DC5F, 0xEBE176, 0xEBE176, + 0xEBE176, 0xE8DC5F, 0xE8D7B1, 0xE8D7B1, 0xE8D7B1, 0xE8D7B1, 0xE8DC5F, 0xEBE176, + 0xE8DC5F, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xE8DC5F, + 0xE8DC5F, 0xFFFFFF, 0x6F9EE8, 0xE8D7B1, 0xE8D7B1, 0x6F9EE8, 0xFFFFFF, 0xE8DC5F, + 0xE8DC5F, 0xE8D7B1, 0xE8D7B1, 0xEEE1C5, 0xEEE1C5, 0xE8D7B1, 0xE8D7B1, 0xE8DC5F, + 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, + 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xE2CD9D, 0xE2CD9D, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, + 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5, 0xEEE1C5 + }, new int[] { + 0xEBE176, 0xEBE176, 0xE8DC5F, 0xE8DC5F, 0xE8DC5F, 0xE8DC5F, 0xEBE176, 0xEBE176, + 0xEBE176, 0xE8DC5F, -1, -1, -1, -1, 0xE8DC5F, 0xEBE176, + 0xEBE176, -1, -1, -1, -1, -1, -1, 0xE8DC5F, + 0xE8DC5F, -1, -1, -1, -1, -1, -1, 0xE8DC5F, + 0xE8DC5F, -1, -1, -1, -1, -1, -1, 0xE8DC5F, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0xEBE176, 0xE8DC5F, 0xE8DC5F, 0xEBE176, 0xEBE176, 0xE8DC5F, 0xE8DC5F, 0xE8DC5F, + 0xEBE176, 0xEBE176, 0xEBE176, 0xEBE176, 0xEBE176, 0xEBE176, 0xEBE176, 0xEBE176 + }), + DUNCAN("duncan", new int[] { + 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, + 0xFFD6AE, 0xFFD7AE, 0xFFD7AE, 0xFFD6AE, 0xFFD6AE, 0xFED7AE, 0xFFD7AF, 0xFFD7AE, + 0xFFD7AE, 0xAD3B11, 0xAC3A10, 0xFFD7AE, 0xFFD7AE, 0xAD3B10, 0xAC3B11, 0xFFD6AF, + 0xFED6AF, 0xFEFFFF, 0x783018, 0xFFD7AE, 0xFFD7AE, 0xFEFFFE, 0x793019, 0xFFD6AF, + 0xFFD6AE, 0x783018, 0x010000, 0xFFD7AF, 0xFED7AE, 0x010100, 0x783018, 0xFFD7AF, + 0xFED7AF, 0xFFD7AE, 0xFFD7AF, 0xFED6AF, 0xFED7AE, 0xFED7AE, 0xFED7AF, 0xFFD6AE, + 0xFED7AE, 0xFED7AF, 0xFED7AE, 0xCB97A0, 0xCB96A0, 0xFED7AE, 0xFFD7AE, 0xFFD6AE, + 0xFFD7AE, 0xFED7AE, 0xFFD7AE, 0xFFD7AF, 0xFFD7AE, 0xFFD7AE, 0xFFD7AE, 0xFED7AE + }, new int[] { + 0x9D5330, 0xBC5D30, 0x9D5330, 0x88492A, 0x9D5330, 0x9D5330, 0x88492A, 0x9D5330, + 0x9D5330, -1, 0x88492A, -1, -1, 0xBC5D30, -1, 0x9D5330, + -1, 0xE6AB35, 0xE7AA34, -1, -1, 0xE6AA34, 0xE7AA34, -1, + 0xE6AB34, -1, -1, 0xE7AB35, 0xE7AB35, -1, -1, 0xE6AB35, + 0xE7AB35, -1, -1, 0xE6AB35, 0xE6AA34, -1, -1, 0xE6AB35, + -1, 0xE6AB34, 0xE6AB35, -1, -1, 0xE6AB35, 0xE6AB34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }, new int[] { + 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330, 0x88492A, 0x9D5330, 0x9D5330, 0x88492A, + 0x9D5330, 0x9D5330, 0x9D5330, 0xBC5D30, 0x9D5330, 0x9D5330, 0x9D5330, 0x9D5330 + }); + + public static final int WIDTH = 8; + public static final int HEIGHT = 8; + public static final int TRANSPARENT = -1; + + private final String id; + private final int[] face; + private final int[] hood; + private final int[] hoodTop; + + SkinFacePortrait(String id, int[] face, int[] hood, int[] hoodTop) { + this.id = id; + this.face = face; + this.hood = hood; + this.hoodTop = hoodTop; + } + + public String id() { + return id; + } + + public String itemId() { + return id + "_firework"; + } + + public int[] face() { + return face; + } + + public int[] hood() { + return hood; + } + + public int[] hoodTop() { + return hoodTop; + } + + public int opaqueHoodPixels() { + int count = 0; + for (int color : hood) { + if (color != TRANSPARENT) count++; + } + return count; + } + + public int[] portrait() { + int[] pixels = new int[WIDTH * (HEIGHT + 2)]; + System.arraycopy(hoodTop, 0, pixels, 0, hoodTop.length); + for (int index = 0; index < face.length; index++) { + pixels[hoodTop.length + index] = hood[index] == TRANSPARENT ? face[index] : hood[index]; + } + return pixels; + } + + public int portraitHeight() { + return HEIGHT + hoodTop.length / WIDTH; + } + + public static SkinFacePortrait of(ItemStack stack) { + if (stack.isEmpty()) return null; + if (stack.getItem() instanceof SkinFaceFireworkItem item) return item.portrait(); + if (stack.getItem() instanceof NourraFireworkItem) return NOURRA; + return null; + } +} diff --git a/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunCreativeTab.java b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunCreativeTab.java index 7116203..9bbbe3c 100644 --- a/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunCreativeTab.java +++ b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunCreativeTab.java @@ -8,6 +8,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; public final class OnlyFunCreativeTab { @@ -29,6 +30,9 @@ public final class OnlyFunCreativeTab { output.accept(OnlyFunRegistries.SPAWN_EGG_LOOTBOX); output.accept(OnlyFunRegistries.ANOMALY_LOOTBOX); output.accept(OnlyFunRegistries.NOURRA_FIREWORK); + for (Item firework : OnlyFunRegistries.skinFireworks()) { + if (firework != OnlyFunRegistries.NOURRA_FIREWORK) output.accept(firework); + } output.accept(AbjectionRegistries.SHIT_BALL); output.accept(AbjectionRegistries.SHIT_CUBE_ITEM); }) diff --git a/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunRegistries.java b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunRegistries.java index 289f2b1..7d913ee 100644 --- a/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunRegistries.java +++ b/onlyfun/src/main/java/fr/koka99cab/sanctuary26/onlyfun/registry/OnlyFunRegistries.java @@ -3,8 +3,10 @@ package fr.koka99cab.sanctuary26.onlyfun.registry; import fr.koka99cab.sanctuary26.onlyfun.OnlyFunMod; import fr.koka99cab.sanctuary26.onlyfun.block.LuckyBlockBlock; import fr.koka99cab.sanctuary26.onlyfun.item.LootboxItem; -import fr.koka99cab.sanctuary26.onlyfun.item.SkinFaceFireworkExplosions; import fr.koka99cab.sanctuary26.onlyfun.item.NourraFireworkItem; +import fr.koka99cab.sanctuary26.onlyfun.item.SkinFaceFireworkExplosions; +import fr.koka99cab.sanctuary26.onlyfun.item.SkinFaceFireworkItem; +import fr.koka99cab.sanctuary26.onlyfun.item.SkinFacePortrait; import fr.koka99cab.sanctuary26.onlyfun.loot.OnlyFunGenerator; import fr.koka99cab.sanctuary26.onlyfun.loot.OnlyFunSource; import java.util.function.Function; @@ -37,6 +39,14 @@ public final class OnlyFunRegistries { public static final Item NOURRA_FIREWORK = registerItem("nourra_firework", properties -> new NourraFireworkItem(properties.stacksTo(64) .component(DataComponents.FIREWORKS, SkinFaceFireworkExplosions.defaultFireworks()))); + public static final Item CHRISM_FIREWORK = registerSkinFirework(SkinFacePortrait.CHRISM); + public static final Item KANINSCHEUN_FIREWORK = registerSkinFirework(SkinFacePortrait.KANINSCHEUN); + public static final Item POUPOUTAIN_FIREWORK = registerSkinFirework(SkinFacePortrait.POUPOUTAIN); + public static final Item LBEAST_FIREWORK = registerSkinFirework(SkinFacePortrait.LBEAST); + public static final Item CREVEFOREST_FIREWORK = registerSkinFirework(SkinFacePortrait.CREVEFOREST); + public static final Item SACDCHIPS_FIREWORK = registerSkinFirework(SkinFacePortrait.SACDCHIPS); + public static final Item VASELLINE_FIREWORK = registerSkinFirework(SkinFacePortrait.VASELLINE); + public static final Item DUNCAN_FIREWORK = registerSkinFirework(SkinFacePortrait.DUNCAN); private static boolean initialized; private OnlyFunRegistries() { @@ -52,6 +62,13 @@ public final class OnlyFunRegistries { }; } + public static Item[] skinFireworks() { + return new Item[] { + NOURRA_FIREWORK, CHRISM_FIREWORK, KANINSCHEUN_FIREWORK, POUPOUTAIN_FIREWORK, + LBEAST_FIREWORK, CREVEFOREST_FIREWORK, SACDCHIPS_FIREWORK, VASELLINE_FIREWORK, DUNCAN_FIREWORK + }; + } + public static void initialize() { if (initialized) { return; @@ -66,6 +83,11 @@ public final class OnlyFunRegistries { OnlyFunMod.LOGGER.debug("[{}] Item and block registries initialized.", OnlyFunMod.DISPLAY_NAME); } + private static Item registerSkinFirework(SkinFacePortrait portrait) { + return registerItem(portrait.itemId(), properties -> new SkinFaceFireworkItem(portrait, + properties.stacksTo(64).component(DataComponents.FIREWORKS, SkinFaceFireworkExplosions.defaultFireworks()))); + } + private static Item registerItem(String path, Function factory) { ResourceKey key = ResourceKey.create(Registries.ITEM, OnlyFunMod.id(path)); return Registry.register(BuiltInRegistries.ITEM, key, factory.apply(new Item.Properties().setId(key))); diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/chrism_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/chrism_firework.json new file mode 100644 index 0000000..b4a5283 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/chrism_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/chrism_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/creveforest_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/creveforest_firework.json new file mode 100644 index 0000000..e026644 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/creveforest_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/creveforest_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/duncan_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/duncan_firework.json new file mode 100644 index 0000000..49bffe1 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/duncan_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/duncan_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/kaninscheun_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/kaninscheun_firework.json new file mode 100644 index 0000000..8c01025 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/kaninscheun_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/kaninscheun_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/lbeast_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/lbeast_firework.json new file mode 100644 index 0000000..46e8a00 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/lbeast_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/lbeast_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/poupoutain_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/poupoutain_firework.json new file mode 100644 index 0000000..7161d34 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/poupoutain_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/poupoutain_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/sacdchips_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/sacdchips_firework.json new file mode 100644 index 0000000..5f6a22d --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/sacdchips_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/sacdchips_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/items/vaselline_firework.json b/onlyfun/src/main/resources/assets/onlyfun/items/vaselline_firework.json new file mode 100644 index 0000000..fb6d87f --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/items/vaselline_firework.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "onlyfun:item/vaselline_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/lang/en_us.json b/onlyfun/src/main/resources/assets/onlyfun/lang/en_us.json index 498b7d2..4125974 100644 --- a/onlyfun/src/main/resources/assets/onlyfun/lang/en_us.json +++ b/onlyfun/src/main/resources/assets/onlyfun/lang/en_us.json @@ -7,7 +7,16 @@ "item.onlyfun.spawn_egg_lootbox": "Spawn Egg Lootbox", "item.onlyfun.anomaly_lootbox": "Anomaly Lootbox", "item.onlyfun.nourra_firework": "Nourra Firework", + "item.onlyfun.chrism_firework": "ChrisM Firework", + "item.onlyfun.kaninscheun_firework": "Kaninscheun Firework", + "item.onlyfun.poupoutain_firework": "Poupoutain Firework", + "item.onlyfun.lbeast_firework": "lBeast Firework", + "item.onlyfun.creveforest_firework": "CreveForest Firework", + "item.onlyfun.sacdchips_firework": "SacDChips Firework", + "item.onlyfun.vaselline_firework": "Vaselline Firework", + "item.onlyfun.duncan_firework": "Duncan Firework", "tooltip.onlyfun.nourra_firework": "The burst paints the skin face, at normal or larger size.", + "tooltip.onlyfun.skin_face_firework": "The burst paints the skin face, at normal or larger size.", "item.onlyfun.quality_gear": "Quality Gear", "item.onlyfun.impossible_tool": "Impossible Tool", "item.onlyfun.impossible_book": "Impossible Book", diff --git a/onlyfun/src/main/resources/assets/onlyfun/lang/fr_fr.json b/onlyfun/src/main/resources/assets/onlyfun/lang/fr_fr.json index 98f2a21..968aabf 100644 --- a/onlyfun/src/main/resources/assets/onlyfun/lang/fr_fr.json +++ b/onlyfun/src/main/resources/assets/onlyfun/lang/fr_fr.json @@ -7,7 +7,16 @@ "item.onlyfun.spawn_egg_lootbox": "Lootbox d'œufs", "item.onlyfun.anomaly_lootbox": "Lootbox anomalie", "item.onlyfun.nourra_firework": "Feu d'artifice Nourra", + "item.onlyfun.chrism_firework": "Feu d'artifice ChrisM", + "item.onlyfun.kaninscheun_firework": "Feu d'artifice Kaninscheun", + "item.onlyfun.poupoutain_firework": "Feu d'artifice Poupoutain", + "item.onlyfun.lbeast_firework": "Feu d'artifice lBeast", + "item.onlyfun.creveforest_firework": "Feu d'artifice CreveForest", + "item.onlyfun.sacdchips_firework": "Feu d'artifice SacDChips", + "item.onlyfun.vaselline_firework": "Feu d'artifice Vaselline", + "item.onlyfun.duncan_firework": "Feu d'artifice Duncan", "tooltip.onlyfun.nourra_firework": "L'explosion dessine le visage, en taille normale ou plus grande.", + "tooltip.onlyfun.skin_face_firework": "L'explosion dessine le visage, en taille normale ou plus grande.", "item.onlyfun.quality_gear": "Équipement de qualité", "item.onlyfun.impossible_tool": "Outil impossible", "item.onlyfun.impossible_book": "Livre impossible", diff --git a/onlyfun/src/main/resources/assets/onlyfun/lang/ru_ru.json b/onlyfun/src/main/resources/assets/onlyfun/lang/ru_ru.json index 6eb8818..a8a0535 100644 --- a/onlyfun/src/main/resources/assets/onlyfun/lang/ru_ru.json +++ b/onlyfun/src/main/resources/assets/onlyfun/lang/ru_ru.json @@ -7,7 +7,16 @@ "item.onlyfun.spawn_egg_lootbox": "Лутбокс яиц призыва", "item.onlyfun.anomaly_lootbox": "Лутбокс-аномалия", "item.onlyfun.nourra_firework": "Фейерверк Нурры", + "item.onlyfun.chrism_firework": "Фейерверк ChrisM", + "item.onlyfun.kaninscheun_firework": "Фейерверк Kaninscheun", + "item.onlyfun.poupoutain_firework": "Фейерверк Poupoutain", + "item.onlyfun.lbeast_firework": "Фейерверк lBeast", + "item.onlyfun.creveforest_firework": "Фейерверк CreveForest", + "item.onlyfun.sacdchips_firework": "Фейерверк SacDChips", + "item.onlyfun.vaselline_firework": "Фейерверк Vaselline", + "item.onlyfun.duncan_firework": "Фейерверк Duncan", "tooltip.onlyfun.nourra_firework": "Взрыв рисует лицо скина обычного или увеличенного размера.", + "tooltip.onlyfun.skin_face_firework": "Взрыв рисует лицо скина обычного или увеличенного размера.", "item.onlyfun.quality_gear": "Качественное снаряжение", "item.onlyfun.impossible_tool": "Невозможный инструмент", "item.onlyfun.impossible_book": "Невозможная книга", diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/chrism_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/chrism_firework.json new file mode 100644 index 0000000..b92d1d9 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/chrism_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/chrism_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/creveforest_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/creveforest_firework.json new file mode 100644 index 0000000..038bbc7 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/creveforest_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/creveforest_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/duncan_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/duncan_firework.json new file mode 100644 index 0000000..e605637 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/duncan_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/duncan_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/kaninscheun_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/kaninscheun_firework.json new file mode 100644 index 0000000..e71b456 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/kaninscheun_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/kaninscheun_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/lbeast_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/lbeast_firework.json new file mode 100644 index 0000000..1a6591a --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/lbeast_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/lbeast_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/poupoutain_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/poupoutain_firework.json new file mode 100644 index 0000000..2b13a03 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/poupoutain_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/poupoutain_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/sacdchips_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/sacdchips_firework.json new file mode 100644 index 0000000..62b283c --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/sacdchips_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/sacdchips_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/models/item/vaselline_firework.json b/onlyfun/src/main/resources/assets/onlyfun/models/item/vaselline_firework.json new file mode 100644 index 0000000..3a81508 --- /dev/null +++ b/onlyfun/src/main/resources/assets/onlyfun/models/item/vaselline_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "onlyfun:item/vaselline_firework" + } +} diff --git a/onlyfun/src/main/resources/assets/onlyfun/textures/item/chrism_firework.png b/onlyfun/src/main/resources/assets/onlyfun/textures/item/chrism_firework.png new file mode 100644 index 0000000000000000000000000000000000000000..57e03d844ee12b845cba2ac5923027273900352e GIT binary patch literal 246 zcmVnrMlY7_7(P zuY{xw@u;amb2vqu`s2@p6zBV{4g)cEdwPx{^`)X8DVycm#@xxV&q@q{1r0o3k^7#8(e%0!L*nR514-S_ZLl=T@*HbhKEkr&s~rjiR@ zUb+fq)HYQ@Y@Rabbxp@4$4Gp(MlxG=(tvYC~xhc_xZozz7Y^N~q197hZtrcBo(f zL*<#7Aa<4OOF(ooQY#(&yS^T51#C=249XvjIw$qD#sl5O;OXk;vd$@?2>>v$L-qgw literal 0 HcmV?d00001 diff --git a/onlyfun/src/main/resources/assets/onlyfun/textures/item/lbeast_firework.png b/onlyfun/src/main/resources/assets/onlyfun/textures/item/lbeast_firework.png new file mode 100644 index 0000000000000000000000000000000000000000..083b3526263dd0f908ec3efaf19f9e000bb8e593 GIT binary patch literal 359 zcmV-t0hs=YP)FTwOr1{N@_qaq2WzyJ6QrXN1}0H$BR`v#_&7$^iR+?*U>#+&bd zz%(ZpJDBEWgE&lHmKRKa`2=y%|Npj2p~x?23#O6_G}R#S++W)S zraN}t0Mjy3f?)dD%XeT}+$;)ASGa3{X+`O$RB{0yG~OM8{lWBEHXSg{!+s1*vob>L zaPc+1pB!icM}v@1CFbkNz_5LrImf(iSGciyISYS4zgZ2B4 zgK0))h|Pb0{Q%Sd|Na5fr4i25aRKA&GrRsH+r-EOani3(Z^1MhpD>C`SU7o5{~_%d}|!1(;|y8p;F!a|o@N*PSUT=?hv7ZiDzdM2uc!T*1dG!BbrK4pCr zg>Nq&1k=oH9AFw2J5C? P00000NkvXXu0mjf)d!4j literal 0 HcmV?d00001 diff --git a/onlyfun/src/main/resources/assets/onlyfun/textures/item/vaselline_firework.png b/onlyfun/src/main/resources/assets/onlyfun/textures/item/vaselline_firework.png new file mode 100644 index 0000000000000000000000000000000000000000..d24520bd2f9057a44b0947e37a01a5d90d8b82ec GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gdx`!Ln`JZ*Zke^#-3U1!}ssr zIfr=8ta+qSqsGR?$lcbvzxhMfkJB6Yj;i{I?0%qsCC%)bNe73vqOL&c{<`yvCUHwF za0ocZYp~^|=$b0?wK_^*z^xqx%e_ZTWPK=VqpZNRt7Q9M{ zbypSNQ(YmF?WH1S5U49AapAypbMt^7HcC<@WsG{#E8j6O%wMQg+!p&A